diff --git a/Cargo.lock b/Cargo.lock index 01acc29c7..2aa6a3437 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15,28 +15,34 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" dependencies = [ "memchr", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + [[package]] name = "anyhow" -version = "1.0.68" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" [[package]] name = "async-trait" -version = "0.1.63" +version = "0.1.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff18d764974428cf3a9328e23fc5c986f5fbed46e6cd4cdf42544df5d297ec1" +checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.18", ] [[package]] @@ -45,7 +51,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", "winapi", ] @@ -70,9 +76,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64ct" -version = "1.5.3" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b645a089122eccb6111b4f81cbc1a49f5900ac4666bb93ac027feaecf15607bf" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bech32" @@ -138,9 +144,9 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] @@ -156,9 +162,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.12.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "byteorder" @@ -168,9 +174,15 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" [[package]] name = "cexpr" @@ -189,19 +201,19 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.23" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" +checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" dependencies = [ - "num-integer", + "android-tzdata", "num-traits", ] [[package]] name = "clang-sys" -version = "1.4.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa2e27ae6ab525c3d369ded447057bca5438d86dc3a68f6faafb8269ba82ebf3" +checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" dependencies = [ "glob", "libc", @@ -210,9 +222,9 @@ dependencies = [ [[package]] name = "clap" -version = "3.2.23" +version = "3.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ "atty", "bitflags", @@ -234,9 +246,25 @@ dependencies = [ [[package]] name = "const-oid" -version = "0.9.1" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913" + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cec318a675afcb6a1ea1d4340e2d377e56e47c266f28043ceccbf4412ddfdd3b" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "cosmos-sdk-proto" @@ -244,7 +272,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20b42021d8488665b1a0d9748f1f81df7235362d194f44481e2e61bf376b77b4" dependencies = [ - "prost 0.11.6", + "prost 0.11.9", "prost-types", "tendermint-proto", ] @@ -266,16 +294,17 @@ dependencies = [ "serde_json", "subtle-encoding", "tendermint", + "tendermint-rpc", "thiserror", ] [[package]] name = "cosmwasm-crypto" -version = "1.2.0" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb56fffc2233212e9546df66e01267277173d55f6237ab939690ef2c5cfd50c2" +checksum = "75836a10cb9654c54e77ee56da94d592923092a10b369cdb0dbd56acefc16340" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "ed25519-zebra", "k256", "rand_core 0.6.4", @@ -284,18 +313,18 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.2.0" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e26a78e202d602a23fd5d13dff898732814ebe7a8bde20f1bf71eb0209d56d56" +checksum = "1c9f7f0e51bfc7295f7b2664fe8513c966428642aa765dad8a74acdab5e0c773" dependencies = [ - "syn", + "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.2.0" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a3dfcfa0c6f4b9aef8820c0a999410f239828a4503a388ce8e55f59fe3ac863" +checksum = "0f00b363610218eea83f24bbab09e1a7c3920b79f068334fdfcc62f6129ef9fc" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -306,20 +335,20 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.2.0" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e19cd48063eef5b92a0aabcf0687705802178ae175571dfdc5f3b925d0741d39" +checksum = "ae38f909b2822d32b275c9e2db9728497aa33ffe67dd463bc67c6a3b7092785c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "cosmwasm-std" -version = "1.2.0" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b50f4deaed6196047a3ceec9bc23e85d4292b73442d77af63723842d8b6049d" +checksum = "a49b85345e811c8e80ec55d0d091e4fcb4f00f97ab058f9be5f614c444a730cb" dependencies = [ "base64", "cosmwasm-crypto", @@ -337,9 +366,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" dependencies = [ "libc", ] @@ -372,6 +401,15 @@ dependencies = [ "typenum", ] +[[package]] +name = "ct-logs" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1a816186fa68d9e426e3cb4ae4dff1fcd8e4a2c34b781bf7a822574a0d0aac8" +dependencies = [ + "sct", +] + [[package]] name = "curve25519-dalek" version = "3.2.0" @@ -387,9 +425,9 @@ dependencies = [ [[package]] name = "cw-multi-test" -version = "0.16.2" +version = "0.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2eb84554bbfa6b66736abcd6a9bfdf237ee0ecb83910f746dff7f799093c80a" +checksum = "2a18afd2e201221c6d72a57f0886ef2a22151bbc9e6db7af276fde8a91081042" dependencies = [ "anyhow", "cosmwasm-std", @@ -404,6 +442,17 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cw-paginate" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "add278617f6251be1a35c781eb0fbffd44f899d8bb4dc5a9e420273a90684c4e" +dependencies = [ + "cosmwasm-std", + "cw-storage-plus", + "serde", +] + [[package]] name = "cw-storage-plus" version = "1.0.1" @@ -474,7 +523,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -488,20 +537,20 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.3", + "block-buffer 0.10.4", "crypto-common", "subtle", ] [[package]] name = "dyn-clone" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9b0705efd4599c15a38151f4721f7bc388306f61084d3bfd50bd07fbca5cb60" +checksum = "68b0cf012f1230e43cd00ebb729c6bb58707ecfa8ad08b52ef3a4ccd2697fc30" [[package]] name = "ecdsa" @@ -553,9 +602,9 @@ dependencies = [ [[package]] name = "either" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "elliptic-curve" @@ -566,7 +615,7 @@ dependencies = [ "base16ct", "crypto-bigint", "der", - "digest 0.10.6", + "digest 0.10.7", "ff", "generic-array", "group", @@ -620,6 +669,21 @@ dependencies = [ "paste", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + [[package]] name = "forward_ref" version = "1.0.0" @@ -628,12 +692,13 @@ checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" [[package]] name = "futures" -version = "0.3.25" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" dependencies = [ "futures-channel", "futures-core", + "futures-executor", "futures-io", "futures-sink", "futures-task", @@ -642,9 +707,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.25" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" dependencies = [ "futures-core", "futures-sink", @@ -652,46 +717,73 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.25" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-executor" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] [[package]] name = "futures-io" -version = "0.3.25" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-macro" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.18", +] [[package]] name = "futures-sink" -version = "0.3.25" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" [[package]] name = "futures-task" -version = "0.3.25" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" [[package]] name = "futures-util" -version = "0.3.25" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" dependencies = [ + "futures-channel", "futures-core", + "futures-io", + "futures-macro", "futures-sink", "futures-task", + "memchr", "pin-project-lite", "pin-utils", + "slab", ] [[package]] name = "generic-array" -version = "0.14.6" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -699,9 +791,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" dependencies = [ "cfg-if", "js-sys", @@ -727,6 +819,25 @@ dependencies = [ "subtle", ] +[[package]] +name = "h2" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -736,6 +847,31 @@ dependencies = [ "ahash", ] +[[package]] +name = "headers" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" +dependencies = [ + "base64", + "bitflags", + "bytes", + "headers-core", + "http", + "httpdate", + "mime", + "sha1", +] + +[[package]] +name = "headers-core" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" +dependencies = [ + "http", +] + [[package]] name = "hermit-abi" version = "0.1.19" @@ -745,6 +881,15 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + [[package]] name = "hex" version = "0.4.3" @@ -757,15 +902,120 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", +] + +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite", ] +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + [[package]] name = "humantime" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +[[package]] +name = "hyper" +version = "0.14.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-proxy" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca815a891b24fdfb243fa3239c86154392b0953ee584aa1a2a1f66d20cbe75cc" +dependencies = [ + "bytes", + "futures", + "headers", + "http", + "hyper", + "hyper-rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", + "tower-service", + "webpki", +] + +[[package]] +name = "hyper-rustls" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64" +dependencies = [ + "ct-logs", + "futures-util", + "hyper", + "log", + "rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", + "webpki", + "webpki-roots", +] + +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indenter" version = "0.3.3" @@ -774,9 +1024,9 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "indexmap" -version = "1.9.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown", @@ -793,15 +1043,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" [[package]] name = "js-sys" -version = "0.3.60" +version = "0.3.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790" dependencies = [ "wasm-bindgen", ] @@ -821,9 +1071,9 @@ dependencies = [ [[package]] name = "keccak" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3afef3b6eff9ce9d8ff9b3601125eec7f0c8cbac7abd14f355d053fa56c98768" +checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" dependencies = [ "cpufeatures", ] @@ -842,9 +1092,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.139" +version = "0.2.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" +checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" [[package]] name = "libloading" @@ -858,12 +1108,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de" [[package]] name = "mars-address-provider" @@ -972,9 +1219,9 @@ dependencies = [ [[package]] name = "mars-owner" -version = "1.0.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5644a8b047a0d64d04706414805872f35439755e057431152dd36e6f369be24" +checksum = "acd53908ffc561da878ce5ff4f5ec9f25a193af28ec0b6e7c8e6d1a0866d9dfc" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1046,6 +1293,66 @@ dependencies = [ "thiserror", ] +[[package]] +name = "mars-swapper" +version = "1.0.1" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus", + "cw-utils", + "mars-owner", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "mars-swapper-base" +version = "1.0.1" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-paginate", + "cw-storage-plus", + "mars-owner", + "mars-swapper", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "mars-swapper-mock" +version = "1.0.1" +dependencies = [ + "anyhow", + "cosmwasm-std", + "cw-multi-test", + "cw-storage-plus", + "mars-swapper", + "thiserror", +] + +[[package]] +name = "mars-swapper-osmosis" +version = "1.0.1" +dependencies = [ + "anyhow", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus", + "cw2 1.0.1 (git+https://github.com/mars-protocol/cw-plus?rev=4014255)", + "mars-osmosis", + "mars-owner", + "mars-swapper", + "mars-swapper-base", + "osmosis-std 0.14.0", + "osmosis-test-tube", + "schemars", + "thiserror", +] + [[package]] name = "mars-testing" version = "1.0.1" @@ -1061,7 +1368,7 @@ dependencies = [ "mars-red-bank-types", "mars-rewards-collector-osmosis", "osmosis-std 0.14.0", - "prost 0.11.6", + "prost 0.11.9", "schemars", "serde", "thiserror", @@ -1081,12 +1388,29 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + [[package]] name = "minimal-lexical" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "mio" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + [[package]] name = "nom" version = "7.1.3" @@ -1105,26 +1429,26 @@ checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] -name = "num-integer" -version = "0.1.45" +name = "num-traits" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", - "num-traits", ] [[package]] -name = "num-traits" -version = "0.2.15" +name = "num_cpus" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" dependencies = [ - "autocfg", + "hermit-abi 0.2.6", + "libc", ] [[package]] @@ -1138,9 +1462,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.0" +version = "1.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" +checksum = "9670a07f94779e00908f3e686eab508878ebb390ba6e604d3a284c00e8d0487b" [[package]] name = "opaque-debug" @@ -1148,22 +1472,28 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + [[package]] name = "os_str_bytes" -version = "6.4.1" +version = "6.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" +checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" [[package]] name = "osmosis-std" -version = "0.13.2" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10d6fe6ac7fcba45ed61d738091d33c838c4cabbcf4892dc7aa56d19d39cc976" +checksum = "2fc0a9075efd64ed5a8be3bf134cbf1080570d68384f2ad58ffaac6c00d063fd" dependencies = [ "chrono", "cosmwasm-std", - "osmosis-std-derive", - "prost 0.11.6", + "osmosis-std-derive 0.13.2", + "prost 0.11.9", "prost-types", "schemars", "serde", @@ -1172,14 +1502,14 @@ dependencies = [ [[package]] name = "osmosis-std" -version = "0.14.0" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fc0a9075efd64ed5a8be3bf134cbf1080570d68384f2ad58ffaac6c00d063fd" +checksum = "87725a7480b98887167edf878daa52201a13322ad88e34355a7f2ddc663e047e" dependencies = [ "chrono", "cosmwasm-std", - "osmosis-std-derive", - "prost 0.11.6", + "osmosis-std-derive 0.15.3", + "prost 0.11.9", "prost-types", "schemars", "serde", @@ -1195,21 +1525,33 @@ dependencies = [ "itertools", "proc-macro2", "quote", - "syn", + "syn 1.0.109", +] + +[[package]] +name = "osmosis-std-derive" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4d482a16be198ee04e0f94e10dd9b8d02332dcf33bc5ea4b255e7e25eedc5df" +dependencies = [ + "itertools", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] name = "osmosis-test-tube" -version = "14.1.1" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37e7d470a607f4016906fee20ff51275b399ffad9903240dc462c0f5226650c7" +checksum = "b6aba931600343de65be9cbf9ed5a98a611bbf1fc9c45994eb980cc5afb18404" dependencies = [ "base64", "bindgen", "cosmrs", "cosmwasm-std", - "osmosis-std 0.13.2", - "prost 0.11.6", + "osmosis-std 0.15.3", + "prost 0.11.9", "serde", "serde_json", "test-tube", @@ -1218,9 +1560,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba" +checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" [[package]] name = "pbkdf2" @@ -1228,7 +1570,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -1238,8 +1580,61 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" [[package]] -name = "pin-project-lite" -version = "0.2.9" +name = "peg" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07c0b841ea54f523f7aa556956fbd293bcbe06f2e67d2eb732b7278aaf1d166a" +dependencies = [ + "peg-macros", + "peg-runtime", +] + +[[package]] +name = "peg-macros" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5aa52829b8decbef693af90202711348ab001456803ba2a98eb4ec8fb70844c" +dependencies = [ + "peg-runtime", + "proc-macro2", + "quote", +] + +[[package]] +name = "peg-runtime" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c719dcf55f09a3a7e764c6649ab594c18a177e3599c467983cdf644bfc0a4088" + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + +[[package]] +name = "pin-project" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c95a7476719eab1e366eaf73d0260af3021184f18177925b07f54b30089ceead" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.18", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" @@ -1261,9 +1656,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.50" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2" +checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" dependencies = [ "unicode-ident", ] @@ -1280,12 +1675,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.11.6" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21dc42e00223fc37204bd4aa177e69420c604ca4a183209a8f9de30c6d934698" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" dependencies = [ "bytes", - "prost-derive 0.11.6", + "prost-derive 0.11.9", ] [[package]] @@ -1298,37 +1693,36 @@ dependencies = [ "itertools", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "prost-derive" -version = "0.11.6" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda8c0881ea9f722eb9629376db3d0b903b462477c1aafcb0566610ac28ac5d" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" dependencies = [ "anyhow", "itertools", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "prost-types" -version = "0.11.6" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e0526209433e96d83d750dd81a99118edbc55739e7e61a46764fd2ad537788" +checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" dependencies = [ - "bytes", - "prost 0.11.6", + "prost 0.11.9", ] [[package]] name = "quote" -version = "1.0.23" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" dependencies = [ "proc-macro2", ] @@ -1350,9 +1744,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.7.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +checksum = "81ca098a9821bd52d6b24fd8b10bd081f47d39c22778cafaa75a2857a62c6390" dependencies = [ "aho-corasick", "memchr", @@ -1361,9 +1755,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.28" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" [[package]] name = "rfc6979" @@ -1376,13 +1770,28 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi", +] + [[package]] name = "ripemd" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -1402,17 +1811,60 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustls" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +dependencies = [ + "base64", + "log", + "ring", + "sct", + "webpki", +] + +[[package]] +name = "rustls-native-certs" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092" +dependencies = [ + "openssl-probe", + "rustls", + "schannel", + "security-framework", +] + [[package]] name = "ryu" -version = "1.0.12" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" +checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +dependencies = [ + "windows-sys 0.42.0", +] [[package]] name = "schemars" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a5fb6c61f29e723026dc8e923d94c694313212abbecbbe5f55a7748eec5b307" +checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" dependencies = [ "dyn-clone", "schemars_derive", @@ -1422,14 +1874,24 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f188d036977451159430f3b8dc82ec76364a42b7e289c2b18a9a18f4470058e9" +checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn", + "syn 1.0.109", +] + +[[package]] +name = "sct" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +dependencies = [ + "ring", + "untrusted", ] [[package]] @@ -1446,17 +1908,40 @@ dependencies = [ "zeroize", ] +[[package]] +name = "security-framework" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f51d0c0d83bec45f16480d0ce0058397a69e48fcdc52d1dc8855fb68acbd31a7" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "semver" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" [[package]] name = "serde" -version = "1.0.152" +version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" +checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" dependencies = [ "serde_derive", ] @@ -1472,31 +1957,31 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15bee9b04dd165c3f4e142628982ddde884c2022a89e8ddf99c4829bf2c3a58" +checksum = "16a62a1fad1e1828b24acac8f2b468971dade7b8c3c2e672bcadefefb1f8c137" dependencies = [ "serde", ] [[package]] name = "serde_bytes" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718dc5fff5b36f99093fc49b280cfc96ce6fc824317783bff5a1fed0c7a64819" +checksum = "416bda436f9aab92e02c8e10d49a15ddd339cea90b6e340fe51ed97abb548294" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.152" +version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" +checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.18", ] [[package]] @@ -1507,14 +1992,14 @@ checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "serde_json" -version = "1.0.91" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ "itoa", "ryu", @@ -1523,13 +2008,24 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.10" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a5ec9fa74a20ebbe5d9ac23dac1fc96ba0ecfe9f50f2843b52e537b10fbcb4e" +checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.18", +] + +[[package]] +name = "sha1" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", ] [[package]] @@ -1553,16 +2049,16 @@ checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] name = "sha3" -version = "0.10.6" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdf0c33fae925bdc080598b84bc15c55e7b9a4a43b3c704da051f977469691c9" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "keccak", ] @@ -1578,10 +2074,35 @@ version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "rand_core 0.6.4", ] +[[package]] +name = "slab" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg", +] + +[[package]] +name = "socket2" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + [[package]] name = "spki" version = "0.6.0" @@ -1606,9 +2127,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "subtle" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "subtle-encoding" @@ -1621,9 +2142,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.107" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", @@ -1631,15 +2152,14 @@ dependencies = [ ] [[package]] -name = "synstructure" -version = "0.12.6" +name = "syn" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" dependencies = [ "proc-macro2", "quote", - "syn", - "unicode-xid", + "unicode-ident", ] [[package]] @@ -1657,7 +2177,7 @@ dependencies = [ "k256", "num-traits", "once_cell", - "prost 0.11.6", + "prost 0.11.9", "prost-types", "ripemd160", "serde", @@ -1673,6 +2193,20 @@ dependencies = [ "zeroize", ] +[[package]] +name = "tendermint-config" +version = "0.23.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d42ee0abc27ef5fc34080cce8d43c189950d331631546e7dfb983b6274fa327" +dependencies = [ + "flex-error", + "serde", + "serde_json", + "tendermint", + "toml", + "url", +] + [[package]] name = "tendermint-proto" version = "0.23.9" @@ -1683,7 +2217,7 @@ dependencies = [ "flex-error", "num-derive", "num-traits", - "prost 0.11.6", + "prost 0.11.9", "prost-types", "serde", "serde_bytes", @@ -1691,6 +2225,39 @@ dependencies = [ "time", ] +[[package]] +name = "tendermint-rpc" +version = "0.23.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f14aafe3528a0f75e9f3f410b525617b2de16c4b7830a21f717eee62882ec60" +dependencies = [ + "async-trait", + "bytes", + "flex-error", + "futures", + "getrandom", + "http", + "hyper", + "hyper-proxy", + "hyper-rustls", + "peg", + "pin-project", + "serde", + "serde_bytes", + "serde_json", + "subtle-encoding", + "tendermint", + "tendermint-config", + "tendermint-proto", + "thiserror", + "time", + "tokio", + "tracing", + "url", + "uuid", + "walkdir", +] + [[package]] name = "termcolor" version = "1.2.0" @@ -1702,15 +2269,14 @@ dependencies = [ [[package]] name = "test-tube" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2791215b77f72c219df4d3e95d78539ee66950a0449961ba6d0ab1c7b538673f" +checksum = "b4807f0de0b84340e20a6ef1353a5c9db4543e1c74cd507aedd8b52e35d80020" dependencies = [ "base64", "cosmrs", "cosmwasm-std", - "osmosis-std 0.13.2", - "prost 0.11.6", + "prost 0.11.9", "serde", "serde_json", "thiserror", @@ -1724,22 +2290,22 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.18", ] [[package]] @@ -1759,6 +2325,115 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.28.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" +dependencies = [ + "autocfg", + "bytes", + "libc", + "mio", + "num_cpus", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.18", +] + +[[package]] +name = "tokio-rustls" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" +dependencies = [ + "rustls", + "tokio", + "webpki", +] + +[[package]] +name = "tokio-util" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" + [[package]] name = "typenum" version = "1.16.0" @@ -1777,17 +2452,49 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + [[package]] name = "unicode-ident" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" +checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" [[package]] -name = "unicode-xid" -version = "0.2.4" +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "url" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" [[package]] name = "version_check" @@ -1795,6 +2502,26 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "walkdir" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -1803,9 +2530,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.83" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1813,24 +2540,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.83" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.18", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.83" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1838,22 +2565,51 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.83" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.18", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.83" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" +checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" + +[[package]] +name = "web-sys" +version = "0.3.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" +dependencies = [ + "webpki", +] [[package]] name = "which" @@ -1897,23 +2653,145 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + [[package]] name = "zeroize" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.3.3" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn", - "synstructure", + "syn 2.0.18", ] diff --git a/Cargo.toml b/Cargo.toml index b3ff30e40..be5d5d674 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,7 @@ members = [ "contracts/address-provider", "contracts/incentives", "contracts/oracle/*", + "contracts/swapper/*", "contracts/red-bank", "contracts/rewards-collector/*", "packages/chains/*", @@ -19,6 +20,7 @@ authors = [ "Larry Engineer ", "Piotr Babel ", "Spike Spiegel ", + "Brianna M. ", "Ahmad Kaouk", "Harry Scholes", ] @@ -38,13 +40,14 @@ cw2 = { git = "https://github.com/mars-protocol/cw-plus", rev = "4 cw-multi-test = "0.16.1" cw-storage-plus = "1.0.1" cw-utils = "1.0.1" -mars-owner = "1.0.0" +mars-owner = { version = "1.0.0", features = ["emergency-owner"] } osmosis-std = "0.14.0" -osmosis-test-tube = "14.1.1" +osmosis-test-tube = "15.1.0" prost = { version = "0.11.5", default-features = false, features = ["prost-derive"] } schemars = "0.8.11" serde = { version = "1.0.152", default-features = false, features = ["derive"] } thiserror = "1.0.38" +cw-paginate = "0.2.1" # packages mars-health = { version = "1.0.0", path = "./packages/health" } @@ -52,6 +55,7 @@ mars-osmosis = { version = "1.0.0", path = "./packages/chains/osmosis" } mars-red-bank-types = { version = "1.0.0", path = "./packages/types" } mars-testing = { version = "1.0.0", path = "./packages/testing" } mars-utils = { version = "1.0.0", path = "./packages/utils" } +mars-swapper = { version = "1.0.0", path = "./packages/mars-swapper" } # contracts mars-address-provider = { version = "1.0.0", path = "./contracts/address-provider" } @@ -61,6 +65,7 @@ mars-oracle-osmosis = { version = "1.0.0", path = "./contracts/oracle mars-red-bank = { version = "1.0.0", path = "./contracts/red-bank" } mars-rewards-collector-base = { version = "1.0.0", path = "./contracts/rewards-collector/base" } mars-rewards-collector-osmosis = { version = "1.0.0", path = "./contracts/rewards-collector/osmosis" } +mars-swapper-base = { version = "1.0.0", path = "contracts/swapper/base" } [profile.release] codegen-units = 1 diff --git a/README.md b/README.md index 793fcbc75..854c0bd4a 100644 --- a/README.md +++ b/README.md @@ -68,22 +68,22 @@ A bug bounty is currently open for these contracts. See details [here][2]. - Create the build folder: - ```bash - yarn build - ``` + ```bash + yarn build + ``` - Compile all contracts: - ```bash - cargo make rust-optimizer - ``` + ```bash + cargo make rust-optimizer + ``` - Formatting: - ```bash - yarn format - yarn lint - ``` + ```bash + yarn format + yarn lint + ``` This compiles and optimizes all contracts, storing them in `/artifacts` directory along with `checksum.txt` which contains sha256 hashes of each of the `.wasm` files (The script just uses CosmWasm's [rust-optimizer][9]). diff --git a/contracts/params/Cargo.toml b/contracts/params/Cargo.toml new file mode 100644 index 000000000..08ad2108c --- /dev/null +++ b/contracts/params/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "mars-params" +description = "Contract storing the asset params for Rover and Red Bank." +version = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +edition = { workspace = true } +repository = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } +keywords = { workspace = true } + +[lib] +crate-type = ["cdylib", "rlib"] + +[features] +# for quicker tests, cargo test --lib +# for more explicit tests, cargo test --features=backtraces +backtraces = ["cosmwasm-std/backtraces"] +library = [] + +[dependencies] +cosmwasm-schema = { workspace = true } +cosmwasm-std = { workspace = true } +cw2 = { workspace = true } +cw-storage-plus = { workspace = true } +mars-red-bank-types = { workspace = true } +mars-owner = { workspace = true } +mars-utils = { workspace = true } +schemars = { workspace = true } +serde = { workspace = true } +thiserror = { workspace = true } + +[dev-dependencies] +anyhow = { workspace = true } +cw-multi-test = { workspace = true } diff --git a/contracts/params/README.md b/contracts/params/README.md new file mode 100644 index 000000000..71737bcc1 --- /dev/null +++ b/contracts/params/README.md @@ -0,0 +1,16 @@ +# Mars Params Contract + +The Mars Params Contract is published to [Crates.io](https://crates.io/crates/mars-params) + +This contract holds the following values for all the assets in Mars Protocol: + +- **Max Loan To Value:** Max percentage of collateral that can be borrowed +- **Liquidation Threshold:** LTV at which the loan is defined as under collateralized and can be liquidated +- **Liquidation Bonus:** Percentage of extra collateral the liquidator gets as a bonus +- **Deposit Enabled:** Is the asset able to be deposited into the Red Bank +- **Borrow Enabled:** Is the asset able to be borrowed from the Red Bank +- **Deposit Cap:** Max amount that can be deposited into the Red Bank +- **Asset Permissions** Rover and Red Bank Permission Settings + +Note: Rover Vaults only utilize max loan to value, liquidation threshold, and deposit cap parameters, while Red Bank Markets utilize all of the above parameters. + diff --git a/contracts/params/examples/schema.rs b/contracts/params/examples/schema.rs new file mode 100644 index 000000000..29e8f6f7d --- /dev/null +++ b/contracts/params/examples/schema.rs @@ -0,0 +1,10 @@ +use cosmwasm_schema::write_api; +use mars_params::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +fn main() { + write_api! { + instantiate: InstantiateMsg, + execute: ExecuteMsg, + query: QueryMsg, + } +} diff --git a/contracts/params/src/contract.rs b/contracts/params/src/contract.rs new file mode 100644 index 000000000..8e7ea0c89 --- /dev/null +++ b/contracts/params/src/contract.rs @@ -0,0 +1,91 @@ +use cosmwasm_std::{entry_point, to_binary, Binary, Deps, DepsMut, Env, MessageInfo, Response}; +use cw2::set_contract_version; +use mars_owner::OwnerInit::SetInitialOwner; + +use crate::{ + emergency_powers::{disable_borrowing, disallow_coin, set_zero_deposit_cap, set_zero_max_ltv}, + error::ContractResult, + execute::{assert_mcf, update_asset_params, update_max_close_factor, update_vault_config}, + msg::{ExecuteMsg, InstantiateMsg, QueryMsg}, + query::{query_all_asset_params, query_all_vault_configs, query_vault_config}, + state::{ASSET_PARAMS, MAX_CLOSE_FACTOR, OWNER}, + types::{EmergencyUpdate, RedBankEmergencyUpdate, RoverEmergencyUpdate}, +}; + +const CONTRACT_NAME: &str = env!("CARGO_PKG_NAME"); +const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); + +#[entry_point] +pub fn instantiate( + deps: DepsMut, + _: Env, + _: MessageInfo, + msg: InstantiateMsg, +) -> ContractResult { + set_contract_version(deps.storage, format!("crates.io:{CONTRACT_NAME}"), CONTRACT_VERSION)?; + + OWNER.initialize( + deps.storage, + deps.api, + SetInitialOwner { + owner: msg.owner, + }, + )?; + + assert_mcf(msg.max_close_factor)?; + MAX_CLOSE_FACTOR.save(deps.storage, &msg.max_close_factor)?; + + Ok(Response::default()) +} + +#[entry_point] +pub fn execute( + deps: DepsMut, + _: Env, + info: MessageInfo, + msg: ExecuteMsg, +) -> ContractResult { + match msg { + ExecuteMsg::UpdateOwner(update) => Ok(OWNER.update(deps, info, update)?), + ExecuteMsg::UpdateAssetParams(update) => update_asset_params(deps, info, update), + ExecuteMsg::UpdateMaxCloseFactor(mcf) => update_max_close_factor(deps, info, mcf), + ExecuteMsg::UpdateVaultConfig(update) => update_vault_config(deps, info, update), + ExecuteMsg::EmergencyUpdate(update) => match update { + EmergencyUpdate::RedBank(rb_u) => match rb_u { + RedBankEmergencyUpdate::DisableBorrowing(denom) => { + disable_borrowing(deps, info, &denom) + } + }, + EmergencyUpdate::Rover(rv_u) => match rv_u { + RoverEmergencyUpdate::DisallowCoin(denom) => disallow_coin(deps, info, &denom), + RoverEmergencyUpdate::SetZeroMaxLtvOnVault(v) => set_zero_max_ltv(deps, info, &v), + RoverEmergencyUpdate::SetZeroDepositCapOnVault(v) => { + set_zero_deposit_cap(deps, info, &v) + } + }, + }, + } +} + +#[entry_point] +pub fn query(deps: Deps, _: Env, msg: QueryMsg) -> ContractResult { + let res = match msg { + QueryMsg::Owner {} => to_binary(&OWNER.query(deps.storage)?), + QueryMsg::AssetParams { + denom, + } => to_binary(&ASSET_PARAMS.load(deps.storage, &denom)?), + QueryMsg::AllAssetParams { + start_after, + limit, + } => to_binary(&query_all_asset_params(deps, start_after, limit)?), + QueryMsg::VaultConfig { + address, + } => to_binary(&query_vault_config(deps, &address)?), + QueryMsg::AllVaultConfigs { + start_after, + limit, + } => to_binary(&query_all_vault_configs(deps, start_after, limit)?), + QueryMsg::MaxCloseFactor {} => to_binary(&MAX_CLOSE_FACTOR.load(deps.storage)?), + }; + res.map_err(Into::into) +} diff --git a/contracts/params/src/emergency_powers.rs b/contracts/params/src/emergency_powers.rs new file mode 100644 index 000000000..2fe95c910 --- /dev/null +++ b/contracts/params/src/emergency_powers.rs @@ -0,0 +1,82 @@ +use cosmwasm_std::{Decimal, DepsMut, MessageInfo, Response, Uint128}; + +use crate::{ + error::ContractError, + state::{ASSET_PARAMS, OWNER, VAULT_CONFIGS}, +}; + +pub fn disable_borrowing( + deps: DepsMut, + info: MessageInfo, + denom: &str, +) -> Result { + OWNER.assert_emergency_owner(deps.storage, &info.sender)?; + + let mut params = ASSET_PARAMS.load(deps.storage, denom)?; + params.red_bank.borrow_enabled = false; + ASSET_PARAMS.save(deps.storage, denom, ¶ms)?; + + let response = Response::new() + .add_attribute("action", "emergency_disable_borrowing") + .add_attribute("denom", denom.to_string()); + + Ok(response) +} + +pub fn disallow_coin( + deps: DepsMut, + info: MessageInfo, + denom: &str, +) -> Result { + OWNER.assert_emergency_owner(deps.storage, &info.sender)?; + + let mut params = ASSET_PARAMS.load(deps.storage, denom)?; + params.rover.whitelisted = false; + ASSET_PARAMS.save(deps.storage, denom, ¶ms)?; + + let response = Response::new() + .add_attribute("action", "emergency_disallow_coin") + .add_attribute("denom", denom.to_string()); + + Ok(response) +} + +pub fn set_zero_max_ltv( + deps: DepsMut, + info: MessageInfo, + vault: &str, +) -> Result { + OWNER.assert_emergency_owner(deps.storage, &info.sender)?; + + let vault_addr = deps.api.addr_validate(vault)?; + + let mut config = VAULT_CONFIGS.load(deps.storage, &vault_addr)?; + config.max_loan_to_value = Decimal::zero(); + VAULT_CONFIGS.save(deps.storage, &vault_addr, &config)?; + + let response = Response::new() + .add_attribute("action", "emergency_set_zero_max_ltv") + .add_attribute("vault", vault.to_string()); + + Ok(response) +} + +pub fn set_zero_deposit_cap( + deps: DepsMut, + info: MessageInfo, + vault: &str, +) -> Result { + OWNER.assert_emergency_owner(deps.storage, &info.sender)?; + + let vault_addr = deps.api.addr_validate(vault)?; + + let mut config = VAULT_CONFIGS.load(deps.storage, &vault_addr)?; + config.deposit_cap.amount = Uint128::zero(); + VAULT_CONFIGS.save(deps.storage, &vault_addr, &config)?; + + let response = Response::new() + .add_attribute("action", "emergency_set_zero_deposit_cap") + .add_attribute("vault", vault.to_string()); + + Ok(response) +} diff --git a/contracts/params/src/error.rs b/contracts/params/src/error.rs new file mode 100644 index 000000000..b19167c53 --- /dev/null +++ b/contracts/params/src/error.rs @@ -0,0 +1,18 @@ +use cosmwasm_std::StdError; +use mars_owner::OwnerError; +pub use mars_utils::error::ValidationError; +use thiserror::Error; + +pub type ContractResult = Result; + +#[derive(Error, Debug, PartialEq)] +pub enum ContractError { + #[error("{0}")] + Std(#[from] StdError), + + #[error("{0}")] + Owner(#[from] OwnerError), + + #[error("{0}")] + Validation(#[from] ValidationError), +} diff --git a/contracts/params/src/execute.rs b/contracts/params/src/execute.rs new file mode 100644 index 000000000..9e5aebd14 --- /dev/null +++ b/contracts/params/src/execute.rs @@ -0,0 +1,128 @@ +use cosmwasm_std::{Decimal, DepsMut, MessageInfo, Response}; +use mars_utils::{error::ValidationError, helpers::validate_native_denom}; + +use crate::{ + error::ContractError, + state::{ASSET_PARAMS, MAX_CLOSE_FACTOR, OWNER, VAULT_CONFIGS}, + types::{AssetParamsUpdate, VaultConfigUpdate}, +}; + +pub const CONTRACT_NAME: &str = env!("CARGO_PKG_NAME"); +pub const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); + +pub fn update_max_close_factor( + deps: DepsMut, + info: MessageInfo, + max_close_factor: Decimal, +) -> Result { + OWNER.assert_owner(deps.storage, &info.sender)?; + + assert_mcf(max_close_factor)?; + MAX_CLOSE_FACTOR.save(deps.storage, &max_close_factor)?; + + let response = Response::new() + .add_attribute("action", "update_max_close_factor") + .add_attribute("value", max_close_factor.to_string()); + + Ok(response) +} + +pub fn update_asset_params( + deps: DepsMut, + info: MessageInfo, + update: AssetParamsUpdate, +) -> Result { + OWNER.assert_owner(deps.storage, &info.sender)?; + + let mut response = Response::new().add_attribute("action", "update_asset_param"); + + match update { + AssetParamsUpdate::AddOrUpdate { + denom, + params, + } => { + validate_native_denom(&denom)?; + params.validate()?; + + ASSET_PARAMS.save(deps.storage, &denom, ¶ms)?; + response = response + .add_attribute("action_type", "add_or_update") + .add_attribute("denom", denom); + } + } + + Ok(response) +} + +pub fn update_vault_config( + deps: DepsMut, + info: MessageInfo, + update: VaultConfigUpdate, +) -> Result { + OWNER.assert_owner(deps.storage, &info.sender)?; + + let mut response = Response::new().add_attribute("action", "update_vault_config"); + + match update { + VaultConfigUpdate::AddOrUpdate { + addr, + config, + } => { + let checked = deps.api.addr_validate(&addr)?; + config.validate()?; + VAULT_CONFIGS.save(deps.storage, &checked, &config)?; + response = + response.add_attribute("action_type", "add_or_update").add_attribute("addr", addr); + } + VaultConfigUpdate::Remove { + addr, + } => { + let checked = deps.api.addr_validate(&addr)?; + VAULT_CONFIGS.remove(deps.storage, &checked); + response = response.add_attribute("action_type", "remove").add_attribute("addr", addr); + } + } + + Ok(response) +} + +pub fn assert_mcf(param_value: Decimal) -> Result<(), ValidationError> { + if !param_value.le(&Decimal::one()) { + Err(ValidationError::InvalidParam { + param_name: "max-close-factor".to_string(), + invalid_value: "max-close-factor".to_string(), + predicate: "<= 1".to_string(), + }) + } else { + Ok(()) + } +} + +/// liquidation_threshold should be greater than or equal to max_loan_to_value +pub fn assert_lqt_gt_max_ltv( + max_ltv: Decimal, + liq_threshold: Decimal, +) -> Result<(), ValidationError> { + if liq_threshold <= max_ltv { + return Err(ValidationError::InvalidParam { + param_name: "liquidation_threshold".to_string(), + invalid_value: liq_threshold.to_string(), + predicate: format!("> {} (max LTV)", max_ltv), + }); + } + Ok(()) +} + +pub fn assert_hls_lqt_gt_max_ltv( + max_ltv: Decimal, + liq_threshold: Decimal, +) -> Result<(), ValidationError> { + if liq_threshold <= max_ltv { + return Err(ValidationError::InvalidParam { + param_name: "hls_liquidation_threshold".to_string(), + invalid_value: liq_threshold.to_string(), + predicate: format!("> {} (hls max LTV)", max_ltv), + }); + } + Ok(()) +} diff --git a/contracts/params/src/lib.rs b/contracts/params/src/lib.rs new file mode 100644 index 000000000..2f486c2cc --- /dev/null +++ b/contracts/params/src/lib.rs @@ -0,0 +1,8 @@ +pub mod contract; +pub mod emergency_powers; +pub mod error; +pub mod execute; +pub mod msg; +pub mod query; +pub mod state; +pub mod types; diff --git a/contracts/params/src/msg.rs b/contracts/params/src/msg.rs new file mode 100644 index 000000000..19c4b7e78 --- /dev/null +++ b/contracts/params/src/msg.rs @@ -0,0 +1,57 @@ +use cosmwasm_schema::{cw_serde, QueryResponses}; +use cosmwasm_std::Decimal; +use mars_owner::OwnerUpdate; + +use crate::types::{ + AssetParams, AssetParamsUpdate, EmergencyUpdate, VaultConfig, VaultConfigUpdate, +}; + +#[cw_serde] +pub struct InstantiateMsg { + /// Contract's owner + pub owner: String, + /// The maximum percent a liquidator can decrease the debt amount of the liquidatee + pub max_close_factor: Decimal, +} + +#[cw_serde] +pub enum ExecuteMsg { + UpdateOwner(OwnerUpdate), + UpdateMaxCloseFactor(Decimal), + UpdateAssetParams(AssetParamsUpdate), + UpdateVaultConfig(VaultConfigUpdate), + EmergencyUpdate(EmergencyUpdate), +} + +#[cw_serde] +#[derive(QueryResponses)] +pub enum QueryMsg { + #[returns(mars_owner::OwnerResponse)] + Owner {}, + + #[returns(AssetParams)] + AssetParams { + denom: String, + }, + + #[returns(Vec)] + AllAssetParams { + start_after: Option, + limit: Option, + }, + + #[returns(VaultConfig)] + VaultConfig { + /// Address of vault + address: String, + }, + + #[returns(Vec)] + AllVaultConfigs { + start_after: Option, + limit: Option, + }, + + #[returns(Decimal)] + MaxCloseFactor {}, +} diff --git a/contracts/params/src/query.rs b/contracts/params/src/query.rs new file mode 100644 index 000000000..12ad21bbc --- /dev/null +++ b/contracts/params/src/query.rs @@ -0,0 +1,63 @@ +use cosmwasm_std::{Addr, Deps, Order, StdResult}; +use cw_storage_plus::Bound; + +use crate::{ + state::{ASSET_PARAMS, VAULT_CONFIGS}, + types::{AssetParamsResponse, VaultConfig, VaultConfigResponse}, +}; + +pub const DEFAULT_LIMIT: u32 = 10; + +pub fn query_all_asset_params( + deps: Deps, + start_after: Option, + limit: Option, +) -> StdResult> { + let start = start_after.as_ref().map(|denom| Bound::exclusive(denom.as_str())); + let limit = limit.unwrap_or(DEFAULT_LIMIT) as usize; + ASSET_PARAMS + .range(deps.storage, start, None, Order::Ascending) + .take(limit) + .map(|res| { + let (denom, params) = res?; + Ok(AssetParamsResponse { + denom, + params, + }) + }) + .collect() +} + +pub fn query_vault_config(deps: Deps, unchecked: &str) -> StdResult { + let addr = deps.api.addr_validate(unchecked)?; + VAULT_CONFIGS.load(deps.storage, &addr) +} + +pub fn query_all_vault_configs( + deps: Deps, + start_after: Option, + limit: Option, +) -> StdResult> { + let vault_addr: Addr; + let start = match &start_after { + Some(unchecked) => { + vault_addr = deps.api.addr_validate(unchecked)?; + Some(Bound::exclusive(&vault_addr)) + } + None => None, + }; + + let limit = limit.unwrap_or(DEFAULT_LIMIT) as usize; + + VAULT_CONFIGS + .range(deps.storage, start, None, Order::Ascending) + .take(limit) + .map(|res| { + let (addr, config) = res?; + Ok(VaultConfigResponse { + addr, + config, + }) + }) + .collect() +} diff --git a/contracts/params/src/state.rs b/contracts/params/src/state.rs new file mode 100644 index 000000000..0a22180c3 --- /dev/null +++ b/contracts/params/src/state.rs @@ -0,0 +1,10 @@ +use cosmwasm_std::{Addr, Decimal}; +use cw_storage_plus::{Item, Map}; +use mars_owner::Owner; + +use crate::types::{AssetParams, VaultConfig}; + +pub const OWNER: Owner = Owner::new("owner"); +pub const ASSET_PARAMS: Map<&str, AssetParams> = Map::new("asset_params"); +pub const VAULT_CONFIGS: Map<&Addr, VaultConfig> = Map::new("vault_configs"); +pub const MAX_CLOSE_FACTOR: Item = Item::new("max_close_factor"); diff --git a/contracts/params/src/types.rs b/contracts/params/src/types.rs new file mode 100644 index 000000000..1a3325159 --- /dev/null +++ b/contracts/params/src/types.rs @@ -0,0 +1,118 @@ +use cosmwasm_schema::cw_serde; +use cosmwasm_std::{Addr, Coin, Decimal, Uint128}; +use mars_utils::{error::ValidationError, helpers::decimal_param_le_one}; + +use crate::execute::{assert_hls_lqt_gt_max_ltv, assert_lqt_gt_max_ltv}; + +#[cw_serde] +pub struct HighLeverageStrategyParams { + pub max_loan_to_value: Decimal, + pub liquidation_threshold: Decimal, +} + +#[cw_serde] +pub struct RoverSettings { + pub whitelisted: bool, + pub hls: HighLeverageStrategyParams, +} + +#[cw_serde] +pub struct RedBankSettings { + pub deposit_enabled: bool, + pub borrow_enabled: bool, + pub deposit_cap: Uint128, +} + +#[cw_serde] +pub struct AssetParams { + pub rover: RoverSettings, + pub red_bank: RedBankSettings, + pub max_loan_to_value: Decimal, + pub liquidation_threshold: Decimal, + pub liquidation_bonus: Decimal, +} + +impl AssetParams { + pub fn validate(&self) -> Result<(), ValidationError> { + decimal_param_le_one(self.max_loan_to_value, "max_loan_to_value")?; + decimal_param_le_one(self.liquidation_threshold, "liquidation_threshold")?; + assert_lqt_gt_max_ltv(self.max_loan_to_value, self.liquidation_threshold)?; + + decimal_param_le_one(self.liquidation_bonus, "liquidation_bonus")?; + + decimal_param_le_one(self.rover.hls.max_loan_to_value, "hls_max_loan_to_value")?; + decimal_param_le_one(self.rover.hls.liquidation_threshold, "hls_liquidation_threshold")?; + assert_hls_lqt_gt_max_ltv( + self.rover.hls.max_loan_to_value, + self.rover.hls.liquidation_threshold, + )?; + + Ok(()) + } +} + +#[cw_serde] +pub struct AssetParamsResponse { + pub denom: String, + pub params: AssetParams, +} + +#[cw_serde] +pub struct VaultConfigResponse { + pub addr: Addr, + pub config: VaultConfig, +} + +#[cw_serde] +pub struct VaultConfig { + pub deposit_cap: Coin, + pub max_loan_to_value: Decimal, + pub liquidation_threshold: Decimal, + pub whitelisted: bool, +} + +impl VaultConfig { + pub fn validate(&self) -> Result<(), ValidationError> { + decimal_param_le_one(self.max_loan_to_value, "max_loan_to_value")?; + decimal_param_le_one(self.liquidation_threshold, "liquidation_threshold")?; + assert_lqt_gt_max_ltv(self.max_loan_to_value, self.liquidation_threshold)?; + Ok(()) + } +} + +#[cw_serde] +pub enum AssetParamsUpdate { + AddOrUpdate { + denom: String, + params: AssetParams, + }, +} + +#[cw_serde] +pub enum VaultConfigUpdate { + AddOrUpdate { + addr: String, + config: VaultConfig, + }, + Remove { + addr: String, + }, +} + +#[cw_serde] +pub enum RoverEmergencyUpdate { + SetZeroMaxLtvOnVault(String), + SetZeroDepositCapOnVault(String), + DisallowCoin(String), +} + +#[cw_serde] +pub enum RedBankEmergencyUpdate { + DisableBorrowing(String), +} + +#[cw_serde] +pub enum EmergencyUpdate { + Rover(RoverEmergencyUpdate), + RedBank(RedBankEmergencyUpdate), +} diff --git a/contracts/params/tests/helpers/assertions.rs b/contracts/params/tests/helpers/assertions.rs new file mode 100644 index 000000000..857060fd9 --- /dev/null +++ b/contracts/params/tests/helpers/assertions.rs @@ -0,0 +1,25 @@ +use std::{collections::HashSet, hash::Hash}; + +use anyhow::Result as AnyResult; +use cw_multi_test::AppResponse; +use mars_params::error::ContractError; + +pub fn assert_err(res: AnyResult, err: ContractError) { + match res { + Ok(_) => panic!("Result was not an error"), + Err(generic_err) => { + let contract_err: ContractError = generic_err.downcast().unwrap(); + assert_eq!(contract_err, err); + } + } +} + +pub fn assert_contents_equal(vec_a: &[T], vec_b: &[T]) +where + T: Eq + Hash, +{ + let set_a: HashSet<_> = vec_a.iter().collect(); + let set_b: HashSet<_> = vec_b.iter().collect(); + + assert!(set_a == set_b) +} diff --git a/contracts/params/tests/helpers/contracts.rs b/contracts/params/tests/helpers/contracts.rs new file mode 100644 index 000000000..52c2cfef9 --- /dev/null +++ b/contracts/params/tests/helpers/contracts.rs @@ -0,0 +1,11 @@ +use cosmwasm_std::Empty; +use cw_multi_test::{Contract, ContractWrapper}; + +pub fn mock_params_contract() -> Box> { + let contract = ContractWrapper::new( + mars_params::contract::execute, + mars_params::contract::instantiate, + mars_params::contract::query, + ); + Box::new(contract) +} diff --git a/contracts/params/tests/helpers/generator.rs b/contracts/params/tests/helpers/generator.rs new file mode 100644 index 000000000..6d963ebaa --- /dev/null +++ b/contracts/params/tests/helpers/generator.rs @@ -0,0 +1,35 @@ +use std::str::FromStr; + +use cosmwasm_std::{coin, Decimal, Uint128}; +use mars_params::types::{ + AssetParams, HighLeverageStrategyParams, RedBankSettings, RoverSettings, VaultConfig, +}; + +pub fn default_asset_params() -> AssetParams { + AssetParams { + rover: RoverSettings { + whitelisted: false, + hls: HighLeverageStrategyParams { + max_loan_to_value: Decimal::from_str("0.85").unwrap(), + liquidation_threshold: Decimal::from_str("0.9").unwrap(), + }, + }, + red_bank: RedBankSettings { + deposit_enabled: true, + borrow_enabled: false, + deposit_cap: Uint128::new(1_000_000_000), + }, + max_loan_to_value: Decimal::from_str("0.6").unwrap(), + liquidation_threshold: Decimal::from_str("0.7").unwrap(), + liquidation_bonus: Decimal::from_str("0.15").unwrap(), + } +} + +pub fn default_vault_config() -> VaultConfig { + VaultConfig { + deposit_cap: coin(100_000_000_000, "uusdc"), + max_loan_to_value: Decimal::from_str("0.47").unwrap(), + liquidation_threshold: Decimal::from_str("0.5").unwrap(), + whitelisted: true, + } +} diff --git a/contracts/params/tests/helpers/mock_env.rs b/contracts/params/tests/helpers/mock_env.rs new file mode 100644 index 000000000..7c0256e4b --- /dev/null +++ b/contracts/params/tests/helpers/mock_env.rs @@ -0,0 +1,241 @@ +use std::{mem::take, str::FromStr}; + +use anyhow::Result as AnyResult; +use cosmwasm_std::{Addr, Decimal}; +use cw_multi_test::{App, AppResponse, BasicApp, Executor}; +use mars_owner::{OwnerResponse, OwnerUpdate}; +use mars_params::{ + msg::{ExecuteMsg, InstantiateMsg, QueryMsg}, + types::{ + AssetParams, AssetParamsResponse, AssetParamsUpdate, EmergencyUpdate, VaultConfig, + VaultConfigResponse, VaultConfigUpdate, + }, +}; + +use crate::helpers::mock_params_contract; + +pub struct MockEnv { + pub app: BasicApp, + pub params_contract: Addr, +} + +pub struct MockEnvBuilder { + pub app: BasicApp, + pub max_close_factor: Option, + pub emergency_owner: Option, +} + +#[allow(clippy::new_ret_no_self)] +impl MockEnv { + pub fn new() -> MockEnvBuilder { + MockEnvBuilder { + app: App::default(), + max_close_factor: None, + emergency_owner: None, + } + } + + //-------------------------------------------------------------------------------------------------- + // Execute Msgs + //-------------------------------------------------------------------------------------------------- + + pub fn update_asset_params( + &mut self, + sender: &Addr, + update: AssetParamsUpdate, + ) -> AnyResult { + self.app.execute_contract( + sender.clone(), + self.params_contract.clone(), + &ExecuteMsg::UpdateAssetParams(update), + &[], + ) + } + + pub fn update_vault_config( + &mut self, + sender: &Addr, + update: VaultConfigUpdate, + ) -> AnyResult { + self.app.execute_contract( + sender.clone(), + self.params_contract.clone(), + &ExecuteMsg::UpdateVaultConfig(update), + &[], + ) + } + + pub fn update_owner(&mut self, sender: &Addr, update: OwnerUpdate) -> AnyResult { + self.app.execute_contract( + sender.clone(), + self.params_contract.clone(), + &ExecuteMsg::UpdateOwner(update), + &[], + ) + } + + pub fn update_max_close_factor( + &mut self, + sender: &Addr, + mcf: Decimal, + ) -> AnyResult { + self.app.execute_contract( + sender.clone(), + self.params_contract.clone(), + &ExecuteMsg::UpdateMaxCloseFactor(mcf), + &[], + ) + } + + pub fn emergency_update( + &mut self, + sender: &Addr, + update: EmergencyUpdate, + ) -> AnyResult { + self.app.execute_contract( + sender.clone(), + self.params_contract.clone(), + &ExecuteMsg::EmergencyUpdate(update), + &[], + ) + } + + //-------------------------------------------------------------------------------------------------- + // Queries + //-------------------------------------------------------------------------------------------------- + + pub fn query_owner(&self) -> Addr { + let res = self.query_ownership(); + Addr::unchecked(res.owner.unwrap()) + } + + pub fn query_ownership(&self) -> OwnerResponse { + self.app.wrap().query_wasm_smart(self.params_contract.clone(), &QueryMsg::Owner {}).unwrap() + } + + pub fn query_asset_params(&self, denom: &str) -> AssetParams { + self.app + .wrap() + .query_wasm_smart( + self.params_contract.clone(), + &QueryMsg::AssetParams { + denom: denom.to_string(), + }, + ) + .unwrap() + } + + pub fn query_all_asset_params( + &self, + start_after: Option, + limit: Option, + ) -> Vec { + self.app + .wrap() + .query_wasm_smart( + self.params_contract.clone(), + &QueryMsg::AllAssetParams { + start_after, + limit, + }, + ) + .unwrap() + } + + pub fn query_vault_config(&self, addr: &str) -> VaultConfig { + self.app + .wrap() + .query_wasm_smart( + self.params_contract.clone(), + &QueryMsg::VaultConfig { + address: addr.to_string(), + }, + ) + .unwrap() + } + + pub fn query_all_vault_configs( + &self, + start_after: Option, + limit: Option, + ) -> Vec { + self.app + .wrap() + .query_wasm_smart( + self.params_contract.clone(), + &QueryMsg::AllVaultConfigs { + start_after, + limit, + }, + ) + .unwrap() + } + + pub fn query_max_close_factor(&self) -> Decimal { + self.app + .wrap() + .query_wasm_smart(self.params_contract.clone(), &QueryMsg::MaxCloseFactor {}) + .unwrap() + } +} + +impl MockEnvBuilder { + pub fn build(&mut self) -> AnyResult { + let code_id = self.app.store_code(mock_params_contract()); + + let params_contract = self.app.instantiate_contract( + code_id, + Addr::unchecked("owner"), + &InstantiateMsg { + owner: "owner".to_string(), + max_close_factor: self.get_max_close_factor(), + }, + &[], + "mock-params-contract", + None, + )?; + + if self.emergency_owner.is_some() { + self.set_emergency_owner(¶ms_contract, &self.emergency_owner.clone().unwrap()); + } + + Ok(MockEnv { + app: take(&mut self.app), + params_contract, + }) + } + + fn set_emergency_owner(&mut self, params_contract: &Addr, eo: &str) { + self.app + .execute_contract( + Addr::unchecked("owner"), + params_contract.clone(), + &ExecuteMsg::UpdateOwner(OwnerUpdate::SetEmergencyOwner { + emergency_owner: eo.to_string(), + }), + &[], + ) + .unwrap(); + } + + //-------------------------------------------------------------------------------------------------- + // Get or defaults + //-------------------------------------------------------------------------------------------------- + + pub fn get_max_close_factor(&self) -> Decimal { + self.max_close_factor.unwrap_or(Decimal::from_str("0.5").unwrap()) + } + + //-------------------------------------------------------------------------------------------------- + // Setter functions + //-------------------------------------------------------------------------------------------------- + pub fn max_close_factor(&mut self, mcf: Decimal) -> &mut Self { + self.max_close_factor = Some(mcf); + self + } + + pub fn emergency_owner(&mut self, eo: &str) -> &mut Self { + self.emergency_owner = Some(eo.to_string()); + self + } +} diff --git a/contracts/params/tests/helpers/mod.rs b/contracts/params/tests/helpers/mod.rs new file mode 100644 index 000000000..2c580c0be --- /dev/null +++ b/contracts/params/tests/helpers/mod.rs @@ -0,0 +1,6 @@ +pub use self::{assertions::*, contracts::*, generator::*, mock_env::*}; + +mod assertions; +mod contracts; +mod generator; +mod mock_env; diff --git a/contracts/params/tests/test_asset_validation.rs b/contracts/params/tests/test_asset_validation.rs new file mode 100644 index 000000000..42df89bc8 --- /dev/null +++ b/contracts/params/tests/test_asset_validation.rs @@ -0,0 +1,192 @@ +use std::str::FromStr; + +use cosmwasm_std::Decimal; +use mars_params::{error::ContractError::Validation, types::AssetParamsUpdate}; +use mars_utils::error::ValidationError::{InvalidDenom, InvalidParam}; + +use crate::helpers::{assert_err, default_asset_params, MockEnv}; + +pub mod helpers; + +#[test] +fn denom_must_be_native() { + let mut mock = MockEnv::new().build().unwrap(); + let denom = "AA".to_string(); // Invalid native denom length + + let res = mock.update_asset_params( + &mock.query_owner(), + AssetParamsUpdate::AddOrUpdate { + denom, + params: default_asset_params(), + }, + ); + assert_err( + res, + Validation(InvalidDenom { + reason: "Invalid denom length".to_string(), + }), + ); +} + +#[test] +fn max_ltv_less_than_or_equal_to_one() { + let mut mock = MockEnv::new().build().unwrap(); + let mut params = default_asset_params(); + params.max_loan_to_value = Decimal::from_str("1.1235").unwrap(); + + let res = mock.update_asset_params( + &mock.query_owner(), + AssetParamsUpdate::AddOrUpdate { + denom: "denom_xyz".to_string(), + params, + }, + ); + assert_err( + res, + Validation(InvalidParam { + param_name: "max_loan_to_value".to_string(), + invalid_value: "1.1235".to_string(), + predicate: "<= 1".to_string(), + }), + ); +} + +#[test] +fn liquidation_threshold_less_than_or_equal_to_one() { + let mut mock = MockEnv::new().build().unwrap(); + let mut params = default_asset_params(); + params.liquidation_threshold = Decimal::from_str("1.1235").unwrap(); + + let res = mock.update_asset_params( + &mock.query_owner(), + AssetParamsUpdate::AddOrUpdate { + denom: "denom_xyz".to_string(), + params, + }, + ); + assert_err( + res, + Validation(InvalidParam { + param_name: "liquidation_threshold".to_string(), + invalid_value: "1.1235".to_string(), + predicate: "<= 1".to_string(), + }), + ); +} + +#[test] +fn liquidation_bonus_less_than_or_equal_to_one() { + let mut mock = MockEnv::new().build().unwrap(); + let mut params = default_asset_params(); + params.liquidation_bonus = Decimal::from_str("1.1235").unwrap(); + + let res = mock.update_asset_params( + &mock.query_owner(), + AssetParamsUpdate::AddOrUpdate { + denom: "denom_xyz".to_string(), + params, + }, + ); + assert_err( + res, + Validation(InvalidParam { + param_name: "liquidation_bonus".to_string(), + invalid_value: "1.1235".to_string(), + predicate: "<= 1".to_string(), + }), + ); +} + +#[test] +fn liq_threshold_gt_max_ltv() { + let mut mock = MockEnv::new().build().unwrap(); + let mut params = default_asset_params(); + params.liquidation_threshold = Decimal::from_str("0.5").unwrap(); + params.max_loan_to_value = Decimal::from_str("0.6").unwrap(); + + let res = mock.update_asset_params( + &mock.query_owner(), + AssetParamsUpdate::AddOrUpdate { + denom: "denom_xyz".to_string(), + params, + }, + ); + assert_err( + res, + Validation(InvalidParam { + param_name: "liquidation_threshold".to_string(), + invalid_value: "0.5".to_string(), + predicate: "> 0.6 (max LTV)".to_string(), + }), + ); +} + +#[test] +fn hls_max_ltv_less_than_or_equal_to_one() { + let mut mock = MockEnv::new().build().unwrap(); + let mut params = default_asset_params(); + params.rover.hls.max_loan_to_value = Decimal::from_str("1.1235").unwrap(); + + let res = mock.update_asset_params( + &mock.query_owner(), + AssetParamsUpdate::AddOrUpdate { + denom: "denom_xyz".to_string(), + params, + }, + ); + assert_err( + res, + Validation(InvalidParam { + param_name: "hls_max_loan_to_value".to_string(), + invalid_value: "1.1235".to_string(), + predicate: "<= 1".to_string(), + }), + ); +} + +#[test] +fn hls_liquidation_threshold_less_than_or_equal_to_one() { + let mut mock = MockEnv::new().build().unwrap(); + let mut params = default_asset_params(); + params.rover.hls.liquidation_threshold = Decimal::from_str("1.1235").unwrap(); + + let res = mock.update_asset_params( + &mock.query_owner(), + AssetParamsUpdate::AddOrUpdate { + denom: "denom_xyz".to_string(), + params, + }, + ); + assert_err( + res, + Validation(InvalidParam { + param_name: "hls_liquidation_threshold".to_string(), + invalid_value: "1.1235".to_string(), + predicate: "<= 1".to_string(), + }), + ); +} + +#[test] +fn hls_liq_threshold_gt_hls_max_ltv() { + let mut mock = MockEnv::new().build().unwrap(); + let mut params = default_asset_params(); + params.rover.hls.liquidation_threshold = Decimal::from_str("0.5").unwrap(); + params.rover.hls.max_loan_to_value = Decimal::from_str("0.6").unwrap(); + + let res = mock.update_asset_params( + &mock.query_owner(), + AssetParamsUpdate::AddOrUpdate { + denom: "denom_xyz".to_string(), + params, + }, + ); + assert_err( + res, + Validation(InvalidParam { + param_name: "hls_liquidation_threshold".to_string(), + invalid_value: "0.5".to_string(), + predicate: "> 0.6 (hls max LTV)".to_string(), + }), + ); +} diff --git a/contracts/params/tests/test_close_factor.rs b/contracts/params/tests/test_close_factor.rs new file mode 100644 index 000000000..7b23d0bd6 --- /dev/null +++ b/contracts/params/tests/test_close_factor.rs @@ -0,0 +1,65 @@ +use std::str::FromStr; + +use cosmwasm_std::{Addr, Decimal}; +use mars_owner::{OwnerError, OwnerUpdate}; +use mars_params::error::ContractError::{Owner, Validation}; +use mars_utils::error::ValidationError::InvalidParam; + +use crate::helpers::{assert_err, MockEnv}; + +pub mod helpers; + +#[test] +fn mcf_set_on_init() { + let mock = MockEnv::new().build().unwrap(); + let mcf = mock.query_max_close_factor(); + assert_eq!(mcf, Decimal::from_str("0.5").unwrap()) +} + +#[test] +fn mcf_validated_on_init() { + let res = MockEnv::new().max_close_factor(Decimal::from_str("1.23").unwrap()).build(); + if res.is_ok() { + panic!("Should have thrown an instantiate error"); + } +} + +#[test] +fn only_owner_can_update_mcf() { + let mut mock = MockEnv::new().build().unwrap(); + let bad_guy = Addr::unchecked("doctor_otto_983"); + let res = mock.update_owner( + &bad_guy, + OwnerUpdate::ProposeNewOwner { + proposed: bad_guy.to_string(), + }, + ); + assert_err(res, Owner(OwnerError::NotOwner {})); +} + +#[test] +fn validated_updates() { + let mut mock = MockEnv::new().build().unwrap(); + let res = mock.update_max_close_factor(&mock.query_owner(), Decimal::from_str("1.9").unwrap()); + assert_err( + res, + Validation(InvalidParam { + param_name: "max-close-factor".to_string(), + invalid_value: "max-close-factor".to_string(), + predicate: "<= 1".to_string(), + }), + ); +} + +#[test] +fn update_mcf() { + let mut mock = MockEnv::new().build().unwrap(); + let new_max_close_factor = Decimal::from_str("0.9").unwrap(); + let current_mcf = mock.query_max_close_factor(); + assert_ne!(current_mcf, new_max_close_factor); + + mock.update_max_close_factor(&mock.query_owner(), Decimal::from_str("0.9").unwrap()).unwrap(); + + let current_mcf = mock.query_max_close_factor(); + assert_eq!(current_mcf, new_max_close_factor); +} diff --git a/contracts/params/tests/test_emergency_powers.rs b/contracts/params/tests/test_emergency_powers.rs new file mode 100644 index 000000000..cd736b5aa --- /dev/null +++ b/contracts/params/tests/test_emergency_powers.rs @@ -0,0 +1,160 @@ +use cosmwasm_std::Addr; +use mars_owner::OwnerError; +use mars_params::{ + error::ContractError::Owner, + types::{ + AssetParamsUpdate, EmergencyUpdate, RedBankEmergencyUpdate, RoverEmergencyUpdate, + VaultConfigUpdate, + }, +}; + +use crate::helpers::{assert_err, default_asset_params, default_vault_config, MockEnv}; + +pub mod helpers; + +#[test] +fn only_owner_can_invoke_emergency_powers() { + let mut mock = MockEnv::new().build().unwrap(); + let bad_guy = Addr::unchecked("doctor_otto_983"); + let res = mock.emergency_update( + &bad_guy, + EmergencyUpdate::RedBank(RedBankEmergencyUpdate::DisableBorrowing("xyz".to_string())), + ); + assert_err(res, Owner(OwnerError::NotEmergencyOwner {})); + + let res = mock.emergency_update( + &bad_guy, + EmergencyUpdate::Rover(RoverEmergencyUpdate::DisallowCoin("xyz".to_string())), + ); + assert_err(res, Owner(OwnerError::NotEmergencyOwner {})); + + let res = mock.emergency_update( + &bad_guy, + EmergencyUpdate::Rover(RoverEmergencyUpdate::SetZeroDepositCapOnVault("xyz".to_string())), + ); + assert_err(res, Owner(OwnerError::NotEmergencyOwner {})); + + let res = mock.emergency_update( + &bad_guy, + EmergencyUpdate::Rover(RoverEmergencyUpdate::SetZeroMaxLtvOnVault("xyz".to_string())), + ); + assert_err(res, Owner(OwnerError::NotEmergencyOwner {})); +} + +#[test] +fn disabling_borrowing() { + let emergency_owner = Addr::unchecked("miles_morales"); + let mut mock = MockEnv::new().emergency_owner(emergency_owner.as_str()).build().unwrap(); + let denom = "atom".to_string(); + + let mut params = default_asset_params(); + params.red_bank.borrow_enabled = true; + + mock.update_asset_params( + &mock.query_owner(), + AssetParamsUpdate::AddOrUpdate { + denom: denom.clone(), + params, + }, + ) + .unwrap(); + + let params = mock.query_asset_params(&denom); + assert!(params.red_bank.borrow_enabled); + + mock.emergency_update( + &emergency_owner, + EmergencyUpdate::RedBank(RedBankEmergencyUpdate::DisableBorrowing(denom.clone())), + ) + .unwrap(); + + let params = mock.query_asset_params(&denom); + assert!(!params.red_bank.borrow_enabled); +} + +#[test] +fn disallow_coin() { + let emergency_owner = Addr::unchecked("miles_morales"); + let mut mock = MockEnv::new().emergency_owner(emergency_owner.as_str()).build().unwrap(); + let denom = "atom".to_string(); + + let mut params = default_asset_params(); + params.rover.whitelisted = true; + + mock.update_asset_params( + &mock.query_owner(), + AssetParamsUpdate::AddOrUpdate { + denom: denom.clone(), + params, + }, + ) + .unwrap(); + + let params = mock.query_asset_params(&denom); + assert!(params.rover.whitelisted); + + mock.emergency_update( + &emergency_owner, + EmergencyUpdate::Rover(RoverEmergencyUpdate::DisallowCoin(denom.clone())), + ) + .unwrap(); + + let params = mock.query_asset_params(&denom); + assert!(!params.rover.whitelisted); +} + +#[test] +fn set_zero_max_ltv() { + let emergency_owner = Addr::unchecked("miles_morales"); + let mut mock = MockEnv::new().emergency_owner(emergency_owner.as_str()).build().unwrap(); + let vault = "vault_addr_123".to_string(); + + mock.update_vault_config( + &mock.query_owner(), + VaultConfigUpdate::AddOrUpdate { + addr: vault.clone(), + config: default_vault_config(), + }, + ) + .unwrap(); + + let params = mock.query_vault_config(&vault); + assert!(!params.max_loan_to_value.is_zero()); + + mock.emergency_update( + &emergency_owner, + EmergencyUpdate::Rover(RoverEmergencyUpdate::SetZeroMaxLtvOnVault(vault.clone())), + ) + .unwrap(); + + let params = mock.query_vault_config(&vault); + assert!(params.max_loan_to_value.is_zero()); +} + +#[test] +fn set_zero_deposit_cap() { + let emergency_owner = Addr::unchecked("miles_morales"); + let mut mock = MockEnv::new().emergency_owner(emergency_owner.as_str()).build().unwrap(); + let vault = "vault_addr_123".to_string(); + + mock.update_vault_config( + &mock.query_owner(), + VaultConfigUpdate::AddOrUpdate { + addr: vault.clone(), + config: default_vault_config(), + }, + ) + .unwrap(); + + let params = mock.query_vault_config(&vault); + assert!(!params.deposit_cap.amount.is_zero()); + + mock.emergency_update( + &emergency_owner, + EmergencyUpdate::Rover(RoverEmergencyUpdate::SetZeroDepositCapOnVault(vault.clone())), + ) + .unwrap(); + + let params = mock.query_vault_config(&vault); + assert!(params.deposit_cap.amount.is_zero()); +} diff --git a/contracts/params/tests/test_owner.rs b/contracts/params/tests/test_owner.rs new file mode 100644 index 000000000..df525b854 --- /dev/null +++ b/contracts/params/tests/test_owner.rs @@ -0,0 +1,47 @@ +use cosmwasm_std::Addr; +use mars_owner::{OwnerError, OwnerUpdate}; +use mars_params::error::ContractError::Owner; + +use crate::helpers::{assert_err, MockEnv}; + +pub mod helpers; + +#[test] +fn owner_set_on_init() { + let mock = MockEnv::new().build().unwrap(); + let owner = mock.query_owner(); + assert_eq!("owner", &owner.to_string()) +} + +#[test] +fn only_owner_can_execute_updates() { + let mut mock = MockEnv::new().build().unwrap(); + let bad_guy = Addr::unchecked("doctor_otto_983"); + let res = mock.update_owner( + &bad_guy, + OwnerUpdate::ProposeNewOwner { + proposed: bad_guy.to_string(), + }, + ); + assert_err(res, Owner(OwnerError::NotOwner {})); +} + +#[test] +fn owner_can_execute_updates() { + let mut mock = MockEnv::new().build().unwrap(); + + let ownership = mock.query_ownership(); + assert_eq!(ownership.emergency_owner, None); + + let em_owner = "miles_morales".to_string(); + mock.update_owner( + &mock.query_owner(), + OwnerUpdate::SetEmergencyOwner { + emergency_owner: em_owner.clone(), + }, + ) + .unwrap(); + + let ownership = mock.query_ownership(); + assert_eq!(ownership.emergency_owner, Some(em_owner)); +} diff --git a/contracts/params/tests/test_update_asset_params.rs b/contracts/params/tests/test_update_asset_params.rs new file mode 100644 index 000000000..d5cb781d3 --- /dev/null +++ b/contracts/params/tests/test_update_asset_params.rs @@ -0,0 +1,275 @@ +use cosmwasm_std::Addr; +use mars_owner::OwnerError; +use mars_params::{error::ContractError::Owner, types::AssetParamsUpdate}; + +use crate::helpers::{assert_contents_equal, assert_err, default_asset_params, MockEnv}; + +pub mod helpers; + +#[test] +fn initial_state_of_params() { + let mock = MockEnv::new().build().unwrap(); + let params = mock.query_all_asset_params(None, None); + assert!(params.is_empty()); +} + +#[test] +fn only_owner_can_update_asset_params() { + let mut mock = MockEnv::new().build().unwrap(); + let bad_guy = Addr::unchecked("doctor_otto_983"); + let res = mock.update_asset_params( + &bad_guy, + AssetParamsUpdate::AddOrUpdate { + denom: "xyz".to_string(), + params: default_asset_params(), + }, + ); + assert_err(res, Owner(OwnerError::NotOwner {})); +} + +#[test] +fn initializing_asset_param() { + let mut mock = MockEnv::new().build().unwrap(); + let owner = mock.query_owner(); + let denom0 = "atom".to_string(); + let denom1 = "osmo".to_string(); + + let params = default_asset_params(); + + mock.update_asset_params( + &owner, + AssetParamsUpdate::AddOrUpdate { + denom: denom0.to_string(), + params: params.clone(), + }, + ) + .unwrap(); + + let all_asset_params = mock.query_all_asset_params(None, None); + assert_eq!(1, all_asset_params.len()); + let res = all_asset_params.first().unwrap(); + assert_eq!(&denom0, &res.denom); + + // Validate config set correctly + assert_eq!(params.rover.whitelisted, res.params.rover.whitelisted); + assert_eq!(params.red_bank.deposit_enabled, res.params.red_bank.deposit_enabled); + assert_eq!(params.red_bank.borrow_enabled, res.params.red_bank.borrow_enabled); + assert_eq!(params.max_loan_to_value, res.params.max_loan_to_value); + assert_eq!(params.liquidation_threshold, res.params.liquidation_threshold); + assert_eq!(params.liquidation_bonus, res.params.liquidation_bonus); + assert_eq!(params.red_bank.deposit_cap, res.params.red_bank.deposit_cap); + + mock.update_asset_params( + &owner, + AssetParamsUpdate::AddOrUpdate { + denom: denom1.to_string(), + params: default_asset_params(), + }, + ) + .unwrap(); + + let asset_params = mock.query_all_asset_params(None, None); + assert_eq!(2, asset_params.len()); + assert_eq!(&denom1, &asset_params.get(1).unwrap().denom); +} + +#[test] +fn add_same_denom_multiple_times() { + let mut mock = MockEnv::new().build().unwrap(); + let owner = mock.query_owner(); + let denom0 = "atom".to_string(); + + mock.update_asset_params( + &owner, + AssetParamsUpdate::AddOrUpdate { + denom: denom0.to_string(), + params: default_asset_params(), + }, + ) + .unwrap(); + mock.update_asset_params( + &owner, + AssetParamsUpdate::AddOrUpdate { + denom: denom0.to_string(), + params: default_asset_params(), + }, + ) + .unwrap(); + mock.update_asset_params( + &owner, + AssetParamsUpdate::AddOrUpdate { + denom: denom0.to_string(), + params: default_asset_params(), + }, + ) + .unwrap(); + mock.update_asset_params( + &owner, + AssetParamsUpdate::AddOrUpdate { + denom: denom0.to_string(), + params: default_asset_params(), + }, + ) + .unwrap(); + + let asset_params = mock.query_all_asset_params(None, None); + assert_eq!(1, asset_params.len()); + assert_eq!(denom0, asset_params.first().unwrap().denom); +} + +#[test] +fn update_existing_asset_params() { + let mut mock = MockEnv::new().build().unwrap(); + let owner = mock.query_owner(); + let denom0 = "atom".to_string(); + + let mut params = default_asset_params(); + + mock.update_asset_params( + &owner, + AssetParamsUpdate::AddOrUpdate { + denom: denom0.to_string(), + params: params.clone(), + }, + ) + .unwrap(); + + let asset_params = mock.query_asset_params(&denom0); + assert!(!asset_params.rover.whitelisted); + assert!(asset_params.red_bank.deposit_enabled); + + params.rover.whitelisted = true; + params.red_bank.deposit_enabled = false; + + mock.update_asset_params( + &owner, + AssetParamsUpdate::AddOrUpdate { + denom: denom0.to_string(), + params, + }, + ) + .unwrap(); + + let all_asset_params = mock.query_all_asset_params(None, None); + assert_eq!(1, all_asset_params.len()); + + let asset_params = mock.query_asset_params(&denom0); + assert!(asset_params.rover.whitelisted); + assert!(!asset_params.red_bank.deposit_enabled); +} + +#[test] +fn removing_from_asset_params() { + let mut mock = MockEnv::new().build().unwrap(); + let owner = mock.query_owner(); + let denom0 = "atom".to_string(); + let denom1 = "osmo".to_string(); + let denom2 = "juno".to_string(); + + mock.update_asset_params( + &owner, + AssetParamsUpdate::AddOrUpdate { + denom: denom0, + params: default_asset_params(), + }, + ) + .unwrap(); + mock.update_asset_params( + &owner, + AssetParamsUpdate::AddOrUpdate { + denom: denom1, + params: default_asset_params(), + }, + ) + .unwrap(); + mock.update_asset_params( + &owner, + AssetParamsUpdate::AddOrUpdate { + denom: denom2, + params: default_asset_params(), + }, + ) + .unwrap(); + + let asset_params = mock.query_all_asset_params(None, None); + assert_eq!(3, asset_params.len()); +} + +#[test] +fn pagination_query() { + let mut mock = MockEnv::new().build().unwrap(); + let owner = mock.query_owner(); + let denom0 = "atom".to_string(); + let denom1 = "osmo".to_string(); + let denom2 = "juno".to_string(); + let denom3 = "mars".to_string(); + let denom4 = "ion".to_string(); + let denom5 = "usdc".to_string(); + + mock.update_asset_params( + &owner, + AssetParamsUpdate::AddOrUpdate { + denom: denom0.to_string(), + params: default_asset_params(), + }, + ) + .unwrap(); + mock.update_asset_params( + &owner, + AssetParamsUpdate::AddOrUpdate { + denom: denom1.to_string(), + params: default_asset_params(), + }, + ) + .unwrap(); + mock.update_asset_params( + &owner, + AssetParamsUpdate::AddOrUpdate { + denom: denom2.to_string(), + params: default_asset_params(), + }, + ) + .unwrap(); + mock.update_asset_params( + &owner, + AssetParamsUpdate::AddOrUpdate { + denom: denom3.to_string(), + params: default_asset_params(), + }, + ) + .unwrap(); + mock.update_asset_params( + &owner, + AssetParamsUpdate::AddOrUpdate { + denom: denom4.to_string(), + params: default_asset_params(), + }, + ) + .unwrap(); + mock.update_asset_params( + &owner, + AssetParamsUpdate::AddOrUpdate { + denom: denom5.to_string(), + params: default_asset_params(), + }, + ) + .unwrap(); + + let asset_params_a = mock.query_all_asset_params(None, Some(2)); + let asset_params_b = + mock.query_all_asset_params(asset_params_a.last().map(|r| r.denom.clone()), Some(2)); + let asset_params_c = + mock.query_all_asset_params(asset_params_b.last().map(|r| r.denom.clone()), None); + + let combined = asset_params_a + .iter() + .cloned() + .chain(asset_params_b.iter().cloned()) + .chain(asset_params_c.iter().cloned()) + .map(|r| r.denom) + .collect::>(); + + assert_eq!(6, combined.len()); + + assert_contents_equal(&[denom0, denom1, denom2, denom3, denom4, denom5], &combined) +} diff --git a/contracts/params/tests/test_vault_validation.rs b/contracts/params/tests/test_vault_validation.rs new file mode 100644 index 000000000..ea1261896 --- /dev/null +++ b/contracts/params/tests/test_vault_validation.rs @@ -0,0 +1,99 @@ +use std::str::FromStr; + +use cosmwasm_std::{Decimal, StdError::GenericErr}; +use mars_params::{ + error::ContractError::{Std, Validation}, + types::VaultConfigUpdate, +}; +use mars_utils::error::ValidationError::InvalidParam; + +use crate::helpers::{assert_err, default_vault_config, MockEnv}; + +pub mod helpers; + +#[test] +fn vault_addr_must_be_valid() { + let mut mock = MockEnv::new().build().unwrap(); + + let res = mock.update_vault_config( + &mock.query_owner(), + VaultConfigUpdate::AddOrUpdate { + addr: "%".to_string(), + config: default_vault_config(), + }, + ); + assert_err( + res, + Std(GenericErr { msg: "Invalid input: human address too short for this mock implementation (must be >= 3).".to_string() }), + ); +} + +#[test] +fn vault_max_ltv_less_than_or_equal_to_one() { + let mut mock = MockEnv::new().build().unwrap(); + let mut config = default_vault_config(); + config.max_loan_to_value = Decimal::from_str("1.1235").unwrap(); + + let res = mock.update_vault_config( + &mock.query_owner(), + VaultConfigUpdate::AddOrUpdate { + addr: "vault_xyz".to_string(), + config, + }, + ); + assert_err( + res, + Validation(InvalidParam { + param_name: "max_loan_to_value".to_string(), + invalid_value: "1.1235".to_string(), + predicate: "<= 1".to_string(), + }), + ); +} + +#[test] +fn vault_liquidation_threshold_less_than_or_equal_to_one() { + let mut mock = MockEnv::new().build().unwrap(); + let mut config = default_vault_config(); + config.liquidation_threshold = Decimal::from_str("1.1235").unwrap(); + + let res = mock.update_vault_config( + &mock.query_owner(), + VaultConfigUpdate::AddOrUpdate { + addr: "vault_xyz".to_string(), + config, + }, + ); + assert_err( + res, + Validation(InvalidParam { + param_name: "liquidation_threshold".to_string(), + invalid_value: "1.1235".to_string(), + predicate: "<= 1".to_string(), + }), + ); +} + +#[test] +fn vault_liq_threshold_gt_max_ltv() { + let mut mock = MockEnv::new().build().unwrap(); + let mut config = default_vault_config(); + config.liquidation_threshold = Decimal::from_str("0.5").unwrap(); + config.max_loan_to_value = Decimal::from_str("0.6").unwrap(); + + let res = mock.update_vault_config( + &mock.query_owner(), + VaultConfigUpdate::AddOrUpdate { + addr: "vault_xyz".to_string(), + config, + }, + ); + assert_err( + res, + Validation(InvalidParam { + param_name: "liquidation_threshold".to_string(), + invalid_value: "0.5".to_string(), + predicate: "> 0.6 (max LTV)".to_string(), + }), + ); +} diff --git a/contracts/params/tests/test_vaults.rs b/contracts/params/tests/test_vaults.rs new file mode 100644 index 000000000..ba1fec053 --- /dev/null +++ b/contracts/params/tests/test_vaults.rs @@ -0,0 +1,304 @@ +use std::str::FromStr; + +use cosmwasm_std::{Addr, Decimal}; +use mars_owner::OwnerError; +use mars_params::{error::ContractError::Owner, types::VaultConfigUpdate}; + +use crate::helpers::{assert_contents_equal, assert_err, default_vault_config, MockEnv}; + +pub mod helpers; + +#[test] +fn initial_state_of_vault_configs() { + let mock = MockEnv::new().build().unwrap(); + let configs = mock.query_all_vault_configs(None, None); + assert!(configs.is_empty()); +} + +#[test] +fn only_owner_can_update_vault_configs() { + let mut mock = MockEnv::new().build().unwrap(); + let bad_guy = Addr::unchecked("doctor_otto_983"); + let res = mock.update_vault_config( + &bad_guy, + VaultConfigUpdate::Remove { + addr: "xyz".to_string(), + }, + ); + assert_err(res, Owner(OwnerError::NotOwner {})); +} + +#[test] +fn initializing_asset_param() { + let mut mock = MockEnv::new().build().unwrap(); + let owner = mock.query_owner(); + let vault0 = "vault_addr_0".to_string(); + let vault1 = "vault_addr_1".to_string(); + + let config = default_vault_config(); + + mock.update_vault_config( + &owner, + VaultConfigUpdate::AddOrUpdate { + addr: vault0.clone(), + config: config.clone(), + }, + ) + .unwrap(); + + let all_vault_configs = mock.query_all_vault_configs(None, None); + assert_eq!(1, all_vault_configs.len()); + let res = all_vault_configs.first().unwrap(); + assert_eq!(&vault0, &res.addr); + + // Validate config set correctly + assert_eq!(config.max_loan_to_value, res.config.max_loan_to_value); + assert_eq!(config.liquidation_threshold, res.config.liquidation_threshold); + assert_eq!(config.deposit_cap.denom, res.config.deposit_cap.denom); + assert_eq!(config.deposit_cap.amount, res.config.deposit_cap.amount); + assert_eq!(config.whitelisted, res.config.whitelisted); + + mock.update_vault_config( + &owner, + VaultConfigUpdate::AddOrUpdate { + addr: vault1.clone(), + config, + }, + ) + .unwrap(); + + let vault_configs = mock.query_all_vault_configs(None, None); + assert_eq!(2, vault_configs.len()); + assert_eq!(&vault1, &vault_configs.get(1).unwrap().addr); +} + +#[test] +fn add_same_vault_multiple_times() { + let mut mock = MockEnv::new().build().unwrap(); + let owner = mock.query_owner(); + let vault0 = "vault_addr_0".to_string(); + + mock.update_vault_config( + &owner, + VaultConfigUpdate::AddOrUpdate { + addr: vault0.to_string(), + config: default_vault_config(), + }, + ) + .unwrap(); + mock.update_vault_config( + &owner, + VaultConfigUpdate::AddOrUpdate { + addr: vault0.to_string(), + config: default_vault_config(), + }, + ) + .unwrap(); + mock.update_vault_config( + &owner, + VaultConfigUpdate::AddOrUpdate { + addr: vault0.to_string(), + config: default_vault_config(), + }, + ) + .unwrap(); + mock.update_vault_config( + &owner, + VaultConfigUpdate::AddOrUpdate { + addr: vault0.to_string(), + config: default_vault_config(), + }, + ) + .unwrap(); + + let vault_configs = mock.query_all_vault_configs(None, None); + assert_eq!(1, vault_configs.len()); + assert_eq!(vault0, vault_configs.first().unwrap().addr); +} + +#[test] +fn update_existing_vault_configs() { + let mut mock = MockEnv::new().build().unwrap(); + let owner = mock.query_owner(); + let vault0 = "vault_addr_0".to_string(); + + let mut config = default_vault_config(); + + mock.update_vault_config( + &owner, + VaultConfigUpdate::AddOrUpdate { + addr: vault0.to_string(), + config: config.clone(), + }, + ) + .unwrap(); + + let vault_config = mock.query_vault_config(&vault0); + assert!(vault_config.whitelisted); + assert_eq!(vault_config.max_loan_to_value, Decimal::from_str("0.47").unwrap()); + + let new_max_ltv = Decimal::from_str("0.39").unwrap(); + config.whitelisted = false; + config.max_loan_to_value = new_max_ltv; + + mock.update_vault_config( + &owner, + VaultConfigUpdate::AddOrUpdate { + addr: vault0.to_string(), + config, + }, + ) + .unwrap(); + + let all_vault_configs = mock.query_all_vault_configs(None, None); + assert_eq!(1, all_vault_configs.len()); + + let vault_config = mock.query_vault_config(&vault0); + assert!(!vault_config.whitelisted); + assert_eq!(vault_config.max_loan_to_value, new_max_ltv); +} + +#[test] +fn removing_from_vault_configs() { + let mut mock = MockEnv::new().build().unwrap(); + let owner = mock.query_owner(); + let vault0 = "vault_addr_0".to_string(); + let vault1 = "vault_addr_1".to_string(); + let vault2 = "vault_addr_2".to_string(); + + mock.update_vault_config( + &owner, + VaultConfigUpdate::AddOrUpdate { + addr: vault0.to_string(), + config: default_vault_config(), + }, + ) + .unwrap(); + mock.update_vault_config( + &owner, + VaultConfigUpdate::AddOrUpdate { + addr: vault1.to_string(), + config: default_vault_config(), + }, + ) + .unwrap(); + mock.update_vault_config( + &owner, + VaultConfigUpdate::AddOrUpdate { + addr: vault2.to_string(), + config: default_vault_config(), + }, + ) + .unwrap(); + + let vault_configs = mock.query_all_vault_configs(None, None); + assert_eq!(3, vault_configs.len()); + + mock.update_vault_config( + &owner, + VaultConfigUpdate::Remove { + addr: vault1, + }, + ) + .unwrap(); + let vault_configs = mock.query_all_vault_configs(None, None); + assert_eq!(2, vault_configs.len()); + assert_eq!(&vault0, &vault_configs.first().unwrap().addr); + assert_eq!(&vault2, &vault_configs.get(1).unwrap().addr); + + mock.update_vault_config( + &owner, + VaultConfigUpdate::Remove { + addr: vault0, + }, + ) + .unwrap(); + mock.update_vault_config( + &owner, + VaultConfigUpdate::Remove { + addr: vault2, + }, + ) + .unwrap(); + let vault_configs = mock.query_all_vault_configs(None, None); + assert!(vault_configs.is_empty()); +} + +#[test] +fn pagination_query() { + let mut mock = MockEnv::new().build().unwrap(); + let owner = mock.query_owner(); + let vault0 = "vault_addr_0".to_string(); + let vault1 = "vault_addr_1".to_string(); + let vault2 = "vault_addr_2".to_string(); + let vault3 = "vault_addr_3".to_string(); + let vault4 = "vault_addr_4".to_string(); + let vault5 = "vault_addr_5".to_string(); + + mock.update_vault_config( + &owner, + VaultConfigUpdate::AddOrUpdate { + addr: vault0.to_string(), + config: default_vault_config(), + }, + ) + .unwrap(); + mock.update_vault_config( + &owner, + VaultConfigUpdate::AddOrUpdate { + addr: vault1.to_string(), + config: default_vault_config(), + }, + ) + .unwrap(); + mock.update_vault_config( + &owner, + VaultConfigUpdate::AddOrUpdate { + addr: vault2.to_string(), + config: default_vault_config(), + }, + ) + .unwrap(); + mock.update_vault_config( + &owner, + VaultConfigUpdate::AddOrUpdate { + addr: vault3.to_string(), + config: default_vault_config(), + }, + ) + .unwrap(); + mock.update_vault_config( + &owner, + VaultConfigUpdate::AddOrUpdate { + addr: vault4.to_string(), + config: default_vault_config(), + }, + ) + .unwrap(); + mock.update_vault_config( + &owner, + VaultConfigUpdate::AddOrUpdate { + addr: vault5.to_string(), + config: default_vault_config(), + }, + ) + .unwrap(); + + let vault_configs_a = mock.query_all_vault_configs(None, Some(2)); + let vault_configs_b = + mock.query_all_vault_configs(vault_configs_a.last().map(|r| r.addr.to_string()), Some(2)); + let vault_configs_c = + mock.query_all_vault_configs(vault_configs_b.last().map(|r| r.addr.to_string()), None); + + let combined = vault_configs_a + .iter() + .cloned() + .chain(vault_configs_b.iter().cloned()) + .chain(vault_configs_c.iter().cloned()) + .map(|r| r.addr.to_string()) + .collect::>(); + + assert_eq!(6, combined.len()); + + assert_contents_equal(&[vault0, vault1, vault2, vault3, vault4, vault5], &combined) +} diff --git a/contracts/swapper/base/Cargo.toml b/contracts/swapper/base/Cargo.toml new file mode 100644 index 000000000..97804a11b --- /dev/null +++ b/contracts/swapper/base/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "mars-swapper-base" +version = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +edition = { workspace = true } +repository = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } +keywords = { workspace = true } + +[lib] +crate-type = ["cdylib", "rlib"] + +[features] +# for quicker tests, cargo test --lib +# for more explicit tests, cargo test --features=backtraces +backtraces = ["cosmwasm-std/backtraces"] +library = [] + +[dependencies] +cosmwasm-schema = { workspace = true } +cosmwasm-std = { workspace = true } +cw-paginate = { workspace = true } +cw-storage-plus = { workspace = true } +mars-owner = { workspace = true } +schemars = { workspace = true } +serde = { workspace = true } +thiserror = { workspace = true } +mars-swapper = { workspace = true } diff --git a/contracts/swapper/base/examples/schema.rs b/contracts/swapper/base/examples/schema.rs new file mode 100644 index 000000000..a98b255fd --- /dev/null +++ b/contracts/swapper/base/examples/schema.rs @@ -0,0 +1,11 @@ +use cosmwasm_schema::write_api; +use cosmwasm_std::Empty; +use mars_swapper::msgs::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +fn main() { + write_api! { + instantiate: InstantiateMsg, + query: QueryMsg, + execute: ExecuteMsg, + } +} diff --git a/contracts/swapper/base/src/contract.rs b/contracts/swapper/base/src/contract.rs new file mode 100644 index 000000000..ec6c402ec --- /dev/null +++ b/contracts/swapper/base/src/contract.rs @@ -0,0 +1,252 @@ +use std::marker::PhantomData; + +use cosmwasm_std::{ + to_binary, Addr, BankMsg, Binary, Coin, CosmosMsg, CustomMsg, CustomQuery, Decimal, Deps, + DepsMut, Env, MessageInfo, Response, WasmMsg, +}; +use cw_paginate::paginate_map; +use cw_storage_plus::{Bound, Map}; +use mars_owner::{Owner, OwnerInit::SetInitialOwner, OwnerUpdate}; +use mars_swapper::msgs::{ + EstimateExactInSwapResponse, ExecuteMsg, InstantiateMsg, QueryMsg, RouteResponse, + RoutesResponse, +}; + +use crate::{ContractError, ContractResult, Route}; + +pub struct SwapBase<'a, Q, M, R> +where + Q: CustomQuery, + M: CustomMsg, + R: Route, +{ + /// The contract's owner who has special rights to update contract + pub owner: Owner<'a>, + /// The trade route for each pair of input/output assets + pub routes: Map<'a, (String, String), R>, + /// Phantom data holds generics + pub custom_query: PhantomData, + pub custom_message: PhantomData, +} + +impl<'a, Q, M, R> Default for SwapBase<'a, Q, M, R> +where + Q: CustomQuery, + M: CustomMsg, + R: Route, +{ + fn default() -> Self { + Self { + owner: Owner::new("owner"), + routes: Map::new("routes"), + custom_query: PhantomData, + custom_message: PhantomData, + } + } +} + +impl<'a, Q, M, R> SwapBase<'a, Q, M, R> +where + Q: CustomQuery, + M: CustomMsg, + R: Route, +{ + pub fn instantiate( + &self, + deps: DepsMut, + msg: InstantiateMsg, + ) -> ContractResult> { + self.owner.initialize( + deps.storage, + deps.api, + SetInitialOwner { + owner: msg.owner, + }, + )?; + Ok(Response::default()) + } + + pub fn execute( + &self, + deps: DepsMut, + env: Env, + info: MessageInfo, + msg: ExecuteMsg, + ) -> ContractResult> { + match msg { + ExecuteMsg::UpdateOwner(update) => self.update_owner(deps, info, update), + ExecuteMsg::SetRoute { + denom_in, + denom_out, + route, + } => self.set_route(deps, info.sender, denom_in, denom_out, route), + ExecuteMsg::SwapExactIn { + coin_in, + denom_out, + slippage, + } => self.swap_exact_in(deps, env, info, coin_in, denom_out, slippage), + ExecuteMsg::TransferResult { + recipient, + denom_in, + denom_out, + } => self.transfer_result(deps, env, info, recipient, denom_in, denom_out), + } + } + + pub fn query(&self, deps: Deps, env: Env, msg: QueryMsg) -> ContractResult { + let res = match msg { + QueryMsg::Owner {} => to_binary(&self.owner.query(deps.storage)?), + QueryMsg::EstimateExactInSwap { + coin_in, + denom_out, + } => to_binary(&self.estimate_exact_in_swap(deps, env, coin_in, denom_out)?), + QueryMsg::Route { + denom_in, + denom_out, + } => to_binary(&self.query_route(deps, denom_in, denom_out)?), + QueryMsg::Routes { + start_after, + limit, + } => to_binary(&self.query_routes(deps, start_after, limit)?), + }; + res.map_err(Into::into) + } + + fn query_route( + &self, + deps: Deps, + denom_in: String, + denom_out: String, + ) -> ContractResult> { + Ok(RouteResponse { + denom_in: denom_in.clone(), + denom_out: denom_out.clone(), + route: self.routes.load(deps.storage, (denom_in, denom_out))?, + }) + } + + fn query_routes( + &self, + deps: Deps, + start_after: Option<(String, String)>, + limit: Option, + ) -> ContractResult> { + let start = start_after.map(Bound::exclusive); + paginate_map(&self.routes, deps.storage, start, limit, |(denom_in, denom_out), route| { + Ok(RouteResponse { + denom_in, + denom_out, + route, + }) + }) + } + + fn estimate_exact_in_swap( + &self, + deps: Deps, + env: Env, + coin_in: Coin, + denom_out: String, + ) -> ContractResult { + let route = self.routes.load(deps.storage, (coin_in.denom.clone(), denom_out))?; + route.estimate_exact_in_swap(&deps.querier, &env, &coin_in) + } + + fn swap_exact_in( + &self, + deps: DepsMut, + env: Env, + info: MessageInfo, + coin_in: Coin, + denom_out: String, + slippage: Decimal, + ) -> ContractResult> { + let swap_msg = self + .routes + .load(deps.storage, (coin_in.denom.clone(), denom_out.clone()))? + .build_exact_in_swap_msg(&deps.querier, &env, &coin_in, slippage)?; + + // Check balance of result of swapper and send back result to sender + let transfer_msg = CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: env.contract.address.to_string(), + funds: vec![], + msg: to_binary(&ExecuteMsg::::TransferResult { + recipient: info.sender, + denom_in: coin_in.denom.clone(), + denom_out: denom_out.clone(), + })?, + }); + + Ok(Response::new() + .add_message(swap_msg) + .add_message(transfer_msg) + .add_attribute("action", "swap_fn") + .add_attribute("denom_in", coin_in.denom) + .add_attribute("amount_in", coin_in.amount) + .add_attribute("denom_out", denom_out) + .add_attribute("slippage", slippage.to_string())) + } + + fn transfer_result( + &self, + deps: DepsMut, + env: Env, + info: MessageInfo, + recipient: Addr, + denom_in: String, + denom_out: String, + ) -> ContractResult> { + // Internal callback only + if info.sender != env.contract.address { + return Err(ContractError::Unauthorized { + user: info.sender.to_string(), + action: "transfer result".to_string(), + }); + }; + + let denom_in_balance = + deps.querier.query_balance(env.contract.address.clone(), denom_in)?; + let denom_out_balance = deps.querier.query_balance(env.contract.address, denom_out)?; + + let transfer_msg = CosmosMsg::Bank(BankMsg::Send { + to_address: recipient.to_string(), + amount: vec![denom_in_balance, denom_out_balance] + .iter() + .filter(|c| !c.amount.is_zero()) + .cloned() + .collect(), + }); + + Ok(Response::new().add_attribute("action", "transfer_result").add_message(transfer_msg)) + } + + fn set_route( + &self, + deps: DepsMut, + sender: Addr, + denom_in: String, + denom_out: String, + route: R, + ) -> ContractResult> { + self.owner.assert_owner(deps.storage, &sender)?; + + route.validate(&deps.querier, &denom_in, &denom_out)?; + + self.routes.save(deps.storage, (denom_in.clone(), denom_out.clone()), &route)?; + + Ok(Response::new() + .add_attribute("action", "rover/base/set_route") + .add_attribute("denom_in", denom_in) + .add_attribute("denom_out", denom_out) + .add_attribute("route", route.to_string())) + } + + fn update_owner( + &self, + deps: DepsMut, + info: MessageInfo, + update: OwnerUpdate, + ) -> ContractResult> { + Ok(self.owner.update(deps, info, update)?) + } +} diff --git a/contracts/swapper/base/src/error.rs b/contracts/swapper/base/src/error.rs new file mode 100644 index 000000000..8156d5edc --- /dev/null +++ b/contracts/swapper/base/src/error.rs @@ -0,0 +1,40 @@ +use cosmwasm_std::{CheckedMultiplyRatioError, DecimalRangeExceeded, OverflowError, StdError}; +use mars_owner::OwnerError; +use thiserror::Error; + +#[derive(Error, Debug, PartialEq)] +pub enum ContractError { + #[error("{0}")] + OwnerError(#[from] OwnerError), + + #[error("{0}")] + DecimalRangeExceeded(#[from] DecimalRangeExceeded), + + #[error("Invalid route: {reason}")] + InvalidRoute { + reason: String, + }, + + #[error("{0}")] + Overflow(#[from] OverflowError), + + #[error("{0}")] + CheckedMultiplyRatio(#[from] CheckedMultiplyRatioError), + + #[error("{denom_a:?}-{denom_b:?} is not an available pool")] + PoolNotFound { + denom_a: String, + denom_b: String, + }, + + #[error("{0}")] + Std(#[from] StdError), + + #[error("{user:?} is not authorized to {action:?}")] + Unauthorized { + user: String, + action: String, + }, +} + +pub type ContractResult = Result; diff --git a/contracts/swapper/base/src/lib.rs b/contracts/swapper/base/src/lib.rs new file mode 100644 index 000000000..d0ca995d1 --- /dev/null +++ b/contracts/swapper/base/src/lib.rs @@ -0,0 +1,7 @@ +mod contract; +mod error; +mod traits; + +pub use contract::*; +pub use error::*; +pub use traits::*; diff --git a/contracts/swapper/base/src/traits.rs b/contracts/swapper/base/src/traits.rs new file mode 100644 index 000000000..aa9a74d64 --- /dev/null +++ b/contracts/swapper/base/src/traits.rs @@ -0,0 +1,40 @@ +use std::fmt::{Debug, Display}; + +use cosmwasm_std::{Coin, CosmosMsg, CustomMsg, CustomQuery, Decimal, Env, QuerierWrapper}; +use mars_swapper::msgs::EstimateExactInSwapResponse; +use schemars::JsonSchema; +use serde::{de::DeserializeOwned, Serialize}; + +use crate::ContractResult; + +pub trait Route: + Serialize + DeserializeOwned + Clone + Debug + Display + PartialEq + JsonSchema +where + M: CustomMsg, + Q: CustomQuery, +{ + /// Determine whether the route is valid, given a pair of input and output denoms + fn validate( + &self, + querier: &QuerierWrapper, + denom_in: &str, + denom_out: &str, + ) -> ContractResult<()>; + + /// Build a message for executing the trade, given an input denom and amount + fn build_exact_in_swap_msg( + &self, + querier: &QuerierWrapper, + env: &Env, + coin_in: &Coin, + slippage: Decimal, + ) -> ContractResult>; + + /// Query to get the estimate result of a swap + fn estimate_exact_in_swap( + &self, + querier: &QuerierWrapper, + env: &Env, + coin_in: &Coin, + ) -> ContractResult; +} diff --git a/contracts/swapper/mock/Cargo.toml b/contracts/swapper/mock/Cargo.toml new file mode 100644 index 000000000..1c613b509 --- /dev/null +++ b/contracts/swapper/mock/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "mars-swapper-mock" +version = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +edition = { workspace = true } +repository = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } +keywords = { workspace = true } + +[lib] +crate-type = ["cdylib", "rlib"] + +[features] +# for quicker tests, cargo test --lib +# for more explicit tests, cargo test --features=backtraces +backtraces = ["cosmwasm-std/backtraces"] +library = [] + +[dependencies] +cosmwasm-std = { workspace = true } +cw-storage-plus = { workspace = true } +thiserror = { workspace = true } +mars-swapper = { workspace = true } + +[dev-dependencies] +anyhow = { workspace = true } +cw-multi-test = { workspace = true } diff --git a/contracts/swapper/mock/src/contract.rs b/contracts/swapper/mock/src/contract.rs new file mode 100644 index 000000000..902c627b7 --- /dev/null +++ b/contracts/swapper/mock/src/contract.rs @@ -0,0 +1,91 @@ +use cosmwasm_std::{ + coins, to_binary, BankMsg, Binary, Coin, CosmosMsg, Decimal, Deps, DepsMut, Empty, Env, + MessageInfo, Response, StdError, StdResult, Uint128, +}; +use mars_swapper::msgs::{EstimateExactInSwapResponse, ExecuteMsg, InstantiateMsg, QueryMsg}; + +pub const MOCK_SWAP_RESULT: Uint128 = Uint128::new(1337); + +#[cfg_attr(not(feature = "library"), cosmwasm_std::entry_point)] +pub fn instantiate( + _deps: DepsMut, + _env: Env, + _info: MessageInfo, + _msg: InstantiateMsg, +) -> StdResult { + Ok(Response::default()) +} + +#[cfg_attr(not(feature = "library"), cosmwasm_std::entry_point)] +pub fn execute( + deps: DepsMut, + env: Env, + info: MessageInfo, + msg: ExecuteMsg, +) -> StdResult { + match msg { + ExecuteMsg::UpdateOwner(_) => unimplemented!("not implemented"), + ExecuteMsg::SetRoute { + .. + } => unimplemented!("not implemented"), + ExecuteMsg::TransferResult { + .. + } => unimplemented!("not implemented"), + ExecuteMsg::SwapExactIn { + coin_in, + denom_out, + slippage, + } => swap_exact_in(deps, env, info, coin_in, denom_out, slippage), + } +} + +#[cfg_attr(not(feature = "library"), cosmwasm_std::entry_point)] +pub fn query(_deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { + match msg { + QueryMsg::Owner { + .. + } => unimplemented!("not implemented"), + QueryMsg::Route { + .. + } => unimplemented!("not implemented"), + QueryMsg::Routes { + .. + } => unimplemented!("not implemented"), + QueryMsg::EstimateExactInSwap { + .. + } => to_binary(&estimate_exact_in_swap()), + } +} + +pub fn estimate_exact_in_swap() -> EstimateExactInSwapResponse { + EstimateExactInSwapResponse { + amount: MOCK_SWAP_RESULT, + } +} + +pub fn swap_exact_in( + deps: DepsMut, + env: Env, + info: MessageInfo, + coin_in: Coin, + denom_out: String, + _slippage: Decimal, +) -> StdResult { + let denom_in_balance = deps.querier.query_balance(env.contract.address, coin_in.denom)?; + if denom_in_balance.amount < coin_in.amount { + return Err(StdError::generic_err("Did not send funds")); + } + + if denom_out != "uosmo" { + return Err(StdError::generic_err("Mock swapper can only have uosmo as denom out")); + } + + // This is dependent on the mock env to pre-fund this contract with uosmo coins + // simulating a swap has taken place + let transfer_msg = CosmosMsg::Bank(BankMsg::Send { + to_address: info.sender.to_string(), + amount: coins(MOCK_SWAP_RESULT.u128(), denom_out), + }); + + Ok(Response::new().add_attribute("action", "transfer_result").add_message(transfer_msg)) +} diff --git a/contracts/swapper/mock/src/lib.rs b/contracts/swapper/mock/src/lib.rs new file mode 100644 index 000000000..2943dbb50 --- /dev/null +++ b/contracts/swapper/mock/src/lib.rs @@ -0,0 +1 @@ +pub mod contract; diff --git a/contracts/swapper/osmosis/Cargo.toml b/contracts/swapper/osmosis/Cargo.toml new file mode 100644 index 000000000..6110ee1ef --- /dev/null +++ b/contracts/swapper/osmosis/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "mars-swapper-osmosis" +version = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +edition = { workspace = true } +repository = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } +keywords = { workspace = true } + +[lib] +crate-type = ["cdylib", "rlib"] + +[features] +# for quicker tests, cargo test --lib +# for more explicit tests, cargo test --features=backtraces +backtraces = ["cosmwasm-std/backtraces"] +library = [] + +[dependencies] +cosmwasm-schema = { workspace = true } +cosmwasm-std = { workspace = true } +cw2 = { workspace = true } +cw-storage-plus = { workspace = true } +mars-osmosis = { workspace = true } +mars-owner = { workspace = true } +mars-swapper-base = { workspace = true } +osmosis-std = { workspace = true } +schemars = { workspace = true } +thiserror = { workspace = true } +mars-swapper = { workspace = true } + +[dev-dependencies] +anyhow = { workspace = true } +osmosis-test-tube = { workspace = true } diff --git a/contracts/swapper/osmosis/examples/schema.rs b/contracts/swapper/osmosis/examples/schema.rs new file mode 100644 index 000000000..c9d47e062 --- /dev/null +++ b/contracts/swapper/osmosis/examples/schema.rs @@ -0,0 +1,11 @@ +use cosmwasm_schema::write_api; +use mars_swapper::msgs::{ExecuteMsg, InstantiateMsg, QueryMsg}; +use mars_swapper_osmosis::route::OsmosisRoute; + +fn main() { + write_api! { + instantiate: InstantiateMsg, + execute: ExecuteMsg, + query: QueryMsg, + } +} diff --git a/contracts/swapper/osmosis/src/contract.rs b/contracts/swapper/osmosis/src/contract.rs new file mode 100644 index 000000000..85b34afba --- /dev/null +++ b/contracts/swapper/osmosis/src/contract.rs @@ -0,0 +1,38 @@ +use cosmwasm_std::{entry_point, Binary, Deps, DepsMut, Empty, Env, MessageInfo, Response}; +use cw2::set_contract_version; +use mars_swapper::msgs::{ExecuteMsg, InstantiateMsg, QueryMsg}; +use mars_swapper_base::{ContractResult, SwapBase}; + +use crate::route::OsmosisRoute; + +/// The Osmosis swapper contract inherits logic from the base swapper contract +pub type OsmosisSwap<'a> = SwapBase<'a, Empty, Empty, OsmosisRoute>; + +const CONTRACT_NAME: &str = env!("CARGO_PKG_NAME"); +const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn instantiate( + deps: DepsMut, + _env: Env, + _info: MessageInfo, + msg: InstantiateMsg, +) -> ContractResult { + set_contract_version(deps.storage, format!("crates.io:{CONTRACT_NAME}"), CONTRACT_VERSION)?; + OsmosisSwap::default().instantiate(deps, msg) +} + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn execute( + deps: DepsMut, + env: Env, + info: MessageInfo, + msg: ExecuteMsg, +) -> ContractResult { + OsmosisSwap::default().execute(deps, env, info, msg) +} + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> ContractResult { + OsmosisSwap::default().query(deps, env, msg) +} diff --git a/contracts/swapper/osmosis/src/helpers.rs b/contracts/swapper/osmosis/src/helpers.rs new file mode 100644 index 000000000..5f09f658e --- /dev/null +++ b/contracts/swapper/osmosis/src/helpers.rs @@ -0,0 +1,18 @@ +use std::{collections::HashSet, hash::Hash}; + +use cosmwasm_std::{Decimal, Uint128}; + +/// Build a hashset from array data +pub(crate) fn hashset(data: &[T]) -> HashSet { + data.iter().cloned().collect() +} + +pub trait IntoUint128 { + fn uint128(&self) -> Uint128; +} + +impl IntoUint128 for Decimal { + fn uint128(&self) -> Uint128 { + *self * Uint128::new(1) + } +} diff --git a/contracts/swapper/osmosis/src/lib.rs b/contracts/swapper/osmosis/src/lib.rs new file mode 100644 index 000000000..fdbe29de5 --- /dev/null +++ b/contracts/swapper/osmosis/src/lib.rs @@ -0,0 +1,3 @@ +pub mod contract; +pub mod helpers; +pub mod route; diff --git a/contracts/swapper/osmosis/src/route.rs b/contracts/swapper/osmosis/src/route.rs new file mode 100644 index 000000000..f9ebb2a87 --- /dev/null +++ b/contracts/swapper/osmosis/src/route.rs @@ -0,0 +1,180 @@ +use std::fmt; + +use cosmwasm_schema::cw_serde; +use cosmwasm_std::{ + BlockInfo, Coin, CosmosMsg, Decimal, Empty, Env, Fraction, QuerierWrapper, Uint128, +}; +use mars_osmosis::helpers::{has_denom, query_arithmetic_twap_price, query_pool}; +use mars_swapper::msgs::EstimateExactInSwapResponse; +use mars_swapper_base::{ContractError, ContractResult, Route}; +use osmosis_std::types::osmosis::gamm::v1beta1::{MsgSwapExactAmountIn, SwapAmountInRoute}; + +use crate::helpers::hashset; + +/// 10 min in seconds (Risk Team recommendation) +const TWAP_WINDOW_SIZE_SECONDS: u64 = 600u64; + +#[cw_serde] +pub struct OsmosisRoute(pub Vec); + +impl fmt::Display for OsmosisRoute { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let s = self + .0 + .iter() + .map(|step| format!("{}:{}", step.pool_id, step.token_out_denom)) + .collect::>() + .join("|"); + write!(f, "{s}") + } +} + +impl Route for OsmosisRoute { + // Perform basic validation of the swap steps + fn validate( + &self, + querier: &QuerierWrapper, + denom_in: &str, + denom_out: &str, + ) -> ContractResult<()> { + let steps = &self.0; + + // there must be at least one step + if steps.is_empty() { + return Err(ContractError::InvalidRoute { + reason: "the route must contain at least one step".to_string(), + }); + } + + // for each step: + // - the pool must contain the input and output denoms + // - the output denom must not be the same as the input denom of a previous step (i.e. the route must not contain a loop) + let mut prev_denom_out = denom_in; + let mut seen_denoms = hashset(&[denom_in]); + for (i, step) in steps.iter().enumerate() { + let pool = query_pool(querier, step.pool_id)?; + + if !has_denom(prev_denom_out, &pool.pool_assets) { + return Err(ContractError::InvalidRoute { + reason: format!( + "step {}: pool {} does not contain input denom {}", + i + 1, + step.pool_id, + prev_denom_out + ), + }); + } + + if !has_denom(&step.token_out_denom, &pool.pool_assets) { + return Err(ContractError::InvalidRoute { + reason: format!( + "step {}: pool {} does not contain output denom {}", + i + 1, + step.pool_id, + &step.token_out_denom + ), + }); + } + + if seen_denoms.contains(step.token_out_denom.as_str()) { + return Err(ContractError::InvalidRoute { + reason: format!( + "route contains a loop: denom {} seen twice", + step.token_out_denom + ), + }); + } + + prev_denom_out = &step.token_out_denom; + seen_denoms.insert(&step.token_out_denom); + } + + // the route's final output denom must match the desired output denom + if prev_denom_out != denom_out { + return Err(ContractError::InvalidRoute { + reason: format!( + "the route's output denom {prev_denom_out} does not match the desired output {denom_out}", + ), + }); + } + + Ok(()) + } + + /// Build a CosmosMsg that swaps given an input denom and amount + fn build_exact_in_swap_msg( + &self, + querier: &QuerierWrapper, + env: &Env, + coin_in: &Coin, + slippage: Decimal, + ) -> ContractResult { + let steps = &self.0; + + steps.first().ok_or(ContractError::InvalidRoute { + reason: "the route must contain at least one step".to_string(), + })?; + + let out_amount = query_out_amount(querier, &env.block, coin_in, steps)?; + let min_out_amount = (Decimal::one() - slippage) * out_amount; + + let swap_msg: CosmosMsg = MsgSwapExactAmountIn { + sender: env.contract.address.to_string(), + routes: steps.to_vec(), + token_in: Some(osmosis_std::types::cosmos::base::v1beta1::Coin { + denom: coin_in.denom.clone(), + amount: coin_in.amount.to_string(), + }), + token_out_min_amount: min_out_amount.to_string(), + } + .into(); + Ok(swap_msg) + } + + fn estimate_exact_in_swap( + &self, + querier: &QuerierWrapper, + env: &Env, + coin_in: &Coin, + ) -> ContractResult { + let out_amount = query_out_amount(querier, &env.block, coin_in, &self.0)?; + Ok(EstimateExactInSwapResponse { + amount: out_amount, + }) + } +} + +/// Query how much amount of denom_out we get for denom_in. +/// +/// Example calculation: +/// If we want to swap atom to usdc and configured routes are [pool_1 (atom/osmo), pool_69 (osmo/usdc)] (no direct pool of atom/usdc): +/// 1) query pool_1 to get price for atom/osmo +/// 2) query pool_69 to get price for osmo/usdc +/// 3) atom/usdc = (price for atom/osmo) * (price for osmo/usdc) +/// 4) usdc_out_amount = (atom amount) * (price for atom/usdc) +fn query_out_amount( + querier: &QuerierWrapper, + block: &BlockInfo, + coin_in: &Coin, + steps: &[SwapAmountInRoute], +) -> ContractResult { + let start_time = block.time.seconds() - TWAP_WINDOW_SIZE_SECONDS; + + let mut price = Decimal::one(); + let mut denom_in = coin_in.denom.clone(); + for step in steps { + let step_price = query_arithmetic_twap_price( + querier, + step.pool_id, + &denom_in, + &step.token_out_denom, + start_time, + )?; + price = price.checked_mul(step_price)?; + denom_in = step.token_out_denom.clone(); + } + + let out_amount = + coin_in.amount.checked_multiply_ratio(price.numerator(), price.denominator())?; + Ok(out_amount) +} diff --git a/contracts/swapper/osmosis/tests/helpers.rs b/contracts/swapper/osmosis/tests/helpers.rs new file mode 100644 index 000000000..f32815979 --- /dev/null +++ b/contracts/swapper/osmosis/tests/helpers.rs @@ -0,0 +1,139 @@ +use std::{fmt::Display, str::FromStr}; + +use cosmwasm_std::{Coin, Decimal, Uint128}; +use mars_swapper::msgs::InstantiateMsg; +use osmosis_std::types::osmosis::gamm::v1beta1::{ + MsgSwapExactAmountIn, MsgSwapExactAmountInResponse, SwapAmountInRoute, +}; +use osmosis_test_tube::{ + cosmrs::proto::cosmos::bank::v1beta1::QueryBalanceRequest, Account, Bank, ExecuteResponse, + Gamm, OsmosisTestApp, Runner, RunnerError, SigningAccount, Wasm, +}; + +const CONTRACT_NAME: &str = env!("CARGO_PKG_NAME"); + +pub fn wasm_file() -> String { + let artifacts_dir = + std::env::var("ARTIFACTS_DIR_PATH").unwrap_or_else(|_| "artifacts".to_string()); + let snaked_name = CONTRACT_NAME.replace('-', "_"); + format!("../../../{artifacts_dir}/{snaked_name}.wasm") +} + +pub fn instantiate_contract(wasm: &Wasm, owner: &SigningAccount) -> String { + let wasm_byte_code = std::fs::read(wasm_file()).unwrap(); + let code_id = wasm.store_code(&wasm_byte_code, None, owner).unwrap().data.code_id; + + wasm.instantiate( + code_id, + &InstantiateMsg { + owner: owner.address(), + }, + None, + Some("swapper-osmosis-contract"), + &[], + owner, + ) + .unwrap() + .data + .address +} + +/// Every execution creates new block and block timestamp will +5 secs from last block +/// (see https://github.com/osmosis-labs/osmosis-rust/issues/53#issuecomment-1311451418). +/// +/// We need to swap n times to pass TWAP_WINDOW_SIZE_SECONDS (10 min). Every swap moves block 5 sec so +/// n = TWAP_WINDOW_SIZE_SECONDS / 5 sec = 600 sec / 5 sec = 120. +/// We need to swap at least 120 times to create historical index for TWAP. +pub fn swap_to_create_twap_records( + app: &OsmosisTestApp, + signer: &SigningAccount, + pool_id: u64, + coin_in: Coin, + denom_out: &str, +) { + swap_n_times(app, signer, pool_id, coin_in, denom_out, 120u64); +} + +pub fn swap_n_times( + app: &OsmosisTestApp, + signer: &SigningAccount, + pool_id: u64, + coin_in: Coin, + denom_out: &str, + n: u64, +) { + for _ in 0..n { + swap(app, signer, pool_id, coin_in.clone(), denom_out); + } +} + +fn swap( + app: &OsmosisTestApp, + signer: &SigningAccount, + pool_id: u64, + coin_in: Coin, + denom_out: &str, +) -> ExecuteResponse { + app.execute::<_, MsgSwapExactAmountInResponse>( + MsgSwapExactAmountIn { + sender: signer.address(), + routes: vec![SwapAmountInRoute { + pool_id, + token_out_denom: denom_out.to_string(), + }], + token_in: Some(coin_in.into()), + token_out_min_amount: "1".to_string(), + }, + MsgSwapExactAmountIn::TYPE_URL, + signer, + ) + .unwrap() +} + +/// Query price for 1 denom from pool_id (quoted in second denom from the pool). +/// +/// Example: +/// pool consists of: 250 uosmo and 100 uatom +/// query price for uatom so 1 uatom = 2.5 uosmo +pub fn query_price_from_pool(gamm: &Gamm, pool_id: u64, denom: &str) -> Decimal { + let pool_assets = &gamm.query_pool(pool_id).unwrap().pool_assets; + let coin_1 = pool_assets[0].token.as_ref().unwrap(); + let coin_2 = &pool_assets[1].token.as_ref().unwrap(); + let coin_1_amt = Uint128::from_str(&coin_1.amount).unwrap(); + let coin_2_amt = Uint128::from_str(&coin_2.amount).unwrap(); + + if coin_1.denom == denom { + Decimal::from_ratio(coin_2_amt, coin_1_amt) + } else if coin_2.denom == denom { + Decimal::from_ratio(coin_1_amt, coin_2_amt) + } else { + panic!("{denom} not found in the pool {pool_id}") + } +} + +pub fn query_balance(bank: &Bank, addr: &str, denom: &str) -> u128 { + bank.query_balance(&QueryBalanceRequest { + address: addr.to_string(), + denom: denom.to_string(), + }) + .unwrap() + .balance + .map(|c| u128::from_str(&c.amount).unwrap()) + .unwrap_or(0) +} + +pub fn assert_err(actual: RunnerError, expected: impl Display) { + match actual { + RunnerError::ExecuteError { + msg, + } => { + assert!(msg.contains(&format!("{expected}"))) + } + RunnerError::QueryError { + msg, + } => { + assert!(msg.contains(&format!("{expected}"))) + } + _ => panic!("Unhandled error"), + } +} diff --git a/contracts/swapper/osmosis/tests/test_enumerate_routes.rs b/contracts/swapper/osmosis/tests/test_enumerate_routes.rs new file mode 100644 index 000000000..9660c8bc2 --- /dev/null +++ b/contracts/swapper/osmosis/tests/test_enumerate_routes.rs @@ -0,0 +1,185 @@ +extern crate core; + +use std::collections::HashMap; + +use cosmwasm_std::coin; +use mars_swapper::msgs::{ExecuteMsg, QueryMsg, RouteResponse}; +use mars_swapper_osmosis::route::OsmosisRoute; +use osmosis_std::types::osmosis::gamm::v1beta1::SwapAmountInRoute; +use osmosis_test_tube::{Gamm, Module, OsmosisTestApp, SigningAccount, Wasm}; + +use crate::helpers::instantiate_contract; + +pub mod helpers; + +#[test] +fn enumerating_routes() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + let signer = app + .init_account(&[ + coin(1_000_000_000_000, "uatom"), + coin(1_000_000_000_000, "uosmo"), + coin(1_000_000_000_000, "umars"), + coin(1_000_000_000_000, "uusdc"), + ]) + .unwrap(); + + let contract_addr = instantiate_contract(&wasm, &signer); + + let routes = create_pools_and_routes(&app, &signer); + + wasm.execute( + &contract_addr, + &ExecuteMsg::SetRoute { + denom_in: "uatom".to_string(), + denom_out: "umars".to_string(), + route: routes.get(&("uatom", "umars")).unwrap().clone(), + }, + &[], + &signer, + ) + .unwrap(); + + wasm.execute( + &contract_addr, + &ExecuteMsg::SetRoute { + denom_in: "uatom".to_string(), + denom_out: "uusdc".to_string(), + route: routes.get(&("uatom", "uusdc")).unwrap().clone(), + }, + &[], + &signer, + ) + .unwrap(); + + wasm.execute( + &contract_addr, + &ExecuteMsg::SetRoute { + denom_in: "uosmo".to_string(), + denom_out: "umars".to_string(), + route: routes.get(&("uosmo", "umars")).unwrap().clone(), + }, + &[], + &signer, + ) + .unwrap(); + + // NOTE: the response is ordered alphabetically + let expected = vec![ + RouteResponse { + denom_in: "uatom".to_string(), + denom_out: "umars".to_string(), + route: routes.get(&("uatom", "umars")).unwrap().clone(), + }, + RouteResponse { + denom_in: "uatom".to_string(), + denom_out: "uusdc".to_string(), + route: routes.get(&("uatom", "uusdc")).unwrap().clone(), + }, + RouteResponse { + denom_in: "uosmo".to_string(), + denom_out: "umars".to_string(), + route: routes.get(&("uosmo", "umars")).unwrap().clone(), + }, + ]; + + let res: Vec> = wasm + .query( + &contract_addr, + &QueryMsg::Routes { + start_after: None, + limit: None, + }, + ) + .unwrap(); + assert_eq!(res, expected); + + let res: Vec> = wasm + .query( + &contract_addr, + &QueryMsg::Routes { + start_after: None, + limit: Some(1), + }, + ) + .unwrap(); + assert_eq!(res, expected[..1]); + + let res: Vec> = wasm + .query( + &contract_addr, + &QueryMsg::Routes { + start_after: Some(("uatom".to_string(), "uosmo".to_string())), + limit: None, + }, + ) + .unwrap(); + assert_eq!(res, expected[1..]); +} + +fn create_pools_and_routes( + app: &OsmosisTestApp, + signer: &SigningAccount, +) -> HashMap<(&'static str, &'static str), OsmosisRoute> { + let gamm = Gamm::new(app); + + let pool_atom_osmo = gamm + .create_basic_pool(&[coin(6_000_000, "uatom"), coin(1_500_000, "uosmo")], signer) + .unwrap() + .data + .pool_id; + let pool_osmo_mars = gamm + .create_basic_pool(&[coin(100_000, "uosmo"), coin(1_000_000, "umars")], signer) + .unwrap() + .data + .pool_id; + let pool_osmo_usdc = gamm + .create_basic_pool(&[coin(100_000, "uosmo"), coin(1_000_000, "uusdc")], signer) + .unwrap() + .data + .pool_id; + + let mut map = HashMap::new(); + + // uosmo -> umars + map.insert( + ("uosmo", "umars"), + OsmosisRoute(vec![SwapAmountInRoute { + pool_id: pool_osmo_mars, + token_out_denom: "umars".to_string(), + }]), + ); + + // uatom -> uosmo -> umars + map.insert( + ("uatom", "umars"), + OsmosisRoute(vec![ + SwapAmountInRoute { + pool_id: pool_atom_osmo, + token_out_denom: "uosmo".to_string(), + }, + SwapAmountInRoute { + pool_id: pool_osmo_mars, + token_out_denom: "umars".to_string(), + }, + ]), + ); + + // uatom -> uosmo -> uusdc + map.insert( + ("uatom", "uusdc"), + OsmosisRoute(vec![ + SwapAmountInRoute { + pool_id: pool_atom_osmo, + token_out_denom: "uosmo".to_string(), + }, + SwapAmountInRoute { + pool_id: pool_osmo_usdc, + token_out_denom: "uusdc".to_string(), + }, + ]), + ); + + map +} diff --git a/contracts/swapper/osmosis/tests/test_estimate.rs b/contracts/swapper/osmosis/tests/test_estimate.rs new file mode 100644 index 000000000..004fbfd49 --- /dev/null +++ b/contracts/swapper/osmosis/tests/test_estimate.rs @@ -0,0 +1,183 @@ +use cosmwasm_std::{coin, Uint128}; +use mars_swapper::msgs::{EstimateExactInSwapResponse, ExecuteMsg, QueryMsg}; +use mars_swapper_osmosis::route::OsmosisRoute; +use osmosis_std::types::osmosis::gamm::v1beta1::SwapAmountInRoute; +use osmosis_test_tube::{Gamm, Module, OsmosisTestApp, RunnerResult, Wasm}; + +use crate::helpers::{ + assert_err, instantiate_contract, query_price_from_pool, swap_to_create_twap_records, +}; + +pub mod helpers; + +#[test] +fn error_on_route_not_found() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + let owner = app.init_account(&[coin(1_000_000_000_000, "uosmo")]).unwrap(); + + let contract_addr = instantiate_contract(&wasm, &owner); + + let res: RunnerResult = wasm.query( + &contract_addr, + &QueryMsg::EstimateExactInSwap { + coin_in: coin(1000, "jake"), + denom_out: "mars".to_string(), + }, + ); + + assert_err(res.unwrap_err(), "swapper_osmosis::route::OsmosisRoute not found"); +} + +#[test] +fn estimate_swap_one_step() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + + let signer = app + .init_account(&[coin(1_000_000_000_000, "uatom"), coin(1_000_000_000_000, "uosmo")]) + .unwrap(); + + let contract_addr = instantiate_contract(&wasm, &signer); + + let gamm = Gamm::new(&app); + let pool_atom_osmo = gamm + .create_basic_pool(&[coin(1_500_000, "uatom"), coin(6_000_000, "uosmo")], &signer) + .unwrap() + .data + .pool_id; + + swap_to_create_twap_records(&app, &signer, pool_atom_osmo, coin(10u128, "uatom"), "uosmo"); + + wasm.execute( + &contract_addr, + &ExecuteMsg::SetRoute { + denom_in: "uosmo".to_string(), + denom_out: "uatom".to_string(), + route: OsmosisRoute(vec![SwapAmountInRoute { + pool_id: pool_atom_osmo, + token_out_denom: "uatom".to_string(), + }]), + }, + &[], + &signer, + ) + .unwrap(); + + let coin_in_amount = Uint128::from(1000u128); + let uosmo_price = query_price_from_pool(&gamm, pool_atom_osmo, "uosmo"); + let expected_output = coin_in_amount * uosmo_price; + + let res: EstimateExactInSwapResponse = wasm + .query( + &contract_addr, + &QueryMsg::EstimateExactInSwap { + coin_in: coin(coin_in_amount.u128(), "uosmo"), + denom_out: "uatom".to_string(), + }, + ) + .unwrap(); + assert_eq!(res.amount, expected_output); +} + +#[test] +fn estimate_swap_multi_step() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + + let signer = app + .init_account(&[ + coin(1_000_000_000_000, "uatom"), + coin(1_000_000_000_000, "uosmo"), + coin(1_000_000_000_000, "umars"), + coin(1_000_000_000_000, "uusdc"), + ]) + .unwrap(); + + let contract_addr = instantiate_contract(&wasm, &signer); + + let gamm = Gamm::new(&app); + let pool_atom_osmo = gamm + .create_basic_pool(&[coin(6_000_000, "uatom"), coin(1_500_000, "uosmo")], &signer) + .unwrap() + .data + .pool_id; + let pool_osmo_mars = gamm + .create_basic_pool(&[coin(100_000, "uosmo"), coin(1_000_000, "umars")], &signer) + .unwrap() + .data + .pool_id; + let pool_osmo_usdc = gamm + .create_basic_pool(&[coin(100_000, "uosmo"), coin(1_000_000, "uusdc")], &signer) + .unwrap() + .data + .pool_id; + + swap_to_create_twap_records(&app, &signer, pool_atom_osmo, coin(4u128, "uosmo"), "uatom"); + + wasm.execute( + &contract_addr, + &ExecuteMsg::SetRoute { + denom_in: "uatom".to_string(), + denom_out: "umars".to_string(), + route: OsmosisRoute(vec![ + SwapAmountInRoute { + pool_id: pool_atom_osmo, + token_out_denom: "uosmo".to_string(), + }, + SwapAmountInRoute { + pool_id: pool_osmo_mars, + token_out_denom: "umars".to_string(), + }, + ]), + }, + &[], + &signer, + ) + .unwrap(); + + wasm.execute( + &contract_addr, + &ExecuteMsg::SetRoute { + denom_in: "uatom".to_string(), + denom_out: "uusdc".to_string(), + route: OsmosisRoute(vec![ + SwapAmountInRoute { + pool_id: pool_atom_osmo, + token_out_denom: "uosmo".to_string(), + }, + SwapAmountInRoute { + pool_id: pool_osmo_usdc, + token_out_denom: "uusdc".to_string(), + }, + ]), + }, + &[], + &signer, + ) + .unwrap(); + + let coin_in_amount = Uint128::from(1000u128); + let uatom_price = query_price_from_pool(&gamm, pool_atom_osmo, "uatom"); + let uosmo_price = query_price_from_pool(&gamm, pool_osmo_usdc, "uosmo"); + let expected_output = coin_in_amount * uatom_price * uosmo_price; + + // atom/usdc = (price for atom/osmo) * (price for osmo/usdc) + // usdc_out_amount = (atom amount) * (price for atom/usdc) + // + // 1 osmo = 4 atom => atom/osmo = 0.25 + // 1 osmo = 10 usdc => osmo/usdc = 10 + // + // atom/usdc = 0.25 * 10 = 2.5 + // usdc_out_amount = 1000 * 2.5 = 2500 + let res: EstimateExactInSwapResponse = wasm + .query( + &contract_addr, + &QueryMsg::EstimateExactInSwap { + coin_in: coin(coin_in_amount.u128(), "uatom"), + denom_out: "uusdc".to_string(), + }, + ) + .unwrap(); + assert_eq!(res.amount, expected_output); +} diff --git a/contracts/swapper/osmosis/tests/test_instantiate.rs b/contracts/swapper/osmosis/tests/test_instantiate.rs new file mode 100644 index 000000000..02ff699af --- /dev/null +++ b/contracts/swapper/osmosis/tests/test_instantiate.rs @@ -0,0 +1,46 @@ +use cosmwasm_std::coin; +use mars_owner::OwnerResponse; +use mars_swapper::msgs::{InstantiateMsg, QueryMsg}; +use osmosis_test_tube::{Account, Module, OsmosisTestApp, Wasm}; + +use crate::helpers::{instantiate_contract, wasm_file}; + +pub mod helpers; + +#[test] +fn owner_set_on_instantiate() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + let signer = app.init_account(&[coin(1_000_000_000_000, "uosmo")]).unwrap(); + + let contract_addr = instantiate_contract(&wasm, &signer); + + let res: OwnerResponse = wasm.query(&contract_addr, &QueryMsg::Owner {}).unwrap(); + assert_eq!(res.owner, Some(signer.address())); +} + +#[test] +fn raises_on_invalid_owner_addr() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + let signer = app.init_account(&[coin(1_000_000_000_000, "uosmo")]).unwrap(); + + let wasm_byte_code = std::fs::read(wasm_file()).unwrap(); + let code_id = wasm.store_code(&wasm_byte_code, None, &signer).unwrap().data.code_id; + + let owner = "%%%INVALID%%%"; + let res = wasm.instantiate( + code_id, + &InstantiateMsg { + owner: owner.to_string(), + }, + None, + Some("swapper-osmosis-contract"), + &[], + &signer, + ); + + if res.is_ok() { + panic!("Should have thrown an error"); + } +} diff --git a/contracts/swapper/osmosis/tests/test_set_route.rs b/contracts/swapper/osmosis/tests/test_set_route.rs new file mode 100644 index 000000000..4b4f818ae --- /dev/null +++ b/contracts/swapper/osmosis/tests/test_set_route.rs @@ -0,0 +1,373 @@ +use cosmwasm_std::{coin, StdError::GenericErr}; +use mars_owner::OwnerError; +use mars_swapper::msgs::{ExecuteMsg, QueryMsg, RouteResponse}; +use mars_swapper_base::ContractError; +use mars_swapper_osmosis::route::OsmosisRoute; +use osmosis_std::types::osmosis::gamm::v1beta1::SwapAmountInRoute; +use osmosis_test_tube::{Gamm, Module, OsmosisTestApp, Wasm}; + +use crate::helpers::{assert_err, instantiate_contract}; + +pub mod helpers; + +#[test] +fn only_owner_can_set_routes() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + + let accs = app.init_accounts(&[coin(1_000_000_000_000, "uosmo")], 2).unwrap(); + let owner = &accs[0]; + let bad_guy = &accs[1]; + + let contract_addr = instantiate_contract(&wasm, owner); + + let res_err = wasm + .execute( + &contract_addr, + &ExecuteMsg::SetRoute { + denom_in: "mars".to_string(), + denom_out: "weth".to_string(), + route: OsmosisRoute(vec![ + SwapAmountInRoute { + pool_id: 1, + token_out_denom: "osmo".to_string(), + }, + SwapAmountInRoute { + pool_id: 2, + token_out_denom: "weth".to_string(), + }, + ]), + }, + &[], + bad_guy, + ) + .unwrap_err(); + + assert_err(res_err, OwnerError::NotOwner {}); +} + +#[test] +fn must_pass_at_least_one_step() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + + let signer = app.init_account(&[coin(1_000_000_000_000, "uosmo")]).unwrap(); + + let contract_addr = instantiate_contract(&wasm, &signer); + + let res_err = wasm + .execute( + &contract_addr, + &ExecuteMsg::SetRoute { + denom_in: "mars".to_string(), + denom_out: "weth".to_string(), + route: OsmosisRoute(vec![]), + }, + &[], + &signer, + ) + .unwrap_err(); + + assert_err( + res_err, + ContractError::InvalidRoute { + reason: "the route must contain at least one step".to_string(), + }, + ); +} + +#[test] +fn must_be_available_in_osmosis() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + + let signer = app.init_account(&[coin(1_000_000_000_000, "uosmo")]).unwrap(); + + let contract_addr = instantiate_contract(&wasm, &signer); + + let res_err = wasm + .execute( + &contract_addr, + &ExecuteMsg::SetRoute { + denom_in: "mars".to_string(), + denom_out: "weth".to_string(), + route: OsmosisRoute(vec![SwapAmountInRoute { + pool_id: 1, + token_out_denom: "osmo".to_string(), + }]), + }, + &[], + &signer, + ) + .unwrap_err(); + + assert_err( + res_err, + ContractError::Std(GenericErr { + msg: "Querier contract error".to_string(), + }), + ); +} + +#[test] +fn step_does_not_contain_input_denom() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + + let signer = app + .init_account(&[coin(1_000_000_000_000, "uatom"), coin(1_000_000_000_000, "uosmo")]) + .unwrap(); + + let contract_addr = instantiate_contract(&wasm, &signer); + + let gamm = Gamm::new(&app); + let pool_atom_osmo = gamm + .create_basic_pool(&[coin(6_000_000, "uatom"), coin(1_500_000, "uosmo")], &signer) + .unwrap() + .data + .pool_id; + + let res_err = wasm + .execute( + &contract_addr, + &ExecuteMsg::SetRoute { + denom_in: "umars".to_string(), + denom_out: "uweth".to_string(), + route: OsmosisRoute(vec![SwapAmountInRoute { + pool_id: pool_atom_osmo, + token_out_denom: "uosmo".to_string(), + }]), + }, + &[], + &signer, + ) + .unwrap_err(); + + assert_err( + res_err, + ContractError::InvalidRoute { + reason: format!("step 1: pool {pool_atom_osmo} does not contain input denom umars",), + }, + ); +} + +#[test] +fn step_does_not_contain_output_denom() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + + let signer = app + .init_account(&[coin(1_000_000_000_000, "umars"), coin(1_000_000_000_000, "uosmo")]) + .unwrap(); + + let contract_addr = instantiate_contract(&wasm, &signer); + + let gamm = Gamm::new(&app); + let pool_mars_osmo = gamm + .create_basic_pool(&[coin(6_000_000, "umars"), coin(1_500_000, "uosmo")], &signer) + .unwrap() + .data + .pool_id; + + let res_err = wasm + .execute( + &contract_addr, + &ExecuteMsg::SetRoute { + denom_in: "umars".to_string(), + denom_out: "uweth".to_string(), + route: OsmosisRoute(vec![SwapAmountInRoute { + pool_id: pool_mars_osmo, + token_out_denom: "uweth".to_string(), + }]), + }, + &[], + &signer, + ) + .unwrap_err(); + + assert_err( + res_err, + ContractError::InvalidRoute { + reason: format!("step 1: pool {pool_mars_osmo} does not contain output denom uweth"), + }, + ); +} + +#[test] +fn steps_do_not_loop() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + + let signer = app + .init_account(&[ + coin(1_000_000_000_000, "uatom"), + coin(1_000_000_000_000, "uosmo"), + coin(1_000_000_000_000, "umars"), + coin(1_000_000_000_000, "uusdc"), + ]) + .unwrap(); + + let contract_addr = instantiate_contract(&wasm, &signer); + + let gamm = Gamm::new(&app); + let pool_atom_osmo = gamm + .create_basic_pool(&[coin(6_000_000, "uatom"), coin(1_500_000, "uosmo")], &signer) + .unwrap() + .data + .pool_id; + let pool_osmo_usdc = gamm + .create_basic_pool(&[coin(6_000_000, "uosmo"), coin(1_500_000, "uusdc")], &signer) + .unwrap() + .data + .pool_id; + let pool_osmo_mars = gamm + .create_basic_pool(&[coin(6_000_000, "uosmo"), coin(1_500_000, "umars")], &signer) + .unwrap() + .data + .pool_id; + + let res_err = wasm + .execute( + &contract_addr, + &ExecuteMsg::SetRoute { + denom_in: "uatom".to_string(), + denom_out: "umars".to_string(), + route: OsmosisRoute(vec![ + SwapAmountInRoute { + pool_id: pool_atom_osmo, + token_out_denom: "uosmo".to_string(), + }, + SwapAmountInRoute { + pool_id: pool_osmo_usdc, + token_out_denom: "uusdc".to_string(), + }, + SwapAmountInRoute { + pool_id: pool_osmo_usdc, + token_out_denom: "uosmo".to_string(), + }, + SwapAmountInRoute { + pool_id: pool_osmo_mars, + token_out_denom: "umars".to_string(), + }, + ]), + }, + &[], + &signer, + ) + .unwrap_err(); + + // invalid - route contains a loop + // this example: ATOM -> OSMO -> USDC -> OSMO -> MARS + assert_err( + res_err, + ContractError::InvalidRoute { + reason: "route contains a loop: denom uosmo seen twice".to_string(), + }, + ); +} + +#[test] +fn step_output_does_not_match() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + + let signer = app + .init_account(&[coin(1_000_000_000_000, "uatom"), coin(1_000_000_000_000, "uosmo")]) + .unwrap(); + + let contract_addr = instantiate_contract(&wasm, &signer); + + let gamm = Gamm::new(&app); + let pool_atom_osmo = gamm + .create_basic_pool(&[coin(6_000_000, "uatom"), coin(1_500_000, "uosmo")], &signer) + .unwrap() + .data + .pool_id; + + let res_err = wasm + .execute( + &contract_addr, + &ExecuteMsg::SetRoute { + denom_in: "uatom".to_string(), + denom_out: "umars".to_string(), + route: OsmosisRoute(vec![SwapAmountInRoute { + pool_id: pool_atom_osmo, + token_out_denom: "uosmo".to_string(), + }]), + }, + &[], + &signer, + ) + .unwrap_err(); + + assert_err( + res_err, + ContractError::InvalidRoute { + reason: "the route's output denom uosmo does not match the desired output umars" + .to_string(), + }, + ); +} + +#[test] +fn set_route_success() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + + let signer = app + .init_account(&[ + coin(1_000_000_000_000, "uosmo"), + coin(1_000_000_000_000, "umars"), + coin(1_000_000_000_000, "uweth"), + ]) + .unwrap(); + + let contract_addr = instantiate_contract(&wasm, &signer); + + let gamm = Gamm::new(&app); + let pool_mars_osmo = gamm + .create_basic_pool(&[coin(6_000_000, "umars"), coin(1_500_000, "uosmo")], &signer) + .unwrap() + .data + .pool_id; + let pool_weth_osmo = gamm + .create_basic_pool(&[coin(100_000, "uweth"), coin(1_000_000, "uosmo")], &signer) + .unwrap() + .data + .pool_id; + + wasm.execute( + &contract_addr, + &ExecuteMsg::SetRoute { + denom_in: "umars".to_string(), + denom_out: "uweth".to_string(), + route: OsmosisRoute(vec![ + SwapAmountInRoute { + pool_id: pool_mars_osmo, + token_out_denom: "uosmo".to_string(), + }, + SwapAmountInRoute { + pool_id: pool_weth_osmo, + token_out_denom: "uweth".to_string(), + }, + ]), + }, + &[], + &signer, + ) + .unwrap(); + + let res: RouteResponse = wasm + .query( + &contract_addr, + &QueryMsg::Route { + denom_in: "umars".to_string(), + denom_out: "uweth".to_string(), + }, + ) + .unwrap(); + + assert_eq!(res.denom_in, "umars".to_string()); + assert_eq!(res.denom_out, "uweth".to_string()); + assert_eq!(res.route.to_string(), format!("{pool_mars_osmo}:uosmo|{pool_weth_osmo}:uweth")); +} diff --git a/contracts/swapper/osmosis/tests/test_swap.rs b/contracts/swapper/osmosis/tests/test_swap.rs new file mode 100644 index 000000000..42f910d7b --- /dev/null +++ b/contracts/swapper/osmosis/tests/test_swap.rs @@ -0,0 +1,170 @@ +use cosmwasm_std::{coin, Addr, Decimal}; +use mars_swapper::msgs::ExecuteMsg; +use mars_swapper_base::ContractError; +use mars_swapper_osmosis::route::OsmosisRoute; +use osmosis_std::types::osmosis::gamm::v1beta1::SwapAmountInRoute; +use osmosis_test_tube::{Account, Bank, Gamm, Module, OsmosisTestApp, Wasm}; + +use crate::helpers::{ + assert_err, instantiate_contract, query_balance, swap_to_create_twap_records, +}; + +pub mod helpers; + +#[test] +fn transfer_callback_only_internal() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + + let accs = app.init_accounts(&[coin(1_000_000_000_000, "uosmo")], 2).unwrap(); + let owner = &accs[0]; + let bad_guy = &accs[1]; + + let contract_addr = instantiate_contract(&wasm, owner); + + let res_err = wasm + .execute( + &contract_addr, + &ExecuteMsg::::TransferResult { + recipient: Addr::unchecked(bad_guy.address()), + denom_in: "mars".to_string(), + denom_out: "osmo".to_string(), + }, + &[], + bad_guy, + ) + .unwrap_err(); + + assert_err( + res_err, + ContractError::Unauthorized { + user: bad_guy.address(), + action: "transfer result".to_string(), + }, + ); +} + +#[test] +fn swap_exact_in_slippage_too_high() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + + let signer = app + .init_account(&[coin(1_000_000_000_000, "uosmo"), coin(1_000_000_000_000, "umars")]) + .unwrap(); + let whale = app.init_account(&[coin(1_000_000, "umars")]).unwrap(); + + let contract_addr = instantiate_contract(&wasm, &signer); + + let gamm = Gamm::new(&app); + let pool_mars_osmo = gamm + .create_basic_pool(&[coin(6_000_000, "umars"), coin(1_500_000, "uosmo")], &signer) + .unwrap() + .data + .pool_id; + + swap_to_create_twap_records(&app, &signer, pool_mars_osmo, coin(10u128, "umars"), "uosmo"); + + let route = OsmosisRoute(vec![SwapAmountInRoute { + pool_id: pool_mars_osmo, + token_out_denom: "uosmo".to_string(), + }]); + + wasm.execute( + &contract_addr, + &ExecuteMsg::SetRoute { + denom_in: "umars".to_string(), + denom_out: "uosmo".to_string(), + route, + }, + &[], + &signer, + ) + .unwrap(); + + // whale does a huge trade + let res_err = wasm + .execute( + &contract_addr, + &ExecuteMsg::::SwapExactIn { + coin_in: coin(1_000_000, "umars"), + denom_out: "uosmo".to_string(), + slippage: Decimal::percent(5), + }, + &[coin(1_000_000, "umars")], + &whale, + ) + .unwrap_err(); + + assert_err( + res_err, + "uosmo token is lesser than min amount: calculated amount is lesser than min amount", + ) +} + +#[test] +fn swap_exact_in_success() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + + let signer = app + .init_account(&[coin(1_000_000_000_000, "uosmo"), coin(1_000_000_000_000, "umars")]) + .unwrap(); + let user = app.init_account(&[coin(10_000, "umars")]).unwrap(); + + let contract_addr = instantiate_contract(&wasm, &signer); + + let gamm = Gamm::new(&app); + let pool_mars_osmo = gamm + .create_basic_pool(&[coin(6_000_000, "umars"), coin(1_500_000, "uosmo")], &signer) + .unwrap() + .data + .pool_id; + + swap_to_create_twap_records(&app, &signer, pool_mars_osmo, coin(10u128, "umars"), "uosmo"); + + wasm.execute( + &contract_addr, + &ExecuteMsg::SetRoute { + denom_in: "umars".to_string(), + denom_out: "uosmo".to_string(), + route: OsmosisRoute(vec![SwapAmountInRoute { + pool_id: pool_mars_osmo, + token_out_denom: "uosmo".to_string(), + }]), + }, + &[], + &signer, + ) + .unwrap(); + + let bank = Bank::new(&app); + let osmo_balance = query_balance(&bank, &user.address(), "uosmo"); + let mars_balance = query_balance(&bank, &user.address(), "umars"); + assert_eq!(osmo_balance, 0); + assert_eq!(mars_balance, 10_000); + + wasm.execute( + &contract_addr, + &ExecuteMsg::::SwapExactIn { + coin_in: coin(10_000, "umars"), + denom_out: "uosmo".to_string(), + slippage: Decimal::percent(6), + }, + &[coin(10_000, "umars")], + &user, + ) + .unwrap(); + + // Assert user receives their new tokens + let osmo_balance = query_balance(&bank, &user.address(), "uosmo"); + let mars_balance = query_balance(&bank, &user.address(), "umars"); + assert_eq!(osmo_balance, 2470); + assert_eq!(mars_balance, 0); + + // Assert no tokens in contract left over + let osmo_balance = query_balance(&bank, &contract_addr, "uosmo"); + let mars_balance = query_balance(&bank, &contract_addr, "umars"); + assert_eq!(osmo_balance, 0); + assert_eq!(mars_balance, 0); +} diff --git a/contracts/swapper/osmosis/tests/test_update_admin.rs b/contracts/swapper/osmosis/tests/test_update_admin.rs new file mode 100644 index 000000000..eac397970 --- /dev/null +++ b/contracts/swapper/osmosis/tests/test_update_admin.rs @@ -0,0 +1,201 @@ +use cosmwasm_std::coin; +use mars_owner::{OwnerResponse, OwnerUpdate}; +use mars_swapper::msgs::{ExecuteMsg, QueryMsg}; +use mars_swapper_osmosis::route::OsmosisRoute; +use osmosis_test_tube::{Account, Module, OsmosisTestApp, Wasm}; + +use crate::helpers::instantiate_contract; + +pub mod helpers; + +#[test] +fn initial_state() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + + let accs = app.init_accounts(&[coin(1_000_000_000_000, "uosmo")], 2).unwrap(); + let owner = &accs[0]; + + let contract_addr = instantiate_contract(&wasm, owner); + + let res: OwnerResponse = wasm.query(&contract_addr, &QueryMsg::Owner {}).unwrap(); + assert_eq!(res.owner.unwrap(), owner.address()); + assert_eq!(res.proposed, None); +} + +#[test] +fn only_owner_can_propose() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + + let accs = app.init_accounts(&[coin(1_000_000_000_000, "uosmo")], 3).unwrap(); + let owner = &accs[0]; + let bad_guy = &accs[1]; + + let contract_addr = instantiate_contract(&wasm, owner); + + wasm.execute( + &contract_addr, + &ExecuteMsg::::UpdateOwner(OwnerUpdate::ProposeNewOwner { + proposed: bad_guy.address(), + }), + &[], + bad_guy, + ) + .unwrap_err(); +} + +#[test] +fn propose_new_owner() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + + let accs = app.init_accounts(&[coin(1_000_000_000_000, "uosmo")], 2).unwrap(); + let owner = &accs[0]; + let new_owner = &accs[1]; + + let contract_addr = instantiate_contract(&wasm, owner); + + wasm.execute( + &contract_addr, + &ExecuteMsg::::UpdateOwner(OwnerUpdate::ProposeNewOwner { + proposed: new_owner.address(), + }), + &[], + owner, + ) + .unwrap(); + + let res: OwnerResponse = wasm.query(&contract_addr, &QueryMsg::Owner {}).unwrap(); + assert_eq!(res.owner.unwrap(), owner.address()); + assert_eq!(res.proposed.unwrap(), new_owner.address()); +} + +#[test] +fn only_owner_can_clear_proposed() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + + let accs = app.init_accounts(&[coin(1_000_000_000_000, "uosmo")], 3).unwrap(); + let owner = &accs[0]; + let bad_guy = &accs[1]; + let new_owner = &accs[2]; + + let contract_addr = instantiate_contract(&wasm, owner); + + wasm.execute( + &contract_addr, + &ExecuteMsg::::UpdateOwner(OwnerUpdate::ProposeNewOwner { + proposed: new_owner.address(), + }), + &[], + owner, + ) + .unwrap(); + + wasm.execute( + &contract_addr, + &ExecuteMsg::::UpdateOwner(OwnerUpdate::ClearProposed), + &[], + bad_guy, + ) + .unwrap_err(); +} + +#[test] +fn clear_proposed() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + + let accs = app.init_accounts(&[coin(1_000_000_000_000, "uosmo")], 2).unwrap(); + let owner = &accs[0]; + let new_owner = &accs[1]; + + let contract_addr = instantiate_contract(&wasm, owner); + + wasm.execute( + &contract_addr, + &ExecuteMsg::::UpdateOwner(OwnerUpdate::ProposeNewOwner { + proposed: new_owner.address(), + }), + &[], + owner, + ) + .unwrap(); + + wasm.execute( + &contract_addr, + &ExecuteMsg::::UpdateOwner(OwnerUpdate::ClearProposed), + &[], + owner, + ) + .unwrap(); + + let res: OwnerResponse = wasm.query(&contract_addr, &QueryMsg::Owner {}).unwrap(); + assert_eq!(res.owner.unwrap(), owner.address()); + assert_eq!(res.proposed, None); +} + +#[test] +fn only_proposed_owner_can_accept_role() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + + let accs = app.init_accounts(&[coin(1_000_000_000_000, "uosmo")], 2).unwrap(); + let owner = &accs[0]; + let new_owner = &accs[1]; + + let contract_addr = instantiate_contract(&wasm, owner); + + wasm.execute( + &contract_addr, + &ExecuteMsg::::UpdateOwner(OwnerUpdate::ProposeNewOwner { + proposed: new_owner.address(), + }), + &[], + owner, + ) + .unwrap(); + + wasm.execute( + &contract_addr, + &ExecuteMsg::::UpdateOwner(OwnerUpdate::AcceptProposed), + &[], + owner, + ) + .unwrap_err(); +} + +#[test] +fn accept_owner_role() { + let app = OsmosisTestApp::new(); + let wasm = Wasm::new(&app); + + let accs = app.init_accounts(&[coin(1_000_000_000_000, "uosmo")], 2).unwrap(); + let owner = &accs[0]; + let new_owner = &accs[1]; + + let contract_addr = instantiate_contract(&wasm, owner); + + wasm.execute( + &contract_addr, + &ExecuteMsg::::UpdateOwner(OwnerUpdate::ProposeNewOwner { + proposed: new_owner.address(), + }), + &[], + owner, + ) + .unwrap(); + + wasm.execute( + &contract_addr, + &ExecuteMsg::::UpdateOwner(OwnerUpdate::AcceptProposed), + &[], + new_owner, + ) + .unwrap(); + + let res: OwnerResponse = wasm.query(&contract_addr, &QueryMsg::Owner {}).unwrap(); + assert_eq!(res.owner.unwrap(), new_owner.address()); + assert_eq!(res.proposed, None); +} diff --git a/packages/mars-swapper/Cargo.toml b/packages/mars-swapper/Cargo.toml new file mode 100644 index 000000000..044f56dbe --- /dev/null +++ b/packages/mars-swapper/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "mars-swapper" +version = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +edition = { workspace = true } +repository = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } +keywords = { workspace = true } + +[lib] +doctest = false + +[features] +# for quicker tests, cargo test --lib +# for more explicit tests, cargo test --features=backtraces +backtraces = ["cosmwasm-std/backtraces"] + +[dependencies] +cosmwasm-schema = { workspace = true } +cosmwasm-std = { workspace = true } +cw-storage-plus = { workspace = true } +cw-utils = { workspace = true } +mars-owner = { workspace = true } +schemars = { workspace = true } +serde = { workspace = true } +thiserror = { workspace = true } diff --git a/packages/mars-swapper/src/adapter.rs b/packages/mars-swapper/src/adapter.rs new file mode 100644 index 000000000..29a48488c --- /dev/null +++ b/packages/mars-swapper/src/adapter.rs @@ -0,0 +1,52 @@ +use cosmwasm_schema::cw_serde; +use cosmwasm_std::{to_binary, Addr, Api, Coin, CosmosMsg, Decimal, Empty, StdResult, WasmMsg}; + +use crate::msgs::ExecuteMsg; + +#[cw_serde] +pub struct SwapperBase(T); + +impl SwapperBase { + pub fn new(address: T) -> SwapperBase { + SwapperBase(address) + } + + pub fn address(&self) -> &T { + &self.0 + } +} + +pub type SwapperUnchecked = SwapperBase; +pub type Swapper = SwapperBase; + +impl From for SwapperUnchecked { + fn from(s: Swapper) -> Self { + Self(s.address().to_string()) + } +} + +impl SwapperUnchecked { + pub fn check(&self, api: &dyn Api) -> StdResult { + Ok(SwapperBase::new(api.addr_validate(self.address())?)) + } +} + +impl Swapper { + /// Generate message for performing a swapper + pub fn swap_exact_in_msg( + &self, + coin_in: &Coin, + denom_out: &str, + slippage: Decimal, + ) -> StdResult { + Ok(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: self.address().to_string(), + msg: to_binary(&ExecuteMsg::::SwapExactIn { + coin_in: coin_in.clone(), + denom_out: denom_out.to_string(), + slippage, + })?, + funds: vec![coin_in.clone()], + })) + } +} diff --git a/packages/mars-swapper/src/lib.rs b/packages/mars-swapper/src/lib.rs new file mode 100644 index 000000000..6071d7839 --- /dev/null +++ b/packages/mars-swapper/src/lib.rs @@ -0,0 +1,4 @@ +pub mod adapter; +pub mod msgs; + +pub use self::{adapter::*, msgs::*}; diff --git a/packages/mars-swapper/src/msgs.rs b/packages/mars-swapper/src/msgs.rs new file mode 100644 index 000000000..bd270548a --- /dev/null +++ b/packages/mars-swapper/src/msgs.rs @@ -0,0 +1,77 @@ +use cosmwasm_schema::{cw_serde, QueryResponses}; +use cosmwasm_std::{Addr, Coin, Decimal, Uint128}; +use mars_owner::OwnerUpdate; + +#[cw_serde] +pub struct InstantiateMsg { + /// The contract's owner, who can update config + pub owner: String, +} + +#[cw_serde] +pub enum ExecuteMsg { + /// Manges owner role state + UpdateOwner(OwnerUpdate), + /// Configure the route for swapping an asset + /// + /// This is chain-specific, and can include parameters such as slippage tolerance and the routes + /// for multi-step swaps + SetRoute { + denom_in: String, + denom_out: String, + route: Route, + }, + /// Perform a swapper with an exact-in amount. Requires slippage allowance %. + SwapExactIn { + coin_in: Coin, + denom_out: String, + slippage: Decimal, + }, + /// Send swapper results back to swapper. Also refunds extra if sent more than needed. Internal use only. + TransferResult { + recipient: Addr, + denom_in: String, + denom_out: String, + }, +} + +#[cw_serde] +#[derive(QueryResponses)] +pub enum QueryMsg { + /// Query contract owner config + #[returns(mars_owner::OwnerResponse)] + Owner {}, + /// Get route for swapping an input denom into an output denom + #[returns(RouteResponse)] + Route { + denom_in: String, + denom_out: String, + }, + /// Enumerate all swapper routes + #[returns(RoutesResponse)] + Routes { + start_after: Option<(String, String)>, + limit: Option, + }, + /// Return current spot price swapping In for Out + /// Warning: Do not use this as an oracle price feed. Use Mars-Oracle for pricing. + #[returns(EstimateExactInSwapResponse)] + EstimateExactInSwap { + coin_in: Coin, + denom_out: String, + }, +} + +#[cw_serde] +pub struct RouteResponse { + pub denom_in: String, + pub denom_out: String, + pub route: Route, +} + +pub type RoutesResponse = Vec>; + +#[cw_serde] +pub struct EstimateExactInSwapResponse { + pub amount: Uint128, +} diff --git a/schema.Makefile.toml b/schema.Makefile.toml index c278e4d49..948fcd942 100644 --- a/schema.Makefile.toml +++ b/schema.Makefile.toml @@ -16,6 +16,8 @@ fn main() -> std::io::Result<()> { "mars-oracle-osmosis", "mars-red-bank", "mars-rewards-collector-osmosis", + "mars-params", + "mars-swapper-osmosis", ]; for contract in contracts { diff --git a/schemas/mars-params/mars-params.json b/schemas/mars-params/mars-params.json new file mode 100644 index 000000000..a28d417f3 --- /dev/null +++ b/schemas/mars-params/mars-params.json @@ -0,0 +1,963 @@ +{ + "contract_name": "mars-params", + "contract_version": "1.0.1", + "idl_version": "1.0.0", + "instantiate": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "type": "object", + "required": [ + "max_close_factor", + "owner" + ], + "properties": { + "max_close_factor": { + "description": "The maximum percent a liquidator can decrease the debt amount of the liquidatee", + "allOf": [ + { + "$ref": "#/definitions/Decimal" + } + ] + }, + "owner": { + "description": "Contract's owner", + "type": "string" + } + }, + "additionalProperties": false, + "definitions": { + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + } + } + }, + "execute": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "type": "object", + "required": [ + "update_owner" + ], + "properties": { + "update_owner": { + "$ref": "#/definitions/OwnerUpdate" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "update_max_close_factor" + ], + "properties": { + "update_max_close_factor": { + "$ref": "#/definitions/Decimal" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "update_asset_params" + ], + "properties": { + "update_asset_params": { + "$ref": "#/definitions/AssetParamsUpdate" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "update_vault_config" + ], + "properties": { + "update_vault_config": { + "$ref": "#/definitions/VaultConfigUpdate" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "emergency_update" + ], + "properties": { + "emergency_update": { + "$ref": "#/definitions/EmergencyUpdate" + } + }, + "additionalProperties": false + } + ], + "definitions": { + "AssetParams": { + "type": "object", + "required": [ + "liquidation_bonus", + "liquidation_threshold", + "max_loan_to_value", + "red_bank", + "rover" + ], + "properties": { + "liquidation_bonus": { + "$ref": "#/definitions/Decimal" + }, + "liquidation_threshold": { + "$ref": "#/definitions/Decimal" + }, + "max_loan_to_value": { + "$ref": "#/definitions/Decimal" + }, + "red_bank": { + "$ref": "#/definitions/RedBankSettings" + }, + "rover": { + "$ref": "#/definitions/RoverSettings" + } + }, + "additionalProperties": false + }, + "AssetParamsUpdate": { + "oneOf": [ + { + "type": "object", + "required": [ + "add_or_update" + ], + "properties": { + "add_or_update": { + "type": "object", + "required": [ + "denom", + "params" + ], + "properties": { + "denom": { + "type": "string" + }, + "params": { + "$ref": "#/definitions/AssetParams" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + }, + "EmergencyUpdate": { + "oneOf": [ + { + "type": "object", + "required": [ + "rover" + ], + "properties": { + "rover": { + "$ref": "#/definitions/RoverEmergencyUpdate" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "red_bank" + ], + "properties": { + "red_bank": { + "$ref": "#/definitions/RedBankEmergencyUpdate" + } + }, + "additionalProperties": false + } + ] + }, + "HighLeverageStrategyParams": { + "type": "object", + "required": [ + "liquidation_threshold", + "max_loan_to_value" + ], + "properties": { + "liquidation_threshold": { + "$ref": "#/definitions/Decimal" + }, + "max_loan_to_value": { + "$ref": "#/definitions/Decimal" + } + }, + "additionalProperties": false + }, + "OwnerUpdate": { + "oneOf": [ + { + "description": "Proposes a new owner to take role. Only current owner can execute.", + "type": "object", + "required": [ + "propose_new_owner" + ], + "properties": { + "propose_new_owner": { + "type": "object", + "required": [ + "proposed" + ], + "properties": { + "proposed": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Clears the currently proposed owner. Only current owner can execute.", + "type": "string", + "enum": [ + "clear_proposed" + ] + }, + { + "description": "Promotes the proposed owner to be the current one. Only the proposed owner can execute.", + "type": "string", + "enum": [ + "accept_proposed" + ] + }, + { + "description": "Throws away the keys to the Owner role forever. Once done, no owner can ever be set later.", + "type": "string", + "enum": [ + "abolish_owner_role" + ] + }, + { + "description": "A separate entity managed by Owner that can be used for granting specific emergency powers.", + "type": "object", + "required": [ + "set_emergency_owner" + ], + "properties": { + "set_emergency_owner": { + "type": "object", + "required": [ + "emergency_owner" + ], + "properties": { + "emergency_owner": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Remove the entity in the Emergency Owner role", + "type": "string", + "enum": [ + "clear_emergency_owner" + ] + } + ] + }, + "RedBankEmergencyUpdate": { + "oneOf": [ + { + "type": "object", + "required": [ + "disable_borrowing" + ], + "properties": { + "disable_borrowing": { + "type": "string" + } + }, + "additionalProperties": false + } + ] + }, + "RedBankSettings": { + "type": "object", + "required": [ + "borrow_enabled", + "deposit_cap", + "deposit_enabled" + ], + "properties": { + "borrow_enabled": { + "type": "boolean" + }, + "deposit_cap": { + "$ref": "#/definitions/Uint128" + }, + "deposit_enabled": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "RoverEmergencyUpdate": { + "oneOf": [ + { + "type": "object", + "required": [ + "set_zero_max_ltv_on_vault" + ], + "properties": { + "set_zero_max_ltv_on_vault": { + "type": "string" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "set_zero_deposit_cap_on_vault" + ], + "properties": { + "set_zero_deposit_cap_on_vault": { + "type": "string" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "disallow_coin" + ], + "properties": { + "disallow_coin": { + "type": "string" + } + }, + "additionalProperties": false + } + ] + }, + "RoverSettings": { + "type": "object", + "required": [ + "hls", + "whitelisted" + ], + "properties": { + "hls": { + "$ref": "#/definitions/HighLeverageStrategyParams" + }, + "whitelisted": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + }, + "VaultConfig": { + "type": "object", + "required": [ + "deposit_cap", + "liquidation_threshold", + "max_loan_to_value", + "whitelisted" + ], + "properties": { + "deposit_cap": { + "$ref": "#/definitions/Coin" + }, + "liquidation_threshold": { + "$ref": "#/definitions/Decimal" + }, + "max_loan_to_value": { + "$ref": "#/definitions/Decimal" + }, + "whitelisted": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "VaultConfigUpdate": { + "oneOf": [ + { + "type": "object", + "required": [ + "add_or_update" + ], + "properties": { + "add_or_update": { + "type": "object", + "required": [ + "addr", + "config" + ], + "properties": { + "addr": { + "type": "string" + }, + "config": { + "$ref": "#/definitions/VaultConfig" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "remove" + ], + "properties": { + "remove": { + "type": "object", + "required": [ + "addr" + ], + "properties": { + "addr": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + } + } + }, + "query": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "QueryMsg", + "oneOf": [ + { + "type": "object", + "required": [ + "owner" + ], + "properties": { + "owner": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "asset_params" + ], + "properties": { + "asset_params": { + "type": "object", + "required": [ + "denom" + ], + "properties": { + "denom": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "all_asset_params" + ], + "properties": { + "all_asset_params": { + "type": "object", + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "start_after": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "vault_config" + ], + "properties": { + "vault_config": { + "type": "object", + "required": [ + "address" + ], + "properties": { + "address": { + "description": "Address of vault", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "all_vault_configs" + ], + "properties": { + "all_vault_configs": { + "type": "object", + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "start_after": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "max_close_factor" + ], + "properties": { + "max_close_factor": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + "migrate": null, + "sudo": null, + "responses": { + "all_asset_params": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Array_of_AssetParamsResponse", + "type": "array", + "items": { + "$ref": "#/definitions/AssetParamsResponse" + }, + "definitions": { + "AssetParams": { + "type": "object", + "required": [ + "liquidation_bonus", + "liquidation_threshold", + "max_loan_to_value", + "red_bank", + "rover" + ], + "properties": { + "liquidation_bonus": { + "$ref": "#/definitions/Decimal" + }, + "liquidation_threshold": { + "$ref": "#/definitions/Decimal" + }, + "max_loan_to_value": { + "$ref": "#/definitions/Decimal" + }, + "red_bank": { + "$ref": "#/definitions/RedBankSettings" + }, + "rover": { + "$ref": "#/definitions/RoverSettings" + } + }, + "additionalProperties": false + }, + "AssetParamsResponse": { + "type": "object", + "required": [ + "denom", + "params" + ], + "properties": { + "denom": { + "type": "string" + }, + "params": { + "$ref": "#/definitions/AssetParams" + } + }, + "additionalProperties": false + }, + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + }, + "HighLeverageStrategyParams": { + "type": "object", + "required": [ + "liquidation_threshold", + "max_loan_to_value" + ], + "properties": { + "liquidation_threshold": { + "$ref": "#/definitions/Decimal" + }, + "max_loan_to_value": { + "$ref": "#/definitions/Decimal" + } + }, + "additionalProperties": false + }, + "RedBankSettings": { + "type": "object", + "required": [ + "borrow_enabled", + "deposit_cap", + "deposit_enabled" + ], + "properties": { + "borrow_enabled": { + "type": "boolean" + }, + "deposit_cap": { + "$ref": "#/definitions/Uint128" + }, + "deposit_enabled": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "RoverSettings": { + "type": "object", + "required": [ + "hls", + "whitelisted" + ], + "properties": { + "hls": { + "$ref": "#/definitions/HighLeverageStrategyParams" + }, + "whitelisted": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } + }, + "all_vault_configs": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Array_of_VaultConfig", + "type": "array", + "items": { + "$ref": "#/definitions/VaultConfig" + }, + "definitions": { + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + }, + "VaultConfig": { + "type": "object", + "required": [ + "deposit_cap", + "liquidation_threshold", + "max_loan_to_value", + "whitelisted" + ], + "properties": { + "deposit_cap": { + "$ref": "#/definitions/Coin" + }, + "liquidation_threshold": { + "$ref": "#/definitions/Decimal" + }, + "max_loan_to_value": { + "$ref": "#/definitions/Decimal" + }, + "whitelisted": { + "type": "boolean" + } + }, + "additionalProperties": false + } + } + }, + "asset_params": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "AssetParams", + "type": "object", + "required": [ + "liquidation_bonus", + "liquidation_threshold", + "max_loan_to_value", + "red_bank", + "rover" + ], + "properties": { + "liquidation_bonus": { + "$ref": "#/definitions/Decimal" + }, + "liquidation_threshold": { + "$ref": "#/definitions/Decimal" + }, + "max_loan_to_value": { + "$ref": "#/definitions/Decimal" + }, + "red_bank": { + "$ref": "#/definitions/RedBankSettings" + }, + "rover": { + "$ref": "#/definitions/RoverSettings" + } + }, + "additionalProperties": false, + "definitions": { + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + }, + "HighLeverageStrategyParams": { + "type": "object", + "required": [ + "liquidation_threshold", + "max_loan_to_value" + ], + "properties": { + "liquidation_threshold": { + "$ref": "#/definitions/Decimal" + }, + "max_loan_to_value": { + "$ref": "#/definitions/Decimal" + } + }, + "additionalProperties": false + }, + "RedBankSettings": { + "type": "object", + "required": [ + "borrow_enabled", + "deposit_cap", + "deposit_enabled" + ], + "properties": { + "borrow_enabled": { + "type": "boolean" + }, + "deposit_cap": { + "$ref": "#/definitions/Uint128" + }, + "deposit_enabled": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "RoverSettings": { + "type": "object", + "required": [ + "hls", + "whitelisted" + ], + "properties": { + "hls": { + "$ref": "#/definitions/HighLeverageStrategyParams" + }, + "whitelisted": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } + }, + "max_close_factor": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Decimal", + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + }, + "owner": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "OwnerResponse", + "description": "Returned from Owner.query()", + "type": "object", + "required": [ + "abolished", + "initialized" + ], + "properties": { + "abolished": { + "type": "boolean" + }, + "emergency_owner": { + "type": [ + "string", + "null" + ] + }, + "initialized": { + "type": "boolean" + }, + "owner": { + "type": [ + "string", + "null" + ] + }, + "proposed": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false + }, + "vault_config": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "VaultConfig", + "type": "object", + "required": [ + "deposit_cap", + "liquidation_threshold", + "max_loan_to_value", + "whitelisted" + ], + "properties": { + "deposit_cap": { + "$ref": "#/definitions/Coin" + }, + "liquidation_threshold": { + "$ref": "#/definitions/Decimal" + }, + "max_loan_to_value": { + "$ref": "#/definitions/Decimal" + }, + "whitelisted": { + "type": "boolean" + } + }, + "additionalProperties": false, + "definitions": { + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } + } + } +} diff --git a/schemas/mars-swapper-osmosis/mars-swapper-osmosis.json b/schemas/mars-swapper-osmosis/mars-swapper-osmosis.json new file mode 100644 index 000000000..1b71b9c5c --- /dev/null +++ b/schemas/mars-swapper-osmosis/mars-swapper-osmosis.json @@ -0,0 +1,514 @@ +{ + "contract_name": "mars-swapper-osmosis", + "contract_version": "1.0.1", + "idl_version": "1.0.0", + "instantiate": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "type": "object", + "required": [ + "owner" + ], + "properties": { + "owner": { + "description": "The contract's owner, who can update config", + "type": "string" + } + }, + "additionalProperties": false + }, + "execute": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Manges owner role state", + "type": "object", + "required": [ + "update_owner" + ], + "properties": { + "update_owner": { + "$ref": "#/definitions/OwnerUpdate" + } + }, + "additionalProperties": false + }, + { + "description": "Configure the route for swapping an asset\n\nThis is chain-specific, and can include parameters such as slippage tolerance and the routes for multi-step swaps", + "type": "object", + "required": [ + "set_route" + ], + "properties": { + "set_route": { + "type": "object", + "required": [ + "denom_in", + "denom_out", + "route" + ], + "properties": { + "denom_in": { + "type": "string" + }, + "denom_out": { + "type": "string" + }, + "route": { + "$ref": "#/definitions/OsmosisRoute" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Perform a swapper with an exact-in amount. Requires slippage allowance %.", + "type": "object", + "required": [ + "swap_exact_in" + ], + "properties": { + "swap_exact_in": { + "type": "object", + "required": [ + "coin_in", + "denom_out", + "slippage" + ], + "properties": { + "coin_in": { + "$ref": "#/definitions/Coin" + }, + "denom_out": { + "type": "string" + }, + "slippage": { + "$ref": "#/definitions/Decimal" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Send swapper results back to swapper. Also refunds extra if sent more than needed. Internal use only.", + "type": "object", + "required": [ + "transfer_result" + ], + "properties": { + "transfer_result": { + "type": "object", + "required": [ + "denom_in", + "denom_out", + "recipient" + ], + "properties": { + "denom_in": { + "type": "string" + }, + "denom_out": { + "type": "string" + }, + "recipient": { + "$ref": "#/definitions/Addr" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ], + "definitions": { + "Addr": { + "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", + "type": "string" + }, + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + }, + "OsmosisRoute": { + "type": "array", + "items": { + "$ref": "#/definitions/SwapAmountInRoute" + } + }, + "OwnerUpdate": { + "oneOf": [ + { + "description": "Proposes a new owner to take role. Only current owner can execute.", + "type": "object", + "required": [ + "propose_new_owner" + ], + "properties": { + "propose_new_owner": { + "type": "object", + "required": [ + "proposed" + ], + "properties": { + "proposed": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Clears the currently proposed owner. Only current owner can execute.", + "type": "string", + "enum": [ + "clear_proposed" + ] + }, + { + "description": "Promotes the proposed owner to be the current one. Only the proposed owner can execute.", + "type": "string", + "enum": [ + "accept_proposed" + ] + }, + { + "description": "Throws away the keys to the Owner role forever. Once done, no owner can ever be set later.", + "type": "string", + "enum": [ + "abolish_owner_role" + ] + }, + { + "description": "A separate entity managed by Owner that can be used for granting specific emergency powers.", + "type": "object", + "required": [ + "set_emergency_owner" + ], + "properties": { + "set_emergency_owner": { + "type": "object", + "required": [ + "emergency_owner" + ], + "properties": { + "emergency_owner": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Remove the entity in the Emergency Owner role", + "type": "string", + "enum": [ + "clear_emergency_owner" + ] + } + ] + }, + "SwapAmountInRoute": { + "description": "===================== MsgSwapExactAmountIn", + "type": "object", + "required": [ + "pool_id", + "token_out_denom" + ], + "properties": { + "pool_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "token_out_denom": { + "type": "string" + } + } + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } + }, + "query": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "QueryMsg", + "oneOf": [ + { + "description": "Query contract owner config", + "type": "object", + "required": [ + "owner" + ], + "properties": { + "owner": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Get route for swapping an input denom into an output denom", + "type": "object", + "required": [ + "route" + ], + "properties": { + "route": { + "type": "object", + "required": [ + "denom_in", + "denom_out" + ], + "properties": { + "denom_in": { + "type": "string" + }, + "denom_out": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Enumerate all swapper routes", + "type": "object", + "required": [ + "routes" + ], + "properties": { + "routes": { + "type": "object", + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "start_after": { + "type": [ + "array", + "null" + ], + "items": [ + { + "type": "string" + }, + { + "type": "string" + } + ], + "maxItems": 2, + "minItems": 2 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Return current spot price swapping In for Out Warning: Do not use this as an oracle price feed. Use Mars-Oracle for pricing.", + "type": "object", + "required": [ + "estimate_exact_in_swap" + ], + "properties": { + "estimate_exact_in_swap": { + "type": "object", + "required": [ + "coin_in", + "denom_out" + ], + "properties": { + "coin_in": { + "$ref": "#/definitions/Coin" + }, + "denom_out": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ], + "definitions": { + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } + }, + "migrate": null, + "sudo": null, + "responses": { + "estimate_exact_in_swap": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "EstimateExactInSwapResponse", + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + } + }, + "additionalProperties": false, + "definitions": { + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } + }, + "owner": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "OwnerResponse", + "description": "Returned from Owner.query()", + "type": "object", + "required": [ + "abolished", + "initialized" + ], + "properties": { + "abolished": { + "type": "boolean" + }, + "emergency_owner": { + "type": [ + "string", + "null" + ] + }, + "initialized": { + "type": "boolean" + }, + "owner": { + "type": [ + "string", + "null" + ] + }, + "proposed": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false + }, + "route": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "RouteResponse_for_Empty", + "type": "object", + "required": [ + "denom_in", + "denom_out", + "route" + ], + "properties": { + "denom_in": { + "type": "string" + }, + "denom_out": { + "type": "string" + }, + "route": { + "$ref": "#/definitions/Empty" + } + }, + "additionalProperties": false, + "definitions": { + "Empty": { + "description": "An empty struct that serves as a placeholder in different places, such as contracts that don't set a custom message.\n\nIt is designed to be expressable in correct JSON and JSON Schema but contains no meaningful data. Previously we used enums without cases, but those cannot represented as valid JSON Schema (https://github.com/CosmWasm/cosmwasm/issues/451)", + "type": "object" + } + } + }, + "routes": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Array_of_RouteResponse_for_Empty", + "type": "array", + "items": { + "$ref": "#/definitions/RouteResponse_for_Empty" + }, + "definitions": { + "Empty": { + "description": "An empty struct that serves as a placeholder in different places, such as contracts that don't set a custom message.\n\nIt is designed to be expressable in correct JSON and JSON Schema but contains no meaningful data. Previously we used enums without cases, but those cannot represented as valid JSON Schema (https://github.com/CosmWasm/cosmwasm/issues/451)", + "type": "object" + }, + "RouteResponse_for_Empty": { + "type": "object", + "required": [ + "denom_in", + "denom_out", + "route" + ], + "properties": { + "denom_in": { + "type": "string" + }, + "denom_out": { + "type": "string" + }, + "route": { + "$ref": "#/definitions/Empty" + } + }, + "additionalProperties": false + } + } + } + } +} diff --git a/scripts/.eslintrc.cjs b/scripts/.eslintrc.cjs index d8fc35a63..88a5fb312 100644 --- a/scripts/.eslintrc.cjs +++ b/scripts/.eslintrc.cjs @@ -16,5 +16,7 @@ module.exports = { rules: { '@typescript-eslint/restrict-template-expressions': 'off', '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/consistent-type-definitions': 'off', }, + ignorePatterns: ['.eslintrc.cjs', 'build', 'node_modules', 'generated', 'mars-oracle-osmosis'], } diff --git a/scripts/deploy/base/deployer.ts b/scripts/deploy/base/deployer.ts index 91a113b3b..02fbc1d43 100644 --- a/scripts/deploy/base/deployer.ts +++ b/scripts/deploy/base/deployer.ts @@ -50,7 +50,7 @@ export class Deployer { printGreen(`${this.config.chainId} :: ${name} : ${this.storage.codeIds[name]}`) } - async setOwnerAddr() { + setOwnerAddr() { if (this.config.multisigAddr) { this.storage.owner = this.config.multisigAddr } else { @@ -65,7 +65,7 @@ export class Deployer { return } - const { contractAddress: redBankContractAddress } = await this.client.instantiate( + const { contractAddress } = await this.client.instantiate( this.deployerAddress, codeId, msg, @@ -74,7 +74,7 @@ export class Deployer { { admin: this.storage.owner }, ) - this.storage.addresses[name] = redBankContractAddress + this.storage.addresses[name] = contractAddress printGreen( `${this.config.chainId} :: ${name} Contract Address : ${this.storage.addresses[name]}`, ) diff --git a/scripts/deploy/base/index.ts b/scripts/deploy/base/index.ts index 5d7e8ec4e..b691cf59b 100644 --- a/scripts/deploy/base/index.ts +++ b/scripts/deploy/base/index.ts @@ -30,7 +30,7 @@ export const taskRunner = async (config: DeploymentConfig) => { await deployer.upload('rewards-collector', `mars_rewards_collector_${config.chainName}.wasm`) // Instantiate contracts - await deployer.setOwnerAddr() + deployer.setOwnerAddr() await deployer.instantiateAddressProvider() await deployer.instantiateRedBank() await deployer.instantiateIncentives() diff --git a/scripts/package.json b/scripts/package.json index c20fcf870..303cfd959 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -13,22 +13,22 @@ "format-check": "prettier --ignore-path .gitignore --check ." }, "dependencies": { - "@cosmjs/cosmwasm-stargate": "^0.29.5", - "@cosmjs/proto-signing": "^0.29.5", - "@cosmjs/stargate": "^0.29.5", - "@cosmwasm/ts-codegen": "^0.24.0", + "@cosmjs/cosmwasm-stargate": "^0.30.1", + "@cosmjs/proto-signing": "^0.30.1", + "@cosmjs/stargate": "^0.30.1", + "@cosmwasm/ts-codegen": "^0.27.0", "chalk": "4.1.2", - "cosmjs-types": "^0.6.1", + "cosmjs-types": "^0.7.2", "prepend-file": "^2.0.1" }, "devDependencies": { - "@types/node": "^18.11.18", - "@typescript-eslint/eslint-plugin": "^5.49.0", - "@typescript-eslint/parser": "^5.49.0", + "@types/node": "^20.1.1", + "@typescript-eslint/eslint-plugin": "^5.59.5", + "@typescript-eslint/parser": "^5.59.5", "cosmjs-types": "^0.6.1", - "eslint": "^8.32.0", - "eslint-config-prettier": "^8.6.0", - "prettier": "^2.8.3", - "typescript": "^4.9.4" + "eslint": "^8.40.0", + "eslint-config-prettier": "^8.8.0", + "prettier": "^2.8.8", + "typescript": "^5.0.4" } } diff --git a/scripts/tsconfig.json b/scripts/tsconfig.json index 7b3570c4a..be7ea699b 100644 --- a/scripts/tsconfig.json +++ b/scripts/tsconfig.json @@ -23,7 +23,6 @@ "noImplicitReturns": true, "noImplicitThis": true, "strictNullChecks": true, - "suppressImplicitAnyIndexErrors": true, "allowSyntheticDefaultImports": true, "skipLibCheck": true }, diff --git a/scripts/types/generated/mars-params/MarsParams.client.ts b/scripts/types/generated/mars-params/MarsParams.client.ts new file mode 100644 index 000000000..744cd3a51 --- /dev/null +++ b/scripts/types/generated/mars-params/MarsParams.client.ts @@ -0,0 +1,256 @@ +// @ts-nocheck +/** + * This file was automatically generated by @cosmwasm/ts-codegen@0.27.0. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run the @cosmwasm/ts-codegen generate command to regenerate this file. + */ + +import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from '@cosmjs/cosmwasm-stargate' +import { StdFee } from '@cosmjs/amino' +import { + Decimal, + InstantiateMsg, + ExecuteMsg, + OwnerUpdate, + AssetParamsUpdate, + Uint128, + VaultConfigUpdate, + EmergencyUpdate, + RoverEmergencyUpdate, + RedBankEmergencyUpdate, + AssetParams, + RedBankSettings, + RoverSettings, + HighLeverageStrategyParams, + VaultConfig, + Coin, + QueryMsg, + ArrayOfAssetParamsResponse, + AssetParamsResponse, + ArrayOfVaultConfig, + OwnerResponse, +} from './MarsParams.types' +export interface MarsParamsReadOnlyInterface { + contractAddress: string + owner: () => Promise + assetParams: ({ denom }: { denom: string }) => Promise + allAssetParams: ({ + limit, + startAfter, + }: { + limit?: number + startAfter?: string + }) => Promise + vaultConfig: ({ address }: { address: string }) => Promise + allVaultConfigs: ({ + limit, + startAfter, + }: { + limit?: number + startAfter?: string + }) => Promise + maxCloseFactor: () => Promise +} +export class MarsParamsQueryClient implements MarsParamsReadOnlyInterface { + client: CosmWasmClient + contractAddress: string + + constructor(client: CosmWasmClient, contractAddress: string) { + this.client = client + this.contractAddress = contractAddress + this.owner = this.owner.bind(this) + this.assetParams = this.assetParams.bind(this) + this.allAssetParams = this.allAssetParams.bind(this) + this.vaultConfig = this.vaultConfig.bind(this) + this.allVaultConfigs = this.allVaultConfigs.bind(this) + this.maxCloseFactor = this.maxCloseFactor.bind(this) + } + + owner = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + owner: {}, + }) + } + assetParams = async ({ denom }: { denom: string }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + asset_params: { + denom, + }, + }) + } + allAssetParams = async ({ + limit, + startAfter, + }: { + limit?: number + startAfter?: string + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + all_asset_params: { + limit, + start_after: startAfter, + }, + }) + } + vaultConfig = async ({ address }: { address: string }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + vault_config: { + address, + }, + }) + } + allVaultConfigs = async ({ + limit, + startAfter, + }: { + limit?: number + startAfter?: string + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + all_vault_configs: { + limit, + start_after: startAfter, + }, + }) + } + maxCloseFactor = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + max_close_factor: {}, + }) + } +} +export interface MarsParamsInterface extends MarsParamsReadOnlyInterface { + contractAddress: string + sender: string + updateOwner: ( + ownerUpdate: OwnerUpdate, + fee?: number | StdFee | 'auto', + memo?: string, + funds?: Coin[], + ) => Promise + updateMaxCloseFactor: ( + fee?: number | StdFee | 'auto', + memo?: string, + funds?: Coin[], + ) => Promise + updateAssetParams: ( + assetParamsUpdate: AssetParamsUpdate, + fee?: number | StdFee | 'auto', + memo?: string, + funds?: Coin[], + ) => Promise + updateVaultConfig: ( + vaultConfigUpdate: VaultConfigUpdate, + fee?: number | StdFee | 'auto', + memo?: string, + funds?: Coin[], + ) => Promise + emergencyUpdate: ( + emergencyUpdate: EmergencyUpdate, + fee?: number | StdFee | 'auto', + memo?: string, + funds?: Coin[], + ) => Promise +} +export class MarsParamsClient extends MarsParamsQueryClient implements MarsParamsInterface { + client: SigningCosmWasmClient + sender: string + contractAddress: string + + constructor(client: SigningCosmWasmClient, sender: string, contractAddress: string) { + super(client, contractAddress) + this.client = client + this.sender = sender + this.contractAddress = contractAddress + this.updateOwner = this.updateOwner.bind(this) + this.updateMaxCloseFactor = this.updateMaxCloseFactor.bind(this) + this.updateAssetParams = this.updateAssetParams.bind(this) + this.updateVaultConfig = this.updateVaultConfig.bind(this) + this.emergencyUpdate = this.emergencyUpdate.bind(this) + } + + updateOwner = async ( + ownerUpdate: OwnerUpdate, + fee: number | StdFee | 'auto' = 'auto', + memo?: string, + funds?: Coin[], + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + update_owner: ownerUpdate, + }, + fee, + memo, + funds, + ) + } + updateMaxCloseFactor = async ( + fee: number | StdFee | 'auto' = 'auto', + memo?: string, + funds?: Coin[], + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + update_max_close_factor: {}, + }, + fee, + memo, + funds, + ) + } + updateAssetParams = async ( + assetParamsUpdate: AssetParamsUpdate, + fee: number | StdFee | 'auto' = 'auto', + memo?: string, + funds?: Coin[], + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + update_asset_params: assetParamsUpdate, + }, + fee, + memo, + funds, + ) + } + updateVaultConfig = async ( + vaultConfigUpdate: VaultConfigUpdate, + fee: number | StdFee | 'auto' = 'auto', + memo?: string, + funds?: Coin[], + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + update_vault_config: vaultConfigUpdate, + }, + fee, + memo, + funds, + ) + } + emergencyUpdate = async ( + emergencyUpdate: EmergencyUpdate, + fee: number | StdFee | 'auto' = 'auto', + memo?: string, + funds?: Coin[], + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + emergency_update: emergencyUpdate, + }, + fee, + memo, + funds, + ) + } +} diff --git a/scripts/types/generated/mars-params/MarsParams.react-query.ts b/scripts/types/generated/mars-params/MarsParams.react-query.ts new file mode 100644 index 000000000..da3150446 --- /dev/null +++ b/scripts/types/generated/mars-params/MarsParams.react-query.ts @@ -0,0 +1,288 @@ +// @ts-nocheck +/** + * This file was automatically generated by @cosmwasm/ts-codegen@0.27.0. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run the @cosmwasm/ts-codegen generate command to regenerate this file. + */ + +import { UseQueryOptions, useQuery, useMutation, UseMutationOptions } from '@tanstack/react-query' +import { ExecuteResult } from '@cosmjs/cosmwasm-stargate' +import { StdFee } from '@cosmjs/amino' +import { + Decimal, + InstantiateMsg, + ExecuteMsg, + OwnerUpdate, + AssetParamsUpdate, + Uint128, + VaultConfigUpdate, + EmergencyUpdate, + RoverEmergencyUpdate, + RedBankEmergencyUpdate, + AssetParams, + RedBankSettings, + RoverSettings, + HighLeverageStrategyParams, + VaultConfig, + Coin, + QueryMsg, + ArrayOfAssetParamsResponse, + AssetParamsResponse, + ArrayOfVaultConfig, + OwnerResponse, +} from './MarsParams.types' +import { MarsParamsQueryClient, MarsParamsClient } from './MarsParams.client' +export const marsParamsQueryKeys = { + contract: [ + { + contract: 'marsParams', + }, + ] as const, + address: (contractAddress: string | undefined) => + [{ ...marsParamsQueryKeys.contract[0], address: contractAddress }] as const, + owner: (contractAddress: string | undefined, args?: Record) => + [{ ...marsParamsQueryKeys.address(contractAddress)[0], method: 'owner', args }] as const, + assetParams: (contractAddress: string | undefined, args?: Record) => + [{ ...marsParamsQueryKeys.address(contractAddress)[0], method: 'asset_params', args }] as const, + allAssetParams: (contractAddress: string | undefined, args?: Record) => + [ + { ...marsParamsQueryKeys.address(contractAddress)[0], method: 'all_asset_params', args }, + ] as const, + vaultConfig: (contractAddress: string | undefined, args?: Record) => + [{ ...marsParamsQueryKeys.address(contractAddress)[0], method: 'vault_config', args }] as const, + allVaultConfigs: (contractAddress: string | undefined, args?: Record) => + [ + { ...marsParamsQueryKeys.address(contractAddress)[0], method: 'all_vault_configs', args }, + ] as const, + maxCloseFactor: (contractAddress: string | undefined, args?: Record) => + [ + { ...marsParamsQueryKeys.address(contractAddress)[0], method: 'max_close_factor', args }, + ] as const, +} +export interface MarsParamsReactQuery { + client: MarsParamsQueryClient | undefined + options?: Omit< + UseQueryOptions, + "'queryKey' | 'queryFn' | 'initialData'" + > & { + initialData?: undefined + } +} +export interface MarsParamsMaxCloseFactorQuery + extends MarsParamsReactQuery {} +export function useMarsParamsMaxCloseFactorQuery({ + client, + options, +}: MarsParamsMaxCloseFactorQuery) { + return useQuery( + marsParamsQueryKeys.maxCloseFactor(client?.contractAddress), + () => (client ? client.maxCloseFactor() : Promise.reject(new Error('Invalid client'))), + { ...options, enabled: !!client && (options?.enabled != undefined ? options.enabled : true) }, + ) +} +export interface MarsParamsAllVaultConfigsQuery + extends MarsParamsReactQuery { + args: { + limit?: number + startAfter?: string + } +} +export function useMarsParamsAllVaultConfigsQuery({ + client, + args, + options, +}: MarsParamsAllVaultConfigsQuery) { + return useQuery( + marsParamsQueryKeys.allVaultConfigs(client?.contractAddress, args), + () => + client + ? client.allVaultConfigs({ + limit: args.limit, + startAfter: args.startAfter, + }) + : Promise.reject(new Error('Invalid client')), + { ...options, enabled: !!client && (options?.enabled != undefined ? options.enabled : true) }, + ) +} +export interface MarsParamsVaultConfigQuery + extends MarsParamsReactQuery { + args: { + address: string + } +} +export function useMarsParamsVaultConfigQuery({ + client, + args, + options, +}: MarsParamsVaultConfigQuery) { + return useQuery( + marsParamsQueryKeys.vaultConfig(client?.contractAddress, args), + () => + client + ? client.vaultConfig({ + address: args.address, + }) + : Promise.reject(new Error('Invalid client')), + { ...options, enabled: !!client && (options?.enabled != undefined ? options.enabled : true) }, + ) +} +export interface MarsParamsAllAssetParamsQuery + extends MarsParamsReactQuery { + args: { + limit?: number + startAfter?: string + } +} +export function useMarsParamsAllAssetParamsQuery({ + client, + args, + options, +}: MarsParamsAllAssetParamsQuery) { + return useQuery( + marsParamsQueryKeys.allAssetParams(client?.contractAddress, args), + () => + client + ? client.allAssetParams({ + limit: args.limit, + startAfter: args.startAfter, + }) + : Promise.reject(new Error('Invalid client')), + { ...options, enabled: !!client && (options?.enabled != undefined ? options.enabled : true) }, + ) +} +export interface MarsParamsAssetParamsQuery + extends MarsParamsReactQuery { + args: { + denom: string + } +} +export function useMarsParamsAssetParamsQuery({ + client, + args, + options, +}: MarsParamsAssetParamsQuery) { + return useQuery( + marsParamsQueryKeys.assetParams(client?.contractAddress, args), + () => + client + ? client.assetParams({ + denom: args.denom, + }) + : Promise.reject(new Error('Invalid client')), + { ...options, enabled: !!client && (options?.enabled != undefined ? options.enabled : true) }, + ) +} +export interface MarsParamsOwnerQuery extends MarsParamsReactQuery {} +export function useMarsParamsOwnerQuery({ + client, + options, +}: MarsParamsOwnerQuery) { + return useQuery( + marsParamsQueryKeys.owner(client?.contractAddress), + () => (client ? client.owner() : Promise.reject(new Error('Invalid client'))), + { ...options, enabled: !!client && (options?.enabled != undefined ? options.enabled : true) }, + ) +} +export interface MarsParamsEmergencyUpdateMutation { + client: MarsParamsClient + msg: EmergencyUpdate + args?: { + fee?: number | StdFee | 'auto' + memo?: string + funds?: Coin[] + } +} +export function useMarsParamsEmergencyUpdateMutation( + options?: Omit< + UseMutationOptions, + 'mutationFn' + >, +) { + return useMutation( + ({ client, msg, args: { fee, memo, funds } = {} }) => + client.emergencyUpdate(msg, fee, memo, funds), + options, + ) +} +export interface MarsParamsUpdateVaultConfigMutation { + client: MarsParamsClient + msg: VaultConfigUpdate + args?: { + fee?: number | StdFee | 'auto' + memo?: string + funds?: Coin[] + } +} +export function useMarsParamsUpdateVaultConfigMutation( + options?: Omit< + UseMutationOptions, + 'mutationFn' + >, +) { + return useMutation( + ({ client, msg, args: { fee, memo, funds } = {} }) => + client.updateVaultConfig(msg, fee, memo, funds), + options, + ) +} +export interface MarsParamsUpdateAssetParamsMutation { + client: MarsParamsClient + msg: AssetParamsUpdate + args?: { + fee?: number | StdFee | 'auto' + memo?: string + funds?: Coin[] + } +} +export function useMarsParamsUpdateAssetParamsMutation( + options?: Omit< + UseMutationOptions, + 'mutationFn' + >, +) { + return useMutation( + ({ client, msg, args: { fee, memo, funds } = {} }) => + client.updateAssetParams(msg, fee, memo, funds), + options, + ) +} +export interface MarsParamsUpdateMaxCloseFactorMutation { + client: MarsParamsClient + args?: { + fee?: number | StdFee | 'auto' + memo?: string + funds?: Coin[] + } +} +export function useMarsParamsUpdateMaxCloseFactorMutation( + options?: Omit< + UseMutationOptions, + 'mutationFn' + >, +) { + return useMutation( + ({ client, msg, args: { fee, memo, funds } = {} }) => + client.updateMaxCloseFactor(msg, fee, memo, funds), + options, + ) +} +export interface MarsParamsUpdateOwnerMutation { + client: MarsParamsClient + msg: OwnerUpdate + args?: { + fee?: number | StdFee | 'auto' + memo?: string + funds?: Coin[] + } +} +export function useMarsParamsUpdateOwnerMutation( + options?: Omit< + UseMutationOptions, + 'mutationFn' + >, +) { + return useMutation( + ({ client, msg, args: { fee, memo, funds } = {} }) => client.updateOwner(msg, fee, memo, funds), + options, + ) +} diff --git a/scripts/types/generated/mars-params/MarsParams.types.ts b/scripts/types/generated/mars-params/MarsParams.types.ts new file mode 100644 index 000000000..67cef0548 --- /dev/null +++ b/scripts/types/generated/mars-params/MarsParams.types.ts @@ -0,0 +1,155 @@ +// @ts-nocheck +/** + * This file was automatically generated by @cosmwasm/ts-codegen@0.27.0. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run the @cosmwasm/ts-codegen generate command to regenerate this file. + */ + +export type Decimal = string +export interface InstantiateMsg { + max_close_factor: Decimal + owner: string +} +export type ExecuteMsg = + | { + update_owner: OwnerUpdate + } + | { + update_max_close_factor: Decimal + } + | { + update_asset_params: AssetParamsUpdate + } + | { + update_vault_config: VaultConfigUpdate + } + | { + emergency_update: EmergencyUpdate + } +export type OwnerUpdate = + | { + propose_new_owner: { + proposed: string + } + } + | 'clear_proposed' + | 'accept_proposed' + | 'abolish_owner_role' + | { + set_emergency_owner: { + emergency_owner: string + } + } + | 'clear_emergency_owner' +export type AssetParamsUpdate = { + add_or_update: { + denom: string + params: AssetParams + } +} +export type Uint128 = string +export type VaultConfigUpdate = + | { + add_or_update: { + addr: string + config: VaultConfig + } + } + | { + remove: { + addr: string + } + } +export type EmergencyUpdate = + | { + rover: RoverEmergencyUpdate + } + | { + red_bank: RedBankEmergencyUpdate + } +export type RoverEmergencyUpdate = + | { + set_zero_max_ltv_on_vault: string + } + | { + set_zero_deposit_cap_on_vault: string + } + | { + disallow_coin: string + } +export type RedBankEmergencyUpdate = { + disable_borrowing: string +} +export interface AssetParams { + liquidation_bonus: Decimal + liquidation_threshold: Decimal + max_loan_to_value: Decimal + red_bank: RedBankSettings + rover: RoverSettings +} +export interface RedBankSettings { + borrow_enabled: boolean + deposit_cap: Uint128 + deposit_enabled: boolean +} +export interface RoverSettings { + hls: HighLeverageStrategyParams + whitelisted: boolean +} +export interface HighLeverageStrategyParams { + liquidation_threshold: Decimal + max_loan_to_value: Decimal +} +export interface VaultConfig { + deposit_cap: Coin + liquidation_threshold: Decimal + max_loan_to_value: Decimal + whitelisted: boolean +} +export interface Coin { + amount: Uint128 + denom: string + [k: string]: unknown +} +export type QueryMsg = + | { + owner: {} + } + | { + asset_params: { + denom: string + } + } + | { + all_asset_params: { + limit?: number | null + start_after?: string | null + } + } + | { + vault_config: { + address: string + } + } + | { + all_vault_configs: { + limit?: number | null + start_after?: string | null + } + } + | { + max_close_factor: {} + } +export type ArrayOfAssetParamsResponse = AssetParamsResponse[] +export interface AssetParamsResponse { + denom: string + params: AssetParams +} +export type ArrayOfVaultConfig = VaultConfig[] +export interface OwnerResponse { + abolished: boolean + emergency_owner?: string | null + initialized: boolean + owner?: string | null + proposed?: string | null +} diff --git a/scripts/types/generated/mars-params/bundle.ts b/scripts/types/generated/mars-params/bundle.ts new file mode 100644 index 000000000..b2e209d21 --- /dev/null +++ b/scripts/types/generated/mars-params/bundle.ts @@ -0,0 +1,13 @@ +// @ts-nocheck +/** + * This file was automatically generated by @cosmwasm/ts-codegen@0.27.0. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run the @cosmwasm/ts-codegen generate command to regenerate this file. + */ + +import * as _0 from './MarsParams.types' +import * as _1 from './MarsParams.client' +import * as _2 from './MarsParams.react-query' +export namespace contracts { + export const MarsParams = { ..._0, ..._1, ..._2 } +} diff --git a/scripts/types/generated/mars-swapper-osmosis/MarsSwapperOsmosis.client.ts b/scripts/types/generated/mars-swapper-osmosis/MarsSwapperOsmosis.client.ts new file mode 100644 index 000000000..66333f46e --- /dev/null +++ b/scripts/types/generated/mars-swapper-osmosis/MarsSwapperOsmosis.client.ts @@ -0,0 +1,288 @@ +// @ts-nocheck +/** + * This file was automatically generated by @cosmwasm/ts-codegen@0.27.0. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run the @cosmwasm/ts-codegen generate command to regenerate this file. + */ + +import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from '@cosmjs/cosmwasm-stargate' +import { StdFee } from '@cosmjs/amino' +import { + InstantiateMsg, + ExecuteMsg, + OwnerUpdate, + OsmosisRoute, + Uint128, + Decimal, + Addr, + SwapAmountInRoute, + Coin, + QueryMsg, + EstimateExactInSwapResponse, + OwnerResponse, + RouteResponseForEmpty, + Empty, + ArrayOfRouteResponseForEmpty, +} from './MarsSwapperOsmosis.types' +export interface MarsSwapperOsmosisReadOnlyInterface { + contractAddress: string + owner: () => Promise + route: ({ + denomIn, + denomOut, + }: { + denomIn: string + denomOut: string + }) => Promise + routes: ({ + limit, + startAfter, + }: { + limit?: number + startAfter?: string[][] + }) => Promise + estimateExactInSwap: ({ + coinIn, + denomOut, + }: { + coinIn: Coin + denomOut: string + }) => Promise +} +export class MarsSwapperOsmosisQueryClient implements MarsSwapperOsmosisReadOnlyInterface { + client: CosmWasmClient + contractAddress: string + + constructor(client: CosmWasmClient, contractAddress: string) { + this.client = client + this.contractAddress = contractAddress + this.owner = this.owner.bind(this) + this.route = this.route.bind(this) + this.routes = this.routes.bind(this) + this.estimateExactInSwap = this.estimateExactInSwap.bind(this) + } + + owner = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + owner: {}, + }) + } + route = async ({ + denomIn, + denomOut, + }: { + denomIn: string + denomOut: string + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + route: { + denom_in: denomIn, + denom_out: denomOut, + }, + }) + } + routes = async ({ + limit, + startAfter, + }: { + limit?: number + startAfter?: string[][] + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + routes: { + limit, + start_after: startAfter, + }, + }) + } + estimateExactInSwap = async ({ + coinIn, + denomOut, + }: { + coinIn: Coin + denomOut: string + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + estimate_exact_in_swap: { + coin_in: coinIn, + denom_out: denomOut, + }, + }) + } +} +export interface MarsSwapperOsmosisInterface extends MarsSwapperOsmosisReadOnlyInterface { + contractAddress: string + sender: string + updateOwner: ( + ownerUpdate: OwnerUpdate, + fee?: number | StdFee | 'auto', + memo?: string, + funds?: Coin[], + ) => Promise + setRoute: ( + { + denomIn, + denomOut, + route, + }: { + denomIn: string + denomOut: string + route: OsmosisRoute + }, + fee?: number | StdFee | 'auto', + memo?: string, + funds?: Coin[], + ) => Promise + swapExactIn: ( + { + coinIn, + denomOut, + slippage, + }: { + coinIn: Coin + denomOut: string + slippage: Decimal + }, + fee?: number | StdFee | 'auto', + memo?: string, + funds?: Coin[], + ) => Promise + transferResult: ( + { + denomIn, + denomOut, + recipient, + }: { + denomIn: string + denomOut: string + recipient: Addr + }, + fee?: number | StdFee | 'auto', + memo?: string, + funds?: Coin[], + ) => Promise +} +export class MarsSwapperOsmosisClient + extends MarsSwapperOsmosisQueryClient + implements MarsSwapperOsmosisInterface +{ + client: SigningCosmWasmClient + sender: string + contractAddress: string + + constructor(client: SigningCosmWasmClient, sender: string, contractAddress: string) { + super(client, contractAddress) + this.client = client + this.sender = sender + this.contractAddress = contractAddress + this.updateOwner = this.updateOwner.bind(this) + this.setRoute = this.setRoute.bind(this) + this.swapExactIn = this.swapExactIn.bind(this) + this.transferResult = this.transferResult.bind(this) + } + + updateOwner = async ( + ownerUpdate: OwnerUpdate, + fee: number | StdFee | 'auto' = 'auto', + memo?: string, + funds?: Coin[], + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + update_owner: ownerUpdate, + }, + fee, + memo, + funds, + ) + } + setRoute = async ( + { + denomIn, + denomOut, + route, + }: { + denomIn: string + denomOut: string + route: OsmosisRoute + }, + fee: number | StdFee | 'auto' = 'auto', + memo?: string, + funds?: Coin[], + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + set_route: { + denom_in: denomIn, + denom_out: denomOut, + route, + }, + }, + fee, + memo, + funds, + ) + } + swapExactIn = async ( + { + coinIn, + denomOut, + slippage, + }: { + coinIn: Coin + denomOut: string + slippage: Decimal + }, + fee: number | StdFee | 'auto' = 'auto', + memo?: string, + funds?: Coin[], + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + swap_exact_in: { + coin_in: coinIn, + denom_out: denomOut, + slippage, + }, + }, + fee, + memo, + funds, + ) + } + transferResult = async ( + { + denomIn, + denomOut, + recipient, + }: { + denomIn: string + denomOut: string + recipient: Addr + }, + fee: number | StdFee | 'auto' = 'auto', + memo?: string, + funds?: Coin[], + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + transfer_result: { + denom_in: denomIn, + denom_out: denomOut, + recipient, + }, + }, + fee, + memo, + funds, + ) + } +} diff --git a/scripts/types/generated/mars-swapper-osmosis/MarsSwapperOsmosis.react-query.ts b/scripts/types/generated/mars-swapper-osmosis/MarsSwapperOsmosis.react-query.ts new file mode 100644 index 000000000..c51ffbda5 --- /dev/null +++ b/scripts/types/generated/mars-swapper-osmosis/MarsSwapperOsmosis.react-query.ts @@ -0,0 +1,246 @@ +// @ts-nocheck +/** + * This file was automatically generated by @cosmwasm/ts-codegen@0.27.0. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run the @cosmwasm/ts-codegen generate command to regenerate this file. + */ + +import { UseQueryOptions, useQuery, useMutation, UseMutationOptions } from '@tanstack/react-query' +import { ExecuteResult } from '@cosmjs/cosmwasm-stargate' +import { StdFee } from '@cosmjs/amino' +import { + InstantiateMsg, + ExecuteMsg, + OwnerUpdate, + OsmosisRoute, + Uint128, + Decimal, + Addr, + SwapAmountInRoute, + Coin, + QueryMsg, + EstimateExactInSwapResponse, + OwnerResponse, + RouteResponseForEmpty, + Empty, + ArrayOfRouteResponseForEmpty, +} from './MarsSwapperOsmosis.types' +import { + MarsSwapperOsmosisQueryClient, + MarsSwapperOsmosisClient, +} from './MarsSwapperOsmosis.client' +export const marsSwapperOsmosisQueryKeys = { + contract: [ + { + contract: 'marsSwapperOsmosis', + }, + ] as const, + address: (contractAddress: string | undefined) => + [{ ...marsSwapperOsmosisQueryKeys.contract[0], address: contractAddress }] as const, + owner: (contractAddress: string | undefined, args?: Record) => + [ + { ...marsSwapperOsmosisQueryKeys.address(contractAddress)[0], method: 'owner', args }, + ] as const, + route: (contractAddress: string | undefined, args?: Record) => + [ + { ...marsSwapperOsmosisQueryKeys.address(contractAddress)[0], method: 'route', args }, + ] as const, + routes: (contractAddress: string | undefined, args?: Record) => + [ + { ...marsSwapperOsmosisQueryKeys.address(contractAddress)[0], method: 'routes', args }, + ] as const, + estimateExactInSwap: (contractAddress: string | undefined, args?: Record) => + [ + { + ...marsSwapperOsmosisQueryKeys.address(contractAddress)[0], + method: 'estimate_exact_in_swap', + args, + }, + ] as const, +} +export interface MarsSwapperOsmosisReactQuery { + client: MarsSwapperOsmosisQueryClient | undefined + options?: Omit< + UseQueryOptions, + "'queryKey' | 'queryFn' | 'initialData'" + > & { + initialData?: undefined + } +} +export interface MarsSwapperOsmosisEstimateExactInSwapQuery + extends MarsSwapperOsmosisReactQuery { + args: { + coinIn: Coin + denomOut: string + } +} +export function useMarsSwapperOsmosisEstimateExactInSwapQuery({ + client, + args, + options, +}: MarsSwapperOsmosisEstimateExactInSwapQuery) { + return useQuery( + marsSwapperOsmosisQueryKeys.estimateExactInSwap(client?.contractAddress, args), + () => + client + ? client.estimateExactInSwap({ + coinIn: args.coinIn, + denomOut: args.denomOut, + }) + : Promise.reject(new Error('Invalid client')), + { ...options, enabled: !!client && (options?.enabled != undefined ? options.enabled : true) }, + ) +} +export interface MarsSwapperOsmosisRoutesQuery + extends MarsSwapperOsmosisReactQuery { + args: { + limit?: number + startAfter?: string[][] + } +} +export function useMarsSwapperOsmosisRoutesQuery({ + client, + args, + options, +}: MarsSwapperOsmosisRoutesQuery) { + return useQuery( + marsSwapperOsmosisQueryKeys.routes(client?.contractAddress, args), + () => + client + ? client.routes({ + limit: args.limit, + startAfter: args.startAfter, + }) + : Promise.reject(new Error('Invalid client')), + { ...options, enabled: !!client && (options?.enabled != undefined ? options.enabled : true) }, + ) +} +export interface MarsSwapperOsmosisRouteQuery + extends MarsSwapperOsmosisReactQuery { + args: { + denomIn: string + denomOut: string + } +} +export function useMarsSwapperOsmosisRouteQuery({ + client, + args, + options, +}: MarsSwapperOsmosisRouteQuery) { + return useQuery( + marsSwapperOsmosisQueryKeys.route(client?.contractAddress, args), + () => + client + ? client.route({ + denomIn: args.denomIn, + denomOut: args.denomOut, + }) + : Promise.reject(new Error('Invalid client')), + { ...options, enabled: !!client && (options?.enabled != undefined ? options.enabled : true) }, + ) +} +export interface MarsSwapperOsmosisOwnerQuery + extends MarsSwapperOsmosisReactQuery {} +export function useMarsSwapperOsmosisOwnerQuery({ + client, + options, +}: MarsSwapperOsmosisOwnerQuery) { + return useQuery( + marsSwapperOsmosisQueryKeys.owner(client?.contractAddress), + () => (client ? client.owner() : Promise.reject(new Error('Invalid client'))), + { ...options, enabled: !!client && (options?.enabled != undefined ? options.enabled : true) }, + ) +} +export interface MarsSwapperOsmosisTransferResultMutation { + client: MarsSwapperOsmosisClient + msg: { + denomIn: string + denomOut: string + recipient: Addr + } + args?: { + fee?: number | StdFee | 'auto' + memo?: string + funds?: Coin[] + } +} +export function useMarsSwapperOsmosisTransferResultMutation( + options?: Omit< + UseMutationOptions, + 'mutationFn' + >, +) { + return useMutation( + ({ client, msg, args: { fee, memo, funds } = {} }) => + client.transferResult(msg, fee, memo, funds), + options, + ) +} +export interface MarsSwapperOsmosisSwapExactInMutation { + client: MarsSwapperOsmosisClient + msg: { + coinIn: Coin + denomOut: string + slippage: Decimal + } + args?: { + fee?: number | StdFee | 'auto' + memo?: string + funds?: Coin[] + } +} +export function useMarsSwapperOsmosisSwapExactInMutation( + options?: Omit< + UseMutationOptions, + 'mutationFn' + >, +) { + return useMutation( + ({ client, msg, args: { fee, memo, funds } = {} }) => client.swapExactIn(msg, fee, memo, funds), + options, + ) +} +export interface MarsSwapperOsmosisSetRouteMutation { + client: MarsSwapperOsmosisClient + msg: { + denomIn: string + denomOut: string + route: OsmosisRoute + } + args?: { + fee?: number | StdFee | 'auto' + memo?: string + funds?: Coin[] + } +} +export function useMarsSwapperOsmosisSetRouteMutation( + options?: Omit< + UseMutationOptions, + 'mutationFn' + >, +) { + return useMutation( + ({ client, msg, args: { fee, memo, funds } = {} }) => client.setRoute(msg, fee, memo, funds), + options, + ) +} +export interface MarsSwapperOsmosisUpdateOwnerMutation { + client: MarsSwapperOsmosisClient + msg: OwnerUpdate + args?: { + fee?: number | StdFee | 'auto' + memo?: string + funds?: Coin[] + } +} +export function useMarsSwapperOsmosisUpdateOwnerMutation( + options?: Omit< + UseMutationOptions, + 'mutationFn' + >, +) { + return useMutation( + ({ client, msg, args: { fee, memo, funds } = {} }) => client.updateOwner(msg, fee, memo, funds), + options, + ) +} diff --git a/scripts/types/generated/mars-swapper-osmosis/MarsSwapperOsmosis.types.ts b/scripts/types/generated/mars-swapper-osmosis/MarsSwapperOsmosis.types.ts new file mode 100644 index 000000000..5c78cf963 --- /dev/null +++ b/scripts/types/generated/mars-swapper-osmosis/MarsSwapperOsmosis.types.ts @@ -0,0 +1,105 @@ +// @ts-nocheck +/** + * This file was automatically generated by @cosmwasm/ts-codegen@0.27.0. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run the @cosmwasm/ts-codegen generate command to regenerate this file. + */ + +export interface InstantiateMsg { + owner: string +} +export type ExecuteMsg = + | { + update_owner: OwnerUpdate + } + | { + set_route: { + denom_in: string + denom_out: string + route: OsmosisRoute + } + } + | { + swap_exact_in: { + coin_in: Coin + denom_out: string + slippage: Decimal + } + } + | { + transfer_result: { + denom_in: string + denom_out: string + recipient: Addr + } + } +export type OwnerUpdate = + | { + propose_new_owner: { + proposed: string + } + } + | 'clear_proposed' + | 'accept_proposed' + | 'abolish_owner_role' + | { + set_emergency_owner: { + emergency_owner: string + } + } + | 'clear_emergency_owner' +export type OsmosisRoute = SwapAmountInRoute[] +export type Uint128 = string +export type Decimal = string +export type Addr = string +export interface SwapAmountInRoute { + pool_id: number + token_out_denom: string + [k: string]: unknown +} +export interface Coin { + amount: Uint128 + denom: string + [k: string]: unknown +} +export type QueryMsg = + | { + owner: {} + } + | { + route: { + denom_in: string + denom_out: string + } + } + | { + routes: { + limit?: number | null + start_after?: [string, string] | null + } + } + | { + estimate_exact_in_swap: { + coin_in: Coin + denom_out: string + } + } +export interface EstimateExactInSwapResponse { + amount: Uint128 +} +export interface OwnerResponse { + abolished: boolean + emergency_owner?: string | null + initialized: boolean + owner?: string | null + proposed?: string | null +} +export interface RouteResponseForEmpty { + denom_in: string + denom_out: string + route: Empty +} +export interface Empty { + [k: string]: unknown +} +export type ArrayOfRouteResponseForEmpty = RouteResponseForEmpty[] diff --git a/scripts/types/generated/mars-swapper-osmosis/bundle.ts b/scripts/types/generated/mars-swapper-osmosis/bundle.ts new file mode 100644 index 000000000..09a96fcdf --- /dev/null +++ b/scripts/types/generated/mars-swapper-osmosis/bundle.ts @@ -0,0 +1,13 @@ +// @ts-nocheck +/** + * This file was automatically generated by @cosmwasm/ts-codegen@0.27.0. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run the @cosmwasm/ts-codegen generate command to regenerate this file. + */ + +import * as _3 from './MarsSwapperOsmosis.types' +import * as _4 from './MarsSwapperOsmosis.client' +import * as _5 from './MarsSwapperOsmosis.react-query' +export namespace contracts { + export const MarsSwapperOsmosis = { ..._3, ..._4, ..._5 } +} diff --git a/scripts/types/mars-oracle-osmosis/MarsOracleOsmosis.client.ts b/scripts/types/mars-oracle-osmosis/MarsOracleOsmosis.client.ts new file mode 100644 index 000000000..da96b3af3 --- /dev/null +++ b/scripts/types/mars-oracle-osmosis/MarsOracleOsmosis.client.ts @@ -0,0 +1,221 @@ +// @ts-nocheck +/** + * This file was automatically generated by @cosmwasm/ts-codegen@0.24.0. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run the @cosmwasm/ts-codegen generate command to regenerate this file. + */ + +import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from '@cosmjs/cosmwasm-stargate' +import { Coin, StdFee } from '@cosmjs/amino' +import { + InstantiateMsg, + ExecuteMsg, + OsmosisPriceSource, + Decimal, + Downtime, + OwnerUpdate, + DowntimeDetector, + QueryMsg, + ConfigResponse, + PriceResponse, + PriceSourceResponseForString, + ArrayOfPriceSourceResponseForString, + ArrayOfPriceResponse, +} from './MarsOracleOsmosis.types' +export interface MarsOracleOsmosisReadOnlyInterface { + contractAddress: string + config: () => Promise + priceSource: ({ denom }: { denom: string }) => Promise + priceSources: ({ + limit, + startAfter, + }: { + limit?: number + startAfter?: string + }) => Promise + price: ({ denom }: { denom: string }) => Promise + prices: ({ + limit, + startAfter, + }: { + limit?: number + startAfter?: string + }) => Promise +} +export class MarsOracleOsmosisQueryClient implements MarsOracleOsmosisReadOnlyInterface { + client: CosmWasmClient + contractAddress: string + + constructor(client: CosmWasmClient, contractAddress: string) { + this.client = client + this.contractAddress = contractAddress + this.config = this.config.bind(this) + this.priceSource = this.priceSource.bind(this) + this.priceSources = this.priceSources.bind(this) + this.price = this.price.bind(this) + this.prices = this.prices.bind(this) + } + + config = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + config: {}, + }) + } + priceSource = async ({ denom }: { denom: string }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + price_source: { + denom, + }, + }) + } + priceSources = async ({ + limit, + startAfter, + }: { + limit?: number + startAfter?: string + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + price_sources: { + limit, + start_after: startAfter, + }, + }) + } + price = async ({ denom }: { denom: string }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + price: { + denom, + }, + }) + } + prices = async ({ + limit, + startAfter, + }: { + limit?: number + startAfter?: string + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + prices: { + limit, + start_after: startAfter, + }, + }) + } +} +export interface MarsOracleOsmosisInterface extends MarsOracleOsmosisReadOnlyInterface { + contractAddress: string + sender: string + setPriceSource: ( + { + denom, + priceSource, + }: { + denom: string + priceSource: OsmosisPriceSource + }, + fee?: number | StdFee | 'auto', + memo?: string, + funds?: Coin[], + ) => Promise + removePriceSource: ( + { + denom, + }: { + denom: string + }, + fee?: number | StdFee | 'auto', + memo?: string, + funds?: Coin[], + ) => Promise + updateOwner: ( + fee?: number | StdFee | 'auto', + memo?: string, + funds?: Coin[], + ) => Promise +} +export class MarsOracleOsmosisClient + extends MarsOracleOsmosisQueryClient + implements MarsOracleOsmosisInterface +{ + client: SigningCosmWasmClient + sender: string + contractAddress: string + + constructor(client: SigningCosmWasmClient, sender: string, contractAddress: string) { + super(client, contractAddress) + this.client = client + this.sender = sender + this.contractAddress = contractAddress + this.setPriceSource = this.setPriceSource.bind(this) + this.removePriceSource = this.removePriceSource.bind(this) + this.updateOwner = this.updateOwner.bind(this) + } + + setPriceSource = async ( + { + denom, + priceSource, + }: { + denom: string + priceSource: OsmosisPriceSource + }, + fee: number | StdFee | 'auto' = 'auto', + memo?: string, + funds?: Coin[], + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + set_price_source: { + denom, + price_source: priceSource, + }, + }, + fee, + memo, + funds, + ) + } + removePriceSource = async ( + { + denom, + }: { + denom: string + }, + fee: number | StdFee | 'auto' = 'auto', + memo?: string, + funds?: Coin[], + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + remove_price_source: { + denom, + }, + }, + fee, + memo, + funds, + ) + } + updateOwner = async ( + fee: number | StdFee | 'auto' = 'auto', + memo?: string, + funds?: Coin[], + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + update_owner: {}, + }, + fee, + memo, + funds, + ) + } +} diff --git a/scripts/types/mars-oracle-osmosis/MarsOracleOsmosis.react-query.ts b/scripts/types/mars-oracle-osmosis/MarsOracleOsmosis.react-query.ts new file mode 100644 index 000000000..ca1a977ae --- /dev/null +++ b/scripts/types/mars-oracle-osmosis/MarsOracleOsmosis.react-query.ts @@ -0,0 +1,232 @@ +// @ts-nocheck +/** + * This file was automatically generated by @cosmwasm/ts-codegen@0.24.0. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run the @cosmwasm/ts-codegen generate command to regenerate this file. + */ + +import { UseQueryOptions, useQuery, useMutation, UseMutationOptions } from '@tanstack/react-query' +import { ExecuteResult } from '@cosmjs/cosmwasm-stargate' +import { StdFee, Coin } from '@cosmjs/amino' +import { + InstantiateMsg, + ExecuteMsg, + OsmosisPriceSource, + Decimal, + Downtime, + OwnerUpdate, + DowntimeDetector, + QueryMsg, + ConfigResponse, + PriceResponse, + PriceSourceResponseForString, + ArrayOfPriceSourceResponseForString, + ArrayOfPriceResponse, +} from './MarsOracleOsmosis.types' +import { MarsOracleOsmosisQueryClient, MarsOracleOsmosisClient } from './MarsOracleOsmosis.client' +export const marsOracleOsmosisQueryKeys = { + contract: [ + { + contract: 'marsOracleOsmosis', + }, + ] as const, + address: (contractAddress: string | undefined) => + [{ ...marsOracleOsmosisQueryKeys.contract[0], address: contractAddress }] as const, + config: (contractAddress: string | undefined, args?: Record) => + [ + { ...marsOracleOsmosisQueryKeys.address(contractAddress)[0], method: 'config', args }, + ] as const, + priceSource: (contractAddress: string | undefined, args?: Record) => + [ + { ...marsOracleOsmosisQueryKeys.address(contractAddress)[0], method: 'price_source', args }, + ] as const, + priceSources: (contractAddress: string | undefined, args?: Record) => + [ + { ...marsOracleOsmosisQueryKeys.address(contractAddress)[0], method: 'price_sources', args }, + ] as const, + price: (contractAddress: string | undefined, args?: Record) => + [{ ...marsOracleOsmosisQueryKeys.address(contractAddress)[0], method: 'price', args }] as const, + prices: (contractAddress: string | undefined, args?: Record) => + [ + { ...marsOracleOsmosisQueryKeys.address(contractAddress)[0], method: 'prices', args }, + ] as const, +} +export interface MarsOracleOsmosisReactQuery { + client: MarsOracleOsmosisQueryClient | undefined + options?: Omit< + UseQueryOptions, + "'queryKey' | 'queryFn' | 'initialData'" + > & { + initialData?: undefined + } +} +export interface MarsOracleOsmosisPricesQuery + extends MarsOracleOsmosisReactQuery { + args: { + limit?: number + startAfter?: string + } +} +export function useMarsOracleOsmosisPricesQuery({ + client, + args, + options, +}: MarsOracleOsmosisPricesQuery) { + return useQuery( + marsOracleOsmosisQueryKeys.prices(client?.contractAddress, args), + () => + client + ? client.prices({ + limit: args.limit, + startAfter: args.startAfter, + }) + : Promise.reject(new Error('Invalid client')), + { ...options, enabled: !!client && (options?.enabled != undefined ? options.enabled : true) }, + ) +} +export interface MarsOracleOsmosisPriceQuery + extends MarsOracleOsmosisReactQuery { + args: { + denom: string + } +} +export function useMarsOracleOsmosisPriceQuery({ + client, + args, + options, +}: MarsOracleOsmosisPriceQuery) { + return useQuery( + marsOracleOsmosisQueryKeys.price(client?.contractAddress, args), + () => + client + ? client.price({ + denom: args.denom, + }) + : Promise.reject(new Error('Invalid client')), + { ...options, enabled: !!client && (options?.enabled != undefined ? options.enabled : true) }, + ) +} +export interface MarsOracleOsmosisPriceSourcesQuery + extends MarsOracleOsmosisReactQuery { + args: { + limit?: number + startAfter?: string + } +} +export function useMarsOracleOsmosisPriceSourcesQuery({ + client, + args, + options, +}: MarsOracleOsmosisPriceSourcesQuery) { + return useQuery( + marsOracleOsmosisQueryKeys.priceSources(client?.contractAddress, args), + () => + client + ? client.priceSources({ + limit: args.limit, + startAfter: args.startAfter, + }) + : Promise.reject(new Error('Invalid client')), + { ...options, enabled: !!client && (options?.enabled != undefined ? options.enabled : true) }, + ) +} +export interface MarsOracleOsmosisPriceSourceQuery + extends MarsOracleOsmosisReactQuery { + args: { + denom: string + } +} +export function useMarsOracleOsmosisPriceSourceQuery({ + client, + args, + options, +}: MarsOracleOsmosisPriceSourceQuery) { + return useQuery( + marsOracleOsmosisQueryKeys.priceSource(client?.contractAddress, args), + () => + client + ? client.priceSource({ + denom: args.denom, + }) + : Promise.reject(new Error('Invalid client')), + { ...options, enabled: !!client && (options?.enabled != undefined ? options.enabled : true) }, + ) +} +export interface MarsOracleOsmosisConfigQuery + extends MarsOracleOsmosisReactQuery {} +export function useMarsOracleOsmosisConfigQuery({ + client, + options, +}: MarsOracleOsmosisConfigQuery) { + return useQuery( + marsOracleOsmosisQueryKeys.config(client?.contractAddress), + () => (client ? client.config() : Promise.reject(new Error('Invalid client'))), + { ...options, enabled: !!client && (options?.enabled != undefined ? options.enabled : true) }, + ) +} +export interface MarsOracleOsmosisUpdateOwnerMutation { + client: MarsOracleOsmosisClient + args?: { + fee?: number | StdFee | 'auto' + memo?: string + funds?: Coin[] + } +} +export function useMarsOracleOsmosisUpdateOwnerMutation( + options?: Omit< + UseMutationOptions, + 'mutationFn' + >, +) { + return useMutation( + ({ client, msg, args: { fee, memo, funds } = {} }) => client.updateOwner(msg, fee, memo, funds), + options, + ) +} +export interface MarsOracleOsmosisRemovePriceSourceMutation { + client: MarsOracleOsmosisClient + msg: { + denom: string + } + args?: { + fee?: number | StdFee | 'auto' + memo?: string + funds?: Coin[] + } +} +export function useMarsOracleOsmosisRemovePriceSourceMutation( + options?: Omit< + UseMutationOptions, + 'mutationFn' + >, +) { + return useMutation( + ({ client, msg, args: { fee, memo, funds } = {} }) => + client.removePriceSource(msg, fee, memo, funds), + options, + ) +} +export interface MarsOracleOsmosisSetPriceSourceMutation { + client: MarsOracleOsmosisClient + msg: { + denom: string + priceSource: OsmosisPriceSource + } + args?: { + fee?: number | StdFee | 'auto' + memo?: string + funds?: Coin[] + } +} +export function useMarsOracleOsmosisSetPriceSourceMutation( + options?: Omit< + UseMutationOptions, + 'mutationFn' + >, +) { + return useMutation( + ({ client, msg, args: { fee, memo, funds } = {} }) => + client.setPriceSource(msg, fee, memo, funds), + options, + ) +} diff --git a/scripts/types/mars-oracle-osmosis/MarsOracleOsmosis.types.ts b/scripts/types/mars-oracle-osmosis/MarsOracleOsmosis.types.ts new file mode 100644 index 000000000..9b65cb2b7 --- /dev/null +++ b/scripts/types/mars-oracle-osmosis/MarsOracleOsmosis.types.ts @@ -0,0 +1,152 @@ +// @ts-nocheck +/** + * This file was automatically generated by @cosmwasm/ts-codegen@0.24.0. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run the @cosmwasm/ts-codegen generate command to regenerate this file. + */ + +export interface InstantiateMsg { + base_denom: string + owner: string +} +export type ExecuteMsg = + | { + set_price_source: { + denom: string + price_source: OsmosisPriceSource + } + } + | { + remove_price_source: { + denom: string + } + } + | { + update_owner: OwnerUpdate + } +export type OsmosisPriceSource = + | { + fixed: { + price: Decimal + [k: string]: unknown + } + } + | { + spot: { + pool_id: number + [k: string]: unknown + } + } + | { + arithmetic_twap: { + downtime_detector?: DowntimeDetector | null + pool_id: number + window_size: number + [k: string]: unknown + } + } + | { + geometric_twap: { + downtime_detector?: DowntimeDetector | null + pool_id: number + window_size: number + [k: string]: unknown + } + } + | { + xyk_liquidity_token: { + pool_id: number + [k: string]: unknown + } + } + | { + staked_geometric_twap: { + downtime_detector?: DowntimeDetector | null + pool_id: number + transitive_denom: string + window_size: number + [k: string]: unknown + } + } +export type Decimal = string +export type Downtime = + | 'duration30s' + | 'duration1m' + | 'duration2m' + | 'duration3m' + | 'duration4m' + | 'duration5m' + | 'duration10m' + | 'duration20m' + | 'duration30m' + | 'duration40m' + | 'duration50m' + | 'duration1h' + | 'duration15h' + | 'duration2h' + | 'duration25h' + | 'duration3h' + | 'duration4h' + | 'duration5h' + | 'duration6h' + | 'duration9h' + | 'duration12h' + | 'duration18h' + | 'duration24h' + | 'duration36h' + | 'duration48h' +export type OwnerUpdate = + | { + propose_new_owner: { + proposed: string + } + } + | 'clear_proposed' + | 'accept_proposed' + | 'abolish_owner_role' +export interface DowntimeDetector { + downtime: Downtime + recovery: number + [k: string]: unknown +} +export type QueryMsg = + | { + config: {} + } + | { + price_source: { + denom: string + } + } + | { + price_sources: { + limit?: number | null + start_after?: string | null + } + } + | { + price: { + denom: string + } + } + | { + prices: { + limit?: number | null + start_after?: string | null + } + } +export interface ConfigResponse { + base_denom: string + owner?: string | null + proposed_new_owner?: string | null +} +export interface PriceResponse { + denom: string + price: Decimal +} +export interface PriceSourceResponseForString { + denom: string + price_source: string +} +export type ArrayOfPriceSourceResponseForString = PriceSourceResponseForString[] +export type ArrayOfPriceResponse = PriceResponse[] diff --git a/scripts/types/mars-oracle-osmosis/bundle.ts b/scripts/types/mars-oracle-osmosis/bundle.ts new file mode 100644 index 000000000..aaf9bb266 --- /dev/null +++ b/scripts/types/mars-oracle-osmosis/bundle.ts @@ -0,0 +1,13 @@ +// @ts-nocheck +/** + * This file was automatically generated by @cosmwasm/ts-codegen@0.24.0. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run the @cosmwasm/ts-codegen generate command to regenerate this file. + */ + +import * as _6 from './MarsOracleOsmosis.types' +import * as _7 from './MarsOracleOsmosis.client' +import * as _8 from './MarsOracleOsmosis.react-query' +export namespace contracts { + export const MarsOracleOsmosis = { ..._6, ..._7, ..._8 } +} diff --git a/scripts/yarn.lock b/scripts/yarn.lock index 2deefce00..e15951172 100644 --- a/scripts/yarn.lock +++ b/scripts/yarn.lock @@ -2,25 +2,25 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== +"@ampproject/remapping@^2.1.0", "@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: - "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== +"@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" + integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8", "@babel/compat-data@^7.20.5": - version "7.20.10" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec" - integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg== +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.0": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.3.tgz#cd502a6a0b6e37d7ad72ce7e71a7160a3ae36f7e" + integrity sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ== "@babel/core@7.18.10": version "7.18.10" @@ -44,20 +44,20 @@ semver "^6.3.0" "@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.20.12" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" - integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helpers" "^7.20.7" - "@babel/parser" "^7.20.7" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.12" - "@babel/types" "^7.20.7" + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.1.tgz#5de51c5206f4c6f5533562838337a603c1033cfd" + integrity sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.22.0" + "@babel/helper-compilation-targets" "^7.22.1" + "@babel/helper-module-transforms" "^7.22.1" + "@babel/helpers" "^7.22.0" + "@babel/parser" "^7.22.0" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -73,13 +73,14 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/generator@^7.18.10", "@babel/generator@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" - integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw== +"@babel/generator@^7.18.10", "@babel/generator@^7.22.0", "@babel/generator@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.3.tgz#0ff675d2edb93d7596c5f6728b52615cfc0df01e" + integrity sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A== dependencies: - "@babel/types" "^7.20.7" + "@babel/types" "^7.22.3" "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" "@babel/helper-annotate-as-pure@^7.18.6": @@ -90,45 +91,46 @@ "@babel/types" "^7.18.6" "@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.3.tgz#c9b83d1ba74e163e023f008a3d3204588a7ceb60" + integrity sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg== dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/types" "^7.22.3" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" - integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz#bfcd6b7321ffebe33290d68550e2c9d7eb7c7a58" + integrity sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ== dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-validator-option" "^7.18.6" + "@babel/compat-data" "^7.22.0" + "@babel/helper-validator-option" "^7.21.0" browserslist "^4.21.3" lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.12", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": - version "7.20.12" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz#4349b928e79be05ed2d1643b20b99bb87c503819" - integrity sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz#ae3de70586cc757082ae3eba57240d42f468c41b" + integrity sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-member-expression-to-functions" "^7.22.0" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-replace-supers" "^7.22.1" "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/helper-split-export-declaration" "^7.18.6" + semver "^6.3.0" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" - integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz#a7ed9a8488b45b467fca353cd1a44dc5f0cf5c70" + integrity sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.2.1" + regexpu-core "^5.3.1" + semver "^6.3.0" "@babel/helper-define-polyfill-provider@^0.3.2", "@babel/helper-define-polyfill-provider@^0.3.3": version "0.3.3" @@ -142,25 +144,18 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== +"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz#ac3a56dbada59ed969d712cf527bd8271fe3eba8" + integrity sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA== -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== - dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" @@ -169,33 +164,33 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-member-expression-to-functions@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" - integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== +"@babel/helper-member-expression-to-functions@^7.22.0": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz#4b77a12c1b4b8e9e28736ed47d8b91f00976911f" + integrity sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA== dependencies: - "@babel/types" "^7.20.7" + "@babel/types" "^7.22.3" -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== +"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" + integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.21.4" -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9", "@babel/helper-module-transforms@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" - integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.5", "@babel/helper-module-transforms@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz#e0cad47fedcf3cae83c11021696376e2d5a50c63" + integrity sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-module-imports" "^7.21.4" + "@babel/helper-simple-access" "^7.21.5" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.10" - "@babel/types" "^7.20.7" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.0" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" @@ -204,10 +199,10 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56" + integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg== "@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" @@ -219,24 +214,24 @@ "@babel/helper-wrap-function" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" - integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz#38cf6e56f7dc614af63a21b45565dd623f0fdc95" + integrity sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-member-expression-to-functions" "^7.22.0" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.0" -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== +"@babel/helper-simple-access@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz#d697a7971a5c39eac32c7e63c0921c06c8a249ee" + integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg== dependencies: - "@babel/types" "^7.20.2" + "@babel/types" "^7.21.5" "@babel/helper-skip-transparent-expression-wrappers@^7.20.0": version "7.20.0" @@ -252,20 +247,20 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-string-parser@^7.18.10", "@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== +"@babel/helper-string-parser@^7.18.10", "@babel/helper-string-parser@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" + integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== +"@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== "@babel/helper-wrap-function@^7.18.9": version "7.20.5" @@ -277,14 +272,14 @@ "@babel/traverse" "^7.20.5" "@babel/types" "^7.20.5" -"@babel/helpers@^7.18.9", "@babel/helpers@^7.20.7": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.13.tgz#e3cb731fb70dc5337134cadc24cbbad31cc87ad2" - integrity sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg== +"@babel/helpers@^7.18.9", "@babel/helpers@^7.22.0": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.3.tgz#53b74351da9684ea2f694bf0877998da26dd830e" + integrity sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w== dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.13" - "@babel/types" "^7.20.7" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.3" "@babel/highlight@^7.18.6": version "7.18.6" @@ -300,10 +295,10 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.11.tgz#68bb07ab3d380affa9a3f96728df07969645d2d9" integrity sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ== -"@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.18.11", "@babel/parser@^7.20.13", "@babel/parser@^7.20.7": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.13.tgz#ddf1eb5a813588d2fb1692b70c6fce75b945c088" - integrity sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw== +"@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.18.11", "@babel/parser@^7.21.9", "@babel/parser@^7.22.0", "@babel/parser@^7.22.4": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.4.tgz#a770e98fd785c231af9d93f6459d36770993fb32" + integrity sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -313,13 +308,13 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" - integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz#a75be1365c0c3188c51399a662168c1c98108659" + integrity sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.7" + "@babel/plugin-transform-optional-chaining" "^7.22.3" "@babel/plugin-proposal-async-generator-functions@^7.18.10": version "7.20.7" @@ -340,11 +335,11 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz#92592e9029b13b15be0f7ce6a7aedc2879ca45a7" - integrity sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" + integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.7" + "@babel/helper-create-class-features-plugin" "^7.21.0" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-class-static-block" "^7.14.5" @@ -434,10 +429,10 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz#49f2b372519ab31728cc14115bb0998b15bfda55" - integrity sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ== +"@babel/plugin-proposal-optional-chaining@^7.18.9": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" @@ -452,12 +447,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz#309c7668f2263f1c711aa399b5a9a6291eef6135" - integrity sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" + integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.20.5" + "@babel/helper-create-class-features-plugin" "^7.21.0" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" @@ -525,6 +520,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-jsx@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" + integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" @@ -581,19 +583,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" - integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== +"@babel/plugin-syntax-typescript@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz#2751948e9b7c6d771a8efa59340c15d4a2891ff8" + integrity sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-arrow-functions@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" - integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz#9bb42a53de447936a57ba256fbf537fc312b6929" + integrity sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/plugin-transform-async-to-generator@^7.18.6": version "7.20.7" @@ -612,21 +614,21 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-block-scoping@^7.18.9": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz#9f5a3424bd112a3f32fe0cf9364fbb155cff262a" - integrity sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" + integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-classes@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz#f438216f094f6bb31dc266ebfab8ff05aecad073" - integrity sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" + integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-compilation-targets" "^7.20.7" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" + "@babel/helper-function-name" "^7.21.0" "@babel/helper-optimise-call-expression" "^7.18.6" "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-replace-supers" "^7.20.7" @@ -634,17 +636,17 @@ globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" - integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz#3a2d8bb771cd2ef1cd736435f6552fe502e11b44" + integrity sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/template" "^7.20.7" "@babel/plugin-transform-destructuring@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz#8bda578f71620c7de7c93af590154ba331415454" - integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" + integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -672,11 +674,11 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-for-of@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" - integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz#e890032b535f5a2e237a18535f56a9fdaa7b83fc" + integrity sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/plugin-transform-function-name@^7.18.9": version "7.18.9" @@ -709,23 +711,23 @@ "@babel/helper-module-transforms" "^7.20.11" "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-modules-commonjs@^7.18.6": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz#8cb23010869bf7669fd4b3098598b6b2be6dc607" - integrity sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw== +"@babel/plugin-transform-modules-commonjs@^7.18.6", "@babel/plugin-transform-modules-commonjs@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz#d69fb947eed51af91de82e4708f676864e5e47bc" + integrity sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ== dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-module-transforms" "^7.21.5" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-simple-access" "^7.21.5" "@babel/plugin-transform-modules-systemjs@^7.18.9": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" - integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz#cc507e03e88d87b016feaeb5dae941e6ef50d91e" + integrity sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw== dependencies: "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-transforms" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/helper-validator-identifier" "^7.19.1" "@babel/plugin-transform-modules-umd@^7.18.6": @@ -737,19 +739,19 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-named-capturing-groups-regex@^7.18.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" - integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz#db6fb77e6b3b53ec3b8d370246f0b7cf67d35ab4" + integrity sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.20.5" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-create-regexp-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/plugin-transform-new-target@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" - integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz#deb0377d741cbee2f45305868b9026dcd6dd96e2" + integrity sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/plugin-transform-object-super@^7.18.6": version "7.18.6" @@ -759,12 +761,21 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" +"@babel/plugin-transform-optional-chaining@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz#5fd24a4a7843b76da6aeec23c7f551da5d365290" + integrity sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-transform-parameters@^7.18.8", "@babel/plugin-transform-parameters@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz#0ee349e9d1bc96e78e3b37a7af423a4078a7083f" - integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz#24477acfd2fd2bc901df906c9bf17fbcfeee900d" + integrity sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/plugin-transform-property-literals@^7.18.6": version "7.18.6" @@ -774,11 +785,11 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-regenerator@^7.18.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" - integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz#576c62f9923f94bcb1c855adc53561fd7913724e" + integrity sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.21.5" regenerator-transform "^0.15.1" "@babel/plugin-transform-reserved-words@^7.18.6": @@ -836,21 +847,22 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-typescript@^7.18.6": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.13.tgz#e3581b356b8694f6ff450211fe6774eaff8d25ab" - integrity sha512-O7I/THxarGcDZxkgWKMUrk7NK1/WbHAg3Xx86gqS6x9MTrNL6AwIluuZ96ms4xeDe6AVx6rjHbWHP7x26EPQBA== +"@babel/plugin-transform-typescript@^7.21.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.3.tgz#8f662cec8ba88c873f1c7663c0c94e3f68592f09" + integrity sha512-pyjnCIniO5PNaEuGxT28h0HbMru3qCVrMqVgVOz/krComdIrY9W6FCLBq9NWHY8HDGaUlan+UhmZElDENIfCcw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.12" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-typescript" "^7.20.0" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-typescript" "^7.21.4" "@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz#1e55ed6195259b0e9061d81f5ef45a9b009fb7f2" + integrity sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/plugin-transform-unicode-regex@^7.18.6": version "7.18.6" @@ -953,29 +965,36 @@ esutils "^2.0.2" "@babel/preset-typescript@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" - integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz#68292c884b0e26070b4d66b202072d391358395f" + integrity sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-typescript" "^7.18.6" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-validator-option" "^7.21.0" + "@babel/plugin-syntax-jsx" "^7.21.4" + "@babel/plugin-transform-modules-commonjs" "^7.21.5" + "@babel/plugin-transform-typescript" "^7.21.3" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.11.2", "@babel/runtime@^7.18.9", "@babel/runtime@^7.8.4": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" - integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.3.tgz#0a7fce51d43adbf0f7b517a71f4c3aaca92ebcbb" + integrity sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ== dependencies: regenerator-runtime "^0.13.11" -"@babel/template@^7.18.10", "@babel/template@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== +"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.21.9": + version "7.21.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.21.9.tgz#bf8dad2859130ae46088a99c1f265394877446fb" + integrity sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ== dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" + "@babel/code-frame" "^7.21.4" + "@babel/parser" "^7.21.9" + "@babel/types" "^7.21.5" "@babel/traverse@7.18.11": version "7.18.11" @@ -993,19 +1012,19 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.18.10", "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.13", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" - integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ== +"@babel/traverse@^7.18.10", "@babel/traverse@^7.20.5", "@babel/traverse@^7.22.1": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.4.tgz#c3cf96c5c290bd13b55e29d025274057727664c0" + integrity sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ== dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.22.3" + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-function-name" "^7.21.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.13" - "@babel/types" "^7.20.7" + "@babel/parser" "^7.22.4" + "@babel/types" "^7.22.4" debug "^4.1.0" globals "^11.1.0" @@ -1018,12 +1037,12 @@ "@babel/helper-validator-identifier" "^7.18.6" to-fast-properties "^2.0.0" -"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.4.4": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" - integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== +"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.5", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.22.0", "@babel/types@^7.22.3", "@babel/types@^7.22.4", "@babel/types@^7.4.4": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.4.tgz#56a2653ae7e7591365dabf20b76295410684c071" + integrity sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA== dependencies: - "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-string-parser" "^7.21.5" "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" @@ -1035,143 +1054,143 @@ "@noble/hashes" "^1.0.0" protobufjs "^6.8.8" -"@cosmjs/amino@^0.29.5": - version "0.29.5" - resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.29.5.tgz#053b4739a90b15b9e2b781ccd484faf64bd49aec" - integrity sha512-Qo8jpC0BiziTSUqpkNatBcwtKNhCovUnFul9SlT/74JUCdLYaeG5hxr3q1cssQt++l4LvlcpF+OUXL48XjNjLw== - dependencies: - "@cosmjs/crypto" "^0.29.5" - "@cosmjs/encoding" "^0.29.5" - "@cosmjs/math" "^0.29.5" - "@cosmjs/utils" "^0.29.5" - -"@cosmjs/cosmwasm-stargate@^0.29.5": - version "0.29.5" - resolved "https://registry.yarnpkg.com/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.29.5.tgz#3f257da682658833e0f4eb9e8ff758e4d927663a" - integrity sha512-TNdSvm2tEE3XMCuxHxquzls56t40hC8qnLeYJWHsY2ECZmRK3KrnpRReEr7N7bLtODToK7X/riYrV0JaYxjrYA== - dependencies: - "@cosmjs/amino" "^0.29.5" - "@cosmjs/crypto" "^0.29.5" - "@cosmjs/encoding" "^0.29.5" - "@cosmjs/math" "^0.29.5" - "@cosmjs/proto-signing" "^0.29.5" - "@cosmjs/stargate" "^0.29.5" - "@cosmjs/tendermint-rpc" "^0.29.5" - "@cosmjs/utils" "^0.29.5" - cosmjs-types "^0.5.2" +"@cosmjs/amino@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.30.1.tgz#7c18c14627361ba6c88e3495700ceea1f76baace" + integrity sha512-yNHnzmvAlkETDYIpeCTdVqgvrdt1qgkOXwuRVi8s27UKI5hfqyE9fJ/fuunXE6ZZPnKkjIecDznmuUOMrMvw4w== + dependencies: + "@cosmjs/crypto" "^0.30.1" + "@cosmjs/encoding" "^0.30.1" + "@cosmjs/math" "^0.30.1" + "@cosmjs/utils" "^0.30.1" + +"@cosmjs/cosmwasm-stargate@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.30.1.tgz#6f9ca310f75433a3e30d683bc6aa24eadb345d79" + integrity sha512-W/6SLUCJAJGBN+sJLXouLZikVgmqDd9LCdlMzQaxczcCHTWeJAmRvOiZGSZaSy3shw/JN1qc6g6PKpvTVgj10A== + dependencies: + "@cosmjs/amino" "^0.30.1" + "@cosmjs/crypto" "^0.30.1" + "@cosmjs/encoding" "^0.30.1" + "@cosmjs/math" "^0.30.1" + "@cosmjs/proto-signing" "^0.30.1" + "@cosmjs/stargate" "^0.30.1" + "@cosmjs/tendermint-rpc" "^0.30.1" + "@cosmjs/utils" "^0.30.1" + cosmjs-types "^0.7.1" long "^4.0.0" pako "^2.0.2" -"@cosmjs/crypto@^0.29.5": - version "0.29.5" - resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.29.5.tgz#ab99fc382b93d8a8db075780cf07487a0f9519fd" - integrity sha512-2bKkaLGictaNL0UipQCL6C1afaisv6k8Wr/GCLx9FqiyFkh9ZgRHDyetD64ZsjnWV/N/D44s/esI+k6oPREaiQ== +"@cosmjs/crypto@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.30.1.tgz#21e94d5ca8f8ded16eee1389d2639cb5c43c3eb5" + integrity sha512-rAljUlake3MSXs9xAm87mu34GfBLN0h/1uPPV6jEwClWjNkAMotzjC0ab9MARy5FFAvYHL3lWb57bhkbt2GtzQ== dependencies: - "@cosmjs/encoding" "^0.29.5" - "@cosmjs/math" "^0.29.5" - "@cosmjs/utils" "^0.29.5" + "@cosmjs/encoding" "^0.30.1" + "@cosmjs/math" "^0.30.1" + "@cosmjs/utils" "^0.30.1" "@noble/hashes" "^1" bn.js "^5.2.0" elliptic "^6.5.4" libsodium-wrappers "^0.7.6" -"@cosmjs/encoding@^0.29.5": - version "0.29.5" - resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.29.5.tgz#009a4b1c596cdfd326f30ccfa79f5e56daa264f2" - integrity sha512-G4rGl/Jg4dMCw5u6PEZHZcoHnUBlukZODHbm/wcL4Uu91fkn5jVo5cXXZcvs4VCkArVGrEj/52eUgTZCmOBGWQ== +"@cosmjs/encoding@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.30.1.tgz#b5c4e0ef7ceb1f2753688eb96400ed70f35c6058" + integrity sha512-rXmrTbgqwihORwJ3xYhIgQFfMSrwLu1s43RIK9I8EBudPx3KmnmyAKzMOVsRDo9edLFNuZ9GIvysUCwQfq3WlQ== dependencies: base64-js "^1.3.0" bech32 "^1.1.4" readonly-date "^1.0.0" -"@cosmjs/json-rpc@^0.29.5": - version "0.29.5" - resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.29.5.tgz#5e483a9bd98a6270f935adf0dfd8a1e7eb777fe4" - integrity sha512-C78+X06l+r9xwdM1yFWIpGl03LhB9NdM1xvZpQHwgCOl0Ir/WV8pw48y3Ez2awAoUBRfTeejPe4KvrE6NoIi/w== +"@cosmjs/json-rpc@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.30.1.tgz#16f21305fc167598c8a23a45549b85106b2372bc" + integrity sha512-pitfC/2YN9t+kXZCbNuyrZ6M8abnCC2n62m+JtU9vQUfaEtVsgy+1Fk4TRQ175+pIWSdBMFi2wT8FWVEE4RhxQ== dependencies: - "@cosmjs/stream" "^0.29.5" + "@cosmjs/stream" "^0.30.1" xstream "^11.14.0" -"@cosmjs/math@^0.29.5": - version "0.29.5" - resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.29.5.tgz#722c96e080d6c2b62215ce9f4c70da7625b241b6" - integrity sha512-2GjKcv+A9f86MAWYLUkjhw1/WpRl2R1BTb3m9qPG7lzMA7ioYff9jY5SPCfafKdxM4TIQGxXQlYGewQL16O68Q== +"@cosmjs/math@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.30.1.tgz#8b816ef4de5d3afa66cb9fdfb5df2357a7845b8a" + integrity sha512-yaoeI23pin9ZiPHIisa6qqLngfnBR/25tSaWpkTm8Cy10MX70UF5oN4+/t1heLaM6SSmRrhk3psRkV4+7mH51Q== dependencies: bn.js "^5.2.0" -"@cosmjs/proto-signing@^0.29.5": - version "0.29.5" - resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.29.5.tgz#af3b62a46c2c2f1d2327d678b13b7262db1fe87c" - integrity sha512-QRrS7CiKaoETdgIqvi/7JC2qCwCR7lnWaUsTzh/XfRy3McLkEd+cXbKAW3cygykv7IN0VAEIhZd2lyIfT8KwNA== - dependencies: - "@cosmjs/amino" "^0.29.5" - "@cosmjs/crypto" "^0.29.5" - "@cosmjs/encoding" "^0.29.5" - "@cosmjs/math" "^0.29.5" - "@cosmjs/utils" "^0.29.5" - cosmjs-types "^0.5.2" +"@cosmjs/proto-signing@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.30.1.tgz#f0dda372488df9cd2677150b89b3e9c72b3cb713" + integrity sha512-tXh8pPYXV4aiJVhTKHGyeZekjj+K9s2KKojMB93Gcob2DxUjfKapFYBMJSgfKPuWUPEmyr8Q9km2hplI38ILgQ== + dependencies: + "@cosmjs/amino" "^0.30.1" + "@cosmjs/crypto" "^0.30.1" + "@cosmjs/encoding" "^0.30.1" + "@cosmjs/math" "^0.30.1" + "@cosmjs/utils" "^0.30.1" + cosmjs-types "^0.7.1" long "^4.0.0" -"@cosmjs/socket@^0.29.5": - version "0.29.5" - resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.29.5.tgz#a48df6b4c45dc6a6ef8e47232725dd4aa556ac2d" - integrity sha512-5VYDupIWbIXq3ftPV1LkS5Ya/T7Ol/AzWVhNxZ79hPe/mBfv1bGau/LqIYOm2zxGlgm9hBHOTmWGqNYDwr9LNQ== +"@cosmjs/socket@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.30.1.tgz#00b22f4b5e2ab01f4d82ccdb7b2e59536bfe5ce0" + integrity sha512-r6MpDL+9N+qOS/D5VaxnPaMJ3flwQ36G+vPvYJsXArj93BjgyFB7BwWwXCQDzZ+23cfChPUfhbINOenr8N2Kow== dependencies: - "@cosmjs/stream" "^0.29.5" + "@cosmjs/stream" "^0.30.1" isomorphic-ws "^4.0.1" ws "^7" xstream "^11.14.0" -"@cosmjs/stargate@^0.29.5": - version "0.29.5" - resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.29.5.tgz#d597af1c85a3c2af7b5bdbec34d5d40692cc09e4" - integrity sha512-hjEv8UUlJruLrYGJcUZXM/CziaINOKwfVm2BoSdUnNTMxGvY/jC1ABHKeZUYt9oXHxEJ1n9+pDqzbKc8pT0nBw== +"@cosmjs/stargate@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.30.1.tgz#e1b22e1226cffc6e93914a410755f1f61057ba04" + integrity sha512-RdbYKZCGOH8gWebO7r6WvNnQMxHrNXInY/gPHPzMjbQF6UatA6fNM2G2tdgS5j5u7FTqlCI10stNXrknaNdzog== dependencies: "@confio/ics23" "^0.6.8" - "@cosmjs/amino" "^0.29.5" - "@cosmjs/encoding" "^0.29.5" - "@cosmjs/math" "^0.29.5" - "@cosmjs/proto-signing" "^0.29.5" - "@cosmjs/stream" "^0.29.5" - "@cosmjs/tendermint-rpc" "^0.29.5" - "@cosmjs/utils" "^0.29.5" - cosmjs-types "^0.5.2" + "@cosmjs/amino" "^0.30.1" + "@cosmjs/encoding" "^0.30.1" + "@cosmjs/math" "^0.30.1" + "@cosmjs/proto-signing" "^0.30.1" + "@cosmjs/stream" "^0.30.1" + "@cosmjs/tendermint-rpc" "^0.30.1" + "@cosmjs/utils" "^0.30.1" + cosmjs-types "^0.7.1" long "^4.0.0" protobufjs "~6.11.3" xstream "^11.14.0" -"@cosmjs/stream@^0.29.5": - version "0.29.5" - resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.29.5.tgz#350981cac496d04939b92ee793b9b19f44bc1d4e" - integrity sha512-TToTDWyH1p05GBtF0Y8jFw2C+4783ueDCmDyxOMM6EU82IqpmIbfwcdMOCAm0JhnyMh+ocdebbFvnX/sGKzRAA== +"@cosmjs/stream@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.30.1.tgz#ba038a2aaf41343696b1e6e759d8e03a9516ec1a" + integrity sha512-Fg0pWz1zXQdoxQZpdHRMGvUH5RqS6tPv+j9Eh7Q953UjMlrwZVo0YFLC8OTf/HKVf10E4i0u6aM8D69Q6cNkgQ== dependencies: xstream "^11.14.0" -"@cosmjs/tendermint-rpc@^0.29.5": - version "0.29.5" - resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.29.5.tgz#f205c10464212bdf843f91bb2e4a093b618cb5c2" - integrity sha512-ar80twieuAxsy0x2za/aO3kBr2DFPAXDmk2ikDbmkda+qqfXgl35l9CVAAjKRqd9d+cRvbQyb5M4wy6XQpEV6w== - dependencies: - "@cosmjs/crypto" "^0.29.5" - "@cosmjs/encoding" "^0.29.5" - "@cosmjs/json-rpc" "^0.29.5" - "@cosmjs/math" "^0.29.5" - "@cosmjs/socket" "^0.29.5" - "@cosmjs/stream" "^0.29.5" - "@cosmjs/utils" "^0.29.5" +"@cosmjs/tendermint-rpc@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.30.1.tgz#c16378892ba1ac63f72803fdf7567eab9d4f0aa0" + integrity sha512-Z3nCwhXSbPZJ++v85zHObeUggrEHVfm1u18ZRwXxFE9ZMl5mXTybnwYhczuYOl7KRskgwlB+rID0WYACxj4wdQ== + dependencies: + "@cosmjs/crypto" "^0.30.1" + "@cosmjs/encoding" "^0.30.1" + "@cosmjs/json-rpc" "^0.30.1" + "@cosmjs/math" "^0.30.1" + "@cosmjs/socket" "^0.30.1" + "@cosmjs/stream" "^0.30.1" + "@cosmjs/utils" "^0.30.1" axios "^0.21.2" readonly-date "^1.0.0" xstream "^11.14.0" -"@cosmjs/utils@^0.29.5": - version "0.29.5" - resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.29.5.tgz#3fed1b3528ae8c5f1eb5d29b68755bebfd3294ee" - integrity sha512-m7h+RXDUxOzEOGt4P+3OVPX7PuakZT3GBmaM/Y2u+abN3xZkziykD/NvedYFvvCCdQo714XcGl33bwifS9FZPQ== +"@cosmjs/utils@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.30.1.tgz#6d92582341be3c2ec8d82090253cfa4b7f959edb" + integrity sha512-KvvX58MGMWh7xA+N+deCfunkA/ZNDvFLw4YbOmX3f/XBIkqrVY7qlotfy2aNb1kgp6h4B6Yc8YawJPDTfvWX7g== -"@cosmwasm/ts-codegen@^0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@cosmwasm/ts-codegen/-/ts-codegen-0.24.0.tgz#61015220a9dccfd35dec46bcb67786441111f096" - integrity sha512-g5ufDroLzOzsMvnKyAz7i5M3Z3k8XYetRv9PnGW0Zbgj4sziw6jDimPJ3Ubnput+i380day7LnCwVT7zLIEzCQ== +"@cosmwasm/ts-codegen@^0.27.0": + version "0.27.0" + resolved "https://registry.yarnpkg.com/@cosmwasm/ts-codegen/-/ts-codegen-0.27.0.tgz#dcc74eec41aa599a7a5e2a18a4f97b74c008c92f" + integrity sha512-aNZFf7MjVv0D/LX4xpPgv1nao3+G1Mq19rjnEVgRhUKoTILl8RFoyK8dCo2LOIlSg3trdl2nlk6luYpI4AHPZw== dependencies: "@babel/core" "7.18.10" "@babel/generator" "7.18.12" @@ -1199,16 +1218,28 @@ parse-package-name "1.0.0" rimraf "3.0.2" shelljs "0.8.5" - wasm-ast-types "^0.17.0" + wasm-ast-types "^0.20.0" -"@eslint/eslintrc@^1.4.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" - integrity sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA== +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" + integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== + +"@eslint/eslintrc@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" + integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.4.0" + espree "^9.5.2" globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" @@ -1216,6 +1247,11 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/js@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.41.0.tgz#080321c3b68253522f7646b55b577dd99d2950b3" + integrity sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA== + "@humanwhocodes/config-array@^0.11.8": version "0.11.8" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" @@ -1291,18 +1327,10 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" @@ -1313,20 +1341,25 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": +"@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@1.4.14": version "1.4.14" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== dependencies: "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" @@ -1337,9 +1370,9 @@ integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== "@noble/hashes@^1", "@noble/hashes@^1.0.0": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.5.tgz#1a0377f3b9020efe2fae03290bd2a12140c95c11" - integrity sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ== + version "1.3.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.0.tgz#085fd70f6d7d9d109671090ccae1d3bec62554a1" + integrity sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -1484,14 +1517,14 @@ "@types/istanbul-lib-report" "*" "@types/json-schema@^7.0.11", "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== "@types/lodash@^4.14.182": - version "4.14.191" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" - integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== + version "4.14.195" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.195.tgz#bafc975b252eb6cea78882ce8a7b6bf22a6de632" + integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg== "@types/long@^4.0.1": version "4.0.2" @@ -1503,20 +1536,20 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== -"@types/node@*", "@types/node@>=13.7.0", "@types/node@^18.11.18": - version "18.11.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f" - integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== +"@types/node@*", "@types/node@>=13.7.0", "@types/node@^20.1.1": + version "20.2.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.5.tgz#26d295f3570323b2837d322180dfbf1ba156fefb" + integrity sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ== "@types/prettier@^2.6.1": - version "2.7.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" - integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/semver@^7.3.12": - version "7.3.13" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" - integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== + version "7.5.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== "@types/yargs-parser@*": version "21.0.0" @@ -1524,93 +1557,94 @@ integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@^17.0.8": - version "17.0.20" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.20.tgz#107f0fcc13bd4a524e352b41c49fe88aab5c54d5" - integrity sha512-eknWrTHofQuPk2iuqDm1waA7V6xPlbgBoaaXEgYkClhLOnB0TtbW+srJaOToAgawPxPlHQzwypFA2bhZaUGP5A== + version "17.0.24" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^5.49.0": - version "5.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.49.0.tgz#d0b4556f0792194bf0c2fb297897efa321492389" - integrity sha512-IhxabIpcf++TBaBa1h7jtOWyon80SXPRLDq0dVz5SLFC/eW6tofkw/O7Ar3lkx5z5U6wzbKDrl2larprp5kk5Q== +"@typescript-eslint/eslint-plugin@^5.59.5": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz#1e7a3e5318ece22251dfbc5c9c6feeb4793cc509" + integrity sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ== dependencies: - "@typescript-eslint/scope-manager" "5.49.0" - "@typescript-eslint/type-utils" "5.49.0" - "@typescript-eslint/utils" "5.49.0" + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.59.8" + "@typescript-eslint/type-utils" "5.59.8" + "@typescript-eslint/utils" "5.59.8" debug "^4.3.4" + grapheme-splitter "^1.0.4" ignore "^5.2.0" natural-compare-lite "^1.4.0" - regexpp "^3.2.0" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.49.0": - version "5.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.49.0.tgz#d699734b2f20e16351e117417d34a2bc9d7c4b90" - integrity sha512-veDlZN9mUhGqU31Qiv2qEp+XrJj5fgZpJ8PW30sHU+j/8/e5ruAhLaVDAeznS7A7i4ucb/s8IozpDtt9NqCkZg== +"@typescript-eslint/parser@^5.59.5": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.8.tgz#60cbb00671d86cf746044ab797900b1448188567" + integrity sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw== dependencies: - "@typescript-eslint/scope-manager" "5.49.0" - "@typescript-eslint/types" "5.49.0" - "@typescript-eslint/typescript-estree" "5.49.0" + "@typescript-eslint/scope-manager" "5.59.8" + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/typescript-estree" "5.59.8" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.49.0": - version "5.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.49.0.tgz#81b5d899cdae446c26ddf18bd47a2f5484a8af3e" - integrity sha512-clpROBOiMIzpbWNxCe1xDK14uPZh35u4QaZO1GddilEzoCLAEz4szb51rBpdgurs5k2YzPtJeTEN3qVbG+LRUQ== +"@typescript-eslint/scope-manager@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz#ff4ad4fec6433647b817c4a7d4b4165d18ea2fa8" + integrity sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig== dependencies: - "@typescript-eslint/types" "5.49.0" - "@typescript-eslint/visitor-keys" "5.49.0" + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/visitor-keys" "5.59.8" -"@typescript-eslint/type-utils@5.49.0": - version "5.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.49.0.tgz#8d5dcc8d422881e2ccf4ebdc6b1d4cc61aa64125" - integrity sha512-eUgLTYq0tR0FGU5g1YHm4rt5H/+V2IPVkP0cBmbhRyEmyGe4XvJ2YJ6sYTmONfjmdMqyMLad7SB8GvblbeESZA== +"@typescript-eslint/type-utils@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz#aa6c029a9d7706d26bbd25eb4666398781df6ea2" + integrity sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA== dependencies: - "@typescript-eslint/typescript-estree" "5.49.0" - "@typescript-eslint/utils" "5.49.0" + "@typescript-eslint/typescript-estree" "5.59.8" + "@typescript-eslint/utils" "5.59.8" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.49.0": - version "5.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.49.0.tgz#ad66766cb36ca1c89fcb6ac8b87ec2e6dac435c3" - integrity sha512-7If46kusG+sSnEpu0yOz2xFv5nRz158nzEXnJFCGVEHWnuzolXKwrH5Bsf9zsNlOQkyZuk0BZKKoJQI+1JPBBg== +"@typescript-eslint/types@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.8.tgz#212e54414733618f5d0fd50b2da2717f630aebf8" + integrity sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w== -"@typescript-eslint/typescript-estree@5.49.0": - version "5.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.49.0.tgz#ebd6294c0ea97891fce6af536048181e23d729c8" - integrity sha512-PBdx+V7deZT/3GjNYPVQv1Nc0U46dAHbIuOG8AZ3on3vuEKiPDwFE/lG1snN2eUB9IhF7EyF7K1hmTcLztNIsA== +"@typescript-eslint/typescript-estree@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz#801a7b1766481629481b3b0878148bd7a1f345d7" + integrity sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg== dependencies: - "@typescript-eslint/types" "5.49.0" - "@typescript-eslint/visitor-keys" "5.49.0" + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/visitor-keys" "5.59.8" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.49.0": - version "5.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.49.0.tgz#1c07923bc55ff7834dfcde487fff8d8624a87b32" - integrity sha512-cPJue/4Si25FViIb74sHCLtM4nTSBXtLx1d3/QT6mirQ/c65bV8arBEebBJJizfq8W2YyMoPI/WWPFWitmNqnQ== +"@typescript-eslint/utils@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.8.tgz#34d129f35a2134c67fdaf024941e8f96050dca2b" + integrity sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg== dependencies: + "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.49.0" - "@typescript-eslint/types" "5.49.0" - "@typescript-eslint/typescript-estree" "5.49.0" + "@typescript-eslint/scope-manager" "5.59.8" + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/typescript-estree" "5.59.8" eslint-scope "^5.1.1" - eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.49.0": - version "5.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.49.0.tgz#2561c4da3f235f5c852759bf6c5faec7524f90fe" - integrity sha512-v9jBMjpNWyn8B6k/Mjt6VbUS4J1GvUlR4x3Y+ibnP1z7y7V4n0WRz+50DY6+Myj0UaXVSuUlHohO+eZ8IJEnkg== +"@typescript-eslint/visitor-keys@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz#aa6a7ef862add919401470c09e1609392ef3cc40" + integrity sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ== dependencies: - "@typescript-eslint/types" "5.49.0" + "@typescript-eslint/types" "5.59.8" eslint-visitor-keys "^3.3.0" acorn-jsx@^5.3.2: @@ -1813,15 +1847,15 @@ brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== -browserslist@^4.21.3, browserslist@^4.21.4: - version "4.21.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== +browserslist@^4.21.3, browserslist@^4.21.5: + version "4.21.7" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.7.tgz#e2b420947e5fb0a58e8f4668ae6e23488127e551" + integrity sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA== dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" + caniuse-lite "^1.0.30001489" + electron-to-chromium "^1.4.411" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" bser@2.1.1: version "2.1.1" @@ -1845,10 +1879,10 @@ camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001400: - version "1.0.30001447" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001447.tgz#ef1f39ae38d839d7176713735a8e467a0a2523bd" - integrity sha512-bdKU1BQDPeEXe9A39xJnGtY0uRq/z5osrnXUw0TcK+EYno45Y+U7QU9HhHEyzvMDffpYadFXi3idnSNkcwLkTw== +caniuse-lite@^1.0.30001489: + version "1.0.30001492" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001492.tgz#4a06861788a52b4c81fd3344573b68cc87fe062b" + integrity sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw== case@1.6.3: version "1.6.3" @@ -1894,9 +1928,9 @@ chardet@^0.7.0: integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== ci-info@^3.2.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.1.tgz#708a6cdae38915d597afdf3b145f2f8e1ff55f3f" - integrity sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w== + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== cli-color@^2.0.2: version "2.0.3" @@ -1961,24 +1995,16 @@ convert-source-map@^1.4.0, convert-source-map@^1.7.0: integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== core-js-compat@^3.21.0, core-js-compat@^3.22.1: - version "3.27.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.27.2.tgz#607c50ad6db8fd8326af0b2883ebb987be3786da" - integrity sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg== + version "3.30.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.2.tgz#83f136e375babdb8c80ad3c22d67c69098c1dd8b" + integrity sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA== dependencies: - browserslist "^4.21.4" + browserslist "^4.21.5" -cosmjs-types@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.5.2.tgz#2d42b354946f330dfb5c90a87fdc2a36f97b965d" - integrity sha512-zxCtIJj8v3Di7s39uN4LNcN3HIE1z0B9Z0SPE8ZNQR0oSzsuSe1ACgxoFkvhkS7WBasCAFcglS11G2hyfd5tPg== - dependencies: - long "^4.0.0" - protobufjs "~6.11.2" - -cosmjs-types@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.6.1.tgz#4944e83d0fa87880243a11813bdff0e313d39a68" - integrity sha512-fRz6yzElHHBULDyLArF/G1UkkTWW4r3RondBUGnmSsZWYI5NpfDn32MVa5aRmpaaf4tJI2cbnXHs9fykwU7Ttg== +cosmjs-types@^0.7.1, cosmjs-types@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.7.2.tgz#a757371abd340949c5bd5d49c6f8379ae1ffd7e2" + integrity sha512-vf2uLyktjr/XVAgEq0DjMxeAWh1yYREe7AMHDKd7EiHVqxBPCaBS+qEEQUkXbR9ndnckqr1sUG8BQhazh4X5lA== dependencies: long "^4.0.0" protobufjs "~6.11.2" @@ -2023,9 +2049,9 @@ deepmerge@4.2.2: integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== define-properties@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -2049,10 +2075,10 @@ dotty@0.1.2: resolved "https://registry.yarnpkg.com/dotty/-/dotty-0.1.2.tgz#512d44cc4111a724931226259297f235e8484f6f" integrity sha512-V0EWmKeH3DEhMwAZ+8ZB2Ao4OK6p++Z0hsDtZq3N0+0ZMVqkzrcEGROvOnZpLnvBg5PTNG23JEDLAm64gPaotQ== -electron-to-chromium@^1.4.251: - version "1.4.284" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" - integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +electron-to-chromium@^1.4.411: + version "1.4.414" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.414.tgz#f9eedb6fb01b50439d8228d8ee3a6fa5e0108437" + integrity sha512-RRuCvP6ekngVh2SAJaOKT/hxqc9JAsK+Pe0hP5tGQIfonU2Zy9gMGdJ+mBdyl/vNucMG6gkXYtuM4H/1giws5w== elliptic@^6.5.4: version "6.5.4" @@ -2118,10 +2144,10 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-prettier@^8.6.0: - version "8.6.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz#dec1d29ab728f4fa63061774e1672ac4e363d207" - integrity sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA== +eslint-config-prettier@^8.8.0: + version "8.8.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz#bfda738d412adc917fd7b038857110efe98c9348" + integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== eslint-scope@^5.1.1: version "5.1.1" @@ -2131,37 +2157,28 @@ eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== +eslint-scope@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" + integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== -eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== - -eslint@^8.32.0: - version "8.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.32.0.tgz#d9690056bb6f1a302bd991e7090f5b68fbaea861" - integrity sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ== +eslint@^8.40.0: + version "8.41.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.41.0.tgz#3062ca73363b4714b16dbc1e60f035e6134b6f1c" + integrity sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q== dependencies: - "@eslint/eslintrc" "^1.4.1" + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.0.3" + "@eslint/js" "8.41.0" "@humanwhocodes/config-array" "^0.11.8" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -2171,24 +2188,22 @@ eslint@^8.32.0: debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.4.0" - esquery "^1.4.0" + eslint-scope "^7.2.0" + eslint-visitor-keys "^3.4.1" + espree "^9.5.2" + esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" find-up "^5.0.0" glob-parent "^6.0.2" globals "^13.19.0" - grapheme-splitter "^1.0.4" + graphemer "^1.4.0" ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" - js-sdsl "^4.1.4" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" @@ -2196,29 +2211,28 @@ eslint@^8.32.0: minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.1" - regexpp "^3.2.0" strip-ansi "^6.0.1" strip-json-comments "^3.1.0" text-table "^0.2.0" -espree@^9.4.0: - version "9.4.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" - integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== +espree@^9.5.2: + version "9.5.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" + integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== dependencies: acorn "^8.8.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.1" esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" @@ -2398,12 +2412,13 @@ gensync@^1.0.0-beta.2: integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-intrinsic@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== dependencies: function-bind "^1.1.1" has "^1.0.3" + has-proto "^1.0.1" has-symbols "^1.0.3" get-package-type@^0.1.0: @@ -2466,9 +2481,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.19.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.19.0.tgz#7a42de8e6ad4f7242fbcca27ea5b23aca367b5c8" - integrity sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ== + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== dependencies: type-fest "^0.20.2" @@ -2492,15 +2507,20 @@ globby@^11.1.0: slash "^3.0.0" graceful-fs@^4.1.15, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== grapheme-splitter@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -2525,6 +2545,11 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" @@ -2663,10 +2688,10 @@ interpret@^1.0.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== -is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== +is-core-module@^2.11.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== dependencies: has "^1.0.3" @@ -2778,11 +2803,6 @@ jest-worker@^28.1.3: merge-stream "^2.0.0" supports-color "^8.0.0" -js-sdsl@^4.1.4: - version "4.3.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711" - integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ== - js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -2837,16 +2857,16 @@ levn@^0.4.1: type-check "~0.4.0" libsodium-wrappers@^0.7.6: - version "0.7.10" - resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz#13ced44cacb0fc44d6ac9ce67d725956089ce733" - integrity sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg== + version "0.7.11" + resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.11.tgz#53bd20606dffcc54ea2122133c7da38218f575f7" + integrity sha512-SrcLtXj7BM19vUKtQuyQKiQCRJPgbpauzl3s0rSwD+60wtHqSUuqcoawlMDheCJga85nKOQwxNYQxf/CKAvs6Q== dependencies: - libsodium "^0.7.0" + libsodium "^0.7.11" -libsodium@^0.7.0: - version "0.7.10" - resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.10.tgz#c2429a7e4c0836f879d701fec2c8a208af024159" - integrity sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ== +libsodium@^0.7.11: + version "0.7.11" + resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.11.tgz#cd10aae7bcc34a300cc6ad0ac88fcca674cfbc2e" + integrity sha512-WPfJ7sS53I2s4iM58QxY3Inb83/6mjlYgcmZs7DJsvDlnmVUwNinBCi5vBT43P6bHRy01O4zsMU2CoVR6xJ40A== locate-path@^5.0.0: version "5.0.0" @@ -2883,9 +2903,9 @@ long@^4.0.0: integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== long@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.1.tgz#e27595d0083d103d2fa2c20c7699f8e0c92b897f" - integrity sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A== + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== lru-cache@^5.1.1: version "5.1.1" @@ -2989,9 +3009,9 @@ minimist@1.2.6: integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== mkdirp@1.0.4, mkdirp@^1.0.4: version "1.0.4" @@ -3037,10 +3057,10 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.6: - version "2.0.8" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" - integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A== +node-releases@^2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" + integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== normalize-path@^3.0.0: version "3.0.0" @@ -3190,10 +3210,10 @@ prepend-file@^2.0.1: dependencies: temp-write "^4.0.0" -prettier@^2.6.2, prettier@^2.8.3: - version "2.8.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.3.tgz#ab697b1d3dd46fb4626fbe2f543afe0cc98d8632" - integrity sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw== +prettier@^2.6.2, prettier@^2.8.8: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== protobufjs@^6.8.8, protobufjs@~6.11.2, protobufjs@~6.11.3: version "6.11.3" @@ -3260,28 +3280,18 @@ regenerator-transform@^0.15.1: dependencies: "@babel/runtime" "^7.8.4" -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -regexpu-core@^5.2.1: - version "5.2.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" - integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: + "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" regenerate-unicode-properties "^10.1.0" - regjsgen "^0.7.1" regjsparser "^0.9.1" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" -regjsgen@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" - integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== - regjsparser@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" @@ -3300,11 +3310,11 @@ resolve-from@^5.0.0: integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve@^1.1.6, resolve@^1.14.2: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.11.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -3370,9 +3380,9 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== semver@^7.3.7: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + version "7.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== dependencies: lru-cache "^6.0.0" @@ -3604,10 +3614,10 @@ type@^2.7.2: resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== -typescript@^4.9.4: - version "4.9.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" - integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== +typescript@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" + integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" @@ -3632,10 +3642,10 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== -update-browserslist-db@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -3666,10 +3676,10 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" -wasm-ast-types@^0.17.0: - version "0.17.0" - resolved "https://registry.yarnpkg.com/wasm-ast-types/-/wasm-ast-types-0.17.0.tgz#417280a61d60ea9964667cf2edb8f5281dc295d7" - integrity sha512-WeriXPbG67iI51Mf/5qRR0xcpEaTO/Wyjpl+vsmjZ5K6q/0W6iO03zHsESNIH/hpc5FPTpb0Y0L9xAtnnNe9Ow== +wasm-ast-types@^0.20.0: + version "0.20.0" + resolved "https://registry.yarnpkg.com/wasm-ast-types/-/wasm-ast-types-0.20.0.tgz#93782528318620072ce9650f0e16861c8c620c08" + integrity sha512-EBEf0PaBGwK8eAKjG5SPDY6Dj1AEG4x07paGaJ+hAhltAsF2PgfBikR3i1UIdFjj8BFb2nGwlRTfWPH1ll9Dyg== dependencies: "@babel/runtime" "^7.18.9" "@babel/types" "7.18.10"