From 274d4fd188aecc4459e42cb7b576e82f4dc23c99 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Fri, 8 Mar 2024 12:24:14 +0100 Subject: [PATCH 01/42] chore: bump cw-it and cosmwasm-std --- Cargo.lock | 1071 ++++++++--------- Cargo.toml | 4 +- .../src/contract.rs | 219 ++-- .../astroport-liquidity-helper/src/msg.rs | 4 +- .../tests/astroport_integration_tests.rs | 13 +- .../osmosis-liquidity-helper/src/contract.rs | 4 +- contracts/osmosis-liquidity-helper/src/msg.rs | 4 +- .../tests/osmosis_integration_tests.rs | 4 +- packages/liquidity-helper/src/helper.rs | 6 +- 9 files changed, 678 insertions(+), 651 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 165bd52..0d8f0a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -49,7 +49,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "423502406a307052f6877030f48b5fb4e9fb338fc5e7c8ca1064210def52876b" dependencies = [ - "astroport", + "astroport 2.9.0", "cosmwasm-std", "cw-storage-plus 1.1.0", "cw20 1.1.1", @@ -85,6 +85,36 @@ dependencies = [ "uint", ] +[[package]] +name = "astroport" +version = "3.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c001a7f97db88ffe6fc6cca97bbdbfe926e55599184921ff7e72cd47559440de" +dependencies = [ + "astroport-circular-buffer", + "cosmwasm-schema", + "cosmwasm-std", + "cw-asset", + "cw-storage-plus 0.15.1", + "cw-utils 1.0.2", + "cw20 0.15.1", + "cw3", + "itertools", + "uint", +] + +[[package]] +name = "astroport-circular-buffer" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dac37467245383e7a6baeaaabc22dfd85a7b70ff5d693f757ba63bbc6e39d2c3" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.15.1", + "thiserror", +] + [[package]] name = "astroport-liquidity-helper" version = "0.3.2" @@ -116,17 +146,6 @@ dependencies = [ "syn 2.0.38", ] -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - [[package]] name = "autocfg" version = "1.1.0" @@ -148,12 +167,6 @@ dependencies = [ "rustc-demangle", ] -[[package]] -name = "base16ct" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" - [[package]] name = "base16ct" version = "0.2.0" @@ -178,40 +191,44 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + [[package]] name = "bindgen" -version = "0.60.1" +version = "0.69.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062dddbc1ba4aca46de6338e2bf87771414c335f7b2f2036e8f3e9befebf88e6" +checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.1", "cexpr", "clang-sys", - "clap", - "env_logger", + "itertools", "lazy_static", "lazycell", "log", - "peeking_take_while", + "prettyplease", "proc-macro2", "quote", "regex", "rustc-hash", "shlex", + "syn 2.0.38", "which", ] [[package]] name = "bip32" -version = "0.4.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30ed1d6f8437a487a266c8293aeb95b61a23261273e3e02912cdb8b68bf798b" +checksum = "7e141fb0f8be1c7b45887af94c88b182472b57c96b56773250ae00cd6a14a164" dependencies = [ "bs58", "hmac", - "k256 0.11.6", - "once_cell", - "pbkdf2", + "k256", "rand_core 0.6.4", "ripemd", "sha2 0.10.8", @@ -251,17 +268,17 @@ dependencies = [ [[package]] name = "bnum" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" +checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" [[package]] name = "bs58" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" +checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" dependencies = [ - "sha2 0.9.9", + "sha2 0.10.8", ] [[package]] @@ -281,6 +298,9 @@ name = "bytes" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +dependencies = [ + "serde", +] [[package]] name = "cc" @@ -326,30 +346,6 @@ dependencies = [ "libloading", ] -[[package]] -name = "clap" -version = "3.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" -dependencies = [ - "atty", - "bitflags 1.3.2", - "clap_lex", - "indexmap", - "strsim", - "termcolor", - "textwrap", -] - -[[package]] -name = "clap_lex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" -dependencies = [ - "os_str_bytes", -] - [[package]] name = "config" version = "0.13.3" @@ -393,30 +389,30 @@ checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "cosmos-sdk-proto" -version = "0.14.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20b42021d8488665b1a0d9748f1f81df7235362d194f44481e2e61bf376b77b4" +checksum = "32560304ab4c365791fd307282f76637213d8083c1a98490c35159cd67852237" dependencies = [ - "prost", - "prost-types", + "prost 0.12.3", + "prost-types 0.12.3", "tendermint-proto", ] [[package]] name = "cosmrs" -version = "0.9.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3903590099dcf1ea580d9353034c9ba1dbf55d1389a5bd2ade98535c3445d1f9" +checksum = "47126f5364df9387b9d8559dcef62e99010e1d4098f39eb3f7ee4b5c254e40ea" dependencies = [ "bip32", "cosmos-sdk-proto", - "ecdsa 0.14.8", + "ecdsa", "eyre", - "getrandom", - "k256 0.11.6", + "k256", "rand_core 0.6.4", "serde", "serde_json", + "signature", "subtle-encoding", "tendermint", "tendermint-rpc", @@ -425,22 +421,23 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.4.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6fb22494cf7d23d0c348740e06e5c742070b2991fd41db77bba0bcfbae1a723" +checksum = "9934c79e58d9676edfd592557dee765d2a6ef54c09d5aa2edb06156b00148966" dependencies = [ "digest 0.10.7", + "ecdsa", "ed25519-zebra", - "k256 0.13.1", + "k256", "rand_core 0.6.4", "thiserror", ] [[package]] name = "cosmwasm-derive" -version = "1.4.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e199424486ea97d6b211db6387fd72e26b4a439d40cc23140b2d8305728055b" +checksum = "bc5e72e330bd3bdab11c52b5ecbdeb6a8697a004c57964caeb5d876f0b088b3c" dependencies = [ "syn 1.0.109", ] @@ -471,11 +468,12 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.4.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d89d680fb60439b7c5947b15f9c84b961b88d1f8a3b20c4bd178a3f87db8bae" +checksum = "ef8666e572a3a2519010dde88c04d16e9339ae751b56b2bb35081fe3f7d6be74" dependencies = [ "base64 0.21.5", + "bech32", "bnum", "cosmwasm-crypto", "cosmwasm-derive", @@ -486,6 +484,7 @@ dependencies = [ "serde", "serde-json-wasm", "sha2 0.10.8", + "static_assertions", "thiserror", ] @@ -504,18 +503,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" -[[package]] -name = "crypto-bigint" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - [[package]] name = "crypto-bigint" version = "0.5.3" @@ -538,15 +525,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "ct-logs" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1a816186fa68d9e426e3cb4ae4dff1fcd8e4a2c34b781bf7a822574a0d0aac8" -dependencies = [ - "sct", -] - [[package]] name = "curve25519-dalek" version = "3.2.0" @@ -560,6 +538,42 @@ dependencies = [ "zeroize", ] +[[package]] +name = "curve25519-dalek-ng" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.6.4", + "subtle-ng", + "zeroize", +] + +[[package]] +name = "cw-address-like" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451a4691083a88a3c0630a8a88799e9d4cd6679b7ce8ff22b8da2873ff31d380" +dependencies = [ + "cosmwasm-std", +] + +[[package]] +name = "cw-asset" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64e2cf17accdcafe71859a683b6ed3f18311634a769550aacf4829b50151b221" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-address-like", + "cw-storage-plus 1.1.0", + "cw20 1.1.1", + "thiserror", +] + [[package]] name = "cw-bigint" version = "0.4.3" @@ -579,34 +593,34 @@ checksum = "6f47ce1f0a02665dfe244bd5e396ecd3f8628fb8e6aabd1be38689501b6c139a" dependencies = [ "apollo-cw-asset", "apollo-utils", - "astroport", + "astroport 2.9.0", "cosmwasm-schema", "cosmwasm-std", "cw-utils 1.0.2", "cw2 1.1.1", "cw20 1.1.1", - "osmosis-std", + "osmosis-std 0.19.2", "thiserror", ] [[package]] name = "cw-it" -version = "0.2.3" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f452b759fc448ec05d20dc70f25dda8b83ba0a7c994049d27556fd1813a5ad0d" +checksum = "3d9bf95d529e18676d6915a26c6d0ff254baf71d6a46ddae5c2014c276dae546" dependencies = [ "anyhow", - "astroport", + "astroport 2.9.0", + "astroport 3.11.1", "config", "cosmrs", "cosmwasm-schema", "cosmwasm-std", "cw20 0.15.1", - "osmosis-std", + "osmosis-std 0.22.0", "osmosis-test-tube", - "prost", + "prost 0.12.3", "serde", - "serde_json", "strum", "test-tube", "thiserror", @@ -718,13 +732,18 @@ dependencies = [ ] [[package]] -name = "der" -version = "0.6.1" +name = "cw3" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +checksum = "1d056ec33ec146554aa1d16c9535763341db75589a47743c006c377e62b54034" dependencies = [ - "const-oid", - "zeroize", + "cosmwasm-schema", + "cosmwasm-std", + "cw-utils 1.0.2", + "cw20 1.1.1", + "schemars", + "serde", + "thiserror", ] [[package]] @@ -781,49 +800,39 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23d2f3407d9a573d666de4b5bdf10569d73ca9478087346697dcbae6244bfbcd" -[[package]] -name = "ecdsa" -version = "0.14.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" -dependencies = [ - "der 0.6.1", - "elliptic-curve 0.12.3", - "rfc6979 0.3.1", - "signature 1.6.4", -] - [[package]] name = "ecdsa" version = "0.16.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ - "der 0.7.8", + "der", "digest 0.10.7", - "elliptic-curve 0.13.6", - "rfc6979 0.4.0", - "signature 2.1.0", - "spki 0.7.2", + "elliptic-curve", + "rfc6979", + "signature", + "spki", ] [[package]] name = "ed25519" -version = "1.5.3" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ - "signature 1.6.4", + "pkcs8", + "signature", ] [[package]] -name = "ed25519-dalek" -version = "1.0.1" +name = "ed25519-consensus" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" dependencies = [ - "curve25519-dalek", - "ed25519", + "curve25519-dalek-ng", + "hex", + "rand_core 0.6.4", "sha2 0.9.9", "zeroize", ] @@ -849,56 +858,32 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" -[[package]] -name = "elliptic-curve" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" -dependencies = [ - "base16ct 0.1.1", - "crypto-bigint 0.4.9", - "der 0.6.1", - "digest 0.10.7", - "ff 0.12.1", - "generic-array", - "group 0.12.1", - "pkcs8 0.9.0", - "rand_core 0.6.4", - "sec1 0.3.0", - "subtle", - "zeroize", -] - [[package]] name = "elliptic-curve" version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d97ca172ae9dc9f9b779a6e3a65d308f2af74e5b8c921299075bdb4a0370e914" dependencies = [ - "base16ct 0.2.0", - "crypto-bigint 0.5.3", + "base16ct", + "crypto-bigint", "digest 0.10.7", - "ff 0.13.0", + "ff", "generic-array", - "group 0.13.0", - "pkcs8 0.10.2", + "group", + "pkcs8", "rand_core 0.6.4", - "sec1 0.7.3", + "sec1", "subtle", "zeroize", ] [[package]] -name = "env_logger" -version = "0.9.3" +name = "encoding_rs" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", + "cfg-if", ] [[package]] @@ -908,7 +893,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -921,16 +906,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "ff" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "ff" version = "0.13.0" @@ -980,7 +955,6 @@ checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", - "futures-executor", "futures-io", "futures-sink", "futures-task", @@ -1003,34 +977,12 @@ version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" -[[package]] -name = "futures-executor" -version = "0.3.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - [[package]] name = "futures-io" version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" -[[package]] -name = "futures-macro" -version = "0.3.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.38", -] - [[package]] name = "futures-sink" version = "0.3.29" @@ -1049,16 +1001,11 @@ version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ - "futures-channel", "futures-core", - "futures-io", - "futures-macro", "futures-sink", "futures-task", - "memchr", "pin-project-lite", "pin-utils", - "slab", ] [[package]] @@ -1097,24 +1044,13 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" -[[package]] -name = "group" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" -dependencies = [ - "ff 0.12.1", - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "group" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "ff 0.13.0", + "ff", "rand_core 0.6.4", "subtle", ] @@ -1147,45 +1083,12 @@ dependencies = [ "ahash", ] -[[package]] -name = "headers" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" -dependencies = [ - "base64 0.21.5", - "bytes", - "headers-core", - "http", - "httpdate", - "mime", - "sha1", -] - -[[package]] -name = "headers-core" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" -dependencies = [ - "http", -] - [[package]] name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - [[package]] name = "hermit-abi" version = "0.3.3" @@ -1213,7 +1116,7 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" dependencies = [ - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1250,12 +1153,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - [[package]] name = "hyper" version = "0.14.27" @@ -1280,41 +1177,18 @@ dependencies = [ "want", ] -[[package]] -name = "hyper-proxy" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca815a891b24fdfb243fa3239c86154392b0953ee584aa1a2a1f66d20cbe75cc" -dependencies = [ - "bytes", - "futures", - "headers", - "http", - "hyper", - "hyper-rustls", - "rustls-native-certs", - "tokio", - "tokio-rustls", - "tower-service", - "webpki", -] - [[package]] name = "hyper-rustls" -version = "0.22.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ - "ct-logs", "futures-util", + "http", "hyper", - "log", "rustls", - "rustls-native-certs", "tokio", "tokio-rustls", - "webpki", - "webpki-roots", ] [[package]] @@ -1343,6 +1217,12 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + [[package]] name = "itertools" version = "0.10.5" @@ -1378,19 +1258,6 @@ dependencies = [ "serde", ] -[[package]] -name = "k256" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" -dependencies = [ - "cfg-if", - "ecdsa 0.14.8", - "elliptic-curve 0.12.3", - "sha2 0.10.8", - "sha3", -] - [[package]] name = "k256" version = "0.13.1" @@ -1398,20 +1265,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" dependencies = [ "cfg-if", - "ecdsa 0.16.8", - "elliptic-curve 0.13.6", + "ecdsa", + "elliptic-curve", "once_cell", "sha2 0.10.8", - "signature 2.1.0", -] - -[[package]] -name = "keccak" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" -dependencies = [ - "cpufeatures", + "signature", ] [[package]] @@ -1506,7 +1364,7 @@ checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1555,7 +1413,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.3", + "hermit-abi", "libc", ] @@ -1605,12 +1463,6 @@ dependencies = [ "hashbrown", ] -[[package]] -name = "os_str_bytes" -version = "6.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" - [[package]] name = "osmosis-liquidity-helper" version = "0.3.2" @@ -1634,9 +1486,25 @@ checksum = "798fade51443a0e07eb25b59a11b320b9e8f03e6e8fbe14c520258f04742fe13" dependencies = [ "chrono", "cosmwasm-std", - "osmosis-std-derive", - "prost", - "prost-types", + "osmosis-std-derive 0.16.2", + "prost 0.11.9", + "prost-types 0.11.9", + "schemars", + "serde", + "serde-cw-value", +] + +[[package]] +name = "osmosis-std" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8641c376f01f5af329dc2a34e4f5527eaeb0bde18cda8d86fed958d04c86159c" +dependencies = [ + "chrono", + "cosmwasm-std", + "osmosis-std-derive 0.20.1", + "prost 0.12.3", + "prost-types 0.12.3", "schemars", "serde", "serde-cw-value", @@ -1650,23 +1518,36 @@ checksum = "f47f0b2f22adb341bb59e5a3a1b464dde033181954bd055b9ae86d6511ba465b" dependencies = [ "itertools", "proc-macro2", - "prost-types", + "prost-types 0.11.9", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "osmosis-std-derive" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5ebdfd1bc8ed04db596e110c6baa9b174b04f6ed1ec22c666ddc5cb3fa91bd7" +dependencies = [ + "itertools", + "proc-macro2", + "prost-types 0.11.9", "quote", "syn 1.0.109", ] [[package]] name = "osmosis-test-tube" -version = "19.2.0" +version = "22.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0dde0a21f1323e7c78f46da4bd0b24149d26483785fb5b39f74016f3f524aad" +checksum = "a082b97136d15470a37aa758f227c865594590b69d74721248ed5adf59bf1ca2" dependencies = [ - "base64 0.13.1", + "base64 0.21.5", "bindgen", "cosmrs", "cosmwasm-std", - "osmosis-std", - "prost", + "osmosis-std 0.22.0", + "prost 0.12.3", "serde", "serde_json", "test-tube", @@ -1685,26 +1566,11 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - [[package]] name = "peg" -version = "0.7.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c0b841ea54f523f7aa556956fbd293bcbe06f2e67d2eb732b7278aaf1d166a" +checksum = "400bcab7d219c38abf8bd7cc2054eb9bbbd4312d66f6a5557d572a203f646f61" dependencies = [ "peg-macros", "peg-runtime", @@ -1712,9 +1578,9 @@ dependencies = [ [[package]] name = "peg-macros" -version = "0.7.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aa52829b8decbef693af90202711348ab001456803ba2a98eb4ec8fb70844c" +checksum = "46e61cce859b76d19090f62da50a9fe92bab7c2a5f09e183763559a2ac392c90" dependencies = [ "peg-runtime", "proc-macro2", @@ -1723,9 +1589,9 @@ dependencies = [ [[package]] name = "peg-runtime" -version = "0.7.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c719dcf55f09a3a7e764c6649ab594c18a177e3599c467983cdf644bfc0a4088" +checksum = "36bae92c60fa2398ce4678b98b2c4b5a7c61099961ca1fa305aec04a9ad28922" [[package]] name = "percent-encoding" @@ -1812,22 +1678,28 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkcs8" -version = "0.9.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "der 0.6.1", - "spki 0.6.0", + "der", + "spki", ] [[package]] -name = "pkcs8" -version = "0.10.2" +name = "ppv-lite86" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "prettyplease" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ - "der 0.7.8", - "spki 0.7.2", + "proc-macro2", + "syn 2.0.38", ] [[package]] @@ -1870,20 +1742,43 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" dependencies = [ "bytes", - "prost-derive", + "prost-derive 0.11.9", +] + +[[package]] +name = "prost" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" +dependencies = [ + "bytes", + "prost-derive 0.12.3", +] + +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] name = "prost-derive" -version = "0.11.9" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" dependencies = [ "anyhow", "itertools", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.38", ] [[package]] @@ -1892,7 +1787,16 @@ version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" dependencies = [ - "prost", + "prost 0.11.9", +] + +[[package]] +name = "prost-types" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" +dependencies = [ + "prost 0.12.3", ] [[package]] @@ -1904,6 +1808,27 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + [[package]] name = "rand_core" version = "0.5.1" @@ -1949,14 +1874,44 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] -name = "rfc6979" -version = "0.3.1" +name = "reqwest" +version = "0.11.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" dependencies = [ - "crypto-bigint 0.4.9", - "hmac", - "zeroize", + "base64 0.21.5", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-rustls", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-native-certs", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-rustls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", ] [[package]] @@ -1971,17 +1926,17 @@ dependencies = [ [[package]] name = "ring" -version = "0.16.20" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", + "cfg-if", + "getrandom", "libc", - "once_cell", "spin", "untrusted", - "web-sys", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -1993,17 +1948,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "ripemd160" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eca4ecc81b7f313189bf73ce724400a07da2a6dac19588b03c8bd76a2dcc251" -dependencies = [ - "block-buffer 0.9.0", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "ron" version = "0.7.1" @@ -2047,34 +1991,52 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "rustls" -version = "0.19.1" +version = "0.21.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ - "base64 0.13.1", "log", "ring", + "rustls-webpki", "sct", - "webpki", ] [[package]] name = "rustls-native-certs" -version = "0.5.0" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ "openssl-probe", - "rustls", + "rustls-pemfile", "schannel", "security-framework", ] +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.5", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.14" @@ -2102,7 +2064,7 @@ version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2131,38 +2093,24 @@ dependencies = [ [[package]] name = "sct" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ "ring", "untrusted", ] -[[package]] -name = "sec1" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" -dependencies = [ - "base16ct 0.1.1", - "der 0.6.1", - "generic-array", - "pkcs8 0.9.0", - "subtle", - "zeroize", -] - [[package]] name = "sec1" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ - "base16ct 0.2.0", - "der 0.7.8", + "base16ct", + "der", "generic-array", - "pkcs8 0.10.2", + "pkcs8", "subtle", "zeroize", ] @@ -2216,9 +2164,9 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16a62a1fad1e1828b24acac8f2b468971dade7b8c3c2e672bcadefefb1f8c137" +checksum = "9e9213a07d53faa0b8dd81e767a54a8188a242fdb9be99ab75ec576a774bfdd7" dependencies = [ "serde", ] @@ -2277,14 +2225,15 @@ dependencies = [ ] [[package]] -name = "sha1" -version = "0.10.6" +name = "serde_urlencoded" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", + "form_urlencoded", + "itoa", + "ryu", + "serde", ] [[package]] @@ -2311,32 +2260,12 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest 0.10.7", - "keccak", -] - [[package]] name = "shlex" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - [[package]] name = "signature" version = "2.1.0" @@ -2373,24 +2302,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spki" -version = "0.6.0" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" -dependencies = [ - "base64ct", - "der 0.6.1", -] +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "spki" @@ -2399,7 +2318,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" dependencies = [ "base64ct", - "der 0.7.8", + "der", ] [[package]] @@ -2408,12 +2327,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "strum" version = "0.24.1" @@ -2451,6 +2364,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "subtle-ng" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" + [[package]] name = "syn" version = "1.0.109" @@ -2473,30 +2392,57 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tendermint" -version = "0.23.9" +version = "0.34.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "467f82178deeebcd357e1273a0c0b77b9a8a0313ef7c07074baebe99d87851f4" +checksum = "15ab8f0a25d0d2ad49ac615da054d6a76aa6603ff95f7d18bafdd34450a1a04b" dependencies = [ - "async-trait", "bytes", + "digest 0.10.7", "ed25519", - "ed25519-dalek", + "ed25519-consensus", "flex-error", "futures", - "k256 0.11.6", + "k256", "num-traits", "once_cell", - "prost", - "prost-types", - "ripemd160", + "prost 0.12.3", + "prost-types 0.12.3", + "ripemd", "serde", "serde_bytes", "serde_json", "serde_repr", - "sha2 0.9.9", - "signature 1.6.4", + "sha2 0.10.8", + "signature", "subtle", "subtle-encoding", "tendermint-proto", @@ -2506,9 +2452,9 @@ dependencies = [ [[package]] name = "tendermint-config" -version = "0.23.9" +version = "0.34.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d42ee0abc27ef5fc34080cce8d43c189950d331631546e7dfb983b6274fa327" +checksum = "e1a02da769166e2052cd537b1a97c78017632c2d9e19266367b27e73910434fc" dependencies = [ "flex-error", "serde", @@ -2520,16 +2466,16 @@ dependencies = [ [[package]] name = "tendermint-proto" -version = "0.23.9" +version = "0.34.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ce80bf536476db81ecc9ebab834dc329c9c1509a694f211a73858814bfe023" +checksum = "b797dd3d2beaaee91d2f065e7bdf239dc8d80bba4a183a288bc1279dd5a69a1e" dependencies = [ "bytes", "flex-error", "num-derive", "num-traits", - "prost", - "prost-types", + "prost 0.12.3", + "prost-types 0.12.3", "serde", "serde_bytes", "subtle-encoding", @@ -2538,24 +2484,24 @@ dependencies = [ [[package]] name = "tendermint-rpc" -version = "0.23.9" +version = "0.34.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f14aafe3528a0f75e9f3f410b525617b2de16c4b7830a21f717eee62882ec60" +checksum = "71afae8bb5f6b14ed48d4e1316a643b6c2c3cbad114f510be77b4ed20b7b3e42" dependencies = [ "async-trait", "bytes", "flex-error", "futures", "getrandom", - "http", - "hyper", - "hyper-proxy", - "hyper-rustls", "peg", "pin-project", + "rand", + "reqwest", + "semver", "serde", "serde_bytes", "serde_json", + "subtle", "subtle-encoding", "tendermint", "tendermint-config", @@ -2569,15 +2515,6 @@ dependencies = [ "walkdir", ] -[[package]] -name = "termcolor" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" -dependencies = [ - "winapi-util", -] - [[package]] name = "test-case" version = "3.2.1" @@ -2615,26 +2552,20 @@ dependencies = [ [[package]] name = "test-tube" -version = "0.1.7" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04de0d85f2438f0b64a5c135a1524564f2b89263cfbce011542446b6681d006f" +checksum = "09184c7655b2bdaf4517b06141a2e4c44360904f2706a05b24c831bd97ad1db6" dependencies = [ - "base64 0.13.1", + "base64 0.21.5", "cosmrs", "cosmwasm-std", - "osmosis-std", - "prost", + "osmosis-std 0.22.0", + "prost 0.12.3", "serde", "serde_json", "thiserror", ] -[[package]] -name = "textwrap" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" - [[package]] name = "thiserror" version = "1.0.50" @@ -2701,7 +2632,7 @@ dependencies = [ "pin-project-lite", "socket2 0.5.5", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2717,13 +2648,12 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.22.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ "rustls", "tokio", - "webpki", ] [[package]] @@ -2827,9 +2757,9 @@ dependencies = [ [[package]] name = "untrusted" -version = "0.7.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" @@ -2844,9 +2774,9 @@ dependencies = [ [[package]] name = "uuid" -version = "0.8.2" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" [[package]] name = "version_check" @@ -2904,6 +2834,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.87" @@ -2943,25 +2885,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki" -version = "0.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "webpki-roots" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" -dependencies = [ - "webpki", -] - [[package]] name = "which" version = "4.4.2" @@ -3011,7 +2934,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.4", ] [[package]] @@ -3020,13 +2952,28 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +dependencies = [ + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", ] [[package]] @@ -3035,42 +2982,94 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "yaml-rust" version = "0.4.5" diff --git a/Cargo.toml b/Cargo.toml index 13d8888..477214b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ keywords = ["cosmwasm", "liquidity", "provision", "osmosis", "astroport"] rust-version = "1.64.0" [workspace.dependencies] -cosmwasm-std = "1.4.0" +cosmwasm-std = "1.5.3" cosmwasm-schema = "1.4.0" cw2 = "1.1.0" cw20 = "1.1.0" @@ -26,7 +26,7 @@ liquidity-helper = { version = "0.3.0", path = "./packages/liquidity-helper" } semver = "1.0.20" # Dev dependencies -cw-it = "0.2.2" +cw-it = "0.3.1" test-case = "3.2.1" [profile.release] diff --git a/contracts/astroport-liquidity-helper/src/contract.rs b/contracts/astroport-liquidity-helper/src/contract.rs index 709945e..28c8a7b 100644 --- a/contracts/astroport-liquidity-helper/src/contract.rs +++ b/contracts/astroport-liquidity-helper/src/contract.rs @@ -4,7 +4,7 @@ use apollo_utils::responses::merge_responses; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - from_binary, to_binary, Addr, BankMsg, Binary, CosmosMsg, Deps, DepsMut, Env, Event, + from_json, to_json_binary, Addr, BankMsg, Binary, CosmosMsg, Deps, DepsMut, Env, Event, MessageInfo, Response, StdResult, Uint128, }; use cw2::set_contract_version; @@ -53,7 +53,7 @@ pub fn execute( recipient, } => { let assets = assets.check(deps.api)?; - let pool: AstroportPool = from_binary(&pool)?; + let pool: AstroportPool = from_json(&pool)?; execute_balancing_provide_liquidity(deps, env, info, assets, min_out, pool, recipient) } ExecuteMsg::Callback(msg) => { @@ -80,6 +80,107 @@ pub fn execute( } } +fn handle_xyk_balancing_provide_liquidity( + deps: Deps, + env: &Env, + info: MessageInfo, + pool: &AstroportPool, + assets: &mut AssetList, + min_out: Uint128, +) -> Result { + let pool_res = pool.query_pool_info(&deps.querier)?; + + let pool_reserves: [Asset; 2] = [ + Asset::from(pool_res.assets[0].clone()), + Asset::from(pool_res.assets[1].clone()), + ]; + if assets.len() > 2 { + return Err(ContractError::MoreThanTwoAssets {}); + } + + // If only one asset is provided in the AssetList, we need to + // create the other asset with an empty amount + let assets_slice: [Asset; 2] = [ + assets + .find(&pool_reserves[0].info) + .cloned() + .unwrap_or_else(|| Asset { + info: pool_reserves[0].info.clone(), + amount: Uint128::zero(), + }), + assets + .find(&pool_reserves[1].info) + .cloned() + .unwrap_or_else(|| Asset { + info: pool_reserves[1].info.clone(), + amount: Uint128::zero(), + }), + ]; + + // Get fee amount + let fee_info = query_fee_info( + &deps.querier, + ASTROPORT_FACTORY.load(deps.storage)?, + pool.pair_type.clone(), + )?; + let fee = fee_info.total_fee_rate; + + // Calculate amount of tokens to swap + let (offer_asset, return_asset) = calc_xyk_balancing_swap( + assets_slice, + [pool_reserves[0].amount, pool_reserves[1].amount], + fee, + )?; + // Update balances for liquidity provision + assets.add(&return_asset)?; + assets.deduct(&offer_asset)?; + + // If either of the assets are still zero after the swap, we can't + // provide liquidity. This can happen if the amount of tokens to swap + // is so small that the returned amount of the other asset would be zero. + if pool.pool_assets.iter().any(|x| { + assets + .find(x) + .map_or_else(Uint128::zero, |y| y.amount) + .is_zero() + }) { + if min_out.is_zero() { + // If min_out is zero, we can just return the received native + // assets. We don't need to return any Cw20 assets, because + // we did not execute the transferFrom on them. + let return_msg = CosmosMsg::Bank(BankMsg::Send { + to_address: info.sender.to_string(), + amount: info.funds, + }); + let event = + Event::new("apollo/astroport-liquidity-helper/execute_balancing_provide_liquidity") + .add_attribute("action", "No liquidity provided. Zero amount of asset") + .add_attribute("assets", assets.to_string()) + .add_attribute("min_out", min_out); + return Ok(Response::new().add_message(return_msg).add_event(event)); + } else { + // If min_out is not zero, we need to return an error + return Err(ContractError::MinOutNotReceived { + min_out, + received: Uint128::zero(), + }); + } + } + + // Create message to swap some of the asset to the other + if offer_asset.amount > Uint128::zero() && return_asset.amount > Uint128::zero() { + Ok(pool.swap( + deps, + env, + offer_asset, + return_asset.info.clone(), + Uint128::one(), + )?) + } else { + Ok(Response::new()) + } +} + pub fn execute_balancing_provide_liquidity( deps: DepsMut, env: Env, @@ -105,105 +206,27 @@ pub fn execute_balancing_provide_liquidity( // we provide liquidity. For other types we can just provide liquidity // directly. let swap_res = match &pool.pair_type { - PairType::Xyk {} => { - let pool_res = pool.query_pool_info(&deps.querier)?; - - let pool_reserves: [Asset; 2] = [ - Asset::from(pool_res.assets[0].clone()), - Asset::from(pool_res.assets[1].clone()), - ]; - if assets.len() > 2 { - return Err(ContractError::MoreThanTwoAssets {}); - } - - // If only one asset is provided in the AssetList, we need to - // create the other asset with an empty amount - let assets_slice: [Asset; 2] = [ - assets - .find(&pool_reserves[0].info) - .cloned() - .unwrap_or_else(|| Asset { - info: pool_reserves[0].info.clone(), - amount: Uint128::zero(), - }), - assets - .find(&pool_reserves[1].info) - .cloned() - .unwrap_or_else(|| Asset { - info: pool_reserves[1].info.clone(), - amount: Uint128::zero(), - }), - ]; - - // Get fee amount - let fee_info = query_fee_info( - &deps.querier, - ASTROPORT_FACTORY.load(deps.storage)?, - pool.pair_type.clone(), - )?; - let fee = fee_info.total_fee_rate; - - // Calculate amount of tokens to swap - let (offer_asset, return_asset) = calc_xyk_balancing_swap( - assets_slice, - [pool_reserves[0].amount, pool_reserves[1].amount], - fee, - )?; - // Update balances for liquidity provision - assets.add(&return_asset)?; - assets.deduct(&offer_asset)?; - - // If either of the assets are still zero after the swap, we can't - // provide liquidity. This can happen if the amount of tokens to swap - // is so small that the returned amount of the other asset would be zero. - if pool.pool_assets.iter().any(|x| { - assets - .find(x) - .map_or_else(Uint128::zero, |y| y.amount) - .is_zero() - }) { - if min_out.is_zero() { - // If min_out is zero, we can just return the received native - // assets. We don't need to return any Cw20 assets, because - // we did not execute the transferFrom on them. - let return_msg = CosmosMsg::Bank(BankMsg::Send { - to_address: info.sender.to_string(), - amount: info.funds, - }); - let event = Event::new( - "apollo/astroport-liquidity-helper/execute_balancing_provide_liquidity", - ) - .add_attribute("action", "No liquidity provided. Zero amount of asset") - .add_attribute("assets", assets.to_string()) - .add_attribute("min_out", min_out); - return Ok(Response::new().add_message(return_msg).add_event(event)); - } else { - // If min_out is not zero, we need to return an error - return Err(ContractError::MinOutNotReceived { - min_out, - received: Uint128::zero(), - }); - } - } - - // Create message to swap some of the asset to the other - if offer_asset.amount > Uint128::zero() && return_asset.amount > Uint128::zero() { - pool.swap( - deps.as_ref(), - &env, - offer_asset, - return_asset.info.clone(), - Uint128::one(), - )? - } else { - Response::new() - } - } + PairType::Xyk {} => handle_xyk_balancing_provide_liquidity( + deps.as_ref(), + &env, + info, + &pool, + &mut assets, + min_out, + )?, + PairType::Stable {} => Response::new(), PairType::Custom(t) => match t.as_str() { "concentrated" => Response::new(), + "astroport-pair-xyk-sale-tax" => handle_xyk_balancing_provide_liquidity( + deps.as_ref(), + &env, + info, + &pool, + &mut assets, + min_out, + )?, _ => return Err(ContractError::UnsupportedPairType {}), }, - _ => Response::new(), }; // For stableswap and concentrated liquidity pools we are allowed to provide @@ -257,7 +280,7 @@ pub fn execute_callback_return_lp_tokens( #[cfg_attr(not(feature = "library"), entry_point)] pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { match msg { - QueryMsg::AstroportFactory {} => to_binary(&ASTROPORT_FACTORY.load(deps.storage)?), + QueryMsg::AstroportFactory {} => to_json_binary(&ASTROPORT_FACTORY.load(deps.storage)?), } } diff --git a/contracts/astroport-liquidity-helper/src/msg.rs b/contracts/astroport-liquidity-helper/src/msg.rs index a1ffe0b..a8d5ecf 100644 --- a/contracts/astroport-liquidity-helper/src/msg.rs +++ b/contracts/astroport-liquidity-helper/src/msg.rs @@ -1,5 +1,5 @@ use cosmwasm_schema::{cw_serde, QueryResponses}; -use cosmwasm_std::{to_binary, Addr, CosmosMsg, Env, StdResult, Uint128, WasmMsg}; +use cosmwasm_std::{to_json_binary, Addr, CosmosMsg, Env, StdResult, Uint128, WasmMsg}; use cw_dex::astroport::AstroportPool; use liquidity_helper::msg::ExecuteMsg as GenericExecuteMsg; @@ -23,7 +23,7 @@ impl CallbackMsg { pub fn into_cosmos_msg(&self, env: &Env) -> StdResult { Ok(CosmosMsg::Wasm(WasmMsg::Execute { contract_addr: env.contract.address.to_string(), - msg: to_binary(&ExecuteMsg::Callback(self.clone()))?, + msg: to_json_binary(&ExecuteMsg::Callback(self.clone()))?, funds: vec![], })) } diff --git a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs index cb3193f..8f6f5a0 100644 --- a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs +++ b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs @@ -1,7 +1,7 @@ use apollo_cw_asset::{Asset, AssetInfo, AssetList}; use astroport_liquidity_helper::math::calc_xyk_balancing_swap; use astroport_liquidity_helper::msg::InstantiateMsg; -use cosmwasm_std::{assert_approx_eq, coin, to_binary, Addr, Coin, Decimal, Uint128}; +use cosmwasm_std::{assert_approx_eq, coin, to_json_binary, Addr, Coin, Decimal, Uint128}; use cw20::{AllowanceResponse, BalanceResponse, Cw20ExecuteMsg, Cw20QueryMsg}; use cw_dex::astroport::astroport::asset::{Asset as AstroAsset, AssetInfo as AstroAssetInfo}; use cw_dex::astroport::astroport::factory::{ @@ -331,14 +331,14 @@ pub fn test_balancing_provide_liquidity( ]; let init_params = match &pair_type { PairType::Stable {} => Some( - to_binary(&StablePoolParams { + to_json_binary(&StablePoolParams { amp: 10u64, owner: None, }) .unwrap(), ), PairType::Custom(t) => match t.as_str() { - "concentrated" => Some(to_binary(&common_pcl_params()).unwrap()), + "concentrated" => Some(to_json_binary(&common_pcl_params()).unwrap()), _ => None, }, _ => None, @@ -443,7 +443,12 @@ pub fn test_balancing_provide_liquidity( )) .unwrap(); let msgs = liquidity_helper - .balancing_provide_liquidity(assets, Uint128::zero(), to_binary(&pool).unwrap(), None) + .balancing_provide_liquidity( + assets, + Uint128::zero(), + to_json_binary(&pool).unwrap(), + None, + ) .unwrap(); let _res = runner .execute_cosmos_msgs::(&msgs, admin) diff --git a/contracts/osmosis-liquidity-helper/src/contract.rs b/contracts/osmosis-liquidity-helper/src/contract.rs index 6289aec..f25620e 100644 --- a/contracts/osmosis-liquidity-helper/src/contract.rs +++ b/contracts/osmosis-liquidity-helper/src/contract.rs @@ -2,7 +2,7 @@ use apollo_cw_asset::{Asset, AssetList}; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - attr, from_binary, Addr, Binary, Deps, DepsMut, Env, Event, MessageInfo, Response, StdError, + attr, from_json, Addr, Binary, Deps, DepsMut, Env, Event, MessageInfo, Response, StdError, StdResult, Uint128, }; use cw2::set_contract_version; @@ -43,7 +43,7 @@ pub fn execute( recipient, } => { let assets = assets.check(deps.api)?; - let pool: OsmosisPool = from_binary(&pool)?; + let pool: OsmosisPool = from_json(&pool)?; execute_balancing_provide_liquidity(deps, env, info, assets, min_out, pool, recipient) } ExecuteMsg::Callback(msg) => { diff --git a/contracts/osmosis-liquidity-helper/src/msg.rs b/contracts/osmosis-liquidity-helper/src/msg.rs index b2349b6..7874a6e 100644 --- a/contracts/osmosis-liquidity-helper/src/msg.rs +++ b/contracts/osmosis-liquidity-helper/src/msg.rs @@ -1,6 +1,6 @@ use apollo_cw_asset::Asset; use cosmwasm_schema::{cw_serde, QueryResponses}; -use cosmwasm_std::{to_binary, Addr, CosmosMsg, Env, StdResult, Uint128, WasmMsg}; +use cosmwasm_std::{to_json_binary, Addr, CosmosMsg, Env, StdResult, Uint128, WasmMsg}; use cw_dex::osmosis::OsmosisPool; use liquidity_helper::msg::ExecuteMsg as GenericExcuteMsg; @@ -27,7 +27,7 @@ impl CallbackMsg { pub fn into_cosmos_msg(&self, env: &Env) -> StdResult { Ok(CosmosMsg::Wasm(WasmMsg::Execute { contract_addr: env.contract.address.to_string(), - msg: to_binary(&ExecuteMsg::Callback(self.clone()))?, + msg: to_json_binary(&ExecuteMsg::Callback(self.clone()))?, funds: vec![], })) } diff --git a/contracts/osmosis-liquidity-helper/tests/osmosis_integration_tests.rs b/contracts/osmosis-liquidity-helper/tests/osmosis_integration_tests.rs index 641e69e..73818cc 100644 --- a/contracts/osmosis-liquidity-helper/tests/osmosis_integration_tests.rs +++ b/contracts/osmosis-liquidity-helper/tests/osmosis_integration_tests.rs @@ -2,7 +2,7 @@ use std::str::FromStr; use std::vec; use apollo_cw_asset::{Asset, AssetList}; -use cosmwasm_std::{to_binary, Addr, Coin, StdError, Uint128}; +use cosmwasm_std::{to_json_binary, Addr, Coin, StdError, Uint128}; use cw_dex::osmosis::OsmosisPool; use cw_it::osmosis_std::types::cosmos::bank::v1beta1::QueryBalanceRequest; use cw_it::osmosis_std::types::cosmwasm::wasm::v1::MsgExecuteContractResponse; @@ -175,7 +175,7 @@ where .balancing_provide_liquidity( assets.clone(), min_out, - to_binary(&pool).map_err(|e| RunnerError::GenericError(e.to_string()))?, + to_json_binary(&pool).map_err(|e| RunnerError::GenericError(e.to_string()))?, None, ) .map_err(|e| RunnerError::GenericError(e.to_string()))?; diff --git a/packages/liquidity-helper/src/helper.rs b/packages/liquidity-helper/src/helper.rs index b719d32..c9f7d1f 100644 --- a/packages/liquidity-helper/src/helper.rs +++ b/packages/liquidity-helper/src/helper.rs @@ -5,7 +5,7 @@ use cosmwasm_schema::serde::Serialize; use cw20::Cw20ExecuteMsg; use cosmwasm_std::{ - to_binary, Addr, Api, Binary, Coin, CosmosMsg, Empty, StdResult, Uint128, WasmMsg, + to_json_binary, Addr, Api, Binary, Coin, CosmosMsg, Empty, StdResult, Uint128, WasmMsg, }; use crate::msg::ExecuteMsg; @@ -33,7 +33,7 @@ impl LiquidityHelper { msg: T, funds: Vec, ) -> StdResult { - let msg = to_binary(&msg.into())?; + let msg = to_json_binary(&msg.into())?; Ok(WasmMsg::Execute { contract_addr: self.addr().into(), msg, @@ -57,7 +57,7 @@ impl LiquidityHelper { .map(|asset| { Ok(CosmosMsg::Wasm(WasmMsg::Execute { contract_addr: asset.address, - msg: to_binary(&Cw20ExecuteMsg::IncreaseAllowance { + msg: to_json_binary(&Cw20ExecuteMsg::IncreaseAllowance { spender: self.addr().into(), amount: asset.amount, expires: None, From 54115a94bd17aeebcba0afa7f7b610f6752261e5 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Mon, 11 Mar 2024 14:07:47 +0100 Subject: [PATCH 02/42] build: update makefile --- Makefile.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.toml b/Makefile.toml index 75d42d9..2003e9f 100644 --- a/Makefile.toml +++ b/Makefile.toml @@ -4,10 +4,10 @@ skip_core_tasks = true [env] # If you bump this version, verify RUST_VERSION correctness -RUST_OPTIMIZER_VERSION = "0.13.0" +RUST_OPTIMIZER_VERSION = "0.15.1" # Use rust version from rust-optimizer Dockerfile (see https://github.com/CosmWasm/rust-optimizer/blob/main/Dockerfile#L1) # to be sure that we compile / test against the same version -RUST_VERSION = "1.69.0" +RUST_VERSION = "1.75.0" NIGHTLY_VERSION = "nightly-2023-08-29" [tasks.install-stable] From 0466d0a4cbb8dd5c1fb6b6b9c251650800b14def Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Mon, 11 Mar 2024 14:08:03 +0100 Subject: [PATCH 03/42] test: Add new astroport contracts --- .../tests/astroport-artifacts/VERSION.md | 8 +++++++- .../astroport_incentives.wasm | Bin 0 -> 515599 bytes .../astroport_pair_xyk_sale_tax.wasm | Bin 0 -> 473085 bytes 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 contracts/astroport-liquidity-helper/tests/astroport-artifacts/astroport_incentives.wasm create mode 100644 contracts/astroport-liquidity-helper/tests/astroport-artifacts/astroport_pair_xyk_sale_tax.wasm diff --git a/contracts/astroport-liquidity-helper/tests/astroport-artifacts/VERSION.md b/contracts/astroport-liquidity-helper/tests/astroport-artifacts/VERSION.md index d0899cf..270a470 100644 --- a/contracts/astroport-liquidity-helper/tests/astroport-artifacts/VERSION.md +++ b/contracts/astroport-liquidity-helper/tests/astroport-artifacts/VERSION.md @@ -1 +1,7 @@ -These artifacts were downloaded from the Github repository `astroport-core` on the [releases page](https://github.com/astroport-fi/astroport-core/releases/tag/v2.8.0). The version of the artifacts is `v2.8.0`. +These artifacts, except the below listed ones, were downloaded from the Github repository `astroport-core` on the [v2.8.0 release page](https://github.com/astroport-fi/astroport-core/releases/tag/v2.8.0). + +`astroport_liquidity_manager.wasm` was downloaded from the Github repository `astroport-core` on the [v3.6.1 release page](https://github.com/astroport-fi/astroport-core/releases/tag/v3.6.1). + +`astroport_incentives.wasm` was downloaded from the Github repository `astroport-core` on the [v3.11.0 release page](https://github.com/astroport-fi/astroport-core/releases/tag/v3.11.0). + +`astroport_pair_xyk_sale_tax.wasm` was downloaded from Neutron Mainnet CodeID 621 (cw2 info v1.6.0). diff --git a/contracts/astroport-liquidity-helper/tests/astroport-artifacts/astroport_incentives.wasm b/contracts/astroport-liquidity-helper/tests/astroport-artifacts/astroport_incentives.wasm new file mode 100644 index 0000000000000000000000000000000000000000..371ad055552afdb802f529a30ff0fb1d4c5c4816 GIT binary patch literal 515599 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

f4TsD@uL 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%0AK&Q;mL8Zh8lI5(` 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


)Z!LvZoJMvh${UJQ449+IhQ# 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

TDCy=LnKnNAy_)&#j8*n{zzh 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 Date: Mon, 11 Mar 2024 14:17:10 +0100 Subject: [PATCH 04/42] test: Add tests for astroport-pair-xyk-sale-tax --- .../tests/astroport_integration_tests.rs | 134 ++++++++++++------ 1 file changed, 88 insertions(+), 46 deletions(-) diff --git a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs index 8f6f5a0..ad17834 100644 --- a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs +++ b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs @@ -5,7 +5,7 @@ use cosmwasm_std::{assert_approx_eq, coin, to_json_binary, Addr, Coin, Decimal, use cw20::{AllowanceResponse, BalanceResponse, Cw20ExecuteMsg, Cw20QueryMsg}; use cw_dex::astroport::astroport::asset::{Asset as AstroAsset, AssetInfo as AstroAssetInfo}; use cw_dex::astroport::astroport::factory::{ - FeeInfoResponse, PairType, QueryMsg as FactoryQueryMsg, + ExecuteMsg as FactoryExecuteMsg, FeeInfoResponse, PairType, QueryMsg as FactoryQueryMsg, }; use cw_dex::astroport::astroport::pair::{ ExecuteMsg as PairExecuteMsg, PoolResponse, QueryMsg as PairQueryMsg, SimulationResponse, @@ -13,13 +13,15 @@ use cw_dex::astroport::astroport::pair::{ }; use cw_dex::astroport::astroport::pair_concentrated::ConcentratedPoolParams; use cw_dex::astroport::{astroport, AstroportPool}; +use cw_it::astroport::astroport::factory::PairConfig; +use cw_it::astroport::astroport_v3::pair_xyk_sale_tax::{SaleTaxInitParams, TaxConfig}; use cw_it::astroport::utils::{ create_astroport_pair, get_local_contracts, instantiate_astroport, AstroportContracts, }; use cw_it::helpers::upload_wasm_files; use cw_it::osmosis_test_tube::osmosis_std::types::cosmos::bank::v1beta1::QueryBalanceRequest; use cw_it::traits::CwItRunner; -use cw_it::TestRunner; +use cw_it::{Artifact, ContractType, TestRunner}; use liquidity_helper::LiquidityHelper; use test_case::test_matrix; @@ -27,15 +29,15 @@ use cw_it::osmosis_test_tube::cosmrs::proto::cosmwasm::wasm::v1::MsgExecuteContr use cw_it::osmosis_test_tube::{ Account, Bank, Module, OsmosisTestApp, Runner, SigningAccount, Wasm, }; -use std::collections::HashMap; + use std::str::FromStr; pub const ASTROPORT_LIQUIDITY_HELPER_WASM_FILE: &str = "../../target/wasm32-unknown-unknown/release/astroport_liquidity_helper.wasm"; -/// Runs tests against the Osmosis bindings. -/// This works since there are no big differences between Terra and Osmosis. -pub fn setup(runner: &TestRunner) -> (Vec, HashMap) { +/// Creates test accounts and instantiates astroport contracts +pub fn setup_astroport(runner: &TestRunner) -> (Vec, AstroportContracts) { + let wasm = Wasm::new(runner); let accs = runner .init_accounts( &[ @@ -45,12 +47,54 @@ pub fn setup(runner: &TestRunner) -> (Vec, HashMap) 2, ) .unwrap(); + let admin = &accs[0]; // Upload astroport contracts let contracts = get_local_contracts(runner, &Some("tests/astroport-artifacts"), false, &None); let astroport_code_ids = upload_wasm_files(runner, &accs[0], contracts).unwrap(); - (accs, astroport_code_ids) + // Instantiate Astroport contracts + let astroport_contracts = instantiate_astroport(runner, admin, &astroport_code_ids); + + // Update native coin registry with uluna precision + wasm.execute( + &astroport_contracts.coin_registry.address, + &astroport::native_coin_registry::ExecuteMsg::Add { + native_coins: vec![("uluna".to_string(), 6)], + }, + &[], + admin, + ) + .unwrap(); + + // Upload astroport pair xyk sale tax contract + let sale_tax_contract = match runner { + TestRunner::OsmosisTestApp(_) => ContractType::Artifact(Artifact::Local( + ("tests/astroport-artifacts/astroport_pair_xyk_sale_tax.wasm").to_string(), + )), + _ => panic!("Unsupported runner"), + }; + let sale_tax_code_id = runner.store_code(sale_tax_contract, admin).unwrap(); + + // Add XYK Sale Tax PairType to Astroport Factory + wasm.execute( + &astroport_contracts.factory.address, + &FactoryExecuteMsg::UpdatePairConfig { + config: PairConfig { + code_id: sale_tax_code_id, + is_disabled: false, + is_generator_disabled: false, + maker_fee_bps: 3333, + total_fee_bps: 30, + pair_type: PairType::Custom("astroport-pair-xyk-sale-tax".to_string()), + }, + }, + &[], + admin, + ) + .unwrap(); + + (accs, astroport_contracts) } /// Instantiates the liquidity helper contract @@ -100,13 +144,10 @@ where pub fn test_calc_xyk_balancing_swap() { let app = OsmosisTestApp::default(); let runner = TestRunner::OsmosisTestApp(&app); - let (accs, astroport_code_ids) = setup(&runner); + let (accs, astroport_contracts) = setup_astroport(&runner); let wasm = Wasm::new(&runner); let admin = &accs[0]; - // Instantiate Astroport contracts - let astroport_contracts = instantiate_astroport(&runner, admin, &astroport_code_ids); - let astro_token = astroport_contracts.astro_token.address.clone(); // Create 1:1 XYK pool @@ -221,14 +262,14 @@ pub fn test_calc_xyk_balancing_swap() { #[test_matrix( [[Uint128::from(1_000_000u128), Uint128::from(2_000_000u128)]], [[Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)]], - [PairType::Xyk {},PairType::Stable {}, PairType::Custom("concentrated".to_string())], + [PairType::Xyk {},PairType::Stable {}, PairType::Custom("concentrated".to_string()), PairType::Custom("astroport-pair-xyk-sale-tax".to_string())], true )] // Test 2: 1:5 ratio, double amount of asset 2 #[test_matrix( [[Uint128::from(1_000_000u128), Uint128::from(2_000_000u128)]], [[Uint128::from(1_000_000_000_000u128), Uint128::from(5_000_000_000_000u128)]], - [PairType::Xyk {},PairType::Stable {}, PairType::Custom("concentrated".to_string())], + [PairType::Xyk {},PairType::Stable {}, PairType::Custom("concentrated".to_string()), PairType::Custom("astroport-pair-xyk-sale-tax".to_string())], true )] // Test 3: 1:2.9 pool ratio, 1:1 ratio of assets, but a lot of assets compared to pool (high @@ -236,51 +277,51 @@ pub fn test_calc_xyk_balancing_swap() { #[test_matrix( [[Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)]], [[Uint128::from(1_000_000_000_000u128), Uint128::from(2_900_000_000_000u128)]], - [PairType::Xyk {},PairType::Stable {}, PairType::Custom("concentrated".to_string())], + [PairType::Xyk {},PairType::Stable {}, PairType::Custom("concentrated".to_string()), PairType::Custom("astroport-pair-xyk-sale-tax".to_string())], true )] // Test 4: 1:2 pool ratio, 0:1 ratio of assets #[test_matrix( [[Uint128::from(0u128), Uint128::from(1_000_000_000_000u128)]], [[Uint128::from(1_000_000_000_000u128), Uint128::from(2_000_000_000_000u128)]], - [PairType::Xyk {},PairType::Stable {}, PairType::Custom("concentrated".to_string())], + [PairType::Xyk {},PairType::Stable {}, PairType::Custom("concentrated".to_string()), PairType::Custom("astroport-pair-xyk-sale-tax".to_string())], true )] // Test 5: 1:1 pool ratio, 1:1 ratio of assets #[test_matrix( [[Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)]], [[Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)]], - [PairType::Xyk {},PairType::Stable {}, PairType::Custom("concentrated".to_string())], + [PairType::Xyk {},PairType::Stable {}, PairType::Custom("concentrated".to_string()), PairType::Custom("astroport-pair-xyk-sale-tax".to_string())], true )] // Test 6: 1:1 pool ratio, 1:0 ratio of assets #[test_matrix( [[Uint128::from(1_000_000_000u128), Uint128::from(0u128)]], [[Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)]], - [PairType::Xyk {},PairType::Stable {}, PairType::Custom("concentrated".to_string())], + [PairType::Xyk {},PairType::Stable {}, PairType::Custom("concentrated".to_string()), PairType::Custom("astroport-pair-xyk-sale-tax".to_string())], true )] -#[test_case( - [Uint128::from(0u128), Uint128::from(3564u128)], - [Uint128::from(3450765745u128), Uint128::from(12282531965699u128)], - PairType::Xyk {}, - false; - "Test 7: Xyk amount of asset less than one microunit of other asset" +// Test 7: Xyk amount of asset less than one microunit of other asset +#[test_matrix( + [[Uint128::from(0u128), Uint128::from(3564u128)]], + [[Uint128::from(3450765745u128), Uint128::from(12282531965699u128)]], + [PairType::Xyk {}, PairType::Custom("astroport-pair-xyk-sale-tax".to_string())], + false )] // Test 7: Amount of asset would be less than one microunit of other asset if it were xyk #[test_matrix( [[Uint128::from(0u128), Uint128::from(3564u128)]], [[Uint128::from(3450765745u128), Uint128::from(12282531965699u128)]], - [PairType::Stable { }, PairType::Custom("concentrated".to_string())], + [PairType::Stable { }, PairType::Custom("concentrated".to_string()), PairType::Custom("astroport-pair-xyk-sale-tax".to_string())], true )] -#[test_case( - [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], - [Uint128::from(0u128), Uint128::from(0u128)], - PairType::Xyk {}, +// Test 8: Xyk 0:0 pool ratio, should fail with correct error +#[test_matrix( + [[Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)]], + [[Uint128::from(0u128), Uint128::from(0u128)]], + [PairType::Xyk {}, PairType::Custom("astroport-pair-xyk-sale-tax".to_string())], true => panics "No liquidity in pool"; - "Test 8 Xyk: 0:0 pool ratio, should fail with correct error" )] // Test 8: empty pool. Should work for stable and concentrated pools, but not for xyk pools. #[test_matrix( @@ -298,26 +339,12 @@ pub fn test_balancing_provide_liquidity( ) { let app = OsmosisTestApp::default(); let runner = TestRunner::OsmosisTestApp(&app); - let (accs, astroport_code_ids) = &setup(&runner); + let (accs, astroport_contracts) = &setup_astroport(&runner); let admin = &accs[0]; let wasm = Wasm::new(&runner); - // Instantiate Astroport contracts - let astroport_contracts = instantiate_astroport(&runner, admin, astroport_code_ids); - - // Update native coin registry with uluna precision - wasm.execute( - &astroport_contracts.coin_registry.address, - &astroport::native_coin_registry::ExecuteMsg::Add { - native_coins: vec![("uluna".to_string(), 6)], - }, - &[], - admin, - ) - .unwrap(); - let liquidity_helper = - setup_astroport_liquidity_provider_tests(&runner, accs, &astroport_contracts); + setup_astroport_liquidity_provider_tests(&runner, accs, astroport_contracts); let astro_token = astroport_contracts.astro_token.address.clone(); // Create pool @@ -339,6 +366,21 @@ pub fn test_balancing_provide_liquidity( ), PairType::Custom(t) => match t.as_str() { "concentrated" => Some(to_json_binary(&common_pcl_params()).unwrap()), + "astroport-pair-xyk-sale-tax" => Some( + to_json_binary(&SaleTaxInitParams { + tax_config_admin: admin.address(), + track_asset_balances: false, + tax_configs: vec![( + "uluna", + TaxConfig { + tax_rate: Decimal::percent(3), + tax_recipient: admin.address(), + }, + )] + .into(), + }) + .unwrap(), + ), _ => None, }, _ => None, @@ -360,7 +402,7 @@ pub fn test_balancing_provide_liquidity( AssetInfo::native("uluna".to_string()), AssetInfo::cw20(Addr::unchecked(&astro_token)), ], - liquidity_manager: Addr::unchecked(astroport_contracts.liquidity_manager.address), + liquidity_manager: Addr::unchecked(astroport_contracts.liquidity_manager.address.clone()), }; // Increase allowance of astro token for Pair contract From 6fa98aec237187d621c08f8deb869add64f5d82c Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Mon, 11 Mar 2024 14:17:41 +0100 Subject: [PATCH 05/42] wip: Implement support for astroport-pair-xyk-sale-tax --- Cargo.lock | 93 ++++++++++--------- .../astroport-liquidity-helper/Cargo.toml | 3 +- .../src/contract.rs | 35 ++++++- .../astroport-liquidity-helper/src/math.rs | 15 ++- .../tests/astroport_integration_tests.rs | 2 +- .../osmosis-liquidity-helper/src/contract.rs | 2 +- 6 files changed, 98 insertions(+), 52 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0d8f0a8..dfc4e17 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -51,8 +51,8 @@ checksum = "423502406a307052f6877030f48b5fb4e9fb338fc5e7c8ca1064210def52876b" dependencies = [ "astroport 2.9.0", "cosmwasm-std", - "cw-storage-plus 1.1.0", - "cw20 1.1.1", + "cw-storage-plus 1.2.0", + "cw20 1.1.2", "schemars", "serde", ] @@ -66,7 +66,7 @@ dependencies = [ "apollo-cw-asset", "cosmwasm-schema", "cosmwasm-std", - "cw20 1.1.1", + "cw20 1.1.2", "regex", ] @@ -121,14 +121,15 @@ version = "0.3.2" dependencies = [ "apollo-cw-asset", "apollo-utils", + "astroport 3.11.1", "cosmwasm-schema", "cosmwasm-std", "cw-bigint", "cw-dex", "cw-it", - "cw-storage-plus 1.1.0", + "cw-storage-plus 1.2.0", "cw2 1.1.1", - "cw20 1.1.1", + "cw20 1.1.2", "liquidity-helper", "semver", "test-case", @@ -143,7 +144,7 @@ checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.52", ] [[package]] @@ -216,7 +217,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.38", + "syn 2.0.52", "which", ] @@ -444,9 +445,9 @@ dependencies = [ [[package]] name = "cosmwasm-schema" -version = "1.4.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef683a9c1c4eabd6d31515719d0d2cc66952c4c87f7eb192bfc90384517dc34" +checksum = "ac3e3a2136e2a60e8b6582f5dffca5d1a683ed77bf38537d330bc1dfccd69010" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -457,9 +458,9 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.4.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9567025acbb4c0c008178393eb53b3ac3c2e492c25949d3bf415b9cbe80772d8" +checksum = "f5d803bea6bd9ed61bd1ee0b4a2eb09ee20dbb539cc6e0b8795614d20952ebb1" dependencies = [ "proc-macro2", "quote", @@ -562,15 +563,15 @@ dependencies = [ [[package]] name = "cw-asset" -version = "3.0.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e2cf17accdcafe71859a683b6ed3f18311634a769550aacf4829b50151b221" +checksum = "c999a12f8cd8736f6f86e9a4ede5905530cb23cfdef946b9da1c506ad1b70799" dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-address-like", - "cw-storage-plus 1.1.0", - "cw20 1.1.1", + "cw-storage-plus 1.2.0", + "cw20 1.1.2", "thiserror", ] @@ -598,7 +599,7 @@ dependencies = [ "cosmwasm-std", "cw-utils 1.0.2", "cw2 1.1.1", - "cw20 1.1.1", + "cw20 1.1.2", "osmosis-std 0.19.2", "thiserror", ] @@ -639,9 +640,9 @@ dependencies = [ [[package]] name = "cw-storage-plus" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f0e92a069d62067f3472c62e30adedb4cab1754725c0f2a682b3128d2bf3c79" +checksum = "d5ff29294ee99373e2cd5fd21786a3c0ced99a52fec2ca347d565489c61b723c" dependencies = [ "cosmwasm-std", "schemars", @@ -699,7 +700,7 @@ checksum = "9431d14f64f49e41c6ef5561ed11a5391c417d0cb16455dea8cdcb9037a8d197" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-storage-plus 1.1.0", + "cw-storage-plus 1.2.0", "schemars", "serde", "thiserror", @@ -720,9 +721,9 @@ dependencies = [ [[package]] name = "cw20" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786e9da5e937f473cecd2463e81384c1af65d0f6398bbd851be7655487c55492" +checksum = "526e39bb20534e25a1cd0386727f0038f4da294e5e535729ba3ef54055246abd" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -740,7 +741,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-utils 1.0.2", - "cw20 1.1.1", + "cw20 1.1.2", "schemars", "serde", "thiserror", @@ -1320,7 +1321,7 @@ dependencies = [ "apollo-utils", "cosmwasm-schema", "cosmwasm-std", - "cw20 1.1.1", + "cw20 1.1.2", ] [[package]] @@ -1630,7 +1631,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.52", ] [[package]] @@ -1661,7 +1662,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.52", ] [[package]] @@ -1699,7 +1700,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ "proc-macro2", - "syn 2.0.38", + "syn 2.0.52", ] [[package]] @@ -1728,9 +1729,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] @@ -1778,7 +1779,7 @@ dependencies = [ "itertools", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.52", ] [[package]] @@ -1801,9 +1802,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -2188,7 +2189,7 @@ checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.52", ] [[package]] @@ -2221,7 +2222,7 @@ checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.52", ] [[package]] @@ -2383,9 +2384,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.38" +version = "2.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" dependencies = [ "proc-macro2", "quote", @@ -2534,7 +2535,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.52", ] [[package]] @@ -2546,7 +2547,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.52", "test-case-core", ] @@ -2568,22 +2569,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.50" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.52", ] [[package]] @@ -2643,7 +2644,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.52", ] [[package]] @@ -2830,7 +2831,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.52", "wasm-bindgen-shared", ] @@ -2864,7 +2865,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.52", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3096,5 +3097,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.52", ] diff --git a/contracts/astroport-liquidity-helper/Cargo.toml b/contracts/astroport-liquidity-helper/Cargo.toml index 6796462..8db3050 100644 --- a/contracts/astroport-liquidity-helper/Cargo.toml +++ b/contracts/astroport-liquidity-helper/Cargo.toml @@ -39,13 +39,14 @@ cosmwasm-std = { workspace = true } cw-storage-plus = { workspace = true } cw2 = { workspace = true } thiserror = { workspace = true } -apollo-cw-asset = { workspace = true } +apollo-cw-asset = { workspace = true, features = ["astroport"] } cw-dex = { workspace = true, features = ["astroport"] } apollo-utils = { workspace = true } cw20 = { workspace = true } liquidity-helper = { workspace = true } cw-bigint = { workspace = true } semver = { workspace = true } +astroport_v3 = { package = "astroport", version = "3.11.1" } [dev-dependencies] cw-it = { workspace = true, features = ["astroport", "osmosis-test-tube"] } diff --git a/contracts/astroport-liquidity-helper/src/contract.rs b/contracts/astroport-liquidity-helper/src/contract.rs index 28c8a7b..1340ee3 100644 --- a/contracts/astroport-liquidity-helper/src/contract.rs +++ b/contracts/astroport-liquidity-helper/src/contract.rs @@ -1,6 +1,9 @@ -use apollo_cw_asset::{Asset, AssetList}; +use apollo_cw_asset::{Asset, AssetInfo, AssetList}; use apollo_utils::assets::receive_assets; + use apollo_utils::responses::merge_responses; +use astroport_v3::asset::AssetInfo as AstroV3AssetInfo; +use astroport_v3::pair_xyk_sale_tax::{SaleTaxInitParams, TaxConfigs}; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ @@ -9,6 +12,7 @@ use cosmwasm_std::{ }; use cw2::set_contract_version; use cw_dex::astroport::astroport::factory::PairType; +use cw_dex::astroport::astroport::pair::{ConfigResponse, QueryMsg as PairQueryMsg}; use cw_dex::astroport::astroport::querier::query_fee_info; use cw_dex::astroport::AstroportPool; @@ -53,7 +57,7 @@ pub fn execute( recipient, } => { let assets = assets.check(deps.api)?; - let pool: AstroportPool = from_json(&pool)?; + let pool: AstroportPool = from_json(pool)?; execute_balancing_provide_liquidity(deps, env, info, assets, min_out, pool, recipient) } ExecuteMsg::Callback(msg) => { @@ -125,11 +129,38 @@ fn handle_xyk_balancing_provide_liquidity( )?; let fee = fee_info.total_fee_rate; + // Get sale tax if applicable + let tax_configs: Option> = match &pool.pair_type { + PairType::Custom(t) => match t.as_str() { + "astroport-pair-xyk-sale-tax" => { + let config: ConfigResponse = deps + .querier + .query_wasm_smart(&pool.pair_addr, &PairQueryMsg::Config {})?; + let astro_asset_infos: Vec = pool + .pool_assets + .iter() + .map(|x| match x { + AssetInfo::Cw20(addr) => AstroV3AssetInfo::cw20(addr.clone()), + AssetInfo::Native(denom) => AstroV3AssetInfo::native(denom), + }) + .collect(); + let sale_tax_params: SaleTaxInitParams = from_json(config.params.unwrap())?; + let tax_configs = sale_tax_params + .tax_configs + .check(deps.api, &astro_asset_infos)?; + Some(tax_configs) + } + _ => None, + }, + _ => None, + }; + // Calculate amount of tokens to swap let (offer_asset, return_asset) = calc_xyk_balancing_swap( assets_slice, [pool_reserves[0].amount, pool_reserves[1].amount], fee, + tax_configs, )?; // Update balances for liquidity provision assets.add(&return_asset)?; diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index db97a0e..290c1c0 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -1,6 +1,7 @@ //! Module containing implementations of calculations needed for swapping use apollo_cw_asset::Asset; +use astroport_v3::pair_xyk_sale_tax::TaxConfigsChecked; use cosmwasm_std::{Decimal, Decimal256, StdError, StdResult, Uint128, Uint256}; use cw_bigint::BigInt; @@ -54,6 +55,7 @@ pub fn calc_xyk_balancing_swap( assets: [Asset; 2], reserves: [Uint128; 2], fee: Decimal, + tax_configs: Option, ) -> StdResult<(Asset, Asset)> { // Instead of trying to implement our own big decimal, we just use BigInt // and multiply and divide with this number before and after doing @@ -95,6 +97,16 @@ pub fn calc_xyk_balancing_swap( // We know that for this equation, there is only one positive real solution let x = (bigint_sqrt(discriminant)? - b) / (2u128 * a); + let offer_asset_info = &assets[offer_idx].info; + let tax_rate = tax_configs + .map(|tax_configs| { + tax_configs + .get(&offer_asset_info.to_string()) + .map(|tax_config| tax_config.tax_rate) + .unwrap_or(Decimal::zero()) + }) + .unwrap_or(Decimal::zero()); + // Divide by precision to get final result and convert to Uint128 let offer_amount = bigint_to_uint128(x / &precision)?; let offer_asset = Asset { @@ -249,7 +261,8 @@ mod test { println!("Reserves: {reserves:?}"); // Calculate swap - let (swap_asset, return_asset) = calc_xyk_balancing_swap(assets, reserves, fee).unwrap(); + let (swap_asset, return_asset) = + calc_xyk_balancing_swap(assets, reserves, fee, None).unwrap(); println!("Swap: {swap_asset:?}, Return: {return_asset:?}"); diff --git a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs index ad17834..f5f4f5d 100644 --- a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs +++ b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs @@ -238,7 +238,7 @@ pub fn test_calc_xyk_balancing_swap() { ]; let (offer_asset, return_asset) = - calc_xyk_balancing_swap(assets, reserves, total_fee_rate).unwrap(); + calc_xyk_balancing_swap(assets, reserves, total_fee_rate, None).unwrap(); // Simulate swap let simulation_result: SimulationResponse = wasm diff --git a/contracts/osmosis-liquidity-helper/src/contract.rs b/contracts/osmosis-liquidity-helper/src/contract.rs index f25620e..3c0d12b 100644 --- a/contracts/osmosis-liquidity-helper/src/contract.rs +++ b/contracts/osmosis-liquidity-helper/src/contract.rs @@ -43,7 +43,7 @@ pub fn execute( recipient, } => { let assets = assets.check(deps.api)?; - let pool: OsmosisPool = from_json(&pool)?; + let pool: OsmosisPool = from_json(pool)?; execute_balancing_provide_liquidity(deps, env, info, assets, min_out, pool, recipient) } ExecuteMsg::Callback(msg) => { From 1414bad76a4b0f20f96cc4b049ffbd14306ba2c4 Mon Sep 17 00:00:00 2001 From: Pacman Date: Wed, 13 Mar 2024 16:34:34 +0100 Subject: [PATCH 06/42] wip --- .../astroport-liquidity-helper/src/math.rs | 149 +++++++----------- 1 file changed, 60 insertions(+), 89 deletions(-) diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index 290c1c0..33d4681 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -2,11 +2,28 @@ use apollo_cw_asset::Asset; use astroport_v3::pair_xyk_sale_tax::TaxConfigsChecked; -use cosmwasm_std::{Decimal, Decimal256, StdError, StdResult, Uint128, Uint256}; -use cw_bigint::BigInt; +use cosmwasm_std::{Decimal, Decimal256, Int256, StdError, StdResult, Uint128, Uint256}; + +fn mul(a: Int256, b: Decimal256) -> Int256 { + match a.cmp(&Int256::zero()) { + std::cmp::Ordering::Equal => Int256::zero(), + std::cmp::Ordering::Greater => { + let a = Uint256::try_from(a).unwrap(); + let b = a * b; + + Int256::try_from(b).unwrap() + } + std::cmp::Ordering::Less => { + let a = Uint256::try_from(-a).unwrap(); + let b = a * b; + + -Int256::try_from(b).unwrap() + } + } +} /// Returns square root of a BigInt -fn bigint_sqrt(input: BigInt) -> StdResult { +fn int256_sqrt(input: Int256) -> StdResult { if input < 0.into() { return Err(StdError::generic_err( "Cannot calculate square root of negative number", @@ -14,10 +31,10 @@ fn bigint_sqrt(input: BigInt) -> StdResult { } let mut x = input.clone(); - let mut y = (&x + 1u128) / 2u128; + let mut y = (x + Int256::one()) / Int256::from(2u128); while y < x { x = y; - y = (&x + &input / &x) / 2u128; + y = (&x + &input / &x) / Int256::from(2u128); } Ok(x) } @@ -38,12 +55,6 @@ fn constant_product_formula( Ok(return_amount.try_into()?) } -fn bigint_to_uint128(input: BigInt) -> StdResult { - Ok(Uint128::from(TryInto::::try_into(input).map_err( - |_| StdError::generic_err("Cannot convert BigInt to Uint128"), - )?)) -} - /// For a constant product pool, calculates how much of one asset we need to /// swap to the other in order to have the same ratio of assets as the pool, so /// that we can then provide liquidity and get the most amount of LP tokens. @@ -57,11 +68,6 @@ pub fn calc_xyk_balancing_swap( fee: Decimal, tax_configs: Option, ) -> StdResult<(Asset, Asset)> { - // Instead of trying to implement our own big decimal, we just use BigInt - // and multiply and divide with this number before and after doing - // calculations. - let precision: BigInt = BigInt::from(1_000_000_000u128); - // Make sure there is liquidity in the pool if reserves[0].is_zero() || reserves[1].is_zero() { return Err(StdError::generic_err("No liquidity in pool")); @@ -81,22 +87,14 @@ pub fn calc_xyk_balancing_swap( } else { (1, 0) }; - let offer_reserve = BigInt::from(reserves[offer_idx].u128()) * &precision; - let ask_reserve = BigInt::from(reserves[ask_idx].u128()) * &precision; - let offer_balance = BigInt::from(assets[offer_idx].amount.u128()) * &precision; - let ask_balance = BigInt::from(assets[ask_idx].amount.u128()) * &precision; - - let fee_int = (BigInt::from(fee.atomics().u128()) * &precision) / BigInt::from(10u128.pow(18)); - - // Calculate amount to swap by solving quadratic equation - let a = &ask_reserve + &ask_balance; - let b = 2u128 * &offer_reserve * (&ask_reserve + &ask_balance) - - ((&offer_reserve + &offer_balance) * &ask_reserve * &fee_int) / &precision; - let c = &offer_reserve * (&offer_reserve * &ask_balance - &offer_balance * &ask_reserve); - let discriminant = &b * &b - (4u128 * &a * &c); - // We know that for this equation, there is only one positive real solution - let x = (bigint_sqrt(discriminant)? - b) / (2u128 * a); + let offer_reserve = Int256::from(reserves[offer_idx].u128()); + let ask_reserve = Int256::from(reserves[ask_idx].u128()); + let offer_balance = Int256::from(assets[offer_idx].amount.u128()); + let ask_balance = Int256::from(assets[ask_idx].amount.u128()); + + let fee_rate = Decimal256::from(fee); + // Unwrap tax let offer_asset_info = &assets[offer_idx].info; let tax_rate = tax_configs .map(|tax_configs| { @@ -106,9 +104,36 @@ pub fn calc_xyk_balancing_swap( .unwrap_or(Decimal::zero()) }) .unwrap_or(Decimal::zero()); + let tax_rate = Decimal256::from(tax_rate); + + // Solve equation to find amount to swap + let two = Int256::from(2u128); + let four = two * two; + let numerator = mul(offer_reserve * ask_reserve, fee_rate - fee_rate * tax_rate) + + mul((offer_balance + offer_reserve) * ask_reserve, fee_rate) + - two * offer_reserve * (ask_balance + ask_reserve); + println!("numerator: {numerator}"); + let discriminant = (two * &offer_reserve * &ask_balance + - mul(offer_balance * ask_reserve, fee_rate) + + two * mul(offer_reserve * ask_reserve, Decimal256::one() - fee_rate) + + mul(offer_reserve * ask_reserve, fee_rate * tax_rate)) + .pow(2) + - four + * (ask_balance + ask_reserve + mul(ask_reserve, fee_rate * tax_rate - tax_rate)) + * (offer_reserve.pow(2) * ask_balance - offer_balance * offer_reserve * ask_reserve); + println!("discriminant: {discriminant}"); + let denominator = two + * (ask_balance + ask_reserve - mul(ask_reserve, tax_rate) + + mul(ask_reserve, fee_rate * tax_rate)); + + println!("denominator: {denominator}"); + + let x = (numerator + int256_sqrt(discriminant)?) / denominator; + + println!("x: {x}"); // Divide by precision to get final result and convert to Uint128 - let offer_amount = bigint_to_uint128(x / &precision)?; + let offer_amount: Uint128 = x.try_into()?; let offer_asset = Asset { amount: offer_amount, info: assets[offer_idx].info.clone(), @@ -116,8 +141,8 @@ pub fn calc_xyk_balancing_swap( // Calculate return amount from swap let return_amount = constant_product_formula( - bigint_to_uint128(offer_reserve / &precision)?, - bigint_to_uint128(ask_reserve / &precision)?, + offer_reserve.try_into()?, + ask_reserve.try_into()?, offer_amount, fee, )?; @@ -136,7 +161,7 @@ mod test { use cw_bigint::BigInt; use test_case::test_case; - use crate::math::{bigint_sqrt, calc_xyk_balancing_swap}; + use crate::math::calc_xyk_balancing_swap; /// Assert that two Decimals are almost the same (diff smaller than one /// permille) @@ -291,58 +316,4 @@ mod test { ); println!("------------------------------------"); } - - #[test] - fn test_bigint_sqrt() { - // Test the sqrt algorithm - let test_cases = vec![ - (0, 0), - (1, 1), - (2, 1), - (3, 1), - (4, 2), - (28, 5), - (29, 5), - (34, 5), - (36, 6), - (37, 6), - (57, 7), - (58, 7), - (66, 8), - (67, 8), - (69, 8), - (982734928374982u128, 31348603), - (u128::MAX, 18446744073709551615u128), - ]; - for (input, expected) in test_cases { - let input = BigInt::from(input); - let expected = BigInt::from(expected); - let result = bigint_sqrt(input).unwrap(); - assert_eq!(result, expected); - } - - // Some larger than u128::MAX test cases - let test_cases = vec![ - ( - BigInt::from(u128::MAX) * 2, - BigInt::from(26087635650665564424u128), - ), - ( - BigInt::from(u128::MAX) * 4, - BigInt::from(36893488147419103231u128), - ), - ( - BigInt::from(u128::MAX) * 100, - BigInt::from(184467440737095516159u128), - ), - ( - BigInt::from(u128::MAX) * 1000, - BigInt::from(583337266871351588485u128), - ), - ]; - for (input, expected) in test_cases { - let result = bigint_sqrt(input).unwrap(); - assert_eq!(result, expected); - } - } } From 45b221c41059655386b49963b47a4cdddb26c6c9 Mon Sep 17 00:00:00 2001 From: Pacman Date: Wed, 3 Apr 2024 09:54:03 -0700 Subject: [PATCH 07/42] wip: implement BigDecimal --- .../astroport-liquidity-helper/src/math.rs | 415 ++++++++++++++++-- 1 file changed, 390 insertions(+), 25 deletions(-) diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index 33d4681..3778bc3 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -2,41 +2,406 @@ use apollo_cw_asset::Asset; use astroport_v3::pair_xyk_sale_tax::TaxConfigsChecked; -use cosmwasm_std::{Decimal, Decimal256, Int256, StdError, StdResult, Uint128, Uint256}; +use cosmwasm_std::{Decimal, Deps, Int256, StdError, StdResult, Uint128, Uint256}; +use cw_bigint::BigInt; -fn mul(a: Int256, b: Decimal256) -> Int256 { - match a.cmp(&Int256::zero()) { - std::cmp::Ordering::Equal => Int256::zero(), - std::cmp::Ordering::Greater => { - let a = Uint256::try_from(a).unwrap(); - let b = a * b; +use crate::math::big_decimal::{bigint_to_u128, BigDecimal}; - Int256::try_from(b).unwrap() +pub mod big_decimal { + use std::ops::{Add, Deref, Div, Mul, Sub}; + + use cosmwasm_std::{Decimal, Fraction, StdError, StdResult, Uint128}; + use cw_bigint::BigInt; + + pub const BIG_DECIMAL_FRACTIONAL: u128 = 1_000_000_000_000_000_000; + + #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] + pub struct BigDecimal(BigInt); + + impl BigDecimal { + pub fn zero() -> Self { + Self(BigInt::from(0u128)) + } + + pub fn one() -> Self { + Self(BigInt::from(BIG_DECIMAL_FRACTIONAL)) + } + + /// Returns the square root of the BigDecimal. + /// + /// Uses the Newton-Raphson method to approximate the square root. + /// + /// # Panics + /// If the BigDecimal is negative, this function will panic. + pub fn sqrt(&self) -> Self { + if self < &Self::zero() { + panic!("Cannot compute the square root of a negative number."); + } + if self == &Self::zero() { + return Self::zero(); + } + + let mut x = self.clone(); + let mut y = (x.clone() + Self::one()) / BigDecimal::from(2u128); + while y < x { + x = y.clone(); + y = (x.clone() + self.clone() / x.clone()) / BigDecimal::from(2u128); + } + y + } + + pub fn pow(&self, exp: u32) -> Self { + if exp == 0 { + return Self::one(); + } + if exp == 1 { + return self.clone(); + } + + // BigDecimal is a fixed-point number with BIG_DECIMAL_FRACTIONAL decimal places. + // x^y = (numerator / denominator)^y = numerator^y / denominator^y + // = (numerator^y / denominator^(y-1)) / denominator + // which means we represent the new number as new_numerator = numerator^y / denominator^(y-1), + // and new_denominator = denominator. + let value: BigInt = self.0.pow(exp) / BIG_DECIMAL_FRACTIONAL.pow(exp - 1); + + Self(value) } - std::cmp::Ordering::Less => { - let a = Uint256::try_from(-a).unwrap(); - let b = a * b; - -Int256::try_from(b).unwrap() + pub fn floor(&self) -> BigInt { + self.0.clone() / BIG_DECIMAL_FRACTIONAL } } -} -/// Returns square root of a BigInt -fn int256_sqrt(input: Int256) -> StdResult { - if input < 0.into() { - return Err(StdError::generic_err( - "Cannot calculate square root of negative number", - )); + impl Mul for BigDecimal { + type Output = Self; + + fn mul(self, rhs: Self) -> Self::Output { + Self(self.0 * rhs.0 / BIG_DECIMAL_FRACTIONAL) + } + } + + impl<'a, 'b> Mul<&'b BigDecimal> for &'a BigDecimal { + type Output = BigDecimal; + + fn mul(self, rhs: &'b BigDecimal) -> Self::Output { + BigDecimal(self.0.clone() * rhs.0.clone() / BIG_DECIMAL_FRACTIONAL) + } + } + + impl<'a> Mul for &'a BigDecimal { + type Output = BigDecimal; + + fn mul(self, rhs: BigDecimal) -> Self::Output { + BigDecimal(self.0.clone() * rhs.0 / BIG_DECIMAL_FRACTIONAL) + } + } + + impl<'a> Mul<&'a BigDecimal> for BigDecimal { + type Output = BigDecimal; + + fn mul(self, rhs: &'a BigDecimal) -> Self::Output { + BigDecimal(self.0 * rhs.0.clone() / BIG_DECIMAL_FRACTIONAL) + } } - let mut x = input.clone(); - let mut y = (x + Int256::one()) / Int256::from(2u128); - while y < x { - x = y; - y = (&x + &input / &x) / Int256::from(2u128); + impl Mul for BigDecimal { + type Output = Self; + + fn mul(self, rhs: BigInt) -> Self::Output { + Self(self.0 * rhs) + } + } + + impl<'a> Mul<&'a BigInt> for BigDecimal { + type Output = Self; + + fn mul(self, rhs: &'a BigInt) -> Self::Output { + Self(self.0 * rhs.clone()) + } } - Ok(x) + + impl<'a> Mul for &'a BigDecimal { + type Output = BigDecimal; + + fn mul(self, rhs: BigInt) -> Self::Output { + BigDecimal(self.0.clone() * rhs) + } + } + + impl<'a, 'b> Mul<&'b BigInt> for &'a BigDecimal { + type Output = BigDecimal; + + fn mul(self, rhs: &'b BigInt) -> Self::Output { + BigDecimal(self.0.clone() * rhs.clone()) + } + } + + impl Mul for BigInt { + type Output = BigDecimal; + + fn mul(self, rhs: BigDecimal) -> Self::Output { + BigDecimal(self * rhs.0) + } + } + + impl<'a> Mul<&'a BigDecimal> for BigInt { + type Output = BigDecimal; + + fn mul(self, rhs: &'a BigDecimal) -> Self::Output { + BigDecimal(self * rhs.0.clone()) + } + } + + impl<'a> Mul for &'a BigInt { + type Output = BigDecimal; + + fn mul(self, rhs: BigDecimal) -> Self::Output { + BigDecimal(self.clone() * rhs.0) + } + } + + impl<'a, 'b> Mul<&'a BigDecimal> for &'b BigInt { + type Output = BigDecimal; + + fn mul(self, rhs: &'a BigDecimal) -> Self::Output { + BigDecimal(self.clone() * rhs.0.clone()) + } + } + + impl Add for BigDecimal { + type Output = Self; + + fn add(self, rhs: Self) -> Self::Output { + Self(self.0 + rhs.0) + } + } + + impl<'a, 'b> Add<&'b BigDecimal> for &'a BigDecimal { + type Output = BigDecimal; + + fn add(self, rhs: &'b BigDecimal) -> Self::Output { + BigDecimal(self.0.clone() + rhs.0.clone()) + } + } + + impl<'a> Add for &'a BigDecimal { + type Output = BigDecimal; + + fn add(self, rhs: BigDecimal) -> Self::Output { + BigDecimal(self.0.clone() + rhs.0) + } + } + + impl<'a> Add<&'a BigDecimal> for BigDecimal { + type Output = BigDecimal; + + fn add(self, rhs: &'a BigDecimal) -> Self::Output { + BigDecimal(self.0 + rhs.0.clone()) + } + } + + impl Add for BigDecimal { + type Output = Self; + + fn add(self, rhs: BigInt) -> Self::Output { + Self(self.0 + rhs * BIG_DECIMAL_FRACTIONAL) + } + } + + impl<'a, 'b> Add<&'b BigInt> for &'a BigDecimal { + type Output = BigDecimal; + + fn add(self, rhs: &'b BigInt) -> Self::Output { + BigDecimal(self.0.clone() + rhs.clone() * BIG_DECIMAL_FRACTIONAL) + } + } + + impl Add for BigInt { + type Output = BigDecimal; + + fn add(self, rhs: BigDecimal) -> Self::Output { + rhs + self + } + } + + impl<'a> Add<&'a BigDecimal> for BigInt { + type Output = BigDecimal; + + fn add(self, rhs: &'a BigDecimal) -> Self::Output { + rhs + self + } + } + + impl<'a> Add for &'a BigDecimal { + type Output = BigDecimal; + + fn add(self, rhs: BigInt) -> Self::Output { + self.clone() + rhs + } + } + + impl<'a, 'b> Add<&'a BigDecimal> for &'b BigInt { + type Output = BigDecimal; + + fn add(self, rhs: &'a BigDecimal) -> Self::Output { + rhs + self.clone() + } + } + + impl Sub for BigDecimal { + type Output = Self; + + fn sub(self, rhs: Self) -> Self::Output { + Self(self.0 - rhs.0) + } + } + + impl<'a, 'b> Sub<&'b BigDecimal> for &'a BigDecimal { + type Output = BigDecimal; + + fn sub(self, rhs: &'b BigDecimal) -> Self::Output { + BigDecimal(self.0.clone() - rhs.0.clone()) + } + } + + impl<'a> Sub for &'a BigDecimal { + type Output = BigDecimal; + + fn sub(self, rhs: BigDecimal) -> Self::Output { + BigDecimal(self.0.clone() - rhs.0) + } + } + + impl<'a> Sub<&'a BigDecimal> for BigDecimal { + type Output = BigDecimal; + + fn sub(self, rhs: &'a BigDecimal) -> Self::Output { + BigDecimal(self.0 - rhs.0.clone()) + } + } + + impl Sub for BigDecimal { + type Output = Self; + + fn sub(self, rhs: BigInt) -> Self::Output { + Self(self.0 - rhs * BIG_DECIMAL_FRACTIONAL) + } + } + + impl<'a, 'b> Sub<&'a BigInt> for &'b BigDecimal { + type Output = BigDecimal; + + fn sub(self, rhs: &'a BigInt) -> Self::Output { + BigDecimal(self.0.clone() - rhs.clone() * BIG_DECIMAL_FRACTIONAL) + } + } + + impl Sub for BigInt { + type Output = BigDecimal; + + fn sub(self, rhs: BigDecimal) -> Self::Output { + BigDecimal(self * BIG_DECIMAL_FRACTIONAL - rhs.0) + } + } + + impl<'a, 'b> Sub<&'a BigDecimal> for &'b BigInt { + type Output = BigDecimal; + + fn sub(self, rhs: &'a BigDecimal) -> Self::Output { + BigDecimal(self.clone() * BIG_DECIMAL_FRACTIONAL - rhs.0.clone()) + } + } + + impl Div for BigDecimal { + type Output = Self; + + fn div(self, rhs: Self) -> Self::Output { + Self(self.0 * BIG_DECIMAL_FRACTIONAL / rhs.0) + } + } + + impl<'a, 'b> Div<&'b BigDecimal> for &'a BigDecimal { + type Output = BigDecimal; + + fn div(self, rhs: &'b BigDecimal) -> Self::Output { + BigDecimal(self.0.clone() * BIG_DECIMAL_FRACTIONAL / rhs.0.clone()) + } + } + + impl<'a> Div for &'a BigDecimal { + type Output = BigDecimal; + + fn div(self, rhs: BigDecimal) -> Self::Output { + BigDecimal(self.0.clone() * BIG_DECIMAL_FRACTIONAL / rhs.0) + } + } + + impl<'a> Div<&'a BigDecimal> for BigDecimal { + type Output = BigDecimal; + + fn div(self, rhs: &'a BigDecimal) -> Self::Output { + BigDecimal(self.0 * BIG_DECIMAL_FRACTIONAL / rhs.0.clone()) + } + } + + impl From for BigDecimal { + fn from(value: BigInt) -> Self { + Self(value * BIG_DECIMAL_FRACTIONAL) + } + } + + impl From for BigDecimal { + fn from(value: u128) -> Self { + Self(BigInt::from(value) * BIG_DECIMAL_FRACTIONAL) + } + } + + impl From for BigDecimal { + fn from(value: Decimal) -> Self { + let value = + BigInt::from(value.numerator().u128()) * BigInt::from(value.denominator().u128()); + Self(value / BIG_DECIMAL_FRACTIONAL) + } + } + + impl TryFrom for Decimal { + type Error = StdError; + + fn try_from(value: BigDecimal) -> Result { + let numerator: Uint128 = bigint_to_u128(&value.0)?.into(); + Ok(Decimal::from_ratio(numerator, BIG_DECIMAL_FRACTIONAL)) + } + } + + pub fn bigint_to_u128(big_int: &BigInt) -> StdResult { + let (sign, bytes) = big_int.to_bytes_be(); + + if sign == cw_bigint::Sign::Minus { + return Err(StdError::generic_err( + "Cannot convert a negative BigInt number to u128", + )); + } + + if bytes.len() > 16 { + return Err(StdError::generic_err( + "Attempting to convert BigInt to u128 with overflow", + )); + } + + // Pad with zeros if length is less than 16 + let num_of_zero_bytes = 16 - bytes.len(); + let mut padded_bytes = vec![0u8; num_of_zero_bytes]; + padded_bytes.extend_from_slice(&bytes); + + Ok(u128::from_be_bytes( + padded_bytes + .as_slice() + .try_into() + .map_err(|e| StdError::generic_err(format!("Failed to convert to slice: {e}")))?, + )) + } + } /// Calculate how much will be returned from a swap in a constant product pool From 658adb556861608555200ee9ff39a73cf8a33a9a Mon Sep 17 00:00:00 2001 From: Pacman Date: Wed, 3 Apr 2024 09:54:28 -0700 Subject: [PATCH 08/42] test: add tests for bigint_to_u128 --- .../astroport-liquidity-helper/src/math.rs | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index 3778bc3..32a65bf 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -402,6 +402,34 @@ pub mod big_decimal { )) } + #[cfg(test)] + mod tests { + use super::bigint_to_u128; + use cosmwasm_std::{StdError, StdResult}; + use cw_bigint::BigInt; + use test_case::test_case; + + #[test_case(0u128, 0u128 => Ok(0u128); "zero")] + #[test_case(1u128, 0u128 => Ok(1u128); "one")] + #[test_case(u128::MAX, 0u128 => Ok(u128::MAX); "u128::MAX")] + #[test_case(u128::MAX, 1u128 => Err(StdError::generic_err("Attempting to convert BigInt to u128 with overflow")); "u128::MAX + 1")] + fn test_bigint_to_u128(value1: u128, value2: u128) -> StdResult { + let big_int = BigInt::from(value1) + BigInt::from(value2); + bigint_to_u128(&big_int) + } + + #[test] + fn test_bigint_to_u128_negative() { + let big_int = BigInt::from(-1); + let result = bigint_to_u128(&big_int); + assert_eq!( + result, + Err(StdError::generic_err( + "Cannot convert a negative BigInt number to u128" + )) + ); + } + } } /// Calculate how much will be returned from a swap in a constant product pool From 3333cf2502f24c51a661d08addc6c9ab1039758b Mon Sep 17 00:00:00 2001 From: Pacman Date: Wed, 3 Apr 2024 11:25:51 -0700 Subject: [PATCH 09/42] test: add UTs for BigDecimal addition --- contracts/astroport-liquidity-helper/src/math.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index 32a65bf..3ace6fd 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -429,6 +429,21 @@ pub mod big_decimal { )) ); } + + #[test_case(0u128, 0u128, 0u128; "zero plus zero")] + #[test_case(1u128, 0u128, 1u128; "one plus zero")] + #[test_case(0u128, 1u128, 1u128; "zero plus one")] + #[test_case(1u128, 1u128, 2u128; "one plus one")] + #[test_case(12346u128, 45678u128, 58024u128; "12346 plus 45678")] + fn test_bigdecimal_add_bigdecimal(a: u128, b: u128, expected: u128) { + let a = BigDecimal::new(a.into()); + let b = BigDecimal::new(b.into()); + let expected = BigDecimal::new(expected.into()); + assert_eq!(&a + &b, expected); + assert_eq!(&a + b.clone(), expected); + assert_eq!(a.clone() + &b, expected); + assert_eq!(a + b, expected); + } } } From a2f6c04fd8b729429136e0afb6e9db6da8b89fc7 Mon Sep 17 00:00:00 2001 From: Pacman Date: Wed, 3 Apr 2024 11:26:38 -0700 Subject: [PATCH 10/42] test: add tests for BigDecimal subtraction --- contracts/astroport-liquidity-helper/src/math.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index 3ace6fd..735274c 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -444,6 +444,21 @@ pub mod big_decimal { assert_eq!(a.clone() + &b, expected); assert_eq!(a + b, expected); } + + #[test_case(0, 0, 0; "zero minus zero")] + #[test_case(1, 0, 1; "one minus zero")] + #[test_case(0, 1, -1; "zero minus one")] + #[test_case(1, 1, 0; "one minus one")] + #[test_case(12346, 45678, -33332; "12346 minus 45678")] + fn test_bigdecimal_sub_bigdecimal(a: i128, b: i128, expected: i128) { + let a = BigDecimal::new(a.into()); + let b = BigDecimal::new(b.into()); + let expected = BigDecimal::new(expected.into()); + assert_eq!(&a - &b, expected); + assert_eq!(&a - b.clone(), expected); + assert_eq!(a.clone() - &b, expected); + assert_eq!(a - b, expected); + } } } From b052f9b229f6a35914e43f03909d6088c71ed072 Mon Sep 17 00:00:00 2001 From: Pacman Date: Wed, 3 Apr 2024 13:12:45 -0700 Subject: [PATCH 11/42] test: more test cases for add and sub --- .../astroport-liquidity-helper/src/math.rs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index 735274c..55dd4ff 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -431,10 +431,10 @@ pub mod big_decimal { } #[test_case(0u128, 0u128, 0u128; "zero plus zero")] - #[test_case(1u128, 0u128, 1u128; "one plus zero")] - #[test_case(0u128, 1u128, 1u128; "zero plus one")] - #[test_case(1u128, 1u128, 2u128; "one plus one")] - #[test_case(12346u128, 45678u128, 58024u128; "12346 plus 45678")] + #[test_case(BIG_DECIMAL_FRACTIONAL, 0u128, BIG_DECIMAL_FRACTIONAL; "one plus zero")] + #[test_case(0u128, BIG_DECIMAL_FRACTIONAL, BIG_DECIMAL_FRACTIONAL; "zero plus one")] + #[test_case(BIG_DECIMAL_FRACTIONAL, BIG_DECIMAL_FRACTIONAL, 2 * BIG_DECIMAL_FRACTIONAL; "one plus one")] + #[test_case(12346u128, 45678u128, 58024u128; "0.000000000000012346 plus 0.000000000000045678")] fn test_bigdecimal_add_bigdecimal(a: u128, b: u128, expected: u128) { let a = BigDecimal::new(a.into()); let b = BigDecimal::new(b.into()); @@ -446,10 +446,12 @@ pub mod big_decimal { } #[test_case(0, 0, 0; "zero minus zero")] - #[test_case(1, 0, 1; "one minus zero")] - #[test_case(0, 1, -1; "zero minus one")] - #[test_case(1, 1, 0; "one minus one")] - #[test_case(12346, 45678, -33332; "12346 minus 45678")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128, 0, BIG_DECIMAL_FRACTIONAL as i128; "one minus zero")] + #[test_case(0, BIG_DECIMAL_FRACTIONAL as i128, -(BIG_DECIMAL_FRACTIONAL as i128); "zero minus one")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128, BIG_DECIMAL_FRACTIONAL as i128, 0; "one minus one")] + #[test_case(1, 0, 1; "10^-18 minus zero")] + #[test_case(0, 1, -1; "zero minus 10^-18")] + #[test_case(1, 1, 0; "10^-18 minus 10^-18")] fn test_bigdecimal_sub_bigdecimal(a: i128, b: i128, expected: i128) { let a = BigDecimal::new(a.into()); let b = BigDecimal::new(b.into()); From 83375a3b202ac84b39f230ac86dde7f5cf02be8f Mon Sep 17 00:00:00 2001 From: Pacman Date: Wed, 3 Apr 2024 13:13:05 -0700 Subject: [PATCH 12/42] test: tests for BigDecimal mul --- .../astroport-liquidity-helper/src/math.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index 55dd4ff..5459ce7 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -461,6 +461,23 @@ pub mod big_decimal { assert_eq!(a.clone() - &b, expected); assert_eq!(a - b, expected); } + + #[test_case(0, 0, 0; "zero times zero")] + #[test_case(BIG_DECIMAL_FRACTIONAL, 0, 0; "one times zero")] + #[test_case(0, BIG_DECIMAL_FRACTIONAL, 0; "zero times one")] + #[test_case(BIG_DECIMAL_FRACTIONAL, BIG_DECIMAL_FRACTIONAL, BIG_DECIMAL_FRACTIONAL; "one times one")] + #[test_case(1_000_000_000, 1_000_000_000, 1; "10^9 times 10^9")] + #[test_case(BIG_DECIMAL_FRACTIONAL, BIG_DECIMAL_FRACTIONAL / 2, BIG_DECIMAL_FRACTIONAL / 2; "one times 0.5")] + fn test_bigdecimal_mul_bigdecimal(a: u128, b: u128, expected: u128) { + let a = BigDecimal::new(a.into()); + let b = BigDecimal::new(b.into()); + let expected = BigDecimal::new(expected.into()); + println!("{:?}, {:?}", &a * &b, expected); + assert_eq!(&a * &b, expected); + assert_eq!(&a * b.clone(), expected); + assert_eq!(a.clone() * &b, expected); + assert_eq!(a * b, expected); + } } } From 56ec972b6b8a1f0916e5c3591895ed0be5ca8dc7 Mon Sep 17 00:00:00 2001 From: Pacman Date: Wed, 3 Apr 2024 13:13:30 -0700 Subject: [PATCH 13/42] test: tests for BigDecimal div --- contracts/astroport-liquidity-helper/src/math.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index 5459ce7..2633fb1 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -478,6 +478,22 @@ pub mod big_decimal { assert_eq!(a.clone() * &b, expected); assert_eq!(a * b, expected); } + + #[test_case(0, 1, 0; "zero over 10^-18")] + #[test_case(1, 1, BIG_DECIMAL_FRACTIONAL as i128; "10^-18 over 10^-18")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128, 2 * BIG_DECIMAL_FRACTIONAL as i128, BIG_DECIMAL_FRACTIONAL as i128 / 2 ; "1 over 2")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128, 3 * BIG_DECIMAL_FRACTIONAL as i128, BIG_DECIMAL_FRACTIONAL as i128 / 3 ; "1 over 3")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128, BIG_DECIMAL_FRACTIONAL as i128, BIG_DECIMAL_FRACTIONAL as i128 ; "1 over 1")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128, -(BIG_DECIMAL_FRACTIONAL as i128), -(BIG_DECIMAL_FRACTIONAL as i128) ; "1 over neg 1")] + fn test_bigdecimal_div_bigdecimal(a: i128, b: i128, expected: i128) { + let a = BigDecimal::new(a.into()); + let b = BigDecimal::new(b.into()); + let expected = BigDecimal::new(expected.into()); + assert_eq!(&a / &b, expected); + assert_eq!(&a / b.clone(), expected); + assert_eq!(a.clone() / &b, expected); + assert_eq!(a / b, expected); + } } } From ce8f00517bd799938835a8bab0904ae8f919da8a Mon Sep 17 00:00:00 2001 From: Pacman Date: Wed, 3 Apr 2024 13:13:46 -0700 Subject: [PATCH 14/42] test: tests for bigdecimal sqrt --- contracts/astroport-liquidity-helper/src/math.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index 2633fb1..50d01cb 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -494,6 +494,15 @@ pub mod big_decimal { assert_eq!(a.clone() / &b, expected); assert_eq!(a / b, expected); } + + #[test_case(0i128 => 0 ; "zero")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128 => BIG_DECIMAL_FRACTIONAL ; "one")] + #[test_case(100 * BIG_DECIMAL_FRACTIONAL as i128 => 10 * BIG_DECIMAL_FRACTIONAL ; "one hundred")] + #[test_case(2 * BIG_DECIMAL_FRACTIONAL as i128 => 1414213562373095145u128 ; "two")] + #[test_case(-(BIG_DECIMAL_FRACTIONAL as i128) => panics "Cannot compute the square root of a negative number." ; "negative one")] + fn test_bigdecimal_sqrt(val: i128) -> u128 { + bigint_to_u128(&BigDecimal::new(val.into()).sqrt().atomics()).unwrap() + } } } From 74d1f0e47eabb32fe8c6ebf1323cb5224a4874d7 Mon Sep 17 00:00:00 2001 From: Pacman Date: Wed, 3 Apr 2024 13:14:38 -0700 Subject: [PATCH 15/42] test: comment out old tests --- .../astroport-liquidity-helper/src/math.rs | 325 +++++++++--------- 1 file changed, 162 insertions(+), 163 deletions(-) diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index 50d01cb..fe6eed1 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -621,166 +621,165 @@ pub fn calc_xyk_balancing_swap( Ok((offer_asset, return_asset)) } -#[cfg(test)] -mod test { - use apollo_cw_asset::{Asset, AssetInfo}; - use cosmwasm_std::{Decimal, Uint128}; - use cw_bigint::BigInt; - use test_case::test_case; - - use crate::math::calc_xyk_balancing_swap; - - /// Assert that two Decimals are almost the same (diff smaller than one - /// permille) - fn assert_decimal_almost_eq(a: Decimal, b: Decimal) { - let diff = if a > b { (a - b) / a } else { (b - a) / b }; - if diff > Decimal::permille(1) { - println!("Failed assert decimal almost eq for a: {a}, b: {b}. diff: {diff}"); - panic!(); - } - } - - // Assert that the ratio of the users assets is the same as the pool after the - // swap - fn assert_asset_ratios_same_after_swap( - offer_reserve: Uint128, - ask_reserve: Uint128, - offer_balance: Uint128, - ask_balance: Uint128, - offer_amount: Uint128, - return_amount: Uint128, - ) { - let asset_ratio_after_swap = - Decimal::from_ratio(ask_balance + return_amount, offer_balance - offer_amount); - let reserve_ratio_after_swap = - Decimal::from_ratio(ask_reserve - return_amount, offer_reserve + offer_amount); - println!( - "asset_ratio_after_swap: {asset_ratio_after_swap}, reserve_ratio_after_swap: {reserve_ratio_after_swap}" - ); - assert_decimal_almost_eq(asset_ratio_after_swap, reserve_ratio_after_swap); - } - - #[test_case( - [Uint128::from(1_000_000u128), Uint128::from(2_000_000u128)], - [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], - true, - 1; - "Test 1: 1:1 ratio, double amount of asset 2" - )] - #[test_case( - [Uint128::from(1_000_000u128), Uint128::from(2_000_000u128)], - [Uint128::from(1_000_000_000_000u128), Uint128::from(5_000_000_000_000u128)], - true, - 0; - "Test 2: 1:5 ratio, double amount of asset 2" - )] - #[test_case( - [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], - [Uint128::from(1_000_000_000_000u128), Uint128::from(3_000_000_000_000u128)], - true, - 0; - "Test 3: 1:3 pool ratio, 1:1 ratio of assets, but a lot of assets compared to pool (high slipage)" - )] - #[test_case( - [Uint128::from(0u128), Uint128::from(1_000_000_000_000u128)], - [Uint128::from(1_000_000_000_000u128), Uint128::from(2_000_000_000_000u128)], - true, - 1; - "Test 4: 1:2 pool ratio, 0:1 ratio of assets" - )] - #[test_case( - [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], - [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], - false, - 1; - "Test 5: 1:1 pool ratio, 1:1 ratio of assets" - )] - #[test_case( - [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], - [Uint128::from(1_000_000_000_000u128), Uint128::from(0u128)], - false, - 0 - => panics "No liquidity in pool"; - "Test 6: 1:0 pool ratio, should fail with correct error" - )] - #[test_case( - [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], - [Uint128::from(0u128), Uint128::from(1_000_000_000_000u128)], - false, - 0 - => panics "No liquidity in pool"; - "Test 7: 0:1 pool ratio, should fail with correct error" - )] - #[test_case( - [Uint128::from(1_000_000_000_000u128), Uint128::from(0u128)], - [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], - true, - 0; - "Test 8: 1:1 pool ratio, 1:0 ratio of assets" - )] - #[test_case( - [Uint128::from(0u128), Uint128::from(3564u128)], - [Uint128::from(3450765745u128), Uint128::from(12282531965699u128)], - true, - 1; - "Test 9: Amount of asset less than one microunit of other asset" - )] - fn test_calc_xyk_balancing_swap( - assets: [Uint128; 2], - reserves: [Uint128; 2], - should_swap: bool, - offer_asset_idx: usize, - ) { - let assets = [ - Asset { - amount: assets[0], - info: AssetInfo::native("uatom".to_string()), - }, - Asset { - amount: assets[1], - info: AssetInfo::native("uosmo".to_string()), - }, - ]; - let offer_asset = assets[offer_asset_idx].clone(); - let ask_asset = assets[1 - offer_asset_idx].clone(); - let offer_reserve = reserves[offer_asset_idx]; - let ask_reserve = reserves[1 - offer_asset_idx]; - - // Same fee for all test cases - let fee = Decimal::permille(3); - - println!("Assets: {assets:?}"); - println!("Reserves: {reserves:?}"); - - // Calculate swap - let (swap_asset, return_asset) = - calc_xyk_balancing_swap(assets, reserves, fee, None).unwrap(); - - println!("Swap: {swap_asset:?}, Return: {return_asset:?}"); - - // If ratios are already almost the same, no swap should happen - if !should_swap { - assert_eq!(swap_asset.amount, Uint128::zero()); - } - - // Assert that the correct asset is being offered - assert_eq!(swap_asset.info, offer_asset.info); - - // If the amount returned is zero because the swapped amount is too small - // then the following assert will fail, so we just return here - if return_asset.amount == Uint128::zero() { - return; - } - - // Assert that the asset ratio and the pool ratio are the same after the swap - assert_asset_ratios_same_after_swap( - offer_reserve, - ask_reserve, - offer_asset.amount, - ask_asset.amount, - swap_asset.amount, - return_asset.amount, - ); - println!("------------------------------------"); - } -} +// #[cfg(test)] +// mod test { +// use apollo_cw_asset::{Asset, AssetInfo}; +// use cosmwasm_std::{testing::mock_dependencies, Decimal, Uint128}; +// use test_case::test_case; + +// use crate::math::calc_xyk_balancing_swap; + +// /// Assert that two Decimals are almost the same (diff smaller than one +// /// permille) +// fn assert_decimal_almost_eq(a: Decimal, b: Decimal) { +// let diff = if a > b { (a - b) / a } else { (b - a) / b }; +// let max_allowed_diff = Decimal::permille(2); +// if diff > max_allowed_diff { +// panic!("Failed assert decimal almost eq for a: {a}, b: {b}. diff: {diff}, max allowed: {max_allowed_diff}"); +// } +// } + +// // Assert that the ratio of the users assets is the same as the pool after the +// // swap +// fn assert_asset_ratios_same_after_swap( +// offer_reserve: Uint128, +// ask_reserve: Uint128, +// offer_balance: Uint128, +// ask_balance: Uint128, +// offer_amount: Uint128, +// return_amount: Uint128, +// ) { +// let asset_ratio_after_swap = +// Decimal::from_ratio(ask_balance + return_amount, offer_balance - offer_amount); +// let reserve_ratio_after_swap = +// Decimal::from_ratio(ask_reserve - return_amount, offer_reserve + offer_amount); +// println!( +// "asset_ratio_after_swap: {asset_ratio_after_swap}, reserve_ratio_after_swap: {reserve_ratio_after_swap}" +// ); +// assert_decimal_almost_eq(asset_ratio_after_swap, reserve_ratio_after_swap); +// } + +// #[test_case( +// [Uint128::from(1_000_000u128), Uint128::from(2_000_000u128)], +// [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], +// true, +// 1; +// "Test 1: 1:1 ratio, double amount of asset 2" +// )] +// #[test_case( +// [Uint128::from(1_000_000u128), Uint128::from(2_000_000u128)], +// [Uint128::from(1_000_000_000_000u128), Uint128::from(5_000_000_000_000u128)], +// true, +// 0; +// "Test 2: 1:5 ratio, double amount of asset 2" +// )] +// #[test_case( +// [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], +// [Uint128::from(1_000_000_000_000u128), Uint128::from(3_000_000_000_000u128)], +// true, +// 0; +// "Test 3: 1:3 pool ratio, 1:1 ratio of assets, but a lot of assets compared to pool (high slipage)" +// )] +// #[test_case( +// [Uint128::from(0u128), Uint128::from(1_000_000_000_000u128)], +// [Uint128::from(1_000_000_000_000u128), Uint128::from(2_000_000_000_000u128)], +// true, +// 1; +// "Test 4: 1:2 pool ratio, 0:1 ratio of assets" +// )] +// #[test_case( +// [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], +// [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], +// false, +// 1; +// "Test 5: 1:1 pool ratio, 1:1 ratio of assets" +// )] +// #[test_case( +// [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], +// [Uint128::from(1_000_000_000_000u128), Uint128::from(0u128)], +// false, +// 0 +// => panics "No liquidity in pool"; +// "Test 6: 1:0 pool ratio, should fail with correct error" +// )] +// #[test_case( +// [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], +// [Uint128::from(0u128), Uint128::from(1_000_000_000_000u128)], +// false, +// 0 +// => panics "No liquidity in pool"; +// "Test 7: 0:1 pool ratio, should fail with correct error" +// )] +// #[test_case( +// [Uint128::from(1_000_000_000_000u128), Uint128::from(0u128)], +// [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], +// true, +// 0; +// "Test 8: 1:1 pool ratio, 1:0 ratio of assets" +// )] +// #[test_case( +// [Uint128::from(0u128), Uint128::from(3564u128)], +// [Uint128::from(3450765745u128), Uint128::from(12282531965699u128)], +// true, +// 1; +// "Test 9: Amount of asset less than one microunit of other asset" +// )] +// fn test_calc_xyk_balancing_swap( +// assets: [Uint128; 2], +// reserves: [Uint128; 2], +// should_swap: bool, +// offer_asset_idx: usize, +// ) { +// let assets = [ +// Asset { +// amount: assets[0], +// info: AssetInfo::native("uatom".to_string()), +// }, +// Asset { +// amount: assets[1], +// info: AssetInfo::native("uosmo".to_string()), +// }, +// ]; +// let offer_asset = assets[offer_asset_idx].clone(); +// let ask_asset = assets[1 - offer_asset_idx].clone(); +// let offer_reserve = reserves[offer_asset_idx]; +// let ask_reserve = reserves[1 - offer_asset_idx]; + +// // Same fee for all test cases +// let fee = Decimal::permille(3); + +// println!("Assets: {assets:?}"); +// println!("Reserves: {reserves:?}"); + +// // Calculate swap +// let (swap_asset, return_asset) = +// calc_xyk_balancing_swap(mock_dependencies(), assets, reserves, fee, None).unwrap(); + +// println!("Swap: {swap_asset:?}, Return: {return_asset:?}"); + +// // If ratios are already almost the same, no swap should happen +// if !should_swap { +// assert_eq!(swap_asset.amount, Uint128::zero()); +// } + +// // Assert that the correct asset is being offered +// assert_eq!(swap_asset.info, offer_asset.info); + +// // If the amount returned is zero because the swapped amount is too small +// // then the following assert will fail, so we just return here +// if return_asset.amount == Uint128::zero() { +// return; +// } + +// // Assert that the asset ratio and the pool ratio are the same after the swap +// assert_asset_ratios_same_after_swap( +// offer_reserve, +// ask_reserve, +// offer_asset.amount, +// ask_asset.amount, +// swap_asset.amount, +// return_asset.amount, +// ); +// println!("------------------------------------"); +// } +// } From cc64a8f1862ec1ed6c3ec41da974f1f9c1268417 Mon Sep 17 00:00:00 2001 From: Pacman Date: Wed, 3 Apr 2024 13:15:55 -0700 Subject: [PATCH 16/42] wip: new math --- Cargo.lock | 1359 ++++++++++++----- Cargo.toml | 1 + .../astroport-liquidity-helper/Cargo.toml | 8 +- .../src/contract.rs | 53 +- .../astroport-liquidity-helper/src/math.rs | 161 +- .../astroport-liquidity-helper/src/msg.rs | 2 +- .../tests/astroport_integration_tests.rs | 436 +++--- 7 files changed, 1436 insertions(+), 584 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dfc4e17..84b0489 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ "getrandom", "once_cell", @@ -30,18 +30,18 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "anyhow" -version = "1.0.75" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" [[package]] name = "apollo-cw-asset" @@ -49,7 +49,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "423502406a307052f6877030f48b5fb4e9fb338fc5e7c8ca1064210def52876b" dependencies = [ - "astroport 2.9.0", + "astroport 2.9.5", "cosmwasm-std", "cw-storage-plus 1.2.0", "cw20 1.1.2", @@ -57,6 +57,27 @@ dependencies = [ "serde", ] +[[package]] +name = "apollo-cw-multi-test" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79f4204575175473a9b7fff8083596d09e6edb07469d2a4176846b353b2d1ef" +dependencies = [ + "anyhow", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "derivative", + "itertools 0.10.5", + "k256 0.11.6", + "osmosis-std 0.22.0", + "prost 0.9.0", + "regex", + "schemars", + "serde", + "thiserror", +] + [[package]] name = "apollo-utils" version = "0.1.2" @@ -70,18 +91,29 @@ dependencies = [ "regex", ] +[[package]] +name = "astro-satellite-package" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cf737cf762c341a9575ee8fc6da47cc0c4ec11725c9fd0fc5fbb2c31ce0d61a" +dependencies = [ + "astroport-governance", + "cosmwasm-schema", + "cosmwasm-std", +] + [[package]] name = "astroport" -version = "2.9.0" +version = "2.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b863a982595743e181f89540d7aaeda35c60b6b5cac9c36c9be30cf11a5ece" +checksum = "d102b618016b3c1f1ebb5750617a73dbd294a3c941e54b12deabc931d771bc6e" dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 0.15.1", "cw-utils 0.15.1", "cw20 0.15.1", - "itertools", + "itertools 0.10.5", "uint", ] @@ -91,15 +123,32 @@ version = "3.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c001a7f97db88ffe6fc6cca97bbdbfe926e55599184921ff7e72cd47559440de" dependencies = [ - "astroport-circular-buffer", + "astroport-circular-buffer 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "cosmwasm-schema", "cosmwasm-std", "cw-asset", "cw-storage-plus 0.15.1", - "cw-utils 1.0.2", + "cw-utils 1.0.3", "cw20 0.15.1", "cw3", - "itertools", + "itertools 0.10.5", + "uint", +] + +[[package]] +name = "astroport" +version = "3.12.1" +source = "git+https://github.com/astroport-fi/astroport-core?branch=main#148930eaedf3cacf0c31844045891835c0b29a95" +dependencies = [ + "astroport-circular-buffer 0.1.0 (git+https://github.com/astroport-fi/astroport-core?branch=main)", + "cosmwasm-schema", + "cosmwasm-std", + "cw-asset", + "cw-storage-plus 0.15.1", + "cw-utils 1.0.3", + "cw20 0.15.1", + "cw3", + "itertools 0.10.5", "uint", ] @@ -115,6 +164,81 @@ dependencies = [ "thiserror", ] +[[package]] +name = "astroport-circular-buffer" +version = "0.1.0" +source = "git+https://github.com/astroport-fi/astroport-core?branch=main#148930eaedf3cacf0c31844045891835c0b29a95" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.15.1", + "thiserror", +] + +[[package]] +name = "astroport-factory" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ecf768e2d3153bebfbe0c502ffa4199a52598e9b6e89fca54339615b2de77eb" +dependencies = [ + "astroport 2.9.5", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.15.1", + "cw2 0.15.1", + "itertools 0.10.5", + "protobuf", + "thiserror", +] + +[[package]] +name = "astroport-generator" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6144780ac014665b07616de0cfb35ca6a9411ed821e20c21e02f4f428c8ed51f" +dependencies = [ + "astroport 2.9.5", + "astroport-governance", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.15.1", + "cw1-whitelist", + "cw2 0.15.1", + "cw20 0.15.1", + "protobuf", + "thiserror", +] + +[[package]] +name = "astroport-governance" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72806ace350e81c4e1cab7e275ef91f05bad830275d697d67ad1bd4acc6f016d" +dependencies = [ + "astroport 2.9.5", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.15.1", + "cw20 0.15.1", +] + +[[package]] +name = "astroport-incentives" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba05c27479d2885ba313086aa0b7d09284f1393f1ebb6d385f96d93b3c6fb72a" +dependencies = [ + "astroport 3.11.1", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.15.1", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "itertools 0.11.0", + "thiserror", +] + [[package]] name = "astroport-liquidity-helper" version = "0.3.2" @@ -122,13 +246,15 @@ dependencies = [ "apollo-cw-asset", "apollo-utils", "astroport 3.11.1", + "astroport-pair-xyk-sale-tax", "cosmwasm-schema", "cosmwasm-std", "cw-bigint", "cw-dex", + "cw-dex-astroport", "cw-it", "cw-storage-plus 1.2.0", - "cw2 1.1.1", + "cw2 1.1.2", "cw20 1.1.2", "liquidity-helper", "semver", @@ -136,15 +262,228 @@ dependencies = [ "thiserror", ] +[[package]] +name = "astroport-liquidity-manager" +version = "1.0.3-astroport-v2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae4bf7689e7c37cfecc200aab3401c1ff6a507cccc9fb1baadfa71a73addaa2f" +dependencies = [ + "astroport 2.9.5", + "astroport-factory", + "astroport-pair 1.3.2", + "astroport-pair-stable", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw20 0.15.1", + "cw20-base", + "thiserror", +] + +[[package]] +name = "astroport-maker" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92403e5d00e3c77d13d9616661ea9d9308d493fff6bec5e6e5e7bd7b7e0ff6af" +dependencies = [ + "astro-satellite-package", + "astroport 2.9.5", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.15.1", + "cw2 0.15.1", + "cw20 0.15.1", + "thiserror", +] + +[[package]] +name = "astroport-native-coin-registry" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "648ed6827a8f11012c0377fb60329204e8511fe46c86db3220113e70bdc57826" +dependencies = [ + "astroport 2.9.5", + "cosmwasm-schema", + "cosmwasm-std", + "cosmwasm-storage", + "cw-storage-plus 0.15.1", + "cw2 0.15.1", + "thiserror", +] + +[[package]] +name = "astroport-pair" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e760b91eaf269bb2843b75b34eb73d474374bd2ebefbbe3cdb0a58d69959573b" +dependencies = [ + "astroport 2.9.5", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.15.1", + "cw2 0.15.1", + "cw20 0.15.1", + "integer-sqrt", + "protobuf", + "thiserror", +] + +[[package]] +name = "astroport-pair" +version = "1.5.0" +source = "git+https://github.com/astroport-fi/astroport-core?branch=main#148930eaedf3cacf0c31844045891835c0b29a95" +dependencies = [ + "astroport 3.12.1", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.15.1", + "cw-utils 1.0.3", + "cw2 0.15.1", + "cw20 0.15.1", + "integer-sqrt", + "protobuf", + "thiserror", +] + +[[package]] +name = "astroport-pair-concentrated" +version = "1.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04a90ce51403c81af3acf8e7028bb0eb095fce802365453b7e4a13bc0eb0d6d7" +dependencies = [ + "astroport 2.9.5", + "astroport-factory", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.15.1", + "cw-utils 0.15.1", + "cw2 0.15.1", + "cw20 0.15.1", + "itertools 0.10.5", + "thiserror", +] + +[[package]] +name = "astroport-pair-stable" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d052966163fc2dd3eb46ae3c948ee7032a28726e046bc44431f9b488cb1dba90" +dependencies = [ + "astroport 2.9.5", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.15.1", + "cw-utils 1.0.3", + "cw2 0.15.1", + "cw20 0.15.1", + "itertools 0.10.5", + "thiserror", +] + +[[package]] +name = "astroport-pair-xyk-sale-tax" +version = "1.6.0" +source = "git+https://github.com/astroport-fi/astroport-core?branch=main#148930eaedf3cacf0c31844045891835c0b29a95" +dependencies = [ + "astroport 3.12.1", + "astroport-pair 1.5.0", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.15.1", + "cw-utils 1.0.3", + "cw2 0.15.1", + "cw20 0.15.1", + "integer-sqrt", + "protobuf", + "thiserror", +] + +[[package]] +name = "astroport-router" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61d62a810fa14d25b850cbaf1b8c6d25fd309cf9455eb6b73b4fef630727811f" +dependencies = [ + "astroport 2.9.5", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.15.1", + "cw2 0.15.1", + "cw20 0.15.1", + "integer-sqrt", + "thiserror", +] + +[[package]] +name = "astroport-staking" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67adbc4240794e886ca1edbc7d46bc8a54c7aca7217d73ddcfbc90e1dbb030e7" +dependencies = [ + "astroport 2.9.5", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.15.1", + "cw2 0.15.1", + "cw20 0.15.1", + "protobuf", + "thiserror", +] + +[[package]] +name = "astroport-token" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3360383a2e585211da9a455ad57eb100578253b5d18a387f025cadd666604d99" +dependencies = [ + "astroport 2.9.5", + "cosmwasm-schema", + "cosmwasm-std", + "cw2 0.15.1", + "cw20 0.15.1", + "cw20-base", + "snafu", +] + +[[package]] +name = "astroport-vesting" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dffce7cf86bf4d4f177ef941145352499e802abc4b898032af7808d16cca6371" +dependencies = [ + "astroport 2.9.5", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.15.1", + "cw-utils 0.15.1", + "cw2 0.15.1", + "cw20 0.15.1", + "thiserror", +] + +[[package]] +name = "astroport-whitelist" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44156757bfab3d4bd208d9b86b890d1478f45d07c8f8d3d1c3e3da91081cb54d" +dependencies = [ + "astroport 2.9.5", + "cosmwasm-schema", + "cosmwasm-std", + "cw1-whitelist", + "cw2 0.15.1", + "thiserror", +] + [[package]] name = "async-trait" -version = "0.1.74" +version = "0.1.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +checksum = "461abc97219de0eaaf81fe3ef974a540158f3d079c2ab200f891f1a2ef201e85" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -168,6 +507,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + [[package]] name = "base16ct" version = "0.2.0" @@ -182,9 +527,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.5" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64ct" @@ -204,10 +549,10 @@ version = "0.69.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.5.0", "cexpr", "clang-sys", - "itertools", + "itertools 0.12.1", "lazy_static", "lazycell", "log", @@ -217,7 +562,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.52", + "syn 2.0.53", "which", ] @@ -229,7 +574,7 @@ checksum = "7e141fb0f8be1c7b45887af94c88b182472b57c96b56773250ae00cd6a14a164" dependencies = [ "bs58", "hmac", - "k256", + "k256 0.13.1", "rand_core 0.6.4", "ripemd", "sha2 0.10.8", @@ -245,9 +590,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "block-buffer" @@ -275,18 +620,18 @@ checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" [[package]] name = "bs58" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ "sha2 0.10.8", ] [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" [[package]] name = "byteorder" @@ -305,12 +650,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.83" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] +checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" [[package]] name = "cexpr" @@ -329,18 +671,18 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" dependencies = [ "num-traits", ] [[package]] name = "clang-sys" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" +checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" dependencies = [ "glob", "libc", @@ -349,9 +691,9 @@ dependencies = [ [[package]] name = "config" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d379af7f68bfc21714c6c7dea883544201741d2ce8274bb12fa54f89507f52a7" +checksum = "23738e11972c7643e4ec947840fc463b6a571afcd3e735bdfce7d03c7a784aca" dependencies = [ "async-trait", "json5", @@ -368,15 +710,15 @@ dependencies = [ [[package]] name = "const-oid" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -384,9 +726,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cosmos-sdk-proto" @@ -407,13 +749,13 @@ checksum = "47126f5364df9387b9d8559dcef62e99010e1d4098f39eb3f7ee4b5c254e40ea" dependencies = [ "bip32", "cosmos-sdk-proto", - "ecdsa", + "ecdsa 0.16.9", "eyre", - "k256", + "k256 0.13.1", "rand_core 0.6.4", "serde", "serde_json", - "signature", + "signature 2.2.0", "subtle-encoding", "tendermint", "tendermint-rpc", @@ -427,9 +769,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9934c79e58d9676edfd592557dee765d2a6ef54c09d5aa2edb06156b00148966" dependencies = [ "digest 0.10.7", - "ecdsa", + "ecdsa 0.16.9", "ed25519-zebra", - "k256", + "k256 0.13.1", "rand_core 0.6.4", "thiserror", ] @@ -473,7 +815,7 @@ version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef8666e572a3a2519010dde88c04d16e9339ae751b56b2bb35081fe3f7d6be74" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "bech32", "bnum", "cosmwasm-crypto", @@ -489,11 +831,21 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cosmwasm-storage" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66de2ab9db04757bcedef2b5984fbe536903ada4a8a9766717a4a71197ef34f6" +dependencies = [ + "cosmwasm-std", + "serde", +] + [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] @@ -506,9 +858,21 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-bigint" -version = "0.5.3" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "740fe28e594155f10cfc383984cbefd529d7396050557148f79cb0f621204124" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", "rand_core 0.6.4", @@ -588,22 +952,38 @@ dependencies = [ [[package]] name = "cw-dex" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f47ce1f0a02665dfe244bd5e396ecd3f8628fb8e6aabd1be38689501b6c139a" +checksum = "cd655e137d57d6c77696247d2417cfee75b15d027b1465741f45fa88bfcbf1b7" dependencies = [ "apollo-cw-asset", "apollo-utils", - "astroport 2.9.0", "cosmwasm-schema", "cosmwasm-std", - "cw-utils 1.0.2", - "cw2 1.1.1", + "cw-utils 1.0.3", "cw20 1.1.2", "osmosis-std 0.19.2", "thiserror", ] +[[package]] +name = "cw-dex-astroport" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cc11c6de1f93dbc38e92418c068a835148cf7126b47eb7879e1ef5054721e0b" +dependencies = [ + "apollo-cw-asset", + "apollo-utils", + "astroport 2.9.5", + "astroport 3.11.1", + "cosmwasm-schema", + "cosmwasm-std", + "cw-dex", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", +] + [[package]] name = "cw-it" version = "0.3.1" @@ -611,8 +991,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d9bf95d529e18676d6915a26c6d0ff254baf71d6a46ddae5c2014c276dae546" dependencies = [ "anyhow", - "astroport 2.9.0", + "apollo-cw-multi-test", + "astroport 2.9.5", "astroport 3.11.1", + "astroport-factory", + "astroport-generator", + "astroport-incentives", + "astroport-liquidity-manager", + "astroport-maker", + "astroport-native-coin-registry", + "astroport-pair 1.3.2", + "astroport-pair-concentrated", + "astroport-pair-stable", + "astroport-router", + "astroport-staking", + "astroport-token", + "astroport-vesting", + "astroport-whitelist", "config", "cosmrs", "cosmwasm-schema", @@ -620,7 +1015,9 @@ dependencies = [ "cw20 0.15.1", "osmosis-std 0.22.0", "osmosis-test-tube", + "paste", "prost 0.12.3", + "regex", "serde", "strum", "test-tube", @@ -666,19 +1063,48 @@ dependencies = [ [[package]] name = "cw-utils" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9f351a4e4d81ef7c890e44d903f8c0bdcdc00f094fd3a181eaf70c0eec7a3a" +checksum = "1c4a657e5caacc3a0d00ee96ca8618745d050b8f757c709babafb81208d4239c" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw2 1.1.1", + "cw2 1.1.2", "schemars", "semver", "serde", "thiserror", ] +[[package]] +name = "cw1" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe0783ec4210ba4e0cdfed9874802f469c6db0880f742ad427cb950e940b21c" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "schemars", + "serde", +] + +[[package]] +name = "cw1-whitelist" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233dd13f61495f1336da57c8bdca0536fa9f8dd59c12d2bbfc59928ea580e478" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.15.1", + "cw-utils 0.15.1", + "cw1", + "cw2 0.15.1", + "schemars", + "serde", + "thiserror", +] + [[package]] name = "cw2" version = "0.15.1" @@ -694,14 +1120,15 @@ dependencies = [ [[package]] name = "cw2" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9431d14f64f49e41c6ef5561ed11a5391c417d0cb16455dea8cdcb9037a8d197" +checksum = "c6c120b24fbbf5c3bedebb97f2cc85fbfa1c3287e09223428e7e597b5293c1fa" dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 1.2.0", "schemars", + "semver", "serde", "thiserror", ] @@ -727,26 +1154,54 @@ checksum = "526e39bb20534e25a1cd0386727f0038f4da294e5e535729ba3ef54055246abd" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-utils 1.0.2", + "cw-utils 1.0.3", "schemars", "serde", ] +[[package]] +name = "cw20-base" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0909c56d0c14601fbdc69382189799482799dcad87587926aec1f3aa321abc41" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.15.1", + "cw-utils 0.15.1", + "cw2 0.15.1", + "cw20 0.15.1", + "schemars", + "semver", + "serde", + "thiserror", +] + [[package]] name = "cw3" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d056ec33ec146554aa1d16c9535763341db75589a47743c006c377e62b54034" +checksum = "2967fbd073d4b626dd9e7148e05a84a3bebd9794e71342e12351110ffbb12395" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-utils 1.0.2", + "cw-utils 1.0.3", "cw20 1.1.2", "schemars", "serde", "thiserror", ] +[[package]] +name = "der" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +dependencies = [ + "const-oid", + "zeroize", +] + [[package]] name = "der" version = "0.7.8" @@ -757,6 +1212,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + [[package]] name = "derivative" version = "2.2.0" @@ -795,24 +1259,42 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + [[package]] name = "dyn-clone" -version = "1.0.14" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" + +[[package]] +name = "ecdsa" +version = "0.14.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d2f3407d9a573d666de4b5bdf10569d73ca9478087346697dcbae6244bfbcd" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +dependencies = [ + "der 0.6.1", + "elliptic-curve 0.12.3", + "rfc6979 0.3.1", + "signature 1.6.4", +] [[package]] name = "ecdsa" -version = "0.16.8" +version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ - "der", + "der 0.7.8", "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature", - "spki", + "elliptic-curve 0.13.8", + "rfc6979 0.4.0", + "signature 2.2.0", + "spki 0.7.3", ] [[package]] @@ -821,8 +1303,8 @@ version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ - "pkcs8", - "signature", + "pkcs8 0.10.2", + "signature 2.2.0", ] [[package]] @@ -845,7 +1327,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" dependencies = [ "curve25519-dalek", - "hashbrown", + "hashbrown 0.12.3", "hex", "rand_core 0.6.4", "serde", @@ -855,25 +1337,45 @@ dependencies = [ [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" + +[[package]] +name = "elliptic-curve" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +dependencies = [ + "base16ct 0.1.1", + "crypto-bigint 0.4.9", + "der 0.6.1", + "digest 0.10.7", + "ff 0.12.1", + "generic-array", + "group 0.12.1", + "pkcs8 0.9.0", + "rand_core 0.6.4", + "sec1 0.3.0", + "subtle", + "zeroize", +] [[package]] name = "elliptic-curve" -version = "0.13.6" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97ca172ae9dc9f9b779a6e3a65d308f2af74e5b8c921299075bdb4a0370e914" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ - "base16ct", - "crypto-bigint", + "base16ct 0.2.0", + "crypto-bigint 0.5.5", "digest 0.10.7", - "ff", + "ff 0.13.0", "generic-array", - "group", - "pkcs8", + "group 0.13.0", + "pkcs8 0.10.2", "rand_core 0.6.4", - "sec1", + "sec1 0.7.3", "subtle", "zeroize", ] @@ -887,26 +1389,42 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "errno" -version = "0.3.5" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "eyre" -version = "0.6.8" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" dependencies = [ "indenter", "once_cell", ] +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "ff" version = "0.13.0" @@ -935,9 +1453,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -950,9 +1468,9 @@ checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" [[package]] name = "futures" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -964,9 +1482,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -974,33 +1492,33 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-core", "futures-sink", @@ -1022,9 +1540,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "js-sys", @@ -1035,9 +1553,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "glob" @@ -1045,22 +1563,33 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff 0.12.1", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "group" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "ff", + "ff 0.13.0", "rand_core 0.6.4", "subtle", ] [[package]] name = "h2" -version = "0.3.21" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "4fbd2820c5e49886948654ab546d0688ff24530286bdcf8fca3cefb16d4618eb" dependencies = [ "bytes", "fnv", @@ -1084,6 +1613,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + [[package]] name = "heck" version = "0.4.1" @@ -1092,9 +1627,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" @@ -1113,18 +1648,18 @@ dependencies = [ [[package]] name = "home" -version = "0.5.5" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "http" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", @@ -1133,9 +1668,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", @@ -1156,9 +1691,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" dependencies = [ "bytes", "futures-channel", @@ -1171,7 +1706,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", + "socket2", "tokio", "tower-service", "tracing", @@ -1194,9 +1729,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -1210,12 +1745,21 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "indexmap" -version = "1.9.3" +version = "2.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" dependencies = [ - "autocfg", - "hashbrown", + "equivalent", + "hashbrown 0.14.3", +] + +[[package]] +name = "integer-sqrt" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" +dependencies = [ + "num-traits", ] [[package]] @@ -1233,17 +1777,35 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -1259,6 +1821,18 @@ dependencies = [ "serde", ] +[[package]] +name = "k256" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" +dependencies = [ + "cfg-if", + "ecdsa 0.14.8", + "elliptic-curve 0.12.3", + "sha2 0.10.8", +] + [[package]] name = "k256" version = "0.13.1" @@ -1266,11 +1840,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" dependencies = [ "cfg-if", - "ecdsa", - "elliptic-curve", + "ecdsa 0.16.9", + "elliptic-curve 0.13.8", "once_cell", "sha2 0.10.8", - "signature", + "signature 2.2.0", ] [[package]] @@ -1287,18 +1861,18 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.149" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libloading" -version = "0.7.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" dependencies = [ "cfg-if", - "winapi", + "windows-targets 0.52.4", ] [[package]] @@ -1309,9 +1883,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.4.10" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "liquidity-helper" @@ -1326,15 +1900,15 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "mime" @@ -1350,18 +1924,18 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", ] [[package]] name = "mio" -version = "0.8.9" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "wasi", @@ -1378,6 +1952,12 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-derive" version = "0.3.3" @@ -1391,19 +1971,18 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", ] @@ -1418,35 +1997,26 @@ dependencies = [ "libc", ] -[[package]] -name = "num_threads" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" -dependencies = [ - "libc", -] - [[package]] name = "object" -version = "0.32.1" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl-probe" @@ -1461,7 +2031,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" dependencies = [ "dlv-list", - "hashbrown", + "hashbrown 0.12.3", ] [[package]] @@ -1473,7 +2043,7 @@ dependencies = [ "cosmwasm-std", "cw-dex", "cw-it", - "cw2 1.1.1", + "cw2 1.1.2", "liquidity-helper", "test-case", "thiserror", @@ -1517,7 +2087,7 @@ version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f47f0b2f22adb341bb59e5a3a1b464dde033181954bd055b9ae86d6511ba465b" dependencies = [ - "itertools", + "itertools 0.10.5", "proc-macro2", "prost-types 0.11.9", "quote", @@ -1530,7 +2100,7 @@ version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5ebdfd1bc8ed04db596e110c6baa9b174b04f6ed1ec22c666ddc5cb3fa91bd7" dependencies = [ - "itertools", + "itertools 0.10.5", "proc-macro2", "prost-types 0.11.9", "quote", @@ -1543,7 +2113,7 @@ version = "22.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a082b97136d15470a37aa758f227c865594590b69d74721248ed5adf59bf1ca2" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "bindgen", "cosmrs", "cosmwasm-std", @@ -1596,15 +2166,15 @@ checksum = "36bae92c60fa2398ce4678b98b2c4b5a7c61099961ca1fa305aec04a9ad28922" [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.5" +version = "2.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" +checksum = "56f8023d0fb78c8e03784ea1c7f3fa36e68a723138990b8d5a47d916b651e7a8" dependencies = [ "memchr", "thiserror", @@ -1613,9 +2183,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.5" +version = "2.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81d78524685f5ef2a3b3bd1cafbc9fcabb036253d9b1463e726a91cd16e2dfc2" +checksum = "b0d24f72393fd16ab6ac5738bc33cdb6a9aa73f8b902e8fe29cf4e67d7dd1026" dependencies = [ "pest", "pest_generator", @@ -1623,22 +2193,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.5" +version = "2.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68bd1206e71118b5356dae5ddc61c8b11e28b09ef6a31acbd15ea48a28e0c227" +checksum = "fdc17e2a6c7d0a492f0158d7a4bd66cc17280308bbaff78d5bef566dca35ab80" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] name = "pest_meta" -version = "2.7.5" +version = "2.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c747191d4ad9e4a4ab9c8798f1e82a39affe7ef9648390b7e5548d18e099de6" +checksum = "934cd7631c050f4674352a6e835d5f6711ffbfb9345c2fc0107155ac495ae293" dependencies = [ "once_cell", "pest", @@ -1647,22 +2217,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -1677,16 +2247,32 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs8" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +dependencies = [ + "der 0.6.1", + "spki 0.6.0", +] + [[package]] name = "pkcs8" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "der", - "spki", + "der 0.7.8", + "spki 0.7.3", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -1695,45 +2281,31 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "prettyplease" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" +checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" dependencies = [ "proc-macro2", - "syn 2.0.52", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", + "syn 2.0.53", ] [[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "proc-macro2" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ - "proc-macro2", - "quote", - "version_check", + "unicode-ident", ] [[package]] -name = "proc-macro2" -version = "1.0.78" +name = "prost" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "444879275cb4fd84958b1a1d5420d15e6fcf7c235fe47f053c9c2a80aceb6001" dependencies = [ - "unicode-ident", + "bytes", + "prost-derive 0.9.0", ] [[package]] @@ -1756,6 +2328,19 @@ dependencies = [ "prost-derive 0.12.3", ] +[[package]] +name = "prost-derive" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe" +dependencies = [ + "anyhow", + "itertools 0.10.5", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "prost-derive" version = "0.11.9" @@ -1763,7 +2348,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" dependencies = [ "anyhow", - "itertools", + "itertools 0.10.5", "proc-macro2", "quote", "syn 1.0.109", @@ -1776,10 +2361,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" dependencies = [ "anyhow", - "itertools", + "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -1800,6 +2385,15 @@ dependencies = [ "prost 0.12.3", ] +[[package]] +name = "protobuf" +version = "2.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94" +dependencies = [ + "bytes", +] + [[package]] name = "quote" version = "1.0.35" @@ -1847,9 +2441,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.2" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", @@ -1859,9 +2453,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", @@ -1876,11 +2470,11 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" -version = "0.11.24" +version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "bytes", "encoding_rs", "futures-core", @@ -1915,6 +2509,17 @@ dependencies = [ "winreg", ] +[[package]] +name = "rfc6979" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +dependencies = [ + "crypto-bigint 0.4.9", + "hmac", + "zeroize", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -1984,15 +2589,15 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" -version = "0.38.21" +version = "0.38.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" +checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.5.0", "errno", "libc", "linux-raw-sys", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -2025,7 +2630,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", ] [[package]] @@ -2046,9 +2651,9 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "same-file" @@ -2061,18 +2666,18 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "schemars" -version = "0.8.15" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f7b0ce13155372a76ee2e1c5ffba1fe61ede73fbea5630d61eee6fac4929c0c" +checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" dependencies = [ "dyn-clone", "schemars_derive", @@ -2082,9 +2687,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.15" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e85e2a16b12bdb763244c69ab79363d71db2b4b918a2def53f80b02e0574b13c" +checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" dependencies = [ "proc-macro2", "quote", @@ -2102,16 +2707,30 @@ dependencies = [ "untrusted", ] +[[package]] +name = "sec1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +dependencies = [ + "base16ct 0.1.1", + "der 0.6.1", + "generic-array", + "pkcs8 0.9.0", + "subtle", + "zeroize", +] + [[package]] name = "sec1" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ - "base16ct", - "der", + "base16ct 0.2.0", + "der 0.7.8", "generic-array", - "pkcs8", + "pkcs8 0.10.2", "subtle", "zeroize", ] @@ -2141,15 +2760,15 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "serde" -version = "1.0.190" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] @@ -2174,22 +2793,22 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.12" +version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" +checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.190" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -2205,9 +2824,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -2216,13 +2835,13 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" +checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -2263,15 +2882,25 @@ dependencies = [ [[package]] name = "shlex" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signature" -version = "2.1.0" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "signature" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest 0.10.7", "rand_core 0.6.4", @@ -2287,23 +2916,34 @@ dependencies = [ ] [[package]] -name = "socket2" -version = "0.4.10" +name = "snafu" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +checksum = "eab12d3c261b2308b0d80c26fffb58d17eba81a4be97890101f416b478c79ca7" dependencies = [ - "libc", - "winapi", + "doc-comment", + "snafu-derive", +] + +[[package]] +name = "snafu-derive" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1508efa03c362e23817f96cde18abed596a25219a8b2c66e8db33c03543d315b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -2314,12 +2954,22 @@ checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "spki" -version = "0.7.2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der 0.6.1", +] + +[[package]] +name = "spki" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", - "der", + "der 0.7.8", ] [[package]] @@ -2384,9 +3034,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.52" +version = "2.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" +checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" dependencies = [ "proc-macro2", "quote", @@ -2432,7 +3082,7 @@ dependencies = [ "ed25519-consensus", "flex-error", "futures", - "k256", + "k256 0.13.1", "num-traits", "once_cell", "prost 0.12.3", @@ -2443,7 +3093,7 @@ dependencies = [ "serde_json", "serde_repr", "sha2 0.10.8", - "signature", + "signature 2.2.0", "subtle", "subtle-encoding", "tendermint-proto", @@ -2518,36 +3168,34 @@ dependencies = [ [[package]] name = "test-case" -version = "3.2.1" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8f1e820b7f1d95a0cdbf97a5df9de10e1be731983ab943e56703ac1b8e9d425" +checksum = "eb2550dd13afcd286853192af8601920d959b14c401fcece38071d53bf0768a8" dependencies = [ "test-case-macros", ] [[package]] name = "test-case-core" -version = "3.2.1" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c25e2cb8f5fcd7318157634e8838aa6f7e4715c96637f969fabaccd1ef5462" +checksum = "adcb7fd841cd518e279be3d5a3eb0636409487998a4aff22f3de87b81e88384f" dependencies = [ "cfg-if", - "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] name = "test-case-macros" -version = "3.2.1" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37cfd7bbc88a0104e304229fba519bdc45501a30b760fb72240342f1289ad257" +checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ - "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", "test-case-core", ] @@ -2557,7 +3205,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09184c7655b2bdaf4517b06141a2e4c44360904f2706a05b24c831bd97ad1db6" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "cosmrs", "cosmwasm-std", "osmosis-std 0.22.0", @@ -2569,40 +3217,53 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] name = "time" -version = "0.3.11" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c91f41dcb2f096c05f0873d667dceec1087ce5bcf984ec8ffb19acddbb3217" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" dependencies = [ - "libc", - "num_threads", + "deranged", + "num-conv", + "powerfmt", + "serde", + "time-core", "time-macros", ] +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + [[package]] name = "time-macros" -version = "0.2.4" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +dependencies = [ + "num-conv", + "time-core", +] [[package]] name = "tinyvec" @@ -2621,9 +3282,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.33.0" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ "backtrace", "bytes", @@ -2631,20 +3292,20 @@ dependencies = [ "mio", "num_cpus", "pin-project-lite", - "socket2 0.5.5", + "socket2", "tokio-macros", "windows-sys 0.48.0", ] [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -2707,9 +3368,9 @@ dependencies = [ [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" @@ -2737,9 +3398,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" @@ -2749,9 +3410,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] @@ -2764,9 +3425,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", @@ -2775,9 +3436,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" +checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" [[package]] name = "version_check" @@ -2787,9 +3448,9 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "walkdir" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -2812,9 +3473,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2822,24 +3483,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.37" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if", "js-sys", @@ -2849,9 +3510,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2859,28 +3520,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -3082,9 +3743,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" dependencies = [ "zeroize_derive", ] @@ -3097,5 +3758,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] diff --git a/Cargo.toml b/Cargo.toml index 477214b..a53feda 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ cw-storage-plus = "1.1.0" thiserror = "1.0.45" apollo-cw-asset = "0.1.2" cw-dex = "0.5.1" +cw-dex-astroport = "0.1" apollo-utils = "0.1.1" cw-bigint = "0.4.3" liquidity-helper = { version = "0.3.0", path = "./packages/liquidity-helper" } diff --git a/contracts/astroport-liquidity-helper/Cargo.toml b/contracts/astroport-liquidity-helper/Cargo.toml index 8db3050..1fffb27 100644 --- a/contracts/astroport-liquidity-helper/Cargo.toml +++ b/contracts/astroport-liquidity-helper/Cargo.toml @@ -40,7 +40,8 @@ cw-storage-plus = { workspace = true } cw2 = { workspace = true } thiserror = { workspace = true } apollo-cw-asset = { workspace = true, features = ["astroport"] } -cw-dex = { workspace = true, features = ["astroport"] } +cw-dex = { workspace = true } +cw-dex-astroport = { workspace = true } apollo-utils = { workspace = true } cw20 = { workspace = true } liquidity-helper = { workspace = true } @@ -49,5 +50,6 @@ semver = { workspace = true } astroport_v3 = { package = "astroport", version = "3.11.1" } [dev-dependencies] -cw-it = { workspace = true, features = ["astroport", "osmosis-test-tube"] } -test-case = { workspace = true } +cw-it = { workspace = true, features = ["astroport", "osmosis-test-tube", "multi-test", "astroport-multi-test"] } +test-case = { workspace = true } +astroport-pair-xyk-sale-tax = { git = "https://github.com/astroport-fi/astroport-core", branch = "main" } diff --git a/contracts/astroport-liquidity-helper/src/contract.rs b/contracts/astroport-liquidity-helper/src/contract.rs index 1340ee3..22d757e 100644 --- a/contracts/astroport-liquidity-helper/src/contract.rs +++ b/contracts/astroport-liquidity-helper/src/contract.rs @@ -11,11 +11,11 @@ use cosmwasm_std::{ MessageInfo, Response, StdResult, Uint128, }; use cw2::set_contract_version; -use cw_dex::astroport::astroport::factory::PairType; -use cw_dex::astroport::astroport::pair::{ConfigResponse, QueryMsg as PairQueryMsg}; -use cw_dex::astroport::astroport::querier::query_fee_info; +use cw_dex_astroport::astroport::factory::PairType; +use cw_dex_astroport::astroport::pair::{ConfigResponse, QueryMsg as PairQueryMsg}; +use cw_dex_astroport::astroport::querier::query_fee_info; +use cw_dex_astroport::AstroportPool; -use cw_dex::astroport::AstroportPool; use cw_dex::traits::Pool; use crate::error::ContractError; @@ -92,6 +92,8 @@ fn handle_xyk_balancing_provide_liquidity( assets: &mut AssetList, min_out: Uint128, ) -> Result { + deps.api.debug("handle_xyk_balancing_provide_liquidity"); + println!("assets before: {:?}", assets); let pool_res = pool.query_pool_info(&deps.querier)?; let pool_reserves: [Asset; 2] = [ @@ -155,17 +157,29 @@ fn handle_xyk_balancing_provide_liquidity( _ => None, }; + println!("tax_configs: {:?}", tax_configs); + // Calculate amount of tokens to swap let (offer_asset, return_asset) = calc_xyk_balancing_swap( + deps, assets_slice, [pool_reserves[0].amount, pool_reserves[1].amount], fee, tax_configs, )?; + + deps.api.debug(&format!("assets: {}", &assets.to_string())); + // Update balances for liquidity provision assets.add(&return_asset)?; assets.deduct(&offer_asset)?; + println!("assets after: {:?}", assets); + println!("offer_asset: {:?}", offer_asset); + println!("return_asset: {:?}", return_asset); + + deps.api.debug("post deduction"); + // If either of the assets are still zero after the swap, we can't // provide liquidity. This can happen if the amount of tokens to swap // is so small that the returned amount of the other asset would be zero. @@ -178,17 +192,22 @@ fn handle_xyk_balancing_provide_liquidity( if min_out.is_zero() { // If min_out is zero, we can just return the received native // assets. We don't need to return any Cw20 assets, because - // we did not execute the transferFrom on them. - let return_msg = CosmosMsg::Bank(BankMsg::Send { - to_address: info.sender.to_string(), - amount: info.funds, - }); + // we did not execute the transferFrom on them. If no native + // assets were received, we don't need to return anything. let event = Event::new("apollo/astroport-liquidity-helper/execute_balancing_provide_liquidity") .add_attribute("action", "No liquidity provided. Zero amount of asset") .add_attribute("assets", assets.to_string()) .add_attribute("min_out", min_out); - return Ok(Response::new().add_message(return_msg).add_event(event)); + if !info.funds.is_empty() { + let return_msg = CosmosMsg::Bank(BankMsg::Send { + to_address: info.sender.to_string(), + amount: info.funds, + }); + return Ok(Response::new().add_message(return_msg).add_event(event)); + } else { + return Ok(Response::new().add_event(event)); + } } else { // If min_out is not zero, we need to return an error return Err(ContractError::MinOutNotReceived { @@ -198,6 +217,9 @@ fn handle_xyk_balancing_provide_liquidity( } } + println!("offer_asset: {:?}", offer_asset); + println!("return_asset: {:?}", return_asset); + // Create message to swap some of the asset to the other if offer_asset.amount > Uint128::zero() && return_asset.amount > Uint128::zero() { Ok(pool.swap( @@ -221,6 +243,7 @@ pub fn execute_balancing_provide_liquidity( pool: AstroportPool, recipient: Option, ) -> Result { + println!("execute_balancing_provide_liquidity"); // Get response with message to do TransferFrom on any Cw20s and assert that // native tokens have been received already. let receive_res = receive_assets(&info, &env, &assets)?; @@ -260,12 +283,22 @@ pub fn execute_balancing_provide_liquidity( }, }; + println!("swap_res: {:?}", swap_res); + // For stableswap and concentrated liquidity pools we are allowed to provide // liquidity in any ratio, so we simply provide liquidity with all passed // assets. let provide_liquidity_res = pool.provide_liquidity(deps.as_ref(), &env, assets.clone(), min_out)?; + println!("assets: {:?}", assets); + println!("pool assets: {:?}", pool.pool_assets); + println!( + "real pool assets: {:?}", + pool.query_pool_info(&deps.querier)?.assets + ); + println!("provide_liquidity_res: {:?}", provide_liquidity_res); + // Callback to return LP tokens let callback_msg = CallbackMsg::ReturnLpTokens { pool, diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index fe6eed1..0dcd5e0 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -8,7 +8,10 @@ use cw_bigint::BigInt; use crate::math::big_decimal::{bigint_to_u128, BigDecimal}; pub mod big_decimal { - use std::ops::{Add, Deref, Div, Mul, Sub}; + use std::{ + fmt::Display, + ops::{Add, Deref, Div, Mul, Sub}, + }; use cosmwasm_std::{Decimal, Fraction, StdError, StdResult, Uint128}; use cw_bigint::BigInt; @@ -19,6 +22,10 @@ pub mod big_decimal { pub struct BigDecimal(BigInt); impl BigDecimal { + pub fn new(value: BigInt) -> Self { + Self(value) + } + pub fn zero() -> Self { Self(BigInt::from(0u128)) } @@ -27,6 +34,10 @@ pub mod big_decimal { Self(BigInt::from(BIG_DECIMAL_FRACTIONAL)) } + pub fn atomics(&self) -> BigInt { + self.0.clone() + } + /// Returns the square root of the BigDecimal. /// /// Uses the Newton-Raphson method to approximate the square root. @@ -43,9 +54,19 @@ pub mod big_decimal { let mut x = self.clone(); let mut y = (x.clone() + Self::one()) / BigDecimal::from(2u128); + println!( + "x: {}, y: {}", + u128::try_from(x.0.clone()).unwrap(), + u128::try_from(y.0.clone()).unwrap() + ); while y < x { x = y.clone(); y = (x.clone() + self.clone() / x.clone()) / BigDecimal::from(2u128); + println!( + "x: {}, y: {}", + u128::try_from(x.0.clone()).unwrap(), + u128::try_from(y.0.clone()).unwrap() + ); } y } @@ -73,6 +94,21 @@ pub mod big_decimal { } } + // impl Display for BigDecimal { + // fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + // let bigint_decimal_str = self.0.to_str_radix(10); + // let str_len = bigint_decimal_str.len(); + // if str_len <= 18 { + // // Pad with zeros if length is less than 18 + // let num_of_zeroes = 18 - str_len; + // write!(f, "0.{}{}", "0".repeat(num_of_zeroes), bigint_decimal_str) + // } else { + // let (integer_part, fractional_part) = bigint_decimal_str.split_at(str_len - 18); + // write!(f, "{}.{}", integer_part, fractional_part) + // } + // } + // } + impl Mul for BigDecimal { type Output = Self; @@ -404,11 +440,21 @@ pub mod big_decimal { #[cfg(test)] mod tests { - use super::bigint_to_u128; + use super::BIG_DECIMAL_FRACTIONAL; + + use super::{bigint_to_u128, BigDecimal}; use cosmwasm_std::{StdError, StdResult}; use cw_bigint::BigInt; use test_case::test_case; + const BIG_DECIMAL_FRACTIONAL_I128: i128 = BIG_DECIMAL_FRACTIONAL as i128; + + // #[test_case(0u128 => "0.000000000000000000"; "zero")] + // #[test_case(BIG_DECIMAL_FRACTIONAL => "1.000000000000000000"; "one")] + // fn test_bigdecimal_to_string(val: u128) -> String { + // BigDecimal::new(val.into()).to_string() + // } + #[test_case(0u128, 0u128 => Ok(0u128); "zero")] #[test_case(1u128, 0u128 => Ok(1u128); "one")] #[test_case(u128::MAX, 0u128 => Ok(u128::MAX); "u128::MAX")] @@ -508,18 +554,27 @@ pub mod big_decimal { /// Calculate how much will be returned from a swap in a constant product pool fn constant_product_formula( - offer_reserve: Uint128, - ask_reserve: Uint128, + offer_reserve: &BigInt, + ask_reserve: &BigInt, offer_amount: Uint128, fee: Decimal, + tax_rate: Decimal, ) -> StdResult { - let cp = offer_reserve.full_mul(ask_reserve); - let return_amount: Uint256 = (Decimal256::from_ratio(ask_reserve, 1u8) - - Decimal256::from_ratio(cp, offer_reserve + offer_amount)) - * Uint256::from(1u8); - let commission_amount: Uint256 = return_amount * Decimal256::from(fee); - let return_amount: Uint256 = return_amount - commission_amount; - Ok(return_amount.try_into()?) + println!("constant_product_formula"); + println!( + "offer_reserve: {}, ask_reserve: {}, offer_amount: {offer_amount}, fee: {fee}", + offer_reserve, ask_reserve + ); + let cp = offer_reserve * ask_reserve; + let return_amount_bigint = + ask_reserve - cp / (offer_reserve + BigInt::from(offer_amount.u128())); + let return_amount: Uint128 = bigint_to_u128(&return_amount_bigint)?.into(); + println!("return_amount: {return_amount}"); + let commission_amount = return_amount * fee; + println!("commission_amount: {commission_amount}"); + let return_amount = (return_amount - commission_amount) * (Decimal::one() - tax_rate); + println!("return_amount after tax: {return_amount}"); + Ok(return_amount) } /// For a constant product pool, calculates how much of one asset we need to @@ -530,11 +585,13 @@ fn constant_product_formula( /// and info of the asset we need to swap, and the asset that will be returned /// from the swap pub fn calc_xyk_balancing_swap( + deps: Deps, assets: [Asset; 2], reserves: [Uint128; 2], fee: Decimal, tax_configs: Option, ) -> StdResult<(Asset, Asset)> { + deps.api.debug("calc_xyk_balancing_swap"); // Make sure there is liquidity in the pool if reserves[0].is_zero() || reserves[1].is_zero() { return Err(StdError::generic_err("No liquidity in pool")); @@ -554,16 +611,16 @@ pub fn calc_xyk_balancing_swap( } else { (1, 0) }; - let offer_reserve = Int256::from(reserves[offer_idx].u128()); - let ask_reserve = Int256::from(reserves[ask_idx].u128()); - let offer_balance = Int256::from(assets[offer_idx].amount.u128()); - let ask_balance = Int256::from(assets[ask_idx].amount.u128()); + let offer_reserve = &BigInt::from(reserves[offer_idx].u128()); + let ask_reserve = &BigInt::from(reserves[ask_idx].u128()); + let offer_balance = &BigInt::from(assets[offer_idx].amount.u128()); + let ask_balance = &BigInt::from(assets[ask_idx].amount.u128()); - let fee_rate = Decimal256::from(fee); + let fee_rate = &BigDecimal::from(fee); // Unwrap tax let offer_asset_info = &assets[offer_idx].info; - let tax_rate = tax_configs + let tax_rate_decimal = tax_configs .map(|tax_configs| { tax_configs .get(&offer_asset_info.to_string()) @@ -571,36 +628,47 @@ pub fn calc_xyk_balancing_swap( .unwrap_or(Decimal::zero()) }) .unwrap_or(Decimal::zero()); - let tax_rate = Decimal256::from(tax_rate); + let tax_rate: &BigDecimal = &tax_rate_decimal.into(); + deps.api.debug("pre calcs"); + + // Original formula: + let two = &BigDecimal::from(2u128); + let a = ask_reserve + ask_balance; + let b = two * offer_reserve * (ask_reserve + ask_balance) + - ((offer_reserve + offer_balance) * ask_reserve * fee_rate); + let c = offer_reserve * (offer_reserve * ask_balance - offer_balance * ask_reserve); + let discriminant = &b * &b - (two * two * &a * &c); + // We know that for this equation, there is only one positive real solution + let x = (discriminant.sqrt() - b) / (two * a); + + // New formula including tax: // Solve equation to find amount to swap - let two = Int256::from(2u128); - let four = two * two; - let numerator = mul(offer_reserve * ask_reserve, fee_rate - fee_rate * tax_rate) - + mul((offer_balance + offer_reserve) * ask_reserve, fee_rate) - - two * offer_reserve * (ask_balance + ask_reserve); - println!("numerator: {numerator}"); - let discriminant = (two * &offer_reserve * &ask_balance - - mul(offer_balance * ask_reserve, fee_rate) - + two * mul(offer_reserve * ask_reserve, Decimal256::one() - fee_rate) - + mul(offer_reserve * ask_reserve, fee_rate * tax_rate)) - .pow(2) - - four - * (ask_balance + ask_reserve + mul(ask_reserve, fee_rate * tax_rate - tax_rate)) - * (offer_reserve.pow(2) * ask_balance - offer_balance * offer_reserve * ask_reserve); - println!("discriminant: {discriminant}"); - let denominator = two - * (ask_balance + ask_reserve - mul(ask_reserve, tax_rate) - + mul(ask_reserve, fee_rate * tax_rate)); - - println!("denominator: {denominator}"); - - let x = (numerator + int256_sqrt(discriminant)?) / denominator; - - println!("x: {x}"); + // let two = &BigDecimal::from(2u128); + // let four = two * two; + // let numerator = offer_reserve * ask_reserve * (fee_rate - fee_rate * tax_rate) + // + (offer_balance + offer_reserve) * ask_reserve * fee_rate + // - two * offer_reserve * (ask_balance + ask_reserve); + // deps.api.debug(&format!("numerator: {:?}", numerator)); + // let discriminant = (two * offer_reserve * ask_balance - offer_balance * ask_reserve * fee_rate + // + two * offer_reserve * ask_reserve * (BigDecimal::one() - fee_rate) + // + offer_reserve * ask_reserve * fee_rate * tax_rate) + // .pow(2) + // - four + // * (ask_balance + ask_reserve + ask_reserve * (fee_rate * tax_rate - tax_rate)) + // * (offer_reserve.pow(2) * ask_balance - offer_balance * offer_reserve * ask_reserve); + // deps.api.debug("discriminant: {discriminant}"); + // let denominator = two + // * (ask_balance + ask_reserve - ask_reserve * tax_rate + ask_reserve * fee_rate * tax_rate); + + // deps.api.debug("denominator: {denominator}"); + + // let x = (numerator + discriminant.sqrt()) / denominator; + + deps.api.debug("x: {x}"); // Divide by precision to get final result and convert to Uint128 - let offer_amount: Uint128 = x.try_into()?; + let offer_amount: Uint128 = Uint128::try_from(x.floor().to_string().as_str())?; let offer_asset = Asset { amount: offer_amount, info: assets[offer_idx].info.clone(), @@ -608,16 +676,19 @@ pub fn calc_xyk_balancing_swap( // Calculate return amount from swap let return_amount = constant_product_formula( - offer_reserve.try_into()?, - ask_reserve.try_into()?, + offer_reserve, + ask_reserve, offer_amount, fee, + tax_rate_decimal, )?; let return_asset = Asset { amount: return_amount, info: assets[ask_idx].info.clone(), }; + println!("offer_asset: {offer_asset}, return_asset: {return_asset}"); + Ok((offer_asset, return_asset)) } diff --git a/contracts/astroport-liquidity-helper/src/msg.rs b/contracts/astroport-liquidity-helper/src/msg.rs index a8d5ecf..56ff31c 100644 --- a/contracts/astroport-liquidity-helper/src/msg.rs +++ b/contracts/astroport-liquidity-helper/src/msg.rs @@ -1,6 +1,6 @@ use cosmwasm_schema::{cw_serde, QueryResponses}; use cosmwasm_std::{to_json_binary, Addr, CosmosMsg, Env, StdResult, Uint128, WasmMsg}; -use cw_dex::astroport::AstroportPool; +use cw_dex_astroport::AstroportPool; use liquidity_helper::msg::ExecuteMsg as GenericExecuteMsg; #[cw_serde] diff --git a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs index f5f4f5d..dfae83d 100644 --- a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs +++ b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs @@ -3,22 +3,25 @@ use astroport_liquidity_helper::math::calc_xyk_balancing_swap; use astroport_liquidity_helper::msg::InstantiateMsg; use cosmwasm_std::{assert_approx_eq, coin, to_json_binary, Addr, Coin, Decimal, Uint128}; use cw20::{AllowanceResponse, BalanceResponse, Cw20ExecuteMsg, Cw20QueryMsg}; -use cw_dex::astroport::astroport::asset::{Asset as AstroAsset, AssetInfo as AstroAssetInfo}; -use cw_dex::astroport::astroport::factory::{ +use cw_dex_astroport::astroport::asset::{Asset as AstroAsset, AssetInfo as AstroAssetInfo}; +use cw_dex_astroport::astroport::factory::{ ExecuteMsg as FactoryExecuteMsg, FeeInfoResponse, PairType, QueryMsg as FactoryQueryMsg, }; -use cw_dex::astroport::astroport::pair::{ +use cw_dex_astroport::astroport::pair::{ ExecuteMsg as PairExecuteMsg, PoolResponse, QueryMsg as PairQueryMsg, SimulationResponse, StablePoolParams, }; -use cw_dex::astroport::astroport::pair_concentrated::ConcentratedPoolParams; -use cw_dex::astroport::{astroport, AstroportPool}; +use cw_dex_astroport::astroport::pair_concentrated::ConcentratedPoolParams; +use cw_dex_astroport::{astroport, AstroportPool}; use cw_it::astroport::astroport::factory::PairConfig; use cw_it::astroport::astroport_v3::pair_xyk_sale_tax::{SaleTaxInitParams, TaxConfig}; use cw_it::astroport::utils::{ - create_astroport_pair, get_local_contracts, instantiate_astroport, AstroportContracts, + create_astroport_pair, get_local_contracts, instantiate_astroport, setup_astroport, + AstroportContracts, }; +use cw_it::cw_multi_test::ContractWrapper; use cw_it::helpers::upload_wasm_files; +use cw_it::multi_test::MultiTestRunner; use cw_it::osmosis_test_tube::osmosis_std::types::cosmos::bank::v1beta1::QueryBalanceRequest; use cw_it::traits::CwItRunner; use cw_it::{Artifact, ContractType, TestRunner}; @@ -36,27 +39,85 @@ pub const ASTROPORT_LIQUIDITY_HELPER_WASM_FILE: &str = "../../target/wasm32-unknown-unknown/release/astroport_liquidity_helper.wasm"; /// Creates test accounts and instantiates astroport contracts -pub fn setup_astroport(runner: &TestRunner) -> (Vec, AstroportContracts) { - let wasm = Wasm::new(runner); - let accs = runner - .init_accounts( - &[ - coin(1_000_000_000_000_000, "uluna"), - coin(1_000_000_000_000_000, "uosmo"), - ], - 2, - ) - .unwrap(); - let admin = &accs[0]; - - // Upload astroport contracts - let contracts = get_local_contracts(runner, &Some("tests/astroport-artifacts"), false, &None); - let astroport_code_ids = upload_wasm_files(runner, &accs[0], contracts).unwrap(); +// pub fn setup_astroport(runner: &TestRunner) -> (Vec, AstroportContracts) { +// let wasm = Wasm::new(runner); +// let accs = runner +// .init_accounts( +// &[ +// coin(1_000_000_000_000_000, "uluna"), +// coin(1_000_000_000_000_000, "uosmo"), +// ], +// 2, +// ) +// .unwrap(); +// let admin = &accs[0]; + +// // Upload astroport contracts +// let contracts = get_local_contracts(runner, &Some("tests/astroport-artifacts"), false, &None); +// let astroport_code_ids = upload_wasm_files(runner, &accs[0], contracts).unwrap(); + +// // Instantiate Astroport contracts +// let astroport_contracts = setup_astroport(app, contracts, admin); + +// // Update native coin registry with uluna precision +// wasm.execute( +// &astroport_contracts.coin_registry.address, +// &astroport::native_coin_registry::ExecuteMsg::Add { +// native_coins: vec![("uluna".to_string(), 6)], +// }, +// &[], +// admin, +// ) +// .unwrap(); + +// // Upload astroport pair xyk sale tax contract +// let sale_tax_contract = match runner { +// TestRunner::OsmosisTestApp(_) => ContractType::Artifact(Artifact::Local( +// ("tests/astroport-artifacts/astroport_pair_xyk_sale_tax.wasm").to_string(), +// )), +// TestRunner::MultiTest(_) => { +// ContractType::MultiTestContract(Box::new(ContractWrapper::new_with_empty( +// astroport_liquidity_helper::contract::execute, +// astroport_liquidity_helper::contract::instantiate, +// astroport_liquidity_helper::contract::query, +// ))) +// } +// _ => panic!("Unsupported runner"), +// }; +// let sale_tax_code_id = runner.store_code(sale_tax_contract, admin).unwrap(); + +// // Add XYK Sale Tax PairType to Astroport Factory +// wasm.execute( +// &astroport_contracts.factory.address, +// &FactoryExecuteMsg::UpdatePairConfig { +// config: PairConfig { +// code_id: sale_tax_code_id, +// is_disabled: false, +// is_generator_disabled: false, +// maker_fee_bps: 3333, +// total_fee_bps: 30, +// pair_type: PairType::Custom("astroport-pair-xyk-sale-tax".to_string()), +// }, +// }, +// &[], +// admin, +// ) +// .unwrap(); + +// (accs, astroport_contracts) +// } - // Instantiate Astroport contracts - let astroport_contracts = instantiate_astroport(runner, admin, &astroport_code_ids); +/// Instantiates the liquidity helper contract +pub fn setup_astroport_liquidity_provider_tests<'a>( + app: &'a TestRunner<'a>, + astroport_contracts: &AstroportContracts, + admin: &SigningAccount, +) -> LiquidityHelper +where +{ + let wasm = Wasm::new(app); - // Update native coin registry with uluna precision + // Set uluna precision in native coin registry wasm.execute( &astroport_contracts.coin_registry.address, &astroport::native_coin_registry::ExecuteMsg::Add { @@ -68,13 +129,21 @@ pub fn setup_astroport(runner: &TestRunner) -> (Vec, AstroportCo .unwrap(); // Upload astroport pair xyk sale tax contract - let sale_tax_contract = match runner { + let sale_tax_contract = match app { TestRunner::OsmosisTestApp(_) => ContractType::Artifact(Artifact::Local( ("tests/astroport-artifacts/astroport_pair_xyk_sale_tax.wasm").to_string(), )), + TestRunner::MultiTest(_) => ContractType::MultiTestContract(Box::new( + ContractWrapper::new_with_empty( + astroport_pair_xyk_sale_tax::contract::execute, + astroport_pair_xyk_sale_tax::contract::instantiate, + astroport_pair_xyk_sale_tax::contract::query, + ) + .with_reply(astroport_pair_xyk_sale_tax::contract::reply), + )), _ => panic!("Unsupported runner"), }; - let sale_tax_code_id = runner.store_code(sale_tax_contract, admin).unwrap(); + let sale_tax_code_id = app.store_code(sale_tax_contract, admin).unwrap(); // Add XYK Sale Tax PairType to Astroport Factory wasm.execute( @@ -94,30 +163,25 @@ pub fn setup_astroport(runner: &TestRunner) -> (Vec, AstroportCo ) .unwrap(); - (accs, astroport_contracts) -} - -/// Instantiates the liquidity helper contract -pub fn setup_astroport_liquidity_provider_tests<'a, R: Runner<'a>>( - app: &'a R, - accs: &[SigningAccount], - astroport_contracts: &AstroportContracts, -) -> LiquidityHelper -where -{ - let wasm = Wasm::new(app); - let admin = &accs[0]; - println!("Uploading liquidity helper wasm"); - // Load compiled wasm bytecode - let astroport_liquidity_helper_wasm_byte_code = - std::fs::read(ASTROPORT_LIQUIDITY_HELPER_WASM_FILE).unwrap(); - let astroport_liquidity_helper_code_id = wasm - .store_code(&astroport_liquidity_helper_wasm_byte_code, None, admin) - .unwrap() - .data - .code_id; + // Load compiled wasm bytecode or multi-test contract depending on the runner + let astroport_liquidity_helper_wasm_byte_code = match app { + TestRunner::OsmosisTestApp(_) => ContractType::Artifact(Artifact::Local( + ASTROPORT_LIQUIDITY_HELPER_WASM_FILE.to_string(), + )), + TestRunner::MultiTest(_) => { + ContractType::MultiTestContract(Box::new(ContractWrapper::new( + astroport_liquidity_helper::contract::execute, + astroport_liquidity_helper::contract::instantiate, + astroport_liquidity_helper::contract::query, + ))) + } + _ => panic!("Unsupported runner"), + }; + let astroport_liquidity_helper_code_id = app + .store_code(astroport_liquidity_helper_wasm_byte_code, admin) + .unwrap(); println!("Instantiating liquidity helper contract"); @@ -140,123 +204,129 @@ where LiquidityHelper::new(Addr::unchecked(astroport_liquidity_helper)) } -#[test] -pub fn test_calc_xyk_balancing_swap() { - let app = OsmosisTestApp::default(); - let runner = TestRunner::OsmosisTestApp(&app); - let (accs, astroport_contracts) = setup_astroport(&runner); - let wasm = Wasm::new(&runner); - let admin = &accs[0]; - - let astro_token = astroport_contracts.astro_token.address.clone(); - - // Create 1:1 XYK pool - let asset_infos: [AstroAssetInfo; 2] = [ - AstroAssetInfo::NativeToken { - denom: "uluna".into(), - }, - AstroAssetInfo::Token { - contract_addr: Addr::unchecked(&astro_token), - }, - ]; - let (uluna_astro_pair_addr, _) = create_astroport_pair( - &runner, - &astroport_contracts.factory.address, - PairType::Xyk {}, - asset_infos.clone(), - None, - admin, - None, - ); - - // Increase allowance of astro token for Pair contract - let increase_allowance_msg = Cw20ExecuteMsg::IncreaseAllowance { - spender: uluna_astro_pair_addr.clone(), - amount: Uint128::from(3_000_000_000_000u128), - expires: None, - }; - let _res = wasm - .execute(&astro_token, &increase_allowance_msg, &[], admin) - .unwrap(); - - // Provide liquidity - let provide_liq_msg = PairExecuteMsg::ProvideLiquidity { - assets: [ - AstroAsset { - amount: Uint128::from(1_000_000_000_000u128), - info: AstroAssetInfo::NativeToken { - denom: "uluna".into(), - }, - }, - AstroAsset { - amount: Uint128::from(3_000_000_000_000u128), - info: AstroAssetInfo::Token { - contract_addr: Addr::unchecked(&astro_token), - }, - }, - ] - .to_vec(), - slippage_tolerance: Some(Decimal::from_str("0.02").unwrap()), - auto_stake: Some(false), - receiver: None, - }; - let _res = wasm.execute( - &uluna_astro_pair_addr, - &provide_liq_msg, - &[Coin { - amount: Uint128::from(1_000_000_000_000u128), - denom: "uluna".into(), - }], - admin, - ); +// #[test] +// pub fn test_calc_xyk_balancing_swap() { +// let app = OsmosisTestApp::default(); +// let runner = TestRunner::OsmosisTestApp(&app); +// let (accs, astroport_contracts) = setup_astroport(&runner); +// let wasm = Wasm::new(&runner); +// let admin = &accs[0]; + +// let astro_token = astroport_contracts.astro_token.address.clone(); + +// // Create 1:1 XYK pool +// let asset_infos: [AstroAssetInfo; 2] = [ +// AstroAssetInfo::NativeToken { +// denom: "uluna".into(), +// }, +// AstroAssetInfo::Token { +// contract_addr: Addr::unchecked(&astro_token), +// }, +// ]; +// let (uluna_astro_pair_addr, _) = create_astroport_pair( +// &runner, +// &astroport_contracts.factory.address, +// PairType::Xyk {}, +// asset_infos.clone(), +// None, +// admin, +// None, +// ); + +// // Increase allowance of astro token for Pair contract +// let increase_allowance_msg = Cw20ExecuteMsg::IncreaseAllowance { +// spender: uluna_astro_pair_addr.clone(), +// amount: Uint128::from(3_000_000_000_000u128), +// expires: None, +// }; +// let _res = wasm +// .execute(&astro_token, &increase_allowance_msg, &[], admin) +// .unwrap(); + +// // Provide liquidity +// let provide_liq_msg = PairExecuteMsg::ProvideLiquidity { +// assets: [ +// AstroAsset { +// amount: Uint128::from(1_000_000_000_000u128), +// info: AstroAssetInfo::NativeToken { +// denom: "uluna".into(), +// }, +// }, +// AstroAsset { +// amount: Uint128::from(3_000_000_000_000u128), +// info: AstroAssetInfo::Token { +// contract_addr: Addr::unchecked(&astro_token), +// }, +// }, +// ] +// .to_vec(), +// slippage_tolerance: Some(Decimal::from_str("0.02").unwrap()), +// auto_stake: Some(false), +// receiver: None, +// }; +// let _res = wasm.execute( +// &uluna_astro_pair_addr, +// &provide_liq_msg, +// &[Coin { +// amount: Uint128::from(1_000_000_000_000u128), +// denom: "uluna".into(), +// }], +// admin, +// ); + +// // Query fee info +// let res: FeeInfoResponse = wasm +// .query( +// &astroport_contracts.factory.address, +// &FactoryQueryMsg::FeeInfo { +// pair_type: PairType::Xyk {}, +// }, +// ) +// .unwrap(); +// let total_fee_rate = Decimal::from_ratio(res.total_fee_bps, 10000u16); + +// // Calculate balancing swap +// let assets = [ +// Asset { +// amount: Uint128::from(1_000_000_000_000u128), +// info: AssetInfo::native("uluna".to_string()), +// }, +// Asset { +// amount: Uint128::from(1_000_000_000_000u128), +// info: AssetInfo::Cw20(Addr::unchecked(&astro_token)), +// }, +// ]; +// let reserves = [ +// Uint128::from(1_000_000_000_000u128), +// Uint128::from(3_000_000_000_000u128), +// ]; + +// let (offer_asset, return_asset) = +// calc_xyk_balancing_swap(mock_dependencies(), assets, reserves, total_fee_rate, None) +// .unwrap(); + +// // Simulate swap +// let simulation_result: SimulationResponse = wasm +// .query( +// &uluna_astro_pair_addr, +// &PairQueryMsg::Simulation { +// offer_asset: AstroAsset { +// amount: offer_asset.amount, +// info: asset_infos[0].clone(), +// }, +// ask_asset_info: Some(return_asset.info.into()), +// }, +// ) +// .unwrap(); + +// // Check if the simulation result is correct +// assert_eq!(simulation_result.return_amount, return_asset.amount); +// } - // Query fee info - let res: FeeInfoResponse = wasm - .query( - &astroport_contracts.factory.address, - &FactoryQueryMsg::FeeInfo { - pair_type: PairType::Xyk {}, - }, - ) - .unwrap(); - let total_fee_rate = Decimal::from_ratio(res.total_fee_bps, 10000u16); - - // Calculate balancing swap - let assets = [ - Asset { - amount: Uint128::from(1_000_000_000_000u128), - info: AssetInfo::native("uluna".to_string()), - }, - Asset { - amount: Uint128::from(1_000_000_000_000u128), - info: AssetInfo::Cw20(Addr::unchecked(&astro_token)), - }, - ]; - let reserves = [ - Uint128::from(1_000_000_000_000u128), - Uint128::from(3_000_000_000_000u128), - ]; - - let (offer_asset, return_asset) = - calc_xyk_balancing_swap(assets, reserves, total_fee_rate, None).unwrap(); - - // Simulate swap - let simulation_result: SimulationResponse = wasm - .query( - &uluna_astro_pair_addr, - &PairQueryMsg::Simulation { - offer_asset: AstroAsset { - amount: offer_asset.amount, - info: asset_infos[0].clone(), - }, - ask_asset_info: Some(return_asset.info.into()), - }, - ) - .unwrap(); +#[test] +pub fn test() {} - // Check if the simulation result is correct - assert_eq!(simulation_result.return_amount, return_asset.amount); -} +const TOLERANCE: &str = "0.0005"; // Test 1: 1:1 ratio, double amount of asset 2 #[test_matrix( @@ -337,14 +407,22 @@ pub fn test_balancing_provide_liquidity( pair_type: PairType, should_provide: bool, ) { - let app = OsmosisTestApp::default(); - let runner = TestRunner::OsmosisTestApp(&app); - let (accs, astroport_contracts) = &setup_astroport(&runner); - let admin = &accs[0]; - let wasm = Wasm::new(&runner); + let app = MultiTestRunner::new("terra"); + // let app = OsmosisTestApp::default(); + let runner = TestRunner::MultiTest(&app); + let astroport_contracts = + get_local_contracts(&runner, &Some("tests/astroport-artifacts"), false, &None); + let admin = runner + .init_account(&[ + coin(1_000_000_000_000_000, "uluna"), + coin(1_000_000_000_000_000, "uosmo"), + ]) + .unwrap(); + let astroport_contracts = &setup_astroport(&runner, astroport_contracts, &admin); + let wasm = Wasm::new(&runner); let liquidity_helper = - setup_astroport_liquidity_provider_tests(&runner, accs, astroport_contracts); + setup_astroport_liquidity_provider_tests(&runner, astroport_contracts, &admin); let astro_token = astroport_contracts.astro_token.address.clone(); // Create pool @@ -391,7 +469,7 @@ pub fn test_balancing_provide_liquidity( pair_type.clone(), asset_infos, init_params, - admin, + &admin, None, ); let pool = AstroportPool { @@ -412,7 +490,7 @@ pub fn test_balancing_provide_liquidity( expires: None, }; let _res = wasm - .execute(&astro_token, &increase_allowance_msg, &[], admin) + .execute(&astro_token, &increase_allowance_msg, &[], &admin) .unwrap(); // Query allowance @@ -448,6 +526,10 @@ pub fn test_balancing_provide_liquidity( auto_stake: Some(false), receiver: None, }; + println!( + "initial reserves {} uluna, {} astro", + reserves[0], reserves[1] + ); let _res = wasm.execute( &uluna_astro_pair_addr, &provide_liq_msg, @@ -455,7 +537,7 @@ pub fn test_balancing_provide_liquidity( amount: reserves[0], denom: "uluna".into(), }], - admin, + &admin, ); // Check pool liquidity after adding @@ -492,8 +574,9 @@ pub fn test_balancing_provide_liquidity( None, ) .unwrap(); + println!("msgs: {msgs:?}"); let _res = runner - .execute_cosmos_msgs::(&msgs, admin) + .execute_cosmos_msgs::(&msgs, &admin) .unwrap(); // Check pool liquidity after adding @@ -501,6 +584,7 @@ pub fn test_balancing_provide_liquidity( .query::<_, PoolResponse>(&uluna_astro_pair_addr, &PairQueryMsg::Pool {}) .unwrap() .assets; + // Check asset balances after balancing provide liquidity. let uluna_balance_after = query_token_balance(&runner, &admin.address(), "uluna"); let astro_balance_after = query_cw20_balance(&runner, admin.address(), &astro_token); @@ -510,12 +594,12 @@ pub fn test_balancing_provide_liquidity( assert_approx_eq!( pool_liquidity[0].amount, reserves[0] + asset_amounts[0], - "0.00000001" + TOLERANCE ); assert_approx_eq!( pool_liquidity[1].amount, reserves[1] + asset_amounts[1], - "0.00000001" + TOLERANCE ); // Should have used all assets From 44c03b3de2be2f1c25cfcc82ba828ca2a22b4b86 Mon Sep 17 00:00:00 2001 From: Pacman Date: Wed, 3 Apr 2024 17:21:12 -0700 Subject: [PATCH 17/42] test: add tests for BigDecimal BigInt arithmetic --- .../astroport-liquidity-helper/src/math.rs | 95 ++++++++++++++++++- 1 file changed, 93 insertions(+), 2 deletions(-) diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index 0dcd5e0..a6e6f56 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -277,6 +277,22 @@ pub mod big_decimal { } } + impl<'a> Add<&'a BigInt> for BigDecimal { + type Output = BigDecimal; + + fn add(self, rhs: &'a BigInt) -> Self::Output { + self + rhs.clone() + } + } + + impl<'a> Add for &'a BigInt { + type Output = BigDecimal; + + fn add(self, rhs: BigDecimal) -> Self::Output { + rhs + self.clone() + } + } + impl<'a, 'b> Add<&'a BigDecimal> for &'b BigInt { type Output = BigDecimal; @@ -349,6 +365,38 @@ pub mod big_decimal { } } + impl<'a> Sub for &'a BigDecimal { + type Output = BigDecimal; + + fn sub(self, rhs: BigInt) -> Self::Output { + BigDecimal(self.0.clone() - rhs * BIG_DECIMAL_FRACTIONAL) + } + } + + impl<'a> Sub<&'a BigInt> for BigDecimal { + type Output = BigDecimal; + + fn sub(self, rhs: &'a BigInt) -> Self::Output { + BigDecimal(self.0 - rhs.clone() * BIG_DECIMAL_FRACTIONAL) + } + } + + impl<'a> Sub for &'a BigInt { + type Output = BigDecimal; + + fn sub(self, rhs: BigDecimal) -> Self::Output { + BigDecimal(self.clone() * BIG_DECIMAL_FRACTIONAL - rhs.0) + } + } + + impl<'a> Sub<&'a BigDecimal> for BigInt { + type Output = BigDecimal; + + fn sub(self, rhs: &'a BigDecimal) -> Self::Output { + BigDecimal(self * BIG_DECIMAL_FRACTIONAL - rhs.0.clone()) + } + } + impl Div for BigDecimal { type Output = Self; @@ -447,8 +495,6 @@ pub mod big_decimal { use cw_bigint::BigInt; use test_case::test_case; - const BIG_DECIMAL_FRACTIONAL_I128: i128 = BIG_DECIMAL_FRACTIONAL as i128; - // #[test_case(0u128 => "0.000000000000000000"; "zero")] // #[test_case(BIG_DECIMAL_FRACTIONAL => "1.000000000000000000"; "one")] // fn test_bigdecimal_to_string(val: u128) -> String { @@ -549,6 +595,51 @@ pub mod big_decimal { fn test_bigdecimal_sqrt(val: i128) -> u128 { bigint_to_u128(&BigDecimal::new(val.into()).sqrt().atomics()).unwrap() } + + #[test_case(0, 0, 0; "zero plus zero")] + #[test_case(BIG_DECIMAL_FRACTIONAL, 0, BIG_DECIMAL_FRACTIONAL; "one plus zero")] + #[test_case(0, 1, BIG_DECIMAL_FRACTIONAL; "zero plus one")] + #[test_case(BIG_DECIMAL_FRACTIONAL, 1, 2 * BIG_DECIMAL_FRACTIONAL; "one plus one")] + fn test_bigdecimal_add_bigint(a: u128, b: u128, expected: u128) { + let a = BigDecimal::new(a.into()); + let b = BigInt::from(b); + let expected = BigDecimal::new(expected.into()); + assert_eq!(&a + &b, expected); + assert_eq!(&a + b.clone(), expected); + assert_eq!(a.clone() + &b, expected); + assert_eq!(a + b, expected); + } + + #[test_case(0, 0, 0; "zero minus zero")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128, 0, BIG_DECIMAL_FRACTIONAL as i128; "one minus zero")] + #[test_case(0, 1, -(BIG_DECIMAL_FRACTIONAL as i128); "zero minus one")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128, 1, 0; "one minus one")] + fn test_bigdecimal_sub_bigint(a: i128, b: i128, expected: i128) { + let a = BigDecimal::new(a.into()); + let b = BigInt::from(b); + let expected = BigDecimal::new(expected.into()); + assert_eq!(&a - &b, expected); + assert_eq!(&a - b.clone(), expected); + assert_eq!(a.clone() - &b, expected); + assert_eq!(a - b, expected); + } + + #[test_case(0, 0, 0; "zero times zero")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128, 0, 0; "one times zero")] + #[test_case(0, 1, 0; "zero times one")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128, 1, BIG_DECIMAL_FRACTIONAL as i128; "one times one")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128, -1, -(BIG_DECIMAL_FRACTIONAL as i128); "one times neg one")] + #[test_case(1, 1, 1; "10^-18 times one")] + #[test_case(-(BIG_DECIMAL_FRACTIONAL as i128), 1, -(BIG_DECIMAL_FRACTIONAL as i128); "neg one times one")] + fn test_bigdecimal_mul_bigint(a: i128, b: i128, expected: i128) { + let a = BigDecimal::new(a.into()); + let b = BigInt::from(b); + let expected = BigDecimal::new(expected.into()); + assert_eq!(&a * &b, expected); + assert_eq!(&a * b.clone(), expected); + assert_eq!(a.clone() * &b, expected); + assert_eq!(a * b, expected); + } } } From 02abaae3b89f33d026f66b82c3b465e90d4417c2 Mon Sep 17 00:00:00 2001 From: Pacman Date: Wed, 3 Apr 2024 17:34:23 -0700 Subject: [PATCH 18/42] test: uncomment outcommented tests --- .../src/contract.rs | 1 - .../astroport-liquidity-helper/src/math.rs | 331 +++++++++--------- 2 files changed, 165 insertions(+), 167 deletions(-) diff --git a/contracts/astroport-liquidity-helper/src/contract.rs b/contracts/astroport-liquidity-helper/src/contract.rs index 22d757e..5249e81 100644 --- a/contracts/astroport-liquidity-helper/src/contract.rs +++ b/contracts/astroport-liquidity-helper/src/contract.rs @@ -161,7 +161,6 @@ fn handle_xyk_balancing_provide_liquidity( // Calculate amount of tokens to swap let (offer_asset, return_asset) = calc_xyk_balancing_swap( - deps, assets_slice, [pool_reserves[0].amount, pool_reserves[1].amount], fee, diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index a6e6f56..085e2c5 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -676,13 +676,12 @@ fn constant_product_formula( /// and info of the asset we need to swap, and the asset that will be returned /// from the swap pub fn calc_xyk_balancing_swap( - deps: Deps, assets: [Asset; 2], reserves: [Uint128; 2], fee: Decimal, tax_configs: Option, ) -> StdResult<(Asset, Asset)> { - deps.api.debug("calc_xyk_balancing_swap"); + println!("calc_xyk_balancing_swap"); // Make sure there is liquidity in the pool if reserves[0].is_zero() || reserves[1].is_zero() { return Err(StdError::generic_err("No liquidity in pool")); @@ -721,7 +720,7 @@ pub fn calc_xyk_balancing_swap( .unwrap_or(Decimal::zero()); let tax_rate: &BigDecimal = &tax_rate_decimal.into(); - deps.api.debug("pre calcs"); + println!("pre calcs"); // Original formula: let two = &BigDecimal::from(2u128); @@ -756,7 +755,7 @@ pub fn calc_xyk_balancing_swap( // let x = (numerator + discriminant.sqrt()) / denominator; - deps.api.debug("x: {x}"); + println!("x: {x:?}"); // Divide by precision to get final result and convert to Uint128 let offer_amount: Uint128 = Uint128::try_from(x.floor().to_string().as_str())?; @@ -783,165 +782,165 @@ pub fn calc_xyk_balancing_swap( Ok((offer_asset, return_asset)) } -// #[cfg(test)] -// mod test { -// use apollo_cw_asset::{Asset, AssetInfo}; -// use cosmwasm_std::{testing::mock_dependencies, Decimal, Uint128}; -// use test_case::test_case; - -// use crate::math::calc_xyk_balancing_swap; - -// /// Assert that two Decimals are almost the same (diff smaller than one -// /// permille) -// fn assert_decimal_almost_eq(a: Decimal, b: Decimal) { -// let diff = if a > b { (a - b) / a } else { (b - a) / b }; -// let max_allowed_diff = Decimal::permille(2); -// if diff > max_allowed_diff { -// panic!("Failed assert decimal almost eq for a: {a}, b: {b}. diff: {diff}, max allowed: {max_allowed_diff}"); -// } -// } - -// // Assert that the ratio of the users assets is the same as the pool after the -// // swap -// fn assert_asset_ratios_same_after_swap( -// offer_reserve: Uint128, -// ask_reserve: Uint128, -// offer_balance: Uint128, -// ask_balance: Uint128, -// offer_amount: Uint128, -// return_amount: Uint128, -// ) { -// let asset_ratio_after_swap = -// Decimal::from_ratio(ask_balance + return_amount, offer_balance - offer_amount); -// let reserve_ratio_after_swap = -// Decimal::from_ratio(ask_reserve - return_amount, offer_reserve + offer_amount); -// println!( -// "asset_ratio_after_swap: {asset_ratio_after_swap}, reserve_ratio_after_swap: {reserve_ratio_after_swap}" -// ); -// assert_decimal_almost_eq(asset_ratio_after_swap, reserve_ratio_after_swap); -// } - -// #[test_case( -// [Uint128::from(1_000_000u128), Uint128::from(2_000_000u128)], -// [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], -// true, -// 1; -// "Test 1: 1:1 ratio, double amount of asset 2" -// )] -// #[test_case( -// [Uint128::from(1_000_000u128), Uint128::from(2_000_000u128)], -// [Uint128::from(1_000_000_000_000u128), Uint128::from(5_000_000_000_000u128)], -// true, -// 0; -// "Test 2: 1:5 ratio, double amount of asset 2" -// )] -// #[test_case( -// [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], -// [Uint128::from(1_000_000_000_000u128), Uint128::from(3_000_000_000_000u128)], -// true, -// 0; -// "Test 3: 1:3 pool ratio, 1:1 ratio of assets, but a lot of assets compared to pool (high slipage)" -// )] -// #[test_case( -// [Uint128::from(0u128), Uint128::from(1_000_000_000_000u128)], -// [Uint128::from(1_000_000_000_000u128), Uint128::from(2_000_000_000_000u128)], -// true, -// 1; -// "Test 4: 1:2 pool ratio, 0:1 ratio of assets" -// )] -// #[test_case( -// [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], -// [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], -// false, -// 1; -// "Test 5: 1:1 pool ratio, 1:1 ratio of assets" -// )] -// #[test_case( -// [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], -// [Uint128::from(1_000_000_000_000u128), Uint128::from(0u128)], -// false, -// 0 -// => panics "No liquidity in pool"; -// "Test 6: 1:0 pool ratio, should fail with correct error" -// )] -// #[test_case( -// [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], -// [Uint128::from(0u128), Uint128::from(1_000_000_000_000u128)], -// false, -// 0 -// => panics "No liquidity in pool"; -// "Test 7: 0:1 pool ratio, should fail with correct error" -// )] -// #[test_case( -// [Uint128::from(1_000_000_000_000u128), Uint128::from(0u128)], -// [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], -// true, -// 0; -// "Test 8: 1:1 pool ratio, 1:0 ratio of assets" -// )] -// #[test_case( -// [Uint128::from(0u128), Uint128::from(3564u128)], -// [Uint128::from(3450765745u128), Uint128::from(12282531965699u128)], -// true, -// 1; -// "Test 9: Amount of asset less than one microunit of other asset" -// )] -// fn test_calc_xyk_balancing_swap( -// assets: [Uint128; 2], -// reserves: [Uint128; 2], -// should_swap: bool, -// offer_asset_idx: usize, -// ) { -// let assets = [ -// Asset { -// amount: assets[0], -// info: AssetInfo::native("uatom".to_string()), -// }, -// Asset { -// amount: assets[1], -// info: AssetInfo::native("uosmo".to_string()), -// }, -// ]; -// let offer_asset = assets[offer_asset_idx].clone(); -// let ask_asset = assets[1 - offer_asset_idx].clone(); -// let offer_reserve = reserves[offer_asset_idx]; -// let ask_reserve = reserves[1 - offer_asset_idx]; - -// // Same fee for all test cases -// let fee = Decimal::permille(3); - -// println!("Assets: {assets:?}"); -// println!("Reserves: {reserves:?}"); - -// // Calculate swap -// let (swap_asset, return_asset) = -// calc_xyk_balancing_swap(mock_dependencies(), assets, reserves, fee, None).unwrap(); - -// println!("Swap: {swap_asset:?}, Return: {return_asset:?}"); - -// // If ratios are already almost the same, no swap should happen -// if !should_swap { -// assert_eq!(swap_asset.amount, Uint128::zero()); -// } - -// // Assert that the correct asset is being offered -// assert_eq!(swap_asset.info, offer_asset.info); - -// // If the amount returned is zero because the swapped amount is too small -// // then the following assert will fail, so we just return here -// if return_asset.amount == Uint128::zero() { -// return; -// } - -// // Assert that the asset ratio and the pool ratio are the same after the swap -// assert_asset_ratios_same_after_swap( -// offer_reserve, -// ask_reserve, -// offer_asset.amount, -// ask_asset.amount, -// swap_asset.amount, -// return_asset.amount, -// ); -// println!("------------------------------------"); -// } -// } +#[cfg(test)] +mod test { + use apollo_cw_asset::{Asset, AssetInfo}; + use cosmwasm_std::{testing::mock_dependencies, Decimal, Uint128}; + use test_case::test_case; + + use crate::math::calc_xyk_balancing_swap; + + /// Assert that two Decimals are almost the same (diff smaller than one + /// permille) + fn assert_decimal_almost_eq(a: Decimal, b: Decimal) { + let diff = if a > b { (a - b) / a } else { (b - a) / b }; + let max_allowed_diff = Decimal::permille(2); + if diff > max_allowed_diff { + panic!("Failed assert decimal almost eq for a: {a}, b: {b}. diff: {diff}, max allowed: {max_allowed_diff}"); + } + } + + // Assert that the ratio of the users assets is the same as the pool after the + // swap + fn assert_asset_ratios_same_after_swap( + offer_reserve: Uint128, + ask_reserve: Uint128, + offer_balance: Uint128, + ask_balance: Uint128, + offer_amount: Uint128, + return_amount: Uint128, + ) { + let asset_ratio_after_swap = + Decimal::from_ratio(ask_balance + return_amount, offer_balance - offer_amount); + let reserve_ratio_after_swap = + Decimal::from_ratio(ask_reserve - return_amount, offer_reserve + offer_amount); + println!( + "asset_ratio_after_swap: {asset_ratio_after_swap}, reserve_ratio_after_swap: {reserve_ratio_after_swap}" + ); + assert_decimal_almost_eq(asset_ratio_after_swap, reserve_ratio_after_swap); + } + + #[test_case( + [Uint128::from(1_000_000u128), Uint128::from(2_000_000u128)], + [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], + true, + 1; + "Test 1: 1:1 ratio, double amount of asset 2" + )] + #[test_case( + [Uint128::from(1_000_000u128), Uint128::from(2_000_000u128)], + [Uint128::from(1_000_000_000_000u128), Uint128::from(5_000_000_000_000u128)], + true, + 0; + "Test 2: 1:5 ratio, double amount of asset 2" + )] + #[test_case( + [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], + [Uint128::from(1_000_000_000_000u128), Uint128::from(3_000_000_000_000u128)], + true, + 0; + "Test 3: 1:3 pool ratio, 1:1 ratio of assets, but a lot of assets compared to pool (high slipage)" + )] + #[test_case( + [Uint128::from(0u128), Uint128::from(1_000_000_000_000u128)], + [Uint128::from(1_000_000_000_000u128), Uint128::from(2_000_000_000_000u128)], + true, + 1; + "Test 4: 1:2 pool ratio, 0:1 ratio of assets" + )] + #[test_case( + [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], + [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], + false, + 1; + "Test 5: 1:1 pool ratio, 1:1 ratio of assets" + )] + #[test_case( + [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], + [Uint128::from(1_000_000_000_000u128), Uint128::from(0u128)], + false, + 0 + => panics "No liquidity in pool"; + "Test 6: 1:0 pool ratio, should fail with correct error" + )] + #[test_case( + [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], + [Uint128::from(0u128), Uint128::from(1_000_000_000_000u128)], + false, + 0 + => panics "No liquidity in pool"; + "Test 7: 0:1 pool ratio, should fail with correct error" + )] + #[test_case( + [Uint128::from(1_000_000_000_000u128), Uint128::from(0u128)], + [Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)], + true, + 0; + "Test 8: 1:1 pool ratio, 1:0 ratio of assets" + )] + #[test_case( + [Uint128::from(0u128), Uint128::from(3564u128)], + [Uint128::from(3450765745u128), Uint128::from(12282531965699u128)], + true, + 1; + "Test 9: Amount of asset less than one microunit of other asset" + )] + fn test_calc_xyk_balancing_swap( + assets: [Uint128; 2], + reserves: [Uint128; 2], + should_swap: bool, + offer_asset_idx: usize, + ) { + let assets = [ + Asset { + amount: assets[0], + info: AssetInfo::native("uatom".to_string()), + }, + Asset { + amount: assets[1], + info: AssetInfo::native("uosmo".to_string()), + }, + ]; + let offer_asset = assets[offer_asset_idx].clone(); + let ask_asset = assets[1 - offer_asset_idx].clone(); + let offer_reserve = reserves[offer_asset_idx]; + let ask_reserve = reserves[1 - offer_asset_idx]; + + // Same fee for all test cases + let fee = Decimal::permille(3); + + println!("Assets: {assets:?}"); + println!("Reserves: {reserves:?}"); + + // Calculate swap + let (swap_asset, return_asset) = + calc_xyk_balancing_swap(assets, reserves, fee, None).unwrap(); + + println!("Swap: {swap_asset:?}, Return: {return_asset:?}"); + + // If ratios are already almost the same, no swap should happen + if !should_swap { + assert_eq!(swap_asset.amount, Uint128::zero()); + } + + // Assert that the correct asset is being offered + assert_eq!(swap_asset.info, offer_asset.info); + + // If the amount returned is zero because the swapped amount is too small + // then the following assert will fail, so we just return here + if return_asset.amount == Uint128::zero() { + return; + } + + // Assert that the asset ratio and the pool ratio are the same after the swap + assert_asset_ratios_same_after_swap( + offer_reserve, + ask_reserve, + offer_asset.amount, + ask_asset.amount, + swap_asset.amount, + return_asset.amount, + ); + println!("------------------------------------"); + } +} From 8d30743bfda4dcaeca3bdef9bbfdad0c4c1ef1b8 Mon Sep 17 00:00:00 2001 From: Pacman Date: Wed, 3 Apr 2024 17:55:34 -0700 Subject: [PATCH 19/42] wip --- contracts/astroport-liquidity-helper/src/math.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index 085e2c5..68843bf 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -701,6 +701,7 @@ pub fn calc_xyk_balancing_swap( } else { (1, 0) }; + let offer_reserve = &BigInt::from(reserves[offer_idx].u128()); let ask_reserve = &BigInt::from(reserves[ask_idx].u128()); let offer_balance = &BigInt::from(assets[offer_idx].amount.u128()); @@ -785,7 +786,7 @@ pub fn calc_xyk_balancing_swap( #[cfg(test)] mod test { use apollo_cw_asset::{Asset, AssetInfo}; - use cosmwasm_std::{testing::mock_dependencies, Decimal, Uint128}; + use cosmwasm_std::{Decimal, Uint128}; use test_case::test_case; use crate::math::calc_xyk_balancing_swap; From 331b74a07ef84c41827f7b816411a7c86720a058 Mon Sep 17 00:00:00 2001 From: Pacman Date: Wed, 3 Apr 2024 21:35:01 -0700 Subject: [PATCH 20/42] wip --- .../astroport-liquidity-helper/src/math.rs | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index 68843bf..cfa743c 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -54,19 +54,10 @@ pub mod big_decimal { let mut x = self.clone(); let mut y = (x.clone() + Self::one()) / BigDecimal::from(2u128); - println!( - "x: {}, y: {}", - u128::try_from(x.0.clone()).unwrap(), - u128::try_from(y.0.clone()).unwrap() - ); + while y < x { x = y.clone(); y = (x.clone() + self.clone() / x.clone()) / BigDecimal::from(2u128); - println!( - "x: {}, y: {}", - u128::try_from(x.0.clone()).unwrap(), - u128::try_from(y.0.clone()).unwrap() - ); } y } @@ -740,7 +731,7 @@ pub fn calc_xyk_balancing_swap( // let numerator = offer_reserve * ask_reserve * (fee_rate - fee_rate * tax_rate) // + (offer_balance + offer_reserve) * ask_reserve * fee_rate // - two * offer_reserve * (ask_balance + ask_reserve); - // deps.api.debug(&format!("numerator: {:?}", numerator)); + // println!("numerator: {:?}", numerator); // let discriminant = (two * offer_reserve * ask_balance - offer_balance * ask_reserve * fee_rate // + two * offer_reserve * ask_reserve * (BigDecimal::one() - fee_rate) // + offer_reserve * ask_reserve * fee_rate * tax_rate) @@ -748,18 +739,18 @@ pub fn calc_xyk_balancing_swap( // - four // * (ask_balance + ask_reserve + ask_reserve * (fee_rate * tax_rate - tax_rate)) // * (offer_reserve.pow(2) * ask_balance - offer_balance * offer_reserve * ask_reserve); - // deps.api.debug("discriminant: {discriminant}"); + // println!("discriminant: {discriminant:?}"); // let denominator = two // * (ask_balance + ask_reserve - ask_reserve * tax_rate + ask_reserve * fee_rate * tax_rate); - // deps.api.debug("denominator: {denominator}"); + // println!("denominator: {denominator:?}"); // let x = (numerator + discriminant.sqrt()) / denominator; println!("x: {x:?}"); // Divide by precision to get final result and convert to Uint128 - let offer_amount: Uint128 = Uint128::try_from(x.floor().to_string().as_str())?; + let offer_amount: Uint128 = bigint_to_u128(&x.floor())?.into(); let offer_asset = Asset { amount: offer_amount, info: assets[offer_idx].info.clone(), @@ -795,7 +786,7 @@ mod test { /// permille) fn assert_decimal_almost_eq(a: Decimal, b: Decimal) { let diff = if a > b { (a - b) / a } else { (b - a) / b }; - let max_allowed_diff = Decimal::permille(2); + let max_allowed_diff = Decimal::permille(1); if diff > max_allowed_diff { panic!("Failed assert decimal almost eq for a: {a}, b: {b}. diff: {diff}, max allowed: {max_allowed_diff}"); } From c0844bbf6bb3f97bd6b803e5cee959ecf177fae8 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:58:28 +0200 Subject: [PATCH 21/42] fix: Use original constant product formula from astroport --- .../astroport-liquidity-helper/src/math.rs | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index cfa743c..874d640 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -2,7 +2,7 @@ use apollo_cw_asset::Asset; use astroport_v3::pair_xyk_sale_tax::TaxConfigsChecked; -use cosmwasm_std::{Decimal, Deps, Int256, StdError, StdResult, Uint128, Uint256}; +use cosmwasm_std::{Decimal, Decimal256, Deps, Int256, StdError, StdResult, Uint128, Uint256}; use cw_bigint::BigInt; use crate::math::big_decimal::{bigint_to_u128, BigDecimal}; @@ -636,9 +636,9 @@ pub mod big_decimal { /// Calculate how much will be returned from a swap in a constant product pool fn constant_product_formula( - offer_reserve: &BigInt, - ask_reserve: &BigInt, - offer_amount: Uint128, + offer_reserve: Uint128, + ask_reserve: Uint128, + mut offer_amount: Uint128, fee: Decimal, tax_rate: Decimal, ) -> StdResult { @@ -647,18 +647,25 @@ fn constant_product_formula( "offer_reserve: {}, ask_reserve: {}, offer_amount: {offer_amount}, fee: {fee}", offer_reserve, ask_reserve ); - let cp = offer_reserve * ask_reserve; - let return_amount_bigint = - ask_reserve - cp / (offer_reserve + BigInt::from(offer_amount.u128())); - let return_amount: Uint128 = bigint_to_u128(&return_amount_bigint)?.into(); - println!("return_amount: {return_amount}"); - let commission_amount = return_amount * fee; + if !tax_rate.is_zero() { + let sale_tax = offer_amount * tax_rate; + offer_amount = offer_amount.checked_sub(sale_tax)?; + } + println!("offer_amount after tax: {offer_amount}"); + + let cp = offer_reserve.full_mul(ask_reserve); + let return_amount: Uint256 = (Decimal256::from_ratio(ask_reserve, 1u8) + - Decimal256::from_ratio(cp, offer_reserve + offer_amount)) + * Uint256::from(1u8); + println!("return_amount: {return_amount}"); + let commission_amount: Uint256 = return_amount * Decimal256::from(fee); println!("commission_amount: {commission_amount}"); - let return_amount = (return_amount - commission_amount) * (Decimal::one() - tax_rate); + let return_amount: Uint256 = return_amount - commission_amount; println!("return_amount after tax: {return_amount}"); - Ok(return_amount) + Ok(return_amount.try_into()?) } + /// For a constant product pool, calculates how much of one asset we need to /// swap to the other in order to have the same ratio of assets as the pool, so /// that we can then provide liquidity and get the most amount of LP tokens. @@ -758,8 +765,8 @@ pub fn calc_xyk_balancing_swap( // Calculate return amount from swap let return_amount = constant_product_formula( - offer_reserve, - ask_reserve, + reserves[offer_idx], + reserves[ask_idx], offer_amount, fee, tax_rate_decimal, From 4cd32fb81e4e5d529cc7a5484fc74a95c5e52f15 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Mon, 8 Apr 2024 14:06:39 +0200 Subject: [PATCH 22/42] fix: correct test case expected result --- contracts/astroport-liquidity-helper/src/math.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index 874d640..7e8af29 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -581,7 +581,7 @@ pub mod big_decimal { #[test_case(0i128 => 0 ; "zero")] #[test_case(BIG_DECIMAL_FRACTIONAL as i128 => BIG_DECIMAL_FRACTIONAL ; "one")] #[test_case(100 * BIG_DECIMAL_FRACTIONAL as i128 => 10 * BIG_DECIMAL_FRACTIONAL ; "one hundred")] - #[test_case(2 * BIG_DECIMAL_FRACTIONAL as i128 => 1414213562373095145u128 ; "two")] + #[test_case(2 * BIG_DECIMAL_FRACTIONAL as i128 => 1414213562373095048u128 ; "two")] #[test_case(-(BIG_DECIMAL_FRACTIONAL as i128) => panics "Cannot compute the square root of a negative number." ; "negative one")] fn test_bigdecimal_sqrt(val: i128) -> u128 { bigint_to_u128(&BigDecimal::new(val.into()).sqrt().atomics()).unwrap() From c9ed83c12ea449d0d6fcbee869c8e37b3ed7e094 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Mon, 8 Apr 2024 14:07:38 +0200 Subject: [PATCH 23/42] style: clippy fmt --- .../astroport-liquidity-helper/src/math.rs | 47 ++++++++++--------- .../tests/astroport_integration_tests.rs | 26 ++++------ 2 files changed, 35 insertions(+), 38 deletions(-) diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index 7e8af29..514ecb4 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -2,16 +2,14 @@ use apollo_cw_asset::Asset; use astroport_v3::pair_xyk_sale_tax::TaxConfigsChecked; -use cosmwasm_std::{Decimal, Decimal256, Deps, Int256, StdError, StdResult, Uint128, Uint256}; +use cosmwasm_std::{Decimal, Decimal256, StdError, StdResult, Uint128, Uint256}; use cw_bigint::BigInt; use crate::math::big_decimal::{bigint_to_u128, BigDecimal}; pub mod big_decimal { - use std::{ - fmt::Display, - ops::{Add, Deref, Div, Mul, Sub}, - }; + + use std::ops::{Add, Div, Mul, Sub}; use cosmwasm_std::{Decimal, Fraction, StdError, StdResult, Uint128}; use cw_bigint::BigInt; @@ -70,10 +68,11 @@ pub mod big_decimal { return self.clone(); } - // BigDecimal is a fixed-point number with BIG_DECIMAL_FRACTIONAL decimal places. - // x^y = (numerator / denominator)^y = numerator^y / denominator^y - // = (numerator^y / denominator^(y-1)) / denominator - // which means we represent the new number as new_numerator = numerator^y / denominator^(y-1), + // BigDecimal is a fixed-point number with BIG_DECIMAL_FRACTIONAL decimal + // places. x^y = (numerator / denominator)^y = numerator^y / + // denominator^y = (numerator^y / denominator^(y-1)) / + // denominator which means we represent the new number as + // new_numerator = numerator^y / denominator^(y-1), // and new_denominator = denominator. let value: BigInt = self.0.pow(exp) / BIG_DECIMAL_FRACTIONAL.pow(exp - 1); @@ -92,11 +91,11 @@ pub mod big_decimal { // if str_len <= 18 { // // Pad with zeros if length is less than 18 // let num_of_zeroes = 18 - str_len; - // write!(f, "0.{}{}", "0".repeat(num_of_zeroes), bigint_decimal_str) - // } else { - // let (integer_part, fractional_part) = bigint_decimal_str.split_at(str_len - 18); - // write!(f, "{}.{}", integer_part, fractional_part) - // } + // write!(f, "0.{}{}", "0".repeat(num_of_zeroes), + // bigint_decimal_str) } else { + // let (integer_part, fractional_part) = + // bigint_decimal_str.split_at(str_len - 18); write!(f, "{}.{}", + // integer_part, fractional_part) } // } // } @@ -657,7 +656,7 @@ fn constant_product_formula( let return_amount: Uint256 = (Decimal256::from_ratio(ask_reserve, 1u8) - Decimal256::from_ratio(cp, offer_reserve + offer_amount)) * Uint256::from(1u8); - println!("return_amount: {return_amount}"); + println!("return_amount: {return_amount}"); let commission_amount: Uint256 = return_amount * Decimal256::from(fee); println!("commission_amount: {commission_amount}"); let return_amount: Uint256 = return_amount - commission_amount; @@ -665,7 +664,6 @@ fn constant_product_formula( Ok(return_amount.try_into()?) } - /// For a constant product pool, calculates how much of one asset we need to /// swap to the other in order to have the same ratio of assets as the pool, so /// that we can then provide liquidity and get the most amount of LP tokens. @@ -717,7 +715,7 @@ pub fn calc_xyk_balancing_swap( .unwrap_or(Decimal::zero()) }) .unwrap_or(Decimal::zero()); - let tax_rate: &BigDecimal = &tax_rate_decimal.into(); + let _tax_rate: &BigDecimal = &tax_rate_decimal.into(); println!("pre calcs"); @@ -735,20 +733,25 @@ pub fn calc_xyk_balancing_swap( // Solve equation to find amount to swap // let two = &BigDecimal::from(2u128); // let four = two * two; - // let numerator = offer_reserve * ask_reserve * (fee_rate - fee_rate * tax_rate) + // let numerator = offer_reserve * ask_reserve * (fee_rate - fee_rate * + // tax_rate) // + (offer_balance + offer_reserve) * ask_reserve * fee_rate // - two * offer_reserve * (ask_balance + ask_reserve); // println!("numerator: {:?}", numerator); - // let discriminant = (two * offer_reserve * ask_balance - offer_balance * ask_reserve * fee_rate + // let discriminant = (two * offer_reserve * ask_balance - offer_balance * + // ask_reserve * fee_rate // + two * offer_reserve * ask_reserve * (BigDecimal::one() - fee_rate) // + offer_reserve * ask_reserve * fee_rate * tax_rate) // .pow(2) // - four - // * (ask_balance + ask_reserve + ask_reserve * (fee_rate * tax_rate - tax_rate)) - // * (offer_reserve.pow(2) * ask_balance - offer_balance * offer_reserve * ask_reserve); + // * (ask_balance + ask_reserve + ask_reserve * (fee_rate * tax_rate - + // tax_rate)) + // * (offer_reserve.pow(2) * ask_balance - offer_balance * offer_reserve + // * ask_reserve); // println!("discriminant: {discriminant:?}"); // let denominator = two - // * (ask_balance + ask_reserve - ask_reserve * tax_rate + ask_reserve * fee_rate * tax_rate); + // * (ask_balance + ask_reserve - ask_reserve * tax_rate + ask_reserve * + // fee_rate * tax_rate); // println!("denominator: {denominator:?}"); diff --git a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs index dfae83d..d304502 100644 --- a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs +++ b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs @@ -1,26 +1,22 @@ use apollo_cw_asset::{Asset, AssetInfo, AssetList}; -use astroport_liquidity_helper::math::calc_xyk_balancing_swap; + use astroport_liquidity_helper::msg::InstantiateMsg; use cosmwasm_std::{assert_approx_eq, coin, to_json_binary, Addr, Coin, Decimal, Uint128}; use cw20::{AllowanceResponse, BalanceResponse, Cw20ExecuteMsg, Cw20QueryMsg}; use cw_dex_astroport::astroport::asset::{Asset as AstroAsset, AssetInfo as AstroAssetInfo}; -use cw_dex_astroport::astroport::factory::{ - ExecuteMsg as FactoryExecuteMsg, FeeInfoResponse, PairType, QueryMsg as FactoryQueryMsg, -}; +use cw_dex_astroport::astroport::factory::{ExecuteMsg as FactoryExecuteMsg, PairType}; use cw_dex_astroport::astroport::pair::{ - ExecuteMsg as PairExecuteMsg, PoolResponse, QueryMsg as PairQueryMsg, SimulationResponse, - StablePoolParams, + ExecuteMsg as PairExecuteMsg, PoolResponse, QueryMsg as PairQueryMsg, StablePoolParams, }; use cw_dex_astroport::astroport::pair_concentrated::ConcentratedPoolParams; use cw_dex_astroport::{astroport, AstroportPool}; use cw_it::astroport::astroport::factory::PairConfig; use cw_it::astroport::astroport_v3::pair_xyk_sale_tax::{SaleTaxInitParams, TaxConfig}; use cw_it::astroport::utils::{ - create_astroport_pair, get_local_contracts, instantiate_astroport, setup_astroport, - AstroportContracts, + create_astroport_pair, get_local_contracts, setup_astroport, AstroportContracts, }; use cw_it::cw_multi_test::ContractWrapper; -use cw_it::helpers::upload_wasm_files; + use cw_it::multi_test::MultiTestRunner; use cw_it::osmosis_test_tube::osmosis_std::types::cosmos::bank::v1beta1::QueryBalanceRequest; use cw_it::traits::CwItRunner; @@ -29,9 +25,7 @@ use liquidity_helper::LiquidityHelper; use test_case::test_matrix; use cw_it::osmosis_test_tube::cosmrs::proto::cosmwasm::wasm::v1::MsgExecuteContractResponse; -use cw_it::osmosis_test_tube::{ - Account, Bank, Module, OsmosisTestApp, Runner, SigningAccount, Wasm, -}; +use cw_it::osmosis_test_tube::{Account, Bank, Module, Runner, SigningAccount, Wasm}; use std::str::FromStr; @@ -53,8 +47,8 @@ pub const ASTROPORT_LIQUIDITY_HELPER_WASM_FILE: &str = // let admin = &accs[0]; // // Upload astroport contracts -// let contracts = get_local_contracts(runner, &Some("tests/astroport-artifacts"), false, &None); -// let astroport_code_ids = upload_wasm_files(runner, &accs[0], contracts).unwrap(); +// let contracts = get_local_contracts(runner, &Some("tests/astroport-artifacts"), false, +// &None); let astroport_code_ids = upload_wasm_files(runner, &accs[0], contracts).unwrap(); // // Instantiate Astroport contracts // let astroport_contracts = setup_astroport(app, contracts, admin); @@ -302,8 +296,8 @@ where // ]; // let (offer_asset, return_asset) = -// calc_xyk_balancing_swap(mock_dependencies(), assets, reserves, total_fee_rate, None) -// .unwrap(); +// calc_xyk_balancing_swap(mock_dependencies(), assets, reserves, +// total_fee_rate, None) .unwrap(); // // Simulate swap // let simulation_result: SimulationResponse = wasm From 25f9627898eb4ce15cc148b8f43e698fded63c5c Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Mon, 8 Apr 2024 14:49:01 +0200 Subject: [PATCH 24/42] fix: don't put xyk logic in own function --- .../src/contract.rs | 315 ++++++++---------- 1 file changed, 144 insertions(+), 171 deletions(-) diff --git a/contracts/astroport-liquidity-helper/src/contract.rs b/contracts/astroport-liquidity-helper/src/contract.rs index 5249e81..4f2c0df 100644 --- a/contracts/astroport-liquidity-helper/src/contract.rs +++ b/contracts/astroport-liquidity-helper/src/contract.rs @@ -84,155 +84,6 @@ pub fn execute( } } -fn handle_xyk_balancing_provide_liquidity( - deps: Deps, - env: &Env, - info: MessageInfo, - pool: &AstroportPool, - assets: &mut AssetList, - min_out: Uint128, -) -> Result { - deps.api.debug("handle_xyk_balancing_provide_liquidity"); - println!("assets before: {:?}", assets); - let pool_res = pool.query_pool_info(&deps.querier)?; - - let pool_reserves: [Asset; 2] = [ - Asset::from(pool_res.assets[0].clone()), - Asset::from(pool_res.assets[1].clone()), - ]; - if assets.len() > 2 { - return Err(ContractError::MoreThanTwoAssets {}); - } - - // If only one asset is provided in the AssetList, we need to - // create the other asset with an empty amount - let assets_slice: [Asset; 2] = [ - assets - .find(&pool_reserves[0].info) - .cloned() - .unwrap_or_else(|| Asset { - info: pool_reserves[0].info.clone(), - amount: Uint128::zero(), - }), - assets - .find(&pool_reserves[1].info) - .cloned() - .unwrap_or_else(|| Asset { - info: pool_reserves[1].info.clone(), - amount: Uint128::zero(), - }), - ]; - - // Get fee amount - let fee_info = query_fee_info( - &deps.querier, - ASTROPORT_FACTORY.load(deps.storage)?, - pool.pair_type.clone(), - )?; - let fee = fee_info.total_fee_rate; - - // Get sale tax if applicable - let tax_configs: Option> = match &pool.pair_type { - PairType::Custom(t) => match t.as_str() { - "astroport-pair-xyk-sale-tax" => { - let config: ConfigResponse = deps - .querier - .query_wasm_smart(&pool.pair_addr, &PairQueryMsg::Config {})?; - let astro_asset_infos: Vec = pool - .pool_assets - .iter() - .map(|x| match x { - AssetInfo::Cw20(addr) => AstroV3AssetInfo::cw20(addr.clone()), - AssetInfo::Native(denom) => AstroV3AssetInfo::native(denom), - }) - .collect(); - let sale_tax_params: SaleTaxInitParams = from_json(config.params.unwrap())?; - let tax_configs = sale_tax_params - .tax_configs - .check(deps.api, &astro_asset_infos)?; - Some(tax_configs) - } - _ => None, - }, - _ => None, - }; - - println!("tax_configs: {:?}", tax_configs); - - // Calculate amount of tokens to swap - let (offer_asset, return_asset) = calc_xyk_balancing_swap( - assets_slice, - [pool_reserves[0].amount, pool_reserves[1].amount], - fee, - tax_configs, - )?; - - deps.api.debug(&format!("assets: {}", &assets.to_string())); - - // Update balances for liquidity provision - assets.add(&return_asset)?; - assets.deduct(&offer_asset)?; - - println!("assets after: {:?}", assets); - println!("offer_asset: {:?}", offer_asset); - println!("return_asset: {:?}", return_asset); - - deps.api.debug("post deduction"); - - // If either of the assets are still zero after the swap, we can't - // provide liquidity. This can happen if the amount of tokens to swap - // is so small that the returned amount of the other asset would be zero. - if pool.pool_assets.iter().any(|x| { - assets - .find(x) - .map_or_else(Uint128::zero, |y| y.amount) - .is_zero() - }) { - if min_out.is_zero() { - // If min_out is zero, we can just return the received native - // assets. We don't need to return any Cw20 assets, because - // we did not execute the transferFrom on them. If no native - // assets were received, we don't need to return anything. - let event = - Event::new("apollo/astroport-liquidity-helper/execute_balancing_provide_liquidity") - .add_attribute("action", "No liquidity provided. Zero amount of asset") - .add_attribute("assets", assets.to_string()) - .add_attribute("min_out", min_out); - if !info.funds.is_empty() { - let return_msg = CosmosMsg::Bank(BankMsg::Send { - to_address: info.sender.to_string(), - amount: info.funds, - }); - return Ok(Response::new().add_message(return_msg).add_event(event)); - } else { - return Ok(Response::new().add_event(event)); - } - } else { - // If min_out is not zero, we need to return an error - return Err(ContractError::MinOutNotReceived { - min_out, - received: Uint128::zero(), - }); - } - } - - println!("offer_asset: {:?}", offer_asset); - println!("return_asset: {:?}", return_asset); - - // Create message to swap some of the asset to the other - if offer_asset.amount > Uint128::zero() && return_asset.amount > Uint128::zero() { - Ok(pool.swap( - deps, - env, - offer_asset, - return_asset.info.clone(), - Uint128::one(), - )?) - } else { - Ok(Response::new()) - } -} - pub fn execute_balancing_provide_liquidity( deps: DepsMut, env: Env, @@ -243,6 +94,8 @@ pub fn execute_balancing_provide_liquidity( recipient: Option, ) -> Result { println!("execute_balancing_provide_liquidity"); + println!("info.funds: {:?}", info.funds); + println!("assets: {:?}", assets); // Get response with message to do TransferFrom on any Cw20s and assert that // native tokens have been received already. let receive_res = receive_assets(&info, &env, &assets)?; @@ -258,32 +111,152 @@ pub fn execute_balancing_provide_liquidity( // For XYK pools we need to swap some amount of one asset into the other before // we provide liquidity. For other types we can just provide liquidity // directly. - let swap_res = match &pool.pair_type { - PairType::Xyk {} => handle_xyk_balancing_provide_liquidity( - deps.as_ref(), - &env, - info, - &pool, - &mut assets, - min_out, - )?, - PairType::Stable {} => Response::new(), - PairType::Custom(t) => match t.as_str() { - "concentrated" => Response::new(), - "astroport-pair-xyk-sale-tax" => handle_xyk_balancing_provide_liquidity( + let is_xyk = match &pool.pair_type { + PairType::Xyk {} => true, + PairType::Custom(t) if t == "astroport-pair-xyk-sale-tax" => true, + _ => false, + }; + let swap_res = if is_xyk { + let pool_res = pool.query_pool_info(&deps.querier)?; + + let pool_reserves: [Asset; 2] = [ + Asset::from(pool_res.assets[0].clone()), + Asset::from(pool_res.assets[1].clone()), + ]; + if assets.len() > 2 { + return Err(ContractError::MoreThanTwoAssets {}); + } + + // If only one asset is provided in the AssetList, we need to + // create the other asset with an empty amount + let assets_slice: [Asset; 2] = [ + assets + .find(&pool_reserves[0].info) + .cloned() + .unwrap_or_else(|| Asset { + info: pool_reserves[0].info.clone(), + amount: Uint128::zero(), + }), + assets + .find(&pool_reserves[1].info) + .cloned() + .unwrap_or_else(|| Asset { + info: pool_reserves[1].info.clone(), + amount: Uint128::zero(), + }), + ]; + + // Get fee amount + let fee_info = query_fee_info( + &deps.querier, + ASTROPORT_FACTORY.load(deps.storage)?, + pool.pair_type.clone(), + )?; + let fee = fee_info.total_fee_rate; + + // Get sale tax if applicable + let tax_configs: Option> = match &pool.pair_type { + PairType::Custom(t) => match t.as_str() { + "astroport-pair-xyk-sale-tax" => { + let config: ConfigResponse = deps + .querier + .query_wasm_smart(&pool.pair_addr, &PairQueryMsg::Config {})?; + let astro_asset_infos: Vec = pool + .pool_assets + .iter() + .map(|x| match x { + AssetInfo::Cw20(addr) => AstroV3AssetInfo::cw20(addr.clone()), + AssetInfo::Native(denom) => AstroV3AssetInfo::native(denom), + }) + .collect(); + let sale_tax_params: SaleTaxInitParams = from_json(config.params.unwrap())?; + let tax_configs = sale_tax_params + .tax_configs + .check(deps.api, &astro_asset_infos)?; + Some(tax_configs) + } + _ => None, + }, + _ => None, + }; + + println!("tax_configs: {:?}", tax_configs); + + // Calculate amount of tokens to swap + let (offer_asset, return_asset) = calc_xyk_balancing_swap( + assets_slice, + [pool_reserves[0].amount, pool_reserves[1].amount], + fee, + tax_configs, + )?; + + deps.api.debug(&format!("assets: {}", &assets.to_string())); + // Update balances for liquidity provision + assets.add(&return_asset)?; + assets.deduct(&offer_asset)?; + + println!("assets after: {:?}", assets); + println!("offer_asset: {:?}", offer_asset); + println!("return_asset: {:?}", return_asset); + + deps.api.debug("post deduction"); + + // If either of the assets are still zero after the swap, we can't + // provide liquidity. This can happen if the amount of tokens to swap + // is so small that the returned amount of the other asset would be zero. + if pool.pool_assets.iter().any(|x| { + assets + .find(x) + .map_or_else(Uint128::zero, |y| y.amount) + .is_zero() + }) { + println!("pool_assets: {:?}", pool.pool_assets); + if min_out.is_zero() { + // If min_out is zero, we can just return the received native + // assets. We don't need to return any Cw20 assets, because + // we did not execute the transferFrom on them. If no native + // assets were received, we don't need to return anything. + let event = + Event::new("apollo/astroport-liquidity-helper/execute_balancing_provide_liquidity") + .add_attribute("action", "No liquidity provided. Zero amount of asset") + .add_attribute("assets", assets.to_string()) + .add_attribute("min_out", min_out); + if !info.funds.is_empty() { + let return_msg = CosmosMsg::Bank(BankMsg::Send { + to_address: info.sender.to_string(), + amount: info.funds, + }); + return Ok(Response::new().add_message(return_msg).add_event(event)); + } else { + return Ok(Response::new().add_event(event)); + } + } else { + // If min_out is not zero, we need to return an error + return Err(ContractError::MinOutNotReceived { + min_out, + received: Uint128::zero(), + }); + } + } + + println!("pool_assets 2: {:?}", pool.pool_assets); + + // Create message to swap some of the asset to the other + if offer_asset.amount > Uint128::zero() && return_asset.amount > Uint128::zero() { + pool.swap( deps.as_ref(), &env, - info, - &pool, - &mut assets, - min_out, - )?, - _ => return Err(ContractError::UnsupportedPairType {}), - }, + offer_asset, + return_asset.info.clone(), + Uint128::one(), + )? + } else { + Response::new() + } + } else { + Response::new() }; - println!("swap_res: {:?}", swap_res); - // For stableswap and concentrated liquidity pools we are allowed to provide // liquidity in any ratio, so we simply provide liquidity with all passed // assets. From 251fb5a0b92ab38ad0916a3c5fb4fbc93daea243 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Mon, 8 Apr 2024 14:49:27 +0200 Subject: [PATCH 25/42] fix: Only return funds if there are some --- .../src/contract.rs | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/contracts/astroport-liquidity-helper/src/contract.rs b/contracts/astroport-liquidity-helper/src/contract.rs index 4f2c0df..a0a9e68 100644 --- a/contracts/astroport-liquidity-helper/src/contract.rs +++ b/contracts/astroport-liquidity-helper/src/contract.rs @@ -214,22 +214,24 @@ pub fn execute_balancing_provide_liquidity( if min_out.is_zero() { // If min_out is zero, we can just return the received native // assets. We don't need to return any Cw20 assets, because - // we did not execute the transferFrom on them. If no native - // assets were received, we don't need to return anything. - let event = - Event::new("apollo/astroport-liquidity-helper/execute_balancing_provide_liquidity") - .add_attribute("action", "No liquidity provided. Zero amount of asset") - .add_attribute("assets", assets.to_string()) - .add_attribute("min_out", min_out); - if !info.funds.is_empty() { - let return_msg = CosmosMsg::Bank(BankMsg::Send { + // we did not execute the transferFrom on them. + let event = Event::new( + "apollo/astroport-liquidity-helper/execute_balancing_provide_liquidity", + ) + .add_attribute("action", "No liquidity provided. Zero amount of asset") + .add_attribute("assets", assets.to_string()) + .add_attribute("min_out", min_out); + println!("event: {:?}", event); + + // Can only return funds if there are some + let mut res = Response::new().add_event(event); + if &info.funds.len() > &0 { + res = res.add_message(CosmosMsg::Bank(BankMsg::Send { to_address: info.sender.to_string(), amount: info.funds, - }); - return Ok(Response::new().add_message(return_msg).add_event(event)); - } else { - return Ok(Response::new().add_event(event)); + })); } + return Ok(res); } else { // If min_out is not zero, we need to return an error return Err(ContractError::MinOutNotReceived { From e9449cbeb5337df1cdc957909acad645fa64a00f Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Tue, 9 Apr 2024 09:59:02 +0200 Subject: [PATCH 26/42] fix: account for tax in tests --- .../tests/astroport_integration_tests.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs index d304502..083cb3e 100644 --- a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs +++ b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs @@ -320,7 +320,7 @@ where #[test] pub fn test() {} -const TOLERANCE: &str = "0.0005"; +const TOLERANCE: &str = "0.000002"; // Test 1: 1:1 ratio, double amount of asset 2 #[test_matrix( @@ -412,6 +412,7 @@ pub fn test_balancing_provide_liquidity( coin(1_000_000_000_000_000, "uosmo"), ]) .unwrap(); + let tax_recipient = runner.init_account(&[]).unwrap(); let astroport_contracts = &setup_astroport(&runner, astroport_contracts, &admin); let wasm = Wasm::new(&runner); @@ -446,7 +447,7 @@ pub fn test_balancing_provide_liquidity( "uluna", TaxConfig { tax_rate: Decimal::percent(3), - tax_recipient: admin.address(), + tax_recipient: tax_recipient.address(), }, )] .into(), @@ -583,16 +584,18 @@ pub fn test_balancing_provide_liquidity( let uluna_balance_after = query_token_balance(&runner, &admin.address(), "uluna"); let astro_balance_after = query_cw20_balance(&runner, admin.address(), &astro_token); if should_provide { + let uluna_tax_amount = query_token_balance(&runner, &tax_recipient.address(), "uluna"); + let astro_tax_amount = query_cw20_balance(&runner, tax_recipient.address(), &astro_token); // Astroport liquidity manager rounds down the amount of tokens sent to the pool // by one unit. assert_approx_eq!( pool_liquidity[0].amount, - reserves[0] + asset_amounts[0], + reserves[0] + asset_amounts[0] - uluna_tax_amount, TOLERANCE ); assert_approx_eq!( pool_liquidity[1].amount, - reserves[1] + asset_amounts[1], + reserves[1] + asset_amounts[1] - astro_tax_amount, TOLERANCE ); From b9b97aded1c3f5b7ef59b902b7747489a1b99724 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Tue, 9 Apr 2024 10:04:31 +0200 Subject: [PATCH 27/42] fix: incorrect test case --- .../tests/astroport_integration_tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs index 083cb3e..b0757f8 100644 --- a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs +++ b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs @@ -376,7 +376,7 @@ const TOLERANCE: &str = "0.000002"; #[test_matrix( [[Uint128::from(0u128), Uint128::from(3564u128)]], [[Uint128::from(3450765745u128), Uint128::from(12282531965699u128)]], - [PairType::Stable { }, PairType::Custom("concentrated".to_string()), PairType::Custom("astroport-pair-xyk-sale-tax".to_string())], + [PairType::Stable { }, PairType::Custom("concentrated".to_string())], true )] // Test 8: Xyk 0:0 pool ratio, should fail with correct error From 256ddaebc5777b937da88f0550dffde5841ed7b4 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Tue, 9 Apr 2024 10:09:08 +0200 Subject: [PATCH 28/42] feat: use new equation --- .../astroport-liquidity-helper/src/math.rs | 63 +++++++++---------- 1 file changed, 29 insertions(+), 34 deletions(-) diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index 514ecb4..220c4ed 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -715,47 +715,42 @@ pub fn calc_xyk_balancing_swap( .unwrap_or(Decimal::zero()) }) .unwrap_or(Decimal::zero()); - let _tax_rate: &BigDecimal = &tax_rate_decimal.into(); + let tax_rate: &BigDecimal = &tax_rate_decimal.into(); println!("pre calcs"); // Original formula: - let two = &BigDecimal::from(2u128); - let a = ask_reserve + ask_balance; - let b = two * offer_reserve * (ask_reserve + ask_balance) - - ((offer_reserve + offer_balance) * ask_reserve * fee_rate); - let c = offer_reserve * (offer_reserve * ask_balance - offer_balance * ask_reserve); - let discriminant = &b * &b - (two * two * &a * &c); - // We know that for this equation, there is only one positive real solution - let x = (discriminant.sqrt() - b) / (two * a); + // let two = &BigDecimal::from(2u128); + // let a = ask_reserve + ask_balance; + // let b = two * offer_reserve * (ask_reserve + ask_balance) + // - ((offer_reserve + offer_balance) * ask_reserve * fee_rate); + // let c = offer_reserve * (offer_reserve * ask_balance - offer_balance * + // ask_reserve); let discriminant = &b * &b - (two * two * &a * &c); + // // We know that for this equation, there is only one positive real solution + // let x = (discriminant.sqrt() - b) / (two * a); // New formula including tax: // Solve equation to find amount to swap - // let two = &BigDecimal::from(2u128); - // let four = two * two; - // let numerator = offer_reserve * ask_reserve * (fee_rate - fee_rate * - // tax_rate) - // + (offer_balance + offer_reserve) * ask_reserve * fee_rate - // - two * offer_reserve * (ask_balance + ask_reserve); - // println!("numerator: {:?}", numerator); - // let discriminant = (two * offer_reserve * ask_balance - offer_balance * - // ask_reserve * fee_rate - // + two * offer_reserve * ask_reserve * (BigDecimal::one() - fee_rate) - // + offer_reserve * ask_reserve * fee_rate * tax_rate) - // .pow(2) - // - four - // * (ask_balance + ask_reserve + ask_reserve * (fee_rate * tax_rate - - // tax_rate)) - // * (offer_reserve.pow(2) * ask_balance - offer_balance * offer_reserve - // * ask_reserve); - // println!("discriminant: {discriminant:?}"); - // let denominator = two - // * (ask_balance + ask_reserve - ask_reserve * tax_rate + ask_reserve * - // fee_rate * tax_rate); - - // println!("denominator: {denominator:?}"); - - // let x = (numerator + discriminant.sqrt()) / denominator; + let two = &BigDecimal::from(2u128); + let four = two * two; + let numerator = offer_reserve * ask_reserve * (fee_rate - fee_rate * tax_rate) + + (offer_balance + offer_reserve) * ask_reserve * fee_rate + - two * offer_reserve * (ask_balance + ask_reserve); + println!("numerator: {:?}", numerator); + let discriminant = (two * offer_reserve * ask_balance - offer_balance * ask_reserve * fee_rate + + two * offer_reserve * ask_reserve * (BigDecimal::one() - fee_rate) + + offer_reserve * ask_reserve * fee_rate * tax_rate) + .pow(2) + - four + * (ask_balance + ask_reserve + ask_reserve * (fee_rate * tax_rate - tax_rate)) + * (offer_reserve.pow(2) * ask_balance - offer_balance * offer_reserve * ask_reserve); + println!("discriminant: {discriminant:?}"); + let denominator = two + * (ask_balance + ask_reserve - ask_reserve * tax_rate + ask_reserve * fee_rate * tax_rate); + + println!("denominator: {denominator:?}"); + + let x = (numerator + discriminant.sqrt()) / denominator; println!("x: {x:?}"); From cfe429aefb1efe0c2239877101764024a77d6b85 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Tue, 9 Apr 2024 10:09:27 +0200 Subject: [PATCH 29/42] test: allow max diff of 3 permille --- contracts/astroport-liquidity-helper/src/math.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index 220c4ed..8972212 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -791,7 +791,7 @@ mod test { /// permille) fn assert_decimal_almost_eq(a: Decimal, b: Decimal) { let diff = if a > b { (a - b) / a } else { (b - a) / b }; - let max_allowed_diff = Decimal::permille(1); + let max_allowed_diff = Decimal::permille(3); if diff > max_allowed_diff { panic!("Failed assert decimal almost eq for a: {a}, b: {b}. diff: {diff}, max allowed: {max_allowed_diff}"); } From f355fa06232b72f4117e7760bf03fdc5eba90862 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Tue, 9 Apr 2024 16:10:02 +0200 Subject: [PATCH 30/42] test: Add property tests for astroport liquidity helper --- Cargo.lock | 103 ++++++++++++++++++ Cargo.toml | 1 + .../astroport-liquidity-helper/Cargo.toml | 1 + .../astroport-liquidity-helper/src/math.rs | 2 +- .../tests/astroport_integration_tests.rs | 10 +- .../tests/property_tests.proptest-regressions | 11 ++ .../tests/property_tests.rs | 85 +++++++++++++++ 7 files changed, 207 insertions(+), 6 deletions(-) create mode 100644 contracts/astroport-liquidity-helper/tests/property_tests.proptest-regressions create mode 100644 contracts/astroport-liquidity-helper/tests/property_tests.rs diff --git a/Cargo.lock b/Cargo.lock index 84b0489..938626c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -257,6 +257,7 @@ dependencies = [ "cw2 1.1.2", "cw20 1.1.2", "liquidity-helper", + "proptest", "semver", "test-case", "thiserror", @@ -582,6 +583,21 @@ dependencies = [ "zeroize", ] +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bitflags" version = "1.3.2" @@ -1415,6 +1431,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "fastrand" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" + [[package]] name = "ff" version = "0.12.1" @@ -1875,6 +1897,12 @@ dependencies = [ "windows-targets 0.52.4", ] +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + [[package]] name = "linked-hash-map" version = "0.5.6" @@ -1985,6 +2013,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -2298,6 +2327,26 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "proptest" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.5.0", + "lazy_static", + "num-traits", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax", + "rusty-fork", + "tempfile", + "unarray", +] + [[package]] name = "prost" version = "0.9.0" @@ -2394,6 +2443,12 @@ dependencies = [ "bytes", ] +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quote" version = "1.0.35" @@ -2439,6 +2494,15 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.4", +] + [[package]] name = "regex" version = "1.10.3" @@ -2649,6 +2713,18 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + [[package]] name = "ryu" version = "1.0.17" @@ -3070,6 +3146,18 @@ dependencies = [ "libc", ] +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + [[package]] name = "tendermint" version = "0.34.1" @@ -3396,6 +3484,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + [[package]] name = "unicode-bidi" version = "0.3.15" @@ -3446,6 +3540,15 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + [[package]] name = "walkdir" version = "2.5.0" diff --git a/Cargo.toml b/Cargo.toml index a53feda..51c95af 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +29,7 @@ semver = "1.0.20" # Dev dependencies cw-it = "0.3.1" test-case = "3.2.1" +proptest = "1.4.0" [profile.release] codegen-units = 1 diff --git a/contracts/astroport-liquidity-helper/Cargo.toml b/contracts/astroport-liquidity-helper/Cargo.toml index 1fffb27..ffa85a8 100644 --- a/contracts/astroport-liquidity-helper/Cargo.toml +++ b/contracts/astroport-liquidity-helper/Cargo.toml @@ -52,4 +52,5 @@ astroport_v3 = { package = "astroport", version = "3.11.1" } [dev-dependencies] cw-it = { workspace = true, features = ["astroport", "osmosis-test-tube", "multi-test", "astroport-multi-test"] } test-case = { workspace = true } +proptest = { workspace = true } astroport-pair-xyk-sale-tax = { git = "https://github.com/astroport-fi/astroport-core", branch = "main" } diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index 8972212..d74d27c 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -634,7 +634,7 @@ pub mod big_decimal { } /// Calculate how much will be returned from a swap in a constant product pool -fn constant_product_formula( +pub fn constant_product_formula( offer_reserve: Uint128, ask_reserve: Uint128, mut offer_amount: Uint128, diff --git a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs index b0757f8..b765b59 100644 --- a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs +++ b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs @@ -320,7 +320,7 @@ where #[test] pub fn test() {} -const TOLERANCE: &str = "0.000002"; +const TOLERANCE: &str = "0.0005"; // Test 1: 1:1 ratio, double amount of asset 2 #[test_matrix( @@ -337,7 +337,7 @@ const TOLERANCE: &str = "0.000002"; true )] // Test 3: 1:2.9 pool ratio, 1:1 ratio of assets, but a lot of assets compared to pool (high -// slipage) +// slippage) #[test_matrix( [[Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)]], [[Uint128::from(1_000_000_000_000u128), Uint128::from(2_900_000_000_000u128)]], @@ -408,8 +408,8 @@ pub fn test_balancing_provide_liquidity( get_local_contracts(&runner, &Some("tests/astroport-artifacts"), false, &None); let admin = runner .init_account(&[ - coin(1_000_000_000_000_000, "uluna"), - coin(1_000_000_000_000_000, "uosmo"), + coin(1_000_000_000_000_000_000_000_000_000_000_000u128, "uluna"), + coin(1_000_000_000_000_000_000_000_000_000_000_000u128, "uosmo"), ]) .unwrap(); let tax_recipient = runner.init_account(&[]).unwrap(); @@ -533,7 +533,7 @@ pub fn test_balancing_provide_liquidity( denom: "uluna".into(), }], &admin, - ); + ).unwrap(); // Check pool liquidity after adding let initial_pool_liquidity: PoolResponse = wasm diff --git a/contracts/astroport-liquidity-helper/tests/property_tests.proptest-regressions b/contracts/astroport-liquidity-helper/tests/property_tests.proptest-regressions new file mode 100644 index 0000000..7d1e144 --- /dev/null +++ b/contracts/astroport-liquidity-helper/tests/property_tests.proptest-regressions @@ -0,0 +1,11 @@ +# Seeds for failure cases proptest has generated in the past. It is +# automatically read and these particular cases re-run before any +# novel cases are generated. +# +# It is recommended to check this file in to source control so that +# everyone who runs the test benefits from these saved cases. +cc 459e747f8bd2641dc0389b1a238c07d54c130efb23faf718977f83a052d76ad9 # shrinks to asset_amount_1 = 22281570672345703849, asset_amount_2 = 44550554140960439538, reserve_1 = 956324031525386939260, reserve_2 = 130984882130691351230, pair_type = Custom("astroport-pair-xyk-sale-tax") +cc f465befdad15d07b156015d3e5cf2f7bd4fc68d65b5fe71067283427cf54099c # shrinks to asset_amount_1 = 23311822968903591280, asset_amount_2 = 281630496622788, reserve_1 = 247974637800031845141, reserve_2 = 48536911881584, pair_type = Custom("concentrated") +cc 3074c8fc53c43aec775d8f8ea63276982f57de4e51f7e978bc9056c378d101e1 # shrinks to asset_amount_1 = 29013235919790427190, asset_amount_2 = 418030717571099, reserve_1 = 774941019066857227539, reserve_2 = 232173153759597, pair_type = Xyk +cc 6bc772b3d3427b9c28030297765ba3526da21f459a1c20469ed3f7438a8134d8 # shrinks to asset_amount_1 = 9119220474014713168, asset_amount_2 = 497200111535384, reserve_1 = 704328961716367593434, reserve_2 = 483213202773149, pair_type = Custom("astroport-pair-xyk-sale-tax") +cc 8bfd3d86aa0da21c6bc89f8057e6cb3ed59d92ddd0ffa7b664be473ed8ceb0c8 # shrinks to asset_amount_1 = 861022307144820881686, asset_amount_2 = 2125656468185, reserve_1 = 863629163172052531224, reserve_2 = 97838846769376, pair_type = Xyk diff --git a/contracts/astroport-liquidity-helper/tests/property_tests.rs b/contracts/astroport-liquidity-helper/tests/property_tests.rs new file mode 100644 index 0000000..ce5f391 --- /dev/null +++ b/contracts/astroport-liquidity-helper/tests/property_tests.rs @@ -0,0 +1,85 @@ + +pub mod astroport_integration_tests; + +use cosmwasm_std::{Uint128,Decimal}; +use cw_dex_astroport::astroport::factory::PairType; +use proptest::prelude::*; +use proptest::proptest; +use astroport_integration_tests::test_balancing_provide_liquidity; +use astroport_liquidity_helper::math::constant_product_formula; + +fn astroport_pair_type() -> impl Strategy { + prop_oneof![ + Just(PairType::Xyk {}), + Just(PairType::Stable {}), + // Just(PairType::Custom("concentrated".to_string())), // Errors with `newton_d is not converging` + Just(PairType::Custom("astroport-pair-xyk-sale-tax".to_string())), + ] +} + +proptest! { + #![proptest_config(ProptestConfig { + cases: 256, + max_local_rejects: 100000, + max_global_rejects: 100000, + max_shrink_iters: 5, + ..ProptestConfig::default() + })] + + #[test] + fn balancing_provide_liquidity( + asset_amount_1 in 1..Decimal::MAX.to_uint_ceil().u128(), // cw_dex_astroport::pool::swap overflows on line 235 with larger values... + asset_amount_2 in 1..100_000_000_000_000u128, + reserve_1 in 1..1_000_000_000_000_000_000_000u128, + reserve_2 in 1..100_000_000_000_000u128, + pair_type in astroport_pair_type()) + { + let reserves = [Uint128::new(reserve_1), Uint128::new(reserve_2)]; + let assets = [Uint128::new(asset_amount_1), Uint128::new(asset_amount_2)]; + + let is_xyk = match &pair_type { + PairType::Xyk {} => true, + PairType::Custom(t) if t == "astroport-pair-xyk-sale-tax" => true, + _ => false, + }; + + let should_swap = if is_xyk { + // Get ratio of reserves and provided assets + let reserve_ratio = Decimal::from_ratio(reserves[0], reserves[1]); + let asset_ratio = if assets[1].is_zero() { + Decimal::MAX + } else { + Decimal::from_ratio(assets[0], assets[1]) + }; + + // Check which asset to swap + let (offer_idx, ask_idx) = if asset_ratio.gt(&reserve_ratio) { + (0, 1) + } else { + (1, 0) + }; + let offer_reserve = reserves[offer_idx]; + let ask_reserve = reserves[ask_idx]; + let offer_amount = assets[offer_idx]; + let fee = Decimal::permille(30); + let tax_rate = if matches!(pair_type, PairType::Xyk{}) { + Decimal::percent(3) + } else { + Decimal::percent(0) + }; + + let return_amount = constant_product_formula(offer_reserve, ask_reserve, offer_amount, fee, tax_rate).unwrap(); + return_amount > Uint128::zero() + } else { + true + }; + + test_balancing_provide_liquidity( + assets, + reserves, + pair_type, + should_swap + ); + } + +} From b160378cbacecf307cef988157ef84e282dc11a6 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Tue, 9 Apr 2024 16:34:10 +0200 Subject: [PATCH 31/42] style: clean up tests --- .../tests/astroport_integration_tests.rs | 336 ++++++++---------- 1 file changed, 141 insertions(+), 195 deletions(-) diff --git a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs index b765b59..10f027a 100644 --- a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs +++ b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs @@ -1,16 +1,17 @@ use apollo_cw_asset::{Asset, AssetInfo, AssetList}; +use astroport_liquidity_helper::math::calc_xyk_balancing_swap; use astroport_liquidity_helper::msg::InstantiateMsg; use cosmwasm_std::{assert_approx_eq, coin, to_json_binary, Addr, Coin, Decimal, Uint128}; use cw20::{AllowanceResponse, BalanceResponse, Cw20ExecuteMsg, Cw20QueryMsg}; use cw_dex_astroport::astroport::asset::{Asset as AstroAsset, AssetInfo as AstroAssetInfo}; -use cw_dex_astroport::astroport::factory::{ExecuteMsg as FactoryExecuteMsg, PairType}; +use cw_dex_astroport::astroport::factory::{ExecuteMsg as FactoryExecuteMsg, FeeInfoResponse, PairType}; use cw_dex_astroport::astroport::pair::{ - ExecuteMsg as PairExecuteMsg, PoolResponse, QueryMsg as PairQueryMsg, StablePoolParams, + ExecuteMsg as PairExecuteMsg, PoolResponse, QueryMsg as PairQueryMsg, SimulationResponse, StablePoolParams }; use cw_dex_astroport::astroport::pair_concentrated::ConcentratedPoolParams; use cw_dex_astroport::{astroport, AstroportPool}; -use cw_it::astroport::astroport::factory::PairConfig; +use cw_it::astroport::astroport::factory::{PairConfig, QueryMsg as FactoryQueryMsg}; use cw_it::astroport::astroport_v3::pair_xyk_sale_tax::{SaleTaxInitParams, TaxConfig}; use cw_it::astroport::utils::{ create_astroport_pair, get_local_contracts, setup_astroport, AstroportContracts, @@ -20,7 +21,7 @@ use cw_it::cw_multi_test::ContractWrapper; use cw_it::multi_test::MultiTestRunner; use cw_it::osmosis_test_tube::osmosis_std::types::cosmos::bank::v1beta1::QueryBalanceRequest; use cw_it::traits::CwItRunner; -use cw_it::{Artifact, ContractType, TestRunner}; +use cw_it::{Artifact, ContractType, OwnedTestRunner, TestRunner}; use liquidity_helper::LiquidityHelper; use test_case::test_matrix; @@ -32,74 +33,16 @@ use std::str::FromStr; pub const ASTROPORT_LIQUIDITY_HELPER_WASM_FILE: &str = "../../target/wasm32-unknown-unknown/release/astroport_liquidity_helper.wasm"; -/// Creates test accounts and instantiates astroport contracts -// pub fn setup_astroport(runner: &TestRunner) -> (Vec, AstroportContracts) { -// let wasm = Wasm::new(runner); -// let accs = runner -// .init_accounts( -// &[ -// coin(1_000_000_000_000_000, "uluna"), -// coin(1_000_000_000_000_000, "uosmo"), -// ], -// 2, -// ) -// .unwrap(); -// let admin = &accs[0]; - -// // Upload astroport contracts -// let contracts = get_local_contracts(runner, &Some("tests/astroport-artifacts"), false, -// &None); let astroport_code_ids = upload_wasm_files(runner, &accs[0], contracts).unwrap(); - -// // Instantiate Astroport contracts -// let astroport_contracts = setup_astroport(app, contracts, admin); - -// // Update native coin registry with uluna precision -// wasm.execute( -// &astroport_contracts.coin_registry.address, -// &astroport::native_coin_registry::ExecuteMsg::Add { -// native_coins: vec![("uluna".to_string(), 6)], -// }, -// &[], -// admin, -// ) -// .unwrap(); - -// // Upload astroport pair xyk sale tax contract -// let sale_tax_contract = match runner { -// TestRunner::OsmosisTestApp(_) => ContractType::Artifact(Artifact::Local( -// ("tests/astroport-artifacts/astroport_pair_xyk_sale_tax.wasm").to_string(), -// )), -// TestRunner::MultiTest(_) => { -// ContractType::MultiTestContract(Box::new(ContractWrapper::new_with_empty( -// astroport_liquidity_helper::contract::execute, -// astroport_liquidity_helper::contract::instantiate, -// astroport_liquidity_helper::contract::query, -// ))) -// } -// _ => panic!("Unsupported runner"), -// }; -// let sale_tax_code_id = runner.store_code(sale_tax_contract, admin).unwrap(); - -// // Add XYK Sale Tax PairType to Astroport Factory -// wasm.execute( -// &astroport_contracts.factory.address, -// &FactoryExecuteMsg::UpdatePairConfig { -// config: PairConfig { -// code_id: sale_tax_code_id, -// is_disabled: false, -// is_generator_disabled: false, -// maker_fee_bps: 3333, -// total_fee_bps: 30, -// pair_type: PairType::Custom("astroport-pair-xyk-sale-tax".to_string()), -// }, -// }, -// &[], -// admin, -// ) -// .unwrap(); - -// (accs, astroport_contracts) -// } +pub fn get_test_runner<'a>() -> OwnedTestRunner<'a> { + match option_env!("TEST_RUNNER").unwrap_or("multi-test") { + "multi-test" => { + OwnedTestRunner::MultiTest(MultiTestRunner::new("osmo")) + } + #[cfg(feature = "osmosis-test-tube")] + "osmosis-test-app" => OwnedTestRunner::OsmosisTestApp(OsmosisTestApp::new()), + _ => panic!("Unsupported test runner type"), + } +} /// Instantiates the liquidity helper contract pub fn setup_astroport_liquidity_provider_tests<'a>( @@ -198,127 +141,131 @@ where LiquidityHelper::new(Addr::unchecked(astroport_liquidity_helper)) } -// #[test] -// pub fn test_calc_xyk_balancing_swap() { -// let app = OsmosisTestApp::default(); -// let runner = TestRunner::OsmosisTestApp(&app); -// let (accs, astroport_contracts) = setup_astroport(&runner); -// let wasm = Wasm::new(&runner); -// let admin = &accs[0]; - -// let astro_token = astroport_contracts.astro_token.address.clone(); - -// // Create 1:1 XYK pool -// let asset_infos: [AstroAssetInfo; 2] = [ -// AstroAssetInfo::NativeToken { -// denom: "uluna".into(), -// }, -// AstroAssetInfo::Token { -// contract_addr: Addr::unchecked(&astro_token), -// }, -// ]; -// let (uluna_astro_pair_addr, _) = create_astroport_pair( -// &runner, -// &astroport_contracts.factory.address, -// PairType::Xyk {}, -// asset_infos.clone(), -// None, -// admin, -// None, -// ); - -// // Increase allowance of astro token for Pair contract -// let increase_allowance_msg = Cw20ExecuteMsg::IncreaseAllowance { -// spender: uluna_astro_pair_addr.clone(), -// amount: Uint128::from(3_000_000_000_000u128), -// expires: None, -// }; -// let _res = wasm -// .execute(&astro_token, &increase_allowance_msg, &[], admin) -// .unwrap(); - -// // Provide liquidity -// let provide_liq_msg = PairExecuteMsg::ProvideLiquidity { -// assets: [ -// AstroAsset { -// amount: Uint128::from(1_000_000_000_000u128), -// info: AstroAssetInfo::NativeToken { -// denom: "uluna".into(), -// }, -// }, -// AstroAsset { -// amount: Uint128::from(3_000_000_000_000u128), -// info: AstroAssetInfo::Token { -// contract_addr: Addr::unchecked(&astro_token), -// }, -// }, -// ] -// .to_vec(), -// slippage_tolerance: Some(Decimal::from_str("0.02").unwrap()), -// auto_stake: Some(false), -// receiver: None, -// }; -// let _res = wasm.execute( -// &uluna_astro_pair_addr, -// &provide_liq_msg, -// &[Coin { -// amount: Uint128::from(1_000_000_000_000u128), -// denom: "uluna".into(), -// }], -// admin, -// ); - -// // Query fee info -// let res: FeeInfoResponse = wasm -// .query( -// &astroport_contracts.factory.address, -// &FactoryQueryMsg::FeeInfo { -// pair_type: PairType::Xyk {}, -// }, -// ) -// .unwrap(); -// let total_fee_rate = Decimal::from_ratio(res.total_fee_bps, 10000u16); - -// // Calculate balancing swap -// let assets = [ -// Asset { -// amount: Uint128::from(1_000_000_000_000u128), -// info: AssetInfo::native("uluna".to_string()), -// }, -// Asset { -// amount: Uint128::from(1_000_000_000_000u128), -// info: AssetInfo::Cw20(Addr::unchecked(&astro_token)), -// }, -// ]; -// let reserves = [ -// Uint128::from(1_000_000_000_000u128), -// Uint128::from(3_000_000_000_000u128), -// ]; - -// let (offer_asset, return_asset) = -// calc_xyk_balancing_swap(mock_dependencies(), assets, reserves, -// total_fee_rate, None) .unwrap(); - -// // Simulate swap -// let simulation_result: SimulationResponse = wasm -// .query( -// &uluna_astro_pair_addr, -// &PairQueryMsg::Simulation { -// offer_asset: AstroAsset { -// amount: offer_asset.amount, -// info: asset_infos[0].clone(), -// }, -// ask_asset_info: Some(return_asset.info.into()), -// }, -// ) -// .unwrap(); - -// // Check if the simulation result is correct -// assert_eq!(simulation_result.return_amount, return_asset.amount); -// } - #[test] -pub fn test() {} +pub fn test_calc_xyk_balancing_swap() { + let owned_runner = get_test_runner(); + let runner = owned_runner.as_ref(); + let astroport_contracts = + get_local_contracts(&runner, &Some("tests/astroport-artifacts"), false, &None); + let admin = runner + .init_account(&[ + coin(1_000_000_000_000_000_000_000_000_000_000_000u128, "uluna"), + coin(1_000_000_000_000_000_000_000_000_000_000_000u128, "uosmo"), + ]) + .unwrap(); + let astroport_contracts = &setup_astroport(&runner, astroport_contracts, &admin); + let wasm = Wasm::new(&runner); + + let astro_token = astroport_contracts.astro_token.address.clone(); + + // Create 1:1 XYK pool + let asset_infos: [AstroAssetInfo; 2] = [ + AstroAssetInfo::NativeToken { + denom: "uluna".into(), + }, + AstroAssetInfo::Token { + contract_addr: Addr::unchecked(&astro_token), + }, + ]; + let (uluna_astro_pair_addr, _) = create_astroport_pair( + &runner, + &astroport_contracts.factory.address, + PairType::Xyk {}, + asset_infos.clone(), + None, + &admin, + None, + ); + + // Increase allowance of astro token for Pair contract + let increase_allowance_msg = Cw20ExecuteMsg::IncreaseAllowance { + spender: uluna_astro_pair_addr.clone(), + amount: Uint128::from(3_000_000_000_000u128), + expires: None, + }; + let _res = wasm + .execute(&astro_token, &increase_allowance_msg, &[], &admin) + .unwrap(); + + // Provide liquidity + let provide_liq_msg = PairExecuteMsg::ProvideLiquidity { + assets: [ + AstroAsset { + amount: Uint128::from(1_000_000_000_000u128), + info: AstroAssetInfo::NativeToken { + denom: "uluna".into(), + }, + }, + AstroAsset { + amount: Uint128::from(3_000_000_000_000u128), + info: AstroAssetInfo::Token { + contract_addr: Addr::unchecked(&astro_token), + }, + }, + ] + .to_vec(), + slippage_tolerance: Some(Decimal::from_str("0.02").unwrap()), + auto_stake: Some(false), + receiver: None, + }; + let _res = wasm.execute( + &uluna_astro_pair_addr, + &provide_liq_msg, + &[Coin { + amount: Uint128::from(1_000_000_000_000u128), + denom: "uluna".into(), + }], + &admin, + ).unwrap(); + + // Query fee info + let res: FeeInfoResponse = wasm + .query( + &astroport_contracts.factory.address, + &FactoryQueryMsg::FeeInfo { + pair_type: PairType::Xyk {}, + }, + ) + .unwrap(); + let total_fee_rate = Decimal::from_ratio(res.total_fee_bps, 10000u16); + + // Calculate balancing swap + let assets = [ + Asset { + amount: Uint128::from(1_000_000_000_000u128), + info: AssetInfo::native("uluna".to_string()), + }, + Asset { + amount: Uint128::from(1_000_000_000_000u128), + info: AssetInfo::Cw20(Addr::unchecked(&astro_token)), + }, + ]; + let reserves = [ + Uint128::from(1_000_000_000_000u128), + Uint128::from(3_000_000_000_000u128), + ]; + + let (offer_asset, return_asset) = + calc_xyk_balancing_swap(assets, reserves, +total_fee_rate, None).unwrap(); + + // Simulate swap + let simulation_result: SimulationResponse = wasm + .query( + &uluna_astro_pair_addr, + &PairQueryMsg::Simulation { + offer_asset: AstroAsset { + amount: offer_asset.amount, + info: asset_infos[0].clone(), + }, + ask_asset_info: Some(return_asset.info.into()), + }, + ) + .unwrap(); + + // Check if the simulation result is correct + assert_eq!(simulation_result.return_amount, return_asset.amount); +} const TOLERANCE: &str = "0.0005"; @@ -401,9 +348,8 @@ pub fn test_balancing_provide_liquidity( pair_type: PairType, should_provide: bool, ) { - let app = MultiTestRunner::new("terra"); - // let app = OsmosisTestApp::default(); - let runner = TestRunner::MultiTest(&app); + let owned_runner = get_test_runner(); + let runner = owned_runner.as_ref(); let astroport_contracts = get_local_contracts(&runner, &Some("tests/astroport-artifacts"), false, &None); let admin = runner From 02409fd6ea1eeac1b7dff31faa6be28216d00f65 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Tue, 9 Apr 2024 16:34:28 +0200 Subject: [PATCH 32/42] test: use astroport pcl from v2.9.7 --- .../tests/astroport-artifacts/VERSION.md | 2 ++ .../astroport_pair_concentrated.wasm | Bin 574417 -> 552491 bytes .../tests/astroport-artifacts/checksums.txt | 2 +- .../checksums_intermediate.txt | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/contracts/astroport-liquidity-helper/tests/astroport-artifacts/VERSION.md b/contracts/astroport-liquidity-helper/tests/astroport-artifacts/VERSION.md index 270a470..88145eb 100644 --- a/contracts/astroport-liquidity-helper/tests/astroport-artifacts/VERSION.md +++ b/contracts/astroport-liquidity-helper/tests/astroport-artifacts/VERSION.md @@ -5,3 +5,5 @@ These artifacts, except the below listed ones, were downloaded from the Github r `astroport_incentives.wasm` was downloaded from the Github repository `astroport-core` on the [v3.11.0 release page](https://github.com/astroport-fi/astroport-core/releases/tag/v3.11.0). `astroport_pair_xyk_sale_tax.wasm` was downloaded from Neutron Mainnet CodeID 621 (cw2 info v1.6.0). + +`astroport_pair_concentrated.wasm` was downloaded from the Github repository `astroport-core` on the [v2.9.7 release page](https://github.com/astroport-fi/astroport-core/releases/tag/v2.9.7). diff --git a/contracts/astroport-liquidity-helper/tests/astroport-artifacts/astroport_pair_concentrated.wasm b/contracts/astroport-liquidity-helper/tests/astroport-artifacts/astroport_pair_concentrated.wasm index 711c876a97584c651d33a603e861de64dbbcdd7f..e701c14e32aedde6a194e3f993e36d83713d0d49 100644 GIT binary patch delta 214355 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 ToBZ*{4GcFkOl9b^IPd=eJ6#?5 delta 232544 zcmeFa3!D_i^*=gQ-SgO;ncZIY3A?a8!)up^KvW=V0*#_*G-@73jqwqK(M6;9h>03! zRa8L4g;pCCb$vuoQNblbe4?V_E25Ib_(X#ViHP`${EW)|eouAJ%p#iH|GoGBxu4Iy zu1t4VSDiX_>eQ)oPMxa0{ngy_7Z1$Djydfl6^q5xJ$mT8%=Zqk3Wb6?_h`kRB<}fN z>}acS?zyp}Z9b^N(OR;^m|T$LbI(PdIN$O$GV>Bsg?V@Mw`~-i_ry1=6UdAI1PU(m zw*6aW{C}$h3y&vPCzC+HvMl_@@JoEmf0m^b9u?E@kN@F?g-n_yaBIb_q>8I}-&ht; zVM)uX1;n_e;>eOprK%KuEN!LYRzFmODgamhi&_2}J=lo>Tudi)DxOLvfrW9v`NHjtPC0+Q`!a+@i^{6 zWRj{$4HBXtB2>B)PdD}{A~%HXX= z0|Y3Li=naFK?e4RYV^Njk5G>PD|=unmQd9(RT=YtYmYiO2kfeKK2cGrDk|`Qg{lLL zcmh9RYgDY-R1#K+7kyMLk+5RGzA7G9>8f;E#kHM?q1sx1NPM@^HCks;vDP&;4H>jT zx(ppfs%h{9-hy{P9iZr(PTi@&hq0POU#p^NZ6@IOg=Ju}wOD>eN$C{B`VIot*ls zsmGpyw9Pts(g{C5m9O8^@#$wwJ@wbI_jS#wQ>UMC!l_eFJL-hfr{d+wr^c3Aej!oc zywpk^bK;37AIk!-#Vda{wfOXge^;V^VGGdnRC=4*9KS8@oqFOaCrzI=*S_Dr*S^(W zZal( zywL;i<3_$ zZ%y8oygm73a!vB7WaU#!T309kn$SuA*38)K9SJus%;{<84u4aopZe5KX8WsK{K45P z^`b=3^$)d^|4ufeXWRb&WSjL&I~cPWgQL4=MAhL+UGHC9eL>&dl`6QgHl50AUhKVX zJi6Ms%%7C`Ud_k03qBjGk>WWWgJNm_-qhG(D;KYdc}WKdSVaU9dZMe_t=J^%V0)r# zBe!cgH~al6_DwCk4cRN4>-=dI{q;rKpI!00)D=uiB5j|_Z)Uf?x+>-@NxDfl77a^$Xi+=M}P`r7=KK&ZB2VuJa#r zHsJTRni=XUe^j65e(Nng5sg%+leJi0TL(bYbvSqVKkIX_+TFjW&-H4Je@N{ZeV*Mj zi(-4LKc{XU(gxJeQ!n^S>-*yOsrp>{X^oPb9zv7e>G@Z^t<(`c|87{JdgkqxQ~jRS zsKp)`JB78_XoRcyI31*UX7?6A_{Z))!mqc-;KU0_ug!U(=fpiOP)OPGt^S16h~*UeeunDEf!tmvt`#oc+PO+S(E>Hx%DwH0o|VItl6I53pTOZpn?O}#p?@QtZfb6Cd#v~l7zDCDk*{`BpcTj= zV}YE0^f)wMyQy}KHjO6tx9LumSDxMn{iewsRmJwY9d5Sx(A42(iVx`C>Jr#OyESo~ zs+D&Ce@6k$)i8 zzhi7yy>mqZbgp;i`&(NNK(053*ZV(q9rb*${sOz+KhNDMjT{ySVAcuzd)Z0Hm-?97pUcOx&?oZ2K2e6d`hpPAdZw%ZS66d&qgCKD(8F-l5*7Nqj@k(9k4;cJu z_Rm*C47RwH98)*@gNHn#ZtB@M1UlSJ{^p?tJp7_<7p129H?`;S`*{2J(!K=&+Jc^T ze1G7uZ-YQT9Yz9OIgA9_I&3ru)IPkqBEUc&8LP-y!NH%|xq38&G-6BQYzZ&(gZ0Bz zogWO}R|qvYBvSB``BpNx_!PU*-)%%qkz7?y5R95(5A}aDqCIhF#sc>SHLvU1h;mD2 z*nNYMzLm9*b35Wy6^T~`;_Wtaf?D98HL}f5=Ib+6V|5#ZT9xZK3k(fk9oeo94gRno z(Lea?Li<=&2x>0f>0~v=cSoJAXU6?&NA0Dy`EQLH(r^vuC=22{pZ4m7wcUjCpg&;r zUiy-R|FhB0tE+m(j(HOV?`hh3FO{8hGbla`6dz5BpRfxk?vL2@RJGZ^e%EVp|E;kg zyZ^x0*VN{oYsTH8aGCVY1C_t)#Jg&`I90`53?0m%t~FNshfF@JuvWP-nMX0yWI8=X z*_6xfw7jC+#Sryu=dZ%56uvEaJvoc?Hr!OyQX}qS5+dvQf`t}Nq@yr6`#YZ{4>34+c(I&OwMMORIUtg0{W6pUR_dvE15-W|_`CF65sXP5MCJj@c`Q4MA_Fvh1sD4!W>nAq^mko$lP5Rsa zJ#Ej{$I!brr)%xp?q9ag@bm{jPSgbF1OKso7O4CDBd4s^mn8i``<_vI2|5Ywk2$p{ zmg#V6)9d_Y-^uA0;=xG;tHs~)op|#LaR3+(RfNfS zc@RcV_mL2B{`8-Z@ZUbN8d*O+QiNN=2)7DC(nO~M<8$YuCO~4Hc2pb6Ej+4KT^Fe1 ztiJxG$LCYFhn|10YjZNeJU7g{q&45)aFyaL)x4sv^h;^bDGe`@(gWu zGL-=Nok*M0&IB5Jo=)0KJADHAfSR5=41Dmr(_4}H$J0rHi_Q=VB*OtUj6kH7!vN&@ zGf06^za#~I_)8g7G+o^O0CMv$4>HWuV3;WxG80sHGE>!=B*T7Z3K@nPGV~|#N|K>J z$T0KF3F>Np&6y;_`)9V|zUEgX!w-H%e)-~8B*EFgo~o|vdGpsS8Fzb8l3yxIP zpL6(#FxF6q?((P4pfJ9528Hpu8Rw}>{6j808a1xC@N{)a&xngADPVi@#eMN&*2U-4 zOoiInrcV()6neUIiQh1DGHN(t=I_-yzhTzlAl~#@t(oVQ_c=IUV|ZWTFPycccAXd` z%EQRB-6~+Y-sQfZn1 zbBv=L>fI7EbFY|=ad6^QidVF%NtjOdMm? z`=@j#{rBdzaTL%#poH)rzH6wz@BDVd#7V=%I%Hx_1kUq;_pDv(Uq8PMz}CzcPOdPV zEP^7O0vGxTe*y&7-aa|`WWQBi6HH$MMR>7K@i%>0fB!vy4(`sm+@tV&=<*3*g>9D) zZWYB1Ha&C>QQXkTi5+1nW>tNmG5w5#`f zdahWe!0l6m7NxH2Ie$T&s=9-ueJX}=FRJy;SB=Fq`pQ+DMnAb~Wce&2HiOWWX2Tv= zpN=fct`29BO;>L}iwyM-xF)1q{3~XX5&r$xaFTuI8X;S1N3%)g!U<}wzu&^PTsWIx z8sTh`ESpW>^MLbYu9<$9EF?kyv=H(k81tN6ADptko${}}_8818+pb-V-^JHWBZ=#; zp9B&gdi@Y|OW}IT${Vh4C$H#G%w@H?IF7-tXF7#w*fZ;S*{Pyxt#ucgoM* zbRcBl^qUT4o1VUDLhUv?ljL+QMj~y0=Uu=5&C?(^X5D;_n%a~2?cNkK2i!8m@D>~z zPF|PsmN-X*`{&;h@|F&HOISKi;jBu$_0lcl(WaV3?R|}%3E^t2Ofypg(tQ8>i#+7H zVi6~a`xeP05lxeR<>G^kp_CCrDJ$GejSGS=;g8An_pe>t2c?%T7OGVlHt9WGZeBbA z>d{WOl4?J?wbidarJvt*D@k_mt>6UzXSYr6H-@VFp%6;A9FfaXpu^z-^se$By=@A~ zm%aUfGD9h23?=ebq34v_zXhuG+__{iiT9&B$u;NRIfiK6xf6#;Z?2*IAmjY&PBPB^ zca<^D0ROjliMd$DJmD<)H3G&k&d-+$2`UWy!*RseO1rcIxtUlZ|1>FcWBQPwDyJ`S6${m(lduj z=|RiC#d+ki0uXbmg;Z45kF!V=hUH1B+Ukb0u`NHr=J7Vw@-N-W2oiy!T$r5GUN%*6-SD zP-PRQk%`lso1+<`nqDry>#|X4OcCNIN;n1osmofRP5u3{4gJ>9t6%{OiayMR;<{(e3wp@+5@Gdlcu9(Ac<2&K|&mS-~=__pLZZT z`rZRu)qHUW1na-BNBaX0y2@mihjo@1KNs^*`Xd2|qX@g?Bcb4}pJ^Bt83sJJf?cXa8`b zs=5H;m>y~TWSr0ZClC3nTF`UHj{=Sq=w9kw|H#936{TxyEGRshsQ2$Y>{HA`w;qla zuPb}*`Ei?S+H@`Y!iC~j-WTvb__y8XsvG^M?;DTC*!K@ti~P~|chLWD7N^Ajzv%vU zc>bTiUp)Vt_fy~SuX&(CE%$%>z<$hWdtAnnoS!|gFYL6TGR_T&Oq|>g=CHj7 z3C(sE2k!#*kYZWDHf6~C2E%tYNc&xhHpZ;(| z992}N{bN?={W~A7!JAbNAFl7V{D&VN>F@hUJu)5j$R3hB%zylm(dJdVpL?{gUd~+Y z{?tbs)iVD#k4CvRJUUw6V_r>IUCcFMb=L1%U8$EvZ?f6Wi_o4pTHk^e2qg(n;ed}&c&>b6gj4(FVU=DloaR0_Ndu^Bf z!!=`e`K_QprT=%*JO>HDfC=Z#MthS?5O1*dJ_~dBhdw#Y?gj(+M?IDA`NxwpxVrR< zr{CHR{7;_Q2|POInJc2zsq_tm2>sl_64epUjwB2#m{(&B>{sh={*pl~N9+X|igple6hy7k*vq}H`Ua7WG zvX6iDE4!o~Dl0kv)h`#^LkfM<6uAA>-60Lwvo)`UDEcS97QsF7wM@pF4+b_(U*%e8DW(a4_po zMpnuaPI*ejmr_z+N`W>jomzqeO=G(hNZ;*J?8#qBf^^v~6UO#-DHzR|GJnhZi~P;ckHGM1e&PA552;EFgOVX5(Es#>i~L`{`C$ApN{is& zZzhLVz^_c2UX=7tdh0&>fn@rqpmkk*itlVmz^Q)rUys7?D}TLs_`+KNX*eLQ!3`#2 zuKNy<^;-NHVkTl+T_JVGNF<@wNXr4G`Zi|@ZA(vm*Kv0 zHv8V&dt#~f!ngNQ>wBJhTT{k7`?tZE5HI~@9IMlIu;iEV%l%va{w>O`((<;y^H63}#K8 z|2*H{d^4H9Jf zkW2CzxH{o_zcn6w@xyrDZ`ssd^-k1hqJaeGouiukX`9Zdy1G}ozj@Ox5iyqf!`{6r zOCL3*yYrsyyzZ}kcfPvEKX&sTRd>Z*3=QWKy0AM{@W5O4&J~v=P`BDG7W3cOJT7aV zWI@z({5v*}rdE8^d#(QK?~PAwmdJtKV*Z2gx&FCGcpva4sd1J+V9O5^c&j}(SbuoD zL4EFbZD~}G`ir-GW89ouK#Vn4VeyZB{()90wjaj6X}=z4HNlMykB#Gf*0YLykgM=I zm-~NszcqcnG=vPc*x&m8ehqJnc7isbGrYPJv80R@gctlnKR6Ty*s>3H8h?T3vyq13bC>X>*PN->d~J=XvJGqNo42E#vjvr0>4pHn<%fXYUJx3Kws~ z93Vaih2cARJzeyYpz5g zQxlKriEb9{%8T0@Lbt=4eFLh5+Z70tjbx-}@q#>{2krs;#F~~*Np!>7%5cEob>2bq zv?C6(u4IQ;GTqhDdK>0Vs`E?ltoL{N#6_^zf;4)lWXU?>{{R?dn-5BWPv9#@Z)0r3 zO}<;~ei^xA^-7Wn%X}MnMUcSO@H&&T8lKlvPgt1k$kpQ7m8AnQ$5#uGREO*O3MBpT z)LfOPbCry%ASOARW*6Lf!X6+ml2;}=@(gsz!{q{1Z)B_n0UWqEIqCseZ)^kU(#D0a zjdzZoJ(UQqd&chH;_R+sbap02#%wG;g{wJeU+BRZ)_0sDDns^!>J&aN!zBFIzp>_kO$oNe%41 z3d+k7xjsM~H*J*ceK4Z1fZlHn`QiSZ)PfUzXd43n>)S&{M=WW|@^1 zi}{!V`Iw;s>wrDl@A8|*O8a2Bv|CMV9~aa{cbN8BY+o5X%!3J$c5WibJpdE-lgZXm z|0f7UUqeeU@^V$b7a3+jTIQ^gv8&Q~%uRcviP}@ss*B5qq6dVum4r-h**ZoKX^ z<2Q1RU<0Xqrw@(d|g>F+O|}XRScVXyU?LvOaPO< zD$!vQQDGZ6HD5vbCD|8r0anJj4)qH#;<2=nz`(ocs{+Z7%^N(2B`pJBD(@Ib zM1C$JeR(#A2IioQ=aQbvr4_@1k2i*Agr|8co4eYAo9WOK%}~a2nHQtBR(dU zYZAO?Cb2k|c7(|U*ir&G z>q!8tEC)z20&pOmw^fw@nbeJdV^W2p>nli68z8lCDmlX06tMz@^@2imi5Gg&v#Z*0 z*aBpzGE&*RuafwvE_l=`5hRqQTFt)t>y^N?&iOa`b!4n78;*>5Ss3`p@s$i!p!D^+ zsym#inZ9g1fYOyFKywxZ5JD+5C)1*|L@(rRN0tyE8=ZWmalTP~y4E7n7>l%?S~~LZ z&c*UroHYVa*X2d*A(GG}RgTpK%#jclx{fm@s&EcvdCumh9UMp_WAn1P%1j*_Qr1*> z2OGb(Z8z7}#&W zyM^J^1S}deRcRo?S6dTBEJEoAENXgV@vfnMc5*=|^_A=idNv5q4Uo|E-5U-FB{bl& z$};2@7F)-0@pWM9Ieygi0_FkaoM}_>gN6vLLBu=nEif>y5I+$QKu$yGjI%Z}?;uhH zVkPVf<^&YcLDG>JKw>8n$$Ajf5g2bhKvSPtP+ce{682)i-U`^f@2VbWy~KLB=8_EA z1&>=aOqC*%D=l~ji*TR8lk(PC9c{7L*cgV8w*)Db#rLc6L|w;7k{W~|7EoCejR2{0 zqczT2D)qO;p0~!vo(yr>YK_x3hxaex{(j!;-C}ES73w=&qZPKun^hk-!|@~WS1T=X zz-Oqn#iTnq6XP9bz2dpK6lkz5<1dt>e1(U*w21#%&n1bO1 zizHbogHDjw&YwXhbe_=|WNP0E*)tVIFk@4^l=Z(z9!%Xv?$1niIFF!HJj{E&XqdIh8WB%9)C?6nK-}5c$qpAl*FHA)bIZqY@8?=fcg|Q-=q1%M*itI+5yQ_<#yj@A65od%{9ClI| zzOVq(zi_+xWdH+vkEA6|m|Q4v>@?AmEa?_Ywwb+*_Cg4{>}5 zZgDpbnkP9vU_B!wj|hwH-j&3a;{);jrcR6xB8TyT_LYId5e{LZAK-K+v46r%qQI?*pdMERw9!Op5IpuTrqxM^&3?e${tizT5t-U z+)w3D)jRvCU5B0bG~`thbh}@Z!5k<|VNea4G?OnAASk>F_XqoZN44fruViDNqvhmH zZ!WWCkc|ub%Y#e4qxKwoHPh1ElHwHGn1EJAT?MbKQj8L&6 zkg^EjQD(3JVJ1S4!YatQ$?eFUUSS=ePE}kgNdz?qg7gc&tBzLVg^$*~1R&TBlz?h% zc{gL;#>$Bd0I4YMn8hG@z$kQjtTZ|7@L=vi*r&HBxZxnxK*$xrsDlCd^@G%hswx}= z;nGU*#`o0bogo5a-W>24gICFGvzdSjA?lu0$_jUz=%Om_EWYvwYL|kztsvkbC*aEt zJ#O$n9RS|Oqnm>$gAV`_8-3y2ROX$6QjTpWPB*<_#*L=QCzLH*u8vg~y>2Tn5w9DD zC*-~}7ydZjcrPJ2A?~@U!RQV4kl>9UsDZUl+i)5~h?&S;F8e$k)c;UjsU8lN{1Cg= zHV0D=QTgD5AE`NNY*08<-GHRrVQP4A@geF`H9n~S5%#=o4xasy8XW9@nA!=0{OrTj zh^7xf5YXO5gG8YK{$q72JwJHpFqB&o9B{b$MsV>@)GaMblHS9=T?NwxgZY7^a}*i` z9)N-e0tEXWsRFfm#hXW}bCg;T9C@_b3#i?6w7NL4dd|bxHWiFMMomyNf>RLP)91S#IUF;><7fhL| zZqhTB2k%Z*->>}0I6u9uJ;8p*q3urxPaLP#pkUX})r-z3@Hedok$4Tx^(#(0UNtB+ zDwutOno;p%q+=tCGb(88P}AjcfjrLZP(M{i2Oo8)@1jY2PE)@|&pj|rHL9t>AE%*~ z9|zw%QFS8Aizlkx(Ua9DiMVb*N$ppGVF5nLxD~#)wsys3Cn>F}qtLNRvg9m#MfWe% z2fFG;2C;(4VL3V%+d=nqwYnFNk|Mer9q^+RL?*k_uzO-;{PdLlfS zVpc2X+F-yLYWx7a*It$kY27iY^4xr4k~?z|1g$nM%G1wKg8=cWGt`u}b;MMm1+5r7 z@b}QYfx!dOMT9YsX|9v5U;I*G&tuT{Of?C7am1PGmT+BpU~ttXR&_A;S8Bw-f4#Me zORV6uq*s)VM(omIjU|B(gA0G9ex7@W8R05)W*YxFWiOBxIVDrwitMk|&y;;VG~VEe z+IT)V>MX0mP9LJIVAIO@fL*yz0)KPdTe1N1M;4rH=N=p58Q6zQLYVQK>%jC7n--T6 zVuABZHLdN1hhtvOTk=PYXKoz9M1>`vn6L*LYe7H3%%Gfyf}4J+MkX&!i0TzQb(U%w zdbv$RNk|iA;atw0AV!)YapPrZm3FQS=3S)RVB#ez*}QHxl9I?LdXW^}%3KP$4m?{8 zE0jRqLw8_}0m&+!;IqwVSfO}+n$KB213f&yRLl=c6wm+Qb0gnF@xycHJUmzPnF~o~ ztAy9Z#H7=S=p))9v0&@j>g=lXWj+Y!h|jp3b@eybB0Ndy0_AGT8+{_?3RwZt;5J1f zfB`vwI1jU~(H&6pxnnNo92v~|jcPl71~yYTFLM59nkHs+6BZN0EHB#WObl6(Cx$%f z!||XC+EBLG?1V+1N*e#i3-Lb9LP*l= zP+($K-<`{Y)6P}H#+4{v-kHqDg=$2xqOdO2xQR7d=(g)FP$RA^sJ{D@09;b+8dH1d z+YkT*cr)J%HdJ-Pu9z_&i8cTpT~Pb=LVh!mm!2;}{sShafc%REHKb3e?#_#l9!L7T zY+`6I@&c7iUC1ObUEp=9;brZ-i!}-d88q)NK9{$XiBUU)=Q>rD5WJ)FZrsjOLIBMB*=PO5D z8LU5F)s?mFKDMo#vLPh~1xJI*Wpv%*3s6*}q>@khEZtp3*O_#}hIHNc=cWF8=nAA$ zLWG4M=d(1*4EyK!+`#vy1#k1Yp3jCzpYl1wXN;zZx4Kzb0=%^>lQ<~2Ziebp)~@%+ z-slFyG3c|QfpeismUY~VEG`{m8nlvi2#yA)63zyv63zyv63(XMN;sR2dx`LcK&IoQ z4TGf-rsG17H5wIl+*TH;M2npB5z2nZMXIi?M8hz63fYxgq{01cW>G{8+ApRjh9c&f zkN`z#{sI%gsD>h+U8MR>DFOdOfR|+*^hZ96oHfMQ#ODE~gNl{U!L$U3;Im^2YFsdC zw#x1lx{peb-=#lE_`MA6txPOVBIllN)$O}rE|N&DNF?6Ggeq2P`ezxRg?t932ly<2 zP5(T>XRONxHM3M57=6p>)?WD$F_&XxCf{*TmS(6fCUJ(UnW+YqiMdai9!g>sox_<- zsxj4G$!8gUWn!+IiJ_PqAN=(1cAxJS(U00w!r!!~guekC;m910 zv5K$J2wOC-dN@RS&oeWkK^q}4mkC0|vffz8#A0vEW;cFqZxpe6Y5RiZlI4EB#262j z&X)d&^o6Ps+-vu+i@ju!^O z^7FD_9#U(!zSui8nQ?++E>*6xa=RD7lxysK(08snLU+CxoH#G_YsDiy;(+qPz z@ikrA)saTo`(D!sZx1rB?{6V&y= z8?S3bwg;&pPzh3`9jR`u|>u=z4?Rq@|m#56-6LT5# zrX(J0F6Wxd?QiOlh;{qRn|dEya&H0tw!nK!?}nWWD}M8q9;#bpzu)Ru$F5lYz-j@R z#0w|KZNaJyx*tlsf=jQAaHmVgaMs-x)VwVjN8mE993m`e$rw)O<*#HZ7L~2#v}!rq zg5SKYk5yN#c=K(2h^ocTh%Q;cHk}3XUm5K8ca8H*R=}joS3mmrG zz;|=-!;N}uj{7OZQD8+N65e8QUEz!&WLpv}*{GZJC3f)mM)=|ve*!*Q9jyL`cKfp^ z4Ou#4JUQBeu{NU_vf?}wsDJ8aeW4u;_@{2IjbGDK#U!|4a^GTyPMmW&qZg&70=?0&&V$99^bEK!M!u{2>d!t2ro5|nN&lV)K+u4MAL-(E^|^ST z*sRa$`(wJqE_II%-0S8dkg)!o4hoAs#lru%@j_$!_ZGVkd^;3)zq%=?-lF%=aDN=Ig@=eehAtTC+!#Flf&MWXx9WZER*^cG%4p0E0&zCK zuYZqMi$BmUl6_z?`--6-;>a$%`_{+$+f!yd4qD!%afnQUXSpB-uEA5@3en>qRT<|abmU<~T?h`#qy&PQmi9Vq4B(~0Zi(vra2$@a@ zMR*(>Nn7)!w3PGx+#u$LUp0%Cte4OXB&O)e?aV8KZ{KtZ-|IwH3Y8ZEA90!S%>gq=H zPK+$}9N8LSMGDT+gttDybvM#>?f>Y1sQ+1U@25Jgwx|1x|JEO<*}>zV>E#ihcYdy0 zC7bMP#C8*axZ`vEG01e&7y8?{y!C}XuKiW2 z)z&xq{0qv$9OWiChyMVS>HIkOk+z1a-vsls+?Vd?XgF zZ8Ik9vm1i$xHV?)^O9(l?cicf<_=&E{PWc8NLW+gb=*B^^-U~F=!tq_ zFy|lY8#}GO0~xrD8F6k1G=@`(ixkv7gqgfGe9z?$c=Kl4!M#aq(x5*uEk#n6T&x_x zC{xAroZy6-5x6NUsQVLhI=yoSPp2$w)(D>O6K@X&R#+!uaiFWh+8yD}!Lt=sa}&H| zT$rJziWN6{$>QQAyQk7R3Zc%y(P`_^Vd4G;;E*b<%3vzx!AO%d4+@i2ofIVX0U4_W zbug?tKjYT0Ign6cTs4|2sME#f&Av6bFJm>U?iGK|Saqt-Y{Xy#O4S70vdD3B&|D>O zmu|2}9t035{qQ0{PhwGarFi8?$r9*rr$-edZKL<$aUxRKR0RqGwUxo|sw^z8N$0Tk zvgNf*wbd_NY~hwEMCzoSO~Ke|%j}a0ax2xqVChO_uXv`~ipy$FQZ~M<*y>oftEx|K z1d=Ye$oQ3)^|2mMeL{JF=?H5#W|rx!!{C1*iPK@;3~s5jhBQ2fz)8v@tmZ$B_(zPK zjhv0%!n>-47&GiC{9uz>&`@vX_mXK#+?<|*CW~(5Tp%kJN$)RY%tmr7PRZi^C-|Yz zS&15(JxngH)eOEpr`|dhp8oghtzo$IYp}k7&F%d_R=PM{F+gw<8PGVU0sZyVieENZ zaBII1T-#{*6POc&o*H*TrtRl2&Jv7qagI;B4bD@_t)Z*Cma|sbBU0&?4o+^env!2! zq;&s6BKY`Y^(`ENmLI@?R7Hg@6YW~Wq?JQ>0cOyA6WxE9Me}_n51g%O;K@1hnF}AL zPtjXzuFMsNBV!L{%!DH|>eyR113ue2h9hSMcOu8_n#iSdI=Jg!s-b`(%E03U$Y7L9 z?4VSrNcLjkpb>Z;7{3c#7{3d@1b5Ys#sv$T=wLM+Vut6bIj>oe1@K1lkC~^4fjBa@ zZ@5icP9G7+c%m#!*-^}E;*?KxflP4nKJk`9itbWwFWpgiF;*w@7|pRfPG&-{6TM0k zUR(p}z?y5r1qag95Iek~M2fIuzVXBi*KZ=uZUiHsDtRsg2RZ|eIa36?+-LVM$Rh&S zM3)BHaA)ePF!iMXp9+ws!l6Crql^W}MZw8>kNm)5aB|KBCl4$SPG(uN=N?I9$iyiMO}Wff<%~l_hW@<#r`FDi=rzoJ~kl z8?>myF=j-t(sH-IgkbRyK)OL?hF3fh1P7&1jI5Nc42YzH#W5A{vBZn%DmsG?Z8Ikc zcFH1%sf4eiN<4+wYx)@^n~o|w1Y z6b7zsI!Npv?}IH8t3(ec9V3MayEr5pGJ|=^f$S-(3q7?OckIVJ!aXqQ3%$Ho@k|`o zpl8E0=3gB4>_qJ2aBVi+0wjzMWEK+R5i%8_T>In1MZAH+T?u-aLnRgUQI-oI2@xkK zB2-YsX(9~yo07Lp05IIV*aI+5+tASj=OiW>w=zU1Nn1rg!wd!)Aweh=m!8nR{7r-doz zEe?zkE}~Jm11>rxine=1ItCSkoJM>a0&*PR%f3Nmj2X#_BY8>*bMksJinaq05H1ga z8a(s`_GHQI*{Ov0$j>HP?Uc!`4ujQ*o<#CO+)DqO>e-*tf2dx1@GEQQIKvV?WG>E2 zIyI*t`w#&&kwZM;?a@Sj;(Qk}NrHXPk%}Wi4clO9l{-gfU#!C;pp5|XDmZ_eYX26^ zJTN0=U4p_4W(b*7`k38`-0gZVb}=SA)58EcmT0)SVBfU~rX>S0k6 zK`yuK2nVQJ^px@Bh?qU`7-*m9jx^{qC`O4H{ZSR%nj%irZt*jtBIFd*6KchCB#DiL z`q-{NOR<$Pci6u#EPLdo~yJJyUGd@&;%w1LR5+os+p_6yRPybWeAY~J5Y53 zOH#AL6Lo}{oUEwD8BOloVkcmi5l>vhoM3jJ#Y44Djxl1#Lyt7O&k8BREU9%%0Giy1 z(~o8Q**ab!%{GSDXdBvE2F1_8UNfe5A|e=LisNM_l4PiH``M|vtf+>-0hG+GWKJ|C!JRr(?Er7= z$&!stJHWdfZSMP!K=ADw*DF(BX8O{WE!5v0?b(7r98zjr`GzK7D#6$@vpHzhh$P`z+Gli!4&Sm61?*LOa>l@2-^>mg?kJrA!X#?_ay)-+t9SOf~)Xkm2ewV zXSk(hrfg%{0rfhoi$U|f34@IQKn?xAw!$kYng{|HzZ@rKcMdQltF1MAbFvIs7KMjW z8gpk!)#JRsw!&;OVF#Cj_@hljy(`bjup!4`(~~=}ut>I1p=4OS*{>5d4n%;YH)NQk zas#oQfK?6IzLeRn6P7}7y6GqM1tzfKcAX(#+9=bREfiT2y9Z>aObHdUUk5;=9SUFB z5^R*oal1~~Lt#^9Ln=XqHvQCY0ja@gLk@~Q5aFwh3A+%DrP6*KMvSqaLn!ZJXbY5R zzu8w}L4s54MB8=P9i{C$tg;NO*{;)xO;}mV(XSa|W*ZaPEZm}OWJ^}&?M}gVE1bv_ z!QA;9?cs?w+LUd+;aKB78`)bkhz(qhO@Lts;b|#6-P|;RaS`@89=I2Xs6!~BBk^aB;^DcH@LQcG|HkskBRHO}I-(h^<3ay)%noIyoszPBN9aF_3OG-xVk_l z*>0B&leXJs!=&wY*xEIos3Mh;-$dIYHV*2PMD2xcfG-8AtH-cG*-!YCm?_M|+6Sr<}++ zBnxHo2>O^P7SU_Yiz2N$DXnCeO^Kc?oGukcN$#sLJ8Tw&J8WcYRwoh!oV1jI*Nk<1`rtRb0=slovtZLC43U`J2b zj>woZ3<6)OFieqAn5zq$V5vpZBE-%epbZE_6G=adt90-z zSYCHo+A5@BjmKM3N~6&;Cj$wLH6XlMkb(PMoD6Fup_xu$Jlb2~B9sEo1eez;5t3 zeFQ3lcR+g8`3bH>?|8C4Hm+dl6_keIX|YOa`a((TGHC-%+U1f4j$uB)1c^`%1m*LP z!Z04+leZY6LB z2X5AGEl39dkDP*C3k$m+MrFURwXpjMVw49Yf;Z>7RWT2d?69y^(ZcSBH!?>|iWv*r zi{%xfUc8Xl7R+rGiXDE4xCh>_)t!l`RH1$j<{yAn}ZqjSH=8aq|Bs zD;wd3y{+u>Gf?Iy3bGc4sSd(1T0DW3Ees4RTdIJSt;sR4vgJzA%V${Gh(Lr%-HIzs zYZq6l0Whr@X#vZCx6QD!1q=Ls$;u8gb5!HrtlL=FxPgToHx@S5gvu>!&C?x7RmQXz zEo{s%p@kisw@TF&U{k|~#^G*|DcaP?2$O{|Y>=PfOL!bbWK!XX(lJ4rL?nqxodR1L zSS6F%0OKq|OIXMN%)oFUD5sf{O$}6yO--yLo0^bAlNybrNgV-#PGkTHoZcq2L84?* zms%9U9f&Q%NQ6zDn2bJ6NNd?6MVs0b;b(wo=a%7JLfe?s{}FAP)H}%JU=}NDT&AyI z{TYy&=nkfxYg$mWn+-ONECADopH8BMELepqzv&p0+S_gxJKVr4+Ra6HWO~4f%x0+2 z29QZEx0_K!>}G*PyIEiuHHQYx4oPI}<{h-&*v$eHyP=~7qy3THY%nB0g?4kZTMMa1 z!Q2d)fEBf(-KGjhrS69(as>$cei+Rf!aVK*C~5`y|Q1B53MFdr|HuPDR;2Ch?T&;%pP(8yoF$z5=qQhmk}4%Ris>Q&)& zZFpVJE4;Q_cwM85{!v8Jl*NiB&@zcFjLR~jIGYjriRA;%OxOU(nW++4xO9#|&qF-W z5ea_e0te^I$;iJr$4&;$lz3}h%ACq2F`?Y#4Yz#|34Jj-L)S0E7&W*cNQ$!}c~!eON+;&_p?^Rs=VG+&X1H376+B{_m*c!_W*m)I$jBTx1dKTl zbp=Sl$=|V?h6!O1GRgD2Ko}N>z9fXPNthzULxW}CvHQ0tu?~YykvIjA43P@E#gtiR z!7K^w8Y&ZoPcm4$B+)lGbH8|9@cEKNcI1EG10Z-X;V8SoU;AQWJUOmY&Qrq8dH8lJ zrecr-zT;_C7Eb+w>K&K0;J7zON2^!h)8NceYCr*ey9!_9qx2OfMDflps8=|}mO+0| zCWN=w@DMC~v;uw_vJJX{gavz3l3EM64=#KSD8)ruuIO8<6f@v8#Jd$RB2s+`kxnd2^P~*QFarZ;J@iIrEzntP&{?nY1@0z^@R@Z7 z8ZJkI^=dfLS+!$yR{m#ncodN-kFR(1Mg@nA6s(m7mn~Sp*#}O)2$u!Kg=enyLWQ`_ z3{ly>>6&{RzlJh&Z+_`@A?m_Tf<}xw7KbrGpsx%<=s}7mIe8Ca*1=GAC}u?%feY|m zEjjqgp_Dc2-e%C7a3>t%j-WLTdJL_Ru~;q%$1z04Xh>N6xygc&R%r|=o{DIDdGfB! zZySK&65=N6Rv0c^bKvSCe#VO#B%=jsSc5miGEIk*49hf!B?K7qio;2Bzw7Ae%apiD zq8UlNb5jLpF#_!|Vw2&wo^b7(qvU~X#8)sVJSrjSqVWp^5Cbb#ksyFiinilBV3F_=(*wNo0}r@|dzR&x`y z8|m?oXLHVCalq614c#jT#flvuDB#^sFh;RQMbbAFi$?7%b)+0BRiGFpz93RA zzolnKRiMPyWgW;G0w=JekO05Gbim}Ora zZfQmp++>K7z_6+g6&Cq`f?;jyETFQ)Srdo};yVJ(#}1@J0S|MWO@Ej(8+2&Xqx04L z*br#~>VuZdkfI+wdI|fl;AUi=WZ;20-U=6Kp35;yohe^70%7*wOt4qRl?&)E^%H_6bKL(1O#w&jO51^!v3?Sa76aQEBJp(Gxg{q z5DtyvK~KO+IN|>aR>Wm}>|pU%nU@)&1E^5G~Fa*K$eD5QuP zt?~RktN1<9&%xZw60MVq-=2~V426LC*saJ2lyX3G3`!7%pZzKZDMb)nXbhEIiGGEm z)UpmDjdnBH!@&X^kr7D<^f(L`xOPEkiV^dbt1!jLGS;*{#=&k;zW#SCTlf;snj!T6 zFv~)g8kQ}5iD&=!vMhw`c0BvPmt}uiHj)g_{(qBYMJ4!uHOs=B`~O*%vj6{QStDgJ zM^#dNvmwH+<+)za+n}UDZ>!v1Z!17~HTnfKNGi>t!iR}AQrx~m{fI<6KS?aneX_xV z^P>Y51wS~%mIr?2MXz#PryYmbmaAGY)a4LchqHDaCKH+q&S5MshuFfhSYwRU(8RzT zi0>RC#PbzYg0F5PoRkp_)P^v1#_?5i-fdA5BP(|74qhXs8IC5vUattR;2~zz3(Yy> zgc38xm@N*RPzDWzh8T-z#~^7i(P$ME2@wV>?NvY&TMCBJmmtz$npxO!BY>r`tyYyl zhQ>BP@)d2Z5abO-Bx!%n{7Q%!7Nbolw4;`Vbs_qp+Cj8&RwvC%Z>_wC^=`CxqlgkU60+*_wHF36Vn zVj-9Y?Qhr5Xfh`3TIgbuN?)8{4$gcA-(@#wLD3;-oREbOAl$N_L*pBrg5U%g@8Hfq zh?^kng(5u+bFLB{2~l-_aNmkn+zxtifx*Mpa&T$lhLc{v_klX1Tk+`p+GWBB{`oGLQvxt z-ZtvHjCZn?f@%so;49lF0tH>gBQi-+Ih(qQvWZLAd0XtjDr^FbgcGb3vH*f&@L>;J zL^jo>BN8VOru4bK~A!K5O%S4n?+7B@=ALJ6M7}fTOrTl9^p|0T?)P8 zvQ-p%#a+^PiDj24@(MW-d>~6$rN}EpI|B^Pq%VuS!omj9=ueL#ul9_YrK~XYO6mzi zuMj9A##gxf4|p=j&EUg96jrqSAB^&_!Hn)^Qck-KjI@%l4ScbIh=-9@avw%o$$c1U zr6tm;f`eJ;8bw+)avtH<@F*gs(TryL`?a{e%_@2Lj4bfu=!l^Yq zPO}N8qv6$5T(QR3YoW<3L0Km5N`iM7cZG_u$Wyi;H9?0Nqqr;WG44tT#W7Rd`&5d% z(%@w-`LoXk28Zmaa)r_|i>%w^*dY?@2@w%3wm~2Wm2>j8GmNb&r(hIY6&6OxD7Ff# z#3r^%7@lVhQlvCMq}UWG@bTra+k z-yB+ONXbq$i$W&0N+=%E9$aHadBhU(8FU2W6^gup(mdLKPz;7RLS9U4l^oJn!N4JC zREP!mQf!rk2Ot^%u~kwiAD-ylLQZDsh?83kC!^ylB(|!;#8%-*?eNh53b#VSq0l|6 zFsqx`DlF+sY*htgCJGui-ejs8X0#tzZ zRS^bPDV$hb1Gf)d4-)rZQ^J3e$kG}?o%>-!6|BasY1arq0>>bOZvUwHWh*@IH}o64JCa zg=3>pPy(wUltp7fJK)8#FtVbo-d0E|1i#>DXf_ieTlj_4kKPl(EkKa*SNNpJp%_*Y zMusg{#n>{&VWFMSH;S=XA3@Sf3=JZb1mq062vS0`EN@e(k{yI+>CX`78ir@-4Y)^i z7NW$u!KvGYXmzKyi_rouI4D2#tfBqr6wA9G0cRL-*q6px0JN3V*f?=g9_ta25X`G4q~;s8CHfUshin3{1Aj7TMF00bBGm&0p78{(1}L)8QM!y zuW%`HP$^uhz-$aGMZ}h{jERmC87a|#CQvF0okEC~1iOXUlmezU@~rag-uS3d6v{S3 zJiSrKlnG?}EJ)$@e4^>%48;c@=k%$o=)) z6Jd7k$BdXO_J_p3kw-$##nC9J!))q`=wQZlxc93>25j{LgJ2Z@XEJCLJ~m(|*udF2 z?GAAEMJ;PHlrsa!tuR*~ztz&YLaiK;9&CGAk53Lk9(?bZhck_-hn&gf(Tpu%V%VIF z@yz7{FRL3Gxv-oc;NoKE)6Q|wVqdE1$XWjSPg}6aTElNFjSPles_PoU!|7#DAN3^> z5V_#}tZpp~WB=mxmMRj!aAdnl>Xsy!wP3^<%eQzv(~LN}&1qL%A#s>FA+uv-ovQHz1<)AH5G&TmXh@J5%OmTyHuD+Y!fX3$EJ zD0|)zJJ5hP4Q?x!5gWLSXz_y2u|Y9_8W=4jYO~(a)W8)2tan&u8BxyD!jeTrF#OU) z^WZiv?=-j#TrnKVh5QDpO41t*pej}jE8K?QCkT|WTAka1&bc_dsx|1ItNV9IQQBTu zSdyagV$rxMY8e}~e65dr*hSTVWtzgwhodq$kz#EG3J}Ft%*oMbvXz4^2|0D__}BulGnq10qM)H zJ^^(X3voN)+z(tG)bB=tI3d!mgvPKf*iB$gtjGp$^wDDrz};n6MNldXkQ7qU{5CWJ zOW`gF?t+tyk_9P7_M`xmy;Oy}T?&SXXf%#mHd;omFF&U-LcS1&8wu@UfJQT-%d^fRIUT{` zkrFg+WW!C$?aRO&1m!Srrx~EoNQvx8G2dvsK|W?cK4$2P12z`HK=In(B$1OSc?=M#j2_f` zR8p`z6alV(@J@BXsCr$u+y7#BqrW5|D2v_&`_Gh+_7R1{C&8 zBZb?q=<Q1us0v6y7vA*c!d1C2W?IVRN&=X0gErIWY{s2dQaBYj`*+VBkcoa@?*8 zal?i=M$eBdFC-_d79P%HYi*?>euej_y?a61{W(UT?}k8Lj+JC=~C4rvgO zkg9OqNWXJpVGyS93VzXTM*hiE0)dMiDhk8Jnu)2`%rA``kli4XTfhu+vvO+m5*PbmdwVJtTc2v|#1uASG# zDmRj@7r_!7nJWmd<2Bg74VaMU+w@{ZZjs`{!{Q^t;-iiCwb8o`M35#I1p}LkMp81| zNYv0*B77Su8XRdO9g4)PHgdhf`sjrZN1A-6~VKplXJ77YsUMh0D$kh*ewKLb!m3XPho0GmlO*h z5S7MN7*E_Y2*zTF3KOCwuM89wP>G!t>1U#OfiQWv#xPo-xCQ_2r}Kpx%!})bS`8=| zk%ynk1%aps2#GK^VpvH)ZpO@voGi_s8y)v5^a`mAJqCS49SDtr0wsD3b_HXP)mV+V zaEYoZbn|A7i5RXVG;1Ofuyi9cHnkO*vQ6KDQf1l-X6_nJxdzD;l@*kakmU3wIs%d+ zWhFdb3m+TjrvW(S1&3dSFHyz95Bt3TRa9MYR92|E6nIzEU7&EdaR>4S^9(+| zL?JA`YoZ06VFawMKU-)&VinH`G{ajmFXpjfE||JD9v?}^b)Head{`HJf@4Z#Qg?`E{Ia5#RsN;MykTsX#w8Zu0sS1EO{nuW!0 zupIh=bj{#!C7Q6^=Cd3I5KCaFz-fy-SR|PQ2cLwYiKM~c_CDflpWtkdDIp^#O%Z6Q z-h@DL&J=sFCKBsbj0;j-a5#- z3_(PNIi-k zTZjZ{yBx@@M&FhZlhdr^M!U=8@@kRG$Kw?cFB7e+uz?zh1)v1M44IjciCPw6MJ*7i z9+k%8g6SYkPAEy?%!9iKK>*+iyWwoITgLl9Fe%f=MZSwZP856L(a#DI5il&ho|nNHq=IA)PRi-VAu^3fghMnpIiQ-Ey5{$?Dd_mfy1RfJ@*Y#}Es`!#ol^AtoM)Nle1!lKX+2CN@NXlZe<*f+1KK zCsv4owlN^UBn>e}#t#ITjPXEjlaFT*-~{EyAsS*P_xoFGSDk7}w#6eef6Uk)^{Lub zwI6G*z21B6$Li|DD|x7#opF z`RQub;NUg-&(;mV3>Xn4WOv8d97|!OtJu|kFTR+Rz@eQ996Z$3wKvN1h4%A9bO-GP^4N{hEA zJ)NR{ekab2=k+^~XKUk=dNC%NjrA34;}uu#@8L9H9%hH-IpCMX*Ohu}dx6yR`c1{9+1 zaS!R5zRb&ayMX z@K!v{o%x!lNb|+UV&?1I_-6gCMnm8?+s~_J3ob3eazC3r*rr0ZY^9a3Ni0eng3mi?eY24DzmB965A{HPVu(N=XiOKUhb@$H=Po%&e^j!@N>so zJmyE|buzJxCvS~yIqO?6Tq8oi>q+h@R)f%CK7YkbymHIFq7hyZNU}R@lOPv&;WhRp z$|yN7_lw2Xnw*9FwwZYBa#AmN7pV_$j3;*)ri~gIS+9XSH0o61;OO>?NqyNP)LrB& zgbihNQ1^N-=By$^_iXpap=Yxsq@SLRUuHzYF@wi!5ltSB1~&>t=FMlY1aJQhJPYf= zc@q~v3<&yhTnh!>o|ZS)$II7Q-|nDqtZ@SYi%R4nyVc4LdD(3K4;RGCf5n!D0FFDw zS5y4npNYSt=+uV%;QDy{<*<44M-;`g0-&5OWhafDt0$p@tZO_kT@tvg|2Q&&-=#}3 ze^}EfE9>%XLp;6#zf(X0_;7D)nI?6CB-KWIX4Cb_cMHrJ$X_-CLy|Ld8UNQfNNxwa zQN>vTuHs1q7l^IuHBv1GVXHCuk`POtCmNfrflbK6P9jMMZ~3^5qwKTY^yH%VHL}~7 z5?kzxHJa_}Lo%kOO3|FX#1`n{CADy%A77`iTPaN-xY-RKqt=_$3&7MG<@W$jP`t96 z_2lN5?0LTNKol}t^JhQ+FoLTYYPth+%mc9~skTllU6gv)dLQ%)WHBX_E+i<5FE@&*apv z4W^;D5m%5hXSu<r~YsG9EvDEVJc?UP@9zf0-#=(Mg+K)9!5cWuPc@ zM~?TDsdl;2Z4+}1btuQz%}w8q=Y`QOXN#mpmohB;iMB6Ot;lS^!Y;qE&6T#y97|RBoO9<2k5~~t6UnS#Mi=@Q36~RO+ z;IT?=8Z=hX4~GWdE2^UVwMwkCiZX$~PLnra*clE6jP74yXpY%NI&`1_)oX94T4G*! zTu3CV1y?pkAuHxK0KdlVc|GubmN}a@H`|U>#LghPbi* z>t;+}(8JC8mdQ=`@lXhn4H&A{uzCr#WqSTI=4!MX7~9% z{UQ(w%jXL$U&UBfIhL;iXT&aS0Saw{1hp!l?Pk1MnC&lQesRT5Z0E}fL1C4nJ>B*R zC2TWXX;uu)wE?DFCKFgKFOqUFfghlP;(2-&)BZ0}_NKYHx!3E7umm-g?C1Z4!5<7@ z2JCQ>mLmK8i5*cgB^z5^3rves$fh;vY7akJieR*kSx@foWi@DJ76?8iHFJ<}!SlYf zt(miNg)vN}6LvM>!*;Z0)Rjnnjz}q9ro(nRyG)~OqpV%TNNpeFfDKv>diVd}M;AWx zWB3fKN?suJ9kgABj>6g=ZGBJwO?ZOm?-IP)-n_spyvI-JNL5ZlW9>y9L5O@&~RcON#aFxTK zH2nyfZgJqw&2XZ(%4F+|YcxOOoOtSVXBx&lq_jyq1D}OgmjlH{$1;^ZIIokL_hJzy6S z^fQE=Fgz1KC_&f>C1Ov=Id=Dau`haXq}N1+Lfdg!3+|PCg>G%?+C4l}8$4CA-3f}c z*m^)*RxYiuvVX?ntjVoU+7oe=mP^+~SB!H%Rd+@Uk@iHzeG_i;GE$1=DfKj{`ql43|2A>v7X#(Xu(n#$>+9U+Eada z+9Z_8P9m;Pt#xmdx#C41 zdSh!gJ^e+PElz(Pc6JfeX$25O)N?v-tV{l+TO?I z5b6G*(fn!W$E}29z$ShklrDkBo&U%4<6m#D6=F+|R3-#XP9;LkBnIJh zNNxqQe>`D?nuJR_a*XL?F!com$u9M;Csq=7h81-}X#5jm%^Y#~Z;b}my9zt?6Rh`t zv)(DI*OO46{z75>3D$h=3Fe0xTN*tW)Mgw7S*X{*4``(#jMnXH|lBwSLQ2dZcLl<@U0Tgu?m)nE4t{z3bq2UI}|7)5(c^m z(J;j{t%O6$$g(6HQcI(yrNJkz)_Odo4et=v*(Tr&QW+u6EM~7<>_}$CCX27~ICRUb ziZH$AAg^JpZbF|jtk}&lM4G*$MFI$sCZ1!}T|*t|Fn{X=sFL}$7b9_=J-xe`Kk)D3 zk+zKA!N}aJc#<+Wl`nMm(;7c80gE#mICs~egT2`v3np*YXi=h3KjIltijvv-Jx^`F zRIDN1B*dPR2YHVeL=rY~fv`DJTp&|vXS--1y{IF`52x|Yto}NV4ZD*wnGk`{c}84m z8j+m|hp~x4UePoSkHGsMsil_giCutHhSbX)@|dXIw1teSYts+ik!H`l@eic+>>a* z?|u%Sk!AH(EiAYGHHR6*VjKA3b%!ksXXBUArh?tLj$S7S^l9kZQgd~a;6YC*xIFFK ziYawF>dC~;Cbkpz1Jn^usRz*#X%&mVT*Ml$jT#wgIbnJ`lXup%i37V3y`;i6F^|fb zqa-rSu}OR!?;sJYZ)ejS2XfQ-`&rzq^GzKH*90FM^06Or9-;iSn`t@iR#FQTR*WwH zU6Fq?_<@xcgzFg+cZ{;j=XF@cmL-40XmKR7|A!wAmEv9afV`9%!ZQB0x_8Pl#+&f7 zIO|HscfwwIJ59THsJGp^S<{@fz=k+ohLP!F`9;!cg)2@nozc!q>GlfN8F;lqfw^r9 zXHqmSGf4=nYKa94#R@a8D@;V^RI%5k1WrUdaeyCLMEJa}7twq?9nTIGcXY~p^>w}# zkmz8XH7;32gC5_&*Gpglj*>|TDI>`RZm1GBQ#pR$KKQDmIJF1U^Jm>DvE^F zq~K{e=30{^4Ma=Qyo36e4t1?mP&L6%AZix9mWr6IwENOkEtVK>)w!BZ{!0k1ZZ|yE zx|@%r*`tde;*o@iZdub3yaPmG+j)xojsc!g$xRrgY^l3?C&7cM;W?ig)k;2W4QOdm zT(`iPNhc1=zzlU>;~%&2KaLmAmbDFCvI=9@sfbLy)}NY#9BA1AGN7ZOQhGUX)|&)? zat7QbLy;DMEdmupJNoK^#IYOhTv!HH~eCq*s9Av%V=<+=Xw5)AG7j8uQtFb`Xx zNIJdaxnK|OG`-Nsrt~qmGri-|ArrXxf|ji^276QuO=T2IS6r$iI_ct08=F)oEg_Af zJ(1n;x8T#eaO2Tpb2YP!nMJk;3_N=2=E~z1)$;^1Oju7d@kNjxU@+k;YKq|jG?q_{ zQG+!z4NWqLtY$V>?`$=+03cS3L{Af)N!Va8MEiqHJDV#2X(OGwjPJWI`%MS~AfTKj zia~2<3yfz4zO&YvwvDSmg74DlRoW~dSgisCtQ+d_a5x?JJ&nEDTA=DgRdfEERZSBq zf^s+c_o%T^)F>Ln^7Af=q(W-h&u8OG!XD?Q(Ije1A!$;nZMj_DiZ9V}>mX0egsg_* zL!|s9I)&{DA{b$8Ikn}s?rSylot#V<3xssCc|al*-N;gEP}=^j9X!F{pteLwWM6=8 zY)yAPo$9%II!?N1z*lD%2#z&c4O68Mw{q${dv`MS#ZtDlmjA-VaZkMPulb8EjyJU* z)Lg$^q(xXB*ocV3U3wsz17)qVO(TNV35}A2ViH7O9jp-n)W!es4pxGQg;HBaJGBrA zoEA32S|Ku`*Q^A%0n=n)>uO5*iPJ_~m<|i(vsSm55sOa52{}!#LQeE~cj%X10}X%Q zx*LoXD|LWhA9E1MrkdW~I2E2?-;<)>jJAm46v|Ov=Q{w7t?U6G~xoGyanT z(G<)xdS_plwFkw-g)&hNx?Dq`E@ zs3$X~_ptA!b%o4}MzXQlqIvN2$RfK;RF1{4OzeN0=b`r^mPQ=QdpM|uSlp-Mb`_xH zDXW2!`CA-7W)n7NOK}fMYwvrg0*6SrYK!hSrybyvYr1NZCnk9lu3%7_6qGD3kt;z1 ziK!2vP12JLxs#fUQGsR}&~VmOvII2A2kpR!Q6S2zg^gEISBk7$zn~3lriHa2jN4~N z?JZ`6K1fp2s)1t__St2izTt&gaaTHH>E~q(&uqHg4BYwIVq1vzg4EdiI^5GhJ_zJx zD$K6?{6ZJZh+PKRZZ37zo&0f~{*$s)QzkXP6zSBvGSa~+lY%BV(z;!XpL5M3h-#$$P5G$4?Y(`|9 zpX3i*4&mK8??P}S6)*{KSD_oJ9he#|!DLqNi&OEF&HtA`PqM>bU+Bu3*=`lQWVdRY zHvH0uiT)^kUAJnm9i1lsCO6R-tt4Nr@oTWJi4xUS5ZJpp2BwpLl8<4rEB}92W81r& zYoc%XTWU6ziV;`XRW#er18wRZu+u5Of~~|j7l*jKUdwVo!sCFBh-PdWsJ@Nga9%B? z6#S4aUwg=SUx{5uw~DGrcpXqidj7WA(Ex#Q$Mb-4(o@Jj26MBZm#RwA%kgIyh2~B( z8-r??(*oDW2#TEk?as2=5@*?fTrjWqusWMvSxu1~>8kZ2ZC84Tu&9pK4K)$xe1jH< zs|{OHsysEZ=^x;l^34y+q7T+3_lqO2`v?H(OdH!SqFfYu2p|G{D611K@Q=qEK~ny;yuPg>)vb;*9nVAI+{FJ+CQiN zB@0U0OS`2uV;4ea1f$lz0hbX_ROkO%qb0!<^KfCXkULg#hzV^Kt!Rq24XQx zBj%!7?&lqc?htU}oLf@4O_T%_>Xsl^)7%&j=4)NonHmVAdC&#q9l*!TXSUIaRSRXX zXc0GRu+*hJNovQ}&+E-PlQ7`f%|)GPW4!IZlH9m8*uwCqg*(C`oCU+l0k%yl5zCLVXwEC12YF$%mi?27yMEQOGNmzbC(Hdm{Cq`q4Z9}1th{HpX_O^W2!%G z$7`8XTH&~jz-oXh?wCKXp)^bSYOUC@sf&KR2Hz3-v*sU!y7)Ki?X-phJf1~97XOH> zy!r?`nBD|?OwmN^rpjB{$BumU+E?$uhCw9_aW>}MYGu=p=~?QK3Cs-MmmM93ySO1z zW(W|$4U}SHZD!pzz0R|}m8IIPC30?jhwiZR?2iD49R9YY-a`vkh#Rqr`m~i%>P`Vd z&IK`EdlB7am9@UjDED@w2dBIYEOU!!U3JkTjD@X3o&8g!6Fo! zWL#rH3`~LT)@IOIiui;uZP=Dk)|o5Q;Ahk!H74f+I73bgOvPU5h*f$Dw3XR5bx>q# zP+IDsg*nWFuQF{H`4Gn4Y&)tStxNG;x8>HESyL{jjd~8Hi74j?OD_eKT_(jUUf&K( zbA%M%<@wl-wvck#jL3$5;_Yk*03t><&^p*UeddyB%;h3K^2Y*r_SCE4DKAjt}?&NGBxyp#^c{^l9r%E%{VWYdtgc zBRH7EIx`QLmr*tXX0SxFm6|||1m$u|h@<>-EJ!K&G zcd)>}X*SyS5z@HcBznn~8x|+3WVtDAc=u~}3XS8`trHTY=ugFPp%uk_Avp0Iz^VHI zKGut{Jhz&V$`@29kgeA-L=4Ak^)j&56${qwR`z$U1B!TH`}napC8PO@SjlXQ#fTR) z6C>`n3GrsOKW=5S&JFx#*F7e>x?7h&;Nn(ojqKNEQoPVd9pXb%dD$IcQBYeLzQt1sZ!DjbNw~5zu(D(b z68)L5VL(q@wEvxS1=#9wRu~{>YpDhw^Af9nOHr*sS*bfhGd2q=N^#c#y}}gA6`i?Q zA#H+c%E@XYq;&dfc|PbXyhD>LVk0fiGK74+#$;%wRtR2nyU*aJL=ppI~RLIzXP{rmCO!#jPbZq96(o2%8PmxYqS%ma;7k1Mw`L z(Klba9l~Q@XCL}UB*eRsC)reo(em|#c@1G%65B$Wky9p>aam$apV<=nl$^j%qI3s= z?MT9&qrSl-TnDkK;tPxi#u;1<5zyN48>EL^&YCl2LpnVym9PjXH{&H_^!5CpcDx}~ zo1kd&OWJLTlo93@?@Bq#te#`$EF%pUl!3~@#FUVxmur?<_r7%;x7+F`88*Qp#O zz01VRixAP>JqTM8Br%m~amZU_S}cwP3ZQxtT=89{b!JCKbqR*zXI#;{t?f5&oqN;o zUb}1e-i5jLHNu}E*%Ks$XrK~B`7|C#;s|ZsJC6flJv|yC&!b0R6G}zf~K46Yr!YHKH29IwW3`p3-6@s zw?>4-*brRAM*fK<6p?Aia7v_1;~r;yVmJuO2!|gAwH*j7}-cpB5nv90xgNC z+sU@st^ww02y#&Pu4{B(JZbB7#5XS38b{Az?di{;Boy`K(pAZy$$svd0IS&*{2)hz z*$mcYZd8{p=`VHdL@_~|9UF#59l!Lz= zok!}pB#6S$Aj?CM;g5BwDKYh&ATn+4%?@6}@@{4i3ZiCDEo!iNrkUeZRHWc?C~HA# z*RY#c%sc{exYFqM6|<9+#LW#Xh9xSqRT!`&m{_`&ri(KQXQyli`%0Z-HrM4}zKdjJ zX4bjR>?a4@HWDl|8C+k|Dmmct;0~@3nQXscWB|S!GkgK0x&TOHM+13c^~)c6)q zZ8ZeUT(lq}*Q?`bK?e*Koid%jainJF%W`$NCeD2dsD9Upbu`KzEIZm(Bq5zD`l*DG zNA;7PD(X_XL50DDZtkv>9SPke$7IoUb#soCoQs3j;Q@7%F^VD-uVn50+!k^^3!OXQ z*{Q>F?P9B`lyKIks;QLhwGseTRIBzDX?dSnsYtuRHA#5`T_HBpQvTeN~w zMDEQVvVu~gC&RbBdr&9NEE+ldu*!LRB!6~)?o5t zf#LATP(QXAX0X#3OKAjhZ7v-^Ib0YQ00XDO4NEu!IJ33ABX;R*Y2Qd`$B|{Wwg(i? zFj*cE@KAaVaj#vKLVcMJMZwh{K+Io;ko>&r1j{6=Qo`(Vrcn`QK8`fSuoP&}tK27M zwLWCuf{+S0hj36A5$A}eyu(VQ3E0hK04in*@uxzAXT}Z4Kq$AzbK)X zL#COPC3I4-FxQQ~BBe-ph9f0hp+^@-M}*|l+Pe_Lp-pHkQRf`3{kTM zZ#YETB$^3T$ye-gW0Jq6(v0y`?gz6|%Iqg8e?oQyd4BZ=i;tdSN+sq>{|I?QHQ0%3 zKyGORgW5(RrBB#?BoRY`-65+VsH!AcXeuhF?Cld0sVjDb2{4=cl59=15mzZFY2<_q z7r-}72}0zgdox5R@FOhU2{S~<5K$V2!v}dJQ0vF*JN> z4u1m4%Bm~`M!UI+7tHi3@kN14iZ;+nG(NiO6FKyo1xgTnWz-vYAy!8+C7RE&#$HFj^$=f}a^;A`}86^8ur;l%Z0Pkl_8V zB1~YdbsLE;9?EPfIEe=B%Edx`9u7JZYxmT41%{eecB)w|wNcq$&inBm& zR#&-)-FVn=b==q?{Aws&TL4DZjkO(YAw_ZrReIAB`fx!5vqUZ0{??W$2R_{Ya`fp+I z6tUF!eXPO|x6^CteXK&Gj-04L@MNUKQrl7ktSTiMKDgZ}35a6A(Y4Os*egIWP}bGW zx3}rsP3pTA)`(4NDP)-F+*)pvTZ$T*_>vMVnO^aPSi9L3Y$;HM^?=bgj5aZbrg8W4 z7=5tS$ou~T+nb~mAvUr`O29~JWTkgtg3xHITu_ng$G}&N57ALoB4=Cljh;!Ee2Du3 zf?9{j+NH*Bi|7Cr*uxl2Bqy_2LbVc&St>;%(m+YeO^-WeYItGDT*xloX}M|sb>M^` zadL7O8wYH)sW;2Z)xWwR48DvH;*)GcoL0bwPENk0Zwf;oyQ@PNR(G@qHLPCq2`Gpd zqQum9casPSNr}gP)hO|yGjusr%0ZJwyffU@+?34Cx|SkeS~C~nH?oHQ zGPVVS3t*gx%de}D65%lU|3a&r1Q@PXmzY_Ml-gDlJ!UK+@CZ4R`jLo}&kMbzFS1%d zAYxOg+Q?9Hqs7A-0ifhaXN{TS$UBu1X^y!W^EXd%m^Zzhu8|Ugk~&Ku!Lqj zM8SNOh>)x>+gB|(V5oJZ!}+pRl1 z4fGBZu-h@ZOsNMDe$kQY&~2)0-@5_t5Uboj(t($_>^%1cB|J&J;eJWKv9*YQv4bQX z5gq79*2laVgb_m7D}9hJI*eJH;wqwtlO^jz0ksaij)GKZkpnxtMF}+(RwK>`H4j;N z$VY9QvLyBuF^9Z*)Bsr)t0Gw5>9Hk4^mrf6kf4(#_k}HEfigd@UFtZV)c8&*+K4f^ zcK7qFa&fMX6twks=jP^8(p0iMb(+G0Y)F;)!!#PYAhg<3-X-}nev52Anw~otAM6q<caMN1= z>=6O1@7#90ID$|>erNCyw06a5slueZ;Dsp^(%eCP8F7QrL%a{tUalCY+pHwxS_e&) zxxqmRPr+)fV@#pkZG222(^R1Wqi0cM04|hZ=&zZA7(}543#J7JJMnPhV0Y8u0It<@ z+Jm|-!=33hcBhc!B>(nh@tU^cbNc~+O}_VV1-F&nDTBTtK+!W&zyIVtqgy6Hz#il^ zY?mfMbs2b}gKC#G05ytnbHL6D#c)#w;TIhobtytyK`WT*)B{X~{=kc{4nha+2=x_o zfLINli_alZR4Wv#)4s7vg(XpN`LU3w#ONkPjtk*v&v3DJjB~5JQX(rk<)MV-X_z!u zuxu8;9+%6{Cyq6j z+r&6aatw3V;0}o~+{xmCq!{iD>2N){4lmhF6}pNbgeLt91u`!Rmt=vt#WrUItj9(GmU!4ma~*v_NGsPb9~0z%dg|j2|gS)MuZp)`#HKf z_C+{p?@)H5OeJNn<@dcIUO5T$k8hmK|Md;=FJkoV1bVO`&$76O!9Q6<4ACXWd})Cl zGCYaLim)FyBBc6VT6?LQ1o@Y;gOVFik+d`Pa^5il&fgAd8_A}mgWhHfr34huxBgDN zxqUbW?5>y_@78TqYtQD)2wc_dcUehQ`-fG7(9I2e3X9fdVU)4?#m`Pxy(T%B|4o~$deYf`Ds6sK*P$9=U4~J%f{%y9hDS{`%kI+{eQ;?3%kvyQV^UMSZ1!n|r(v!QHe-(oMQiTHHM{f0{y! ziH*<~#k@<+yc#neI;+;X*1Hn$RcxiyGQ`BT`7QJSGf67b-V)1Xk=Rl;L286|a;orW z#DT;KHAM4D*c>y;}CeH}iTAw`y!U+5X&A;_#j_U9zFnZrot@jl|)h>|KAzH|!Wowo~IN z7+U5%ik9TGiN!)L_cv*P^0G z|0LEojAvm@Cr`)X;z#kYQRNq~@mzlcJ?SPZ;)djT7NMXI9qAdaZ3Jc21>svICio!! zg-dLIF=r)<1{#-fOQ?Mc{WVr3>R!B#y@fNECPi)BWM#zMUWXddv}+MofHtN&kuK1r ztp?L~3PGf-Q;`DOs8dwQj5zkSsHIW2qUn9T=fzi`A53!G@_%C!S#lpc5!B>BXL3Qo zLl`qbdTr_)N*jOL;=GDHe@GW(0k{g8@5=NP@+hWL$)$rP?(EuWtodgU_H`^lq5sFDC#58A zQk6DDKJl1L1hGNs3P*?zSFjlPjuy}l{B)MnQ)m|fRR|kUJcwaPQDk@r_8fORy9Yd5 zbo!jp_5&V_T~M>&4HI2OW?rXiRUf{ldvR)u;2WtJ_j6HOyb=!hCT`AM#I?CEK8_w!V zNXtn|1=bEG+Xk?NUc!^TqdN$Pvb?_}F-Cr~_$}wwp3JyN27_Qi>K~)5cCO7L2(P2F zU+HHr96{=CNuDjgwE~wC?Aw-qtMth-G#o!y5aJYdlC zG1*(3orE816Hb*qWENm_%!t9xSDGIKEqX ztX;fZCGm0sH~K0+zPmrU)sOG)x8u7{vrkX>`0o6Be-OX4-S01Gt8q6zSdYd87^%fYPS`s`ylU z$v3kQ3iXb$=s*IEC4bJ#>U}j17|4HNcYIQ`JRkhS_~dnUWkp+HwmoY+p<_)YU{~Cx z_G?RCX1V40t-Iq56Lt)=AJjdj!yzR*^YoAM@9&OJS=Zo{?bG;o2LI0C-&y=Sn}284 zF5=A@MdUKNx98`-BfjAIyr>v}5!9dNG8!Zl)ssQcp5BwvGR!&X48U?#abT?{Tm<_R zv&ud^Vc&pbA3t6B(^nA+W5;3FvcK=*ZC;_118RCW+x5YPuB?{4hXPbG&7rblEpsv_ z(y&!xzJy8tAbC6K5k2dSDRA}*`$4tooIbKiAn3QQYb{e!nvJMzN<#)$7;x1Jxxtkc zkyV9e+Jg#KP#Ux@9Egq-q>)pGHRUYgtVk-B^79f|DJ*f5YJmbfQt0#Ia7cBj?aRmV z9nF;A>Pu~pbJHwyHVGfDbbO_JBMkka4P4T43OJv!#@KW~KUxbZ- znCk7#^YpW=d72y_Z6;r5JZoOF|N2fqKCWXJ2?qlJ5ZZ;ClorCo+~7uFbNk2NeDI8QE|GIoNNaKOvsjzZtzm3cB5Zy#yny1 zAQM`4X6K&J9_;iye{NER;-S;-52ahSrf<2{%h{Z}wJSX>g)aCh*b_2AP;^ELN)<(D z{}i1g1SyKPsN^h7c2SbHRdlwdt|-##PS4ad6eZC5^J!gO*rhH=UKA#^W>hM?ZYh7{ zwaqOlCA*sE`)r&^BBy4zZ#f;w&J?YxtVSHPT8+Rz0tpO2CKOs)i;FtIhsaD+jva+G zj3^JElJkf{WJEn^t!_oC(c=9DB{y zsRM6F5{gR)i#8YgI6bw_tRQgt-<4$Rgv$4%Q_xfW(Lo;I&3ujAD6$4mW%Ec93J*Tog!~^nkE78P-jz5)7aiX}+bFSf@vJN<*niBikE5&CjgZF@# zR>ga)hW)h;p;HaDd4*F)e?!AX{<1x!K@vk$-nTw#GY7wc%FaV(XFYirnI=2JI5D={ z=I`(53ZcysGAcsA&S1s|_bt}$+yVv@%Sg__Up zhJp4mv(2f{kri}A1}#cu)uIA;C9}6eM?sSk!HZ-&U-aG=I4!yynM1dv$VTSx2MmYs+V=eY8Yfysk_WCNv-mkg<)wjg!Z6GT}mWGq}_F!Rja@yePY=%wG!I<>$G^?f+~8IwmB_8$42=*A=&qc-v@sPLlN@&T??`p3=csJ}okgI*w@g_`_5 zJO0^Bxw7#ZC6d%f%wWmj)i(#CrCF&ofo!l$lL?hurrA_~2B_Cka89uRm^I5q2-r7u zonPjm)6~n7d7re&#+G1)(#1+}`0*#$=2ss=wzYINvDFCa+NOw`CV>%_ ztDI%Bb2yG8ruH;#CGBhTWp?O#I8$G8h8D;cct4R)7d6lJH6iev30c0S2`4_ozR@R# z^+}`hNwBv!&+@OgAX>1CaF9xP`-ggaAbB5aIAm(<17MOS+UHByu+?`Ci}N%t{egAn zLfAj6>YSokp0d8*W+~3MfFah=^S4GwA!zi~rv6n)MzF|JDGXga{fw>A^N^$Tl2@}^ z+1J~iI8x@Svg_1$212A5_i4xdsPjz$ngBAsJdFt)5R0p_9coheQ8B_9Azjl(*j^(O zZ(p`vo$`PhQ$e6n?Ag(ZZtMs?7jkv$4?TX{4fD1(UB z0md(kt4@F>-=Qz2Xi!W~Bds%}@(ks*G>Td2L}&>T`)(t#WnN7sv`No$p#vd+)cq1` zpl)aT73AUkAi#8Fl{2^gEB}pLlMZ|+h%DYeUbe1OWNE=DwhWv~mta~RdFPaY(=wG@ zSi(u;vxNaJIo}R!dt@dby)m91E>FN55pT{f#Im>jI2>3?m?wL11}rfVk>F86VG8yu zxg`EoabKitbL|vjNq*~%@ySy*xhA~q*5TmMnFWJIaLK=YW4z(aV;QI)&M7w^xtMER z$LF70;sIFJBI@NZ1Yp=q2t^jv1|_B^8#hJM?#D90kGN?gf5+Z<`O6yMm=o}d(%Epf z*>JXrR@`Bm4QHDT(RfAvC2ylDX?r0ro;@&(XypI8ml$DF>>CC7clU|u+2#jRk~5n? zQ`2W$P2Y&DqIz6ZX=E$a6l_`~snpYJ7YU5Zcv4Vo)6-`<-%3!~nqPQxJk&<5-`FHE zm%4%TfN_bNm`z|KKR9zc-$}nOkOslVNGUmH_M4ceMA876NFj-N!`Xs~dAm)_v%l~k zVY&f)7=Wkz>1$I6ejY4DJ(9W}BkI{n>#80ZQdT<0v|)=Lfy<DERw^nP#?or6$G(cq?N3$8Q)o5teZKoo<23q8e%qhMvuFSH ze?q9b07EiVh%C+_E!*l42dM4PkbO=+;zVSQWwUd(*XP5xaMrnO-Rp0WC|K*R*AOE7 zoU;(d=n=hk>Mrs;)_KUSSr>Y;y;#CSFe4NgcHTMX{l_@2Y7I2^sm{xuvctw+YG-Nf zqty^-TkS{)v@JR!&x!ah9XTo%DtOfqL70>fOt;?rK<7*{c00#V?f|6v-8x^}TnVu zgEKOSEx?m-a1^QBj!~^)lckbwDW2W=_xHt@<}V(Mhx6Zf9MzF}IBQ-9uuX{CV!f?1 zuR0!Uf#4juKJcpG4QETZlATGioaM@7$>xlCPGNa9u}8e9_^UCAOK!3Gv(%zUPh#UX z$KWxQB)_N)_jUTSCV$}1;@+pl*-3+>GPWUEn*=PoBt#j98=GrG;X}&c9(rW;G|$VE z55_Cbp4mG0fo^ilr86&Ov8_wbd(lvwo>vr}_X31@0%OzG`gGk3crqkAOa77%vdQ*g z-C?uRz|Q3oyO}OGb9vY=PuFIGtD2kia|KEV+q@+)D`7l98ImDQUu@9x?L^}#nOnMv z^8&fQi1P$>hN|9Z%_JWq3AChEo~QwwCzu(N1!|#lTj%EXJ^JR4eEGKMMLaVh9?MnN z^V45s0EdV4Gw&3!0Gz*;n&wHpRMzXePzFrdAe3DGOwe-;v$>DdE?yOhjubXuJi*tN{C5i7Wmse4+zbN44zCbI7WPud4*IDh}8^e3+O}DzD z41H$U6v9iRks!hA^zDH9R;%`nX!j@ToKj(6XcNW}O4-k98vnVWF;+jywP9s7sI>H1 zo1ED}W>&WL@)yQA`;H=o7{$p$aoVobz3jy59{*VqRAe>_Ve82r!NX}mIzQ0?fVO(& z!(1kkUN~HJ!rpP5wevbMSxNU=ip(qD7EoHEG2!#n-Ls1g-iFq(Uqa4Z_oM<-ay3B; z8awQ?nFWZ0TlGj0C$qp^Ur?+II-Hgh9GxIJETrdhj~+BWC-n+ zutXVC21mQQ(CH>9BP%4U$84nk{3uAYCV3}^C!4|~?2_KeTg5>WINYfGFqTHMYN=vQ zKyml$N{Ri=RXmsfvONfXDN=|NpRoH4y7I)2l&3+7^LrwGp&(|1q>@4H7f8P8xkgQI zpo@I4O&#R-5-gME5R=P{lUHP!9JIc1$8)z#zM2~}qO01}2b`|6@##0jWGj46@6_Dj98uF_GxXQnHD&u^{B zHY(*ydqwu6E?v~=8KiYgY_f}=iY0T5Xr5rnw6{22MPut1)QW!e6A(+iIylE=Dwe** zOoB|V&6y-5bsi(8Vl|yZk(n0?u_Ya&%#4@_WOXxQqKq&F{bm@ohgb(`!$(w%#Yc5M zw4tRz#0*ARsjH(XY@MpVIKVz((%H8O4D;UG;&stC^V4sOSFT`CiRfv!teOe$YuYCB zSKJn#^lPKaoxD-U2k4?SVy;Gj>rQ@9lYxpLCDCnc@cKz~7S~38z@ZtU4^^|VyO#C;||$iI18Jh|S~UotAYLo@2*V+g*n^hEIL)R(8X$J3{cDLyvLE|9Dm zCN-0aM>WIbm}qCe878YBDh!jh!T&^N?WjqU=o@rtH%gi|4X)4G9v&{<6fs4$*Km3| z+#lrJng5U55q<`<2U%Ey%3~{{1Jqa|v+=c@N%b6xA?n-kVtQ>e@zqWQYync;hYv#s zy0KB(IWeqO_M}8qKPVnWVHy3$N;8r+XL-x~@t_0^9fhQ+Qlqu2&m;N3K)PPWNNXZ{ z_y`TuWY+Ym>y#smi~Y^&NC0{8_)xixsY4KOu0AN~h61|b4aimMLp7l`j5Lcda&HqI zu(3Z!2Fdle*Z{O6$riheq1Lz&7xKYH&DpI{bG@vJ1@LZO3cUALfk%~mezgq=8YYez zz=p+e(BhP~sa+dzX!7sEc$Lw~+bE9W5~yra=(L^46+cHl*%Rmp??BPm8DsqpJ$bn8 z09IFguI(xOf~X{$AUjW@oFqR4>}vNJ4$5a}EteF=aOXLqFzb1u>97?us1>so((un3+2&zU{giqE8s5FTD#U?64 z6p+TT1h=BV3WkKDHZ`iVcAIcbC*c|xTh)s~e^t1=kj(^q4qX%4D%L)1RnrX&BE;B> zBX+u8QEIE54=U{-Iqe(`(Vm{uff7_rfN*saqKD^ZyI>@r3WHi%8G*br3~HsgQy3J^ zmLQiarp8znM2|J{PBo4hOj@-P>zHGPIe)enHJq=gjFmzGxWg3L`w0o?(vYVF zXNA&)!A%L&Ay1wrbt?a7b-yB<@HDL`?TRu`273uI)Hfl>%5zUUmTS9dz8tv(u69?5 z#oQaMaI}%n5{hQZx?03W@91Kr5u++GYi)H^sqm6tH0Q#L;DcBc5yP@&5~e0bBQ=L@ z1r1N}FGdqpv=3^d#B@c00%^cjtd4y?vvv0Na1CVm3k5`wx|4^Z$dBJw%~0!Y^X5%hab?*k>m?_khJ8a=>jWFHfoRc zW`-wP8Q!Jj^U|l82HS4QYu#C!1!7|nWK<$3?6uPk?Q)wUo=qh&Z$a^v_>d9^*9ViE$eprWRLp$$_T)cnP%FvuUOYgy zDRQ(cb32*1yOh#gb0A*QXPMip`P?B3ls?Xa5RY(Eh`B{xs|B$QQNxTMmd;(8l$NqU zMn3ne`C)x<1|~HybICKcHu|#t#v4mqHiTG$T80i)+zYs7=s<_ExqoI@QyP}dUGfZm z5$D==CIDb{1CzW{Ja9Vab{(7A0@j_uC_qHi)J_^$D*kG#WG-YZR06OM0&+@J^8%2-VYc$*w zu%~4TX6S@5Kaoi-i?B^~8Rl_mNd~YT^=Q`)N5UWP@OA83P46jc{7(ZDvxx~Ng+?55 zq;z0{daGr+6etwAVI;srT^NS_y}S>3Wo*&7=N6& znkw9CP_(&IBwe@(Z7AO1CiNTC;b!317_6EiO1#wE%%$_c=ILBI-Z!7OiEH%E{DpVLXI$FBFsk~-s6H$( z40L{QG=Q_~M0O4+BYM=x|L`y4la~=lXN#aY8T99Ye1URk+qC!94xySuakkKC(HkA# z37sVOh=$i3t!Mx(h6IfxOMVRP;gEBDOwtZVrK#$eF3b(=+#zAfn?9?Af9#OIwOedV z)_Np-(RcnNzZdo9uUNoX=v9znzsU{@G%_HEXd-6T;#@;6iO0TN6)1Zs3w^vIk|+Tv z%X(bIFwE+>i2rynIf}~YtaG0^8R-gJgob9O31Jh3_2dSW_}_xRnpc5+dnT3Hu|vN7 zzbiA(!nkPQc=iYl7V|?3v+>I{J)8L&ZOjPxs7Q7798IejaxPPuc`D2|r}i}r5xsGd zNCXHhDr_>100Mk-fJrhOQdlosd`xte&~!z)4aiusg*y-y0d9c4;mtkxU95h$Dw!_9 z+gP666Y6uwI}+@eLHQEuQQWT8kzz2s!Vz_%Tb*B?LZ<2_W&u-%(AbauV4-A( zn5V3L9wpGe_kN$7N599+y|0%EA$@{QFH$si7Co2GG;gSSLKDe#`~j&g`IS><6|+`t z)0Z*y91Ur*a{7(F@vrGoe%W2|c|UW)c8Mt3OuVZm2Tr!z*gl8pHEUSeID?B0 zL1xT5g9!0=Shk=gO_KHK>>Zl|mkAol?fLT0$7epXAduKAg^0L|dA1)vi($+n~hlC5g3ITYp+)s}}_ytUaOm)YG4Ue7Nib~Jzb-SJ76m7zN>;kaRcu3sQ)&Is<0 z%211FcDN6uwJl;WcoQ#5XCR=JTQG&#<~QFRZy5Ct`@@I*&2{-AZ4Ff4i@y+G%t5O* zeRsmDnd$&9FT2CaaK38pjx(3H_W$&AIaTJqP=H(EC(Itr7a+O$-+m#Ux$MWX_{)YL zS8Vw6jG+a6fP}jU(#l_QAbw8!5c-Z3@IpMU9qMEAWIYus+YTyzaSHMmFF?8>b*Gp- zZsr(|uQ!|KTnMr4Q^`$4 z(6eHj!6$Cp+Bps}fov+M`m9ww_xjB9FtfJp*ebb0)lu$ZJ+K+c1#gcMzPDQ6P)BFlBNG)#HeYZP(W7{Fj&2PR)OC zU%axd#g@7IjaR^xw}y~0?m|}yZ!{m1ovXQgNzx42M7-(c+8iKP5FJ`BywS-CHAKI4 zw;*>Ag*P_Z+m$XSq0)3ITP)8uqD(FiDim@IQ?Q&}ef&Xmshn=VoGGDDQm%w?C(g8p z8s-8IWFEoP4Gl{Vx3|7*VUxHJH2EbNcoxkXsKwSAYU`9fxyX>bQB{_6b*O8HTe`;7 zv2ZD)*A?klY4h67H57DPuzA%T@v}dbd1zENFI!anwat3MEv;cG6}z>-;aj#mTeUd( ze7^gEcy*hnuNMHQYPOcjuvPchTw&D{>5$XjNlj*1CZzrM6M^gbZ7O)X1v^=3}zXW^LV4rFj|v2Lq7_c`O?_mjeVL6;=Q-;F=|VZhScx zshE$orehQ>P}mOL43*ahvb}##gKVzhYd=(MO#0K9^rwogj6s12))6Kc95*?2%*P8E zteDE26bjGMC8n~{QZ^<_865`)v3*a3?md%VrWk87OWHtD*!Th{+P2uoNCCr}pn%ZK z5OR#jQ;I;E3PO%a2{-(xAf!MeybWPZ@tWgfq*2vvot}wsjAbXW^rQlUf}{MKH2W9B z$Ul4ViOgT{qQ_ynSMp1)Ap5<6UoqisW5iv9Cy7JvB4YI(xC1n>C%cmy+Udy-aPcgQ*0tj?YU96({;Du)4?;T*vo?d7IR3F57~|a{+9Xe~ z>^LDbvtI3RzU?b<(uNuHOwv!?xidnHu^q7}9X#1K70Ow!7-C^H7uO1ga|HzX@>al4 zxY9yT)1h*q6Ah$=PNcsXw-uZO86v4S7|o=y(or^)))QJ`gdB5%h~kh?p(s#T(Kapa zA@flsipl5fb;Z3)-{xie0s{3#WGf+r>4YVUy5C&nsXN&QRATc+59KfWYJnTSnw3^j z;POOh;j&rR;P^oH!TpjrvmqMG-fP$S+6UuPFIMgxLllSYy^2;7T0qLPJ>)tezY5Oq zHbBeounZ&h~5w%qBs>-8uTf;2T}ip62b+kCP?EUn&uiFs>EK@v6=Yh{5@Zb zr`zL+4F{Qz3<$JidBsKcc!^-kUJ}DdCiGPhq(Ab=JRY<9ZT6S(6!9-R@QwvMFyy5% zRj(y9-MzH3T~u~(RIfvILtYx%-wyYC>|=a9k}5gp^JtmfNDnsnZ4hP7Z#GZ#%_w5i zMYfe2sfe*ONFM_ZGYS0ETf-jx3V}wJ6vZ}_X)qZn)JFp%Z~==AA0rL!%(`Fqp{>zd z*m=pOAUUJZ_;1O&lE2XQZz`Ff01E-0oP>h2gV9H}B}f={hTj(}NVy`!;X=I&30JU# zt_Hc10g5FsKuXTb;62$@d?c-0e-KHMEYdfiBq2pHOczJN%J??Tj+QHtd%km>o_Q4IoO7Gz!}Z zHlAJcalYb^DAMuBVF2VwmJ!ylRfmg*OwoaIAp#6K zD>ZL?ov^33+7d4-cH4kn^CooVZP=%3L>EOX*)EzBNm$a3eO}*@+!v*jNch-YxVcmm zl4`vi_QJ(B!v2h^Tmnu9{ztTtbV}!cEQYQQ2c-BY2541!*+AMv(us_LpLuJcl5)D^aFPp45#vNYe zcTDUUDaA^Fzx+Cs(1j*A2qZAEE3?a~$t8lq?s1unqiiw%{=;#1^tbu^_0c8giBd)& z6cT@AXhfhX!R-by~_~ z+XJw2zBRw2RqG3$lEb{P)+;{syxLWi(5d9A!PN@*vIp2yc#aUEA@P?^Rr{i<=lUpL zR8s;(vXx)2WlFht%t40vO8Fzz!5JQ-)=O9j_6zfMOI9fE%?#3_c~vZ+tZm-{$;YKU zh?FDnO5Ned0T2Kq7+BY~@C2x-F+d}D6;RPs075gabZ7hENP7y{OOEom13{U#4+3G0 zU696XGh1U1;6ue^BLr~Dv!jjrHPT1>k+ zhrNSJntkY+AxC|1l~C^~KL(o^UF+1XX`7wcOEB})Tbgw#XoFCSq9#_Qtzs?1PNyo} zP)(sCU-8Ygyy$C#ux-_8OGC!^qEaUmwqaMb7LB`o)%> z4*jAoryMP|VjNU05Z87WL_K~`RX`z9^1!8QHJ73%od4$)(+82ynfQ?2gK6?t?Bq*S zDRyd`WEiI5?1JN#aVn6-%Jv6*v$+fCId5fcSxX$R9Lp3|U{kt_FGD4BT#DtN$|ta-C`RMKur9^B3P3 ztv?-P#?r6sWZFb#8{8nto*xgk*IN}Zvup3j=WmQoZ$9?X1)LpS&Ef1wxYDLOl*2J& zFUh`l?TuEP@nIPqi2pzv;AQ=(C;y_8K!*vi=g$62B>x_B@Ad#wCJ7r|MULn{cYG)+Uj*nhnNqNz>SJs032ZUvgDOq zGrEEu2{b%5^X=snB8jB@fcXfvpmaS**o>nmc^$X6n#%kFeI#}`cy7EM4Sz5>iD&fa zmC5O8Z*rDuOd;#!dQ&)M41BkCHP=e^uba?X#~RrZ2vh@IFu}HtzQ7@c6xwnm!ofPa zQ7O79v}H-V`HyajR==Dy%GOsIL)Q?3Ckh6*6JXSbeqWQ(Q*BZ@v!ltPmH_Q=P##@R zV_=;TN{c_^GIH#$=l}NyqTd*Z6arTgP0_ztaI-k+#+SJ}s z?P4{UwL(fN#r9cs%<~Z$5}D{FRf77AkuhM0D|@oQy~-JHi*WhSc>2mip$yWkzF-#ZY?y|fMG4PA1-si{li+T3xV0R5 zW%H@8!li!p*V-^8M>a7Hji-HbL+mYD@YJbD^9Wb1?jKw+4tLYPp z3?@$TYN6u>mex8Gd9f%^jWBS3jTI_{H~Lc3;&b_h?853=qFczA@d0;Hpg2}51Y5zzT}?#Z$2EY+9Eb)Ixs_v zZ|F6u;4je>8|vJ;#O4&R+v);QFcE$+KjS0ObQ?|kNJG39tAKvvY;VXF{+Jb~s^0bU z#~Un3gq8u8q_jh($4N&;|AoQAD}k@S+QX|_QB0ZZ-Q2SBJ8!gG4PNoJJwk=FhEhtC zJG0Hdo@@fLe2jSOpQKD|`LQd@U>KHr_RtpJJjUjEt_joNr>{v83RS^|*-(Yje_H!I zm>_YfWzwa4yk#+%2t)l+j?wcOgF;c9XMs8<1~{UZJrWUW_4Bc}x%L+H`C4`Z8&b(t z!Bp!{7rme}gH28?$9Ug|@!mKa#*Vi3>0nyulWZb$0HTDaS?7bzuK3qv+)!4&@WA8} z_Bfi=PcBWJDZ6>atJ3v%%E}@^yF*jqs=En1ySt4Q4~AaU~)e=EZxPi z`=R``^U=nrmcM^K8gGjhz(SGq^qgf^aM1W0&@ZQ5b*Eb;Bb6p6h0>N1bPLn6FHK>+ zsz9)_8Gx#id!mQdU&s?y5BS=n5Yt-nB7HruBR}W1=E&dH`|>+J8oeeulAn4h@ueg##0%6AA3ddhcjXdV5I_CYP}B5tmuUpnR;2-H))qnLhi;wJ+~JV4<5Q@tcJ z^D*z_XM8exc=+J^Ste&24`P{oV)9ebvMBmazVXx1^IKPfdk{n-YU1p@{OWLF!ptp* z#`3?tE#LcT4D%nzAOCc8dSYtaIxVYt*{ACH)9#GEff79NndlULF8oZiHo73==N3U5V8d;esf9nC0nGu zuSCc!_yAIi(S+ij8ylqd)tDXDvOE#nDu2%WP$4f%gJ1}p*e=Plg~TU;dB6l_6pbd+ zz7VCS)H@UnGBen@)AtRINxvt~-*kWUbA6J9`261d{)K2_^XDW0ST(|`xnA>LnW98X z>?;ZM4d%#Lxy#2t8=V?`F@O34(PaL@&qhy+zL3A;v(cu(>m;n)EKWhyU;J!zA^6z) zxo9?eFhApS(d4>~v;%{p);PNk4Bw@O)i?77f&K9A1`&#{`CK%%ywfn^18=C|J)eud zz~;;={whj4as4$nEwP0VR!i6;~-5eTH>nS5U04NkiJOMewTo4QZBD@xh( z8RVEyH`LHNs(@Un^w{i-n%~b$6NyqXl9T9Wf3J} z#5&F%pf?78Yg2!wVNs!FC?U@bDIc-0ajafny(`*zDON$mPOltF__G-Lmp>o1w%*h2 zqSa3c$#JpS>KKp*LDP5K9qo(0mS6CN=+uB!-~(7SM+Ux6T>XXUP0`xA5ke6}6I|!G zz~~-(#6Q2-XOf5V757AcXf=2n$hub!*7B!+F?#8VRq(EFL?`8!eldFPiM^hG=8MtG zUwA@YQ(qB=u2L9=6ZRWTw)BCh%=Rwm!iVzf_m(so-QH=mRDV$y?)P+lMAL1vSBxYcf)}!Rw%&`d2VyQm zrtt`s1zIcd(U^qF%#2|+hCPwE0g~ehG6Q%)oIDe2G6*p2GMRZYMM09m<(3bn7+0`ybLT4LG=`2<~(OHx4uD>7R zcyIot`=g2IbNQkBqjbbS6D{SmMM&C74@7~Mz5p_M{R7eIgSS@6=mQT#Q_;r!dk;i+ zuX(^wihkjNwdgz2=0GrisJ)v}cJQyHSLR>)QuN~C2hg-2L5sj<86xck2ct`(`#*8* zK}5_8?%`Q>7#(F5zq?6UNi<;c`R=rlu1XHD$Bh9ks;WcE)-F^)X$EO}lDqP6emS~Y zuc~n(+YWn+zx0)8Q*?j+_OC?GK&H9(E78H8xx1_{@BeD_g6Q-4555|`F}gc{?Ss*C zql5Vm9*j2S-+wUb@$0krS^u@@qtM>J`C9b*(T(}5|2mot)M3#`|00`tKJh1i9ep<< zgkZC%rRS)XNFrB)Z#1l{Q-+yl8wD+cIn=P)R9TEBZX7HYCRH7uz?7>v(L#mv@^^3V zj(qs*(JP-_R~#dzOq9s@+FrU~^qF}HG+*06advRhint749!uh(j`e*1*Q2XXv@!|p zUfF%e@C&Q#Hy(~wysE;KYDH(9DOo2ArW88ZTQa5h3gve9;>3E=9tU=l|K-=C|8T~M zL4nabEg!6lJg@#GIj~IMs?H(H$mopCVVEz)l=3d>iKa~uE$iaq_|pbiKlQ~{e_`M> zh3%NSiCFou>(1Z!jcEOq|Aw6}ajx3{{HzlLup42Xkh^^HoB#WA7xFB^UHW#s44#Fm z6pUIPWM?Q5QiGW5Z;39zo(1>Ci4hyiG%?uztfUCm+yDthz|Z*GXq{Aj(ZoX4cLoAd z*QDzI!FQs~zxw`Lk^V4RB)bqGrLp^LQwe6S4~K^m9E#_Xjj6$&e_GE+AcMtJr?79*J$mf`3D!H&klckFSVUwLO052{@dS* z-oAZ1=HWE`C&Fv7(StyDy zcOj$~RIGX6nt5W(8kK+e+tJW6FxO0b7zo8zl51*i*t_{}02m^?P}05JYY_pi5>xXA zWby_7;XS@mr1xk&T=Jc$*)$KOwqS~&H*0i(Cd*Y(Pj1QI{+;No#{c){G(z}Zaz}pP zJIE$~njg~7?RnpKqmw7tYN?eXOt-57)AMJ1H#)Eq!=7zvg#T)OK=oeV(%5_b(-u!Y z!_1osqlni?td-9PK_Qe@eC}K%5pAZ;P}U-WWpxG1eU`D8Q^5aF%u; z1b^sW0>E7qWZz)-kQq=-DZ5WI1}ehX~^UR74aS{)k>dXoT3DoGy|Gv*j-~vjXdh*i=BC;20O@wEzzQ zbFJWsj3>BS*uIohs2Z8dU#L0^E)`9c9A*^H7mBK!7g~?}#hB@^urdx?p$xx_10z;g zy{%B75&tUcO%)h+UJf;B?o9wdIaQ z*ZgC&Yne>fPDf4dM0d)kAB!@Gk0cw&BpU+d^i-M|D5q`j?qlO)J#Rl2oqA4?i_Pb2 z4u#;ak&jke07O@(`OfI7CsgCp-*{H{8`~HraTxtnuy#Nix*wm5y3iNaMlsojZ^`5{ zImt!4TfnYC4KDH^vw^+&?pnNUg;<4DaGbp=zos6)8`X8XJ6^ff znIZU6uwJSp)Pb0+>)yohyOMtteZaO)C__x52L3EZCKBc450KfL|8{qLe)LEAN4w+m zqCNTdy5n28yS^uWMs)WlzS?76A2IZ248-r@=i!0)hA|T4vU<7#N%Z>jHx0%oEq^<;$en5qL<90% z{{OT0E^u}gRsL`9UHkO=u{-H>Ixlk0$*Thigja|mNKSaj+aQbrf`V5@4ZcuDXZ|Xu z5s;v$fglw@F$hAVJc6P`Wwa60@RCN+iHZ`$M`lEfe;Fq_DEIqYwf8=!Lk6Ay{onh! zpZmE+`kY;-cGap?tJbSlt$P2EI~x>kA9B}r3wJvAC7s1zG0iRRQb}BUoZzps{R7k7 zFn#=fn)^H-H%@o^+Y8b`?1f)Uch^K;^B2r;3!=0A%`@EG=zIP2Z6Vk)tKP5o{mW;vjsGow`AoOxva|by8yNlBe1KYgAoYr3^(2hv)h2h% zRErPz-_LZX#{cTpU%q3o+5o(35A~oIvUd0wraAwCS#H_f2co>0??hes*LO}B!~_0k zv)pR@FZ=J|7A+Mtkhej_fq8wBpR*Pp$*|(|TMYPsD5}GO2zQAzgMc;?3#RB^f6E^3 zS}=d?Y{k%^udh%IO-Z`?(Z@u09{^4=4efpor&w3fQC!` z(PeiGbaiFfy_=8jiaVE&^DFM}$m^X}-NDfl{y6q;{mzP;8vQhUf4u4zc>c8ef3CXO zUa6%I(1etuo09YCM~)wO=KUxJrBy9mu>P)B@FP5yh^E?;Ix@N!cwOhq-z~k=zjBT{ zV!!Mnov9Jl`=tdz#@+lwE&J{-qUJvtvc zXaCREfwd_=%5O$#4z`j0yFX;Eo6-IYJ-4UV`ZIZI+o7l5kNWq|b)WG|_I5K{FNx7e zy8Qfk?k6*EwM_}Zg`OaqFJsGcs+Oli{JI5h$R9M{^-Oy|hXG}t@~1m}F3MJ0S96{I zi*~K!S1$n2ulaKqxFdV7wk>Q73v0oDbAhWeFWVQmgL^MDO%Vwee%g1~&58dI`MyU> zW&f^WH?!-1T8M}Md)9w)*v&p@UBvjHq%HuimBV*da0{|IJj~WeV&bceWM!V0&Vv{I ze%LLEZu4^&xa zcEoFdweod;$6~iQ{&1_`wipI_r7!L6X7^muR)&n$L>{Bq9TEKct~y0@Db zJ?dBP>-O;9+uP0PBL97?HWMz%JL}2Pu>bZFx6pt7$1^(;%^VTVT+rDln2jht+OM||;pPR({2ksYODeVrHckTx) zpY&hYkFHMfkM9R8pA4`}39TNwzq{G*5L_>SWdE7H*{uiBV(vyjZPGAv1pRLTE&hD$ z?*#q~w&?TgfBMI1z6rFBQ{=!#<(zxf+e)*eYkc`_r2&NZrq%B7`iEMff0-|;qo}p6 ztplXHh|h;aP&heNVV0B$PI8CZ74RILNvlzQ1-ueqn6WQX?9r7HT=39efrfRZgp;Dk zk^Ok3{xR8h2d^TJb(LULul?9Ay66#F%<}`{|Kd~#4!}vCFWW>%=TKjfdXH%T1 z0$THiN(h~-cz%>Yo$_du&3nu|OZeK*BR-g9>0%%oDgcKJdU?xze3ye}jL+J3+!;}A z4EM&xCb+go;F))x<{AiJu0~Veba5PS}nL z!T+M6{&FlDDjN;;hZ&7!L_zf3ISqAZG}P<&o)ays_Z9@wXH24;w;F|3CA77a^44q# zX^P|8o@g2vn~XHj2OV>eT2ox*2U(j&AF=4;C=6i27ION?Lf?kh=waX#q`<(6p8<)j$j3a!mUj%Da7D^yYeOrd4KN8Noo(8;qpa>Xs5NnWAws z6(dDGhoBvcsm?nE0-e#y${>0=2VS?y(DTPhaVepK5O%LYQldZYABJG3Q!#~Off>>%bqc4YRJaW-;S(V$%s=j4IG z83#PZfQX`dvk*!Ex9uEf#gsJhCB2J#MqFGO2>H<1^4M+4hGcWF@nV8TAKegHP+H{q zs9W5O8O>3O0vTc(GbK|hQD`}>03|P@fGSkK(E-mo*qt&841YWa$v#eaUM6QaYXfT;9&;2QM*H%~*s|smBM^Y$ zj<%hu_KMZ5b^>ou#U5iqK?-4t z;pWfG5QbaD+lNA-Q=bEYVsKN0B1V$(3nM`h<&8G1TJF+l^Y1&+%|Nl*_lZ)ox)=pL z3Ux6;T|D=h(xK6Heq%TK=Ao}ZTwLdC$8kb`gHCj3{Y{O1rm3;d zOl)kL|NZ`M7A^K4;3_n>{{e2{kd&EBmoXV4G%YPQ z>6^>&c%_)+e;T_l1QcQ%mfWHy)o2jock7Ay+{|Zf1BR!ZR2%t}IN8K!zj8Izw#UBq zP%`-d95`@D)+y(JBu7yPbR!ubDJMiDyO9i_+5%8A5jcR0!7;@@eVE&0ZfB-onhi|8$$EX?8)hFiO`20AjyYVNt{cSU(ko9B--^o9ji@O?s-9y0Uz5fZfTCe> zN$VB^W>LKaC*lmAIFSsrpgu;xiY{k|TJ+A4VX`9tEhS8%zb)7o2BQ=@-sYAtF;XFs z26WbzgFB&>B_Rz+g&MjxtX(rhe(qC^OCw+usne0(9!tCI)WKU$tptGrSh^OBqbeac zy7~&ka;m4(H3%M6px&@G)J8+=*R3Dg)6irJ=8({2n|f;knw-$2>Y+XVgCktUkA5e4 zZT)Y@txyT;0C&*K_P8ezp29zs{A&#PmR@Fhm=eY(E{;&Br-n0N>)30#;K8vLxC2*q z4ae(}9`bLH@nAzznIDKtDh9F9qBpU;VI@95=ZI^gR!|}3&WuK5Yt>lm#KvfgECC`^ zwY6vC)xC;lE3>;YkQZ57Tp$c&e_BstUApTlfEH07@>eT}^u>){KcZf{8x>hQdBqCZ zBH4E6q(n_#t(sj0e5$yeJG`wryB^wnRnj^X62^-vRGHCeYO27vGSTV(7yEf~7f1Rb zt)T+GO6#hY$`JoePIfi1piQm0eUMv+ zVR`${m7;^n4c-Dt1=eDgpsimlL4VKXZs1JZc$j8rNPO0|l6SEL|3Gcwn+{Mb>5Z*L z8K5X*IKOr5tqO-V!>(T&7-A;fbb{O*X0S3Rp)sT5NBy=7lPUhK?@ii#dQ@rZ%-oh)w9%{Mp$H&c+xfbVdIL47w1c~NCD zBSMiF7GuzM0ukvXzq!L0!xU-6E!=v@aXN&%(*7;tgYCCr>Y1icHHJqP191j2?1UOr zRE)oitA6$QNw2@_*kr0d@R-sW>qqu(t^e)lkmeUwKV-0})V%r` z17&xVs;<_m^^XubN7>C_0Idam!aGW9YF9j9>t|nyzVT9zKd&SD=;Udl-|+jj`n@yV z*AI3^S52-qe%N|dSWf=yozayqozwVXRB!ZaMTRE(1Ep!{PFLr18&$uYH-33nbmhQ2 z7OV72fpxEbadi8V?&zIo&bz5ct?&bXAY*HW7{5JYHYv{%M7~Qpxjl1@-VfTHkQy)X<$cC|m zv?{H4eXuW@6-CaErqTQbV7RuSWbO;8C|GW6yGOcyDyIneM77=jdm0_fEtptqfeg1P z@jV)N@ppQ;8)JjZ0HN)TG1sk4QKl?e+Pr}k9_mh~WIJXFA|5R&IIzfNh*6x!LXm2d zr##e!9Fx=zG}*G8H+Jv{DR96~@5`FzX(&7?fG$78PX0um@)Q!S{*V39A$1g+>>jg- z*Ww%EDsQ4d;y)DMij-t|qnt%U2k|3{4+{q0%&7{XiE7_aXA%uyh8J@^Z@g4RG5HED z)^OzTs;PQte6-YPfe5O|e{oXu+4gJ!KkrW;h-OccBQIbyTk?51>Q*SvxJD@V+b2i; zQCbQb9AbZgsEe3|wNOim5Nw&Psc~&e)XNxklt7{?doTOt0L(r0TKFfQApCJkhEs-|FonWC*PKI*$YOV_H z6qkorJ1ylbjoIp+Ax{M#we&@#$DmL9z14@b?qSGtpS8ObfXclIm10 zx4;V%ma3V4>!6zQR1Ov=WvES9V5wR||I-@U5`uH4YN@IfHx^ZA92Air(NtSrWz>Ws zNZd8G&_(TV_j00 zPor6zHnPh!?Jk+YS}Wxl!6g|GkRzl(gjyi8d2o=JTTXXw*(F)QL4vbR4w4KB<{*Kc zXhCzPnnvXzQ91!RNV;rAcd_$yw3~@j;+CWFO?bcVWHw>@PI7&-Q7)6(Gq%gpHGTCV$Kk z_yDXuGm)F@VXR{rxNStFZZdn=-*SX)9b)U=%of|ok?yc)Uw_|`ZXZ6LJ(B(CkKZ-* zW$v+P@Oit9P7x*AJs6j&>C)$YbhP{M{{_T;BtvZL4@rz$@AuKO$&`6f@b;kdr&W2I z%{kgg{s}jTFfcy-c)aIaRH)3E1HELE8Rj8OCN;0{J0Fi{)@!6O2BB~byV)uhqY+C> zKg6nBjBg>1S2q5ss6yT#)74v>b@g()lw}>TuWkMqNXTsUWvIi}y5!v?Gt23YbQ=|z zb=zvOc6;aRyS}3;IuQ+EVoOAB_7@#|OO-o zsbER>6}5k%+EaF^J($NYY(%^To<(hIp&Zx@)v!S9L`u{yvc6TOY<;W|eP zURa@wdc8OGaErZ~;SVSe5;ZiUAtB5vz1^*nr!2<;$WVD5^TU-X$Q9`l+8)s>gS^tm zE7oc)8;$X{`wR|bt;B756ZVTb_Di3N`)67UyrUMT&_XI9&II*S&F}kEJh+F|=nOTu zzN6AFxeYQ%&vD{}I*doHOr}noWHQ(#2V7pKZhFr|I-sWISW$FtOAxpwZ+Vj)mjZdV z5lUnvgPt3NitT@ev*K-qNJ*>hVgC!s+7{$VyG(QO;bm(kBarB(dFGz?{lDN=wTw)f zQDve9dd|qL`6rVs{FISx^G_x!8mpk`r!Elz*VlwWEDJ&67XLvwI_=d89=U-*8m!9wq;~|LZmS8WKhA}DEFiM4nVer9%;~FCg3WVJ#A<@qz zKFm%T^&u3^3}Yi>w?-N!OM=dJ0sX$Kkt=Qff{orJGa^zc2G?}S@i1?b=-?7>)_v?OBO8vmWZW^*=^?A`0f7ropru_TzP)T{q z+A}75#rpBL4EPTn?2e=M)`LxqnK!BY=VX>&vcgT0EVJz@WSKdS{QF*N0_EBj7K>s& zq4SSP2K-M~nEXmBrNQ+JU*50SnD!J;dTsu0Di4gp2)Kk4>ie z?;T<-|M?J!s`Z=p9`yhGQbLjT^$QPme;-}z*B$CEiGJ%Zm|HsDpS_YWp6C60SGuA2 z!?AyEZs`>N%t|+Hz{nKxIx{=IjDG*MyJpmAnSh)lR=H2qA6gjq77-%ceL}7z6wBsq z2$Iq?`2a^;?w|u_whe(hZbG;PX3SBD7E1{qZVzR;GY=h9E7!TU9)$hARQo56&nrIm zo~Yt4+Ow3-M!nsp2|`ucp-j5Kn=NtrcK@3w%!p1tDL5E`y1D!N`Sg@{k88!HNDYsk^NcyBnvw z(a_ztsM^ug-Bxwix7+Tt5FjT=swa)9>6XAq(F@vr4#5j`?PW%}E=4>Iv)uehJ36;fRfK|_ z+(^X&4|z`~K)L{!nU*uJ_7izHkm6=gq*2?ELbkG+199oY}o zZVZ1F8qcY==SNvW>>%2Okjlg{Nb8Z$X-sN3RRSp(C?rvqwG)C=ECzxDGUB));!dNp zIUpZPW>CY@bmcQ{OC}&=Tc&7mS}zSmKj^`NozRKoXmsnb^!k3bR*I>>a9eyIN2i+6!CWayk!e`J6&?@OKNXN;h(F zjG9ZTopM`ISz6vus8PyPP5V((Vrnby#>OekK#65@SBDr#)8Tl31?fRSNY(bFObI+d zb8{3DD=PvNzO!tcbwf}CRnh2B{*k&8r3bRp!*h`|JeONm-AFQ9UXdsX=uu4RQ5S(x%)n>$d zb`fVE@n}^0GfEC}IH)14AHAoy!a`R@@Hk{LE5INxcE!9RLXwDUQ{}bK+w~21%D_Mx#c_=|tN+RrHz*YGnZ=-4$uPudn)+ibek zGK~)xqkfX!#9wW_{01FUO6(CN&HFD}BsVopN+pxtS~QvItTbub+U}Z^iYE1X_do_^ zZmiK_rd`vbeky>3b6;0LDV6xYZW1>VKl?*}5DnEwq>n1CI)72eL9Qv{wP&qlZAhZd zyt&%rR)P*))Y)z&sJeNHJYyS(Uf-f^3cioT2gOfk-$(iWSoVE0b+*YK7$F~4HCOO4 zyA)|dF~%q-E2H8WiA-dM{TPRR9-EDZ`vuib0jXJ?7ITvX^au;C_84{vA~xIm6m0QB zv80aFW|R#ZvpgaOIdn*>UyYgRf_1BDPRz;u2FTD!rmZst__k2?p^)#`D6&~B@DWID zEIVH?PQA0Kj|F0rO*OkbkuWhM&T$KVb+v6-J}x!MMvI06{+D21%$Wi0Ai zBzvlYj?#rmz%-bdVdT#0v=yl(bwoKj;vHepYBV~~tYvWoQapNR_Jhz-55J7@OOh1} zn-9P}EQE!>%wSMHg4GFCMaWvTm=_zK&6LYFf3ka6Cv5)okoBL! z7?GXimCpr(q1<9tKv%iPFFV%F+06!!{74u-O`a?K3JRLtd@O#X+x*UB-BElHFMEUk zh&GR!_mKVuSDH_cab?a&?R$)?vq5slF>W~@Pai|8r})Y%3Eq8PM>shl`lHiIGvf>L z^P(SorTcjFke~Z1wT-Fr$x18oquUI+VO{j+_wNdTg zPIIgKts0DhH?y~oeYJbdUK=mFr=?b@-S<%-v^-mOhz1_h$2BvsBn6R~uADyUAA7a? z9|I$o^TJ-hcDKH4)5xy%uRGnH6n(~j>2!B2!-&std$#Z3m)bP)z8!Fedu98j*Yh-) zr}o#nH~IfO!yVK92^IBFbo^`F7us*u6IXJp!Ua>F<_YGaMK!pTvo(A^cfG&%wXV|p zpF-oPTxO8V_5R`4y1N@qU4Eu}F5Y>w|L9rnD9zXp&vJWerb@4KC&a&Ze$n~v@BC+9 z=ceEn{p+FIU$kgz=;g_?@n(LpDc<_Fr%G-9k~g?Te@i>@MqCixB^`ychBo@>@7*f@ z-)rN;6WUmR#V4kRF!KLiE0;`YCA#E)1(HusY~$1aD{c6RZTN|8O!Ys0qgxSH6c%{4 zqM%(C4fHr1&#Y}8%~#Y`2~`}s`ZK_h^yA*-Zd$$J#(P>a8^jczYFt~_TmpGMCoB123|Ll)^Gr{xM_^-a%ozz$+gKu%G8_VRaZ*liF$oeI3b>D8R z5Plo+Yv1OEvSnf*vrI0M7Q-_6;@k3NvQ1*#mdVfG=Dtz1ch_xi=M1ja$LKWUh!ON0K7#3m92Dq zM|bP$`i_Z+idSaH8u=!*I)GVHU2SbxM?rTOgq}l=DLn^R?!1!U`}G`P`O6lbyYw7j zxm4rr)HCzN``bUvb7`syByTfpUbL0cHX-vp(dqusceok#|7QRRa0sxcG+P6DZWCO+ zVVbWL`0W7pt9Q6J`q%v`nRLR4FrpFWDEir23VQTrWJA34R-XIx98k1D&%!AvDn@*R z3KJSWv(DXTYWU?_|Aivg)bNj0(AsGD&ad-qa}gT8RUO;!O%4BCFD2oS!zI*8s zZuTZjafCX`M*xN3fH5bW-G1Ae-q0%h&mQm_r(f_VPAa`Be!9)S?OpERgLs?cTlw3x z%0;Ad!QpjQgt-)TU0Py0Gc{&FJSs|W^p8#|?KNk~n=LS%iYU&7ZZ-pN^!LA;qe?gV=k;`xANohP|C}zt+p5Z4p>k{3 zVv2!H8$9VHiGS-qy0u-OLQKQ8>AcfN|KvWluoK3J?L~Bf4!Qt7T@Ew9IG4}C71_a$ zl@2NF{*eFSs=m9+_4_|fE_J__&0Q%YXgcO#<{~_8^VlY)hOR_F3|y&^usMND(e+9C zDH|3g3*+wK1+=$y+aK=^WTqH{T|fG7`}?c@2f;!Q`0M&gFIhfu&OlU=UL;BH;Fya> zYJ+34={UVs3dv+fmHIp0>rV0Cf1f*~hencO>iq2U-Ru0{zsD_Cd4nMQt?yx9_a^`C z_n-`Z<*N6hY<$I+-|GfT8(Zbv2 zBlu-p7K7rAdlbNy>BW&?aLf6>M6X`asgfZHS5ao4&JpagP) z?Z!*oeyv+>8*3qp@J}ysvwMR@t^EX@E%jY%-F38h>srvf&8L^T`3czrOY1j%kA^RG zv#amt-CCNCn)kYq6Hw7ULu(edw4~ShPhIMkwO^rngXyS$;!<}=`>3AU)6w-OZr#(L z@IiO-oQ$_kAPf-?RMsoz-b%iZZ+_5S+P+DzmaAZ54x^Zo4)3&XUdcdloDLTyOhYGVmvFW<1haR5eL`# z8$aS6?!EImx}OPG05np9Uhq-(`@tt1B(aTz3t{_VJ0?+E`VIfVb#8yINBP=1cUH8~ zmoIlOAs@(Tmt#?R{|}eD1M*-A?FvjOHq@tt<2+|lsd_~tP~wa$oW=VYdr9*ciLYJZ z7PeY|URTrMnS*)vko6(FuRoZysoFPJc#28;p7oftSNgB6cf%EX8(()g)IwT*9eYW& z!Hqw!jQ9^R6SJ<5li;lb+#+;rJg-rfMgG^eNLl>8YOgFW*2Km_K{+k!0Urx*`9*h8#&> z*#OEu?w{S@&YgKSj`vzrNxCGfj^HdbO>(9LOO!ND7ku1t!>F%b?cT*}AHUkYG5*?5 zy}QP(h;HyJuVK+$f0z4&D@6owc6<{1`+9%rC*7||#eMFz?zf$~b<;9IJnYwe%H5RS z&-9x`*8%6|rfgr?=q9&6!6`tS*A*LScc=fSjqY^j^#>a{hWhV5xsJoB*Zb?Q1B7S% z^iQ)$ulIL<+Fi)U%In>&(U^bcdcrZZnk_UauCc_wd)KTR$gDE>v=+=P-QLtoph*FIbo?2;QG0zY(Gmp@pDi1Ge1@; zM8piQS!FvjJ?taa*3!QmWj*r$m3gxw5o-;k6p|oypiF4Lyo+|mt5oJAsZ1k&rBt4F zWOce|Y>G+3>I@pHwN$i?iUjGU>t4les2#5K;NX`&O6i9kz}hbZeCR5&DzP3j%hgrW z)~o$&!MCVuL>aw_cTJ7f0&bg=tok3hz^ zDbKyQT3J=UxLj#8^S%pLjpS|CFRWDDN@l7TgqJJnD7U#uSDLAD%qh=V6@6erZ6#V% zl180Lsd5i!H&BRyRaQmsD_3ZYhS(brhYkO)l7j}9JxEe6H`*qVre3SX=bcka&f!O^ zd}LBDQ&U@#-BLj84cz$lfRaj1mM*%ctFErPnn^3Okb2ehbFRu}EpGx1qJXy(^Bmx;XZHl)!e&kZExnG{pcChp<48=a>+8l zmiaDk4R}0uMwP4uN23guYKr%d&MlYl0M&k*5;4!dTKmhPuFi5Fag0#uK`kxnMpq@OFnzdfdKc@4 zl1jJ1xDr9or|lZ<#o_Mfy5@N#()KF_wfZ}ur8Sk=kUi0_U}gm#J>>XjUA1!4xz*A+ zJXJ&|0DaCo%l+pH-Fme(f0a=)8d{}hD|K&iwdW)CS3+B;lxpv-w9q_ zNz|>B%ab&LYwSs}RFlf(5K_f`gstXZ?!;+auI&`+BVs| zGi%$QfO*P?StHm&!#R3J1x2RK4wK2Ox}7&`xKyE9(Z_IndT8VnX1lFMYC-)VRFUee zRO{f@`L;?Oda|@G$Y_?21S;4R@LEizTg%;9IO$Pr;9tbF`wJhx7+WaS2xllT!KQpt+1dZx(fasy5yhn(nZG)O^-*YN&h({S;qoS=-u1baB zbd?819sE|R^YblI1xgtcEzc6_jp-300`pSDJ22AJ3|g7V(j_o^fT;u%0~w0gh`?~f ztXWx}o~&dR&}m|{N+t#=F8k#oyZrMg*i4V62L<^Y?bp=m*xI`9SBKPas&|M?Y)`dn zn_wMs`FGSFr%>@nRg=B4VJWmkDJn#)a?PhUt&XeCF{3q1WQ?e0ENp~mNL+sw)QUMu z8Klik{%onEz@1T>qMJ$E0j(z{=PTuT_zHeTT_`GFCrx1AgVgLn9ikG@77Dzz#hJ>v z+7u*GgPFwvLbv+XQR5h6du#Qz_kbq97n{Z-RkYCFE_KmA$v zK61U5Kj&T@zu)=yea;=H&j&w;)q11<_2=C7g;mgu1#S^0FgML)*Q&&Zn(ia+7p(Yn zo`3EZ^7$?Cm0Qu~s($QN=3<_I@>X}=!e4?F2`Q4HO9GJ$oiSHoLg`<$aRjl!{kTKs zc7OhDmWS|5x4Aw0$>!K?WM%$|j&vXYyW8AT9cY{}uX8=qPi}YL9(V?s!j-2&x}6AR zu#fu9o7}$a2L0P6_nT<8-+G6eRb3!hWpt*)(tiaEA39eJDEKSVhyAqAyQ>$?X1tJj zxfUBAr3wm939+Nyty20s+oo*eO4g2afq(MzSR@bo=RWWLp;OvvEZ@cV{d>OP?(h4& z4NZin_b%}#-RbrjrZBs|%M@8se%KsFU1GJuB;bEKi6j5nJ5g8h4K8#mtI25)u^cVZ z|7ea*^bHrqLRZ!}pj!$wK*D}hdQ>%eU$ymQAa*tFQnjXE!zoi%VY&25R*UVrs1dXD zH)0%6v@Wmdw5-d?5U=0|SQmi-Hblc#WEW2 zBkS8xKzt8P+SMEQnySmhR*a0bf}WFydt~p6R@>V2pI*TTxV-bM$ zKsr|nk&^~Z223d2QIhT=9`|GIN^e4l6Qsd{=Jo1afsoWjTM_gfwM|*6B>_)r8>!k^ z8_f#sBqxR0;{u|NW#ej6lG+B;<5GH`fPj0@8~y2G=5%jLu0y<#M7j3m)-{}1Ollt| zzIFzm_ftL-yR0&VY^+BpX#9gYTU?EZy*B#KV_f#oFx14YX2KC#jzW{5g)z~b2%$QO z(S)%Oe?l2lRGnOuZL%`Xg;WQ!vY9ofY7bI0&E%ke-DWqno;TA`&R^~<=dZ9#mbYwX z%sOno+J?_)GFYb4UbS2fZ2=k2@CmM#+| zHAA(BPfVlUd;sbZ>yBHnlG<8kMG4E%iSyIyxELwigTiGf;`vLpowPKY!X;~}I+twd zQA@+z@~)N$DB!QAj&vM++fu5l0D?&$7qHs3$`L}pJmpBCL!NTPFqat?IFLb7o}gD0 zc-je96Y4goP4>X5mExE^ZGy-=04)*|d!d)@6@er!01|ww^ujWnC8?g+*ec%3zQfGKy-(0m)NXdFi9SInuuYeXh7&?RcN@a8gAZQ1Kv;vc-!Fjt*Ncl zFilyVx)jpTW7gLTdcjaje=hW@7g{hK06}7$h;;~;QrAT2Y@^0D){4$e>iZV{ZND3>?J_wX zBL3~npLWD@U7atLEjq{le9XP-;9TYE(*omg6^QC8G_DYIXkPH{LgON8Pc=7w)xYZ= zHmx4F===3ceAZO*&cU>-Zv##UTP}m%wMhQ`j(vg zhvy|^av{Iwuyn9;jP<~lGx97`nnN9^gn}X&6u0tNfoY&tLy9&GWIN`IIDT#CHwrmt zcX`xyG#9}0YulR(wteG(tUheQt{jr!RtS#%5?v{os9% zX&h$dAzHOr3Gc0n(%Z5(4X%tjEWfM4RTQA*Gpd3$^U^{mj)_Zxn_6I7>bZ=TQM@6+ z1AnR2(cvm5jG$!Wixi;hYNw?rkVrG3gcZ?}{y+?%1aak}Tc|L*N^J-OW`f!{1s!aX@#E@{f}Zu<$rGx1_9R4O zQ{+(TrK1cB^pq9iIM2RCh312!h?+Z`<$STbYzUmsXG6KJI*X@`JmDG%$k$uz5)vyr zY%*LfEFq<+nl8(D!V0L`x`kRAYd`_fT1vJGP7j8dLTxFtg`ixr`BEt7ud}A?H9MxO znyM6s&I6G@qf~0T7$tvaQ{s>K1_6v0C;nsK$Tqb)WbDNTtiSIYZm;NUzvCOO7Txam zyVsqyOrC`fEgZO6sAUDb6QxheO|;2eLY!N=J>qE{@(0y7}xR{?B_|wf)N5 zvA){avYvUL8yaBq7B;ApwwJ0L&j@#P9Ce@jL+=-_;kg3pY?Jn`DHO99bI$HQwd*ugiU=@{;`ttbE3x7@r*TQa~10S8>7@V5A_Z3{gy z_q!|XBIT^i@TEv^08YObktOCo{3G|f56y0BwdprOzLVT~Tl_yg;68L*qf+p;fo<-f z5da#MDl-oRc6ZcJq44J1yeytk?~?G?0sCg}&~^w}k&c+()epKOCof=O^D;zSopTDi zvhB5TfAfQGe!8GM=Y8oP@MVfT=B9t}PdweLh<;cwQH}an{)=%4Thg|I5Rmd(_YVj$2jF!Y<|H zly$)}#vIE6FN3Qg>?Zc)!I$CcxQ^P$jTWz|YvWeRQz{-We=7-uZ)fwRYz=k?#iS=F zK^;;vePuDHgP!50B zLIU)FIOcIOvwGblZfYf%xiroXGFYeB*q8AHks@mM^FMsV9om)m)LEYD=Zv#%zUhw{ zcSrXQ1XiHkSUl1Gx^Xu!A1&Rab9Eq$!p_N5r-rcvZD2-uzW?z!aXj;V@~E5JzT;~w zD@9N*;c4J^n$+@|Rh?ma@tai#{TmN#PZk1XiAT%q`sO#ox4333RLX@AIp^?-rK^ z?dy5pcZ;Tna&(*l;6Vcr#hbA<)qmyt?iGCx3$3FlYvUj*{gR*Y19w|=pMT&7?sfIw zVVl|ZKD<1?hR6n2+bXP#=?&X!$Bn6@4JXXsV z1*jM&wqc>$5+j4_yd#aFlTYdw?MY$iE(B1!7zMh#^_|zT)(}dFN|qRXSu+3p*V>qs zprRHfo2?}HQUg3utrvaODr{1`#h72V)y=NUOh@a428wqxBR^ZvjI!ES2uoL}2XGjE znN+9;#s(yAw_tIYK_?uMc9Inb%+#H%3)$PHq*SNyX#yu^inngX(LU-sf9U4bvj#eF z=1-P#m*R=)kc%ObiMz=h=Z1M2Xy6d}RX`6^{KmZHB{}YZOS1x zyNN8d^IG{lffQ0-+u~8!WxkBUL@~^~M7SCa1k{+QSbOHowWcclQiLXpsAEIpG{toW z{B_dxI9=!5H%tv@k!o8gof?|g;xk&O7@Md%qv(}Xr921cUxB|#RA)U^r{&d*2Z)lz zXQvmXLa+oRq*R@mmuetyY+4A!YSb2KB~0dvR>BmK_9WXb&EC<@ePKooc`VKW&DdnT zF;isG4HPSIYO&&G6bdad9|3jv?8-UFJ>?usT;#ie#yDjq+xCapgS?`R?s>q1t7j7> zi<`+a`dN#vJJ}%83PK&hhgn;QJ6?~(YT3Bi(U1%_1ZMqea1=E7k=?goXv-lp*S$?- zR>FB$P0XY)k3}`KoG^uX2~X6sr%_ZVwzG?21xg@}t}!@mcNgYqd*%}b9h_}yeh-dc zhfzy|&H5pVw)w?C$A*+~7#eoR1YXypN$U;kv@@*JzNU3*?}q!1@|lUNWMB#8 z4aHMfhLUgV8fBuKwE=MB8h|xc4KgWk#?FErAqE7P7G8&6`O}=UAx%usXqgExEwf$; z9KphZFJQ^{F9ZR!)Qq~(06~;bn|0L@X0KhdS4=lb zfU|8fYorh5rZ-Rs^GyPYU?FR^L(2%fel|Jpj1*zXV36h$$WsD8r_DCQ$L7ReFf$os z+fxJHriGIa&9wMVN}-#oQpgG*4Ij#>4&}8p1sUy#m?4*9yNox5O-dnMwcH?Rz}UlL-n9 z-{^WRbWLJY=?F%4h3wUcHxy4saK)1~xfb1D$vpUBHtU$&CP_an=w_ql`YLufS58y&luCT7~e+LZt2r|`dSnJD!) zA@zfzJnH1EqG?l6(C`R-YG_9rC=~+=SBJwvtdpRt#&LrIBr>-Fi`^+|m2kFQq@Q6(1h6e1 z^$bG`CUmjmWdtcBdfY$#bGL8ZCSV6mcM@RD1gN>S1-fm47EeMkHbd5twInr~@v)!R z;742)(s)S!3+80~u1gM;NIPGpEwxUEeae<6=-&^VCt;pe(~@moMG z)Cf3YrVu&?fD3-%F;J3u>v8|r#`8yX8$zI3)YlH*{VTVWvoweO${o?Y?mk|)9#bME z9{kE*xnon?lEk@Es%_M7+x>5Uu7l`yC`wRG3ecOgp6?m(Pe09(sLeOr zqgU5{?w*$PYQOY1?)F17F9p#6AZp8vG(9fd$~b@Q*m!!jkXsbXhnK%5L-06OmxIhg(55ScNayX*IM5Um6d<#D-3~rQ9Tub~J6X$6dCc(gOK?P~Bw1gPQ9_SEu?HFL%) zNr*Y#cVA0cV7hCYdA}z}PI18phg|1w|_T$=}w~f1{)R7j)$J{+%1D->@5m7?y*-S!q%X z-%7w1l`APRfPq$I=2{GAfS+R=qMN2y4Vg906}2d~y0<)VyeL&o&yd$h8=$R4pW_vokH*QO$zO6eKC5+jMwl@A4{w8bzSjQKduFT!|~3p z>U8`qzTvN~r}_)Xyx43}PAQK1)E@s5lcIfc03EZH2Yj&SsvXB=;aM5*DPTHZ z<5mWEDzil{5&|BjW`=3C)D|HKAa#FiXEN8{{O@ko!vF0{cz0uKT5s}%bk}xvDY6l+ z)GtP-wUx(|LCjXBm6bH?BUS>5 zxrk<>n~hNlVQ3eVf&b2 zFd37Z9yy#c0}k-C=JnHRSgd7cv1uH5%B;eO=qVUNK2%tU!3pblh{&HA#B4oRG$xL3 zgi_rjAD^*&Bb4gwq6}+|dYf40<-AOI7zGcAftma^(vxFo7Ee11d}$%?D4x1uNh~8? zGq6AsW0C6%Eq10@8?!>GJ1pzh4U-q7oh z{DYfcuZ{6DwA27mHH-_vG}(vkKwtlr};rc{`wOf-~|iON7a z+pVB5aJh!ba5vsp6D^O^+?IRlOzWMIjvE-sU=|QFMt^}ycCxW@qOshy(l2WpIDuCX zrj?8xgCW$S{ z5@xfH-Bf0Z+lrFaXhZ;RZ%t$>BewKlJ`JW)TWe+a1%@O;pxj-rJ88t9Af`$tccojO#nEJtnx;AsUPd432TsO?f{|onb*04uzo2FpQ>>dZ6qL zjUo+f9iaoJ-mutc2_$_otLPW9TVYf9%_KId8h%-T}E2hP;D*3zzm5EP%)5& zRS4Cr%c$0w2}7I4an^3`7Ge2Y*%rzgYd4Su>#M<$1@vZ6qp7rELx0WK#jNFrX6%M> z?*_ZY{4{{jm>b<|yansXJ1&MQ?#)o8A~7voUkL}&Xf09pwg3Hs=SD87rQHfTJI+L3hiXZN0Cgtjm*vnSQN0O zh4h#?Lu1Uu)=Le}i_|Ylu+6kh62D45+E59(A5dHr_@~D*pOTCXxVBL`N54{57p zO6O9_1eueT^q8iH35_^+dQdrp9W-P77MI->gsu>?qwx0;#Gh@E>s?I^Ub+UzMKm&# z-IIPtJ5u?sSX%5D?NOc;-eCR>&#+jAIk^y2Q;Nvoq4L~D}Kh|K!F);YlkV(D$Exu3u73CnU?Lu5g7NE{?Q$< zBx`~f344WXjZ5y#O@KgpqFb871aKSt`oFjX>TTMc)p7S~Pw=yBWv*R%Nten)Ey}1)xQk@*#)CVC@rHH^EDRN?c}OBUC|LH|C7;X8R?x(rkRp3zYUy2*?lpqve zC~tN%tHv`WN~Cp&u4OO;wIxjFEfc0QV=2NQ4s0^d6rT{V8 zVxauGiC?9{A$$EnNz+$M0A9e-A_sep+NaGID;}k44J>XluVmM@`IeL zd$b8!?)SecCG(?$eQ#?rJk8FKTPD@l%O$rANe(`Ss|)S(^6R!_#;fNGmY&)}F!0cd-1Th4Sg9_4%6e4ku$5AR zjcFEbb)hav>I(-H(r_>2q;Qa8!v1Z!9rU6F2oH`|mH>LMxvftoXmh%{bZ5de#m74L-&fS#0b@aBZ6TZ>;y6 zO$Z9{^pM*k_%Kax0O`SvX-cF$;oJ^uNl&6{bQxUSyl;BQ*0y@?*CatgOP47RffwTf zD>!dZ#_@m^CCmVQ;Q`A_)b?g>jVs$owL#e0TD8z*l->ey$&PEUTavBP1K-dd(!(0_IWaR=3=Xjfa*DRs2Xx`cFdnj#O%u^Z0#ndcQ9sAk;Y(72XiHa(wtxJwDHklFv$Bh5siD0FQS%&vae^cB*;M3=gh6|K*?gniy!(L1(EUX94fWvQ`gXLFA6ax{ zSczTfLo(C=+H9yDy%U7mcFY`eEQ$`b3}sReq|e0!bkq{`BlGW;Ok1+ZpmRZTJY~ zBz{Rx2ymH}_FSMz?Iqd12Y#K}-Rr5?VHL3nNy<_C^DUHcY8i}$05*u@L;z=1)UMNS zq{M>wR5VV}ZJ~%W2UZkV;l{!@7|b!@a6?fhHn*;LG7?@JjGX!a;5MnE+4|KAt$kG; zar9MiZut$dj~fNX*n1>inId!E#N7Qvz9h3X z8}+1z&{?BEwee@fOQ_AJBpki*8-^?eTbc?KhRT!&2b}?eIZO$jMTSvyKi+o`hv*2T zB`FENjs!)|>dU(f4Na`SgZgJuUtxq0XH)eNE7{N}5xjVO;(w$%8VuFP8b6vQWr}GA z%^M6G=xXsg1){RO&I>HO99ZomQ^K;#OVs{2^$8iYphJEg3B1+757z3=iS>7+S4~Rh z!}Jb{w`zrq;i2HH1Ce&W6rsSP%*4~8a_IxEY-v`aZ2Pw*6XM#j(ZTiUS(L0XETDqP zh(rnoqt}U|%qd1Vhf?sH_ziz_ll|sNoXvxd(_CfI=eq1!j!!+yA*N4OoPDxL?USX= zXOwP}E)BTpn1+KZA^nsXH}WCfj#E~USVVV!A_f(Y%*egLBSVx55fwUHfDx+TTF>EoA zOS0&7f`d4wm`5TJ+lT+kZoLhi6o(QTo+FEy*-E6?4zqI17E@T2jxm7V=$#e8qBY)` zgW77)bogHnCDZp&{L$*NvNl`T5+NkT=7M!kL0DQg@ST2y(8Xap+@PSdCf&nOML|>T zt^R^($>3WJ8*(QRp~FV2VFquy4pfl|D}#zNB-uA|Bjk`O^2h?D?D9bXgf~nC&%k)|+c?WW{!5A265hxXASFbl>pbg1yN8ac2%2YD1HXRCO z1ieLznlkbQfsUp^&1=7Z+jJlUcdgQns1dNSglLuYU)3`1SZ2QwcTZf^gxOb=nnKrh zGyCJg#w})^;3=q)G>rvZux4KF$kPN^pf9aYz_r5KV9Od3t3-K4HU{jGSGphzWME^G z$=i_Yfm#HiHHH|R%32v57R+FMA0v#(SD=aCW;9}T5keG3pY;3OALYlY|ZmH0LHa3!L!{C zOf=}WaiE1{Y&o(8iEufd(d~BLpSV=4pb3ilRx2r75M-*d#>U~4fzA{I3H|3?7;8{a zUo+*3%yv(?`HDsCft99av;e?dU4h6&+X^DqssO0G%!ZUt7?G4XENsdwlv^0<)&`kc z-vXiKYgtr1Cc?{_QKN|bVnfI1U=z&-{KG*xN7StiEkZ__DaGk(v7|rb@IGau1!vaK zHx^GCbR&W|P?zyUAZozUfFj?~*`@zYbctI(jkfGGYK|A?zZnLD6s&BL zlEhr1yM?HP77Lm&w+Zb*K2yrBlQKSXp_-WC9k_&|<+^QU7Tbu7iuR=ZYqYdg;E9b z(Ne$ft0aSak|cnGR0Wf_BolT9h6XZn5BaSo``=WOnJ+ET3SlDyd>|SKoxq_$%Y+P!e7OXa=osEKaDp~&%1A(oc0@o)uc5@>TS=x&X{Bga z6to!%UXh_d2bzR}cA+4f#(W*Mh8fH^7d4?mdERL@d1rz-=rDc6PaaOH^&Aya@f)ZR zAPrQs@w9tXaDprV(tx4S{cd^|%B*uX1`_dK|LSUT`tUbfA#sEgUXzG#xPq1EnTJ}d zvNIZSL(@O=PgIj*ri@&D5jCcX6CTi9F4}+$Oa7>5Gy*_Sx-Es-7iQ zw`3k*^pi>4T93~6XD>=#Ic0O6CdX3fjD{yaz9>1aexK4;uS8_BA3&1l>QTQ**4LcU7M=XQ+CHhGsxgM=Tn8XeoyB6}uY$w50b3x&gK z73=x{Wu>)Digwp^l>Q_sTLL&)J#k10B!0&B-SU>~7HzB9u9`TW+E>d4ZPiz{jZj>T z4`QHZj7It{9h4i-tn9`y%vDjPgWcEGaz_v(%H(NTOojlUcIP_64+j}R+6k<4gY>IZ zDppl>z``C{Wju3CJ%m5(3$=wN9l4Lkt!j z1(_sxwuR(ug)JfmoNLkeL;PWTCv%I_DXn%GPKUh^TR9(Z%?`s$vn(PzSfMuWoPwek zvP38`n^{mjtonAX&1QHo2f#=V@H{Daaw|w1iT9)jMTz+C%@}_){ z2m24aBQGw%06lH8Jz2EP@Jo&q5Z-43Xu`K#KIyHNsk1K^vDzWmvfoZ_qO{-z z3qqmtsrDDVU^uIpv4(~I#DkM5T&wwpgOe+n$mb4DW*sC!6`WS3+C@tJaigZtNV7K9 zQki4|Vv-C4+k(A;D#|?TSFcE>9~xdJ?;Dn}tt7I22MxBhwwY2w3{2(E-7c+`W*0$h zDu3c{UXjeM#d;UW!g4R(e z;RB1!vLEoEEU`Fd#F(=)zy4*1Bt!i=6V3>@mV!0kN}^Z)_Cu0A57#zISU{K%D>>=F zyq7zVXNS!gAm=ppAWv(yTyeQ&)w>Hv6MBmO=^+SE<9f8r7JXRv2$16m_JS1x5(m-+ z(wyu!g9I;u!6M~M45lr_4YY^2fsPP2(5eKGBWUB&^#gAQ9k>wktOvpX=H;X!)q_Tl z(OaGAKl;*ST753;E#g&pLR*phwY{8UtfQPCjW&cMXX&gfXSN~d44(DCd#j|MRCGk1 zAY)OWztQa1#YC8(h@z22V#H$F!*#_Bp|^~;AYjnx^j45cwv@&dCj1-mqJ3z^TFqIh04IjTG>u=>6tL^3UoT=y3_eVVAP zks-Icz*0|n$X|9STM;(P8?^HQO5va)X|{YP&@_9P6Ns9fhly0Zfgn!EIx5f21|dO6 z>Mqe*bM6B$VjlGi5hyI8K}d~t@ikN~Ra zv@)aev`~MxAOu)`>}s57D1tO9hh$38F?0(r$`^5KZH%XUsLVZ2 zGyR8GB~$B(7JXR#(6>|2a3o zvIOrxSApsF`uV=%=ZL4r@~5wNL>=rs)nycQu%cmWvNcFi0F9x!ccizJ5Lz9u1M`OQ zjVxit%#~Lz`=*an#*8kAsNlkfi?9W$TPE~P78UKc*?m=;u#MX3N!L;#?{MyMI9LgF zhUKzo)k$IVBJ;NhdodR>1KV9~I6%6x@Oo%&qNG&-ZD!e5kSB??n1j8wOySg)rg2H;y zg)uxAfHBa`LWOIIJ6T+c0;FMV0^u@yg(Yi6CZ`$0`L zDRaBEd}2^2d|2N=YaG657e@E7>Q9;;na$H%k0nj(DgKUQlbiY2_YpdM`*F#eqHFz+ zj!Rz6$I|1IJ^486_~ea~Jcj6Syg8!j7Ma@I$@t^ru|%Ku=?Tg5f#(y2;kRg4i@)%s z^sXJNvoB9h zntOiHc7uA*kgI%u|L%;^Z^Cu=J;rKi070Fox2+>v9 z;+-w;TU+ffKlNK)0ma?mTTe>%R0YTg3c*rvu$I~~MsfH_$ubPm_nnlyExz*GcRh1b za(NW(@FRbh?6IE__q15uk1N8d1hl4zl}211XOGT{7zgbyWN`q~FWwfm%0X zktKJCZF51m$rPka$H4btK-uf2fvAE%_?5|<;<0bvb>k~>IRe}LuS&|u zlSKxb@gZ99TQ~YFCYiYrpdP;KcG!_goNZglUOetWP-|{ zIwe^MdH0-}oELr0zyDMq`%tU@&8f*5(Z~F;rzLYJecNft^yr$qK6qMkUEFE2yj3UgQ6e;21J915)=d#Bs4{8Py|H4h@dF#`<=OWZ#JO*{oe0= z-{*VK+?_si=FFMXW=1WpygQBdm9eB)GVw>7gkO!KDg-LftCKx7>D&W`^FFEwzmIyu zT?W68nsb-EzT)lm70v65HI%4h7JYUX*4IRmcdPZ)qN!5sni`m)itw71a^>#KSnqb=@Nxvh_Jdv%~a z?(xPen-R;*E{7{>D9{J$o}+z?5Z*u?aIaAf7?*Reag%?8#%I`7DQhbBZ%gv};U}cj z`srJE=3cY}dxnE4Ag!2$miHU}YMV9d9OxCcK$l*zT&FPR@%xQol~Ffr8*qUPtD@oE zBm07GY@ud-F+*GEhQ7v)fM4+((3fR>jkLd+r62klFCtr?2g;Ga>h!?_MkOYJYQB8v zSCipJy@+{=4$qS!h6{%qsdW505$EBoy$9NJmSE4B&!vez%-M_RfcZmx^Lmr?VrB`&2g&(ez;`jGEENhmC71PgR7n zL|yE!s2wQf-iM8=m;l0$3?Nr?2YwNE*f!~B1UW%nAySqwgYNHVbmIg?RLc@37k<_c zsx8d#j{Zg(fP1PxNYh~IG{EQ_hwM21qNds0T{vd|6iAieT&BXX3sY#nS;rC3(QRyBTt0aVTDWQxBEaN0kvE-yJ|(UPC>26*#j}V zb7}8DwIaPwU}a=I1f6CkD#ncUdx95bUP0qzs{f?XS!-7K%#+3s4A?uLR)Br}X``Mq zm(z7yrv}l?p34Ajd)ny5)1w^h;Bf)qf_pY+koAl`p*T4f#jY4`!ZXhpbzKxFOPE6M zJY(GFqCi=~%T(uC<7Q0l3(p$2g9>cp&`0#*Dx*eW$LEX(v?P0KcW9QUqnh0v=)lMH z$@9kI|K8c{^9gNz24o6823TgHvu6&zzy-U@#@ zZ5kAw;OM-Hfy!ZK2J1JO+6^`;p^mPD?bRD+uihAU^~PZJjvI{meS?^H?}ai*-G>-n#P=Lx%*Jg0KE!BT#i6hs90&#ngCoCv@y+o}yAN2~BV^P7C4M|) z^aiXqhm3;CWh(@^F_AiEcg$#o8%wf{+b}Z~h8lG!aX4jJ5v+`gx-j=r4@^@1|kTja69w&RC-XLtT_(Bb3wu43C=# zWAb1nyj*>)F!LHkH3hlD%1a9%A4@- zyVQ2#|4Nq@Pcp7)TDCG2`v#5;+%pcDoYunZa|#2D&(qig3`|xKdVaFe7hBf8$wo$e z?yRCHs~TQ2$_CY%OUZdg1I0NjRuP;tzv`?w=Uei?{cNF$dElInu6ut980Qcka;j)v zi?es&lVA;AQ9-W|(uaVF#y+@{ewQfX<^ zjZ8$|HQi_z_uFhhF&#=eY{PTujp<;Fx6tR)u{)eBY&rwW7<_!!myM@GYra87Xby3- z&RUP(W}!DWk^PR@hXfDMVkomX3+^T5EX$lM@Rg6ua_(zniL=H}IcRcl&({*+N@f9FH`BOG|MF`ZI?HHM%jjoqLpgJf?c5X*Ko9H`+BDPX zs81hG39lGwo-r?dLaQJ3R;KG`87=h>R5i^jm(_t{C7*MJe_t$~y1inE&>Zey3U?5U zmuBU1up$S+ZfVx}?RIy)%r(PXii63V3i(yDc5+Y+4xG4VZE%A)@2pu%I9QD{gB8=P zS2>80ds$k=tp^;eZ1zPM+;=2s4=@CiY|x%%s9=I{-Y_!DIt64qiyAbtC|2wPPEb99 z?5kN*I9LbJZZq3RYr7LZZdd?;N{pruGL-_>T@kEb1>!;6te}KUexsKk>ScY$_}M_9 zE%f$mqm3=91StSOV~_xUxlc)h-SWOi)u0-xH^^Yz?Eo-9g?p^ zwHf)KXV`)u38=*p7S)8kI0P0){A)(N8usEa;Z)%)4yACkT|}@(R?kyn#iOr56EcWa zy=E+C$;Do!SaIl+wKh_6QPs0c2Veuqg~jnl-ZXM54Pxj?n~~)da}af(t0?Y&=pc50 zV{<|J|3|yxo%e6Law)8!s%+!`-+IkUgHnXHXQ2GQG! zD;&JB99O6q7^SvjIsEY3;0hN~`a&Z;@3%SeboWA(Sx5sHLK5#q%N8nb@TNr&Pk*K% zi=ecbO)D1}of^9c1db3JgD`ESRF1|2#s-EHhK# zy%(g1CxwPCS6Yo%mK(PM;3t54LBer1Evg!M^bsN)ywlRS9|57wk6%M`=xsB3}7tV!~% zymST>2J;MbT8SBWn?|oR(rc;};bA>QQ`oSeoM?zojIEV`+MXU;XjG%0R;nhT#Z9JH zzB2lS+vF*tEgu2nU#5W{8`By3iYK?B57mT{P8s@BsP-x&D=8v_(yg*UsU*&^&~12& zj7HkWg)NJ)pz1I~q+Ix-_=$L^W_X^Q$%2C2nXCb;Z57mNMX0}B4M&}iDf$!Rsj@ly ze_SN@eEM&QBi7BoG^~by8QwZlXxEoU zDs#$VyGZ$+BS7^x7_IH?BZ;2fV3^=F)E>gijz!+^vZHS{L=rn^sa>>LC}QU>wGTI9 zsl7#KHbT(tzR*aDahFyc6|cn7y6dZQOUogA!>}6O+hp{{C%M>|l{{1O#s{7Wb~|Oj zU~}_CT3-wY=?nDuW+PP_Ph&P4&mg32F)CvbByBNHm611h&!M!fYQ?nKs>s{Kt&!yI z|8c3jxy`U(y>b>QPTpdXvT4qoMrXIFR#UdCRv+7L+y_d&b-R%sH|~|9D61|6E$qT` zDf(-pZjhJ0;uRsJRe;#yREP)o6ggq;s{7Yq0*iOhhhH-TS@`YO##jvx^7Y*TN$wQA zy2JP^Auk^lZ(~y`B$v?!J@qX#;ia_bTO;MBozgePt4Unz=`a<#RiPVr3WzV}P8syV zqc;ldvz47a$byyAJS;76xcKz5@KOqY`&-Wrv|!~!Mmvg9b{aMMBBSW<_jInNas|L! zo2Mm)p_xZzP?)D=z_42k|3%8rl68N8J$qdn*2)8)LY*4b0WupN0uKjx!jH)~IHj0J zY35F&W`#XcG5iRAx)Y;5Oy_nQbwa14h2;+J2E;SAKN@6%Fx+8LkNU$VRk*A5?-yhX zw6&Y#`48gZVTN6mJI^U=IEDXk3dVtddM8eSh~faj4+|3fv^vB8O#|RCIJ_^(ze-`Y zKu4X=ZpolrW>@8hXAO$6&zw`n{(-zWpTqTG`+kDE%mvsg9;F~+A9271^#$eX=@jSD zGb6gwgZl$$GLv44u?GzN&kmnXYiQfxj$%=l_48M_2(j0pVGS9GmVFB9e!)!_9H4=_ zjmtv$`vDF9187)7z|wo3c@}x2%0R(hn}0DP1_B>E0uWRuq7i}4z;*!Vnq4xev-1Ok zm)(($O6xgmkV1)SY})ID9(r?+QB%+M(7HX)JpE3;?g2LaPL1}0r(R8= zy~c6h1TT!~Jh(|-dTt*qUB$F#9~R!*bY>r>ZwsZB7}Mit;Q<53mK|%JrB6zXPmwfo zKeR?$=#BkG*VI$&ObQ)`(wO-9!@Xe>Z0vXN++7bC@Wnh{^F}wJ%Xdb-ioddhCERRS zae(<7<)snd8O=~@;de$`-&i(sYwa{(3+?SCQuG;~yh)|WFwZyq9=&^mx_ob>>l3{6 z?Ds~~q{XbFfL{eZpr`yN(L6&dk+a9#okh;=%ZmF&A?{w{fPUud;A?;*z)we=6Km$< zaD%xSLpF=KMs_E`A(GN>L39Gv4t)5=|3(LlhAoGB6fr?3)v+MlEHKn#8??gVFM*{O z#n6NUMnIcK1qY1#{6)J^tIu2nRI;}1z;B&@>mY2vEzMj`m;GQo*yu~n#izt#aV3bF z3llVi6@B;v&U6Q-<02x+I7wL%pwiP%`QvD`!9D^$|Ur z=Yrz+ai$a7H-4$ZLe_MSgF7SRCcCv*oC(WceSLKPh>;e*Rr5!&_g8=ud^GM}u~M5t zo$eE9NmF={U4UCw0>G?UxHU!tbN<48qPI4oaMyj}HH|WUGWzR(=rndUbT$>#BIPxg z{jj(SCg)WTi+0)sI`go&1E1UaiF$Dp(VeESMkyyIdhaLP<+ho2{{;DZoR<=hVyRB0 z4o8hH_)Ix!^we`bv^T?Zn?6Z>o6s}IjB7dY(J><>VFtE3##wmEz>V%5dc1+BwYHej zjzhD1kX9ZuQWJjs`z&0ys%HA%=JC_|pTRH@efP7%x|mX!_IzXCiE* zf?vtoN=QOZdaSXhCNrLmJ?xSLp0fsRZS1MWJf}^8unPL@7wNRFsV9S$?iZ=NNH#*~ zdbWwD3YTo+Q4TpC+k9oPmJ42)OeAN~#wMPt^)VibZ|bQB%|xrFo|*{e?fWBz9z%VI zn$gsA8$Q4M3OLN9)RUk%lvl7giMpRO5?MmktzF8KNZJ)cLY0tE2c0x-)kk<}+ezc{ z_?eK2nJD59Q~k74P||%tlTLwoolYn0(1X7jf7VhwENH3;GR{0~EnBDUs?S-|H~e>O zL7S=IccVkC3p#Ij4rOQHDOWnBj#SD#FgCRBDJ_W_pEi=JVBj9OobjV;0k8y~OvY~W z73y``XcJKI#2qE+$aCR>XP^}`APBnn3~#-F7PLR_o>mR-JB<^V7bxuy$oPF~R@+M#f>^9H`&kQRDHdN}3+ z?e>b7rv53aXfyIg&#hhfaj1-dx<{|7j7%7X*JzXQiOIOYEZ zIGo)f0vt|^0>_Mh1BwOoag3-7cr@E5BG-2W9m4DlJT9)*M|o&Ytf+@6+TR!J8^Jy| zdMsM}y})}z4|*E@t4c*ww3$o?6 zojc)9s%P>)Zckq{Bq+1|IrG3^%XttBaq}a1vrc@d3=8hLfk6;3u&|Ku5Qpu;JO{Sb zKBuA^ynTQz?+ReDqbQ^($d9MM{-^6HL4jDM7G@aW7pO2K3YgSX5BZEP`p0_;m}4er zo@XrY0IoraYv3$FM!CLW;Nsm@;U5e^M}yuEov_K8Crb0p({w$gk+-kbqAI3LSQ~yQ za@bA#> zUn77E7&tfrrT|z*%S|ybeG8ByV69~I$i=uYEAX6l_Y&@h#Z-9}^{6PC`^G~QD+ZlmpkJ*@(chZ|}zB1X?h&9iNeG8C%P{7NDn?q8cL ziBa0GbbDp-z4j_ynJ5}l^WCD2=fDp|^vG^eU94r4rygy+4Jra%Fu~?XrM%|dhDy>z zN;wG(PZ+nx>CAT3MQ!Z>^{y`N0(<;%b#bq@ivl%7Qo}QvH8eXr`?-#cd^Rfup%(zQ~Ax*<`w@z8DE8?X0gr>S83_vJbv$QB(kFymnsl9qlX)do1;rlBNPXKuWc-rCWDp0x}L8C8F50G zfrjsnyot{zS1H!mVvhIf@j&K+KTs%%JxLR2V^iU$olQg{djOR-5tmgy?o`6q;jxNP z%PMfW;+~5V3RJ@Urs57RDVmA;Rh_P(UYOriQ}~OiFpp8EW}q$j4yFpGY`8aeb_?8R$vh2z`dz26}J!_68oY7y!3^$2_5{#K!6|? zDfL^5huC=r>Ic@MD*OUE!FdM!`E(8Yl2RWh@Ft>&Bxj^gT8dk7*gCb9VCR`oE0JFH z>`xdQt6?F^m~%0~xZD`Ws-V502h&9ZACOlmxjp7qdL>;{h4aYrbV!6fDKSG_j!(A? zaZSqZqo{@VKR;K3?dI|*s2{DSw7M0Tr`PDaR^rO&j}IY}0nDh^8lk-$@|yE$KxL>*5**3%SF@ZoWscOG3VzMt*%d>UM_0Km&@wOTfI7iYP1t^ ziDQw|9_A7o3~$4_U2~Hjg9ELT4D-%v-ueAH?%1)y)UtU>dWL_cet_&c70|8*m zz*ac)3eiVPn8q{s86T0gwdlWGiP?QEZ_(D4c}KTapng}0O6G80=zuDuR-PYk-Y+|Y zS-Bj^eZ$PXZ!6p4_)-MkB6;R!B3<>|e9um`L2oPA)WlKgRRB>w*AtIX_1IBA@9S@C z$JuMwu6Su)v)%P+(bXa@&TS91SH=`pDK z7b^nEc~I0l3spO~sKB+9CS{42uEeA;UE#X;B7&5DV3r+pR*`_FgW$k{i?dPpYeZr? zs({#fahjU!a#hf{YsAL*y*$^cHkOSx@=8la)|p#VPYMZUdih>3+=2o`z_Byk%;V$e zID-TI=clyrS}{QTgi*zB;<-s{D^(c_K)G)$we z>kN({mqQYvw>pa#qNi~v8cO5_H;6l;XLBePti*&HL^rSyd+`Zpxj-$uh`P2l54790 z=HZAB$mqZ>ppZT3U3{uJEnpu}4q?k-NmF-fv2SZaSJ9@L(;<6@vM={_Gu+!%G)r{) zfedVKU^hl=5A(W$CFonYv8(99n@zRun4&Gzy1TeZ+dyNx3+1$LzrKhoS24TTI;dd} zkoPUrv4_evvj-T>Ep)zzNROL&3}dYUhZ<$OyX;0WL@zx|t7dwdB(uXE@5mnj&(!q} zIDBZnPN#1a>-2?(Y4uIwG9S{EG~+?Sg`0%s+W@-M3M`*){YIT{#x4_?W9ZG|>zKmd z&>}n}&CjUMEnxY6rO+*qls~68ZxQKD@;Mcx7wPLgzH2m%ucL)rAb_{nZx9Vjf|8Ti zoc1f7y9HBpin`n?rp5oHma?>j6wI~jq>vo!7F-- zF8WYG6>b-gg~qv(A==W^>0tZ-H)lmz8-NZFU@A%&(Lmv>4ZlKg0XG~`9K`D@%xB@Sz0Dh9Bzy&1K#8Sxvd@n_)zJsjQ@4wT&@;`s zT_kHC((>CyFL?Anj?L@(><7v2hU#{p^p}%+!06Y@=c`k5zIIFbr6`IRzGs ze!WDETCYKpW%>_uho)pj+v*X+5jyS@_E>%@=_Qi&!(q$I&R!x-KN1cl+#xz*j&8d{ zGy|C!eTUe~c=GU_qIEoG*uJ{Yqwr(#o#GkoIMumJ^kFo~xl6Qgkw6EUth-BOIcU-w z1%IQ&yG6rtIXd4BEj3a1r?h0szgtuWnOJtWxGPQZu}}yw2Xe7Cks942nkG9c#IX91 z2^DJ)Ydo!`)69E>3GMa5dw^_vXzM+qEk1F*v5b1s9lg%Q6FnvyfdI zi9;-08;P?_%iBm6G7WKUBv*6I9bmZi$MX+(BW4p<6dFuhZO8% zK2?eZ##|cISB&&6kV-Qe4eK&}d|uY077vIQL*FwoXZntto|zE<;+hK-+2E3DLjdX* z>AHXdL^Y(;x6p$C+p%8JbZpRIDed%nSh+*E8XL&litl3wdV8RWf!+dMomk@0 z_ywn6=vYF`tNCSCXhc@_(3ghiLZ4nqWnTpsKO^BA~(tx!^0@&@rsD zi~3~0uWAHzKnYY;^$vi;_;3rG&oSmgKZLhZqI_&KwO0#NM%W7-y(PU?M?oWIlK(Mitv6CZcTf8S+px>yLm7WR>M{@$Hj_4W^;E|S z4|MS)(`y4orN*o%U|xvT1op2C>$vg}jZm0cQ+@$_*>Lk<7f(Rn=%F!PJa5o~C&Wu6 zdw9~qZI^P}?I`ycgz)IcA%80^Y%;ZYTvQ747fxH;rlXRGXeg|iJz*FOJ?22Rka z$H5#pGg(S4o&+G)Hke)JlaHNo7I z|7lUbwIe0i+@ivH7K@Od`FAi)O6*~-kRh&H%egR%Jws8rwj(n|7G~bNTxr_$w0K!R zq*3Nj(9ytCqH+xue0XzZhW?a?m5Mx-vwr7TRDI)9qIL9Z9D+PUlb#Y*O1G zsbhr^K@Fq}Rk?Kx9u`Sl0~+%4l%Q|(ZKA0<4y8_XmNv3nUYzvy;25~_PY&Wm9DyDv zGaQpuZCD`0IviXg!Rk}|$7TWkPtjjLJhlXM-%M?pE{=k~3&<6Bo9O{!85@*UEjI=i zE-L*xn5S4K^_(jj-aL-!q+q!tEWIT1v6{90#P zQbja?4Qo#oQ6&^@>)jo_Jp8T{`*8kkziCme)$m4<=j!sCsqt)d2@J!a_4xM zzhc&f^XJa|{`0<77ovtU7inp>4}hM@*LARuo8iZ-8^Dv+QRE@f40L0g(hOpdMV{0wfXU1y8Wzyn(@} z{s>hx-}W%z`akK983?edvUr*0Nz6Q)6EH-Bi2`zJ$h#2MS&iGnQbDTKTVW}@mpB>M zqWO>&k5@6ji}~<13Pr(@A9s=XP5wX;hGYI}-^Foi<>J7sOLTuUjb?!BPMq>8=2Iy) z4A2@@D&P3yh5;aT=Z}IBTC3ndi!H)@86`ISXs7{kn+S%^{pM#Y(7L+nuYW+QPAJ@C zTRe~ezSZe^3lqLa_@>*~*bpj0EB|;A=!P{MA7#e?I}nWy8J(&HfC1{3UdxX)`VJ#{ zNfZ+p#;0`sPE-=YwCxVBEun0in4Q{!`Jb2LLsOaB1J~9SQ|z~+14)*1vIKKNmH1_2qYDZ0cz=B z4q~D(B_Uui;&8l(r_`A}R#YME&Zat*!%UN%&O90839|4A)lAve5~V2t;-RmaGgE#B zLAqX>SDw1SC7i@lS0hq0^*r-k_f(ftqyr^8kp@l0X zoqb-k_N_U=QZHQ5tkZPW3n1}J=$;ouFd{yVu6_YJiY2u01<3DtwB-d+H~J`wSwZu) zX)i)=ageTgQ8d>^6+ZJKWGvRsc(5H=<9L^pW+@d8f==cWIyMNFsC;^QuxJFi_w~Wz z9u~xmA+{jq;aj_LA7V5FtxiLfAXYTQ7Q||WY(dO9$^Sat8;TIbJP^d*3E6^}o8w?e zEYON*Qa0|rvz_^|te_Nt!nv?08(d!WWbR#c+#b1msF(?t<>y|)=uXh=m&7D(1vMQe zGV~ltcMKC%<5$6=jFrQG8sga5uwmkRC(h4twGsE!aPfl^m%?#rha59j^DsV%(h5oxCkA*emhH&SxRpN$( zg-2@KkhE}hG*c0(~%j8*K0d=|uWHxz5(nqN1BSM99q zUEwC;t#~Wf4JB9!R=yiD;Vv60a)TAEidL~3s$^BNO59Lot1_J3!j&e%2ReIqIFw{1 zS-EZ~*-EzZ-B1;)idEo-QmhoK*bSvxsaDAiZm_CV)hcyE)vRh(wmUazn3!BQRNbm> z<-4I8Rt>Ab4pH)GF&GFlWwdC(2(x;$cwg>Q{iMNT#Ho-y#knPjVq0-|&P%v>WJLDf zaD+kv4k;YrP=Om_lqf0}Dt1GRASLBOrF&P092JWfJ8-VuFAxOm>Q=rR;yaHE+z=m? z%;xSY)eM&_a?`k6u^ZyF5;w#b*Oj^%S_+s6tN3f+dB7?Tk2&ap5hG`u=+e?{ z2Q&ku7+jMz9IL^qZx!&Oc$qa*l|b;ok*RCeaM`dqonppA|F?cN@-?zf<6|zPtH+C4 z_21$sT;L9ZY?bom+{-ypskeBah-U^7f1)AVjvFtUw>u4X+FZyin_-Y4%&fJgAJ2qeN)A@?k| zMn6vwfk5dOt3h^gsS)2Y7YoWXe;Y?A$sgN=xrCZc6g7QzHnv=>raLA=HeNy_CyKgN z=c6k0Q(2)_p2P2j_@nwsfn-^ozMm*=Y+$<>aB5lS;4{Euz#ohO8yQ>XOd~{E$WxVG z$OZjBMKg0nM)Fz|tHv73Xz=>h1r7=*EqCUMy0PQXI`8;CE9Wf5P7?L2y~fsLuuT%& za#*b3ZAzH)sK+GH#QKS0gnO?|+`$4Unu>AYeGG%Oe&s~I=o-GmPCCnkHur2xl=)EE zi$mz#Ta(32`nKV8ezLei$H9s#^2AQ)?5a#b*H2KJDWaJ^e=hZ(BGQwWc>TBtjyJ$E z1=Vpu&322n9suoP?}rLD*8uMaYByE1!j|yFRM_D^royS%{lvc9Q$r$|FN>7;BA)X! zYaEXen%-6~i$^@ehpnbJUxo;<1P8xqz{|KkbH__|)V+uTPpVrDor@ZEi}9X40d!tM zeARZrOZJ-5@Ecy{OOzLjnty1nz(cWGj>&*#ZuYW{bWCm?_QB{?Rl0u*v;P83;ZO@ai~$Zwv7OhiH>mW-pvu-i_`@NIMP)Y%$p_F z>f^oi=qq9bt`9%?ins>Os%>VA>`F5Y)Qja2&FGIlgVcR7TU4)jLJvl941D|(p_(1$ zrPH%f>JVM=s;Copg0G7PdxH*{hv?B)MZ?rNMmwzrYLHfqe)j6;fqTtG^zN(T%8b&H z=n#NE3e-{UK~BUr#H$Dtg=!qxQ}acGxZTKSHMDYa6s7Hv54+7FdL$o;=htarzUXtA zQ+(mY^=$}8pgymu`U%YDm2!wO=ZL0FakN1leu2seJ#LI_(rWDV7zSPE=mS$M@K4;I z{5c}ywoCIuN&@2ug2%_01B@yxr?FW<5kW=*J|8hs4SQv{SK)|Rb_DrfgG~hr%NDTR zK=)pRAZ}Rd`8tTfJev4A)N#0j;&nK*ET-eHi>|fij{!g?8GNFfg*{w6%ZGjVf=;+T z*lBdnTv0zIhXZOice3MY7JlGh|)1C7~ zYU++JRx1e(%B%u!1Vvm-6Oi1fWG!G*(fWlyY(B$X6WJ?yzB$1AZ$yy-+BQ!#YL&kR zdE=}_{DD;r$}wv>|6b33c+Uc9=Q^z7a0KZ4`_y{AxV-y`j}WhJqyTx+tlb<`S5QF8 z)vWa#1iP%(Jd@?{9UgNzA;wy)KA`UC<#PPS{=a&@xFT~L_r8iX{S$nE0NkUw9JM$c zfgY)dWgN?THSQ5_6KaI3$eJ%|&>e4yYM~43kR#f?=Yl>(Fvh*-qOAMM1EQ?^YBWc= zY-P^;UmT6sS2^6LSdbgWe+@1K(F=fyU(wYIAZ%@*Cl+7w15(%~ z2HBR2h1j#-DSUOI&@?!F%~=HT@LS4Q40oWll)YHoE_ckw+#aKSi^2IUqL_C? z)wGEi;9TyfJ>=f_g_t|>L9a635iJ`!L&grU)*Z4lobZtO`c5@un)8lGx^$GEy#oXB z;a3@^C}~Y3qX6!XODLm2WcrGMJItx!>7k$p)C;MG5tD8aI`+sFtvg56UU zQGA5knS3W>lr@>oEmI6;m8GIiY_6Tns@)HxylyGnCvvcenFWcm@@UXf(avVC)RtI= zqn~)mzf`0}7N0_=xcEu8_!P=`_iu{ldFh3B#kH5h>;P6&d6>bh^p6lIzNCaY^8XJ| zE}IuTL}yP77WY3ka_PkUr>R_iNw@xDDl?UCJ&Z49a~bZ|znjWx%m6tIa9u1pzlZh7 zU;)7ZQr3Io3UkdkEH5Sgc+5Av=4zVoo~To0H)6xGMF|U0CF7B8HhuA)$dGms`r|!O z?+T|lSpEW>MTYxxSiKEmazWU{1)k8*XlPIf@?EZQh6Hs7$G3&v8y1M@g%xoBK2HjiiblGx8U@4n@t zMWeE*EU_;YbEh)O{5^6ii}~zs<_F?)Q0kZ!Vz4}mm(JjZJATDKL5)FtG1Q9IUj#Kb zA_8i~pf?OPJQ!tzV;KA?d;f> zagrBK0hpuMig6VG5zfe+D4!jE8~r}QwtbA|d?adma-3Rjn(7UJR_JO%fp-{z+UT*Z z@O&S^c`YUa8ai#5o7hE*IRZ6~1eHg<`Sp?|O)nMgU(3sU?E)4TcJ`vdvND4kdj@`8H6LAYZ zEk6~TD(&QrG*T|vMagT#z1m)SevKHT?IUBYcp=_d4hQC`iKTICp&H&qo7Tb^XfGXH zE8fE4y4=s8WnEwR{%1nhYP|ys4<;@XMiO%!HcV!Mqs`6214e~^^JMK>CpIS{W1^ig zg)^r56LD&;XuVh&w~qw~-8#u_meAwo`faX02E{;et>4O5~+yK zrzq2D)395Yo&`xM3r<;H5Fp4l2Etl6%tHvL)BVNbM)*b*7K6Pxz~FDfLg3Y#frKg; zpedV022XVMJ4o`In+wN(E6!+1pD=j?&z;ZFTnuBF zPp|9(9!#W?U80rwjbcZcpT$CEd9Lnm(Oy42fd=drH6l);)MGkZ?j(w@34}7g7SMr- zQOel|lX8Og?-o^b$isi`7Egtj?^An3XWvwQ!H!M4AaP&p5x43qU2&-M-ZD9V$`o79 zKb@!K{G>8DAL<|g*nCO&KBC@jJvhzy&j;cj+lOJUrKS5s5w0e9vIH)AIJW#r2`EV9 zA=~D3?S4_wJ)^=$&HL;ZJ?Q!-9`}6hzWvbUjKWcm{bC$^yGDNp{nLMF{m^&f0V?V1 z!R4dhi#sX%L64W-`yOr{wo{8fTF{d2p3B*@MB-p&s{JOqG-v=@Jwp{6No&~4L?Bu+Dy;? zB<@7+uYZDtYbwPaMcOM=_o!&s3?o;&zsQQpim@qzdXJ+GyLOp4LCDe;i}aii^4VsZ zd{hL*W(_I?I&xGrp~FYTZQ(AwRMv%t;kXH9aVAwi9`+Xc=QEqyWLk1uT&GVKe9W>N zbt@4*y5(ma-^F_gKa2b0#=;p-x&P>3F(}a2lY-Iy$D^RI3!++fXjUgd^HlBsmnT61 zz{onLUQ|aFy7L6k-2Y^`!Ca(6XI!eo$@TN1aAOb=U>5GK-s^F zK}ld9uyHNZ0&o=N11kZTicV0)lVUA4zHd&7TKJqf3EWymRZsD!u$}?n{bO$<1~p-Bl&Hc|lcD z$y`;4o^^qdGZb@uAw>1wZrS!&rV0JO1n03T&_u^e6&ig#viY0EkB z89+7TJe*Hg(AM+fNW7CHcZQwg%L@SC4mxtdZEEVvvPQV20y`I4a*CC>O*;|Uc8;ls z<@2cwV)fJp02~$6ct6B`!56u`pvf-bmUn~Q=Duy$wX6@Czp^!# zdju0icSBYK-VQKihPI+`njuqpt_y@*5Gq4BY~t)Wm*9^#;hG6BD&{yA?25GJI@k^0 zZ|t@~T#Qr(x6<&0Ax$|T>D}V+l9nyu%$gd8iEiP^S5UHUaS*`l#FbOo>Zl-w^T19j zZh^8>cSjV3JCQ018O}~T8<7aFAC;(w6K72;YgD~ch(;kzI*mpodizmNFJ4i1l8VD4 z3FqDI=1ue0P;d3Xmd=6%4%`7)QP$Zh3cvsc+grzRrgi7|=Raeni9I zGPHuM*NV*}{IXV9nE@;8b{mP{KF3NXm~5Rg@S0&himfMO}SuAS__zf_{ zDcu+&59q`5sf|xIh-F0@*f}8j2tkkeWSu5wA?d=L@P&H=&e(N`5QxBLX6FUAWJA-8 zT+R(RwXcuTGr=!lE-g1ZD+f4YI+ypFxUvI&IVuTFn>)cev=I36>l}^ zkwjT5w6~biCfy3ETeYpVPB1l=Z_u{ha)N2GxGh_^COE-rd|S3|{k+L8Ta$0g)~(N- zU|oJ(Lbv8P!Sq->DWO|OzOpm7=C?$2>r*=zvg+}urFsl;RItD0d(sdCs@rsOTE$!LJ6n`tz%!>g*T}i z4RmXX6TX6%BAlnbpn@dXFr^4$du{02@DO`LzizKasF%K=lSzOtEYi$Xsio#mmVB*B zhh*8ha}lpJT%e%NIdZ^{lOpgVQUZ*xDoY|dwApqhkNTx@gp)pXlRl;O$!c1)D)Krw zKwV!&_G~bMn}rpBs#5Ce{Ma2k?jw@byzo9?t1`N470scpDKb5Ji8sK~-WEDnMb`cI z#iw6fd`OB6`cCF6$Z=~FN`*i2655a=Yx{P%@zYd%OK#PMCOQag;||)oaPZ6wO4UWD z6tDDj5H{+bin`{yb=hr%xGtU-)|mLCd|zss&gVE-roo%^dM2wwhqLG$r7mw{+p+;@ zvyU^D9&`=r(Z#In?A#Ame7&eN4h;Mv7^eBqVU~Jx4uXDbPj^4~6n0^RwA|VQnFu;c z*3kuTh0`Reg8chCrUw4D&=6%Z(Npf8>g89p!qGRhgfd{->+aNKi*6>A0`iWjjlNmM8ZMIwo zy=8+j7b6aO6FzwHd78Wi#+SJ2vKFwhS#?>jjt%qfe#o<}_4X*edoIr)JZ({rbpQeI zCN#LZY?QbSY5^-?oyN!Z)qx$9yftJ1#|tuQ$j*BH0(z!~Y#dU1i4x6TN44rWH}>2p zECt___SC@dnw7p9{&@xkwOiq4DRHxj-xxHAugklcXRJpxK3tQDN43#xnzhDl7O-Zs z5*TtmvBr1YjU(yAIV1=zQvhO7;P?m6^}rBlOvo35-WpLWKbZjU<+ zh4bIwai`!H{E6lxz~la=ro8OZtcN4BmO5FR_~op`ukD#x4zK}IQ|y`9=a&<;<@8uU z4v+hQr$Sg$=Ar&$(}MDPTyWSqC_7eM&d9_ff!A8bi6!)UP(B20TWl>kvZlkG4(F6e zesiuJQMjZQ@?vJI){%2U>(q|z;U};CHM8&vnJtidtb8Y;aySAnRjVA3P+6%3xyOk} z2uGCS!PhF0b(A;}ZXLx=gj+|b$cb?)DL_P0WF`4dgj-3j6X8~p?L@eBl!7-&iL9f< ziE!&Eb|RA9N{XBqRY~Edx^jXZQp3ze0z<|vTjIG05cy7o+kP>Q7nB1;krUz8QQ$nLy{+&c1|2-Fd> z=eYm?09urxMm8c)L0LpG0Dub0BJh^C9~G2E;2~>O#BI08DdI+CJ4M`x0#75mR<~=g z#i&}{h!Q74jknO-K)xp+=Im=GThqy=vXVW2ES{I^t&*i9JJ2Also1ssY-3Zlf)k~V*Om@(A6rz*Y>lrpd&BbbBiaMNE)oyUocs)oh zFfUA6YzzT$xv_;j6d&H`)m@rvsAEfc9{T$Ztz;+gX}PWBjhF4$?bF4%FxIGpDcHI| z{oMy=?e{*xJ35;T9Li|U8YqaOsYaT-GGs;ZF&+yq0a%Xlo~b9+IwBm?y&VCqM%Zxg znQ@!!)ac<3t;(jSNey1bq^n<4t_7OJ%KxB7IH>~Pw z>V$bOL}eNF)~R@OsDKe`;lq2kdf*p~0`HR^ursu`l`IC|^G<6Sthf~f6tq=0KY{5G zbp8+euC=@$+g!&sat99GL+d|)#2^A9T-E^4C~!a1bVe z!+bH=-B-&`aQZutDX+xmo=lmFyR@tN1AM^`Wa7HENpno5YzQ}y!c3WmPiITEz$e?1 ztvJ#S9koNXvQ%2nEO|N7^0H)We7?*AhHjur*8r_H(4E)FTku(GhtAre8{4b2S?wjC z&@XMTiZ{4cm3!h^mA3L)RjyJ8yOs`iEq3T^2UV_nM^$cYM^$c1N0l?}I+gQ@>+D+W zP^C_GEuB=kf=;U3Pn}e`=GUvVLD#EtTkKF;XS_O~wahpR%Sb1pRRQoNFueD4cV%^yunIbY2&#LI>}_ z2lIUz%x$szZIC@8F9>5uRup3=6g7;UI5h`yXB+F$C#A~fLvvt7hv7)G;^1&#nYAYB ztTK3M%eFjO^WQ;dl=>$sMisR2wb5;IO(+>7xy|%WoqhK7$?@ zi9$=j!qlv@AaCmE=^C1Pr#uJ-ZO~mZ)!_m&ZL;11z+C?tQ+1rTf{>f`g|GJpekE>aW)*I&Hd}v^vFaz<(nr1pwfmrZ z<+I*mZmKkjimS=liQ8<}*5Sqv*tr+pCu`z@xDEHo4o&h=xkK1l?zN^zhSM?ok>Q;A zWZf^5w0G#X`(>S4aKrGRYQWJ zJ%2tR>-%;i#4-!6qogJe%DTP?350q-C|`kn`22%%s_`ZE2GSmqlVQVle#NfAFJL-^ zlW+BD_sKEz*uA*RW`&?t{bkK`8>qc)n6fjrEhn%uHg-VkH1};R^u^TfE_o$gGe9QQ zy`+dOFNBNauqX#qY4)(30F!y#BXTJ?oT5i$1HE(+9eYI9^JXu$vs8OjUROBhQF*l< zaMYWpp;1=L4Gy**IFCZgWSsTGx~dI?Y=~Ex2g+NTxG=;j+rTg^uPzPukA+T<6 z|GmPnLhT88t+0735CUb_hP5gf9To$aTXJH}V1;lj7GpRz1$T)!G6eQ`HgyGI3&VW~ zP9*aT9O2fOkL`~m+{%hIpB3tk-6 zwGJFm5pm#sPM6qe{Ix<@>1vJG1p=CtjbGMs5MiWPXYITJUH$TVI8K%0RICqmJ-?3k z_(G74OQ?ECR--T4dMhR#_>(JOH%C|ya?aS;cUP#)`r_anEf2~1@Ot?^ByYKGwFLce zZ4BmHY&c`rTEq%=)`iKRZ>@~(A7B)PtG0b)*2*6T$ONo~1r92QHT5g)2%4BJTV1<> z1L{zPqJy6P)^0b(ihk+|6|48Rj+VumPAslqJ!{8O%uxAY>c`*;VNeRF5A$g7w*emt zjn|l=vMxx&lA-dNj`pfev6W9ylUd7`*f8PU&?-Vet@E%S*f@?*`yNP_nF9*o#lX$I z)b1sj+7M0J7o5RY$clmk2LQmJ@zr#13eo^54JAq_`z3jm>jkMZ?dIkWe;CnxDFUi_ zB!mqCVSQOdmkT1xEO*ObmN5UA7A-?Ja2qQsfq4y%Mmlz7bn4ouT6E2C}2NyKv4==xFWj=T+(8CkWn?AHe6Qg@S|#sPfD?WKSCG@pu-%tg$uY% zT#y1&jA5Qd3Ln_V7`gOUHpcN67bCq-gNMr&z0iibe8n&&u8>jsIY_;z%Ulagws?&= z!#0%17iJ9XlELo@YU;NFXVAG#jok)8zE~o4R1QQWD0vFdn#jlW!Gah z9(D7sT3?3&22kwR=F|HGPxDdGs*OI~F;X_J6Ydi$Gj(gH)34}ozpzDczZQ>_^{RdjJB&R(Tbapt4yd7r z^z%rWz}Yt+z(W z?yh1^O-UM>Sg#s`CmnN_#R%{|TO&tadlisW-7BTOj9wgO<-G5RhKq85jv&VNlH|_Y z{Qx>Bv^zp`a^%fzO9b1Dcxi-}Ap8&~@bJ*0y==o>U{5ztjS{B|jYrFdlAFXL={;Je z{rhpQ7%jW^vKvXa8{u*0tZ-W8apodm(+15wFct1tM45#jM3h;E0GFZ0IkIKNOMpWQ z#z=qnUCe@p$(V9e1fnLQc^rf1)fi64=+kvS!wj=k8|mqM)sNRrM<;MEfq8_gj+IZ` zVGrgydoWkHgK2|bZTeXS5rf$P2E|#FmlU!`;}ptw3h`)~2U|F^3xff#z1mI?W;G5b zGNEcWPS&b~{wjlrX2yj{&g0``fa5Vv#t&#GbTb~9{Q5X~8NV88vhE|02yB7Zax#cl zGKNX?^ElY#H&g0(*$v zGAL47=Bf7X$&*iMlW1F>d{`eV>FOzxpEaE_MF!I*2|bgQFDXoU@J$V{>H-s;WX>$y zG6kDHs=50knKmt7R^j&=3_Kyw5r$xO-J!bPr2-tWn&ivg$e5e2%v~kJ@ZR=ali{8A z(=?gRZgA@8T0B5jgCsxc{TP7}*-ToVr!vhX*d~dx-Tv0uv`Qw?Rjc#X$uSqZBznTtdrYGI=x_l~tT$x)aO?#d|AtJ_#|tW&DKo<*FVN2%i+d3(ya^pkU%Ki| zun)L{d6xWBn^D+%9#jJuK*4OhAMHLl0QeN{o{i4@e+Iu9m%?wx{|)>c`?i8#4t+US zKIH<@N&4>vA_0i|Y3^HqxI)B?zemDXKa%{Kd>Im^(d8dU;GeGy|33b>9R8)!<8Olv zx&#T;I~fMkHJ^=ySK|_5;2*odtyl%r!yQcy>hZ;)cu~GO{WM*&Kj*q4*)Mw3I_$0n zZt85iTJ~Z%OsAgC=RIZ0vw0&3Wd7*C;G#m#)zoG;b-K1&B5+4KLKchEYB0|1L;JPx?DR9eLMY zt?~A1Ef1*lW%6pccs{gD0cz4R0BSk|itq3a!|1+n3$x$DN^?9bn$f}cHddq;mL3|BR20SIb5C=*0dVKA!rQs8~Yt z)ts*9J3L)o9j1^mKy zd@g%H-BSMx+1odNwap9RA~ssRLAlL*^o30EjdSB)R`Gl`-A6@VfR8;|6fOeCEfnFT z7&~d(MM?0ovRzUj15cy3zJy!ELO07a3T%|kxOB8#I@?VutJrHN9avSqO_;N1Z$LK} zUKGy_f-hC)cysCQjc718A`3UjS=hG)tU5e1RF=aZm(?EblgDm&jhhrp`@fKNxx2cZ zRNyAfB!)vLB*AW@yR2teEKRp1X+Enz-6_M<1vV_=tbP#UFfNx-@*8D(y@|B=D``Rw zUG(_M}*-@{y& zuezA?#r#FhUgfP6(TTO3)Av_7Gn6M&MAi>DYqVvr;>eNF;$m5?(VKR%b2?gemj`}n z)#$E4ONwPmXdD-b4WF?7=OUi+BRt7-7F}*a&LWDz%q~&u`dr+i|O$5FPnY~R%Z)! z`WD8{Z)yFv@@}unFwR@pXeT(=)UVh+-3E%W49|5z++hWMyg!lkw=`%M%mo{0`Yzcu zT!xPAf|ctOW$u=DX+O~H-Pi{Y)7ss#HlA4Dw@2PZ9rqx^5A^aL?D~gk#h!4=+SX39 zaM^Nu$$qo8XP(n-ni$EOC#+*IK5gD2IRI(TeaSp?aw3b%^+U z83g+c2f|=eEyIJE;iDS5Sb2NEi{}v&SSyh4K9&Lr4&Gw4X&)HG4YY5cOlqWjNwCRq zf(f51cyERE-R${~*c4Ww+p!cV32U@ZBN3YMvfT5bk1SUlkCn5kyetP;PgZ90X_7Kc zJ9x$N_3-8GZGrpHI^gl)3V<}DP{sVA+T~DC{^3ngW!qo9vC~YeJAg6?!S#yuv0$=1a@K5)x zOVZ;)(L6uJIE?J6jpb}+<4s^4i;Vwa>19L5r8np?Dq{T0MNC`}0v^ zyoJoWCy)p3>n!#|566~T57jv+`(tfRI;hs>n+Ijxrq0?d>k{V3E)alrG{aM%d*&2$raVh5wnU&h6RfWn(~FC+@p%1Ej$W>=2S}BG0gH7Nc9z_uG4HHC< zzoSBGyBRi8G938ic^O4?8$<&YBKlJv<7i~5tWnoS99YeQ%*Z*|2A4`KzL%t$5(WP+ zN@ctHla#T=xk=#uLl(a7%K1&}J-u;WzG~Xod zEesTRDS-N&kX;hT;HBwGuwlTEgJsR-p_lveguJ1O{oELo)6hooZ9~IQ)Ew@m#=pwi zup#)`@>$Zdb`2IRSTR459{p8b9$&tv^giOSul@2XCjK`{KPiKF`JwYkxfnkDf1Z>p z>x3_J)503xQali+xC~y+rx9SK^R82}y@}s&Ts^#1?bT7frWCkURMw$=X#bmR4!zy8 zzriLrmA?87$U}7eH(Yx(T2jjIvQJg$%J3W&W|-$Y@~|UO-tW-*5$*Zi&h9-8<=j+i zej2V&M4mtF*hYUqM>dr@{~`OLp(TH)hNAzJ>4`ban)0zR*u?z&r#3F0YX7HfnZhZ! z13wU>W{ZEP1vPV=q)C6uj~nOVL3!X$^fP82w0KW}c*Vlr28*AHfGx%{o_YfG6Iw&W z(BL!jio{Xe7F#j+AQJw>n&TyHJR@I?Ou=06@nEE6pOyFDF+sgW!^LoX0s$r1AP~y| zCBh&O!vSVFIa?eDlw&>u6*vHxd0|DZ7*MZnsV;aBPgkDa>R&dDZC$4Dyy>FR2c z1n7JDmju^zU~`x&DB$@EShILa!D}5lCtK@dB>B&SFixdg&&w|Q1X=jTdEjdZjY53D z-9}MpC;YWvR0&4~xn~dr$})Y&nVI7+i#n;I(3P^N<0?wo9l})|R8as%I9EusPN+D* zBpjz%r#K4XrV$^eo0zI+%-8v8dXJSbkbl9518$TvV@aY==eVDVNrbu=3y%Nr zJORAi3Xca!s>slleBnNfDHWNq-lLkeQ|y>?kuj;9$BuEnQ}<&x0iJm@Z})5LMU#s& zPPTb9%9p|gb|XTae8L-@POH8+&;#_14K}l-FUZ+;aZ5B!^9C?C^nvDW(g3|w&jExp z`W+X2(>AhQu7(Xw85gXqd;26UKm$ysJc`UPnbJX~M(f^La9648@jh6GNsOu#r^xWW z=5PdkJW?i0{D(>6N3_)Ay)5A^>8pW`f#z^EC+MWd+a6bnwKcrW@fl!v(?DNF8{S^E z?E`z*7H}`M8mZNQ*Bh?Z{Tf3r-T{EjCa>^Lf&G1!z#SWQR z+hEJdzr=f!Lk!h)*FLVe5?sElh@OPMb=$4->>>ld59oHy>xQC(=Gb%&EWpD)Z1jW895wOIR?pU92g;F2$j>EfMt((;0X^a z1bR?`gSe=JKinIZmO%$Z)&*_EAh69ahx;XdVQ0>Y8$BYZ4+>&NvMTaVMDS9~GDrKx z2rM2W%Rd@92L<&JaKx#ISR^Km_8Xjt2W;&`$%!b58)Z~cm8z>$eb5NVIw%NI#060g z&RVG?92zl3pkcJ-8G*DBs|$%0dN3BKajqSx*q)x4WT`et?ucq!54>=1B z0NxcH@s@&*0mcQLw-icX|77V*xn|(hbL3kJeEc~LQVTlqcTXvRPM}BV8{p*pV_qRD z*pMxW;6uajD1afsI|{K8?-{bc`9%1LXGrO}pJ2P98CCobk^Z-IORuMVV;Ny~wmh_4Qd6_a3^)ckpOD z??~_!n*`%8Nhrok64EYxNrFsECzSnPUy@La!+`3=y!p;g^UJU5Qv&p%ja)9yb~Bi) zm?L>GKjXi?Bf%&A8qZ$wG#FWv4clG&I(eF&+FyeI>bhL5NK-7k1Pw@D89`ll^ZQ1_KE*ws(?)RM^avZ1{jWw%t>yZaaRoIZI}i=#Vv#I4|!2Rv^e zPaMe`59+$x$&_>-QopFNb=_@Bq{t7B@pHM1lJ>yzva9^}g$FIU*y5anaftix>kfED zcj9#ib?La4E#fc5*E&@Xwu|H#U1nxnccN1Z*<$qOa#m9Cx`Y3hw;j}#eXCppYbeXh zg7QN0PQ@3lr$+NmaG$&-L$(^r&vErW=QpkX^L+?fYf`k<{O9`+s3dgvE@$h|0@-e| z_i?tH97e=ncTliVyo*`)o8>J9rFl((J`j~Ek8pFOn4M|oq?<08Kgkz7WKz!sdm!Cp zo5bnc*>p1_Ge(cb9-oW158Ls@OvgGLo08lmN1gP-6r4URCg&N_?a=MhxaCyhSTS>L zh23(rpci~S8YAiXLA*5EGQ)I|^G4}yc@-IB$v=_ty&0xG=lq8=OfSB*S3c7;E4%hL zs?bw%$%8eN17ax!@LdMJ_mI*d62uf$+hp7Fw;l>U!+d@ z4cO&vbLW#uB@pdKhSlstf|RY-|P=%P4BWlJFjpm;o{d9;!XW0 z+pnDI)icVOWiRLF^<18hISZx7=Pq8lC(6Y)UY@XMK9xem4`It-VmxxxYFewUVCJ&l7LcWOsB?UptCvb>qy{2P7?#(92xhEyS0 z_ixk2lZW@;IWRgi)oJT8-LeWMr}V|N92dux*%Tvt<|5vWXYB3@rh-q`+U@xy&D}9k zB>Jm4^6czSQids>pIKq=BDdW85`L;z7*f2cb8`4ym3(iI#o_UAx6ixUS+JaYh$P8Xq=pk%#?P@!L3}hpcAo!FE`cAk6bfx^V^iZ%S}1or4^yzmK=|Mu!sd& zunH_d%A6ee-F`XfmQ~s(?d94MoPhCjGx1`QQewn^l#-ijz&5TcrAY0Slgb;GSZ#XzN^+{DN%hraQa}_Q8 zl~_>k!fe;v8Ej6rol{vD+(4O7*=7Dt14=FdsX&FQ&A$bZT!A=0D5yYe(!>gWR>?HV zmIBlBAuU;XX{fYwUE?&VX0~Bv)2LRVR4l(8 zjvUUGdX=D5w3*5gZ=p_%{;h~7YTv1By89BFFy5W90c6#6b`qr**%H-&^A^cZ$7yR~ zd-21qvc32r6mpe1<#tw07Fz3vbE!pk+%!c=BMsA;h)a@n`4M{Fb?V(M1w)u8c{R-T zrm<8ZyDmPn!JQIs0Cw)@gWQqAIp|eqPN>1{Y=lckh2yILDHQ8zGN#tCx zV3W8fa*mlMWo9_RDyf})eCu*@kCS zX6n#eFN*NfS9=<|j#{Xyk-KN<)_7r!?INTqfgGOit;& z$4Mer%}8LfJq*0>F~+IyM%A)O$zB|!vb2&B9o~bshZ+?!xZcs`*-mTo9ZLS$WDR8zR`*t}mMI6S6q_Q*j zNzRuosJlX~pn4+9cZYphptz5q(>m)cZ8XtPnYGq&7Q@9C;`CTgwz718nnv0SjZsQXa!)J*izQ9X z`7#VGD?aU|jf?)||vcnp==5k z#V*dFx0dou)SlEt?V@v+YESSye*60vqP{k4jC52><2z?C>|xl zf^zoqg56J&$xD&izYGu6oojvrYUPFU>7dZrv}GpAnCUh;Tj zQ*N|#XjphAS{|8F4vAeXOZKT2j2wsao1cl}faIfZISz2==eRFDeY4f;n-AO@zpxkU zn-)e+uH@XcMFX?CtDbqvMsofYoOu;-W>i#WB$pgG>2q^lD|ad6XhYN5C!@J0{ZBRhua_QTre`iQDMh)1 z>WNV|7|5x<)T$I`(f-F;#UgQRnp~@#BNe$ez%HM2Om8Z$GHk>6+#N|9uVXryTu_J?SNy1m@}QiY%Jsk3Gx;6Y|60$A#VZ;O{)Wb;VjZbI%!Pq3LYgOY*>r;83oM`-8o08UBjy(QL{mj&ZTk^_Ik)L|~KVSWE zU3z^)8Z@T~ToZGe9dnX!yw~FuQ%+yU*FfV(pv$qe^MNL!KD{CZuU&(bDIBaa{7C02~fL$EUCvZ-?{HNUCp=zjB}-PP2LaX+-wKG51!azD7#c5G%^ zRXfj50W@;Sl_34Ps&4EQxy;BN4{z+EeYlxyuiv?@&C^N;o0$cPt9@LXeAxDDZu*wg zYqvBWc|MbYa5wytYwHl);A^rz&`tw`tTEuKBl5pr9IQ>P0+ z%42RTQ@=`x`}lfAhc>NW&?X};7_a(E?giLgtxQ(t({f8dA4fPZZxbtPKMNL3vlm;L zQtsOyv&CDRCN-8nw%2(*+4)EJx;!h5ccqLdMt)ooSWB3nrXSwgG)rv2)CZUDwR@(T zGPdWcA|>px)?9;GZ0yO_W(n7AN3=1|b8jN^N^?1bT34E3wU@FyEQQ=6k)_ew9Th25 zHuD8aM@rJ=Jz>{hX=>EkK-x>z{;ZBjti7xmYyZQQw0n7hxb(Qr4@m2Kr}ZaV;u2P-)dylILx6aerx@75j2K4j4ZRNJ6LCPL`bz9S@vNK%;&I1#Z%XuN^ zIC91Mfwra&8Ek87+L8X(wx(I8TnpEwxXo;B-p))+$)a|q(kajb=|em5NV~bc8QfG0 zQf|dlkj~XWDNFViOIa>&3(k3{A+o04r_bZdyDqk4Of{e^;U7E-rK+%plvx%P00-s{gDH2JSyl!*`Ka5!`-Vc z+Ws9)<2Gj*={%grCTQgHI5$-2SLGy_ZQ!)n$bY1=p^m1V`^XY|>}J!%&3dqoZBy^R zbFV$!!8A0x?{wBq$DT@zJ@1U&TC9`Vmy+`0)}x)x;gnQag~z&@x&?Dt>v!goyTz|_ zab?zGNwTFg;}SJ>`6RVkx?1Ts;z7@S&Pxujke!F;4LhNmxgzBa`(!tBeOCO@CaEd$ zN1OD1TgmQbNaOz=XSk&-SByyRygoG^+Pb2<38bW)w~cz3ehhp)%ntVoW83#MRU5M& z+O*tG$Kv+hzeGmxEVph^>XcmPqS3Q}E6mordYY6J_p-aUF6(8Qy35=v&tKigf7!(< zdFl2U*rvVtI@A}}nhL2Wc#qKE*P4c@e)@(+y-nTJvy2(i+vJsgQf4c^eCj0;1>||s z9_wu?rrtx!v%Srz%;Q>FB?q& z#h-Qi7j^DU@x!n>C;5TYb9O*qQ(v~2udivAx^(H@tuOaA_sH*B+m8KBC}p+1*xw9c z(0_nAT3L!lZgq3GLK~6aaA3gWC?4s^aljm{HUOt%HQLFBi^j*vBxHplMe#0y0 z6RWKqY^qmDOe1;4!*VZB@;biE$?KQFrc$HmvcwE{8p$IMDtk||t!aKoWY+SafpkfF zXt&z7A7XkL-Mn_Gy>EzV?S6Qv4G%HRbsPRQ#LUrcHRpOW*S&J7{o#7HF3D}hq4CX3 zl3{kuP*YyhZ69g|x;HGfrEf6zxDPG0Pu^gv%JB90@Ut6CHT=jh_63a28D?tBuqVSh zhp1l@>0qUMP3MP~&bSsXST9#;AH0Lbuk78(Kpu3p!>E!>ba0r-k>R=cOv>G8YKU`h zG`(baXWScZG+o3$-DsN2u=a41FW)h7u``lyuylIo^m8AbTYvD*UtOK_yC(FY^87I| zKW~ogdE$wkM;`V`jD2gkslZeBUk^7cTFDG}QjMPkW=3C<-sN4!cca%DcSnkr-*eXX zbdinKRF2Y?@zV~I!yA)aAyRzL`m>?euY`bH;hR# zXp-|Lk;_W^%_MWB93vc>;vD38C!5K|SMt1sY)W3KwbE{zd})eOQ_SRw$tg@W52f*> zjeg&8rL|L>qmHCGmbHIOF#}W9*nU$@A9rA>z3lNKl~eCtqDLeR+>b8Z`u$WhH>KEi zX9wxov32Tn(<7CJ9-3utWRR85{$R^vwtK!A;SN1!gZZXj#Vs7=NQW&yZ{^})GfrBv z=?A=|`!1hD*e$DUquHim%@uNlw9MIOXM49KXMgnt*7Y8j!D{xo4={X*pV~C+%Xv_j?IZg(>Gj6W;izi6{d$h+ zkg{WI?YU-sihJo@x>vhQ`pM#Kxn{H$*{774N0BVM+YX;+vUIOCcOE~~BfGCv^GqEL zyfM$*q=BZlm}-eYIeXJB<_6V)Tg+^BOKop8yPYpM$TxlXfTz145oKr#slLG6PYc<+z})G6?@`-!p}8V$zZA_HJ7=NklO2#9iB#swQsO*4 zSE>j%GAru+j|$$qmssjeS$lDz87D1ul+WoVZu6NT;!k`|cTseasWnKtZRsC*Vu<52 z8iwpQ zdw6{&;Xn8A;U(sl)Rf~}JKtfNr7)a*r)gfqZ4YjJ_8!y8?LL@on{GEFw_dy4cr!9P z&u!lH>S@y^T|4V0o4d-?w9h?iN)_olZQ5j;yV6wjOq)7x!cG12W=)?qbynW&7R~J^ z0n@F*m}#@7%pEmr%7|I{V{>!!=S|O>m7Cjj>KwZxV5-~UD@`%`?PENieQKpCZbz&# zmFyjlnv%BoanoAjd*gjM0V3&FwRJY-bJ1!q&5ES23?~kCDket4xl)X{9OK_W`TTv%TxS;qOhcKvx*fHP`n4s%`3s9!-~MyVWLfuPrnD`$$_%tK9);&tnhN%o zRpv5#{xP1W={suXs427Tp;e}?^{-@_?0{)wf4GNLz5j7jBCAztkE@r<<+?G|x zerC5T^VwqdkGII}y~oWx-0N_;((TwMOoLLz2^QgV4WDcIRNlJ!2`;TPy0@&ybs1j8 zFq7egsdGk6o-j6h;Do99ty*T+sguoJVd6Z*g>CdnQ=`~PSRVdt%dR$aYxgVXan*vc z6qgRW&YU@IW;Vq-CvRr{gsC@W6X!2yH?20`wVga+#_S1WC*;o?kw0xx-qh)%Cd?cm z8=54pbY}rZ7x8eW?{eLhuOp-F5%e9Cn4WmoXH8sJA*%$5w3Eo+nTbHp?0C9aa>=ZTlXNTlD0YZh|f zByV!!eFYQ9h~xxsW1i_Oh~I7`pG|7KsDWJpxWx6kQarLBs6I{lKib)fA z3b|~d8I&vJiiKRM(Daq;;hS|%s zXkD(V6+JGZ3exokvhfnriKWbXPs<-KRV;s6_Vk(4=1dq%O^T=SxgMfmS|m-h0=G-@ z30yzPOPOhM!HQ+U6Pey#C|;Z#f5#>9w8@w4wr5PAf||FS_zp?)JA;#J;#ZeUPeN_h z|K^`k$fXOp5|#o^EN?AL&F)z+q6H(87r14i39c*@pIa!ti+y{YnUyi3va?}ts%(3& zH{E=#ab5CV#-|LQWLLs2*Zq&b_0f{nF7I8h(Qwliy|H%Ty{X*!63s}Y{+M)^^GWz5 z;aYsWQ>J$xHD$`E#Q03MT5`JL8H|wXJfw49+bC%2boV~BU9t)HzG=#yN*o4>-cCtO zeQ4{6aPW#&6v|F})w8Dh^@&La5Scv7L0Ec+L_Flw<1Kr4HIFt+I`J`iQ}fwn=8d)OpEC`8 zyNQuDBeRvdoUqJCwtd3)5S9{4cqd_5?1Xm_Zk6OpYz66c6Y*lHJ95l0D|^(;yzIOw z)AQ$*EJ#p|1Vwcd)ta3@Ve+iTGudwPccAf(r#88~hxSMv*!=GGH=Ix7mgFAW^LaDg zH$U5{s+Tc!b0@va)$tb3&qF!l*~b*Gr6iKnkqk(ZaPvaG0+&vTZ&fHh7hjnaFZIrs zJi~E}kk**UU_zl8OvX~L6Y)#1RQ!Z*!?LCMTYc`xTb1^{%h}_8*5Sd7M3QABNzS6y z6O54Blt>_!oty56CrlkTjqoD-%LX%tbI14&vp?gck|!)RGTDO*c}U!L#|!4gtfq~d zHf!9>`LCITn#+Ioz8B3vdKZ^H^P*{4Z&8l3kFUTnfE=j$+&X3GqZw$+6-onwQ$ ztoJ2zR}%`pmXok5!weD*$#fFb#nQO1jF0ckFx3{_Xj)WXOwbVJXDDs>_hQZ@%dzD7 zsJ)(K{HFQ68#$RTQrm9cXc}kKt?gvcyte&zqv=#^B$kTvpyfSH15!5FyEbuN=c;30 z+hpozHLc^(V*wJlqV#a*-(quoWq;qqbMw<}o6TH@-C{>>CYzIX#b(pM?Wt?`Z03Sd zySnz=W;3YR__`ifHzt13Uh^_N?Qtl@U89~o__FC)tV=z4T;JsyYb$SIUVJ-wi@7Rm zH)EwO4V*e^cK-NjGbh}VH`Y~u>&h+WP|B#A=S`ZGKWg;kJQ742P#O$BW++9lg~lwa z-iSjk@&EN^U~@>RN7FpC!I7_;s=RtH!m8e$V%NN7D%+bcaMV3*tEp6FQrl(j#;YHF5Fj?>E8(E1+W%SJ65In&hBX{ZcImUJx}*_XGn`#H~e zX;+6CO1<38Ff+*!ES2eNhH{*wN1jtT3z(DV9ECEjZewR2jTlOa6qMSS*|YMeO>ter zcqzF)45g$7#)q_*(yr-@kcs5*dIq1Fw&^jhLA}}7P79dJZLe*nkFCDVRJ-)>J)^|q zO`OB`8O)htjF_(WixZxUt0s97u8`!#SUR3W`lVPpriAatQt%1igXtM%^mKnmiE|kE)ceCX@6L5 za!Op+(xdCtRrWIW{-b74gHie8ot?@8;-vB>Dq^x_{T8&eSM4;7uPANLW+ubaN5+O_uR$;NsXNSf>doBf1oTV)}^%6!;T zuHJlnd=iUwjcvNy+*fsK8>cJvF_dJpCr@^rp~&U$3}@`S&A6P-Ejcu&mW18BDt7#GK_nH>=_dT2wH``|}_x*gOQ*sv>mSMij8CGNX zIG?h72F#v5ee#67v7B8_m^w?&G4n@Fn3|oPKYmnx_Jmp4Q>QVQ3iB9DpPipQYSyg0 z{Omb-WAdlXWcr4=&Y5dxhP82{Yx)+f)BIeIy?>vXUHW|@r4_kmQ;GR|Jl9s*Z&sE& z@*8XSZK`HH!r50IX=@MeH#r%n+B#))rmg*DzZsg*m~xRWX=pop{Q)zmN5a$FIbGBO zhO(Pl&QQ9lm2p4EP#QyD&Wo?(w0IHW#AaDcc!}1Q2Ho2`Tm3Z}ja0zf_{g8Mn=X8E zayjb#L%P^Zrz#wJ!!*47cczkNdOM%QOz$9kr_Qw0hz^&|)Nh}E(+nu_7NhHvD#oz9 z{p_&mXnTcCwVdp$oJJuXitR`M`uUds-tap&{WJw%;&m}b|fxXuA50$reL|sWXzjFhe5kt)zO|gXmWYF#AYAj z+Fcv3z4{P)+L2zHFT-VCyZVsHa)-P&B=N_+_7ua6nAf8%qiiSZIn1W5+sUJyA8vQp zbQ(S$%id%zLs_4Z4YTuZo=yd$Rwm+B6DK7s^>Zetw(;8H+QE2P=frp}kjM##>pjLx zM{%-~J$aaBbpemSQVUD5x4dJIEAxQUsyijeNjWFnQPW=P0m$2FF5b@@mYzMGFUJ?R4O;j@g-y?mDIH0?NR8aLr)?I(jwIh>fP zR6|+&gsWp&>xAXVod*uyutHn~-vB#Hbb+Q4eUiRE5n8$My0G<%9s zi8)?F_-Q`Lo#5J}_-6>Ov!S<5+oET$rUl6Exr_C^Ws0_AlTOH=)nwF|F|(&QJBaKa zPB$p!BKc35Fl&}vl^8c6Z}Qmekt6-YOP#Sj>;k?Wm=VO%{PCK1O!In2;{Jr8?0A#w zR3a|DCv{57yuH2hU7p;oiKXk6ix|>HCj40;e~zW}6Y@%TY|iWedfZcjA2o2`Uy!P^HievJ1u6C=_28%T`Zh*bFBxpg4H} zj*pZcg#Z$+Gi!E7bmaaKJt-1jpbSMp_%D^ueU81F&$($Fk*%`_V@9) z`VhaBbaHrbb9d)(r(WWs_~=oy@>;db%_i>0KK68k1IXfiZORE#u~oyq9_?>>Ps^S) zd(3!_O~&R)!mAlC8{yya&OSlnM)tM+POy)ePZ}=NxgP3k7o0FvO9ZjhgohXwl{VkO zjy%Pkh-&v5W79t}l`1yv=S*>&6eCHwpCxX{@OWR_{v&gD#-4b5q@R8JBhx%1yT7xC zIp4>Y_}J9XXoICBN$>sGG!e+cwA#hvxtuzS|_}OaH}NGDHK1qP<%SeE^D8dzB`r@OSm7FhMusmzmD)O3$jd^ zo+o>~T+ST4^)0)bi)S+G{j@~Nqa^H=H038)N+}Wl8@?*ZhWgSY$=BlKC7X{+$(}HK zfbI2(nd%N)XaD)c)Gm72KsK`d>_?t3U{tS9soR0;oGmkwJfsdX{=QF59Vx*xmaTl+WR5=0 zEahZKIv!~q$(B`0xEW#T8xn3_$Sn%FWr6Kor>UWG+~Cp6 zi=)PlojGFs>?xzBa?vC^PwrghjiqUxzrhy$(sZck8RpTON{MWwu1dk58ftI+()7%j zPJCO(o4z#t>+i>2wX;|q3er24E;T-Vqp!@uj7M*DT6)JD?JHlI#<^i!h3Pvo9Li8? zrV?Uz>{c{KK7!5l_#p zIbBC?dXCN8lr+!HcK6q2K;zUA9$maH6XaG(_UL)px8%*7mYbc;c-h!}IAR?)dD>iZ zbhQ~_y-_-^YlxFZGG>IG5;aw8-;CuTW(-5xi%U<+^z{AT4t4biesI$?cJCNrPe*xV z_v{G!SCoyOKGHe(t~t^+`-atMH`4a|hK)aLq@93$`NT`dI4E!CgmDwb=$+g|8LS{q z4){9jjYm1IPAu)LX|rdJ$$Oc&L=lcB?5ty_c|%#lElF{&5Kc__YSQ>|9IvH)YbKP~ znlv(G=YMNjG}@Ll>NUd2%SV~JwkO5!uqVGYb=v24O>1wti!N4<6AJ4i>0|^?Ci6qL*pm0TmtHzHEk%)^hF2yIUgo`guO*_uGHRyj}`LqLVmlD-znsG3;Df5 zeqT)f1sQ%wIJt;U6q?|pLjJgrPZshgh5TtDe};X@YkaCug3odC0-Y%o|79V6Rmfi# zaEfnuA6knu}%izXI)0dIke91GE^Uh?;d28|n;^g=eSi0`S0u?V5 zFSjtRis|-=izcgF znDMg3{*9-5w#7d*RqR(6IR>sVW9y*b&2rN`Jk#Uy^SPQ&I-l?i%qRV3K6ClZ;WL|0 zKA%|}SIx6o?)2W(rP)gtF1s*k^3u$uX(z@Vv>*S-jd;0pP@?oL&KcS>tVBiUnhZ}u zWtPZid@rVPZlyFzO`m(?cZ|B8QF4MP>m|K`{4u58TsX`yk%jaONBKyHAd4X%=?tU; zkVY>JJ&{%#`Fr+gk@WHd6QiV89yx7lUiP$c*#~ZQ_M8o~Nk&-qR{I%Bwu#}$Z0=)> z{MYA+PfNtx%YHVU?W!W_HEVh1J3aMTGAd2HbO(vWldeFT|0lNi+orKCQ#8F<#yg~! z)%|+D?Oimzsylswomw=#Q_-dicznV3E1F)$hKr^b_f5vqXk^bMMU!wh7PeZFyJI=C zlWs(g3M6moLS#7->wb#xX+E;^m3ZkvzTlIb<_wmexh^ODlFqQbkd`5Ekod};GPO6y9E3t`wB`p1Bj8As9?VpjJRYKwu zrFwDe?2L4iQmfGt=OpM$7OE)m$!UJafAIO!uE|Vqn=$k@r!*(uX1~fzukBuan=M&9 zy=v*>jF*+0%rJ)`<2w{jZ(iE9)G75WhSGU3eo684-le->DgEmiHei^s*nUoW_o}5f zt3-Np&vC|AWc;@brN-M)CDP|Ubjn>U-Q|7jp1rQj7WQNH@}(jB^iGQLn(v18OlQco6aeRX^fL{V7gCBrgy5J znD0r_*Jix?PC71z84RVl{yV+xd0BcZ_tkf9U2<9aQ$^cxTzcin;VcF3^LtrXJX zg~>=EJ>NlAN+I3eA@Wg3r{p_KMyj*u2pO%HjLw0hWTf~WyhTQeAHXp(Qk)0J$w=`d zc$6O?>@k@A0^j8xL?d_YDD>3bq%q__x9kdZ=qmXF9t zAzjSJWTf~LoFpTK9JqZ#M$bw{e}hlSN09apxS6MbgU{~uK{;TfTlI!CQV!2JB=d$< zMG*&N-iXSeG!#`8LtM`B##C~Y#T^B&|2fG*jPZ!UjOrwq1;QTi~_1^h`VUspsG5`Mj@5l zRmeeMk&hRlaKZ^A8Y$1L)kaZOJyaLPR1FZveqR3u$*>V>hyto6s4)tPiZ(;E`H)7n z06hBU4Xfl91h*Z$5mjrs0l;%_-l$UUKU|4os&=R?^1mSY$%U}?D4^nmg;d|5CKr^$WUy zLaK`>hQg{p(C;Xs`V0MuqN;z;-zcU^kwa@1WnJ5EAR3%Vx6jfb@N}`ym6!IYdHp#FIDvbiFa;Pi{s>-7*6xyck{c>0VhBZ>Z zfq^2bD#TSrQB^fm6~$CFP!96HCK=X3HBmrS2h~PFRXtP}g;WhteH4C8ce;&WLm1J> zCa5urs+ysuD5h$Gnj`;q$*>)2ivp^v(87jfsOpG(D5UCyyrc}P_1iXi%%9`I@y z)yQ6`CyJ@AMb{wz4#}_&>Wu=bzG#|csOpENNQSEZXgUh32B5`KXH?grJEYEtd})K= zT~cW@axl6Z`FBc&*Q5JTKy?GU9|cvz(DUobP&E=gL|j-k3T+@Rq8fu%5EoVDp?iso zseI$$bI`v_G8~VrWT={e9+3=H6VZ#3p=uHuEo-Qnj9!ooRnyQa$xt-|O(kVaH4{Bf zod0#nZ?+FUDH$pkps^$ksurPj#D!E#&;hatt8PQj5*Jb3i8c`zRr%42#Kly1p)Rrs zcT0wMOG?R4b&s2a&do5WTt;M9l7>_dqOHV*Rga_1vWBWB&_>Bn)s++Kl^pBGRC3v9 zI`Z$43}>O4D4?2)=AfYJR^A5U`U{4X^NIW$g;fjCKPV!~x*w5+E1i#gb!P*gJBW>G z+82-?`S(heFQU6pK=l&38wEvK8__d-67#X1I_c@Yu%_J1_yoGC>I90QnCfHn5%RyOo!}?%Bn-gJw9n9|D5yG( zPN9(M3-mb(tG+~MP(<}L`U*u=-=HXpslG$sB7azNIET)nfXJ8j1NQ7^J``2`f}~o;R5A1$@*k88|3JT^fT}5%ZahWEPvvU{`3AQ)q->5# zqp+$4DuW`bmZ&U>s;)rgP)yYdWg-6|$*?slj{>STr~(SAu0)rkkSf;)E5fj{Evkef zs&=R{imKY9Dk!GvfT|+@Vaf0+R1F1G9Z@z4s=TN=3aL7w928b{E|Lh+?WKXfpC2m;9!osce65Ksf_W zCo-s-g=V6VYBtJ8VU>K%V-AX_=AoNWRCO!51;tbg(0t^7TQX!-T?ruY4j9|sh&Y=k^f!Ea6MXw0;*?G5Cv7wqvuda^#a;}!an6o z@I@F=Z9*GSRP{32jAE)+&=%x>Pcqz!UPS@bHWWfZ)pqn63aNIY9Vo1N9qmGq_jLca z7w&;kjogp+p_u9obO8C^mkh(`O%zZaLI+V$bp#zoA=O*xCAWXZ6VkoHk1O1Lds=v^mD6IMi{f#236uIHRlPpnHDsrQkswgUg{3j#_ zgVInyvdI6DWLO?$p@8ag zQ~?E5mE@bO6=6tO1yx32RW(!SK5_Co&8B*XdW8Wd11K-Z$6Y9Z>4LMo|2eNb4n2=zq~)ne2SMO8~s ze-u;Qh6WVnX;%L!$#5yWj>v%Ob~F$LRd=94D0Ip;Y{`YAh>m@mdw&m9X6CAQ(1R$Z zdKW!}{HJB!@1Yeapn4xYjDo5U&?6|M`Vd(ZRz*+%MN}uyN)+`eKZ1|KnCfHn81jEE z8JoknX=RP{M}3dKJ6Nfuwgr=kA~(HXQB z1yo<6XHZb}6XJ9-VpRDYqJ$p4jO_&3^x0;+$|>nJGlrNzpydnrSP z8hH`@h{CGh(N8F%`UCxpqN+d91r$^Lg?>T)uO-7pJhf1o{YgNz7?njq)e=+{g;c)V zV09Q)E=4&gqPjhpSYOnPBa?%qmrQ?^;}1Ws(DqoNx)^5plSgc!_}aWYB_p? zxUee4C(n{pB|~K@a-*oKC@O+tDudFH{~O7$7)nP06)z2TWuTy{1S*a~s>@JG6jqf& z9u!fPsmea1G>j_C5m^?+ROL|?@_#ECUXCiDfT|Lzh=Qsrs4@zvs-dbVtg4Q(QAAY( z<)EmlR#o;HHDOFyhsfH<|D9x557k8hRRdHX1yzkuLljaqL5)#Z)eJR75mgJ+97R=E zpq416YK?rYp#Q97cqMFu0;;ws7X?-AQ9Be;U4=TJu*!=%qKK+9>V%@IuBZ!&sk)w&Ij`+Eb*Ua%($s;))XppdE$>W#vxeyA^ss0N_^D5@HWu0t`^U^EE%zn2WJ zM?+9Rbpsm8_V)&rH^N~=hEyZaa1>UJLL*T`H3p4FQB@uqi(;yq&^YA(K{A|x#-o60 z5}JsDswrqP+us{fPJ>g446A0K=_sO_g=V6tYBtJ8G1Xi&2l>xShV#(PD4@C(-GYLu z1!z7BsVH~XLgWi87sEv`qPh(&K~dH1Xeo-R?nHMW|BsU4UC56Ds(aAgD5$y@EkhyI zeP}rfs~$l2qevCyL-0WuRXvPWpxBT0gSP3ze373dt2K;WEooFwqo*W|>KU{a`G1y_ z>(M$CP(6!+D5!cKJ%>W77tjV2R=tE?L=n{{v=K#p%9r707*oB1wjlon$#5%r6$Mn= zPzVK8+tF(%q}qvgps?z7v>sYchMih4`AR|$^Hb2prGnw^brcF zK0zl@SoInD6h&00(J2&FeStnlG1Zso4D$abIed-2LIK1s`WqO9L5=(leTzb>bLcDz ztA0S=qloH9bRI=jKck;eO!W)8fc!DZ@Hg};3aBok7z&DfX@9`qVMrtYLVu#L>L2ts zIw2}rjlEJe^3$jkR1C#bZj^!i7bU+`#9KnW0aX!H90gS}ml7zXO7p>zFswA_G89pH zPz4lKl|q-Jn5s0Yi2T1xhGkGC6i}5#l~GVt4pl)RRW_=N!m8@kd|U#A5oHdM^-)w+ z12sS~RZY|o`Tvj%YoSIcpsI};qoAq|YJx(lrl<`HtD2!JQAE|e8oS6`7*)0)vMq|K zTB3Hy|EFYl1!|81s#d523aVP8t58VQ5nYYKDlh7RBC1ZPCyJ^%qnutartAW*LH@ra z!>;IB6!^;??wHQ6{r_dZVd#rUY}R$e$}O5Qd{X!f#5c;EGqLmtEK`{Tff?E*X28vEN7@ciE4+rMGhj@3s}Xr{C)f-6OHn zt8*|=ouyOFK%-DZH4}|SQPnIo2E|nQXe{zClex@Bc_^TogT|qtYA(77g;Y1A@hI$5 z&Vv(RM0E?Ah@z@n(Iga8%}0}w|6a*(0h)pWs)cAO3aWf)8VaeFqT5hdb-X6~wwmO3 zuTN(4HrxuM8u<-}OUn1qYbc<4A8kiL)dy$?3aLIsJ5g8_LAy{ybppMP zqRaQmgMA;t-7uz+AEQ0Uf1hM{6759+)hB2l3aUOu`%y^s89IQ%s#E9<6j7Zq>Kk+nMO953ay}$? z*;UO@3i3Zde!jHk&mK_ zACw$&Q3eXAd~IPS3@Y29;wYqQk4m7hssk#CBC4yW<2zsOoA|0mW23(B;U#LNe@$Dx!d@7pjDU zs%ubX6jEK=(8o>^hLydEtcoJ4KByXss`{dA6jSv>)sg>U$*@1lK>^hOR09Q7*P)sy zq#B57p|EODL-vEUVMIBY$T}#h8iMMgnCf~|5BVRF42PonD4@ClH9$etFw_u*R5zkV zD6ATe8l#A61oAb3QROH&62(+`C|4fMu#(|8)IpxEQH@78kus>7h$f(rYBHLH!m3$l zCW@%$pxG#@T8tL4{k<{eZEy+l2PDJW(NYvp-HGl%LDgNzk3y<@(A_Akx)&`&5!HQY zIf|+tK=-4V>LK(X+u!S7DH%QtR}dLcS@Z}Bs#c-^3aK7LkD{>ZakL6WR8OKOP*k-B ztwu4`)95MWe^l~&2CZfLdjrb#a2=6B)w3vwLaOJ{b11BO0c}7L)l29_6jg0P8&OR4 zGTMy%k4c8Fpe-n%+KOI9zMyg&48f3UJ9-U;RXfoR6j8m7cA=TPr!#Z>R2caZ;a$?$#j9tx;F zL?57_>I90Qkm_Uf5eh%9`@c`%Nf^<{&(NnRsydBMp_u9m^f~fBAsL=U-=To&dvp#3 zRX?Mj&^A%gMpOiTFd(c^DQFFfAof4Jb;k7+jA~>mdK$%4MbKL0e^T<3**t>+sx-6? z1yu&EMGU4+urjf-9SD5R=@LMW`d z9Bo4pRYmj~imEE1?I@|GWu<%0@&UMIn`U9hcy^{2EquMx9VZ)fII? zQB`-;4aHPF(ACJlRx<2`^dhe6T67I@K~q zK`5rW9t}bMXC%WL&`=am-H3*vplSpfjzX$Y$Tt#(m1E#&6j9}&u_&s#35`QB)dVyi z`PWH?lh8yIP)$LTQBbuQEkYsHZDp8yODprWOy%H zh61Yl&~g-1J%H{qC%A!ZsvHyuGSHb|1G1X(}QRELwhBel6e8J`Q zfT|X%DHq~Zbx>^-Qq@CsPplGg;Z@(E()vKqjo5wx(anbQI!{UL@`xo)Cu|g&q;<|VHX%sbw}M$P}Kun zjY6tks3!`mu0_|Nh^i0jjiRc4s4t4C2B7}P|GeZk5M74?KILFI2nJQxqai4yx&aME zVbzUj7>cMypy4R08ihupm}(3fjriNoXPptEQmI zD59E%rlP3o7BmmVRP)iT$p3=O(}xzKfNC*Xgo3Ku&=M4SLC?Q#hf85tBkx3aponT2 zx(7v751{)|O!W|Y5cyw}3|FB2D4??F5foIdL;)01J%%1dVZ{FLakvUbH1bLG1d6KG zpw%d*dKx{2{4Ys{&!Dv^pjwaCp`hwn6htA_D`*P}tG1$7QAFfR+Xh20s*&5#Ybd7L ziFP3WM#=DXv9q0%|uV3h-wyk8bww4Xf2AVX8YhX(7#zSoP*Y( zfNCyUkAkY3Q4obx^U$*>thxm~ha#$5(eo&(nvXW1m}&uf0r_8+{1!gX{_jN?P|Cu* zgo3I?Xd?=#7NboltXhILqloG@^fHR7mZB{vrn()yg8W+~!#mKcD4@FYdG>!>VNmHO zGK4~^yU;ciR^5$WLlM z9u!tRi1wn0>LIibMO7=%eiTzZj1D0GtCHa(=nWK5S@b3fssbpCLaLSMpbv(XkHSMJ zqIwJ+Mp4x&bOgmzkE5f=zg04P0=N)fgim0APAD3bO7gcV6 zCy9)yUO=B9|2E0+Mf52Os9r*!p`dCbI)y^2P3SZVt2U$0QAG7J`T|8&ThJNgiz#1$ zUqb(DlHsf9D-=*|MPH+!Dukjaq}qnQL1EQv=vx#~ZAagssA>l~i(;ys=p6D_*)AFG zg5Se{>UH!3dUm@F3`;-ai|vp!o&Mn<TCuBa9Ysk))sD6Hy^ z>Y#|~YE&0RRXtEW6jSv?^^xDVOET;Q8^D0-8q^R4Ro9|MD5UC*8l$kP4{CxUs=lZx zimLjdW+yqC9)B*)w*Io2=uq6y?Y(Owo7*;kUSVS06HX>M57*#eV zm?n%Vn-DZY{~pP>DZzAMK-r97F=0^IyofJ_r>Aj9-GX4IFsy7zu(&Xyynb8W-h{MWu1j`B|%Ju}y38Tsm z1ha%O26n?iqBGCof*EDR`rBzRC5RQ^QpkT9hDnc!hzSb2fq5n)963&Eq( z{`d}!%=%aSmPE&tzY#np^dFSi7{TMhfbt^2w}nCF?*!iwhLnF0d{-D&+M+40>3sMm zjm#=QaE34neVJw@;hEx?Mn6h$me7AlQa?s8Ul>rXA~;(ZR6b5{jxeNrg5X?XSotKu zn}reOYJ&5GQRNzfxA?>{_0t6B3;l;B_o*{8|5R6X zotx>Is~iS{IZrtpCT5}>0aJ6nawN>m1UaWoz$2D+? z@?{vzrOH=eVlGp@3R82r@->*5E0nLp+^kl<0Shx#Mlf2(pp|91|KG&1y-N8O4CZR( z+b}WLDBpppxmNiu%*-0)doVZGDTl$rtW^$&Q7wb(lp|nVvg_3&aWET{@597wRE~nF z*`yo|GqYJa2Igjq@&j0ynKFh^9fMnyAHvvdE7Se|5e{~{@?)5o9m-E&YIZ6=g_+r< z{0!!1xAJpXm_5obU{ufGACy%vHh)x(g{5Hsq#lP8bG>prOwFH_6JTckqMQhG^H=30 zSeUsoz^H-28FPKTNKmvRQo&A*j1VPXEGoCTvs z2LG#^4P)~^oW{&1&T&7|c`|U}Bb5swd;rUZtD@Gjp|aD$LC_%4x7L*D9yOsF}ev${8>=*C}Vh zVAd*U!Njan&aUA6P3?Ml4%?a8p!^c%W~1^eSeQ-9uVK`};AZ7q7@IB1c`%rnGJ%QN zs+ZdWdVx!Ivy2n(}Q`7Mkx26rjHgR$AI{2m7L*2>;j|e>3|Ic@W#Vd8hI$SeSPy&xTPepLMtL92lGTD9?q#yjOW1Ow9X~=fl*z zUwHw{M4i76s4v91w;xnq1Pk*a<;5^+V{oPN5*V8gD=&q?d_;K}Ow31>m&4S2OnC*& z%*T~imT+!Ap}Yzf=99|7FluM;Q_8DhY(A~L1_tvP<+U&|pH*H5Q}a3H^)NGsC~tsy zyU*X})i>h8+b<|@f>8&9UsT=Ey`~iuUp77zt`zm|G)Z9d5p3gCg!oqZDDF2r`!%^=JCpYFgH(7ZVwCd#0|Rt zcfe6MgHKZK2xIeP Date: Tue, 9 Apr 2024 16:40:36 +0200 Subject: [PATCH 33/42] style: remove printlns --- .../src/contract.rs | 24 ----------- .../astroport-liquidity-helper/src/math.rs | 41 ------------------- .../tests/astroport_integration_tests.rs | 5 --- 3 files changed, 70 deletions(-) diff --git a/contracts/astroport-liquidity-helper/src/contract.rs b/contracts/astroport-liquidity-helper/src/contract.rs index a0a9e68..a6f0220 100644 --- a/contracts/astroport-liquidity-helper/src/contract.rs +++ b/contracts/astroport-liquidity-helper/src/contract.rs @@ -93,9 +93,6 @@ pub fn execute_balancing_provide_liquidity( pool: AstroportPool, recipient: Option, ) -> Result { - println!("execute_balancing_provide_liquidity"); - println!("info.funds: {:?}", info.funds); - println!("assets: {:?}", assets); // Get response with message to do TransferFrom on any Cw20s and assert that // native tokens have been received already. let receive_res = receive_assets(&info, &env, &assets)?; @@ -180,8 +177,6 @@ pub fn execute_balancing_provide_liquidity( _ => None, }; - println!("tax_configs: {:?}", tax_configs); - // Calculate amount of tokens to swap let (offer_asset, return_asset) = calc_xyk_balancing_swap( assets_slice, @@ -190,17 +185,10 @@ pub fn execute_balancing_provide_liquidity( tax_configs, )?; - deps.api.debug(&format!("assets: {}", &assets.to_string())); // Update balances for liquidity provision assets.add(&return_asset)?; assets.deduct(&offer_asset)?; - println!("assets after: {:?}", assets); - println!("offer_asset: {:?}", offer_asset); - println!("return_asset: {:?}", return_asset); - - deps.api.debug("post deduction"); - // If either of the assets are still zero after the swap, we can't // provide liquidity. This can happen if the amount of tokens to swap // is so small that the returned amount of the other asset would be zero. @@ -210,7 +198,6 @@ pub fn execute_balancing_provide_liquidity( .map_or_else(Uint128::zero, |y| y.amount) .is_zero() }) { - println!("pool_assets: {:?}", pool.pool_assets); if min_out.is_zero() { // If min_out is zero, we can just return the received native // assets. We don't need to return any Cw20 assets, because @@ -221,7 +208,6 @@ pub fn execute_balancing_provide_liquidity( .add_attribute("action", "No liquidity provided. Zero amount of asset") .add_attribute("assets", assets.to_string()) .add_attribute("min_out", min_out); - println!("event: {:?}", event); // Can only return funds if there are some let mut res = Response::new().add_event(event); @@ -241,8 +227,6 @@ pub fn execute_balancing_provide_liquidity( } } - println!("pool_assets 2: {:?}", pool.pool_assets); - // Create message to swap some of the asset to the other if offer_asset.amount > Uint128::zero() && return_asset.amount > Uint128::zero() { pool.swap( @@ -265,14 +249,6 @@ pub fn execute_balancing_provide_liquidity( let provide_liquidity_res = pool.provide_liquidity(deps.as_ref(), &env, assets.clone(), min_out)?; - println!("assets: {:?}", assets); - println!("pool assets: {:?}", pool.pool_assets); - println!( - "real pool assets: {:?}", - pool.query_pool_info(&deps.querier)?.assets - ); - println!("provide_liquidity_res: {:?}", provide_liquidity_res); - // Callback to return LP tokens let callback_msg = CallbackMsg::ReturnLpTokens { pool, diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index d74d27c..aad8d88 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -554,7 +554,6 @@ pub mod big_decimal { let a = BigDecimal::new(a.into()); let b = BigDecimal::new(b.into()); let expected = BigDecimal::new(expected.into()); - println!("{:?}, {:?}", &a * &b, expected); assert_eq!(&a * &b, expected); assert_eq!(&a * b.clone(), expected); assert_eq!(a.clone() * &b, expected); @@ -641,26 +640,17 @@ pub fn constant_product_formula( fee: Decimal, tax_rate: Decimal, ) -> StdResult { - println!("constant_product_formula"); - println!( - "offer_reserve: {}, ask_reserve: {}, offer_amount: {offer_amount}, fee: {fee}", - offer_reserve, ask_reserve - ); if !tax_rate.is_zero() { let sale_tax = offer_amount * tax_rate; offer_amount = offer_amount.checked_sub(sale_tax)?; } - println!("offer_amount after tax: {offer_amount}"); let cp = offer_reserve.full_mul(ask_reserve); let return_amount: Uint256 = (Decimal256::from_ratio(ask_reserve, 1u8) - Decimal256::from_ratio(cp, offer_reserve + offer_amount)) * Uint256::from(1u8); - println!("return_amount: {return_amount}"); let commission_amount: Uint256 = return_amount * Decimal256::from(fee); - println!("commission_amount: {commission_amount}"); let return_amount: Uint256 = return_amount - commission_amount; - println!("return_amount after tax: {return_amount}"); Ok(return_amount.try_into()?) } @@ -677,7 +667,6 @@ pub fn calc_xyk_balancing_swap( fee: Decimal, tax_configs: Option, ) -> StdResult<(Asset, Asset)> { - println!("calc_xyk_balancing_swap"); // Make sure there is liquidity in the pool if reserves[0].is_zero() || reserves[1].is_zero() { return Err(StdError::generic_err("No liquidity in pool")); @@ -717,18 +706,6 @@ pub fn calc_xyk_balancing_swap( .unwrap_or(Decimal::zero()); let tax_rate: &BigDecimal = &tax_rate_decimal.into(); - println!("pre calcs"); - - // Original formula: - // let two = &BigDecimal::from(2u128); - // let a = ask_reserve + ask_balance; - // let b = two * offer_reserve * (ask_reserve + ask_balance) - // - ((offer_reserve + offer_balance) * ask_reserve * fee_rate); - // let c = offer_reserve * (offer_reserve * ask_balance - offer_balance * - // ask_reserve); let discriminant = &b * &b - (two * two * &a * &c); - // // We know that for this equation, there is only one positive real solution - // let x = (discriminant.sqrt() - b) / (two * a); - // New formula including tax: // Solve equation to find amount to swap let two = &BigDecimal::from(2u128); @@ -736,7 +713,6 @@ pub fn calc_xyk_balancing_swap( let numerator = offer_reserve * ask_reserve * (fee_rate - fee_rate * tax_rate) + (offer_balance + offer_reserve) * ask_reserve * fee_rate - two * offer_reserve * (ask_balance + ask_reserve); - println!("numerator: {:?}", numerator); let discriminant = (two * offer_reserve * ask_balance - offer_balance * ask_reserve * fee_rate + two * offer_reserve * ask_reserve * (BigDecimal::one() - fee_rate) + offer_reserve * ask_reserve * fee_rate * tax_rate) @@ -744,16 +720,10 @@ pub fn calc_xyk_balancing_swap( - four * (ask_balance + ask_reserve + ask_reserve * (fee_rate * tax_rate - tax_rate)) * (offer_reserve.pow(2) * ask_balance - offer_balance * offer_reserve * ask_reserve); - println!("discriminant: {discriminant:?}"); let denominator = two * (ask_balance + ask_reserve - ask_reserve * tax_rate + ask_reserve * fee_rate * tax_rate); - - println!("denominator: {denominator:?}"); - let x = (numerator + discriminant.sqrt()) / denominator; - println!("x: {x:?}"); - // Divide by precision to get final result and convert to Uint128 let offer_amount: Uint128 = bigint_to_u128(&x.floor())?.into(); let offer_asset = Asset { @@ -774,8 +744,6 @@ pub fn calc_xyk_balancing_swap( info: assets[ask_idx].info.clone(), }; - println!("offer_asset: {offer_asset}, return_asset: {return_asset}"); - Ok((offer_asset, return_asset)) } @@ -811,9 +779,6 @@ mod test { Decimal::from_ratio(ask_balance + return_amount, offer_balance - offer_amount); let reserve_ratio_after_swap = Decimal::from_ratio(ask_reserve - return_amount, offer_reserve + offer_amount); - println!( - "asset_ratio_after_swap: {asset_ratio_after_swap}, reserve_ratio_after_swap: {reserve_ratio_after_swap}" - ); assert_decimal_almost_eq(asset_ratio_after_swap, reserve_ratio_after_swap); } @@ -906,15 +871,10 @@ mod test { // Same fee for all test cases let fee = Decimal::permille(3); - println!("Assets: {assets:?}"); - println!("Reserves: {reserves:?}"); - // Calculate swap let (swap_asset, return_asset) = calc_xyk_balancing_swap(assets, reserves, fee, None).unwrap(); - println!("Swap: {swap_asset:?}, Return: {return_asset:?}"); - // If ratios are already almost the same, no swap should happen if !should_swap { assert_eq!(swap_asset.amount, Uint128::zero()); @@ -938,6 +898,5 @@ mod test { swap_asset.amount, return_asset.amount, ); - println!("------------------------------------"); } } diff --git a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs index 10f027a..852d2da 100644 --- a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs +++ b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs @@ -467,10 +467,6 @@ pub fn test_balancing_provide_liquidity( auto_stake: Some(false), receiver: None, }; - println!( - "initial reserves {} uluna, {} astro", - reserves[0], reserves[1] - ); let _res = wasm.execute( &uluna_astro_pair_addr, &provide_liq_msg, @@ -515,7 +511,6 @@ pub fn test_balancing_provide_liquidity( None, ) .unwrap(); - println!("msgs: {msgs:?}"); let _res = runner .execute_cosmos_msgs::(&msgs, &admin) .unwrap(); From 88b45589460a1ac9cf23a6678cb68ad0a5dee644 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Tue, 9 Apr 2024 17:15:03 +0200 Subject: [PATCH 34/42] fix: failing test case after astroport upgrade --- .../tests/astroport_integration_tests.rs | 29 ++++++++----------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs index 852d2da..066bd02 100644 --- a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs +++ b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs @@ -326,20 +326,13 @@ const TOLERANCE: &str = "0.0005"; [PairType::Stable { }, PairType::Custom("concentrated".to_string())], true )] -// Test 8: Xyk 0:0 pool ratio, should fail with correct error +// Test 8: Xyk 0:0 pool ratio, should fail #[test_matrix( [[Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)]], [[Uint128::from(0u128), Uint128::from(0u128)]], - [PairType::Xyk {}, PairType::Custom("astroport-pair-xyk-sale-tax".to_string())], - true - => panics "No liquidity in pool"; -)] -// Test 8: empty pool. Should work for stable and concentrated pools, but not for xyk pools. -#[test_matrix( - [[Uint128::from(1_000_000_000_000u128), Uint128::from(1_000_000_000_000u128)]], - [[Uint128::from(0u128), Uint128::from(0u128)]], - [PairType::Stable { }, PairType::Custom("concentrated".to_string())], + [PairType::Xyk {}, PairType::Custom("astroport-pair-xyk-sale-tax".to_string()), PairType::Stable { }, PairType::Custom("concentrated".to_string())], true + => panics )] /// Tests the BalancingProvideLiquidity message pub fn test_balancing_provide_liquidity( @@ -467,15 +460,17 @@ pub fn test_balancing_provide_liquidity( auto_stake: Some(false), receiver: None, }; - let _res = wasm.execute( - &uluna_astro_pair_addr, - &provide_liq_msg, - &[Coin { + let coins = if !reserves[0].is_zero() { + vec![Coin { amount: reserves[0], denom: "uluna".into(), - }], - &admin, - ).unwrap(); + }] + } else { + vec![] + }; + let _res = wasm + .execute(&uluna_astro_pair_addr, &provide_liq_msg, &coins, &admin) + .unwrap(); // Check pool liquidity after adding let initial_pool_liquidity: PoolResponse = wasm From c75f331e8f690006a8a7c25929ed0c1b9d355175 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Tue, 9 Apr 2024 17:15:59 +0200 Subject: [PATCH 35/42] build: feature gate osmosis-test-tube in astroport liq helper --- Makefile.toml | 2 + .../astroport-liquidity-helper/Cargo.toml | 3 +- .../tests/astroport_integration_tests.rs | 49 +++++++++++-------- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/Makefile.toml b/Makefile.toml index 2003e9f..2f4acb2 100644 --- a/Makefile.toml +++ b/Makefile.toml @@ -141,6 +141,8 @@ toolchain = "${RUST_VERSION}" command = "cargo" args = [ "test", + "--features", + "osmosis-test-tube", "--test", "*", ] diff --git a/contracts/astroport-liquidity-helper/Cargo.toml b/contracts/astroport-liquidity-helper/Cargo.toml index ffa85a8..5f99c4d 100644 --- a/contracts/astroport-liquidity-helper/Cargo.toml +++ b/contracts/astroport-liquidity-helper/Cargo.toml @@ -25,6 +25,7 @@ crate-type = ["cdylib", "rlib"] # backtraces = ["cosmwasm-std/backtraces"] # use library feature to disable all instantiate/execute/query exports library = [] +osmosis-test-tube = ["cw-it/osmosis-test-tube"] [package.metadata.scripts] optimize = """docker run --rm -v "$(pwd)":/code \ @@ -50,7 +51,7 @@ semver = { workspace = true } astroport_v3 = { package = "astroport", version = "3.11.1" } [dev-dependencies] -cw-it = { workspace = true, features = ["astroport", "osmosis-test-tube", "multi-test", "astroport-multi-test"] } +cw-it = { workspace = true, features = ["astroport", "multi-test", "astroport-multi-test"] } test-case = { workspace = true } proptest = { workspace = true } astroport-pair-xyk-sale-tax = { git = "https://github.com/astroport-fi/astroport-core", branch = "main" } diff --git a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs index 066bd02..a659338 100644 --- a/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs +++ b/contracts/astroport-liquidity-helper/tests/astroport_integration_tests.rs @@ -5,9 +5,12 @@ use astroport_liquidity_helper::msg::InstantiateMsg; use cosmwasm_std::{assert_approx_eq, coin, to_json_binary, Addr, Coin, Decimal, Uint128}; use cw20::{AllowanceResponse, BalanceResponse, Cw20ExecuteMsg, Cw20QueryMsg}; use cw_dex_astroport::astroport::asset::{Asset as AstroAsset, AssetInfo as AstroAssetInfo}; -use cw_dex_astroport::astroport::factory::{ExecuteMsg as FactoryExecuteMsg, FeeInfoResponse, PairType}; +use cw_dex_astroport::astroport::factory::{ + ExecuteMsg as FactoryExecuteMsg, FeeInfoResponse, PairType, +}; use cw_dex_astroport::astroport::pair::{ - ExecuteMsg as PairExecuteMsg, PoolResponse, QueryMsg as PairQueryMsg, SimulationResponse, StablePoolParams + ExecuteMsg as PairExecuteMsg, PoolResponse, QueryMsg as PairQueryMsg, SimulationResponse, + StablePoolParams, }; use cw_dex_astroport::astroport::pair_concentrated::ConcentratedPoolParams; use cw_dex_astroport::{astroport, AstroportPool}; @@ -18,15 +21,20 @@ use cw_it::astroport::utils::{ }; use cw_it::cw_multi_test::ContractWrapper; +use cw_it::cosmrs::proto::cosmwasm::wasm::v1::MsgExecuteContractResponse; use cw_it::multi_test::MultiTestRunner; -use cw_it::osmosis_test_tube::osmosis_std::types::cosmos::bank::v1beta1::QueryBalanceRequest; +use cw_it::osmosis_std::types::cosmos::bank::v1beta1::QueryBalanceRequest; +use cw_it::test_tube::{Account, Bank, Module, Runner, SigningAccount, Wasm}; use cw_it::traits::CwItRunner; -use cw_it::{Artifact, ContractType, OwnedTestRunner, TestRunner}; +use cw_it::{ContractType, OwnedTestRunner, TestRunner}; use liquidity_helper::LiquidityHelper; use test_case::test_matrix; -use cw_it::osmosis_test_tube::cosmrs::proto::cosmwasm::wasm::v1::MsgExecuteContractResponse; -use cw_it::osmosis_test_tube::{Account, Bank, Module, Runner, SigningAccount, Wasm}; +#[cfg(feature = "osmosis-test-tube")] +use cw_it::osmosis_test_tube::OsmosisTestApp; + +#[cfg(feature = "osmosis-test-tube")] +use cw_it::Artifact; use std::str::FromStr; @@ -35,9 +43,7 @@ pub const ASTROPORT_LIQUIDITY_HELPER_WASM_FILE: &str = pub fn get_test_runner<'a>() -> OwnedTestRunner<'a> { match option_env!("TEST_RUNNER").unwrap_or("multi-test") { - "multi-test" => { - OwnedTestRunner::MultiTest(MultiTestRunner::new("osmo")) - } + "multi-test" => OwnedTestRunner::MultiTest(MultiTestRunner::new("osmo")), #[cfg(feature = "osmosis-test-tube")] "osmosis-test-app" => OwnedTestRunner::OsmosisTestApp(OsmosisTestApp::new()), _ => panic!("Unsupported test runner type"), @@ -67,6 +73,7 @@ where // Upload astroport pair xyk sale tax contract let sale_tax_contract = match app { + #[cfg(feature = "osmosis-test-tube")] TestRunner::OsmosisTestApp(_) => ContractType::Artifact(Artifact::Local( ("tests/astroport-artifacts/astroport_pair_xyk_sale_tax.wasm").to_string(), )), @@ -104,6 +111,7 @@ where // Load compiled wasm bytecode or multi-test contract depending on the runner let astroport_liquidity_helper_wasm_byte_code = match app { + #[cfg(feature = "osmosis-test-tube")] TestRunner::OsmosisTestApp(_) => ContractType::Artifact(Artifact::Local( ASTROPORT_LIQUIDITY_HELPER_WASM_FILE.to_string(), )), @@ -208,15 +216,17 @@ pub fn test_calc_xyk_balancing_swap() { auto_stake: Some(false), receiver: None, }; - let _res = wasm.execute( - &uluna_astro_pair_addr, - &provide_liq_msg, - &[Coin { - amount: Uint128::from(1_000_000_000_000u128), - denom: "uluna".into(), - }], - &admin, - ).unwrap(); + let _res = wasm + .execute( + &uluna_astro_pair_addr, + &provide_liq_msg, + &[Coin { + amount: Uint128::from(1_000_000_000_000u128), + denom: "uluna".into(), + }], + &admin, + ) + .unwrap(); // Query fee info let res: FeeInfoResponse = wasm @@ -246,8 +256,7 @@ pub fn test_calc_xyk_balancing_swap() { ]; let (offer_asset, return_asset) = - calc_xyk_balancing_swap(assets, reserves, -total_fee_rate, None).unwrap(); + calc_xyk_balancing_swap(assets, reserves, total_fee_rate, None).unwrap(); // Simulate swap let simulation_result: SimulationResponse = wasm From c9d0819c7338bab5633cce7820820cbc295f3f86 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Tue, 9 Apr 2024 17:16:20 +0200 Subject: [PATCH 36/42] style: clippy --- .../tests/property_tests.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/contracts/astroport-liquidity-helper/tests/property_tests.rs b/contracts/astroport-liquidity-helper/tests/property_tests.rs index ce5f391..7bbb994 100644 --- a/contracts/astroport-liquidity-helper/tests/property_tests.rs +++ b/contracts/astroport-liquidity-helper/tests/property_tests.rs @@ -1,25 +1,25 @@ - pub mod astroport_integration_tests; -use cosmwasm_std::{Uint128,Decimal}; +use astroport_integration_tests::test_balancing_provide_liquidity; +use astroport_liquidity_helper::math::constant_product_formula; +use cosmwasm_std::{Decimal, Uint128}; use cw_dex_astroport::astroport::factory::PairType; use proptest::prelude::*; use proptest::proptest; -use astroport_integration_tests::test_balancing_provide_liquidity; -use astroport_liquidity_helper::math::constant_product_formula; fn astroport_pair_type() -> impl Strategy { prop_oneof![ Just(PairType::Xyk {}), Just(PairType::Stable {}), - // Just(PairType::Custom("concentrated".to_string())), // Errors with `newton_d is not converging` + // Just(PairType::Custom("concentrated".to_string())), // Errors with `newton_d is not + // converging` Just(PairType::Custom("astroport-pair-xyk-sale-tax".to_string())), ] } proptest! { #![proptest_config(ProptestConfig { - cases: 256, + cases: 10, max_local_rejects: 100000, max_global_rejects: 100000, max_shrink_iters: 5, From adb9147efe3ed4b172d1beb620cc165254e1b830 Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Tue, 9 Apr 2024 17:16:36 +0200 Subject: [PATCH 37/42] feat: Use cw-dex-osmosis for osmosis liquidity helper --- Cargo.lock | 56 +++++++------------ Cargo.toml | 1 + contracts/osmosis-liquidity-helper/Cargo.toml | 3 +- .../osmosis-liquidity-helper/src/contract.rs | 2 +- contracts/osmosis-liquidity-helper/src/msg.rs | 2 +- .../tests/osmosis_integration_tests.rs | 2 +- 6 files changed, 27 insertions(+), 39 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 938626c..b1e1acf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -70,7 +70,7 @@ dependencies = [ "derivative", "itertools 0.10.5", "k256 0.11.6", - "osmosis-std 0.22.0", + "osmosis-std", "prost 0.9.0", "regex", "schemars", @@ -978,7 +978,6 @@ dependencies = [ "cosmwasm-std", "cw-utils 1.0.3", "cw20 1.1.2", - "osmosis-std 0.19.2", "thiserror", ] @@ -1000,6 +999,21 @@ dependencies = [ "cw20 1.1.2", ] +[[package]] +name = "cw-dex-osmosis" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1691781e4deda5b4fb564542752e9226763997996a71abadb80f770cd7ec04c" +dependencies = [ + "apollo-cw-asset", + "apollo-utils", + "cosmwasm-schema", + "cosmwasm-std", + "cw-dex", + "cw-utils 1.0.3", + "osmosis-std", +] + [[package]] name = "cw-it" version = "0.3.1" @@ -1029,7 +1043,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw20 0.15.1", - "osmosis-std 0.22.0", + "osmosis-std", "osmosis-test-tube", "paste", "prost 0.12.3", @@ -2071,6 +2085,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-dex", + "cw-dex-osmosis", "cw-it", "cw2 1.1.2", "liquidity-helper", @@ -2078,22 +2093,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "osmosis-std" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "798fade51443a0e07eb25b59a11b320b9e8f03e6e8fbe14c520258f04742fe13" -dependencies = [ - "chrono", - "cosmwasm-std", - "osmosis-std-derive 0.16.2", - "prost 0.11.9", - "prost-types 0.11.9", - "schemars", - "serde", - "serde-cw-value", -] - [[package]] name = "osmosis-std" version = "0.22.0" @@ -2102,7 +2101,7 @@ checksum = "8641c376f01f5af329dc2a34e4f5527eaeb0bde18cda8d86fed958d04c86159c" dependencies = [ "chrono", "cosmwasm-std", - "osmosis-std-derive 0.20.1", + "osmosis-std-derive", "prost 0.12.3", "prost-types 0.12.3", "schemars", @@ -2110,19 +2109,6 @@ dependencies = [ "serde-cw-value", ] -[[package]] -name = "osmosis-std-derive" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f47f0b2f22adb341bb59e5a3a1b464dde033181954bd055b9ae86d6511ba465b" -dependencies = [ - "itertools 0.10.5", - "proc-macro2", - "prost-types 0.11.9", - "quote", - "syn 1.0.109", -] - [[package]] name = "osmosis-std-derive" version = "0.20.1" @@ -2146,7 +2132,7 @@ dependencies = [ "bindgen", "cosmrs", "cosmwasm-std", - "osmosis-std 0.22.0", + "osmosis-std", "prost 0.12.3", "serde", "serde_json", @@ -3296,7 +3282,7 @@ dependencies = [ "base64 0.21.7", "cosmrs", "cosmwasm-std", - "osmosis-std 0.22.0", + "osmosis-std", "prost 0.12.3", "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index 51c95af..f43f23c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,6 +21,7 @@ thiserror = "1.0.45" apollo-cw-asset = "0.1.2" cw-dex = "0.5.1" cw-dex-astroport = "0.1" +cw-dex-osmosis = "0.1" apollo-utils = "0.1.1" cw-bigint = "0.4.3" liquidity-helper = { version = "0.3.0", path = "./packages/liquidity-helper" } diff --git a/contracts/osmosis-liquidity-helper/Cargo.toml b/contracts/osmosis-liquidity-helper/Cargo.toml index 946e0cc..55c52e8 100644 --- a/contracts/osmosis-liquidity-helper/Cargo.toml +++ b/contracts/osmosis-liquidity-helper/Cargo.toml @@ -44,7 +44,8 @@ cosmwasm-std = { workspace = true } cw2 = { workspace = true } thiserror = { workspace = true } apollo-cw-asset = { workspace = true } -cw-dex = { workspace = true, features = ["osmosis"] } +cw-dex = { workspace = true } +cw-dex-osmosis = { workspace = true } liquidity-helper = { workspace = true } [dev-dependencies] diff --git a/contracts/osmosis-liquidity-helper/src/contract.rs b/contracts/osmosis-liquidity-helper/src/contract.rs index 3c0d12b..d10ec1e 100644 --- a/contracts/osmosis-liquidity-helper/src/contract.rs +++ b/contracts/osmosis-liquidity-helper/src/contract.rs @@ -6,8 +6,8 @@ use cosmwasm_std::{ StdResult, Uint128, }; use cw2::set_contract_version; -use cw_dex::osmosis::OsmosisPool; use cw_dex::traits::Pool; +use cw_dex_osmosis::OsmosisPool; use crate::error::ContractError; use crate::msg::{CallbackMsg, ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; diff --git a/contracts/osmosis-liquidity-helper/src/msg.rs b/contracts/osmosis-liquidity-helper/src/msg.rs index 7874a6e..cef106a 100644 --- a/contracts/osmosis-liquidity-helper/src/msg.rs +++ b/contracts/osmosis-liquidity-helper/src/msg.rs @@ -1,7 +1,7 @@ use apollo_cw_asset::Asset; use cosmwasm_schema::{cw_serde, QueryResponses}; use cosmwasm_std::{to_json_binary, Addr, CosmosMsg, Env, StdResult, Uint128, WasmMsg}; -use cw_dex::osmosis::OsmosisPool; +use cw_dex_osmosis::OsmosisPool; use liquidity_helper::msg::ExecuteMsg as GenericExcuteMsg; #[cw_serde] diff --git a/contracts/osmosis-liquidity-helper/tests/osmosis_integration_tests.rs b/contracts/osmosis-liquidity-helper/tests/osmosis_integration_tests.rs index 73818cc..47ef0b9 100644 --- a/contracts/osmosis-liquidity-helper/tests/osmosis_integration_tests.rs +++ b/contracts/osmosis-liquidity-helper/tests/osmosis_integration_tests.rs @@ -3,7 +3,7 @@ use std::vec; use apollo_cw_asset::{Asset, AssetList}; use cosmwasm_std::{to_json_binary, Addr, Coin, StdError, Uint128}; -use cw_dex::osmosis::OsmosisPool; +use cw_dex_osmosis::OsmosisPool; use cw_it::osmosis_std::types::cosmos::bank::v1beta1::QueryBalanceRequest; use cw_it::osmosis_std::types::cosmwasm::wasm::v1::MsgExecuteContractResponse; use cw_it::osmosis_test_tube::{ From 1a40507baa10274305291097252e330d845f35fa Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Tue, 9 Apr 2024 17:24:24 +0200 Subject: [PATCH 38/42] docs: Bump version and update changelog --- CHANGELOG.md | 10 ++++++++++ Cargo.lock | 53 +++++++++++++++++++++++++--------------------------- Cargo.toml | 2 +- 3 files changed, 36 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e46873..c17ec34 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,8 +5,18 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +# [0.3.3] - 2024-04-09 + +### Changed + +- Bump `cosmwasm-std` to version `1.5.3`. +- Use Pool types from `cw-dex-astroport` and `cw-dex-osmosis` packages in place of the deprecated ones in `cw-dex`. +- Support Astroport pair type `astroport-pair-xyk-sale-tax`. + # [0.3.2] - 2024-02-06 +### Changed + - Bump `cw-dex` to version `0.5.1`. ## [0.3.1] - 2023-11-06 diff --git a/Cargo.lock b/Cargo.lock index b1e1acf..32d2143 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -123,7 +123,7 @@ version = "3.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c001a7f97db88ffe6fc6cca97bbdbfe926e55599184921ff7e72cd47559440de" dependencies = [ - "astroport-circular-buffer 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "astroport-circular-buffer 0.1.0", "cosmwasm-schema", "cosmwasm-std", "cw-asset", @@ -137,18 +137,17 @@ dependencies = [ [[package]] name = "astroport" -version = "3.12.1" -source = "git+https://github.com/astroport-fi/astroport-core?branch=main#148930eaedf3cacf0c31844045891835c0b29a95" +version = "4.0.0" +source = "git+https://github.com/astroport-fi/astroport-core?branch=main#5bff86a0229c7bd96e9f719d0c5907b9b8c3762d" dependencies = [ - "astroport-circular-buffer 0.1.0 (git+https://github.com/astroport-fi/astroport-core?branch=main)", + "astroport-circular-buffer 0.2.0", "cosmwasm-schema", "cosmwasm-std", "cw-asset", - "cw-storage-plus 0.15.1", + "cw-storage-plus 1.2.0", "cw-utils 1.0.3", - "cw20 0.15.1", - "cw3", - "itertools 0.10.5", + "cw20 1.1.2", + "itertools 0.12.1", "uint", ] @@ -166,12 +165,12 @@ dependencies = [ [[package]] name = "astroport-circular-buffer" -version = "0.1.0" -source = "git+https://github.com/astroport-fi/astroport-core?branch=main#148930eaedf3cacf0c31844045891835c0b29a95" +version = "0.2.0" +source = "git+https://github.com/astroport-fi/astroport-core?branch=main#5bff86a0229c7bd96e9f719d0c5907b9b8c3762d" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-storage-plus 0.15.1", + "cw-storage-plus 1.2.0", "thiserror", ] @@ -241,7 +240,7 @@ dependencies = [ [[package]] name = "astroport-liquidity-helper" -version = "0.3.2" +version = "0.3.3" dependencies = [ "apollo-cw-asset", "apollo-utils", @@ -331,18 +330,17 @@ dependencies = [ [[package]] name = "astroport-pair" -version = "1.5.0" -source = "git+https://github.com/astroport-fi/astroport-core?branch=main#148930eaedf3cacf0c31844045891835c0b29a95" +version = "1.5.1" +source = "git+https://github.com/astroport-fi/astroport-core?branch=main#5bff86a0229c7bd96e9f719d0c5907b9b8c3762d" dependencies = [ - "astroport 3.12.1", + "astroport 4.0.0", "cosmwasm-schema", "cosmwasm-std", - "cw-storage-plus 0.15.1", + "cw-storage-plus 1.2.0", "cw-utils 1.0.3", - "cw2 0.15.1", - "cw20 0.15.1", + "cw2 1.1.2", + "cw20 1.1.2", "integer-sqrt", - "protobuf", "thiserror", ] @@ -384,18 +382,17 @@ dependencies = [ [[package]] name = "astroport-pair-xyk-sale-tax" version = "1.6.0" -source = "git+https://github.com/astroport-fi/astroport-core?branch=main#148930eaedf3cacf0c31844045891835c0b29a95" +source = "git+https://github.com/astroport-fi/astroport-core?branch=main#5bff86a0229c7bd96e9f719d0c5907b9b8c3762d" dependencies = [ - "astroport 3.12.1", - "astroport-pair 1.5.0", + "astroport 4.0.0", + "astroport-pair 1.5.1", "cosmwasm-schema", "cosmwasm-std", - "cw-storage-plus 0.15.1", + "cw-storage-plus 1.2.0", "cw-utils 1.0.3", - "cw2 0.15.1", - "cw20 0.15.1", + "cw2 1.1.2", + "cw20 1.1.2", "integer-sqrt", - "protobuf", "thiserror", ] @@ -1931,7 +1928,7 @@ checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "liquidity-helper" -version = "0.3.2" +version = "0.3.3" dependencies = [ "apollo-cw-asset", "apollo-utils", @@ -2079,7 +2076,7 @@ dependencies = [ [[package]] name = "osmosis-liquidity-helper" -version = "0.3.2" +version = "0.3.3" dependencies = [ "apollo-cw-asset", "cosmwasm-schema", diff --git a/Cargo.toml b/Cargo.toml index f43f23c..e2233ba 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ members = ["contracts/*", "packages/*"] resolver = "2" [workspace.package] -version = "0.3.2" +version = "0.3.3" edition = "2021" license = "MPL-2.0" homepage = "https://apollo.farm" From 71964ac46106c0264e611292cd72d07c65f95f5e Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Tue, 9 Apr 2024 17:28:30 +0200 Subject: [PATCH 39/42] fix: explicitly deny unsupported pool types --- contracts/astroport-liquidity-helper/src/contract.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/contracts/astroport-liquidity-helper/src/contract.rs b/contracts/astroport-liquidity-helper/src/contract.rs index a6f0220..6e8e148 100644 --- a/contracts/astroport-liquidity-helper/src/contract.rs +++ b/contracts/astroport-liquidity-helper/src/contract.rs @@ -111,7 +111,9 @@ pub fn execute_balancing_provide_liquidity( let is_xyk = match &pool.pair_type { PairType::Xyk {} => true, PairType::Custom(t) if t == "astroport-pair-xyk-sale-tax" => true, - _ => false, + PairType::Stable {} => false, + PairType::Custom(t) if t == "concentrated" => false, + _ => return Err(ContractError::UnsupportedPairType {}), }; let swap_res = if is_xyk { let pool_res = pool.query_pool_info(&deps.querier)?; From c1b7f9a13aaaf7b09cfdb15af429b5f101c06d0f Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Tue, 9 Apr 2024 17:31:36 +0200 Subject: [PATCH 40/42] refactor: Move BigDecimal to own file --- .../src/big_decimal.rs | 601 +++++++++++++++++ .../astroport-liquidity-helper/src/lib.rs | 3 +- .../astroport-liquidity-helper/src/math.rs | 627 +----------------- 3 files changed, 604 insertions(+), 627 deletions(-) create mode 100644 contracts/astroport-liquidity-helper/src/big_decimal.rs diff --git a/contracts/astroport-liquidity-helper/src/big_decimal.rs b/contracts/astroport-liquidity-helper/src/big_decimal.rs new file mode 100644 index 0000000..872a3f8 --- /dev/null +++ b/contracts/astroport-liquidity-helper/src/big_decimal.rs @@ -0,0 +1,601 @@ + +use std::ops::{Add, Div, Mul, Sub}; + +use cosmwasm_std::{Decimal, Fraction, StdError, StdResult, Uint128}; +use cw_bigint::BigInt; + +pub const BIG_DECIMAL_FRACTIONAL: u128 = 1_000_000_000_000_000_000; + +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +pub struct BigDecimal(BigInt); + +impl BigDecimal { + pub fn new(value: BigInt) -> Self { + Self(value) + } + + pub fn zero() -> Self { + Self(BigInt::from(0u128)) + } + + pub fn one() -> Self { + Self(BigInt::from(BIG_DECIMAL_FRACTIONAL)) + } + + pub fn atomics(&self) -> BigInt { + self.0.clone() + } + + /// Returns the square root of the BigDecimal. + /// + /// Uses the Newton-Raphson method to approximate the square root. + /// + /// # Panics + /// If the BigDecimal is negative, this function will panic. + pub fn sqrt(&self) -> Self { + if self < &Self::zero() { + panic!("Cannot compute the square root of a negative number."); + } + if self == &Self::zero() { + return Self::zero(); + } + + let mut x = self.clone(); + let mut y = (x.clone() + Self::one()) / BigDecimal::from(2u128); + + while y < x { + x = y.clone(); + y = (x.clone() + self.clone() / x.clone()) / BigDecimal::from(2u128); + } + y + } + + pub fn pow(&self, exp: u32) -> Self { + if exp == 0 { + return Self::one(); + } + if exp == 1 { + return self.clone(); + } + + // BigDecimal is a fixed-point number with BIG_DECIMAL_FRACTIONAL decimal + // places. x^y = (numerator / denominator)^y = numerator^y / + // denominator^y = (numerator^y / denominator^(y-1)) / + // denominator which means we represent the new number as + // new_numerator = numerator^y / denominator^(y-1), + // and new_denominator = denominator. + let value: BigInt = self.0.pow(exp) / BIG_DECIMAL_FRACTIONAL.pow(exp - 1); + + Self(value) + } + + pub fn floor(&self) -> BigInt { + self.0.clone() / BIG_DECIMAL_FRACTIONAL + } +} + +impl Mul for BigDecimal { + type Output = Self; + + fn mul(self, rhs: Self) -> Self::Output { + Self(self.0 * rhs.0 / BIG_DECIMAL_FRACTIONAL) + } +} + +impl<'a, 'b> Mul<&'b BigDecimal> for &'a BigDecimal { + type Output = BigDecimal; + + fn mul(self, rhs: &'b BigDecimal) -> Self::Output { + BigDecimal(self.0.clone() * rhs.0.clone() / BIG_DECIMAL_FRACTIONAL) + } +} + +impl<'a> Mul for &'a BigDecimal { + type Output = BigDecimal; + + fn mul(self, rhs: BigDecimal) -> Self::Output { + BigDecimal(self.0.clone() * rhs.0 / BIG_DECIMAL_FRACTIONAL) + } +} + +impl<'a> Mul<&'a BigDecimal> for BigDecimal { + type Output = BigDecimal; + + fn mul(self, rhs: &'a BigDecimal) -> Self::Output { + BigDecimal(self.0 * rhs.0.clone() / BIG_DECIMAL_FRACTIONAL) + } +} + +impl Mul for BigDecimal { + type Output = Self; + + fn mul(self, rhs: BigInt) -> Self::Output { + Self(self.0 * rhs) + } +} + +impl<'a> Mul<&'a BigInt> for BigDecimal { + type Output = Self; + + fn mul(self, rhs: &'a BigInt) -> Self::Output { + Self(self.0 * rhs.clone()) + } +} + +impl<'a> Mul for &'a BigDecimal { + type Output = BigDecimal; + + fn mul(self, rhs: BigInt) -> Self::Output { + BigDecimal(self.0.clone() * rhs) + } +} + +impl<'a, 'b> Mul<&'b BigInt> for &'a BigDecimal { + type Output = BigDecimal; + + fn mul(self, rhs: &'b BigInt) -> Self::Output { + BigDecimal(self.0.clone() * rhs.clone()) + } +} + +impl Mul for BigInt { + type Output = BigDecimal; + + fn mul(self, rhs: BigDecimal) -> Self::Output { + BigDecimal(self * rhs.0) + } +} + +impl<'a> Mul<&'a BigDecimal> for BigInt { + type Output = BigDecimal; + + fn mul(self, rhs: &'a BigDecimal) -> Self::Output { + BigDecimal(self * rhs.0.clone()) + } +} + +impl<'a> Mul for &'a BigInt { + type Output = BigDecimal; + + fn mul(self, rhs: BigDecimal) -> Self::Output { + BigDecimal(self.clone() * rhs.0) + } +} + +impl<'a, 'b> Mul<&'a BigDecimal> for &'b BigInt { + type Output = BigDecimal; + + fn mul(self, rhs: &'a BigDecimal) -> Self::Output { + BigDecimal(self.clone() * rhs.0.clone()) + } +} + +impl Add for BigDecimal { + type Output = Self; + + fn add(self, rhs: Self) -> Self::Output { + Self(self.0 + rhs.0) + } +} + +impl<'a, 'b> Add<&'b BigDecimal> for &'a BigDecimal { + type Output = BigDecimal; + + fn add(self, rhs: &'b BigDecimal) -> Self::Output { + BigDecimal(self.0.clone() + rhs.0.clone()) + } +} + +impl<'a> Add for &'a BigDecimal { + type Output = BigDecimal; + + fn add(self, rhs: BigDecimal) -> Self::Output { + BigDecimal(self.0.clone() + rhs.0) + } +} + +impl<'a> Add<&'a BigDecimal> for BigDecimal { + type Output = BigDecimal; + + fn add(self, rhs: &'a BigDecimal) -> Self::Output { + BigDecimal(self.0 + rhs.0.clone()) + } +} + +impl Add for BigDecimal { + type Output = Self; + + fn add(self, rhs: BigInt) -> Self::Output { + Self(self.0 + rhs * BIG_DECIMAL_FRACTIONAL) + } +} + +impl<'a, 'b> Add<&'b BigInt> for &'a BigDecimal { + type Output = BigDecimal; + + fn add(self, rhs: &'b BigInt) -> Self::Output { + BigDecimal(self.0.clone() + rhs.clone() * BIG_DECIMAL_FRACTIONAL) + } +} + +impl Add for BigInt { + type Output = BigDecimal; + + fn add(self, rhs: BigDecimal) -> Self::Output { + rhs + self + } +} + +impl<'a> Add<&'a BigDecimal> for BigInt { + type Output = BigDecimal; + + fn add(self, rhs: &'a BigDecimal) -> Self::Output { + rhs + self + } +} + +impl<'a> Add for &'a BigDecimal { + type Output = BigDecimal; + + fn add(self, rhs: BigInt) -> Self::Output { + self.clone() + rhs + } +} + +impl<'a> Add<&'a BigInt> for BigDecimal { + type Output = BigDecimal; + + fn add(self, rhs: &'a BigInt) -> Self::Output { + self + rhs.clone() + } +} + +impl<'a> Add for &'a BigInt { + type Output = BigDecimal; + + fn add(self, rhs: BigDecimal) -> Self::Output { + rhs + self.clone() + } +} + +impl<'a, 'b> Add<&'a BigDecimal> for &'b BigInt { + type Output = BigDecimal; + + fn add(self, rhs: &'a BigDecimal) -> Self::Output { + rhs + self.clone() + } +} + +impl Sub for BigDecimal { + type Output = Self; + + fn sub(self, rhs: Self) -> Self::Output { + Self(self.0 - rhs.0) + } +} + +impl<'a, 'b> Sub<&'b BigDecimal> for &'a BigDecimal { + type Output = BigDecimal; + + fn sub(self, rhs: &'b BigDecimal) -> Self::Output { + BigDecimal(self.0.clone() - rhs.0.clone()) + } +} + +impl<'a> Sub for &'a BigDecimal { + type Output = BigDecimal; + + fn sub(self, rhs: BigDecimal) -> Self::Output { + BigDecimal(self.0.clone() - rhs.0) + } +} + +impl<'a> Sub<&'a BigDecimal> for BigDecimal { + type Output = BigDecimal; + + fn sub(self, rhs: &'a BigDecimal) -> Self::Output { + BigDecimal(self.0 - rhs.0.clone()) + } +} + +impl Sub for BigDecimal { + type Output = Self; + + fn sub(self, rhs: BigInt) -> Self::Output { + Self(self.0 - rhs * BIG_DECIMAL_FRACTIONAL) + } +} + +impl<'a, 'b> Sub<&'a BigInt> for &'b BigDecimal { + type Output = BigDecimal; + + fn sub(self, rhs: &'a BigInt) -> Self::Output { + BigDecimal(self.0.clone() - rhs.clone() * BIG_DECIMAL_FRACTIONAL) + } +} + +impl Sub for BigInt { + type Output = BigDecimal; + + fn sub(self, rhs: BigDecimal) -> Self::Output { + BigDecimal(self * BIG_DECIMAL_FRACTIONAL - rhs.0) + } +} + +impl<'a, 'b> Sub<&'a BigDecimal> for &'b BigInt { + type Output = BigDecimal; + + fn sub(self, rhs: &'a BigDecimal) -> Self::Output { + BigDecimal(self.clone() * BIG_DECIMAL_FRACTIONAL - rhs.0.clone()) + } +} + +impl<'a> Sub for &'a BigDecimal { + type Output = BigDecimal; + + fn sub(self, rhs: BigInt) -> Self::Output { + BigDecimal(self.0.clone() - rhs * BIG_DECIMAL_FRACTIONAL) + } +} + +impl<'a> Sub<&'a BigInt> for BigDecimal { + type Output = BigDecimal; + + fn sub(self, rhs: &'a BigInt) -> Self::Output { + BigDecimal(self.0 - rhs.clone() * BIG_DECIMAL_FRACTIONAL) + } +} + +impl<'a> Sub for &'a BigInt { + type Output = BigDecimal; + + fn sub(self, rhs: BigDecimal) -> Self::Output { + BigDecimal(self.clone() * BIG_DECIMAL_FRACTIONAL - rhs.0) + } +} + +impl<'a> Sub<&'a BigDecimal> for BigInt { + type Output = BigDecimal; + + fn sub(self, rhs: &'a BigDecimal) -> Self::Output { + BigDecimal(self * BIG_DECIMAL_FRACTIONAL - rhs.0.clone()) + } +} + +impl Div for BigDecimal { + type Output = Self; + + fn div(self, rhs: Self) -> Self::Output { + Self(self.0 * BIG_DECIMAL_FRACTIONAL / rhs.0) + } +} + +impl<'a, 'b> Div<&'b BigDecimal> for &'a BigDecimal { + type Output = BigDecimal; + + fn div(self, rhs: &'b BigDecimal) -> Self::Output { + BigDecimal(self.0.clone() * BIG_DECIMAL_FRACTIONAL / rhs.0.clone()) + } +} + +impl<'a> Div for &'a BigDecimal { + type Output = BigDecimal; + + fn div(self, rhs: BigDecimal) -> Self::Output { + BigDecimal(self.0.clone() * BIG_DECIMAL_FRACTIONAL / rhs.0) + } +} + +impl<'a> Div<&'a BigDecimal> for BigDecimal { + type Output = BigDecimal; + + fn div(self, rhs: &'a BigDecimal) -> Self::Output { + BigDecimal(self.0 * BIG_DECIMAL_FRACTIONAL / rhs.0.clone()) + } +} + +impl From for BigDecimal { + fn from(value: BigInt) -> Self { + Self(value * BIG_DECIMAL_FRACTIONAL) + } +} + +impl From for BigDecimal { + fn from(value: u128) -> Self { + Self(BigInt::from(value) * BIG_DECIMAL_FRACTIONAL) + } +} + +impl From for BigDecimal { + fn from(value: Decimal) -> Self { + let value = + BigInt::from(value.numerator().u128()) * BigInt::from(value.denominator().u128()); + Self(value / BIG_DECIMAL_FRACTIONAL) + } +} + +impl TryFrom for Decimal { + type Error = StdError; + + fn try_from(value: BigDecimal) -> Result { + let numerator: Uint128 = bigint_to_u128(&value.0)?.into(); + Ok(Decimal::from_ratio(numerator, BIG_DECIMAL_FRACTIONAL)) + } +} + +pub fn bigint_to_u128(big_int: &BigInt) -> StdResult { + let (sign, bytes) = big_int.to_bytes_be(); + + if sign == cw_bigint::Sign::Minus { + return Err(StdError::generic_err( + "Cannot convert a negative BigInt number to u128", + )); + } + + if bytes.len() > 16 { + return Err(StdError::generic_err( + "Attempting to convert BigInt to u128 with overflow", + )); + } + + // Pad with zeros if length is less than 16 + let num_of_zero_bytes = 16 - bytes.len(); + let mut padded_bytes = vec![0u8; num_of_zero_bytes]; + padded_bytes.extend_from_slice(&bytes); + + Ok(u128::from_be_bytes( + padded_bytes + .as_slice() + .try_into() + .map_err(|e| StdError::generic_err(format!("Failed to convert to slice: {e}")))?, + )) +} + +#[cfg(test)] +mod tests { + use super::BIG_DECIMAL_FRACTIONAL; + + use super::{bigint_to_u128, BigDecimal}; + use cosmwasm_std::{StdError, StdResult}; + use cw_bigint::BigInt; + use test_case::test_case; + + #[test_case(0u128, 0u128 => Ok(0u128); "zero")] + #[test_case(1u128, 0u128 => Ok(1u128); "one")] + #[test_case(u128::MAX, 0u128 => Ok(u128::MAX); "u128::MAX")] + #[test_case(u128::MAX, 1u128 => Err(StdError::generic_err("Attempting to convert BigInt to u128 with overflow")); "u128::MAX + 1")] + fn test_bigint_to_u128(value1: u128, value2: u128) -> StdResult { + let big_int = BigInt::from(value1) + BigInt::from(value2); + bigint_to_u128(&big_int) + } + + #[test] + fn test_bigint_to_u128_negative() { + let big_int = BigInt::from(-1); + let result = bigint_to_u128(&big_int); + assert_eq!( + result, + Err(StdError::generic_err( + "Cannot convert a negative BigInt number to u128" + )) + ); + } + + #[test_case(0u128, 0u128, 0u128; "zero plus zero")] + #[test_case(BIG_DECIMAL_FRACTIONAL, 0u128, BIG_DECIMAL_FRACTIONAL; "one plus zero")] + #[test_case(0u128, BIG_DECIMAL_FRACTIONAL, BIG_DECIMAL_FRACTIONAL; "zero plus one")] + #[test_case(BIG_DECIMAL_FRACTIONAL, BIG_DECIMAL_FRACTIONAL, 2 * BIG_DECIMAL_FRACTIONAL; "one plus one")] + #[test_case(12346u128, 45678u128, 58024u128; "0.000000000000012346 plus 0.000000000000045678")] + fn test_bigdecimal_add_bigdecimal(a: u128, b: u128, expected: u128) { + let a = BigDecimal::new(a.into()); + let b = BigDecimal::new(b.into()); + let expected = BigDecimal::new(expected.into()); + assert_eq!(&a + &b, expected); + assert_eq!(&a + b.clone(), expected); + assert_eq!(a.clone() + &b, expected); + assert_eq!(a + b, expected); + } + + #[test_case(0, 0, 0; "zero minus zero")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128, 0, BIG_DECIMAL_FRACTIONAL as i128; "one minus zero")] + #[test_case(0, BIG_DECIMAL_FRACTIONAL as i128, -(BIG_DECIMAL_FRACTIONAL as i128); "zero minus one")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128, BIG_DECIMAL_FRACTIONAL as i128, 0; "one minus one")] + #[test_case(1, 0, 1; "10^-18 minus zero")] + #[test_case(0, 1, -1; "zero minus 10^-18")] + #[test_case(1, 1, 0; "10^-18 minus 10^-18")] + fn test_bigdecimal_sub_bigdecimal(a: i128, b: i128, expected: i128) { + let a = BigDecimal::new(a.into()); + let b = BigDecimal::new(b.into()); + let expected = BigDecimal::new(expected.into()); + assert_eq!(&a - &b, expected); + assert_eq!(&a - b.clone(), expected); + assert_eq!(a.clone() - &b, expected); + assert_eq!(a - b, expected); + } + + #[test_case(0, 0, 0; "zero times zero")] + #[test_case(BIG_DECIMAL_FRACTIONAL, 0, 0; "one times zero")] + #[test_case(0, BIG_DECIMAL_FRACTIONAL, 0; "zero times one")] + #[test_case(BIG_DECIMAL_FRACTIONAL, BIG_DECIMAL_FRACTIONAL, BIG_DECIMAL_FRACTIONAL; "one times one")] + #[test_case(1_000_000_000, 1_000_000_000, 1; "10^9 times 10^9")] + #[test_case(BIG_DECIMAL_FRACTIONAL, BIG_DECIMAL_FRACTIONAL / 2, BIG_DECIMAL_FRACTIONAL / 2; "one times 0.5")] + fn test_bigdecimal_mul_bigdecimal(a: u128, b: u128, expected: u128) { + let a = BigDecimal::new(a.into()); + let b = BigDecimal::new(b.into()); + let expected = BigDecimal::new(expected.into()); + assert_eq!(&a * &b, expected); + assert_eq!(&a * b.clone(), expected); + assert_eq!(a.clone() * &b, expected); + assert_eq!(a * b, expected); + } + + #[test_case(0, 1, 0; "zero over 10^-18")] + #[test_case(1, 1, BIG_DECIMAL_FRACTIONAL as i128; "10^-18 over 10^-18")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128, 2 * BIG_DECIMAL_FRACTIONAL as i128, BIG_DECIMAL_FRACTIONAL as i128 / 2 ; "1 over 2")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128, 3 * BIG_DECIMAL_FRACTIONAL as i128, BIG_DECIMAL_FRACTIONAL as i128 / 3 ; "1 over 3")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128, BIG_DECIMAL_FRACTIONAL as i128, BIG_DECIMAL_FRACTIONAL as i128 ; "1 over 1")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128, -(BIG_DECIMAL_FRACTIONAL as i128), -(BIG_DECIMAL_FRACTIONAL as i128) ; "1 over neg 1")] + fn test_bigdecimal_div_bigdecimal(a: i128, b: i128, expected: i128) { + let a = BigDecimal::new(a.into()); + let b = BigDecimal::new(b.into()); + let expected = BigDecimal::new(expected.into()); + assert_eq!(&a / &b, expected); + assert_eq!(&a / b.clone(), expected); + assert_eq!(a.clone() / &b, expected); + assert_eq!(a / b, expected); + } + + #[test_case(0i128 => 0 ; "zero")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128 => BIG_DECIMAL_FRACTIONAL ; "one")] + #[test_case(100 * BIG_DECIMAL_FRACTIONAL as i128 => 10 * BIG_DECIMAL_FRACTIONAL ; "one hundred")] + #[test_case(2 * BIG_DECIMAL_FRACTIONAL as i128 => 1414213562373095048u128 ; "two")] + #[test_case(-(BIG_DECIMAL_FRACTIONAL as i128) => panics "Cannot compute the square root of a negative number." ; "negative one")] + fn test_bigdecimal_sqrt(val: i128) -> u128 { + bigint_to_u128(&BigDecimal::new(val.into()).sqrt().atomics()).unwrap() + } + + #[test_case(0, 0, 0; "zero plus zero")] + #[test_case(BIG_DECIMAL_FRACTIONAL, 0, BIG_DECIMAL_FRACTIONAL; "one plus zero")] + #[test_case(0, 1, BIG_DECIMAL_FRACTIONAL; "zero plus one")] + #[test_case(BIG_DECIMAL_FRACTIONAL, 1, 2 * BIG_DECIMAL_FRACTIONAL; "one plus one")] + fn test_bigdecimal_add_bigint(a: u128, b: u128, expected: u128) { + let a = BigDecimal::new(a.into()); + let b = BigInt::from(b); + let expected = BigDecimal::new(expected.into()); + assert_eq!(&a + &b, expected); + assert_eq!(&a + b.clone(), expected); + assert_eq!(a.clone() + &b, expected); + assert_eq!(a + b, expected); + } + + #[test_case(0, 0, 0; "zero minus zero")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128, 0, BIG_DECIMAL_FRACTIONAL as i128; "one minus zero")] + #[test_case(0, 1, -(BIG_DECIMAL_FRACTIONAL as i128); "zero minus one")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128, 1, 0; "one minus one")] + fn test_bigdecimal_sub_bigint(a: i128, b: i128, expected: i128) { + let a = BigDecimal::new(a.into()); + let b = BigInt::from(b); + let expected = BigDecimal::new(expected.into()); + assert_eq!(&a - &b, expected); + assert_eq!(&a - b.clone(), expected); + assert_eq!(a.clone() - &b, expected); + assert_eq!(a - b, expected); + } + + #[test_case(0, 0, 0; "zero times zero")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128, 0, 0; "one times zero")] + #[test_case(0, 1, 0; "zero times one")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128, 1, BIG_DECIMAL_FRACTIONAL as i128; "one times one")] + #[test_case(BIG_DECIMAL_FRACTIONAL as i128, -1, -(BIG_DECIMAL_FRACTIONAL as i128); "one times neg one")] + #[test_case(1, 1, 1; "10^-18 times one")] + #[test_case(-(BIG_DECIMAL_FRACTIONAL as i128), 1, -(BIG_DECIMAL_FRACTIONAL as i128); "neg one times one")] + fn test_bigdecimal_mul_bigint(a: i128, b: i128, expected: i128) { + let a = BigDecimal::new(a.into()); + let b = BigInt::from(b); + let expected = BigDecimal::new(expected.into()); + assert_eq!(&a * &b, expected); + assert_eq!(&a * b.clone(), expected); + assert_eq!(a.clone() * &b, expected); + assert_eq!(a * b, expected); + } +} diff --git a/contracts/astroport-liquidity-helper/src/lib.rs b/contracts/astroport-liquidity-helper/src/lib.rs index 17d16c9..64e1f2f 100644 --- a/contracts/astroport-liquidity-helper/src/lib.rs +++ b/contracts/astroport-liquidity-helper/src/lib.rs @@ -6,9 +6,10 @@ //! ratio of assets are the same as the pools reserves after the swap. pub mod contract; -mod error; +pub mod error; pub mod math; pub mod msg; pub mod state; +pub mod big_decimal; pub use crate::error::ContractError; diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index aad8d88..1d87ea2 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -5,632 +5,7 @@ use astroport_v3::pair_xyk_sale_tax::TaxConfigsChecked; use cosmwasm_std::{Decimal, Decimal256, StdError, StdResult, Uint128, Uint256}; use cw_bigint::BigInt; -use crate::math::big_decimal::{bigint_to_u128, BigDecimal}; - -pub mod big_decimal { - - use std::ops::{Add, Div, Mul, Sub}; - - use cosmwasm_std::{Decimal, Fraction, StdError, StdResult, Uint128}; - use cw_bigint::BigInt; - - pub const BIG_DECIMAL_FRACTIONAL: u128 = 1_000_000_000_000_000_000; - - #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] - pub struct BigDecimal(BigInt); - - impl BigDecimal { - pub fn new(value: BigInt) -> Self { - Self(value) - } - - pub fn zero() -> Self { - Self(BigInt::from(0u128)) - } - - pub fn one() -> Self { - Self(BigInt::from(BIG_DECIMAL_FRACTIONAL)) - } - - pub fn atomics(&self) -> BigInt { - self.0.clone() - } - - /// Returns the square root of the BigDecimal. - /// - /// Uses the Newton-Raphson method to approximate the square root. - /// - /// # Panics - /// If the BigDecimal is negative, this function will panic. - pub fn sqrt(&self) -> Self { - if self < &Self::zero() { - panic!("Cannot compute the square root of a negative number."); - } - if self == &Self::zero() { - return Self::zero(); - } - - let mut x = self.clone(); - let mut y = (x.clone() + Self::one()) / BigDecimal::from(2u128); - - while y < x { - x = y.clone(); - y = (x.clone() + self.clone() / x.clone()) / BigDecimal::from(2u128); - } - y - } - - pub fn pow(&self, exp: u32) -> Self { - if exp == 0 { - return Self::one(); - } - if exp == 1 { - return self.clone(); - } - - // BigDecimal is a fixed-point number with BIG_DECIMAL_FRACTIONAL decimal - // places. x^y = (numerator / denominator)^y = numerator^y / - // denominator^y = (numerator^y / denominator^(y-1)) / - // denominator which means we represent the new number as - // new_numerator = numerator^y / denominator^(y-1), - // and new_denominator = denominator. - let value: BigInt = self.0.pow(exp) / BIG_DECIMAL_FRACTIONAL.pow(exp - 1); - - Self(value) - } - - pub fn floor(&self) -> BigInt { - self.0.clone() / BIG_DECIMAL_FRACTIONAL - } - } - - // impl Display for BigDecimal { - // fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - // let bigint_decimal_str = self.0.to_str_radix(10); - // let str_len = bigint_decimal_str.len(); - // if str_len <= 18 { - // // Pad with zeros if length is less than 18 - // let num_of_zeroes = 18 - str_len; - // write!(f, "0.{}{}", "0".repeat(num_of_zeroes), - // bigint_decimal_str) } else { - // let (integer_part, fractional_part) = - // bigint_decimal_str.split_at(str_len - 18); write!(f, "{}.{}", - // integer_part, fractional_part) } - // } - // } - - impl Mul for BigDecimal { - type Output = Self; - - fn mul(self, rhs: Self) -> Self::Output { - Self(self.0 * rhs.0 / BIG_DECIMAL_FRACTIONAL) - } - } - - impl<'a, 'b> Mul<&'b BigDecimal> for &'a BigDecimal { - type Output = BigDecimal; - - fn mul(self, rhs: &'b BigDecimal) -> Self::Output { - BigDecimal(self.0.clone() * rhs.0.clone() / BIG_DECIMAL_FRACTIONAL) - } - } - - impl<'a> Mul for &'a BigDecimal { - type Output = BigDecimal; - - fn mul(self, rhs: BigDecimal) -> Self::Output { - BigDecimal(self.0.clone() * rhs.0 / BIG_DECIMAL_FRACTIONAL) - } - } - - impl<'a> Mul<&'a BigDecimal> for BigDecimal { - type Output = BigDecimal; - - fn mul(self, rhs: &'a BigDecimal) -> Self::Output { - BigDecimal(self.0 * rhs.0.clone() / BIG_DECIMAL_FRACTIONAL) - } - } - - impl Mul for BigDecimal { - type Output = Self; - - fn mul(self, rhs: BigInt) -> Self::Output { - Self(self.0 * rhs) - } - } - - impl<'a> Mul<&'a BigInt> for BigDecimal { - type Output = Self; - - fn mul(self, rhs: &'a BigInt) -> Self::Output { - Self(self.0 * rhs.clone()) - } - } - - impl<'a> Mul for &'a BigDecimal { - type Output = BigDecimal; - - fn mul(self, rhs: BigInt) -> Self::Output { - BigDecimal(self.0.clone() * rhs) - } - } - - impl<'a, 'b> Mul<&'b BigInt> for &'a BigDecimal { - type Output = BigDecimal; - - fn mul(self, rhs: &'b BigInt) -> Self::Output { - BigDecimal(self.0.clone() * rhs.clone()) - } - } - - impl Mul for BigInt { - type Output = BigDecimal; - - fn mul(self, rhs: BigDecimal) -> Self::Output { - BigDecimal(self * rhs.0) - } - } - - impl<'a> Mul<&'a BigDecimal> for BigInt { - type Output = BigDecimal; - - fn mul(self, rhs: &'a BigDecimal) -> Self::Output { - BigDecimal(self * rhs.0.clone()) - } - } - - impl<'a> Mul for &'a BigInt { - type Output = BigDecimal; - - fn mul(self, rhs: BigDecimal) -> Self::Output { - BigDecimal(self.clone() * rhs.0) - } - } - - impl<'a, 'b> Mul<&'a BigDecimal> for &'b BigInt { - type Output = BigDecimal; - - fn mul(self, rhs: &'a BigDecimal) -> Self::Output { - BigDecimal(self.clone() * rhs.0.clone()) - } - } - - impl Add for BigDecimal { - type Output = Self; - - fn add(self, rhs: Self) -> Self::Output { - Self(self.0 + rhs.0) - } - } - - impl<'a, 'b> Add<&'b BigDecimal> for &'a BigDecimal { - type Output = BigDecimal; - - fn add(self, rhs: &'b BigDecimal) -> Self::Output { - BigDecimal(self.0.clone() + rhs.0.clone()) - } - } - - impl<'a> Add for &'a BigDecimal { - type Output = BigDecimal; - - fn add(self, rhs: BigDecimal) -> Self::Output { - BigDecimal(self.0.clone() + rhs.0) - } - } - - impl<'a> Add<&'a BigDecimal> for BigDecimal { - type Output = BigDecimal; - - fn add(self, rhs: &'a BigDecimal) -> Self::Output { - BigDecimal(self.0 + rhs.0.clone()) - } - } - - impl Add for BigDecimal { - type Output = Self; - - fn add(self, rhs: BigInt) -> Self::Output { - Self(self.0 + rhs * BIG_DECIMAL_FRACTIONAL) - } - } - - impl<'a, 'b> Add<&'b BigInt> for &'a BigDecimal { - type Output = BigDecimal; - - fn add(self, rhs: &'b BigInt) -> Self::Output { - BigDecimal(self.0.clone() + rhs.clone() * BIG_DECIMAL_FRACTIONAL) - } - } - - impl Add for BigInt { - type Output = BigDecimal; - - fn add(self, rhs: BigDecimal) -> Self::Output { - rhs + self - } - } - - impl<'a> Add<&'a BigDecimal> for BigInt { - type Output = BigDecimal; - - fn add(self, rhs: &'a BigDecimal) -> Self::Output { - rhs + self - } - } - - impl<'a> Add for &'a BigDecimal { - type Output = BigDecimal; - - fn add(self, rhs: BigInt) -> Self::Output { - self.clone() + rhs - } - } - - impl<'a> Add<&'a BigInt> for BigDecimal { - type Output = BigDecimal; - - fn add(self, rhs: &'a BigInt) -> Self::Output { - self + rhs.clone() - } - } - - impl<'a> Add for &'a BigInt { - type Output = BigDecimal; - - fn add(self, rhs: BigDecimal) -> Self::Output { - rhs + self.clone() - } - } - - impl<'a, 'b> Add<&'a BigDecimal> for &'b BigInt { - type Output = BigDecimal; - - fn add(self, rhs: &'a BigDecimal) -> Self::Output { - rhs + self.clone() - } - } - - impl Sub for BigDecimal { - type Output = Self; - - fn sub(self, rhs: Self) -> Self::Output { - Self(self.0 - rhs.0) - } - } - - impl<'a, 'b> Sub<&'b BigDecimal> for &'a BigDecimal { - type Output = BigDecimal; - - fn sub(self, rhs: &'b BigDecimal) -> Self::Output { - BigDecimal(self.0.clone() - rhs.0.clone()) - } - } - - impl<'a> Sub for &'a BigDecimal { - type Output = BigDecimal; - - fn sub(self, rhs: BigDecimal) -> Self::Output { - BigDecimal(self.0.clone() - rhs.0) - } - } - - impl<'a> Sub<&'a BigDecimal> for BigDecimal { - type Output = BigDecimal; - - fn sub(self, rhs: &'a BigDecimal) -> Self::Output { - BigDecimal(self.0 - rhs.0.clone()) - } - } - - impl Sub for BigDecimal { - type Output = Self; - - fn sub(self, rhs: BigInt) -> Self::Output { - Self(self.0 - rhs * BIG_DECIMAL_FRACTIONAL) - } - } - - impl<'a, 'b> Sub<&'a BigInt> for &'b BigDecimal { - type Output = BigDecimal; - - fn sub(self, rhs: &'a BigInt) -> Self::Output { - BigDecimal(self.0.clone() - rhs.clone() * BIG_DECIMAL_FRACTIONAL) - } - } - - impl Sub for BigInt { - type Output = BigDecimal; - - fn sub(self, rhs: BigDecimal) -> Self::Output { - BigDecimal(self * BIG_DECIMAL_FRACTIONAL - rhs.0) - } - } - - impl<'a, 'b> Sub<&'a BigDecimal> for &'b BigInt { - type Output = BigDecimal; - - fn sub(self, rhs: &'a BigDecimal) -> Self::Output { - BigDecimal(self.clone() * BIG_DECIMAL_FRACTIONAL - rhs.0.clone()) - } - } - - impl<'a> Sub for &'a BigDecimal { - type Output = BigDecimal; - - fn sub(self, rhs: BigInt) -> Self::Output { - BigDecimal(self.0.clone() - rhs * BIG_DECIMAL_FRACTIONAL) - } - } - - impl<'a> Sub<&'a BigInt> for BigDecimal { - type Output = BigDecimal; - - fn sub(self, rhs: &'a BigInt) -> Self::Output { - BigDecimal(self.0 - rhs.clone() * BIG_DECIMAL_FRACTIONAL) - } - } - - impl<'a> Sub for &'a BigInt { - type Output = BigDecimal; - - fn sub(self, rhs: BigDecimal) -> Self::Output { - BigDecimal(self.clone() * BIG_DECIMAL_FRACTIONAL - rhs.0) - } - } - - impl<'a> Sub<&'a BigDecimal> for BigInt { - type Output = BigDecimal; - - fn sub(self, rhs: &'a BigDecimal) -> Self::Output { - BigDecimal(self * BIG_DECIMAL_FRACTIONAL - rhs.0.clone()) - } - } - - impl Div for BigDecimal { - type Output = Self; - - fn div(self, rhs: Self) -> Self::Output { - Self(self.0 * BIG_DECIMAL_FRACTIONAL / rhs.0) - } - } - - impl<'a, 'b> Div<&'b BigDecimal> for &'a BigDecimal { - type Output = BigDecimal; - - fn div(self, rhs: &'b BigDecimal) -> Self::Output { - BigDecimal(self.0.clone() * BIG_DECIMAL_FRACTIONAL / rhs.0.clone()) - } - } - - impl<'a> Div for &'a BigDecimal { - type Output = BigDecimal; - - fn div(self, rhs: BigDecimal) -> Self::Output { - BigDecimal(self.0.clone() * BIG_DECIMAL_FRACTIONAL / rhs.0) - } - } - - impl<'a> Div<&'a BigDecimal> for BigDecimal { - type Output = BigDecimal; - - fn div(self, rhs: &'a BigDecimal) -> Self::Output { - BigDecimal(self.0 * BIG_DECIMAL_FRACTIONAL / rhs.0.clone()) - } - } - - impl From for BigDecimal { - fn from(value: BigInt) -> Self { - Self(value * BIG_DECIMAL_FRACTIONAL) - } - } - - impl From for BigDecimal { - fn from(value: u128) -> Self { - Self(BigInt::from(value) * BIG_DECIMAL_FRACTIONAL) - } - } - - impl From for BigDecimal { - fn from(value: Decimal) -> Self { - let value = - BigInt::from(value.numerator().u128()) * BigInt::from(value.denominator().u128()); - Self(value / BIG_DECIMAL_FRACTIONAL) - } - } - - impl TryFrom for Decimal { - type Error = StdError; - - fn try_from(value: BigDecimal) -> Result { - let numerator: Uint128 = bigint_to_u128(&value.0)?.into(); - Ok(Decimal::from_ratio(numerator, BIG_DECIMAL_FRACTIONAL)) - } - } - - pub fn bigint_to_u128(big_int: &BigInt) -> StdResult { - let (sign, bytes) = big_int.to_bytes_be(); - - if sign == cw_bigint::Sign::Minus { - return Err(StdError::generic_err( - "Cannot convert a negative BigInt number to u128", - )); - } - - if bytes.len() > 16 { - return Err(StdError::generic_err( - "Attempting to convert BigInt to u128 with overflow", - )); - } - - // Pad with zeros if length is less than 16 - let num_of_zero_bytes = 16 - bytes.len(); - let mut padded_bytes = vec![0u8; num_of_zero_bytes]; - padded_bytes.extend_from_slice(&bytes); - - Ok(u128::from_be_bytes( - padded_bytes - .as_slice() - .try_into() - .map_err(|e| StdError::generic_err(format!("Failed to convert to slice: {e}")))?, - )) - } - - #[cfg(test)] - mod tests { - use super::BIG_DECIMAL_FRACTIONAL; - - use super::{bigint_to_u128, BigDecimal}; - use cosmwasm_std::{StdError, StdResult}; - use cw_bigint::BigInt; - use test_case::test_case; - - // #[test_case(0u128 => "0.000000000000000000"; "zero")] - // #[test_case(BIG_DECIMAL_FRACTIONAL => "1.000000000000000000"; "one")] - // fn test_bigdecimal_to_string(val: u128) -> String { - // BigDecimal::new(val.into()).to_string() - // } - - #[test_case(0u128, 0u128 => Ok(0u128); "zero")] - #[test_case(1u128, 0u128 => Ok(1u128); "one")] - #[test_case(u128::MAX, 0u128 => Ok(u128::MAX); "u128::MAX")] - #[test_case(u128::MAX, 1u128 => Err(StdError::generic_err("Attempting to convert BigInt to u128 with overflow")); "u128::MAX + 1")] - fn test_bigint_to_u128(value1: u128, value2: u128) -> StdResult { - let big_int = BigInt::from(value1) + BigInt::from(value2); - bigint_to_u128(&big_int) - } - - #[test] - fn test_bigint_to_u128_negative() { - let big_int = BigInt::from(-1); - let result = bigint_to_u128(&big_int); - assert_eq!( - result, - Err(StdError::generic_err( - "Cannot convert a negative BigInt number to u128" - )) - ); - } - - #[test_case(0u128, 0u128, 0u128; "zero plus zero")] - #[test_case(BIG_DECIMAL_FRACTIONAL, 0u128, BIG_DECIMAL_FRACTIONAL; "one plus zero")] - #[test_case(0u128, BIG_DECIMAL_FRACTIONAL, BIG_DECIMAL_FRACTIONAL; "zero plus one")] - #[test_case(BIG_DECIMAL_FRACTIONAL, BIG_DECIMAL_FRACTIONAL, 2 * BIG_DECIMAL_FRACTIONAL; "one plus one")] - #[test_case(12346u128, 45678u128, 58024u128; "0.000000000000012346 plus 0.000000000000045678")] - fn test_bigdecimal_add_bigdecimal(a: u128, b: u128, expected: u128) { - let a = BigDecimal::new(a.into()); - let b = BigDecimal::new(b.into()); - let expected = BigDecimal::new(expected.into()); - assert_eq!(&a + &b, expected); - assert_eq!(&a + b.clone(), expected); - assert_eq!(a.clone() + &b, expected); - assert_eq!(a + b, expected); - } - - #[test_case(0, 0, 0; "zero minus zero")] - #[test_case(BIG_DECIMAL_FRACTIONAL as i128, 0, BIG_DECIMAL_FRACTIONAL as i128; "one minus zero")] - #[test_case(0, BIG_DECIMAL_FRACTIONAL as i128, -(BIG_DECIMAL_FRACTIONAL as i128); "zero minus one")] - #[test_case(BIG_DECIMAL_FRACTIONAL as i128, BIG_DECIMAL_FRACTIONAL as i128, 0; "one minus one")] - #[test_case(1, 0, 1; "10^-18 minus zero")] - #[test_case(0, 1, -1; "zero minus 10^-18")] - #[test_case(1, 1, 0; "10^-18 minus 10^-18")] - fn test_bigdecimal_sub_bigdecimal(a: i128, b: i128, expected: i128) { - let a = BigDecimal::new(a.into()); - let b = BigDecimal::new(b.into()); - let expected = BigDecimal::new(expected.into()); - assert_eq!(&a - &b, expected); - assert_eq!(&a - b.clone(), expected); - assert_eq!(a.clone() - &b, expected); - assert_eq!(a - b, expected); - } - - #[test_case(0, 0, 0; "zero times zero")] - #[test_case(BIG_DECIMAL_FRACTIONAL, 0, 0; "one times zero")] - #[test_case(0, BIG_DECIMAL_FRACTIONAL, 0; "zero times one")] - #[test_case(BIG_DECIMAL_FRACTIONAL, BIG_DECIMAL_FRACTIONAL, BIG_DECIMAL_FRACTIONAL; "one times one")] - #[test_case(1_000_000_000, 1_000_000_000, 1; "10^9 times 10^9")] - #[test_case(BIG_DECIMAL_FRACTIONAL, BIG_DECIMAL_FRACTIONAL / 2, BIG_DECIMAL_FRACTIONAL / 2; "one times 0.5")] - fn test_bigdecimal_mul_bigdecimal(a: u128, b: u128, expected: u128) { - let a = BigDecimal::new(a.into()); - let b = BigDecimal::new(b.into()); - let expected = BigDecimal::new(expected.into()); - assert_eq!(&a * &b, expected); - assert_eq!(&a * b.clone(), expected); - assert_eq!(a.clone() * &b, expected); - assert_eq!(a * b, expected); - } - - #[test_case(0, 1, 0; "zero over 10^-18")] - #[test_case(1, 1, BIG_DECIMAL_FRACTIONAL as i128; "10^-18 over 10^-18")] - #[test_case(BIG_DECIMAL_FRACTIONAL as i128, 2 * BIG_DECIMAL_FRACTIONAL as i128, BIG_DECIMAL_FRACTIONAL as i128 / 2 ; "1 over 2")] - #[test_case(BIG_DECIMAL_FRACTIONAL as i128, 3 * BIG_DECIMAL_FRACTIONAL as i128, BIG_DECIMAL_FRACTIONAL as i128 / 3 ; "1 over 3")] - #[test_case(BIG_DECIMAL_FRACTIONAL as i128, BIG_DECIMAL_FRACTIONAL as i128, BIG_DECIMAL_FRACTIONAL as i128 ; "1 over 1")] - #[test_case(BIG_DECIMAL_FRACTIONAL as i128, -(BIG_DECIMAL_FRACTIONAL as i128), -(BIG_DECIMAL_FRACTIONAL as i128) ; "1 over neg 1")] - fn test_bigdecimal_div_bigdecimal(a: i128, b: i128, expected: i128) { - let a = BigDecimal::new(a.into()); - let b = BigDecimal::new(b.into()); - let expected = BigDecimal::new(expected.into()); - assert_eq!(&a / &b, expected); - assert_eq!(&a / b.clone(), expected); - assert_eq!(a.clone() / &b, expected); - assert_eq!(a / b, expected); - } - - #[test_case(0i128 => 0 ; "zero")] - #[test_case(BIG_DECIMAL_FRACTIONAL as i128 => BIG_DECIMAL_FRACTIONAL ; "one")] - #[test_case(100 * BIG_DECIMAL_FRACTIONAL as i128 => 10 * BIG_DECIMAL_FRACTIONAL ; "one hundred")] - #[test_case(2 * BIG_DECIMAL_FRACTIONAL as i128 => 1414213562373095048u128 ; "two")] - #[test_case(-(BIG_DECIMAL_FRACTIONAL as i128) => panics "Cannot compute the square root of a negative number." ; "negative one")] - fn test_bigdecimal_sqrt(val: i128) -> u128 { - bigint_to_u128(&BigDecimal::new(val.into()).sqrt().atomics()).unwrap() - } - - #[test_case(0, 0, 0; "zero plus zero")] - #[test_case(BIG_DECIMAL_FRACTIONAL, 0, BIG_DECIMAL_FRACTIONAL; "one plus zero")] - #[test_case(0, 1, BIG_DECIMAL_FRACTIONAL; "zero plus one")] - #[test_case(BIG_DECIMAL_FRACTIONAL, 1, 2 * BIG_DECIMAL_FRACTIONAL; "one plus one")] - fn test_bigdecimal_add_bigint(a: u128, b: u128, expected: u128) { - let a = BigDecimal::new(a.into()); - let b = BigInt::from(b); - let expected = BigDecimal::new(expected.into()); - assert_eq!(&a + &b, expected); - assert_eq!(&a + b.clone(), expected); - assert_eq!(a.clone() + &b, expected); - assert_eq!(a + b, expected); - } - - #[test_case(0, 0, 0; "zero minus zero")] - #[test_case(BIG_DECIMAL_FRACTIONAL as i128, 0, BIG_DECIMAL_FRACTIONAL as i128; "one minus zero")] - #[test_case(0, 1, -(BIG_DECIMAL_FRACTIONAL as i128); "zero minus one")] - #[test_case(BIG_DECIMAL_FRACTIONAL as i128, 1, 0; "one minus one")] - fn test_bigdecimal_sub_bigint(a: i128, b: i128, expected: i128) { - let a = BigDecimal::new(a.into()); - let b = BigInt::from(b); - let expected = BigDecimal::new(expected.into()); - assert_eq!(&a - &b, expected); - assert_eq!(&a - b.clone(), expected); - assert_eq!(a.clone() - &b, expected); - assert_eq!(a - b, expected); - } - - #[test_case(0, 0, 0; "zero times zero")] - #[test_case(BIG_DECIMAL_FRACTIONAL as i128, 0, 0; "one times zero")] - #[test_case(0, 1, 0; "zero times one")] - #[test_case(BIG_DECIMAL_FRACTIONAL as i128, 1, BIG_DECIMAL_FRACTIONAL as i128; "one times one")] - #[test_case(BIG_DECIMAL_FRACTIONAL as i128, -1, -(BIG_DECIMAL_FRACTIONAL as i128); "one times neg one")] - #[test_case(1, 1, 1; "10^-18 times one")] - #[test_case(-(BIG_DECIMAL_FRACTIONAL as i128), 1, -(BIG_DECIMAL_FRACTIONAL as i128); "neg one times one")] - fn test_bigdecimal_mul_bigint(a: i128, b: i128, expected: i128) { - let a = BigDecimal::new(a.into()); - let b = BigInt::from(b); - let expected = BigDecimal::new(expected.into()); - assert_eq!(&a * &b, expected); - assert_eq!(&a * b.clone(), expected); - assert_eq!(a.clone() * &b, expected); - assert_eq!(a * b, expected); - } - } -} +use crate::big_decimal::{bigint_to_u128, BigDecimal}; /// Calculate how much will be returned from a swap in a constant product pool pub fn constant_product_formula( From ca37c2ec336287325f1f57cfab0c1d858dc5172f Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Tue, 9 Apr 2024 17:36:49 +0200 Subject: [PATCH 41/42] docs: update incorrect comment --- contracts/astroport-liquidity-helper/src/math.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/astroport-liquidity-helper/src/math.rs b/contracts/astroport-liquidity-helper/src/math.rs index 1d87ea2..406a199 100644 --- a/contracts/astroport-liquidity-helper/src/math.rs +++ b/contracts/astroport-liquidity-helper/src/math.rs @@ -99,7 +99,7 @@ pub fn calc_xyk_balancing_swap( * (ask_balance + ask_reserve - ask_reserve * tax_rate + ask_reserve * fee_rate * tax_rate); let x = (numerator + discriminant.sqrt()) / denominator; - // Divide by precision to get final result and convert to Uint128 + // Convert final result to Uint128 let offer_amount: Uint128 = bigint_to_u128(&x.floor())?.into(); let offer_asset = Asset { amount: offer_amount, From d44556ad1cc8e02c9983763f3a84783be62367fa Mon Sep 17 00:00:00 2001 From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com> Date: Tue, 9 Apr 2024 17:43:10 +0200 Subject: [PATCH 42/42] style: clippy & fmt --- contracts/astroport-liquidity-helper/src/big_decimal.rs | 1 - contracts/astroport-liquidity-helper/src/contract.rs | 2 +- contracts/astroport-liquidity-helper/src/lib.rs | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/contracts/astroport-liquidity-helper/src/big_decimal.rs b/contracts/astroport-liquidity-helper/src/big_decimal.rs index 872a3f8..d1bd547 100644 --- a/contracts/astroport-liquidity-helper/src/big_decimal.rs +++ b/contracts/astroport-liquidity-helper/src/big_decimal.rs @@ -1,4 +1,3 @@ - use std::ops::{Add, Div, Mul, Sub}; use cosmwasm_std::{Decimal, Fraction, StdError, StdResult, Uint128}; diff --git a/contracts/astroport-liquidity-helper/src/contract.rs b/contracts/astroport-liquidity-helper/src/contract.rs index 6e8e148..131c0d4 100644 --- a/contracts/astroport-liquidity-helper/src/contract.rs +++ b/contracts/astroport-liquidity-helper/src/contract.rs @@ -213,7 +213,7 @@ pub fn execute_balancing_provide_liquidity( // Can only return funds if there are some let mut res = Response::new().add_event(event); - if &info.funds.len() > &0 { + if !info.funds.is_empty() { res = res.add_message(CosmosMsg::Bank(BankMsg::Send { to_address: info.sender.to_string(), amount: info.funds, diff --git a/contracts/astroport-liquidity-helper/src/lib.rs b/contracts/astroport-liquidity-helper/src/lib.rs index 64e1f2f..fbaf5b4 100644 --- a/contracts/astroport-liquidity-helper/src/lib.rs +++ b/contracts/astroport-liquidity-helper/src/lib.rs @@ -5,11 +5,11 @@ //! in the correct ratio, the contract will swap some of the assets so that the //! ratio of assets are the same as the pools reserves after the swap. +pub mod big_decimal; pub mod contract; pub mod error; pub mod math; pub mod msg; pub mod state; -pub mod big_decimal; pub use crate::error::ContractError;