diff --git a/.cargo/config b/.cargo/config.toml similarity index 100% rename from .cargo/config rename to .cargo/config.toml diff --git a/.github/workflows/rust.yaml b/.github/workflows/rust.yaml index 8d93b9b..fa9c5b6 100644 --- a/.github/workflows/rust.yaml +++ b/.github/workflows/rust.yaml @@ -33,7 +33,7 @@ jobs: uses: actions-rs/toolchain@v1 with: profile: minimal - toolchain: 1.74.0 + toolchain: 1.78.0 target: wasm32-unknown-unknown override: true components: llvm-tools-preview @@ -62,7 +62,7 @@ jobs: uses: actions-rs/cargo@v1 with: command: test - toolchain: 1.74.0 + toolchain: 1.78.0 args: --locked --tests env: LLVM_PROFILE_FILE: "swap-contract-%p-%m.profraw" @@ -98,7 +98,7 @@ jobs: uses: actions-rs/toolchain@v1 with: profile: minimal - toolchain: 1.74.0 + toolchain: 1.78.0 override: true components: rustfmt, clippy @@ -123,13 +123,13 @@ jobs: - name: Run cargo fmt uses: actions-rs/cargo@v1 with: - toolchain: 1.74.0 + toolchain: 1.78.0 command: fmt args: --all -- --check - name: Run cargo clippy uses: actions-rs/cargo@v1 with: - toolchain: 1.74.0 + toolchain: 1.78.0 command: clippy args: --tests -- -D warnings diff --git a/Cargo.lock b/Cargo.lock index 8af067b..0e021d7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,28 +4,29 @@ version = 3 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "ahash" -version = "0.7.8" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ - "getrandom", + "cfg-if", "once_cell", "version_check", + "zerocopy", ] [[package]] @@ -38,147 +39,202 @@ dependencies = [ ] [[package]] -name = "android-tzdata" -version = "0.1.1" +name = "allocator-api2" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] -name = "android_system_properties" -version = "0.1.5" +name = "anyhow" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" + +[[package]] +name = "ark-bls12-381" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" dependencies = [ - "libc", + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", ] [[package]] -name = "anyhow" -version = "1.0.82" +name = "ark-ec" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools 0.10.5", + "num-traits", + "rayon", + "zeroize", +] [[package]] -name = "async-stream" -version = "0.3.5" +name = "ark-ff" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rayon", + "rustc_version", + "zeroize", ] [[package]] -name = "async-stream-impl" -version = "0.3.5" +name = "ark-ff-asm" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", "proc-macro2", "quote", - "syn 2.0.60", + "syn 1.0.109", ] [[package]] -name = "async-trait" -version = "0.1.80" +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 1.0.109", ] [[package]] -name = "atty" -version = "0.2.14" +name = "ark-std" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", + "num-traits", + "rand 0.8.5", + "rayon", ] [[package]] -name = "autocfg" -version = "1.2.0" +name = "arrayvec" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "06f59fe10306bb78facd90d28c2038ad23ffaaefa85bac43c8a434cde383334f" +dependencies = [ + "nodrop", + "odds", +] [[package]] -name = "axum" -version = "0.6.20" +name = "async-trait" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" 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", + "proc-macro2", + "quote", + "syn 2.0.85", ] [[package]] -name = "axum-core" -version = "0.3.4" +name = "atty" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http", - "http-body", - "mime", - "rustversion", - "tower-layer", - "tower-service", + "hermit-abi 0.1.19", + "libc", + "winapi", ] +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] name = "base16ct" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] -name = "base16ct" -version = "0.2.0" +name = "base64" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" @@ -186,6 +242,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "base64ct" version = "1.6.0" @@ -194,9 +256,9 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bech32" -version = "0.9.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" +checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" [[package]] name = "bindgen" @@ -223,13 +285,13 @@ dependencies = [ [[package]] name = "bip32" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e141fb0f8be1c7b45887af94c88b182472b57c96b56773250ae00cd6a14a164" +checksum = "aa13fae8b6255872fd86f7faf4b41168661d7d78609f7bfe6771b85c6739a15b" dependencies = [ "bs58", "hmac", - "k256 0.13.1", + "k256", "rand_core 0.6.4", "ripemd", "sha2 0.10.8", @@ -245,9 +307,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "block-buffer" @@ -269,9 +331,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" +checksum = "3e31ea183f6ee62ac8b8a8cf7feddd766317adfb13ff469de57ce033efd6a790" [[package]] name = "bs58" @@ -296,18 +358,21 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" dependencies = [ - "serde", + "serde 1.0.214", ] [[package]] name = "cc" -version = "1.0.96" +version = "1.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "065a29261d53ba54260972629f9ca6bffa69bac13cd1fed61420f7fa68b9f8bd" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +dependencies = [ + "shlex", +] [[package]] name = "cexpr" @@ -330,19 +395,14 @@ version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", "num-traits", - "wasm-bindgen", - "windows-targets 0.52.5", ] [[package]] name = "clang-sys" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", "libc", @@ -400,9 +460,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cosmos-sdk-proto" @@ -410,23 +470,11 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32560304ab4c365791fd307282f76637213d8083c1a98490c35159cd67852237" dependencies = [ - "prost 0.12.4", - "prost-types 0.12.4", + "prost 0.12.6", + "prost-types 0.12.6", "tendermint-proto 0.34.1", ] -[[package]] -name = "cosmos-sdk-proto" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e23f6ab56d5f031cde05b8b82a5fefd3a1a223595c79e32317a97189e612bc" -dependencies = [ - "prost 0.12.4", - "prost-types 0.12.4", - "tendermint-proto 0.35.0", - "tonic", -] - [[package]] name = "cosmrs" version = "0.15.0" @@ -434,125 +482,146 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47126f5364df9387b9d8559dcef62e99010e1d4098f39eb3f7ee4b5c254e40ea" dependencies = [ "bip32", - "cosmos-sdk-proto 0.20.0", - "ecdsa 0.16.9", + "cosmos-sdk-proto", + "ecdsa", "eyre", - "k256 0.13.1", + "k256", "rand_core 0.6.4", - "serde", - "serde_json", - "signature 2.2.0", + "serde 1.0.214", + "serde_json 1.0.132", + "signature", "subtle-encoding", "tendermint", "tendermint-rpc", "thiserror", ] +[[package]] +name = "cosmwasm-core" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6ceb8624260d0d3a67c4e1a1d43fc7e9406720afbcb124521501dd138f90aa" + [[package]] name = "cosmwasm-crypto" -version = "1.5.4" +version = "2.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b4c3f9c4616d6413d4b5fc4c270a4cc32a374b9be08671e80e1a019f805d8f" +checksum = "4125381e5fd7fefe9f614640049648088015eca2b60d861465329a5d87dfa538" dependencies = [ + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", + "cosmwasm-core", "digest 0.10.7", - "ecdsa 0.16.9", + "ecdsa", "ed25519-zebra", - "k256 0.13.1", + "k256", + "num-traits", + "p256", "rand_core 0.6.4", + "rayon", + "sha2 0.10.8", "thiserror", ] [[package]] name = "cosmwasm-derive" -version = "1.5.4" +version = "2.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c586ced10c3b00e809ee664a895025a024f60d65d34fe4c09daed4a4db68a3f3" +checksum = "1b5658b1dc64e10b56ae7a449f678f96932a96f6cfad1769d608d1d1d656480a" dependencies = [ - "syn 1.0.109", + "proc-macro2", + "quote", + "syn 2.0.85", ] [[package]] name = "cosmwasm-schema" -version = "1.5.4" +version = "2.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8467874827d384c131955ff6f4d47d02e72a956a08eb3c0ff24f8c903a5517b4" +checksum = "f86b4d949b6041519c58993a73f4bbfba8083ba14f7001eae704865a09065845" dependencies = [ "cosmwasm-schema-derive", "schemars", - "serde", - "serde_json", + "serde 1.0.214", + "serde_json 1.0.132", "thiserror", ] [[package]] name = "cosmwasm-schema-derive" -version = "1.5.4" +version = "2.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6db85d98ac80922aef465e564d5b21fa9cfac5058cb62df7f116c3682337393" +checksum = "c8ef1b5835a65fcca3ab8b9a02b4f4dacc78e233a5c2f20b270efb9db0666d12" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.85", ] [[package]] name = "cosmwasm-std" -version = "1.5.4" +version = "2.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712fe58f39d55c812f7b2c84e097cdede3a39d520f89b6dc3153837e31741927" +checksum = "70eb7ab0c1e99dd6207496963ba2a457c4128ac9ad9c72a83f8d9808542b849b" dependencies = [ - "base64", + "base64 0.22.1", "bech32", "bnum", + "cosmwasm-core", "cosmwasm-crypto", "cosmwasm-derive", - "derivative", - "forward_ref", + "derive_more", "hex", + "rand_core 0.6.4", "schemars", - "serde", - "serde-json-wasm 0.5.2", + "serde 1.0.214", + "serde-json-wasm", "sha2 0.10.8", "static_assertions 1.1.0", "thiserror", ] [[package]] -name = "cosmwasm-storage" -version = "1.5.2" +name = "cpufeatures" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66de2ab9db04757bcedef2b5984fbe536903ada4a8a9766717a4a71197ef34f6" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ - "cosmwasm-std", - "serde", + "libc", ] [[package]] -name = "cpufeatures" -version = "0.2.12" +name = "crossbeam-deque" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "libc", + "crossbeam-epoch", + "crossbeam-utils", ] [[package]] -name = "crunchy" -version = "0.2.2" +name = "crossbeam-epoch" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] [[package]] -name = "crypto-bigint" -version = "0.4.9" +name = "crossbeam-utils" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-bigint" @@ -578,17 +647,31 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "3.2.0" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rustc_version", "subtle", "zeroize", ] +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + [[package]] name = "curve25519-dalek-ng" version = "4.1.1" @@ -604,109 +687,95 @@ dependencies = [ [[package]] name = "cw-multi-test" -version = "0.16.5" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "127c7bb95853b8e828bdab97065c81cb5ddc20f7339180b61b2300565aaa99d1" +checksum = "b0ae276e7a06ad1b7e7da78a3d68aba80634cde30ee7fe8259a94e653603fef8" dependencies = [ "anyhow", + "bech32", "cosmwasm-std", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", + "cw-storage-plus", + "cw-utils", "derivative", - "itertools 0.10.5", - "k256 0.11.6", - "prost 0.9.0", + "itertools 0.13.0", + "prost 0.13.3", "schemars", - "serde", + "serde 1.0.214", + "sha2 0.10.8", "thiserror", ] [[package]] name = "cw-storage-plus" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c8b264257c4f44c49b7ce09377af63aa040768ecd3fd7bdd2d48a09323a1e90" -dependencies = [ - "cosmwasm-std", - "schemars", - "serde", -] - -[[package]] -name = "cw-storage-plus" -version = "1.2.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5ff29294ee99373e2cd5fd21786a3c0ced99a52fec2ca347d565489c61b723c" +checksum = "f13360e9007f51998d42b1bc6b7fa0141f74feae61ed5fd1e5b0a89eec7b5de1" dependencies = [ "cosmwasm-std", "schemars", - "serde", + "serde 1.0.214", ] [[package]] name = "cw-utils" -version = "0.14.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "414b91f3d7a619bb26c835119d7095804596a1382ddc1d184c33c1d2c17f6c5e" +checksum = "07dfee7f12f802431a856984a32bce1cb7da1e6c006b5409e3981035ce562dec" dependencies = [ + "cosmwasm-schema", "cosmwasm-std", - "cw2 0.14.0", "schemars", - "semver", - "serde", + "serde 1.0.214", "thiserror", ] [[package]] -name = "cw-utils" -version = "1.0.3" +name = "cw2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c4a657e5caacc3a0d00ee96ca8618745d050b8f757c709babafb81208d4239c" +checksum = "b04852cd38f044c0751259d5f78255d07590d136b8a86d4e09efdd7666bd6d27" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw2 1.1.2", + "cw-storage-plus", "schemars", "semver", - "serde", + "serde 1.0.214", "thiserror", ] [[package]] -name = "cw2" -version = "0.14.0" +name = "darling" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa74c324af8e3506fd8d50759a265bead3f87402e413c840042af5d2808463d6" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ - "cosmwasm-std", - "cw-storage-plus 0.14.0", - "schemars", - "serde", + "darling_core", + "darling_macro", ] [[package]] -name = "cw2" -version = "1.1.2" +name = "darling_core" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6c120b24fbbf5c3bedebb97f2cc85fbfa1c3287e09223428e7e597b5293c1fa" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus 1.2.0", - "schemars", - "semver", - "serde", - "thiserror", + "fnv", + "ident_case", + "proc-macro2", + "quote", + "syn 2.0.85", ] [[package]] -name = "der" -version = "0.6.1" +name = "darling_macro" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ - "const-oid", - "zeroize", + "darling_core", + "quote", + "syn 2.0.85", ] [[package]] @@ -739,6 +808,27 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", + "unicode-xid", +] + [[package]] name = "digest" version = "0.9.0" @@ -766,30 +856,18 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" -[[package]] -name = "ecdsa" -version = "0.14.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" -dependencies = [ - "der 0.6.1", - "elliptic-curve 0.12.3", - "rfc6979 0.3.1", - "signature 1.6.4", -] - [[package]] name = "ecdsa" version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ - "der 0.7.9", + "der", "digest 0.10.7", - "elliptic-curve 0.13.8", - "rfc6979 0.4.0", - "signature 2.2.0", - "spki 0.7.3", + "elliptic-curve", + "rfc6979", + "signature", + "spki", ] [[package]] @@ -798,8 +876,8 @@ version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ - "pkcs8 0.10.2", - "signature 2.2.0", + "pkcs8", + "signature", ] [[package]] @@ -817,71 +895,72 @@ dependencies = [ [[package]] name = "ed25519-zebra" -version = "3.1.0" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" +checksum = "7d9ce6874da5d4415896cd45ffbc4d1cfc0c4f9c079427bd870742c30f2f65a9" dependencies = [ "curve25519-dalek", - "hashbrown 0.12.3", + "ed25519", + "hashbrown 0.14.5", "hex", "rand_core 0.6.4", - "serde", - "sha2 0.9.9", + "sha2 0.10.8", "zeroize", ] [[package]] name = "either" -version = "1.11.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "elliptic-curve" -version = "0.12.3" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ - "base16ct 0.1.1", - "crypto-bigint 0.4.9", - "der 0.6.1", + "base16ct", + "crypto-bigint", "digest 0.10.7", - "ff 0.12.1", + "ff", "generic-array", - "group 0.12.1", - "pkcs8 0.9.0", + "group", + "pkcs8", "rand_core 0.6.4", - "sec1 0.3.0", + "sec1", "subtle", "zeroize", ] [[package]] -name = "elliptic-curve" -version = "0.13.8" +name = "encoding_rs" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ - "base16ct 0.2.0", - "crypto-bigint 0.5.5", - "digest 0.10.7", - "ff 0.13.0", - "generic-array", - "group 0.13.0", - "pkcs8 0.10.2", - "rand_core 0.6.4", - "sec1 0.7.3", - "subtle", - "zeroize", + "cfg-if", ] [[package]] -name = "encoding_rs" -version = "0.8.34" +name = "enumset" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "d07a4b049558765cef5f0c1a273c3fc57084d768b44d2f98127aef4cceb17293" dependencies = [ - "cfg-if", + "enumset_derive", +] + +[[package]] +name = "enumset_derive" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59c3b24c345d8c314966bdc1832f6c2635bfcce8e7cf363bd115987bba2ee242" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.85", ] [[package]] @@ -905,9 +984,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", "windows-sys 0.52.0", @@ -936,7 +1015,7 @@ dependencies = [ "ethbloom", "ethereum-types-serialize", "fixed-hash 0.3.2", - "serde", + "serde 1.0.214", "uint 0.5.0", ] @@ -946,7 +1025,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1873d77b32bc1891a79dad925f2acbc318ee942b38b9110f9dbc5fbeffcea350" dependencies = [ - "serde", + "serde 1.0.214", ] [[package]] @@ -961,23 +1040,19 @@ dependencies = [ [[package]] name = "ff" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ "rand_core 0.6.4", "subtle", ] [[package]] -name = "ff" -version = "0.13.0" +name = "fiat-crypto" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "fixed-hash" @@ -1026,12 +1101,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "forward_ref" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" - [[package]] name = "fuchsia-cprng" version = "0.1.1" @@ -1040,9 +1109,9 @@ checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1054,9 +1123,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1064,33 +1133,33 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-core", "futures-sink", @@ -1099,6 +1168,12 @@ dependencies = [ "pin-utils", ] +[[package]] +name = "gcc" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" + [[package]] name = "generic-array" version = "0.14.7" @@ -1112,9 +1187,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", @@ -1125,9 +1200,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" @@ -1135,24 +1210,13 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" -[[package]] -name = "group" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" -dependencies = [ - "ff 0.12.1", - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "group" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "ff 0.13.0", + "ff", "rand_core 0.6.4", "subtle", ] @@ -1169,7 +1233,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.2.6", + "indexmap 2.6.0", "slab", "tokio", "tokio-util", @@ -1181,6 +1245,12 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ "ahash", ] @@ -1190,6 +1260,16 @@ name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" [[package]] name = "heapsize" @@ -1221,7 +1301,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" dependencies = [ - "serde", + "serde 1.0.214", ] [[package]] @@ -1266,9 +1346,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -1284,9 +1364,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.28" +version = "0.14.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" dependencies = [ "bytes", "futures-channel", @@ -1321,39 +1401,10 @@ dependencies = [ ] [[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 = "iana-time-zone" -version = "0.1.60" +name = "ident_case" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -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", -] +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" @@ -1380,7 +1431,7 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58e3cae7e99c7ff5a995da2cf78dd0a5383740eda71d98cf7b1910c301ac69b8" dependencies = [ - "serde", + "serde 1.0.214", ] [[package]] @@ -1401,27 +1452,27 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.6" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.0", ] [[package]] name = "injective-cosmwasm" -version = "0.2.22" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f85e8f06d04d0e20d59d673ae242c5cffb6a13f3b5189fd2e95ea153f3066f52" +checksum = "23e93e9438844b10add3eb40ed1e8c92689824ac080d207f856412a73551c221" dependencies = [ "cosmwasm-std", - "cw-storage-plus 1.2.0", + "cw-storage-plus", "ethereum-types", "hex", "injective-math", "schemars", - "serde", + "serde 1.0.214", "serde_repr", "subtle-encoding", "tiny-keccak", @@ -1429,75 +1480,93 @@ dependencies = [ [[package]] name = "injective-math" -version = "0.2.4" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db4e31ffb7dff274e0be1117bc8f1240f6572d6157be2c4daf13ff82eaaddd85" +checksum = "194fb5cb49537b0b9137d02a563b7019003220fb4affff05ad6cdc6fee3509c9" dependencies = [ "cosmwasm-std", "ethereum-types", "primitive-types", "schemars", - "serde", + "serde 1.0.214", "subtle-encoding", ] [[package]] -name = "injective-protobuf" -version = "0.2.2" +name = "injective-std" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a52219a08aba8c17846fd23d472d1d69c817fe5b427d135273e4c7311edd6972" +checksum = "c0e5193cb9520754f60b9e9af08a662ddf298d2e1a579200b9a447064b64db8b" dependencies = [ + "chrono", "cosmwasm-std", - "ethereum-types", - "num", - "protobuf", - "protobuf-codegen-pure", + "injective-std-derive", + "prost 0.12.6", + "prost-types 0.12.6", "schemars", - "serde", - "subtle-encoding", + "serde 1.0.214", + "serde-cw-value", ] [[package]] -name = "injective-std" -version = "0.1.7" +name = "injective-std-derive" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1d7b7114796e44b034355983cb1ee2a1c9d1843df17c9552126e4404d463c06" +checksum = "2721d8c2fed1fd1dff4cd6d119711a74acf27a6eeea6bf09cd44d192119e52ea" dependencies = [ - "chrono", "cosmwasm-std", - "osmosis-std-derive", - "prost 0.12.4", - "prost-types 0.12.4", - "schemars", - "serde", - "serde-cw-value", + "itertools 0.10.5", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] name = "injective-test-tube" -version = "1.2.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7b985231e977f4202a8ef7112d34558473a1bdfb4bff8dcb8ab091909728f9" +checksum = "2a45747c74fca8aedafd94df74c6b9edf091c586ead96957e3c17e96abd6228b" dependencies = [ - "base64", + "base64 0.21.7", "bindgen", "cosmrs", "cosmwasm-std", "hex", "injective-cosmwasm", "injective-std", - "prost 0.12.4", - "serde", - "serde_json", + "prost 0.12.6", + "serde 1.0.214", + "serde_json 1.0.132", "test-tube-inj", "thiserror", ] +[[package]] +name = "injective-testing" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0012164e64110a7a630ab7352679b456c1b3fde71d641c2951c285c9ebe20daa" +dependencies = [ + "anyhow", + "base64 0.13.1", + "cosmwasm-std", + "cw-multi-test", + "injective-cosmwasm", + "injective-math", + "injective-std", + "injective-test-tube", + "prost 0.12.6", + "rand 0.4.6", + "secp256k1", + "serde 1.0.214", + "tiny-keccak", +] + [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "itertools" @@ -1517,6 +1586,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.11" @@ -1525,44 +1603,30 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] [[package]] name = "k256" -version = "0.11.6" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ "cfg-if", - "ecdsa 0.14.8", - "elliptic-curve 0.12.3", + "ecdsa", + "elliptic-curve", "sha2 0.10.8", ] -[[package]] -name = "k256" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" -dependencies = [ - "cfg-if", - "ecdsa 0.16.9", - "elliptic-curve 0.13.8", - "once_cell", - "sha2 0.10.8", - "signature 2.2.0", -] - [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "lazycell" @@ -1572,43 +1636,37 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.154" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libloading" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" - -[[package]] -name = "matchit" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mime" @@ -1624,24 +1682,31 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ - "adler", + "adler2", ] [[package]] name = "mio" -version = "0.8.11" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi 0.3.9", "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + [[package]] name = "nom" version = "7.1.3" @@ -1654,11 +1719,11 @@ dependencies = [ [[package]] name = "num" -version = "0.4.2" +version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3135b08af27d103b0a51f2ae0f8632117b7b185ccf931445affa8df530576a41" +checksum = "4703ad64153382334aa8db57c637364c322d3372e097840c72000dabdcf6156e" dependencies = [ - "num-bigint", + "num-bigint 0.1.44", "num-complex", "num-integer", "num-iter", @@ -1668,22 +1733,34 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "e63899ad0da84ce718c14936262a41cee2c79c981fc0a0e7c7beb47d5a07e8c1" +dependencies = [ + "num-integer", + "num-traits", + "rand 0.4.6", + "rustc-serialize", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", ] [[package]] name = "num-complex" -version = "0.4.5" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" +checksum = "b288631d7878aaf59442cffd36910ea604ecd7745c36054328595114001c9656" dependencies = [ "num-traits", + "rustc-serialize", ] [[package]] @@ -1703,17 +1780,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "num-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.60", -] - [[package]] name = "num-integer" version = "0.1.46" @@ -1725,9 +1791,9 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -1736,49 +1802,45 @@ dependencies = [ [[package]] name = "num-rational" -version = "0.4.1" +version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "ee314c74bd753fc86b4780aa9475da469155f3848473a261d2d18e35245a784e" dependencies = [ - "autocfg", - "num-bigint", + "num-bigint 0.1.44", "num-integer", "num-traits", + "rustc-serialize", ] [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] -name = "num_cpus" -version = "1.16.0" +name = "object" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ - "hermit-abi 0.3.9", - "libc", + "memchr", ] [[package]] -name = "object" -version = "0.32.2" +name = "odds" +version = "0.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] +checksum = "4eae0151b9dacf24fcc170d9995e511669a082856a91f958a2fe380bfab3fb22" [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "opaque-debug" @@ -1799,23 +1861,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" [[package]] -name = "osmosis-std-derive" -version = "0.20.1" +name = "p256" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5ebdfd1bc8ed04db596e110c6baa9b174b04f6ed1ec22c666ddc5cb3fa91bd7" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" dependencies = [ - "itertools 0.10.5", - "proc-macro2", - "prost-types 0.11.9", - "quote", - "syn 1.0.109", + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.8", ] [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "peeking_take_while" @@ -1825,9 +1886,9 @@ checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" [[package]] name = "peg" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a625d12ad770914cbf7eff6f9314c3ef803bfe364a1b20bc36ddf56673e71e5" +checksum = "295283b02df346d1ef66052a757869b2876ac29a6bb0ac3f5f7cd44aebe40e8f" dependencies = [ "peg-macros", "peg-runtime", @@ -1835,9 +1896,9 @@ dependencies = [ [[package]] name = "peg-macros" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f241d42067ed3ab6a4fece1db720838e1418f36d868585a27931f95d6bc03582" +checksum = "bdad6a1d9cf116a059582ce415d5f5566aabcd4008646779dab7fdc2a9a9d426" dependencies = [ "peg-runtime", "proc-macro2", @@ -1858,29 +1919,29 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.85", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -1888,24 +1949,14 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "pkcs8" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" -dependencies = [ - "der 0.6.1", - "spki 0.6.0", -] - [[package]] name = "pkcs8" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "der 0.7.9", - "spki 0.7.3", + "der", + "spki", ] [[package]] @@ -1916,9 +1967,21 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] [[package]] name = "primitive-types" @@ -1932,48 +1995,48 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.81" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] [[package]] name = "prost" -version = "0.9.0" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444879275cb4fd84958b1a1d5420d15e6fcf7c235fe47f053c9c2a80aceb6001" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" dependencies = [ "bytes", - "prost-derive 0.9.0", + "prost-derive 0.11.9", ] [[package]] name = "prost" -version = "0.11.9" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" dependencies = [ "bytes", - "prost-derive 0.11.9", + "prost-derive 0.12.6", ] [[package]] name = "prost" -version = "0.12.4" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922" +checksum = "7b0487d90e047de87f984913713b85c601c05609aad5b0df4b4573fbf69aa13f" dependencies = [ "bytes", - "prost-derive 0.12.4", + "prost-derive 0.13.3", ] [[package]] name = "prost-derive" -version = "0.9.0" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" dependencies = [ "anyhow", "itertools 0.10.5", @@ -1984,28 +2047,28 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.11.9" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools 0.12.1", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.85", ] [[package]] name = "prost-derive" -version = "0.12.4" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19de2de2a00075bf566bee3bd4db014b11587e84184d3f7a791bc17f1a8e9e48" +checksum = "e9552f850d5f0964a4e4d0bf306459ac29323ddfbae05e35a7c0d35cb0803cc5" dependencies = [ "anyhow", - "itertools 0.12.1", + "itertools 0.13.0", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.85", ] [[package]] @@ -2019,48 +2082,43 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3235c33eb02c1f1e212abdbe34c78b264b038fb58ca612664343271e36e55ffe" -dependencies = [ - "prost 0.12.4", -] - -[[package]] -name = "protobuf" -version = "2.28.0" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" dependencies = [ - "bytes", + "prost 0.12.6", ] [[package]] -name = "protobuf-codegen" -version = "2.28.0" +name = "quote" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "033460afb75cf755fcfc16dfaed20b86468082a2ea24e05ac35ab4a099a017d6" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ - "protobuf", + "proc-macro2", ] [[package]] -name = "protobuf-codegen-pure" -version = "2.28.0" +name = "rand" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a29399fc94bcd3eeaa951c715f7bea69409b2445356b00519740bcd6ddd865" +checksum = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" dependencies = [ - "protobuf", - "protobuf-codegen", + "libc", + "rand 0.4.6", ] [[package]] -name = "quote" -version = "1.0.36" +name = "rand" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" dependencies = [ - "proc-macro2", + "fuchsia-cprng", + "libc", + "rand_core 0.3.1", + "rdrand", + "winapi", ] [[package]] @@ -2112,12 +2170,6 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" - [[package]] name = "rand_core" version = "0.6.4" @@ -2127,11 +2179,40 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "rdrand" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +dependencies = [ + "rand_core 0.3.1", +] + [[package]] name = "regex" -version = "1.10.4" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -2141,9 +2222,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", @@ -2152,9 +2233,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" @@ -2162,7 +2243,7 @@ version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ - "base64", + "base64 0.21.7", "bytes", "encoding_rs", "futures-core", @@ -2182,8 +2263,8 @@ dependencies = [ "rustls", "rustls-native-certs", "rustls-pemfile", - "serde", - "serde_json", + "serde 1.0.214", + "serde_json 1.0.132", "serde_urlencoded", "sync_wrapper", "system-configuration", @@ -2197,17 +2278,6 @@ dependencies = [ "winreg", ] -[[package]] -name = "rfc6979" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" -dependencies = [ - "crypto-bigint 0.4.9", - "hmac", - "zeroize", -] - [[package]] name = "rfc6979" version = "0.4.0" @@ -2253,9 +2323,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" @@ -2269,13 +2339,28 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" +[[package]] +name = "rustc-serialize" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe834bc780604f4674073badbad26d7219cadfb4a2275802db12cbae17498401" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", @@ -2312,7 +2397,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64", + "base64 0.21.7", ] [[package]] @@ -2325,17 +2410,11 @@ dependencies = [ "untrusted", ] -[[package]] -name = "rustversion" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" - [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -2348,35 +2427,36 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "schemars" -version = "0.8.17" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f55c82c700538496bdc329bb4918a81f87cc8888811bd123cf325a0f2f8d309" +checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" dependencies = [ "dyn-clone", + "enumset", "schemars_derive", - "serde", - "serde_json", + "serde 1.0.214", + "serde_json 1.0.132", ] [[package]] name = "schemars_derive" -version = "0.8.17" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83263746fe5e32097f06356968a077f96089739c927a61450efa069905eec108" +checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.60", + "syn 2.0.85", ] [[package]] @@ -2391,39 +2471,40 @@ dependencies = [ [[package]] name = "sec1" -version = "0.3.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ - "base16ct 0.1.1", - "der 0.6.1", + "base16ct", + "der", "generic-array", - "pkcs8 0.9.0", + "pkcs8", "subtle", "zeroize", ] [[package]] -name = "sec1" -version = "0.7.3" +name = "secp256k1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +checksum = "10915a2fa4f8016ed747eb847f096b0d44b22c6b624a36d3cc76964f6af4821a" dependencies = [ - "base16ct 0.2.0", - "der 0.7.9", - "generic-array", - "pkcs8 0.10.2", - "subtle", - "zeroize", + "arrayvec", + "gcc", + "libc", + "rand 0.3.23", + "rustc-serialize", + "serde 0.6.15", + "serde_json 0.6.1", ] [[package]] name = "security-framework" -version = "2.10.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -2432,9 +2513,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.10.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" dependencies = [ "core-foundation-sys", "libc", @@ -2442,35 +2523,35 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.199" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c9f6e76df036c77cd94996771fb40db98187f096dd0b9af39c6c6e452ba966a" +checksum = "c97b18e9e53de541f11e497357d6c5eaeb39f0cb9c8734e274abe4935f6991fa" dependencies = [ - "serde_derive", + "num", ] [[package]] -name = "serde-cw-value" -version = "0.7.0" +name = "serde" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75d32da6b8ed758b7d850b6c3c08f1d7df51a4df3cb201296e63e34a78e99d4" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" dependencies = [ - "serde", + "serde_derive", ] [[package]] -name = "serde-json-wasm" -version = "0.5.2" +name = "serde-cw-value" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e9213a07d53faa0b8dd81e767a54a8188a242fdb9be99ab75ec576a774bfdd7" +checksum = "a75d32da6b8ed758b7d850b6c3c08f1d7df51a4df3cb201296e63e34a78e99d4" dependencies = [ - "serde", + "serde 1.0.214", ] [[package]] @@ -2479,49 +2560,60 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f05da0d153dd4595bdffd5099dc0e9ce425b205ee648eb93437ff7302af8c9a5" dependencies = [ - "serde", + "serde 1.0.214", ] [[package]] name = "serde_bytes" -version = "0.11.14" +version = "0.11.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" dependencies = [ - "serde", + "serde 1.0.214", ] [[package]] name = "serde_derive" -version = "1.0.199" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11bd257a6541e141e42ca6d24ae26f7714887b47e89aa739099104c7e4d3b7fc" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.85", ] [[package]] name = "serde_derive_internals" -version = "0.29.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330f01ce65a3a5fe59a60c82f3c9a024b573b8a6e875bd233fe5f934e71d54e3" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.85", +] + +[[package]] +name = "serde_json" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5aaee47e038bf9552d30380d3973fff2593ee0a76d81ad4c581f267cdcadf36" +dependencies = [ + "num", + "serde 0.6.15", ] [[package]] name = "serde_json" -version = "1.0.116" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa", + "memchr", "ryu", - "serde", + "serde 1.0.214", ] [[package]] @@ -2532,7 +2624,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.85", ] [[package]] @@ -2544,7 +2636,7 @@ dependencies = [ "form_urlencoded", "itoa", "ryu", - "serde", + "serde 1.0.214", ] [[package]] @@ -2577,16 +2669,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - [[package]] name = "signature" version = "2.2.0" @@ -2622,16 +2704,6 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -[[package]] -name = "spki" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" -dependencies = [ - "base64ct", - "der 0.6.1", -] - [[package]] name = "spki" version = "0.7.3" @@ -2639,7 +2711,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", - "der 0.7.9", + "der", ] [[package]] @@ -2662,9 +2734,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "subtle-encoding" @@ -2683,27 +2755,23 @@ checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" [[package]] name = "swap-contract" -version = "1.0.2" +version = "1.1.0" dependencies = [ - "cosmos-sdk-proto 0.21.1", "cosmwasm-schema", "cosmwasm-std", - "cosmwasm-storage", - "cw-multi-test", - "cw-storage-plus 0.14.0", - "cw-utils 0.14.0", - "cw2 0.14.0", + "cw-storage-plus", + "cw-utils", + "cw2", "injective-cosmwasm", "injective-math", - "injective-protobuf", "injective-std", "injective-test-tube", - "num-traits", - "prost 0.12.4", - "protobuf", + "injective-testing", + "prost 0.12.6", "schemars", - "serde", - "serde-json-wasm 1.0.1", + "serde 1.0.214", + "serde-json-wasm", + "test-tube-inj", "thiserror", ] @@ -2720,9 +2788,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.60" +version = "2.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" dependencies = [ "proc-macro2", "quote", @@ -2768,18 +2836,18 @@ dependencies = [ "ed25519-consensus", "flex-error", "futures", - "k256 0.13.1", + "k256", "num-traits", "once_cell", - "prost 0.12.4", - "prost-types 0.12.4", + "prost 0.12.6", + "prost-types 0.12.6", "ripemd", - "serde", + "serde 1.0.214", "serde_bytes", - "serde_json", + "serde_json 1.0.132", "serde_repr", "sha2 0.10.8", - "signature 2.2.0", + "signature", "subtle", "subtle-encoding", "tendermint-proto 0.34.1", @@ -2794,8 +2862,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1a02da769166e2052cd537b1a97c78017632c2d9e19266367b27e73910434fc" dependencies = [ "flex-error", - "serde", - "serde_json", + "serde 1.0.214", + "serde_json 1.0.132", "tendermint", "toml", "url", @@ -2809,11 +2877,11 @@ checksum = "c0cec054567d16d85e8c3f6a3139963d1a66d9d3051ed545d31562550e9bcc3d" dependencies = [ "bytes", "flex-error", - "num-derive 0.3.3", + "num-derive", "num-traits", "prost 0.11.9", "prost-types 0.11.9", - "serde", + "serde 1.0.214", "serde_bytes", "subtle-encoding", "time", @@ -2827,29 +2895,11 @@ checksum = "b797dd3d2beaaee91d2f065e7bdf239dc8d80bba4a183a288bc1279dd5a69a1e" dependencies = [ "bytes", "flex-error", - "num-derive 0.3.3", - "num-traits", - "prost 0.12.4", - "prost-types 0.12.4", - "serde", - "serde_bytes", - "subtle-encoding", - "time", -] - -[[package]] -name = "tendermint-proto" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff525d5540a9fc535c38dc0d92a98da3ee36fcdfbda99cecb9f3cce5cd4d41d7" -dependencies = [ - "bytes", - "flex-error", - "num-derive 0.4.2", + "num-derive", "num-traits", - "prost 0.12.4", - "prost-types 0.12.4", - "serde", + "prost 0.12.6", + "prost-types 0.12.6", + "serde 1.0.214", "serde_bytes", "subtle-encoding", "time", @@ -2871,9 +2921,9 @@ dependencies = [ "rand 0.8.5", "reqwest", "semver", - "serde", + "serde 1.0.214", "serde_bytes", - "serde_json", + "serde_json 1.0.132", "subtle", "subtle-encoding", "tendermint", @@ -2899,16 +2949,16 @@ dependencies = [ [[package]] name = "test-tube-inj" -version = "1.1.4" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd5deed958ebd3e60b9d55bb7773442993deac73e15f0354eb5bdab05df14fcb" +checksum = "3c3a4e34619e6417613fab682de9a196848f4a56653ac71b95b5860b6d87c7cd" dependencies = [ - "base64", + "base64 0.21.7", "cosmrs", "cosmwasm-std", - "prost 0.12.4", - "serde", - "serde_json", + "prost 0.12.6", + "serde 1.0.214", + "serde_json 1.0.132", "tendermint-proto 0.32.2", "thiserror", ] @@ -2921,22 +2971,22 @@ checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" [[package]] name = "thiserror" -version = "1.0.59" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" +checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.59" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" +checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.85", ] [[package]] @@ -2948,7 +2998,7 @@ dependencies = [ "deranged", "num-conv", "powerfmt", - "serde", + "serde 1.0.214", "time-core", "time-macros", ] @@ -2980,9 +3030,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -2995,40 +3045,29 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.37.0" +version = "1.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "pin-project-lite", "socket2", "tokio-macros", - "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", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.85", ] [[package]] @@ -3041,29 +3080,17 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-stream" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] @@ -3072,67 +3099,14 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ - "serde", -] - -[[package]] -name = "tonic" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76c4eb7a4e9ef9d4763600161f12f5070b92a578e1b634db88a6887844c91a13" -dependencies = [ - "async-stream", - "async-trait", - "axum", - "base64", - "bytes", - "h2", - "http", - "http-body", - "hyper", - "hyper-timeout", - "percent-encoding", - "pin-project", - "prost 0.12.4", - "tokio", - "tokio-stream", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - -[[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 0.8.5", - "slab", - "tokio", - "tokio-util", - "tower-layer", - "tower-service", - "tracing", + "serde 1.0.214", ] -[[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" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -3141,21 +3115,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.60", -] - [[package]] name = "tracing-core" version = "0.1.32" @@ -3203,25 +3165,31 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "untrusted" version = "0.9.0" @@ -3230,9 +3198,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -3241,15 +3209,15 @@ dependencies = [ [[package]] name = "uuid" -version = "1.8.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "walkdir" @@ -3278,34 +3246,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.85", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", @@ -3315,9 +3284,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3325,28 +3294,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.85", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -3382,11 +3351,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3395,15 +3364,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.5", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -3419,7 +3379,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -3439,18 +3408,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -3461,9 +3430,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -3473,9 +3442,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -3485,15 +3454,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -3503,9 +3472,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -3515,9 +3484,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -3527,9 +3496,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -3539,9 +3508,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winreg" @@ -3553,11 +3522,32 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] @@ -3570,5 +3560,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.85", ] diff --git a/Cargo.toml b/Cargo.toml index d5e73df..363f194 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,9 +2,27 @@ members = [ "contracts/*" ] resolver = "2" -[profile.release.package.injective-cosmwasm] -codegen-units = 1 -incremental = false +[workspace.package] +edition = "2021" + +[workspace.dependencies] +cosmwasm-schema = { version = "2.1.1" } +cosmwasm-std = { version = "2.1.0", features = [ "abort", "cosmwasm_1_2", "cosmwasm_1_3", "cosmwasm_1_4", "iterator", "stargate" ] } +cw-storage-plus = { version = "2.0.0" } +cw-utils = { version = "2.0.0" } +cw2 = { version = "2.0.0" } +injective-cosmwasm = { version = "=0.3.0" } +injective-math = { version = "0.3.0" } +injective-std = { version = "1.13.0" } +injective-test-tube = { version = "1.13.2" } +injective-testing = { version = "1.1.2" } +prost = { version = "0.12.6" } +schemars = { version = "0.8.16", features = [ "enumset" ] } +serde = { version = "1.0.193", default-features = false, features = [ "derive" ] } +serde-json-wasm = { version = "1.0.1" } +serde_json = { version = "1.0.120" } +test-tube-inj = { version = "=2.0.1" } +thiserror = { version = "1.0.52" } [profile.release] codegen-units = 1 @@ -16,7 +34,3 @@ opt-level = 3 overflow-checks = true panic = 'abort' rpath = false - -[patch.crates-io] -#cw-multi-test = { path = "../cw-multi-test" } -#cw-multi-test = { git = "https://github.com/InjectiveLabs/cw-multi-test.git", branch ="feature/custom_address_generator" } diff --git a/Changelog.md b/Changelog.md index b2fc3c4..e18d757 100644 --- a/Changelog.md +++ b/Changelog.md @@ -16,10 +16,11 @@ All notable changes to this project will be documented in this file. - -## [1.0.2] - 2024-03-19 +## [1.1.0] - 2024-10-30 ### Fixed +- Added pagination to `get_all_routes` - Bump version of `serde-json-wasm` ## [1.0.1] - 2024-02-24 diff --git a/Makefile.toml b/Makefile.toml deleted file mode 100644 index 9182c98..0000000 --- a/Makefile.toml +++ /dev/null @@ -1,84 +0,0 @@ -[config] -# Set this to `false` to run the tasks at workspace root directory and not on the members -default_to_workspace = false -# Set this to `true` to avoid clashes with core commands (e.g. `cargo make publish` vs `cargo publish`) -skip_core_tasks = true - -[tasks.fmt] -command = "cargo" -args = ["fmt", "--all", "--check"] - -[tasks.test] -command = "cargo" -args = ["test", "--locked"] - -[tasks.lint] -command = "cargo" -args = ["clippy", "--tests", "--", "-D", "warnings"] - -[tasks.build] -command = "cargo" -args = [ - "build", - "--release", - "--locked", - "--target", "wasm32-unknown-unknown", -] - -# This task requires the `cargo-udeps` package: https://crates.io/crates/cargo-udeps -[tasks.udeps] -toolchain = "nightly" -command = "cargo" -args = ["udeps"] - -# This task requires the `cosmwasm-check` package: https://crates.io/crates/cosmwasm-check -[tasks.check] -script = "cosmwasm-check artifacts/*.wasm" - -# This task requires Docker: https://docs.docker.com/get-docker/ -[tasks.optimize] -script = """ -if [[ $(arch) == "arm64" ]]; then - image="cosmwasm/workspace-optimizer-arm64" -else - image="cosmwasm/workspace-optimizer" -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}:0.12.9 -""" - -# Update the `contracts` array in the script to reflect the content of your project -[tasks.schema] -script = """ -rm -rf schemas -mkdir schemas - -contracts=( - steak-hub -) - -for contract in ${contracts[@]}; do - cargo run --example schema -p $contract - mv schema/$contract.json schemas -done - -rm -rf schema -""" - -# Update the `crates` array in the script to reflect the content of your project -[tasks.publish] -script = """ -crates=( - steak - steak-hub -) - -for crate in ${crates[@]}; do - cargo publish -p $crate - echo "💤 sleeping for 30 sec before publishing the next crate..." - sleep 30 -done -""" diff --git a/contracts/swap/.gitignore b/contracts/swap/.gitignore deleted file mode 100644 index dfdaaa6..0000000 --- a/contracts/swap/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -# Build results -/target - -# Cargo+Git helper file (https://github.com/rust-lang/cargo/blob/0.44.1/src/cargo/sources/git/utils.rs#L320-L327) -.cargo-ok - -# Text file backups -**/*.rs.bk - -# macOS -.DS_Store - -# IDEs -*.iml -.idea diff --git a/contracts/swap/.gitpod.Dockerfile b/contracts/swap/.gitpod.Dockerfile deleted file mode 100644 index bff8bc5..0000000 --- a/contracts/swap/.gitpod.Dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -### wasmd ### -FROM cosmwasm/wasmd:v0.18.0 as wasmd - -### rust-optimizer ### -FROM cosmwasm/rust-optimizer:0.11.5 as rust-optimizer - -FROM gitpod/workspace-full:latest - -COPY --from=wasmd /usr/bin/wasmd /usr/local/bin/wasmd -COPY --from=wasmd /opt/* /opt/ - -RUN sudo apt-get update \ - && sudo apt-get install -y jq \ - && sudo rm -rf /var/lib/apt/lists/* - -RUN rustup update stable \ - && rustup target add wasm32-unknown-unknown diff --git a/contracts/swap/.gitpod.yml b/contracts/swap/.gitpod.yml deleted file mode 100644 index d03610c..0000000 --- a/contracts/swap/.gitpod.yml +++ /dev/null @@ -1,10 +0,0 @@ -image: cosmwasm/cw-gitpod-base:v0.16 - -vscode: - extensions: - - rust-lang.rust - -tasks: - - name: Dependencies & Build - init: | - cargo build diff --git a/contracts/swap/Cargo.toml b/contracts/swap/Cargo.toml index 348ccd7..2cf9965 100644 --- a/contracts/swap/Cargo.toml +++ b/contracts/swap/Cargo.toml @@ -2,7 +2,7 @@ authors = [ "Markus Waas " ] edition = "2021" name = "swap-contract" -version = "1.0.2" +version = "1.1.0" exclude = [ # Those files are rust-optimizer artifacts. You might want to commit them for convenience but they should not be part of the source code publication. @@ -16,31 +16,25 @@ exclude = [ crate-type = [ "cdylib", "rlib" ] [features] -# for more explicit tests, cargo test --features=backtraces -backtraces = [ "cosmwasm-std/backtraces" ] -# use library feature to disable all instantiate/execute/query exports library = [ ] [dependencies] -cosmwasm-std = { version = "1.5.4", features = [ "abort", "cosmwasm_1_2", "cosmwasm_1_3", "cosmwasm_1_4", "iterator", "stargate" ] } -cosmwasm-storage = "1.5.0" -cw-storage-plus = "0.14.0" -cw-utils = "0.14.0" -cw2 = "0.14.0" -injective-cosmwasm = { version = "0.2.18" } -injective-math = { version = "0.2.4" } -injective-protobuf = { version = "0.2.2" } -num-traits = "0.2.15" -protobuf = { version = "2", features = [ "with-bytes" ] } -schemars = "0.8.8" -serde = { version = "1.0.137", default-features = false, features = [ "derive" ] } -serde-json-wasm = "1.0.1" -thiserror = { version = "1.0.31" } +cosmwasm-schema = { workspace = true } +cosmwasm-std = { workspace = true } +cw-storage-plus = { workspace = true } +cw-utils = { workspace = true } +cw2 = { workspace = true } +injective-cosmwasm = { workspace = true } +injective-math = { workspace = true } +injective-std = { workspace = true } +prost = { workspace = true } +schemars = { workspace = true } +serde = { workspace = true } +serde-json-wasm = { workspace = true } +thiserror = { workspace = true } [dev-dependencies] -cosmos-sdk-proto = { version = "0.21.1", features = [ "cosmwasm" ] } -cosmwasm-schema = "1.5.0" -cw-multi-test = "0.16.2" -injective-std = { version = "0.1.7" } -injective-test-tube = "1.2.0" -prost = "0.12.4" +injective-std = { workspace = true } +injective-test-tube = { workspace = true } +injective-testing = { workspace = true } +test-tube-inj = { workspace = true } diff --git a/contracts/swap/rustfmt.toml b/contracts/swap/rustfmt.toml deleted file mode 100644 index 11a85e6..0000000 --- a/contracts/swap/rustfmt.toml +++ /dev/null @@ -1,15 +0,0 @@ -# stable -newline_style = "unix" -hard_tabs = false -tab_spaces = 4 - -# unstable... should we require `rustup run nightly cargo fmt` ? -# or just update the style guide when they are stable? -#fn_single_line = true -#format_code_in_doc_comments = true -#overflow_delimited_expr = true -#reorder_impl_items = true -#struct_field_align_threshold = 20 -#struct_lit_single_line = true -#report_todo = "Always" - diff --git a/contracts/swap/src/admin.rs b/contracts/swap/src/admin.rs index 1289aa6..90aa4ca 100644 --- a/contracts/swap/src/admin.rs +++ b/contracts/swap/src/admin.rs @@ -3,36 +3,22 @@ use crate::state::{remove_swap_route, store_swap_route, CONFIG}; use crate::types::{Config, SwapRoute}; use crate::ContractError; use crate::ContractError::CustomError; -use cosmwasm_std::{ - ensure, ensure_eq, Addr, Attribute, BankMsg, Coin, Deps, DepsMut, Env, Event, Response, - StdResult, -}; +use cosmwasm_std::{ensure, ensure_eq, Addr, Attribute, BankMsg, Coin, Deps, DepsMut, Env, Event, Response, StdResult}; use injective_cosmwasm::{InjectiveMsgWrapper, InjectiveQuerier, InjectiveQueryWrapper, MarketId}; use std::collections::HashSet; -pub fn save_config( - deps: DepsMut, - env: Env, - admin: Addr, - fee_recipient: FeeRecipient, -) -> StdResult<()> { +pub fn save_config(deps: DepsMut, env: Env, admin: Addr, fee_recipient: FeeRecipient) -> StdResult<()> { let fee_recipient = match fee_recipient { FeeRecipient::Address(addr) => addr, FeeRecipient::SwapContract => env.contract.address, }; - let config = Config { - fee_recipient, - admin, - }; + let config = Config { fee_recipient, admin }; config.to_owned().validate()?; CONFIG.save(deps.storage, &config) } -pub fn verify_sender_is_admin( - deps: Deps, - sender: &Addr, -) -> Result<(), ContractError> { +pub fn verify_sender_is_admin(deps: Deps, sender: &Addr) -> Result<(), ContractError> { let config = CONFIG.load(deps.storage)?; ensure_eq!(&config.admin, sender, ContractError::Unauthorized {}); Ok(()) @@ -57,10 +43,7 @@ pub fn update_config( FeeRecipient::Address(addr) => addr, FeeRecipient::SwapContract => env.contract.address, }; - updated_config_event_attrs.push(Attribute::new( - "fee_recipient", - config.fee_recipient.to_string(), - )); + updated_config_event_attrs.push(Attribute::new("fee_recipient", config.fee_recipient.to_string())); } CONFIG.save(deps.storage, &config)?; @@ -108,13 +91,7 @@ pub fn set_route( }); } - if route - .clone() - .into_iter() - .collect::>() - .len() - < route.len() - { + if route.clone().into_iter().collect::>().len() < route.len() { return Err(ContractError::CustomError { val: "Route cannot have duplicate steps!".to_string(), }); @@ -131,10 +108,7 @@ pub fn set_route( Ok(Response::new().add_attribute("method", "set_route")) } -fn verify_route_exists( - deps: Deps, - route: &SwapRoute, -) -> Result<(), ContractError> { +fn verify_route_exists(deps: Deps, route: &SwapRoute) -> Result<(), ContractError> { struct MarketDenom { quote_denom: String, base_denom: String, @@ -143,12 +117,9 @@ fn verify_route_exists( let querier = InjectiveQuerier::new(&deps.querier); for market_id in route.steps.iter() { - let market = querier - .query_spot_market(market_id)? - .market - .ok_or(CustomError { - val: format!("Market {} not found", market_id.as_str()).to_string(), - })?; + let market = querier.query_spot_market(market_id)?.market.ok_or(CustomError { + val: format!("Market {} not found", market_id.as_str()).to_string(), + })?; denoms.push(MarketDenom { quote_denom: market.quote_denom, @@ -164,15 +135,13 @@ fn verify_route_exists( } ); ensure!( - denoms.first().unwrap().quote_denom == route.source_denom - || denoms.first().unwrap().base_denom == route.source_denom, + denoms.first().unwrap().quote_denom == route.source_denom || denoms.first().unwrap().base_denom == route.source_denom, CustomError { val: "Source denom not found in first market".to_string() } ); ensure!( - denoms.last().unwrap().quote_denom == route.target_denom - || denoms.last().unwrap().base_denom == route.target_denom, + denoms.last().unwrap().quote_denom == route.target_denom || denoms.last().unwrap().base_denom == route.target_denom, CustomError { val: "Target denom not found in last market".to_string() } diff --git a/contracts/swap/src/contract.rs b/contracts/swap/src/contract.rs index e4c184f..88d9f23 100644 --- a/contracts/swap/src/contract.rs +++ b/contracts/swap/src/contract.rs @@ -1,22 +1,17 @@ -#[cfg(not(feature = "library"))] -use cosmwasm_std::entry_point; -use cosmwasm_std::{ - to_json_binary, Binary, Deps, DepsMut, Env, MessageInfo, Reply, Response, StdResult, +use crate::{ + admin::{delete_route, save_config, set_route, update_config, withdraw_support_funds}, + error::ContractError, + msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}, + queries::{estimate_swap_result, SwapQuantity}, + state::{get_all_swap_routes, get_config, read_swap_route}, + swap::{handle_atomic_order_reply, start_swap_flow}, + types::{ConfigResponse, SwapQuantityMode}, }; -use cw2::{get_contract_version, set_contract_version}; -use crate::admin::{delete_route, save_config, set_route, update_config, withdraw_support_funds}; -use crate::helpers::handle_config_migration; -use crate::types::{ConfigResponse, SwapQuantityMode}; +use cosmwasm_std::{entry_point, to_json_binary, Binary, Deps, DepsMut, Env, MessageInfo, Reply, Response, StdError}; +use cw2::{get_contract_version, set_contract_version}; use injective_cosmwasm::{InjectiveMsgWrapper, InjectiveQueryWrapper}; -use crate::error::ContractError; - -use crate::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; -use crate::queries::{estimate_swap_result, SwapQuantity}; -use crate::state::{get_all_swap_routes, get_config, read_swap_route}; -use crate::swap::{handle_atomic_order_reply, start_swap_flow}; - pub const CONTRACT_NAME: &str = env!("CARGO_PKG_NAME"); pub const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -33,9 +28,7 @@ pub fn instantiate( set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; save_config(deps, env, msg.admin, msg.fee_recipient)?; - Ok(Response::new() - .add_attribute("method", "instantiate") - .add_attribute("owner", info.sender)) + Ok(Response::new().add_attribute("method", "instantiate").add_attribute("owner", info.sender)) } #[cfg_attr(not(feature = "library"), entry_point)] @@ -49,13 +42,7 @@ pub fn execute( ExecuteMsg::SwapMinOutput { target_denom, min_output_quantity, - } => start_swap_flow( - deps, - env, - info, - target_denom, - SwapQuantityMode::MinOutputQuantity(min_output_quantity), - ), + } => start_swap_flow(deps, env, info, target_denom, SwapQuantityMode::MinOutputQuantity(min_output_quantity)), ExecuteMsg::SwapExactOutput { target_denom, target_output_quantity, @@ -72,27 +59,14 @@ pub fn execute( target_denom, route, } => set_route(deps, &info.sender, source_denom, target_denom, route), - ExecuteMsg::DeleteRoute { - source_denom, - target_denom, - } => delete_route(deps, &info.sender, source_denom, target_denom), - ExecuteMsg::UpdateConfig { - admin, - fee_recipient, - } => update_config(deps, env, info.sender, admin, fee_recipient), - ExecuteMsg::WithdrawSupportFunds { - coins, - target_address, - } => withdraw_support_funds(deps, info.sender, coins, target_address), + ExecuteMsg::DeleteRoute { source_denom, target_denom } => delete_route(deps, &info.sender, source_denom, target_denom), + ExecuteMsg::UpdateConfig { admin, fee_recipient } => update_config(deps, env, info.sender, admin, fee_recipient), + ExecuteMsg::WithdrawSupportFunds { coins, target_address } => withdraw_support_funds(deps, info.sender, coins, target_address), } } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn reply( - deps: DepsMut, - env: Env, - msg: Reply, -) -> Result, ContractError> { +pub fn reply(deps: DepsMut, env: Env, msg: Reply) -> Result, ContractError> { match msg.id { ATOMIC_ORDER_REPLY_ID => handle_atomic_order_reply(deps, env, msg), _ => Err(ContractError::UnrecognizedReply(msg.id)), @@ -100,97 +74,35 @@ pub fn reply( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate( - deps: DepsMut, - _env: Env, - _msg: MigrateMsg, -) -> Result { - let contract_version = get_contract_version(deps.storage)?; - - match contract_version.contract.as_ref() { - // old contract name - "crates.io:atomic-order-example" => match contract_version.version.as_ref() { - "0.1.0" => { - unimplemented!( - "Migration from version {} is no longer supported", - contract_version.version - ); - } - "1.0.0" => { - set_contract_version( - deps.storage, - format!("crates.io:{CONTRACT_NAME}"), - CONTRACT_VERSION, - )?; - - handle_config_migration(deps)?; - } - _ => return Err(ContractError::MigrationError {}), - }, - "crates.io:swap-contract" => match contract_version.version.as_ref() { - "1.0.1" => { - // No further updates needed - set_contract_version( - deps.storage, - format!("crates.io:{CONTRACT_NAME}"), - CONTRACT_VERSION, - )?; - } - _ => return Err(ContractError::MigrationError {}), - }, - _ => return Err(ContractError::MigrationError {}), - } - - Ok(Response::new() - .add_attribute("previous_contract_name", &contract_version.contract) - .add_attribute("previous_contract_version", &contract_version.version) - .add_attribute("new_contract_name", format!("crates.io:{CONTRACT_NAME}")) - .add_attribute("new_contract_version", CONTRACT_VERSION)) -} - -#[cfg_attr(not(feature = "library"), entry_point)] -pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { +pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result { match msg { - QueryMsg::GetRoute { - source_denom, - target_denom, - } => Ok(to_json_binary(&read_swap_route( - deps.storage, - &source_denom, - &target_denom, - )?)?), + QueryMsg::GetRoute { source_denom, target_denom } => to_json_binary(&read_swap_route(deps.storage, &source_denom, &target_denom)?), QueryMsg::GetOutputQuantity { from_quantity, source_denom, target_denom, - } => { - let target_quantity = estimate_swap_result( - deps, - &env, - source_denom, - target_denom, - SwapQuantity::InputQuantity(from_quantity), - )?; - Ok(to_json_binary(&target_quantity)?) - } + } => to_json_binary(&estimate_swap_result( + deps, + &env, + source_denom, + target_denom, + SwapQuantity::InputQuantity(from_quantity), + )?), + QueryMsg::GetInputQuantity { to_quantity, source_denom, target_denom, - } => { - let target_quantity = estimate_swap_result( - deps, - &env, - source_denom, - target_denom, - SwapQuantity::OutputQuantity(to_quantity), - )?; - Ok(to_json_binary(&target_quantity)?) - } - QueryMsg::GetAllRoutes {} => { - let routes = get_all_swap_routes(deps.storage)?; - Ok(to_json_binary(&routes)?) - } + } => to_json_binary(&estimate_swap_result( + deps, + &env, + source_denom, + target_denom, + SwapQuantity::OutputQuantity(to_quantity), + )?), + + QueryMsg::GetAllRoutes { start_after, limit } => to_json_binary(&get_all_swap_routes(deps.storage, start_after, limit)?), + QueryMsg::GetConfig {} => { let config = get_config(deps.storage)?; let config_response = ConfigResponse { @@ -201,3 +113,24 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdR } } } + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { + let contract_version = get_contract_version(deps.storage)?; + + match contract_version.contract.as_ref() { + "crates.io:swap-contract" => match contract_version.version.as_ref() { + "1.0.1" => { + set_contract_version(deps.storage, format!("crates.io:{CONTRACT_NAME}"), CONTRACT_VERSION)?; + } + _ => return Err(ContractError::MigrationError {}), + }, + _ => return Err(ContractError::MigrationError {}), + } + + Ok(Response::new() + .add_attribute("previous_contract_name", &contract_version.contract) + .add_attribute("previous_contract_version", &contract_version.version) + .add_attribute("new_contract_name", format!("crates.io:{CONTRACT_NAME}")) + .add_attribute("new_contract_version", CONTRACT_VERSION)) +} diff --git a/contracts/swap/src/helpers.rs b/contracts/swap/src/helpers.rs index 498bedc..a460955 100644 --- a/contracts/swap/src/helpers.rs +++ b/contracts/swap/src/helpers.rs @@ -10,10 +10,7 @@ pub fn i32_to_dec(source: i32) -> FPDecimal { FPDecimal::from(i128::from(source)) } -pub fn get_message_data( - response: &[SubMsg], - position: usize, -) -> &InjectiveMsgWrapper { +pub fn get_message_data(response: &[SubMsg], position: usize) -> &InjectiveMsgWrapper { let sth = match &response.get(position).unwrap().msg { CosmosMsg::Custom(msg) => msg, _ => panic!("No wrapped message found"), @@ -41,10 +38,7 @@ pub trait Scaled { impl Scaled for FPDecimal { fn scaled(self, digits: i32) -> Self { - self.to_owned() - * FPDecimal::from(10i128) - .pow(FPDecimal::from(digits as i128)) - .unwrap() + self.to_owned() * FPDecimal::from(10i128).pow(FPDecimal::from(digits as i128)).unwrap() } } @@ -55,9 +49,7 @@ pub fn dec_scale_factor() -> FPDecimal { type V100Config = Config; const V100CONFIG: Item = Item::new("config"); -pub fn handle_config_migration( - deps: DepsMut, -) -> Result { +pub fn handle_config_migration(deps: DepsMut) -> Result { let v100_config = V100CONFIG.load(deps.storage)?; let config = Config { diff --git a/contracts/swap/src/msg.rs b/contracts/swap/src/msg.rs index 37590b7..281c2f3 100644 --- a/contracts/swap/src/msg.rs +++ b/contracts/swap/src/msg.rs @@ -1,28 +1,24 @@ +use cosmwasm_schema::cw_serde; use cosmwasm_std::{Addr, Coin}; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; - use injective_cosmwasm::MarketId; use injective_math::FPDecimal; -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] +#[cw_serde] pub enum FeeRecipient { Address(Addr), SwapContract, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[cw_serde] pub struct InstantiateMsg { pub fee_recipient: FeeRecipient, pub admin: Addr, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[cw_serde] pub struct MigrateMsg {} -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] +#[cw_serde] pub enum ExecuteMsg { SwapMinOutput { target_denom: String, @@ -51,8 +47,7 @@ pub enum ExecuteMsg { }, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] +#[cw_serde] pub enum QueryMsg { GetRoute { source_denom: String, @@ -68,6 +63,9 @@ pub enum QueryMsg { source_denom: String, target_denom: String, }, - GetAllRoutes {}, + GetAllRoutes { + start_after: Option<(String, String)>, + limit: Option, + }, GetConfig {}, } diff --git a/contracts/swap/src/queries.rs b/contracts/swap/src/queries.rs index dbce82d..fa1ce87 100644 --- a/contracts/swap/src/queries.rs +++ b/contracts/swap/src/queries.rs @@ -1,7 +1,5 @@ use cosmwasm_std::{Addr, Deps, Env, StdError, StdResult}; -use injective_cosmwasm::{ - InjectiveQuerier, InjectiveQueryWrapper, MarketId, OrderSide, PriceLevel, SpotMarket, -}; +use injective_cosmwasm::{InjectiveQuerier, InjectiveQueryWrapper, MarketId, OrderSide, PriceLevel, SpotMarket}; use injective_math::utils::round_to_min_tick; use injective_math::FPDecimal; @@ -65,12 +63,8 @@ pub fn estimate_swap_result( env, &step, match swap_quantity { - SwapQuantity::InputQuantity(_) => { - SwapEstimationAmount::InputQuantity(current_swap.clone()) - } - SwapQuantity::OutputQuantity(_) => { - SwapEstimationAmount::ReceiveQuantity(current_swap.clone()) - } + SwapQuantity::InputQuantity(_) => SwapEstimationAmount::InputQuantity(current_swap.clone()), + SwapQuantity::OutputQuantity(_) => SwapEstimationAmount::ReceiveQuantity(current_swap.clone()), }, true, )?; @@ -78,9 +72,7 @@ pub fn estimate_swap_result( current_swap.amount = swap_estimate.result_quantity; current_swap.denom = swap_estimate.result_denom; - let step_fee = swap_estimate - .fee_estimate - .expect("fee estimate should be available"); + let step_fee = swap_estimate.fee_estimate.expect("fee estimate should be available"); fees.push(step_fee); } @@ -105,34 +97,21 @@ pub fn estimate_single_swap_execution( SwapEstimationAmount::ReceiveQuantity(fp) => fp, }; - let market = querier - .query_spot_market(market_id)? - .market - .expect("market should be available"); + let market = querier.query_spot_market(market_id)?.market.expect("market should be available"); - let has_invalid_denom = - balance_in.denom != market.quote_denom && balance_in.denom != market.base_denom; + let has_invalid_denom = balance_in.denom != market.quote_denom && balance_in.denom != market.base_denom; if has_invalid_denom { - return Err(StdError::generic_err( - "Invalid swap denom - neither base nor quote", - )); + return Err(StdError::generic_err("Invalid swap denom - neither base nor quote")); } let config = CONFIG.load(deps.storage)?; let is_self_relayer = config.fee_recipient == env.contract.address; - let fee_multiplier = querier - .query_market_atomic_execution_fee_multiplier(market_id)? - .multiplier; + let fee_multiplier = querier.query_market_atomic_execution_fee_multiplier(market_id)?.multiplier; - let fee_percent = market.taker_fee_rate - * fee_multiplier - * (FPDecimal::ONE - get_effective_fee_discount_rate(&market, is_self_relayer)); + let fee_percent = market.taker_fee_rate * fee_multiplier * (FPDecimal::ONE - get_effective_fee_discount_rate(&market, is_self_relayer)); - let is_estimating_from_target = matches!( - swap_estimation_amount, - SwapEstimationAmount::ReceiveQuantity(_) - ); + let is_estimating_from_target = matches!(swap_estimation_amount, SwapEstimationAmount::ReceiveQuantity(_)); let is_buy = if is_estimating_from_target { balance_in.denom == market.base_denom @@ -166,12 +145,7 @@ fn estimate_execution_buy_from_source( ) -> StdResult { let available_swap_quote_funds = input_quote_quantity / (FPDecimal::ONE + fee_percent); - let orders = querier.query_spot_market_orderbook( - &market.market_id, - OrderSide::Sell, - None, - Some(available_swap_quote_funds), - )?; + let orders = querier.query_spot_market_orderbook(&market.market_id, OrderSide::Sell, None, Some(available_swap_quote_funds))?; let top_orders = get_minimum_liquidity_levels( deps, &orders.sells_price_level, @@ -181,8 +155,7 @@ fn estimate_execution_buy_from_source( )?; // lets overestimate amount for buys means rounding average price up -> higher buy price -> worse - let average_price = - get_average_price_from_orders(&top_orders, market.min_price_tick_size, true); + let average_price = get_average_price_from_orders(&top_orders, market.min_price_tick_size, true); let worst_price = get_worst_price_from_orders(&top_orders); let expected_base_quantity = available_swap_quote_funds / average_price; @@ -230,15 +203,9 @@ fn estimate_execution_buy_from_target( fee_percent: FPDecimal, is_simulation: bool, ) -> StdResult { - let rounded_target_base_output_quantity = - round_up_to_min_tick(target_base_output_quantity, market.min_quantity_tick_size); - - let orders = querier.query_spot_market_orderbook( - &market.market_id, - OrderSide::Sell, - Some(rounded_target_base_output_quantity), - None, - )?; + let rounded_target_base_output_quantity = round_up_to_min_tick(target_base_output_quantity, market.min_quantity_tick_size); + + let orders = querier.query_spot_market_orderbook(&market.market_id, OrderSide::Sell, Some(rounded_target_base_output_quantity), None)?; let top_orders = get_minimum_liquidity_levels( deps, &orders.sells_price_level, @@ -248,8 +215,7 @@ fn estimate_execution_buy_from_target( )?; // lets overestimate amount for buys means rounding average price up -> higher buy price -> worse - let average_price = - get_average_price_from_orders(&top_orders, market.min_price_tick_size, true); + let average_price = get_average_price_from_orders(&top_orders, market.min_price_tick_size, true); let worst_price = get_worst_price_from_orders(&top_orders); let expected_exchange_quote_quantity = rounded_target_base_output_quantity * average_price; @@ -257,8 +223,7 @@ fn estimate_execution_buy_from_target( let required_input_quote_quantity = expected_exchange_quote_quantity + fee_estimate; // check if user funds + contract funds are enough to create order - let required_funds = - worst_price * rounded_target_base_output_quantity * (FPDecimal::ONE + fee_percent); + let required_funds = worst_price * rounded_target_base_output_quantity * (FPDecimal::ONE + fee_percent); let funds_in_contract = deps .querier @@ -304,31 +269,12 @@ fn estimate_execution_buy( SwapEstimationAmount::ReceiveQuantity(fp) => fp, }; - let is_estimating_from_target = matches!( - swap_estimation_amount, - SwapEstimationAmount::ReceiveQuantity(_) - ); + let is_estimating_from_target = matches!(swap_estimation_amount, SwapEstimationAmount::ReceiveQuantity(_)); if is_estimating_from_target { - estimate_execution_buy_from_target( - deps, - querier, - contract_address, - market, - amount_coin.amount, - fee_percent, - is_simulation, - ) + estimate_execution_buy_from_target(deps, querier, contract_address, market, amount_coin.amount, fee_percent, is_simulation) } else { - estimate_execution_buy_from_source( - deps, - querier, - contract_address, - market, - amount_coin.amount, - fee_percent, - is_simulation, - ) + estimate_execution_buy_from_source(deps, querier, contract_address, market, amount_coin.amount, fee_percent, is_simulation) } } @@ -339,12 +285,7 @@ fn estimate_execution_sell_from_source( input_base_quantity: FPDecimal, fee_percent: FPDecimal, ) -> StdResult { - let orders = querier.query_spot_market_orderbook( - &market.market_id, - OrderSide::Buy, - Some(input_base_quantity), - None, - )?; + let orders = querier.query_spot_market_orderbook(&market.market_id, OrderSide::Buy, Some(input_base_quantity), None)?; let top_orders = get_minimum_liquidity_levels( deps, @@ -355,8 +296,7 @@ fn estimate_execution_sell_from_source( )?; // lets overestimate amount for sells means rounding average price down -> lower sell price -> worse - let average_price = - get_average_price_from_orders(&top_orders, market.min_price_tick_size, false); + let average_price = get_average_price_from_orders(&top_orders, market.min_price_tick_size, false); let worst_price = get_worst_price_from_orders(&top_orders); let expected_exchange_quantity = input_base_quantity * average_price; @@ -382,16 +322,10 @@ fn estimate_execution_sell_from_target( target_quote_output_quantity: FPDecimal, fee_percent: FPDecimal, ) -> StdResult { - let required_swap_quantity_in_quote = - target_quote_output_quantity / (FPDecimal::ONE - fee_percent); + let required_swap_quantity_in_quote = target_quote_output_quantity / (FPDecimal::ONE - fee_percent); let required_fee = required_swap_quantity_in_quote - target_quote_output_quantity; - let orders = querier.query_spot_market_orderbook( - &market.market_id, - OrderSide::Buy, - None, - Some(required_swap_quantity_in_quote), - )?; + let orders = querier.query_spot_market_orderbook(&market.market_id, OrderSide::Buy, None, Some(required_swap_quantity_in_quote))?; let top_orders = get_minimum_liquidity_levels( deps, &orders.buys_price_level, @@ -401,18 +335,14 @@ fn estimate_execution_sell_from_target( )?; // lets overestimate amount for sells means rounding average price down -> lower sell price -> worse - let average_price = - get_average_price_from_orders(&top_orders, market.min_price_tick_size, false); + let average_price = get_average_price_from_orders(&top_orders, market.min_price_tick_size, false); let worst_price = get_worst_price_from_orders(&top_orders); let required_swap_input_quantity_in_base = required_swap_quantity_in_quote / average_price; Ok(StepExecutionEstimate { worst_price, - result_quantity: round_up_to_min_tick( - required_swap_input_quantity_in_base, - market.min_quantity_tick_size, - ), + result_quantity: round_up_to_min_tick(required_swap_input_quantity_in_base, market.min_quantity_tick_size), result_denom: market.base_denom.to_string(), is_buy_order: false, fee_estimate: Some(FPCoin { @@ -434,10 +364,7 @@ fn estimate_execution_sell( SwapEstimationAmount::ReceiveQuantity(fp) => fp, }; - let is_estimating_from_target = matches!( - swap_estimation_amount, - SwapEstimationAmount::ReceiveQuantity(_) - ); + let is_estimating_from_target = matches!(swap_estimation_amount, SwapEstimationAmount::ReceiveQuantity(_)); if is_estimating_from_target { estimate_execution_sell_from_target(deps, querier, market, amount_coin.amount, fee_percent) @@ -458,11 +385,7 @@ pub fn get_minimum_liquidity_levels( for level in levels { let value = calc(level); - assert_ne!( - value, - FPDecimal::ZERO, - "Price level with zero value, this should not happen" - ); + assert_ne!(value, FPDecimal::ZERO, "Price level with zero value, this should not happen"); let order_to_add = if sum + value > total { let excess = value + sum - total; @@ -488,24 +411,16 @@ pub fn get_minimum_liquidity_levels( } if sum < total { - return Err(StdError::generic_err( - "Not enough liquidity to fulfill order", - )); + return Err(StdError::generic_err("Not enough liquidity to fulfill order")); } Ok(orders) } -fn get_average_price_from_orders( - levels: &[PriceLevel], - min_price_tick_size: FPDecimal, - is_rounding_up: bool, -) -> FPDecimal { +fn get_average_price_from_orders(levels: &[PriceLevel], min_price_tick_size: FPDecimal, is_rounding_up: bool) -> FPDecimal { let (total_quantity, total_notional) = levels .iter() - .fold((FPDecimal::ZERO, FPDecimal::ZERO), |acc, pl| { - (acc.0 + pl.q, acc.1 + pl.p * pl.q) - }); + .fold((FPDecimal::ZERO, FPDecimal::ZERO), |acc, pl| (acc.0 + pl.q, acc.1 + pl.p * pl.q)); assert_ne!( total_quantity, @@ -543,11 +458,7 @@ mod tests { #[test] fn test_average_price_simple() { - let levels = vec![ - create_price_level(1, 200), - create_price_level(2, 200), - create_price_level(3, 200), - ]; + let levels = vec![create_price_level(1, 200), create_price_level(2, 200), create_price_level(3, 200)]; let avg = get_average_price_from_orders(&levels, FPDecimal::must_from_str("0.01"), false); assert_eq!(avg, FPDecimal::from(2u128)); @@ -555,11 +466,7 @@ mod tests { #[test] fn test_average_price_simple_round_down() { - let levels = vec![ - create_price_level(1, 300), - create_price_level(2, 200), - create_price_level(3, 100), - ]; + let levels = vec![create_price_level(1, 300), create_price_level(2, 200), create_price_level(3, 100)]; let avg = get_average_price_from_orders(&levels, FPDecimal::must_from_str("0.01"), false); assert_eq!(avg, FPDecimal::must_from_str("1.66")); //we round down @@ -567,11 +474,7 @@ mod tests { #[test] fn test_average_price_simple_round_up() { - let levels = vec![ - create_price_level(1, 300), - create_price_level(2, 200), - create_price_level(3, 100), - ]; + let levels = vec![create_price_level(1, 300), create_price_level(2, 200), create_price_level(3, 100)]; let avg = get_average_price_from_orders(&levels, FPDecimal::must_from_str("0.01"), true); assert_eq!(avg, FPDecimal::must_from_str("1.67")); //we round up @@ -579,11 +482,7 @@ mod tests { #[test] fn test_worst_price() { - let levels = vec![ - create_price_level(1, 100), - create_price_level(2, 200), - create_price_level(3, 300), - ]; + let levels = vec![create_price_level(1, 100), create_price_level(2, 200), create_price_level(3, 300)]; let worst = get_worst_price_from_orders(&levels); assert_eq!(worst, FPDecimal::from(3u128)); @@ -601,19 +500,12 @@ mod tests { FPDecimal::must_from_str("0.01"), ); assert!(result.is_err()); - assert_eq!( - result.unwrap_err(), - StdError::generic_err("Not enough liquidity to fulfill order") - ); + assert_eq!(result.unwrap_err(), StdError::generic_err("Not enough liquidity to fulfill order")); } #[test] fn test_find_minimum_orders_with_gaps() { - let levels = vec![ - create_price_level(1, 100), - create_price_level(3, 300), - create_price_level(5, 500), - ]; + let levels = vec![create_price_level(1, 100), create_price_level(3, 300), create_price_level(5, 500)]; let result = get_minimum_liquidity_levels( &inj_mock_deps(|_| {}).as_ref(), @@ -632,11 +524,7 @@ mod tests { #[test] fn test_find_minimum_buy_orders_not_consuming_fully() { - let levels = vec![ - create_price_level(1, 100), - create_price_level(3, 300), - create_price_level(5, 500), - ]; + let levels = vec![create_price_level(1, 100), create_price_level(3, 300), create_price_level(5, 500)]; let result = get_minimum_liquidity_levels( &inj_mock_deps(|_| {}).as_ref(), @@ -658,11 +546,7 @@ mod tests { #[test] fn test_find_minimum_sell_orders_not_consuming_fully() { - let buy_levels = vec![ - create_price_level(5, 500), - create_price_level(3, 300), - create_price_level(1, 100), - ]; + let buy_levels = vec![create_price_level(5, 500), create_price_level(3, 300), create_price_level(1, 100)]; let result = get_minimum_liquidity_levels( &inj_mock_deps(|_| {}).as_ref(), diff --git a/contracts/swap/src/state.rs b/contracts/swap/src/state.rs index bcc85a2..e423d20 100644 --- a/contracts/swap/src/state.rs +++ b/contracts/swap/src/state.rs @@ -1,14 +1,16 @@ -use cosmwasm_std::{Order, StdError, StdResult, Storage}; -use cw_storage_plus::{Item, Map}; - use crate::types::{Config, CurrentSwapOperation, CurrentSwapStep, SwapResults, SwapRoute}; +use cosmwasm_std::{Order, StdError, StdResult, Storage}; +use cw_storage_plus::{Bound, Item, Map}; + pub const SWAP_ROUTES: Map<(String, String), SwapRoute> = Map::new("swap_routes"); pub const SWAP_OPERATION_STATE: Item = Item::new("current_swap_cache"); pub const STEP_STATE: Item = Item::new("current_step_cache"); pub const SWAP_RESULTS: Item> = Item::new("swap_results"); pub const CONFIG: Item = Item::new("config"); +pub const DEFAULT_LIMIT: u32 = 100u32; + impl Config { pub fn validate(self) -> StdResult<()> { Ok(()) @@ -20,17 +22,11 @@ pub fn store_swap_route(storage: &mut dyn Storage, route: &SwapRoute) -> StdResu SWAP_ROUTES.save(storage, key, route) } -pub fn read_swap_route( - storage: &dyn Storage, - source_denom: &str, - target_denom: &str, -) -> StdResult { +pub fn read_swap_route(storage: &dyn Storage, source_denom: &str, target_denom: &str) -> StdResult { let key = route_key(source_denom, target_denom); - SWAP_ROUTES.load(storage, key).map_err(|_| { - StdError::generic_err(format!( - "No swap route not found from {source_denom} to {target_denom}", - )) - }) + SWAP_ROUTES + .load(storage, key) + .map_err(|_| StdError::generic_err(format!("No swap route not found from {source_denom} to {target_denom}",))) } pub fn get_config(storage: &dyn Storage) -> StdResult { @@ -38,11 +34,16 @@ pub fn get_config(storage: &dyn Storage) -> StdResult { Ok(config) } -pub fn get_all_swap_routes(storage: &dyn Storage) -> StdResult> { +pub fn get_all_swap_routes(storage: &dyn Storage, start_after: Option<(String, String)>, limit: Option) -> StdResult> { + let limit = limit.unwrap_or(DEFAULT_LIMIT) as usize; + + let start_bound = start_after.as_ref().map(|(s, t)| Bound::inclusive((s.clone(), t.clone()))); + let routes = SWAP_ROUTES - .range(storage, None, None, Order::Ascending) - .map(|item| item.unwrap().1) - .collect(); + .range(storage, start_bound, None, Order::Ascending) + .take(limit) + .map(|item| item.map(|(_, route)| route)) // Extract the `SwapRoute` from each item + .collect::>>()?; Ok(routes) } diff --git a/contracts/swap/src/swap.rs b/contracts/swap/src/swap.rs index 7c3f2b3..89b9826 100644 --- a/contracts/swap/src/swap.rs +++ b/contracts/swap/src/swap.rs @@ -1,28 +1,21 @@ -use std::str::FromStr; - -use cosmwasm_std::{ - BankMsg, Coin, DepsMut, Env, Event, MessageInfo, Reply, Response, StdResult, SubMsg, Uint128, +use crate::{ + contract::ATOMIC_ORDER_REPLY_ID, + error::ContractError, + helpers::{dec_scale_factor, round_up_to_min_tick}, + queries::{estimate_single_swap_execution, estimate_swap_result, SwapQuantity}, + state::{read_swap_route, CONFIG, STEP_STATE, SWAP_OPERATION_STATE, SWAP_RESULTS}, + types::{CurrentSwapOperation, CurrentSwapStep, FPCoin, SwapEstimationAmount, SwapQuantityMode, SwapResults}, }; -use protobuf::Message; - -use crate::contract::ATOMIC_ORDER_REPLY_ID; +use cosmwasm_std::{BankMsg, Coin, DepsMut, Env, Event, MessageInfo, Reply, Response, StdResult, SubMsg}; use injective_cosmwasm::{ - create_spot_market_order_msg, get_default_subaccount_id_for_checked_address, - InjectiveMsgWrapper, InjectiveQuerier, InjectiveQueryWrapper, OrderType, SpotOrder, + create_spot_market_order_msg, get_default_subaccount_id_for_checked_address, InjectiveMsgWrapper, InjectiveQuerier, InjectiveQueryWrapper, + OrderType, SpotOrder, }; use injective_math::{round_to_min_tick, FPDecimal}; -use injective_protobuf::proto::tx; - -use crate::error::ContractError; -use crate::helpers::{dec_scale_factor, round_up_to_min_tick}; - -use crate::queries::{estimate_single_swap_execution, estimate_swap_result, SwapQuantity}; -use crate::state::{read_swap_route, CONFIG, STEP_STATE, SWAP_OPERATION_STATE, SWAP_RESULTS}; -use crate::types::{ - CurrentSwapOperation, CurrentSwapStep, FPCoin, SwapEstimationAmount, SwapQuantityMode, - SwapResults, -}; +use injective_std::types::injective::exchange::v1beta1::MsgCreateSpotMarketOrderResponse; +use prost::Message; +use std::str::FromStr; pub fn start_swap_flow( deps: DepsMut, @@ -56,10 +49,7 @@ pub fn start_swap_flow( let mut current_balance = coin_provided.to_owned().into(); - let refund_amount = if matches!( - swap_quantity_mode, - SwapQuantityMode::ExactOutputQuantity(..) - ) { + let refund_amount = if matches!(swap_quantity_mode, SwapQuantityMode::ExactOutputQuantity(..)) { let target_output_quantity = quantity; let estimation = estimate_swap_result( @@ -72,29 +62,20 @@ pub fn start_swap_flow( let querier = InjectiveQuerier::new(&deps.querier); let first_market_id = steps[0].to_owned(); - let first_market = querier - .query_spot_market(&first_market_id)? - .market - .expect("market should be available"); + let first_market = querier.query_spot_market(&first_market_id)?.market.expect("market should be available"); let is_input_quote = first_market.quote_denom == *source_denom; let required_input = if is_input_quote { estimation.result_quantity.int() + FPDecimal::ONE } else { - round_up_to_min_tick( - estimation.result_quantity, - first_market.min_quantity_tick_size, - ) + round_up_to_min_tick(estimation.result_quantity, first_market.min_quantity_tick_size) }; let fp_coins: FPDecimal = coin_provided.amount.into(); if required_input > fp_coins { - return Err(ContractError::InsufficientFundsProvided( - fp_coins, - required_input, - )); + return Err(ContractError::InsufficientFundsProvided(fp_coins, required_input)); } current_balance = FPCoin { @@ -111,7 +92,7 @@ pub fn start_swap_flow( sender_address, swap_steps: steps, swap_quantity_mode, - refund: Coin::new(refund_amount.into(), source_denom.to_owned()), + refund: Coin::new(refund_amount, source_denom.to_owned()), input_funds: coin_provided.to_owned(), }; @@ -160,10 +141,7 @@ pub fn execute_swap_step( None, ); - let order_message = SubMsg::reply_on_success( - create_spot_market_order_msg(contract.to_owned(), order), - ATOMIC_ORDER_REPLY_ID, - ); + let order_message = SubMsg::reply_on_success(create_spot_market_order_msg(contract.to_owned(), order), ATOMIC_ORDER_REPLY_ID); let current_step = CurrentSwapStep { step_idx, @@ -177,30 +155,12 @@ pub fn execute_swap_step( Ok(response) } -pub fn handle_atomic_order_reply( - deps: DepsMut, - env: Env, - msg: Reply, -) -> Result, ContractError> { +pub fn handle_atomic_order_reply(deps: DepsMut, env: Env, msg: Reply) -> Result, ContractError> { let dec_scale_factor = dec_scale_factor(); // protobuf serializes Dec values with extra 10^18 factor - let id = msg.id; - let order_response: tx::MsgCreateSpotMarketOrderResponse = Message::parse_from_bytes( - msg.result - .into_result() - .map_err(ContractError::SubMsgFailure)? - .data - .ok_or_else(|| ContractError::ReplyParseFailure { - id, - err: "Missing reply data".to_owned(), - })? - .as_slice(), - ) - .map_err(|err| ContractError::ReplyParseFailure { - id, - err: err.to_string(), - })?; - - let trade_data = match order_response.results.into_option() { + + let order_response = parse_market_order_response(msg)?; + + let trade_data = match order_response.results { Some(trade_data) => Ok(trade_data), None => Err(ContractError::CustomError { val: "No trade data in order response".to_string(), @@ -216,11 +176,7 @@ pub fn handle_atomic_order_reply( let current_step = STEP_STATE.load(deps.storage).map_err(ContractError::Std)?; - let new_quantity = if current_step.is_buy { - quantity - } else { - quantity * average_price - fee - }; + let new_quantity = if current_step.is_buy { quantity } else { quantity * average_price - fee }; let swap = SWAP_OPERATION_STATE.load(deps.storage)?; @@ -229,10 +185,7 @@ pub fn handle_atomic_order_reply( let new_rounded_quantity = if has_next_market { let querier = InjectiveQuerier::new(&deps.querier); let next_market_id = swap.swap_steps[(current_step.step_idx + 1) as usize].to_owned(); - let next_market = querier - .query_spot_market(&next_market_id)? - .market - .expect("market should be available"); + let next_market = querier.query_spot_market(&next_market_id)?.market.expect("market should be available"); let is_next_swap_sell = next_market.base_denom == current_step.step_target_denom; @@ -259,8 +212,7 @@ pub fn handle_atomic_order_reply( if current_step.step_idx < (swap.swap_steps.len() - 1) as u16 { SWAP_RESULTS.save(deps.storage, &swap_results)?; - return execute_swap_step(deps, env, swap, current_step.step_idx + 1, new_balance) - .map_err(ContractError::Std); + return execute_swap_step(deps, env, swap, current_step.step_idx + 1, new_balance).map_err(ContractError::Std); } let min_output_quantity = match swap.swap_quantity_mode { @@ -269,9 +221,7 @@ pub fn handle_atomic_order_reply( }; if new_balance.amount < min_output_quantity { - return Err(ContractError::MinOutputAmountNotReached( - min_output_quantity, - )); + return Err(ContractError::MinOutputAmountNotReached(min_output_quantity)); } // last step, finalize and send back funds to a caller @@ -294,11 +244,9 @@ pub fn handle_atomic_order_reply( STEP_STATE.remove(deps.storage); SWAP_RESULTS.remove(deps.storage); - let mut response = Response::new() - .add_message(send_message) - .add_event(swap_event); + let mut response = Response::new().add_message(send_message).add_event(swap_event); - if swap.refund.amount > Uint128::zero() { + if !swap.refund.amount.is_zero() { let refund_message = BankMsg::Send { to_address: swap.sender_address.to_string(), amount: vec![swap.refund], @@ -308,3 +256,18 @@ pub fn handle_atomic_order_reply( Ok(response) } + +pub fn parse_market_order_response(msg: Reply) -> StdResult { + let binding = msg.result.into_result().map_err(ContractError::SubMsgFailure).unwrap(); + + let first_messsage = binding.msg_responses.first(); + + let order_response = MsgCreateSpotMarketOrderResponse::decode(first_messsage.unwrap().value.as_slice()) + .map_err(|err| ContractError::ReplyParseFailure { + id: msg.id, + err: err.to_string(), + }) + .unwrap(); + + Ok(order_response) +} diff --git a/contracts/swap/src/testing/authz_tests.rs b/contracts/swap/src/testing/authz_tests.rs index 6c7b8c4..680a57c 100644 --- a/contracts/swap/src/testing/authz_tests.rs +++ b/contracts/swap/src/testing/authz_tests.rs @@ -2,16 +2,18 @@ use crate::{ msg::ExecuteMsg, testing::test_utils::{ create_contract_authorization, create_realistic_atom_usdt_sell_orders_from_spreadsheet, - create_realistic_eth_usdt_buy_orders_from_spreadsheet, init_rich_account, - init_self_relaying_contract_and_get_address, launch_realistic_atom_usdt_spot_market, - launch_realistic_weth_usdt_spot_market, must_init_account_with_funds, str_coin, Decimals, - ATOM, ETH, INJ, USDT, + create_realistic_eth_usdt_buy_orders_from_spreadsheet, init_rich_account, init_self_relaying_contract_and_get_address, + launch_realistic_atom_usdt_spot_market, launch_realistic_weth_usdt_spot_market, must_init_account_with_funds, str_coin, Decimals, ATOM, ETH, + INJ, USDT, }, }; -use cosmos_sdk_proto::{cosmwasm::wasm::v1::MsgExecuteContract, traits::MessageExt}; -use injective_std::{shim::Any, types::cosmos::authz::v1beta1::MsgExec}; +use injective_std::{ + shim::Any, + types::{cosmos::authz::v1beta1::MsgExec, cosmwasm::wasm::v1::MsgExecuteContract}, +}; use injective_test_tube::{Account, Authz, Exchange, InjectiveTestApp, Module, Wasm}; +use prost::Message; #[test] pub fn set_route_for_third_party_test() { @@ -33,11 +35,7 @@ pub fn set_route_for_third_party_test() { let spot_market_1_id = launch_realistic_weth_usdt_spot_market(&exchange, &owner); let spot_market_2_id = launch_realistic_atom_usdt_spot_market(&exchange, &owner); - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("1_000", USDT, Decimals::Six)], - ); + let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("1_000", USDT, Decimals::Six)]); let trader1 = init_rich_account(&app); let trader2 = init_rich_account(&app); @@ -53,29 +51,15 @@ pub fn set_route_for_third_party_test() { None, ); - create_realistic_eth_usdt_buy_orders_from_spreadsheet( - &app, - &spot_market_1_id, - &trader1, - &trader2, - ); - create_realistic_atom_usdt_sell_orders_from_spreadsheet( - &app, - &spot_market_2_id, - &trader1, - &trader2, - &trader3, - ); + create_realistic_eth_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2); + create_realistic_atom_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3); app.increase_time(1); let set_route_msg = ExecuteMsg::SetRoute { source_denom: ETH.to_string(), target_denom: ATOM.to_string(), - route: vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], + route: vec![spot_market_1_id.as_str().into(), spot_market_2_id.as_str().into()], }; let execute_msg = MsgExecuteContract { @@ -85,12 +69,11 @@ pub fn set_route_for_third_party_test() { funds: vec![], }; - // execute on more time to excercise account sequence let msg = MsgExec { grantee: trader1.address().to_string(), msgs: vec![Any { type_url: "/cosmwasm.wasm.v1.MsgExecuteContract".to_string(), - value: execute_msg.to_bytes().unwrap(), + value: execute_msg.encode_to_vec(), }], }; @@ -101,13 +84,10 @@ pub fn set_route_for_third_party_test() { grantee: trader1.address().to_string(), msgs: vec![Any { type_url: "/cosmwasm.wasm.v1.MsgExecuteContract".to_string(), - value: execute_msg.to_bytes().unwrap(), + value: execute_msg.encode_to_vec(), }], }; let err = authz.exec(msg, &trader1).unwrap_err(); - assert!( - err.to_string().contains("failed to update grant with key"), - "incorrect error returned by execute" - ); + assert!(err.to_string().contains("failed to get grant with given granter")); } diff --git a/contracts/swap/src/testing/config_tests.rs b/contracts/swap/src/testing/config_tests.rs index d61ce23..68ed7cc 100644 --- a/contracts/swap/src/testing/config_tests.rs +++ b/contracts/swap/src/testing/config_tests.rs @@ -1,4 +1,4 @@ -use cosmwasm_std::testing::{mock_env, mock_info}; +use cosmwasm_std::testing::{message_info, mock_env}; use cosmwasm_std::{coins, Addr}; use injective_cosmwasm::{inj_mock_deps, OwnedDepsExt}; @@ -17,14 +17,12 @@ pub fn admin_can_update_config() { fee_recipient: Addr::unchecked(TEST_CONTRACT_ADDR), admin: Addr::unchecked(TEST_USER_ADDR), }; - CONFIG - .save(deps.as_mut_deps().storage, &config) - .expect("could not save config"); + CONFIG.save(deps.as_mut_deps().storage, &config).expect("could not save config"); let new_admin = Addr::unchecked("new_admin"); let new_fee_recipient = Addr::unchecked("new_fee_recipient"); - let info = mock_info(TEST_USER_ADDR, &coins(12, "eth")); + let info = message_info(&Addr::unchecked(TEST_USER_ADDR), &coins(12, "eth")); let msg = ExecuteMsg::UpdateConfig { admin: Some(new_admin.clone()), @@ -36,10 +34,7 @@ pub fn admin_can_update_config() { let config = CONFIG.load(deps.as_mut_deps().storage).unwrap(); assert_eq!(config.admin, new_admin, "admin was not updated"); - assert_eq!( - config.fee_recipient, new_fee_recipient, - "fee_recipient was not updated" - ); + assert_eq!(config.fee_recipient, new_fee_recipient, "fee_recipient was not updated"); res.events .iter() @@ -47,7 +42,7 @@ pub fn admin_can_update_config() { .expect("update_config event expected") .attributes .iter() - .find(|a| a.key == "admin" && a.value == new_admin) + .find(|a| a.key == "admin" && a.value == new_admin.to_string()) .expect("admin attribute expected"); res.events @@ -56,7 +51,7 @@ pub fn admin_can_update_config() { .expect("update_config event expected") .attributes .iter() - .find(|a| a.key == "fee_recipient" && a.value == new_fee_recipient) + .find(|a| a.key == "fee_recipient" && a.value == new_fee_recipient.to_string()) .expect("fee_recipient attribute expected"); } @@ -68,14 +63,12 @@ pub fn non_admin_cannot_update_config() { fee_recipient: Addr::unchecked(TEST_CONTRACT_ADDR), admin: Addr::unchecked(TEST_USER_ADDR), }; - CONFIG - .save(deps.as_mut_deps().storage, &config) - .expect("could not save config"); + CONFIG.save(deps.as_mut_deps().storage, &config).expect("could not save config"); let new_admin = Addr::unchecked("new_admin"); let new_fee_recipient = Addr::unchecked("new_fee_recipient"); - let info = mock_info("non_admin", &coins(12, "eth")); + let info = message_info(&Addr::unchecked("non_admin"), &coins(12, "eth")); let msg = ExecuteMsg::UpdateConfig { admin: Some(new_admin), diff --git a/contracts/swap/src/testing/integration_logic_tests.rs b/contracts/swap/src/testing/integration_logic_tests.rs deleted file mode 100644 index d4f00a1..0000000 --- a/contracts/swap/src/testing/integration_logic_tests.rs +++ /dev/null @@ -1,2142 +0,0 @@ -use cosmwasm_std::{coin, Addr}; - -use injective_test_tube::RunnerError::{ExecuteError, QueryError}; -use injective_test_tube::{ - Account, Bank, Exchange, InjectiveTestApp, Module, RunnerError, RunnerResult, SigningAccount, - Wasm, -}; - -use injective_math::{round_to_min_tick, FPDecimal}; - -use crate::msg::{ExecuteMsg, QueryMsg}; -use crate::testing::test_utils::{ - are_fpdecimals_approximately_equal, assert_fee_is_as_expected, create_limit_order, - fund_account_with_some_inj, human_to_dec, init_contract_with_fee_recipient_and_get_address, - init_default_signer_account, init_default_validator_account, init_rich_account, - init_self_relaying_contract_and_get_address, launch_spot_market, must_init_account_with_funds, - pause_spot_market, query_all_bank_balances, query_bank_balance, set_route_and_assert_success, - str_coin, Decimals, OrderSide, ATOM, DEFAULT_ATOMIC_MULTIPLIER, DEFAULT_RELAYER_SHARE, - DEFAULT_SELF_RELAYING_FEE_PART, DEFAULT_TAKER_FEE, ETH, INJ, USDC, USDT, -}; -use crate::types::{FPCoin, SwapEstimationResult}; - -/* - This suite of tests focuses on calculation logic itself and doesn't attempt to use neither - realistic market configuration nor order prices, so that we don't have to deal with scaling issues. - - Hardcoded values used in these tests come from the first tab of this spreadsheet: - https://docs.google.com/spreadsheets/d/1-0epjX580nDO_P2mm1tSjhvjJVppsvrO1BC4_wsBeyA/edit?usp=sharing -*/ - -#[test] -fn it_executes_a_swap_between_two_base_assets_with_multiple_price_levels() { - let app = InjectiveTestApp::new(); - let wasm = Wasm::new(&app); - let exchange = Exchange::new(&app); - let bank = Bank::new(&app); - - let _signer = init_default_signer_account(&app); - let _validator = init_default_validator_account(&app); - let owner = init_rich_account(&app); - - let spot_market_1_id = launch_spot_market(&exchange, &owner, ETH, USDT); - let spot_market_2_id = launch_spot_market(&exchange, &owner, ATOM, USDT); - - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("100_000", USDT, Decimals::Six)], - ); - set_route_and_assert_success( - &wasm, - &owner, - &contr_addr, - ETH, - ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], - ); - - let trader1 = init_rich_account(&app); - let trader2 = init_rich_account(&app); - let trader3 = init_rich_account(&app); - - create_eth_buy_orders(&app, &spot_market_1_id, &trader1, &trader2); - create_atom_sell_orders(&app, &spot_market_2_id, &trader1, &trader2, &trader3); - - app.increase_time(1); - - let swapper = must_init_account_with_funds( - &app, - &[coin(12, ETH), str_coin("500_000", INJ, Decimals::Eighteen)], - ); - - let mut query_result: SwapEstimationResult = wasm - .query( - &contr_addr, - &QueryMsg::GetOutputQuantity { - source_denom: ETH.to_string(), - target_denom: ATOM.to_string(), - from_quantity: FPDecimal::from(12u128), - }, - ) - .unwrap(); - - assert_eq!( - query_result.result_quantity, - FPDecimal::must_from_str("2893.886"), //slightly rounded down - "incorrect swap result estimate returned by query" - ); - - assert_eq!( - query_result.expected_fees.len(), - 2, - "Wrong number of fee denoms received" - ); - - let mut expected_fees = vec![ - FPCoin { - amount: FPDecimal::must_from_str("3541.5"), - denom: "usdt".to_string(), - }, - FPCoin { - amount: FPDecimal::must_from_str("3530.891412"), - denom: "usdt".to_string(), - }, - ]; - - assert_fee_is_as_expected( - &mut query_result.expected_fees, - &mut expected_fees, - FPDecimal::must_from_str("0.000001"), - ); - - let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - - wasm.execute( - &contr_addr, - &ExecuteMsg::SwapMinOutput { - target_denom: ATOM.to_string(), - min_output_quantity: FPDecimal::from(2800u128), - }, - &[coin(12, ETH)], - &swapper, - ) - .unwrap(); - - let from_balance = query_bank_balance(&bank, ETH, swapper.address().as_str()); - let to_balance = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - assert_eq!( - from_balance, - FPDecimal::ZERO, - "some of the original amount wasn't swapped" - ); - assert_eq!( - to_balance, - FPDecimal::must_from_str("2893"), - "swapper did not receive expected amount" - ); - - let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); - - let contract_balance_usdt_after = - FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); - let contract_balance_usdt_before = - FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); - - assert!( - contract_balance_usdt_after >= contract_balance_usdt_before, - "Contract lost some money after swap. Balance before: {contract_balance_usdt_before}, after: {contract_balance_usdt_after}", - ); - - let max_diff = human_to_dec("0.00001", Decimals::Six); - - assert!( - are_fpdecimals_approximately_equal( - contract_balance_usdt_after, - contract_balance_usdt_before, - max_diff, - ), - "Contract balance changed too much. Before: {}, After: {}", - contract_balances_before[0].amount, - contract_balances_after[0].amount - ); -} - -#[test] -fn it_executes_a_swap_between_two_base_assets_with_single_price_level() { - let app = InjectiveTestApp::new(); - let wasm = Wasm::new(&app); - let exchange = Exchange::new(&app); - let bank = Bank::new(&app); - - let _signer = init_default_signer_account(&app); - let _validator = init_default_validator_account(&app); - let owner = init_rich_account(&app); - - let spot_market_1_id = launch_spot_market(&exchange, &owner, ETH, USDT); - let spot_market_2_id = launch_spot_market(&exchange, &owner, ATOM, USDT); - - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("100_000", USDT, Decimals::Six)], - ); - set_route_and_assert_success( - &wasm, - &owner, - &contr_addr, - ETH, - ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], - ); - - let trader1 = init_rich_account(&app); - let trader2 = init_rich_account(&app); - let trader3 = init_rich_account(&app); - - create_eth_buy_orders(&app, &spot_market_1_id, &trader1, &trader2); - create_atom_sell_orders(&app, &spot_market_2_id, &trader1, &trader2, &trader3); - - app.increase_time(1); - - let swapper = must_init_account_with_funds( - &app, - &[coin(3, ETH), str_coin("500_000", INJ, Decimals::Eighteen)], - ); - - let expected_atom_estimate_quantity = FPDecimal::must_from_str("751.492"); - let mut query_result: SwapEstimationResult = wasm - .query( - &contr_addr, - &QueryMsg::GetOutputQuantity { - source_denom: ETH.to_string(), - target_denom: ATOM.to_string(), - from_quantity: FPDecimal::from(3u128), - }, - ) - .unwrap(); - - assert_eq!( - query_result.result_quantity, expected_atom_estimate_quantity, - "incorrect swap result estimate returned by query" - ); - - let mut expected_fees = vec![ - FPCoin { - amount: FPDecimal::must_from_str("904.5"), - denom: "usdt".to_string(), - }, - FPCoin { - amount: FPDecimal::must_from_str("901.790564"), - denom: "usdt".to_string(), - }, - ]; - - assert_fee_is_as_expected( - &mut query_result.expected_fees, - &mut expected_fees, - human_to_dec("0.00001", Decimals::Six), - ); - - let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); - - wasm.execute( - &contr_addr, - &ExecuteMsg::SwapMinOutput { - target_denom: ATOM.to_string(), - min_output_quantity: FPDecimal::from(750u128), - }, - &[coin(3, ETH)], - &swapper, - ) - .unwrap(); - - let from_balance = query_bank_balance(&bank, ETH, swapper.address().as_str()); - let to_balance = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - assert_eq!( - from_balance, - FPDecimal::ZERO, - "some of the original amount wasn't swapped" - ); - assert_eq!( - to_balance, - expected_atom_estimate_quantity.int(), - "swapper did not receive expected amount" - ); - - let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); - assert_eq!( - contract_balances_after, contract_balances_before, - "contract balance has changed after swap" - ); -} - -#[test] -fn it_executes_swap_between_markets_using_different_quote_assets() { - let app = InjectiveTestApp::new(); - let wasm = Wasm::new(&app); - let exchange = Exchange::new(&app); - let bank = Bank::new(&app); - - let _signer = init_default_signer_account(&app); - let _validator = init_default_validator_account(&app); - let owner = init_rich_account(&app); - - let spot_market_1_id = launch_spot_market(&exchange, &owner, ETH, USDT); - let spot_market_2_id = launch_spot_market(&exchange, &owner, ATOM, USDC); - let spot_market_3_id = launch_spot_market(&exchange, &owner, USDC, USDT); - - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[ - str_coin("100_000", USDC, Decimals::Six), - str_coin("100_000", USDT, Decimals::Six), - ], - ); - set_route_and_assert_success( - &wasm, - &owner, - &contr_addr, - ETH, - ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_3_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], - ); - - let trader1 = init_rich_account(&app); - let trader2 = init_rich_account(&app); - let trader3 = init_rich_account(&app); - - create_eth_buy_orders(&app, &spot_market_1_id, &trader1, &trader2); - create_atom_sell_orders(&app, &spot_market_2_id, &trader1, &trader2, &trader3); - - //USDT-USDC - create_limit_order( - &app, - &trader3, - &spot_market_3_id, - OrderSide::Sell, - 1, - 100_000_000, - ); - - app.increase_time(1); - - let swapper = must_init_account_with_funds( - &app, - &[coin(12, ETH), str_coin("500_000", INJ, Decimals::Eighteen)], - ); - - let mut query_result: SwapEstimationResult = wasm - .query( - &contr_addr, - &QueryMsg::GetOutputQuantity { - source_denom: ETH.to_string(), - target_denom: ATOM.to_string(), - from_quantity: FPDecimal::from(12u128), - }, - ) - .unwrap(); - - // expected amount is a bit lower, even though 1 USDT = 1 USDC, because of the fees - assert_eq!( - query_result.result_quantity, - FPDecimal::must_from_str("2889.64"), - "incorrect swap result estimate returned by query" - ); - - let mut expected_fees = vec![ - FPCoin { - amount: FPDecimal::must_from_str("3541.5"), - denom: "usdt".to_string(), - }, - FPCoin { - amount: FPDecimal::must_from_str("3530.891412"), - denom: "usdt".to_string(), - }, - FPCoin { - amount: FPDecimal::must_from_str("3525.603007"), - denom: "usdc".to_string(), - }, - ]; - - assert_fee_is_as_expected( - &mut query_result.expected_fees, - &mut expected_fees, - human_to_dec("0.000001", Decimals::Six), - ); - - let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 2, - "wrong number of denoms in contract balances" - ); - - wasm.execute( - &contr_addr, - &ExecuteMsg::SwapMinOutput { - target_denom: ATOM.to_string(), - min_output_quantity: FPDecimal::from(2800u128), - }, - &[coin(12, ETH)], - &swapper, - ) - .unwrap(); - - let from_balance = query_bank_balance(&bank, ETH, swapper.address().as_str()); - let to_balance = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - assert_eq!( - from_balance, - FPDecimal::ZERO, - "some of the original amount wasn't swapped" - ); - assert_eq!( - to_balance, - FPDecimal::must_from_str("2889"), - "swapper did not receive expected amount" - ); - - let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 2, - "wrong number of denoms in contract balances" - ); - assert_eq!( - contract_balances_after, contract_balances_before, - "contract balance has changed after swap" - ); -} - -#[test] -fn it_reverts_swap_between_markets_using_different_quote_asset_if_one_quote_buffer_is_insufficient() -{ - let app = InjectiveTestApp::new(); - let wasm = Wasm::new(&app); - let exchange = Exchange::new(&app); - let bank = Bank::new(&app); - - let _signer = init_default_signer_account(&app); - let _validator = init_default_validator_account(&app); - let owner = init_rich_account(&app); - - let spot_market_1_id = launch_spot_market(&exchange, &owner, ETH, USDT); - let spot_market_2_id = launch_spot_market(&exchange, &owner, ATOM, USDC); - let spot_market_3_id = launch_spot_market(&exchange, &owner, USDC, USDT); - - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[ - str_coin("0.0001", USDC, Decimals::Six), - str_coin("100_000", USDT, Decimals::Six), - ], - ); - set_route_and_assert_success( - &wasm, - &owner, - &contr_addr, - ETH, - ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_3_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], - ); - - let trader1 = init_rich_account(&app); - let trader2 = init_rich_account(&app); - let trader3 = init_rich_account(&app); - - create_eth_buy_orders(&app, &spot_market_1_id, &trader1, &trader2); - create_atom_sell_orders(&app, &spot_market_2_id, &trader1, &trader2, &trader3); - - //USDT-USDC - create_limit_order( - &app, - &trader3, - &spot_market_3_id, - OrderSide::Sell, - 1, - 100_000_000, - ); - - app.increase_time(1); - - let swapper = must_init_account_with_funds( - &app, - &[coin(12, ETH), str_coin("500_000", INJ, Decimals::Eighteen)], - ); - - let query_result: RunnerResult = wasm.query( - &contr_addr, - &QueryMsg::GetOutputQuantity { - source_denom: ETH.to_string(), - target_denom: ATOM.to_string(), - from_quantity: FPDecimal::from(12u128), - }, - ); - - assert!(query_result.is_err(), "swap should have failed"); - assert!( - query_result - .unwrap_err() - .to_string() - .contains("Swap amount too high"), - "incorrect query result error message" - ); - - let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 2, - "wrong number of denoms in contract balances" - ); - - let execute_result = wasm.execute( - &contr_addr, - &ExecuteMsg::SwapMinOutput { - target_denom: ATOM.to_string(), - min_output_quantity: FPDecimal::from(2800u128), - }, - &[coin(12, ETH)], - &swapper, - ); - - assert!(execute_result.is_err(), "swap should have failed"); - assert!( - execute_result - .unwrap_err() - .to_string() - .contains("Swap amount too high"), - "incorrect query result error message" - ); - - let source_balance = query_bank_balance(&bank, ETH, swapper.address().as_str()); - let target_balance = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - assert_eq!( - source_balance, - FPDecimal::must_from_str("12"), - "source balance should not have changed after failed swap" - ); - assert_eq!( - target_balance, - FPDecimal::ZERO, - "target balance should not have changed after failed swap" - ); - - let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 2, - "wrong number of denoms in contract balances" - ); - assert_eq!( - contract_balances_after, contract_balances_before, - "contract balance has changed after swap" - ); -} - -#[test] -fn it_executes_a_sell_of_base_asset_to_receive_min_output_quantity() { - let app = InjectiveTestApp::new(); - let wasm = Wasm::new(&app); - let exchange = Exchange::new(&app); - let bank = Bank::new(&app); - - let _signer = init_default_signer_account(&app); - let _validator = init_default_validator_account(&app); - let owner = init_rich_account(&app); - - let spot_market_1_id = launch_spot_market(&exchange, &owner, ETH, USDT); - - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("100_000", USDT, Decimals::Six)], - ); - set_route_and_assert_success( - &wasm, - &owner, - &contr_addr, - ETH, - USDT, - vec![spot_market_1_id.as_str().into()], - ); - - let trader1 = init_rich_account(&app); - let trader2 = init_rich_account(&app); - - create_eth_buy_orders(&app, &spot_market_1_id, &trader1, &trader2); - - app.increase_time(1); - - let swapper = must_init_account_with_funds( - &app, - &[coin(12, ETH), str_coin("500_000", INJ, Decimals::Eighteen)], - ); - - let mut query_result: SwapEstimationResult = wasm - .query( - &contr_addr, - &QueryMsg::GetOutputQuantity { - source_denom: ETH.to_string(), - target_denom: USDT.to_string(), - from_quantity: FPDecimal::from(12u128), - }, - ) - .unwrap(); - - // calculate how much can be USDT can be bought for 12 ETH without fees - let orders_nominal_total_value = FPDecimal::from(201_000u128) * FPDecimal::from(5u128) - + FPDecimal::from(195_000u128) * FPDecimal::from(4u128) - + FPDecimal::from(192_000u128) * FPDecimal::from(3u128); - let expected_target_quantity = orders_nominal_total_value - * (FPDecimal::ONE - - FPDecimal::must_from_str(&format!( - "{}", - DEFAULT_TAKER_FEE * DEFAULT_ATOMIC_MULTIPLIER * DEFAULT_SELF_RELAYING_FEE_PART - ))); - - assert_eq!( - query_result.result_quantity, expected_target_quantity, - "incorrect swap result estimate returned by query" - ); - - let mut expected_fees = vec![FPCoin { - amount: FPDecimal::must_from_str("3541.5"), - denom: "usdt".to_string(), - }]; - - assert_fee_is_as_expected( - &mut query_result.expected_fees, - &mut expected_fees, - FPDecimal::must_from_str("0.000001"), - ); - - let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); - - wasm.execute( - &contr_addr, - &ExecuteMsg::SwapMinOutput { - target_denom: USDT.to_string(), - min_output_quantity: FPDecimal::from(2357458u128), - }, - &[coin(12, ETH)], - &swapper, - ) - .unwrap(); - - let from_balance = query_bank_balance(&bank, ETH, swapper.address().as_str()); - let to_balance = query_bank_balance(&bank, USDT, swapper.address().as_str()); - let expected_execute_result = expected_target_quantity.int(); - - assert_eq!( - from_balance, - FPDecimal::ZERO, - "some of the original amount wasn't swapped" - ); - assert_eq!( - to_balance, expected_execute_result, - "swapper did not receive expected amount" - ); - - let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); - assert_eq!( - contract_balances_after, contract_balances_before, - "contract balance has changed after swap" - ); -} - -#[test] -fn it_executes_a_buy_of_base_asset_to_receive_min_output_quantity() { - let app = InjectiveTestApp::new(); - let wasm = Wasm::new(&app); - let exchange = Exchange::new(&app); - let bank = Bank::new(&app); - - let _signer = init_default_signer_account(&app); - let _validator = init_default_validator_account(&app); - let owner = init_rich_account(&app); - - let spot_market_1_id = launch_spot_market(&exchange, &owner, ETH, USDT); - - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("100_000", USDT, Decimals::Six)], - ); - set_route_and_assert_success( - &wasm, - &owner, - &contr_addr, - ETH, - USDT, - vec![spot_market_1_id.as_str().into()], - ); - - let trader1 = init_rich_account(&app); - let trader2 = init_rich_account(&app); - - create_limit_order( - &app, - &trader1, - &spot_market_1_id, - OrderSide::Sell, - 201_000, - 5, - ); - create_limit_order( - &app, - &trader2, - &spot_market_1_id, - OrderSide::Sell, - 195_000, - 4, - ); - create_limit_order( - &app, - &trader2, - &spot_market_1_id, - OrderSide::Sell, - 192_000, - 3, - ); - - app.increase_time(1); - - let swapper_usdt = 2_360_995; - let swapper = must_init_account_with_funds( - &app, - &[ - coin(swapper_usdt, USDT), - str_coin("500_000", INJ, Decimals::Eighteen), - ], - ); - - // calculate how much ETH we can buy with USDT we have - let available_usdt_after_fee = FPDecimal::from(swapper_usdt) - / (FPDecimal::ONE - + FPDecimal::must_from_str(&format!( - "{}", - DEFAULT_TAKER_FEE * DEFAULT_ATOMIC_MULTIPLIER * DEFAULT_SELF_RELAYING_FEE_PART - ))); - let usdt_left_for_most_expensive_order = available_usdt_after_fee - - (FPDecimal::from(195_000u128) * FPDecimal::from(4u128) - + FPDecimal::from(192_000u128) * FPDecimal::from(3u128)); - let most_expensive_order_quantity = - usdt_left_for_most_expensive_order / FPDecimal::from(201_000u128); - let expected_quantity = - most_expensive_order_quantity + (FPDecimal::from(4u128) + FPDecimal::from(3u128)); - - // round to min tick - let expected_quantity_rounded = - round_to_min_tick(expected_quantity, FPDecimal::must_from_str("0.001")); - - // calculate dust notional value as this will be the portion of user's funds that will stay in the contract - let dust = expected_quantity - expected_quantity_rounded; - // we need to use worst priced order - let dust_value = dust * FPDecimal::from(201_000u128); - - let mut query_result: SwapEstimationResult = wasm - .query( - &contr_addr, - &QueryMsg::GetOutputQuantity { - source_denom: USDT.to_string(), - target_denom: ETH.to_string(), - from_quantity: FPDecimal::from(swapper_usdt), - }, - ) - .unwrap(); - - assert_eq!( - query_result.result_quantity, expected_quantity_rounded, - "incorrect swap result estimate returned by query" - ); - - let mut expected_fees = vec![FPCoin { - amount: FPDecimal::must_from_str("3536.188217"), - denom: "usdt".to_string(), - }]; - - assert_fee_is_as_expected( - &mut query_result.expected_fees, - &mut expected_fees, - FPDecimal::must_from_str("0.000001"), - ); - - let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); - - wasm.execute( - &contr_addr, - &ExecuteMsg::SwapMinOutput { - target_denom: ETH.to_string(), - min_output_quantity: FPDecimal::from(11u128), - }, - &[coin(swapper_usdt, USDT)], - &swapper, - ) - .unwrap(); - - let from_balance = query_bank_balance(&bank, USDT, swapper.address().as_str()); - let to_balance = query_bank_balance(&bank, ETH, swapper.address().as_str()); - let expected_execute_result = expected_quantity.int(); - - assert_eq!( - from_balance, - FPDecimal::ZERO, - "some of the original amount wasn't swapped" - ); - assert_eq!( - to_balance, expected_execute_result, - "swapper did not receive expected amount" - ); - - let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - let mut expected_contract_balances_after = - FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()) + dust_value; - expected_contract_balances_after = expected_contract_balances_after.int(); - - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); - assert_eq!( - FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()), - expected_contract_balances_after, - "contract balance changed unexpectedly after swap" - ); -} - -#[test] -fn it_executes_a_swap_between_base_assets_with_external_fee_recipient() { - let app = InjectiveTestApp::new(); - let wasm = Wasm::new(&app); - let exchange = Exchange::new(&app); - let bank = Bank::new(&app); - - let _signer = init_default_signer_account(&app); - let _validator = init_default_validator_account(&app); - let owner = init_rich_account(&app); - - let spot_market_1_id = launch_spot_market(&exchange, &owner, ETH, USDT); - let spot_market_2_id = launch_spot_market(&exchange, &owner, ATOM, USDT); - - let fee_recipient = must_init_account_with_funds(&app, &[]); - let contr_addr = init_contract_with_fee_recipient_and_get_address( - &wasm, - &owner, - &[str_coin("10_000", USDT, Decimals::Six)], - &fee_recipient, - ); - set_route_and_assert_success( - &wasm, - &owner, - &contr_addr, - ETH, - ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], - ); - - let trader1 = init_rich_account(&app); - let trader2 = init_rich_account(&app); - let trader3 = init_rich_account(&app); - - create_eth_buy_orders(&app, &spot_market_1_id, &trader1, &trader2); - create_atom_sell_orders(&app, &spot_market_2_id, &trader1, &trader2, &trader3); - - // calculate relayer's share of the fee based on assumptions that all orders are matched - let buy_orders_nominal_total_value = FPDecimal::from(201_000u128) * FPDecimal::from(5u128) - + FPDecimal::from(195_000u128) * FPDecimal::from(4u128) - + FPDecimal::from(192_000u128) * FPDecimal::from(3u128); - let relayer_sell_fee = buy_orders_nominal_total_value - * FPDecimal::must_from_str(&format!( - "{}", - DEFAULT_TAKER_FEE * DEFAULT_ATOMIC_MULTIPLIER * DEFAULT_RELAYER_SHARE - )); - - // calculate relayer's share of the fee based on assumptions that some of orders are matched - let expected_nominal_buy_most_expensive_match_quantity = - FPDecimal::must_from_str("488.2222155454736648"); - let sell_orders_nominal_total_value = FPDecimal::from(800u128) * FPDecimal::from(800u128) - + FPDecimal::from(810u128) * FPDecimal::from(800u128) - + FPDecimal::from(820u128) * FPDecimal::from(800u128) - + FPDecimal::from(830u128) * expected_nominal_buy_most_expensive_match_quantity; - let relayer_buy_fee = sell_orders_nominal_total_value - * FPDecimal::must_from_str(&format!( - "{}", - DEFAULT_TAKER_FEE * DEFAULT_ATOMIC_MULTIPLIER * DEFAULT_RELAYER_SHARE - )); - let expected_fee_for_fee_recipient = relayer_buy_fee + relayer_sell_fee; - - app.increase_time(1); - - let swapper = must_init_account_with_funds( - &app, - &[coin(12, ETH), str_coin("500_000", INJ, Decimals::Eighteen)], - ); - - let mut query_result: SwapEstimationResult = wasm - .query( - &contr_addr, - &QueryMsg::GetOutputQuantity { - source_denom: ETH.to_string(), - target_denom: ATOM.to_string(), - from_quantity: FPDecimal::from(12u128), - }, - ) - .unwrap(); - - assert_eq!( - query_result.result_quantity, - FPDecimal::must_from_str("2888.221"), //slightly rounded down vs spreadsheet - "incorrect swap result estimate returned by query" - ); - - let mut expected_fees = vec![ - FPCoin { - amount: FPDecimal::must_from_str("5902.5"), - denom: "usdt".to_string(), - }, - FPCoin { - amount: FPDecimal::must_from_str("5873.061097"), - denom: "usdt".to_string(), - }, - ]; - - assert_fee_is_as_expected( - &mut query_result.expected_fees, - &mut expected_fees, - FPDecimal::must_from_str("0.000001"), - ); - - let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); - - wasm.execute( - &contr_addr, - &ExecuteMsg::SwapMinOutput { - target_denom: ATOM.to_string(), - min_output_quantity: FPDecimal::from(2888u128), - }, - &[coin(12, ETH)], - &swapper, - ) - .unwrap(); - - let from_balance = query_bank_balance(&bank, ETH, swapper.address().as_str()); - let to_balance = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - - assert_eq!( - from_balance, - FPDecimal::ZERO, - "some of the original amount wasn't swapped" - ); - assert_eq!( - to_balance, - FPDecimal::must_from_str("2888"), - "swapper did not receive expected amount" - ); - - let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); - - let contract_balance_usdt_after = - FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); - let contract_balance_usdt_before = - FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); - - assert!( - contract_balance_usdt_after >= contract_balance_usdt_before, - "Contract lost some money after swap. Balance before: {contract_balance_usdt_before}, after: {contract_balance_usdt_after}", - ); - - let max_diff = human_to_dec("0.00001", Decimals::Six); - - assert!( - are_fpdecimals_approximately_equal( - contract_balance_usdt_after, - contract_balance_usdt_before, - max_diff, - ), - "Contract balance changed too much. Before: {}, After: {}", - contract_balances_before[0].amount, - contract_balances_after[0].amount - ); - - let fee_recipient_balance = query_all_bank_balances(&bank, &fee_recipient.address()); - - assert_eq!( - fee_recipient_balance.len(), - 1, - "wrong number of denoms in fee recipient's balances" - ); - assert_eq!( - fee_recipient_balance[0].denom, USDT, - "fee recipient did not receive fee in expected denom" - ); - assert_eq!( - FPDecimal::must_from_str(fee_recipient_balance[0].amount.as_str()), - expected_fee_for_fee_recipient.int(), - "fee recipient did not receive expected fee" - ); -} - -#[test] -fn it_reverts_the_swap_if_there_isnt_enough_buffer_for_buying_target_asset() { - let app = InjectiveTestApp::new(); - let wasm = Wasm::new(&app); - let exchange = Exchange::new(&app); - let bank = Bank::new(&app); - - let _signer = init_default_signer_account(&app); - let _validator = init_default_validator_account(&app); - let owner = init_rich_account(&app); - - let spot_market_1_id = launch_spot_market(&exchange, &owner, ETH, USDT); - let spot_market_2_id = launch_spot_market(&exchange, &owner, ATOM, USDT); - - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("0.001", USDT, Decimals::Six)], - ); - set_route_and_assert_success( - &wasm, - &owner, - &contr_addr, - ETH, - ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], - ); - - let trader1 = init_rich_account(&app); - let trader2 = init_rich_account(&app); - let trader3 = init_rich_account(&app); - - create_eth_buy_orders(&app, &spot_market_1_id, &trader1, &trader2); - create_atom_sell_orders(&app, &spot_market_2_id, &trader1, &trader2, &trader3); - - app.increase_time(1); - - let swapper = must_init_account_with_funds( - &app, - &[coin(12, ETH), str_coin("500_000", INJ, Decimals::Eighteen)], - ); - - let query_result: RunnerResult = wasm.query( - &contr_addr, - &QueryMsg::GetOutputQuantity { - source_denom: ETH.to_string(), - target_denom: ATOM.to_string(), - from_quantity: FPDecimal::from(12u128), - }, - ); - - assert!(query_result.is_err(), "query should fail"); - assert!( - query_result - .unwrap_err() - .to_string() - .contains("Swap amount too high"), - "wrong query error message" - ); - - let contract_balances_before = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); - - let execute_result = wasm.execute( - &contr_addr, - &ExecuteMsg::SwapMinOutput { - target_denom: ATOM.to_string(), - min_output_quantity: FPDecimal::from(2800u128), - }, - &[coin(12, ETH)], - &swapper, - ); - - assert!(execute_result.is_err(), "execute should fail"); - assert!( - execute_result - .unwrap_err() - .to_string() - .contains("Swap amount too high"), - "wrong execute error message" - ); - - let from_balance = query_bank_balance(&bank, ETH, swapper.address().as_str()); - let to_balance = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - assert_eq!( - from_balance, - FPDecimal::from(12u128), - "source balance changes after failed swap" - ); - assert_eq!( - to_balance, - FPDecimal::ZERO, - "target balance changes after failed swap" - ); - - let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); - assert_eq!( - contract_balances_after, contract_balances_before, - "contract balance has changed after swap" - ); -} - -#[test] -fn it_reverts_swap_if_no_funds_were_passed() { - let app = InjectiveTestApp::new(); - let wasm = Wasm::new(&app); - let exchange = Exchange::new(&app); - let bank = Bank::new(&app); - - let _signer = init_default_signer_account(&app); - let _validator = init_default_validator_account(&app); - let owner = init_rich_account(&app); - - let spot_market_1_id = launch_spot_market(&exchange, &owner, ETH, USDT); - let spot_market_2_id = launch_spot_market(&exchange, &owner, ATOM, USDT); - - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("100_000", USDT, Decimals::Six)], - ); - set_route_and_assert_success( - &wasm, - &owner, - &contr_addr, - ETH, - ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], - ); - - let swapper = must_init_account_with_funds( - &app, - &[coin(12, ETH), str_coin("500_000", INJ, Decimals::Eighteen)], - ); - - let contract_balances_before = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); - - let execute_result = wasm.execute( - &contr_addr, - &ExecuteMsg::SwapMinOutput { - target_denom: ATOM.to_string(), - min_output_quantity: FPDecimal::from(2800u128), - }, - &[], - &swapper, - ); - let expected_error = RunnerError::ExecuteError { msg: "failed to execute message; message index: 0: Custom Error: \"Only one denom can be passed in funds\": execute wasm contract failed".to_string() }; - assert_eq!( - execute_result.unwrap_err(), - expected_error, - "wrong error message" - ); - - let from_balance = query_bank_balance(&bank, ETH, swapper.address().as_str()); - let to_balance = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - - assert_eq!( - from_balance, - FPDecimal::from(12u128), - "source balance changes after failed swap" - ); - assert_eq!( - to_balance, - FPDecimal::ZERO, - "target balance changes after failed swap" - ); - - let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); - assert_eq!( - contract_balances_after, contract_balances_before, - "contract balance has changed after swap" - ); -} - -#[test] -fn it_reverts_swap_if_multiple_funds_were_passed() { - let app = InjectiveTestApp::new(); - let wasm = Wasm::new(&app); - let exchange = Exchange::new(&app); - let bank = Bank::new(&app); - - let _signer = init_default_signer_account(&app); - let _validator = init_default_validator_account(&app); - let owner = init_rich_account(&app); - - let spot_market_1_id = launch_spot_market(&exchange, &owner, ETH, USDT); - let spot_market_2_id = launch_spot_market(&exchange, &owner, ATOM, USDT); - - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("100_000", USDT, Decimals::Six)], - ); - set_route_and_assert_success( - &wasm, - &owner, - &contr_addr, - ETH, - ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], - ); - - let eth_balance = 12u128; - let atom_balance = 10u128; - - let swapper = must_init_account_with_funds( - &app, - &[ - coin(eth_balance, ETH), - coin(atom_balance, ATOM), - str_coin("500_000", INJ, Decimals::Eighteen), - ], - ); - - let contract_balances_before = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); - - let execute_result = wasm.execute( - &contr_addr, - &ExecuteMsg::SwapMinOutput { - target_denom: ATOM.to_string(), - min_output_quantity: FPDecimal::from(10u128), - }, - &[coin(10, ATOM), coin(12, ETH)], - &swapper, - ); - assert!( - execute_result - .unwrap_err() - .to_string() - .contains("Only one denom can be passed in funds"), - "wrong error message" - ); - - let from_balance = query_bank_balance(&bank, ETH, swapper.address().as_str()); - let to_balance = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - assert_eq!( - from_balance, - FPDecimal::from(eth_balance), - "wrong ETH balance after failed swap" - ); - assert_eq!( - to_balance, - FPDecimal::from(atom_balance), - "wrong ATOM balance after failed swap" - ); - - let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); - assert_eq!( - contract_balances_after, contract_balances_before, - "contract balance has changed after swap" - ); -} - -#[test] -fn it_reverts_if_user_passes_quantities_equal_to_zero() { - let app = InjectiveTestApp::new(); - let wasm = Wasm::new(&app); - let exchange = Exchange::new(&app); - let bank = Bank::new(&app); - - let _signer = init_default_signer_account(&app); - let _validator = init_default_validator_account(&app); - let owner = init_rich_account(&app); - - let spot_market_1_id = launch_spot_market(&exchange, &owner, ETH, USDT); - let spot_market_2_id = launch_spot_market(&exchange, &owner, ATOM, USDT); - - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("100_000", USDT, Decimals::Six)], - ); - set_route_and_assert_success( - &wasm, - &owner, - &contr_addr, - ETH, - ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], - ); - - app.increase_time(1); - - let swapper = must_init_account_with_funds( - &app, - &[coin(12, ETH), str_coin("500_000", INJ, Decimals::Eighteen)], - ); - - let query_result: RunnerResult = wasm.query( - &contr_addr, - &QueryMsg::GetOutputQuantity { - source_denom: ETH.to_string(), - target_denom: ATOM.to_string(), - from_quantity: FPDecimal::from(0u128), - }, - ); - assert!( - query_result - .unwrap_err() - .to_string() - .contains("source_quantity must be positive"), - "incorrect error returned by query" - ); - - let contract_balances_before = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); - - let err = wasm - .execute( - &contr_addr, - &ExecuteMsg::SwapMinOutput { - target_denom: ATOM.to_string(), - min_output_quantity: FPDecimal::ZERO, - }, - &[coin(12, ETH)], - &swapper, - ) - .unwrap_err(); - assert!( - err.to_string() - .contains("Output quantity must be positive!"), - "incorrect error returned by execute" - ); - - let from_balance = query_bank_balance(&bank, ETH, swapper.address().as_str()); - let to_balance = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - assert_eq!( - from_balance, - FPDecimal::must_from_str("12"), - "swap should not have occurred" - ); - assert_eq!( - to_balance, - FPDecimal::must_from_str("0"), - "swapper should not have received any target tokens" - ); - - let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); - assert_eq!( - contract_balances_after, contract_balances_before, - "contract balance has changed after swap" - ); -} - -#[test] -fn it_reverts_if_user_passes_negative_quantities() { - let app = InjectiveTestApp::new(); - let wasm = Wasm::new(&app); - let exchange = Exchange::new(&app); - let bank = Bank::new(&app); - - let _signer = init_default_signer_account(&app); - let _validator = init_default_validator_account(&app); - let owner = init_rich_account(&app); - - let spot_market_1_id = launch_spot_market(&exchange, &owner, ETH, USDT); - let spot_market_2_id = launch_spot_market(&exchange, &owner, ATOM, USDT); - - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("100_000", USDT, Decimals::Six)], - ); - set_route_and_assert_success( - &wasm, - &owner, - &contr_addr, - ETH, - ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], - ); - - let contract_balances_before = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); - - let swapper = must_init_account_with_funds( - &app, - &[coin(12, ETH), str_coin("500_000", INJ, Decimals::Eighteen)], - ); - - app.increase_time(1); - - let execute_result = wasm.execute( - &contr_addr, - &ExecuteMsg::SwapMinOutput { - target_denom: ATOM.to_string(), - min_output_quantity: FPDecimal::must_from_str("-1"), - }, - &[coin(12, ETH)], - &swapper, - ); - - assert!( - execute_result.is_err(), - "swap with negative minimum amount to receive did not fail" - ); - - let from_balance = query_bank_balance(&bank, ETH, swapper.address().as_str()); - let to_balance = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - assert_eq!( - from_balance, - FPDecimal::from(12u128), - "source balance changed after failed swap" - ); - assert_eq!( - to_balance, - FPDecimal::ZERO, - "target balance changed after failed swap" - ); - - let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); - assert_eq!( - contract_balances_after, contract_balances_before, - "contract balance has changed after failed swap" - ); -} - -#[test] -fn it_reverts_if_there_arent_enough_orders_to_satisfy_min_quantity() { - let app = InjectiveTestApp::new(); - let wasm = Wasm::new(&app); - let exchange = Exchange::new(&app); - let bank = Bank::new(&app); - - let _signer = init_default_signer_account(&app); - let _validator = init_default_validator_account(&app); - let owner = init_rich_account(&app); - - let spot_market_1_id = launch_spot_market(&exchange, &owner, ETH, USDT); - let spot_market_2_id = launch_spot_market(&exchange, &owner, ATOM, USDT); - - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("100_000", USDT, Decimals::Six)], - ); - set_route_and_assert_success( - &wasm, - &owner, - &contr_addr, - ETH, - ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], - ); - - let trader1 = init_rich_account(&app); - let trader2 = init_rich_account(&app); - let trader3 = init_rich_account(&app); - - create_eth_buy_orders(&app, &spot_market_1_id, &trader1, &trader2); - - create_limit_order(&app, &trader1, &spot_market_2_id, OrderSide::Sell, 800, 800); - create_limit_order(&app, &trader2, &spot_market_2_id, OrderSide::Sell, 810, 800); - create_limit_order(&app, &trader3, &spot_market_2_id, OrderSide::Sell, 820, 800); - create_limit_order(&app, &trader1, &spot_market_2_id, OrderSide::Sell, 830, 450); //not enough for minimum requested - - app.increase_time(1); - - let swapper = must_init_account_with_funds( - &app, - &[coin(12, ETH), str_coin("500_000", INJ, Decimals::Eighteen)], - ); - - let query_result: RunnerResult = wasm.query( - &contr_addr, - &QueryMsg::GetOutputQuantity { - source_denom: ETH.to_string(), - target_denom: ATOM.to_string(), - from_quantity: FPDecimal::from(12u128), - }, - ); - assert_eq!( - query_result.unwrap_err(), - QueryError { - msg: "Generic error: Not enough liquidity to fulfill order: query wasm contract failed" - .to_string() - }, - "wrong error message" - ); - - let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); - - let execute_result = wasm.execute( - &contr_addr, - &ExecuteMsg::SwapMinOutput { - target_denom: ATOM.to_string(), - min_output_quantity: FPDecimal::from(2800u128), - }, - &[coin(12, ETH)], - &swapper, - ); - - assert_eq!(execute_result.unwrap_err(), RunnerError::ExecuteError { msg: "failed to execute message; message index: 0: dispatch: submessages: reply: Generic error: Not enough liquidity to fulfill order: execute wasm contract failed".to_string() }, "wrong error message"); - - let from_balance = query_bank_balance(&bank, ETH, swapper.address().as_str()); - let to_balance = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - assert_eq!( - from_balance, - FPDecimal::from(12u128), - "source balance changed after failed swap" - ); - assert_eq!( - to_balance, - FPDecimal::ZERO, - "target balance changed after failed swap" - ); - - let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); - assert_eq!( - contract_balances_after, contract_balances_before, - "contract balance has changed after swap" - ); -} - -#[test] -fn it_reverts_if_min_quantity_cannot_be_reached() { - let app = InjectiveTestApp::new(); - let wasm = Wasm::new(&app); - let exchange = Exchange::new(&app); - let bank = Bank::new(&app); - - let _signer = init_default_signer_account(&app); - let _validator = init_default_validator_account(&app); - let owner = init_rich_account(&app); - - // set the market - let spot_market_1_id = launch_spot_market(&exchange, &owner, ETH, USDT); - let spot_market_2_id = launch_spot_market(&exchange, &owner, ATOM, USDT); - - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("100_000", USDT, Decimals::Six)], - ); - set_route_and_assert_success( - &wasm, - &owner, - &contr_addr, - ETH, - ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], - ); - - let trader1 = init_rich_account(&app); - let trader2 = init_rich_account(&app); - let trader3 = init_rich_account(&app); - - create_eth_buy_orders(&app, &spot_market_1_id, &trader1, &trader2); - create_atom_sell_orders(&app, &spot_market_2_id, &trader1, &trader2, &trader3); - - app.increase_time(1); - - let swapper = must_init_account_with_funds( - &app, - &[coin(12, ETH), str_coin("500_000", INJ, Decimals::Eighteen)], - ); - - let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); - - let min_quantity = 3500u128; - let execute_result = wasm.execute( - &contr_addr, - &ExecuteMsg::SwapMinOutput { - target_denom: ATOM.to_string(), - min_output_quantity: FPDecimal::from(min_quantity), - }, - &[coin(12, ETH)], - &swapper, - ); - - assert_eq!(execute_result.unwrap_err(), RunnerError::ExecuteError { msg: format!("failed to execute message; message index: 0: dispatch: submessages: reply: dispatch: submessages: reply: Min expected swap amount ({min_quantity}) not reached: execute wasm contract failed") }, "wrong error message"); - - let from_balance = query_bank_balance(&bank, ETH, swapper.address().as_str()); - let to_balance = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - assert_eq!( - from_balance, - FPDecimal::from(12u128), - "source balance changed after failed swap" - ); - assert_eq!( - to_balance, - FPDecimal::ZERO, - "target balance changed after failed swap" - ); - - let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); - assert_eq!( - contract_balances_after, contract_balances_before, - "contract balance has changed after failed swap" - ); -} - -#[test] -fn it_reverts_if_market_is_paused() { - let app = InjectiveTestApp::new(); - let wasm = Wasm::new(&app); - let exchange = Exchange::new(&app); - let bank = Bank::new(&app); - - let signer = init_default_signer_account(&app); - let validator = init_default_validator_account(&app); - fund_account_with_some_inj(&bank, &signer, &validator); - let owner = init_rich_account(&app); - - let spot_market_1_id = launch_spot_market(&exchange, &owner, ETH, USDT); - let spot_market_2_id = launch_spot_market(&exchange, &owner, ATOM, USDT); - - pause_spot_market(&app, spot_market_1_id.as_str(), &signer, &validator); - - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("100_000", USDT, Decimals::Six)], - ); - set_route_and_assert_success( - &wasm, - &owner, - &contr_addr, - ETH, - ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], - ); - - let swapper = must_init_account_with_funds( - &app, - &[coin(12, ETH), str_coin("500_000", INJ, Decimals::Eighteen)], - ); - - let query_error: RunnerError = wasm - .query::( - &contr_addr, - &QueryMsg::GetOutputQuantity { - source_denom: ETH.to_string(), - target_denom: ATOM.to_string(), - from_quantity: FPDecimal::from(12u128), - }, - ) - .unwrap_err(); - - assert!( - query_error.to_string().contains("Querier contract error"), - "wrong error returned by query" - ); - - let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); - - let execute_result = wasm.execute( - &contr_addr, - &ExecuteMsg::SwapMinOutput { - target_denom: ATOM.to_string(), - min_output_quantity: FPDecimal::from(2800u128), - }, - &[coin(12, ETH)], - &swapper, - ); - - assert!( - execute_result - .unwrap_err() - .to_string() - .contains("Querier contract error"), - "wrong error returned by execute" - ); - - let from_balance = query_bank_balance(&bank, ETH, swapper.address().as_str()); - let to_balance = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - assert_eq!( - from_balance, - FPDecimal::from(12u128), - "source balance changed after failed swap" - ); - assert_eq!( - to_balance, - FPDecimal::ZERO, - "target balance changed after failed swap" - ); - - let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); - assert_eq!( - contract_balances_after, contract_balances_before, - "contract balance has changed after failed swap" - ); -} - -#[test] -fn it_reverts_if_user_doesnt_have_enough_inj_to_pay_for_gas() { - let app = InjectiveTestApp::new(); - let wasm = Wasm::new(&app); - let exchange = Exchange::new(&app); - let bank = Bank::new(&app); - - let _signer = init_default_signer_account(&app); - let _validator = init_default_validator_account(&app); - let owner = init_rich_account(&app); - - let spot_market_1_id = launch_spot_market(&exchange, &owner, ETH, USDT); - let spot_market_2_id = launch_spot_market(&exchange, &owner, ATOM, USDT); - - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("100_000", USDT, Decimals::Six)], - ); - set_route_and_assert_success( - &wasm, - &owner, - &contr_addr, - ETH, - ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], - ); - - let swapper = must_init_account_with_funds(&app, &[coin(12, ETH), coin(10, INJ)]); - - let trader1 = init_rich_account(&app); - let trader2 = init_rich_account(&app); - let trader3 = init_rich_account(&app); - - create_eth_buy_orders(&app, &spot_market_1_id, &trader1, &trader2); - create_atom_sell_orders(&app, &spot_market_2_id, &trader1, &trader2, &trader3); - - app.increase_time(1); - - let query_result: RunnerResult = wasm.query( - &contr_addr, - &QueryMsg::GetOutputQuantity { - source_denom: ETH.to_string(), - target_denom: ATOM.to_string(), - from_quantity: FPDecimal::from(12u128), - }, - ); - - let target_quantity = query_result.unwrap().result_quantity; - - assert_eq!( - target_quantity, - FPDecimal::must_from_str("2893.886"), //slightly underestimated vs spreadsheet - "incorrect swap result estimate returned by query" - ); - - let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); - - let execute_result = wasm.execute( - &contr_addr, - &ExecuteMsg::SwapMinOutput { - target_denom: ATOM.to_string(), - min_output_quantity: FPDecimal::from(2800u128), - }, - &[coin(12, ETH)], - &swapper, - ); - - assert_eq!(execute_result.unwrap_err(), ExecuteError { msg: "spendable balance 10inj is smaller than 2500inj: insufficient funds: insufficient funds".to_string() }, "wrong error returned by execute"); - - let from_balance = query_bank_balance(&bank, ETH, swapper.address().as_str()); - let to_balance = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - assert_eq!( - from_balance, - FPDecimal::from(12u128), - "source balance changed after failed swap" - ); - assert_eq!( - to_balance, - FPDecimal::ZERO, - "target balance changed after failed swap" - ); - - let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); - assert_eq!( - contract_balances_after, contract_balances_before, - "contract balance has changed after failed swap" - ); -} - -#[test] -fn it_allows_admin_to_withdraw_all_funds_from_contract_to_his_address() { - let app = InjectiveTestApp::new(); - let wasm = Wasm::new(&app); - let bank = Bank::new(&app); - - let usdt_to_withdraw = str_coin("10_000", USDT, Decimals::Six); - let eth_to_withdraw = str_coin("0.00062", ETH, Decimals::Eighteen); - - let owner = must_init_account_with_funds( - &app, - &[ - eth_to_withdraw.clone(), - str_coin("1", INJ, Decimals::Eighteen), - usdt_to_withdraw.clone(), - ], - ); - - let initial_contract_balance = &[eth_to_withdraw, usdt_to_withdraw]; - let contr_addr = - init_self_relaying_contract_and_get_address(&wasm, &owner, initial_contract_balance); - - let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 2, - "wrong number of denoms in contract balances" - ); - - let execute_result = wasm.execute( - &contr_addr, - &ExecuteMsg::WithdrawSupportFunds { - coins: initial_contract_balance.to_vec(), - target_address: Addr::unchecked(owner.address()), - }, - &[], - &owner, - ); - - assert!(execute_result.is_ok(), "failed to withdraw support funds"); - let contract_balances_after = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_after.len(), - 0, - "contract had some balances after withdraw" - ); - - let owner_eth_balance = query_bank_balance(&bank, ETH, owner.address().as_str()); - assert_eq!( - owner_eth_balance, - FPDecimal::from(initial_contract_balance[0].amount), - "wrong owner eth balance after withdraw" - ); - - let owner_usdt_balance = query_bank_balance(&bank, USDT, owner.address().as_str()); - assert_eq!( - owner_usdt_balance, - FPDecimal::from(initial_contract_balance[1].amount), - "wrong owner usdt balance after withdraw" - ); -} - -#[test] -fn it_allows_admin_to_withdraw_all_funds_from_contract_to_other_address() { - let app = InjectiveTestApp::new(); - let wasm = Wasm::new(&app); - let bank = Bank::new(&app); - - let usdt_to_withdraw = str_coin("10_000", USDT, Decimals::Six); - let eth_to_withdraw = str_coin("0.00062", ETH, Decimals::Eighteen); - - let owner = must_init_account_with_funds( - &app, - &[ - eth_to_withdraw.clone(), - str_coin("1", INJ, Decimals::Eighteen), - usdt_to_withdraw.clone(), - ], - ); - - let initial_contract_balance = &[eth_to_withdraw, usdt_to_withdraw]; - let contr_addr = - init_self_relaying_contract_and_get_address(&wasm, &owner, initial_contract_balance); - - let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 2, - "wrong number of denoms in contract balances" - ); - - let random_dude = must_init_account_with_funds(&app, &[]); - - let execute_result = wasm.execute( - &contr_addr, - &ExecuteMsg::WithdrawSupportFunds { - coins: initial_contract_balance.to_vec(), - target_address: Addr::unchecked(random_dude.address()), - }, - &[], - &owner, - ); - - assert!(execute_result.is_ok(), "failed to withdraw support funds"); - let contract_balances_after = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_after.len(), - 0, - "contract had some balances after withdraw" - ); - - let random_dude_eth_balance = query_bank_balance(&bank, ETH, random_dude.address().as_str()); - assert_eq!( - random_dude_eth_balance, - FPDecimal::from(initial_contract_balance[0].amount), - "wrong owner eth balance after withdraw" - ); - - let random_dude_usdt_balance = query_bank_balance(&bank, USDT, random_dude.address().as_str()); - assert_eq!( - random_dude_usdt_balance, - FPDecimal::from(initial_contract_balance[1].amount), - "wrong owner usdt balance after withdraw" - ); -} - -#[test] -fn it_doesnt_allow_non_admin_to_withdraw_anything_from_contract() { - let app = InjectiveTestApp::new(); - let wasm = Wasm::new(&app); - let bank = Bank::new(&app); - - let usdt_to_withdraw = str_coin("10_000", USDT, Decimals::Six); - let eth_to_withdraw = str_coin("0.00062", ETH, Decimals::Eighteen); - - let owner = must_init_account_with_funds( - &app, - &[ - eth_to_withdraw.clone(), - str_coin("1", INJ, Decimals::Eighteen), - usdt_to_withdraw.clone(), - ], - ); - - let initial_contract_balance = &[eth_to_withdraw, usdt_to_withdraw]; - let contr_addr = - init_self_relaying_contract_and_get_address(&wasm, &owner, initial_contract_balance); - - let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 2, - "wrong number of denoms in contract balances" - ); - - let random_dude = must_init_account_with_funds(&app, &[coin(1_000_000_000_000, INJ)]); - - let execute_result = wasm.execute( - &contr_addr, - &ExecuteMsg::WithdrawSupportFunds { - coins: initial_contract_balance.to_vec(), - target_address: Addr::unchecked(owner.address()), - }, - &[], - &random_dude, - ); - - assert!( - execute_result.is_err(), - "succeeded to withdraw support funds" - ); - let contract_balances_after = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_after, contract_balances_before, - "contract balances changed after failed withdraw" - ); - - let random_dude_eth_balance = query_bank_balance(&bank, ETH, random_dude.address().as_str()); - assert_eq!( - random_dude_eth_balance, - FPDecimal::ZERO, - "random dude has some eth balance after failed withdraw" - ); - - let random_dude_usdt_balance = query_bank_balance(&bank, USDT, random_dude.address().as_str()); - assert_eq!( - random_dude_usdt_balance, - FPDecimal::ZERO, - "random dude has some usdt balance after failed withdraw" - ); -} - -fn create_eth_buy_orders( - app: &InjectiveTestApp, - market_id: &str, - trader1: &SigningAccount, - trader2: &SigningAccount, -) { - create_limit_order(app, trader1, market_id, OrderSide::Buy, 201_000, 5); - create_limit_order(app, trader2, market_id, OrderSide::Buy, 195_000, 4); - create_limit_order(app, trader2, market_id, OrderSide::Buy, 192_000, 3); -} - -fn create_atom_sell_orders( - app: &InjectiveTestApp, - market_id: &str, - trader1: &SigningAccount, - trader2: &SigningAccount, - trader3: &SigningAccount, -) { - create_limit_order(app, trader1, market_id, OrderSide::Sell, 800, 800); - create_limit_order(app, trader2, market_id, OrderSide::Sell, 810, 800); - create_limit_order(app, trader3, market_id, OrderSide::Sell, 820, 800); - create_limit_order(app, trader1, market_id, OrderSide::Sell, 830, 800); -} diff --git a/contracts/swap/src/testing/integration_realistic_tests_exact_quantity.rs b/contracts/swap/src/testing/integration_realistic_tests_exact_quantity.rs index c3c3f7b..60cf4c9 100644 --- a/contracts/swap/src/testing/integration_realistic_tests_exact_quantity.rs +++ b/contracts/swap/src/testing/integration_realistic_tests_exact_quantity.rs @@ -1,24 +1,19 @@ +use injective_math::FPDecimal; use injective_test_tube::{Account, Bank, Exchange, InjectiveTestApp, Module, Wasm}; use std::ops::Neg; use crate::helpers::Scaled; -use injective_math::FPDecimal; use crate::msg::{ExecuteMsg, QueryMsg}; use crate::testing::test_utils::{ - are_fpdecimals_approximately_equal, assert_fee_is_as_expected, - create_ninja_inj_both_side_orders, create_realistic_atom_usdt_sell_orders_from_spreadsheet, - create_realistic_eth_usdt_buy_orders_from_spreadsheet, - create_realistic_eth_usdt_sell_orders_from_spreadsheet, - create_realistic_inj_usdt_buy_orders_from_spreadsheet, - create_realistic_inj_usdt_sell_orders_from_spreadsheet, create_realistic_limit_order, - create_realistic_usdt_usdc_both_side_orders, human_to_dec, init_rich_account, - init_self_relaying_contract_and_get_address, launch_realistic_atom_usdt_spot_market, - launch_realistic_inj_usdt_spot_market, launch_realistic_ninja_inj_spot_market, - launch_realistic_usdt_usdc_spot_market, launch_realistic_weth_usdt_spot_market, - must_init_account_with_funds, query_all_bank_balances, query_bank_balance, - set_route_and_assert_success, str_coin, Decimals, OrderSide, ATOM, ETH, INJ, INJ_2, NINJA, - USDC, USDT, + are_fpdecimals_approximately_equal, assert_fee_is_as_expected, create_ninja_inj_both_side_orders, + create_realistic_atom_usdt_sell_orders_from_spreadsheet, create_realistic_eth_usdt_buy_orders_from_spreadsheet, + create_realistic_eth_usdt_sell_orders_from_spreadsheet, create_realistic_inj_usdt_buy_orders_from_spreadsheet, + create_realistic_inj_usdt_sell_orders_from_spreadsheet, create_realistic_limit_order, create_realistic_usdt_usdc_both_side_orders, human_to_dec, + init_rich_account, init_self_relaying_contract_and_get_address, launch_realistic_atom_usdt_spot_market, launch_realistic_inj_usdt_spot_market, + launch_realistic_ninja_inj_spot_market, launch_realistic_usdt_usdc_spot_market, launch_realistic_weth_usdt_spot_market, + must_init_account_with_funds, query_all_bank_balances, query_bank_balance, set_route_and_assert_success, str_coin, Decimals, OrderSide, ATOM, + ETH, INJ, INJ_2, NINJA, USDC, USDT, }; use crate::types::{FPCoin, SwapEstimationResult}; @@ -74,9 +69,7 @@ fn it_correctly_swaps_eth_to_get_very_high_exact_amount_of_atom() { let _signer = must_init_account_with_funds(&app, &[str_coin("1", INJ, Decimals::Eighteen)]); - let _validator = app - .get_first_validator_signing_account(INJ.to_string(), 1.2f64) - .unwrap(); + let _validator = app.get_first_validator_signing_account(INJ.to_string(), 1.2f64).unwrap(); let owner = must_init_account_with_funds( &app, &[ @@ -90,33 +83,21 @@ fn it_correctly_swaps_eth_to_get_very_high_exact_amount_of_atom() { let spot_market_1_id = launch_realistic_weth_usdt_spot_market(&exchange, &owner); let spot_market_2_id = launch_realistic_atom_usdt_spot_market(&exchange, &owner); - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("1_000", USDT, Decimals::Six)], - ); + let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("1_000", USDT, Decimals::Six)]); set_route_and_assert_success( &wasm, &owner, &contr_addr, ETH, ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], + vec![spot_market_1_id.as_str().into(), spot_market_2_id.as_str().into()], ); let trader1 = init_rich_account(&app); let trader2 = init_rich_account(&app); let trader3 = init_rich_account(&app); - create_realistic_eth_usdt_buy_orders_from_spreadsheet( - &app, - &spot_market_1_id, - &trader1, - &trader2, - ); + create_realistic_eth_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2); create_realistic_limit_order( &app, &trader1, @@ -128,13 +109,7 @@ fn it_correctly_swaps_eth_to_get_very_high_exact_amount_of_atom() { Decimals::Six, ); //order not present in the spreadsheet - create_realistic_atom_usdt_sell_orders_from_spreadsheet( - &app, - &spot_market_2_id, - &trader1, - &trader2, - &trader3, - ); + create_realistic_atom_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3); create_realistic_limit_order( &app, &trader1, @@ -152,18 +127,11 @@ fn it_correctly_swaps_eth_to_get_very_high_exact_amount_of_atom() { let swapper = must_init_account_with_funds( &app, - &[ - str_coin(eth_to_swap, ETH, Decimals::Eighteen), - str_coin("1", INJ, Decimals::Eighteen), - ], + &[str_coin(eth_to_swap, ETH, Decimals::Eighteen), str_coin("1", INJ, Decimals::Eighteen)], ); let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_before.len(), 1, "wrong number of denoms in contract balances"); let exact_quantity_to_receive = human_to_dec("1014.19", Decimals::Six); @@ -189,15 +157,11 @@ fn it_correctly_swaps_eth_to_get_very_high_exact_amount_of_atom() { ) .unwrap(); - let expected_difference = - human_to_dec(eth_to_swap, Decimals::Eighteen) - query_result.result_quantity; + let expected_difference = human_to_dec(eth_to_swap, Decimals::Eighteen) - query_result.result_quantity; let swapper_eth_balance_after = query_bank_balance(&bank, ETH, swapper.address().as_str()); let swapper_atom_balance_after = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - assert_eq!( - swapper_eth_balance_after, expected_difference, - "wrong amount of ETH was exchanged" - ); + assert_eq!(swapper_eth_balance_after, expected_difference, "wrong amount of ETH was exchanged"); assert!( swapper_atom_balance_after >= exact_quantity_to_receive, @@ -209,11 +173,7 @@ fn it_correctly_swaps_eth_to_get_very_high_exact_amount_of_atom() { let one_percent_diff = exact_quantity_to_receive * FPDecimal::must_from_str("0.01"); assert!( - are_fpdecimals_approximately_equal( - swapper_atom_balance_after, - exact_quantity_to_receive, - one_percent_diff, - ), + are_fpdecimals_approximately_equal(swapper_atom_balance_after, exact_quantity_to_receive, one_percent_diff,), "swapper did not receive expected exact amount +/- 1% -> expected: {} ATOM, actual: {} ATOM, max diff: {} ATOM", exact_quantity_to_receive.scaled(Decimals::Six.get_decimals().neg()), swapper_atom_balance_after.scaled(Decimals::Six.get_decimals().neg()), @@ -221,31 +181,21 @@ fn it_correctly_swaps_eth_to_get_very_high_exact_amount_of_atom() { ); let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_after.len(), 1, "wrong number of denoms in contract balances"); - let contract_usdt_balance_before = - FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); - let contract_usdt_balance_after = - FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); + let contract_usdt_balance_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); + let contract_usdt_balance_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); assert!( contract_usdt_balance_after >= contract_usdt_balance_before, - "Contract lost some money after swap. Actual balance: {contract_usdt_balance_after}, previous balance: {contract_usdt_balance_before}", + "Contract lost some money after swap. Actual balance: {contract_usdt_balance_after}, previous balance: {contract_usdt_balance_before}", ); // contract is allowed to earn extra 0.73 USDT from the swap of ~$8450 worth of ETH let max_diff = human_to_dec("0.8", Decimals::Six); assert!( - are_fpdecimals_approximately_equal( - contract_usdt_balance_after, - contract_usdt_balance_before, - max_diff, - ), + are_fpdecimals_approximately_equal(contract_usdt_balance_after, contract_usdt_balance_before, max_diff,), "Contract balance changed too much. Actual balance: {}, previous balance: {}. Max diff: {}", contract_usdt_balance_after.scaled(Decimals::Six.get_decimals().neg()), contract_usdt_balance_before.scaled(Decimals::Six.get_decimals().neg()), @@ -287,9 +237,7 @@ fn it_correctly_swaps_inj_to_get_very_high_exact_amount_of_atom() { let _signer = must_init_account_with_funds(&app, &[str_coin("1", INJ, Decimals::Eighteen)]); - let _validator = app - .get_first_validator_signing_account(INJ.to_string(), 1.2f64) - .unwrap(); + let _validator = app.get_first_validator_signing_account(INJ.to_string(), 1.2f64).unwrap(); let owner = must_init_account_with_funds( &app, &[ @@ -304,33 +252,21 @@ fn it_correctly_swaps_inj_to_get_very_high_exact_amount_of_atom() { let spot_market_1_id = launch_realistic_inj_usdt_spot_market(&exchange, &owner); let spot_market_2_id = launch_realistic_atom_usdt_spot_market(&exchange, &owner); - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("1_000", USDT, Decimals::Six)], - ); + let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("1_000", USDT, Decimals::Six)]); set_route_and_assert_success( &wasm, &owner, &contr_addr, INJ_2, ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], + vec![spot_market_1_id.as_str().into(), spot_market_2_id.as_str().into()], ); let trader1 = init_rich_account(&app); let trader2 = init_rich_account(&app); let trader3 = init_rich_account(&app); - create_realistic_inj_usdt_buy_orders_from_spreadsheet( - &app, - &spot_market_1_id, - &trader1, - &trader2, - ); + create_realistic_inj_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2); create_realistic_limit_order( &app, &trader1, @@ -342,13 +278,7 @@ fn it_correctly_swaps_inj_to_get_very_high_exact_amount_of_atom() { Decimals::Six, ); //order not present in the spreadsheet - create_realistic_atom_usdt_sell_orders_from_spreadsheet( - &app, - &spot_market_2_id, - &trader1, - &trader2, - &trader3, - ); + create_realistic_atom_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3); create_realistic_limit_order( &app, &trader1, @@ -366,18 +296,11 @@ fn it_correctly_swaps_inj_to_get_very_high_exact_amount_of_atom() { let swapper = must_init_account_with_funds( &app, - &[ - str_coin(inj_to_swap, INJ_2, Decimals::Eighteen), - str_coin("1", INJ, Decimals::Eighteen), - ], + &[str_coin(inj_to_swap, INJ_2, Decimals::Eighteen), str_coin("1", INJ, Decimals::Eighteen)], ); let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_before.len(), 1, "wrong number of denoms in contract balances"); let exact_quantity_to_receive = human_to_dec("1010.12", Decimals::Six); let max_diff_percentage = Percent("0.01"); @@ -404,15 +327,11 @@ fn it_correctly_swaps_inj_to_get_very_high_exact_amount_of_atom() { ) .unwrap(); - let expected_difference = - human_to_dec(inj_to_swap, Decimals::Eighteen) - query_result.result_quantity; + let expected_difference = human_to_dec(inj_to_swap, Decimals::Eighteen) - query_result.result_quantity; let swapper_inj_balance_after = query_bank_balance(&bank, INJ_2, swapper.address().as_str()); let swapper_atom_balance_after = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - assert_eq!( - swapper_inj_balance_after, expected_difference, - "wrong amount of INJ was exchanged" - ); + assert_eq!(swapper_inj_balance_after, expected_difference, "wrong amount of INJ was exchanged"); assert!( swapper_atom_balance_after >= exact_quantity_to_receive, @@ -421,15 +340,10 @@ fn it_correctly_swaps_inj_to_get_very_high_exact_amount_of_atom() { swapper_atom_balance_after.scaled(Decimals::Six.get_decimals().neg()) ); - let one_percent_diff = exact_quantity_to_receive - * (FPDecimal::must_from_str(max_diff_percentage.0) / FPDecimal::from(100u128)); + let one_percent_diff = exact_quantity_to_receive * (FPDecimal::must_from_str(max_diff_percentage.0) / FPDecimal::from(100u128)); assert!( - are_fpdecimals_approximately_equal( - swapper_atom_balance_after, - exact_quantity_to_receive, - one_percent_diff, - ), + are_fpdecimals_approximately_equal(swapper_atom_balance_after, exact_quantity_to_receive, one_percent_diff,), "swapper did not receive expected exact ATOM amount +/- {}% -> expected: {} ATOM, actual: {} ATOM, max diff: {} ATOM", max_diff_percentage.0, exact_quantity_to_receive.scaled(Decimals::Six.get_decimals().neg()), @@ -438,31 +352,21 @@ fn it_correctly_swaps_inj_to_get_very_high_exact_amount_of_atom() { ); let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_after.len(), 1, "wrong number of denoms in contract balances"); - let contract_usdt_balance_before = - FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); - let contract_usdt_balance_after = - FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); + let contract_usdt_balance_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); + let contract_usdt_balance_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); assert!( contract_usdt_balance_after >= contract_usdt_balance_before, - "Contract lost some money after swap. Actual balance: {contract_usdt_balance_after}, previous balance: {contract_usdt_balance_before}", + "Contract lost some money after swap. Actual balance: {contract_usdt_balance_after}, previous balance: {contract_usdt_balance_before}", ); // contract is allowed to earn extra 0.7 USDT from the swap of ~$8150 worth of INJ let max_diff = human_to_dec("0.7", Decimals::Six); assert!( - are_fpdecimals_approximately_equal( - contract_usdt_balance_after, - contract_usdt_balance_before, - max_diff, - ), + are_fpdecimals_approximately_equal(contract_usdt_balance_after, contract_usdt_balance_before, max_diff,), "Contract balance changed too much. Actual balance: {} USDT, previous balance: {} USDT. Max diff: {} USDT", contract_usdt_balance_after.scaled(Decimals::Six.get_decimals().neg()), contract_usdt_balance_before.scaled(Decimals::Six.get_decimals().neg()), @@ -472,18 +376,12 @@ fn it_correctly_swaps_inj_to_get_very_high_exact_amount_of_atom() { #[test] fn it_swaps_inj_to_get_minimum_exact_amount_of_eth() { - exact_two_hop_inj_eth_swap_test_template( - human_to_dec("0.001", Decimals::Eighteen), - Percent("0"), - ) + exact_two_hop_inj_eth_swap_test_template(human_to_dec("0.001", Decimals::Eighteen), Percent("0")) } #[test] fn it_swaps_inj_to_get_low_exact_amount_of_eth() { - exact_two_hop_inj_eth_swap_test_template( - human_to_dec("0.012", Decimals::Eighteen), - Percent("0"), - ) + exact_two_hop_inj_eth_swap_test_template(human_to_dec("0.012", Decimals::Eighteen), Percent("0")) } #[test] @@ -505,9 +403,7 @@ fn it_swaps_inj_to_get_very_high_exact_amount_of_eth() { let _signer = must_init_account_with_funds(&app, &[str_coin("1", INJ, Decimals::Eighteen)]); - let _validator = app - .get_first_validator_signing_account(INJ.to_string(), 1.2f64) - .unwrap(); + let _validator = app.get_first_validator_signing_account(INJ.to_string(), 1.2f64).unwrap(); let owner = must_init_account_with_funds( &app, &[ @@ -521,33 +417,21 @@ fn it_swaps_inj_to_get_very_high_exact_amount_of_eth() { let spot_market_1_id = launch_realistic_inj_usdt_spot_market(&exchange, &owner); let spot_market_2_id = launch_realistic_weth_usdt_spot_market(&exchange, &owner); - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("1_000", USDT, Decimals::Six)], - ); + let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("1_000", USDT, Decimals::Six)]); set_route_and_assert_success( &wasm, &owner, &contr_addr, INJ_2, ETH, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], + vec![spot_market_1_id.as_str().into(), spot_market_2_id.as_str().into()], ); let trader1 = init_rich_account(&app); let trader2 = init_rich_account(&app); let trader3 = init_rich_account(&app); - create_realistic_inj_usdt_buy_orders_from_spreadsheet( - &app, - &spot_market_1_id, - &trader1, - &trader2, - ); + create_realistic_inj_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2); create_realistic_limit_order( &app, &trader1, @@ -558,13 +442,7 @@ fn it_swaps_inj_to_get_very_high_exact_amount_of_eth() { Decimals::Eighteen, Decimals::Six, ); //order not present in the spreadsheet - create_realistic_eth_usdt_sell_orders_from_spreadsheet( - &app, - &spot_market_2_id, - &trader1, - &trader2, - &trader3, - ); + create_realistic_eth_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3); create_realistic_limit_order( &app, &trader3, @@ -583,18 +461,11 @@ fn it_swaps_inj_to_get_very_high_exact_amount_of_eth() { let swapper = must_init_account_with_funds( &app, - &[ - str_coin(inj_to_swap, INJ_2, Decimals::Eighteen), - str_coin("1", INJ, Decimals::Eighteen), - ], + &[str_coin(inj_to_swap, INJ_2, Decimals::Eighteen), str_coin("1", INJ, Decimals::Eighteen)], ); let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_before.len(), 1, "wrong number of denoms in contract balances"); let query_result: SwapEstimationResult = wasm .query( @@ -618,15 +489,11 @@ fn it_swaps_inj_to_get_very_high_exact_amount_of_eth() { ) .unwrap(); - let expected_difference = - human_to_dec(inj_to_swap, Decimals::Eighteen) - query_result.result_quantity; + let expected_difference = human_to_dec(inj_to_swap, Decimals::Eighteen) - query_result.result_quantity; let swapper_inj_balance_after = query_bank_balance(&bank, INJ_2, swapper.address().as_str()); let swapper_atom_balance_after = query_bank_balance(&bank, ETH, swapper.address().as_str()); - assert_eq!( - swapper_inj_balance_after, expected_difference, - "wrong amount of INJ was exchanged" - ); + assert_eq!(swapper_inj_balance_after, expected_difference, "wrong amount of INJ was exchanged"); assert!( swapper_atom_balance_after >= exact_quantity_to_receive, @@ -636,15 +503,10 @@ fn it_swaps_inj_to_get_very_high_exact_amount_of_eth() { ); let max_diff_percent = Percent("0"); - let one_percent_diff = exact_quantity_to_receive - * (FPDecimal::must_from_str(max_diff_percent.0) / FPDecimal::from(100u128)); + let one_percent_diff = exact_quantity_to_receive * (FPDecimal::must_from_str(max_diff_percent.0) / FPDecimal::from(100u128)); assert!( - are_fpdecimals_approximately_equal( - swapper_atom_balance_after, - exact_quantity_to_receive, - one_percent_diff, - ), + are_fpdecimals_approximately_equal(swapper_atom_balance_after, exact_quantity_to_receive, one_percent_diff,), "swapper did not receive expected exact ETH amount +/- {}% -> expected: {} ETH, actual: {} ETH, max diff: {} ETH", max_diff_percent.0, exact_quantity_to_receive.scaled(Decimals::Eighteen.get_decimals().neg()), @@ -653,16 +515,10 @@ fn it_swaps_inj_to_get_very_high_exact_amount_of_eth() { ); let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_after.len(), 1, "wrong number of denoms in contract balances"); - let contract_usdt_balance_before = - FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); - let contract_usdt_balance_after = - FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); + let contract_usdt_balance_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); + let contract_usdt_balance_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); assert!( contract_usdt_balance_after >= contract_usdt_balance_before, @@ -673,11 +529,7 @@ fn it_swaps_inj_to_get_very_high_exact_amount_of_eth() { let max_diff = human_to_dec("1.6", Decimals::Six); assert!( - are_fpdecimals_approximately_equal( - contract_usdt_balance_after, - contract_usdt_balance_before, - max_diff, - ), + are_fpdecimals_approximately_equal(contract_usdt_balance_after, contract_usdt_balance_before, max_diff,), "Contract balance changed too much. Actual balance: {} USDT, previous balance: {} USDT. Max diff: {} USDT", contract_usdt_balance_after.scaled(Decimals::Six.get_decimals().neg()), contract_usdt_balance_before.scaled(Decimals::Six.get_decimals().neg()), @@ -693,9 +545,7 @@ fn it_correctly_swaps_between_markets_using_different_quote_assets_self_relaying let bank = Bank::new(&app); let _signer = must_init_account_with_funds(&app, &[str_coin("1", INJ, Decimals::Eighteen)]); - let _validator = app - .get_first_validator_signing_account(INJ.to_string(), 1.2f64) - .unwrap(); + let _validator = app.get_first_validator_signing_account(INJ.to_string(), 1.2f64).unwrap(); let owner = must_init_account_with_funds( &app, @@ -713,10 +563,7 @@ fn it_correctly_swaps_between_markets_using_different_quote_assets_self_relaying let contr_addr = init_self_relaying_contract_and_get_address( &wasm, &owner, - &[ - str_coin("10", USDC, Decimals::Six), - str_coin("500", USDT, Decimals::Six), - ], + &[str_coin("10", USDC, Decimals::Six), str_coin("500", USDT, Decimals::Six)], ); set_route_and_assert_success( &wasm, @@ -724,32 +571,18 @@ fn it_correctly_swaps_between_markets_using_different_quote_assets_self_relaying &contr_addr, INJ_2, USDC, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], + vec![spot_market_1_id.as_str().into(), spot_market_2_id.as_str().into()], ); let trader1 = init_rich_account(&app); let trader2 = init_rich_account(&app); - create_realistic_inj_usdt_buy_orders_from_spreadsheet( - &app, - &spot_market_1_id, - &trader1, - &trader2, - ); + create_realistic_inj_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2); create_realistic_usdt_usdc_both_side_orders(&app, &spot_market_2_id, &trader1); app.increase_time(1); - let swapper = must_init_account_with_funds( - &app, - &[ - str_coin("1", INJ, Decimals::Eighteen), - str_coin("1", INJ_2, Decimals::Eighteen), - ], - ); + let swapper = must_init_account_with_funds(&app, &[str_coin("1", INJ, Decimals::Eighteen), str_coin("1", INJ_2, Decimals::Eighteen)]); let inj_to_swap = "1"; let to_output_quantity = human_to_dec("8", Decimals::Six); @@ -788,18 +621,10 @@ fn it_correctly_swaps_between_markets_using_different_quote_assets_self_relaying ]; // we don't care too much about decimal fraction of the fee - assert_fee_is_as_expected( - &mut query_result.expected_fees, - &mut expected_fees, - human_to_dec("0.1", Decimals::Six), - ); + assert_fee_is_as_expected(&mut query_result.expected_fees, &mut expected_fees, human_to_dec("0.1", Decimals::Six)); let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 2, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_before.len(), 2, "wrong number of denoms in contract balances"); wasm.execute( &contr_addr, @@ -815,12 +640,8 @@ fn it_correctly_swaps_between_markets_using_different_quote_assets_self_relaying let from_balance = query_bank_balance(&bank, INJ_2, swapper.address().as_str()); let to_balance = query_bank_balance(&bank, USDC, swapper.address().as_str()); - let expected_inj_leftover = - human_to_dec(inj_to_swap, Decimals::Eighteen) - expected_input_quantity; - assert_eq!( - from_balance, expected_inj_leftover, - "incorrect original amount was left after swap" - ); + let expected_inj_leftover = human_to_dec(inj_to_swap, Decimals::Eighteen) - expected_input_quantity; + assert_eq!(from_balance, expected_inj_leftover, "incorrect original amount was left after swap"); let expected_amount = human_to_dec("8.00711", Decimals::Six); @@ -833,17 +654,11 @@ fn it_correctly_swaps_between_markets_using_different_quote_assets_self_relaying ); let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 2, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_after.len(), 2, "wrong number of denoms in contract balances"); // let's check contract's USDT balance - let contract_usdt_balance_before = - FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); - let contract_usdt_balance_after = - FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); + let contract_usdt_balance_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); + let contract_usdt_balance_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); assert!( contract_usdt_balance_after >= contract_usdt_balance_before, @@ -856,11 +671,7 @@ fn it_correctly_swaps_between_markets_using_different_quote_assets_self_relaying let max_diff = human_to_dec("0.001", Decimals::Six); assert!( - are_fpdecimals_approximately_equal( - contract_usdt_balance_after, - contract_usdt_balance_before, - max_diff, - ), + are_fpdecimals_approximately_equal(contract_usdt_balance_after, contract_usdt_balance_before, max_diff,), "Contract balance changed too much. Actual balance: {} USDT, previous balance: {} USDT. Max diff: {} USDT", contract_usdt_balance_after.scaled(Decimals::Six.get_decimals().neg()), contract_usdt_balance_before.scaled(Decimals::Six.get_decimals().neg()), @@ -868,10 +679,8 @@ fn it_correctly_swaps_between_markets_using_different_quote_assets_self_relaying ); // let's check contract's USDC balance - let contract_usdc_balance_before = - FPDecimal::must_from_str(contract_balances_before[1].amount.as_str()); - let contract_usdc_balance_after = - FPDecimal::must_from_str(contract_balances_after[1].amount.as_str()); + let contract_usdc_balance_before = FPDecimal::must_from_str(contract_balances_before[1].amount.as_str()); + let contract_usdc_balance_after = FPDecimal::must_from_str(contract_balances_after[1].amount.as_str()); assert!( contract_usdc_balance_after >= contract_usdc_balance_before, @@ -884,11 +693,7 @@ fn it_correctly_swaps_between_markets_using_different_quote_assets_self_relaying let max_diff = human_to_dec("0.001", Decimals::Six); assert!( - are_fpdecimals_approximately_equal( - contract_usdc_balance_after, - contract_usdc_balance_before, - max_diff, - ), + are_fpdecimals_approximately_equal(contract_usdc_balance_after, contract_usdc_balance_before, max_diff,), "Contract balance changed too much. Actual balance: {} USDC, previous balance: {} USDC. Max diff: {} USDC", contract_usdc_balance_after.scaled(Decimals::Six.get_decimals().neg()), contract_usdc_balance_before.scaled(Decimals::Six.get_decimals().neg()), @@ -904,9 +709,7 @@ fn it_correctly_swaps_between_markets_using_different_quote_assets_self_relaying let bank = Bank::new(&app); let _signer = must_init_account_with_funds(&app, &[str_coin("1", INJ, Decimals::Eighteen)]); - let _validator = app - .get_first_validator_signing_account(INJ.to_string(), 1.2f64) - .unwrap(); + let _validator = app.get_first_validator_signing_account(INJ.to_string(), 1.2f64).unwrap(); let owner = must_init_account_with_funds( &app, @@ -937,10 +740,7 @@ fn it_correctly_swaps_between_markets_using_different_quote_assets_self_relaying &contr_addr, USDT, NINJA, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], + vec![spot_market_1_id.as_str().into(), spot_market_2_id.as_str().into()], ); let trader1 = init_rich_account(&app); @@ -950,13 +750,7 @@ fn it_correctly_swaps_between_markets_using_different_quote_assets_self_relaying app.increase_time(1); - let swapper = must_init_account_with_funds( - &app, - &[ - str_coin("1", INJ, Decimals::Eighteen), - str_coin("100000", USDT, Decimals::Six), - ], - ); + let swapper = must_init_account_with_funds(&app, &[str_coin("1", INJ, Decimals::Eighteen), str_coin("100000", USDT, Decimals::Six)]); let usdt_to_swap = "100000"; let to_output_quantity = human_to_dec("501000", Decimals::Six); @@ -990,18 +784,12 @@ fn it_correctly_swaps_between_markets_using_different_quote_assets_self_relaying from_balance_before, expected_from_balance_before, "incorrect original amount was left after swap" ); - assert_eq!( - to_balance_before, expected_to_balance_before, - "incorrect target amount after swap" - ); + assert_eq!(to_balance_before, expected_to_balance_before, "incorrect target amount after swap"); assert_eq!( from_balance_after, expected_from_balance_after, "incorrect original amount was left after swap" ); - assert_eq!( - to_balance_after, expected_to_balance_after, - "incorrect target amount after swap" - ); + assert_eq!(to_balance_after, expected_to_balance_after, "incorrect target amount after swap"); } #[test] @@ -1013,9 +801,7 @@ fn it_doesnt_lose_buffer_if_exact_swap_of_eth_to_atom_is_executed_multiple_times let _signer = must_init_account_with_funds(&app, &[str_coin("1", INJ, Decimals::Eighteen)]); - let _validator = app - .get_first_validator_signing_account(INJ.to_string(), 1.2f64) - .unwrap(); + let _validator = app.get_first_validator_signing_account(INJ.to_string(), 1.2f64).unwrap(); let owner = must_init_account_with_funds( &app, @@ -1030,11 +816,7 @@ fn it_doesnt_lose_buffer_if_exact_swap_of_eth_to_atom_is_executed_multiple_times let spot_market_1_id = launch_realistic_weth_usdt_spot_market(&exchange, &owner); let spot_market_2_id = launch_realistic_atom_usdt_spot_market(&exchange, &owner); - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("1_000", USDT, Decimals::Six)], - ); + let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("1_000", USDT, Decimals::Six)]); set_route_and_assert_success( &wasm, @@ -1042,10 +824,7 @@ fn it_doesnt_lose_buffer_if_exact_swap_of_eth_to_atom_is_executed_multiple_times &contr_addr, ETH, ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], + vec![spot_market_1_id.as_str().into(), spot_market_2_id.as_str().into()], ); let trader1 = init_rich_account(&app); @@ -1059,9 +838,7 @@ fn it_doesnt_lose_buffer_if_exact_swap_of_eth_to_atom_is_executed_multiple_times &app, &[ str_coin( - (FPDecimal::must_from_str(eth_to_swap) * FPDecimal::from(iterations)) - .to_string() - .as_str(), + (FPDecimal::must_from_str(eth_to_swap) * FPDecimal::from(iterations)).to_string().as_str(), ETH, Decimals::Eighteen, ), @@ -1070,28 +847,13 @@ fn it_doesnt_lose_buffer_if_exact_swap_of_eth_to_atom_is_executed_multiple_times ); let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_before.len(), 1, "wrong number of denoms in contract balances"); let mut counter = 0; while counter < iterations { - create_realistic_eth_usdt_buy_orders_from_spreadsheet( - &app, - &spot_market_1_id, - &trader1, - &trader2, - ); - create_realistic_atom_usdt_sell_orders_from_spreadsheet( - &app, - &spot_market_2_id, - &trader1, - &trader2, - &trader3, - ); + create_realistic_eth_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2); + create_realistic_atom_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3); app.increase_time(1); @@ -1110,16 +872,10 @@ fn it_doesnt_lose_buffer_if_exact_swap_of_eth_to_atom_is_executed_multiple_times } let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_after.len(), 1, "wrong number of denoms in contract balances"); - let contract_balance_usdt_after = - FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); - let contract_balance_usdt_before = - FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); + let contract_balance_usdt_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); + let contract_balance_usdt_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); assert!( contract_balance_usdt_after >= contract_balance_usdt_before, @@ -1130,14 +886,12 @@ fn it_doesnt_lose_buffer_if_exact_swap_of_eth_to_atom_is_executed_multiple_times // won't change balance by more than 0.7 * 100 = 70 USDT let max_diff = human_to_dec("0.7", Decimals::Six) * FPDecimal::from(iterations); - assert!(are_fpdecimals_approximately_equal( - contract_balance_usdt_after, - contract_balance_usdt_before, - max_diff, - ), "Contract balance changed too much. Starting balance: {}, Current balance: {}. Max diff: {}", - contract_balance_usdt_before.scaled(Decimals::Six.get_decimals().neg()), - contract_balance_usdt_after.scaled(Decimals::Six.get_decimals().neg()), - max_diff.scaled(Decimals::Six.get_decimals().neg()) + assert!( + are_fpdecimals_approximately_equal(contract_balance_usdt_after, contract_balance_usdt_before, max_diff,), + "Contract balance changed too much. Starting balance: {}, Current balance: {}. Max diff: {}", + contract_balance_usdt_before.scaled(Decimals::Six.get_decimals().neg()), + contract_balance_usdt_after.scaled(Decimals::Six.get_decimals().neg()), + max_diff.scaled(Decimals::Six.get_decimals().neg()) ); } @@ -1150,9 +904,7 @@ fn it_reverts_when_funds_provided_are_below_required_to_get_exact_amount() { let _signer = must_init_account_with_funds(&app, &[str_coin("1", INJ, Decimals::Eighteen)]); - let _validator = app - .get_first_validator_signing_account(INJ.to_string(), 1.2f64) - .unwrap(); + let _validator = app.get_first_validator_signing_account(INJ.to_string(), 1.2f64).unwrap(); let owner = must_init_account_with_funds( &app, &[ @@ -1167,40 +919,22 @@ fn it_reverts_when_funds_provided_are_below_required_to_get_exact_amount() { let spot_market_1_id = launch_realistic_inj_usdt_spot_market(&exchange, &owner); let spot_market_2_id = launch_realistic_atom_usdt_spot_market(&exchange, &owner); - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("1_000", USDT, Decimals::Six)], - ); + let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("1_000", USDT, Decimals::Six)]); set_route_and_assert_success( &wasm, &owner, &contr_addr, INJ_2, ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], + vec![spot_market_1_id.as_str().into(), spot_market_2_id.as_str().into()], ); let trader1 = init_rich_account(&app); let trader2 = init_rich_account(&app); let trader3 = init_rich_account(&app); - create_realistic_inj_usdt_buy_orders_from_spreadsheet( - &app, - &spot_market_1_id, - &trader1, - &trader2, - ); - create_realistic_atom_usdt_sell_orders_from_spreadsheet( - &app, - &spot_market_2_id, - &trader1, - &trader2, - &trader3, - ); + create_realistic_inj_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2); + create_realistic_atom_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3); app.increase_time(1); @@ -1208,18 +942,11 @@ fn it_reverts_when_funds_provided_are_below_required_to_get_exact_amount() { let swapper = must_init_account_with_funds( &app, - &[ - str_coin(inj_to_swap, INJ_2, Decimals::Eighteen), - str_coin("1", INJ, Decimals::Eighteen), - ], + &[str_coin(inj_to_swap, INJ_2, Decimals::Eighteen), str_coin("1", INJ, Decimals::Eighteen)], ); let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_before.len(), 1, "wrong number of denoms in contract balances"); let exact_quantity_to_receive = human_to_dec("600", Decimals::Six); let swapper_inj_balance_before = query_bank_balance(&bank, INJ_2, swapper.address().as_str()); @@ -1247,33 +974,25 @@ fn it_reverts_when_funds_provided_are_below_required_to_get_exact_amount() { ) .unwrap_err(); - assert!(execute_result.to_string().contains("Provided amount of 608000000000000000000 is below required amount of 609714000000000000000"), "wrong error message"); + assert!( + execute_result + .to_string() + .contains("Provided amount of 608000000000000000000 is below required amount of 609714000000000000000"), + "wrong error message" + ); let swapper_inj_balance_after = query_bank_balance(&bank, INJ_2, swapper.address().as_str()); let swapper_atom_balance_after = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - assert_eq!( - swapper_inj_balance_before, swapper_inj_balance_after, - "some amount of INJ was exchanged" - ); + assert_eq!(swapper_inj_balance_before, swapper_inj_balance_after, "some amount of INJ was exchanged"); - assert_eq!( - FPDecimal::ZERO, - swapper_atom_balance_after, - "swapper received some ATOM" - ); + assert_eq!(FPDecimal::ZERO, swapper_atom_balance_after, "swapper received some ATOM"); let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_after.len(), 1, "wrong number of denoms in contract balances"); - let contract_usdt_balance_before = - FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); - let contract_usdt_balance_after = - FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); + let contract_usdt_balance_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); + let contract_usdt_balance_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); assert_eq!( contract_usdt_balance_after, contract_usdt_balance_before, @@ -1284,10 +1003,7 @@ fn it_reverts_when_funds_provided_are_below_required_to_get_exact_amount() { // TEST TEMPLATES // source much more expensive than target -fn exact_two_hop_eth_atom_swap_test_template( - exact_quantity_to_receive: FPDecimal, - max_diff_percentage: Percent, -) { +fn exact_two_hop_eth_atom_swap_test_template(exact_quantity_to_receive: FPDecimal, max_diff_percentage: Percent) { let app = InjectiveTestApp::new(); let wasm = Wasm::new(&app); let exchange = Exchange::new(&app); @@ -1295,9 +1011,7 @@ fn exact_two_hop_eth_atom_swap_test_template( let _signer = must_init_account_with_funds(&app, &[str_coin("1", INJ, Decimals::Eighteen)]); - let _validator = app - .get_first_validator_signing_account(INJ.to_string(), 1.2f64) - .unwrap(); + let _validator = app.get_first_validator_signing_account(INJ.to_string(), 1.2f64).unwrap(); let owner = must_init_account_with_funds( &app, &[ @@ -1311,40 +1025,22 @@ fn exact_two_hop_eth_atom_swap_test_template( let spot_market_1_id = launch_realistic_weth_usdt_spot_market(&exchange, &owner); let spot_market_2_id = launch_realistic_atom_usdt_spot_market(&exchange, &owner); - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("1_000", USDT, Decimals::Six)], - ); + let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("1_000", USDT, Decimals::Six)]); set_route_and_assert_success( &wasm, &owner, &contr_addr, ETH, ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], + vec![spot_market_1_id.as_str().into(), spot_market_2_id.as_str().into()], ); let trader1 = init_rich_account(&app); let trader2 = init_rich_account(&app); let trader3 = init_rich_account(&app); - create_realistic_eth_usdt_buy_orders_from_spreadsheet( - &app, - &spot_market_1_id, - &trader1, - &trader2, - ); - create_realistic_atom_usdt_sell_orders_from_spreadsheet( - &app, - &spot_market_2_id, - &trader1, - &trader2, - &trader3, - ); + create_realistic_eth_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2); + create_realistic_atom_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3); app.increase_time(1); @@ -1352,18 +1048,11 @@ fn exact_two_hop_eth_atom_swap_test_template( let swapper = must_init_account_with_funds( &app, - &[ - str_coin(eth_to_swap, ETH, Decimals::Eighteen), - str_coin("1", INJ, Decimals::Eighteen), - ], + &[str_coin(eth_to_swap, ETH, Decimals::Eighteen), str_coin("1", INJ, Decimals::Eighteen)], ); let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_before.len(), 1, "wrong number of denoms in contract balances"); let query_result: SwapEstimationResult = wasm .query( @@ -1387,18 +1076,13 @@ fn exact_two_hop_eth_atom_swap_test_template( ) .unwrap(); - let expected_difference = - human_to_dec(eth_to_swap, Decimals::Eighteen) - query_result.result_quantity; + let expected_difference = human_to_dec(eth_to_swap, Decimals::Eighteen) - query_result.result_quantity; let swapper_eth_balance_after = query_bank_balance(&bank, ETH, swapper.address().as_str()); let swapper_atom_balance_after = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - assert_eq!( - swapper_eth_balance_after, expected_difference, - "wrong amount of ETH was exchanged" - ); + assert_eq!(swapper_eth_balance_after, expected_difference, "wrong amount of ETH was exchanged"); - let one_percent_diff = exact_quantity_to_receive - * (FPDecimal::must_from_str(max_diff_percentage.0) / FPDecimal::from(100u128)); + let one_percent_diff = exact_quantity_to_receive * (FPDecimal::must_from_str(max_diff_percentage.0) / FPDecimal::from(100u128)); assert!( swapper_atom_balance_after >= exact_quantity_to_receive, @@ -1408,11 +1092,7 @@ fn exact_two_hop_eth_atom_swap_test_template( ); assert!( - are_fpdecimals_approximately_equal( - swapper_atom_balance_after, - exact_quantity_to_receive, - one_percent_diff, - ), + are_fpdecimals_approximately_equal(swapper_atom_balance_after, exact_quantity_to_receive, one_percent_diff,), "swapper did not receive expected exact amount +/- {}% -> expected: {} ATOM, actual: {} ATOM, max diff: {} ATOM", max_diff_percentage.0, exact_quantity_to_receive.scaled(Decimals::Six.get_decimals().neg()), @@ -1421,16 +1101,10 @@ fn exact_two_hop_eth_atom_swap_test_template( ); let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_after.len(), 1, "wrong number of denoms in contract balances"); - let contract_usdt_balance_before = - FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); - let contract_usdt_balance_after = - FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); + let contract_usdt_balance_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); + let contract_usdt_balance_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); assert!( contract_usdt_balance_after >= contract_usdt_balance_before, @@ -1441,11 +1115,7 @@ fn exact_two_hop_eth_atom_swap_test_template( let max_diff = human_to_dec("0.7", Decimals::Six); assert!( - are_fpdecimals_approximately_equal( - contract_usdt_balance_after, - contract_usdt_balance_before, - max_diff, - ), + are_fpdecimals_approximately_equal(contract_usdt_balance_after, contract_usdt_balance_before, max_diff,), "Contract balance changed too much. Actual balance: {} USDT, previous balance: {} USDT. Max diff: {} USDT", contract_usdt_balance_after.scaled(Decimals::Six.get_decimals().neg()), contract_usdt_balance_before.scaled(Decimals::Six.get_decimals().neg()), @@ -1454,10 +1124,7 @@ fn exact_two_hop_eth_atom_swap_test_template( } // source more or less similarly priced as target -fn exact_two_hop_inj_atom_swap_test_template( - exact_quantity_to_receive: FPDecimal, - max_diff_percentage: Percent, -) { +fn exact_two_hop_inj_atom_swap_test_template(exact_quantity_to_receive: FPDecimal, max_diff_percentage: Percent) { let app = InjectiveTestApp::new(); let wasm = Wasm::new(&app); let exchange = Exchange::new(&app); @@ -1465,9 +1132,7 @@ fn exact_two_hop_inj_atom_swap_test_template( let _signer = must_init_account_with_funds(&app, &[str_coin("1", INJ, Decimals::Eighteen)]); - let _validator = app - .get_first_validator_signing_account(INJ.to_string(), 1.2f64) - .unwrap(); + let _validator = app.get_first_validator_signing_account(INJ.to_string(), 1.2f64).unwrap(); let owner = must_init_account_with_funds( &app, &[ @@ -1482,40 +1147,22 @@ fn exact_two_hop_inj_atom_swap_test_template( let spot_market_1_id = launch_realistic_inj_usdt_spot_market(&exchange, &owner); let spot_market_2_id = launch_realistic_atom_usdt_spot_market(&exchange, &owner); - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("1_000", USDT, Decimals::Six)], - ); + let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("1_000", USDT, Decimals::Six)]); set_route_and_assert_success( &wasm, &owner, &contr_addr, INJ_2, ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], + vec![spot_market_1_id.as_str().into(), spot_market_2_id.as_str().into()], ); let trader1 = init_rich_account(&app); let trader2 = init_rich_account(&app); let trader3 = init_rich_account(&app); - create_realistic_inj_usdt_buy_orders_from_spreadsheet( - &app, - &spot_market_1_id, - &trader1, - &trader2, - ); - create_realistic_atom_usdt_sell_orders_from_spreadsheet( - &app, - &spot_market_2_id, - &trader1, - &trader2, - &trader3, - ); + create_realistic_inj_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2); + create_realistic_atom_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3); app.increase_time(1); @@ -1523,18 +1170,11 @@ fn exact_two_hop_inj_atom_swap_test_template( let swapper = must_init_account_with_funds( &app, - &[ - str_coin(inj_to_swap, INJ_2, Decimals::Eighteen), - str_coin("1", INJ, Decimals::Eighteen), - ], + &[str_coin(inj_to_swap, INJ_2, Decimals::Eighteen), str_coin("1", INJ, Decimals::Eighteen)], ); let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_before.len(), 1, "wrong number of denoms in contract balances"); let query_result: SwapEstimationResult = wasm .query( @@ -1558,15 +1198,11 @@ fn exact_two_hop_inj_atom_swap_test_template( ) .unwrap(); - let expected_difference = - human_to_dec(inj_to_swap, Decimals::Eighteen) - query_result.result_quantity; + let expected_difference = human_to_dec(inj_to_swap, Decimals::Eighteen) - query_result.result_quantity; let swapper_inj_balance_after = query_bank_balance(&bank, INJ_2, swapper.address().as_str()); let swapper_atom_balance_after = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - assert_eq!( - swapper_inj_balance_after, expected_difference, - "wrong amount of INJ was exchanged" - ); + assert_eq!(swapper_inj_balance_after, expected_difference, "wrong amount of INJ was exchanged"); assert!( swapper_atom_balance_after >= exact_quantity_to_receive, @@ -1575,15 +1211,10 @@ fn exact_two_hop_inj_atom_swap_test_template( swapper_atom_balance_after.scaled(Decimals::Six.get_decimals().neg()) ); - let one_percent_diff = exact_quantity_to_receive - * (FPDecimal::must_from_str(max_diff_percentage.0) / FPDecimal::from(100u128)); + let one_percent_diff = exact_quantity_to_receive * (FPDecimal::must_from_str(max_diff_percentage.0) / FPDecimal::from(100u128)); assert!( - are_fpdecimals_approximately_equal( - swapper_atom_balance_after, - exact_quantity_to_receive, - one_percent_diff, - ), + are_fpdecimals_approximately_equal(swapper_atom_balance_after, exact_quantity_to_receive, one_percent_diff,), "swapper did not receive expected exact ATOM amount +/- {}% -> expected: {} ATOM, actual: {} ATOM, max diff: {} ATOM", max_diff_percentage.0, exact_quantity_to_receive.scaled(Decimals::Six.get_decimals().neg()), @@ -1592,16 +1223,10 @@ fn exact_two_hop_inj_atom_swap_test_template( ); let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_after.len(), 1, "wrong number of denoms in contract balances"); - let contract_usdt_balance_before = - FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); - let contract_usdt_balance_after = - FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); + let contract_usdt_balance_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); + let contract_usdt_balance_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); assert!( contract_usdt_balance_after >= contract_usdt_balance_before, @@ -1612,11 +1237,7 @@ fn exact_two_hop_inj_atom_swap_test_template( let max_diff = human_to_dec("0.7", Decimals::Six); assert!( - are_fpdecimals_approximately_equal( - contract_usdt_balance_after, - contract_usdt_balance_before, - max_diff, - ), + are_fpdecimals_approximately_equal(contract_usdt_balance_after, contract_usdt_balance_before, max_diff,), "Contract balance changed too much. Actual balance: {} USDT, previous balance: {} USDT. Max diff: {} USDT", contract_usdt_balance_after.scaled(Decimals::Six.get_decimals().neg()), contract_usdt_balance_before.scaled(Decimals::Six.get_decimals().neg()), @@ -1625,10 +1246,7 @@ fn exact_two_hop_inj_atom_swap_test_template( } // source much cheaper than target -fn exact_two_hop_inj_eth_swap_test_template( - exact_quantity_to_receive: FPDecimal, - max_diff_percentage: Percent, -) { +fn exact_two_hop_inj_eth_swap_test_template(exact_quantity_to_receive: FPDecimal, max_diff_percentage: Percent) { let app = InjectiveTestApp::new(); let wasm = Wasm::new(&app); let exchange = Exchange::new(&app); @@ -1636,9 +1254,7 @@ fn exact_two_hop_inj_eth_swap_test_template( let _signer = must_init_account_with_funds(&app, &[str_coin("1", INJ, Decimals::Eighteen)]); - let _validator = app - .get_first_validator_signing_account(INJ.to_string(), 1.2f64) - .unwrap(); + let _validator = app.get_first_validator_signing_account(INJ.to_string(), 1.2f64).unwrap(); let owner = must_init_account_with_funds( &app, &[ @@ -1652,40 +1268,22 @@ fn exact_two_hop_inj_eth_swap_test_template( let spot_market_1_id = launch_realistic_inj_usdt_spot_market(&exchange, &owner); let spot_market_2_id = launch_realistic_weth_usdt_spot_market(&exchange, &owner); - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("1_000", USDT, Decimals::Six)], - ); + let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("1_000", USDT, Decimals::Six)]); set_route_and_assert_success( &wasm, &owner, &contr_addr, INJ_2, ETH, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], + vec![spot_market_1_id.as_str().into(), spot_market_2_id.as_str().into()], ); let trader1 = init_rich_account(&app); let trader2 = init_rich_account(&app); let trader3 = init_rich_account(&app); - create_realistic_inj_usdt_buy_orders_from_spreadsheet( - &app, - &spot_market_1_id, - &trader1, - &trader2, - ); - create_realistic_eth_usdt_sell_orders_from_spreadsheet( - &app, - &spot_market_2_id, - &trader1, - &trader2, - &trader3, - ); + create_realistic_inj_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2); + create_realistic_eth_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3); app.increase_time(1); @@ -1693,18 +1291,11 @@ fn exact_two_hop_inj_eth_swap_test_template( let swapper = must_init_account_with_funds( &app, - &[ - str_coin(inj_to_swap, INJ_2, Decimals::Eighteen), - str_coin("1", INJ, Decimals::Eighteen), - ], + &[str_coin(inj_to_swap, INJ_2, Decimals::Eighteen), str_coin("1", INJ, Decimals::Eighteen)], ); let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_before.len(), 1, "wrong number of denoms in contract balances"); let query_result: SwapEstimationResult = wasm .query( @@ -1728,15 +1319,11 @@ fn exact_two_hop_inj_eth_swap_test_template( ) .unwrap(); - let expected_difference = - human_to_dec(inj_to_swap, Decimals::Eighteen) - query_result.result_quantity; + let expected_difference = human_to_dec(inj_to_swap, Decimals::Eighteen) - query_result.result_quantity; let swapper_inj_balance_after = query_bank_balance(&bank, INJ_2, swapper.address().as_str()); let swapper_atom_balance_after = query_bank_balance(&bank, ETH, swapper.address().as_str()); - assert_eq!( - swapper_inj_balance_after, expected_difference, - "wrong amount of INJ was exchanged" - ); + assert_eq!(swapper_inj_balance_after, expected_difference, "wrong amount of INJ was exchanged"); assert!( swapper_atom_balance_after >= exact_quantity_to_receive, @@ -1745,15 +1332,10 @@ fn exact_two_hop_inj_eth_swap_test_template( swapper_atom_balance_after.scaled(Decimals::Eighteen.get_decimals().neg()) ); - let one_percent_diff = exact_quantity_to_receive - * (FPDecimal::must_from_str(max_diff_percentage.0) / FPDecimal::from(100u128)); + let one_percent_diff = exact_quantity_to_receive * (FPDecimal::must_from_str(max_diff_percentage.0) / FPDecimal::from(100u128)); assert!( - are_fpdecimals_approximately_equal( - swapper_atom_balance_after, - exact_quantity_to_receive, - one_percent_diff, - ), + are_fpdecimals_approximately_equal(swapper_atom_balance_after, exact_quantity_to_receive, one_percent_diff,), "swapper did not receive expected exact ETH amount +/- {}% -> expected: {} ETH, actual: {} ETH, max diff: {} ETH", max_diff_percentage.0, exact_quantity_to_receive.scaled(Decimals::Eighteen.get_decimals().neg()), @@ -1762,16 +1344,10 @@ fn exact_two_hop_inj_eth_swap_test_template( ); let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_after.len(), 1, "wrong number of denoms in contract balances"); - let contract_usdt_balance_before = - FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); - let contract_usdt_balance_after = - FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); + let contract_usdt_balance_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); + let contract_usdt_balance_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); assert!( contract_usdt_balance_after >= contract_usdt_balance_before, @@ -1782,11 +1358,7 @@ fn exact_two_hop_inj_eth_swap_test_template( let max_diff = human_to_dec("0.82", Decimals::Six); assert!( - are_fpdecimals_approximately_equal( - contract_usdt_balance_after, - contract_usdt_balance_before, - max_diff, - ), + are_fpdecimals_approximately_equal(contract_usdt_balance_after, contract_usdt_balance_before, max_diff,), "Contract balance changed too much. Actual balance: {} USDT, previous balance: {} USDT. Max diff: {} USDT", contract_usdt_balance_after.scaled(Decimals::Six.get_decimals().neg()), contract_usdt_balance_before.scaled(Decimals::Six.get_decimals().neg()), diff --git a/contracts/swap/src/testing/integration_realistic_tests_min_quantity.rs b/contracts/swap/src/testing/integration_realistic_tests_min_quantity.rs index 6213738..3e2e961 100644 --- a/contracts/swap/src/testing/integration_realistic_tests_min_quantity.rs +++ b/contracts/swap/src/testing/integration_realistic_tests_min_quantity.rs @@ -1,6 +1,4 @@ -use injective_test_tube::{ - Account, Bank, Exchange, InjectiveTestApp, Module, RunnerResult, SigningAccount, Wasm, -}; +use injective_test_tube::{Account, Bank, Exchange, InjectiveTestApp, Module, RunnerResult, SigningAccount, Wasm}; use std::ops::Neg; use crate::helpers::Scaled; @@ -8,18 +6,13 @@ use injective_math::FPDecimal; use crate::msg::{ExecuteMsg, QueryMsg}; use crate::testing::test_utils::{ - are_fpdecimals_approximately_equal, assert_fee_is_as_expected, - create_realistic_atom_usdt_sell_orders_from_spreadsheet, - create_realistic_eth_usdt_buy_orders_from_spreadsheet, - create_realistic_eth_usdt_sell_orders_from_spreadsheet, - create_realistic_inj_usdt_buy_orders_from_spreadsheet, - create_realistic_usdt_usdc_both_side_orders, human_to_dec, init_rich_account, - init_self_relaying_contract_and_get_address, launch_realistic_atom_usdt_spot_market, - launch_realistic_inj_usdt_spot_market, launch_realistic_usdt_usdc_spot_market, - launch_realistic_weth_usdt_spot_market, must_init_account_with_funds, query_all_bank_balances, - query_bank_balance, set_route_and_assert_success, str_coin, Decimals, ATOM, - DEFAULT_ATOMIC_MULTIPLIER, DEFAULT_SELF_RELAYING_FEE_PART, DEFAULT_TAKER_FEE, ETH, INJ, INJ_2, - USDC, USDT, + are_fpdecimals_approximately_equal, assert_fee_is_as_expected, create_realistic_atom_usdt_sell_orders_from_spreadsheet, + create_realistic_eth_usdt_buy_orders_from_spreadsheet, create_realistic_eth_usdt_sell_orders_from_spreadsheet, + create_realistic_inj_usdt_buy_orders_from_spreadsheet, create_realistic_usdt_usdc_both_side_orders, human_to_dec, init_rich_account, + init_self_relaying_contract_and_get_address, launch_realistic_atom_usdt_spot_market, launch_realistic_inj_usdt_spot_market, + launch_realistic_usdt_usdc_spot_market, launch_realistic_weth_usdt_spot_market, must_init_account_with_funds, query_all_bank_balances, + query_bank_balance, set_route_and_assert_success, str_coin, Decimals, ATOM, DEFAULT_ATOMIC_MULTIPLIER, DEFAULT_SELF_RELAYING_FEE_PART, + DEFAULT_TAKER_FEE, ETH, INJ, INJ_2, USDC, USDT, }; use crate::types::{FPCoin, SwapEstimationResult}; @@ -51,29 +44,15 @@ pub fn happy_path_two_hops_test(app: InjectiveTestApp, owner: SigningAccount, co &contr_addr, ETH, ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], + vec![spot_market_1_id.as_str().into(), spot_market_2_id.as_str().into()], ); let trader1 = init_rich_account(&app); let trader2 = init_rich_account(&app); let trader3 = init_rich_account(&app); - create_realistic_eth_usdt_buy_orders_from_spreadsheet( - &app, - &spot_market_1_id, - &trader1, - &trader2, - ); - create_realistic_atom_usdt_sell_orders_from_spreadsheet( - &app, - &spot_market_2_id, - &trader1, - &trader2, - &trader3, - ); + create_realistic_eth_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2); + create_realistic_atom_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3); app.increase_time(1); @@ -81,10 +60,7 @@ pub fn happy_path_two_hops_test(app: InjectiveTestApp, owner: SigningAccount, co let swapper = must_init_account_with_funds( &app, - &[ - str_coin(eth_to_swap, ETH, Decimals::Eighteen), - str_coin("1", INJ, Decimals::Eighteen), - ], + &[str_coin(eth_to_swap, ETH, Decimals::Eighteen), str_coin("1", INJ, Decimals::Eighteen)], ); let mut query_result: SwapEstimationResult = wasm @@ -118,18 +94,10 @@ pub fn happy_path_two_hops_test(app: InjectiveTestApp, owner: SigningAccount, co ]; // we don't care too much about decimal fraction of the fee - assert_fee_is_as_expected( - &mut query_result.expected_fees, - &mut expected_fees, - human_to_dec("0.1", Decimals::Six), - ); + assert_fee_is_as_expected(&mut query_result.expected_fees, &mut expected_fees, human_to_dec("0.1", Decimals::Six)); let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_before.len(), 1, "wrong number of denoms in contract balances"); wasm.execute( &contr_addr, @@ -145,11 +113,7 @@ pub fn happy_path_two_hops_test(app: InjectiveTestApp, owner: SigningAccount, co let from_balance = query_bank_balance(&bank, ETH, swapper.address().as_str()); let to_balance = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - assert_eq!( - from_balance, - FPDecimal::ZERO, - "some of the original amount wasn't swapped" - ); + assert_eq!(from_balance, FPDecimal::ZERO, "some of the original amount wasn't swapped"); assert!( to_balance >= expected_amount, @@ -161,11 +125,7 @@ pub fn happy_path_two_hops_test(app: InjectiveTestApp, owner: SigningAccount, co let max_diff = human_to_dec("0.1", Decimals::Six); assert!( - are_fpdecimals_approximately_equal( - expected_amount, - to_balance, - max_diff, - ), + are_fpdecimals_approximately_equal(expected_amount, to_balance, max_diff,), "Swapper did not receive expected amount. Expected: {} ATOM, actual: {} ATOM, max diff: {} ATOM", expected_amount.scaled(Decimals::Six.get_decimals().neg()), to_balance.scaled(Decimals::Six.get_decimals().neg()), @@ -173,16 +133,10 @@ pub fn happy_path_two_hops_test(app: InjectiveTestApp, owner: SigningAccount, co ); let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_after.len(), 1, "wrong number of denoms in contract balances"); - let contract_usdt_balance_before = - FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); - let contract_usdt_balance_after = - FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); + let contract_usdt_balance_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); + let contract_usdt_balance_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); assert!( contract_usdt_balance_after >= contract_usdt_balance_before, @@ -195,11 +149,7 @@ pub fn happy_path_two_hops_test(app: InjectiveTestApp, owner: SigningAccount, co let max_diff = human_to_dec("0.7", Decimals::Six); assert!( - are_fpdecimals_approximately_equal( - contract_usdt_balance_after, - contract_usdt_balance_before, - max_diff, - ), + are_fpdecimals_approximately_equal(contract_usdt_balance_after, contract_usdt_balance_before, max_diff,), "Contract balance changed too much. Actual balance: {} USDT, previous balance: {} USDT. Max diff: {} USDT", contract_usdt_balance_after.scaled(Decimals::Six.get_decimals().neg()), contract_usdt_balance_before.scaled(Decimals::Six.get_decimals().neg()), @@ -214,9 +164,7 @@ fn happy_path_two_hops_swap_eth_atom_realistic_values_self_relaying() { let _signer = must_init_account_with_funds(&app, &[str_coin("1", INJ, Decimals::Eighteen)]); - let _validator = app - .get_first_validator_signing_account(INJ.to_string(), 1.2f64) - .unwrap(); + let _validator = app.get_first_validator_signing_account(INJ.to_string(), 1.2f64).unwrap(); let owner = must_init_account_with_funds( &app, &[ @@ -227,11 +175,7 @@ fn happy_path_two_hops_swap_eth_atom_realistic_values_self_relaying() { ], ); - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("1_000", USDT, Decimals::Six)], - ); + let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("1_000", USDT, Decimals::Six)]); happy_path_two_hops_test(app, owner, contr_addr); } @@ -245,9 +189,7 @@ fn happy_path_two_hops_swap_inj_eth_realistic_values_self_relaying() { let _signer = must_init_account_with_funds(&app, &[str_coin("1", INJ, Decimals::Eighteen)]); - let _validator = app - .get_first_validator_signing_account(INJ.to_string(), 1.2f64) - .unwrap(); + let _validator = app.get_first_validator_signing_account(INJ.to_string(), 1.2f64).unwrap(); let owner = must_init_account_with_funds( &app, &[ @@ -261,40 +203,22 @@ fn happy_path_two_hops_swap_inj_eth_realistic_values_self_relaying() { let spot_market_1_id = launch_realistic_inj_usdt_spot_market(&exchange, &owner); let spot_market_2_id = launch_realistic_weth_usdt_spot_market(&exchange, &owner); - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("1_000", USDT, Decimals::Six)], - ); + let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("1_000", USDT, Decimals::Six)]); set_route_and_assert_success( &wasm, &owner, &contr_addr, INJ_2, ETH, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], + vec![spot_market_1_id.as_str().into(), spot_market_2_id.as_str().into()], ); let trader1 = init_rich_account(&app); let trader2 = init_rich_account(&app); let trader3 = init_rich_account(&app); - create_realistic_inj_usdt_buy_orders_from_spreadsheet( - &app, - &spot_market_1_id, - &trader1, - &trader2, - ); - create_realistic_eth_usdt_sell_orders_from_spreadsheet( - &app, - &spot_market_2_id, - &trader1, - &trader2, - &trader3, - ); + create_realistic_inj_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2); + create_realistic_eth_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3); app.increase_time(1); @@ -302,10 +226,7 @@ fn happy_path_two_hops_swap_inj_eth_realistic_values_self_relaying() { let swapper = must_init_account_with_funds( &app, - &[ - str_coin(inj_to_swap, INJ_2, Decimals::Eighteen), - str_coin("1", INJ, Decimals::Eighteen), - ], + &[str_coin(inj_to_swap, INJ_2, Decimals::Eighteen), str_coin("1", INJ, Decimals::Eighteen)], ); let mut query_result: SwapEstimationResult = wasm @@ -339,18 +260,10 @@ fn happy_path_two_hops_swap_inj_eth_realistic_values_self_relaying() { ]; // we don't care too much about decimal fraction of the fee - assert_fee_is_as_expected( - &mut query_result.expected_fees, - &mut expected_fees, - human_to_dec("0.1", Decimals::Six), - ); + assert_fee_is_as_expected(&mut query_result.expected_fees, &mut expected_fees, human_to_dec("0.1", Decimals::Six)); let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_before.len(), 1, "wrong number of denoms in contract balances"); wasm.execute( &contr_addr, @@ -366,11 +279,7 @@ fn happy_path_two_hops_swap_inj_eth_realistic_values_self_relaying() { let from_balance = query_bank_balance(&bank, INJ_2, swapper.address().as_str()); let to_balance = query_bank_balance(&bank, ETH, swapper.address().as_str()); - assert_eq!( - from_balance, - FPDecimal::ZERO, - "some of the original amount wasn't swapped" - ); + assert_eq!(from_balance, FPDecimal::ZERO, "some of the original amount wasn't swapped"); assert!( to_balance >= expected_amount, @@ -382,11 +291,7 @@ fn happy_path_two_hops_swap_inj_eth_realistic_values_self_relaying() { let max_diff = human_to_dec("0.1", Decimals::Eighteen); assert!( - are_fpdecimals_approximately_equal( - expected_amount, - to_balance, - max_diff, - ), + are_fpdecimals_approximately_equal(expected_amount, to_balance, max_diff,), "Swapper did not receive expected amount. Expected: {} ETH, actual: {} ETH, max diff: {} ETH", expected_amount.scaled(Decimals::Eighteen.get_decimals().neg()), to_balance.scaled(Decimals::Eighteen.get_decimals().neg()), @@ -394,16 +299,10 @@ fn happy_path_two_hops_swap_inj_eth_realistic_values_self_relaying() { ); let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_after.len(), 1, "wrong number of denoms in contract balances"); - let contract_usdt_balance_before = - FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); - let contract_usdt_balance_after = - FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); + let contract_usdt_balance_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); + let contract_usdt_balance_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); assert!( contract_usdt_balance_after >= contract_usdt_balance_before, @@ -416,11 +315,7 @@ fn happy_path_two_hops_swap_inj_eth_realistic_values_self_relaying() { let max_diff = human_to_dec("0.7", Decimals::Six); assert!( - are_fpdecimals_approximately_equal( - contract_usdt_balance_after, - contract_usdt_balance_before, - max_diff, - ), + are_fpdecimals_approximately_equal(contract_usdt_balance_after, contract_usdt_balance_before, max_diff,), "Contract balance changed too much. Actual balance: {} USDT, previous balance: {} USDT. Max diff: {} USDT", contract_usdt_balance_after.scaled(Decimals::Six.get_decimals().neg()), contract_usdt_balance_before.scaled(Decimals::Six.get_decimals().neg()), @@ -437,9 +332,7 @@ fn happy_path_two_hops_swap_inj_atom_realistic_values_self_relaying() { let _signer = must_init_account_with_funds(&app, &[str_coin("1", INJ, Decimals::Eighteen)]); - let _validator = app - .get_first_validator_signing_account(INJ.to_string(), 1.2f64) - .unwrap(); + let _validator = app.get_first_validator_signing_account(INJ.to_string(), 1.2f64).unwrap(); let owner = must_init_account_with_funds( &app, &[ @@ -454,40 +347,22 @@ fn happy_path_two_hops_swap_inj_atom_realistic_values_self_relaying() { let spot_market_1_id = launch_realistic_inj_usdt_spot_market(&exchange, &owner); let spot_market_2_id = launch_realistic_atom_usdt_spot_market(&exchange, &owner); - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("1_000", USDT, Decimals::Six)], - ); + let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("1_000", USDT, Decimals::Six)]); set_route_and_assert_success( &wasm, &owner, &contr_addr, INJ_2, ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], + vec![spot_market_1_id.as_str().into(), spot_market_2_id.as_str().into()], ); let trader1 = init_rich_account(&app); let trader2 = init_rich_account(&app); let trader3 = init_rich_account(&app); - create_realistic_inj_usdt_buy_orders_from_spreadsheet( - &app, - &spot_market_1_id, - &trader1, - &trader2, - ); - create_realistic_atom_usdt_sell_orders_from_spreadsheet( - &app, - &spot_market_2_id, - &trader1, - &trader2, - &trader3, - ); + create_realistic_inj_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2); + create_realistic_atom_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3); app.increase_time(1); @@ -495,10 +370,7 @@ fn happy_path_two_hops_swap_inj_atom_realistic_values_self_relaying() { let swapper = must_init_account_with_funds( &app, - &[ - str_coin(inj_to_swap, INJ_2, Decimals::Eighteen), - str_coin("1", INJ, Decimals::Eighteen), - ], + &[str_coin(inj_to_swap, INJ_2, Decimals::Eighteen), str_coin("1", INJ, Decimals::Eighteen)], ); let mut query_result: SwapEstimationResult = wasm @@ -532,18 +404,10 @@ fn happy_path_two_hops_swap_inj_atom_realistic_values_self_relaying() { ]; // we don't care too much about decimal fraction of the fee - assert_fee_is_as_expected( - &mut query_result.expected_fees, - &mut expected_fees, - human_to_dec("0.1", Decimals::Six), - ); + assert_fee_is_as_expected(&mut query_result.expected_fees, &mut expected_fees, human_to_dec("0.1", Decimals::Six)); let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_before.len(), 1, "wrong number of denoms in contract balances"); wasm.execute( &contr_addr, @@ -559,11 +423,7 @@ fn happy_path_two_hops_swap_inj_atom_realistic_values_self_relaying() { let from_balance = query_bank_balance(&bank, INJ_2, swapper.address().as_str()); let to_balance = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - assert_eq!( - from_balance, - FPDecimal::ZERO, - "some of the original amount wasn't swapped" - ); + assert_eq!(from_balance, FPDecimal::ZERO, "some of the original amount wasn't swapped"); assert!( to_balance >= expected_amount, @@ -575,11 +435,7 @@ fn happy_path_two_hops_swap_inj_atom_realistic_values_self_relaying() { let max_diff = human_to_dec("0.1", Decimals::Six); assert!( - are_fpdecimals_approximately_equal( - expected_amount, - to_balance, - max_diff, - ), + are_fpdecimals_approximately_equal(expected_amount, to_balance, max_diff,), "Swapper did not receive expected amount. Expected: {} ATOM, actual: {} ATOM, max diff: {} ATOM", expected_amount.scaled(Decimals::Six.get_decimals().neg()), to_balance.scaled(Decimals::Six.get_decimals().neg()), @@ -587,16 +443,10 @@ fn happy_path_two_hops_swap_inj_atom_realistic_values_self_relaying() { ); let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_after.len(), 1, "wrong number of denoms in contract balances"); - let contract_usdt_balance_before = - FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); - let contract_usdt_balance_after = - FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); + let contract_usdt_balance_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); + let contract_usdt_balance_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); assert!( contract_usdt_balance_after >= contract_usdt_balance_before, @@ -609,11 +459,7 @@ fn happy_path_two_hops_swap_inj_atom_realistic_values_self_relaying() { let max_diff = human_to_dec("0.82", Decimals::Six); assert!( - are_fpdecimals_approximately_equal( - contract_usdt_balance_after, - contract_usdt_balance_before, - max_diff, - ), + are_fpdecimals_approximately_equal(contract_usdt_balance_after, contract_usdt_balance_before, max_diff,), "Contract balance changed too much. Actual balance: {}, previous balance: {}. Max diff: {}", contract_usdt_balance_after.scaled(Decimals::Six.get_decimals().neg()), contract_usdt_balance_before.scaled(Decimals::Six.get_decimals().neg()), @@ -629,9 +475,7 @@ fn it_executes_swap_between_markets_using_different_quote_assets_self_relaying() let bank = Bank::new(&app); let _signer = must_init_account_with_funds(&app, &[str_coin("1", INJ, Decimals::Eighteen)]); - let _validator = app - .get_first_validator_signing_account(INJ.to_string(), 1.2f64) - .unwrap(); + let _validator = app.get_first_validator_signing_account(INJ.to_string(), 1.2f64).unwrap(); let owner = must_init_account_with_funds( &app, @@ -649,10 +493,7 @@ fn it_executes_swap_between_markets_using_different_quote_assets_self_relaying() let contr_addr = init_self_relaying_contract_and_get_address( &wasm, &owner, - &[ - str_coin("10", USDC, Decimals::Six), - str_coin("500", USDT, Decimals::Six), - ], + &[str_coin("10", USDC, Decimals::Six), str_coin("500", USDT, Decimals::Six)], ); set_route_and_assert_success( &wasm, @@ -660,32 +501,18 @@ fn it_executes_swap_between_markets_using_different_quote_assets_self_relaying() &contr_addr, INJ_2, USDC, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], + vec![spot_market_1_id.as_str().into(), spot_market_2_id.as_str().into()], ); let trader1 = init_rich_account(&app); let trader2 = init_rich_account(&app); - create_realistic_inj_usdt_buy_orders_from_spreadsheet( - &app, - &spot_market_1_id, - &trader1, - &trader2, - ); + create_realistic_inj_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2); create_realistic_usdt_usdc_both_side_orders(&app, &spot_market_2_id, &trader1); app.increase_time(1); - let swapper = must_init_account_with_funds( - &app, - &[ - str_coin("1", INJ, Decimals::Eighteen), - str_coin("1", INJ_2, Decimals::Eighteen), - ], - ); + let swapper = must_init_account_with_funds(&app, &[str_coin("1", INJ, Decimals::Eighteen), str_coin("1", INJ_2, Decimals::Eighteen)]); let inj_to_swap = "1"; @@ -720,18 +547,10 @@ fn it_executes_swap_between_markets_using_different_quote_assets_self_relaying() ]; // we don't care too much about decimal fraction of the fee - assert_fee_is_as_expected( - &mut query_result.expected_fees, - &mut expected_fees, - human_to_dec("0.1", Decimals::Six), - ); + assert_fee_is_as_expected(&mut query_result.expected_fees, &mut expected_fees, human_to_dec("0.1", Decimals::Six)); let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 2, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_before.len(), 2, "wrong number of denoms in contract balances"); wasm.execute( &contr_addr, @@ -747,11 +566,7 @@ fn it_executes_swap_between_markets_using_different_quote_assets_self_relaying() let from_balance = query_bank_balance(&bank, INJ_2, swapper.address().as_str()); let to_balance = query_bank_balance(&bank, USDC, swapper.address().as_str()); - assert_eq!( - from_balance, - FPDecimal::ZERO, - "some of the original amount wasn't swapped" - ); + assert_eq!(from_balance, FPDecimal::ZERO, "some of the original amount wasn't swapped"); assert!( to_balance >= expected_amount, @@ -763,11 +578,7 @@ fn it_executes_swap_between_markets_using_different_quote_assets_self_relaying() let max_diff = human_to_dec("0.1", Decimals::Eighteen); assert!( - are_fpdecimals_approximately_equal( - expected_amount, - to_balance, - max_diff, - ), + are_fpdecimals_approximately_equal(expected_amount, to_balance, max_diff,), "Swapper did not receive expected amount. Expected: {} USDC, actual: {} USDC, max diff: {} USDC", expected_amount.scaled(Decimals::Eighteen.get_decimals().neg()), to_balance.scaled(Decimals::Eighteen.get_decimals().neg()), @@ -775,17 +586,11 @@ fn it_executes_swap_between_markets_using_different_quote_assets_self_relaying() ); let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 2, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_after.len(), 2, "wrong number of denoms in contract balances"); // let's check contract's USDT balance - let contract_usdt_balance_before = - FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); - let contract_usdt_balance_after = - FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); + let contract_usdt_balance_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); + let contract_usdt_balance_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); assert!( contract_usdt_balance_after >= contract_usdt_balance_before, @@ -798,11 +603,7 @@ fn it_executes_swap_between_markets_using_different_quote_assets_self_relaying() let max_diff = human_to_dec("0.001", Decimals::Six); assert!( - are_fpdecimals_approximately_equal( - contract_usdt_balance_after, - contract_usdt_balance_before, - max_diff, - ), + are_fpdecimals_approximately_equal(contract_usdt_balance_after, contract_usdt_balance_before, max_diff,), "Contract balance changed too much. Actual balance: {} USDT, previous balance: {} USDT. Max diff: {} USDT", contract_usdt_balance_after.scaled(Decimals::Six.get_decimals().neg()), contract_usdt_balance_before.scaled(Decimals::Six.get_decimals().neg()), @@ -810,10 +611,8 @@ fn it_executes_swap_between_markets_using_different_quote_assets_self_relaying() ); // let's check contract's USDC balance - let contract_usdc_balance_before = - FPDecimal::must_from_str(contract_balances_before[1].amount.as_str()); - let contract_usdc_balance_after = - FPDecimal::must_from_str(contract_balances_after[1].amount.as_str()); + let contract_usdc_balance_before = FPDecimal::must_from_str(contract_balances_before[1].amount.as_str()); + let contract_usdc_balance_after = FPDecimal::must_from_str(contract_balances_after[1].amount.as_str()); assert!( contract_usdc_balance_after >= contract_usdc_balance_before, @@ -826,11 +625,7 @@ fn it_executes_swap_between_markets_using_different_quote_assets_self_relaying() let max_diff = human_to_dec("0.001", Decimals::Six); assert!( - are_fpdecimals_approximately_equal( - contract_usdc_balance_after, - contract_usdc_balance_before, - max_diff, - ), + are_fpdecimals_approximately_equal(contract_usdc_balance_after, contract_usdc_balance_before, max_diff,), "Contract balance changed too much. Actual balance: {} USDC, previous balance: {} USDC. Max diff: {} USDC", contract_usdc_balance_after.scaled(Decimals::Six.get_decimals().neg()), contract_usdc_balance_before.scaled(Decimals::Six.get_decimals().neg()), @@ -847,9 +642,7 @@ fn it_doesnt_lose_buffer_if_executed_multiple_times() { let _signer = must_init_account_with_funds(&app, &[str_coin("1", INJ, Decimals::Eighteen)]); - let _validator = app - .get_first_validator_signing_account(INJ.to_string(), 1.2f64) - .unwrap(); + let _validator = app.get_first_validator_signing_account(INJ.to_string(), 1.2f64).unwrap(); let owner = must_init_account_with_funds( &app, @@ -864,11 +657,7 @@ fn it_doesnt_lose_buffer_if_executed_multiple_times() { let spot_market_1_id = launch_realistic_weth_usdt_spot_market(&exchange, &owner); let spot_market_2_id = launch_realistic_atom_usdt_spot_market(&exchange, &owner); - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("1_000", USDT, Decimals::Six)], - ); + let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("1_000", USDT, Decimals::Six)]); set_route_and_assert_success( &wasm, @@ -876,10 +665,7 @@ fn it_doesnt_lose_buffer_if_executed_multiple_times() { &contr_addr, ETH, ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], + vec![spot_market_1_id.as_str().into(), spot_market_2_id.as_str().into()], ); let trader1 = init_rich_account(&app); @@ -892,9 +678,7 @@ fn it_doesnt_lose_buffer_if_executed_multiple_times() { &app, &[ str_coin( - (FPDecimal::must_from_str(eth_to_swap) * FPDecimal::from(100u128)) - .to_string() - .as_str(), + (FPDecimal::must_from_str(eth_to_swap) * FPDecimal::from(100u128)).to_string().as_str(), ETH, Decimals::Eighteen, ), @@ -903,29 +687,14 @@ fn it_doesnt_lose_buffer_if_executed_multiple_times() { ); let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_before.len(), 1, "wrong number of denoms in contract balances"); let mut counter = 0; let iterations = 100; while counter < iterations { - create_realistic_eth_usdt_buy_orders_from_spreadsheet( - &app, - &spot_market_1_id, - &trader1, - &trader2, - ); - create_realistic_atom_usdt_sell_orders_from_spreadsheet( - &app, - &spot_market_2_id, - &trader1, - &trader2, - &trader3, - ); + create_realistic_eth_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2); + create_realistic_atom_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3); app.increase_time(1); @@ -944,16 +713,10 @@ fn it_doesnt_lose_buffer_if_executed_multiple_times() { } let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_after.len(), 1, "wrong number of denoms in contract balances"); - let contract_balance_usdt_after = - FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); - let contract_balance_usdt_before = - FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); + let contract_balance_usdt_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); + let contract_balance_usdt_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); assert!( contract_balance_usdt_after >= contract_balance_usdt_before, @@ -966,14 +729,12 @@ fn it_doesnt_lose_buffer_if_executed_multiple_times() { // won't change balance by more than 0.7 * 100 = 70 USDT let max_diff = human_to_dec("0.7", Decimals::Six) * FPDecimal::from(iterations as u128); - assert!(are_fpdecimals_approximately_equal( - contract_balance_usdt_after, - contract_balance_usdt_before, - max_diff, - ), "Contract balance changed too much. Starting balance: {}, Current balance: {}. Max diff: {}", - contract_balance_usdt_before.scaled(Decimals::Six.get_decimals().neg()), - contract_balance_usdt_after.scaled(Decimals::Six.get_decimals().neg()), - max_diff.scaled(Decimals::Six.get_decimals().neg()) + assert!( + are_fpdecimals_approximately_equal(contract_balance_usdt_after, contract_balance_usdt_before, max_diff,), + "Contract balance changed too much. Starting balance: {}, Current balance: {}. Max diff: {}", + contract_balance_usdt_before.scaled(Decimals::Six.get_decimals().neg()), + contract_balance_usdt_after.scaled(Decimals::Six.get_decimals().neg()), + max_diff.scaled(Decimals::Six.get_decimals().neg()) ); } @@ -987,8 +748,7 @@ fn it_doesnt_lose_buffer_if_executed_multiple_times() { */ #[ignore] #[test] -fn it_correctly_calculates_required_funds_when_querying_buy_with_minimum_buffer_and_realistic_values( -) { +fn it_correctly_calculates_required_funds_when_querying_buy_with_minimum_buffer_and_realistic_values() { let app = InjectiveTestApp::new(); let wasm = Wasm::new(&app); let exchange = Exchange::new(&app); @@ -996,9 +756,7 @@ fn it_correctly_calculates_required_funds_when_querying_buy_with_minimum_buffer_ let _signer = must_init_account_with_funds(&app, &[str_coin("1", INJ, Decimals::Eighteen)]); - let _validator = app - .get_first_validator_signing_account(INJ.to_string(), 1.2f64) - .unwrap(); + let _validator = app.get_first_validator_signing_account(INJ.to_string(), 1.2f64).unwrap(); let owner = must_init_account_with_funds( &app, &[ @@ -1012,40 +770,22 @@ fn it_correctly_calculates_required_funds_when_querying_buy_with_minimum_buffer_ let spot_market_1_id = launch_realistic_weth_usdt_spot_market(&exchange, &owner); let spot_market_2_id = launch_realistic_atom_usdt_spot_market(&exchange, &owner); - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("51", USDT, Decimals::Six)], - ); + let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("51", USDT, Decimals::Six)]); set_route_and_assert_success( &wasm, &owner, &contr_addr, ETH, ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], + vec![spot_market_1_id.as_str().into(), spot_market_2_id.as_str().into()], ); let trader1 = init_rich_account(&app); let trader2 = init_rich_account(&app); let trader3 = init_rich_account(&app); - create_realistic_eth_usdt_buy_orders_from_spreadsheet( - &app, - &spot_market_1_id, - &trader1, - &trader2, - ); - create_realistic_atom_usdt_sell_orders_from_spreadsheet( - &app, - &spot_market_2_id, - &trader1, - &trader2, - &trader3, - ); + create_realistic_eth_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2); + create_realistic_atom_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3); app.increase_time(1); @@ -1053,10 +793,7 @@ fn it_correctly_calculates_required_funds_when_querying_buy_with_minimum_buffer_ let swapper = must_init_account_with_funds( &app, - &[ - str_coin(eth_to_swap, ETH, Decimals::Eighteen), - str_coin("1", INJ, Decimals::Eighteen), - ], + &[str_coin(eth_to_swap, ETH, Decimals::Eighteen), str_coin("1", INJ, Decimals::Eighteen)], ); let query_result: FPDecimal = wasm @@ -1077,11 +814,7 @@ fn it_correctly_calculates_required_funds_when_querying_buy_with_minimum_buffer_ ); let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_before.len(), 1, "wrong number of denoms in contract balances"); wasm.execute( &contr_addr, @@ -1096,11 +829,7 @@ fn it_correctly_calculates_required_funds_when_querying_buy_with_minimum_buffer_ let from_balance = query_bank_balance(&bank, ETH, swapper.address().as_str()); let to_balance = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - assert_eq!( - from_balance, - FPDecimal::ZERO, - "some of the original amount wasn't swapped" - ); + assert_eq!(from_balance, FPDecimal::ZERO, "some of the original amount wasn't swapped"); assert_eq!( to_balance, human_to_dec("906.195", Decimals::Six), @@ -1108,11 +837,7 @@ fn it_correctly_calculates_required_funds_when_querying_buy_with_minimum_buffer_ ); let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_after.len(), 1, "wrong number of denoms in contract balances"); let atom_amount_below_min_tick_size = FPDecimal::must_from_str("0.0005463"); let mut dust_value = atom_amount_below_min_tick_size * human_to_dec("8.89", Decimals::Six); @@ -1125,10 +850,8 @@ fn it_correctly_calculates_required_funds_when_querying_buy_with_minimum_buffer_ dust_value += fee_refund; - let expected_contract_usdt_balance = - FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()) + dust_value; - let actual_contract_balance = - FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); + let expected_contract_usdt_balance = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()) + dust_value; + let actual_contract_balance = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); let contract_balance_diff = expected_contract_usdt_balance - actual_contract_balance; // here the actual difference is 0.000067 USDT, which we attribute differences between decimal precision of Rust/Go and Google Sheets @@ -1148,8 +871,7 @@ fn it_correctly_calculates_required_funds_when_querying_buy_with_minimum_buffer_ */ #[ignore] #[test] -fn it_correctly_calculates_required_funds_when_executing_buy_with_minimum_buffer_and_realistic_values( -) { +fn it_correctly_calculates_required_funds_when_executing_buy_with_minimum_buffer_and_realistic_values() { let app = InjectiveTestApp::new(); let wasm = Wasm::new(&app); let exchange = Exchange::new(&app); @@ -1157,9 +879,7 @@ fn it_correctly_calculates_required_funds_when_executing_buy_with_minimum_buffer let _signer = must_init_account_with_funds(&app, &[str_coin("1", INJ, Decimals::Eighteen)]); - let _validator = app - .get_first_validator_signing_account(INJ.to_string(), 1.2f64) - .unwrap(); + let _validator = app.get_first_validator_signing_account(INJ.to_string(), 1.2f64).unwrap(); let owner = must_init_account_with_funds( &app, &[ @@ -1174,40 +894,22 @@ fn it_correctly_calculates_required_funds_when_executing_buy_with_minimum_buffer let spot_market_2_id = launch_realistic_atom_usdt_spot_market(&exchange, &owner); // in reality we need to add at least 49 USDT to the buffer, even if according to contract's calculations 42 USDT would be enough to execute the swap - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("42", USDT, Decimals::Six)], - ); + let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("42", USDT, Decimals::Six)]); set_route_and_assert_success( &wasm, &owner, &contr_addr, ETH, ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], + vec![spot_market_1_id.as_str().into(), spot_market_2_id.as_str().into()], ); let trader1 = init_rich_account(&app); let trader2 = init_rich_account(&app); let trader3 = init_rich_account(&app); - create_realistic_eth_usdt_buy_orders_from_spreadsheet( - &app, - &spot_market_1_id, - &trader1, - &trader2, - ); - create_realistic_atom_usdt_sell_orders_from_spreadsheet( - &app, - &spot_market_2_id, - &trader1, - &trader2, - &trader3, - ); + create_realistic_eth_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2); + create_realistic_atom_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3); app.increase_time(1); @@ -1215,18 +917,11 @@ fn it_correctly_calculates_required_funds_when_executing_buy_with_minimum_buffer let swapper = must_init_account_with_funds( &app, - &[ - str_coin(eth_to_swap, ETH, Decimals::Eighteen), - str_coin("0.01", INJ, Decimals::Eighteen), - ], + &[str_coin(eth_to_swap, ETH, Decimals::Eighteen), str_coin("0.01", INJ, Decimals::Eighteen)], ); let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_before.len(), 1, "wrong number of denoms in contract balances"); wasm.execute( &contr_addr, @@ -1241,11 +936,7 @@ fn it_correctly_calculates_required_funds_when_executing_buy_with_minimum_buffer let from_balance = query_bank_balance(&bank, ETH, swapper.address().as_str()); let to_balance = query_bank_balance(&bank, ATOM, swapper.address().as_str()); - assert_eq!( - from_balance, - FPDecimal::ZERO, - "some of the original amount wasn't swapped" - ); + assert_eq!(from_balance, FPDecimal::ZERO, "some of the original amount wasn't swapped"); assert_eq!( to_balance, human_to_dec("906.195", Decimals::Six), @@ -1253,16 +944,10 @@ fn it_correctly_calculates_required_funds_when_executing_buy_with_minimum_buffer ); let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_after.len(), 1, "wrong number of denoms in contract balances"); - let contract_usdt_balance_before = - FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); - let contract_usdt_balance_after = - FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); + let contract_usdt_balance_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str()); + let contract_usdt_balance_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str()); assert!( contract_usdt_balance_after >= contract_usdt_balance_before, @@ -1275,11 +960,7 @@ fn it_correctly_calculates_required_funds_when_executing_buy_with_minimum_buffer let max_diff = human_to_dec("0.7", Decimals::Six); assert!( - are_fpdecimals_approximately_equal( - contract_usdt_balance_after, - contract_usdt_balance_before, - max_diff, - ), + are_fpdecimals_approximately_equal(contract_usdt_balance_after, contract_usdt_balance_before, max_diff,), "Contract balance changed too much. Actual balance: {}, previous balance: {}. Max diff: {}", contract_usdt_balance_after.scaled(Decimals::Six.get_decimals().neg()), contract_usdt_balance_before.scaled(Decimals::Six.get_decimals().neg()), @@ -1296,9 +977,7 @@ fn it_returns_all_funds_if_there_is_not_enough_buffer_realistic_values() { let _signer = must_init_account_with_funds(&app, &[str_coin("1", INJ, Decimals::Eighteen)]); - let _validator = app - .get_first_validator_signing_account(INJ.to_string(), 1.2f64) - .unwrap(); + let _validator = app.get_first_validator_signing_account(INJ.to_string(), 1.2f64).unwrap(); let owner = must_init_account_with_funds( &app, &[ @@ -1313,40 +992,22 @@ fn it_returns_all_funds_if_there_is_not_enough_buffer_realistic_values() { let spot_market_2_id = launch_realistic_atom_usdt_spot_market(&exchange, &owner); // 41 USDT is just below the amount required to buy required ATOM amount - let contr_addr = init_self_relaying_contract_and_get_address( - &wasm, - &owner, - &[str_coin("41", USDT, Decimals::Six)], - ); + let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("41", USDT, Decimals::Six)]); set_route_and_assert_success( &wasm, &owner, &contr_addr, ETH, ATOM, - vec![ - spot_market_1_id.as_str().into(), - spot_market_2_id.as_str().into(), - ], + vec![spot_market_1_id.as_str().into(), spot_market_2_id.as_str().into()], ); let trader1 = init_rich_account(&app); let trader2 = init_rich_account(&app); let trader3 = init_rich_account(&app); - create_realistic_eth_usdt_buy_orders_from_spreadsheet( - &app, - &spot_market_1_id, - &trader1, - &trader2, - ); - create_realistic_atom_usdt_sell_orders_from_spreadsheet( - &app, - &spot_market_2_id, - &trader1, - &trader2, - &trader3, - ); + create_realistic_eth_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2); + create_realistic_atom_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3); app.increase_time(1); @@ -1354,10 +1015,7 @@ fn it_returns_all_funds_if_there_is_not_enough_buffer_realistic_values() { let swapper = must_init_account_with_funds( &app, - &[ - str_coin(eth_to_swap, ETH, Decimals::Eighteen), - str_coin("1", INJ, Decimals::Eighteen), - ], + &[str_coin(eth_to_swap, ETH, Decimals::Eighteen), str_coin("1", INJ, Decimals::Eighteen)], ); let query_result: RunnerResult = wasm.query( @@ -1372,19 +1030,12 @@ fn it_returns_all_funds_if_there_is_not_enough_buffer_realistic_values() { assert!(query_result.is_err(), "query should fail"); assert!( - query_result - .unwrap_err() - .to_string() - .contains("Swap amount too high"), + query_result.unwrap_err().to_string().contains("Swap amount too high"), "incorrect error message in query result" ); let contract_balances_before = query_all_bank_balances(&bank, &contr_addr); - assert_eq!( - contract_balances_before.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_before.len(), 1, "wrong number of denoms in contract balances"); let execute_result = wasm.execute( &contr_addr, @@ -1406,18 +1057,10 @@ fn it_returns_all_funds_if_there_is_not_enough_buffer_realistic_values() { human_to_dec(eth_to_swap, Decimals::Eighteen), "source balance changed after failed swap" ); - assert_eq!( - to_balance, - FPDecimal::ZERO, - "target balance changed after failed swap" - ); + assert_eq!(to_balance, FPDecimal::ZERO, "target balance changed after failed swap"); let contract_balances_after = query_all_bank_balances(&bank, contr_addr.as_str()); - assert_eq!( - contract_balances_after.len(), - 1, - "wrong number of denoms in contract balances" - ); + assert_eq!(contract_balances_after.len(), 1, "wrong number of denoms in contract balances"); assert_eq!( contract_balances_before[0].amount, contract_balances_after[0].amount, "contract balance has changed after failed swap" diff --git a/contracts/swap/src/testing/migration_test.rs b/contracts/swap/src/testing/migration_test.rs index 73dc413..bf9370d 100644 --- a/contracts/swap/src/testing/migration_test.rs +++ b/contracts/swap/src/testing/migration_test.rs @@ -2,30 +2,24 @@ use crate::{ msg::{FeeRecipient, InstantiateMsg, MigrateMsg}, testing::{ integration_realistic_tests_min_quantity::happy_path_two_hops_test, - test_utils::{ - must_init_account_with_funds, store_code, str_coin, Decimals, ATOM, ETH, INJ, USDT, - }, + test_utils::{must_init_account_with_funds, str_coin, Decimals, ATOM, ETH, INJ, USDT}, }, }; -use cosmos_sdk_proto::cosmwasm::wasm::v1::{ - MsgMigrateContract, MsgMigrateContractResponse, QueryContractInfoRequest, - QueryContractInfoResponse, -}; use cosmwasm_std::Addr; +use injective_std::types::cosmwasm::wasm::v1::{MsgMigrateContract, MsgMigrateContractResponse, QueryContractInfoRequest, QueryContractInfoResponse}; use injective_test_tube::{Account, ExecuteResponse, InjectiveTestApp, Module, Runner, Wasm}; +use injective_testing::test_tube::utils::store_code; -type V100InstantiateMsg = InstantiateMsg; +type V101InstantiateMsg = InstantiateMsg; #[test] #[cfg_attr(not(feature = "integration"), ignore)] -fn test_migration_v100_to_v101() { +fn test_migration() { let app = InjectiveTestApp::new(); let wasm = Wasm::new(&app); - let wasm_byte_code = - std::fs::read("../../contracts/swap/src/testing/test_artifacts/swap-contract-v100.wasm") - .unwrap(); + let wasm_byte_code = std::fs::read("../../contracts/swap/src/testing/test_artifacts/swap-contract-v101.wasm").unwrap(); let owner = must_init_account_with_funds( &app, @@ -37,16 +31,12 @@ fn test_migration_v100_to_v101() { ], ); - let swap_v100_code_id = wasm - .store_code(&wasm_byte_code, None, &owner) - .unwrap() - .data - .code_id; + let swap_v101_code_id = wasm.store_code(&wasm_byte_code, None, &owner).unwrap().data.code_id; - let swap_v100_address: String = wasm + let swap_v101_address: String = wasm .instantiate( - swap_v100_code_id, - &V100InstantiateMsg { + swap_v101_code_id, + &V101InstantiateMsg { admin: Addr::unchecked(owner.address()), fee_recipient: FeeRecipient::SwapContract, }, @@ -63,14 +53,14 @@ fn test_migration_v100_to_v101() { .query( "/cosmwasm.wasm.v1.Query/ContractInfo", &QueryContractInfoRequest { - address: swap_v100_address.clone(), + address: swap_v101_address.clone(), }, ) .unwrap(); let contract_info = res.contract_info.unwrap(); - assert_eq!(res.address, swap_v100_address); - assert_eq!(contract_info.code_id, swap_v100_code_id); + assert_eq!(res.address, swap_v101_address); + assert_eq!(contract_info.code_id, swap_v101_code_id); assert_eq!(contract_info.creator, owner.address()); assert_eq!(contract_info.label, "swap-contract"); @@ -80,7 +70,7 @@ fn test_migration_v100_to_v101() { .execute( MsgMigrateContract { sender: owner.address(), - contract: swap_v100_address.clone(), + contract: swap_v101_address.clone(), code_id: swap_v110_code_id, msg: serde_json_wasm::to_vec(&MigrateMsg {}).unwrap(), }, @@ -93,17 +83,17 @@ fn test_migration_v100_to_v101() { .query( "/cosmwasm.wasm.v1.Query/ContractInfo", &QueryContractInfoRequest { - address: swap_v100_address.clone(), + address: swap_v101_address.clone(), }, ) .unwrap(); let contract_info = res.contract_info.unwrap(); - assert_eq!(res.address, swap_v100_address); + assert_eq!(res.address, swap_v101_address); assert_eq!(contract_info.code_id, swap_v110_code_id); assert_eq!(contract_info.creator, owner.address()); assert_eq!(contract_info.label, "swap-contract"); - happy_path_two_hops_test(app, owner, swap_v100_address); + happy_path_two_hops_test(app, owner, swap_v101_address); } diff --git a/contracts/swap/src/testing/mod.rs b/contracts/swap/src/testing/mod.rs index bfb3e85..ac28e14 100644 --- a/contracts/swap/src/testing/mod.rs +++ b/contracts/swap/src/testing/mod.rs @@ -1,6 +1,5 @@ mod authz_tests; mod config_tests; -mod integration_logic_tests; mod integration_realistic_tests_exact_quantity; mod integration_realistic_tests_min_quantity; mod migration_test; diff --git a/contracts/swap/src/testing/queries_tests.rs b/contracts/swap/src/testing/queries_tests.rs index b7f6c2e..e79372e 100644 --- a/contracts/swap/src/testing/queries_tests.rs +++ b/contracts/swap/src/testing/queries_tests.rs @@ -1,7 +1,7 @@ use std::ops::Neg; use std::str::FromStr; -use cosmwasm_std::testing::{mock_env, mock_info}; +use cosmwasm_std::testing::{message_info, mock_env}; use cosmwasm_std::{coin, Addr}; use crate::admin::set_route; @@ -14,8 +14,8 @@ use crate::msg::{FeeRecipient, InstantiateMsg}; use crate::queries::{estimate_swap_result, SwapQuantity}; use crate::state::get_all_swap_routes; use crate::testing::test_utils::{ - are_fpdecimals_approximately_equal, human_to_dec, mock_deps_eth_inj, - mock_realistic_deps_eth_atom, Decimals, MultiplierQueryBehavior, TEST_USER_ADDR, + are_fpdecimals_approximately_equal, human_to_dec, mock_deps_eth_inj, mock_realistic_deps_eth_atom, Decimals, MultiplierQueryBehavior, + TEST_USER_ADDR, }; use crate::types::{FPCoin, SwapRoute}; @@ -32,7 +32,7 @@ fn test_calculate_swap_price_external_fee_recipient_from_source_quantity() { instantiate( deps.as_mut_deps(), mock_env(), - mock_info(admin.as_ref(), &[coin(1_000u128, "usdt")]), + message_info(&Addr::unchecked(admin), &[coin(1_000u128, "usdt")]), InstantiateMsg { fee_recipient: FeeRecipient::Address(admin.to_owned()), admin: admin.to_owned(), @@ -84,22 +84,18 @@ fn test_calculate_swap_price_external_fee_recipient_from_source_quantity() { let max_diff = human_to_dec("0.00001", Decimals::Six); - assert!(are_fpdecimals_approximately_equal( - expected_fee_1.amount, - actual_swap_result.expected_fees[0].amount, - max_diff, - ), "Wrong amount of first trx fee received when using source quantity. Expected: {}, Actual: {}", + assert!( + are_fpdecimals_approximately_equal(expected_fee_1.amount, actual_swap_result.expected_fees[0].amount, max_diff,), + "Wrong amount of first trx fee received when using source quantity. Expected: {}, Actual: {}", expected_fee_1.amount, actual_swap_result.expected_fees[0].amount ); - assert!(are_fpdecimals_approximately_equal( + assert!( + are_fpdecimals_approximately_equal(expected_fee_2.amount, actual_swap_result.expected_fees[1].amount, max_diff,), + "Wrong amount of second trx fee received when using source quantity. Expected: {}, Actual: {}", expected_fee_2.amount, - actual_swap_result.expected_fees[1].amount, - max_diff, - ), "Wrong amount of second trx fee received when using source quantity. Expected: {}, Actual: {}", - expected_fee_2.amount, - actual_swap_result.expected_fees[1].amount + actual_swap_result.expected_fees[1].amount ); } @@ -111,7 +107,7 @@ fn test_calculate_swap_price_external_fee_recipient_from_target_quantity() { instantiate( deps.as_mut_deps(), mock_env(), - mock_info(admin.as_ref(), &[coin(1_000u128, "usdt")]), + message_info(&Addr::unchecked(admin), &[coin(1_000u128, "usdt")]), InstantiateMsg { fee_recipient: FeeRecipient::Address(admin.to_owned()), admin: admin.to_owned(), @@ -162,22 +158,18 @@ fn test_calculate_swap_price_external_fee_recipient_from_target_quantity() { let max_diff = human_to_dec("0.00001", Decimals::Six); - assert!(are_fpdecimals_approximately_equal( + assert!( + are_fpdecimals_approximately_equal(expected_fee_1.amount, actual_swap_result.expected_fees[0].amount, max_diff,), + "Wrong amount of first trx fee received when using source quantity. Expected: {}, Actual: {}", expected_fee_1.amount, - actual_swap_result.expected_fees[0].amount, - max_diff, - ), "Wrong amount of first trx fee received when using source quantity. Expected: {}, Actual: {}", - expected_fee_1.amount, - actual_swap_result.expected_fees[0].amount + actual_swap_result.expected_fees[0].amount ); - assert!(are_fpdecimals_approximately_equal( + assert!( + are_fpdecimals_approximately_equal(expected_fee_2.amount, actual_swap_result.expected_fees[1].amount, max_diff,), + "Wrong amount of second trx fee received when using source quantity. Expected: {}, Actual: {}", expected_fee_2.amount, - actual_swap_result.expected_fees[1].amount, - max_diff, - ), "Wrong amount of second trx fee received when using source quantity. Expected: {}, Actual: {}", - expected_fee_2.amount, - actual_swap_result.expected_fees[1].amount + actual_swap_result.expected_fees[1].amount ); } @@ -189,7 +181,7 @@ fn test_calculate_swap_price_self_fee_recipient_from_source_quantity() { instantiate( deps.as_mut_deps(), mock_env(), - mock_info(admin.as_ref(), &[coin(1_000u128, "usdt")]), + message_info(&Addr::unchecked(admin), &[coin(1_000u128, "usdt")]), InstantiateMsg { fee_recipient: FeeRecipient::SwapContract, admin: admin.to_owned(), @@ -221,11 +213,7 @@ fn test_calculate_swap_price_self_fee_recipient_from_source_quantity() { "Wrong amount of swap execution estimate received" ); // value rounded to min tick - assert_eq!( - actual_swap_result.expected_fees.len(), - 2, - "Wrong number of fee entries received" - ); + assert_eq!(actual_swap_result.expected_fees.len(), 2, "Wrong number of fee entries received"); // values from the spreadsheet let expected_fee_1 = FPCoin { @@ -241,22 +229,18 @@ fn test_calculate_swap_price_self_fee_recipient_from_source_quantity() { let max_diff = human_to_dec("0.00001", Decimals::Six); - assert!(are_fpdecimals_approximately_equal( + assert!( + are_fpdecimals_approximately_equal(expected_fee_1.amount, actual_swap_result.expected_fees[0].amount, max_diff,), + "Wrong amount of first trx fee received when using source quantity. Expected: {}, Actual: {}", expected_fee_1.amount, - actual_swap_result.expected_fees[0].amount, - max_diff, - ), "Wrong amount of first trx fee received when using source quantity. Expected: {}, Actual: {}", - expected_fee_1.amount, - actual_swap_result.expected_fees[0].amount + actual_swap_result.expected_fees[0].amount ); - assert!(are_fpdecimals_approximately_equal( + assert!( + are_fpdecimals_approximately_equal(expected_fee_2.amount, actual_swap_result.expected_fees[1].amount, max_diff,), + "Wrong amount of second trx fee received when using source quantity. Expected: {}, Actual: {}", expected_fee_2.amount, - actual_swap_result.expected_fees[1].amount, - max_diff, - ), "Wrong amount of second trx fee received when using source quantity. Expected: {}, Actual: {}", - expected_fee_2.amount, - actual_swap_result.expected_fees[1].amount + actual_swap_result.expected_fees[1].amount ); } @@ -268,7 +252,7 @@ fn test_calculate_swap_price_self_fee_recipient_from_target_quantity() { instantiate( deps.as_mut_deps(), mock_env(), - mock_info(admin.as_ref(), &[coin(1_000u128, "usdt")]), + message_info(&Addr::unchecked(admin), &[coin(1_000u128, "usdt")]), InstantiateMsg { fee_recipient: FeeRecipient::SwapContract, admin: admin.to_owned(), @@ -320,22 +304,18 @@ fn test_calculate_swap_price_self_fee_recipient_from_target_quantity() { let max_diff = human_to_dec("0.00001", Decimals::Six); - assert!(are_fpdecimals_approximately_equal( + assert!( + are_fpdecimals_approximately_equal(expected_fee_1.amount, actual_swap_result.expected_fees[0].amount, max_diff,), + "Wrong amount of first trx fee received when using source quantity. Expected: {}, Actual: {}", expected_fee_1.amount, - actual_swap_result.expected_fees[0].amount, - max_diff, - ), "Wrong amount of first trx fee received when using source quantity. Expected: {}, Actual: {}", - expected_fee_1.amount, - actual_swap_result.expected_fees[0].amount + actual_swap_result.expected_fees[0].amount ); - assert!(are_fpdecimals_approximately_equal( + assert!( + are_fpdecimals_approximately_equal(expected_fee_2.amount, actual_swap_result.expected_fees[1].amount, max_diff,), + "Wrong amount of second trx fee received when using source quantity. Expected: {}, Actual: {}", expected_fee_2.amount, - actual_swap_result.expected_fees[1].amount, - max_diff, - ), "Wrong amount of second trx fee received when using source quantity. Expected: {}, Actual: {}", - expected_fee_2.amount, - actual_swap_result.expected_fees[1].amount + actual_swap_result.expected_fees[1].amount ); } @@ -349,7 +329,7 @@ fn test_calculate_estimate_when_selling_both_quantity_directions_simple() { instantiate( deps.as_mut_deps(), mock_env(), - mock_info(admin.as_ref(), &[coin(1_000u128, "usdt")]), + message_info(&Addr::unchecked(admin), &[coin(1_000u128, "usdt")]), InstantiateMsg { fee_recipient: FeeRecipient::Address(admin.to_owned()), admin: admin.to_owned(), @@ -399,11 +379,7 @@ fn test_calculate_estimate_when_selling_both_quantity_directions_simple() { let max_diff = human_to_dec("0.1", Decimals::Eighteen); assert!( - are_fpdecimals_approximately_equal( - expected_fee.amount, - input_swap_estimate.expected_fees[0].amount, - max_diff, - ), + are_fpdecimals_approximately_equal(expected_fee.amount, input_swap_estimate.expected_fees[0].amount, max_diff,), "Wrong amount of trx fee received when using source quantity. Expected: {}, Actual: {}", expected_fee.amount, input_swap_estimate.expected_fees[0].amount @@ -426,11 +402,7 @@ fn test_calculate_estimate_when_selling_both_quantity_directions_simple() { ); assert!( - are_fpdecimals_approximately_equal( - output_swap_estimate.result_quantity, - eth_input_amount, - max_diff - ), + are_fpdecimals_approximately_equal(output_swap_estimate.result_quantity, eth_input_amount, max_diff), "Wrong amount of swap execution estimate received when using target quantity" ); @@ -443,11 +415,7 @@ fn test_calculate_estimate_when_selling_both_quantity_directions_simple() { let max_diff = human_to_dec("0.1", Decimals::Six); assert!( - are_fpdecimals_approximately_equal( - expected_fee.amount, - input_swap_estimate.expected_fees[0].amount, - max_diff, - ), + are_fpdecimals_approximately_equal(expected_fee.amount, input_swap_estimate.expected_fees[0].amount, max_diff,), "Wrong amount of trx fee received when using source quantity. Expected: {}, Actual: {}", expected_fee.amount, input_swap_estimate.expected_fees[0].amount @@ -465,7 +433,7 @@ fn test_calculate_estimate_when_buying_both_quantity_directions_simple() { instantiate( deps.as_mut_deps(), mock_env(), - mock_info(admin.as_ref(), &[coin(1_000u128, "usdt")]), + message_info(&Addr::unchecked(admin), &[coin(1_000u128, "usdt")]), InstantiateMsg { fee_recipient: FeeRecipient::Address(admin.to_owned()), admin: admin.to_owned(), @@ -515,11 +483,7 @@ fn test_calculate_estimate_when_buying_both_quantity_directions_simple() { let mut max_diff = human_to_dec("0.00001", Decimals::Six); assert!( - are_fpdecimals_approximately_equal( - expected_fee.amount, - input_swap_estimate.expected_fees[0].amount, - max_diff, - ), + are_fpdecimals_approximately_equal(expected_fee.amount, input_swap_estimate.expected_fees[0].amount, max_diff,), "Wrong amount of trx fee received when using source quantity. Expected: {}, Actual: {}", expected_fee.amount, input_swap_estimate.expected_fees[0].amount @@ -538,20 +502,12 @@ fn test_calculate_estimate_when_buying_both_quantity_directions_simple() { max_diff = usdt_input_amount * FPDecimal::must_from_str("0.00025"); assert!( - are_fpdecimals_approximately_equal( - output_swap_estimate.result_quantity, - usdt_input_amount, - max_diff - ), + are_fpdecimals_approximately_equal(output_swap_estimate.result_quantity, usdt_input_amount, max_diff), "Wrong amount of swap execution estimate received when using target quantity" ); assert!( - are_fpdecimals_approximately_equal( - expected_fee.amount, - input_swap_estimate.expected_fees[0].amount, - max_diff, - ), + are_fpdecimals_approximately_equal(expected_fee.amount, input_swap_estimate.expected_fees[0].amount, max_diff,), "Wrong amount of trx fee received when using source quantity. Expected: {}, Actual: {}", expected_fee.amount, input_swap_estimate.expected_fees[0].amount @@ -566,7 +522,7 @@ fn get_all_queries_returns_empty_array_if_no_routes_are_set() { instantiate( deps.as_mut_deps(), mock_env(), - mock_info(admin.as_ref(), &[coin(1_000u128, "usdt")]), + message_info(&Addr::unchecked(admin), &[coin(1_000u128, "usdt")]), InstantiateMsg { fee_recipient: FeeRecipient::SwapContract, admin: admin.to_owned(), @@ -574,13 +530,10 @@ fn get_all_queries_returns_empty_array_if_no_routes_are_set() { ) .unwrap(); - let all_routes_result = get_all_swap_routes(deps.as_ref().storage); + let all_routes_result = get_all_swap_routes(deps.as_ref().storage, None, None); assert!(all_routes_result.is_ok(), "Error getting all routes"); - assert!( - all_routes_result.unwrap().is_empty(), - "Routes should be empty" - ); + assert!(all_routes_result.unwrap().is_empty(), "Routes should be empty"); } #[test] @@ -591,7 +544,7 @@ fn get_all_queries_returns_expected_array_if_routes_are_set() { instantiate( deps.as_mut_deps(), mock_env(), - mock_info(admin.as_ref(), &[coin(1_000u128, "usdt")]), + message_info(&Addr::unchecked(admin), &[coin(1_000u128, "usdt")]), InstantiateMsg { fee_recipient: FeeRecipient::SwapContract, admin: admin.to_owned(), @@ -626,7 +579,7 @@ fn get_all_queries_returns_expected_array_if_routes_are_set() { ) .unwrap(); - let all_routes_result = get_all_swap_routes(deps.as_ref().storage); + let all_routes_result = get_all_swap_routes(deps.as_ref().storage, None, None); assert!(all_routes_result.is_ok(), "Error getting all routes"); let eth_inj_route = SwapRoute { @@ -653,4 +606,7 @@ fn get_all_queries_returns_expected_array_if_routes_are_set() { vec![eth_inj_route, eth_usdt_route, usdt_inj_route], "Incorrect routes returned" ); + + let all_routes_result_paginated = get_all_swap_routes(deps.as_ref().storage, None, Some(1u32)); + assert_eq!(all_routes_result_paginated.unwrap().len(), 1); } diff --git a/contracts/swap/src/testing/storage_tests.rs b/contracts/swap/src/testing/storage_tests.rs index 4e5dbdf..7690721 100644 --- a/contracts/swap/src/testing/storage_tests.rs +++ b/contracts/swap/src/testing/storage_tests.rs @@ -1,14 +1,10 @@ use cosmwasm_std::Addr; use crate::admin::{delete_route, set_route}; -use injective_cosmwasm::{ - inj_mock_deps, MarketId, OwnedDepsExt, TEST_MARKET_ID_1, TEST_MARKET_ID_2, TEST_MARKET_ID_3, -}; +use injective_cosmwasm::{inj_mock_deps, MarketId, OwnedDepsExt, TEST_MARKET_ID_1, TEST_MARKET_ID_2, TEST_MARKET_ID_3}; use crate::state::{read_swap_route, store_swap_route, CONFIG}; -use crate::testing::test_utils::{ - mock_deps_eth_inj, MultiplierQueryBehavior, TEST_CONTRACT_ADDR, TEST_USER_ADDR, -}; +use crate::testing::test_utils::{mock_deps_eth_inj, MultiplierQueryBehavior, TEST_CONTRACT_ADDR, TEST_USER_ADDR}; use crate::types::{Config, SwapRoute}; #[test] @@ -18,10 +14,7 @@ fn it_can_store_and_read_swap_route() { let target_denom = "inj"; let route = SwapRoute { - steps: vec![ - MarketId::unchecked(TEST_MARKET_ID_1), - MarketId::unchecked(TEST_MARKET_ID_2), - ], + steps: vec![MarketId::unchecked(TEST_MARKET_ID_1), MarketId::unchecked(TEST_MARKET_ID_2)], source_denom: source_denom.to_string(), target_denom: target_denom.to_string(), }; @@ -59,10 +52,7 @@ fn it_can_update_and_read_swap_route() { let new_target_denom = "inj"; let updated_route = SwapRoute { - steps: vec![ - MarketId::unchecked(TEST_MARKET_ID_1), - MarketId::unchecked(TEST_MARKET_ID_2), - ], + steps: vec![MarketId::unchecked(TEST_MARKET_ID_1), MarketId::unchecked(TEST_MARKET_ID_2)], source_denom: source_denom.to_string(), target_denom: new_target_denom.to_string(), }; @@ -78,18 +68,13 @@ fn owner_can_set_valid_route() { let mut deps = mock_deps_eth_inj(MultiplierQueryBehavior::Success); let source_denom = "eth".to_string(); let target_denom = "inj".to_string(); - let route = vec![ - MarketId::unchecked(TEST_MARKET_ID_1), - MarketId::unchecked(TEST_MARKET_ID_2), - ]; + let route = vec![MarketId::unchecked(TEST_MARKET_ID_1), MarketId::unchecked(TEST_MARKET_ID_2)]; let config = Config { fee_recipient: Addr::unchecked(TEST_USER_ADDR), admin: Addr::unchecked(TEST_USER_ADDR), }; - CONFIG - .save(deps.as_mut_deps().storage, &config) - .expect("could not save config"); + CONFIG.save(deps.as_mut_deps().storage, &config).expect("could not save config"); let result = set_route( deps.as_mut(), @@ -102,25 +87,13 @@ fn owner_can_set_valid_route() { assert!(result.is_ok(), "result was not ok"); let response = result.unwrap(); - assert_eq!( - response.attributes[0].key, "method", - "method attribute was not set" - ); - assert_eq!( - response.attributes[0].value, "set_route", - "method attribute was not set" - ); + assert_eq!(response.attributes[0].key, "method", "method attribute was not set"); + assert_eq!(response.attributes[0].value, "set_route", "method attribute was not set"); let stored_route = read_swap_route(&deps.storage, &source_denom, &target_denom).unwrap(); assert_eq!(stored_route.steps, route, "route was not set correctly"); - assert_eq!( - stored_route.source_denom, source_denom, - "route was not set correctly" - ); - assert_eq!( - stored_route.target_denom, target_denom, - "route was not set correctly" - ); + assert_eq!(stored_route.source_denom, source_denom, "route was not set correctly"); + assert_eq!(stored_route.target_denom, target_denom, "route was not set correctly"); } #[test] @@ -128,18 +101,13 @@ fn owner_cannot_set_route_for_markets_using_target_denom_not_found_on_target_mar let mut deps = mock_deps_eth_inj(MultiplierQueryBehavior::Success); let source_denom = "eth".to_string(); let target_denom = "atom".to_string(); - let route = vec![ - MarketId::unchecked(TEST_MARKET_ID_1), - MarketId::unchecked(TEST_MARKET_ID_2), - ]; + let route = vec![MarketId::unchecked(TEST_MARKET_ID_1), MarketId::unchecked(TEST_MARKET_ID_2)]; let config = Config { fee_recipient: Addr::unchecked(TEST_USER_ADDR), admin: Addr::unchecked(TEST_USER_ADDR), }; - CONFIG - .save(deps.as_mut_deps().storage, &config) - .expect("could not save config"); + CONFIG.save(deps.as_mut_deps().storage, &config).expect("could not save config"); let result = set_route( deps.as_mut(), @@ -151,10 +119,7 @@ fn owner_cannot_set_route_for_markets_using_target_denom_not_found_on_target_mar assert!(result.is_err(), "result was ok"); assert!( - result - .unwrap_err() - .to_string() - .contains("Target denom not found in last market"), + result.unwrap_err().to_string().contains("Target denom not found in last market"), "wrong error message" ); @@ -167,18 +132,13 @@ fn owner_cannot_set_route_for_markets_using_source_denom_not_present_on_source_m let mut deps = mock_deps_eth_inj(MultiplierQueryBehavior::Success); let source_denom = "atom".to_string(); let target_denom = "eth".to_string(); - let route = vec![ - MarketId::unchecked(TEST_MARKET_ID_1), - MarketId::unchecked(TEST_MARKET_ID_2), - ]; + let route = vec![MarketId::unchecked(TEST_MARKET_ID_1), MarketId::unchecked(TEST_MARKET_ID_2)]; let config = Config { fee_recipient: Addr::unchecked(TEST_USER_ADDR), admin: Addr::unchecked(TEST_USER_ADDR), }; - CONFIG - .save(deps.as_mut_deps().storage, &config) - .expect("could not save config"); + CONFIG.save(deps.as_mut_deps().storage, &config).expect("could not save config"); let result = set_route( deps.as_mut(), @@ -190,10 +150,7 @@ fn owner_cannot_set_route_for_markets_using_source_denom_not_present_on_source_m assert!(result.is_err(), "result was ok"); assert!( - result - .unwrap_err() - .to_string() - .contains("Source denom not found in first market"), + result.unwrap_err().to_string().contains("Source denom not found in first market"), "wrong error message" ); @@ -212,9 +169,7 @@ fn owner_can_set_route_single_step_route() { fee_recipient: Addr::unchecked(TEST_USER_ADDR), admin: Addr::unchecked(TEST_USER_ADDR), }; - CONFIG - .save(deps.as_mut_deps().storage, &config) - .expect("could not save config"); + CONFIG.save(deps.as_mut_deps().storage, &config).expect("could not save config"); let result = set_route( deps.as_mut(), @@ -227,25 +182,13 @@ fn owner_can_set_route_single_step_route() { assert!(result.is_ok(), "result was not ok"); let response = result.unwrap(); - assert_eq!( - response.attributes[0].key, "method", - "method attribute was not set" - ); - assert_eq!( - response.attributes[0].value, "set_route", - "method attribute was not set" - ); + assert_eq!(response.attributes[0].key, "method", "method attribute was not set"); + assert_eq!(response.attributes[0].value, "set_route", "method attribute was not set"); let stored_route = read_swap_route(&deps.storage, &source_denom, &target_denom).unwrap(); assert_eq!(stored_route.steps, route, "route was not stored correctly"); - assert_eq!( - stored_route.source_denom, source_denom, - "source_denom was not stored correctly" - ); - assert_eq!( - stored_route.target_denom, target_denom, - "target_denom was not stored correctly" - ); + assert_eq!(stored_route.source_denom, source_denom, "source_denom was not stored correctly"); + assert_eq!(stored_route.target_denom, target_denom, "target_denom was not stored correctly"); } #[test] @@ -259,9 +202,7 @@ fn owner_can_set_route_single_step_route_with_reverted_denoms() { fee_recipient: Addr::unchecked(TEST_USER_ADDR), admin: Addr::unchecked(TEST_USER_ADDR), }; - CONFIG - .save(deps.as_mut_deps().storage, &config) - .expect("could not save config"); + CONFIG.save(deps.as_mut_deps().storage, &config).expect("could not save config"); let result = set_route( deps.as_mut(), @@ -274,25 +215,13 @@ fn owner_can_set_route_single_step_route_with_reverted_denoms() { assert!(result.is_ok(), "result was not ok"); let response = result.unwrap(); - assert_eq!( - response.attributes[0].key, "method", - "method attribute was not set" - ); - assert_eq!( - response.attributes[0].value, "set_route", - "method attribute was not set" - ); + assert_eq!(response.attributes[0].key, "method", "method attribute was not set"); + assert_eq!(response.attributes[0].value, "set_route", "method attribute was not set"); let stored_route = read_swap_route(&deps.storage, &source_denom, &target_denom).unwrap(); assert_eq!(stored_route.steps, route, "route was not stored correctly"); - assert_eq!( - stored_route.source_denom, source_denom, - "source_denom was not stored correctly" - ); - assert_eq!( - stored_route.target_denom, target_denom, - "target_denom was not stored correctly" - ); + assert_eq!(stored_route.source_denom, source_denom, "source_denom was not stored correctly"); + assert_eq!(stored_route.target_denom, target_denom, "target_denom was not stored correctly"); } #[test] @@ -300,19 +229,14 @@ fn it_returns_error_when_setting_route_for_the_same_denom_as_target_and_source() let mut deps = mock_deps_eth_inj(MultiplierQueryBehavior::Success); let source_denom = "eth".to_string(); let target_denom = "eth".to_string(); - let route = vec![ - MarketId::unchecked(TEST_MARKET_ID_1), - MarketId::unchecked(TEST_MARKET_ID_2), - ]; + let route = vec![MarketId::unchecked(TEST_MARKET_ID_1), MarketId::unchecked(TEST_MARKET_ID_2)]; let config = Config { fee_recipient: Addr::unchecked(TEST_USER_ADDR), admin: Addr::unchecked(TEST_USER_ADDR), }; - CONFIG - .save(deps.as_mut_deps().storage, &config) - .expect("could not save config"); + CONFIG.save(deps.as_mut_deps().storage, &config).expect("could not save config"); let result = set_route( deps.as_mut(), @@ -322,10 +246,7 @@ fn it_returns_error_when_setting_route_for_the_same_denom_as_target_and_source() route, ); - assert!( - result.is_err(), - "Could set a route with the same denom being source and target!" - ); + assert!(result.is_err(), "Could set a route with the same denom being source and target!"); assert!( result .unwrap_err() @@ -335,10 +256,7 @@ fn it_returns_error_when_setting_route_for_the_same_denom_as_target_and_source() ); let stored_route = read_swap_route(&deps.storage, &source_denom, &target_denom); - assert!( - stored_route.is_err(), - "Could read a route with the same denom being source and target!" - ); + assert!(stored_route.is_err(), "Could read a route with the same denom being source and target!"); } #[test] @@ -353,9 +271,7 @@ fn it_returns_error_when_setting_route_with_nonexistent_market_id() { admin: Addr::unchecked(TEST_USER_ADDR), }; - CONFIG - .save(deps.as_mut_deps().storage, &config) - .expect("could not save config"); + CONFIG.save(deps.as_mut_deps().storage, &config).expect("could not save config"); let result = set_route( deps.as_mut(), @@ -369,17 +285,12 @@ fn it_returns_error_when_setting_route_with_nonexistent_market_id() { let err_result = result.unwrap_err(); assert!( - err_result - .to_string() - .contains(&format!("Market {TEST_MARKET_ID_3} not found")), + err_result.to_string().contains(&format!("Market {TEST_MARKET_ID_3} not found")), "wrong error message" ); let stored_route = read_swap_route(&deps.storage, &source_denom, &target_denom); - assert!( - stored_route.is_err(), - "Could read a route for non-existent market" - ); + assert!(stored_route.is_err(), "Could read a route for non-existent market"); } #[test] @@ -394,9 +305,7 @@ fn it_returns_error_when_setting_route_with_no_market_ids() { admin: Addr::unchecked(TEST_USER_ADDR), }; - CONFIG - .save(deps.as_mut_deps().storage, &config) - .expect("could not save config"); + CONFIG.save(deps.as_mut_deps().storage, &config).expect("could not save config"); let result = set_route( deps.as_mut(), @@ -408,18 +317,12 @@ fn it_returns_error_when_setting_route_with_no_market_ids() { assert!(result.is_err(), "Could set a route without any steps"); assert!( - result - .unwrap_err() - .to_string() - .contains("Route must have at least one step"), + result.unwrap_err().to_string().contains("Route must have at least one step"), "wrong error message" ); let stored_route = read_swap_route(&deps.storage, &source_denom, &target_denom); - assert!( - stored_route.is_err(), - "Could read a route without any steps" - ); + assert!(stored_route.is_err(), "Could read a route without any steps"); } #[test] @@ -427,19 +330,14 @@ fn it_returns_error_when_setting_route_with_duplicated_market_ids() { let mut deps = inj_mock_deps(|_| {}); let source_denom = "eth".to_string(); let target_denom = "usdt".to_string(); - let route = vec![ - MarketId::unchecked(TEST_MARKET_ID_1), - MarketId::unchecked(TEST_MARKET_ID_1), - ]; + let route = vec![MarketId::unchecked(TEST_MARKET_ID_1), MarketId::unchecked(TEST_MARKET_ID_1)]; let config = Config { fee_recipient: Addr::unchecked(TEST_USER_ADDR), admin: Addr::unchecked(TEST_USER_ADDR), }; - CONFIG - .save(deps.as_mut_deps().storage, &config) - .expect("could not save config"); + CONFIG.save(deps.as_mut_deps().storage, &config).expect("could not save config"); let result = set_route( deps.as_mut(), @@ -449,23 +347,14 @@ fn it_returns_error_when_setting_route_with_duplicated_market_ids() { route, ); + assert!(result.is_err(), "Could set a route that begins and ends with the same market"); assert!( - result.is_err(), - "Could set a route that begins and ends with the same market" - ); - assert!( - result - .unwrap_err() - .to_string() - .contains("Route cannot have duplicate steps"), + result.unwrap_err().to_string().contains("Route cannot have duplicate steps"), "wrong error message" ); let stored_route = read_swap_route(&deps.storage, &source_denom, &target_denom); - assert!( - stored_route.is_err(), - "Could read a route that begins and ends with the same market" - ); + assert!(stored_route.is_err(), "Could read a route that begins and ends with the same market"); } #[test] @@ -473,18 +362,13 @@ fn it_returns_error_if_non_admin_tries_to_set_route() { let mut deps = mock_deps_eth_inj(MultiplierQueryBehavior::Success); let source_denom = "eth".to_string(); let target_denom = "inj".to_string(); - let route = vec![ - MarketId::unchecked(TEST_MARKET_ID_1), - MarketId::unchecked(TEST_MARKET_ID_2), - ]; + let route = vec![MarketId::unchecked(TEST_MARKET_ID_1), MarketId::unchecked(TEST_MARKET_ID_2)]; let config = Config { fee_recipient: Addr::unchecked(TEST_USER_ADDR), admin: Addr::unchecked(TEST_USER_ADDR), }; - CONFIG - .save(deps.as_mut_deps().storage, &config) - .expect("could not save config"); + CONFIG.save(deps.as_mut_deps().storage, &config).expect("could not save config"); let result = set_route( deps.as_mut(), @@ -495,16 +379,11 @@ fn it_returns_error_if_non_admin_tries_to_set_route() { ); assert!(result.is_err(), "expected error"); - assert!( - result.unwrap_err().to_string().contains("Unauthorized"), - "wrong error message" - ); + assert!(result.unwrap_err().to_string().contains("Unauthorized"), "wrong error message"); let stored_route = read_swap_route(&deps.storage, &source_denom, &target_denom).unwrap_err(); assert!( - stored_route - .to_string() - .contains("No swap route not found from eth to inj"), + stored_route.to_string().contains("No swap route not found from eth to inj"), "wrong error message" ); } @@ -514,18 +393,13 @@ fn it_allows_admint_to_delete_existing_route() { let mut deps = mock_deps_eth_inj(MultiplierQueryBehavior::Success); let source_denom = "eth".to_string(); let target_denom = "inj".to_string(); - let route = vec![ - MarketId::unchecked(TEST_MARKET_ID_1), - MarketId::unchecked(TEST_MARKET_ID_2), - ]; + let route = vec![MarketId::unchecked(TEST_MARKET_ID_1), MarketId::unchecked(TEST_MARKET_ID_2)]; let config = Config { fee_recipient: Addr::unchecked(TEST_USER_ADDR), admin: Addr::unchecked(TEST_USER_ADDR), }; - CONFIG - .save(deps.as_mut_deps().storage, &config) - .expect("could not save config"); + CONFIG.save(deps.as_mut_deps().storage, &config).expect("could not save config"); let set_result = set_route( deps.as_mut(), @@ -548,9 +422,7 @@ fn it_allows_admint_to_delete_existing_route() { let stored_route = read_swap_route(&deps.storage, &source_denom, &target_denom).unwrap_err(); assert!( - stored_route - .to_string() - .contains("No swap route not found from eth to inj"), + stored_route.to_string().contains("No swap route not found from eth to inj"), "route was not deleted and could be read" ); } @@ -560,18 +432,13 @@ fn it_doesnt_fail_if_admin_deletes_non_existent_route() { let mut deps = mock_deps_eth_inj(MultiplierQueryBehavior::Success); let source_denom = "eth".to_string(); let target_denom = "inj".to_string(); - let route = vec![ - MarketId::unchecked(TEST_MARKET_ID_1), - MarketId::unchecked(TEST_MARKET_ID_2), - ]; + let route = vec![MarketId::unchecked(TEST_MARKET_ID_1), MarketId::unchecked(TEST_MARKET_ID_2)]; let config = Config { fee_recipient: Addr::unchecked(TEST_USER_ADDR), admin: Addr::unchecked(TEST_USER_ADDR), }; - CONFIG - .save(deps.as_mut_deps().storage, &config) - .expect("could not save config"); + CONFIG.save(deps.as_mut_deps().storage, &config).expect("could not save config"); let set_result = set_route( deps.as_mut(), @@ -601,18 +468,13 @@ fn it_returns_error_if_non_admin_tries_to_delete_route() { let mut deps = mock_deps_eth_inj(MultiplierQueryBehavior::Success); let source_denom = "eth".to_string(); let target_denom = "inj".to_string(); - let route = vec![ - MarketId::unchecked(TEST_MARKET_ID_1), - MarketId::unchecked(TEST_MARKET_ID_2), - ]; + let route = vec![MarketId::unchecked(TEST_MARKET_ID_1), MarketId::unchecked(TEST_MARKET_ID_2)]; let config = Config { fee_recipient: Addr::unchecked(TEST_USER_ADDR), admin: Addr::unchecked(TEST_USER_ADDR), }; - CONFIG - .save(deps.as_mut_deps().storage, &config) - .expect("could not save config"); + CONFIG.save(deps.as_mut_deps().storage, &config).expect("could not save config"); let set_result = set_route( deps.as_mut(), diff --git a/contracts/swap/src/testing/swap_tests.rs b/contracts/swap/src/testing/swap_tests.rs index e35baae..19b8c7b 100644 --- a/contracts/swap/src/testing/swap_tests.rs +++ b/contracts/swap/src/testing/swap_tests.rs @@ -6,9 +6,7 @@ use injective_cosmwasm::{MarketId, OwnedDepsExt, TEST_MARKET_ID_1, TEST_MARKET_I use crate::admin::set_route; use crate::queries::estimate_single_swap_execution; use crate::state::CONFIG; -use crate::testing::test_utils::{ - mock_deps_eth_inj, str_coin, Decimals, MultiplierQueryBehavior, TEST_USER_ADDR, -}; +use crate::testing::test_utils::{mock_deps_eth_inj, str_coin, Decimals, MultiplierQueryBehavior, TEST_USER_ADDR}; use crate::types::{Config, FPCoin, SwapEstimationAmount}; #[test] @@ -21,9 +19,7 @@ fn it_reverts_if_atomic_fee_multiplier_query_fails() { fee_recipient: Addr::unchecked(TEST_USER_ADDR), admin: Addr::unchecked(TEST_USER_ADDR), }; - CONFIG - .save(deps.as_mut_deps().storage, &config) - .expect("could not save config"); + CONFIG.save(deps.as_mut_deps().storage, &config).expect("could not save config"); set_route( deps.as_mut_deps(), @@ -44,10 +40,7 @@ fn it_reverts_if_atomic_fee_multiplier_query_fails() { assert!(response_1.is_err(), "should have failed"); assert!( - response_1 - .unwrap_err() - .to_string() - .contains("Querier system error: Unknown system error"), + response_1.unwrap_err().to_string().contains("Querier system error: Unknown system error"), "wrong error message" ); } diff --git a/contracts/swap/src/testing/test_artifacts/swap-contract-v100.wasm b/contracts/swap/src/testing/test_artifacts/swap-contract-v100.wasm deleted file mode 100644 index 4bdd560..0000000 Binary files a/contracts/swap/src/testing/test_artifacts/swap-contract-v100.wasm and /dev/null differ diff --git a/contracts/swap/src/testing/test_artifacts/swap_contract-v101.wasm b/contracts/swap/src/testing/test_artifacts/swap_contract-v101.wasm new file mode 100644 index 0000000..59d7e8a Binary files /dev/null and b/contracts/swap/src/testing/test_artifacts/swap_contract-v101.wasm differ diff --git a/contracts/swap/src/testing/test_utils.rs b/contracts/swap/src/testing/test_utils.rs index 1646c80..85c8ca5 100644 --- a/contracts/swap/src/testing/test_utils.rs +++ b/contracts/swap/src/testing/test_utils.rs @@ -1,18 +1,11 @@ use crate::helpers::Scaled; -use cosmos_sdk_proto::prost::Message; -use cosmwasm_std::{ - coin, - testing::{MockApi, MockStorage}, - to_json_binary, Addr, Coin, ContractResult, OwnedDeps, QuerierResult, SystemError, - SystemResult, -}; +use cosmwasm_std::testing::{MockApi, MockStorage}; +use cosmwasm_std::{coin, to_json_binary, Addr, Coin, ContractResult, OwnedDeps, QuerierResult, SystemError, SystemResult}; use injective_cosmwasm::{ - create_orderbook_response_handler, create_spot_multi_market_handler, - get_default_subaccount_id_for_checked_address, inj_mock_deps, test_market_ids, - HandlesMarketIdQuery, InjectiveQueryWrapper, MarketId, PriceLevel, - QueryMarketAtomicExecutionFeeMultiplierResponse, SpotMarket, WasmMockQuerier, TEST_MARKET_ID_1, - TEST_MARKET_ID_2, + create_orderbook_response_handler, create_spot_multi_market_handler, get_default_subaccount_id_for_checked_address, inj_mock_deps, + test_market_ids, HandlesMarketIdQuery, InjectiveQueryWrapper, MarketId, PriceLevel, QueryMarketAtomicExecutionFeeMultiplierResponse, SpotMarket, + WasmMockQuerier, TEST_MARKET_ID_1, TEST_MARKET_ID_2, }; use injective_math::FPDecimal; use injective_std::{ @@ -20,27 +13,24 @@ use injective_std::{ types::{ cosmos::{ authz::v1beta1::{Grant, MsgGrant}, - bank::v1beta1::{MsgSend, QueryAllBalancesRequest, QueryBalanceRequest}, - base::v1beta1::Coin as TubeCoin, - gov::v1::MsgVote, - gov::v1beta1::MsgSubmitProposal, - }, - cosmwasm::wasm::v1::{ - AcceptedMessageKeysFilter, ContractExecutionAuthorization, ContractGrant, MaxCallsLimit, - }, - injective::exchange::v1beta1::{ - MsgCreateSpotLimitOrder, MsgInstantSpotMarketLaunch, OrderInfo, OrderType, - QuerySpotMarketsRequest, SpotMarketParamUpdateProposal, SpotOrder, + bank::v1beta1::{QueryAllBalancesRequest, QueryBalanceRequest}, }, + cosmwasm::wasm::v1::{AcceptedMessageKeysFilter, ContractExecutionAuthorization, ContractGrant, MaxCallsLimit}, + injective::exchange::v1beta1::{MsgCreateSpotLimitOrder, OrderInfo, OrderType, SpotOrder}, }, }; -use injective_test_tube::{ - Account, Authz, Bank, Exchange, Gov, InjectiveTestApp, Module, SigningAccount, Wasm, +use injective_test_tube::{Account, Authz, Bank, Exchange, InjectiveTestApp, Module, SigningAccount, Wasm}; +use injective_testing::{ + test_tube::{exchange::launch_spot_market_custom, utils::store_code}, + utils::scale_price_quantity_spot_market, }; +use prost::Message; use std::{collections::HashMap, str::FromStr}; -use crate::msg::{ExecuteMsg, FeeRecipient, InstantiateMsg}; -use crate::types::FPCoin; +use crate::{ + msg::{ExecuteMsg, FeeRecipient, InstantiateMsg}, + types::FPCoin, +}; pub const TEST_CONTRACT_ADDR: &str = "inj14hj2tavq8fpesdwxxcu44rty3hh90vhujaxlnz"; pub const TEST_USER_ADDR: &str = "inj1p7z8p649xspcey7wp5e4leqf7wa39kjjj6wja8"; @@ -56,7 +46,6 @@ pub const NINJA: &str = "ninja"; pub const DEFAULT_TAKER_FEE: f64 = 0.001; pub const DEFAULT_ATOMIC_MULTIPLIER: f64 = 2.5; pub const DEFAULT_SELF_RELAYING_FEE_PART: f64 = 0.6; -pub const DEFAULT_RELAYER_SHARE: f64 = 1.0 - DEFAULT_SELF_RELAYING_FEE_PART; #[derive(PartialEq, Eq, Debug, Copy, Clone)] #[repr(i32)] @@ -95,21 +84,11 @@ pub fn mock_deps_eth_inj( let mut markets = HashMap::new(); markets.insert( MarketId::new(TEST_MARKET_ID_1).unwrap(), - create_mock_spot_market( - "eth", - FPDecimal::must_from_str("0.001"), - FPDecimal::must_from_str("0.001"), - 0, - ), + create_mock_spot_market("eth", FPDecimal::must_from_str("0.001"), FPDecimal::must_from_str("0.001"), 0), ); markets.insert( MarketId::new(TEST_MARKET_ID_2).unwrap(), - create_mock_spot_market( - "inj", - FPDecimal::must_from_str("0.001"), - FPDecimal::must_from_str("0.001"), - 1, - ), + create_mock_spot_market("inj", FPDecimal::must_from_str("0.001"), FPDecimal::must_from_str("0.001"), 1), ); querier.spot_market_response_handler = create_spot_multi_market_handler(markets); @@ -150,8 +129,7 @@ pub fn mock_deps_eth_inj( ]; orderbooks.insert(MarketId::new(TEST_MARKET_ID_2).unwrap(), inj_sell_orderbook); - querier.spot_market_orderbook_response_handler = - create_orderbook_response_handler(orderbooks); + querier.spot_market_orderbook_response_handler = create_orderbook_response_handler(orderbooks); if multiplier_query_behavior == MultiplierQueryBehavior::Fail { pub fn create_spot_error_multiplier_handler() -> Option> { @@ -166,8 +144,7 @@ pub fn mock_deps_eth_inj( Some(Box::new(Temp {})) } - querier.market_atomic_execution_fee_multiplier_response_handler = - create_spot_error_multiplier_handler() + querier.market_atomic_execution_fee_multiplier_response_handler = create_spot_error_multiplier_handler() } else { pub fn create_spot_ok_multiplier_handler() -> Option> { struct Temp {} @@ -184,8 +161,7 @@ pub fn mock_deps_eth_inj( Some(Box::new(Temp {})) } - querier.market_atomic_execution_fee_multiplier_response_handler = - create_spot_ok_multiplier_handler() + querier.market_atomic_execution_fee_multiplier_response_handler = create_spot_ok_multiplier_handler() } }) } @@ -206,12 +182,7 @@ pub fn mock_realistic_deps_eth_atom( ); markets.insert( MarketId::new(TEST_MARKET_ID_2).unwrap(), - create_mock_spot_market( - "atom", - FPDecimal::must_from_str("0.001"), - FPDecimal::must_from_str("10000"), - 1, - ), + create_mock_spot_market("atom", FPDecimal::must_from_str("0.001"), FPDecimal::must_from_str("10000"), 1), ); querier.spot_market_response_handler = create_spot_multi_market_handler(markets); @@ -252,8 +223,7 @@ pub fn mock_realistic_deps_eth_atom( ]; orderbooks.insert(MarketId::new(TEST_MARKET_ID_2).unwrap(), inj_sell_orderbook); - querier.spot_market_orderbook_response_handler = - create_orderbook_response_handler(orderbooks); + querier.spot_market_orderbook_response_handler = create_orderbook_response_handler(orderbooks); if multiplier_query_behavior == MultiplierQueryBehavior::Fail { pub fn create_spot_error_multiplier_handler() -> Option> { @@ -268,8 +238,7 @@ pub fn mock_realistic_deps_eth_atom( Some(Box::new(Temp {})) } - querier.market_atomic_execution_fee_multiplier_response_handler = - create_spot_error_multiplier_handler() + querier.market_atomic_execution_fee_multiplier_response_handler = create_spot_error_multiplier_handler() } else { pub fn create_spot_ok_multiplier_handler() -> Option> { struct Temp {} @@ -286,18 +255,12 @@ pub fn mock_realistic_deps_eth_atom( Some(Box::new(Temp {})) } - querier.market_atomic_execution_fee_multiplier_response_handler = - create_spot_ok_multiplier_handler() + querier.market_atomic_execution_fee_multiplier_response_handler = create_spot_ok_multiplier_handler() } }) } -fn create_mock_spot_market( - base: &str, - min_price_tick_size: FPDecimal, - min_quantity_tick_size: FPDecimal, - idx: u32, -) -> SpotMarket { +fn create_mock_spot_market(base: &str, min_price_tick_size: FPDecimal, min_quantity_tick_size: FPDecimal, idx: u32) -> SpotMarket { SpotMarket { ticker: format!("{base}usdt"), base_denom: base.to_string(), @@ -312,168 +275,63 @@ fn create_mock_spot_market( } } -pub fn wasm_file(contract_name: String) -> String { - let snaked_name = contract_name.replace('-', "_"); - let arch = std::env::consts::ARCH; - - let target = format!("../../target/wasm32-unknown-unknown/release/{snaked_name}.wasm"); - - let artifacts_dir = - std::env::var("ARTIFACTS_DIR_PATH").unwrap_or_else(|_| "artifacts".to_string()); - let arch_target = format!("../../{artifacts_dir}/{snaked_name}-{arch}.wasm"); - - if std::path::Path::new(&target).exists() { - target - } else if std::path::Path::new(&arch_target).exists() { - arch_target - } else { - format!("../../{artifacts_dir}/{snaked_name}.wasm") - } -} - -pub fn store_code( - wasm: &Wasm, - owner: &SigningAccount, - contract_name: String, -) -> u64 { - let wasm_byte_code = std::fs::read(wasm_file(contract_name)).unwrap(); - wasm.store_code(&wasm_byte_code, None, owner) - .unwrap() - .data - .code_id -} - -pub fn launch_spot_market( - exchange: &Exchange, - signer: &SigningAccount, - base: &str, - quote: &str, -) -> String { - let ticker = format!("{base}/{quote}"); - exchange - .instant_spot_market_launch( - MsgInstantSpotMarketLaunch { - sender: signer.address(), - ticker: ticker.clone(), - base_denom: base.to_string(), - quote_denom: quote.to_string(), - min_price_tick_size: "1_000_000_000_000_000".to_owned(), - min_quantity_tick_size: "1_000_000_000_000_000".to_owned(), - }, - signer, - ) - .unwrap(); - - get_spot_market_id(exchange, ticker) -} - -pub fn launch_custom_spot_market( - exchange: &Exchange, - signer: &SigningAccount, - base: &str, - quote: &str, - min_price_tick_size: &str, - min_quantity_tick_size: &str, -) -> String { - let ticker = format!("{base}/{quote}"); - exchange - .instant_spot_market_launch( - MsgInstantSpotMarketLaunch { - sender: signer.address(), - ticker: ticker.clone(), - base_denom: base.to_string(), - quote_denom: quote.to_string(), - min_price_tick_size: min_price_tick_size.to_string(), - min_quantity_tick_size: min_quantity_tick_size.to_string(), - }, - signer, - ) - .unwrap(); - - get_spot_market_id(exchange, ticker) -} - -pub fn get_spot_market_id(exchange: &Exchange, ticker: String) -> String { - let spot_markets = exchange - .query_spot_markets(&QuerySpotMarketsRequest { - status: "Active".to_string(), - market_ids: vec![], - }) - .unwrap() - .markets; - - let market = spot_markets.iter().find(|m| m.ticker == ticker).unwrap(); - - market.market_id.to_string() -} - -pub fn launch_realistic_inj_usdt_spot_market( - exchange: &Exchange, - signer: &SigningAccount, -) -> String { - launch_custom_spot_market( +pub fn launch_realistic_inj_usdt_spot_market(exchange: &Exchange, signer: &SigningAccount) -> String { + launch_spot_market_custom( exchange, signer, - INJ_2, - USDT, - dec_to_proto(FPDecimal::must_from_str("0.000000000000001")).as_str(), - dec_to_proto(FPDecimal::must_from_str("1000000000000000")).as_str(), + "INJ2/USDT".to_string(), + INJ_2.to_string(), + USDT.to_string(), + "0.000000000000001".to_string(), + "1000000000000000".to_string(), ) } -pub fn launch_realistic_weth_usdt_spot_market( - exchange: &Exchange, - signer: &SigningAccount, -) -> String { - launch_custom_spot_market( +pub fn launch_realistic_weth_usdt_spot_market(exchange: &Exchange, signer: &SigningAccount) -> String { + launch_spot_market_custom( exchange, signer, - ETH, - USDT, - dec_to_proto(FPDecimal::must_from_str("0.0000000000001")).as_str(), - dec_to_proto(FPDecimal::must_from_str("1000000000000000")).as_str(), + "ETH/USDT".to_string(), + ETH.to_string(), + USDT.to_string(), + "0.0000000000001".to_string(), + "1000000000000000".to_string(), ) } -pub fn launch_realistic_atom_usdt_spot_market( - exchange: &Exchange, - signer: &SigningAccount, -) -> String { - launch_custom_spot_market( +pub fn launch_realistic_atom_usdt_spot_market(exchange: &Exchange, signer: &SigningAccount) -> String { + launch_spot_market_custom( exchange, signer, - ATOM, - USDT, - dec_to_proto(FPDecimal::must_from_str("0.001")).as_str(), - dec_to_proto(FPDecimal::must_from_str("10000")).as_str(), + "ATOM/USDT".to_string(), + ATOM.to_string(), + USDT.to_string(), + "0.001".to_string(), + "10000".to_string(), ) } -pub fn launch_realistic_usdt_usdc_spot_market( - exchange: &Exchange, - signer: &SigningAccount, -) -> String { - launch_custom_spot_market( +pub fn launch_realistic_usdt_usdc_spot_market(exchange: &Exchange, signer: &SigningAccount) -> String { + launch_spot_market_custom( exchange, signer, - USDT, - USDC, - dec_to_proto(FPDecimal::must_from_str("0.0001")).as_str(), - dec_to_proto(FPDecimal::must_from_str("100")).as_str(), + "USDT/USDC".to_string(), + USDT.to_string(), + USDC.to_string(), + "0.0001".to_string(), + "100".to_string(), ) } -pub fn launch_realistic_ninja_inj_spot_market( - exchange: &Exchange, - signer: &SigningAccount, -) -> String { - launch_custom_spot_market( +pub fn launch_realistic_ninja_inj_spot_market(exchange: &Exchange, signer: &SigningAccount) -> String { + launch_spot_market_custom( exchange, signer, - NINJA, - INJ_2, - dec_to_proto(FPDecimal::must_from_str("1000000")).as_str(), - dec_to_proto(FPDecimal::must_from_str("10000000")).as_str(), + "NINJA/INJ2".to_string(), + NINJA.to_string(), + INJ_2.to_string(), + "1000000".to_string(), + "10000000".to_string(), ) } @@ -494,16 +352,7 @@ pub fn create_realistic_eth_usdt_buy_orders_from_spreadsheet( Decimals::Six, ); - create_realistic_limit_order( - app, - trader2, - market_id, - OrderSide::Buy, - "1978", - "1.23", - Decimals::Eighteen, - Decimals::Six, - ); + create_realistic_limit_order(app, trader2, market_id, OrderSide::Buy, "1978", "1.23", Decimals::Eighteen, Decimals::Six); create_realistic_limit_order( app, @@ -609,11 +458,7 @@ pub fn create_realistic_inj_usdt_buy_orders_from_spreadsheet( ); } -pub fn create_realistic_inj_usdt_sell_orders_from_spreadsheet( - app: &InjectiveTestApp, - market_id: &str, - trader1: &SigningAccount, -) { +pub fn create_realistic_inj_usdt_sell_orders_from_spreadsheet(app: &InjectiveTestApp, market_id: &str, trader1: &SigningAccount) { create_realistic_limit_order( app, trader1, @@ -633,56 +478,16 @@ pub fn create_realistic_atom_usdt_sell_orders_from_spreadsheet( trader2: &SigningAccount, trader3: &SigningAccount, ) { - create_realistic_limit_order( - app, - trader1, - market_id, - OrderSide::Sell, - "8.89", - "197.89", - Decimals::Six, - Decimals::Six, - ); + create_realistic_limit_order(app, trader1, market_id, OrderSide::Sell, "8.89", "197.89", Decimals::Six, Decimals::Six); - create_realistic_limit_order( - app, - trader2, - market_id, - OrderSide::Sell, - "8.93", - "181.02", - Decimals::Six, - Decimals::Six, - ); + create_realistic_limit_order(app, trader2, market_id, OrderSide::Sell, "8.93", "181.02", Decimals::Six, Decimals::Six); - create_realistic_limit_order( - app, - trader3, - market_id, - OrderSide::Sell, - "8.99", - "203.12", - Decimals::Six, - Decimals::Six, - ); + create_realistic_limit_order(app, trader3, market_id, OrderSide::Sell, "8.99", "203.12", Decimals::Six, Decimals::Six); - create_realistic_limit_order( - app, - trader1, - market_id, - OrderSide::Sell, - "9.01", - "421.11", - Decimals::Six, - Decimals::Six, - ); + create_realistic_limit_order(app, trader1, market_id, OrderSide::Sell, "9.01", "421.11", Decimals::Six, Decimals::Six); } -pub fn create_realistic_usdt_usdc_both_side_orders( - app: &InjectiveTestApp, - market_id: &str, - trader1: &SigningAccount, -) { +pub fn create_realistic_usdt_usdc_both_side_orders(app: &InjectiveTestApp, market_id: &str, trader1: &SigningAccount) { create_realistic_limit_order( app, trader1, @@ -707,11 +512,7 @@ pub fn create_realistic_usdt_usdc_both_side_orders( } // not really realistic yet -pub fn create_ninja_inj_both_side_orders( - app: &InjectiveTestApp, - market_id: &str, - trader1: &SigningAccount, -) { +pub fn create_ninja_inj_both_side_orders(app: &InjectiveTestApp, market_id: &str, trader1: &SigningAccount) { create_realistic_limit_order( app, trader1, @@ -730,63 +531,6 @@ pub enum OrderSide { Sell, } -pub fn create_limit_order( - app: &InjectiveTestApp, - trader: &SigningAccount, - market_id: &str, - order_side: OrderSide, - price: u128, - quantity: u32, -) { - let exchange = Exchange::new(app); - exchange - .create_spot_limit_order( - MsgCreateSpotLimitOrder { - sender: trader.address(), - order: Some(SpotOrder { - market_id: market_id.to_string(), - order_info: Some(OrderInfo { - subaccount_id: get_default_subaccount_id_for_checked_address( - &Addr::unchecked(trader.address()), - ) - .to_string(), - fee_recipient: trader.address(), - price: format!("{price}000000000000000000"), - quantity: format!("{quantity}000000000000000000"), - cid: "".to_string(), - }), - order_type: if order_side == OrderSide::Buy { - OrderType::BuyAtomic.into() - } else { - OrderType::SellAtomic.into() - }, - trigger_price: "".to_string(), - }), - }, - trader, - ) - .unwrap(); -} - -pub fn scale_price_quantity_for_market( - price: &str, - quantity: &str, - base_decimals: &Decimals, - quote_decimals: &Decimals, -) -> (String, String) { - let price_dec = FPDecimal::must_from_str(price.replace('_', "").as_str()); - let quantity_dec = FPDecimal::must_from_str(quantity.replace('_', "").as_str()); - - let scaled_price = - price_dec.scaled(quote_decimals.get_decimals() - base_decimals.get_decimals()); - let scaled_quantity = quantity_dec.scaled(base_decimals.get_decimals()); - (dec_to_proto(scaled_price), dec_to_proto(scaled_quantity)) -} - -pub fn dec_to_proto(val: FPDecimal) -> String { - val.scaled(18).to_string() -} - #[allow(clippy::too_many_arguments)] pub fn create_realistic_limit_order( app: &InjectiveTestApp, @@ -798,8 +542,7 @@ pub fn create_realistic_limit_order( base_decimals: Decimals, quote_decimals: Decimals, ) { - let (price_to_send, quantity_to_send) = - scale_price_quantity_for_market(price, quantity, &base_decimals, "e_decimals); + let (price_to_send, quantity_to_send) = scale_price_quantity_spot_market(price, quantity, &(base_decimals as i32), &(quote_decimals as i32)); let exchange = Exchange::new(app); exchange @@ -809,10 +552,7 @@ pub fn create_realistic_limit_order( order: Some(SpotOrder { market_id: market_id.to_string(), order_info: Some(OrderInfo { - subaccount_id: get_default_subaccount_id_for_checked_address( - &Addr::unchecked(trader.address()), - ) - .to_string(), + subaccount_id: get_default_subaccount_id_for_checked_address(&Addr::unchecked(trader.address())).to_string(), fee_recipient: trader.address(), price: price_to_send, quantity: quantity_to_send, @@ -831,11 +571,7 @@ pub fn create_realistic_limit_order( .unwrap(); } -pub fn init_self_relaying_contract_and_get_address( - wasm: &Wasm, - owner: &SigningAccount, - initial_balance: &[Coin], -) -> String { +pub fn init_self_relaying_contract_and_get_address(wasm: &Wasm, owner: &SigningAccount, initial_balance: &[Coin]) -> String { let code_id = store_code(wasm, owner, "swap_contract".to_string()); wasm.instantiate( code_id, @@ -853,29 +589,6 @@ pub fn init_self_relaying_contract_and_get_address( .address } -pub fn init_contract_with_fee_recipient_and_get_address( - wasm: &Wasm, - owner: &SigningAccount, - initial_balance: &[Coin], - fee_recipient: &SigningAccount, -) -> String { - let code_id = store_code(wasm, owner, "swap_contract".to_string()); - wasm.instantiate( - code_id, - &InstantiateMsg { - fee_recipient: FeeRecipient::Address(Addr::unchecked(fee_recipient.address())), - admin: Addr::unchecked(owner.address()), - }, - Some(&owner.address()), - Some("Swap"), - initial_balance, - owner, - ) - .unwrap() - .data - .address -} - pub fn set_route_and_assert_success( wasm: &Wasm, signer: &SigningAccount, @@ -897,19 +610,14 @@ pub fn set_route_and_assert_success( .unwrap(); } -pub fn must_init_account_with_funds( - app: &InjectiveTestApp, - initial_funds: &[Coin], -) -> SigningAccount { +pub fn must_init_account_with_funds(app: &InjectiveTestApp, initial_funds: &[Coin]) -> SigningAccount { app.init_account(initial_funds).unwrap() } -pub fn query_all_bank_balances( - bank: &Bank, - address: &str, -) -> Vec { +pub fn query_all_bank_balances(bank: &Bank, address: &str) -> Vec { bank.query_all_balances(&QueryAllBalancesRequest { address: address.to_string(), + resolve_denom: false, pagination: None, }) .unwrap() @@ -931,33 +639,6 @@ pub fn query_bank_balance(bank: &Bank, denom: &str, address: & .unwrap() } -pub fn pause_spot_market( - app: &InjectiveTestApp, - market_id: &str, - proposer: &SigningAccount, - validator: &SigningAccount, -) { - let gov = Gov::new(app); - pass_spot_market_params_update_proposal( - &gov, - &SpotMarketParamUpdateProposal { - title: format!("Set market {market_id} status to paused"), - description: format!("Set market {market_id} status to paused"), - market_id: market_id.to_string(), - maker_fee_rate: "".to_string(), - taker_fee_rate: "".to_string(), - relayer_fee_share_rate: "".to_string(), - min_price_tick_size: "".to_string(), - min_quantity_tick_size: "".to_string(), - status: 2, - }, - proposer, - validator, - ); - - app.increase_time(10u64) -} - pub fn create_contract_authorization( app: &InjectiveTestApp, contract: String, @@ -970,13 +651,7 @@ pub fn create_contract_authorization( let authz = Authz::new(app); let mut filter_buf = vec![]; - AcceptedMessageKeysFilter::encode( - &AcceptedMessageKeysFilter { - keys: vec![message], - }, - &mut filter_buf, - ) - .unwrap(); + AcceptedMessageKeysFilter::encode(&AcceptedMessageKeysFilter { keys: vec![message] }, &mut filter_buf).unwrap(); let mut limit_buf = vec![]; MaxCallsLimit::encode(&MaxCallsLimit { remaining: limit }, &mut limit_buf).unwrap(); @@ -1020,57 +695,6 @@ pub fn create_contract_authorization( .unwrap(); } -pub fn pass_spot_market_params_update_proposal( - gov: &Gov, - proposal: &SpotMarketParamUpdateProposal, - proposer: &SigningAccount, - validator: &SigningAccount, -) { - let mut buf = vec![]; - SpotMarketParamUpdateProposal::encode(proposal, &mut buf).unwrap(); - - println!("submitting proposal: {proposal:?}"); - let submit_response = gov.submit_proposal_v1beta1( - MsgSubmitProposal { - content: Some(Any { - type_url: "/injective.exchange.v1beta1.SpotMarketParamUpdateProposal".to_string(), - value: buf, - }), - initial_deposit: vec![TubeCoin { - amount: "100000000000000000000".to_string(), - denom: "inj".to_string(), - }], - proposer: proposer.address(), - }, - proposer, - ); - - assert!(submit_response.is_ok(), "failed to submit proposal"); - - let proposal_id = submit_response.unwrap().data.proposal_id; - println!("voting on proposal: {proposal_id:?}"); - let vote_response = gov.vote( - MsgVote { - proposal_id, - voter: validator.address(), - option: 1, - metadata: "".to_string(), - }, - validator, - ); - - assert!(vote_response.is_ok(), "failed to vote on proposal"); -} - -pub fn init_default_validator_account(app: &InjectiveTestApp) -> SigningAccount { - app.get_first_validator_signing_account(INJ.to_string(), 1.2f64) - .unwrap() -} - -pub fn init_default_signer_account(app: &InjectiveTestApp) -> SigningAccount { - must_init_account_with_funds(app, &[str_coin("100_000", INJ, Decimals::Eighteen)]) -} - pub fn init_rich_account(app: &InjectiveTestApp) -> SigningAccount { must_init_account_with_funds( app, @@ -1086,33 +710,12 @@ pub fn init_rich_account(app: &InjectiveTestApp) -> SigningAccount { ) } -pub fn fund_account_with_some_inj( - bank: &Bank, - from: &SigningAccount, - to: &SigningAccount, -) { - bank.send( - MsgSend { - from_address: from.address(), - to_address: to.address(), - amount: vec![TubeCoin { - amount: "1000000000000000000000".to_string(), - denom: "inj".to_string(), - }], - }, - from, - ) - .unwrap(); -} - pub fn human_to_dec(raw_number: &str, decimals: Decimals) -> FPDecimal { FPDecimal::must_from_str(&raw_number.replace('_', "")).scaled(decimals.get_decimals()) } pub fn human_to_proto(raw_number: &str, decimals: i32) -> String { - FPDecimal::must_from_str(&raw_number.replace('_', "")) - .scaled(18 + decimals) - .to_string() + FPDecimal::must_from_str(&raw_number.replace('_', "")).scaled(18 + decimals).to_string() } pub fn str_coin(human_amount: &str, denom: &str, decimals: Decimals) -> Coin { @@ -1122,9 +725,7 @@ pub fn str_coin(human_amount: &str, denom: &str, decimals: Decimals) -> Coin { } mod tests { - use crate::testing::test_utils::{ - human_to_dec, human_to_proto, scale_price_quantity_for_market, Decimals, - }; + use crate::testing::test_utils::{human_to_dec, human_to_proto, scale_price_quantity_spot_market, Decimals}; use injective_math::FPDecimal; #[test] @@ -1134,19 +735,13 @@ mod tests { let mut expected = FPDecimal::must_from_str("1000000000000000000"); let actual = human_to_dec(integer, decimals); - assert_eq!( - actual, expected, - "failed to convert integer with 18 decimal to dec" - ); + assert_eq!(actual, expected, "failed to convert integer with 18 decimal to dec"); decimals = Decimals::Six; expected = FPDecimal::must_from_str("1000000"); let actual = human_to_dec(integer, decimals); - assert_eq!( - actual, expected, - "failed to convert integer with 6 decimal to dec" - ); + assert_eq!(actual, expected, "failed to convert integer with 6 decimal to dec"); } #[test] @@ -1156,19 +751,13 @@ mod tests { let mut expected = FPDecimal::must_from_str("1100000000000000000"); let actual = human_to_dec(integer, decimals); - assert_eq!( - actual, expected, - "failed to convert integer with 18 decimal to dec" - ); + assert_eq!(actual, expected, "failed to convert integer with 18 decimal to dec"); decimals = Decimals::Six; expected = FPDecimal::must_from_str("1100000"); let actual = human_to_dec(integer, decimals); - assert_eq!( - actual, expected, - "failed to convert integer with 6 decimal to dec" - ); + assert_eq!(actual, expected, "failed to convert integer with 6 decimal to dec"); } #[test] @@ -1178,10 +767,7 @@ mod tests { let expected = FPDecimal::must_from_str("1000000000000000001"); let actual = human_to_dec(integer, decimals); - assert_eq!( - actual, expected, - "failed to convert integer with 18 decimal to dec" - ); + assert_eq!(actual, expected, "failed to convert integer with 18 decimal to dec"); } #[test] @@ -1191,10 +777,7 @@ mod tests { let expected = FPDecimal::must_from_str("1000001"); let actual = human_to_dec(integer, decimals); - assert_eq!( - actual, expected, - "failed to convert integer with 18 decimal to dec" - ); + assert_eq!(actual, expected, "failed to convert integer with 18 decimal to dec"); } #[test] @@ -1204,19 +787,13 @@ mod tests { let mut expected = FPDecimal::must_from_str("112300000000000000"); let actual = human_to_dec(integer, decimals); - assert_eq!( - actual, expected, - "failed to convert integer with 18 decimal to dec" - ); + assert_eq!(actual, expected, "failed to convert integer with 18 decimal to dec"); decimals = Decimals::Six; expected = FPDecimal::must_from_str("112300"); let actual = human_to_dec(integer, decimals); - assert_eq!( - actual, expected, - "failed to convert integer with 6 decimal to dec" - ); + assert_eq!(actual, expected, "failed to convert integer with 6 decimal to dec"); } #[test] @@ -1226,10 +803,7 @@ mod tests { let expected = FPDecimal::must_from_str("1"); let actual = human_to_dec(integer, decimals); - assert_eq!( - actual, expected, - "failed to convert integer with 18 decimal to dec" - ); + assert_eq!(actual, expected, "failed to convert integer with 18 decimal to dec"); } #[test] @@ -1239,10 +813,7 @@ mod tests { let expected = FPDecimal::must_from_str("1"); let actual = human_to_dec(integer, decimals); - assert_eq!( - actual, expected, - "failed to convert integer with 18 decimal to dec" - ); + assert_eq!(actual, expected, "failed to convert integer with 18 decimal to dec"); } #[test] @@ -1252,19 +823,13 @@ mod tests { let mut expected = "1000000000000000000000000000000000000"; let actual = human_to_proto(integer, decimals.get_decimals()); - assert_eq!( - actual, expected, - "failed to convert integer with 18 decimal to proto" - ); + assert_eq!(actual, expected, "failed to convert integer with 18 decimal to proto"); decimals = Decimals::Six; expected = "1000000000000000000000000"; let actual = human_to_proto(integer, decimals.get_decimals()); - assert_eq!( - actual, expected, - "failed to convert integer with 6 decimal to proto" - ); + assert_eq!(actual, expected, "failed to convert integer with 6 decimal to proto"); } #[test] @@ -1274,19 +839,13 @@ mod tests { let mut expected = "1100000000000000000000000000000000000"; let actual = human_to_proto(number, decimals.get_decimals()); - assert_eq!( - actual, expected, - "failed to convert decimal with 18 decimal to proto" - ); + assert_eq!(actual, expected, "failed to convert decimal with 18 decimal to proto"); decimals = Decimals::Six; expected = "1100000000000000000000000"; let actual = human_to_proto(number, decimals.get_decimals()); - assert_eq!( - actual, expected, - "failed to convert decimal with 6 decimal to proto" - ); + assert_eq!(actual, expected, "failed to convert decimal with 6 decimal to proto"); } #[test] @@ -1296,19 +855,13 @@ mod tests { let mut expected = "100000000000000000000000000000000000"; let actual = human_to_proto(number, decimals.get_decimals()); - assert_eq!( - actual, expected, - "failed to convert decimal with 18 decimal to proto" - ); + assert_eq!(actual, expected, "failed to convert decimal with 18 decimal to proto"); decimals = Decimals::Six; expected = "100000000000000000000000"; let actual = human_to_proto(number, decimals.get_decimals()); - assert_eq!( - actual, expected, - "failed to convert decimal with 6 decimal to proto" - ); + assert_eq!(actual, expected, "failed to convert decimal with 6 decimal to proto"); } #[test] @@ -1318,16 +871,12 @@ mod tests { let expected = "1000000000000000000"; let actual = human_to_proto(number, decimals.get_decimals()); - assert_eq!( - actual, expected, - "failed to convert decimal with 18 decimal to proto" - ); + assert_eq!(actual, expected, "failed to convert decimal with 18 decimal to proto"); } #[test] #[should_panic] - fn it_panics_when_converting_decimal_below_zero_with_18_decimals_with_too_high_precision_to_proto( - ) { + fn it_panics_when_converting_decimal_below_zero_with_18_decimals_with_too_high_precision_to_proto() { let number = "0.0000000000000000001"; let decimals = Decimals::Eighteen; @@ -1341,10 +890,7 @@ mod tests { let expected = "1000000000000000000"; let actual = human_to_proto(number, decimals.get_decimals()); - assert_eq!( - actual, expected, - "failed to convert decimal with 6 decimal to proto" - ); + assert_eq!(actual, expected, "failed to convert decimal with 6 decimal to proto"); } #[test] @@ -1353,10 +899,7 @@ mod tests { let expected = "1000001000000000000"; let actual = human_to_proto(number, 0); - assert_eq!( - actual, expected, - "failed to convert decimal with 0 decimal to proto" - ); + assert_eq!(actual, expected, "failed to convert decimal with 0 decimal to proto"); } #[test] @@ -1365,10 +908,7 @@ mod tests { let expected = "1000000000000"; let actual = human_to_proto(number, 0); - assert_eq!( - actual, expected, - "failed to convert decimal with 0 decimal to proto" - ); + assert_eq!(actual, expected, "failed to convert decimal with 0 decimal to proto"); } #[test] @@ -1379,8 +919,7 @@ mod tests { let base_decimals = Decimals::Eighteen; let quote_decimals = Decimals::Six; - let (scaled_price, scaled_quantity) = - scale_price_quantity_for_market(price, quantity, &base_decimals, "e_decimals); + let (scaled_price, scaled_quantity) = scale_price_quantity_spot_market(price, quantity, &(base_decimals as i32), &(quote_decimals as i32)); // 1 => 1 * 10^6 - 10^18 => 0.000000000001000000 * 10^18 => 1000000 assert_eq!(scaled_price, "1000000", "price was scaled incorrectly"); @@ -1399,8 +938,7 @@ mod tests { let base_decimals = Decimals::Eighteen; let quote_decimals = Decimals::Six; - let (scaled_price, scaled_quantity) = - scale_price_quantity_for_market(price, quantity, &base_decimals, "e_decimals); + let (scaled_price, scaled_quantity) = scale_price_quantity_spot_market(price, quantity, &(base_decimals as i32), &(quote_decimals as i32)); // 0.000000000008782000 * 10^18 = 8782000 assert_eq!(scaled_price, "8782000", "price was scaled incorrectly"); @@ -1418,19 +956,12 @@ mod tests { let base_decimals = Decimals::Six; let quote_decimals = Decimals::Six; - let (scaled_price, scaled_quantity) = - scale_price_quantity_for_market(price, quantity, &base_decimals, "e_decimals); + let (scaled_price, scaled_quantity) = scale_price_quantity_spot_market(price, quantity, &(base_decimals as i32), &(quote_decimals as i32)); // 1 => 1.(10^18) => 1000000000000000000 - assert_eq!( - scaled_price, "1000000000000000000", - "price was scaled incorrectly" - ); + assert_eq!(scaled_price, "1000000000000000000", "price was scaled incorrectly"); // 1 => 1(10^6).(10^18) => 1000000000000000000000000 - assert_eq!( - scaled_quantity, "1000000000000000000000000", - "quantity was scaled incorrectly" - ); + assert_eq!(scaled_quantity, "1000000000000000000000000", "quantity was scaled incorrectly"); } #[test] @@ -1441,40 +972,21 @@ mod tests { let base_decimals = Decimals::Six; let quote_decimals = Decimals::Six; - let (scaled_price, scaled_quantity) = - scale_price_quantity_for_market(price, quantity, &base_decimals, "e_decimals); + let (scaled_price, scaled_quantity) = scale_price_quantity_spot_market(price, quantity, &(base_decimals as i32), &(quote_decimals as i32)); // 1.129 => 1.129(10^15) => 1129000000000000000 - assert_eq!( - scaled_price, "1129000000000000000", - "price was scaled incorrectly" - ); + assert_eq!(scaled_price, "1129000000000000000", "price was scaled incorrectly"); // 1.62 => 1.62(10^4)(10^18) => 1000000000000000000000000 - assert_eq!( - scaled_quantity, "1620000000000000000000000", - "quantity was scaled incorrectly" - ); + assert_eq!(scaled_quantity, "1620000000000000000000000", "quantity was scaled incorrectly"); } } -pub fn are_fpdecimals_approximately_equal( - first: FPDecimal, - second: FPDecimal, - max_diff: FPDecimal, -) -> bool { +pub fn are_fpdecimals_approximately_equal(first: FPDecimal, second: FPDecimal, max_diff: FPDecimal) -> bool { (first - second).abs() <= max_diff } -pub fn assert_fee_is_as_expected( - raw_fees: &mut Vec, - expected_fees: &mut Vec, - max_diff: FPDecimal, -) { - assert_eq!( - raw_fees.len(), - expected_fees.len(), - "Wrong number of fee denoms received" - ); +pub fn assert_fee_is_as_expected(raw_fees: &mut [FPCoin], expected_fees: &mut [FPCoin], max_diff: FPDecimal) { + assert_eq!(raw_fees.len(), expected_fees.len(), "Wrong number of fee denoms received"); raw_fees.sort_by_key(|f| f.denom.clone()); expected_fees.sort_by_key(|f| f.denom.clone()); diff --git a/contracts/swap/src/types.rs b/contracts/swap/src/types.rs index 911f861..cd1123b 100644 --- a/contracts/swap/src/types.rs +++ b/contracts/swap/src/types.rs @@ -1,17 +1,15 @@ +use cosmwasm_schema::cw_serde; use cosmwasm_std::{Addr, Coin}; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; - use injective_cosmwasm::MarketId; use injective_math::FPDecimal; -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[cw_serde] pub enum SwapEstimationAmount { InputQuantity(FPCoin), ReceiveQuantity(FPCoin), } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[cw_serde] pub struct FPCoin { pub amount: FPDecimal, pub denom: String, @@ -19,7 +17,7 @@ pub struct FPCoin { impl From for Coin { fn from(value: FPCoin) -> Self { - Coin::new(value.amount.into(), value.denom) + Coin::new(value.amount, value.denom) } } @@ -32,19 +30,19 @@ impl From for FPCoin { } } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[cw_serde] pub struct ConfigResponse { pub config: Config, pub contract_version: String, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[cw_serde] pub enum SwapQuantityMode { MinOutputQuantity(FPDecimal), ExactOutputQuantity(FPDecimal), } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[cw_serde] pub struct StepExecutionEstimate { pub worst_price: FPDecimal, pub result_denom: String, @@ -53,7 +51,7 @@ pub struct StepExecutionEstimate { pub fee_estimate: Option, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[cw_serde] pub struct CurrentSwapOperation { // whole swap operation pub sender_address: Addr, @@ -63,7 +61,7 @@ pub struct CurrentSwapOperation { pub refund: Coin, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[cw_serde] pub struct CurrentSwapStep { // current step pub step_idx: u16, @@ -72,7 +70,7 @@ pub struct CurrentSwapStep { pub is_buy: bool, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[cw_serde] pub struct SwapResults { pub market_id: MarketId, pub quantity: FPDecimal, @@ -80,7 +78,7 @@ pub struct SwapResults { pub fee: FPDecimal, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[cw_serde] pub struct Config { // if fee_recipient is contract, fee discount is replayed to a sender (will not stay in the contract) pub fee_recipient: Addr, @@ -88,7 +86,7 @@ pub struct Config { pub admin: Addr, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[cw_serde] pub struct SwapRoute { pub steps: Vec, pub source_denom: String, @@ -107,13 +105,13 @@ impl SwapRoute { } } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[cw_serde] pub struct SwapStep { pub market_id: MarketId, pub quote_denom: String, // quote for this step of swap, eg for swap eth/inj using eth/usdt and inj/usdt markets, quotes will be eth in 1st step and usdt in 2nd } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[cw_serde] pub struct SwapEstimationResult { pub result_quantity: FPDecimal, pub expected_fees: Vec, diff --git a/docs/admin.md b/docs/admin.md new file mode 100644 index 0000000..f8fad7b --- /dev/null +++ b/docs/admin.md @@ -0,0 +1,37 @@ +# Admin Functionality + +This file contains template transactions for performing the primary functions of managing the Swap contracts. + +## Sentry Node + +Link to [swagger](https://sentry.lcd.injective.network/swagger/). + +### Examples + +```bash +NODE=https://sentry.tm.injective.network:443 +CHAIN_ID=injective-1 +CONTRACT_ADDRESS=inj12yj3mtjarujkhcp6lg3klxjjfrx2v7v8yswgp9 # Helix Swap Contract +``` + +#### Subaccount Open Spot Orders + +```bash +curl -X GET "https://sentry.lcd.injective.network/injective/exchange/v1beta1/spot/orders/$MARKET_ID/$SUBACCOUNT_ID" -H "accept: application/json" | jq . +``` + +## Wasm + +### Store + +```bash +injectived tx wasm store ./artifacts/swap-aarch64.wasm --from=sgt-account --gas=auto --gas-prices 500000000inj --gas-adjustment 1.3 --yes --output=json --node=https://testnet.sentry.tm.injective.network:443 --chain-id='injective-888' | jq . +``` + +### Query + +#### Config + +```bash +injectived query wasm contract-state smart $CONTRACT_ADDRESS '{"get_config": {}}' --node=https://sentry.tm.injective.network:443 --output=json | jq . +``` diff --git a/copy_to_devnet_setup.sh b/docs/copy_to_devnet_setup.sh similarity index 100% rename from copy_to_devnet_setup.sh rename to docs/copy_to_devnet_setup.sh diff --git a/examples.sh b/docs/examples.sh similarity index 100% rename from examples.sh rename to docs/examples.sh diff --git a/rust-toolchain.toml b/rust-toolchain.toml index f49bdba..ce4af78 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,5 +1,5 @@ [toolchain] -channel = "1.73.0" +channel = "1.78.0" components = [ "rustfmt" ] profile = "minimal" targets = [ "wasm32-unknown-unknown" ]