From 55a5c108ac2ec979443d804f9f62f0346ad847e3 Mon Sep 17 00:00:00 2001 From: Pacman Date: Fri, 2 Feb 2024 19:22:09 +0100 Subject: [PATCH 01/20] chore!: update osmosis-test-tube --- CHANGELOG.md | 9 + Cargo.lock | 730 ++++++++++++++++++++++++++------------------------- Cargo.toml | 12 +- 3 files changed, 389 insertions(+), 362 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 27cdfdc..8f60814 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.3.0-rc.2] - 2024-02-02 + +- Bump dependencies + - `osmosis-std` to 0.22.0 + - `test-tube` to 0.4.0 + - `osmosis-test-tube` to 22.0.0 + - `prost` to 0.12 + - `cosmrs` to 0.15 + ## [0.2.3] - 2023-11-01 ### Changed diff --git a/Cargo.lock b/Cargo.lock index 2377ed6..915812d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -84,7 +84,7 @@ dependencies = [ "derivative", "itertools", "k256 0.11.6", - "osmosis-std", + "osmosis-std 0.19.2", "prost 0.9.0", "regex", "schemars", @@ -422,7 +422,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.48", ] [[package]] @@ -433,18 +433,7 @@ checksum = "a564d521dd56509c4c47480d00b80ee55f7e385ae48db5744c67ad50c92d2ebf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", + "syn 2.0.48", ] [[package]] @@ -461,7 +450,7 @@ checksum = "a6a1de45611fdb535bfde7b7de4fd54f4fd2b17b1737c0a59b69bf9b92074b8c" dependencies = [ "async-trait", "axum-core", - "bitflags", + "bitflags 1.3.2", "bytes", "futures-util", "http", @@ -533,9 +522,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.3" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64ct" @@ -545,38 +534,36 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bindgen" -version = "0.60.1" +version = "0.69.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062dddbc1ba4aca46de6338e2bf87771414c335f7b2f2036e8f3e9befebf88e6" +checksum = "a4c69fae65a523209d34240b60abe0c42d33d1045d445c0839d8a4894a736e2d" dependencies = [ - "bitflags", + "bitflags 2.4.2", "cexpr", "clang-sys", - "clap", - "env_logger", "lazy_static", "lazycell", "log", "peeking_take_while", + "prettyplease", "proc-macro2", "quote", "regex", "rustc-hash", "shlex", + "syn 2.0.48", "which", ] [[package]] name = "bip32" -version = "0.4.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30ed1d6f8437a487a266c8293aeb95b61a23261273e3e02912cdb8b68bf798b" +checksum = "7e141fb0f8be1c7b45887af94c88b182472b57c96b56773250ae00cd6a14a164" dependencies = [ "bs58", "hmac", - "k256 0.11.6", - "once_cell", - "pbkdf2", + "k256 0.13.1", "rand_core 0.6.4", "ripemd", "sha2 0.10.7", @@ -605,6 +592,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" + [[package]] name = "block-buffer" version = "0.9.0" @@ -672,11 +665,11 @@ dependencies = [ [[package]] name = "bs58" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" +checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" dependencies = [ - "sha2 0.9.9", + "sha2 0.10.7", ] [[package]] @@ -702,9 +695,12 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.79" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] [[package]] name = "cexpr" @@ -747,30 +743,6 @@ dependencies = [ "libloading", ] -[[package]] -name = "clap" -version = "3.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" -dependencies = [ - "atty", - "bitflags", - "clap_lex", - "indexmap", - "strsim", - "termcolor", - "textwrap", -] - -[[package]] -name = "clap_lex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" -dependencies = [ - "os_str_bytes", -] - [[package]] name = "config" version = "0.13.3" @@ -814,42 +786,42 @@ checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "cosmos-sdk-proto" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20b42021d8488665b1a0d9748f1f81df7235362d194f44481e2e61bf376b77b4" +checksum = "673d31bd830c0772d78545de20d975129b6ab2f7db4e4e9313c3b8777d319194" dependencies = [ "prost 0.11.9", - "prost-types", - "tendermint-proto 0.23.9", + "prost-types 0.11.9", + "tendermint-proto 0.26.0", + "tonic", ] [[package]] name = "cosmos-sdk-proto" -version = "0.15.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673d31bd830c0772d78545de20d975129b6ab2f7db4e4e9313c3b8777d319194" +checksum = "32560304ab4c365791fd307282f76637213d8083c1a98490c35159cd67852237" dependencies = [ - "prost 0.11.9", - "prost-types", - "tendermint-proto 0.26.0", - "tonic", + "prost 0.12.3", + "prost-types 0.12.3", + "tendermint-proto 0.34.0", ] [[package]] name = "cosmrs" -version = "0.9.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3903590099dcf1ea580d9353034c9ba1dbf55d1389a5bd2ade98535c3445d1f9" +checksum = "47126f5364df9387b9d8559dcef62e99010e1d4098f39eb3f7ee4b5c254e40ea" dependencies = [ "bip32", - "cosmos-sdk-proto 0.14.0", - "ecdsa 0.14.8", + "cosmos-sdk-proto 0.20.0", + "ecdsa 0.16.8", "eyre", - "getrandom", - "k256 0.11.6", + "k256 0.13.1", "rand_core 0.6.4", "serde", "serde_json", + "signature 2.1.0", "subtle-encoding", "tendermint", "tendermint-rpc", @@ -908,7 +880,7 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a44d3f9c25b2f864737c6605a98f2e4675d53fd8bbc7cf4d7c02475661a793d" dependencies = [ - "base64 0.21.3", + "base64 0.21.7", "bnum", "cosmwasm-crypto", "cosmwasm-derive", @@ -981,15 +953,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" @@ -1003,9 +966,22 @@ dependencies = [ "zeroize", ] +[[package]] +name = "curve25519-dalek-ng" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.6.4", + "subtle-ng", + "zeroize", +] + [[package]] name = "cw-it" -version = "0.2.3" +version = "0.3.0-rc.2" dependencies = [ "anyhow", "apollo-cw-multi-test", @@ -1031,17 +1007,17 @@ dependencies = [ "cosmwasm-std", "cw20 0.15.1", "cw20-base", - "osmosis-std", + "osmosis-std 0.22.0", "osmosis-test-tube", "paste", "proptest", - "prost 0.11.9", + "prost 0.12.3", "regex", "serde", "serde_json", "strum", "test-case", - "test-tube", + "test-tube 0.4.0", "testcontainers", "thiserror", "tokio", @@ -1369,21 +1345,23 @@ dependencies = [ [[package]] name = "ed25519" -version = "1.5.3" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ - "signature 1.6.4", + "pkcs8 0.10.2", + "signature 2.1.0", ] [[package]] -name = "ed25519-dalek" -version = "1.0.1" +name = "ed25519-consensus" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" dependencies = [ - "curve25519-dalek", - "ed25519", + "curve25519-dalek-ng", + "hex", + "rand_core 0.6.4", "sha2 0.9.9", "zeroize", ] @@ -1449,16 +1427,12 @@ dependencies = [ ] [[package]] -name = "env_logger" -version = "0.9.3" +name = "encoding_rs" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", + "cfg-if", ] [[package]] @@ -1539,9 +1513,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -1608,7 +1582,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.48", ] [[package]] @@ -1727,46 +1701,12 @@ dependencies = [ "ahash", ] -[[package]] -name = "headers" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" -dependencies = [ - "base64 0.13.1", - "bitflags", - "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" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - [[package]] name = "hermit-abi" version = "0.3.2" @@ -1822,12 +1762,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - [[package]] name = "hyper" version = "0.14.27" @@ -1852,41 +1786,18 @@ 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" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ - "ct-logs", "futures-util", + "http", "hyper", - "log", "rustls", - "rustls-native-certs", "tokio", "tokio-rustls", - "webpki", - "webpki-roots", ] [[package]] @@ -1945,9 +1856,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -1993,11 +1904,17 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.2", + "hermit-abi", "libc", "windows-sys", ] +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + [[package]] name = "itertools" version = "0.10.5" @@ -2043,7 +1960,6 @@ dependencies = [ "ecdsa 0.14.8", "elliptic-curve 0.12.3", "sha2 0.10.7", - "sha3", ] [[package]] @@ -2060,15 +1976,6 @@ dependencies = [ "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]] name = "lazy_static" version = "1.4.0" @@ -2083,9 +1990,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.147" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libloading" @@ -2202,7 +2109,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.2", + "hermit-abi", "libc", ] @@ -2252,12 +2159,6 @@ dependencies = [ "hashbrown", ] -[[package]] -name = "os_str_bytes" -version = "6.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" - [[package]] name = "osmosis-std" version = "0.19.2" @@ -2266,9 +2167,25 @@ checksum = "798fade51443a0e07eb25b59a11b320b9e8f03e6e8fbe14c520258f04742fe13" dependencies = [ "chrono", "cosmwasm-std", - "osmosis-std-derive", + "osmosis-std-derive 0.16.2", "prost 0.11.9", - "prost-types", + "prost-types 0.11.9", + "schemars", + "serde", + "serde-cw-value", +] + +[[package]] +name = "osmosis-std" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8641c376f01f5af329dc2a34e4f5527eaeb0bde18cda8d86fed958d04c86159c" +dependencies = [ + "chrono", + "cosmwasm-std", + "osmosis-std-derive 0.20.1", + "prost 0.12.3", + "prost-types 0.12.3", "schemars", "serde", "serde-cw-value", @@ -2282,26 +2199,39 @@ checksum = "f47f0b2f22adb341bb59e5a3a1b464dde033181954bd055b9ae86d6511ba465b" dependencies = [ "itertools", "proc-macro2", - "prost-types", + "prost-types 0.11.9", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "osmosis-std-derive" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5ebdfd1bc8ed04db596e110c6baa9b174b04f6ed1ec22c666ddc5cb3fa91bd7" +dependencies = [ + "itertools", + "proc-macro2", + "prost-types 0.11.9", "quote", "syn 1.0.109", ] [[package]] name = "osmosis-test-tube" -version = "19.0.0" +version = "22.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d176b76c0142f7a047d4c4f12a553b10de557aa60304077ca88532249924da0f" +checksum = "a082b97136d15470a37aa758f227c865594590b69d74721248ed5adf59bf1ca2" dependencies = [ - "base64 0.13.1", + "base64 0.21.7", "bindgen", "cosmrs", "cosmwasm-std", - "osmosis-std", - "prost 0.11.9", + "osmosis-std 0.22.0", + "prost 0.12.3", "serde", "serde_json", - "test-tube", + "test-tube 0.5.0", "thiserror", ] @@ -2317,15 +2247,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" -[[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 = "peeking_take_while" version = "0.1.2" @@ -2361,9 +2282,9 @@ checksum = "c719dcf55f09a3a7e764c6649ab594c18a177e3599c467983cdf644bfc0a4088" [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" @@ -2395,7 +2316,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.48", ] [[package]] @@ -2426,7 +2347,7 @@ checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.48", ] [[package]] @@ -2467,6 +2388,16 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "prettyplease" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" +dependencies = [ + "proc-macro2", + "syn 2.0.48", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -2493,9 +2424,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] @@ -2507,7 +2438,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e35c06b98bf36aba164cc17cb25f7e232f5c4aeea73baa14b8a9f0d92dbfa65" dependencies = [ "bit-set", - "bitflags", + "bitflags 1.3.2", "byteorder", "lazy_static", "num-traits", @@ -2540,6 +2471,16 @@ dependencies = [ "prost-derive 0.11.9", ] +[[package]] +name = "prost" +version = "0.12.3" +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.9.0" @@ -2566,6 +2507,19 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "prost-derive" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "prost-types" version = "0.11.9" @@ -2575,6 +2529,15 @@ dependencies = [ "prost 0.11.9", ] +[[package]] +name = "prost-types" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" +dependencies = [ + "prost 0.12.3", +] + [[package]] name = "protobuf" version = "2.28.0" @@ -2592,9 +2555,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.31" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fe8a65d69dd0808184ebb5f836ab526bb259db23c657efa38711b1072ee47f0" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -2650,7 +2613,7 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -2659,7 +2622,7 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -2708,6 +2671,47 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +[[package]] +name = "reqwest" +version = "0.11.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-rustls", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-native-certs", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-rustls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + [[package]] name = "rfc6979" version = "0.3.1" @@ -2731,17 +2735,16 @@ dependencies = [ [[package]] name = "ring" -version = "0.16.20" +version = "0.17.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" dependencies = [ "cc", + "getrandom", "libc", - "once_cell", "spin", "untrusted", - "web-sys", - "winapi", + "windows-sys", ] [[package]] @@ -2753,17 +2756,6 @@ 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 = "ron" version = "0.7.1" @@ -2771,7 +2763,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88073939a61e5b7680558e6be56b419e208420c2adb92be54921fa6b72283f1a" dependencies = [ "base64 0.13.1", - "bitflags", + "bitflags 1.3.2", "serde", ] @@ -2803,7 +2795,7 @@ version = "0.37.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" dependencies = [ - "bitflags", + "bitflags 1.3.2", "errno", "io-lifetimes", "libc", @@ -2813,29 +2805,47 @@ dependencies = [ [[package]] name = "rustls" -version = "0.19.1" +version = "0.21.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ - "base64 0.13.1", "log", "ring", + "rustls-webpki", "sct", - "webpki", ] [[package]] name = "rustls-native-certs" -version = "0.5.0" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ "openssl-probe", - "rustls", + "rustls-pemfile", "schannel", "security-framework", ] +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.14" @@ -2904,9 +2914,9 @@ dependencies = [ [[package]] name = "sct" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ "ring", "untrusted", @@ -2946,7 +2956,7 @@ version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -3013,7 +3023,7 @@ checksum = "a6250dde8342e0232232be9ca3db7aa40aceb5a3e5dd9bddbc00d99a007cde49" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.48", ] [[package]] @@ -3046,7 +3056,7 @@ checksum = "1d89a8107374290037607734c0b73a85db7ed80cae314b3c5791f192a496e731" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.48", ] [[package]] @@ -3083,17 +3093,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "sha1" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - [[package]] name = "sha2" version = "0.9.9" @@ -3118,16 +3117,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 = "shlex" version = "1.1.0" @@ -3196,9 +3185,9 @@ dependencies = [ [[package]] name = "spin" -version = "0.5.2" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "spki" @@ -3269,6 +3258,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "subtle-ng" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" + [[package]] name = "syn" version = "1.0.109" @@ -3282,9 +3277,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.26" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45c3457aacde3c65315de5031ec191ce46604304d2446e803d71ade03308d970" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", @@ -3297,6 +3292,27 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tempfile" version = "3.6.0" @@ -3313,40 +3329,40 @@ dependencies = [ [[package]] name = "tendermint" -version = "0.23.9" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "467f82178deeebcd357e1273a0c0b77b9a8a0313ef7c07074baebe99d87851f4" +checksum = "bc2294fa667c8b548ee27a9ba59115472d0a09c2ba255771092a7f1dcf03a789" dependencies = [ - "async-trait", "bytes", + "digest 0.10.7", "ed25519", - "ed25519-dalek", + "ed25519-consensus", "flex-error", "futures", - "k256 0.11.6", + "k256 0.13.1", "num-traits", "once_cell", - "prost 0.11.9", - "prost-types", - "ripemd160", + "prost 0.12.3", + "prost-types 0.12.3", + "ripemd", "serde", "serde_bytes", "serde_json", "serde_repr", - "sha2 0.9.9", - "signature 1.6.4", + "sha2 0.10.7", + "signature 2.1.0", "subtle", "subtle-encoding", - "tendermint-proto 0.23.9", + "tendermint-proto 0.34.0", "time", "zeroize", ] [[package]] name = "tendermint-config" -version = "0.23.9" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d42ee0abc27ef5fc34080cce8d43c189950d331631546e7dfb983b6274fa327" +checksum = "5a25dbe8b953e80f3d61789fbdb83bf9ad6c0ef16df5ca6546f49912542cc137" dependencies = [ "flex-error", "serde", @@ -3358,16 +3374,16 @@ dependencies = [ [[package]] name = "tendermint-proto" -version = "0.23.9" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ce80bf536476db81ecc9ebab834dc329c9c1509a694f211a73858814bfe023" +checksum = "974d6330a19dfa6720e9f663fc59101d207a817db3f9c730d3f31caaa565b574" dependencies = [ "bytes", "flex-error", "num-derive", "num-traits", "prost 0.11.9", - "prost-types", + "prost-types 0.11.9", "serde", "serde_bytes", "subtle-encoding", @@ -3376,16 +3392,16 @@ dependencies = [ [[package]] name = "tendermint-proto" -version = "0.26.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "974d6330a19dfa6720e9f663fc59101d207a817db3f9c730d3f31caaa565b574" +checksum = "2cc728a4f9e891d71adf66af6ecaece146f9c7a11312288a3107b3e1d6979aaf" dependencies = [ "bytes", "flex-error", "num-derive", "num-traits", - "prost 0.11.9", - "prost-types", + "prost 0.12.3", + "prost-types 0.12.3", "serde", "serde_bytes", "subtle-encoding", @@ -3394,28 +3410,27 @@ dependencies = [ [[package]] name = "tendermint-rpc" -version = "0.23.9" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f14aafe3528a0f75e9f3f410b525617b2de16c4b7830a21f717eee62882ec60" +checksum = "dfbf0a4753b46a190f367337e0163d0b552a2674a6bac54e74f9f2cdcde2969b" dependencies = [ "async-trait", "bytes", "flex-error", "futures", "getrandom", - "http", - "hyper", - "hyper-proxy", - "hyper-rustls", "peg", "pin-project", + "reqwest", + "semver", "serde", "serde_bytes", "serde_json", + "subtle", "subtle-encoding", "tendermint", "tendermint-config", - "tendermint-proto 0.23.9", + "tendermint-proto 0.34.0", "thiserror", "time", "tokio", @@ -3425,15 +3440,6 @@ dependencies = [ "walkdir", ] -[[package]] -name = "termcolor" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" -dependencies = [ - "winapi-util", -] - [[package]] name = "test-case" version = "3.1.0" @@ -3471,15 +3477,31 @@ dependencies = [ [[package]] name = "test-tube" -version = "0.1.7" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04de0d85f2438f0b64a5c135a1524564f2b89263cfbce011542446b6681d006f" +checksum = "f330a3c269a6abcda205d272d600be1458df82bf9ad40c0d2244ffa643f76b2a" dependencies = [ - "base64 0.13.1", + "base64 0.21.7", "cosmrs", "cosmwasm-std", - "osmosis-std", - "prost 0.11.9", + "osmosis-std 0.22.0", + "prost 0.12.3", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "test-tube" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09184c7655b2bdaf4517b06141a2e4c44360904f2706a05b24c831bd97ad1db6" +dependencies = [ + "base64 0.21.7", + "cosmrs", + "cosmwasm-std", + "osmosis-std 0.22.0", + "prost 0.12.3", "serde", "serde_json", "thiserror", @@ -3505,12 +3527,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "textwrap" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" - [[package]] name = "thiserror" version = "1.0.43" @@ -3528,7 +3544,7 @@ checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.48", ] [[package]] @@ -3599,18 +3615,17 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.48", ] [[package]] name = "tokio-rustls" -version = "0.22.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ "rustls", "tokio", - "webpki", ] [[package]] @@ -3745,7 +3760,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.48", ] [[package]] @@ -3826,15 +3841,15 @@ dependencies = [ [[package]] name = "untrusted" -version = "0.7.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", @@ -3908,10 +3923,22 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.48", "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.87" @@ -3930,7 +3957,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.48", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3951,25 +3978,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 = "which" version = "4.4.0" @@ -4087,6 +4095,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys", +] + [[package]] name = "yaml-rust" version = "0.4.5" @@ -4113,5 +4131,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.48", ] diff --git a/Cargo.toml b/Cargo.toml index d5a6353..0fe13cb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cw-it" -version = "0.2.3" +version = "0.3.0-rc.2" authors = ["Pacman ", "Sturdy "] edition = "2021" license = "MPL-2.0" @@ -73,17 +73,17 @@ cosmwasm-std = { version = "1.2.1", features = ["stargate"] } serde = { version = "1.0.152", default-features = false, features = ["derive"] } thiserror = { version = "1.0.31" } cosmwasm-schema = "1.2.1" -cosmrs = { version = "0.9.0", features = ["rpc", "cosmwasm"] } -prost = { version = "0.11.2", default-features = false, features = [ +cosmrs = { version = "0.15", features = ["rpc", "cosmwasm"] } +prost = { version = "0.12", default-features = false, features = [ "prost-derive", ] } config = { version = "0.13.2", features = ["yaml"] } anyhow = "1.0.66" serde_json = "1.0.89" strum = { version = "0.24.1", features = ["derive"] } -osmosis-std = "0.19.2" -test-tube = { version = "0.1.7", features = ["module-wrappers"] } -osmosis-test-tube = { version = "19.0.0", optional = true } +osmosis-std = "0.22.0" +test-tube = { version = "0.4.0", features = ["module-wrappers"] } +osmosis-test-tube = { version = "22.0.0", optional = true } # Astroport deps astroport = { version = "=2.9.0", optional = true } From 261661f1919b61d0cb15e05a049ef06e5bb308ab Mon Sep 17 00:00:00 2001 From: Pacman Date: Fri, 2 Feb 2024 20:21:54 +0100 Subject: [PATCH 02/20] ci: bump toolchain version to 1.75.0 --- .github/workflows/Basic.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Basic.yml b/.github/workflows/Basic.yml index e7cd2bb..be3ab34 100644 --- a/.github/workflows/Basic.yml +++ b/.github/workflows/Basic.yml @@ -16,7 +16,7 @@ jobs: uses: actions-rs/toolchain@v1 with: profile: minimal - toolchain: 1.67.1 + toolchain: 1.75.0 target: wasm32-unknown-unknown override: true From 90dd38577b418a63d0946f39e72a2681cf225252 Mon Sep 17 00:00:00 2001 From: Pacman Date: Fri, 2 Feb 2024 23:35:28 +0100 Subject: [PATCH 03/20] chore: update Cargo.lock --- Cargo.lock | 1000 ++++++++++++++++++++++++++++------------------------ 1 file changed, 538 insertions(+), 462 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 915812d..f4fe2fc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ "gimli", ] @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" dependencies = [ "getrandom", "once_cell", @@ -30,9 +30,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.0.2" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] @@ -54,19 +54,19 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.72" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" [[package]] name = "apollo-cw-asset" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e314e0664dc9c096dba582fe1fa599dc556a4091335e40338ef94379ed2bdd" +checksum = "423502406a307052f6877030f48b5fb4e9fb338fc5e7c8ca1064210def52876b" dependencies = [ "cosmwasm-std", - "cw-storage-plus 1.1.0", - "cw20 1.1.0", + "cw-storage-plus 1.2.0", + "cw20 1.1.2", "schemars", "serde", ] @@ -79,10 +79,10 @@ checksum = "27b88d6037608a781a95ab1125941e2358c37272dcf0d4613de795b81b6ffbf3" dependencies = [ "anyhow", "cosmwasm-std", - "cw-storage-plus 1.1.0", - "cw-utils 1.0.1", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", "derivative", - "itertools", + "itertools 0.10.5", "k256 0.11.6", "osmosis-std 0.19.2", "prost 0.9.0", @@ -94,14 +94,15 @@ dependencies = [ [[package]] name = "apollo-utils" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b05ef4d29df7a8d2459008f09ba1c9f1f0aa7ac1bdfaa510029c0cf6921c2c2" +checksum = "e669b1a4c378832d63a87b3ca2efafc6f4881a61af5dd3e5a6b222c54f2a02ec" dependencies = [ "apollo-cw-asset", "cosmwasm-schema", "cosmwasm-std", - "cw20 1.1.0", + "cw20 1.1.2", + "regex", ] [[package]] @@ -126,7 +127,7 @@ dependencies = [ "cw-storage-plus 0.15.1", "cw-utils 0.15.1", "cw20 0.15.1", - "itertools", + "itertools 0.10.5", "uint", ] @@ -140,10 +141,10 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 0.15.1", - "cw-utils 1.0.1", + "cw-utils 1.0.3", "cw20 0.15.1", "cw3", - "itertools", + "itertools 0.10.5", "uint", ] @@ -170,7 +171,7 @@ dependencies = [ "cosmwasm-std", "cw-storage-plus 0.15.1", "cw2 0.15.1", - "itertools", + "itertools 0.10.5", "protobuf", "thiserror", ] @@ -218,7 +219,7 @@ dependencies = [ "astroport-pair-stable 3.3.0", "cosmwasm-schema", "cosmwasm-std", - "cw-storage-plus 1.1.0", + "cw-storage-plus 1.2.0", "cw20 0.15.1", "cw20-base", "thiserror", @@ -265,7 +266,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 0.15.1", - "cw-utils 1.0.1", + "cw-utils 1.0.3", "cw2 0.15.1", "cw20 0.15.1", "integer-sqrt", @@ -275,9 +276,9 @@ dependencies = [ [[package]] name = "astroport-pair-concentrated" -version = "1.2.7" +version = "1.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04a90ce51403c81af3acf8e7028bb0eb095fce802365453b7e4a13bc0eb0d6d7" +checksum = "c7a25c6ccbeccd25d36706621db915b67ca5d919e192fb06d7dd35cf69152d84" dependencies = [ "astroport 2.9.0", "astroport-factory", @@ -287,24 +288,24 @@ dependencies = [ "cw-utils 0.15.1", "cw2 0.15.1", "cw20 0.15.1", - "itertools", + "itertools 0.10.5", "thiserror", ] [[package]] name = "astroport-pair-stable" -version = "2.1.2" +version = "2.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3a262f2b6916e2a83808b246ff16cb2306a416e88b15a47ddbea5f8b666b1a4" +checksum = "f3a62a313abf4502928cf4cb2eee5205d4ea620079807118f593e1bb4b6c820a" dependencies = [ "astroport 2.9.0", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 0.15.1", - "cw-utils 1.0.1", + "cw-utils 1.0.3", "cw2 0.15.1", "cw20 0.15.1", - "itertools", + "itertools 0.10.5", "thiserror", ] @@ -319,10 +320,10 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 0.15.1", - "cw-utils 1.0.1", + "cw-utils 1.0.3", "cw2 0.15.1", "cw20 0.15.1", - "itertools", + "itertools 0.10.5", "thiserror", ] @@ -427,9 +428,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.71" +version = "0.1.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a564d521dd56509c4c47480d00b80ee55f7e385ae48db5744c67ad50c92d2ebf" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", @@ -444,9 +445,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "axum" -version = "0.6.19" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a1de45611fdb535bfde7b7de4fd54f4fd2b17b1737c0a59b69bf9b92074b8c" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" dependencies = [ "async-trait", "axum-core", @@ -489,9 +490,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ "addr2line", "cc", @@ -532,6 +533,12 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + [[package]] name = "bindgen" version = "0.69.2" @@ -563,10 +570,10 @@ checksum = "7e141fb0f8be1c7b45887af94c88b182472b57c96b56773250ae00cd6a14a164" dependencies = [ "bs58", "hmac", - "k256 0.13.1", + "k256 0.13.3", "rand_core 0.6.4", "ripemd", - "sha2 0.10.7", + "sha2 0.10.8", "subtle", "zeroize", ] @@ -618,9 +625,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" +checksum = "ab9008b6bb9fc80b5277f2fe481c09e828743d9151203e804583eb4c9e15b31d" [[package]] name = "bollard" @@ -669,26 +676,26 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" dependencies = [ - "sha2 0.10.7", + "sha2 0.10.8", ] [[package]] name = "bumpalo" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" dependencies = [ "serde", ] @@ -719,9 +726,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.30" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defd4e7873dbddba6c7c91e199c7fcb946abc4a6a4ac3195400bcfb01b5de877" +checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb" dependencies = [ "android-tzdata", "iana-time-zone", @@ -729,14 +736,14 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets", + "windows-targets 0.52.0", ] [[package]] name = "clang-sys" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" +checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" dependencies = [ "glob", "libc", @@ -745,9 +752,9 @@ dependencies = [ [[package]] name = "config" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d379af7f68bfc21714c6c7dea883544201741d2ce8274bb12fa54f89507f52a7" +checksum = "23738e11972c7643e4ec947840fc463b6a571afcd3e735bdfce7d03c7a784aca" dependencies = [ "async-trait", "json5", @@ -764,15 +771,15 @@ dependencies = [ [[package]] name = "const-oid" -version = "0.9.4" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -780,9 +787,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cosmos-sdk-proto" @@ -815,13 +822,13 @@ checksum = "47126f5364df9387b9d8559dcef62e99010e1d4098f39eb3f7ee4b5c254e40ea" dependencies = [ "bip32", "cosmos-sdk-proto 0.20.0", - "ecdsa 0.16.8", + "ecdsa 0.16.9", "eyre", - "k256 0.13.1", + "k256 0.13.3", "rand_core 0.6.4", "serde", "serde_json", - "signature 2.1.0", + "signature 2.2.0", "subtle-encoding", "tendermint", "tendermint-rpc", @@ -830,31 +837,32 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ca101fbf2f76723711a30ea3771ef312ec3ec254ad021b237871ed802f9f175" +checksum = "8ed6aa9f904de106fa16443ad14ec2abe75e94ba003bb61c681c0e43d4c58d2a" dependencies = [ "digest 0.10.7", + "ecdsa 0.16.9", "ed25519-zebra", - "k256 0.13.1", + "k256 0.13.3", "rand_core 0.6.4", "thiserror", ] [[package]] name = "cosmwasm-derive" -version = "1.4.0" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c73d2dd292f60e42849d2b07c03d809cf31e128a4299a805abd6d24553bcaaf5" +checksum = "bc5e72e330bd3bdab11c52b5ecbdeb6a8697a004c57964caeb5d876f0b088b3c" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.3.0" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb6b2fb76758ef59cddc77f2e2ae91c22f77da49037e9f182e9c2833f0e959b1" +checksum = "ac3e3a2136e2a60e8b6582f5dffca5d1a683ed77bf38537d330bc1dfccd69010" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -865,9 +873,9 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.3.0" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bfa39422f0d9f1c9a6fd3711573258495314dfa3aae738ea825ecd9964bc659" +checksum = "f5d803bea6bd9ed61bd1ee0b4a2eb09ee20dbb539cc6e0b8795614d20952ebb1" dependencies = [ "proc-macro2", "quote", @@ -876,11 +884,12 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a44d3f9c25b2f864737c6605a98f2e4675d53fd8bbc7cf4d7c02475661a793d" +checksum = "ad011ae7447188e26e4a7dbca2fcd0fc186aa21ae5c86df0503ea44c78f9e469" dependencies = [ "base64 0.21.7", + "bech32", "bnum", "cosmwasm-crypto", "cosmwasm-derive", @@ -890,15 +899,16 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2 0.10.7", + "sha2 0.10.8", + "static_assertions", "thiserror", ] [[package]] name = "cosmwasm-storage" -version = "1.3.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ade8cae79dc08a06bcf119c0854ffaed11bd8cb1013c6b04abfe1f51f36211e" +checksum = "66de2ab9db04757bcedef2b5984fbe536903ada4a8a9766717a4a71197ef34f6" dependencies = [ "cosmwasm-std", "serde", @@ -906,9 +916,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] @@ -933,9 +943,9 @@ dependencies = [ [[package]] name = "crypto-bigint" -version = "0.5.3" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "740fe28e594155f10cfc383984cbefd529d7396050557148f79cb0f621204124" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", "rand_core 0.6.4", @@ -994,7 +1004,7 @@ dependencies = [ "astroport-native-coin-registry", "astroport-pair", "astroport-pair-concentrated", - "astroport-pair-stable 2.1.2", + "astroport-pair-stable 2.1.4", "astroport-router", "astroport-staking", "astroport-token", @@ -1037,9 +1047,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", @@ -1063,13 +1073,13 @@ dependencies = [ [[package]] name = "cw-utils" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c80e93d1deccb8588db03945016a292c3c631e6325d349ebb35d2db6f4f946f7" +checksum = "1c4a657e5caacc3a0d00ee96ca8618745d050b8f757c709babafb81208d4239c" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw2 1.1.0", + "cw2 1.1.2", "schemars", "semver", "serde", @@ -1120,14 +1130,15 @@ dependencies = [ [[package]] name = "cw2" -version = "1.1.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ac2dc7a55ad64173ca1e0a46697c31b7a5c51342f55a1e84a724da4eb99908" +checksum = "c6c120b24fbbf5c3bedebb97f2cc85fbfa1c3287e09223428e7e597b5293c1fa" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-storage-plus 1.1.0", + "cw-storage-plus 1.2.0", "schemars", + "semver", "serde", "thiserror", ] @@ -1147,13 +1158,13 @@ dependencies = [ [[package]] name = "cw20" -version = "1.1.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "011c45920f8200bd5d32d4fe52502506f64f2f75651ab408054d4cfc75ca3a9b" +checksum = "526e39bb20534e25a1cd0386727f0038f4da294e5e535729ba3ef54055246abd" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-utils 1.0.1", + "cw-utils 1.0.3", "schemars", "serde", ] @@ -1178,14 +1189,14 @@ dependencies = [ [[package]] name = "cw3" -version = "1.1.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171af3d9127de6805a7dd819fb070c7d2f6c3ea85f4193f42cef259f0a7f33d5" +checksum = "2967fbd073d4b626dd9e7148e05a84a3bebd9794e71342e12351110ffbb12395" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-utils 1.0.1", - "cw20 1.1.0", + "cw-utils 1.0.3", + "cw20 1.1.2", "schemars", "serde", "thiserror", @@ -1246,6 +1257,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + [[package]] name = "derivative" version = "2.2.0" @@ -1313,9 +1333,9 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "dyn-clone" -version = "1.0.12" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "304e6508efa593091e97a9abbc10f90aa7ca635b6d2784feff3c89d41dd12272" +checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" [[package]] name = "ecdsa" @@ -1331,16 +1351,16 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.16.8" +version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der 0.7.8", "digest 0.10.7", - "elliptic-curve 0.13.5", + "elliptic-curve 0.13.8", "rfc6979 0.4.0", - "signature 2.1.0", - "spki 0.7.2", + "signature 2.2.0", + "spki 0.7.3", ] [[package]] @@ -1350,7 +1370,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ "pkcs8 0.10.2", - "signature 2.1.0", + "signature 2.2.0", ] [[package]] @@ -1373,7 +1393,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", @@ -1383,9 +1403,9 @@ dependencies = [ [[package]] name = "either" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "elliptic-curve" @@ -1409,12 +1429,12 @@ dependencies = [ [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct 0.2.0", - "crypto-bigint 0.5.3", + "crypto-bigint 0.5.5", "digest 0.10.7", "ff 0.13.0", "generic-array", @@ -1436,31 +1456,26 @@ dependencies = [ ] [[package]] -name = "errno" -version = "0.3.1" +name = "equivalent" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", -] +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] -name = "errno-dragonfly" -version = "0.1.2" +name = "errno" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ - "cc", "libc", + "windows-sys 0.52.0", ] [[package]] name = "eyre" -version = "0.6.8" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" dependencies = [ "indenter", "once_cell", @@ -1468,12 +1483,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "ff" @@ -1528,9 +1540,9 @@ checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" [[package]] name = "futures" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -1543,9 +1555,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -1553,15 +1565,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -1570,15 +1582,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", @@ -1587,21 +1599,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -1628,9 +1640,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "js-sys", @@ -1641,9 +1653,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.27.3" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "glob" @@ -1675,9 +1687,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.20" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" dependencies = [ "bytes", "fnv", @@ -1685,10 +1697,10 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 2.2.2", "slab", "tokio", - "tokio-util 0.7.8", + "tokio-util 0.7.10", "tracing", ] @@ -1701,6 +1713,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + [[package]] name = "heck" version = "0.4.1" @@ -1709,9 +1727,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" +checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" [[package]] name = "hex" @@ -1728,11 +1746,20 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "http" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", @@ -1741,9 +1768,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", @@ -1758,15 +1785,15 @@ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" dependencies = [ "bytes", "futures-channel", @@ -1827,16 +1854,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.57" +version = "0.1.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows", + "windows-core", ] [[package]] @@ -1877,16 +1904,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.12.3", ] [[package]] -name = "instant" -version = "0.1.12" +name = "indexmap" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "824b2ae422412366ba479e8111fd301f7b5faece8149317bb81925979a53f520" dependencies = [ - "cfg-if", + "equivalent", + "hashbrown 0.14.3", ] [[package]] @@ -1898,17 +1926,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys", -] - [[package]] name = "ipnet" version = "2.9.0" @@ -1924,17 +1941,26 @@ dependencies = [ "either", ] +[[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.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" dependencies = [ "wasm-bindgen", ] @@ -1959,21 +1985,21 @@ dependencies = [ "cfg-if", "ecdsa 0.14.8", "elliptic-curve 0.12.3", - "sha2 0.10.7", + "sha2 0.10.8", ] [[package]] name = "k256" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" dependencies = [ "cfg-if", - "ecdsa 0.16.8", - "elliptic-curve 0.13.5", + "ecdsa 0.16.9", + "elliptic-curve 0.13.8", "once_cell", - "sha2 0.10.7", - "signature 2.1.0", + "sha2 0.10.8", + "signature 2.2.0", ] [[package]] @@ -1996,19 +2022,30 @@ checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libloading" -version = "0.7.4" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" dependencies = [ "cfg-if", - "winapi", + "windows-sys 0.48.0", ] [[package]] name = "libm" -version = "0.2.7" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.2", + "libc", + "redox_syscall", +] [[package]] name = "linked-hash-map" @@ -2018,27 +2055,27 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.3.8" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "log" -version = "0.4.19" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "matchit" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "memchr" -version = "2.5.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "mime" @@ -2063,13 +2100,13 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2082,6 +2119,12 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-derive" version = "0.3.3" @@ -2095,9 +2138,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", "libm", @@ -2113,29 +2156,20 @@ 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 = "object" -version = "0.31.1" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -2156,7 +2190,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" dependencies = [ "dlv-list", - "hashbrown", + "hashbrown 0.12.3", ] [[package]] @@ -2197,7 +2231,7 @@ version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f47f0b2f22adb341bb59e5a3a1b464dde033181954bd055b9ae86d6511ba465b" dependencies = [ - "itertools", + "itertools 0.10.5", "proc-macro2", "prost-types 0.11.9", "quote", @@ -2210,7 +2244,7 @@ version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5ebdfd1bc8ed04db596e110c6baa9b174b04f6ed1ec22c666ddc5cb3fa91bd7" dependencies = [ - "itertools", + "itertools 0.10.5", "proc-macro2", "prost-types 0.11.9", "quote", @@ -2288,19 +2322,20 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.1" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d2d1d55045829d65aad9d389139882ad623b33b904e7c9f1b10c5b8927298e5" +checksum = "1f200d8d83c44a45b21764d1916299752ca035d15ecd46faca3e9a2a2bf6ad06" dependencies = [ + "memchr", "thiserror", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.7.1" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f94bca7e7a599d89dea5dfa309e217e7906c3c007fb9c3299c40b10d6a315d3" +checksum = "bcd6ab1236bbdb3a49027e920e693192ebfe8913f6d60e294de57463a493cfde" dependencies = [ "pest", "pest_generator", @@ -2308,9 +2343,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.1" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d490fe7e8556575ff6911e45567ab95e71617f43781e5c05490dc8d75c965c" +checksum = "2a31940305ffc96863a735bef7c7994a00b325a7138fdbc5bda0f1a0476d3275" dependencies = [ "pest", "pest_meta", @@ -2321,29 +2356,29 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.7.1" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2674c66ebb4b4d9036012091b537aae5878970d6999f81a265034d85b136b341" +checksum = "a7ff62f5259e53b78d1af898941cdcdccfae7385cf7d793a6e55de5d05bb4b7d" dependencies = [ "once_cell", "pest", - "sha2 0.10.7", + "sha2 0.10.8", ] [[package]] name = "pin-project" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842" +checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" +checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" dependencies = [ "proc-macro2", "quote", @@ -2352,9 +2387,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.10" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -2379,9 +2414,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ "der 0.7.8", - "spki 0.7.2", + "spki 0.7.3", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -2398,30 +2439,6 @@ dependencies = [ "syn 2.0.48", ] -[[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.78" @@ -2433,19 +2450,19 @@ dependencies = [ [[package]] name = "proptest" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e35c06b98bf36aba164cc17cb25f7e232f5c4aeea73baa14b8a9f0d92dbfa65" +checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" dependencies = [ "bit-set", - "bitflags 1.3.2", - "byteorder", + "bit-vec", + "bitflags 2.4.2", "lazy_static", "num-traits", "rand", "rand_chacha", "rand_xorshift", - "regex-syntax 0.6.29", + "regex-syntax", "rusty-fork", "tempfile", "unarray", @@ -2488,7 +2505,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe" dependencies = [ "anyhow", - "itertools", + "itertools 0.10.5", "proc-macro2", "quote", "syn 1.0.109", @@ -2501,7 +2518,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" dependencies = [ "anyhow", - "itertools", + "itertools 0.10.5", "proc-macro2", "quote", "syn 1.0.109", @@ -2514,7 +2531,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" dependencies = [ "anyhow", - "itertools", + "itertools 0.11.0", "proc-macro2", "quote", "syn 2.0.48", @@ -2609,67 +2626,52 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "redox_users" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" dependencies = [ "getrandom", - "redox_syscall 0.2.16", + "libredox", "thiserror", ] [[package]] name = "regex" -version = "1.9.1" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", "regex-automata", - "regex-syntax 0.7.4", + "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.3.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.4", + "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.7.4" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" @@ -2744,7 +2746,7 @@ dependencies = [ "libc", "spin", "untrusted", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2791,16 +2793,15 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" -version = "0.37.23" +version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.2", "errno", - "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -2866,9 +2867,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" [[package]] name = "same-file" @@ -2881,18 +2882,18 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "schemars" -version = "0.8.12" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" +checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" dependencies = [ "dyn-clone", "schemars_derive", @@ -2902,9 +2903,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.12" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" +checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" dependencies = [ "proc-macro2", "quote", @@ -2952,9 +2953,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.9.1" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ "bitflags 1.3.2", "core-foundation", @@ -2965,9 +2966,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f51d0c0d83bec45f16480d0ce0058397a69e48fcdc52d1dc8855fb68acbd31a7" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", @@ -2975,15 +2976,15 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.18" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" [[package]] name = "serde" -version = "1.0.173" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91f70896d6720bc714a4a57d22fc91f1db634680e65c8efe13323f1fa38d53f" +checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" dependencies = [ "serde_derive", ] @@ -2999,27 +3000,27 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16a62a1fad1e1828b24acac8f2b468971dade7b8c3c2e672bcadefefb1f8c137" +checksum = "9e9213a07d53faa0b8dd81e767a54a8188a242fdb9be99ab75ec576a774bfdd7" dependencies = [ "serde", ] [[package]] name = "serde_bytes" -version = "0.11.12" +version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" +checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.173" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6250dde8342e0232232be9ca3db7aa40aceb5a3e5dd9bddbc00d99a007cde49" +checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ "proc-macro2", "quote", @@ -3039,9 +3040,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.103" +version = "1.0.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d03b412469450d4404fe8499a268edd7f8b79fecb074b0d812ad64ca21f4031b" +checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" dependencies = [ "itoa", "ryu", @@ -3050,9 +3051,9 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.14" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d89a8107374290037607734c0b73a85db7ed80cae314b3c5791f192a496e731" +checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ "proc-macro2", "quote", @@ -3108,9 +3109,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -3119,9 +3120,9 @@ dependencies = [ [[package]] name = "shlex" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signature" @@ -3135,9 +3136,9 @@ dependencies = [ [[package]] name = "signature" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest 0.10.7", "rand_core 0.6.4", @@ -3145,9 +3146,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] @@ -3175,12 +3176,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.4.9" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", - "winapi", + "windows-sys 0.48.0", ] [[package]] @@ -3201,9 +3202,9 @@ dependencies = [ [[package]] name = "spki" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", "der 0.7.8", @@ -3315,16 +3316,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.6.0" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" +checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" dependencies = [ - "autocfg", "cfg-if", "fastrand", - "redox_syscall 0.3.5", + "redox_syscall", "rustix", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -3339,7 +3339,7 @@ dependencies = [ "ed25519-consensus", "flex-error", "futures", - "k256 0.13.1", + "k256 0.13.3", "num-traits", "once_cell", "prost 0.12.3", @@ -3349,8 +3349,8 @@ dependencies = [ "serde_bytes", "serde_json", "serde_repr", - "sha2 0.10.7", - "signature 2.1.0", + "sha2 0.10.8", + "signature 2.2.0", "subtle", "subtle-encoding", "tendermint-proto 0.34.0", @@ -3442,36 +3442,34 @@ dependencies = [ [[package]] name = "test-case" -version = "3.1.0" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a1d6e7bde536b0412f20765b76e921028059adfd1b90d8974d33fd3c91b25df" +checksum = "eb2550dd13afcd286853192af8601920d959b14c401fcece38071d53bf0768a8" dependencies = [ "test-case-macros", ] [[package]] name = "test-case-core" -version = "3.1.0" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d10394d5d1e27794f772b6fc854c7e91a2dc26e2cbf807ad523370c2a59c0cee" +checksum = "adcb7fd841cd518e279be3d5a3eb0636409487998a4aff22f3de87b81e88384f" dependencies = [ "cfg-if", - "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.48", ] [[package]] name = "test-case-macros" -version = "3.1.0" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb9a44b1c6a54c1ba58b152797739dba2a83ca74e18168a68c980eb142f9404" +checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ - "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.48", "test-case-core", ] @@ -3523,24 +3521,24 @@ dependencies = [ "rand", "serde", "serde_json", - "sha2 0.10.7", + "sha2 0.10.8", "tokio", ] [[package]] name = "thiserror" -version = "1.0.43" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.43" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" dependencies = [ "proc-macro2", "quote", @@ -3549,20 +3547,33 @@ dependencies = [ [[package]] name = "time" -version = "0.3.11" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c91f41dcb2f096c05f0873d667dceec1087ce5bcf984ec8ffb19acddbb3217" +checksum = "fe80ced77cbfb4cb91a94bf72b378b4b6791a0d9b7f09d0be747d1bdff4e68bd" dependencies = [ - "libc", - "num_threads", + "deranged", + "num-conv", + "powerfmt", + "serde", + "time-core", "time-macros", ] +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + [[package]] name = "time-macros" -version = "0.2.4" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +dependencies = [ + "num-conv", + "time-core", +] [[package]] name = "tinyvec" @@ -3581,11 +3592,10 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.29.1" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ - "autocfg", "backtrace", "bytes", "libc", @@ -3594,7 +3604,7 @@ dependencies = [ "pin-project-lite", "socket2", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -3609,9 +3619,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", @@ -3655,9 +3665,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.8" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", @@ -3700,7 +3710,7 @@ dependencies = [ "prost-derive 0.11.9", "tokio", "tokio-stream", - "tokio-util 0.7.8", + "tokio-util 0.7.10", "tower", "tower-layer", "tower-service", @@ -3716,13 +3726,13 @@ checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" dependencies = [ "futures-core", "futures-util", - "indexmap", + "indexmap 1.9.3", "pin-project", "pin-project-lite", "rand", "slab", "tokio", - "tokio-util 0.7.8", + "tokio-util 0.7.10", "tower-layer", "tower-service", "tracing", @@ -3742,11 +3752,10 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -3754,9 +3763,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", @@ -3765,9 +3774,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", ] @@ -3784,15 +3793,15 @@ dependencies = [ [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" @@ -3820,15 +3829,15 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" @@ -3879,9 +3888,9 @@ dependencies = [ [[package]] name = "walkdir" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" dependencies = [ "same-file", "winapi-util", @@ -3904,9 +3913,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -3914,9 +3923,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" dependencies = [ "bumpalo", "log", @@ -3929,9 +3938,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.37" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +checksum = "bde2032aeb86bdfaecc8b261eef3cba735cc426c1f3a3416d1e0791be95fc461" dependencies = [ "cfg-if", "js-sys", @@ -3941,9 +3950,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3951,9 +3960,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" dependencies = [ "proc-macro2", "quote", @@ -3964,15 +3973,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "58cd2333b6e0be7a39605f0e255892fd7418a682d8da8fe042fe25128794d2ed" dependencies = [ "js-sys", "wasm-bindgen", @@ -3980,13 +3989,14 @@ dependencies = [ [[package]] name = "which" -version = "4.4.0" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" dependencies = [ "either", - "libc", + "home", "once_cell", + "rustix", ] [[package]] @@ -4007,9 +4017,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -4021,12 +4031,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows" -version = "0.48.0" +name = "windows-core" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets", + "windows-targets 0.52.0", ] [[package]] @@ -4035,65 +4045,131 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", ] [[package]] name = "windows-targets" -version = "0.48.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "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 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winreg" @@ -4102,7 +4178,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ "cfg-if", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -4116,9 +4192,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" dependencies = [ "zeroize_derive", ] From eabf0372934aaf97450b74153bee58f40b53dfae Mon Sep 17 00:00:00 2001 From: Pacman Date: Wed, 7 Feb 2024 23:20:05 +0100 Subject: [PATCH 04/20] refactor!: simplify RpcRunner --- Cargo.lock | 201 +++------------------ Cargo.toml | 11 +- src/application.rs | 27 --- src/astroport/robot.rs | 4 +- src/astroport/utils.rs | 22 +-- src/lib.rs | 4 - src/multi_test/modules/token_factory.rs | 6 +- src/rpc_runner/chain.rs | 27 ++- src/rpc_runner/config.rs | 112 ++++-------- src/rpc_runner/container.rs | 54 ------ src/rpc_runner/error.rs | 13 ++ src/rpc_runner/helpers.rs | 7 + src/rpc_runner/mod.rs | 14 +- src/rpc_runner/runner.rs | 224 ++++++++---------------- src/test_runner.rs | 16 +- 15 files changed, 197 insertions(+), 545 deletions(-) delete mode 100644 src/application.rs delete mode 100644 src/rpc_runner/container.rs create mode 100644 src/rpc_runner/error.rs create mode 100644 src/rpc_runner/helpers.rs diff --git a/Cargo.lock b/Cargo.lock index f4fe2fc..79467c0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -443,51 +443,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" -[[package]] -name = "axum" -version = "0.6.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" -dependencies = [ - "async-trait", - "axum-core", - "bitflags 1.3.2", - "bytes", - "futures-util", - "http", - "http-body", - "hyper", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "sync_wrapper", - "tower", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum-core" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http", - "http-body", - "mime", - "rustversion", - "tower-layer", - "tower-service", -] - [[package]] name = "backtrace" version = "0.3.69" @@ -571,6 +526,8 @@ dependencies = [ "bs58", "hmac", "k256 0.13.3", + "once_cell", + "pbkdf2", "rand_core 0.6.4", "ripemd", "sha2 0.10.8", @@ -791,18 +748,6 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" -[[package]] -name = "cosmos-sdk-proto" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673d31bd830c0772d78545de20d975129b6ab2f7db4e4e9313c3b8777d319194" -dependencies = [ - "prost 0.11.9", - "prost-types 0.11.9", - "tendermint-proto 0.26.0", - "tonic", -] - [[package]] name = "cosmos-sdk-proto" version = "0.20.0" @@ -811,7 +756,7 @@ checksum = "32560304ab4c365791fd307282f76637213d8083c1a98490c35159cd67852237" dependencies = [ "prost 0.12.3", "prost-types 0.12.3", - "tendermint-proto 0.34.0", + "tendermint-proto", ] [[package]] @@ -821,7 +766,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47126f5364df9387b9d8559dcef62e99010e1d4098f39eb3f7ee4b5c254e40ea" dependencies = [ "bip32", - "cosmos-sdk-proto 0.20.0", + "cosmos-sdk-proto", "ecdsa 0.16.9", "eyre", "k256 0.13.3", @@ -1010,8 +955,8 @@ dependencies = [ "astroport-token", "astroport-vesting", "astroport-whitelist", + "bip32", "config", - "cosmos-sdk-proto 0.15.0", "cosmrs", "cosmwasm-schema", "cosmwasm-std", @@ -1027,7 +972,7 @@ dependencies = [ "serde_json", "strum", "test-case", - "test-tube 0.4.0", + "test-tube", "testcontainers", "thiserror", "tokio", @@ -1697,7 +1642,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.2.2", + "indexmap", "slab", "tokio", "tokio-util 0.7.10", @@ -1827,18 +1772,6 @@ dependencies = [ "tokio-rustls", ] -[[package]] -name = "hyper-timeout" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" -dependencies = [ - "hyper", - "pin-project-lite", - "tokio", - "tokio-io-timeout", -] - [[package]] name = "hyperlocal" version = "0.8.0" @@ -1897,16 +1830,6 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - [[package]] name = "indexmap" version = "2.2.2" @@ -2065,12 +1988,6 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" -[[package]] -name = "matchit" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" - [[package]] name = "memchr" version = "2.7.1" @@ -2265,7 +2182,7 @@ dependencies = [ "prost 0.12.3", "serde", "serde_json", - "test-tube 0.5.0", + "test-tube", "thiserror", ] @@ -2281,6 +2198,16 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest 0.10.7", + "hmac", +] + [[package]] name = "peeking_take_while" version = "0.1.2" @@ -3353,7 +3280,7 @@ dependencies = [ "signature 2.2.0", "subtle", "subtle-encoding", - "tendermint-proto 0.34.0", + "tendermint-proto", "time", "zeroize", ] @@ -3372,24 +3299,6 @@ dependencies = [ "url", ] -[[package]] -name = "tendermint-proto" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "974d6330a19dfa6720e9f663fc59101d207a817db3f9c730d3f31caaa565b574" -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-proto" version = "0.34.0" @@ -3430,7 +3339,7 @@ dependencies = [ "subtle-encoding", "tendermint", "tendermint-config", - "tendermint-proto 0.34.0", + "tendermint-proto", "thiserror", "time", "tokio", @@ -3473,22 +3382,6 @@ dependencies = [ "test-case-core", ] -[[package]] -name = "test-tube" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f330a3c269a6abcda205d272d600be1458df82bf9ad40c0d2244ffa643f76b2a" -dependencies = [ - "base64 0.21.7", - "cosmrs", - "cosmwasm-std", - "osmosis-std 0.22.0", - "prost 0.12.3", - "serde", - "serde_json", - "thiserror", -] - [[package]] name = "test-tube" version = "0.5.0" @@ -3547,9 +3440,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe80ced77cbfb4cb91a94bf72b378b4b6791a0d9b7f09d0be747d1bdff4e68bd" +checksum = "00b24b79b7a07f10209f19e683ca1e289d80b1e76ffa8c2b779718566a083679" dependencies = [ "deranged", "num-conv", @@ -3607,16 +3500,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "tokio-io-timeout" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" -dependencies = [ - "pin-project-lite", - "tokio", -] - [[package]] name = "tokio-macros" version = "2.2.0" @@ -3693,46 +3576,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f219fad3b929bef19b1f86fbc0358d35daed8f2cac972037ac0dc10bbb8d5fb" dependencies = [ "async-stream", - "async-trait", - "axum", "base64 0.13.1", "bytes", "futures-core", "futures-util", - "h2", "http", "http-body", - "hyper", - "hyper-timeout", "percent-encoding", "pin-project", - "prost 0.11.9", - "prost-derive 0.11.9", - "tokio", "tokio-stream", "tokio-util 0.7.10", - "tower", - "tower-layer", - "tower-service", - "tracing", - "tracing-futures", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "indexmap 1.9.3", - "pin-project", - "pin-project-lite", - "rand", - "slab", - "tokio", - "tokio-util 0.7.10", "tower-layer", "tower-service", "tracing", @@ -3781,16 +3634,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "tracing-futures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" -dependencies = [ - "pin-project", - "tracing", -] - [[package]] name = "try-lock" version = "0.2.5" diff --git a/Cargo.toml b/Cargo.toml index 0fe13cb..5017c6a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,10 +32,10 @@ incremental = false overflow-checks = true [features] -default = [] +default = ["rpc-runner", "osmosis", "astroport", "chain-download", "multi-test", "astroport-multi-test", "osmosis-test-tube"] astroport = ["cw20", "dep:astroport"] osmosis = ["proptest", "apollo-utils", "osmosis-test-tube"] -rpc-runner = ["testcontainers", "tonic", "tokio", "cosmos-sdk-proto"] +rpc-runner = ["tonic", "tokio", "bip32"] chain-download = ["tokio"] multi-test = ["apollo-cw-multi-test", "paste", "regex"] astroport-multi-test = [ @@ -69,6 +69,7 @@ all-features = true rustdoc-args = ["--cfg", "docsrs"] [dependencies] +bip32 = { version = "0.5", features = ["bip39"], optional = true } cosmwasm-std = { version = "1.2.1", features = ["stargate"] } serde = { version = "1.0.152", default-features = false, features = ["derive"] } thiserror = { version = "1.0.31" } @@ -82,8 +83,8 @@ anyhow = "1.0.66" serde_json = "1.0.89" strum = { version = "0.24.1", features = ["derive"] } osmosis-std = "0.22.0" -test-tube = { version = "0.4.0", features = ["module-wrappers"] } -osmosis-test-tube = { version = "22.0.0", optional = true } +test-tube = { version = "0.5.0", features = ["module-wrappers"] } +osmosis-test-tube = { version = "22.1.0", optional = true } # Astroport deps astroport = { version = "=2.9.0", optional = true } @@ -114,7 +115,6 @@ tonic = { version = "0.8.2", default-features = false, optional = true } testcontainers = { version = "0.14.0", features = [ "experimental", ], optional = true } -cosmos-sdk-proto = { version = "0.15.0", optional = true } # Cw-multi-test deps apollo-cw-multi-test = { version = "0.17.0", features = ["stargate"], optional = true } @@ -125,6 +125,5 @@ tokio = { version = "1.27.0", optional = true } [dev-dependencies] test-case = "3.0.0" -testcontainers = { version = "0.14.0", features = ["experimental"] } cw20-base = { version = "0.15", features = ["library"] } cw20 = "0.15" diff --git a/src/application.rs b/src/application.rs deleted file mode 100644 index fa310af..0000000 --- a/src/application.rs +++ /dev/null @@ -1,27 +0,0 @@ -use cosmrs::proto::cosmos::auth::v1beta1::BaseAccount; -use cosmrs::proto::cosmos::base::abci::v1beta1::GasInfo; -use cosmrs::{rpc::endpoint::abci_query::AbciQuery, tx::Fee, AccountId}; -use prost::Message; -use test_tube::{RunnerResult, SigningAccount}; - -pub trait Application { - fn create_signed_tx( - &self, - msgs: I, - signer: &SigningAccount, - fee: Fee, - ) -> RunnerResult> - where - I: IntoIterator; - - fn simulate_tx(&self, msgs: I, signer: &SigningAccount) -> RunnerResult - where - I: IntoIterator; - - fn estimate_fee(&self, msgs: I, signer: &SigningAccount) -> RunnerResult - where - I: IntoIterator; - - fn base_account(&self, account_id: AccountId) -> RunnerResult; - fn abci_query(&self, req: T, path: &str) -> RunnerResult; -} diff --git a/src/astroport/robot.rs b/src/astroport/robot.rs index e39e6fa..a9a90c3 100644 --- a/src/astroport/robot.rs +++ b/src/astroport/robot.rs @@ -429,7 +429,7 @@ mod tests { factory::PairType, pair::StablePoolParams, }; - use cosmwasm_std::{to_binary, Binary, Uint128}; + use cosmwasm_std::{to_json_binary, Binary, Uint128}; use test_case::test_case; use test_tube::{Account, SigningAccount}; @@ -523,7 +523,7 @@ mod tests { /// Returns some stable pool initialization params. fn stable_init_params() -> Option { Some( - to_binary(&StablePoolParams { + to_json_binary(&StablePoolParams { amp: 10, owner: None, }) diff --git a/src/astroport/utils.rs b/src/astroport/utils.rs index 07da312..7cf5120 100644 --- a/src/astroport/utils.rs +++ b/src/astroport/utils.rs @@ -21,7 +21,7 @@ use astroport::vesting::{ VestingSchedule, VestingSchedulePoint, }; use cosmwasm_schema::cw_serde; -use cosmwasm_std::{to_binary, Addr, Binary, Coin, Event, Uint128, Uint64}; +use cosmwasm_std::{to_json_binary, Addr, Binary, Coin, Event, Uint128, Uint64}; use cw20::{BalanceResponse, Cw20Coin, Cw20ExecuteMsg, Cw20QueryMsg, MinterResponse}; use test_tube::{Account, Module, Runner, SigningAccount, Wasm}; @@ -356,7 +356,7 @@ where let msg = Cw20ExecuteMsg::Send { contract: vesting.clone(), amount: vesting_amount, - msg: to_binary(&VestingHookMsg::RegisterVestingAccounts { + msg: to_json_binary(&VestingHookMsg::RegisterVestingAccounts { vesting_accounts: vec![VestingAccount { address: generator.clone(), schedules: vec![VestingSchedule { @@ -704,10 +704,7 @@ mod tests { use crate::OwnedTestRunner; #[cfg(feature = "rpc-runner")] - use { - crate::rpc_runner::{config::RpcRunnerConfig, RpcRunner}, - testcontainers::clients::Cli, - }; + use crate::rpc_runner::{config::RpcRunnerConfig, RpcRunner}; #[cfg(feature = "chain-download")] use { @@ -830,14 +827,10 @@ mod tests { /// Creates an RPC test runner and accounts. If `cli` is Some, it will attempt to run the tests /// against the configured docker container. #[cfg(feature = "rpc-runner")] - fn get_rpc_runner(cli: Option<&Cli>) -> OwnedTestRunner { + fn get_rpc_runner<'a>() -> OwnedTestRunner<'a> { let rpc_runner_config = RpcRunnerConfig::from_yaml(TEST_CONFIG_PATH); - let runner = if let Some(cli) = cli { - RpcRunner::new(rpc_runner_config, Some(cli)).unwrap() - } else { - RpcRunner::new(rpc_runner_config, None).unwrap() - }; + let runner = RpcRunner::new(rpc_runner_config).unwrap(); OwnedTestRunner::RpcRunner(runner) } @@ -845,8 +838,7 @@ mod tests { // Commenting out because we have not set up Docker for CI yet. // #[test] pub fn test_with_rpc_runner() { - let cli = Cli::default(); - let runner = get_rpc_runner(Some(&cli)); + let runner = get_rpc_runner(); let contracts = get_local_contracts(&runner.as_ref()); test_instantiate_astroport(runner.as_ref(), contracts); } @@ -864,7 +856,7 @@ mod tests { fn get_fee_denom<'a>(runner: &'a TestRunner) -> &'a str { match runner { #[cfg(feature = "rpc-runner")] - TestRunner::RpcRunner(rpc_runner) => rpc_runner.rpc_runner_config.chain_config.denom(), + TestRunner::RpcRunner(rpc_runner) => rpc_runner.config.chain_config.denom(), _ => "uosmo", } } diff --git a/src/lib.rs b/src/lib.rs index 8fcb0e7..b903ca6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,3 @@ -pub mod application; pub mod artifact; pub mod const_coin; pub mod error; @@ -50,6 +49,3 @@ pub use osmosis_test_tube; #[cfg(feature = "multi-test")] pub use apollo_cw_multi_test as cw_multi_test; - -#[cfg(feature = "rpc-runner")] -pub use testcontainers::clients::Cli; diff --git a/src/multi_test/modules/token_factory.rs b/src/multi_test/modules/token_factory.rs index 1b0fe46..62dff27 100644 --- a/src/multi_test/modules/token_factory.rs +++ b/src/multi_test/modules/token_factory.rs @@ -2,8 +2,8 @@ use std::str::FromStr; use anyhow::{bail, Ok}; use cosmwasm_std::{ - from_slice, Addr, Api, BankMsg, BankQuery, BlockInfo, Coin, Empty, Event, QueryRequest, - Storage, SupplyResponse, Uint128, + from_json, Addr, Api, BankMsg, BankQuery, BlockInfo, Coin, Empty, Event, QueryRequest, Storage, + SupplyResponse, Uint128, }; use osmosis_std::types::osmosis::tokenfactory::v1beta1::{ MsgBurn, MsgBurnResponse, MsgCreateDenom, MsgCreateDenomResponse, MsgMint, MsgMintResponse, @@ -97,7 +97,7 @@ impl TokenFactory<'_> { denom: denom.clone(), }); let raw = router.query(api, storage, block, request)?; - let supply: SupplyResponse = from_slice(&raw)?; + let supply: SupplyResponse = from_json(&raw)?; println!("supply: {:?}", supply); println!( "supply.amount.amount.is_zero: {:?}", diff --git a/src/rpc_runner/chain.rs b/src/rpc_runner/chain.rs index d993b1d..067f654 100644 --- a/src/rpc_runner/chain.rs +++ b/src/rpc_runner/chain.rs @@ -1,11 +1,10 @@ use std::time::Duration; -use cosmos_sdk_proto::cosmos::tx::v1beta1::service_client::ServiceClient; use cosmrs::rpc::{Client, HttpClient}; +use cosmwasm_std::{Coin, Uint128}; // use futures_time::{task::sleep, time::Duration}; use serde::Deserialize; use thiserror::Error; -use tonic::transport::Channel; use cosmrs::rpc::error::Error as RpcError; @@ -13,19 +12,17 @@ use config::Config; use crate::helpers::block_on; +use super::config::FeeSetting; + #[derive(Debug, Error)] pub enum ChainError { #[error("{0}")] RpcError(#[from] RpcError), - - #[error("{0}")] - TonicTransportError(#[from] tonic::transport::Error), } #[derive(Debug)] pub struct Chain { http_client: HttpClient, - grpc_client: ServiceClient, chain_cfg: ChainConfig, } @@ -59,6 +56,16 @@ impl ChainConfig { pub fn prefix(&self) -> &str { &self.prefix } + + pub fn auto_fee_setting(&self) -> FeeSetting { + FeeSetting::Auto { + gas_price: Coin { + denom: self.denom.clone(), + amount: Uint128::new(self.gas_price as u128), + }, + gas_adjustment: self.gas_adjustment, + } + } } #[allow(clippy::missing_const_for_fn)] @@ -69,12 +76,8 @@ impl Chain { //let rpc_endpoint="http://localhost:26657".to_string(); let http_client = HttpClient::new(chain_cfg.rpc_endpoint.as_str())?; - let grpc_client: ServiceClient = - block_on(ServiceClient::connect(chain_cfg.grpc_endpoint.clone()))?; - Ok(Self { http_client, - grpc_client, chain_cfg, }) } @@ -83,10 +86,6 @@ impl Chain { &self.http_client } - pub fn grpc_client(&self) -> &ServiceClient { - &self.grpc_client - } - pub fn chain_cfg(&self) -> &ChainConfig { &self.chain_cfg } diff --git a/src/rpc_runner/config.rs b/src/rpc_runner/config.rs index 687d2f4..a292b88 100644 --- a/src/rpc_runner/config.rs +++ b/src/rpc_runner/config.rs @@ -1,18 +1,10 @@ -use std::{collections::HashMap, fs}; - use config::Config; -use cosmrs::bip32; use cosmwasm_std::Coin; -use osmosis_test_tube::RunnerError; use serde::{Deserialize, Serialize}; -use test_tube::{account::FeeSetting, SigningAccount}; -use testcontainers::{images::generic::GenericImage, Container}; use super::chain::ChainConfig; use crate::helpers::get_current_working_dir; -use super::container::ContainerInfo; - #[derive(Clone, Debug, Serialize, Deserialize)] pub struct ImportedAccount { pub name: String, @@ -21,11 +13,43 @@ pub struct ImportedAccount { pub pubkey: String, } +/// This enum exactly matches the `FeeSetting` enum in `test-tube` and is only needed +/// because `test_tube::account::FeeSetting` does not derive `Deserialize` +#[derive(Debug, Clone, PartialEq, Deserialize)] +pub enum FeeSetting { + Auto { + gas_price: Coin, + gas_adjustment: f64, + }, + Custom { + amount: Coin, + gas_limit: u64, + }, +} + +impl From for test_tube::account::FeeSetting { + fn from(value: FeeSetting) -> Self { + match value { + FeeSetting::Auto { + gas_price, + gas_adjustment, + } => test_tube::account::FeeSetting::Auto { + gas_price: gas_price.into(), + gas_adjustment, + }, + FeeSetting::Custom { amount, gas_limit } => test_tube::account::FeeSetting::Custom { + amount: amount.into(), + gas_limit, + }, + } + } +} + #[derive(Clone, Debug, Deserialize)] pub struct RpcRunnerConfig { pub chain_config: ChainConfig, - pub container: Option, - pub accounts_folder: String, + pub funding_account_mnemonic: String, + pub fee_setting: Option, } impl RpcRunnerConfig { @@ -38,72 +62,4 @@ impl RpcRunnerConfig { .unwrap(); settings.try_deserialize::().unwrap() } - - pub fn bind_chain_to_container(&mut self, container: &Container) { - // We inject here the endpoint since containers have a life time - self.chain_config.rpc_endpoint = - format!("http://localhost:{}/", container.get_host_port_ipv4(26657)); - self.chain_config.grpc_endpoint = - format!("http://localhost:{}/", container.get_host_port_ipv4(9090)); - } - - pub fn import_account(&self, name: &str) -> Result { - let path = format!( - "{}/{}/accounts.json", - self.accounts_folder, self.chain_config.name - ); - println!("Reading accounts from [{}]", path); - let bytes = fs::read(path).unwrap(); - let accounts: Vec = serde_json::from_slice(&bytes).unwrap(); - let imported_account = accounts.iter().find(|e| e.name.contains(name)); - imported_account.map_or_else( - || { - Err(RunnerError::QueryError { - msg: format!("Account not found [{}]", name), - }) - }, - |ia| { - let signing_key = - Self::mnemonic_to_signing_key(&ia.mnemonic, &self.chain_config).unwrap(); - //println!("Generated key [{:?}]", signging_key.public_key()); - Ok(SigningAccount::new( - self.chain_config.prefix().to_string(), - signing_key, - FeeSetting::Auto { - gas_price: Coin::new( - self.chain_config.gas_price.into(), - self.chain_config.denom(), - ), - gas_adjustment: self.chain_config.gas_adjustment, - }, - )) - }, - ) - } - - pub fn import_all_accounts(&self) -> HashMap { - let mut accounts = HashMap::::new(); - (1..10).for_each(|n| { - let name = format!("test{}", n); - let signing_account = self.import_account(&name).unwrap(); - accounts.insert(name, signing_account); - }); - - // accounts.insert( - // "validator".to_string(), - // self.import_account("validator").unwrap(), - // ); - accounts - } - - fn mnemonic_to_signing_key( - mnemonic: &str, - chain_cfg: &ChainConfig, - ) -> Result { - let seed = bip32::Mnemonic::new(mnemonic, bip32::Language::English)?.to_seed(""); - cosmrs::crypto::secp256k1::SigningKey::derive_from_path( - seed, - &chain_cfg.derivation_path.parse()?, - ) - } } diff --git a/src/rpc_runner/container.rs b/src/rpc_runner/container.rs deleted file mode 100644 index c2b8d63..0000000 --- a/src/rpc_runner/container.rs +++ /dev/null @@ -1,54 +0,0 @@ -use std::env; - -use serde::Deserialize; -use testcontainers::{core::WaitFor, images::generic::GenericImage}; -use thiserror::Error; - -pub const DEFAULT_WAIT: u64 = 30; - -#[derive(Clone, Debug, Deserialize)] -pub struct ContainerInfo { - pub name: String, - pub tag: String, - pub volumes: Vec<(String, String)>, - pub entrypoint: Option, - pub ports: Vec, -} - -#[derive(Error, Debug)] -pub enum ContainerError { - #[error("{0}")] - IoError(#[from] std::io::Error), - - #[error("{0}")] - Generic(String), -} - -impl ContainerInfo { - pub fn get_container_image(&self) -> Result { - let mut image = GenericImage::new(self.name.clone(), self.tag.clone()) - .with_wait_for(WaitFor::seconds(DEFAULT_WAIT)); - - for port in self.ports.iter() { - image = image.with_exposed_port(*port); - } - if let Some(entrypoint) = &self.entrypoint { - image = image.with_entrypoint(entrypoint); - } - - let dir_os_string = env::current_dir() - .map(|d| d.into_os_string()) - .map_err(|_e| "Failed to get current directory".to_string())?; - let working_dir = dir_os_string - .into_string() - .map_err(|_e| "Failed to convert OS string to string".to_string())?; - - for (from, dest) in &self.volumes { - // TODO: Merge paths in better way? Should allow leading dot in `from`... - let from = format!("{}/{}", working_dir, from); - image = image.with_volume(from, dest); - } - - Ok(image) - } -} diff --git a/src/rpc_runner/error.rs b/src/rpc_runner/error.rs new file mode 100644 index 0000000..07c3bc5 --- /dev/null +++ b/src/rpc_runner/error.rs @@ -0,0 +1,13 @@ +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum RpcRunnerError { + #[error("{0}")] + Bip32(#[from] bip32::Error), + + #[error("{0}")] + ChainError(#[from] super::chain::ChainError), + + #[error("{0}")] + Generic(String), +} diff --git a/src/rpc_runner/helpers.rs b/src/rpc_runner/helpers.rs new file mode 100644 index 0000000..d01fcfa --- /dev/null +++ b/src/rpc_runner/helpers.rs @@ -0,0 +1,7 @@ +pub fn mnemonic_to_signing_key( + mnemonic: &str, + path: &bip32::DerivationPath, +) -> Result { + let seed = bip32::Mnemonic::new(mnemonic, bip32::Language::English)?.to_seed(""); + cosmrs::crypto::secp256k1::SigningKey::derive_from_path(seed, path) +} diff --git a/src/rpc_runner/mod.rs b/src/rpc_runner/mod.rs index 1e84e09..723b7ad 100644 --- a/src/rpc_runner/mod.rs +++ b/src/rpc_runner/mod.rs @@ -1,6 +1,18 @@ +//! # RPC Runner +//! This module contains a runner that can be used to interact with a blockchain via an RPC node. +//! It implements the `CwItRunner` trait to be compatible with all the other runners in this crate. +//! There are some fundamental differences between this runner and the others. +//! +//! 1. Since we are only interacting with the blockchain via RPC and are not controlling the entire chain. +//! This means that to initialize accounts with the `init_account` method a funding account is required. +//! This funding account is used to send tokens to the account that is being initialized, which means that the +//! funding account must have enough tokens to initialize all the accounts that are being initialized. +//! +//! 2. The `increase_time` function will panic as it is not implementable via RPC. pub mod chain; pub mod config; -pub mod container; +pub mod error; +mod helpers; mod runner; pub use runner::*; diff --git a/src/rpc_runner/runner.rs b/src/rpc_runner/runner.rs index fcfd1d4..4a09c0a 100644 --- a/src/rpc_runner/runner.rs +++ b/src/rpc_runner/runner.rs @@ -1,13 +1,13 @@ use std::num::ParseIntError; -#[cfg(feature = "multi-test")] use anyhow::bail; -use cosmos_sdk_proto::cosmos::auth::v1beta1::{QueryAccountRequest, QueryAccountResponse}; +use cosmrs::crypto::secp256k1; use cosmrs::proto::cosmos::auth::v1beta1::BaseAccount; +use cosmrs::proto::cosmos::auth::v1beta1::{QueryAccountRequest, QueryAccountResponse}; use cosmrs::tendermint::Time; use cosmwasm_std::{ - from_binary, Coin, ContractResult, Empty, Querier, QuerierResult, QueryRequest, SystemResult, + from_json, Coin, ContractResult, Empty, Querier, QuerierResult, QueryRequest, SystemResult, WasmQuery, }; use osmosis_std::types::cosmwasm::wasm::v1::{ @@ -17,20 +17,15 @@ use test_tube::{ account::FeeSetting, Account, DecodeError, EncodeError, Module, Runner, RunnerError, RunnerExecuteResult, RunnerResult, SigningAccount, Wasm, }; -use testcontainers::clients::Cli; -use testcontainers::images::generic::GenericImage; -use testcontainers::Container; -use thiserror::Error; use super::chain::Chain; use super::config::RpcRunnerConfig; -use crate::application::Application; -use crate::helpers::block_on; +use super::error::RpcRunnerError; +use super::helpers; +use crate::helpers::{bank_send, block_on}; use crate::traits::CwItRunner; use crate::ContractType; -use cosmos_sdk_proto::cosmos::tx::v1beta1::service_client::ServiceClient; -use cosmos_sdk_proto::cosmos::tx::v1beta1::SimulateRequest; use cosmrs::rpc::endpoint::abci_query::AbciQuery; use cosmrs::rpc::endpoint::broadcast::tx_commit::Response as TxCommitResponse; use cosmrs::rpc::Client; @@ -39,90 +34,43 @@ use cosmrs::tx::{Fee, SignerInfo}; use cosmrs::AccountId; use prost::Message; -#[derive(Debug, Error)] -pub enum RpcRunnerError { - #[error("{0}")] - ChainError(#[from] super::chain::ChainError), - - #[error("{0}")] - Generic(String), -} - -#[derive(Debug)] -pub struct RpcRunner<'a> { +pub struct RpcRunner { chain: Chain, - _container: Option>, - pub rpc_runner_config: RpcRunnerConfig, + funding_account: SigningAccount, + pub config: RpcRunnerConfig, } -impl<'a> RpcRunner<'a> { - pub fn new( - mut rpc_runner_config: RpcRunnerConfig, - docker: Option<&'a Cli>, - ) -> Result { - // Setup test container - let container = match &rpc_runner_config.container { - Some(container_info) => { - let container: Container = docker.unwrap().run( - container_info - .get_container_image() - .map_err(RpcRunnerError::Generic)?, - ); - rpc_runner_config.bind_chain_to_container(&container); - Some(container) - } - None => None, - }; - +impl RpcRunner { + pub fn new(rpc_runner_config: RpcRunnerConfig) -> Result { // Setup chain and app let chain = Chain::new(rpc_runner_config.chain_config.clone())?; - Ok(Self { - chain, - _container: container, - rpc_runner_config, - }) - } - - pub fn from_container( - mut rpc_runner_config: RpcRunnerConfig, - container: Container<'a, GenericImage>, - ) -> Result { - rpc_runner_config.bind_chain_to_container(&container); + let signing_key = helpers::mnemonic_to_signing_key( + &rpc_runner_config.funding_account_mnemonic, + &rpc_runner_config.chain_config.derivation_path.parse()?, + )?; - let chain = Chain::new(rpc_runner_config.chain_config.clone())?; + let funding_account = SigningAccount::new( + rpc_runner_config.chain_config.prefix.clone(), + signing_key, + rpc_runner_config + .fee_setting + .clone() + .unwrap_or(chain.chain_cfg().auto_fee_setting()) + .into(), + ); Ok(Self { chain, - _container: Some(container), - rpc_runner_config, + config: rpc_runner_config, + funding_account, }) } - - pub fn init_account(&self, id: usize) -> Result { - Ok(self - .rpc_runner_config - .import_account(&format!("test{}", id))?) - } - - pub fn init_accounts(&self, count: usize) -> Result, anyhow::Error> { - if count > 10 { - panic!("cannot create more than 10 accounts"); - } - - let mut accounts = vec![]; - for i in 1..count + 1 { - let account = self.init_account(i)?; - accounts.push(account); - } - - Ok(accounts) - } } -impl Querier for RpcRunner<'_> { +impl Querier for RpcRunner { fn raw_query(&self, bin_request: &[u8]) -> QuerierResult { - let x = match from_binary::>(&bin_request.into()).unwrap() { + let x = match from_json::>(&bin_request).unwrap() { QueryRequest::Wasm(wasm_query) => match wasm_query { WasmQuery::Smart { contract_addr, msg } => self .query::<_, QuerySmartContractStateResponse>( @@ -144,7 +92,7 @@ impl Querier for RpcRunner<'_> { } } -impl<'a> Application for RpcRunner<'a> { +impl RpcRunner { fn create_signed_tx( &self, msgs: I, @@ -194,65 +142,13 @@ impl<'a> Application for RpcRunner<'a> { #[allow(deprecated)] fn simulate_tx( &self, - msgs: I, - signer: &SigningAccount, + _msgs: I, + _signer: &SigningAccount, ) -> RunnerResult where I: IntoIterator, { - // println!("simulate_tx called"); - let zero_fee = Fee::from_amount_and_gas( - cosmrs::Coin { - denom: self.chain.chain_cfg().denom().parse()?, - amount: (0u8).into(), - }, - 0u64, - ); - - let tx_raw = self.create_signed_tx(msgs, signer, zero_fee)?; - // println!("tx_raw size = {:?}", tx_raw.len()); - - let simulate_msg = SimulateRequest { - tx: None, - tx_bytes: tx_raw, - }; - - // println!("Init GRpc ServiceClient (port 9090)"); - - let gas_info: cosmos_sdk_proto::cosmos::base::abci::v1beta1::GasInfo = block_on(async { - let mut service = ServiceClient::connect(self.chain.chain_cfg().grpc_endpoint.clone()) - .await - .map_err(|e| RunnerError::GenericError(e.to_string()))?; - service - .simulate(simulate_msg) - .await - .map_err(|e| RunnerError::GenericError(e.to_string())) - })? - .into_inner() - .gas_info - .ok_or(RunnerError::QueryError { - msg: "No gas_info returned from simulate".into(), - })?; - - Ok(cosmrs::proto::cosmos::base::abci::v1beta1::GasInfo { - gas_wanted: gas_info.gas_wanted, - gas_used: gas_info.gas_used, - }) - // let gas_limit = (gas_info.gas_used as f64 * DEFAULT_GAS_ADJUSTMENT).ceil(); - // let amount = Coin { - // denom: Denom::from_str(FEE_DENOM).unwrap(), - // amount: ((gas_limit * 0.1).ceil() as u64).into(), - // }; - - // Ok(Fee::from_amount_and_gas(amount, gas_limit as u64)) - // unsafe { - // let res = Simulate(self.id, base64_tx_bytes); - // let res = RawResult::from_non_null_ptr(res).into_result()?; - - // cosmrs::proto::cosmos::base::abci::v1beta1::GasInfo::decode(res.as_slice()) - // .map_err(DecodeError::ProtoDecodeError) - // .map_err(RunnerError::DecodeError) - // } + todo!() } fn estimate_fee(&self, msgs: I, signer: &SigningAccount) -> RunnerResult @@ -310,7 +206,7 @@ impl<'a> Application for RpcRunner<'a> { req.encode(&mut buf) .map_err(EncodeError::ProtoEncodeError)?; Ok(block_on(self.chain.client().abci_query( - Some(path.parse()?), + Some(path.to_string()), buf, None, false, @@ -318,7 +214,7 @@ impl<'a> Application for RpcRunner<'a> { } } -impl<'a> Runner<'_> for RpcRunner<'a> { +impl Runner<'_> for RpcRunner { fn execute_multiple( &self, msgs: &[(M, &str)], @@ -380,16 +276,16 @@ impl<'a> Runner<'_> for RpcRunner<'a> { let tx_raw = self.create_signed_tx(msgs, signer, fee)?; let tx_commit_response: TxCommitResponse = - block_on(self.chain.client().broadcast_tx_commit(tx_raw.into()))?; + block_on(self.chain.client().broadcast_tx_commit(tx_raw))?; if tx_commit_response.check_tx.code.is_err() { return Err(RunnerError::ExecuteError { - msg: tx_commit_response.check_tx.log.value().to_string(), + msg: tx_commit_response.check_tx.log, }); } - if tx_commit_response.deliver_tx.code.is_err() { + if tx_commit_response.tx_result.code.is_err() { return Err(RunnerError::ExecuteError { - msg: tx_commit_response.deliver_tx.log.value().to_string(), + msg: tx_commit_response.tx_result.log, }); } tx_commit_response.try_into() @@ -405,7 +301,7 @@ impl<'a> Runner<'_> for RpcRunner<'a> { .map_err(EncodeError::ProtoEncodeError)?; let res = block_on(self.chain.client().abci_query( - Some(path.parse()?), + Some(path.to_string()), base64_query_msg_bytes, None, false, @@ -421,42 +317,62 @@ impl<'a> Runner<'_> for RpcRunner<'a> { } } -impl<'a> CwItRunner<'a> for RpcRunner<'a> { +impl<'a> CwItRunner<'a> for RpcRunner { fn store_code( &self, code: ContractType, signer: &SigningAccount, ) -> Result { match code { - #[cfg(feature = "multi-test")] - ContractType::MultiTestContract(_) => { - bail!("MultiTestContract not supported for RpcRunner") - } ContractType::Artifact(artifact) => { let bytes = artifact.get_wasm_byte_code()?; let wasm = Wasm::new(self); let code_id = wasm.store_code(&bytes, None, signer)?.data.code_id; Ok(code_id) } + _ => bail!("Only ContractType::Artifact is supported for RpcRunner"), } } - fn init_account(&self, _initial_balance: &[Coin]) -> Result { - // TODO: how to solve for ID and not using requested balance - self.init_account(0) + fn init_account(&self, initial_balance: &[Coin]) -> Result { + // Create new random account + let new_account = SigningAccount::new( + self.chain.chain_cfg().prefix().to_string(), + secp256k1::SigningKey::random(), + self.config + .fee_setting + .clone() + .unwrap_or(self.chain.chain_cfg().auto_fee_setting()) + .into(), + ); + + // Fund account with initial_balance from funding_account + bank_send( + self, + &self.funding_account, + &new_account.address(), + initial_balance.to_vec(), + ) + .map_err(|e| anyhow::anyhow!("Funding of new account failed. Error: {}", e))?; + + Ok(new_account) } fn init_accounts( &self, - _initial_balance: &[Coin], + initial_balance: &[Coin], num_accounts: usize, ) -> Result, anyhow::Error> { - self.init_accounts(num_accounts) + let mut accounts = Vec::new(); + for _ in 0..num_accounts { + accounts.push(self.init_account(initial_balance)?); + } + Ok(accounts) } fn increase_time(&self, _seconds: u64) -> Result<(), anyhow::Error> { // TODO: Figure out best way to sleep tests until `seconds` has passed. - todo!() + todo!("Increase time is unimplemented for RpcRunner") } fn query_block_time_nanos(&self) -> u64 { diff --git a/src/test_runner.rs b/src/test_runner.rs index 2f5949b..4624f02 100644 --- a/src/test_runner.rs +++ b/src/test_runner.rs @@ -27,7 +27,7 @@ pub enum OwnedTestRunner<'a> { #[cfg(feature = "osmosis-test-tube")] OsmosisTestApp(OsmosisTestApp), #[cfg(feature = "rpc-runner")] - RpcRunner(RpcRunner<'a>), + RpcRunner(RpcRunner), #[cfg(feature = "multi-test")] MultiTest(MultiTestRunner<'a>), } @@ -41,7 +41,7 @@ pub enum TestRunner<'a> { #[cfg(feature = "osmosis-test-tube")] OsmosisTestApp(&'a OsmosisTestApp), #[cfg(feature = "rpc-runner")] - RpcRunner(&'a RpcRunner<'a>), + RpcRunner(&'a RpcRunner), #[cfg(feature = "multi-test")] MultiTest(&'a MultiTestRunner<'a>), } @@ -136,14 +136,14 @@ impl<'a> From<&'a OsmosisTestApp> for TestRunner<'a> { } #[cfg(feature = "rpc-runner")] -impl<'a> From> for OwnedTestRunner<'a> { - fn from(runner: RpcRunner<'a>) -> Self { +impl<'a> From for OwnedTestRunner<'a> { + fn from(runner: RpcRunner) -> Self { Self::RpcRunner(runner) } } #[cfg(feature = "rpc-runner")] -impl<'a> From<&'a RpcRunner<'a>> for TestRunner<'a> { - fn from(runner: &'a RpcRunner<'a>) -> Self { +impl<'a> From<&'a RpcRunner> for TestRunner<'a> { + fn from(runner: &'a RpcRunner) -> Self { Self::RpcRunner(runner) } } @@ -276,7 +276,7 @@ impl<'a> CwItRunner<'a> for TestRunner<'a> { #[cfg(feature = "osmosis-test-tube")] Self::OsmosisTestApp(app) => Ok(app.init_account(initial_balance)?), #[cfg(feature = "rpc-runner")] - Self::RpcRunner(runner) => runner.init_account(0), + Self::RpcRunner(runner) => runner.init_account(initial_balance), #[cfg(feature = "multi-test")] Self::MultiTest(runner) => runner.init_account(initial_balance), } @@ -294,7 +294,7 @@ impl<'a> CwItRunner<'a> for TestRunner<'a> { Ok(app.init_accounts(initial_balance, num_accounts as u64)?) } #[cfg(feature = "rpc-runner")] - Self::RpcRunner(runner) => runner.init_accounts(num_accounts), + Self::RpcRunner(runner) => runner.init_accounts(initial_balance, num_accounts), #[cfg(feature = "multi-test")] Self::MultiTest(runner) => runner.init_accounts(initial_balance, num_accounts), } From 61caf801d2f5cb9aabd5ba39de8519dd4c5ddd7d Mon Sep 17 00:00:00 2001 From: Pacman Date: Thu, 8 Feb 2024 00:28:13 +0100 Subject: [PATCH 05/20] chore: fix clippy warnings --- Cargo.toml | 2 +- src/multi_test/modules/token_factory.rs | 2 +- src/rpc_runner/config.rs | 9 ++++----- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 5017c6a..3f3d12a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,7 +32,7 @@ incremental = false overflow-checks = true [features] -default = ["rpc-runner", "osmosis", "astroport", "chain-download", "multi-test", "astroport-multi-test", "osmosis-test-tube"] +default = [] astroport = ["cw20", "dep:astroport"] osmosis = ["proptest", "apollo-utils", "osmosis-test-tube"] rpc-runner = ["tonic", "tokio", "bip32"] diff --git a/src/multi_test/modules/token_factory.rs b/src/multi_test/modules/token_factory.rs index 62dff27..9a67f98 100644 --- a/src/multi_test/modules/token_factory.rs +++ b/src/multi_test/modules/token_factory.rs @@ -97,7 +97,7 @@ impl TokenFactory<'_> { denom: denom.clone(), }); let raw = router.query(api, storage, block, request)?; - let supply: SupplyResponse = from_json(&raw)?; + let supply: SupplyResponse = from_json(raw)?; println!("supply: {:?}", supply); println!( "supply.amount.amount.is_zero: {:?}", diff --git a/src/rpc_runner/config.rs b/src/rpc_runner/config.rs index a292b88..3a9cb56 100644 --- a/src/rpc_runner/config.rs +++ b/src/rpc_runner/config.rs @@ -34,13 +34,12 @@ impl From for test_tube::account::FeeSetting { gas_price, gas_adjustment, } => test_tube::account::FeeSetting::Auto { - gas_price: gas_price.into(), + gas_price, gas_adjustment, }, - FeeSetting::Custom { amount, gas_limit } => test_tube::account::FeeSetting::Custom { - amount: amount.into(), - gas_limit, - }, + FeeSetting::Custom { amount, gas_limit } => { + test_tube::account::FeeSetting::Custom { amount, gas_limit } + } } } } From 73810302924490250425045f6b78e658769b7300 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Thu, 8 Feb 2024 10:42:11 +0100 Subject: [PATCH 06/20] ci: Use go 1.21.6 and delete unused workflows --- .circleci/config.yml | 61 ----------------------------------- .github/workflows/Basic.yml | 7 +++- .github/workflows/Release.yml | 35 -------------------- 3 files changed, 6 insertions(+), 97 deletions(-) delete mode 100644 .circleci/config.yml delete mode 100644 .github/workflows/Release.yml diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 9b07669..0000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,61 +0,0 @@ -version: 2.1 - -executors: - builder: - docker: - - image: buildpack-deps:trusty - -jobs: - docker-image: - executor: builder - steps: - - checkout - - setup_remote_docker - docker_layer_caching: true - - run: - name: Build Docker artifact - command: docker build --pull -t "cosmwasm/cw-gitpod-base:${CIRCLE_SHA1}" . - - run: - name: Push application Docker image to docker hub - command: | - if [ "${CIRCLE_BRANCH}" = "master" ]; then - docker tag "cosmwasm/cw-gitpod-base:${CIRCLE_SHA1}" cosmwasm/cw-gitpod-base:latest - docker login --password-stdin -u "$DOCKER_USER" \<<<"$DOCKER_PASS" - docker push cosmwasm/cw-gitpod-base:latest - docker logout - fi - - docker-tagged: - executor: builder - steps: - - checkout - - setup_remote_docker - docker_layer_caching: true - - run: - name: Push application Docker image to docker hub - command: | - docker tag "cosmwasm/cw-gitpod-base:${CIRCLE_SHA1}" "cosmwasm/cw-gitpod-base:${CIRCLE_TAG}" - docker login --password-stdin -u "$DOCKER_USER" \<<<"$DOCKER_PASS" - docker push - docker logout - -workflows: - version: 2 - test-suite: - jobs: - # this is now a slow process... let's only run on master - - docker-image: - filters: - branches: - only: - - master - - docker-tagged: - filters: - tags: - only: - - /^v.*/ - branches: - ignore: - - /.*/ - requires: - - docker-image diff --git a/.github/workflows/Basic.yml b/.github/workflows/Basic.yml index be3ab34..79e9df1 100644 --- a/.github/workflows/Basic.yml +++ b/.github/workflows/Basic.yml @@ -7,11 +7,16 @@ name: Basic jobs: test: name: Test Suite - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Checkout sources uses: actions/checkout@v2 + - name: Set up Go 1.21.6 + uses: actions/setup-go@v5 + with: + go-version: "1.21.6" + - name: Install stable toolchain uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml deleted file mode 100644 index a9d5979..0000000 --- a/.github/workflows/Release.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: release wasm - -on: - release: - types: [created] - -jobs: - release: - runs-on: ubuntu-latest - steps: - - name: Checkout sources - uses: actions/checkout@v2 - - name: Install cargo-run-script - uses: actions-rs/cargo@v1 - with: - command: install - args: cargo-run-script - - name: Run cargo optimize - uses: actions-rs/cargo@v1 - with: - command: run-script - args: optimize - - name: Get release ID - id: get_release - uses: bruceadams/get-release@v1.2.3 - env: - GITHUB_TOKEN: ${{ github.token }} - - name: Upload optimized wasm - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: ./artifacts/*.wasm - tag: ${{ github.ref }} - overwrite: true - file_glob: true From 0f9c004aa38608fb138ca03813c4ce150ef5f1f9 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Thu, 8 Feb 2024 11:26:04 +0100 Subject: [PATCH 07/20] test: fix broken test-case tests --- Cargo.lock | 4 ++-- src/multi_test/modules/token_factory.rs | 26 ++++++++++++------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 79467c0..b5e97b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3351,9 +3351,9 @@ dependencies = [ [[package]] name = "test-case" -version = "3.3.1" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb2550dd13afcd286853192af8601920d959b14c401fcece38071d53bf0768a8" +checksum = "679b019fb241da62cc449b33b224d19ebe1c6767b495569765115dd7f7f9fba4" dependencies = [ "test-case-macros", ] diff --git a/src/multi_test/modules/token_factory.rs b/src/multi_test/modules/token_factory.rs index 9a67f98..0e48d19 100644 --- a/src/multi_test/modules/token_factory.rs +++ b/src/multi_test/modules/token_factory.rs @@ -297,10 +297,10 @@ mod tests { &TokenFactory::new("factory", 32, 16, 59 + 16, "10000000uosmo"); #[test_case(Addr::unchecked("sender"), "subdenom", &["10000000uosmo"]; "valid denom")] - #[test_case(Addr::unchecked("sen/der"), "subdenom", &["10000000uosmo"] => panics ; "invalid creator address")] + #[test_case(Addr::unchecked("sen/der"), "subdenom", &["10000000uosmo"] => panics "creator address cannot contains" ; "invalid creator address")] #[test_case(Addr::unchecked("asdasdasdasdasdasdasdasdasdasdasdasdasdasdasd"), "subdenom", &["10000000uosmo"] => panics ; "creator address too long")] - #[test_case(Addr::unchecked("sender"), "subdenom", &["10000000uosmo", "100factory/sender/subdenom"] => panics ; "denom exists")] - #[test_case(Addr::unchecked("sender"), "subdenom", &["100000uosmo"] => panics ; "insufficient funds for fee")] + #[test_case(Addr::unchecked("sender"), "subdenom", &["10000000uosmo", "100factory/sender/subdenom"] => panics "Subdenom already exists" ; "denom exists")] + #[test_case(Addr::unchecked("sender"), "subdenom", &["100000uosmo"] => panics "Cannot Sub" ; "insufficient funds for fee")] fn create_denom(sender: Addr, subdenom: &str, initial_coins: &[&str]) { let initial_coins = initial_coins .iter() @@ -332,7 +332,7 @@ mod tests { res.assert_event( &Event::new("create_denom") - .add_attribute("creator", "sender") + .add_attribute("creator", sender.to_string()) .add_attribute( "new_token_denom", format!( @@ -354,8 +354,8 @@ mod tests { } #[test_case(Addr::unchecked("sender"), Addr::unchecked("sender"), 1000u128 ; "valid mint")] - #[test_case(Addr::unchecked("sender"), Addr::unchecked("sender"), 0u128 => panics ; "zero amount")] - #[test_case(Addr::unchecked("sender"), Addr::unchecked("creator"), 1000u128 => panics ; "sender is not creator")] + #[test_case(Addr::unchecked("sender"), Addr::unchecked("sender"), 0u128 => panics "Invalid zero amount" ; "zero amount")] + #[test_case(Addr::unchecked("sender"), Addr::unchecked("creator"), 1000u128 => panics "Unauthorized mint. Not the creator of the denom." ; "sender is not creator")] fn mint(sender: Addr, creator: Addr, mint_amount: u128) { let mut stargate_keeper = StargateKeeper::new(); TOKEN_FACTORY.register_msgs(&mut stargate_keeper); @@ -411,9 +411,9 @@ mod tests { #[test_case(Addr::unchecked("sender"), Addr::unchecked("sender"), 1000u128, 1000u128 ; "valid burn")] #[test_case(Addr::unchecked("sender"), Addr::unchecked("sender"), 1000u128, 2000u128 ; "valid burn 2")] - #[test_case(Addr::unchecked("sender"), Addr::unchecked("creator"), 1000u128, 1000u128 => panics ; "sender is not creator")] - #[test_case(Addr::unchecked("sender"), Addr::unchecked("sender"), 0u128, 1000u128 => panics ; "zero amount")] - #[test_case(Addr::unchecked("sender"), Addr::unchecked("sender"), 2000u128, 1000u128 => panics ; "insufficient funds")] + #[test_case(Addr::unchecked("sender"), Addr::unchecked("creator"), 1000u128, 1000u128 => panics "Unauthorized burn. Not the creator of the denom." ; "sender is not creator")] + #[test_case(Addr::unchecked("sender"), Addr::unchecked("sender"), 0u128, 1000u128 => panics "Invalid zero amount" ; "zero amount")] + #[test_case(Addr::unchecked("sender"), Addr::unchecked("sender"), 2000u128, 1000u128 => panics "Cannot Sub" ; "insufficient funds")] fn burn(sender: Addr, creator: Addr, burn_amount: u128, initial_balance: u128) { let mut stargate_keeper = StargateKeeper::new(); TOKEN_FACTORY.register_msgs(&mut stargate_keeper); @@ -480,12 +480,12 @@ mod tests { #[test_case("uosmo" ; "native denom")] #[test_case("IBC/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2" ; "ibc denom")] - #[test_case("IBC/27394FB092D2ECCD56123CA622B25F41E5EB2" => panics ; "invalid ibc denom")] - #[test_case("IB/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2" => panics ; "invalid ibc denom 2")] + #[test_case("IBC/27394FB092D2ECCD56123CA622B25F41E5EB2" => panics "Invalid sdk string" ; "invalid ibc denom")] + #[test_case("IB/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2" => panics "Invalid sdk string" ; "invalid ibc denom 2")] #[test_case("factory/sender/subdenom" ; "token factory denom")] #[test_case("factory/se1298der/subde192MAnom" ; "token factory denom 2")] - #[test_case("factor/sender/subdenom" => panics ; "invalid token factory denom")] - #[test_case("factory/sender/subdenom/extra" => panics ; "invalid token factory denom 2")] + #[test_case("factor/sender/subdenom" => panics "Invalid sdk string" ; "invalid token factory denom")] + #[test_case("factory/sender/subdenom/extra" => panics "Invalid sdk string" ; "invalid token factory denom 2")] fn test_coin_from_sdk_string(denom: &str) { let sdk_string = format!("{}{}", 1000, denom); let coin = coin_from_sdk_string(&sdk_string).unwrap(); From 341195abdafbecc5775ec18f6c3146d3c85fce7d Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Thu, 8 Feb 2024 14:16:36 +0100 Subject: [PATCH 08/20] chore: bump apollo-cw-multi-test to 0.18.0 --- Cargo.lock | 43 +++++++------------------------------------ Cargo.toml | 2 +- 2 files changed, 8 insertions(+), 37 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b5e97b8..08c35f1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -73,9 +73,9 @@ dependencies = [ [[package]] name = "apollo-cw-multi-test" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b88d6037608a781a95ab1125941e2358c37272dcf0d4613de795b81b6ffbf3" +checksum = "f79f4204575175473a9b7fff8083596d09e6edb07469d2a4176846b353b2d1ef" dependencies = [ "anyhow", "cosmwasm-std", @@ -84,7 +84,7 @@ dependencies = [ "derivative", "itertools 0.10.5", "k256 0.11.6", - "osmosis-std 0.19.2", + "osmosis-std", "prost 0.9.0", "regex", "schemars", @@ -962,7 +962,7 @@ dependencies = [ "cosmwasm-std", "cw20 0.15.1", "cw20-base", - "osmosis-std 0.22.0", + "osmosis-std", "osmosis-test-tube", "paste", "proptest", @@ -2110,22 +2110,6 @@ dependencies = [ "hashbrown 0.12.3", ] -[[package]] -name = "osmosis-std" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "798fade51443a0e07eb25b59a11b320b9e8f03e6e8fbe14c520258f04742fe13" -dependencies = [ - "chrono", - "cosmwasm-std", - "osmosis-std-derive 0.16.2", - "prost 0.11.9", - "prost-types 0.11.9", - "schemars", - "serde", - "serde-cw-value", -] - [[package]] name = "osmosis-std" version = "0.22.0" @@ -2134,7 +2118,7 @@ checksum = "8641c376f01f5af329dc2a34e4f5527eaeb0bde18cda8d86fed958d04c86159c" dependencies = [ "chrono", "cosmwasm-std", - "osmosis-std-derive 0.20.1", + "osmosis-std-derive", "prost 0.12.3", "prost-types 0.12.3", "schemars", @@ -2142,19 +2126,6 @@ dependencies = [ "serde-cw-value", ] -[[package]] -name = "osmosis-std-derive" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f47f0b2f22adb341bb59e5a3a1b464dde033181954bd055b9ae86d6511ba465b" -dependencies = [ - "itertools 0.10.5", - "proc-macro2", - "prost-types 0.11.9", - "quote", - "syn 1.0.109", -] - [[package]] name = "osmosis-std-derive" version = "0.20.1" @@ -2178,7 +2149,7 @@ dependencies = [ "bindgen", "cosmrs", "cosmwasm-std", - "osmosis-std 0.22.0", + "osmosis-std", "prost 0.12.3", "serde", "serde_json", @@ -3391,7 +3362,7 @@ dependencies = [ "base64 0.21.7", "cosmrs", "cosmwasm-std", - "osmosis-std 0.22.0", + "osmosis-std", "prost 0.12.3", "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index 3f3d12a..c292a8b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -117,7 +117,7 @@ testcontainers = { version = "0.14.0", features = [ ], optional = true } # Cw-multi-test deps -apollo-cw-multi-test = { version = "0.17.0", features = ["stargate"], optional = true } +apollo-cw-multi-test = { version = "0.18.0", features = ["stargate"], optional = true } paste = { version = "1.0.12", optional = true } # RPC Runner and chain-download deps From e7bfb0cb2b2a0a116dd4648d3699965f1abb185a Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Thu, 8 Feb 2024 14:37:10 +0100 Subject: [PATCH 09/20] ci: add makefile and update workflows --- .github/workflows/Basic.yml | 61 ----- .github/workflows/cc.yml | 19 ++ .github/workflows/check.yml | 24 ++ .github/workflows/coverage.yml | 33 +++ .github/workflows/licenses.yml | 34 +++ .github/workflows/lint-format.yml | 34 +++ .github/workflows/test.yml | 32 +++ Cargo.lock | 359 +----------------------------- Cargo.toml | 12 +- Makefile.toml | 183 +++++++++++++++ coverage_grcov.Makefile.toml | 53 +++++ deny.toml | 50 +++++ scripts/todo-lint.sh | 35 +++ 13 files changed, 502 insertions(+), 427 deletions(-) delete mode 100644 .github/workflows/Basic.yml create mode 100644 .github/workflows/cc.yml create mode 100644 .github/workflows/check.yml create mode 100644 .github/workflows/coverage.yml create mode 100644 .github/workflows/licenses.yml create mode 100644 .github/workflows/lint-format.yml create mode 100644 .github/workflows/test.yml create mode 100644 Makefile.toml create mode 100644 coverage_grcov.Makefile.toml create mode 100644 deny.toml create mode 100755 scripts/todo-lint.sh diff --git a/.github/workflows/Basic.yml b/.github/workflows/Basic.yml deleted file mode 100644 index 79e9df1..0000000 --- a/.github/workflows/Basic.yml +++ /dev/null @@ -1,61 +0,0 @@ -# Based on https://github.com/actions-rs/example/blob/master/.github/workflows/quickstart.yml - -on: [push, pull_request] - -name: Basic - -jobs: - test: - name: Test Suite - runs-on: ubuntu-22.04 - steps: - - name: Checkout sources - uses: actions/checkout@v2 - - - name: Set up Go 1.21.6 - uses: actions/setup-go@v5 - with: - go-version: "1.21.6" - - - name: Install stable toolchain - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: 1.75.0 - target: wasm32-unknown-unknown - override: true - - - name: Run tests - uses: actions-rs/cargo@v1 - with: - command: test - args: --locked --all-features - env: - RUST_BACKTRACE: 1 - - lints: - name: Lints - runs-on: ubuntu-latest - steps: - - name: Checkout sources - uses: actions/checkout@v2 - - - name: Install nightly toolchain - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: nightly - override: true - components: rustfmt, clippy - - - name: Run cargo fmt - uses: actions-rs/cargo@v1 - with: - command: fmt - args: --all -- --check - - - name: Run cargo clippy - uses: actions-rs/cargo@v1 - with: - command: clippy - args: --all-features -- -D warnings diff --git a/.github/workflows/cc.yml b/.github/workflows/cc.yml new file mode 100644 index 0000000..e9e3aee --- /dev/null +++ b/.github/workflows/cc.yml @@ -0,0 +1,19 @@ + +name: Conventional commit check +on: + pull_request: + workflow_dispatch: + +# This workflow denies a push on a pull request if all pushed commits are not following +# the conventional commits standard. + +jobs: + conv-commit: + name: Enforce conventional commit messages + runs-on: ubuntu-latest + steps: + - name: Checkout pull request + uses: actions/checkout@v3 + + - name: Check all commit messages for adherence + uses: bilalshaikh42/action-conventional-commits@v2.0.1 diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml new file mode 100644 index 0000000..0f34ef9 --- /dev/null +++ b/.github/workflows/check.yml @@ -0,0 +1,24 @@ +name: Check for errors +on: + pull_request: + workflow_dispatch: + +env: + RUSTFLAGS: -D warnings + +jobs: + cargo-check: + name: Cargo check + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Install cargo make + uses: davidB/rust-cargo-make@v1 + + - name: Install stable Rust + run: cargo make install-stable + + - name: Check + run: cargo make check diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 0000000..5465d0b --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,33 @@ +name: Coverage + +on: + push: + branches: + - master + pull_request: + +env: + RUST_BACKTRACE: 1 + CARGO_TERM_COLOR: always + +jobs: + coverage: + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Install cargo make + uses: davidB/rust-cargo-make@v1 + + - name: Install stable Rust + run: cargo make install-stable + + - name: Run test coverage + run: cargo make coverage-lcov + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v3 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: target/coverage/lcov.info diff --git a/.github/workflows/licenses.yml b/.github/workflows/licenses.yml new file mode 100644 index 0000000..6f598bd --- /dev/null +++ b/.github/workflows/licenses.yml @@ -0,0 +1,34 @@ +name: Check licenses and sources +on: + pull_request: + workflow_dispatch: + +env: + RUSTFLAGS: -D warnings + +jobs: + cargo-deny: + runs-on: ubuntu-latest + strategy: + matrix: + checks: + - advisories + - bans licenses sources + + # Prevent sudden announcement of a new advisory from failing ci: + continue-on-error: ${{ matrix.checks == 'advisories' }} + + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Install cargo make + uses: davidB/rust-cargo-make@v1 + + - name: Install stable toolchain + run: cargo make install-stable + + - name: run cargo deny + uses: EmbarkStudios/cargo-deny-action@v1 + with: + command: check ${{ matrix.checks }} diff --git a/.github/workflows/lint-format.yml b/.github/workflows/lint-format.yml new file mode 100644 index 0000000..db5e2d6 --- /dev/null +++ b/.github/workflows/lint-format.yml @@ -0,0 +1,34 @@ +name: Linting and formatting +on: + pull_request: + workflow_dispatch: + +env: + RUSTFLAGS: -D warnings + +jobs: + lint-and-format: + name: Lint and check formatting + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Install cargo make + uses: davidB/rust-cargo-make@v1 + + - name: Install nightly toolchain + run: cargo make install-nightly + + - name: Run cargo clippy + run: cargo make clippy-check + + - name: Run cargo fmt + run: cargo make format-check + + - name: Run cargo machete + run: cargo make machete-check + + # TODO: Enable when project more mature + # - name: Lint todo comments + # run: cargo make todo-check diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..3bad716 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,32 @@ +name: Test Suite +on: + pull_request: + workflow_dispatch: + +env: + RUSTFLAGS: -D warnings + +jobs: + test: + name: Test Suite + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Install cargo make + uses: davidB/rust-cargo-make@v1 + + - name: Install stable toolchain + run: cargo make install-stable + + - name: Run unit tests + run: cargo make unit-test + env: + RUST_BACKTRACE: 1 + + # No integration tests yet + # - name: Run integration tests + # run: cargo make integration-test + # env: + # RUST_BACKTRACE: 1 diff --git a/Cargo.lock b/Cargo.lock index 08c35f1..d11777f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -37,21 +37,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - [[package]] name = "anyhow" version = "1.0.79" @@ -404,28 +389,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "async-stream" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - [[package]] name = "async-trait" version = "0.1.77" @@ -586,47 +549,6 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab9008b6bb9fc80b5277f2fe481c09e828743d9151203e804583eb4c9e15b31d" -[[package]] -name = "bollard" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92fed694fd5a7468c971538351c61b9c115f1ae6ed411cd2800f0f299403a4b" -dependencies = [ - "base64 0.13.1", - "bollard-stubs", - "bytes", - "chrono", - "dirs-next", - "futures-core", - "futures-util", - "hex", - "http", - "hyper", - "hyperlocal", - "log", - "pin-project", - "serde", - "serde_derive", - "serde_json", - "serde_urlencoded", - "thiserror", - "tokio", - "tokio-util 0.6.10", - "url", - "winapi", -] - -[[package]] -name = "bollard-stubs" -version = "1.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2f2e73fffe9455141e170fb9c1feb0ac521ec7e7dcd47a7cab72a658490fb8" -dependencies = [ - "chrono", - "serde", - "serde_with", -] - [[package]] name = "bs58" version = "0.5.0" @@ -687,13 +609,7 @@ version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb" dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", "num-traits", - "serde", - "wasm-bindgen", - "windows-targets 0.52.0", ] [[package]] @@ -969,14 +885,11 @@ dependencies = [ "prost 0.12.3", "regex", "serde", - "serde_json", "strum", "test-case", "test-tube", - "testcontainers", "thiserror", "tokio", - "tonic", ] [[package]] @@ -1147,41 +1060,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "darling" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 1.0.109", -] - -[[package]] -name = "darling_macro" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" -dependencies = [ - "darling_core", - "quote", - "syn 1.0.109", -] - [[package]] name = "der" version = "0.6.1" @@ -1243,27 +1121,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - [[package]] name = "dlv-list" version = "0.3.0" @@ -1491,7 +1348,6 @@ checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", - "futures-executor", "futures-io", "futures-sink", "futures-task", @@ -1514,34 +1370,12 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - [[package]] name = "futures-io" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - [[package]] name = "futures-sink" version = "0.3.30" @@ -1560,16 +1394,11 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ - "futures-channel", "futures-core", - "futures-io", - "futures-macro", "futures-sink", "futures-task", - "memchr", "pin-project-lite", "pin-utils", - "slab", ] [[package]] @@ -1645,7 +1474,7 @@ dependencies = [ "indexmap", "slab", "tokio", - "tokio-util 0.7.10", + "tokio-util", "tracing", ] @@ -1772,48 +1601,6 @@ dependencies = [ "tokio-rustls", ] -[[package]] -name = "hyperlocal" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fafdf7b2b2de7c9784f76e02c0935e65a8117ec3b768644379983ab333ac98c" -dependencies = [ - "futures-util", - "hex", - "hyper", - "pin-project", - "tokio", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.59" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[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.5.0" @@ -1959,17 +1746,6 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" -[[package]] -name = "libredox" -version = "0.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" -dependencies = [ - "bitflags 2.4.2", - "libc", - "redox_syscall", -] - [[package]] name = "linked-hash-map" version = "0.5.6" @@ -2531,17 +2307,6 @@ dependencies = [ "bitflags 1.3.2", ] -[[package]] -name = "redox_users" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" -dependencies = [ - "getrandom", - "libredox", - "thiserror", -] - [[package]] name = "regex" version = "1.10.3" @@ -2970,28 +2735,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_with" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" -dependencies = [ - "serde", - "serde_with_macros", -] - -[[package]] -name = "serde_with_macros" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "sha2" version = "0.9.9" @@ -3114,12 +2857,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "strum" version = "0.24.1" @@ -3369,26 +3106,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "testcontainers" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e2b1567ca8a2b819ea7b28c92be35d9f76fb9edb214321dcc86eb96023d1f87" -dependencies = [ - "async-trait", - "bollard", - "bollard-stubs", - "futures", - "hex", - "hmac", - "log", - "rand", - "serde", - "serde_json", - "sha2 0.10.8", - "tokio", -] - [[package]] name = "thiserror" version = "1.0.56" @@ -3492,31 +3209,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-stream" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.6.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "log", - "pin-project-lite", - "tokio", -] - [[package]] name = "tokio-util" version = "0.7.10" @@ -3540,34 +3232,6 @@ dependencies = [ "serde", ] -[[package]] -name = "tonic" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f219fad3b929bef19b1f86fbc0358d35daed8f2cac972037ac0dc10bbb8d5fb" -dependencies = [ - "async-stream", - "base64 0.13.1", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "percent-encoding", - "pin-project", - "tokio-stream", - "tokio-util 0.7.10", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - [[package]] name = "tower-service" version = "0.3.2" @@ -3581,21 +3245,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ "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.48", -] - [[package]] name = "tracing-core" version = "0.1.32" @@ -3844,15 +3496,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.0", -] - [[package]] name = "windows-sys" version = "0.48.0" diff --git a/Cargo.toml b/Cargo.toml index c292a8b..a533a8b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ overflow-checks = true default = [] astroport = ["cw20", "dep:astroport"] osmosis = ["proptest", "apollo-utils", "osmosis-test-tube"] -rpc-runner = ["tonic", "tokio", "bip32"] +rpc-runner = ["bip32"] chain-download = ["tokio"] multi-test = ["apollo-cw-multi-test", "paste", "regex"] astroport-multi-test = [ @@ -68,6 +68,9 @@ optimize = """docker run --rm -v "$(pwd)":/code \ all-features = true rustdoc-args = ["--cfg", "docsrs"] +[package.metadata.cargo-machete] +ignored = ["astroport-token", "astroport-native-coin-registry", "astroport-factory", "astroport-generator", "astroport-maker", "astroport-pair-stable", "astroport-pair", "astroport-router", "astroport-staking", "astroport-vesting", "astroport-whitelist"] + [dependencies] bip32 = { version = "0.5", features = ["bip39"], optional = true } cosmwasm-std = { version = "1.2.1", features = ["stargate"] } @@ -80,7 +83,6 @@ prost = { version = "0.12", default-features = false, features = [ ] } config = { version = "0.13.2", features = ["yaml"] } anyhow = "1.0.66" -serde_json = "1.0.89" strum = { version = "0.24.1", features = ["derive"] } osmosis-std = "0.22.0" test-tube = { version = "0.5.0", features = ["module-wrappers"] } @@ -110,12 +112,6 @@ proptest = { version = "1.0.0", optional = true } apollo-utils = { version = "0.1.1", optional = true } regex = { version = "1.7.3", optional = true } -# RPC Runner deps -tonic = { version = "0.8.2", default-features = false, optional = true } -testcontainers = { version = "0.14.0", features = [ - "experimental", -], optional = true } - # Cw-multi-test deps apollo-cw-multi-test = { version = "0.18.0", features = ["stargate"], optional = true } paste = { version = "1.0.12", optional = true } diff --git a/Makefile.toml b/Makefile.toml new file mode 100644 index 0000000..ded0cf5 --- /dev/null +++ b/Makefile.toml @@ -0,0 +1,183 @@ +extend = [{ path = "coverage_grcov.Makefile.toml" }] + +[config] +default_to_workspace = false +skip_core_tasks = true + +[env] +# If you bump this version, verify RUST_VERSION correctness +RUST_OPTIMIZER_VERSION = "0.15.0" +# Use rust version from rust-optimizer Dockerfile (see https://github.com/CosmWasm/rust-optimizer/blob/main/Dockerfile#L1) +# to be sure that we compile / test against the same version +RUST_VERSION = "1.75.0" +NIGHTLY_VERSION = "nightly-2023-08-29" + +[tasks.install-stable] +script = ''' +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain ${RUST_VERSION} +rustup target add wasm32-unknown-unknown --toolchain ${RUST_VERSION} +rustup component add rustfmt --toolchain ${RUST_VERSION} +rustup component add clippy --toolchain ${RUST_VERSION} +rustup component add llvm-tools-preview --toolchain ${RUST_VERSION} +''' + +[tasks.install-nightly] +script = ''' +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain ${NIGHTLY_VERSION} +rustup target add wasm32-unknown-unknown --toolchain ${NIGHTLY_VERSION} +rustup component add rustfmt --toolchain ${NIGHTLY_VERSION} +rustup component add clippy --toolchain ${NIGHTLY_VERSION} +''' + +[tasks.rust-optimizer] +cwd = "${CARGO_MAKE_WORKSPACE_WORKING_DIRECTORY}" +script = """ +if [[ $(arch) == "arm64" ]]; then + image="cosmwasm/workspace-optimizer-arm64:${RUST_OPTIMIZER_VERSION}" +else + image="cosmwasm/workspace-optimizer:${RUST_OPTIMIZER_VERSION}" +fi +docker run --rm -v "$(pwd)":/code \ + --mount type=volume,source="$(basename "$(pwd)")_cache",target=/code/target \ + --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ + ${image} +""" + +[tasks.format] +toolchain = "${NIGHTLY_VERSION}" +install_crate = { crate_name = "rustfmt-nightly", rustup_component_name = "rustfmt-preview", binary = "rustfmt", test_arg = "--help" } +command = "cargo" +args = ["fmt", "--all", "--", "--emit=files","--verbose"] +[tasks.format-check] +toolchain = "${NIGHTLY_VERSION}" +install_crate = { crate_name = "rustfmt-nightly", rustup_component_name = "rustfmt-preview", binary = "rustfmt", test_arg = "--help" } +command = "cargo" +args = ["fmt", "--all", "--","--verbose", "--check"] + +[tasks.deny] +command = "cargo" +args = ["deny", "check"] + +[tasks.check] +toolchain = "${RUST_VERSION}" +command = "cargo" +args = ["check"] + +[tasks.clippy-check] +toolchain = "${NIGHTLY_VERSION}" +command = "cargo" +args = ["clippy","--all-features","--","-D","warnings"] +[tasks.clippy-fix] +toolchain = "${NIGHTLY_VERSION}" +command = "cargo" +args = ["clippy","--all-features", "--fix","--allow-staged", "--allow-dirty", "--","-D","warnings"] + +[tasks.todo-check] +script = { file = "${CARGO_MAKE_WORKSPACE_WORKING_DIRECTORY}/scripts/todo-lint.sh", absolute_path = true } + +# This task requires the `cargo-tarpaulin` package: https://crates.io/crates/cargo-tarpaulin +[tasks.cov] +toolchain = "${RUST_VERSION}" +command = "cargo" +args = [ + "tarpaulin", + "--ignore-tests", + "-o", + "Lcov", + "--output-dir", + "target/tarpaulin", +] + +[tasks.docs] +toolchain = "${RUST_VERSION}" +command = "cargo" +args = [ + "doc", + "--target-dir", + "docs", + "--color", + "never", + "--no-deps", + "--workspace", + "--exclude", + "'cosmwasm*'", + "--exclude", + "'cw*'", + "--release", +] + +# This task requires the `cargo-machete` package: https://crates.io/crates/cargo-machete +[tasks.machete-check] +toolchain = "${NIGHTLY_VERSION}" +command = "cargo" +args = ["machete"] +[tasks.machete-fix] +command = "cargo" +args = ["machete", "--fix"] + + +# Unoptimized Wasm build of contract for testing +# Commented out because no test contracts for this repo. +# [tasks.wasm] +# toolchain = "${RUST_VERSION}" +# command = "cargo" +# args = [ +# "build", +# "-p", +# "test-contract", +# "--target", +# "wasm32-unknown-unknown", +# "--lib", +# "--release", +# ] + +# Run all tests +[tasks.test] +toolchain = "${RUST_VERSION}" +command = "cargo" +args = ["test", "--locked"] + +# Run unit tests +[tasks.unit-test] +toolchain = "${RUST_VERSION}" +command = "cargo" +args = [ + "test", + "--all-features", + "--lib" +] + +# Run integration tests +# No integration tests right now, just unit tests +# [tasks.integration-test] +# env = { TEST_RUNNER = "osmosis-test-app" } +# cwd = "${CARGO_MAKE_WORKSPACE_WORKING_DIRECTORY}" +# dependencies = ["wasm"] +# toolchain = "${RUST_VERSION}" +# command = "cargo" +# args = [ +# "test", +# "--all-features", +# "--test", +# "*", +# ] + +# Create HTML coverage report +[tasks.coverage-html] +alias = "coverage-grcov-html" + +# Create LCOV coverage report +[tasks.coverage-lcov] +alias = "coverage-grcov-lcov" + +# Run automatically on "cargo make". This is the default task. +[tasks.default] +alias = "custom-default" + +# Custom tasks to run on "cargo make" +[tasks.custom-default] +dependencies = ["format", "clippy-fix", "deny", "machete-fix", "unit-test"] + +# Docs and Test coverage are not run by default. Can run all with "cargo make all". +[tasks.all] +dependencies = ["custom-default", "coverage-html"] diff --git a/coverage_grcov.Makefile.toml b/coverage_grcov.Makefile.toml new file mode 100644 index 0000000..c1f87ac --- /dev/null +++ b/coverage_grcov.Makefile.toml @@ -0,0 +1,53 @@ +# https://crates.io/crates/grcov + +[env] +COVERAGE_TARGET_DIRECTORY = "${CARGO_MAKE_WORKSPACE_WORKING_DIRECTORY}/target/coverage" +COVERAGE_BINARIES = "${COVERAGE_TARGET_DIRECTORY}/debug/deps" +COVERAGE_PROF_OUTPUT = "${COVERAGE_TARGET_DIRECTORY}/profraw" + +[tasks.coverage-grcov-prepare-outdir] +private = true +script=''' +#!/usr/bin/env bash +set -eux + +rm -rf ${COVERAGE_PROF_OUTPUT} +mkdir -p ${COVERAGE_PROF_OUTPUT} +''' + +[tasks.coverage-grcov-run-test] +condition = { rust_version = { min = "1.60.0" } } +private = true +run_task = "test" + +[tasks.coverage-grcov-run-test.env] +CARGO_BUILD_TARGET_DIR = "${COVERAGE_TARGET_DIRECTORY}" +RUSTFLAGS = "-Cinstrument-coverage" +LLVM_PROFILE_FILE = "${COVERAGE_PROF_OUTPUT}/coverage-%p-%m.profraw" + +[tasks.install-grcov] +condition = { env_not_set = ["SKIP_INSTALL_GRCOV"] } +private = true +command = "cargo" +args = ["install", "grcov", "--locked"] + +[tasks.coverage-grcov] +condition = { rust_version = { min = "1.60.0" } } +private = true +script = ''' +#!/usr/bin/env bash +set -eux + +grcov ${COVERAGE_PROF_OUTPUT} \ + -b ${COVERAGE_BINARIES} -s ${CARGO_MAKE_WORKSPACE_WORKING_DIRECTORY} \ + -t ${GRCOV_OUTPUT_TYPE} --llvm --branch --ignore-not-existing --ignore "/*" --ignore "*/tests/*" --ignore "*/testing/*" --ignore "target/*" -o ${GRCOV_OUTPUT_PATH} +''' +dependencies = ["install-grcov", "coverage-grcov-prepare-outdir", "coverage-grcov-run-test"] + +[tasks.coverage-grcov-html] +env = { GRCOV_OUTPUT_TYPE = "html", GRCOV_OUTPUT_PATH = "${COVERAGE_TARGET_DIRECTORY}/html", TEST_RUNNER = "multi-test" } +run_task = "coverage-grcov" + +[tasks.coverage-grcov-lcov] +env = { GRCOV_OUTPUT_TYPE = "lcov", GRCOV_OUTPUT_PATH = "${COVERAGE_TARGET_DIRECTORY}/lcov.info", TEST_RUNNER = "multi-test" } +run_task = "coverage-grcov" diff --git a/deny.toml b/deny.toml new file mode 100644 index 0000000..6467b65 --- /dev/null +++ b/deny.toml @@ -0,0 +1,50 @@ +# cargo-deny is really only ever intended to run on the "normal" tier-1 targets +targets = [ + { triple = "x86_64-unknown-linux-gnu" }, + { triple = "x86_64-unknown-linux-musl" }, +] + +# Ignore dev dependencies +exclude-dev = true + +[advisories] +vulnerability = "deny" +unmaintained = "deny" +notice = "deny" +unsound = "deny" +ignore = [] + +[bans] +multiple-versions = "allow" +deny = [] +skip = [] + +[sources] +unknown-registry = "deny" +unknown-git = "deny" +allow-git = [] +[sources.allow-org] +github = [] + +[licenses] +unlicensed = "deny" +copyleft = "deny" +# We want really high confidence when inferring licenses from text +confidence-threshold = 0.93 +allow = ["Apache-2.0", "MIT", "BSD-3-Clause", "MPL-2.0", "ISC"] +exceptions = [ + { allow = ["Unicode-DFS-2016"], name = "unicode-ident" }, + { allow = ["OpenSSL"], name = "ring" } +] + +[[licenses.clarify]] +name = "ring" +# SPDX considers OpenSSL to encompass both the OpenSSL and SSLeay licenses +# https://spdx.org/licenses/OpenSSL.html +# ISC - Both BoringSSL and ring use this for their new files +# MIT - "Files in third_party/ have their own licenses, as described therein. The MIT +# license, for third_party/fiat, which, unlike other third_party directories, is +# compiled into non-test libraries, is included below." +# OpenSSL - Obviously +expression = "ISC AND MIT AND OpenSSL" +license-files = [{ path = "LICENSE", hash = 0xbd0eed23 }] diff --git a/scripts/todo-lint.sh b/scripts/todo-lint.sh new file mode 100755 index 0000000..1a2bb0e --- /dev/null +++ b/scripts/todo-lint.sh @@ -0,0 +1,35 @@ +#!/bin/sh + +# Escape codes +RESET="\x1b[0m" +RED="\x1b[31;49m" +GREEN="\x1b[32;49m" +BD="\x1b[39;49;1m" +IT="\x1b[39;49;3m" +UL="\x1b[39;49;4m" + +# if path is supplied as argument +if [[ ! -z $1 && -d $1 ]]; then + GREP_DIR=$1 + echo "${BD}Searching in '$RESET$UL$GREP_DIR$RESET$BD'...$RESET" +else + GREP_DIR="." + echo "${BD}No path supplied. Defaulting to current working directory...$RESET" +fi + +# Regex +LINT="todo[^!]" +FORMAT="s/\.\/([a-zA-Z0-9_/.-]+):([0-9]+):(.+)/$UL\1$RESET ${BD}@ line \2:$RESET\n\t$IT$RED\3$RESET/" + +N=$(grep -riIo --include=*.{rs,ts,js} -E $LINT $GREP_DIR | wc -l | xargs) + + +if [ $N -gt 0 ]; then + echo "${BD}Found $UL$RED$N$RESET$BD occurrences matching pattern '$RESET$IT$LINT$RESET$BD':$RESET" + echo "------------------------------------------------" + grep -rniI --include=*.{rs,ts,js} -E $LINT $GREP_DIR | sed -E "$FORMAT" + exit 1 +fi + +echo "${GREEN}No occurrences of pattern '$IT$LINT$RESET$GREEN' found!$RESET" +exit 0 From 4e91a31faa93b7f7af06a91754a52dae8386ee36 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Thu, 8 Feb 2024 15:53:49 +0100 Subject: [PATCH 10/20] ci: Use go v1.21 for test-tube to work --- .github/workflows/check.yml | 5 +++++ .github/workflows/coverage.yml | 5 +++++ .github/workflows/lint-format.yml | 5 +++++ .github/workflows/test.yml | 5 +++++ Makefile.toml | 2 +- coverage_grcov.Makefile.toml | 2 +- 6 files changed, 22 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 0f34ef9..d37800c 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -14,6 +14,11 @@ jobs: - name: Checkout sources uses: actions/checkout@v3 + - name: Set up Go 1.21.6 + uses: actions/setup-go@v5 + with: + go-version: "1.21.6" + - name: Install cargo make uses: davidB/rust-cargo-make@v1 diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 5465d0b..8a97e17 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -17,6 +17,11 @@ jobs: - name: Checkout sources uses: actions/checkout@v3 + - name: Set up Go 1.21.6 + uses: actions/setup-go@v5 + with: + go-version: "1.21.6" + - name: Install cargo make uses: davidB/rust-cargo-make@v1 diff --git a/.github/workflows/lint-format.yml b/.github/workflows/lint-format.yml index db5e2d6..a44c9a6 100644 --- a/.github/workflows/lint-format.yml +++ b/.github/workflows/lint-format.yml @@ -14,6 +14,11 @@ jobs: - name: Checkout sources uses: actions/checkout@v3 + - name: Set up Go 1.21.6 + uses: actions/setup-go@v5 + with: + go-version: "1.21.6" + - name: Install cargo make uses: davidB/rust-cargo-make@v1 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3bad716..0b5f499 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,6 +14,11 @@ jobs: - name: Checkout sources uses: actions/checkout@v3 + - name: Set up Go 1.21.6 + uses: actions/setup-go@v5 + with: + go-version: "1.21.6" + - name: Install cargo make uses: davidB/rust-cargo-make@v1 diff --git a/Makefile.toml b/Makefile.toml index ded0cf5..42462ca 100644 --- a/Makefile.toml +++ b/Makefile.toml @@ -61,7 +61,7 @@ args = ["deny", "check"] [tasks.check] toolchain = "${RUST_VERSION}" command = "cargo" -args = ["check"] +args = ["check", "--all-features"] [tasks.clippy-check] toolchain = "${NIGHTLY_VERSION}" diff --git a/coverage_grcov.Makefile.toml b/coverage_grcov.Makefile.toml index c1f87ac..76634c9 100644 --- a/coverage_grcov.Makefile.toml +++ b/coverage_grcov.Makefile.toml @@ -22,7 +22,7 @@ run_task = "test" [tasks.coverage-grcov-run-test.env] CARGO_BUILD_TARGET_DIR = "${COVERAGE_TARGET_DIRECTORY}" -RUSTFLAGS = "-Cinstrument-coverage" +RUSTFLAGS = "-Cinstrument-coverage --all-features" LLVM_PROFILE_FILE = "${COVERAGE_PROF_OUTPUT}/coverage-%p-%m.profraw" [tasks.install-grcov] From ca90edfb5839b6a465b01e80991a39ec8ad4cad4 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Thu, 8 Feb 2024 16:04:45 +0100 Subject: [PATCH 11/20] ci: fix coverage job --- Makefile.toml | 2 +- coverage_grcov.Makefile.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.toml b/Makefile.toml index 42462ca..edb9782 100644 --- a/Makefile.toml +++ b/Makefile.toml @@ -135,7 +135,7 @@ args = ["machete", "--fix"] [tasks.test] toolchain = "${RUST_VERSION}" command = "cargo" -args = ["test", "--locked"] +args = ["test", "--locked", "--all-features"] # Run unit tests [tasks.unit-test] diff --git a/coverage_grcov.Makefile.toml b/coverage_grcov.Makefile.toml index 76634c9..c1f87ac 100644 --- a/coverage_grcov.Makefile.toml +++ b/coverage_grcov.Makefile.toml @@ -22,7 +22,7 @@ run_task = "test" [tasks.coverage-grcov-run-test.env] CARGO_BUILD_TARGET_DIR = "${COVERAGE_TARGET_DIRECTORY}" -RUSTFLAGS = "-Cinstrument-coverage --all-features" +RUSTFLAGS = "-Cinstrument-coverage" LLVM_PROFILE_FILE = "${COVERAGE_PROF_OUTPUT}/coverage-%p-%m.profraw" [tasks.install-grcov] From d73cedffc22c573e75a23192cf426754bae9f6fb Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Thu, 8 Feb 2024 19:02:49 +0100 Subject: [PATCH 12/20] feat: Add astroport incentives contract --- Cargo.lock | 120 ++++++++++++-------- Cargo.toml | 32 +++--- artifacts/c73a2db/astroport_incentives.wasm | Bin 0 -> 515599 bytes src/astroport/mod.rs | 1 + src/astroport/utils.rs | 43 ++++++- 5 files changed, 131 insertions(+), 65 deletions(-) create mode 100644 artifacts/c73a2db/astroport_incentives.wasm diff --git a/Cargo.lock b/Cargo.lock index d11777f..7a359e5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -103,9 +103,9 @@ dependencies = [ [[package]] name = "astroport" -version = "2.9.0" +version = "2.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b863a982595743e181f89540d7aaeda35c60b6b5cac9c36c9be30cf11a5ece" +checksum = "3b991ce88f077c1d12f850c1f8fba3671bd72784f43f1638731d6d28f9b79839" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -118,13 +118,14 @@ dependencies = [ [[package]] name = "astroport" -version = "3.6.1" +version = "3.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "195a7441515817c0d114ec3bebe9faa21393781f796c179c38c75e3cfb9fb4ec" +checksum = "c001a7f97db88ffe6fc6cca97bbdbfe926e55599184921ff7e72cd47559440de" dependencies = [ "astroport-circular-buffer", "cosmwasm-schema", "cosmwasm-std", + "cw-asset", "cw-storage-plus 0.15.1", "cw-utils 1.0.3", "cw20 0.15.1", @@ -151,7 +152,7 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ecf768e2d3153bebfbe0c502ffa4199a52598e9b6e89fca54339615b2de77eb" dependencies = [ - "astroport 2.9.0", + "astroport 2.9.3", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 0.15.1", @@ -167,7 +168,7 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6144780ac014665b07616de0cfb35ca6a9411ed821e20c21e02f4f428c8ed51f" dependencies = [ - "astroport 2.9.0", + "astroport 2.9.3", "astroport-governance", "cosmwasm-schema", "cosmwasm-std", @@ -185,23 +186,40 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72806ace350e81c4e1cab7e275ef91f05bad830275d697d67ad1bd4acc6f016d" dependencies = [ - "astroport 2.9.0", + "astroport 2.9.3", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 0.15.1", "cw20 0.15.1", ] +[[package]] +name = "astroport-incentives" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba05c27479d2885ba313086aa0b7d09284f1393f1ebb6d385f96d93b3c6fb72a" +dependencies = [ + "astroport 3.11.1", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.15.1", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "itertools 0.11.0", + "thiserror", +] + [[package]] name = "astroport-liquidity-manager" -version = "1.0.3" +version = "1.0.3-astroport-v2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5673fe63b0284e30d1b456dea067cfaa82d2be6eafe5468cc0442917d49a04" +checksum = "ae4bf7689e7c37cfecc200aab3401c1ff6a507cccc9fb1baadfa71a73addaa2f" dependencies = [ - "astroport 3.6.1", + "astroport 2.9.3", "astroport-factory", "astroport-pair", - "astroport-pair-stable 3.3.0", + "astroport-pair-stable", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 1.2.0", @@ -217,7 +235,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92403e5d00e3c77d13d9616661ea9d9308d493fff6bec5e6e5e7bd7b7e0ff6af" dependencies = [ "astro-satellite-package", - "astroport 2.9.0", + "astroport 2.9.3", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 0.15.1", @@ -232,7 +250,7 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "648ed6827a8f11012c0377fb60329204e8511fe46c86db3220113e70bdc57826" dependencies = [ - "astroport 2.9.0", + "astroport 2.9.3", "cosmwasm-schema", "cosmwasm-std", "cosmwasm-storage", @@ -243,15 +261,14 @@ dependencies = [ [[package]] name = "astroport-pair" -version = "1.5.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd96bc64722440636ed6267a6945ccce076231a08467d6d46a4af4c4ff062c69" +checksum = "e760b91eaf269bb2843b75b34eb73d474374bd2ebefbbe3cdb0a58d69959573b" dependencies = [ - "astroport 3.6.1", + "astroport 2.9.3", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 0.15.1", - "cw-utils 1.0.3", "cw2 0.15.1", "cw20 0.15.1", "integer-sqrt", @@ -261,11 +278,11 @@ dependencies = [ [[package]] name = "astroport-pair-concentrated" -version = "1.2.13" +version = "1.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7a25c6ccbeccd25d36706621db915b67ca5d919e192fb06d7dd35cf69152d84" +checksum = "04a90ce51403c81af3acf8e7028bb0eb095fce802365453b7e4a13bc0eb0d6d7" dependencies = [ - "astroport 2.9.0", + "astroport 2.9.3", "astroport-factory", "cosmwasm-schema", "cosmwasm-std", @@ -279,29 +296,11 @@ dependencies = [ [[package]] name = "astroport-pair-stable" -version = "2.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a62a313abf4502928cf4cb2eee5205d4ea620079807118f593e1bb4b6c820a" -dependencies = [ - "astroport 2.9.0", - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus 0.15.1", - "cw-utils 1.0.3", - "cw2 0.15.1", - "cw20 0.15.1", - "itertools 0.10.5", - "thiserror", -] - -[[package]] -name = "astroport-pair-stable" -version = "3.3.0" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07ac52657fa25194936d5218a258c2c041df00f0647e954a23f35e99b730f92b" +checksum = "d052966163fc2dd3eb46ae3c948ee7032a28726e046bc44431f9b488cb1dba90" dependencies = [ - "astroport 3.6.1", - "astroport-circular-buffer", + "astroport 2.9.3", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 0.15.1", @@ -318,7 +317,7 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e3bbb33c00370bd194cf3a166f1e3f4029a2add2bea01a5eb61e886aefbc85b" dependencies = [ - "astroport 2.9.0", + "astroport 2.9.3", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 0.15.1", @@ -334,7 +333,7 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67adbc4240794e886ca1edbc7d46bc8a54c7aca7217d73ddcfbc90e1dbb030e7" dependencies = [ - "astroport 2.9.0", + "astroport 2.9.3", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 0.15.1", @@ -350,7 +349,7 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3360383a2e585211da9a455ad57eb100578253b5d18a387f025cadd666604d99" dependencies = [ - "astroport 2.9.0", + "astroport 2.9.3", "cosmwasm-schema", "cosmwasm-std", "cw2 0.15.1", @@ -365,7 +364,7 @@ version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dffce7cf86bf4d4f177ef941145352499e802abc4b898032af7808d16cca6371" dependencies = [ - "astroport 2.9.0", + "astroport 2.9.3", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 0.15.1", @@ -381,7 +380,7 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44156757bfab3d4bd208d9b86b890d1478f45d07c8f8d3d1c3e3da91081cb54d" dependencies = [ - "astroport 2.9.0", + "astroport 2.9.3", "cosmwasm-schema", "cosmwasm-std", "cw1-whitelist", @@ -850,6 +849,29 @@ dependencies = [ "zeroize", ] +[[package]] +name = "cw-address-like" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451a4691083a88a3c0630a8a88799e9d4cd6679b7ce8ff22b8da2873ff31d380" +dependencies = [ + "cosmwasm-std", +] + +[[package]] +name = "cw-asset" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "431e57314dceabd29a682c78bb3ff7c641f8bdc8b915400bb9956cb911e8e571" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-address-like", + "cw-storage-plus 1.2.0", + "cw20 1.1.2", + "thiserror", +] + [[package]] name = "cw-it" version = "0.3.0-rc.2" @@ -857,15 +879,17 @@ dependencies = [ "anyhow", "apollo-cw-multi-test", "apollo-utils", - "astroport 2.9.0", + "astroport 2.9.3", + "astroport 3.11.1", "astroport-factory", "astroport-generator", + "astroport-incentives", "astroport-liquidity-manager", "astroport-maker", "astroport-native-coin-registry", "astroport-pair", "astroport-pair-concentrated", - "astroport-pair-stable 2.1.4", + "astroport-pair-stable", "astroport-router", "astroport-staking", "astroport-token", diff --git a/Cargo.toml b/Cargo.toml index a533a8b..80f2a0b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,7 +33,7 @@ overflow-checks = true [features] default = [] -astroport = ["cw20", "dep:astroport"] +astroport = ["cw20", "dep:astroport", "dep:astroport_v3"] osmosis = ["proptest", "apollo-utils", "osmosis-test-tube"] rpc-runner = ["bip32"] chain-download = ["tokio"] @@ -89,23 +89,25 @@ test-tube = { version = "0.5.0", features = ["module-wrappers"] } osmosis-test-tube = { version = "22.1.0", optional = true } # Astroport deps -astroport = { version = "=2.9.0", optional = true } +astroport = { version = "=2.9.3", optional = true } +astroport_v3 = { package = "astroport", version = "=3.11.1", optional = true} cw20 = { version = "0.15", optional = true } # Astroport contracts for multi-test -astroport-token = { version = "1.1.1", optional = true, features = ["library"] } -astroport-native-coin-registry = { version = "1.0.1", optional = true, features = ["library"] } -astroport-factory = { version = "1.5.1", optional = true, features = ["library"] } -astroport-generator = { version = "2.3.0", optional = true } -astroport-maker = { version = "1.3.1", optional = true } -astroport-pair-stable = { version = "2.1.1", optional = true, features = ["library"] } -astroport-pair = { version = "1.3.1", optional = true } -astroport-router = { version = "1.1.1", optional = true } -astroport-staking = { version = "1.1.0", optional = true } -astroport-vesting = { version = "1.3.1", optional = true, features = ["library"] } -astroport-whitelist = { version = "1.0.1", optional = true, features = ["library"] } -astroport-liquidity-manager = { version = "1.0.3", optional = true, features = ["library"] } -astroport-pair-concentrated = { version = "1.2.7", optional = true, features = ["library"] } +astroport-token = { version = "=1.1.1", optional = true, features = ["library"] } +astroport-native-coin-registry = { version = "=1.0.1", optional = true, features = ["library"] } +astroport-factory = { version = "=1.5.1", optional = true, features = ["library"] } +astroport-generator = { version = "=2.3.0", optional = true } +astroport-maker = { version = "=1.3.1", optional = true } +astroport-pair-stable = { version = "=2.1.3", optional = true, features = ["library"] } +astroport-pair = { version = "=1.3.2", optional = true } +astroport-router = { version = "=1.1.1", optional = true } +astroport-staking = { version = "=1.1.0", optional = true } +astroport-vesting = { version = "=1.3.1", optional = true, features = ["library"] } +astroport-whitelist = { version = "=1.0.1", optional = true, features = ["library"] } +astroport-liquidity-manager = { version = "=1.0.3-astroport-v2", optional = true, features = ["library"] } +astroport-pair-concentrated = { version = "=1.2.7", optional = true, features = ["library"] } +astroport-incentives = { version = "1.0.0", optional = true, features = ["library"] } # Osmosis deps proptest = { version = "1.0.0", optional = true } diff --git a/artifacts/c73a2db/astroport_incentives.wasm b/artifacts/c73a2db/astroport_incentives.wasm new file mode 100644 index 0000000000000000000000000000000000000000..371ad055552afdb802f529a30ff0fb1d4c5c4816 GIT binary patch literal 515599 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

f4TsD@uL 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 HashMap { "astroport_pair" )); - // Liquidity manager and concentrated pair don't have query entrypoint in contract module + // Liquidity manager, incentives, and concentrated pair don't have query entrypoint in contract module contract_wrappers.extend(vec![ ( "astroport_liquidity_manager".to_string(), @@ -665,6 +693,17 @@ pub fn get_astroport_multitest_contracts() -> HashMap { .with_reply(astroport_pair_concentrated::contract::reply), ) as Box>, ), + ( + "astroport_incentives".to_string(), + Box::new( + ContractWrapper::new_with_empty( + astroport_incentives::execute::execute, + astroport_incentives::instantiate::instantiate, + astroport_incentives::query::query, + ) + .with_reply(astroport_incentives::reply::reply), + ) as Box>, + ), ]); contract_wrappers From 54fa6b10240914e5aed09a996d2f16061c7c98fb Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Fri, 9 Feb 2024 19:28:50 +0100 Subject: [PATCH 13/20] fix: add astroport-incentives to feature astroport-multi-testcargo --- Cargo.lock | 2 +- Cargo.toml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7a359e5..bbef324 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -874,7 +874,7 @@ dependencies = [ [[package]] name = "cw-it" -version = "0.3.0-rc.2" +version = "0.3.0-rc.3" dependencies = [ "anyhow", "apollo-cw-multi-test", diff --git a/Cargo.toml b/Cargo.toml index 80f2a0b..fcfec3c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cw-it" -version = "0.3.0-rc.2" +version = "0.3.0-rc.3" authors = ["Pacman ", "Sturdy "] edition = "2021" license = "MPL-2.0" @@ -54,6 +54,7 @@ astroport-multi-test = [ "astroport-whitelist", "astroport-liquidity-manager", "astroport-pair-concentrated", + "astroport-incentives" ] osmosis-test-tube = ["dep:osmosis-test-tube"] From 4fe7597a7e682159e309aacc13f2b52a71bf299d Mon Sep 17 00:00:00 2001 From: Pacman Date: Fri, 9 Feb 2024 22:32:50 +0100 Subject: [PATCH 14/20] chore!: set astroport dep to 2.9.0 --- Cargo.lock | 34 +++++++++++++++++----------------- Cargo.toml | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bbef324..23cfa45 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -103,9 +103,9 @@ dependencies = [ [[package]] name = "astroport" -version = "2.9.3" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b991ce88f077c1d12f850c1f8fba3671bd72784f43f1638731d6d28f9b79839" +checksum = "78b863a982595743e181f89540d7aaeda35c60b6b5cac9c36c9be30cf11a5ece" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -152,7 +152,7 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ecf768e2d3153bebfbe0c502ffa4199a52598e9b6e89fca54339615b2de77eb" dependencies = [ - "astroport 2.9.3", + "astroport 2.9.0", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 0.15.1", @@ -168,7 +168,7 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6144780ac014665b07616de0cfb35ca6a9411ed821e20c21e02f4f428c8ed51f" dependencies = [ - "astroport 2.9.3", + "astroport 2.9.0", "astroport-governance", "cosmwasm-schema", "cosmwasm-std", @@ -186,7 +186,7 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72806ace350e81c4e1cab7e275ef91f05bad830275d697d67ad1bd4acc6f016d" dependencies = [ - "astroport 2.9.3", + "astroport 2.9.0", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 0.15.1", @@ -216,7 +216,7 @@ version = "1.0.3-astroport-v2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae4bf7689e7c37cfecc200aab3401c1ff6a507cccc9fb1baadfa71a73addaa2f" dependencies = [ - "astroport 2.9.3", + "astroport 2.9.0", "astroport-factory", "astroport-pair", "astroport-pair-stable", @@ -235,7 +235,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92403e5d00e3c77d13d9616661ea9d9308d493fff6bec5e6e5e7bd7b7e0ff6af" dependencies = [ "astro-satellite-package", - "astroport 2.9.3", + "astroport 2.9.0", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 0.15.1", @@ -250,7 +250,7 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "648ed6827a8f11012c0377fb60329204e8511fe46c86db3220113e70bdc57826" dependencies = [ - "astroport 2.9.3", + "astroport 2.9.0", "cosmwasm-schema", "cosmwasm-std", "cosmwasm-storage", @@ -265,7 +265,7 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e760b91eaf269bb2843b75b34eb73d474374bd2ebefbbe3cdb0a58d69959573b" dependencies = [ - "astroport 2.9.3", + "astroport 2.9.0", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 0.15.1", @@ -282,7 +282,7 @@ version = "1.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04a90ce51403c81af3acf8e7028bb0eb095fce802365453b7e4a13bc0eb0d6d7" dependencies = [ - "astroport 2.9.3", + "astroport 2.9.0", "astroport-factory", "cosmwasm-schema", "cosmwasm-std", @@ -300,7 +300,7 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d052966163fc2dd3eb46ae3c948ee7032a28726e046bc44431f9b488cb1dba90" dependencies = [ - "astroport 2.9.3", + "astroport 2.9.0", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 0.15.1", @@ -317,7 +317,7 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e3bbb33c00370bd194cf3a166f1e3f4029a2add2bea01a5eb61e886aefbc85b" dependencies = [ - "astroport 2.9.3", + "astroport 2.9.0", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 0.15.1", @@ -333,7 +333,7 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67adbc4240794e886ca1edbc7d46bc8a54c7aca7217d73ddcfbc90e1dbb030e7" dependencies = [ - "astroport 2.9.3", + "astroport 2.9.0", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 0.15.1", @@ -349,7 +349,7 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3360383a2e585211da9a455ad57eb100578253b5d18a387f025cadd666604d99" dependencies = [ - "astroport 2.9.3", + "astroport 2.9.0", "cosmwasm-schema", "cosmwasm-std", "cw2 0.15.1", @@ -364,7 +364,7 @@ version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dffce7cf86bf4d4f177ef941145352499e802abc4b898032af7808d16cca6371" dependencies = [ - "astroport 2.9.3", + "astroport 2.9.0", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 0.15.1", @@ -380,7 +380,7 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44156757bfab3d4bd208d9b86b890d1478f45d07c8f8d3d1c3e3da91081cb54d" dependencies = [ - "astroport 2.9.3", + "astroport 2.9.0", "cosmwasm-schema", "cosmwasm-std", "cw1-whitelist", @@ -879,7 +879,7 @@ dependencies = [ "anyhow", "apollo-cw-multi-test", "apollo-utils", - "astroport 2.9.3", + "astroport 2.9.0", "astroport 3.11.1", "astroport-factory", "astroport-generator", diff --git a/Cargo.toml b/Cargo.toml index fcfec3c..85dbeff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -90,7 +90,7 @@ test-tube = { version = "0.5.0", features = ["module-wrappers"] } osmosis-test-tube = { version = "22.1.0", optional = true } # Astroport deps -astroport = { version = "=2.9.3", optional = true } +astroport = { version = "=2.9.0", optional = true } astroport_v3 = { package = "astroport", version = "=3.11.1", optional = true} cw20 = { version = "0.15", optional = true } From e3e81d9bb8c81fc6321d849478fe69cc431a73ca Mon Sep 17 00:00:00 2001 From: Pacman Date: Fri, 9 Feb 2024 22:39:16 +0100 Subject: [PATCH 15/20] chore: bump version to 0.3.0-rc.4 --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 23cfa45..652d7b4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -874,7 +874,7 @@ dependencies = [ [[package]] name = "cw-it" -version = "0.3.0-rc.3" +version = "0.3.0-rc.4" dependencies = [ "anyhow", "apollo-cw-multi-test", diff --git a/Cargo.toml b/Cargo.toml index 85dbeff..9cc1762 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cw-it" -version = "0.3.0-rc.3" +version = "0.3.0-rc.4" authors = ["Pacman ", "Sturdy "] edition = "2021" license = "MPL-2.0" From 044d26db3e0ba7e78ce73c27114ba713a41e05de Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Tue, 13 Feb 2024 18:56:26 +0100 Subject: [PATCH 16/20] ci: update cargo deny config --- Cargo.lock | 4 ++-- Makefile.toml | 2 +- deny.toml | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 652d7b4..51b9a5f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -860,9 +860,9 @@ dependencies = [ [[package]] name = "cw-asset" -version = "3.1.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "431e57314dceabd29a682c78bb3ff7c641f8bdc8b915400bb9956cb911e8e571" +checksum = "c999a12f8cd8736f6f86e9a4ede5905530cb23cfdef946b9da1c506ad1b70799" dependencies = [ "cosmwasm-schema", "cosmwasm-std", diff --git a/Makefile.toml b/Makefile.toml index edb9782..2586f22 100644 --- a/Makefile.toml +++ b/Makefile.toml @@ -56,7 +56,7 @@ args = ["fmt", "--all", "--","--verbose", "--check"] [tasks.deny] command = "cargo" -args = ["deny", "check"] +args = ["deny", "--all-features", "check"] [tasks.check] toolchain = "${RUST_VERSION}" diff --git a/deny.toml b/deny.toml index 6467b65..ce7e96c 100644 --- a/deny.toml +++ b/deny.toml @@ -34,7 +34,8 @@ confidence-threshold = 0.93 allow = ["Apache-2.0", "MIT", "BSD-3-Clause", "MPL-2.0", "ISC"] exceptions = [ { allow = ["Unicode-DFS-2016"], name = "unicode-ident" }, - { allow = ["OpenSSL"], name = "ring" } + { allow = ["OpenSSL"], name = "ring" }, + { allow = ["GPL-3.0"], name = "astroport-incentives" } ] [[licenses.clarify]] From 13a27ece591bb8e1154393c5dd4284bd48bc5166 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Tue, 13 Feb 2024 19:35:44 +0100 Subject: [PATCH 17/20] build: unpin astroport dep --- Cargo.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 9cc1762..6e0abe4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -90,8 +90,8 @@ test-tube = { version = "0.5.0", features = ["module-wrappers"] } osmosis-test-tube = { version = "22.1.0", optional = true } # Astroport deps -astroport = { version = "=2.9.0", optional = true } -astroport_v3 = { package = "astroport", version = "=3.11.1", optional = true} +astroport = { version = "2.9.0", optional = true } +astroport_v3 = { package = "astroport", version = "3.11.1", optional = true} cw20 = { version = "0.15", optional = true } # Astroport contracts for multi-test @@ -108,7 +108,7 @@ astroport-vesting = { version = "=1.3.1", optional = true, features = ["library" astroport-whitelist = { version = "=1.0.1", optional = true, features = ["library"] } astroport-liquidity-manager = { version = "=1.0.3-astroport-v2", optional = true, features = ["library"] } astroport-pair-concentrated = { version = "=1.2.7", optional = true, features = ["library"] } -astroport-incentives = { version = "1.0.0", optional = true, features = ["library"] } +astroport-incentives = { version = "=1.0.0", optional = true, features = ["library"] } # Osmosis deps proptest = { version = "1.0.0", optional = true } From cac72b394b9c7d048b24de11620f04e1d77e98fa Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Tue, 13 Feb 2024 19:35:50 +0100 Subject: [PATCH 18/20] docs: update changelog --- CHANGELOG.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f60814..e42e075 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [0.3.0-rc.2] - 2024-02-02 +## [0.3.0-rc.4] - 2024-02-02 + +### Changed - Bump dependencies - `osmosis-std` to 0.22.0 @@ -14,6 +16,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `prost` to 0.12 - `cosmrs` to 0.15 +### Added + +- Helper fn `instantiate_astroport` now instantiates the `astroport-incentives` contract. + - NB: Astroport incentives contract API is only in `astroport` package version >= 3.11 which contains unreleased changes. Be careful when integrating with Astroport as they don't follow SemVer. + ## [0.2.3] - 2023-11-01 ### Changed From 290258073635c9b8b0860ca1c2191251d9ddbc92 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Tue, 13 Feb 2024 19:54:22 +0100 Subject: [PATCH 19/20] chore: bump cosmwasm-std --- CHANGELOG.md | 5 +++-- Cargo.toml | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e42e075..3b5dc5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,10 +11,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Bump dependencies - `osmosis-std` to 0.22.0 - - `test-tube` to 0.4.0 - - `osmosis-test-tube` to 22.0.0 + - `test-tube` to 0.5.0 + - `osmosis-test-tube` to 22.1.0 - `prost` to 0.12 - `cosmrs` to 0.15 + - `cosmwasm-std` to 1.5.0 ### Added diff --git a/Cargo.toml b/Cargo.toml index 6e0abe4..cc82e61 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -74,7 +74,7 @@ ignored = ["astroport-token", "astroport-native-coin-registry", "astroport-facto [dependencies] bip32 = { version = "0.5", features = ["bip39"], optional = true } -cosmwasm-std = { version = "1.2.1", features = ["stargate"] } +cosmwasm-std = { version = "1.5.0", features = ["stargate"] } serde = { version = "1.0.152", default-features = false, features = ["derive"] } thiserror = { version = "1.0.31" } cosmwasm-schema = "1.2.1" From 4f8435b46d1e5b28535138944f8d0a740a8b14e8 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Tue, 13 Feb 2024 20:57:23 +0100 Subject: [PATCH 20/20] chore: bump cargo version --- CHANGELOG.md | 2 +- Cargo.lock | 2 +- Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b5dc5b..7eb31b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [0.3.0-rc.4] - 2024-02-02 +## [0.3.0] - 2024-02-13 ### Changed diff --git a/Cargo.lock b/Cargo.lock index 51b9a5f..e944d73 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -874,7 +874,7 @@ dependencies = [ [[package]] name = "cw-it" -version = "0.3.0-rc.4" +version = "0.3.0" dependencies = [ "anyhow", "apollo-cw-multi-test", diff --git a/Cargo.toml b/Cargo.toml index cc82e61..e8e5476 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cw-it" -version = "0.3.0-rc.4" +version = "0.3.0" authors = ["Pacman ", "Sturdy "] edition = "2021" license = "MPL-2.0"