From 86b835f02b8e285346479832d3268f36f50ba2f7 Mon Sep 17 00:00:00 2001 From: Artur Abliazimov Date: Fri, 26 Sep 2025 14:47:56 +0300 Subject: [PATCH 01/11] Adapt the code to the Protocol 23 --- .github/workflows/tests.yml | 27 +- Cargo.lock | 941 ++++++++++++------ Cargo.toml | 7 +- Makefile | 6 +- contracts/common-token/Cargo.toml | 1 + contracts/common/Cargo.toml | 3 +- contracts/common/src/fixed/fixed_point.rs | 18 + contracts/common/src/fixed/i128.rs | 483 +++++++++ contracts/common/src/fixed/i256.rs | 260 +++++ contracts/common/src/fixed/mod.rs | 4 + .../common/src/fixed/soroban_fixed_point.rs | 37 + contracts/debt-token/Cargo.toml | 1 + contracts/debt-token/src/event.rs | 55 +- contracts/debt-token/src/lib.rs | 31 +- contracts/debt-token/src/test.rs | 10 +- contracts/deployer/src/lib.rs | 15 +- contracts/deployer/src/test.rs | 17 +- contracts/pool/Cargo.toml | 1 + contracts/pool/src/event.rs | 174 ++-- contracts/pool/src/methods/borrow.rs | 9 +- .../src/methods/configure_as_collateral.rs | 12 +- contracts/pool/src/methods/deposit.rs | 9 +- .../methods/enable_borrowing_on_reserve.rs | 12 +- contracts/pool/src/methods/flash_loan.rs | 19 +- contracts/pool/src/methods/initialize.rs | 21 +- contracts/pool/src/methods/liquidate.rs | 10 +- contracts/pool/src/methods/repay.rs | 10 +- .../pool/src/methods/set_reserve_status.rs | 12 +- contracts/pool/src/methods/withdraw.rs | 11 +- contracts/pool/src/tests/borrow.rs | 11 +- contracts/pool/src/tests/budget.rs | 10 +- .../pool/src/tests/configure_as_collateral.rs | 30 +- contracts/pool/src/tests/deposit.rs | 14 +- contracts/pool/src/tests/flash_loan.rs | 12 +- contracts/pool/src/tests/init_reserve.rs | 2 +- contracts/pool/src/tests/liquidate.rs | 17 +- contracts/pool/src/tests/repay.rs | 11 +- contracts/pool/src/tests/rounding.rs | 4 +- contracts/pool/src/tests/set_as_collateral.rs | 4 +- .../pool/src/tests/set_reserve_status.rs | 4 +- .../tests/snapshots/budget_utilization.snap | 120 +-- contracts/pool/src/tests/sut.rs | 38 +- contracts/pool/src/tests/withdraw.rs | 17 +- contracts/pool/src/types/user_configurator.rs | 14 +- contracts/s-token/Cargo.toml | 1 + contracts/s-token/src/event.rs | 76 +- contracts/s-token/src/lib.rs | 65 +- contracts/s-token/src/tests/test.rs | 36 +- deploy/scripts/deploy.sh | 2 +- deploy/scripts/upgrade.sh | 2 +- integration-tests/tests/pool.sut.ts | 2 +- 51 files changed, 2021 insertions(+), 687 deletions(-) create mode 100644 contracts/common/src/fixed/fixed_point.rs create mode 100644 contracts/common/src/fixed/i128.rs create mode 100644 contracts/common/src/fixed/i256.rs create mode 100644 contracts/common/src/fixed/mod.rs create mode 100644 contracts/common/src/fixed/soroban_fixed_point.rs diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 0035c1c2..f4cd6ddb 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -2,27 +2,26 @@ name: Linter and tests on: push: - branches: [ "master", "develop" ] + branches: ["master", "develop"] pull_request: - branches: [ "master", "develop" ] + branches: ["master", "develop"] env: CARGO_TERM_COLOR: always jobs: tests: - runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - name: Linter - run: make fmt-check - - name: Clippy - run: make clippy - - name: Test - run: | - rustup target add wasm32-unknown-unknown - make test - - name: Check - run: make check + - uses: actions/checkout@v3 + - name: Linter + run: make fmt-check + - name: Clippy + run: make clippy + - name: Test + run: | + rustup target add wasm32v1-none + make test + - name: Check + run: make check diff --git a/Cargo.lock b/Cargo.lock index b68039a5..dce1ba19 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,28 +1,19 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] -name = "addr2line" -version = "0.21.0" +name = "ahash" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ - "gimli", + "cfg-if", + "once_cell", + "version_check", + "zerocopy", ] -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -42,55 +33,146 @@ dependencies = [ ] [[package]] -name = "autocfg" -version = "1.1.0" +name = "ark-bls12-381" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", +] [[package]] -name = "backtrace" -version = "0.3.69" +name = "ark-ec" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "zeroize", ] [[package]] -name = "base16ct" -version = "0.2.0" +name = "ark-ff" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] [[package]] -name = "base32" +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23ce669cd6c8588f79e15cf450314f9638f967fc5770ff1c7c1deb0925ea7cfa" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", +] [[package]] -name = "base64" -version = "0.13.1" +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base16ct" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" -version = "0.21.7" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" [[package]] name = "block-buffer" @@ -103,9 +185,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytes-lit" @@ -116,35 +198,46 @@ dependencies = [ "num-bigint", "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] name = "cc" -version = "1.0.83" +version = "1.2.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "80f41ae168f955c12fb8960b057d70d0ca153fb83182b57d86380443527be7e9" dependencies = [ - "libc", + "find-msvc-tools", + "shlex", ] [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" + +[[package]] +name = "cfg_eval" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] [[package]] name = "chrono" -version = "0.4.33" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "num-traits", "serde", - "windows-targets", + "windows-link", ] [[package]] @@ -170,15 +263,15 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -218,26 +311,25 @@ dependencies = [ [[package]] name = "ctor" -version = "0.2.6" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d2b3721e861707777e3195b0158f950ae6dc4a27e4d02ff9f67e3eb3de199e" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn", + "syn 2.0.106", ] [[package]] name = "curve25519-dalek" -version = "4.1.1" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", "digest", "fiat-crypto", - "platforms", "rustc_version", "subtle", "zeroize", @@ -251,44 +343,85 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] name = "darling" -version = "0.20.5" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc5d6b04b3fd0ba9926f945895de7d806260a2d7431ba82e7edaecb043c4c6b8" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core 0.21.3", + "darling_macro 0.21.3", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.106", ] [[package]] name = "darling_core" -version = "0.20.5" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04e48a959bcd5c761246f5d090ebc2fbf7b9cd527a492b07a67510c108f1e7e3" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn", + "syn 2.0.106", ] [[package]] name = "darling_macro" -version = "0.20.5" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1545d67a2149e1d93b7e5c7752dce5a7426eb5d1357ddcfd89336b94444f77" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "darling_core", + "darling_core 0.20.11", "quote", - "syn", + "syn 2.0.106", ] +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core 0.21.3", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "data-encoding" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + [[package]] name = "debt-token" version = "0.1.0" @@ -316,9 +449,9 @@ dependencies = [ [[package]] name = "der" -version = "0.7.8" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid", "zeroize", @@ -326,12 +459,23 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.11" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" dependencies = [ "powerfmt", - "serde", + "serde_core", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] @@ -342,7 +486,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -359,15 +503,21 @@ dependencies = [ [[package]] name = "downcast-rs" -version = "1.2.0" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dyn-clone" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "ecdsa" -version = "0.16.7" +version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0997c976637b606099b9985693efa3581e84e41f5c11ba5255f88711058ad428" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", "digest", @@ -388,9 +538,9 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" dependencies = [ "curve25519-dalek", "ed25519", @@ -403,9 +553,9 @@ dependencies = [ [[package]] name = "either" -version = "1.9.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "elliptic-curve" @@ -427,9 +577,9 @@ dependencies = [ [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "escape-bytes" @@ -439,15 +589,15 @@ checksum = "2bfcf67fea2815c2fc3b90873fae90957be12ff417335dfadc7f52927feb03b2" [[package]] name = "ethnum" -version = "1.5.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b90ca2580b73ab6a1f724b76ca11ab632df820fd6040c336200d2c1df7b3c82c" +checksum = "ca81e6b4777c89fd810c25a4be2b1bd93ea034fbe58e6a75216a34c6b82c539b" [[package]] name = "ff" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ "rand_core", "subtle", @@ -455,9 +605,15 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.5" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "find-msvc-tools" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" +checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" [[package]] name = "flash-loan-receiver-interface" @@ -493,9 +649,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", @@ -504,12 +660,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - [[package]] name = "group" version = "0.13.0" @@ -529,9 +679,24 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hex" @@ -559,14 +724,15 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.59" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", "windows-core", ] @@ -599,13 +765,14 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.2" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "824b2ae422412366ba479e8111fd301f7b5faece8149317bb81925979a53f520" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.16.0", "serde", + "serde_core", ] [[package]] @@ -616,33 +783,34 @@ checksum = "8e04e2fd2b8188ea827b32ef11de88377086d690286ab35747ef7f9bf3ccb590" [[package]] name = "itertools" -version = "0.11.0" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "js-sys" -version = "0.3.67" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] name = "k256" -version = "0.13.1" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ "cfg-if", "ecdsa", @@ -661,44 +829,45 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.153" +version = "0.2.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" [[package]] name = "libm" -version = "0.2.8" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "log" -version = "0.4.20" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] -name = "memchr" -version = "2.7.1" +name = "macro-string" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] [[package]] -name = "miniz_oxide" -version = "0.7.1" +name = "memchr" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -711,48 +880,38 @@ checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] name = "num-derive" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[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.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" -version = "1.19.0" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "p256" @@ -768,9 +927,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pkcs8" @@ -782,12 +941,6 @@ dependencies = [ "spki", ] -[[package]] -name = "platforms" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" - [[package]] name = "pool" version = "0.1.0" @@ -819,18 +972,21 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] [[package]] name = "prettyplease" -version = "0.2.15" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.106", ] [[package]] @@ -860,18 +1016,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] @@ -906,6 +1062,26 @@ dependencies = [ "getrandom", ] +[[package]] +name = "ref-cast" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -916,26 +1092,26 @@ dependencies = [ "subtle", ] -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "s-token" @@ -957,11 +1133,46 @@ dependencies = [ "soroban-sdk", ] +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + [[package]] name = "sec1" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0aec48e813d6b90b15f0b8948af3c63483992dee44c03e9930b3eebdabe046e" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -972,53 +1183,69 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.21" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" -version = "1.0.192" +version = "1.0.226" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dca6411025b24b60bfa7ec1fe1f8e710ac09782dca409ee8237ba74b51295fd" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.226" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" +checksum = "ba2ba63999edb9dac981fb34b3e5c0d111a69b0924e253ed29d83f7c99e966a4" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.192" +version = "1.0.226" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" +checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", + "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "serde_with" -version = "3.6.0" +version = "3.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b0ed1662c5a68664f45b76d18deb0e234aff37207086803165c961eb695e981" +checksum = "c522100790450cf78eeac1507263d0a350d4d5b30df0c8e1fe051a10c22b376e" dependencies = [ - "base64 0.21.7", + "base64", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.2.2", + "indexmap 2.11.4", + "schemars 0.8.22", + "schemars 0.9.0", + "schemars 1.0.4", "serde", + "serde_derive", "serde_json", "serde_with_macros", "time", @@ -1026,21 +1253,21 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.6.0" +version = "3.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "568577ff0ef47b879f736cd66740e022f3672788cdf002a05a4e609ea5a6fb15" +checksum = "327ada00f7d64abaac1e55a6911e90cf665aa051b9a561c7006c157f4633135e" dependencies = [ - "darling", + "darling 0.21.3", "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -1057,11 +1284,17 @@ dependencies = [ "keccak", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signature" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest", "rand_core", @@ -1069,27 +1302,27 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "soroban-builtin-sdk-macros" -version = "21.2.0" +version = "23.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44877373b3dc6c662377cb1600e3a62706d75e484b6064f9cd22e467c676b159" +checksum = "d9336adeabcd6f636a4e0889c8baf494658ef5a3c4e7e227569acd2ce9091e85" dependencies = [ "itertools", "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] name = "soroban-env-common" -version = "21.2.0" +version = "23.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "590add16843a61b01844e19e89bccaaee6aa21dc76809017b0662c17dc139ee9" +checksum = "00067f52e8bbf1abf0de03fe3e2fbb06910893cfbe9a7d9093d6425658833ff3" dependencies = [ "arbitrary", "crate-git-revision", @@ -1106,9 +1339,9 @@ dependencies = [ [[package]] name = "soroban-env-guest" -version = "21.2.0" +version = "23.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ec8dc43acdd6c7e7b371acf44fc1a7dac24934ae3b2f05fafd618818548176" +checksum = "ccd1e40963517b10963a8e404348d3fe6caf9c278ac47a6effd48771297374d6" dependencies = [ "soroban-env-common", "static_assertions", @@ -1116,11 +1349,14 @@ dependencies = [ [[package]] name = "soroban-env-host" -version = "21.2.0" +version = "23.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e25aaffe0c62eb65e0e349f725b4b8b13ad0764d78a15aab5bbccb5c4797726" +checksum = "b9766c5ad78e9d8ae10afbc076301f7d610c16407a1ebb230766dbe007a48725" dependencies = [ - "backtrace", + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", "curve25519-dalek", "ecdsa", "ed25519-dalek", @@ -1149,9 +1385,9 @@ dependencies = [ [[package]] name = "soroban-env-macros" -version = "21.2.0" +version = "23.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e16b761459fdf3c4b62b24df3941498d14e5246e6fadfb4774ed8114d243aa4" +checksum = "b0e6a1c5844257ce96f5f54ef976035d5bd0ee6edefaf9f5e0bcb8ea4b34228c" dependencies = [ "itertools", "proc-macro2", @@ -1159,23 +1395,22 @@ dependencies = [ "serde", "serde_json", "stellar-xdr", - "syn", + "syn 2.0.106", ] [[package]] name = "soroban-fixed-point-math" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7ee8173a887e7c3a2e9c1f95e3944cdb2fad4009682efc4ad79e439c0e61bd" +version = "1.4.0" +source = "git+https://github.com/eq-lab/soroban-fixed-point-math?tag=soroban-sdk-23.0.2#e8966a8a0dab78bbd0ecabc3743ce4f349593e00" dependencies = [ "soroban-sdk", ] [[package]] name = "soroban-ledger-snapshot" -version = "21.4.0" +version = "23.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaebb7961fc6d8f47e00d404d9240f51aba85df9d67a4f556ef1c6057b5327a8" +checksum = "3823372b72cab2e7ff2ced62bbffa11fce8da0713a224f122141558cab174647" dependencies = [ "serde", "serde_json", @@ -1187,15 +1422,18 @@ dependencies = [ [[package]] name = "soroban-sdk" -version = "21.4.0" +version = "23.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60cd55eb88cbe1d9e7fe3ab1845c7c10c26b27e2d226e973150e5b55580aa359" +checksum = "af0e5bf6702f5952d78c5b2bcd05b0349f9a570cc62028d90dac3710b40cbe65" dependencies = [ "arbitrary", "bytes-lit", + "crate-git-revision", "ctor", + "derive_arbitrary", "ed25519-dalek", "rand", + "rustc_version", "serde", "serde_json", "soroban-env-guest", @@ -1207,31 +1445,31 @@ dependencies = [ [[package]] name = "soroban-sdk-macros" -version = "21.4.0" +version = "23.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1916985d1871aa340d7eec834c387f74f80231c846801193c3252266a60a41e" +checksum = "b38abe20199c5d9fbff232381aa4e8e83302b34e82e38fbb090f41f1284fc920" dependencies = [ - "crate-git-revision", - "darling", + "darling 0.20.11", + "heck", "itertools", + "macro-string", "proc-macro2", "quote", - "rustc_version", "sha2", "soroban-env-common", "soroban-spec", "soroban-spec-rust", "stellar-xdr", - "syn", + "syn 2.0.106", ] [[package]] name = "soroban-spec" -version = "21.4.0" +version = "23.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439faff6a155975a9951f27aaa04ae8ef3fd8fe9413d202e2ea2ff094a593449" +checksum = "72526d30f8825b859afa7e0b94549dad05c58a6c928b0763620412744512d7e2" dependencies = [ - "base64 0.13.1", + "base64", "stellar-xdr", "thiserror", "wasmparser", @@ -1239,9 +1477,9 @@ dependencies = [ [[package]] name = "soroban-spec-rust" -version = "21.4.0" +version = "23.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20b2a571055f1ed15427ccb8d34ce4208b4135666eade124cfbecfc010fa2ea3" +checksum = "9088cb8307dad026cda494971c4f13c76f9427ab26becb7cd691da95dc5e9b1d" dependencies = [ "prettyplease", "proc-macro2", @@ -1249,15 +1487,15 @@ dependencies = [ "sha2", "soroban-spec", "stellar-xdr", - "syn", + "syn 2.0.106", "thiserror", ] [[package]] name = "soroban-token-sdk" -version = "21.0.1-preview.3" +version = "23.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167f126a89d05058cb0225da9593e6f36c442174745614d71be78afa44e5057e" +checksum = "4f6124c98e1919cd71186553a70b6bd7be8b032aacbb91dd033bf4b02616c3a9" dependencies = [ "soroban-sdk", ] @@ -1299,48 +1537,61 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "stellar-strkey" -version = "0.0.8" +version = "0.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12d2bf45e114117ea91d820a846fd1afbe3ba7d717988fee094ce8227a3bf8bd" +checksum = "ee1832fb50c651ad10f734aaf5d31ca5acdfb197a6ecda64d93fcdb8885af913" dependencies = [ - "base32", "crate-git-revision", - "thiserror", + "data-encoding", ] [[package]] name = "stellar-xdr" -version = "21.2.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2675a71212ed39a806e415b0dbf4702879ff288ec7f5ee996dda42a135512b50" +checksum = "89d2848e1694b0c8db81fd812bfab5ea71ee28073e09ccc45620ef3cf7a75a9b" dependencies = [ "arbitrary", - "base64 0.13.1", + "base64", + "cfg_eval", "crate-git-revision", "escape-bytes", + "ethnum", "hex", "serde", "serde_with", + "sha2", "stellar-strkey", ] [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] [[package]] name = "syn" -version = "2.0.39" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -1349,29 +1600,29 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.55" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e3de26b0965292219b4287ff031fcba86837900fe9cd2b34ea8ad893c0953d2" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.55" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "268026685b2be38d7103e9e507c938a1fcb3d7e6eb15e87870b617bf37b6d581" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] name = "time" -version = "0.3.32" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe80ced77cbfb4cb91a94bf72b378b4b6791a0d9b7f09d0be747d1bdff4e68bd" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", @@ -1384,15 +1635,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.17" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -1400,58 +1651,60 @@ dependencies = [ [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasm-bindgen" -version = "0.2.90" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", + "once_cell", + "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.90" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.106", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.90" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1459,22 +1712,25 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.90" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.90" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasmi_arena" @@ -1500,87 +1756,114 @@ version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a58e28b80dd8340cb07b8242ae654756161f6fc8d0038123d679b7b99964fa50" dependencies = [ - "indexmap 2.2.2", + "indexmap 2.11.4", "semver", ] [[package]] name = "wasmparser-nostd" -version = "0.100.1" +version = "0.100.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9157cab83003221bfd385833ab587a039f5d6fa7304854042ba358a3b09e0724" +checksum = "d5a015fe95f3504a94bb1462c717aae75253e39b9dd6c3fb1062c934535c64aa" dependencies = [ "indexmap-nostd", ] [[package]] name = "windows-core" -version = "0.52.0" +version = "0.62.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c" dependencies = [ - "windows-targets", + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", ] [[package]] -name = "windows-targets" -version = "0.52.0" +name = "windows-implement" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 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", + "proc-macro2", + "quote", + "syn 2.0.106", ] [[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.0" +name = "windows-interface" +version = "0.59.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] [[package]] -name = "windows_aarch64_msvc" -version = "0.52.0" +name = "windows-link" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" [[package]] -name = "windows_i686_gnu" -version = "0.52.0" +name = "windows-result" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" +dependencies = [ + "windows-link", +] [[package]] -name = "windows_i686_msvc" -version = "0.52.0" +name = "windows-strings" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" +dependencies = [ + "windows-link", +] [[package]] -name = "windows_x86_64_gnu" -version = "0.52.0" +name = "zerocopy" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive", +] [[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.0" +name = "zerocopy-derive" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] [[package]] -name = "windows_x86_64_msvc" -version = "0.52.0" +name = "zeroize" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] [[package]] -name = "zeroize" -version = "1.7.0" +name = "zeroize_derive" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] diff --git a/Cargo.toml b/Cargo.toml index f292f5f2..74223345 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,10 +32,11 @@ inherits = "release" debug-assertions = true [workspace.dependencies.soroban-sdk] -version = "21.0.1-preview.3" +version = "23.0.2" [workspace.dependencies.soroban-token-sdk] -version = "21.0.1-preview.3" +version = "23.0.2" [workspace.dependencies.soroban-fixed-point-math] -version = "1.1.1" +git = "https://github.com/eq-lab/soroban-fixed-point-math" +tag = "soroban-sdk-23.0.2" \ No newline at end of file diff --git a/Makefile b/Makefile index 64b2d315..c0d2d7af 100644 --- a/Makefile +++ b/Makefile @@ -16,8 +16,8 @@ budget: build cargo test -p pool budget --features budget -- --test-threads=1 build: - cargo build --target wasm32-unknown-unknown --release - @ls -l target/wasm32-unknown-unknown/release/*.wasm + cargo build --target wasm32v1-none --release + @ls -l target/wasm32v1-none/release/*.wasm deploy-contracts: (cd deploy/artifacts && shopt -s dotglob; rm -rf *) @@ -36,7 +36,7 @@ upgrade-pool-contract: ./deploy/scripts/upgrade.sh $(env) check: - cargo check --target wasm32-unknown-unknown --release + cargo check --target wasm32v1-none --release fmt: cargo fmt --all diff --git a/contracts/common-token/Cargo.toml b/contracts/common-token/Cargo.toml index 9c09971a..5c263124 100644 --- a/contracts/common-token/Cargo.toml +++ b/contracts/common-token/Cargo.toml @@ -3,6 +3,7 @@ name = "common-token" authors = ["eq-lab"] version = "0.1.0" edition = "2021" +publish = false description = "Common stoken & debt-token implementation" [dependencies] diff --git a/contracts/common/Cargo.toml b/contracts/common/Cargo.toml index 2c449019..8bc2da86 100644 --- a/contracts/common/Cargo.toml +++ b/contracts/common/Cargo.toml @@ -3,7 +3,8 @@ name = "common" authors = ["eq-lab"] version = "0.1.0" edition = "2021" +publish = false description = "Common units" [dependencies] -soroban-fixed-point-math = { workspace = true } +soroban-fixed-point-math = { workspace = true } \ No newline at end of file diff --git a/contracts/common/src/fixed/fixed_point.rs b/contracts/common/src/fixed/fixed_point.rs new file mode 100644 index 00000000..5b115aa6 --- /dev/null +++ b/contracts/common/src/fixed/fixed_point.rs @@ -0,0 +1,18 @@ +/// Fixed point trait for computing fixed point calculations with native rust types. +pub trait FixedPoint: Sized { + /// Safely calculates floor(x * y / denominator). Returns None if a phantom overflow + /// occurs or if the denominator is 0. + fn fixed_mul_floor(self, y: Self, denominator: Self) -> Option; + + /// Safely calculates ceil(x * y / denominator). Returns None if a phantom overflow + /// occurs or if the denominator is 0. + fn fixed_mul_ceil(self, y: Self, denominator: Self) -> Option; + + /// Safely calculates floor(x * denominator / y). Returns None if a phantom overflow + /// occurs or if the denominator is 0. + fn fixed_div_floor(self, y: Self, denominator: Self) -> Option; + + /// Safely calculates ceil(x * denominator / y). Returns None if a phantom overflow + /// occurs or if the denominator is 0. + fn fixed_div_ceil(self, y: Self, denominator: Self) -> Option; +} diff --git a/contracts/common/src/fixed/i128.rs b/contracts/common/src/fixed/i128.rs new file mode 100644 index 00000000..155cbcd6 --- /dev/null +++ b/contracts/common/src/fixed/i128.rs @@ -0,0 +1,483 @@ +use soroban_sdk::{unwrap::UnwrapOptimized, Env, I256}; + +use crate::{fixed::fixed_point::FixedPoint, fixed::soroban_fixed_point::SorobanFixedPoint}; + +impl FixedPoint for i128 { + fn fixed_mul_floor(self, y: i128, denominator: i128) -> Option { + mul_div_floor(self, y, denominator) + } + + fn fixed_mul_ceil(self, y: i128, denominator: i128) -> Option { + mul_div_ceil(self, y, denominator) + } + + fn fixed_div_floor(self, y: i128, denominator: i128) -> Option { + mul_div_floor(self, denominator, y) + } + + fn fixed_div_ceil(self, y: i128, denominator: i128) -> Option { + mul_div_ceil(self, denominator, y) + } +} + +/// Performs floor(x * y / z) +pub(crate) fn mul_div_floor(x: i128, y: i128, z: i128) -> Option { + let r = x.checked_mul(y)?; + div_floor(r, z) +} + +/// Performs floor(r / z) +fn div_floor(r: i128, z: i128) -> Option { + if r < 0 || (r > 0 && z < 0) { + // ceiling is taken by default for a negative result + let remainder = r.checked_rem_euclid(z)?; + (r / z).checked_sub(if remainder > 0 { 1 } else { 0 }) + } else { + // floor taken by default for a positive or zero result + r.checked_div(z) + } +} + +/// Performs ceil(x * y / z) +pub(crate) fn mul_div_ceil(x: i128, y: i128, z: i128) -> Option { + let r = x.checked_mul(y)?; + div_ceil(r, z) +} + +/// Performs ceil(r / z) +fn div_ceil(r: i128, z: i128) -> Option { + if r <= 0 || (r > 0 && z < 0) { + // ceiling is taken by default for a negative or zero result + r.checked_div(z) + } else { + // floor taken by default for a positive result + let remainder = r.checked_rem_euclid(z)?; + (r / z).checked_add(if remainder > 0 { 1 } else { 0 }) + } +} + +impl SorobanFixedPoint for i128 { + fn fixed_mul_floor(&self, env: &Env, y: &i128, denominator: &i128) -> i128 { + scaled_mul_div_floor(&self, env, y, denominator) + } + + fn fixed_mul_ceil(&self, env: &Env, y: &i128, denominator: &i128) -> i128 { + scaled_mul_div_ceil(&self, env, y, denominator) + } + + fn fixed_div_floor(&self, env: &Env, y: &i128, denominator: &i128) -> i128 { + scaled_mul_div_floor(&self, env, denominator, y) + } + + fn fixed_div_ceil(&self, env: &Env, y: &i128, denominator: &i128) -> i128 { + scaled_mul_div_ceil(&self, env, denominator, y) + } +} + +/// Performs floor(x * y / z) +fn scaled_mul_div_floor(x: &i128, env: &Env, y: &i128, z: &i128) -> i128 { + return match x.checked_mul(*y) { + Some(r) => div_floor(r, *z).unwrap_optimized(), + None => { + // scale to i256 and retry + let res = crate::fixed::i256::mul_div_floor( + &env, + &I256::from_i128(&env, *x), + &I256::from_i128(&env, *y), + &I256::from_i128(&env, *z), + ); + // will panic if result is not representable in i128 + res.to_i128().unwrap_optimized() + } + }; +} + +/// Performs floor(x * y / z) +fn scaled_mul_div_ceil(x: &i128, env: &Env, y: &i128, z: &i128) -> i128 { + return match x.checked_mul(*y) { + Some(r) => div_ceil(r, *z).unwrap_optimized(), + None => { + // scale to i256 and retry + let res = crate::fixed::i256::mul_div_ceil( + &env, + &I256::from_i128(&env, *x), + &I256::from_i128(&env, *y), + &I256::from_i128(&env, *z), + ); + // will panic if result is not representable in i128 + res.to_i128().unwrap_optimized() + } + }; +} + +#[cfg(test)] +mod test_fixed_point { + + /********** fixed_mul_floor **********/ + + use crate::fixed::fixed_point::FixedPoint; + + #[test] + fn test_fixed_mul_floor_rounds_down() { + let x: i128 = 1_5391283; + let y: i128 = 314_1592653; + let denominator: i128 = 1_0000001; + + let result = x.fixed_mul_floor(y, denominator).unwrap(); + + assert_eq!(result, 483_5313675) + } + + #[test] + fn test_fixed_mul_floor_negative_rounds_down() { + let x: i128 = -1_5391283; + let y: i128 = 314_1592653; + let denominator: i128 = 1_0000001; + + let result = x.fixed_mul_floor(y, denominator).unwrap(); + + assert_eq!(result, -483_5313676) + } + + #[test] + fn test_fixed_mul_floor_large_number() { + let x: i128 = 170_141_183_460_469_231_731; + let y: i128 = 1_000_000_000_000_000_000; + let denominator: i128 = 1_000_000_000_000_000_000; + + let result = x.fixed_mul_floor(y, denominator).unwrap(); + + assert_eq!(result, 170_141_183_460_469_231_731) + } + + #[test] + fn test_fixed_mul_floor_phantom_overflow() { + let x: i128 = 170_141_183_460_469_231_731; + let y: i128 = 1_000_000_000_000_000_001; + let denominator: i128 = 1_000_000_000_000_000_000; + + let result = x.fixed_mul_floor(y, denominator); + + assert_eq!(None, result); + } + + /********** fixed_mul_ceil **********/ + + #[test] + fn test_fixed_mul_ceil_rounds_up() { + let x: i128 = 1_5391283; + let y: i128 = 314_1592653; + let denominator: i128 = 1_0000001; + + let result = x.fixed_mul_ceil(y, denominator).unwrap(); + + assert_eq!(result, 483_5313676) + } + + #[test] + fn test_fixed_mul_ceil_negative_rounds_up() { + let x: i128 = -1_5391283; + let y: i128 = 314_1592653; + let denominator: i128 = 1_0000001; + + let result = x.fixed_mul_ceil(y, denominator).unwrap(); + + assert_eq!(result, -483_5313675) + } + + #[test] + fn test_fixed_mul_ceil_large_number() { + let x: i128 = 170_141_183_460_469_231_731; + let y: i128 = 1_000_000_000_000_000_000; + let denominator: i128 = 1_000_000_000_000_000_000; + + let result = x.fixed_mul_ceil(y, denominator).unwrap(); + + assert_eq!(result, 170_141_183_460_469_231_731) + } + + #[test] + fn test_fixed_mul_ceil_phantom_overflow() { + let x: i128 = 170_141_183_460_469_231_731; + let y: i128 = 1_000_000_000_000_000_001; + let denominator: i128 = 1_000_000_000_000_000_000; + + let result = x.fixed_mul_ceil(y, denominator); + + assert_eq!(None, result); + } + + /********** fixed_div_floor **********/ + + #[test] + fn test_fixed_div_floor_rounds_down() { + let x: i128 = 314_1592653; + let y: i128 = 1_5391280; + let denominator: i128 = 1_0000000; + + let result = x.fixed_div_floor(y, denominator).unwrap(); + + assert_eq!(result, 204_1150997) + } + + #[test] + fn test_fixed_div_floor_negative_rounds_down() { + let x: i128 = 314_1592653; + let y: i128 = -1_5391280; + let denominator: i128 = 1_0000000; + + let result = x.fixed_div_floor(y, denominator).unwrap(); + + assert_eq!(result, -204_1150998) + } + + #[test] + fn test_fixed_div_floor_large_number() { + let x: i128 = 170_141_183_460_469_231_731; + let y: i128 = 1_000_000_000_000_000_000; + let denominator: i128 = 1_000_000_000_000_000_000; + + let result = x.fixed_div_floor(y, denominator).unwrap(); + + assert_eq!(result, 170_141_183_460_469_231_731) + } + + #[test] + fn test_fixed_div_floor_phantom_overflow() { + let x: i128 = 170_141_183_460_469_231_732; + let y: i128 = 1_000_000_000_000_000_000; + let denominator: i128 = 1_000_000_000_000_000_000; + + let result = x.fixed_div_floor(y, denominator); + + assert_eq!(None, result); + } + + /********** fixed_div_ceil **********/ + + #[test] + fn test_fixed_div_ceil_rounds_down() { + let x: i128 = 314_1592653; + let y: i128 = 1_5391280; + let denominator: i128 = 1_0000000; + + let result = x.fixed_div_ceil(y, denominator).unwrap(); + + assert_eq!(result, 204_1150998) + } + + #[test] + fn test_fixed_div_ceil_negative_rounds_down() { + let x: i128 = 314_1592653; + let y: i128 = -1_5391280; + let denominator: i128 = 1_0000000; + + let result = x.fixed_div_ceil(y, denominator).unwrap(); + + assert_eq!(result, -204_1150997) + } + + #[test] + fn test_fixed_div_ceil_large_number() { + let x: i128 = 170_141_183_460_469_231_731; + let y: i128 = 1_000_000_000_000_000_000; + let denominator: i128 = 1_000_000_000_000_000_000; + + let result = x.fixed_div_ceil(y, denominator).unwrap(); + + assert_eq!(result, 170_141_183_460_469_231_731) + } + + #[test] + fn test_fixed_div_ceil_phantom_overflow() { + let x: i128 = 170_141_183_460_469_231_732; + let y: i128 = 1_000_000_000_000_000_000; + let denominator: i128 = 1_000_000_000_000_000_000; + + let result = x.fixed_div_ceil(y, denominator); + + assert_eq!(None, result); + } +} + +#[cfg(test)] +mod test_soroban_fixed_point { + use crate::fixed::soroban_fixed_point::SorobanFixedPoint; + use soroban_sdk::Env; + + /********** fixed_mul_floor **********/ + + #[test] + fn test_fixed_mul_floor_rounds_down() { + let env = Env::default(); + let x: i128 = 1_5391283; + let y: i128 = 314_1592653; + let denominator: i128 = 1_0000001; + + let result = x.fixed_mul_floor(&env, &y, &denominator); + + assert_eq!(result, 483_5313675) + } + + #[test] + fn test_fixed_mul_floor_negative_rounds_down() { + let env = Env::default(); + let x: i128 = -1_5391283; + let y: i128 = 314_1592653; + let denominator: i128 = 1_0000001; + + let result = x.fixed_mul_floor(&env, &y, &denominator); + + assert_eq!(result, -483_5313676) + } + + #[test] + fn test_fixed_mul_floor_phantom_overflow_scales() { + let env = Env::default(); + let x: i128 = 170_141_183_460_469_231_731; + let y: i128 = 10i128.pow(27); + let denominator: i128 = 10i128.pow(18); + + let result = x.fixed_mul_floor(&env, &y, &denominator); + + assert_eq!(result, 170_141_183_460_469_231_731 * 10i128.pow(9)); + } + + /********** fixed_mul_ceil **********/ + + #[test] + fn test_fixed_mul_ceil_rounds_up() { + let env = Env::default(); + let x: i128 = 1_5391283; + let y: i128 = 314_1592653; + let denominator: i128 = 1_0000001; + + let result = x.fixed_mul_ceil(&env, &y, &denominator); + + assert_eq!(result, 483_5313676) + } + + #[test] + fn test_fixed_mul_ceil_negative_rounds_up() { + let env = Env::default(); + let x: i128 = -1_5391283; + let y: i128 = 314_1592653; + let denominator: i128 = 1_0000001; + + let result = x.fixed_mul_ceil(&env, &y, &denominator); + + assert_eq!(result, -483_5313675) + } + + #[test] + fn test_fixed_mul_ceil_large_number() { + let env = Env::default(); + let x: i128 = 170_141_183_460_469_231_731; + let y: i128 = 1_000_000_000_000_000_000; + let denominator: i128 = 1_000_000_000_000_000_000; + + let result = x.fixed_mul_ceil(&env, &y, &denominator); + + assert_eq!(result, 170_141_183_460_469_231_731) + } + + #[test] + fn test_fixed_mul_ceil_phantom_overflow_scales() { + let env = Env::default(); + let x: i128 = 170_141_183_460_469_231_731; + let y: i128 = 10i128.pow(27); + let denominator: i128 = 10i128.pow(18); + + let result = x.fixed_mul_ceil(&env, &y, &denominator); + + assert_eq!(result, 170_141_183_460_469_231_731 * 10i128.pow(9)); + } + + /********** fixed_div_floor **********/ + + #[test] + fn test_fixed_div_floor_rounds_down() { + let env = Env::default(); + let x: i128 = 314_1592653; + let y: i128 = 1_5391280; + let denominator: i128 = 1_0000000; + + let result = x.fixed_div_floor(&env, &y, &denominator); + + assert_eq!(result, 204_1150997) + } + + #[test] + fn test_fixed_div_floor_negative_rounds_down() { + let env = Env::default(); + let x: i128 = 314_1592653; + let y: i128 = -1_5391280; + let denominator: i128 = 1_0000000; + + let result = x.fixed_div_floor(&env, &y, &denominator); + + assert_eq!(result, -204_1150998) + } + + #[test] + fn test_fixed_div_floor_phantom_overflow_scales() { + let env = Env::default(); + let x: i128 = 170_141_183_460_469_231_731; + let y: i128 = 10i128.pow(18); + let denominator: i128 = 10i128.pow(27); + + let result = x.fixed_div_floor(&env, &y, &denominator); + + assert_eq!(result, 170_141_183_460_469_231_731 * 10i128.pow(9)); + } + + /********** fixed_div_ceil **********/ + + #[test] + fn test_fixed_div_ceil_rounds_down() { + let env = Env::default(); + let x: i128 = 314_1592653; + let y: i128 = 1_5391280; + let denominator: i128 = 1_0000000; + + let result = x.fixed_div_ceil(&env, &y, &denominator); + + assert_eq!(result, 204_1150998) + } + + #[test] + fn test_fixed_div_ceil_negative_rounds_down() { + let env = Env::default(); + let x: i128 = 314_1592653; + let y: i128 = -1_5391280; + let denominator: i128 = 1_0000000; + + let result = x.fixed_div_ceil(&env, &y, &denominator); + + assert_eq!(result, -204_1150997) + } + + #[test] + fn test_fixed_div_ceil_large_number() { + let env = Env::default(); + let x: i128 = 170_141_183_460_469_231_731; + let y: i128 = 1_000_000_000_000_000_000; + let denominator: i128 = 1_000_000_000_000_000_000; + + let result = x.fixed_div_ceil(&env, &y, &denominator); + + assert_eq!(result, 170_141_183_460_469_231_731) + } + + #[test] + fn test_fixed_div_ceil_phantom_overflow_scales() { + let env = Env::default(); + let x: i128 = 170_141_183_460_469_231_731; + let y: i128 = 10i128.pow(18); + let denominator: i128 = 10i128.pow(27); + + let result = x.fixed_div_floor(&env, &y, &denominator); + + assert_eq!(result, 170_141_183_460_469_231_731 * 10i128.pow(9)); + } +} diff --git a/contracts/common/src/fixed/i256.rs b/contracts/common/src/fixed/i256.rs new file mode 100644 index 00000000..c3b59a27 --- /dev/null +++ b/contracts/common/src/fixed/i256.rs @@ -0,0 +1,260 @@ +use soroban_sdk::{Env, I256}; + +use crate::fixed::soroban_fixed_point::SorobanFixedPoint; + +impl SorobanFixedPoint for I256 { + fn fixed_mul_floor(&self, env: &Env, y: &I256, denominator: &I256) -> I256 { + mul_div_floor(env, &self, y, denominator) + } + + fn fixed_mul_ceil(&self, env: &Env, y: &I256, denominator: &I256) -> I256 { + mul_div_ceil(env, &self, y, denominator) + } + + fn fixed_div_floor(&self, env: &Env, y: &I256, denominator: &I256) -> I256 { + mul_div_floor(env, &self, denominator, y) + } + + fn fixed_div_ceil(&self, env: &Env, y: &I256, denominator: &I256) -> I256 { + mul_div_ceil(env, &self, denominator, y) + } +} + +/// Performs floor(x * y / z) +pub(crate) fn mul_div_floor(env: &Env, x: &I256, y: &I256, z: &I256) -> I256 { + let zero = I256::from_i32(env, 0); + let r = x.mul(&y); + if r < zero || (r > zero && z.clone() < zero) { + // ceiling is taken by default for a negative result + let remainder = r.rem_euclid(&z); + let one = I256::from_i32(env, 1); + r.div(&z).sub(if remainder > zero { &one } else { &zero }) + } else { + // floor taken by default for a positive or zero result + r.div(&z) + } +} + +/// Performs ceil(x * y / z) +pub(crate) fn mul_div_ceil(env: &Env, x: &I256, y: &I256, z: &I256) -> I256 { + let zero = I256::from_i32(env, 0); + let r = x.mul(&y); + if r <= zero || (r > zero && z.clone() < zero) { + // ceiling is taken by default for a negative or zero result + r.div(&z) + } else { + // floor taken by default for a positive result + let remainder = r.rem_euclid(&z); + let one = I256::from_i32(env, 1); + r.div(&z).add(if remainder > zero { &one } else { &zero }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + /********** fixed_mul_floor **********/ + + #[test] + fn test_fixed_mul_floor_rounds_down() { + let env = Env::default(); + let x: I256 = I256::from_i128(&env, 1_5391283); + let y: I256 = I256::from_i128(&env, 314_1592653); + let denominator: I256 = I256::from_i128(&env, 1_0000001); + + let result = x.fixed_mul_floor(&env, &y, &denominator); + + assert_eq!(result, I256::from_i128(&env, 483_5313675)); + } + + #[test] + fn test_fixed_mul_floor_negative_rounds_down() { + let env = Env::default(); + let x: I256 = I256::from_i128(&env, -1_5391283); + let y: I256 = I256::from_i128(&env, 314_1592653); + let denominator: I256 = I256::from_i128(&env, 1_0000001); + + let result = x.fixed_mul_floor(&env, &y, &denominator); + + assert_eq!(result, I256::from_i128(&env, -483_5313676)); + } + + #[test] + fn test_fixed_mul_floor_large_number() { + let env = Env::default(); + let x: I256 = I256::from_i128(&env, i128::MAX); + let y: I256 = I256::from_i128(&env, 10i128.pow(38)); + let denominator: I256 = I256::from_i128(&env, 10i128.pow(18)); + + let result = x.clone().fixed_mul_floor(&env, &y, &denominator); + + let expected_result = x.mul(&I256::from_i128(&env, 10i128.pow(20))); + assert_eq!(result, expected_result); + } + + #[test] + #[should_panic(expected = "attempt to multiply with overflow")] + fn test_fixed_mul_floor_phantom_overflow() { + let env = Env::default(); + let x: I256 = I256::from_i128(&env, i128::MAX); + // 256 bit max ~= 5.8e76, 128 bit max ~= 1.7e38, need to multiply by at least 10^39 + let y: I256 = I256::from_i128(&env, 10i128.pow(39)); + let denominator: I256 = I256::from_i128(&env, 10i128.pow(18)); + + x.fixed_mul_floor(&env, &y, &denominator); + } + + /********** fixed_mul_ceil **********/ + + #[test] + fn test_fixed_mul_ceil_rounds_up() { + let env = Env::default(); + let x: I256 = I256::from_i128(&env, 1_5391283); + let y: I256 = I256::from_i128(&env, 314_1592653); + let denominator: I256 = I256::from_i128(&env, 1_0000001); + + let result = x.fixed_mul_ceil(&env, &y, &denominator); + + assert_eq!(result, I256::from_i128(&env, 483_5313676)); + } + + #[test] + fn test_fixed_mul_ceil_negative_rounds_up() { + let env = Env::default(); + let x: I256 = I256::from_i128(&env, -1_5391283); + let y: I256 = I256::from_i128(&env, 314_1592653); + let denominator: I256 = I256::from_i128(&env, 1_0000001); + + let result = x.fixed_mul_ceil(&env, &y, &denominator); + + assert_eq!(result, I256::from_i128(&env, -483_5313675)); + } + + #[test] + fn test_fixed_mul_ceil_large_number() { + let env = Env::default(); + let x: I256 = I256::from_i128(&env, i128::MAX); + let y: I256 = I256::from_i128(&env, 10i128.pow(38)); + let denominator: I256 = I256::from_i128(&env, 10i128.pow(18)); + + let result = x.clone().fixed_mul_ceil(&env, &y, &denominator); + + let expected_result = x.mul(&I256::from_i128(&env, 10i128.pow(20))); + assert_eq!(result, expected_result); + } + + #[test] + #[should_panic(expected = "attempt to multiply with overflow")] + fn test_fixed_mul_ceil_phantom_overflow() { + let env = Env::default(); + let x: I256 = I256::from_i128(&env, i128::MAX); + // 256 bit max ~= 5.8e76, 128 bit max ~= 1.7e38, need to multiply by at least 10^39 + let y: I256 = I256::from_i128(&env, 10i128.pow(39)); + let denominator: I256 = I256::from_i128(&env, 10i128.pow(18)); + + x.fixed_mul_ceil(&env, &y, &denominator); + } + + /********** fixed_div_floor **********/ + + #[test] + fn test_fixed_div_floor_rounds_down() { + let env = Env::default(); + let x: I256 = I256::from_i128(&env, 314_1592653); + let y: I256 = I256::from_i128(&env, 1_5391280); + let denominator: I256 = I256::from_i128(&env, 1_0000000); + + let result = x.fixed_div_floor(&env, &y, &denominator); + + assert_eq!(result, I256::from_i128(&env, 204_1150997)); + } + + #[test] + fn test_fixed_div_floor_negative_rounds_down() { + let env = Env::default(); + let x: I256 = I256::from_i128(&env, 314_1592653); + let y: I256 = I256::from_i128(&env, -1_5391280); + let denominator: I256 = I256::from_i128(&env, 1_0000000); + + let result = x.fixed_div_floor(&env, &y, &denominator); + + assert_eq!(result, I256::from_i128(&env, -204_1150998)); + } + + #[test] + fn test_fixed_div_floor_large_number() { + let env = Env::default(); + let x: I256 = I256::from_i128(&env, i128::MAX); + let y: I256 = I256::from_i128(&env, 10i128.pow(27)); + let denominator: I256 = I256::from_i128(&env, 10i128.pow(38)); + + let result = x.clone().fixed_div_floor(&env, &y, &denominator); + + let expected_result = x.mul(&I256::from_i128(&env, 10i128.pow(11))); + assert_eq!(result, expected_result); + } + + #[test] + #[should_panic(expected = "attempt to multiply with overflow")] + fn test_fixed_div_floor_phantom_overflow() { + let env = Env::default(); + let x: I256 = I256::from_i128(&env, i128::MAX); + let y: I256 = I256::from_i128(&env, 10i128.pow(27)); + // 256 bit max ~= 5.8e76, 128 bit max ~= 1.7e38, need to multiply by at least 10^39 + let denominator: I256 = I256::from_i128(&env, 10i128.pow(39)); + + x.fixed_div_floor(&env, &y, &denominator); + } + + /********** fixed_div_ceil **********/ + + #[test] + fn test_fixed_div_ceil_rounds_down() { + let env = Env::default(); + let x: I256 = I256::from_i128(&env, 314_1592653); + let y: I256 = I256::from_i128(&env, 1_5391280); + let denominator: I256 = I256::from_i128(&env, 1_0000000); + + let result = x.fixed_div_ceil(&env, &y, &denominator); + + assert_eq!(result, I256::from_i128(&env, 204_1150998)); + } + + #[test] + fn test_fixed_div_ceil_negative_rounds_down() { + let env = Env::default(); + let x: I256 = I256::from_i128(&env, 314_1592653); + let y: I256 = I256::from_i128(&env, -1_5391280); + let denominator: I256 = I256::from_i128(&env, 1_0000000); + + let result = x.fixed_div_ceil(&env, &y, &denominator); + + assert_eq!(result, I256::from_i128(&env, -204_1150997)); + } + + #[test] + fn test_fixed_div_ceil_large_number() { + let env = Env::default(); + let x: I256 = I256::from_i128(&env, i128::MAX); + let y: I256 = I256::from_i128(&env, 10i128.pow(27)); + let denominator: I256 = I256::from_i128(&env, 10i128.pow(38)); + + let result = x.clone().fixed_div_ceil(&env, &y, &denominator); + + let expected_result = x.mul(&I256::from_i128(&env, 10i128.pow(11))); + assert_eq!(result, expected_result); + } + + #[test] + #[should_panic(expected = "attempt to multiply with overflow")] + fn test_fixed_div_ceil_phantom_overflow() { + let env = Env::default(); + let x: I256 = I256::from_i128(&env, i128::MAX); + let y: I256 = I256::from_i128(&env, 10i128.pow(27)); + // 256 bit max ~= 5.8e76, 128 bit max ~= 1.7e38, need to multiply by at least 10^39 + let denominator: I256 = I256::from_i128(&env, 10i128.pow(39)); + + x.fixed_div_ceil(&env, &y, &denominator); + } +} diff --git a/contracts/common/src/fixed/mod.rs b/contracts/common/src/fixed/mod.rs new file mode 100644 index 00000000..b09c8329 --- /dev/null +++ b/contracts/common/src/fixed/mod.rs @@ -0,0 +1,4 @@ +pub mod fixed_point; +pub mod i128; +pub mod i256; +pub mod soroban_fixed_point; diff --git a/contracts/common/src/fixed/soroban_fixed_point.rs b/contracts/common/src/fixed/soroban_fixed_point.rs new file mode 100644 index 00000000..4df81b97 --- /dev/null +++ b/contracts/common/src/fixed/soroban_fixed_point.rs @@ -0,0 +1,37 @@ +use soroban_sdk::Env; + +// @dev - more detail about the forced panic can be found here: https://github.com/stellar/rs-soroban-env/pull/1091 +// +/// Soroban fixed point trait for computing fixed point calculations with Soroban host objects. +/// +/// Soroban host functions by default are non-recoverable. This means an arithmetic overflow or divide by zero will +/// result in a host panic instead of returning an error. For consistency, this trait will also panic in the same manner. +pub trait SorobanFixedPoint: Sized { + /// Safely calculates floor(x * y / denominator). + /// + /// ### Panics + /// This method will panic if the denominator is 0, a phantom overflow occurs, or + /// the result does not fit in Self. + fn fixed_mul_floor(&self, env: &Env, y: &Self, denominator: &Self) -> Self; + + /// Safely calculates ceil(x * y / denominator). + /// + /// ### Panics + /// This method will panic if the denominator is 0, a phantom overflow occurs, or + /// the result does not fit in Self. + fn fixed_mul_ceil(&self, env: &Env, y: &Self, denominator: &Self) -> Self; + + /// Safely calculates floor(x * denominator / y). + /// + /// ### Panics + /// This method will panic if the denominator is 0, a phantom overflow occurs, or + /// the result does not fit in Self. + fn fixed_div_floor(&self, env: &Env, y: &Self, denominator: &Self) -> Self; + + /// Safely calculates ceil(x * denominator / y). + /// + /// ### Panics + /// This method will panic if the denominator is 0, a phantom overflow occurs, or + /// the result does not fit in Self. + fn fixed_div_ceil(&self, env: &Env, y: &Self, denominator: &Self) -> Self; +} \ No newline at end of file diff --git a/contracts/debt-token/Cargo.toml b/contracts/debt-token/Cargo.toml index adbb0034..83ba10ef 100644 --- a/contracts/debt-token/Cargo.toml +++ b/contracts/debt-token/Cargo.toml @@ -3,6 +3,7 @@ name = "debt-token" version = "0.1.0" edition = "2021" authors = ["eq-lab"] +publish = false description = "Debt-token contract" [lib] diff --git a/contracts/debt-token/src/event.rs b/contracts/debt-token/src/event.rs index f4ad320e..c4f4f8ef 100644 --- a/contracts/debt-token/src/event.rs +++ b/contracts/debt-token/src/event.rs @@ -1,33 +1,42 @@ -use soroban_sdk::{symbol_short, Address, Env, String, Symbol}; +use soroban_sdk::{contractevent, Address, String}; -pub(crate) fn initialized( - e: &Env, - underlying_asset: Address, - pool: Address, - decimals: u32, - name: String, - symbol: String, -) { - let topics = (symbol_short!("init"), underlying_asset, pool); - e.events().publish(topics, (decimals, name, symbol)); +#[contractevent(topics=["init"], data_format = "map")] +pub(crate) struct InitializedEvent { + #[topic] + pub underlying_asset: Address, + #[topic] + pub pool: Address, + pub decimals: u32, + pub name: String, + pub symbol: String, } -pub(crate) fn set_authorized(e: &Env, id: Address, authorize: bool) { - let topics = (Symbol::new(e, "set_authorized"), id); - e.events().publish(topics, authorize); +#[contractevent(topics=["set_authorized"], data_format = "single-value")] +pub(crate) struct SetAuthorizedEvent { + #[topic] + pub id: Address, + pub authorize: bool, } -pub(crate) fn mint(e: &Env, admin: Address, to: Address, amount: i128) { - let topics = (symbol_short!("mint"), admin, to); - e.events().publish(topics, amount); +#[contractevent(topics=["mint"], data_format = "single-value")] +pub(crate) struct MintEvent { + #[topic] + pub admin: Address, + #[topic] + pub to: Address, + pub amount: i128, } -pub(crate) fn burn(e: &Env, from: Address, amount: i128) { - let topics = (symbol_short!("burn"), from); - e.events().publish(topics, amount); +#[contractevent(topics=["burn"], data_format = "single-value")] +pub(crate) struct BurnEvent { + #[topic] + pub from: Address, + pub amount: i128, } -pub(crate) fn clawback(e: &Env, from: Address, amount: i128) { - let topics = (symbol_short!("clawback"), from); - e.events().publish(topics, amount); +#[contractevent(topics=["clawback"], data_format = "single-value")] +pub(crate) struct ClawbackEvent { + #[topic] + pub from: Address, + pub amount: i128, } diff --git a/contracts/debt-token/src/lib.rs b/contracts/debt-token/src/lib.rs index 12898f48..f01a8413 100644 --- a/contracts/debt-token/src/lib.rs +++ b/contracts/debt-token/src/lib.rs @@ -8,6 +8,8 @@ use debt_token_interface::DebtTokenTrait; use soroban_sdk::{contract, contractimpl, token, Address, BytesN, Env, String}; use soroban_token_sdk::metadata::TokenMetadata; +use crate::event::{BurnEvent, ClawbackEvent, InitializedEvent, MintEvent, SetAuthorizedEvent}; + mod event; mod test; @@ -48,18 +50,25 @@ impl DebtTokenTrait for DebtToken { // it can be optimized by passing decimals as argument let token = token::Client::new(&e, &underlying_asset); - let decimal = token.decimals(); + let decimals = token.decimals(); write_metadata( &e, TokenMetadata { - decimal, + decimal: decimals, name: name.clone(), symbol: symbol.clone(), }, ); - event::initialized(&e, underlying_asset, pool, decimal, name, symbol); + InitializedEvent { + underlying_asset, + pool, + decimals, + name, + symbol, + } + .publish(&e); } /// Upgrades the deployed contract wasm preserving the contract id. @@ -143,7 +152,7 @@ impl DebtTokenTrait for DebtToken { spend_balance(&env, from.clone(), amount); add_total_supply(&env, amount.checked_neg().expect("debt-token: no overflow")); - event::burn(&env, from, amount); + BurnEvent { from, amount }.publish(&env); } fn burn_from(_env: Env, _spender: Address, _from: Address, _amount: i128) { @@ -165,7 +174,8 @@ impl DebtTokenTrait for DebtToken { verify_caller_is_pool(&e); write_authorization(&e, id.clone(), authorize); - event::set_authorized(&e, id, authorize); + + SetAuthorizedEvent { id, authorize }.publish(&e); } /// Mints a specified amount of tokens for a given `id`. @@ -185,7 +195,13 @@ impl DebtTokenTrait for DebtToken { receive_balance(&env, to.clone(), amount); add_total_supply(&env, amount); - event::mint(&env, pool, to, amount); + + MintEvent { + admin: pool, + to, + amount, + } + .publish(&env); } /// Clawbacks a specified amount of tokens from the from account. @@ -206,7 +222,8 @@ impl DebtTokenTrait for DebtToken { spend_balance(&env, from.clone(), amount); add_total_supply(&env, amount.checked_neg().expect("debt-token: no overflow")); - event::clawback(&env, from, amount); + + ClawbackEvent { from, amount }.publish(&env); } /// Returns the number of decimal places used by the token. diff --git a/contracts/debt-token/src/test.rs b/contracts/debt-token/src/test.rs index f22c3bda..8ca25ffb 100644 --- a/contracts/debt-token/src/test.rs +++ b/contracts/debt-token/src/test.rs @@ -11,11 +11,12 @@ use crate::DebtToken; fn create_token<'a>(e: &Env) -> (DebtTokenClient<'a>, Address) { let pool = Address::generate(e); - let token = DebtTokenClient::new(e, &e.register_contract(None, DebtToken {})); + let token = DebtTokenClient::new(e, &e.register(DebtToken {}, ())); let underlying_asset = TokenClient::new( &e, - &e.register_stellar_asset_contract(Address::generate(&e)), + &e.register_stellar_asset_contract_v2(Address::generate(&e)) + .address(), ); token.initialize( @@ -34,11 +35,12 @@ fn initialize() { e.mock_all_auths(); let pool = Address::generate(&e); - let token = DebtTokenClient::new(&e, &e.register_contract(None, DebtToken {})); + let token = DebtTokenClient::new(&e, &e.register(DebtToken {}, ())); let underlying_asset = TokenClient::new( &e, - &e.register_stellar_asset_contract(Address::generate(&e)), + &e.register_stellar_asset_contract_v2(Address::generate(&e)) + .address(), ); token.initialize( diff --git a/contracts/deployer/src/lib.rs b/contracts/deployer/src/lib.rs index b69b484c..5c3af44d 100644 --- a/contracts/deployer/src/lib.rs +++ b/contracts/deployer/src/lib.rs @@ -22,7 +22,10 @@ impl Deployer { admin: Address, pool_config: PoolConfig, ) -> (Address, Val) { - let id = env.deployer().with_current_contract(salt).deploy(wasm_hash); + let id = env + .deployer() + .with_current_contract(salt) + .deploy_v2(wasm_hash, ()); let init_fn = Symbol::new(&env, "initialize"); let init_args = vec![&env, admin.into_val(&env), pool_config.into_val(&env)]; let res: Val = env.invoke_contract(&id, &init_fn, init_args); @@ -42,7 +45,10 @@ impl Deployer { pool: Address, underlying_asset: Address, ) -> (Address, Val) { - let id = env.deployer().with_current_contract(salt).deploy(wasm_hash); + let id = env + .deployer() + .with_current_contract(salt) + .deploy_v2(wasm_hash, ()); let init_fn = Symbol::new(&env, "initialize"); let init_args = vec![ &env, @@ -68,7 +74,10 @@ impl Deployer { pool: Address, underlying_asset: Address, ) -> (Address, Val) { - let id = env.deployer().with_current_contract(salt).deploy(wasm_hash); + let id = env + .deployer() + .with_current_contract(salt) + .deploy_v2(wasm_hash, ()); let init_fn = Symbol::new(&env, "initialize"); let init_args = vec![ &env, diff --git a/contracts/deployer/src/test.rs b/contracts/deployer/src/test.rs index 8b4cb2d6..d794ca26 100644 --- a/contracts/deployer/src/test.rs +++ b/contracts/deployer/src/test.rs @@ -8,23 +8,21 @@ use soroban_sdk::{ }; mod pool { - soroban_sdk::contractimport!(file = "../../target/wasm32-unknown-unknown/release/pool.wasm"); + soroban_sdk::contractimport!(file = "../../target/wasm32v1-none/release/pool.wasm"); } mod s_token { - soroban_sdk::contractimport!(file = "../../target/wasm32-unknown-unknown/release/s_token.wasm"); + soroban_sdk::contractimport!(file = "../../target/wasm32v1-none/release/s_token.wasm"); } mod debt_token { - soroban_sdk::contractimport!( - file = "../../target/wasm32-unknown-unknown/release/debt_token.wasm" - ); + soroban_sdk::contractimport!(file = "../../target/wasm32v1-none/release/debt_token.wasm"); } #[test] fn deploy_pool_and_s_token() { let env = Env::default(); - let client = DeployerClient::new(&env, &env.register_contract(None, Deployer)); + let client = DeployerClient::new(&env, &env.register(Deployer, ())); let flash_loan_fee = 5; let initial_health = 2_500; @@ -63,13 +61,14 @@ fn deploy_pool_and_s_token() { contract_id }; - env.budget().reset_default(); + env.cost_estimate().budget().reset_default(); // Invoke contract to check that it is initialized. let pool_client = pool::Client::new(&env, &pool_contract_id); let underlying_asset = TokenClient::new( &env, - &env.register_stellar_asset_contract(Address::generate(&env)), + &env.register_stellar_asset_contract_v2(Address::generate(&env)) + .address(), ); // Deploy s-token let s_token_contract_id = { @@ -93,7 +92,7 @@ fn deploy_pool_and_s_token() { let _s_token_client = s_token::Client::new(&env, &s_token_contract_id); - env.budget().reset_default(); + env.cost_estimate().budget().reset_default(); // Deploy debt token let debt_token_contract_id = { diff --git a/contracts/pool/Cargo.toml b/contracts/pool/Cargo.toml index d1b52a78..aefc8649 100644 --- a/contracts/pool/Cargo.toml +++ b/contracts/pool/Cargo.toml @@ -3,6 +3,7 @@ name = "pool" authors = ["eq-lab"] version = "0.1.0" edition = "2021" +publish = false description = "Liquidity pool contract" [lib] diff --git a/contracts/pool/src/event.rs b/contracts/pool/src/event.rs index 5ea79700..679c4f56 100644 --- a/contracts/pool/src/event.rs +++ b/contracts/pool/src/event.rs @@ -1,107 +1,119 @@ -use pool_interface::types::{ - collateral_params_input::CollateralParamsInput, pool_config::PoolConfig, -}; -use soroban_sdk::{symbol_short, Address, Env, Symbol}; +use soroban_sdk::{contractevent, Address}; -pub(crate) fn initialized(e: &Env, admin: &Address, pool_config: &PoolConfig) { - let topics = ( - Symbol::new(e, "initialize"), - admin, - pool_config.base_asset_address.clone(), - ); - e.events().publish( - topics, - ( - pool_config.ir_alpha, - pool_config.ir_initial_rate, - pool_config.ir_max_rate, - pool_config.ir_scaling_coeff, - pool_config.base_asset_decimals, - pool_config.initial_health, - pool_config.grace_period, - pool_config.timestamp_window, - pool_config.flash_loan_fee, - pool_config.user_assets_limit, - pool_config.min_collat_amount, - pool_config.min_debt_amount, - pool_config.liquidation_protocol_fee, - ), - ); +#[contractevent(topics=["initialize"], data_format = "map")] +pub(crate) struct InitializedEvent { + #[topic] + pub admin: Address, + #[topic] + pub base_asset_address: Address, + pub ir_alpha: u32, + pub ir_initial_rate: u32, + pub ir_max_rate: u32, + pub ir_scaling_coeff: u32, + pub base_asset_decimals: u32, + pub initial_health: u32, + pub grace_period: u64, + pub timestamp_window: u64, + pub flash_loan_fee: u32, + pub user_assets_limit: u32, + pub min_collat_amount: i128, + pub min_debt_amount: i128, + pub liquidation_protocol_fee: u32, } -pub(crate) fn reserve_used_as_collateral_enabled(e: &Env, who: &Address, asset: &Address) { - let topics = (Symbol::new(e, "reserve_used_as_coll_enabled"), who.clone()); - e.events().publish(topics, asset.clone()); +#[contractevent(topics=["reserve_used_as_coll_enabled"], data_format = "single-value")] +pub(crate) struct ReserveUsedAsCollEnabledEvent { + #[topic] + pub who: Address, + pub asset: Address, } -pub(crate) fn reserve_used_as_collateral_disabled(e: &Env, who: &Address, asset: &Address) { - let topics = (Symbol::new(e, "reserve_used_as_coll_disabled"), who.clone()); - e.events().publish(topics, asset.clone()); +#[contractevent(topics=["reserve_used_as_coll_disabled"], data_format = "single-value")] +pub(crate) struct ReserveUsedAsCollDisabledEvent { + #[topic] + pub who: Address, + pub asset: Address, } -pub(crate) fn deposit(e: &Env, who: &Address, asset: &Address, amount: i128) { - let topics = (symbol_short!("deposit"), who.clone()); - e.events().publish(topics, (asset.clone(), amount)); +#[contractevent(topics=["deposit"], data_format = "map")] +pub(crate) struct DepositEvent { + #[topic] + pub who: Address, + pub asset: Address, + pub amount: i128, } -pub(crate) fn withdraw(e: &Env, who: &Address, asset: &Address, to: &Address, amount: i128) { - let topics = (symbol_short!("withdraw"), who.clone()); - e.events().publish(topics, (to, asset.clone(), amount)); +#[contractevent(topics=["withdraw"], data_format = "map")] +pub(crate) struct WithdrawEvent { + #[topic] + pub who: Address, + pub to: Address, + pub asset: Address, + pub amount: i128, } -pub(crate) fn borrow(e: &Env, who: &Address, asset: &Address, amount: i128) { - let topics = (symbol_short!("borrow"), who.clone()); - e.events().publish(topics, (asset.clone(), amount)); +#[contractevent(topics=["borrow"], data_format = "map")] +pub(crate) struct BorrowEvent { + #[topic] + pub who: Address, + pub asset: Address, + pub amount: i128, } -pub(crate) fn repay(e: &Env, who: &Address, asset: &Address, amount: i128) { - let topics = (symbol_short!("repay"), who.clone()); - e.events().publish(topics, (asset.clone(), amount)); +#[contractevent(topics=["repay"], data_format = "map")] +pub(crate) struct RepayEvent { + #[topic] + pub who: Address, + pub asset: Address, + pub amount: i128, } -pub(crate) fn collat_config_change(e: &Env, asset: &Address, params: &CollateralParamsInput) { - let topics = (Symbol::new(e, "collat_config_change"), asset.clone()); - e.events().publish( - topics, - ( - params.liq_cap, - params.pen_order, - params.util_cap, - params.discount, - ), - ); +#[contractevent(topics=["collat_config_change"], data_format = "map")] +pub(crate) struct CollatConfigChangeEvent { + #[topic] + pub asset: Address, + pub liq_cap: i128, + pub pen_order: u32, + pub util_cap: u32, + pub discount: u32, } -pub(crate) fn borrowing_enabled(e: &Env, asset: &Address) { - let topics = (Symbol::new(e, "borrowing_enabled"), asset.clone()); - e.events().publish(topics, ()); +#[contractevent(topics=["borrowing_enabled"], data_format = "single-value")] +pub(crate) struct BorrowingEnabledEvent { + #[topic] + pub asset: Address, } -pub(crate) fn borrowing_disabled(e: &Env, asset: &Address) { - let topics = (Symbol::new(e, "borrowing_disabled"), asset.clone()); - e.events().publish(topics, ()); +#[contractevent(topics=["borrowing_disabled"], data_format = "single-value")] +pub(crate) struct BorrowingDisabledEvent { + #[topic] + pub asset: Address, } -pub(crate) fn reserve_status_changed(e: &Env, asset: &Address, activated: bool) { - let topics = (asset.clone(),); - e.events().publish(topics, activated); +#[contractevent(topics=["reserve_status_changed"], data_format = "single-value")] +pub(crate) struct ReserveStatusChangedEvent { + #[topic] + pub asset: Address, + pub activated: bool, } -pub(crate) fn liquidation(e: &Env, who: &Address, covered_debt: i128, liquidated_collateral: i128) { - let topics = (Symbol::new(e, "liquidation"), who.clone()); - e.events() - .publish(topics, (covered_debt, liquidated_collateral)); +#[contractevent(topics=["liquidation"], data_format = "map")] +pub(crate) struct LiquidationEvent { + #[topic] + pub who: Address, + pub covered_debt: i128, + pub liquidated_collateral: i128, } -pub(crate) fn flash_loan( - e: &Env, - who: &Address, - receiver: &Address, - asset: &Address, - amount: i128, - premium: i128, - borrow: bool, -) { - let topics = (Symbol::new(e, "flash_loan"), who, receiver, asset); - e.events().publish(topics, (amount, premium, borrow)); +#[contractevent(topics=["flash_loan"], data_format = "map")] +pub(crate) struct FlashLoanEvent { + #[topic] + pub who: Address, + #[topic] + pub receiver: Address, + #[topic] + pub asset: Address, + pub amount: i128, + pub premium: i128, + pub borrow: bool, } diff --git a/contracts/pool/src/methods/borrow.rs b/contracts/pool/src/methods/borrow.rs index 4b20c700..fd45a8df 100644 --- a/contracts/pool/src/methods/borrow.rs +++ b/contracts/pool/src/methods/borrow.rs @@ -7,7 +7,7 @@ use s_token_interface::STokenClient; use soroban_sdk::{Address, Env}; use crate::add_token_balance; -use crate::event; +use crate::event::BorrowEvent; use crate::read_pause_info; use crate::read_pool_config; use crate::storage::{ @@ -159,7 +159,12 @@ pub fn do_borrow( user_configurator.write(); - event::borrow(env, who, asset, amount); + BorrowEvent { + who: who.clone(), + asset: asset.clone(), + amount, + } + .publish(env); Ok(debt_token_supply_after) } diff --git a/contracts/pool/src/methods/configure_as_collateral.rs b/contracts/pool/src/methods/configure_as_collateral.rs index b799a07e..40339f2e 100644 --- a/contracts/pool/src/methods/configure_as_collateral.rs +++ b/contracts/pool/src/methods/configure_as_collateral.rs @@ -2,7 +2,7 @@ use pool_interface::types::collateral_params_input::CollateralParamsInput; use pool_interface::types::error::Error; use soroban_sdk::{Address, Env}; -use crate::event; +use crate::event::CollatConfigChangeEvent; use crate::storage::{read_reserve, write_reserve}; use super::utils::validation::{ @@ -22,7 +22,15 @@ pub fn configure_as_collateral( reserve.update_collateral_config(params); write_reserve(env, asset, &reserve); - event::collat_config_change(env, asset, params); + + CollatConfigChangeEvent { + asset: asset.clone(), + liq_cap: params.liq_cap, + pen_order: params.pen_order, + util_cap: params.util_cap, + discount: params.discount, + } + .publish(env); Ok(()) } diff --git a/contracts/pool/src/methods/deposit.rs b/contracts/pool/src/methods/deposit.rs index 3c9127d3..a0cd59c5 100644 --- a/contracts/pool/src/methods/deposit.rs +++ b/contracts/pool/src/methods/deposit.rs @@ -6,7 +6,7 @@ use s_token_interface::STokenClient; use soroban_sdk::{token, Address, Env}; use crate::add_token_balance; -use crate::event; +use crate::event::DepositEvent; use crate::read_pause_info; use crate::read_pool_config; use crate::storage::{ @@ -70,7 +70,12 @@ pub fn deposit(env: &Env, who: &Address, asset: &Address, amount: i128) -> Resul do_deposit_rwa(env, who, asset, amount)? }; - event::deposit(env, who, asset, amount); + DepositEvent { + who: who.clone(), + asset: asset.clone(), + amount, + } + .publish(env); user_configurator .deposit(reserve.get_id(), asset, is_first_deposit)? diff --git a/contracts/pool/src/methods/enable_borrowing_on_reserve.rs b/contracts/pool/src/methods/enable_borrowing_on_reserve.rs index f55c3d40..5f947d24 100644 --- a/contracts/pool/src/methods/enable_borrowing_on_reserve.rs +++ b/contracts/pool/src/methods/enable_borrowing_on_reserve.rs @@ -1,7 +1,7 @@ use pool_interface::types::error::Error; use soroban_sdk::{Address, Env}; -use crate::event; +use crate::event::{BorrowingDisabledEvent, BorrowingEnabledEvent}; use crate::storage::{read_reserve, write_reserve}; use super::utils::validation::{require_admin, require_fungible_reserve}; @@ -19,9 +19,15 @@ pub fn enable_borrowing_on_reserve(env: &Env, asset: &Address, enabled: bool) -> write_reserve(env, asset, &reserve); if enabled { - event::borrowing_enabled(env, asset); + BorrowingEnabledEvent { + asset: asset.clone(), + } + .publish(env); } else { - event::borrowing_disabled(env, asset); + BorrowingDisabledEvent { + asset: asset.clone(), + } + .publish(env); } Ok(()) diff --git a/contracts/pool/src/methods/flash_loan.rs b/contracts/pool/src/methods/flash_loan.rs index f6f585cf..565994ff 100644 --- a/contracts/pool/src/methods/flash_loan.rs +++ b/contracts/pool/src/methods/flash_loan.rs @@ -5,9 +5,10 @@ use pool_interface::types::flash_loan_asset::FlashLoanAsset; use s_token_interface::STokenClient; use soroban_sdk::{assert_with_error, token, vec, Address, Bytes, Env, Vec}; +use crate::event::FlashLoanEvent; use crate::methods::utils::validation::require_not_in_grace_period; use crate::storage::{read_reserve, read_token_balance, read_token_total_supply}; -use crate::{add_protocol_fee_vault, event, read_pause_info, read_pool_config}; +use crate::{add_protocol_fee_vault, read_pause_info, read_pool_config}; use super::borrow::do_borrow; use super::utils::recalculate_reserve_data::recalculate_reserve_data; @@ -119,15 +120,15 @@ pub fn flash_loan( received_asset.premium }; - event::flash_loan( - env, - who, - receiver, - &received_asset.asset, - received_asset.amount, + FlashLoanEvent { + who: who.clone(), + receiver: receiver.clone(), + asset: received_asset.asset.clone(), + amount: received_asset.amount, premium, - loan_asset.borrow, - ); + borrow: loan_asset.borrow, + } + .publish(env); } Ok(()) diff --git a/contracts/pool/src/methods/initialize.rs b/contracts/pool/src/methods/initialize.rs index 66e63478..82837e5b 100644 --- a/contracts/pool/src/methods/initialize.rs +++ b/contracts/pool/src/methods/initialize.rs @@ -2,7 +2,7 @@ use pool_interface::types::error::Error; use pool_interface::types::pool_config::PoolConfig; use soroban_sdk::{Address, Env}; -use crate::event; +use crate::event::InitializedEvent; use crate::storage::write_admin; use super::set_pool_configuration::set_pool_configuration; @@ -15,7 +15,24 @@ pub fn initialize(env: &Env, admin: &Address, pool_config: &PoolConfig) -> Resul set_pool_configuration(env, pool_config, false)?; - event::initialized(env, admin, pool_config); + InitializedEvent { + admin: admin.clone(), + base_asset_address: pool_config.base_asset_address.clone(), + ir_alpha: pool_config.ir_alpha, + ir_initial_rate: pool_config.ir_initial_rate, + ir_max_rate: pool_config.ir_max_rate, + ir_scaling_coeff: pool_config.ir_scaling_coeff, + base_asset_decimals: pool_config.base_asset_decimals, + initial_health: pool_config.initial_health, + grace_period: pool_config.grace_period, + timestamp_window: pool_config.timestamp_window, + flash_loan_fee: pool_config.flash_loan_fee, + user_assets_limit: pool_config.user_assets_limit, + min_collat_amount: pool_config.min_collat_amount, + min_debt_amount: pool_config.min_debt_amount, + liquidation_protocol_fee: pool_config.liquidation_protocol_fee, + } + .publish(env); Ok(()) } diff --git a/contracts/pool/src/methods/liquidate.rs b/contracts/pool/src/methods/liquidate.rs index 87589728..c6121270 100644 --- a/contracts/pool/src/methods/liquidate.rs +++ b/contracts/pool/src/methods/liquidate.rs @@ -6,6 +6,7 @@ use pool_interface::types::reserve_type::ReserveType; use s_token_interface::STokenClient; use soroban_sdk::{assert_with_error, token, Address, Env}; +use crate::event::LiquidationEvent; use crate::methods::utils::recalculate_reserve_data::recalculate_reserve_data; use crate::methods::utils::validation::require_not_in_grace_period; use crate::types::account_data::AccountData; @@ -14,7 +15,7 @@ use crate::types::liquidation_asset::LiquidationAsset; use crate::types::price_provider::PriceProvider; use crate::types::user_configurator::UserConfigurator; use crate::{ - add_protocol_fee_vault, add_token_balance, event, read_pause_info, read_pool_config, + add_protocol_fee_vault, add_token_balance, read_pause_info, read_pool_config, read_token_balance, read_token_total_supply, write_token_balance, write_token_total_supply, }; @@ -56,7 +57,12 @@ pub fn liquidate(env: &Env, liquidator: &Address, who: &Address) -> Result<(), E &mut price_provider, )?; - event::liquidation(env, who, debt_covered_in_base, total_liq_in_base); + LiquidationEvent { + who: who.clone(), + covered_debt: debt_covered_in_base, + liquidated_collateral: total_liq_in_base, + } + .publish(env); Ok(()) } diff --git a/contracts/pool/src/methods/repay.rs b/contracts/pool/src/methods/repay.rs index 0851be6f..2510ef7b 100644 --- a/contracts/pool/src/methods/repay.rs +++ b/contracts/pool/src/methods/repay.rs @@ -5,6 +5,7 @@ use pool_interface::types::pool_config::PoolConfig; use pool_interface::types::reserve_data::ReserveData; use soroban_sdk::{token, Address, Env}; +use crate::event::RepayEvent; use crate::storage::{ read_reserve, read_token_balance, read_token_total_supply, write_token_balance, write_token_total_supply, @@ -12,7 +13,7 @@ use crate::storage::{ use crate::types::calc_account_data_cache::CalcAccountDataCache; use crate::types::price_provider::PriceProvider; use crate::types::user_configurator::UserConfigurator; -use crate::{add_protocol_fee_vault, add_token_balance, event, read_pause_info, read_pool_config}; +use crate::{add_protocol_fee_vault, add_token_balance, read_pause_info, read_pool_config}; use super::account_position::calc_account_data; use super::utils::get_collat_coeff::get_collat_coeff; @@ -168,7 +169,12 @@ pub fn do_repay( write_token_total_supply(env, debt_token_address, debt_token_supply_after)?; write_token_balance(env, debt_token_address, who, who_debt_after)?; - event::repay(env, who, asset, borrower_payback_amount); + RepayEvent { + who: who.clone(), + asset: asset.clone(), + amount: borrower_payback_amount, + } + .publish(env); user_configurator.write(); diff --git a/contracts/pool/src/methods/set_reserve_status.rs b/contracts/pool/src/methods/set_reserve_status.rs index 14d1065c..ab0adf78 100644 --- a/contracts/pool/src/methods/set_reserve_status.rs +++ b/contracts/pool/src/methods/set_reserve_status.rs @@ -1,8 +1,10 @@ use pool_interface::types::error::Error; use soroban_sdk::{Address, Env}; -use crate::event; -use crate::storage::{read_reserve, write_reserve}; +use crate::{ + event::ReserveStatusChangedEvent, + storage::{read_reserve, write_reserve}, +}; use super::utils::validation::require_admin; @@ -14,7 +16,11 @@ pub fn set_reserve_status(env: &Env, asset: &Address, is_active: bool) -> Result reserve.configuration.is_active = is_active; write_reserve(env, asset, &reserve); - event::reserve_status_changed(env, asset, is_active); + ReserveStatusChangedEvent { + asset: asset.clone(), + activated: is_active, + } + .publish(env); Ok(()) } diff --git a/contracts/pool/src/methods/withdraw.rs b/contracts/pool/src/methods/withdraw.rs index ae1e7257..87144bac 100644 --- a/contracts/pool/src/methods/withdraw.rs +++ b/contracts/pool/src/methods/withdraw.rs @@ -1,7 +1,9 @@ use crate::add_token_balance; +use crate::event::WithdrawEvent; use crate::methods::utils::get_collat_coeff::get_compounded_amount; use crate::methods::utils::get_collat_coeff::get_lp_amount; use crate::methods::utils::validation::require_gte_initial_health; +use crate::read_pause_info; use crate::read_pool_config; use crate::storage::{ read_reserve, read_token_balance, read_token_total_supply, write_token_balance, @@ -10,7 +12,6 @@ use crate::storage::{ use crate::types::calc_account_data_cache::CalcAccountDataCache; use crate::types::price_provider::PriceProvider; use crate::types::user_configurator::UserConfigurator; -use crate::{event, read_pause_info}; use pool_interface::types::asset_balance::AssetBalance; use pool_interface::types::error::Error; use pool_interface::types::reserve_type::ReserveType; @@ -201,7 +202,13 @@ pub fn withdraw( user_configurator.write(); - event::withdraw(env, who, asset, to, withdraw_amount); + WithdrawEvent { + who: who.clone(), + asset: asset.clone(), + to: to.clone(), + amount: withdraw_amount, + } + .publish(env); Ok(()) } diff --git a/contracts/pool/src/tests/borrow.rs b/contracts/pool/src/tests/borrow.rs index 530a8cca..5ca7ac88 100644 --- a/contracts/pool/src/tests/borrow.rs +++ b/contracts/pool/src/tests/borrow.rs @@ -2,7 +2,7 @@ use super::sut::DAY; use crate::tests::sut::{fill_pool, init_pool, set_time}; use pool_interface::types::pool_config::PoolConfig; use soroban_sdk::testutils::{Address as _, AuthorizedFunction, Events}; -use soroban_sdk::{symbol_short, vec, Address, Env, IntoVal, Symbol}; +use soroban_sdk::{symbol_short, vec, Address, Env, IntoVal, Map, Symbol, Val}; #[test] fn should_require_authorized_caller() { @@ -369,7 +369,14 @@ fn should_emit_events() { ( sut.pool.address.clone(), (Symbol::new(&env, "borrow"), borrower.clone()).into_val(&env), - (token_address.clone(), 20_000_000i128).into_val(&env) + Map::::from_array( + &env, + [ + (Symbol::new(&env, "asset"), token_address.into_val(&env)), + (Symbol::new(&env, "amount"), 20_000_000i128.into_val(&env),), + ], + ) + .into_val(&env) ), ] ); diff --git a/contracts/pool/src/tests/budget.rs b/contracts/pool/src/tests/budget.rs index e3c9ab68..0476fef0 100644 --- a/contracts/pool/src/tests/budget.rs +++ b/contracts/pool/src/tests/budget.rs @@ -702,16 +702,12 @@ fn s_token_transfer() { } fn measure_budget(env: &Env, function: &str, callback: impl FnOnce()) { - let cpu_before = env.budget().cpu_instruction_cost(); - let memory_before = env.budget().memory_bytes_cost(); + env.cost_estimate().budget().reset_unlimited(); callback(); - let cpu_after = env.budget().cpu_instruction_cost(); - let memory_after = env.budget().memory_bytes_cost(); - - let cpu = cpu_after - cpu_before; - let memory = memory_after - memory_before; + let cpu = env.cost_estimate().budget().cpu_instruction_cost(); + let memory = env.cost_estimate().budget().memory_bytes_cost(); let budget = &[ std::format!("['{}'] = {{\n", function), diff --git a/contracts/pool/src/tests/configure_as_collateral.rs b/contracts/pool/src/tests/configure_as_collateral.rs index ca597371..1c950444 100644 --- a/contracts/pool/src/tests/configure_as_collateral.rs +++ b/contracts/pool/src/tests/configure_as_collateral.rs @@ -4,7 +4,7 @@ extern crate std; use crate::{tests::sut::init_pool, *}; use soroban_sdk::{ testutils::{AuthorizedFunction, AuthorizedInvocation, Events}, - vec, IntoVal, Symbol, + vec, IntoVal, Map, Symbol, Val, }; #[test] @@ -156,14 +156,30 @@ fn should_emit_events() { &env, ( sut.pool.address.clone(), - (Symbol::new(&env, "collat_config_change"), &asset_address).into_val(&env), ( - params.liq_cap, - params.pen_order, - params.util_cap, - params.discount + Symbol::new(&env, "collat_config_change"), + asset_address.clone() ) - .into_val(&env) + .into_val(&env), + Map::::from_array( + &env, + [ + (Symbol::new(&env, "liq_cap"), params.liq_cap.into_val(&env),), + ( + Symbol::new(&env, "pen_order"), + params.pen_order.into_val(&env), + ), + ( + Symbol::new(&env, "util_cap"), + params.util_cap.into_val(&env), + ), + ( + Symbol::new(&env, "discount"), + params.discount.into_val(&env), + ), + ], + ) + .into_val(&env) ), ] ); diff --git a/contracts/pool/src/tests/deposit.rs b/contracts/pool/src/tests/deposit.rs index 15db3f4a..c8ac6dcb 100644 --- a/contracts/pool/src/tests/deposit.rs +++ b/contracts/pool/src/tests/deposit.rs @@ -1,7 +1,7 @@ use crate::tests::sut::{fill_pool, init_pool, DAY}; use crate::*; use soroban_sdk::testutils::{Address as _, AuthorizedFunction, Events}; -use soroban_sdk::{symbol_short, vec, IntoVal, Symbol}; +use soroban_sdk::{symbol_short, vec, IntoVal, Map, Symbol, Val}; use tests::sut::set_time; #[test] @@ -237,7 +237,17 @@ fn should_emit_events() { ( sut.pool.address.clone(), (Symbol::new(&env, "deposit"), user.clone()).into_val(&env), - (token_address, 5_000_000_000i128).into_val(&env) + Map::::from_array( + &env, + [ + (Symbol::new(&env, "asset"), token_address.into_val(&env),), + ( + Symbol::new(&env, "amount"), + 5_000_000_000i128.into_val(&env), + ), + ], + ) + .into_val(&env) ), ] ); diff --git a/contracts/pool/src/tests/flash_loan.rs b/contracts/pool/src/tests/flash_loan.rs index aadb2104..a706bf6c 100644 --- a/contracts/pool/src/tests/flash_loan.rs +++ b/contracts/pool/src/tests/flash_loan.rs @@ -2,7 +2,7 @@ use crate::tests::sut::{fill_pool, init_pool}; use pool_interface::types::flash_loan_asset::FlashLoanAsset; use pool_interface::types::pool_config::PoolConfig; use soroban_sdk::testutils::Events; -use soroban_sdk::{vec, Bytes, Env, IntoVal, Symbol, Val, Vec}; +use soroban_sdk::{vec, Bytes, Env, IntoVal, Map, Symbol, Val, Vec}; #[test] #[should_panic(expected = "HostError: Error(Contract, #307)")] @@ -216,7 +216,15 @@ fn should_emit_events() { &sut.reserves[0].token.address ) .into_val(&env), - (1000000i128, 500i128, false).into_val(&env) + Map::::from_array( + &env, + [ + (Symbol::new(&env, "amount"), 1000000i128.into_val(&env)), + (Symbol::new(&env, "premium"), 500i128.into_val(&env),), + (Symbol::new(&env, "borrow"), false.into_val(&env),), + ], + ) + .into_val(&env) ), ] ); diff --git a/contracts/pool/src/tests/init_reserve.rs b/contracts/pool/src/tests/init_reserve.rs index 5f62ee75..d61e9678 100644 --- a/contracts/pool/src/tests/init_reserve.rs +++ b/contracts/pool/src/tests/init_reserve.rs @@ -83,7 +83,7 @@ fn should_fail_when_pool_not_initialized() { let (debt_token, _) = create_token_contract(&env, &token_admin); let pool: LendingPoolClient<'_> = - LendingPoolClient::new(&env, &env.register_contract(None, LendingPool)); + LendingPoolClient::new(&env, &env.register(LendingPool {}, ())); let s_token = create_s_token_contract(&env, &pool.address, &underlying_token.address); assert!(pool.get_reserve(&underlying_token.address).is_none()); diff --git a/contracts/pool/src/tests/liquidate.rs b/contracts/pool/src/tests/liquidate.rs index f2482e20..73d6d038 100644 --- a/contracts/pool/src/tests/liquidate.rs +++ b/contracts/pool/src/tests/liquidate.rs @@ -4,7 +4,7 @@ use common::FixedI128; use price_feed_interface::types::asset::Asset; use price_feed_interface::types::price_data::PriceData; use soroban_sdk::testutils::{Address as _, AuthorizedFunction, Events}; -use soroban_sdk::{symbol_short, vec, IntoVal, Symbol}; +use soroban_sdk::{symbol_short, vec, IntoVal, Map, Symbol, Val}; use tests::sut::set_time; use super::sut::fill_pool_six; @@ -791,7 +791,20 @@ fn should_emit_events() { ( sut.pool.address.clone(), (Symbol::new(&env, "liquidation"), borrower.clone()).into_val(&env), - (12_346_441_522i128, 15_434_514_766i128).into_val(&env) + Map::::from_array( + &env, + [ + ( + Symbol::new(&env, "covered_debt"), + 12_346_441_522i128.into_val(&env) + ), + ( + Symbol::new(&env, "liquidated_collateral"), + 15_434_514_766i128.into_val(&env), + ), + ], + ) + .into_val(&env) ), ] ); diff --git a/contracts/pool/src/tests/repay.rs b/contracts/pool/src/tests/repay.rs index 8e39a605..6932d444 100644 --- a/contracts/pool/src/tests/repay.rs +++ b/contracts/pool/src/tests/repay.rs @@ -1,7 +1,7 @@ use crate::tests::sut::{fill_pool, init_pool, DAY}; use crate::*; use soroban_sdk::testutils::Events; -use soroban_sdk::{vec, IntoVal, Symbol}; +use soroban_sdk::{vec, IntoVal, Map, Symbol, Val}; use tests::sut::set_time; #[test] @@ -184,7 +184,14 @@ fn should_emit_events() { ( sut.pool.address.clone(), (Symbol::new(&env, "repay"), borrower.clone()).into_val(&env), - (debt_token, 40_009_097i128).into_val(&env) + Map::::from_array( + &env, + [ + (Symbol::new(&env, "asset"), debt_token.into_val(&env)), + (Symbol::new(&env, "amount"), 40_009_097i128.into_val(&env),), + ], + ) + .into_val(&env) ), ] ); diff --git a/contracts/pool/src/tests/rounding.rs b/contracts/pool/src/tests/rounding.rs index 86bf04b8..28242489 100644 --- a/contracts/pool/src/tests/rounding.rs +++ b/contracts/pool/src/tests/rounding.rs @@ -22,7 +22,7 @@ fn rounding_deposit_withdraw() { std::println!("debt coeff {:?}", sut.pool.debt_coeff(&token_address)); // i = 1 will panic with s-token: invalid mint amount, cause mint_amount would be equal to 0 for i in 2..101 { - env.budget().reset_unlimited(); + env.cost_estimate().budget().reset_unlimited(); let balance_before = sut.reserves[1].token.balance(&attacker); let s_balance_before = sut.reserves[1].s_token().balance(&attacker); @@ -88,7 +88,7 @@ fn rounding_borrow_repay() { std::println!("debt coeff {:?}", sut.pool.debt_coeff(&token_address)); // i = 1 will panic with zero or negative amount is not allowed, cause mint_amount would be equal to 0 for i in 2..101 { - env.budget().reset_unlimited(); + env.cost_estimate().budget().reset_unlimited(); let balance_before = sut.reserves[1].token.balance(&attacker); let d_balance_before = sut.reserves[1].debt_token().balance(&attacker); diff --git a/contracts/pool/src/tests/set_as_collateral.rs b/contracts/pool/src/tests/set_as_collateral.rs index f3e9a805..db493817 100644 --- a/contracts/pool/src/tests/set_as_collateral.rs +++ b/contracts/pool/src/tests/set_as_collateral.rs @@ -216,7 +216,7 @@ fn should_fail_when_collat_lt_min_position_amount() { /// Init for set_as_collateral tests. /// Returns Sut, user address, reserve index and token address -fn init(env: &Env) -> (Sut, Address, u8, Address) { +fn init(env: &'_ Env) -> (Sut<'_>, Address, u8, Address) { let sut = init_pool(env, false); let user = Address::generate(env); @@ -231,7 +231,7 @@ fn init(env: &Env) -> (Sut, Address, u8, Address) { } /// Returns Sut, user address, collat reserve index, debt reserve index, collat token address, debt token address -pub fn init_with_debt(env: &Env) -> (Sut, Address, (u8, u8), (Address, Address)) { +pub fn init_with_debt(env: &'_ Env) -> (Sut<'_>, Address, (u8, u8), (Address, Address)) { let (sut, user, collat_reserve_index, collat_address) = init(env); let lender = Address::generate(env); let token_admin = &sut.reserves[1].token_admin; diff --git a/contracts/pool/src/tests/set_reserve_status.rs b/contracts/pool/src/tests/set_reserve_status.rs index f5cd05eb..35660d69 100644 --- a/contracts/pool/src/tests/set_reserve_status.rs +++ b/contracts/pool/src/tests/set_reserve_status.rs @@ -81,7 +81,7 @@ fn should_emit_events() { &env, ( sut.pool.address.clone(), - (&asset,).into_val(&env), + (Symbol::new(&env, "reserve_status_changed"), asset.clone()).into_val(&env), (true).into_val(&env) ), ] @@ -97,7 +97,7 @@ fn should_emit_events() { &env, ( sut.pool.address.clone(), - (&asset,).into_val(&env), + (Symbol::new(&env, "reserve_status_changed"), &asset).into_val(&env), (false).into_val(&env) ), ] diff --git a/contracts/pool/src/tests/snapshots/budget_utilization.snap b/contracts/pool/src/tests/snapshots/budget_utilization.snap index 1af75d74..95c74d8f 100644 --- a/contracts/pool/src/tests/snapshots/budget_utilization.snap +++ b/contracts/pool/src/tests/snapshots/budget_utilization.snap @@ -1,180 +1,180 @@ ['pool::tests::budget::account_position'] = { - "cpu_cost": 12081299, - "memory_cost": 5798758, + "cpu_cost": 4479451, + "memory_cost": 4117146, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::borrow'] = { - "cpu_cost": 16921234, - "memory_cost": 8939991, + "cpu_cost": 7173017, + "memory_cost": 6859780, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::collat_coeff'] = { - "cpu_cost": 8398842, - "memory_cost": 2972642, + "cpu_cost": 1623930, + "memory_cost": 1434496, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::configure_as_collateral'] = { - "cpu_cost": 8949676, - "memory_cost": 3090090, + "cpu_cost": 2166598, + "memory_cost": 1551597, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::debt_coeff'] = { - "cpu_cost": 8088641, - "memory_cost": 2918728, + "cpu_cost": 1303504, + "memory_cost": 1380365, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::deposit'] = { - "cpu_cost": 11711820, - "memory_cost": 4706143, + "cpu_cost": 3678023, + "memory_cost": 2924951, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::enable_borrowing_on_reserve'] = { - "cpu_cost": 8376228, - "memory_cost": 2991762, + "cpu_cost": 1587331, + "memory_cost": 1453137, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::flash_loan_with_borrow'] = { - "cpu_cost": 32054750, - "memory_cost": 19589834, + "cpu_cost": 15124708, + "memory_cost": 16202476, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::flash_loan_without_borrow'] = { - "cpu_cost": 18702751, - "memory_cost": 9495021, + "cpu_cost": 7591704, + "memory_cost": 7144825, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::get_reserve'] = { - "cpu_cost": 7915212, - "memory_cost": 2882514, + "cpu_cost": 1123896, + "memory_cost": 1343718, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::init_reserve'] = { - "cpu_cost": 235448, - "memory_cost": 46240, + "cpu_cost": 250821, + "memory_cost": 47924, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::liquidate_receive_underlying_when_borrower_has_one_debt'] = { - "cpu_cost": 18845425, - "memory_cost": 9202837, + "cpu_cost": 9189783, + "memory_cost": 7138407, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::liquidate_receive_underlying_when_borrower_has_two_debts'] = { - "cpu_cost": 19125918, - "memory_cost": 9201309, + "cpu_cost": 9484316, + "memory_cost": 7136171, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::pause_info'] = { - "cpu_cost": 7863072, - "memory_cost": 2881012, + "cpu_cost": 1071019, + "memory_cost": 1342113, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::price_feed'] = { - "cpu_cost": 7875236, - "memory_cost": 2881279, + "cpu_cost": 1084136, + "memory_cost": 1342371, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::repay_full'] = { - "cpu_cost": 13900500, - "memory_cost": 6174809, + "cpu_cost": 5987855, + "memory_cost": 4420457, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::repay_partial'] = { - "cpu_cost": 15291312, - "memory_cost": 7507482, + "cpu_cost": 6920878, + "memory_cost": 5678774, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::s_token_transfer'] = { - "cpu_cost": 14315021, - "memory_cost": 7369038, + "cpu_cost": 5314677, + "memory_cost": 5430156, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::set_as_collateral'] = { - "cpu_cost": 11635628, - "memory_cost": 5748051, + "cpu_cost": 3989646, + "memory_cost": 4063447, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::set_pause'] = { - "cpu_cost": 8313750, - "memory_cost": 2989617, + "cpu_cost": 1524447, + "memory_cost": 1450915, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::set_pool_configuration'] = { - "cpu_cost": 8530293, - "memory_cost": 3025860, + "cpu_cost": 1691234, + "memory_cost": 1477818, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::set_price_feed'] = { - "cpu_cost": 198318, - "memory_cost": 36408, + "cpu_cost": 208333, + "memory_cost": 38013, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::set_reserve_status'] = { - "cpu_cost": 8371304, - "memory_cost": 2991624, + "cpu_cost": 1585889, + "memory_cost": 1453142, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::stoken_underlying_balance'] = { - "cpu_cost": 7610392, - "memory_cost": 2841954, + "cpu_cost": 820117, + "memory_cost": 1300655, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::upgrade'] = { - "cpu_cost": 8091165, - "memory_cost": 2943026, + "cpu_cost": 1301483, + "memory_cost": 1404488, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::upgrade_debt_token'] = { - "cpu_cost": 9398991, - "memory_cost": 4298973, + "cpu_cost": 1689093, + "memory_cost": 2600588, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::upgrade_s_token'] = { - "cpu_cost": 9896182, - "memory_cost": 4399539, + "cpu_cost": 1731108, + "memory_cost": 2607287, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::user_configuration'] = { - "cpu_cost": 7618546, - "memory_cost": 2844949, + "cpu_cost": 826947, + "memory_cost": 1303753, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::withdraw_full'] = { - "cpu_cost": 15395769, - "memory_cost": 7488600, + "cpu_cost": 6570455, + "memory_cost": 5566723, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::withdraw_partial'] = { - "cpu_cost": 15259759, - "memory_cost": 7504574, + "cpu_cost": 6392907, + "memory_cost": 5581247, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } diff --git a/contracts/pool/src/tests/sut.rs b/contracts/pool/src/tests/sut.rs index 6209ce00..708fb2ee 100644 --- a/contracts/pool/src/tests/sut.rs +++ b/contracts/pool/src/tests/sut.rs @@ -18,29 +18,25 @@ use soroban_sdk::IntoVal; use soroban_sdk::{vec, Env}; mod pool { - soroban_sdk::contractimport!(file = "../../target/wasm32-unknown-unknown/release/pool.wasm"); + soroban_sdk::contractimport!(file = "../../target/wasm32v1-none/release/pool.wasm"); } mod flash_loan_receiver { soroban_sdk::contractimport!( - file = "../../target/wasm32-unknown-unknown/release/flash_loan_receiver_mock.wasm" + file = "../../target/wasm32v1-none/release/flash_loan_receiver_mock.wasm" ); } mod s_token { - soroban_sdk::contractimport!(file = "../../target/wasm32-unknown-unknown/release/s_token.wasm"); + soroban_sdk::contractimport!(file = "../../target/wasm32v1-none/release/s_token.wasm"); } mod debt_token { - soroban_sdk::contractimport!( - file = "../../target/wasm32-unknown-unknown/release/debt_token.wasm" - ); + soroban_sdk::contractimport!(file = "../../target/wasm32v1-none/release/debt_token.wasm"); } mod price_feed { - soroban_sdk::contractimport!( - file = "../../target/wasm32-unknown-unknown/release/price_feed_mock.wasm" - ); + soroban_sdk::contractimport!(file = "../../target/wasm32v1-none/release/price_feed_mock.wasm"); } pub const DAY: u64 = 24 * 60 * 60; @@ -49,11 +45,11 @@ pub(crate) fn create_token_contract<'a>( e: &Env, admin: &Address, ) -> (TokenClient<'a>, TokenAdminClient<'a>) { - let stellar_asset_contract = e.register_stellar_asset_contract(admin.clone()); + let stellar_asset_contract = e.register_stellar_asset_contract_v2(admin.clone()); ( - TokenClient::new(e, &stellar_asset_contract), - TokenAdminClient::new(e, &stellar_asset_contract), + TokenClient::new(e, &stellar_asset_contract.address()), + TokenAdminClient::new(e, &stellar_asset_contract.address()), ) } @@ -64,9 +60,9 @@ pub(crate) fn create_pool_contract<'a>( base_token: &Address, ) -> LendingPoolClient<'a> { let client = if use_wasm { - LendingPoolClient::new(e, &e.register_contract_wasm(None, pool::WASM)) + LendingPoolClient::new(e, &e.register(pool::WASM, ())) } else { - LendingPoolClient::new(e, &e.register_contract(None, LendingPool)) + LendingPoolClient::new(e, &e.register(LendingPool {}, ())) }; let grace_period = 1; @@ -101,7 +97,7 @@ pub(crate) fn create_s_token_contract<'a>( pool: &Address, underlying_asset: &Address, ) -> STokenClient<'a> { - let client = STokenClient::new(&e, &e.register_contract_wasm(None, s_token::WASM)); + let client = STokenClient::new(&e, &e.register(s_token::WASM, ())); client.initialize( &"SToken".into_val(e), @@ -118,8 +114,7 @@ pub(crate) fn create_debt_token_contract<'a>( pool: &Address, underlying_asset: &Address, ) -> DebtTokenClient<'a> { - let client: DebtTokenClient<'_> = - DebtTokenClient::new(&e, &e.register_contract_wasm(None, debt_token::WASM)); + let client: DebtTokenClient<'_> = DebtTokenClient::new(&e, &e.register(debt_token::WASM, ())); client.initialize( &"DebtToken".into_val(e), @@ -132,18 +127,15 @@ pub(crate) fn create_debt_token_contract<'a>( } pub(crate) fn create_price_feed_contract<'a>(e: &Env) -> PriceFeedClient<'a> { - PriceFeedClient::new(&e, &e.register_contract_wasm(None, price_feed::WASM)) + PriceFeedClient::new(&e, &e.register(price_feed::WASM, ())) } pub(crate) fn create_flash_loan_receiver_contract<'a>(e: &Env) -> FlashLoanReceiverClient<'a> { - FlashLoanReceiverClient::new( - &e, - &e.register_contract_wasm(None, flash_loan_receiver::WASM), - ) + FlashLoanReceiverClient::new(&e, &e.register(flash_loan_receiver::WASM, ())) } pub(crate) fn init_pool<'a>(env: &Env, use_pool_wasm: bool) -> Sut<'a> { - env.budget().reset_unlimited(); + env.cost_estimate().budget().reset_unlimited(); let admin = Address::generate(&env); let token_admin = Address::generate(&env); diff --git a/contracts/pool/src/tests/withdraw.rs b/contracts/pool/src/tests/withdraw.rs index 86df3caa..5a310a7e 100644 --- a/contracts/pool/src/tests/withdraw.rs +++ b/contracts/pool/src/tests/withdraw.rs @@ -1,8 +1,8 @@ use super::sut::fill_pool; use crate::tests::sut::{fill_pool_two, init_pool, DAY}; use crate::*; -use soroban_sdk::symbol_short; use soroban_sdk::testutils::{Address as _, AuthorizedFunction, Events}; +use soroban_sdk::{symbol_short, Map, Val}; use soroban_sdk::{vec, IntoVal, Symbol}; use tests::sut::set_time; @@ -360,12 +360,23 @@ fn should_emit_events() { ( sut.pool.address.clone(), (Symbol::new(&env, "withdraw"), user_1.clone()).into_val(&env), - (user_2.clone(), token_address.clone(), 1_000_000_000i128).into_val(&env) + Map::::from_array( + &env, + [ + (Symbol::new(&env, "to"), user_2.clone().into_val(&env)), + (Symbol::new(&env, "asset"), token_address.into_val(&env)), + ( + Symbol::new(&env, "amount"), + 1_000_000_000i128.into_val(&env), + ), + ], + ) + .into_val(&env) ), ] ); - let event = events.get(23).unwrap(); + let event = events.get(0).unwrap(); assert_eq!( vec![&env, event], diff --git a/contracts/pool/src/types/user_configurator.rs b/contracts/pool/src/types/user_configurator.rs index d3d51f61..04fc30a0 100644 --- a/contracts/pool/src/types/user_configurator.rs +++ b/contracts/pool/src/types/user_configurator.rs @@ -2,7 +2,7 @@ use pool_interface::types::error::Error; use pool_interface::types::user_config::UserConfiguration; use soroban_sdk::{Address, Env}; -use crate::event; +use crate::event::{ReserveUsedAsCollDisabledEvent, ReserveUsedAsCollEnabledEvent}; use crate::methods::utils::validation::require_not_exceed_assets_limit; use crate::storage::{read_user_config, write_user_config}; @@ -47,7 +47,11 @@ impl<'a> UserConfigurator<'a> { user_config.set_using_as_collateral(env, reserve_id, false); - event::reserve_used_as_collateral_disabled(env, self.user, asset); + ReserveUsedAsCollDisabledEvent { + who: self.user.clone(), + asset: asset.clone(), + } + .publish(env); self.should_write = true; @@ -71,7 +75,11 @@ impl<'a> UserConfigurator<'a> { user_config.set_using_as_collateral(env, reserve_id, true); require_not_exceed_assets_limit(env, user_config.total_assets(), assets_limit); - event::reserve_used_as_collateral_enabled(env, self.user, asset); + ReserveUsedAsCollEnabledEvent { + who: self.user.clone(), + asset: asset.clone(), + } + .publish(env); self.should_write = true; diff --git a/contracts/s-token/Cargo.toml b/contracts/s-token/Cargo.toml index 60c8bad6..de73479a 100644 --- a/contracts/s-token/Cargo.toml +++ b/contracts/s-token/Cargo.toml @@ -3,6 +3,7 @@ name = "s-token" authors = ["eq-lab"] version = "0.1.0" edition = "2021" +publish = false description = "SToken contract" [lib] diff --git a/contracts/s-token/src/event.rs b/contracts/s-token/src/event.rs index cb85a866..9688f2e6 100644 --- a/contracts/s-token/src/event.rs +++ b/contracts/s-token/src/event.rs @@ -1,43 +1,61 @@ -use soroban_sdk::{symbol_short, Address, Env, String, Symbol}; +use soroban_sdk::{contractevent, Address, String}; -pub(crate) fn approve(e: &Env, from: Address, to: Address, amount: i128, expiration_ledger: u32) { - let topics = (Symbol::new(e, "approve"), from, to); - e.events().publish(topics, (amount, expiration_ledger)); +#[contractevent(topics=["approve"], data_format = "map")] +pub(crate) struct ApproveEvent { + #[topic] + pub from: Address, + #[topic] + pub to: Address, + pub amount: i128, + pub expiration_ledger: u32, } -pub(crate) fn transfer(e: &Env, from: Address, to: Address, amount: i128) { - let topics = (symbol_short!("transfer"), from, to); - e.events().publish(topics, amount); +#[contractevent(topics=["transfer"], data_format = "single-value")] +pub(crate) struct TransferEvent { + #[topic] + pub from: Address, + #[topic] + pub to: Address, + pub amount: i128, } -pub(crate) fn mint(e: &Env, admin: Address, to: Address, amount: i128) { - let topics = (symbol_short!("mint"), admin, to); - e.events().publish(topics, amount); +#[contractevent(topics=["mint"], data_format = "single-value")] +pub(crate) struct MintEvent { + #[topic] + pub admin: Address, + #[topic] + pub to: Address, + pub amount: i128, } -pub(crate) fn clawback(e: &Env, from: Address, amount: i128) { - let topics = (symbol_short!("clawback"), from); - e.events().publish(topics, amount); +#[contractevent(topics=["clawback"], data_format = "single-value")] +pub(crate) struct ClawbackEvent { + #[topic] + pub from: Address, + pub amount: i128, } -pub(crate) fn set_authorized(e: &Env, id: Address, authorize: bool) { - let topics = (Symbol::new(e, "set_authorized"), id); - e.events().publish(topics, authorize); +#[contractevent(topics=["set_authorized"], data_format = "single-value")] +pub(crate) struct SetAuthorizedEvent { + #[topic] + pub id: Address, + pub authorize: bool, } -pub(crate) fn burn(e: &Env, from: Address, amount: i128) { - let topics = (symbol_short!("burn"), from); - e.events().publish(topics, amount); +#[contractevent(topics=["burn"], data_format = "single-value")] +pub(crate) struct BurnEvent { + #[topic] + pub from: Address, + pub amount: i128, } -pub(crate) fn initialized( - e: &Env, - underlying_asset: Address, - pool: Address, - decimals: u32, - name: String, - symbol: String, -) { - let topics = (symbol_short!("init"), underlying_asset, pool); - e.events().publish(topics, (decimals, name, symbol)); +#[contractevent(topics=["initialized"], data_format = "map")] +pub(crate) struct InitializedEvent { + #[topic] + pub underlying_asset: Address, + #[topic] + pub pool: Address, + pub decimals: u32, + pub name: String, + pub symbol: String, } diff --git a/contracts/s-token/src/lib.rs b/contracts/s-token/src/lib.rs index 1371a5cf..c55ab9a2 100644 --- a/contracts/s-token/src/lib.rs +++ b/contracts/s-token/src/lib.rs @@ -1,7 +1,13 @@ #![deny(warnings)] #![no_std] -use crate::storage::*; +use crate::{ + event::{ + ApproveEvent, BurnEvent, ClawbackEvent, InitializedEvent, MintEvent, SetAuthorizedEvent, + TransferEvent, + }, + storage::*, +}; use common_token::{ balance::*, require_nonnegative_amount, require_positive_amount, storage::*, verify_caller_is_pool, @@ -66,7 +72,14 @@ impl STokenTrait for SToken { }, ); - event::initialized(&e, underlying_asset, pool, decimal, name, symbol); + InitializedEvent { + underlying_asset, + pool, + decimals: decimal, + name: name.clone(), + symbol: symbol.clone(), + } + .publish(&e); } fn upgrade(env: Env, new_wasm_hash: BytesN<32>) { @@ -115,7 +128,14 @@ impl STokenTrait for SToken { require_nonnegative_amount(amount); write_allowance(&e, from.clone(), spender.clone(), amount, expiration_ledger); - event::approve(&e, from, spender, amount, expiration_ledger); + + ApproveEvent { + from, + to: spender, + amount, + expiration_ledger, + } + .publish(&e); } /// Returns the balance of tokens for a specified `id`. @@ -225,7 +245,12 @@ impl STokenTrait for SToken { spend_balance(&e, from.clone(), amount); add_total_supply(&e, amount.checked_neg().expect("s-token: no overflow")); - event::clawback(&e, from, amount); + + ClawbackEvent { + from: from.clone(), + amount, + } + .publish(&e); } /// Sets the authorization status for a specified `id`. @@ -243,7 +268,8 @@ impl STokenTrait for SToken { verify_caller_is_pool(&e); write_authorization(&e, id.clone(), authorize); - event::set_authorized(&e, id, authorize); + + SetAuthorizedEvent { id, authorize }.publish(&e); } /// Mints a specified amount of tokens for a given `id` and returns total supply @@ -262,7 +288,13 @@ impl STokenTrait for SToken { let pool = verify_caller_is_pool(&e); do_mint(&e, to.clone(), amount); - event::mint(&e, pool, to, amount); + + MintEvent { + admin: pool, + to, + amount, + } + .publish(&e); } /// Burns a specified amount of tokens from the from account and returns total supply @@ -283,7 +315,12 @@ impl STokenTrait for SToken { verify_caller_is_pool(&e); do_burn(&e, from.clone(), amount_to_burn, amount_to_withdraw, to); - event::burn(&e, from, amount_to_burn); + + BurnEvent { + from, + amount: amount_to_burn, + } + .publish(&e); } /// Returns the number of decimal places used by the token. @@ -367,7 +404,12 @@ impl STokenTrait for SToken { let token_client = token::Client::new(&e, &underlying_asset); token_client.transfer(¤t_address, &to, &amount); - event::transfer(&e, current_address, to, amount); + TransferEvent { + from: current_address, + to: to.clone(), + amount, + } + .publish(&e); } /// Retrieves the address of the underlying asset. @@ -413,7 +455,12 @@ fn do_transfer(e: &Env, from: Address, to: Address, amount: i128, validate: bool ); } - event::transfer(e, from, to, amount) + TransferEvent { + from: from.clone(), + to: to.clone(), + amount, + } + .publish(e); } fn spend_allowance(e: &Env, from: Address, spender: Address, amount: i128) { diff --git a/contracts/s-token/src/tests/test.rs b/contracts/s-token/src/tests/test.rs index d6090549..6bdbb8bd 100644 --- a/contracts/s-token/src/tests/test.rs +++ b/contracts/s-token/src/tests/test.rs @@ -15,38 +15,34 @@ use self::pool::{ }; mod pool { - soroban_sdk::contractimport!(file = "../../target/wasm32-unknown-unknown/release/pool.wasm"); + soroban_sdk::contractimport!(file = "../../target/wasm32v1-none/release/pool.wasm"); } mod debt_token { - soroban_sdk::contractimport!( - file = "../../target/wasm32-unknown-unknown/release/debt_token.wasm" - ); + soroban_sdk::contractimport!(file = "../../target/wasm32v1-none/release/debt_token.wasm"); } mod oracle { - soroban_sdk::contractimport!( - file = "../../target/wasm32-unknown-unknown/release/price_feed_mock.wasm" - ); + soroban_sdk::contractimport!(file = "../../target/wasm32v1-none/release/price_feed_mock.wasm"); } fn create_token<'a>( - e: &Env, + e: &'_ Env, ) -> ( STokenClient<'a>, DebtTokenClient<'a>, pool::Client<'a>, - TokenClient, - TokenAdminClient, + TokenClient<'_>, + TokenAdminClient<'_>, ) { let pool_admin = Address::generate(e); - let pool = pool::Client::new(e, &e.register_contract_wasm(None, pool::WASM)); - let s_token = STokenClient::new(e, &e.register_contract(None, SToken {})); - let stellar_asset = &e.register_stellar_asset_contract(pool_admin.clone()); + let pool = pool::Client::new(e, &e.register(pool::WASM, ())); + let s_token = STokenClient::new(e, &e.register(SToken {}, ())); + let stellar_asset = &e.register_stellar_asset_contract_v2(pool_admin.clone()); - let underlying_asset = TokenClient::new(e, stellar_asset); - let underlying_asset_admin = TokenAdminClient::new(e, stellar_asset); + let underlying_asset = TokenClient::new(e, &stellar_asset.address()); + let underlying_asset_admin = TokenAdminClient::new(e, &stellar_asset.address()); let flash_loan_fee = 5; let initial_health = 2_500; @@ -72,8 +68,8 @@ fn create_token<'a>( }, ); - e.budget().reset_default(); - let price_feed = oracle::Client::new(e, &e.register_contract_wasm(None, oracle::WASM)); + e.cost_estimate().budget().reset_default(); + let price_feed = oracle::Client::new(e, &e.register(oracle::WASM, ())); let feed_inputs = vec![ &e, @@ -105,10 +101,10 @@ fn create_token<'a>( &underlying_asset.address, ); - e.budget().reset_default(); + e.cost_estimate().budget().reset_default(); let debt_token: DebtTokenClient<'_> = - DebtTokenClient::new(&e, &e.register_contract_wasm(None, debt_token::WASM)); + DebtTokenClient::new(&e, &e.register(debt_token::WASM, ())); debt_token.initialize( &"DebtToken".into_val(e), @@ -136,7 +132,7 @@ fn test() { ReserveType::Fungible(s_token.address.clone(), debt_token.address.clone()); pool.init_reserve(&underlying.address, &init_reserve_input); - e.budget().reset_default(); + e.cost_estimate().budget().reset_default(); { let underlying_decimals = underlying.decimals(); diff --git a/deploy/scripts/deploy.sh b/deploy/scripts/deploy.sh index 75327eb4..0d0b24bc 100755 --- a/deploy/scripts/deploy.sh +++ b/deploy/scripts/deploy.sh @@ -1,7 +1,7 @@ #!/bin/bash BASEDIR=$(dirname $0) -BUILD=$BASEDIR/../../target/wasm32-unknown-unknown/release +BUILD=$BASEDIR/../../target/wasm32v1-none/release source $BASEDIR/.$1.env diff --git a/deploy/scripts/upgrade.sh b/deploy/scripts/upgrade.sh index 2ba42c5c..43887372 100755 --- a/deploy/scripts/upgrade.sh +++ b/deploy/scripts/upgrade.sh @@ -30,7 +30,7 @@ install() { echo $hash } -POOL_HASH=$(install "../target/wasm32-unknown-unknown/release/pool.wasm" $ADMIN_SECRET) +POOL_HASH=$(install "../target/wasm32v1-none/release/pool.wasm" $ADMIN_SECRET) echo "Pool wasm hash: $POOL_HASH" echo "$POOL_HASH">$BASEDIR/../artifacts/pool.wasm.upgrades.hash diff --git a/integration-tests/tests/pool.sut.ts b/integration-tests/tests/pool.sut.ts index 427c4bb7..3e24477d 100644 --- a/integration-tests/tests/pool.sut.ts +++ b/integration-tests/tests/pool.sut.ts @@ -540,7 +540,7 @@ export async function deployReceiverMock(): Promise { (await new Promise((resolve, reject) => { exec( `stellar contract deploy \ - --wasm ../target/wasm32-unknown-unknown/release/flash_loan_receiver_mock.wasm \ + --wasm ../target/wasm32v1-none/release/flash_loan_receiver_mock.wasm \ --source ${adminKeys.secret()} \ --rpc-url "${process.env.SOROBAN_RPC_URL}" \ --network-passphrase "${process.env.PASSPHRASE}"`, From d72031c9472e00b001a62853746ebacbbc00ca29 Mon Sep 17 00:00:00 2001 From: Artur Abliazimov Date: Fri, 26 Sep 2025 14:51:51 +0300 Subject: [PATCH 02/11] Remove unused structs --- contracts/common/src/fixed/fixed_point.rs | 18 - contracts/common/src/fixed/i128.rs | 483 ------------------ contracts/common/src/fixed/i256.rs | 260 ---------- contracts/common/src/fixed/mod.rs | 4 - .../common/src/fixed/soroban_fixed_point.rs | 37 -- 5 files changed, 802 deletions(-) delete mode 100644 contracts/common/src/fixed/fixed_point.rs delete mode 100644 contracts/common/src/fixed/i128.rs delete mode 100644 contracts/common/src/fixed/i256.rs delete mode 100644 contracts/common/src/fixed/mod.rs delete mode 100644 contracts/common/src/fixed/soroban_fixed_point.rs diff --git a/contracts/common/src/fixed/fixed_point.rs b/contracts/common/src/fixed/fixed_point.rs deleted file mode 100644 index 5b115aa6..00000000 --- a/contracts/common/src/fixed/fixed_point.rs +++ /dev/null @@ -1,18 +0,0 @@ -/// Fixed point trait for computing fixed point calculations with native rust types. -pub trait FixedPoint: Sized { - /// Safely calculates floor(x * y / denominator). Returns None if a phantom overflow - /// occurs or if the denominator is 0. - fn fixed_mul_floor(self, y: Self, denominator: Self) -> Option; - - /// Safely calculates ceil(x * y / denominator). Returns None if a phantom overflow - /// occurs or if the denominator is 0. - fn fixed_mul_ceil(self, y: Self, denominator: Self) -> Option; - - /// Safely calculates floor(x * denominator / y). Returns None if a phantom overflow - /// occurs or if the denominator is 0. - fn fixed_div_floor(self, y: Self, denominator: Self) -> Option; - - /// Safely calculates ceil(x * denominator / y). Returns None if a phantom overflow - /// occurs or if the denominator is 0. - fn fixed_div_ceil(self, y: Self, denominator: Self) -> Option; -} diff --git a/contracts/common/src/fixed/i128.rs b/contracts/common/src/fixed/i128.rs deleted file mode 100644 index 155cbcd6..00000000 --- a/contracts/common/src/fixed/i128.rs +++ /dev/null @@ -1,483 +0,0 @@ -use soroban_sdk::{unwrap::UnwrapOptimized, Env, I256}; - -use crate::{fixed::fixed_point::FixedPoint, fixed::soroban_fixed_point::SorobanFixedPoint}; - -impl FixedPoint for i128 { - fn fixed_mul_floor(self, y: i128, denominator: i128) -> Option { - mul_div_floor(self, y, denominator) - } - - fn fixed_mul_ceil(self, y: i128, denominator: i128) -> Option { - mul_div_ceil(self, y, denominator) - } - - fn fixed_div_floor(self, y: i128, denominator: i128) -> Option { - mul_div_floor(self, denominator, y) - } - - fn fixed_div_ceil(self, y: i128, denominator: i128) -> Option { - mul_div_ceil(self, denominator, y) - } -} - -/// Performs floor(x * y / z) -pub(crate) fn mul_div_floor(x: i128, y: i128, z: i128) -> Option { - let r = x.checked_mul(y)?; - div_floor(r, z) -} - -/// Performs floor(r / z) -fn div_floor(r: i128, z: i128) -> Option { - if r < 0 || (r > 0 && z < 0) { - // ceiling is taken by default for a negative result - let remainder = r.checked_rem_euclid(z)?; - (r / z).checked_sub(if remainder > 0 { 1 } else { 0 }) - } else { - // floor taken by default for a positive or zero result - r.checked_div(z) - } -} - -/// Performs ceil(x * y / z) -pub(crate) fn mul_div_ceil(x: i128, y: i128, z: i128) -> Option { - let r = x.checked_mul(y)?; - div_ceil(r, z) -} - -/// Performs ceil(r / z) -fn div_ceil(r: i128, z: i128) -> Option { - if r <= 0 || (r > 0 && z < 0) { - // ceiling is taken by default for a negative or zero result - r.checked_div(z) - } else { - // floor taken by default for a positive result - let remainder = r.checked_rem_euclid(z)?; - (r / z).checked_add(if remainder > 0 { 1 } else { 0 }) - } -} - -impl SorobanFixedPoint for i128 { - fn fixed_mul_floor(&self, env: &Env, y: &i128, denominator: &i128) -> i128 { - scaled_mul_div_floor(&self, env, y, denominator) - } - - fn fixed_mul_ceil(&self, env: &Env, y: &i128, denominator: &i128) -> i128 { - scaled_mul_div_ceil(&self, env, y, denominator) - } - - fn fixed_div_floor(&self, env: &Env, y: &i128, denominator: &i128) -> i128 { - scaled_mul_div_floor(&self, env, denominator, y) - } - - fn fixed_div_ceil(&self, env: &Env, y: &i128, denominator: &i128) -> i128 { - scaled_mul_div_ceil(&self, env, denominator, y) - } -} - -/// Performs floor(x * y / z) -fn scaled_mul_div_floor(x: &i128, env: &Env, y: &i128, z: &i128) -> i128 { - return match x.checked_mul(*y) { - Some(r) => div_floor(r, *z).unwrap_optimized(), - None => { - // scale to i256 and retry - let res = crate::fixed::i256::mul_div_floor( - &env, - &I256::from_i128(&env, *x), - &I256::from_i128(&env, *y), - &I256::from_i128(&env, *z), - ); - // will panic if result is not representable in i128 - res.to_i128().unwrap_optimized() - } - }; -} - -/// Performs floor(x * y / z) -fn scaled_mul_div_ceil(x: &i128, env: &Env, y: &i128, z: &i128) -> i128 { - return match x.checked_mul(*y) { - Some(r) => div_ceil(r, *z).unwrap_optimized(), - None => { - // scale to i256 and retry - let res = crate::fixed::i256::mul_div_ceil( - &env, - &I256::from_i128(&env, *x), - &I256::from_i128(&env, *y), - &I256::from_i128(&env, *z), - ); - // will panic if result is not representable in i128 - res.to_i128().unwrap_optimized() - } - }; -} - -#[cfg(test)] -mod test_fixed_point { - - /********** fixed_mul_floor **********/ - - use crate::fixed::fixed_point::FixedPoint; - - #[test] - fn test_fixed_mul_floor_rounds_down() { - let x: i128 = 1_5391283; - let y: i128 = 314_1592653; - let denominator: i128 = 1_0000001; - - let result = x.fixed_mul_floor(y, denominator).unwrap(); - - assert_eq!(result, 483_5313675) - } - - #[test] - fn test_fixed_mul_floor_negative_rounds_down() { - let x: i128 = -1_5391283; - let y: i128 = 314_1592653; - let denominator: i128 = 1_0000001; - - let result = x.fixed_mul_floor(y, denominator).unwrap(); - - assert_eq!(result, -483_5313676) - } - - #[test] - fn test_fixed_mul_floor_large_number() { - let x: i128 = 170_141_183_460_469_231_731; - let y: i128 = 1_000_000_000_000_000_000; - let denominator: i128 = 1_000_000_000_000_000_000; - - let result = x.fixed_mul_floor(y, denominator).unwrap(); - - assert_eq!(result, 170_141_183_460_469_231_731) - } - - #[test] - fn test_fixed_mul_floor_phantom_overflow() { - let x: i128 = 170_141_183_460_469_231_731; - let y: i128 = 1_000_000_000_000_000_001; - let denominator: i128 = 1_000_000_000_000_000_000; - - let result = x.fixed_mul_floor(y, denominator); - - assert_eq!(None, result); - } - - /********** fixed_mul_ceil **********/ - - #[test] - fn test_fixed_mul_ceil_rounds_up() { - let x: i128 = 1_5391283; - let y: i128 = 314_1592653; - let denominator: i128 = 1_0000001; - - let result = x.fixed_mul_ceil(y, denominator).unwrap(); - - assert_eq!(result, 483_5313676) - } - - #[test] - fn test_fixed_mul_ceil_negative_rounds_up() { - let x: i128 = -1_5391283; - let y: i128 = 314_1592653; - let denominator: i128 = 1_0000001; - - let result = x.fixed_mul_ceil(y, denominator).unwrap(); - - assert_eq!(result, -483_5313675) - } - - #[test] - fn test_fixed_mul_ceil_large_number() { - let x: i128 = 170_141_183_460_469_231_731; - let y: i128 = 1_000_000_000_000_000_000; - let denominator: i128 = 1_000_000_000_000_000_000; - - let result = x.fixed_mul_ceil(y, denominator).unwrap(); - - assert_eq!(result, 170_141_183_460_469_231_731) - } - - #[test] - fn test_fixed_mul_ceil_phantom_overflow() { - let x: i128 = 170_141_183_460_469_231_731; - let y: i128 = 1_000_000_000_000_000_001; - let denominator: i128 = 1_000_000_000_000_000_000; - - let result = x.fixed_mul_ceil(y, denominator); - - assert_eq!(None, result); - } - - /********** fixed_div_floor **********/ - - #[test] - fn test_fixed_div_floor_rounds_down() { - let x: i128 = 314_1592653; - let y: i128 = 1_5391280; - let denominator: i128 = 1_0000000; - - let result = x.fixed_div_floor(y, denominator).unwrap(); - - assert_eq!(result, 204_1150997) - } - - #[test] - fn test_fixed_div_floor_negative_rounds_down() { - let x: i128 = 314_1592653; - let y: i128 = -1_5391280; - let denominator: i128 = 1_0000000; - - let result = x.fixed_div_floor(y, denominator).unwrap(); - - assert_eq!(result, -204_1150998) - } - - #[test] - fn test_fixed_div_floor_large_number() { - let x: i128 = 170_141_183_460_469_231_731; - let y: i128 = 1_000_000_000_000_000_000; - let denominator: i128 = 1_000_000_000_000_000_000; - - let result = x.fixed_div_floor(y, denominator).unwrap(); - - assert_eq!(result, 170_141_183_460_469_231_731) - } - - #[test] - fn test_fixed_div_floor_phantom_overflow() { - let x: i128 = 170_141_183_460_469_231_732; - let y: i128 = 1_000_000_000_000_000_000; - let denominator: i128 = 1_000_000_000_000_000_000; - - let result = x.fixed_div_floor(y, denominator); - - assert_eq!(None, result); - } - - /********** fixed_div_ceil **********/ - - #[test] - fn test_fixed_div_ceil_rounds_down() { - let x: i128 = 314_1592653; - let y: i128 = 1_5391280; - let denominator: i128 = 1_0000000; - - let result = x.fixed_div_ceil(y, denominator).unwrap(); - - assert_eq!(result, 204_1150998) - } - - #[test] - fn test_fixed_div_ceil_negative_rounds_down() { - let x: i128 = 314_1592653; - let y: i128 = -1_5391280; - let denominator: i128 = 1_0000000; - - let result = x.fixed_div_ceil(y, denominator).unwrap(); - - assert_eq!(result, -204_1150997) - } - - #[test] - fn test_fixed_div_ceil_large_number() { - let x: i128 = 170_141_183_460_469_231_731; - let y: i128 = 1_000_000_000_000_000_000; - let denominator: i128 = 1_000_000_000_000_000_000; - - let result = x.fixed_div_ceil(y, denominator).unwrap(); - - assert_eq!(result, 170_141_183_460_469_231_731) - } - - #[test] - fn test_fixed_div_ceil_phantom_overflow() { - let x: i128 = 170_141_183_460_469_231_732; - let y: i128 = 1_000_000_000_000_000_000; - let denominator: i128 = 1_000_000_000_000_000_000; - - let result = x.fixed_div_ceil(y, denominator); - - assert_eq!(None, result); - } -} - -#[cfg(test)] -mod test_soroban_fixed_point { - use crate::fixed::soroban_fixed_point::SorobanFixedPoint; - use soroban_sdk::Env; - - /********** fixed_mul_floor **********/ - - #[test] - fn test_fixed_mul_floor_rounds_down() { - let env = Env::default(); - let x: i128 = 1_5391283; - let y: i128 = 314_1592653; - let denominator: i128 = 1_0000001; - - let result = x.fixed_mul_floor(&env, &y, &denominator); - - assert_eq!(result, 483_5313675) - } - - #[test] - fn test_fixed_mul_floor_negative_rounds_down() { - let env = Env::default(); - let x: i128 = -1_5391283; - let y: i128 = 314_1592653; - let denominator: i128 = 1_0000001; - - let result = x.fixed_mul_floor(&env, &y, &denominator); - - assert_eq!(result, -483_5313676) - } - - #[test] - fn test_fixed_mul_floor_phantom_overflow_scales() { - let env = Env::default(); - let x: i128 = 170_141_183_460_469_231_731; - let y: i128 = 10i128.pow(27); - let denominator: i128 = 10i128.pow(18); - - let result = x.fixed_mul_floor(&env, &y, &denominator); - - assert_eq!(result, 170_141_183_460_469_231_731 * 10i128.pow(9)); - } - - /********** fixed_mul_ceil **********/ - - #[test] - fn test_fixed_mul_ceil_rounds_up() { - let env = Env::default(); - let x: i128 = 1_5391283; - let y: i128 = 314_1592653; - let denominator: i128 = 1_0000001; - - let result = x.fixed_mul_ceil(&env, &y, &denominator); - - assert_eq!(result, 483_5313676) - } - - #[test] - fn test_fixed_mul_ceil_negative_rounds_up() { - let env = Env::default(); - let x: i128 = -1_5391283; - let y: i128 = 314_1592653; - let denominator: i128 = 1_0000001; - - let result = x.fixed_mul_ceil(&env, &y, &denominator); - - assert_eq!(result, -483_5313675) - } - - #[test] - fn test_fixed_mul_ceil_large_number() { - let env = Env::default(); - let x: i128 = 170_141_183_460_469_231_731; - let y: i128 = 1_000_000_000_000_000_000; - let denominator: i128 = 1_000_000_000_000_000_000; - - let result = x.fixed_mul_ceil(&env, &y, &denominator); - - assert_eq!(result, 170_141_183_460_469_231_731) - } - - #[test] - fn test_fixed_mul_ceil_phantom_overflow_scales() { - let env = Env::default(); - let x: i128 = 170_141_183_460_469_231_731; - let y: i128 = 10i128.pow(27); - let denominator: i128 = 10i128.pow(18); - - let result = x.fixed_mul_ceil(&env, &y, &denominator); - - assert_eq!(result, 170_141_183_460_469_231_731 * 10i128.pow(9)); - } - - /********** fixed_div_floor **********/ - - #[test] - fn test_fixed_div_floor_rounds_down() { - let env = Env::default(); - let x: i128 = 314_1592653; - let y: i128 = 1_5391280; - let denominator: i128 = 1_0000000; - - let result = x.fixed_div_floor(&env, &y, &denominator); - - assert_eq!(result, 204_1150997) - } - - #[test] - fn test_fixed_div_floor_negative_rounds_down() { - let env = Env::default(); - let x: i128 = 314_1592653; - let y: i128 = -1_5391280; - let denominator: i128 = 1_0000000; - - let result = x.fixed_div_floor(&env, &y, &denominator); - - assert_eq!(result, -204_1150998) - } - - #[test] - fn test_fixed_div_floor_phantom_overflow_scales() { - let env = Env::default(); - let x: i128 = 170_141_183_460_469_231_731; - let y: i128 = 10i128.pow(18); - let denominator: i128 = 10i128.pow(27); - - let result = x.fixed_div_floor(&env, &y, &denominator); - - assert_eq!(result, 170_141_183_460_469_231_731 * 10i128.pow(9)); - } - - /********** fixed_div_ceil **********/ - - #[test] - fn test_fixed_div_ceil_rounds_down() { - let env = Env::default(); - let x: i128 = 314_1592653; - let y: i128 = 1_5391280; - let denominator: i128 = 1_0000000; - - let result = x.fixed_div_ceil(&env, &y, &denominator); - - assert_eq!(result, 204_1150998) - } - - #[test] - fn test_fixed_div_ceil_negative_rounds_down() { - let env = Env::default(); - let x: i128 = 314_1592653; - let y: i128 = -1_5391280; - let denominator: i128 = 1_0000000; - - let result = x.fixed_div_ceil(&env, &y, &denominator); - - assert_eq!(result, -204_1150997) - } - - #[test] - fn test_fixed_div_ceil_large_number() { - let env = Env::default(); - let x: i128 = 170_141_183_460_469_231_731; - let y: i128 = 1_000_000_000_000_000_000; - let denominator: i128 = 1_000_000_000_000_000_000; - - let result = x.fixed_div_ceil(&env, &y, &denominator); - - assert_eq!(result, 170_141_183_460_469_231_731) - } - - #[test] - fn test_fixed_div_ceil_phantom_overflow_scales() { - let env = Env::default(); - let x: i128 = 170_141_183_460_469_231_731; - let y: i128 = 10i128.pow(18); - let denominator: i128 = 10i128.pow(27); - - let result = x.fixed_div_floor(&env, &y, &denominator); - - assert_eq!(result, 170_141_183_460_469_231_731 * 10i128.pow(9)); - } -} diff --git a/contracts/common/src/fixed/i256.rs b/contracts/common/src/fixed/i256.rs deleted file mode 100644 index c3b59a27..00000000 --- a/contracts/common/src/fixed/i256.rs +++ /dev/null @@ -1,260 +0,0 @@ -use soroban_sdk::{Env, I256}; - -use crate::fixed::soroban_fixed_point::SorobanFixedPoint; - -impl SorobanFixedPoint for I256 { - fn fixed_mul_floor(&self, env: &Env, y: &I256, denominator: &I256) -> I256 { - mul_div_floor(env, &self, y, denominator) - } - - fn fixed_mul_ceil(&self, env: &Env, y: &I256, denominator: &I256) -> I256 { - mul_div_ceil(env, &self, y, denominator) - } - - fn fixed_div_floor(&self, env: &Env, y: &I256, denominator: &I256) -> I256 { - mul_div_floor(env, &self, denominator, y) - } - - fn fixed_div_ceil(&self, env: &Env, y: &I256, denominator: &I256) -> I256 { - mul_div_ceil(env, &self, denominator, y) - } -} - -/// Performs floor(x * y / z) -pub(crate) fn mul_div_floor(env: &Env, x: &I256, y: &I256, z: &I256) -> I256 { - let zero = I256::from_i32(env, 0); - let r = x.mul(&y); - if r < zero || (r > zero && z.clone() < zero) { - // ceiling is taken by default for a negative result - let remainder = r.rem_euclid(&z); - let one = I256::from_i32(env, 1); - r.div(&z).sub(if remainder > zero { &one } else { &zero }) - } else { - // floor taken by default for a positive or zero result - r.div(&z) - } -} - -/// Performs ceil(x * y / z) -pub(crate) fn mul_div_ceil(env: &Env, x: &I256, y: &I256, z: &I256) -> I256 { - let zero = I256::from_i32(env, 0); - let r = x.mul(&y); - if r <= zero || (r > zero && z.clone() < zero) { - // ceiling is taken by default for a negative or zero result - r.div(&z) - } else { - // floor taken by default for a positive result - let remainder = r.rem_euclid(&z); - let one = I256::from_i32(env, 1); - r.div(&z).add(if remainder > zero { &one } else { &zero }) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - /********** fixed_mul_floor **********/ - - #[test] - fn test_fixed_mul_floor_rounds_down() { - let env = Env::default(); - let x: I256 = I256::from_i128(&env, 1_5391283); - let y: I256 = I256::from_i128(&env, 314_1592653); - let denominator: I256 = I256::from_i128(&env, 1_0000001); - - let result = x.fixed_mul_floor(&env, &y, &denominator); - - assert_eq!(result, I256::from_i128(&env, 483_5313675)); - } - - #[test] - fn test_fixed_mul_floor_negative_rounds_down() { - let env = Env::default(); - let x: I256 = I256::from_i128(&env, -1_5391283); - let y: I256 = I256::from_i128(&env, 314_1592653); - let denominator: I256 = I256::from_i128(&env, 1_0000001); - - let result = x.fixed_mul_floor(&env, &y, &denominator); - - assert_eq!(result, I256::from_i128(&env, -483_5313676)); - } - - #[test] - fn test_fixed_mul_floor_large_number() { - let env = Env::default(); - let x: I256 = I256::from_i128(&env, i128::MAX); - let y: I256 = I256::from_i128(&env, 10i128.pow(38)); - let denominator: I256 = I256::from_i128(&env, 10i128.pow(18)); - - let result = x.clone().fixed_mul_floor(&env, &y, &denominator); - - let expected_result = x.mul(&I256::from_i128(&env, 10i128.pow(20))); - assert_eq!(result, expected_result); - } - - #[test] - #[should_panic(expected = "attempt to multiply with overflow")] - fn test_fixed_mul_floor_phantom_overflow() { - let env = Env::default(); - let x: I256 = I256::from_i128(&env, i128::MAX); - // 256 bit max ~= 5.8e76, 128 bit max ~= 1.7e38, need to multiply by at least 10^39 - let y: I256 = I256::from_i128(&env, 10i128.pow(39)); - let denominator: I256 = I256::from_i128(&env, 10i128.pow(18)); - - x.fixed_mul_floor(&env, &y, &denominator); - } - - /********** fixed_mul_ceil **********/ - - #[test] - fn test_fixed_mul_ceil_rounds_up() { - let env = Env::default(); - let x: I256 = I256::from_i128(&env, 1_5391283); - let y: I256 = I256::from_i128(&env, 314_1592653); - let denominator: I256 = I256::from_i128(&env, 1_0000001); - - let result = x.fixed_mul_ceil(&env, &y, &denominator); - - assert_eq!(result, I256::from_i128(&env, 483_5313676)); - } - - #[test] - fn test_fixed_mul_ceil_negative_rounds_up() { - let env = Env::default(); - let x: I256 = I256::from_i128(&env, -1_5391283); - let y: I256 = I256::from_i128(&env, 314_1592653); - let denominator: I256 = I256::from_i128(&env, 1_0000001); - - let result = x.fixed_mul_ceil(&env, &y, &denominator); - - assert_eq!(result, I256::from_i128(&env, -483_5313675)); - } - - #[test] - fn test_fixed_mul_ceil_large_number() { - let env = Env::default(); - let x: I256 = I256::from_i128(&env, i128::MAX); - let y: I256 = I256::from_i128(&env, 10i128.pow(38)); - let denominator: I256 = I256::from_i128(&env, 10i128.pow(18)); - - let result = x.clone().fixed_mul_ceil(&env, &y, &denominator); - - let expected_result = x.mul(&I256::from_i128(&env, 10i128.pow(20))); - assert_eq!(result, expected_result); - } - - #[test] - #[should_panic(expected = "attempt to multiply with overflow")] - fn test_fixed_mul_ceil_phantom_overflow() { - let env = Env::default(); - let x: I256 = I256::from_i128(&env, i128::MAX); - // 256 bit max ~= 5.8e76, 128 bit max ~= 1.7e38, need to multiply by at least 10^39 - let y: I256 = I256::from_i128(&env, 10i128.pow(39)); - let denominator: I256 = I256::from_i128(&env, 10i128.pow(18)); - - x.fixed_mul_ceil(&env, &y, &denominator); - } - - /********** fixed_div_floor **********/ - - #[test] - fn test_fixed_div_floor_rounds_down() { - let env = Env::default(); - let x: I256 = I256::from_i128(&env, 314_1592653); - let y: I256 = I256::from_i128(&env, 1_5391280); - let denominator: I256 = I256::from_i128(&env, 1_0000000); - - let result = x.fixed_div_floor(&env, &y, &denominator); - - assert_eq!(result, I256::from_i128(&env, 204_1150997)); - } - - #[test] - fn test_fixed_div_floor_negative_rounds_down() { - let env = Env::default(); - let x: I256 = I256::from_i128(&env, 314_1592653); - let y: I256 = I256::from_i128(&env, -1_5391280); - let denominator: I256 = I256::from_i128(&env, 1_0000000); - - let result = x.fixed_div_floor(&env, &y, &denominator); - - assert_eq!(result, I256::from_i128(&env, -204_1150998)); - } - - #[test] - fn test_fixed_div_floor_large_number() { - let env = Env::default(); - let x: I256 = I256::from_i128(&env, i128::MAX); - let y: I256 = I256::from_i128(&env, 10i128.pow(27)); - let denominator: I256 = I256::from_i128(&env, 10i128.pow(38)); - - let result = x.clone().fixed_div_floor(&env, &y, &denominator); - - let expected_result = x.mul(&I256::from_i128(&env, 10i128.pow(11))); - assert_eq!(result, expected_result); - } - - #[test] - #[should_panic(expected = "attempt to multiply with overflow")] - fn test_fixed_div_floor_phantom_overflow() { - let env = Env::default(); - let x: I256 = I256::from_i128(&env, i128::MAX); - let y: I256 = I256::from_i128(&env, 10i128.pow(27)); - // 256 bit max ~= 5.8e76, 128 bit max ~= 1.7e38, need to multiply by at least 10^39 - let denominator: I256 = I256::from_i128(&env, 10i128.pow(39)); - - x.fixed_div_floor(&env, &y, &denominator); - } - - /********** fixed_div_ceil **********/ - - #[test] - fn test_fixed_div_ceil_rounds_down() { - let env = Env::default(); - let x: I256 = I256::from_i128(&env, 314_1592653); - let y: I256 = I256::from_i128(&env, 1_5391280); - let denominator: I256 = I256::from_i128(&env, 1_0000000); - - let result = x.fixed_div_ceil(&env, &y, &denominator); - - assert_eq!(result, I256::from_i128(&env, 204_1150998)); - } - - #[test] - fn test_fixed_div_ceil_negative_rounds_down() { - let env = Env::default(); - let x: I256 = I256::from_i128(&env, 314_1592653); - let y: I256 = I256::from_i128(&env, -1_5391280); - let denominator: I256 = I256::from_i128(&env, 1_0000000); - - let result = x.fixed_div_ceil(&env, &y, &denominator); - - assert_eq!(result, I256::from_i128(&env, -204_1150997)); - } - - #[test] - fn test_fixed_div_ceil_large_number() { - let env = Env::default(); - let x: I256 = I256::from_i128(&env, i128::MAX); - let y: I256 = I256::from_i128(&env, 10i128.pow(27)); - let denominator: I256 = I256::from_i128(&env, 10i128.pow(38)); - - let result = x.clone().fixed_div_ceil(&env, &y, &denominator); - - let expected_result = x.mul(&I256::from_i128(&env, 10i128.pow(11))); - assert_eq!(result, expected_result); - } - - #[test] - #[should_panic(expected = "attempt to multiply with overflow")] - fn test_fixed_div_ceil_phantom_overflow() { - let env = Env::default(); - let x: I256 = I256::from_i128(&env, i128::MAX); - let y: I256 = I256::from_i128(&env, 10i128.pow(27)); - // 256 bit max ~= 5.8e76, 128 bit max ~= 1.7e38, need to multiply by at least 10^39 - let denominator: I256 = I256::from_i128(&env, 10i128.pow(39)); - - x.fixed_div_ceil(&env, &y, &denominator); - } -} diff --git a/contracts/common/src/fixed/mod.rs b/contracts/common/src/fixed/mod.rs deleted file mode 100644 index b09c8329..00000000 --- a/contracts/common/src/fixed/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub mod fixed_point; -pub mod i128; -pub mod i256; -pub mod soroban_fixed_point; diff --git a/contracts/common/src/fixed/soroban_fixed_point.rs b/contracts/common/src/fixed/soroban_fixed_point.rs deleted file mode 100644 index 4df81b97..00000000 --- a/contracts/common/src/fixed/soroban_fixed_point.rs +++ /dev/null @@ -1,37 +0,0 @@ -use soroban_sdk::Env; - -// @dev - more detail about the forced panic can be found here: https://github.com/stellar/rs-soroban-env/pull/1091 -// -/// Soroban fixed point trait for computing fixed point calculations with Soroban host objects. -/// -/// Soroban host functions by default are non-recoverable. This means an arithmetic overflow or divide by zero will -/// result in a host panic instead of returning an error. For consistency, this trait will also panic in the same manner. -pub trait SorobanFixedPoint: Sized { - /// Safely calculates floor(x * y / denominator). - /// - /// ### Panics - /// This method will panic if the denominator is 0, a phantom overflow occurs, or - /// the result does not fit in Self. - fn fixed_mul_floor(&self, env: &Env, y: &Self, denominator: &Self) -> Self; - - /// Safely calculates ceil(x * y / denominator). - /// - /// ### Panics - /// This method will panic if the denominator is 0, a phantom overflow occurs, or - /// the result does not fit in Self. - fn fixed_mul_ceil(&self, env: &Env, y: &Self, denominator: &Self) -> Self; - - /// Safely calculates floor(x * denominator / y). - /// - /// ### Panics - /// This method will panic if the denominator is 0, a phantom overflow occurs, or - /// the result does not fit in Self. - fn fixed_div_floor(&self, env: &Env, y: &Self, denominator: &Self) -> Self; - - /// Safely calculates ceil(x * denominator / y). - /// - /// ### Panics - /// This method will panic if the denominator is 0, a phantom overflow occurs, or - /// the result does not fit in Self. - fn fixed_div_ceil(&self, env: &Env, y: &Self, denominator: &Self) -> Self; -} \ No newline at end of file From 96538cedae764950816bac5aa64dc7fbec4c1e88 Mon Sep 17 00:00:00 2001 From: Artur Abliazimov Date: Fri, 26 Sep 2025 15:10:21 +0300 Subject: [PATCH 03/11] Fix clippy issues --- contracts/pool/src/methods/deposit.rs | 2 +- contracts/pool/src/types/price_provider.rs | 2 +- mocks/flash-loan-receiver-mock/src/lib.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/pool/src/methods/deposit.rs b/contracts/pool/src/methods/deposit.rs index a0cd59c5..4a1f5a04 100644 --- a/contracts/pool/src/methods/deposit.rs +++ b/contracts/pool/src/methods/deposit.rs @@ -136,7 +136,7 @@ fn do_deposit_fungible( fn do_deposit_rwa(env: &Env, who: &Address, asset: &Address, amount: i128) -> Result { let balance_before = read_token_balance(env, asset, who); - token::Client::new(env, asset).transfer(who, &env.current_contract_address(), &amount); + token::Client::new(env, asset).transfer(who, env.current_contract_address(), &amount); let balance_after = balance_before .checked_add(amount) .ok_or(Error::MathOverflowError)?; diff --git a/contracts/pool/src/types/price_provider.rs b/contracts/pool/src/types/price_provider.rs index de385f05..523c7479 100644 --- a/contracts/pool/src/types/price_provider.rs +++ b/contracts/pool/src/types/price_provider.rs @@ -248,7 +248,7 @@ impl<'a> PriceProvider<'a> { let index = prices_len / 2; - let median_price = if prices_len % 2 == 0 { + let median_price = if prices_len.is_multiple_of(2) { let price_1 = prices.get_unchecked(index - 1); let price_2 = prices.get_unchecked(index); diff --git a/mocks/flash-loan-receiver-mock/src/lib.rs b/mocks/flash-loan-receiver-mock/src/lib.rs index 679aca30..99726ef5 100644 --- a/mocks/flash-loan-receiver-mock/src/lib.rs +++ b/mocks/flash-loan-receiver-mock/src/lib.rs @@ -34,7 +34,7 @@ impl FlashLoanReceiverTrait for FlashLoanReceiver { let token_client = token::Client::new(&env, &asset.asset); - token_client.transfer(&initiator, &env.current_contract_address(), &asset.premium); + token_client.transfer(&initiator, env.current_contract_address(), &asset.premium); token_client.approve( &env.current_contract_address(), From bcd8ebff1ab1f389fc271dbc65a35333b48f7e84 Mon Sep 17 00:00:00 2001 From: Artur Abliazimov Date: Fri, 26 Sep 2025 18:27:23 +0300 Subject: [PATCH 04/11] Start fixing integration tests --- README.md | 2 +- .../tests/snapshots/budget_utilization.snap | 56 +- integration-tests/package.json | 29 +- integration-tests/tests/pool.sut.ts | 40 +- .../tests/pool/7.liquidate.budget.spec.ts | 2 +- integration-tests/tests/soroban.client.ts | 32 +- integration-tests/tests/soroban.config.ts | 2 +- integration-tests/tests/soroban.converter.ts | 2 +- integration-tests/yarn.lock | 1036 ++++++++++------- 9 files changed, 666 insertions(+), 535 deletions(-) diff --git a/README.md b/README.md index 4cab20ca..a610fde5 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ make test To run the tests you need to install **soroban-cli** version 20.0.2 ```shell -cargo install --locked --version 20.1.1 soroban-cli --features opt +cargo install --locked stellar-cli@23.1.3 --features opt ``` Run a local standalone (or Futurenet) network with the following command: diff --git a/contracts/pool/src/tests/snapshots/budget_utilization.snap b/contracts/pool/src/tests/snapshots/budget_utilization.snap index 95c74d8f..7d460587 100644 --- a/contracts/pool/src/tests/snapshots/budget_utilization.snap +++ b/contracts/pool/src/tests/snapshots/budget_utilization.snap @@ -1,59 +1,59 @@ ['pool::tests::budget::account_position'] = { - "cpu_cost": 4479451, + "cpu_cost": 4476827, "memory_cost": 4117146, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::borrow'] = { - "cpu_cost": 7173017, + "cpu_cost": 7169913, "memory_cost": 6859780, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::collat_coeff'] = { - "cpu_cost": 1623930, + "cpu_cost": 1623018, "memory_cost": 1434496, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::configure_as_collateral'] = { - "cpu_cost": 2166598, + "cpu_cost": 2169574, "memory_cost": 1551597, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::debt_coeff'] = { - "cpu_cost": 1303504, + "cpu_cost": 1302976, "memory_cost": 1380365, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::deposit'] = { - "cpu_cost": 3678023, + "cpu_cost": 3676175, "memory_cost": 2924951, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::enable_borrowing_on_reserve'] = { - "cpu_cost": 1587331, + "cpu_cost": 1588771, "memory_cost": 1453137, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::flash_loan_with_borrow'] = { - "cpu_cost": 15124708, + "cpu_cost": 15132652, "memory_cost": 16202476, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::flash_loan_without_borrow'] = { - "cpu_cost": 7591704, + "cpu_cost": 7596216, "memory_cost": 7144825, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::get_reserve'] = { - "cpu_cost": 1123896, + "cpu_cost": 1124568, "memory_cost": 1343718, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, @@ -65,61 +65,61 @@ "memory_limit_exceeded": false, } ['pool::tests::budget::liquidate_receive_underlying_when_borrower_has_one_debt'] = { - "cpu_cost": 9189783, + "cpu_cost": 9186247, "memory_cost": 7138407, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::liquidate_receive_underlying_when_borrower_has_two_debts'] = { - "cpu_cost": 9484316, + "cpu_cost": 9481212, "memory_cost": 7136171, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::pause_info'] = { - "cpu_cost": 1071019, + "cpu_cost": 1071691, "memory_cost": 1342113, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::price_feed'] = { - "cpu_cost": 1084136, + "cpu_cost": 1084808, "memory_cost": 1342371, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::repay_full'] = { - "cpu_cost": 5987855, + "cpu_cost": 5985031, "memory_cost": 4420457, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::repay_partial'] = { - "cpu_cost": 6920878, + "cpu_cost": 6917678, "memory_cost": 5678774, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::s_token_transfer'] = { - "cpu_cost": 5314677, + "cpu_cost": 5319589, "memory_cost": 5430156, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::set_as_collateral'] = { - "cpu_cost": 3989646, + "cpu_cost": 3987598, "memory_cost": 4063447, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::set_pause'] = { - "cpu_cost": 1524447, + "cpu_cost": 1525887, "memory_cost": 1450915, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::set_pool_configuration'] = { - "cpu_cost": 1691234, + "cpu_cost": 1693058, "memory_cost": 1477818, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, @@ -131,49 +131,49 @@ "memory_limit_exceeded": false, } ['pool::tests::budget::set_reserve_status'] = { - "cpu_cost": 1585889, + "cpu_cost": 1587329, "memory_cost": 1453142, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::stoken_underlying_balance'] = { - "cpu_cost": 820117, + "cpu_cost": 819973, "memory_cost": 1300655, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::upgrade'] = { - "cpu_cost": 1301483, + "cpu_cost": 1301147, "memory_cost": 1404488, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::upgrade_debt_token'] = { - "cpu_cost": 1689093, + "cpu_cost": 1689621, "memory_cost": 2600588, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::upgrade_s_token'] = { - "cpu_cost": 1731108, + "cpu_cost": 1730724, "memory_cost": 2607287, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::user_configuration'] = { - "cpu_cost": 826947, + "cpu_cost": 827235, "memory_cost": 1303753, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::withdraw_full'] = { - "cpu_cost": 6570455, + "cpu_cost": 6567639, "memory_cost": 5566723, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::withdraw_partial'] = { - "cpu_cost": 6392907, + "cpu_cost": 6389899, "memory_cost": 5581247, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, diff --git a/integration-tests/package.json b/integration-tests/package.json index 47365dcf..5de92027 100644 --- a/integration-tests/package.json +++ b/integration-tests/package.json @@ -13,20 +13,19 @@ "author": "EQ LAB", "license": "ISC", "devDependencies": { - "@types/chai": "^4.3.5", - "@types/chai-as-promised": "^7.1.6", - "@types/mocha": "^10.0.1", - "@types/node": "^20.4.1", - "@stellar/stellar-sdk": "12.0.1", - "stellar-sdk": "12.0.1", - "bigint-conversion": "^2.4.1", - "bignumber.js": "^9.1.1", - "chai": "^4.3.7", - "chai-as-promised": "^7.1.1", - "cross-env": "^7.0.3", - "dotenv": "^16.3.1", - "mocha": "^10.2.0", - "ts-node": "^10.9.1", - "typescript": "^5.1.6" + "@types/chai": "^5.2.2", + "@types/chai-as-promised": "^8.0.2", + "@types/mocha": "^10.0.10", + "@types/node": "^24.5.2", + "@stellar/stellar-sdk": "14.2.0", + "bigint-conversion": "^2.4.3", + "bignumber.js": "^9.3.1", + "chai": "^6.0.1", + "chai-as-promised": "^8.0.2", + "cross-env": "^10.0.0", + "dotenv": "^17.2.2", + "mocha": "^11.7.2", + "ts-node": "^10.9.2", + "typescript": "^5.9.2" } } \ No newline at end of file diff --git a/integration-tests/tests/pool.sut.ts b/integration-tests/tests/pool.sut.ts index 3e24477d..ba838a68 100644 --- a/integration-tests/tests/pool.sut.ts +++ b/integration-tests/tests/pool.sut.ts @@ -1,4 +1,4 @@ -import { Keypair, xdr } from "stellar-sdk"; +import { Keypair, xdr } from "@stellar/stellar-sdk"; import { SendTransactionResult, SorobanClient } from "./soroban.client"; import { adminKeys, contractsFilename, setEnv, treasuryKeys } from "./soroban.config"; import { @@ -211,7 +211,7 @@ export async function releaseInit(client: SorobanClient): Promise { await initPoolPriceFeed(client, [ { asset: "XLM", - asset_decimals: +process.env['XLM_DECIMALS'] ?? 7, + asset_decimals: +(process.env['XLM_DECIMALS'] ?? 7), max_sanity_price_in_base: BigInt(+process.env['XLM_MAX_SANITY_PRICE_IN_BASE']), min_sanity_price_in_base: BigInt(+process.env['XLM_MIN_SANITY_PRICE_IN_BASE']), priceFeedConfig: { @@ -226,7 +226,7 @@ export async function releaseInit(client: SorobanClient): Promise { }, { asset: "XRP", - asset_decimals: +process.env['XRP_DECIMALS'] ?? 7, + asset_decimals: +(process.env['XRP_DECIMALS'] ?? 7), max_sanity_price_in_base: BigInt(+process.env['XRP_MAX_SANITY_PRICE_IN_BASE']), min_sanity_price_in_base: BigInt(+process.env['XRP_MIN_SANITY_PRICE_IN_BASE']), priceFeedConfig: { @@ -241,7 +241,7 @@ export async function releaseInit(client: SorobanClient): Promise { }, { asset: "USDC", - asset_decimals: +process.env['USDC_DECIMALS'] ?? 7, + asset_decimals: +(process.env['USDC_DECIMALS'] ?? 7), max_sanity_price_in_base: BigInt(+process.env['USDC_MAX_SANITY_PRICE_IN_BASE']), min_sanity_price_in_base: BigInt(+process.env['USDC_MIN_SANITY_PRICE_IN_BASE']), priceFeedConfig: { @@ -690,12 +690,12 @@ export function writeBudgetSnapshot( `${JSON.stringify( { [label]: { - cost: transactionResult.simulation.cost, + cost: transactionResult.simulation["cost"], events: transactionResult.simulation.events.reduce( (acc, e) => acc + e.event().toXDR().length, 0 ), - readBytes: resources.readBytes(), + readBytes: resources.diskReadBytes(), writeBytes: resources.writeBytes(), ledgerReads: resources.footprint().readOnly().length, ledgerWrites: resources.footprint().readWrite().length, @@ -843,19 +843,19 @@ async function initPool( convertToScvAddress(adminKeys.publicKey()), convertToScvMap({ base_asset_address: convertToScvAddress(process.env[`SLENDER_TOKEN_${process.env[`BASE_ASSET`] ?? 'XLM'}`]), - base_asset_decimals: convertToScvU32(+process.env['BASE_ASSET_DECIMALS'] ?? 7), - flash_loan_fee: convertToScvU32(+process.env['FLASH_LOAN_FEE_BPS'] ?? 5), - grace_period: convertToScvU64(+process.env['GRACE_PERIOD_SEC'] ?? 1), - initial_health: convertToScvU32(+process.env['INITIAL_HEALTH_BPS'] ?? 2_500), - ir_alpha: convertToScvU32(+process.env['IR_ALPHA'] ?? 143), - ir_initial_rate: convertToScvU32(+process.env['IR_INITIAL_RATE_BPS'] ?? 200), - ir_max_rate: convertToScvU32(+process.env['IR_MAX_RATE_BPS'] ?? 50_000), - ir_scaling_coeff: convertToScvU32(+process.env['IR_SCALING_COEFF_BPS'] ?? 9_000), - liquidation_protocol_fee: convertToScvU32(+process.env['LIQUIDATION_PROTOCOL_FEE_BPS'] ?? 0), + base_asset_decimals: convertToScvU32(+(process.env['BASE_ASSET_DECIMALS'] ?? 7)), + flash_loan_fee: convertToScvU32(+(process.env['FLASH_LOAN_FEE_BPS'] ?? 5)), + grace_period: convertToScvU64(+(process.env['GRACE_PERIOD_SEC'] ?? 1)), + initial_health: convertToScvU32(+(process.env['INITIAL_HEALTH_BPS'] ?? 2_500)), + ir_alpha: convertToScvU32(+(process.env['IR_ALPHA'] ?? 143)), + ir_initial_rate: convertToScvU32(+(process.env['IR_INITIAL_RATE_BPS'] ?? 200)), + ir_max_rate: convertToScvU32(+(process.env['IR_MAX_RATE_BPS'] ?? 50_000)), + ir_scaling_coeff: convertToScvU32(+(process.env['IR_SCALING_COEFF_BPS'] ?? 9_000)), + liquidation_protocol_fee: convertToScvU32(+(process.env['LIQUIDATION_PROTOCOL_FEE_BPS'] ?? 0)), min_collat_amount: convertToScvI128(process.env['MIN_COLLAT_AMOUNT_IN_BASE'] ? BigInt(process.env['MIN_COLLAT_AMOUNT_IN_BASE']) : 1n), min_debt_amount: convertToScvI128(process.env['MIN_DEBT_AMOUNT_IN_BASE'] ? BigInt(process.env['MIN_DEBT_AMOUNT_IN_BASE']) : 1n), - timestamp_window: convertToScvU64(+process.env['TIMESTAMP_WINDOW_SEC'] ?? 20), - user_assets_limit: convertToScvU32(+process.env['USER_ASSET_LIMIT'] ?? 4), + timestamp_window: convertToScvU64(+(process.env['TIMESTAMP_WINDOW_SEC'] ?? 20)), + user_assets_limit: convertToScvU32(+(process.env['USER_ASSET_LIMIT'] ?? 4)), }) ), (result) => result[0] @@ -896,10 +896,10 @@ async function initPoolCollateral( convertToScvAddress(process.env[`SLENDER_TOKEN_${asset}`]), convertToScvMap({ // todo: trim to short string - discount: convertToScvU32(+process.env[`${asset}_DISCOUNT_BPS`] ?? 6000), + discount: convertToScvU32(+(process.env[`${asset}_DISCOUNT_BPS`] ?? 6000)), liq_cap: convertToScvI128(process.env[`${asset}_LIQUIDITY_CAP`] ? BigInt(process.env[`${asset}_LIQUIDITY_CAP`]) : 1000000000000000n), - pen_order: convertToScvU32(+process.env[`${asset}_PENALTY_ORDER`] ?? order), - util_cap: convertToScvU32(+process.env[`${asset}_UTILIZATION_CAP`] ?? 9000), + pen_order: convertToScvU32(+(process.env[`${asset}_PENALTY_ORDER`] ?? order)), + util_cap: convertToScvU32(+(process.env[`${asset}_UTILIZATION_CAP`] ?? 9000)), }) ) ); diff --git a/integration-tests/tests/pool/7.liquidate.budget.spec.ts b/integration-tests/tests/pool/7.liquidate.budget.spec.ts index 256cd303..71ee5245 100644 --- a/integration-tests/tests/pool/7.liquidate.budget.spec.ts +++ b/integration-tests/tests/pool/7.liquidate.budget.spec.ts @@ -1,4 +1,4 @@ -import { Keypair, xdr } from "stellar-sdk"; +import { Keypair, xdr } from "@stellar/stellar-sdk"; import { I128_MAX, accountPosition, diff --git a/integration-tests/tests/soroban.client.ts b/integration-tests/tests/soroban.client.ts index d29bc4b2..91984949 100644 --- a/integration-tests/tests/soroban.client.ts +++ b/integration-tests/tests/soroban.client.ts @@ -1,15 +1,15 @@ -import { Contract, TimeoutInfinite, TransactionBuilder, Keypair, xdr, SorobanRpc, BASE_FEE } from "stellar-sdk"; +import { Contract, TimeoutInfinite, TransactionBuilder, Keypair, rpc, xdr, BASE_FEE } from "@stellar/stellar-sdk"; import { promisify } from "util"; import "./soroban.config"; import { adminKeys } from "./soroban.config"; export class SendTransactionResult { - response: SorobanRpc.Api.GetTransactionResponse; - simulation?: SorobanRpc.Api.SimulateTransactionSuccessResponse + response: rpc.Api.GetTransactionResponse; + simulation?: rpc.Api.SimulateTransactionSuccessResponse constructor( - response: SorobanRpc.Api.GetTransactionResponse, - simulation?: SorobanRpc.Api.SimulateTransactionSuccessResponse + response: rpc.Api.GetTransactionResponse, + simulation?: rpc.Api.SimulateTransactionSuccessResponse ) { this.response = response; this.simulation = simulation; @@ -17,10 +17,10 @@ export class SendTransactionResult { } export class SorobanClient { - client: SorobanRpc.Server; + client: rpc.Server; constructor() { - this.client = new SorobanRpc.Server(process.env.SOROBAN_RPC_URL, { + this.client = new rpc.Server(process.env.SOROBAN_RPC_URL, { allowHttp: true }); this.client.getHealth(); @@ -49,21 +49,21 @@ export class SorobanClient { .setTimeout(TimeoutInfinite) .build(); - const simulated = await this.client.simulateTransaction(operation) as SorobanRpc.Api.SimulateTransactionSuccessResponse; + const simulated = await this.client.simulateTransaction(operation) as rpc.Api.SimulateTransactionSuccessResponse; - if (SorobanRpc.Api.isSimulationError(simulated)) { + if (rpc.Api.isSimulationError(simulated)) { throw new Error(simulated.error); } else if (!simulated.result) { throw new Error(`Invalid simulation: no result in ${simulated}`); } - const transaction = SorobanRpc.assembleTransaction(operation, simulated).build() + const transaction = rpc.assembleTransaction(operation, simulated).build() transaction.sign(signer); const response = await this.client.sendTransaction(transaction); - let result: SorobanRpc.Api.GetTransactionResponse; + let result: rpc.Api.GetTransactionResponse; let attempts = 15; if (response.status == "ERROR") { @@ -74,15 +74,15 @@ export class SorobanClient { await delay(1000); result = await this.client.getTransaction(response.hash); attempts--; - } while (result.status === SorobanRpc.Api.GetTransactionStatus.NOT_FOUND && attempts > 0); + } while (result.status === rpc.Api.GetTransactionStatus.NOT_FOUND && attempts > 0); - if (result.status == SorobanRpc.Api.GetTransactionStatus.NOT_FOUND) { + if (result.status == rpc.Api.GetTransactionStatus.NOT_FOUND) { throw Error("Submitted transaction was not found"); } if ("resultXdr" in result) { - const getResult = result as SorobanRpc.Api.GetTransactionResponse; - if (getResult.status !== SorobanRpc.Api.GetTransactionStatus.SUCCESS) { + const getResult = result as rpc.Api.GetTransactionResponse; + if (getResult.status !== rpc.Api.GetTransactionStatus.SUCCESS) { throw new Error('Transaction result is insuccessfull'); } @@ -121,7 +121,7 @@ export class SorobanClient { const simulated = await this.client.simulateTransaction(operation); - if (SorobanRpc.Api.isSimulationError(simulated)) { + if (rpc.Api.isSimulationError(simulated)) { throw new Error(simulated.error); } else if (!simulated.result) { throw new Error(`invalid simulation: no result in ${simulated}`); diff --git a/integration-tests/tests/soroban.config.ts b/integration-tests/tests/soroban.config.ts index 270c4793..2ffcd348 100644 --- a/integration-tests/tests/soroban.config.ts +++ b/integration-tests/tests/soroban.config.ts @@ -1,5 +1,5 @@ import { readFileSync, writeFileSync } from "fs"; -import { Keypair } from "stellar-sdk"; +import { Keypair } from "@stellar/stellar-sdk"; export const contractsFilename = `../deploy/artifacts/${process.env.NODE_ENV}/.contracts`; diff --git a/integration-tests/tests/soroban.converter.ts b/integration-tests/tests/soroban.converter.ts index 2e90e0cf..2fff150b 100644 --- a/integration-tests/tests/soroban.converter.ts +++ b/integration-tests/tests/soroban.converter.ts @@ -1,4 +1,4 @@ -import { Address, xdr } from 'stellar-sdk'; +import { Address, xdr } from '@stellar/stellar-sdk'; import { Buffer } from "node:buffer"; import { bufToBigint } from 'bigint-conversion'; diff --git a/integration-tests/yarn.lock b/integration-tests/yarn.lock index c807e624..696b1390 100644 --- a/integration-tests/yarn.lock +++ b/integration-tests/yarn.lock @@ -9,15 +9,32 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@epic-web/invariant@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@epic-web/invariant/-/invariant-1.0.0.tgz#1073e5dee6dd540410784990eb73e4acd25c9813" + integrity sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@jridgewell/resolve-uri@^3.0.3": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + version "1.5.5" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" @@ -28,46 +45,62 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@juanelas/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@juanelas/base64/-/base64-1.1.2.tgz#968ff0f9c48adcfa79a0802385d56a2a661cb6cd" - integrity sha512-mr2pfRQpWap0Uq4tlrCgp3W+Yjx1/Bpq4QJsYeAQUh1mExgyQvXz7xUhmYT2HcLLspuAL5dpnos8P2QhaCSXsQ== + version "1.1.5" + resolved "https://registry.yarnpkg.com/@juanelas/base64/-/base64-1.1.5.tgz#d43b3c78e32e609d9b17a15e4f1b6342c9ca1238" + integrity sha512-mjAF27LzwfYobdwqnxZgeucbKT5wRRNvILg3h5OvCWK+3F7mw/A1tnjHnNiTYtLmTvT/bM1jA5AX7eQawDGs1w== + +"@noble/curves@^1.9.6": + version "1.9.7" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.9.7.tgz#79d04b4758a43e4bca2cbdc62e7771352fa6b951" + integrity sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw== + dependencies: + "@noble/hashes" "1.8.0" -"@stellar/js-xdr@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@stellar/js-xdr/-/js-xdr-3.1.1.tgz#be0ff90c8a861d6e1101bca130fa20e74d5599bb" - integrity sha512-3gnPjAz78htgqsNEDkEsKHKosV2BF2iZkoHCNxpmZwUxiPsw+2VaXMed8RRMe0rGk3d5GZe7RrSba8zV80J3Ag== +"@noble/hashes@1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a" + integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@stellar/js-xdr@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@stellar/js-xdr/-/js-xdr-3.1.2.tgz#db7611135cf21e989602fd72f513c3bed621bc74" + integrity sha512-VVolPL5goVEIsvuGqDc5uiKxV03lzfWdvYg1KikvwheDmTBO68CKDji3bAZ/kppZrx5iTA8z3Ld5yuytcvhvOQ== -"@stellar/stellar-base@^12.0.0": - version "12.0.0" - resolved "https://registry.yarnpkg.com/@stellar/stellar-base/-/stellar-base-12.0.0.tgz#d46e2a45b756c3e5b4b8f82f224fcc467dac3ade" - integrity sha512-uGpahDFFXbE39myOmBnEZSjVys4yUkQ/ASNuYENGyS8MNdfA0TS7DPWkiO6t17P+rW+FRV1zmumJtjRHwxxMdw== +"@stellar/stellar-base@^14.0.1": + version "14.0.1" + resolved "https://registry.yarnpkg.com/@stellar/stellar-base/-/stellar-base-14.0.1.tgz#a1286a44da50ce903e6df8f4ab3a27df42212b49" + integrity sha512-mI6Kjh9hGWDA1APawQTtCbR7702dNT/8Te1uuRFPqqdoAKBk3WpXOQI3ZSZO+5olW7BSHpmVG5KBPZpIpQxIvw== dependencies: - "@stellar/js-xdr" "^3.1.1" + "@noble/curves" "^1.9.6" + "@stellar/js-xdr" "^3.1.2" base32.js "^0.1.0" - bignumber.js "^9.1.2" + bignumber.js "^9.3.1" buffer "^6.0.3" - sha.js "^2.3.6" - tweetnacl "^1.0.3" - optionalDependencies: - sodium-native "^4.1.1" + sha.js "^2.4.12" -"@stellar/stellar-sdk@12.0.1": - version "12.0.1" - resolved "https://registry.yarnpkg.com/@stellar/stellar-sdk/-/stellar-sdk-12.0.1.tgz#0ded98bdd606cc2dc491ba6095a30530d690380d" - integrity sha512-0+YXUTS2LpZ+Of383hSYVpsRl9BJ3X9lHcj05ouS3VkVL9BH7w+Par8RHPkiHS6lLYn3gWRgaJauTebkamY/Jw== +"@stellar/stellar-sdk@14.2.0": + version "14.2.0" + resolved "https://registry.yarnpkg.com/@stellar/stellar-sdk/-/stellar-sdk-14.2.0.tgz#fb58f43e7b7cd33fd5bb31546be67c2cf6a1120b" + integrity sha512-7nh2ogzLRMhfkIC0fGjn1LHUzk3jqVw8tjAuTt5ADWfL9CSGBL18ILucE9igz2L/RU2AZgeAvhujAnW91Ut/oQ== dependencies: - "@stellar/stellar-base" "^12.0.0" - axios "^1.7.2" - bignumber.js "^9.1.2" + "@stellar/stellar-base" "^14.0.1" + axios "^1.12.2" + bignumber.js "^9.3.1" eventsource "^2.0.2" + feaxios "^0.0.23" randombytes "^2.1.0" toml "^3.0.0" urijs "^1.19.1" "@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== "@tsconfig/node12@^1.0.7": version "1.0.11" @@ -84,53 +117,59 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== -"@types/chai-as-promised@^7.1.6": - version "7.1.6" - resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.6.tgz#3b08cbe1e7206567a480dc6538bade374b19e4e1" - integrity sha512-cQLhk8fFarRVZAXUQV1xEnZgMoPxqKojBvRkqPCKPQCzEhpbbSKl1Uu75kDng7k5Ln6LQLUmNBjLlFthCgm1NA== +"@types/chai-as-promised@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-8.0.2.tgz#5ac957d346fec5b686b62606baa5704787669704" + integrity sha512-meQ1wDr1K5KRCSvG2lX7n7/5wf70BeptTKst0axGvnN6zqaVpRqegoIbugiAPSqOW9K9aL8gDVrm7a2LXOtn2Q== dependencies: "@types/chai" "*" -"@types/chai@*": - version "4.3.6" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.6.tgz#7b489e8baf393d5dd1266fb203ddd4ea941259e6" - integrity sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw== - -"@types/chai@^4.3.5": - version "4.3.5" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.5.tgz#ae69bcbb1bebb68c4ac0b11e9d8ed04526b3562b" - integrity sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng== - -"@types/mocha@^10.0.1": - version "10.0.1" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.1.tgz#2f4f65bb08bc368ac39c96da7b2f09140b26851b" - integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q== +"@types/chai@*", "@types/chai@^5.2.2": + version "5.2.2" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.2.tgz#6f14cea18180ffc4416bc0fd12be05fdd73bdd6b" + integrity sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg== + dependencies: + "@types/deep-eql" "*" -"@types/node@^20.4.1": - version "20.4.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.9.tgz#c7164e0f8d3f12dfae336af0b1f7fdec8c6b204f" - integrity sha512-8e2HYcg7ohnTUbHk8focoklEQYvemQmu9M/f43DZVx43kHn0tE3BY/6gSDxS7k0SprtS0NHvj+L80cGLnoOUcQ== +"@types/deep-eql@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" + integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== + +"@types/mocha@^10.0.10": + version "10.0.10" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.10.tgz#91f62905e8d23cbd66225312f239454a23bebfa0" + integrity sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q== + +"@types/node@^24.5.2": + version "24.5.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-24.5.2.tgz#52ceb83f50fe0fcfdfbd2a9fab6db2e9e7ef6446" + integrity sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ== + dependencies: + undici-types "~7.12.0" acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.4.1: - version "8.10.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + version "8.3.4" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + dependencies: + acorn "^8.11.0" -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== +acorn@^8.11.0, acorn@^8.4.1: + version "8.15.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" + integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== + ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -138,13 +177,10 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" +ansi-styles@^6.1.0: + version "6.2.3" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" + integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== arg@^4.1.0: version "4.1.3" @@ -156,23 +192,25 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -axios@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.2.tgz#b625db8a7051fbea61c35a3cbb3a1daa7b9c7621" - integrity sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +axios@^1.12.2: + version "1.12.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.12.2.tgz#6c307390136cf7a2278d09cec63b136dfc6e6da7" + integrity sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw== dependencies: follow-redirects "^1.15.6" - form-data "^4.0.0" + form-data "^4.0.4" proxy-from-env "^1.1.0" balanced-match@^1.0.0: @@ -190,51 +228,26 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -bigint-conversion@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/bigint-conversion/-/bigint-conversion-2.4.1.tgz#b473c39edbba9f62922908b37fd3461bec3bc9cb" - integrity sha512-/DTRevseMZoqN4KLkN5BryOiom0KbwYajiXG5Vo+ZcEPAO0WBZyZoYyDZSgfeq/v/oegLo9bjdndDBlExvAhBQ== +bigint-conversion@^2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/bigint-conversion/-/bigint-conversion-2.4.3.tgz#cca2ff59033960be8ff517b8e931db82b6bb24fa" + integrity sha512-eM76IXlhXQD6HAoE6A7QLQ3jdC04EJdjH3zrlU1Jtt4/jj+O/pMGjGR5FY8/55FOIBsK25kly0RoG4GA4iKdvg== dependencies: "@juanelas/base64" "^1.1.2" -bignumber.js@^9.1.1: - version "9.1.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" - integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== - -bignumber.js@^9.1.2: - version "9.1.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" - integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" +bignumber.js@^9.3.1: + version "9.3.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.3.1.tgz#759c5aaddf2ffdc4f154f7b493e1c8770f88c4d7" + integrity sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ== brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + version "2.0.2" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" + integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== dependencies: balanced-match "^1.0.0" -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-stdout@1.3.1: +browser-stdout@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== @@ -247,30 +260,48 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + camelcase@^6.0.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -chai-as-promised@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" - integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== +chai-as-promised@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-8.0.2.tgz#cd9b77afaa976383eb4cbef9463ac5230f7a1cba" + integrity sha512-1GadL+sEJVLzDjcawPM4kjfnL+p/9vrxiEUonowKOAzvVg0PixJUdtuDzdkDeQhK3zfOE76GqGkZIQ7/Adcrqw== dependencies: - check-error "^1.0.2" + check-error "^2.1.1" -chai@^4.3.7: - version "4.3.7" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" - integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^4.1.2" - get-func-name "^2.0.0" - loupe "^2.3.1" - pathval "^1.1.1" - type-detect "^4.0.5" +chai@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/chai/-/chai-6.0.1.tgz#88c2b4682fb56050647e222d2cf9d6772f2607b3" + integrity sha512-/JOoU2//6p5vCXh00FpNgtlw0LjvhGttaWc+y7wpW9yjBm3ys0dI8tSKZxIOgNruz5J0RleccatSIC3uxEZP0g== chalk@^4.1.0: version "4.1.2" @@ -280,33 +311,25 @@ chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== - -chokidar@3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" +check-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" + integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== + +chokidar@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" - strip-ansi "^6.0.0" + strip-ansi "^6.0.1" wrap-ansi "^7.0.0" color-convert@^2.0.1: @@ -328,82 +351,126 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -cross-env@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" - integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== +cross-env@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-10.0.0.tgz#ba25823cfa1ed6af293dcded8796fa16cd162456" + integrity sha512-aU8qlEK/nHYtVuN4p7UQgAwVljzMg8hB4YK5ThRqD2l/ziSnryncPNn7bMLt5cFYsKVKBh8HqLqyCoTupEUu7Q== dependencies: - cross-spawn "^7.0.1" + "@epic-web/invariant" "^1.0.0" + cross-spawn "^7.0.6" -cross-spawn@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== +cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" -debug@4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@^4.3.5: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: - ms "2.1.2" + ms "^2.1.3" decamelize@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== -deep-eql@^4.1.2: - version "4.1.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" - integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== +define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: - type-detect "^4.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -dotenv@^16.3.1: - version "16.3.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" - integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== +diff@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a" + integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== + +dotenv@^17.2.2: + version "17.2.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.2.2.tgz#4010cfe1c2be4fc0f46fd3d951afb424bc067ac6" + integrity sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q== + +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== -escape-string-regexp@4.0.0: +escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== @@ -413,14 +480,14 @@ eventsource@^2.0.2: resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-2.0.2.tgz#76dfcc02930fb2ff339520b6d290da573a9e8508" integrity sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA== -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +feaxios@^0.0.23: + version "0.0.23" + resolved "https://registry.yarnpkg.com/feaxios/-/feaxios-0.0.23.tgz#76f37a2666232377ce75354e46dd85cbceeb1758" + integrity sha512-eghR0A21fvbkcQBgZuMfQhrXxJzC0GNUGC9fXhBge33D+mFDTwl0aJ35zoQQn575BhyjQitRc5N4f+L4cP708g== dependencies: - to-regex-range "^5.0.1" + is-retry-allowed "^3.0.0" -find-up@5.0.0: +find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== @@ -434,64 +501,119 @@ flat@^5.0.2: integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== follow-redirects@^1.15.6: - version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + version "1.15.11" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" + integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== + +for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== + dependencies: + is-callable "^1.2.7" -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== +foreground-child@^3.1.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" + integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== + dependencies: + cross-spawn "^7.0.6" + signal-exit "^4.0.1" + +form-data@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4" + integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + hasown "^2.0.2" mime-types "^2.1.12" -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== - -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== +get-intrinsic@^1.2.4, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: - is-glob "^4.0.1" + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" -glob@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== +glob@^10.4.5: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -he@1.2.0: +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -501,64 +623,63 @@ ieee754@^1.2.1: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1: +inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - is-plain-obj@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== +is-retry-allowed@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-3.0.0.tgz#ea79389fd350d156823c491bee9c69f485b1445c" + integrity sha512-9xH0xvoggby+u0uGF7cZXdrutWiBiaFG8ZT4YFPXL8NzkyAwX3AKGLeFQLvzDpM430+nDFBZ1LHkie/8ocL06A== + +is-typed-array@^1.1.14: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== + dependencies: + which-typed-array "^1.1.16" + is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -js-yaml@4.1.0: +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== @@ -572,7 +693,7 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -log-symbols@4.1.0: +log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -580,18 +701,21 @@ log-symbols@4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" -loupe@^2.3.1: - version "2.3.6" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" - integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== - dependencies: - get-func-name "^2.0.0" +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" @@ -604,79 +728,49 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" -minimatch@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" - integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== +minimatch@^9.0.4, minimatch@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" -minimatch@^3.0.4: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -mocha@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" - integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== - dependencies: - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.4" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.2.0" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "5.0.1" - ms "2.1.3" - nanoid "3.3.3" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - workerpool "6.2.1" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3: +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +mocha@^11.7.2: + version "11.7.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.7.2.tgz#3c0079fe5cc2f8ea86d99124debcc42bb1ab22b5" + integrity sha512-lkqVJPmqqG/w5jmmFtiRvtA2jkDyNVUcefFJKb2uyX4dekk8Okgqop3cgbFiaIvj8uCRJVTP5x9dfxGyXm2jvQ== + dependencies: + browser-stdout "^1.3.1" + chokidar "^4.0.1" + debug "^4.3.5" + diff "^7.0.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^10.4.5" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^9.0.5" + ms "^2.1.3" + picocolors "^1.1.1" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^9.2.0" + yargs "^17.7.2" + yargs-parser "^21.1.1" + yargs-unparser "^2.0.0" + +ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanoid@3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" - integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== - -node-gyp-build@^4.8.0: - version "4.8.1" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz#976d3ad905e71b76086f4f0b0d3637fe79b6cda5" - integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -691,30 +785,38 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -pathval@^1.1.1: +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +picocolors@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +possible-typed-array-names@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== proxy-from-env@^1.1.0: version "1.1.0" @@ -728,37 +830,48 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" +readdirp@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -safe-buffer@^5.0.1, safe-buffer@^5.1.0: +safe-buffer@^5.1.0, safe-buffer@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -serialize-javascript@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" -sha.js@^2.3.6: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +sha.js@^2.4.12: + version "2.4.12" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.12.tgz#eb8b568bf383dfd1867a32c3f2b74eb52bdbf23f" + integrity sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + inherits "^2.0.4" + safe-buffer "^5.2.1" + to-buffer "^1.2.0" shebang-command@^2.0.0: version "2.0.0" @@ -772,27 +885,12 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -sodium-native@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/sodium-native/-/sodium-native-4.1.1.tgz#109bc924dd55c13db87c6dd30da047487595723c" - integrity sha512-LXkAfRd4FHtkQS4X6g+nRcVaN7mWVNepV06phIsC6+IZFvGh1voW5TNQiQp2twVaMf05gZqQjuS+uWLM6gHhNQ== - dependencies: - node-gyp-build "^4.8.0" - -stellar-sdk@12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/stellar-sdk/-/stellar-sdk-12.0.1.tgz#48fb76a5f44854ffb907e034eaae5f72d09adbdc" - integrity sha512-Bjx5XOPKDUoXXGdPqHScIcGWi2o/5idQdGEvCmaFTsmbuZIs80HfjJRqHJ2uEL4cSYd8FzNDtai4pgFgvRWSfg== - dependencies: - "@stellar/stellar-base" "^12.0.0" - axios "^1.7.2" - bignumber.js "^9.1.2" - eventsource "^2.0.2" - randombytes "^2.1.0" - toml "^3.0.0" - urijs "^1.19.1" +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== -string-width@^4.1.0, string-width@^4.2.0: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -801,25 +899,34 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" -strip-json-comments@3.1.1: +strip-ansi@^7.0.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.2.tgz#132875abde678c7ea8d691533f2e7e22bb744dba" + integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== + dependencies: + ansi-regex "^6.0.1" + +strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -827,22 +934,31 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +to-buffer@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.2.2.tgz#ffe59ef7522ada0a2d1cb5dfe03bb8abc3cdc133" + integrity sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw== dependencies: - is-number "^7.0.0" + isarray "^2.0.5" + safe-buffer "^5.2.1" + typed-array-buffer "^1.0.3" toml@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== -ts-node@^10.9.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== dependencies: "@cspotcode/source-map-support" "^0.8.0" "@tsconfig/node10" "^1.0.7" @@ -858,20 +974,24 @@ ts-node@^10.9.1: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -tweetnacl@^1.0.3: +typed-array-buffer@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" -type-detect@^4.0.0, type-detect@^4.0.5: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +typescript@^5.9.2: + version "5.9.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.2.tgz#d93450cddec5154a2d5cabe3b8102b83316fb2a6" + integrity sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A== -typescript@^5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" - integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== +undici-types@~7.12.0: + version "7.12.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.12.0.tgz#15c5c7475c2a3ba30659529f5cdb4674b622fafb" + integrity sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ== urijs@^1.19.1: version "1.19.11" @@ -883,6 +1003,19 @@ v8-compile-cache-lib@^3.0.1: resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== +which-typed-array@^1.1.16: + version "1.1.19" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" + integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -890,12 +1023,12 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -workerpool@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" - integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== +workerpool@^9.2.0: + version "9.3.4" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-9.3.4.tgz#f6c92395b2141afd78e2a889e80cb338fe9fca41" + integrity sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg== -wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -904,27 +1037,26 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-unparser@2.0.0: +yargs-unparser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== @@ -934,18 +1066,18 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: - cliui "^7.0.2" + cliui "^8.0.1" escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" - string-width "^4.2.0" + string-width "^4.2.3" y18n "^5.0.5" - yargs-parser "^20.2.2" + yargs-parser "^21.1.1" yn@3.1.1: version "3.1.1" From b43748641b0840cbf93fd265bd2e71b0a7ea8034 Mon Sep 17 00:00:00 2001 From: Artur Abliazimov Date: Mon, 29 Sep 2025 16:39:38 +0300 Subject: [PATCH 05/11] Fix 1.borrower.spec.ts --- Makefile | 2 +- deploy/artifacts/testnet/.contracts | 43 +- .../artifacts/testnet/contract-bindings.zip | Bin 291233 -> 48201 bytes deploy/artifacts/testnet/debt_token.wasm | Bin 7616 -> 9146 bytes deploy/artifacts/testnet/deployer.wasm | Bin 7496 -> 7739 bytes .../testnet/flash_loan_receiver_mock.wasm | Bin 2519 -> 2328 bytes deploy/artifacts/testnet/pool.wasm | Bin 61990 -> 61040 bytes deploy/artifacts/testnet/price_feed_mock.wasm | Bin 2420 -> 2265 bytes deploy/artifacts/testnet/s_token.wasm | Bin 17791 -> 19736 bytes deploy/artifacts/testnet/token.wasm | Bin 6168 -> 6165 bytes deploy/scripts/deploy.sh | 2 +- integration-tests/package.json | 16 +- integration-tests/tests/pool.sut.ts | 17 +- .../tests/pool/1.borrower.spec.ts | 32 +- integration-tests/tests/soroban.converter.ts | 2 +- integration-tests/yarn.lock | 480 ++++++++++-------- 16 files changed, 334 insertions(+), 260 deletions(-) diff --git a/Makefile b/Makefile index c0d2d7af..8982c69d 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ build: @ls -l target/wasm32v1-none/release/*.wasm deploy-contracts: - (cd deploy/artifacts && shopt -s dotglob; rm -rf *) + (cd deploy/artifacts/$(env) && shopt -s dotglob; rm -rf *) ./deploy/scripts/deploy.sh $(env) init-contracts: diff --git a/deploy/artifacts/testnet/.contracts b/deploy/artifacts/testnet/.contracts index dc1e8847..5032aedb 100644 --- a/deploy/artifacts/testnet/.contracts +++ b/deploy/artifacts/testnet/.contracts @@ -1,32 +1,41 @@ -SLENDER_TOKEN_XLM=CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC -SLENDER_TOKEN_XRP=CAOODR344VWG6LIL3J72IQ5CSJDAIQMBEO4DPRZMV3AYD36VCL47Y5OH -SLENDER_TOKEN_USDC=CDTDX7KSIDDAXYPCHOEVMAH5UYGUEZW3PB7PAQKAIPBBTJ4NVNYNDN4Q -SLENDER_TOKEN_RWA=CCA6W7VFNVWQHU5FQIZ6OHXABYZLNZ7MOL5CK2B2NFFN75OSRXCXINXK -SLENDER_S_TOKEN_HASH=d14e8cf2e2c07ac4237e4804a50d02c717333ab2a1a4ed63cc63228e265b0a0d -SLENDER_DEBT_TOKEN_HASH=aab6f670caa14f0e428bb592487e3bdfb10cc906967bb3139111409715d46b80 -SLENDER_DEPLOYER=CBSWEXMMPDKJOLMD2DC6SUDPRN7IAPN2VINLEJXQDOSNJ2PUAYPHF7AA -SLENDER_PRICE_FEED=CDMMDE753YAUOJMO7APDMJ6TLQTULATXG2WEKA27O66O4B6FM7Y6HUME -SLENDER_POOL_HASH=be78cd60a2470431696df2bac2ca7434306fb3c7ff1e91a2c94db76b71dfdc6c +SLENDER_TOKEN_XLM=CBYMQEDGWHRY2ROFW2BKBMYTM6WDT7YTU5E24HOXGFQDUNFDNPDPQFUM +SLENDER_TOKEN_XRP=CD46USRLMAS5HSFZ7IPSBZVSAPS7TOHW6UKFA5KBZFEIIBL2SDA4XH76 +SLENDER_TOKEN_USDC=CDNIXN3RLMHHUIIGJVU7UGYTQCH32N6R43VEG37AQHRGA5LMULJYQOPI +SLENDER_TOKEN_RWA=CAS6YPBDMC4HVRGIK4XKLALCLXRJGELD43A266KREXSEGHXKK6SVWIPY +SLENDER_S_TOKEN_HASH=6e093d8ed4893adb99a261a7160a773f64e2f5d4a9be664edab66be62b3c176e +SLENDER_DEBT_TOKEN_HASH=496e06547aee651210f7fb1a543e30afefb820160e42e6ddac808c18f25a5d89 +SLENDER_DEPLOYER=CCJZ4P5CAWQNDGE7PFZ4ENHJVN2NCJ2BBP57CD5ILTWHNQVB6BDEDUNV +SLENDER_PRICE_FEED=CDLDCB677CGION5CE3665P3HI4HWO5UO5GXYH7A6PVERY3RCHBYYWC6P +SLENDER_POOL_HASH=ef84b75b765edaf12dbc07c93965823e60802083fd42e9cf556c0114985841ce +SLENDER_TOKEN_XLM_INITIALIZED=TRUE SLENDER_TOKEN_XRP_INITIALIZED=TRUE SLENDER_TOKEN_USDC_INITIALIZED=TRUE -SLENDER_POOL=CDOWGSFIKIFAQ3S4AWMKAYD6CMBQ7GTLJS36Q5WJWO4CML4FY7VYOGC3 -SLENDER_S_TOKEN_XRP=CBXJI2JT3LXDDW3LE2S4XGFWMNGJX7RZ5667KH6IXRAZ4LMR365JJLPM -SLENDER_S_TOKEN_USDC=CC54UFYIGACHNJ5YUWCA4QV7BRFXTCKXURLU2LFIFRMBU5WXN2LV7EDG -SLENDER_S_TOKEN_XLM=CBQ2YPEPMH2JB5IX53NZVKJXPT3VGLOKME3XSX7MPXRPLVMHF5W4RYTR -SLENDER_DEBT_TOKEN_XLM=CD6LOPW3CY57SSTTBLTEWCVVK4ZIRNTNKFE6COULDA3ZSK2OBERF6C6R -SLENDER_DEBT_TOKEN_XRP=CBXNRH3LODCXPTSW4YDB2CNWMGQ6JTGG4TEW27OVG7C5DVMTGQVPXFX4 -SLENDER_DEBT_TOKEN_USDC=CBKPLSRWIWULHSJ3QW6WQSXM3N2TDEHLKFECS7HP2XGQFA5V2FYOTVFE +SLENDER_TOKEN_RWA_INITIALIZED=TRUE +SLENDER_POOL=CBAFJ4Q56TMXFT53VVWLKK75AD7YLKKRWK6AD7LMTR6VIP7F4BN4JIPC +SLENDER_S_TOKEN_XRP=CAUNVFRRZ2DNWTBUKLQKAX23MM4GN7X2QETKGAISYFM5SOQA2BALQSRJ +SLENDER_S_TOKEN_USDC=CCK4WRIGHP56J52B32U34KILUUJ4RZ3GWXSLIZXAIHTUK735SSTI6HU7 +SLENDER_S_TOKEN_XLM=CDTBGLHHI4T3SRWGIJLKHOH23D4DEBSVQETJ7XSMVYK2O5HAMYZMWS47 +SLENDER_DEBT_TOKEN_XLM=CCMDGNNQR4FT2PSLN5LPWVKIENOMZRWWBFANRWHN7ODDQDQEQN6VCD3D +SLENDER_DEBT_TOKEN_XRP=CDBOAXRXYJJH7P2UQAQ7LRWDYOQVQBPRQIYOTJZRST6F5MATPWUF7VUU +SLENDER_DEBT_TOKEN_USDC=CDFOGND7X4GXU2UXQYGH4HC4XXDMQVPU45UIGXUPANKY26WV4YRZKZEY SLENDER_POOL_XLM_RESERVE_INITIALIZED=TRUE SLENDER_POOL_XRP_RESERVE_INITIALIZED=TRUE SLENDER_POOL_USDC_RESERVE_INITIALIZED=TRUE +SLENDER_POOL_RWA_RESERVE_INITIALIZED=TRUE SLENDER_POOL_XRP_COLLATERAL_CONFIGURED=TRUE SLENDER_POOL_USDC_COLLATERAL_CONFIGURED=TRUE SLENDER_POOL_XLM_COLLATERAL_CONFIGURED=TRUE +SLENDER_POOL_RWA_COLLATERAL_CONFIGURED=TRUE SLENDER_POOL_XLM_BORROWING_ENABLED=TRUE SLENDER_POOL_XRP_BORROWING_ENABLED=TRUE SLENDER_POOL_USDC_BORROWING_ENABLED=TRUE SLENDER_POOL_PRICE_FEED_SET=TRUE +SLENDER_GCR7O7JRQ4GM5MIQLC4KWBY64WKWBPCBISHBMTSLM4BTMATYOBL4KNVD_XLM_MINTED=TRUE SLENDER_GDE5PTZHHL64OOIHOP6O6XVJCQCXTB6MXEKGJA4OHHAAOXQNHZCFPFKK_XRP_MINTED=TRUE SLENDER_GCPGCSXWDVXVTI3VZCU4TVF43XYSWZZYXPONPKPYZXH5KJSIPQ5K6Y57_USDC_MINTED=TRUE -SLENDER_GDLJFYGSJS6STVIWDVXT2GOM3BTNWGSMWHQF3CEIP633SOAS7KH3Q5N5_USDC_MINTED=TRUE \ No newline at end of file +SLENDER_GDLJFYGSJS6STVIWDVXT2GOM3BTNWGSMWHQF3CEIP633SOAS7KH3Q5N5_USDC_MINTED=TRUE +SLENDER_GCPGCSXWDVXVTI3VZCU4TVF43XYSWZZYXPONPKPYZXH5KJSIPQ5K6Y57_XLM_MINTED=TRUE +SLENDER_GDLJFYGSJS6STVIWDVXT2GOM3BTNWGSMWHQF3CEIP633SOAS7KH3Q5N5_XRP_MINTED=TRUE +SLENDER_GCR7O7JRQ4GM5MIQLC4KWBY64WKWBPCBISHBMTSLM4BTMATYOBL4KNVD_RWA_MINTED=TRUE +SLENDER_GCPGCSXWDVXVTI3VZCU4TVF43XYSWZZYXPONPKPYZXH5KJSIPQ5K6Y57_RWA_MINTED=TRUE \ No newline at end of file diff --git a/deploy/artifacts/testnet/contract-bindings.zip b/deploy/artifacts/testnet/contract-bindings.zip index 366eff0fd9bbe86e9e2d16517cd857a75efca678..0858226d2ec58971f17de63afaab4a26848a729a 100644 GIT binary patch delta 33009 zcmZshV{l+i+pS~UHYT3fwlzs6wryu86Wg{Ynb@|CiEZ0H&+}G&Z=LVd>8k$IckNxf z?;mUJURUSup^iR-At}j%L%@OjJE~3jwd0Y9VYt;+E&iQ}%!jxz|1K8$6-_15$5Z^L z!uwAp_4)>s2oN8#!^B2<-R9xs4bK$gFj|5wz~oNiplXfmlu}N7_cnKvmT?Ni65sMz zY0c(#HgnJGDRVwW!sjBU9(}=~5?=VJ zzEB7QE;b%wFV)`8gb<`k>lxeR#f+JwVitE%hKdDea{9jQgqZ&4QP!3)!5!u(W!{QX zi|y;3Uch1o&%F%66tt9DgOjr~R*%oy*V)D6cHhV4@%`lP?B->5EmvQUC`YHOLjYGd zmQgP{r>nJvyRFNM&Fk&c?0$G{G5J=(o0GmMfNj2SlC`vs$ObB4N8I8rINArdmME#7 zngjvNZ+7haT(L6yI-1HerR(EfAX`1vblVd@834uQ#B2Gn3fo?%z{VI{kET8b4fsf~ z!;H7CS`@CGbC&iFU*RnI%Z-R$KW8a!BB`jo3dMTn8OIQ$x>G@FBf8!>XKaSQj*olTM4DS zWDKipy%Rof$hj23R_OL-DU)V$vHyr3tuIzdM}Q@ACihl8hJ+O3 z250GP&%pg+f`kO{ydNBw&K8Dx+j=IG;aUk7s*q*kw0sAjAg(o{q7j6ztP5jz1X5gv zgrgU$S|CneY=&NE6oi+Cs<7F5f*cx8nRD67dlVaKeS*byV5ayDF(`Y5*d}Ngk%?#1 zFzT$w#OTgeuh45+<1@701@gGD#Ss(V9ns*xgXeS$H9eRZr(TO0@V9TSD`1RSBTu__W@hhw{pakd*Un`fpxkn*ELzP z<$^^Xp}(7z9=wkKejgG3ZEM{%k60z);+0_+WLWUI2lo7`Rw=wRVPQ#~ol691#B@%Xutfw-bDMTu!;h1oh*#p$y02lR4j>wdV{L_< z!s0*;C6l7{_&%rd@Rvx?<9nX_c?Jc|>&B0w4}3!^|-!df45&Yw9>r4 zmAK11_kL+XoE!uwQ{t{X?EaaZR5RoymDL*7-)XS@^y_xt_SQ+nFHfN`M661`rOVcP zY(h@cwajoMnw#UbhxvA!VG59zs^=4l3JkwjnYt4@%61!1rRbo6SIfB~wC{U!wit;c zOO=_{PxF>hjD@I82&bhBQ>^>W*~KTL)Tj3*G&GGe7k=Y4jNcEq{TmoepQR1!b}c(bx-H_0BTGSL-|zCQudI@8N(K5KQhGKtA*7)eSTbO=n?-F_8)&NtLy$zey+sJVlv==bl=qj9t0HP5flUj0^^^eZLBQPukR=! zPg%cQD#d+j91i-N(?D3$;F{!lQ4n@6o4}dr<*?lr;F2uS9!Vpqag=yEpskrP~Jih3Cl^;DT>6g+v;R&X}f!Ov9!*F=M$+hK+ zAtsYiaIYT{A+gT z|E|K<7ps<{fq-Nhfq-Cv5Tss6Lf`_hAmIOY=U?ypf4Xy_bK<-zh4ppWEpk@5y385_ z-e&@3oTF>>zBntv(k26qGyM!~J+)~=gV`j=$jdJ-LJQ5EEnU4ooTcE+ zKk5i#e4<#*P9oj}L+=c^+ZyT@m%d#+PNe0Pp9#PMztVOWu7suNWpB2wua*J?yp!jy zU`5zr!YZ}Ih@T_SziC;tO`+;kYg0Lj2*U=oodpT38)(dV=kgaJE=oTm7V%N%@0_N? z^P`Djna(|hrPxLuNqWb^eoE{Wl|k*yk^hMPO+lub=qqloc#QiN5wTl+p9Dx6y)f_} zZOQQg@9ZFMIo2!;(`5RFoNkyA>&p3lUK7tWsK-Rj8{uCvvRm^+))3A57Z>TAeV|$+ zov2tPh3)V=#8+GJ)nt;?oF$_78livP>^I+upsFX!_FgHFn4Qd_3_&C}>;Wx)w3yDZhF^Z~zSII~Xx;vhleQ@`Iq?Q?#Px^$vE?(+Q3 z?%N>|3$c9DT8H7A7nIN%AO&g9oDmX10lef$CItn7WPjgzX63YN6_{-|ds_>a4FD>n z9B5f>*UI~`eyAz}5(|)zd-T@>>IqZ80!>(mE`|}JgitfDJx_?0l?`*egIXkQcY?V` z80RI7G{&J5HoOW_qm#17-Y_i#wAWnoSN=r&L8D^+zE%r!c=3FiQXalJZ4eadvOFjm z@pKDC!#IZ?OJD`TFSBn`NhY_C2nopCDzje zWQ8fW#8dD|?{cL`~kQjOIu#n&46R4memG<=#FCT_Aa}|W}Yq9QwgBWpq#5j!( zuNIrXJlP&)&RZtgq zLr3Gi5jZ1r(S1$x)Z3E$9%3c&po7o|1T*1i!BvPau_x_vjxTxX`|;EB(#}b{6`Ss^8PA2IOsDlsw}RLjb-{*9C{hA zhok-lmN?_wR5}sogT3kj>at%QQaH>Vgh(OZ;Y0S>A5tTpzo^O_2kn+BLbx1VAh~q- z=ifi+=Gd5T6<~qPKP_iAKSDeTO}O$yaG%+aTntV_m!$QoJ?|*{bA3YsB|^^jPA8mY zFWQ6~H2u2@HYa1}xzgpL@1h<2e;IOCplz?GwJC~-s%Q!64BY7)8;H}7sA2el=Jzy0 zj3`z3Q*h_bby2*1nbtXco;Zj zxTp##7Z%V0^836#NgY}UQa(kE?Ue`BSFRVxBtH+O*NkFzggCksU>YuEcfZ9b-QgOV zVLBY3*auXDx1{P1DBbm(LMNxCJsy1Mo&{i6#@1v^<$1%p&UW#oLXkI#&u9t9joo{$ ztj@hY-`8DSUVLwEhv3v za#1M%P35{HFEUSaOhm0=#aT3sXX)*#CMy1QTRVkicM)K^U-9H7$NDmr-h(V|D!>48 zIXvvXCHvz4;wB1?*kXL77Z3EycbkQDO&1xrQx4Rdi5n)XTJ?a8l?&x=8LiEAU%E2dt5%i(IDoDmII!nlXGN zmuDnJ|uWX~vLl}4{A*7)hI`wZj0IQB( zPW_18r2B+IWH-ROP%FJsxi2?eciOVq7m_4I;ZtaX#xaa|Sg8(Q5M|YT7|c#zlD6Ny zuq@y&@Q$RO74QQ4_T+DjX!6g0{l3e^G8A%p-ml*?y58brAZ=gn5(BdHut4Q&SDjC@ z8KDDVkT)6q1e@SNkDl)%Aw3oeKct-3IZzbG9nR$?ivW6oW z+Mx&{wM*>a=s2(UxJ8NdNq(-e^IP|aMvO#%M3UolX4EC05wdw_txXvcKv_PE40| z*7)A$qzNDWHx<*eD1KQ5;8p79LNcnk9`CfY5$;kh?&M|Js5ZUC_ zKiOk6qq1uBKJMI8jP1Q96`6_3OVb0)l*LXmC%#_n55}TyJkH5OfYxSgU49JhV3I~0 zrlma9V$qzk?Vr4;4A7zIrV3#MT?OyCnZIX^zi2~JtQPImYISDL4=eQqUw(2w2I%WL&^#lH3AAV+u1)5^^C4=UG8{NQbup-&yG810|0cUmY;%q?hvlI25lPqT zhq-ktYob?dbRCIh+#eMu+cWu_Y590f4+l?5U-7|4x0RUq$<9Pb^T-JuWKLB3}D|a%CN(GERVr>Nb$cD zDo8|@*>Qps+EB+vYvW!H3MffVqW5GKtX7Bndy3ml@0wrt7XOV(LS5~Nu#LM>p3IJ# z7Vd5@M(~t)Wk-LOu(iY#6qN7$xmm`NK_M_dp%ta63i&)zxGQ2mDNyHs(_zzLf*wZL z33J;wrkiAx3*6nwaoqpD`u0KA>QTEJY83pEpE2O$YD}M-8k$iQ_~k845cq{%{)1+` zF!DsKLd@%rv78LHD&Y`l%^BDS@<$jKhfPf(wSBC+ER(tnit5f!HU#-BGb7-qRkMk# zb6XB=j+~lfpHXqy5+i(Y85#Q(<`n0nG5-;~43jIO8qikXLripxUiOVMnwv*Ko;gRY z_Dp_=U$$yVW?LKERVbJ8rQfko9glHe1={I|h?HEUBxDbd;I5iPRMtIh)BX~Pu7euYrj=4za{K7n<7%81vYJ_^0+rI z_k42!)qkOLVc6Ne)L z!yCbZHyeaVgmHb$7yOt33uvTzMY-;c7=66)EE4`0_^oGlUB3#7OEZYpcXOH-nNLdUcVz_dwx#bjlw<7e*T_i8GmEJdhSIZ>X$A{Tht|o z^ep6bgedAtfM8%=zqCPs&As;`2zt;K@GKJDFbH=7?phGJF-G<{2(8uHRen}lI&`Uk zo?Bs|wD*)k7RR({Jy~AF;}6UFw>J^|rbHahfILJTpmg0-U}xm#SW3Y6okk74ZK7>5 z)9Bl`;wfpa`OJ5&wWKOJo|RoSvGQklc);p7^9B#Q^WghAP8T-X2XVK}8v~02pmU|J z*D7M!r*q@oc7Py=3yNk#-KXV>PFVMFpJA2m0^9y~Q~K%Qvj+?K-wthq#E zhYyRijkXJx)ldT6he;xOZDC!2npy!Ue5r-%{(BcB6$oAK&261$vZZO*Td931=BT~t z)8}wMB<0lX_vGum&pH#-UF5?gPo3vYcFKK*7#03_-9c4rR`JwK@R}=#8E$mZ7tjNM@TMb~C(g z{Ika-;^f&hQokMoz8RHt;@niJY<65n#;o2j2x88~MIS^{{>O~%`5~9NQ?L;AyhFw< z3!~{TpR)zn{W2=`J@z2LrEA!un9;yGQF}k-&WZZ&tAif@bY8Zpsdvd`(WRK3-@xXA zsKy7$ktkYrBi-q$tJ9$Z%;1=f=xLXGW;Mfd=rP*1$-ZJz6yB;V^v0n&mXu1X9`k&w z1bUrmJ0l9}&Q!jQuKJJ;e`#u4Cp81~SoyD3qrXnYSc{_qM`aa2V4nINIpkTxoPT8N zklK?^mQDJ7FlKS^R3~(WwA+ops8K>?O=JF{cVf0ZY)Ok{xRi9^#jfX~L4EIFiP0Kz zOT-9kWy#lf}6L5sRd*PdCT1DSl5-YnVq zH#2t7C|;;i0LwG`gB4Rp>*Ayq$3~DaFnawC4lB^oR`lTYb6TyOn|mq*;SY2nsR5pm zwNYeL=e>zd^Fu8H@b|jMV>No&c>0wt4F`S;T@yo%+5AH&8l5I*&9d z2J?!K=ZZS@^gDXi9Z@U#YU>i!GVB%5v=B@9U>k;XQ6iE38VrO2_!dw1cq(AD0j(sq z)d(uBzRpk`qoQi5W}Csxz!SFK)!y^Q3}H%11;LmN(OUL<0V)o01)pL9-?aI}4{15O z#1Xj$%2nJNC;7~`FHJ2hk8=zrdUaYPJg3t%FRX*zO(@|`6+vX zJ8}tHQszRR0fC&H79d06=P6?6!=~_)<4-Gbl}Cg{6oC9%ltJn5WPDOBgX#@>aiKb{`Vaa$rV3?t;$*op zxz@HRB;@Hw8ACX81fG{7pzrmN@56SFhBmu_CQcPmoqFVHu|1M z9X3e}l@00H)`2wkWPe0`dMVsp7#IF?ynw>U>%}vo>yBi~ufHR63j{CtJ)UIYHZk8x zpy8ur6GI6kY|nWT=qzpCa{_4^l$N)6W6cJ~P>5io zF+1ta{&KXR-HJEy&W(ZPs^oN%dhkBBy#3jBsO)+3&MtHas1L-c!+;Kfpbj4Kr?0gS zPTtAa3Ir-C+w)W_a$hRZ412;<$(dUj?lK|MS~9jg{nl0_!I8+Mxm z#g@V0EvZh3(7rMij;W1}!6`<e5?Q0`8~b#`{SC! zzBympDPk^a^&H#9#C&VL0=djF%eaq-a;Bb;GH|oYeA|ZHOuj~H7|0m!-P|S+>U-aL zr5hjTowi?2I7gd7uK58~LNXxDg#1XO>uwR@kS=$}U2da&jZk?0@}cZeXAGVKb}&M* zh3vCon9~I*(>cIL8T_3TSr1N@Q>uIB$Y{sqxVS71Jk@5D%I~@EMC<0dWvx;^7xOH# z9j_zW-T=hN#T+)x0sa`#EGRdbyW&7(O zPhuumWqcNM@FIQ4mXE>N1;O<8`Aheuox)d{7q12fQQVtUE6XNO3fn~amhA=pf9rlC z=Q-7X#Qr~||G%t=$IDWv`X57JPs}+d2L6@x{|^oMU#uwb* z6_J}Zw3O_E?1bqSwVi(_yDbs!{Qgxt!9)Irg&k7JKBYPkCoL|Zsx>_6V$f~c^iGhE61ZjEkGq4Ys<3uZ z{?_-a)b`BbOPhdG*Kf!b``h+Nt%<@vy!d~CBEnmm|JvOD4T@a8NdDWAf9((HU;A@{ zf@y)F_~+V0Z)zODKi47t$LanbKyI0Ni_};jqV2Zu2RXPNbD`)GI{N(3j`r^2tC>Pc8 z+VkxsnvU#*J%d*VqS^TW(&pepD)q|FwLJ;Uh163NfYC5XvE9=b=Slaau~0GOrdesf zcQihxZ8OOWXT*?XyapkXZ!(aoW_Ax&KQ2>$VqGQq84wS8>#PEU0+H^FM8Kyj)ki0@O{ttuH#yG=XFm)v*{C$Tle!t~na%6qZ+?ky@596ey=RS~jqEg} zVFVHxvIXJTQ6d&WonjPGdBAa;?~KU>G(WHugv1WWn>u_v-EAPodu1!i(~eSNGk= zidwPX`e~>Aqt{#X#-UpFjTgw86K~M0)-75;h#*OCwjJ6}x!IOSd6s+Z@8C!J`9U}#h!JJ>|O#yD{P0#*Gh8qvY0q%~u>$rWu~>v?&+n%Sn@Wqv4$S8LRz9aw zn(8}0a`pAU!xobcY@=~k`O62HVH<{l9akMEJ)nBTL!Yy6uz?DT5EKnt5%A;0ht-!p z+WV?LsgA=v9s!T`wYHAgo}f|T%A#D4E2Ux?Ty-?&B(AxjJ&7dOV6ea%h!4`T0&$#Z z*bkQ{%MD0mu{#v&56~S8Ny;|23m;$U%CEfP{EB5Yx-kgRk3KhCEyrK{$=myz6a!?7 z!G6_o=YJ^JzcaiDfvqJL*qTesT*vg>8-v|(!w!kfnE+5Ery|EC1#fMZlBz59MNFoi zelRwPKRW#js%_5-@k8YfeXZmhkf4)-(BZ=X!m9gNhlpMI+B)bG#ho%@-NNeftczJlp5X)QKpcDKjop#1K=6 zu9y*1d76APo3d(>ax;_C&ciMc!3BW;)p>%shMo1b1@0iIpv^VQ>R-|B zPJ}-Kf?9dSDs>h*Fo1ivKorwsE>s=`61Q;>?8}d468zdXAeNqkm{#{DC;ag%U8`(T zeiev&%in#&VB6{@r=U?cRT#jm7XhSP@DS0pc#qHi5}#THPy`Po{XU5C6I8{@0KvQj zVIjIsD*9C-wVIk}B_THKCZ6zjx*bm4(1=|Xb!9s<{_@$kD?=&-iWa#gqEDcakk^Yo z{4fzxj+)P#%A)Vb+H)&YmYQR4k<}2yH(P)l{5?*kGMS^Gc zLjXgl1ci~JGh=ho5h?GNqNH%1A|SWgX(|#(DoR+v2RWJtM!(6qY$U_pXN(aElX@7y zI{Ouis!4&bV^HgKBurDfD&V;CBNO%>kTJ3j_06XIfqUX{pHIeOc}kXktb@4ow+i?M z1i9NI|_%vgJ#xs%1Ak~_56$}a>*Q8U?0FXpTH!E{Wl$v7;f3yucp z%XsTXk`fLMVKEJtaAQy&##{KR1Q$(wmU8u=MJX?|AMamZ!Q4hDym^aC41QDR;Px<7 z=ZehqL#M$MyAtRoyP~A|SCoJW8Ec|T1r_zGGvu`=lJdHnnU?<-|2!1GR$jja7kL=L z9dz2p#Du>mti35bd<6GsLKod3THoSK{_q5@M)p3=Mgxfyx;k{VY$n^VY(%@6p?m^PuMGSpSsx1~u}}3I zYffcH*3KBtWqPN0N)dOkGGh5<0ztU4RJuxt5QHlpJ!0%sD!Sie;{2EAL_<+QY%lek zPz&6cb4cC-q!R3N4(3D;Lj==}d-me@Z$&JPoIO=E)Z(wb#M9Y_7qzc)KgZk8S6XtY zy8GSVmteczRhR-~s^)+cieD`{e+(bA5=fv&MuDnc)@a-?wImDdH}T^lDfk8o@&c1D zRjN?W<-eO9kS0$AycB|1H}A92G`??cwxmC!eSczTj)#=}Hehzb(l?pQJ0>|j)-E0{dw5p6Hh9E6kmJ$WWTmW%B}x*!}W#Fd6WPUz$Mk@Dvb%Tq{2FV zhh47p@bQVn#h=H#LPi&%o1uQc2PqurwllSB|LHb`hkZD}xAa8C2s_7?9jUS|^yBaq zGw=s|_2=zP!5x)d@EyI1oiwatj#}=l{Xy2p7jpdSSwBZ6ON&-|MX(TAq=t&+Io9wUy z)z)Z-q_T4nH0c%Tu)ekbNymoOrQ*hEzG=55C0JghZGT-7dpI)DKzOg&z4bmJ#F~#Wl#fr)<>kLIr zr6y2w)OLWyNyU2`c#3YMXB{q~-Wq(Q@4xVgFB50t46vVrbyS3)acfD`m7if-e&J9G zg(!$7RFR;qs?~ha1?nm>;a$l&y)Vuth`%M{xIZ74z-}SmteZeBaXeRzQ#r#d?J33o z72mu#%&nhAGviduYnBYV@lT8$w!qr5iFf;|^Nk0@;PqRD6M7Obs5e%^_*$8n+XGQO z2Q#tho?j1l&YU@DistWMQjXzz4nc983<0Skw5>IfY81+uRN)Yw&T-qVDb2PC;YLZ$ zpv0-08x<;BVd0P-KC9ZO+ZRuDo_P|`9V?#uCaWrA#DY_`9q%0PXmUz^gELw`7xjg&*Z;!N` zRgw#rn+l<(f8uF_-r<22$?2bcG4s5{axl8m;RbyqvLvBC#5gur0?|IAa=)5~te#7Ok}JuTxr?wfc`R!qU7Z%KSzmZgML5BD z@37YibT&9zKirSc(8z+#-=*&Wxm?Nib_cn8hS~(1+ZR`4wE7@;y|M*0AqQJAqXyU! zq%)N9hY=Tj9=!~zXyQ@-P2R+lg6KNt!9pBe)0U^^ zG{Uo`@}kayEx{en54?G@+$W6B-4b-cz$eCk9HfPH?qi45Jyn85?<`(-Ko;3hE8zsXqZkd8Yl2NodbL>IfIVG zw&rbD^2x>L|9pQt>_2zz5>CkC>}NuuOYLIP>?l5B9jr>kgg#f{eR$of=Km*td>Q`A zO^j{5nkdzlZ+T#Q`eC#vtA5m-N?_S_{NC&oo$s5 zX`w0wYs&+~Zxb$ue^4h__p$tf39ga4M8Z$;p0@3iefA;lJq8bQe%$(L)E9y=?W^Y0<*j_S=Eu#0woVxzX1J^Dh-vA;(1F_#MdRH~M zEE~I_s6r_q-^5C+3KBehsQnlWfm$XM;0~; zCJ{?WwcDQfGoJ_0BLMC~I%rZ%33CGQjjuQGh`?X;vJlWu6Fil#PgV;@h*RqKwkB*3 zUp+BelF}n7LcVWykbZ`q3KC-|ZC}!;H>+-i#LG+*9XYc|X-EVDsEfZWYQx;zvX~;Ov<(jiFT{;9Pp3Y{jcs{Wv|8%;poB`k+_Cx}gYZ~@jaQIH^ z6WllOmwfnXJCvTUhj>TXVnx_C&$Yt68wt7dQaTkgu^i&Lh6r9;D7$SY2``fy(fSP! zXapJG*49y=>g8IPn$#2EX>1mPn(W z`@-!}@FDB5!E?SaBoig+rhCj%Yg&d{dOk77n}Z{+!zX^`ZfT{7^!RpN#ZX$9?X#05i{zB;6uk*K%@t#cy8(_yAw!{F%gZXYILNDJsTkL&{?P z+&{_B3(o~&^i;3H7~KzXFO?GX)x1S%*Wq%+;Sy2(fN7J5k>lPe&dK&md2j7%Lb(V0 z+(#2%T4V7mm_t^UxqR38`=|}pT&|^bW~TD?v4@qIlXL9Vmb0c(s6_IcheD@HPIj3I zIiMU-5m2zG*kb#zJ0cpIBcgHJ=b$$|^Zawx@L|b&xgfNudWs(d$z$tp#}v8G$7~I4 zT&R@WuUtKU9j(C5M!h2Oz7S;?#WovvOWPjpTj)IWVs=LNQhT&Q6kDFJ%)1=i^0jOo zxRu>hW|OHh`81rU;5}V2Yl(etob-4VrRDvX4uE|(0MB|@>Oi2TjzCzF?`b>ryfRBl zB#o^;ceT1qDcfNy8})s(DyjaP+RC?v`&l5c@bf?`o-!W&?20irPR*0BAzg0jqib`; zohevwVkCsA)7Om4MH{-^7$IYxWnk}N+pC#-QTC!m&pHYe8Z;Gu?Fjrz*H?=%Gp5nl z1t2j~VA@nWzX$;3TC*k;f3TWAYaE+UJZ%Io^&1ng$1e`Ud)#clQ-47}IbW8rWbyB= zt|fL(mC!vR$r2T0mQm7JA!@J|-PR<0P?-MR>dpLJW+NcjwDf@a_ACWSD5u`g{fR{) zodip=GqXMpgzCu+DddpRK!q~iarqB>DZoDyId>IP&U$>7sA*+?_Y@eLmwTaiKgFp2yqKblbN=V_bA*Pttj}v%N~qxD&iXkzuPG5z0$)Y&Fdw>VZJUJJ|`% z{z3Kf=|Ri8TH9)V^8~WA`T{{ZT0$LqXzz#UALq$oU-mG%ANQOLS700-4|vIY&j5^L zjV;eYta|aet34x>KmI(?gkq6elQ&_5C6?k8^e5$W;ud6QLB)E`L9J!!<6MAZbvE~j1(<58(w`De;j7*fPaB%oVuZTa!c+}JhwdETMm@I;mOudL5Ag_jbb>3l3=-!z^yQF; z@mk%9=yiQG-cnnSDT?=~2O#h+mYG46XkKXIHK=RY@=DZr32eeziGVY)P@V6IdXGEU zsYmV)o7fhnfNFF*C4FJOGAN%-G7UFmt`XPBuBg!tFQl$ zqe+kHmdYW#741z3zoc5MXU&vNr}DnZY|T~8s$KpmB3&s=nwqkV3b@*bbUDt)%)Nl$ z|HR+W_X&C-?WM4`$Vn+3vWuk!d1w`w`pW9g(Q?S> z@PKz43#4iQJF8}lKn$DNA(CNfxow`lh#$$jSoE9lGbQZj6Pod8_qgWsmW;_On7If|r`*+^uFILA>MkXPl+bhN`bqWgV|>~jf^ z=o%5^jrmKZrWlUJo}1p3}zz zu%T;fzdMHcNvH9lu2xX#!+h;OxQ&zs zUqmto${D110(2gSm+HFPl+WZ0xgVvFI@$;vf>&?;)B~{r01qr3p^`w4AhVseQ1f5B z2i7wmcD}bOcbxGGq7R+Dl8onH27dRkEuTzq)c>4+%=8aB6~w8|-ZORupRDPdgf|P) zFx@J)rg^NsT82=&mCht5Itael_N6mw<`qYxwj+~>P4^(}4>sqnG#+u6ldoZ)(-J%X zE>GN}t9kMuBBxr6vV_CR;D~Gs8A?91O?_Ih$a=hi(u>zn$J@swdiWr@z^sS22+f^7 z07{1d1H)ZK>8+s7VPl?#lhCV*?UV%w+nBUg?LzIc+k|rxlG9kDBt3T1E0uYLW|_s-S*K6$)p#N`GIYN%r?;$#RQ%aZgmVMk zxS&U|_92TodX4dHo6n)K!7Jn5&O+}g8?g@KbmvJiGRRy8k7c+EG7?OJ*79z7BXd~7 z+J~~y>>0Z==RRlJu88h45yUZvBZzwOu1S<$0wDRAcE!@ogI=0Pg^v^us(eI0#oPeG zl=+t!xRkwIWA+p(T$m5a)64u{@n?5@Xh(WpH6aA9I3C*%!q~G6tLa8_8FzG=tF z@BbP3>U*8>JI-pDvsNJgqAvUM(SQtS)q=*pDQuZ1jH7)m{v>>1Z_*?PIBxXZ+usC>25Zs-p8xV=@D(idjqPVfAs8b^UBd&< zrSbWvN4w#2HKmlNdd^!TLEA1`=51x6Rn0T|uO;1$Oy_zm7%Or;czVb1!=B&JdamZT zc6)zZBBQ^fBa)phOis85{AK%@entWmGZlMQnY!BWgRz`d6=h{18ku*ft~q#ohh4^( zmdv-kSNE5_Q1w>qPxy$IOYRwVoFAbwCqRx zQ3gu|zyFsvK^1E+jR&%d zJ+LlbE#nbkL9*-mK4j}RUW=OMwyt|G>DOp2ACHA0TsQe`mhjfBq@id&;;twiYi?vQ zKb?`+V61q33~Ie@oVSoyrAOpCji7yTnXZm35FVFDvAr2K&U-9Ju)@_7#*R zK}ST$YQ>V5WxW%>QVzUmf$YfiuQsq3OXx+an8=D)tfcr?85E_FslQ@{9(H=QRp3!>ZUk>5u?wnx2Ofvp6Lg`&&j ze49f?0tt6g$$YS2_kIZ9W12znh0dp#*dOA#-{8l{!(M`;yWKajP?y6!VSXCES7GC( z41woBWtw$vO-yeAbH8;ewAxm&?gWUhD{=l9FkwyGHas$hdxeLU&e4xj>%$Ss5(N?* zFW;_XS?`rhteIxk>l8g7$c0r^d=oZjVnMf+`ckR1pnA&~{!pBrN*wHj zD#lV+M-H;lEOY>O3ipIz*=xySvNVb*@(mxv2hzKEQoLi)^SZQh%re3=c-@Z^n$F{_ zZUv>O9(}M)09ueGh5sm~WW^IS6UqA-=DEPwv{_V8mP8`pA=?^nfYp_-3E-dfM(>G6 zzM=P%=MX#U48~)F&@-|DNs~UVIRnXV7Pc$9kay(W=__sR*Bk0{;N-+vCsT0No@@5mmG<5O`SG7&jzp)N#h3C_ zyx?E4$HdTi)X+)9+Y72FJKao!9+T695Z5yzZ*inilO_Jnsb2Dboi|WES&a$i+BL|t zE0JpfYv@N}A0aM1+a4qj?;>~;$14=R9UaTpBjGM+?Ht`o8+YhB7^guH(WngwBUsHf zhbk$ih`jtzW2XxEc-LL3#NVNgUj8X`d4^zn#3)OQhcxgtz?|yak_h6wZrdoD?Ztvu9lHpL>N- zV>JWT*TRNG_7gWnr9R-FSIobOp%pJT8lTkkZFbGi|73Y}+BDL1Uzttx{{`C8w(KJg1bAx9YTU@f;+*3yUT*$ z9^4@WcXxNU;O_43@IhuKGr8aI*~h`3wY$2itC#iW?5m`K=wyn=AzeS{ebrU{c*ds- zlvNI*kQ>wU9{-U&l>7-{$KMZcO{I&YK?%niMo!pvp39MAfm~#79D1^>Ovx zwI9h#edPkNa*NcbC($?8;ubNpZITc=I&ENA3klVPhPWzAyU1+)kD1@ih{eq}hc`n$ zotBYKpF?m0TTNU&A0DJ-wC?P?z1&hFujH-`6G=3`KP>ow=1*xnp6I#?D|Gd_kT}Yz zaxcIChT3XeWb*nXbwU!j4nO1Bykrr`gUGH;KeV)wW_T>Px z+}_?LUDQzacG#%#*_Dbk|5R(wX(8<6R{O|)Z%7&kbi>?tvK%5246iXghTeqRc1-qu zX%Jdiv-WqUbKcl?TsND$R-D_eW8FI}(O^QklUj_o?!A+89e$j4#bPc{$#SAJvoR(s zs~VgVI=2_F)YtQ?XDULYy>9lW>NIQ!zQ1_iMYyXrNC1#oQFP&i!m&n5Cwxr-uvqTq__gw_lMm?ER zy3E1y)9%Y8N& zG=fcWd+`(9+Ke>+@N<(oFk@y!X<OwX?83^Fxrzl7l`bjP8U;*AP&6pPw>dx{mgyRG*yEdsG97U zf&~!s5|$gp|E)u@B#L1c6{u4_O-^IOB69%QMA|^ zphD{I`V&<$Iw=2EEK(X37W3#67yAAruGzPaoysFlzo~|7k-@aU`=oZY?v*|R%nhF~LC(0s?{P`yf1m#-cpm_hRzmpALwvrM>%E+OH_?C~z`H8<^Ra0=s|WMkCLExKuC9js|uH1nUK8Vy=qM`AlqN0eq)Z|KT06Y;ag z2hXq8avUIP(#?pSoup!F6-^&B1JaFNkF!~v@+mYz!Wh}QRVW3aqiEUZRdg~>?#}(9 z4<9<|zz4NZ%&_R)kB%Ui)Sz|<`Z(!HS1I@g7*8$f%MfnLAqv6!yYs8}o!36~XPf6+ zaTzDND-3-x)d=M_!rhHd4`bwA#_1NFhM|GJwv#b78a%qzsTDcJd5XV zUibA&TW!Hc=A_uZ7wMLl@BV-AtxUx^>oHLzw<#rCPDCPwDnS%5wX{nj(h@6luprbN zBubtb;YlPhW>yRwhU23-Ugn4c+DbLGyR826gY%uSa&YlJY-_?ao9WP62=dR5GTwm4{32@>27 zaL2n%7O9AQ@i@NK2&~UTeZDH;<#n2^N!6H3r(g#8i>K!sm`Q0-n8IJMC(%C(lDy?o zc1j{0+p+DEjP4kpG#U_8`<@JHvaAdC7TYK~EU9Qkla-`D#H@B9k2+x)*vcGtAn6SL z6m8(!z6=xAzP|rT-8c0Zja*%2aiGT6%kNIa>&tv56UwWk6kHzn$L-G1i~edT8Fv@^ zvwOY!!|l#3TM-3v$Cqk*U#WTSZQ8YHwc_ zxdFxaXsi{<3)C`PoxGB8fZB6njgb#Li}Scx+!(BOyv$P#A^?yoyg4Tv3?3>!bVJ+$ zL0^zg*J379>MEPedP}cOmV6~*sMoKp(i?&>JE$m!ZF^r7Epgv&dc9!iJ6ynq0#jsM zOKkEQ8#bJXBCkCxZq*9re>dBx9lRE|IC0HF}Gt;!!f=Uhw* z>)1u`*1;AO3!-2_Sf7f&)p1*r3Dm04!F9EEWMm4i#=4AmiL80+mnYn{24?$re6hLN zRDfZJ76~;yP=~<*gvy}S6~^%5?AN>1Q#kilX!Yt%kbi(EZyDwLZ$}cg-+F6683-YJ zISWR`XgQiYz)Lgq14q+I*;>J-*$?~CU_nHyKH=%9y&yPU;S6T>0Zrq5;ER ztWs3z1yOdb7lb#+&@S|`uB{hHF|H1tf`f%;*d9$8BzSE<%q0%sE(5S@W4?3R&ko9Z zlLVd34l_RWVJn<{YK`iP%HJ~uo_eK;BoBiHC{iyTTUS~c02zcZeE#{M=n0fgid7#4 z2x4S|lt)3lDq<8d_A3phBz93Hc??*1b^{@@&-Gh2vOXLj8c_9Y%hSX)7kPdzvwdFy zbG;Sg(0%yj`N$87#Be<=xNAS>iM&2x)VqK0!NzHpX3%3-^Q;&Jqx>~_1X!SLgJU^V?Qy4A>Dz2%0*`AM5j|l^#nDtC9 zkBS1^hwGvH46}7?AIj^6@wBvRvSbwaLYh?=1idIC0IEfba8`ABlS(fXdr_4EP1Djy zQ7=H)pz-j9*Nu~IdggU;lDe7@@65mf{x)kk)fiIuqr#gL8hrIj14MthXK|M8r$nCn;+?<6NjD^Ur^;swv^fQwf^OJUq;>=y8#PE{wpOfY5AMv z{go?DEHM1vx%!3jz8uExbV+l-0|5zaij`&q!~MS=kNX-%N^8QCk3+>H{hZ7@L*L99 zMgn%oPRQq2;<}clI62Mf^hrn1>Db6unuiO8WQ|(mQW_$6sxClvCkpdiEEcxt$yAtV zr%u3D5Yv!{wt7(Uy=%9W+nU}t9X2m86MwDCa_YGv2?UPZPr&sO%B~XJ9+yq3m&ndt zzJ9!N)1xB)S;RAQsn7Zr_YP!;T?%~0lko2SSSdIn_I7;6!F*?hdx|&f=RRh%?a;1d zOhSH^Ucy*<*_)>8yVganF0K4vmT*GlT7Q3JMHE$_q^<_yge>~GY1!!E_Fvw z*7X6OOzmfw{kr+;$mi(2+6S9<;aLZUfJ4pZN3vt!ZIM~`hwy+j?si1iFBy1RrDI3T zOHcQac8>K|CDj;K(6o1+pVL3@I9Bu7wv|KlAT9&rj5oxBg{gW=4t6q^qopOlE7CT7 z3AEdaPmVO|#Oxq<-nrD7r=yRcJ2<%+*#g-Hji*^|l=$#6P|*b3Ax8C!ICywfc?+YT zT&DM>GlNE*F4h!|3YHq{@+5R~*&9tY@DX~I5lgCU@$Nq}xV=^J_o-Ze_vo*v9PzHn zS8NYR(4W48YJ1Q2VVwXLwtEEMn?K#4#Co0X+Y{+4VJ#368*lsw)^0YXwqo~Xtjh}v z^o&7+Bk|#9qRieD?pPC|9j|g2 zNKeCkNadlhl<$T>7GdIusZ?*2QhY-g+E7~n5U-41^Rlpj*_L5;@aW$!F|O?#;8$_5 zq!KX8oFH&VAf8uj453jkFrF}67xX6gUmkDQ5x@?Bl;~%cv|DZV@JPg<&I&Mzg$i|^ z@EAJ5rG^IR;iOvg>S3k5v7=7PEXs3SmI<}^EZwV)En5@M(oR7tn&_D&h2`95@YA#& z2)aQ1EFAv|jfOqFrR@{;GEtA{IPvy7mg$oZMxv~=Gu}2xNZTKao1fefT@9EG7HTN+ z>1xU-)S#t36Yn1F-1{=RDI|BUOxZI`T75f^`{QtWFkaJ<5+(^>p;yRnvvY=fZK~K^V2g^DD|5m2eL_K6ogwg zf<*H>xN&4DaSuxJ78a?QXay2wA!d>D=<~R7CvN=GJAZOAwP8pJMwa*Qa!B%`Jm$et z*4}W#K799lm)7iO<(Gaw?uj`&1(^Z(NRFvkc~u>FPdU30;bg(-al94MOt}z!y#yBa z9?paAqjLkKl?F&u%*xv64}Hn7Q7c?JYdK_rOi>&N2xK8~Es}Wz%yiV0Ue6RA>deY4 z)4Tyr9g1WUK5ALUzVODC-jYoLC;0Jl)T1^!i^_8n8Ty2>;>4*|3Tt=GMkP(09OEtmC zad=VT6M$g#jo0N6Nua1yB(b&w$Q*RdSoOcz{6-4j5uSDGKaxdZXx-8Sa}iByst5Dx z{bexa7e%Dp+DXX~bZ<_@`vHi-;Z5kyY^M}mdlmV(9Z@!L-YnLJc+m>SCp&iN$ z7glMsS7wy+eO=T7R+5Kg>yp0p$^ z73&z{-cb2pBbBj~&$cdO2ckZb;FTK1SIVXFCs9nK5s%FinM*ZoGR+f80;vYXm zDjp^BNWo*MXH7sgdfeZ_Y9v{ca)clo6E_G_eVV4yL}F`&gUV7yXm|z01gWa4p;WG- zojB<~d{!TxJhK=p-_Q_a+QI6`>#hc;KMRR3jl_$BesjcG^!#o;BY96Zc4QGSjd@t= ziE@k~7(zmg|*k%Fto;T14|7+)ipx`vhy?w390M~0xT0lDF3+*nzl&8;OMA>pIU(mheU zu6@T&d=Lt;2PPe6@n4TYxsVj4MYk%f_Pxr`!K$fTFGEb~%}ruIUodEb1+gWf^n=+( zZ72zn6-Uy7dGn)d-V?1YG=d+0Mp~enB_Q-7H6*b}HRj!vP4xo@TGQqh_(jx`C9lBF zAd%qTrWQ4zY=(+li&HiDY&z1wj%YTU4tLlm+PO>drLn`A`Z>y=6=Z#Og{Jy05i|$a zQuQ@ky-)Zf3&p2I-CA-OBz7R5ZqhGXsXTvC<<8YHS_d3)$6H_+vWK&3vv|d*fW-94 z5rq>D7Zx3>c$AtEXrkqoz?-q10>LrXV-V`E_J(hKR0{y>IZD zCgdhmGu_c|q1z9U;F9gV%=UZxJTns8xOGf+Hr1h+GK)dmo+U;-S&ARWl^=T8Nc7N` zX~5=!P^tL?m^d;$-~v)Ok*v4HqA?h?8x-U5xgE_|8_;`5fcVo(&>%5{Z?iKGQ)X8m z9n6dmIkZ!SCeANsco_IFB(4LS2*2{E9v|s+DTO671YkLqGnKtIO-XC^`PfI}2`=A& ztm2V%PriX5toE9uE|O28Y7);S=))McnPrQP5&_KT=tlZd@Cn7Q)OCGd8BlDllFf*| zky}$FY5^W(vzF?vG;;{bYOf1SDh7Q}Dcs<`<67GHTw!0&3k(*##-q2d={d--V)qujLN_B24t(Qz5-~4Y zUT?HHCp1_t9*(E8Y(b=I|K*x|X{M=9*Qxsl@6IQ@wk6tv{EnT?3C#WHxyScEo(bi|6Cvi1`sN3xAr-QI3b+)qYh;xzlUT3Up|EZ`Gu*h8NBN~{JP~OkvP;=9^ z#Q2Q@&5X!aXNJ+a2b}!v=N|rgwVY}k^bT4BNcVMM>T-n`+1-KjBES0add4m>p-GZp zo+F5$yuuBnC(lD)Dc;r?1G~xDvSj3&)3>v(PsGkyD{SO4rTdt;qZr-XNSGfZUuWWg z`)Wo4x)=vlNHkP8jFQt{6Ut=X$n7cL(ftUcc^w>~epo;Vo-1(=x57Hvz|==HR(@ZJ zMk1krio@fpf+6TN!K^~U2spOVUn{LH!G&I*Ksz6VyB}kh-H;MYPFism;{Pn#th4^% zv?Fw(oTnMN#Z7GE!(xIq(cm|;TZuTj4lQXYU|z$fHw3ia1+)r;d-#@&?MXF-&RgoX zP_Ui=%&mOdQJOeAp-g+Q3Kz?XECW9&ADiA?MSMlhMr96xcL~n9Ol9W7eUYqa&%<^n z=QcgaT3^#*5-lg26nJy9tA74o8V#0W+$3=G&Ofe%>$R$rb# zTG;mE#9WuF(QRvE(V+ori%$|+jZv*Gz%o0cj#Y7ZNJCEyv3c{EkLF&qhZad_t}SA7 z44T~23G9~>^zpE5`dykgj<6q5uWbuNp%9a-Jng=OMz8+#+W|I}ak1@>QK{w^H!Hv; zpbQ9@^Fa+*NL@oA9$X1AZCYFIzrw0wVt;G3?vvafudtHwX)zJjTakNtVX z;Evz-D~wWxVuEsgbe9`O*Ht{N%B_u)>$)+XoKi;u325?Ut$|d$5RkJpL)Z-; z+!#epQ6x)rkPJ8aD)^0Pq`MIpJp+XT{52je3)2lz6&mD$JOO`Z78-xfS zJGn6KRKH#FItk~iJe17k%@f5v(o?~9pcyI6osHnk{c7F?UVvkY!B>!;tNbI)R=C>x zk?U~gC-v=D>V4YwP5)Vmf)VD>_N$}Rs8&}&-%uxhywvNKRA@789zGyEtwGvX&FN?M zX?OW~#OwTo^byvE!0vQEQ8Q9Lt4`R{DBQx!7J2SUmlnEi22V+)-QXDU$|EK$Rk31s zg~N|pkr$}T4u=8+C$p8z_EROYRb6u%k@jQQMjmQ-_fg6l_e4Zw;I@&M*Q9&5HF!x; zQBlKdjt@XorV5uz4jZtX(=o?2s%vOGp_r$TFWf-U_=w-gURvnTkzO&>J5SsZykTpN z6aIM65SaP+erJA16^D zkwpV<`T@LI+Kjj#15d6(_qJ9QZ(G#?qBLPfy`a1!3}cQj)-a?Kr-ydr@otWyMs~R-L~t5es5XYJj~-AVp^(u{#L}rZnX)M(@9wS{ z+KsdL!R1%3g={?ZF0{0-7$}i{*KDOuZo)!A!qWusrK;23h6NO z(4Xu61fNomG^J?VsZQCTMZ{IFJarUY(5Ngi^U?T#pit$S%fd1v;sLbka)VG)N!C&R*i^9oBxqYG>cEIdrGg*wGNVzV7-wduH(keup%LJ#v7+FAHojo8W-Dy z7+|VfwgE3q1Lp&))bllVh$?zY?Y_#5Qe6YInTELddU=%Nk{TAc zAvv9JsA3(_kaN;>!-iWd%$po+phm{8lj~`j^VG;VW{I@_uS+r1Yo zyad8$+eusnyB1A!g`)y<%`Yv?wa5YV-Fa+D(|w4|+ZbANZ7*2(a9Ac^7yj6+Y{=_x zLRQPHEJXnktFC<)TR_6Q-%2d>bboyk%v-~-dM07((B>LdB*2H1x^eFbdDFx;G%hh5 z`;acaTQrJm%^@K+A>vpY7l!wVk6t&SvO!C-`vIpcn_@D@B0%@GA(#*=*VYuEMt0(R z2*A_-)GY`hqL{x3dVWP2It@3`%Gu|st`c(T9=?2|cYxoY`iOdGJW?50OtOBd(!@d0 z*s+(N5Z0wx^hi0oM`qQe_Jb$u63V)^!`WruEA{mF(Wow^6Dk%~=1Vex#Nb9->A^`| zI_rt^%}m3w3h@+6etPC?Eq5Q#&o4e@Gyf=hmg_oHH#QN-r*zyjX=lD%a1fq8!^_wT z)Yq`}_c)7pG0s$eOkh5C>bvn6a_}wY*UT`3A;4?lo7U&d^BL0B;2rjZt0>CK*P-*^ z>GNSt98)L1l){-%?wkVEnbTRCI<-=?EwnCgY`myqES%pttxOjLH)Zi{ zT#kn?7-vjaKQuf!jf)QUA{W+HmC^fReIqG|GIr-L0Oc%ap|78<>F9Dv=(cm`NyA1v zU69#1- zEPMW86R}3s*FW^BM+XQvssu?j&&!AG04W{!az($V3qWm@9^AEq3bmb~q(R3&I)v70 z-m%NUcS+{!HB7S*%l+D1LeFQ6x3F)A13Q7Q+}B*sU4=Jcwp(Y^Dt+uNx!7o3z(5e{rQhthp z*916}8QN(vOTKeI=rJk_+WVkQQtn~86lBVv?{dvKX!<1(XSx*(!*>hIlyACUn|F58 zS`q4D%C5WT5ICWCIxn7n@a?FJrmds!<*6xMGRD+v~0Zk|qQnwP=A)|{xbVr9in?Zl-1S8!9%L+U z!3NSKrw1QgT7G6haPrP6_=DaEeEW=TZcDGgY$e2vzvDZAV3~|BW`ux{pCOy^bcThL zn0!#(ETG&8$tk$TfEFWp1?7AWYT!s{wWTYHO~_=uC~?hEitjxGPbZDgrdhnqE(qP| zVknqjZ%OC<{=OUK7S3M7F;n0tbVXle_9Xl5yLT2rgG(_%lfE}($w=$uGupUeAq?4* z7sri&ccUwSYFBVeOX!l2eL+Px8_yrt3fl#;X!F*0eDr36dg~}ST0OtO5cx*AbF|KO z>teG{_kyHn>sqrEIrz~PRp%aHope(=bKsoF9p3h5vr62Fhq!K=;gY)t!dfMqpEog1 zn`9!Sm2$F!%*hXl6>i2;o>OpgbX*Y=4lW>>E@A@({M#VS{93tHw?Y%So9|W$a@e9N ztOML&*J|cd-$J1PekszZbk(xicOv}FPb<}!KMn3}O))4G)lKQ@B*35%Gvd%ZR)#}w;>GIeb30W>`39r-a zTLFwn)M+iP?@vAlpZhpxN{dLw=jlcwLckAzSoM^BznbVSTcN`e9bOu@lpKsg`C?9J zoCmV5F&!Z#s)`(W3+L=6d+&=faRMc*?vJx$w`wC+?2Afy*{rc&`Y}xz$m3ihF27Bv z`_Wcqw5a((KUjxfjkv+mQD|f?j`1 zs-D9V#z-0F>}J7FW5R)m6>8~?9*nqDsXXY4)b;0BKd0ToyU#1ND@HdF>{sy5_G)YE zoeLRnHQSR1hM8QsAZ)EbTq?})bZ8JGd1F<<*l0F;48Hi4DYt%@UFe}0sY2P^h%wD| zH8XMwncOZ`L}xG#A9y4dU%+xRO+4iQrb!7AHBM7DM2XP}Zu_RVKzM#$BHy<+j+TjU z7Oqo8J7;pcpFf4u6N}ucqEpCkREcY>0BzZNGW>0EG*<#0#Swh%v_-*>T@?sTevX;r ztCCU!#Ys6b-_W^@zyYCFq3c-o2iFa%&BBvUuCSkUm(z!8(Jg;2Mz-Bed7J@2d-IU@ zLKxy4fPdnxJ9;taV|Ir2=)p^Hf5vgPLSAS_`w+ka(`3_pR~Ce`W~-Tc((H85*@1R} zd}7zR+HBHx5IV{zLO^iA*^`PqH@@VkbTtMix-#>KdvAL_N|s!49dVix)kxs)bTf!u ztg=!@>n7JMF+^yAX!6jvr2{2)EJm)h@TXi-u zp*$0Bu)sb%fOX#YJQ~9PHOB{y`!Jf$1YI?JrtOiCI|vPO*FJYJ82xk z7Vy=Vxq-WE6|gA%=%$u;r;mkF?zR9Pqu~4bUD5&l)ZPvLkanD?+em)jCHFP0)_@~k zjOL%k$pD`^EkZirNloD}pPBls@^p{GpPj3dKelQk6NWO-PJmHXd?h~rM?GOuJ_Hw_5dlsW2Fd)`lHSj-KMwHq3ep(CIcPV;HZ$1^p%jcFfgrGLmk z3`uYO9&~k;xK?^}sh_UL2vogpJWX4lJPu@b{gLYo*qOUtG|l9JFPYfv>BvRP-a`%t zwx1-z(!7tI|EXA-*#McRXZ?!_alGBuGOE$5H^4H@!dGVS8WUT&^)`KuKvskn~$?Xe*#+>>G*&;S3 z(VRm}sC*e+r*#Hg(atdkoM6m-PHi~Qm zfnO&sUvrj6w8C1k`U155v$V}#3$uW=>r!=#MQq(f#XF(csBJO6F$=JV zEbt6_-SQLR~%BY_{wKRDQojK0t?7Q&-3dO29T(SOeEuNZg=DZKC#K2 z1;ew!Dv~VAs(9{XEvrQ*N5P}*bWpXG&lR}K1KG?aDh-Qu)3br#_i^ldCXo}dApT+&nVZU45 z-Da{~rO$qfSP-;iXiO1#ltRGw;&na3Kpzw2g+C=-^KsiDcF!A{!a{6tks}XGL;4)?tkrGr&^fePOO-P*;rBFs+i%-fArmNLUre(?NO}3;# zCMb`uU?$nE98fCk-`_>Li;halb+R%%gBM|GT{kVd8SOJja{y}C7?omJTK7cPy z`45zmrE;vD_emZ_J{km;mdFdv6Kl!UW$URpDs>4YZr~h<5a9~Y;IbtxH7t&z+VWjR zM70rJT}Pa8?_qro+>S<*%9*@H9(BShZ3Tt2;u&7AjG{bbHGSmAol9f2SpRB(ZOA$v zEDTvQ$+7!0UisU(f3);flm>-fEjDo5+kHgGwO`@6h;trH@M^{9bpE-xRm4?E5^TXz zw&QT^?E8t_@Msc-S4~xgGt%si*dsesb;!Q{w_*8f{6!(DMZsZDP0V}1ui*x; z@h4sQ^(?YsJr~-1BQ$NrTl*M7zj%t4QB~He71W46>lM}!kpHb$$fgF&u(q45hhRMG z6>i(66l^~8Pm}i<7VFrV&-|18k7xcV69t}*mKauA4~-arZ_#++pAMub4!k0wd9}<$jL&Z zo-SvW*gBohHJ~tOf1nw}rLycoH(eEBsMn;z$FEMTG%we21FY;bb+A$dZ?1SshIH<% zx>a^*SviO|W{~3E-g2YXOx2cZqzZ3RZr-?b59HBJ=4W<9%S&|H&GztrvX1Kxs!mT7 zdw0N_`dr&eGfqHB$_PJjK3t3`o=fLoRe{TE# z59q{;;Pn>H$3fbYsXFW2FHO!bB^`weKk2C?bwy!|CTi7a`QG#as%~3M!W} zY4FQ4`HH7Hd4lhl!^A2ulj@$~i@y~Mo1PU5EB;a}gbe*lvCu8sY}fJ$2bbYlvC!&8 zv9Rh7#ll}a6XOaPI3DFHL zz*ce3%1ZE%PJ_pF2$wS?8WKZ}2Vs(3Ocu*DLSspS{QAIgGr%o22Fuh^z{$Wo0wocV z?Dj-vRL^>lw#Rt>=FNk9s^gchw<#v+732v!=~21RFm;E>;%_?Zhog}D+nyJ?mQU|4 zTI>D!d_H>0>X@L9CgR&u9x{&EF^vGm@g3UGa<;o%174srs38k*oOEsyC~(g;Y1-hF z!tBOhU(mH?Fp@T2t1k{^Y*IBXz>1Q<2vcqlt^(=U$y95g>aW7$3^sqcS&YTP%`dy2pygyH&LE zu3wJ!*xEXHKXUL1AGwN9xQ!9r)=RC_9~=w^yT47vnb*#J=#d=eUSUU?|o$XhTYg1g#eEzXYKz}iVzS8DQC*-6|nWj z*6ShU7m&9%WKSLPuk9mKz#~sa@2ea#qq{0`h~=;Ex2L~4V_&%IZ_K|Hy2v|jemH!* zx!5qf$g*w(>pL<_Prwq2s19y^Zo+{6L|Y6)B>G&@k%x$*jNWnYSrMOJhLt`2#XxRl+ZK?)LH>_Y6*nzebwTyiF< zBLTbN+4H@0Pa+;bAmY-Y-_`!Y^U1@lbrk1YD^B9~AE^H8RUpaoP7*bGi45^+Cw^bn zXg00-bCC4BkC;8XDL`x)i_}xays0Ch|?0lbou1p{OwRdh6q1>}{?ab%ZsVO7?;52_tKLGjBc9TUX7+TV6 z(2K@rcaSE88PLm56AgQ%G}vu$QD z+%hPxNIYlZP!D0K`m`f@zFtCfJfoRs45_^Qz5wf>9o<(vguGsIEZJGIYRv`Tm$ROq-d*A1Z;h!`;dMp+`8Q7r>yPfi7*aMqrfNT4ubsU^|=p zyev|MmBt3ZHaHW0%o4$oIwj((O)DVS0n{4qds5OOHb1%6sA!Dvh})XF!Xp}%6P|CP zRdtPH%UKL-e>0|mCNsCMxN@~vQd!fmGzVJFmx)n>czgH+!K82MAbN)mH?D6e1vJ@4)WTJlaHFEnq=C(s=>s1H+W#H4 zj#!5VdAHf8(`3(JeaNX!a2O7gs{uYyND7J4cR+n64>IYxc9|;f1J#0$xoM_6^yW;%(ZwprHU8uq53&e2eql12j&^7`D5_gP`BGW7<$P84{(~e z9>86|eOt{0_yQ*9D_#w?o6jf`G(E5jm8hz+NKZ&uu8sIy$>$`+7Kw;8ECAhY6Z8xeWuI6YZ{`zGX^y>FjZ z0aUg};hp!VbsY!yAB&ZJ6-zJc9m>ivLt?oPxY`eRC(MOE+O{^|Zgay#ChRGKJ*!ASdXS^mc^Occ z{H&|mqVL`KydyPXp-(C-HeLM;n1L22+J8=^f{Is0eSCx#i|26JaTi-*vs zUGtRqAOpMZ&0^zYOkUN#5)4{X4O-VcZ^sOziMe84qXdQm?|`WO%+Rstf2U+2O9w_D zD)%4W(;mUL&T&Dz(G+D`8yoOYCtn^0Ee;()9MCv%r)=FBSO2{II#=&&kADUvzg;n3 zY>0rgI_zpA;o9oYJGVyPn}%W;rCDVo;XjOsl*nY7poZcM-@CH=P#jfUhX~GRTi3#1 zabF`kIYUUE|H_KjBKLxve9zF5w_RqGi`>W_g$+H>;b;3US7X=?=I(I!odfLs8#R)1 zIb}KBz1-!cq*Jk4BZBMXeYXt2ov1XcXGqZuYCmLh!-yv^UtwR--Va5F+4U`+pW?$S zLpAsEg;~!=6jSJp&dIFQMVhd&?Nq5uaZ5BLIy>7qKKf&&R*aBD)#GB5-Y1upVKcS; zO5BkirJ(S%vOECvQ$d>(sD8n&O@i#WaR;Ts!5mnqHs~;z`=^k0Fkd;&B|D4&jMSnS zLe)@>^DgUzZ_OY<+w1))MhVL*)aY@`R5#q-#9HJ}P#+~g!SKQVt&<(ArVoJ~yTAp3 z3h`1HG}ej_0*CNL75b%CcG`1MgtyN{5l~+?Wj%kM0ep}QPeG7a_zw`+f3;7OfWY}x zgfv$C`4|xsBnXI}zK-o*6%^50vJ%e$ z|LWjhC&SN9@D=EPJNcgs{&q+5;_kPS`Ev&UoTBoV9%5VOz|dZj@~72*^N99G9*Y@X ztOQoT-u$-uH?kH92y9G9-rtegSnED-&--uhzh>!QG4cP6NrD$7_E-`E3*z4)|9bPM zm4d)V`K}G}&yK(6E?+h~{K_ilON(FI{hrT6l;<-M;g5iq{;~Qqr@zc!BIkNB*M|W~ zKz%-OU;YsPFmE^f+v)#g`L}zX7yCcApZs@H3BLSo|L10u{|*4+*AS_dA+QNBjs9+J zYolvnZeV2i_uiF%n!g0h^3wb{&flNce+T?hnB+jf%>M5#ekcFWQ2*Wj@v>9qzoC}= z*V4#bPv4Q=*5=pr{Z1C+|N4gf!?$%52*_Vo^)IuRRp_rN`jz8fzdSxq5$5w0{h8yk z-)4W#(J%X#A#=aD{qGzh{SkP4!ar{RXOeygK=jhV?=|xCrGWBB2bT#TvCVUTozj2W z{P#lm^YS@K1c`mO0*3x_8T=0Puc>^wU1Esj{u9*iiTK^M&PzD|E>HhAoS;8U|CouF fF8*gx|54)A^9>c`dD9avi2Cz#cj~3cHOT)5)afYj literal 291233 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%0AIwqQRu9l^G$KqnbD{J(> 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 diff --git a/deploy/artifacts/testnet/debt_token.wasm b/deploy/artifacts/testnet/debt_token.wasm index a9d43a4b317495a1ee4260ae0ab8ff8158f5a64b..d22128705ff9aa0e58be1661a1f997a3b2a18188 100755 GIT binary patch literal 9146 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 E09&GG(EtDd delta 1580 zcmY*Z&2Jl35TAK(zvA`B%O^=t>Dx^Ywj!lY?06jnN_M3{)e9wDa>5_6Q*ioWB~=wJ zUP}oL#};2IPCfQOrJ`Ia!2t;gL?Wm03$k-ij0pTTlkV8sX?P3<((uMHqm6mcVTr%0PI19#u;92Q`j%sq|I7(kxXgdv(rYKgJU=kRX{v z0rnJPOQ6GuK#yCB_c(M`arH~v{>xx26sv+bC9n|-M@fOHS#3g`3D!m3uwG@c_5zz+F@|mZnw`- zuvrzd>Bf2?x)JtWJ0i4=E^eb6ze4!whI0E3#kk5K-8FiOZsLkjhCfF)IUqvvc!6$e zz!32gT`@$wMt5|Gc!TcP5Rs*d&gfpq`&SebN^jm-S1I`aLBrKE92`@zWyczro?v*@ zHnJM&T2T%DbQJIOvY_d1L1*Yr4E?oqCdt-PJxMBGil594 z!{H=N2PG&w<#rjobF9xV#_j8bgLjt?Y*I=PSWg1uFhyAi-7Zo{qE?T-4Pb*(xNc0{ zUhi4i%8HJKWp@~|ke2uYc3gv&*zjdV=0`b?2Kr( z$Rx6}2D3#cy2o#k(mZN~p-L!{qV{A7o4)L}#_R&s8pA)OJuw^fl2w|5sjy#RswObz_NRzG%JHY>=E(#OA9Zw>t5_=nV8JpOz1UmGVo zzh9fb?X4_iq4!w3dwaE=$MszzZZ0h@DUgtYBGUQ4+(q~fM{(>1 zWZiG%2UI53FC-*{L`P*hXh0}L6cm6ckf?aI6d*(gMVS5X+~kUXW_G^$c3yiw4ZS~j z1>)^Z1OQwutg~(xyX)vayqoDjsz+*ep1AWQNno8NPA6bOY8Nszop!q?H#B-D-Ab;3 zZQ|U(XHPzwm@5cB2w8+V$b;}X!a$(C1kK*weGmzlZyu39?4A5ImJH@MZg1>t#IJ9> z*@7{wbIjN4&3GrSw{AB%6ZQIQt@uv85pTCR&mRkMj0`ESNiecg#q+>c6d2s{Ruq~8 zy29k8ETACEU2Hrl1wn9%!K%YN$s^5r!Ehc_0*cjmL=;impd8Rlp@kX;g=Y@gCR{Jh z33$1P0vvzlVB!HXP6@FtUBgW7a*-&tr%?NRMFloGvZVv%trpohOAIRiB0!a!Utz5X z<0|21rehxBmdU?F>2dQF^vv;|`Fr22TrPU#z0@f%L2|L%`wcc55bkvTy~$ja0TR6q?7BcR|6h-bh+{O6}1vP(~ut4t29 z7G1NMJom9nxWs_QV?dtyoTpk&Lq7R*KVD1apQ!^1C9~=sJ!nx6SHQCoAWP8g;+-50w0?6+`@`Wo7UJ^CH)MM`GseURQb6|LG;s-1=-hm|+Q zltJpQJBX^i`0rdib>F)Pvg#Xn!QhVT(%J-BY`u?Oav?J+qZ)gZYDwoaw=Sqq7j;Ps zQKUH+NyIaj2?pt`J7^+C+>*Eg=S-MHlCYpEVtrXtvL_>143j0@&Et; literal 2519 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 literal 61990 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 diff --git a/deploy/artifacts/mainnet/pool_optimized.wasm b/deploy/artifacts/mainnet/pool_optimized.wasm new file mode 100644 index 0000000000000000000000000000000000000000..bc949e5f7179b679fa680f5a1ac7b176b0bb9fda GIT binary patch literal 60724 zcmce<4Rl@Cb>Dfv-Usj=fD7g5A-{lfmxzgk^+W20RW=@)Mst!Q%?QN)siPTbAdold8a;P>)JcnXmn% z>O2{q+?`N}YW3tKwYj^5TFI=aQdOZwl<-gQpHxeg6S@s{*Lk1Ex&(Hs!%8=(s{E%% z!R{f-Q?ATZ%IoE=Z%$wY`ajs+(=HqAZnm!tvZ|}awQkqJ?wYSzeFYfx&tvZ7?y9}c zJ&%ChdcqsNZF0)XfTGIPtLp8^=!c_C;Y_$C=;e1;knsE7APlF&_w)OdT^}I7%Jush z!l&%|K)BVeKR}rSq5IWaPlfkb&M5U9vv()MQ7gHZoayjxuBRy<(8^Xy?y(jR(7I~= z0sB?W2du3bY73}m3#~tDEk0`XPxF@QaW#K|dZz8^wAC|hWgZRpk^iXm;s7-#)Hz8X z9}N!}Y@<9q1|(G=ao4~WFN8l8-V&zGN^N*Bs>k&>j%&5J)>B_oi@0czx3Km-z8r_z);P_ zu0(w+-W|VZWw5G|t{M%4D5-|EFcgCX)gVZc{`dC2FX1vwf-vZf!XRv{et%ET>Yknt z^wcYH7z|ch$;q&opI;0bCxhZIzTwiZ|Cme9DXslMvaxz#>cFAdr=y^E`r!1@>B*Vt zFHHsiAgn!k_zSa>d!~Ya820(gT}Kb?pE?-)qpd~YA?w^LM z)%f8BpvaJw7$H=Sc9gVdHSu?azg^JyVAd9hp8F z{CrrMojN@Ebns$0`1tfe!_uy!vy%spJU%rW{6bj&;`GtIduAuU82qso=j0dk^bk*Yv^14+Xy%rjw67cIe52f|vRQ<;!8u%=8maPVb@f!7qh_dUrWG z{&_e=4YSwv?w7+p8<<^>PR>jod~7PX6b`wJqlb=8&g?q!k-+s~dx?n#Ea? zZr&27Tt-{sI!U-C4&t$_QVidlj1@tv;%@Fs#~>pa_8=Xk^h{02UP~)ihQIS@6<$_RM&4It%?pdRt=^*;$xH>B{lH3{QqLa}HhmCM!5RLJ7!hUtN>@N!pp8fqjVH78o zYOUS_U?H8)gW`Lq7K5Ua-j{_VQN0gDWZ_+Lnr?6Qw2OS@G)3xVk={;`x-SwHKdd4H zWsx2*p<1$l&ZnPf*4pLHt6Xnc4#X@gS8bR3$12xTmaAP?uF?kW=T)u^eYFEx(yr>F ziZsfqD%VvNt6a7(kBVPaxuz?Z^(9#-&_+a7q56?-iHF@)T@(l4;4l4KDufuevQ4YZ zu=+cytliJJ16SCF>tCrzTEZ1Ahl^66&efYXT1gg9^o0!@H4$W%GzN`4fGA2gXK@;? zZ8VIG(sz!BI~oTf=`va1NFobgDE=~hf=>QcAXbQq#(jN8tm7Z~n)=0{kJq_M;RPtz zI+V6rbUcgwa~?Lv13eGMPo0AzVYT{r*nlA#O=~%e#-sFojju+uorp5WK&vP-3zM<& z-c~#wwvuQp9#c*cKJoEBIHm~hiMEks`?AD1ngJ@d?Mr`yj*UdyfD#58X~E#aGow<3 z_wimZ4g=Ro#PAvT(3rrv0NZ5ft=jdVG=|;ve^jh5>s7vWQ_(8~c| zu>?djQg6F6tovkuGBr(`gU7d`f&1>PlT)luGe?Xm1KWH7a z?u|#ZBp?K+Rjcyp?}TgJSo+>cunGL7Sc2+TlPEsfuQ9w5bv0Pe8Gwz8aI>xba`T0_iBNuiz!-&yaLc$5V3laU~gJjFvo zS$t0fH)K6q;;kgLE%6A+fMeYu;}i(fAS&SrGFbQZkYdd(poesDOMFpjWlOxI6liGc z5|=_ZFQ+BwL2=nKhJA)3*a%_~@jMX5Cm7i%8q=QyS&+vs6w&_vD2SX86Za+53kE`d ziX|h+EN+S6MDU_}c)H%W5F0DGy58=W+FqoIdO5`fjq$h@zWp2h)myE2&;ZV$_)f6D zzpB}>7yh%HbMgNE%IaH&*R1s!Z;%nMTfae!RQztZzpv43HpWlE(&>OpGoOz7bTRN3 zSIUdUW|>o7ER`46%8U6vU*=qSF~6qFDK8f9DC;RNmdcB3<;DD+->-9?%}r$P_d&4Kn%eXk~dn;_lP(J}VZVT?`5}Q%wssepkF# zlZq~OrypGgJ*AYL>1X6R=zHC>Q9avw-7~~ebV67>Yzif9ox|)xJH5|UFTFvGnr?63 zb0^Ur(fK?s&Z@YSH*jfv58WH|UA?7A&E%%g+!Y^FuMv~zH7edmS+Inl*h*27Q4++E zFafqQ5`;w;3Xwm;8e#(mE-wG5ng)=1TJT^zXrTz2bfV?rN+4nJZ$jvx)D}cGs9H-* zn9#{6>Vs}G{UFcolK2ybJ|eCbPDUAj;SAhcNr^GZW^ma3R6|0()s2+&is^9rk!7Vc zLg*~}9np?T&v3%Znoy@h*Xhu8I&^e{?4@tztfe`aNvi;SQv`AVd;wj@1h~wVu>nwE zQ!$Cn?DtUwH7twHF#mJu6@;<5@xS!{f=6bP6F?WHIix*ae`dUKy3wMqz8+aU^~MPG zWHHmNWK(HnMCC=>+_rVAF{Yp37*r!h|mnn=pI&E9=;VMZ#Bw7a- z?NJ4AR|4v#3udFp`Wir}-%Li`Tb4J>=?$PYbM2?XQj^V`h~lB?pm#?jC7-8iW7q^% ze4W7ZEKirkpJR?c#dB_A72Ci>;ylfCByGt9r50Dd4hEs?A}N^%>%!}V5hDgRf1quA z#xM@phH-x#RAey-NKTB06lOM^*%>@e^;j3fPI1#ChXa)t zo<-|z#oOug9xESQ##xVKk%UP!vCa#Q*b9!{n+T3S4Z|jV5t*t=dRLcPR_|zgUQKI1 zN0SXvXZ=0z?QPje?v~uXD?aSz!eg3lC7xaBx5bp4z{Cx zb2riIbKvaU67S@yZ%aHuf}Xma1UeogVH%RE%Z$UUpc!X`1jRQafvx6+N+zdcB(T?E z5{PIw31qvs@h;LV@xrq0i^<|rT$XY(y>o5jLM^JC9F(eZE;Knn`*E@8Ea{tDHPT%W zbU1UIRTFm4g%gn07*n%GI&kzc*0w};I(ucJG*{|37BE_w09B4;AoAEC8g)dD$`jvU zY25%%TXhj6=r0om(qnTlmM2AUUlAUa;c@Re?jmm@ZO{9xLkU)zD?5=_eA$YXt@yH7 z82fUBpVTy?eyJ`_Q`?>Qw<}SBz4^eh`(cbXVeK+z9`M{1pAB2c1|y=ute&p3+41lx zOH!3FEN1ChN_P~N){x5|=|Y}Wx3jfEwN12Ex&ouu7ucG+Vf&XQ06SZ&+#9RmZ_(d4&SQ?1Wi5B4mbDDx~^=`y%#1felNHW3hKY_iN3IO z&=k*oV=+j7BBZt#`lB#F*wZ1}8HtXkKN*fu$vY>@F zLFwp;1=4a+eg^A^u`U`A{QPwpkb{M=2F zd@$HRQu$!8o}|yPHq6z4U9IG*->y=wVDX(K@U|F!mE-gkj>VZbq}~eAnh)W4Mgh*$ zg!r{vqQR4^#i>ix{ds+35RJJ%d`lJcx1^QUUHpG%`cS?pt>$Z-GIHA^IE(-Hpw%M} zUabg^FzEH-Vr3t6!T_ukuQ8<}mPpc8zmg^#N>WF1ktD4F-Z&ragIw#y0-lRxwzZne zt5gEz7S|HXx+SaM6`zY*w`TQ`Xdy&wuF;6gJJ%YfThUkn;)*wueRXCBR z^GO(}$}9p2G5|eA@WB8C;T%9-0P+63)`!m+KXtgjsC}X@=q^;-R~E0fuPW^;0P~f_ z?W?GLMNj-w{F=B@aK71OIhujtYH|Dt%e_Atqrph5fnY6w9*}{eL5H#)pelP(`;_{T zM^=7$FCz6K`Y+Opn(M`~nbggzqb|vq1h?+$BTiB&{{shSplk zTie=@t!cHgTgi)BJ<6l&!`V`o-w!~MdTj>?GfgXxTdyPvC=w)TW(u*oWdP(_L zq4X*#9-meZC@})ppr>2uHsHUR==WM;J~LSp^x7Tfc1(h31X=rM>oQo7&dGTjiYOCHwOJ*-{b`A#G)%Ry01w{pqs66<$9ZUYHh z3e5DwX;14`*s+n_mC8?S%7cU%s)U5udMBVVrqK5U8Vurqz-EWG#5mg#u`Wt}JtMxa!tG1E14-U?o@jX3}Vl&=w@|EOeu}F}owX zEz2|IJ{xK+z_>!~KO6Sd$X%iguO8OVvGMum{{6S(@gV(8dmX%2vyFPPJAapwz4_+! z^WDI&SMJ$LzV6KU$ulrxru+HI@%;8Id-$bnUAF%C@jNqzq_x_|`(o=~Lw#zfe`{U; zxDHzDl-1S0wdvncb@XnXQuS`Fz22+Wd%MuXbpV!0x?W$?ejWU~*8x|^p$n)F*_v#9 z*NUz|u{~@J{uW1+%qjU+YdMStCi* ztbTWNDQw-r>#*cG`P^<5O>2dwwa#$e6t0`X^+q>TTnCUVNf)j+c9EiyGJ_?>4Lm{r z#s~1jn(GGN6Sqd48bt&4jxoF+y*Crb8rK;7{JO#Sw4+gP-LAp!dfn3wuiq{p^twlh z!#}EEp50~@_N#~eUDU*N9hgbFD%=Pweoj?UrS*p@4coU{C4H)-ud5QS>u@DWS0!zZ zr4r*p+8<;@34UR+bEtq<3wgIMI z>zKMKrbYnXk-ftTzax7mfA2b;zw?oolu5}At|U<29bF7j7T$^#+N2K)80kauM*6To zH|b~VJn7%=Ngo!1^zX`AZUR9(e;7i)3w_}BY<(+3TX~0RDQGJ;yLoB{5aR+{$XINq zyKWTZT9HH|ypgn+Q`(9XwzTFnl#-OkXx-k=wgmDBP9sch-9~PK?p&ComF%$f@7S$|VF91D1+5F=KE_v_ii>&6K|+-| zvX;&xY>tUHv4PQbWr3J?Ap$Pn_jU9ELseeRft}`4491gmz0~~1$CkO!qz;;PSbXG@ zfQr8>GYzn<4dS~KB=WwEN2kWavoFYrIri7A1k1%&fbM1s(F84s~@^7Vj3h+<>{-HgcGzKkHfUgP_Xtojs>Wtg^2&d z2!I*?Jb?l#8L>P^i0hxgO~?j_*#r{0L8Xe z1@Tp6R;srYXCeSI6;tIIy7U{Y4U9zRLS>Fb&j}NtLH)AsB~n2v#Z@$oip_l^m=;*q zl)Wr38R=_b3k6(jAF}K8d~Jrn&{Rzn(mfFdR{YdGp$=mZf; zV~|Jh=?U1LdQv!%WEciiOZHEJ5Gr$O{N#=&RLm;IwwCy{x9}s#QNW9EW?I-R5)}U@ z(BPwLfL!B8x%Z$>0V!<5mBYgI6>|(UYyifq>FZvkiR6jbo+$cxVWjwfMBYUxU8BLU zswfq}W!=+ERXJO8mVi(mp#%QN7(JfXm^@e}VDgC0IAiYmDs5028WbcbwstSg*z_i7 zZBUkhpg~|MPlHgoZV*6$4TANMx@;ueC{W&y0#_OZ5lE+Rx>0j`TvtQzqj3QegeZQQ z8dy%>wYKqleT0?N%#)hz&xeeWm^TgaLz?t(<5@aSS_B^oUm?}h^s-X;i1>sd5!=V^ zL0hB9n{d*Q8c8R!A>3t7dn|S8gqYHA1Yyg zHXvA$G*uT0HDr+>)r^$Tk(z+MCpt4a5uoM(oeZ6w(~s%v&3#|3;rx+W>W%{B}qh{`0=H4K7)s4mU6%SF_X z$R3C?{fvn8L7v7-_bE9qGhbit0;sL>sNn2F`#Xk~!so-QleNVZ1JD-lB?x@l7AW0gV&KQ9Ry{5D(*! z%y37=kBTmu=rtsDh?$W{+)N5SaLLo%6)e#`rra!BneO4e@PkCv0-@Zm_&tWST!P$L+ zVo~W(aWQrd8C{>#^{aYisJIq!z38rS65SKM;;!4gnz&vvJ=)@UIZGypkftI08tx*d zH;pbFzcrl_Qm(}?HtDlTzQX3L@;!uufA2fIH&mQX_T3c)TM$A+#kVczdvQC50gK*< zw?yAkA6DEGeOD4I*1qD^QYC0s zE3Ob7a!ar6{sc&tE?c96RHMbHe7bO_*+r0fqB-qzp~a$?k>BFsFnzR8=!&flAcufJ zD+HqOlUZ2FTwDTiuOS#me}$cyCW(Vn_#S1scVP;DKvY^gxZ8)&iUd(Q>k__w=qy>d zIoKu^K>Z$xKEUJjOsMt(vkwraKiO4CX?!0zYy;lSe#GTV!}A`J(CUbx1+h5z2C8asX|mj`DO$(6GY5 zvYg%2vji7)@YC@`A&#|Jd5v|K#; zU1ZaE4{LcWEhYR6 z;`doNsrEzq*|Cm}G<@*gs7TQox2s=h+emDUsBBbtf(6!ss?&tU(%@;ESZgjGxm%N` z`Sv{QwRz;Yvqd)XW+?X`0Cl91GSlCZ1X3xHB|*QMXg^y}j)9y2_6}^FE41-Z2t2Dc z&b8si02RDfS^O+kr~kDXLG(M;whknqY`g${nVHYYsl?q#PMINsV-`1bDWVd%5R$k3 z9MFJDc-d4jvyxtD3QfEO=oD{!xwMF(O#o8MX#Ahc#Axah#F>=Jxkwi3JB~3^LvbK% z9mOHhtZ%{I0v~&FKX{T6LL$qgG+WL&bHLPN0fQtNZwHUS73mXM)oGhQ`LHChTb2S4az@ex0m(5zPpUSI@40$Cv>d6d4Fi&3I(G@J1= zoc?VItWjr$hmvVqwTc{O!QD|-##WB-Qf7k(n3%wk>~j}WCyV@liKF_-su>c_9V7s| z|FSR{OAoqvk}y7T^tQZ`9@52FUUe7S^O`O+p1szwyqO+0K+y>WYTmE=k!T_h-5U?* zadGZ{3_j^(#Lhg?-KV6bNk4<#?#ETm3tRJg@s3aF8oe}cOt77#G5(c*Qu(aQ8YS$Z zyu+Budp_P*(ZFZ@F47VWZj?J_u@MsVwv41A9{_7U@&RDz-4pF0!6UGngh+20(P(dC{oSSbw2&>1eeh5X!4^h6N62nJ}{x z<~h_p!_sre1nS&|L3=?gr2T=l06_E!a?$OsDt?^t@N)T_wcJ2hGl8%SYRx$q*oifM zTJDEysY}oOhag?Cw((|!9Ox5WT??)c`P+(ECmeW8Q>dtRB>m_(vptLfwgM&!Fr{gU zGTWGzNFG4tBT+05$-^xu`0i*Y{uh$%3MOz~B+cqw;eo1!2m?JUgA13nz`g@L8|?}( zwx+c*X_O%HfRIEGgjr~_nIns4d85&9ls8+s=`C+Wbv@;cXs=%0WZcvwPN2CmFXg5k zvsmW_c?TNQy^ob;_M%Qb|HDXkx>WSvER>P8IfUSg5h{;4c$vbGIHG{)WO32aKq7B0 z^L!DR-ZZ>V3XC%G0gIT6Va*7NNh7w;sdpk)+e)K?Wh53ss>O?60~%>xw#jb-t_7RJ ziXf7HhHl2i<{-->AKVnd2kYQ_0->y^b}rb(Ncm2eC_}lH2sA{54N1i;{$L!d(<#?hcsEb z?p#;gdDj(JnwOTjt{fUz!6=wk*7-291c7-Ogj5WkkVp;v%n6FK}>_%xfgAnt~}$<_iPuPG$YkjNp$n&y0{U${bU z%_boPwkS;L847n?f0!2(+lkyGnE(}5&jTb71A|~5$!76d`}GHI^11@}d3_Y-Zqgw{ zNUa=X4I*wOO`{#}D7V>h?DGohm-CL+q<$gemqP~V=+**bnX5~ou{^@r_28`Ye0RG@ zn<6toUdQ!C>oleX3=&yS4dDtMRtgTX4z_}x#<8Xud_XC^Zjw*(hao|!UelOuTH#lJg=xbKh&p{v36TBtyC@6ExtqSt3nZh-qYH2 z6L8}`3n6bxc6=M^d*$^$k1yCk1)p-hS&0`@WV%7B1sr3`pQuI2$)0lIhaA+(=wJTO0s#EOo|hm{SRWZ6dEPY34>IMCj36I`P4RNW%UFH`Wz#_Usg{7{;uDI? z?59Hm&K{+6O*#(U(tlM{60JJm*!>}y*?x>gCE#|#M=-QUm!-mVt_z>m7e>j*f_Ut# z?_pv7p)8qL$1u?*S)jPZ#(u+054Y@aMGf^;cO$`S!2_dOCxG2{&LXCuN_#C$ztm~l z7dDJcApWgzrotmMn&2sK7dC2^R)#TEyn$Kb0zouw^t-kcJj=Lg=h>$;-QbxHNwI^@ zDMi{c5g|z}z!)#1B8%&?dUlf_w~mn@9}kldZoGhch6_P^8Zg%^yhz=5OMyQbW7^t= zvn#0hHF&ZnR(gPh84Gb}5~=2AEMvafNb~>{U(*bQ%ru?fcGfEkwWe+OYqDX%rQ38&^<*yorM$Yh-_4a)eakkbI3wXkBl3#k-gsLLcVE6?r)&QmmbCcB zJ=gvh-J|BWBOA#8_Yz;Qq1#fD$tbjfTjem2=)h;Fi{a}FjDmaex8gJ~mKh;I(q$yx zasg>Vxi*JJY)L z8vc?&HO}>h51i;x;KX=aRl-l1d8rqV+n(PWyp#-f3{I}|Q+~c=1-}HqYv~Uos|}sn z0m}p_*Q;Fnc@-IxRZYdOAa8sC#7W%K=3j@`enejAwpV_i_1gPxLgzxrU@q_BLQXph zgQ|?Yel#?T9~n`SmphBVf~9XlU!klfM_)gw-RlEg{zoIQYj3?J>}C|!SY?AO}hLe2jUa`+j@g zTy}p9?a(NB!clT(dl$R4aP!D^WIK!%xnTzwMG)v#WY87a?Kf|E==bJB*R_TNTWize z2WEURLcP3^>D6z>TN#*BPVh-J6-c|e*tW+3&H2s02G$+!h#8FZ#;EYyA z0~#aPVZpr7co;cgCBz!1JxGTd2VCm)q(|{QQqB>Qo4Or(kEL zKwStu6FKH4=R)Y&Qlaq>Eqif#c?VVWbu&EdP?p3K__xU_mOx1&Emk}Cs9{MpL_4y& z-+ZCGtK>P0y?d9TAzE-2Z$7iw*<~1n2v3l!21lZAhwL*f!uz$F@mIAK!3QYb)}9j{ zzaQ-AGcVwc^?e_(qwjR;E8*|g1Zv%o0YPII!|v^(1|$NI2b{fweL%}gA+M0J7&Ek`eLj-aQHQC=;*&&GZsWR1s=cp+qG#3zJ3Vnx~ABcf&hnH&Z%{E{$L z^Xeu0#lkj&_?6k%ra)6sOKzb>(JXN{a=dCR%Y&b?b>rW-_H*C*|9(Lz2U1(5U77bP zE?YFO=|@AS5E4vf{-qD=L0Uy0S6HWW53&44{TL|YS8+d>$)gZ$SxWGd_RzIBWC}Sj zfMlp!UEB}}*6IOTY+$x?SWj26X1UsPgKLwZRJDe@>3LYbl(}r}BeNiLpq!4VBE6*>N*jEjv_=uP zy*g5@?9(c$@9L42p{%__S*ZqZ4MAO_2tdNSF(SLO5_3l5rI3GSZXEvg8?=Nr_GaNs zU=@OjNsfu^;frU+zo+o}xmKNVq$4uR3_#kxWm)fg+r6*v6fN6=N2f9K@(`Hk`nsF0 z60X(mDuUf;4|6$9x_ez>XoDZeTh(jmD_PdIm4cacq!^Bln?J?kZ$7L}O7wr81lP~4 z+INyQ9Ws1CG06Bl#jMWldEEyv_TiWTFJnY8;*cV;5JlOCT~>scITW#8I@e?~AaPD= z26nsA22u=^ZQn^#_P>bVJ_|}y$f<{I($c74PTSSxD(Jb6Vq{44zQBP19Hd8#H~iTi z5tI-wHo9@h`GeY>=n?!doNg84!lFD8IyZUc-oBF9+JuR*aP#U_)|bv*uqW)#AGo@R z9p7vttH-%5{{TNkK5o*6Eq^D!6SiR)KqTi3L7l`p}f1Cu2$JC0;o~abnf4 zR86}0Cme}}3B30rK~7Nt1qWGkaF8@Vh34N_!p5EwNDt@zO|Y=&lsKHXz2}$rwt9 z{TBEWN203=*Cze0L|0XAs2oIEfwgGAgjXCVA!ym2z@1LFe$Mmoc+O- z{FKyKX(-+jO~=~N_yyd_an>Eb-q|2ibnRl%;2JwLeh^0suOTVwTBsu;{1ZBC$n!v3 zGRicA32aL|JD_wD5rged6ZWONBk&z|Tx=G8QpAx3`^9m1H~rDY_)3)P&h~MG-@BB^_3YNl`Un?75K);Zo!U&mL_|*iSD|{O zcvTp%Qe68Ay3+0->u@r=2k@>yeI= zq&^pl%94AbBSOD)h?9k+TDU0}d~?#^hTXqV?TF zq=4+}hUlgvG!vFF(h5ry&FCakg&=z1n0BFV8F7BU17w3cqeC`wiO}nSEe~ySKtn6Z z0pEl4MI(pTbY^W@dKbWBG!~5^24zc>$Hp!NY8l5LnB6VMpGGc{0$MD|?bnKkt8sB> zau!0m?R#qSL2yBOAWv{S>Ih{<&zYjb2=7v?7)~-pjtwe#fc0Kp$XY9krFq7pSAnveOp|dW&Q%)MD#?;k zj^lYfG&{^6e;&IVb9~c7DSmYKb<+S%Xe~3!A{EJF9eoZFuzOLVAJud-T@p2IrlU<| z)6opan~N-4RKxhAFDZqKFDhl>2XnG3mTWp*CBCS1z1Tt@;rwOo z^Lo}--YKdP2h(AaMwz#l8!UJS%e0`-p--o z;+PawfX3dATA;-u@iZp@$bL=!EiLn^kc|KFZ+z=#|Lpf)`uD(8aK>Qz9vc~l^O!Dr zHL&jDGPB07iJNWDt-9~IxtpIoO7RlR8cubTO{5uD%Z7j@&UPMNxXq-9Kk$l;0CMZt zv7CAp&KmBlk9Cgb3ZgOnF`hR)nu}%-UH)h;AIO6cD{~8fI9F;u`kOWlXIk;2r}$x$6=QB5V~K!K#3 zVkJm8J575@B0?IX;+a!OIPH}%R11pxv*aZdCUKNj!yIOG6t{%XuSeH)8j}7#y6xo1 zO}g!A>@B;U{0(&*FiWWuDROp08v$>86$A{G2oOB?LmK^dp1nMl42Cqv&I{+C<%PlW z1slEgOO2aj%_!+ypC*Q%sbH7(O0QTb=_Zm~=t82+vTwP(>?Kus66DLz01Yd?MdHr3 zXY)bVf|q$TAq0Q!<2ke*zmA-Gmv*^KH+|oG(*b6zk z9}p)Yz87LV@SA=*t4(Ngk>*q!&M^!+;FeF)agO^?XQMH?7-lIxes&i2ut3tMUdacy zgDnm2WJs0(a#T>cq5ClSl684MXtom)9M1c_aEhFp7x}q>$Rn&;Zce!+Qn@-=3t;!Q zrVbl~c^d@Kbq;mz(?n)!zl9Vp z_|oi1W5^}ZFohRf9il#_7EHHy$7tBQ3*lnaEyz-!JD6+FGOb;;AhQ$@L7yfo>!_QMoAV#21 zXwG;90=eV@TjkI)KijLww3vG~V;!^DIOTAZIjVnwT7YkZjYyG?942@QsG>2%s$;Hy z8NgiL^uPus(k5`?T06RNzVlR*S|sNdTE4T55ZQ_7gd&mqC=0mvkx-G=Gae*Hr z=uYot*gx)c$XHWMtOXJK#XlQRsvkca8E5IbD~+w2m?w~E4s%nc+L;ugclR2aAV(zWPq zdIU=lo5O%?=7a-k6$vjYh0HIBc@su4DZgyzZ{&HrEJ!@RN9Ss zo+^oxo-JwKbG;_!%X&QoLb!UJuQs)xSF1fl$c@M{Jl2#ivlg9^u z7!xu-VCVY@a1GN3kVUR}tRril=rpk`H<^A$$^d&UdT@_w?eW6WEv`M*zj}}7>@2fj zL z0p}+iV`5%N^jmVj2~n1AuPb(v$RG7#V6L=a(%Sbg`8fj!NZIsjUpAqu_#H@IH8}N0@h1ook!V= zRI0NY!lSVk%6Lz<>I^?5bCg`G4JdBDGT@mSwozZEF0W<3RL05H+`FA|w7Shoz10MO zAU zl=5YUHhnk1@q(q!oO2F(~P8{_)-SE-^spitxD6I67USc8XlAd#b(nY0I zvZxe>59PveZ zO`d$xXKQ&?bi|Q5*6rduRdMv`T6v6DTzuPdzQ^}`BRlE~pg7p8%E4X&7GKSGmEyX& zLRz4ksVTPcNqiGCWodmU2Wo?D1!9sxDS{Wv(Fia&I&?O_7|`FNeq_1-&)z+p2dL7X0fE4#WeT&8B9Yn<0n=GJuORe zO6I5$H?gt^Axq9c00TON&$&izYtyoM4Gfj@+PRu6sb@lGO0ha$!60U~!Z(dl!J4vW z*dUfRd!stxkLUrg_H5GDEiq`vzwv+k@_*zYH1s#GMpR(*jRCYIl`io%ZReH7Z}&#E zlTFR9i&$1QXG_1OU6n=MCRR=A8LCsvM9VfnoB^6=*+zG)g?^6sW4)H>svDp7yQhkV zs@(V#B}eb-ytC?!PdVF6Pj!$Z8i=$r(6u$IdE2e#Z8r*SSILR=6s9nfJdRwQLzzd; zyC!&v5@l4#UXpi;^!2cX(uD!08?2TJ6IR1d#&|t##SaBY3WN1sCYtX!yvWs_c9mzf z2u&^XArYvg$C$B64l`j>?nT8tk>ZwaDtjShvL-zjay~uzFNY{9c%Knhw4n5wv_X!y zxxjJ}jmsSSrn~%gI6@!3;7$hFi%LgP5Tyw+8&lf{RGB##o0H$%|<^?qzbHXQ9p5D0Q!DfF|T6giIWQ&Zpox{u{AlIl=Hh`fq=B@Di3nAto>4lJODx?>|JgQr0;&K%m z%^yebN?`NdUe0H%BN_`E7NUAh6oF6NHeg8vC2$=kOR_oGE{lbtTlF(0iAPX8=1Ub> z^=Vf#{KK;=-hAQ49CEm>WWkgxu}Pummqg!XYI{lW;F7b{$x%J8!#kI0QqU|aMU5at zadR*u*A=_5E%wIJCGI6Ko|n%Q73w@GSEF#obMA6pTyl=(BZ<=z4b1&X!BPspXHoia zw_azgIK29`3py&WM$zg?t|lx)$R)t_Qj!yP%u(`L{UQBG0bhq&$~B6!^i&>aWHq|f zWPz;dvRG2*MatfcZJ@B~*c1sDAQb~^ZIH{AL^(hb<%seU^G6ezVel}S87vA5)fMy5 zaQoSif2OZC*xrYBH_%kvYXnr%!zSJ1b&JP!!x`nbz*fF;>>z6lX5?^W`W2;rw}a1W z7ASm*dB-B9uO)dywh3>%ndH4PPI@^-5lN$^7gwt^a@9naap-@sQg&tq7cWJLTXHas%$lIURk|i7wRr}`fSb$OjYPUwk-TGe zsld&o7m!^_FM=aj(ta1*6Z=IoQNGNI$e5a1*ti!l<5XV@k^Gj*_%;*QrcEwF z*k5ai2w6{xzri7bwuC#3w07rd;4O#A5X~?R=p}~9HfQ`N4wHxx6Qxw&r)n@#P)m$3v8<7$<9L9z zhp3mx4m*tpW0Go@%=aWav_D(T9N=p~yr5s`MH9dLYHp&41SIC5uxI8V?n4s#?<`%bFe#b<{m}Rn53Kh}%%akp|&P&i2%hx`3siMVOs{RgD;|W9a zNaSw7l3ehXB>So{-=KZ$NKG6R+AKTF4jLh$IkYqh9Ml>$8el!ui|k%I@P4R9S=mib-ei) z3ZTHXIM){8zE~@NnfK*(2gk66$Nax+F|Amz9E7e{kmOadd@hg9>+l;3oMOb~p%L>imSwcxShi%(! zt3WyWBs14m(D;a!IYG`vwq8V23n(L9PYstm9e|`wNg>sG2UajdEuMrs#59T1YfPZw(Br%vrcy*i`EAtyM@wV<*B){@~!tK54DE8>;p~j7+ zZ)CcihB-onyDid>A?sPj*HI>PN+*$bmBJ^=9L(bs-?%M#y9p-L_dEQhlEXZ7aX$Z( zlu~$OO4VR<(T2Xyk;kZ_+8FXY&%@#szReVwg-DF9<-FXcL(l8p&?g)9vahmWVngpj}juMM>=B zFjoUx2$QKuuTlLW`s?%QA|M3a`R)xD(7@uk0vc*afZ~laCNo3HOE*E#MAA^qNEw3i z=eKbv@;fY0v9~K^TC~;~#4hVh(>;ha*MJF_sJMVj5IWl&T#6-P2o<}4|Byb!5;Bnn z=`tBg7fEIGpz4vD<&C{jEXdM9hqG(>fzjcJdqqKtibZOlRDksJ1ga`MkJNht*MC%8 zglHKl@-CvIAg^`#a-ARz=E|r*81c)3lWO5B^-EgJVP(ov9Zbyo{IdRJ5s=`OZ)+rw zk5$Nsk-k>X6Lq;#R{Dlj`YJPkBciDIuI0Sa$)Pr&*us=VhlmvTo{bp(A5wiESct%I zafzX2!S}}CP}e<77nA%hNf{GMINEIP3n4imTcn>Ve~El>UC(=+u1Hk~ryhN}gmOrz zp7xhBI(Pl7GW`Ai>PhBauqARJ9;HSut)mv zhbo%49-Uq(3oaTx#wFq8o^T2Ru7+d7rLmGPEhNYp!OFc&=$MOs|y(;;Yt z>hR9Msk|2eT%~2@4@-HH>O_IQQ=DeV%|lr)XY0kBm9}1$Ek>VJ!nbR|lM3^hgj4wj zJ~fkVC|ANZkjr;@UEQ4bHezVY>Qtvm-q4xNs3pIe+Jlmvk=I#|6iQ=E>oMwjO zm8j2lH$j%#g~1%I`WI{%E<~=AZpSs*=c8rBLC(1-A9R%AzRRP^3KkatxoK#y!zMFo z__A6%hj$o`h(Y!WzPCzk>vbTgmg|}&5zm27&a1OSBSUADYv9!D8uZ5{im|M6!CA{! zcabGF0L`PbqNoVCUY1b-Z;lV_1}Vyrhu~gLZLr~ZR_KxY&8l)ulwIb@vu&b%R#@T- zFPzA#ZQIsMxn+3ont_IgoF}4Kvd;EuSD21oY1#dJFAjI^m*i--hQCdIu}B3vit`rw zZvX4!5`+4#`=3mB^VR{5UESv<&JQ$NON9W-$s8;+tYBl;$1Uc|NHvz9G4fZuBP&z+dz9?VZ*SujTCpM9o^N!_w$U@& zSbm2(KkQm#GeUO99ADlwMPR81AtZmfz>6^eNYB@Bh=tCLrqhjWaA6}=;=OGs`B>Qj z9|9i6#P)B~E7s>%6T)UBch0E{S9>@zis0;$bguR2POY@=bal7h;r77+*e%_xq%bZh zU22P)jbRW!xn7nzX|?EFDnTem0wNP-WdIQ9hqb3KwwA~@72rZWdq;Ms@QY;m;&qG! z16gGkYK>N(8%GLW=NoWTUdeBhoANgPa77vb`KX3=E+27t7RjSr3~Lw2FuOo90)0_8 z9@3Z6>_`B|v&82DA$UYtz3A|U6jlVnYSDq53^24Y$Q(`v<9v?bS)I|^T)r+F!OhS? zl8OJz^?X>s4fE%KTdXsO8gREc;0R_A&<}+c2+_9MmsWVWD78!;dS*^WWHg>gq zRkr34=^Qr0q9T176yt{%-*9n;*3ibJ3lhuX#vPN&hb}fS)mKRz@nt<_g5sgFjH1?o ztZNAI;1e?g(2f`FvdOp&XuLbpdL^UQOWE!z8-C&AZCyOfbmas_&Cj;%o>d=En5E}1 z1|J~7=RU}`=8h)n0#8fzhoJXtNXjU)fmU01Khw_$^4=6sJaZ;`)z39$KgsO$6CIKD za^7igGne>ZA=euad#MxCqg8XR++`0aLdZTmZWv-MkSZ2pOxUP+{uHKU!}cp(lqG`g z#Q10%VZWk2)ladzLN#QO$U>x@%X&+m8W%r;o5OJg^eb2ng*u^-7c<0pNv_$dh1R1Pkk219&_clr|b|fRRhrwS!!O^dvL~ z9qlRf&B0Fo98o=zODo%Q2~{6qvZ`Ay)nRSU*1m}p+T#K%`Vy6-d zGJ2uYlXdx=E?JlraXI%6GfA)fJO8GAa?TRFu;PtDG}igMsp;Prh&^w%f4o*i7D+0< z;|N4ydj?RB2o%9S$E$T%D8yv2@1>H;_TB1|QK$ot05N~EmG_dw#Rx8dJ$CiS`U>Q3 zvS6B+#Zg=VRI(923Q2~b#Su_}7HmuU61#ob$6^f2}aW2t-B^+#GH>>+nxh);`@_!e^y&WA0U$C!~L zhm;LpRXxYCV-DB_9U&BJZA#rz9}q6g9~AYW8C;;|4Z)(dNYZabonSd3t9X%8aq$|v<02OtSA5fQUhU-22Mn|= z5zE#VET`=ea_`~@H3X@TBV5k&qAgc>tecY-#l&Lej;Rz|2bnY7aDlDPcp*!8e8nT` zV#v}m_m||UC0(?qEV9eB$^fyfMPNK_F{UhOxd1tJ9AcRz1gfq$c?2r)qtYFU2-T!B7WJU-#;Jy*ojA57ZK7+O@Y}=6jaVIyl7kPh&uF7p zIN~;X*%l$(eki91ZTGRWF=#H-{dTu~i4P=Y<&hQaW1@cwWmEgqV*9{sGm+cC{n7S0 zJvtlaX3GiAkq0bJGd8(fPd8@~?GPYV2QBC2t{f~y%Dj^7V=Qdh5|I#nlQ1DdplM*iRwT`Q;W#iC z4-S2>o{KQ#NCI%H9nF#{757O)1vL~GB0MRin7;&)XvJ1*q{xE0ZhP4y-Ivx{L;Sx& zB4`Ygjbtk(TY$$aA8rNlShqYjmkMiatp7-j>*H9wUj@F+!BtjkBz|jpe@Po*NUy{& z3+d}IN|v^2X&1F&%Zb88q8zlu!!ed%U^|1H;glIgR3f-p@z<-01W-zii&4Q*6|odR ze+G@e(XyL$I>X{(tskM%4!CK5iWSWtc##l;9n?hFA08Cj?Esxzj5+qQ`ci8Z zh^;b&2n%+c>FY#&rg~}>c;GmSJaH<@MDe*sLmM!o?OiM`zmu}(JQGiD*tIp2slkuhyhx__ijsZ1# z&fC|Gk117MBfw@UZ5a_F+uTIg5iJ&zW_avGB0==vUi(hqcF-Av6w*!s;Iaa1C@@I9 zg5$@Gnwj=xLWv9{DR7YBBV3IZtvwu4?(IeWvJ5V75g|gXG8!BA=_4)L4qj`Qq%KNo ziILQXRm>v^30?Qg0FbRmDAMav%I!EPdL?$WK|x`+K_QCYR^9&w2E`*)tKotlD*;Ni zfq@d1G|dt{^tw`_hM?B(2r#q>zq}6zvg0;rMsGWG!P`E?54Mt3C}v3}EjyH%>6cj+ zY!0M*!8#&;6A3C5wuo}M*<=d?ppGZ9p-gzCGPQY#Ku@=E$jl0TnMi?I=$YD-RB?yE zYBX6prglUAV#K^aC6^=Xdx}9*ItzbO`#X6Q=ttjjq(KCst&zeddWWG9cIq#AbP-I| zL6^`o*J2Bqd2u)eqmOS@w}p!&piY8lwuZWm1UvgdEqx2f%XkSael(WfZJ!TE!~|Lc zk`et>64;F9*z=7vD6=UV`mQ4K!R;P;uFpLwti{_5qlx2esu669lA};jx6o1s+ zBJ0xh1u)w>kea6$rlL++#zq=z!?d%-oQ?-l>M{BSZ~4bUg04TNBOVwd^aLqhu5-n& zJGb&-l{g!^1;ngnj?Hau`4FY@`ZvFYKQv;`saLgGkF$(T?F=A^Hg1VNM#~sRc*a$S z!2$GiSZ2@Xfq|17B027z(sp-S@e6ONwEb`>h3$H+?ZuGQe*4^vJ_h(UDr3}%FaV9{ zXLfSbVYc|2(7k$pVqmC(OSOa0hetKf*cblfbta5 zGP>Umb?oJnuiX7c;BMEt+yB+yuDM_KYVo1{GNj|;Zu9)c#k==6UJ}{TO!b-5rs0J; zw+zqKK16`cC80k?QwKxZ5p(J74NB4@N4&(w*Bg&;%o}KlQ7P?MSArD40rwwy;-x%! z26Y;e-mkl}rxh)cCC}LTHe6YmXIjyC;J-WRs#O3}<9S77*g)$0Iqp1M>a`&5L{253 z$k@w(SixbN*VeW8gqmC<6jDZ=@2ZhO*PUOME6PC1#Gki#B|5=V!0}Isd|}zgE%({4 z9g2%msXgf-XR8-7e>v(@oJBGrY*t0TR)jIekgLi7);+b_J^U`W59PNLAwj}NKY{Pz zSy$JXNGA5pAzjo1*BVvH7Vf%7eEX_KTvcqg?y4$NRUF*gfma8N(xUufBtau*&mNuk zxG`i2Q~FFDIHUKyV8%YXsIE#7aj=A#lgQ72J3C)OF$WT{Z|Kv0c3Sa8*o^&6(U|+o zlBcuy>G82Swe;Y+7qnRTbQW5US|g{*m*eRlU$>WK`p1Djxd5p9i|i9Pf-A)WLWohN zrHl>1_4HK;|L$lZ)EsIWvRZ;aq~`4dbYw=r>%@Ahq&YBf5M=dF&`ib59Zfyu(+R#u zEsK$jB=b5>y`nKx0WhL5vns|27FX21s@tCPRXOYw7dy?x9Qx#(QF3DrRcB@*&bE zz8RuV_MvP*pzhlibjo2R5ke9W!pQYUa`L?1Xra<3Xt?t3go$zYI+`SNlH)51bJmAmFk^F?9+y0u#`sI9f4{Y9SLo>-Qu{iF8voKn ziXLJkhs_9TM}zNWm2%mx1&V>`=F?Am&S7B7sfg)EBa)nT$2s{a>a3#`kAMI?*!1%Q zPWvEa5aH&gb&atg)_@3N8zn(vsN>cF^vfM2NiK3`Aw7{OGHi9@i0ck|szP5kda6PX zc{GQHIj1>G*MvAaM6}h7@1q*4M3X!3Hw<=y>(p1qT*GUae5MvQ-I3U>S~QkLSe&V3 zsCYNjq82ZJSJa9ahci(qpF&;XA?gbD8wIQOJqqxOnxb!g$5JJjag{K?axQ9KN1$ll z4EGncPxJ*y@lJ7-vv>UKQDH9IXkYt2*7LY?j|t5&T%CK2(YUB|?rnc`wR2BgL|oL$ zd#C>c9t%K_1xH)z1SrOuxujVfeA8=8VblxOwD5>h}R9F=jL5?Pe6pcO63+h9@M*PszPsGgq0yjQ`jzr;V=aM5z`H)mYc>03kEtY+fbS?J9Aan!mXnDwQZ z_zBrF8RKH~D50(ZF41A7sPR>zWXvck^b`Z+8k5KoAYfoC*(jsrb`fA%T;)>Jo8BH2$Uwi_k&(>g6cFdw=Q{O8!4qNv4i@vi zx*R^52}Q_+Y+$)3by5A-A&mt$3el?(J{twv;!PM(;&M_7@k zYe^RS&|~9De-hXMxs5Okii`7$K_jdL_Qk_SSPu%F7vA{!{^^6$N2e!eroS{51b-B# z!HOUV{vByQ>7SD}N#n%b50cioUqd=TIzrkYeLrbR`ccwh($A3&lFpE-+?W0HulxMj zsUuUfPfhK5^2pSlU6V(4J$7hjX4llg$wz0V_T2Q@p6Mg@kh=PRzG z$M#Mh{KC|uhh}FFeR2BW7j~5mmrxx!I(hU-0JdU#W~QHba(d6?(dk16A3OBa)GWQ( zGxg}vGMigh`_$~@%nQIET>c{ID$>ViCXejhHFIe4U6EyOoGsd5AB~i_|TJw56?Vpm*bN&lLsH0 znmBZ5rYwHw=po?ZjYlS*oH_c~p{d6of9%kK!@C}JMQ7SqzSnIWPXd>4{Wz)mGE3S^ zdfdZ%cy{W*^pgi}!2k9A3WOz4``Do;4<22HrGtl`qP{<*zJ&CDCKay!gfu3dRNu?@ z!1AugCJ!H;I=Ji5?4GIFCy!3gD1&l?;L+%mRCvVC6ENhQsp#@252#@`%Gc9T3G23+ zd-tQH>hl+7Cm);Ib$Dua`p}+TN2VS-a#+~j^W;I7?wULr1e{Z1bpQ8BMVmiOD*kwM z^2ii)4)D7s_lUxebmi=sdTjc@yAIE~(N`M~mnYC&4kOCY(D>V<(+8#?cqjv2 z*mLNM^q02PjU&5erVmUXeU<(V(ZByvas!z6=zj-mB4v^&$+8E8td6@q z(^`*h+&wcJxO3tFEL^y7=gNT#e*oP0Gx!jkfHS|}t9sq#cDrXnSV2j4cUQf7uj*C3 zSMQ_7U3_4}BpCN{-R!ey7UzBrw5Dg)Q=x1NziPaz7 z^wl^TgC1q!hxYj+OaDteshfX+CuRNDcyfHdvCrS(N#5T-8t%t9AfA1;<1IlZDc|dO zQZMX59-l`&@9X%c-uS@QKTjhl_sNs=AezYPWLv`Xz6}`ie-BU6ODDlF>0|syoWNa^Oztuv#c4CX1A8LekvxHq+|6%--s-S*9S z8WnI#i+kGL8&~c5{V5KOo#YOzj(f)7(TxIluKyJk8lEmi;|T3)$1I#2z|!$VPwBp? zi-KaUsW)%a<9Kgo9Cxj8l@EmYu9l8N?IDBtO~Zi)H09vXBkg>R}9W4?nw zweqt_5a>BorZ1LYaz?PsCV+I$@Ok_y(-|bvPzMX|I$qYhxP&n3Gb5_~GYHCwl1{ZB%&&7DsRhnsau**w$U%v@Dz&f3iv_JVk@c^lu_ zjzi1uBF$yj%SAiq%rWt&rImZXQl)cRe`>v<`_>mmYY{&?xcgG(k2>AA#Wf^+UED6d zc?*BSpRN`5X6|M?^{w3Hp6S!Da)*Y-AKAyQ1DBJ)T8cKNu6@zQBz${}Xn@tO_!PV) zJX-iO#{V}_o@^WPuopeuvM z07g+-WxQ=9IpmwtZa^gI78=f4O1^gdE zSMgzk(E-I_bgU4lqS?%RJ~I~bql(76<`nAYM+PDS`SdF1*Kkg-)974Qcac#K8)9G# zjH9fY&*C_k1cwR1WKUi+b^^OTm6nIY@sZ_w)jZq#IWLKf<7FxCC*pv7R>~D*)&>X> zCIgNtT#y%$b=|+D*^+=tt`J_g|0V7VM_#QDPSn|077f2y_1dz$F$cHBPq{6{>CSOY z#wg(r35wXhe0Ym7*G$%Q;V%}~h3p(KCZH}W*JGZ}X`ArM4F0M$T`SO$0olLP{0xE> zakH*?Hdl@LG+X+=L8H@;hZ4T;YOI1-!D#a+ox?eaX5?pN(Vr>Kk*MJNOCY(+zTKBm ze>4%Dre|A6+tZQLnxB2ER&RF`iA~Gs*td#*r}<+LFBeL2QJL;j^By`q;o`l??PvCW%gAX*M zxO2301=re+>GL%2lAX`&*vxEdgGcpyOY29pdh@+jLZ{Tm=#WP{CxzD85GNGY6^YdL| z;Ffpg>o2kT!zheFLUg~uq5G?By^DIw;-5K_m)$G~&}O`nsTew?yzUKx_;4zRBEVH+ zYBKjQj!iHa&=&8^Ij3VF!Y18KhjqFp#rYAoln=(hV{;%YbnbMl&H$q81I zmmJfT+_sE=AZZO>c4w5rCtxR(D*Kao4xS?m5clIK@lOtd)bBGh0JZ9m`aW_Fex6G3 zWoP-KeG@+&odlDxMUe4mlJ-Y~c!W0EnY49%IR^aiZoU7Je|>A~{qJ1^ttI6<-bs7+ z1$v9r`zGQ^qQTG-64chY^`Swcahmw?FdfOb4ui?(QA(_^6QHMU+En=5d6dUsd`YYd z*xVReF@C0dmA&fskViM_-+RxX@iuk_lPCyZIjIucVje4>4)bhDXzFwiEy}rODs{bA zcah^6o$STK?_`Ikp4;p9zUU!I7lnJl7uu@hYd>H@_o?J_Nu_Q`d25eHJCa6wmbrbN z9ftR=txJIKPB0F7NU|vjcDF}2aTv>UG|8lxz5`3=;SkFkhteQWrheZ%yekg>pD?ez zca)^N5xDYwF%67s4Vid6N;N0OuCeWZ74`Rqqoe(Uo#P-L@Y)1VrCjI$_j?Q5ybIZO z*60tmzB3bZl!n?zwte}*XcXoK0q+P&S<$&keqE|+W|w*1Wh?;iN<;?tUXUIr<=V%# z|K^=w(6jai;~Nf8jkz|K4dqYdv_hn>n`ZAF@(VoJjUEnj5zm&Pwr$}qWpTY{HaMrl z@oG0LOot?%AV|>14$GRo+D~lz+h%PZrQAn7sQ6$%x(^j#_k8WA7H(7FX2EJdn}&Ii zmcV?OjYsyvmy`=0goe#x9<*Ix6&g*T_}WvqKMbt4v0E{wwrX)z<#!2kTAsBk4>~Wu zT9ubA%OzLkk>}-*tMbQZ$(eRe$<0>fWvg<>Re51|y^8T^UHfy4I&fX=`nC9N>|WN0 zpH$qhY*-OE$M`^o!su8QQHJ+DqE!vCj-Yn)emINbk z8h=JE7r8X@`dF+?-Crvv9-1@R%FTs2YjBsgbR4SLJ~5V`|AB@{U^$E3JcyH2foSO; zN4|wkKBS%VR!l8n@*X;`i=}s^2$suwGrKxv>UADkZ)TVC_AI%Esk7A1Tk{ZlmflhW zQm5e~ss~pl?j86&Sm{XE`pFCCW#CzaK0QJC;wYE2FW!ldx>5CG8<(^cC91szUfM!& z$23oexiIH=v5OsTS>Pov6y+`7=fzwUj~b4e^Hf8TI!|GUr=FRJre0~hnXSQ?c%G?K zdUYqBk*#&6?>QRojrTg(#&X##8Xg};X(0E_*mjwJ-YC0_Hq}_4Bqq}gkj3lQZf{*v z)0sh>Bndw^%^z>yxVCj|`)k4NTVc@u=F6>Hy|BN1GrIjUy!lCVqqKBgYAe~*3vJ#|0D2Tf|kDdAEMF^uV0swBz z*V%ZC<2tGrAL~7vjG@jZ6aB)8+7c5IsYxAxRdP7OH9*|QE--9inf4uAr5ig~Bg#nc z_wj%zBm7F!%K$v@a)X;-%>md5Ig=wSS(o?({iCBZa3dJ0^_=JHK zMv;soSTqO2Rzrek={16-Tqlg;gm}Sd^;$8!PflDk_QOcRqTQ5@RyXXB=KN4b{mxi6hSt2M(otjS)Jqf@Irl;NPJR5+Xe-gbXx3@2=S1^gG#F0!i-u!6y=0)vu;R?|UIJgSVmX4Re z60?gGixOMdF~$Ki1uiS8(?C28jAPHFh#@KA!6vfTO?7@kMkPFE}6_VrSDCs0(2e{{msq;ulAzd%0 z%Z#k5~0(d}EjQ$>&w5GgWHJc(Wk!*YYShTu>j_k@_ESrt6(~(V4-x;VWbo1t6@9{7k zl$PtF-xHyzf6?#Bx)_C>LkYiF`9{AN55q5~l4MkQJP_gm!8r*Wd8>>8Oe zt+OLKBfl<_egHH(i-%Ryp9e*Iqp$O|xYdk?L;sSgR|Q8!M{qlE)rKQL~+}KfboQvc6Kj(%gKovAK5R!RGo}v$82G c8`t-xZ0zrs8{yiG)d$xb&9(A+2WKCltpET3 diff --git a/deploy/artifacts/mainnet/s_token.wasm b/deploy/artifacts/mainnet/s_token_optimized.wasm old mode 100755 new mode 100644 similarity index 53% rename from deploy/artifacts/mainnet/s_token.wasm rename to deploy/artifacts/mainnet/s_token_optimized.wasm index 9d65a472cdb5bfb40d4a0df269c5c56b7800e683..e8cc941993e9669f624b95553b6210b9cc44e874 GIT binary patch delta 5643 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 delta 4730 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 Xo0}``zy7*oV{`NSbE9+nM%jM>ph8Ww diff --git a/deploy/scripts/upgrade.sh b/deploy/scripts/upgrade.sh index 43887372..954ab251 100755 --- a/deploy/scripts/upgrade.sh +++ b/deploy/scripts/upgrade.sh @@ -22,7 +22,7 @@ invoke() { } install() { - local hash=$(stellar contract install \ + local hash=$(stellar contract upload \ --wasm $1 \ --source $2 \ --rpc-url "$SOROBAN_RPC_URL" \ diff --git a/integration-tests/tests/pool/1.borrower.spec.ts b/integration-tests/tests/pool/1.borrower.spec.ts index 166d17b9..ef1da469 100644 --- a/integration-tests/tests/pool/1.borrower.spec.ts +++ b/integration-tests/tests/pool/1.borrower.spec.ts @@ -23,8 +23,7 @@ import { borrower1Keys, borrower2Keys, lender1Keys, - lender2Keys, - treasuryKeys + lender2Keys } from "../soroban.config"; // import { main } from '../release'; import { assert, expect, use } from "chai"; From 9353da764b2e043f4a4ae186f187a4a99e878840 Mon Sep 17 00:00:00 2001 From: Artur Abliazimov Date: Tue, 30 Sep 2025 15:19:10 +0300 Subject: [PATCH 07/11] Fix unit tests --- contracts/pool/src/tests/budget.rs | 15 +++++++------ contracts/pool/src/tests/upgrade.rs | 32 ++++++++++++++-------------- mocks/debt_token_v100_mock.wasm | Bin 0 -> 10307 bytes mocks/debt_token_v2_mock.wasm | Bin 8757 -> 0 bytes mocks/pool_v100_mock.wasm | Bin 0 -> 69390 bytes mocks/pool_v2_mock.wasm | Bin 61120 -> 0 bytes mocks/s_token_v100_mock.wasm | Bin 0 -> 21320 bytes mocks/s_token_v2_mock.wasm | Bin 19126 -> 0 bytes 8 files changed, 24 insertions(+), 23 deletions(-) create mode 100755 mocks/debt_token_v100_mock.wasm delete mode 100755 mocks/debt_token_v2_mock.wasm create mode 100755 mocks/pool_v100_mock.wasm delete mode 100755 mocks/pool_v2_mock.wasm create mode 100755 mocks/s_token_v100_mock.wasm delete mode 100755 mocks/s_token_v2_mock.wasm diff --git a/contracts/pool/src/tests/budget.rs b/contracts/pool/src/tests/budget.rs index 0476fef0..d12133d1 100644 --- a/contracts/pool/src/tests/budget.rs +++ b/contracts/pool/src/tests/budget.rs @@ -21,7 +21,7 @@ use super::sut::{ create_pool_contract, create_price_feed_contract, create_s_token_contract, create_token_contract, fill_pool, fill_pool_four, init_pool, set_time, DAY, }; -use super::upgrade::{debt_token_v2, pool_v2, s_token_v2}; +use super::upgrade::{debt_token_v100, pool_v100, s_token_v100}; const CPU_LIMIT: u64 = 100_000_000; const MEM_LIMIT: u64 = 40 * 1024 * 1024; @@ -644,10 +644,10 @@ fn upgrade() { env.mock_all_auths(); let sut = init_pool(&env, true); - let pool_v2_wasm = env.deployer().upload_contract_wasm(pool_v2::WASM); + let pool_v100_wasm = env.deployer().upload_contract_wasm(pool_v100::WASM); measure_budget(&env, function_name!(), || { - sut.pool.upgrade(&pool_v2_wasm); + sut.pool.upgrade(&pool_v100_wasm); }); } @@ -659,10 +659,10 @@ fn upgrade_s_token() { let sut = init_pool(&env, true); let asset = sut.reserves[0].token.address.clone(); - let s_token_v2_wasm = env.deployer().upload_contract_wasm(s_token_v2::WASM); + let s_token_v100_wasm = env.deployer().upload_contract_wasm(s_token_v100::WASM); measure_budget(&env, function_name!(), || { - sut.pool.upgrade_token(&asset, &true, &s_token_v2_wasm); + sut.pool.upgrade_token(&asset, &true, &s_token_v100_wasm); }); } @@ -672,11 +672,12 @@ fn upgrade_debt_token() { env.mock_all_auths(); let sut = init_pool(&env, true); - let debt_token_v2_wasm = env.deployer().upload_contract_wasm(debt_token_v2::WASM); + let debt_token_v100_wasm = env.deployer().upload_contract_wasm(debt_token_v100::WASM); let asset = sut.reserves[0].token.address.clone(); measure_budget(&env, function_name!(), || { - sut.pool.upgrade_token(&asset, &false, &debt_token_v2_wasm); + sut.pool + .upgrade_token(&asset, &false, &debt_token_v100_wasm); }); } diff --git a/contracts/pool/src/tests/upgrade.rs b/contracts/pool/src/tests/upgrade.rs index 7f0deae8..79cb03a8 100644 --- a/contracts/pool/src/tests/upgrade.rs +++ b/contracts/pool/src/tests/upgrade.rs @@ -7,16 +7,16 @@ use soroban_sdk::{symbol_short, vec, IntoVal}; use crate::tests::sut::init_pool; use crate::*; -pub mod pool_v2 { - soroban_sdk::contractimport!(file = "../../mocks/pool_v2_mock.wasm"); +pub mod pool_v100 { + soroban_sdk::contractimport!(file = "../../mocks/pool_v100_mock.wasm"); } -pub mod s_token_v2 { - soroban_sdk::contractimport!(file = "../../mocks/s_token_v2_mock.wasm"); +pub mod s_token_v100 { + soroban_sdk::contractimport!(file = "../../mocks/s_token_v100_mock.wasm"); } -pub mod debt_token_v2 { - soroban_sdk::contractimport!(file = "../../mocks/debt_token_v2_mock.wasm"); +pub mod debt_token_v100 { + soroban_sdk::contractimport!(file = "../../mocks/debt_token_v100_mock.wasm"); } #[test] @@ -25,7 +25,7 @@ fn should_require_admin() { env.mock_all_auths(); let sut = init_pool(&env, true); - let pool_v2_wasm = env.deployer().upload_contract_wasm(pool_v2::WASM); + let pool_v2_wasm = env.deployer().upload_contract_wasm(pool_v100::WASM); sut.pool.upgrade(&pool_v2_wasm); @@ -53,9 +53,9 @@ fn should_upgrade_contracts() { let sut = init_pool(&env, true); let asset = sut.reserves[0].token.address.clone(); - let pool_v2_wasm = env.deployer().upload_contract_wasm(pool_v2::WASM); - let s_token_v2_wasm = env.deployer().upload_contract_wasm(s_token_v2::WASM); - let debt_token_v2_wasm = env.deployer().upload_contract_wasm(debt_token_v2::WASM); + let pool_v2_wasm = env.deployer().upload_contract_wasm(pool_v100::WASM); + let s_token_v2_wasm = env.deployer().upload_contract_wasm(s_token_v100::WASM); + let debt_token_v2_wasm = env.deployer().upload_contract_wasm(debt_token_v100::WASM); let pool_version_before = sut.pool.version(); let s_token_version_before = sut.s_token().version(); @@ -69,10 +69,10 @@ fn should_upgrade_contracts() { let s_token_version_after = sut.s_token().version(); let debt_token_version_after = sut.debt_token().version(); - assert_eq!(pool_version_before, 1); - assert_eq!(pool_version_after, 2); - assert_eq!(s_token_version_before, 1); - assert_eq!(s_token_version_after, 2); - assert_eq!(debt_token_version_before, 1); - assert_eq!(debt_token_version_after, 2); + assert_eq!(pool_version_before, 2); + assert_eq!(pool_version_after, 100); + assert_eq!(s_token_version_before, 2); + assert_eq!(s_token_version_after, 100); + assert_eq!(debt_token_version_before, 2); + assert_eq!(debt_token_version_after, 100); } diff --git a/mocks/debt_token_v100_mock.wasm b/mocks/debt_token_v100_mock.wasm new file mode 100755 index 0000000000000000000000000000000000000000..ce5187b3a1307ef31820f6051b704ccc85804f6e GIT binary patch literal 10307 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 literal 0 HcmV?d00001 diff --git a/mocks/debt_token_v2_mock.wasm b/mocks/debt_token_v2_mock.wasm deleted file mode 100755 index 8627c802d5ce13047590db05d3578af5426221e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8757 zcmcgxTWnlM8J?N5Yp;E>@reo|O`)CLR*=xdI7wqC6^NXZCQ%hCxk*at1G3NV9>;6% z#q6%_8acK@E-jaamR3!dYw=vqEA^Upv3{P+3K92PdKoH52fy=j~;@uhKRX^9$!f1!FQ00_dD*tl3;X5$Pk zAj>o&xPH(iFhFBj(NIWiJWZ>Ym}p+d3w#>;RQMR^e_9~oV z^&DX-;1j&cL-a#F1o#|30Z3V4miY)E1wN%9!+2JJL(jd;akk%@?n(7JnZEwMUY7~M zHaINnY}h#9aA&|7NN;q6D}-?S9Om_=(tL(9*>HRdie|JhTzU8A=5 zPyD)`YE-Q^76j`r*UGJOSSf!tV(;ypojK76OA))VcP?r)%k>(Qy@jw6)`}6!^@p>q z$$A5rC3Z`yFx#lH5B5=vZg|Ilyc4bOYv0M!+ zO}0B#3#$>^)6-n27U~r?yrETZg_W`9?95DMfsH_~AKTQNiE5>=P>IH3CdS4}VJjTN zgu~sjvB@Z$!E7^fME|Qd-FiI}`z5=SW&Zh4e8ky`hK)E9 zO*#O^%FO8?bta!4aW)6%pSbwSZ{K)s$p03RTMgtnOv#kLdCK&IGgvU>(GyJC?Nd^W zI35T(BTh!9g7g1)?Jw?#!(__)8e!(v*&5qPfI-@Kyss0Mcb1-802`XpN)E(;3v*ao zC~WVWgvHz~O!2bvx~JQR|INIwC<1PsY3nHKZcH&Q9OnA3DjWBDKPM#U{TI{@xc=)3 zp1utJF9lC&xc5tg{f2_NNvJ!(BoTasPy&9pyFriDM(%fcmjiJvo8*#hb3D?U>SaiE zst4mRpXHddL<0Dm55qw*6#E@DJVagtwMjNb_*2^)S^&h%RE}+c^Qu{^RH&Y}^(moG zyEcHylB>30U=7Yq$NLhAF?7>QBvMvvz2ID z#AK_}S_IM+xaL|F!hfC}$}#|i?;@ZPt{%b{rqRabK?c3d1_8|nr^zhH)R}0(n1V#4;9A*= z3h&2y_jYW#4|Z4`@oFLqxX&tFvNssZLjh-l<+HF6dW&RcmWL`9^AP*^>SCUQhvj=# zy&usk(tf~>WtllSv4qrvtnw>E)CTuJ`-pjrb76HBdmj!eQZX8nn;n pBTr*-^O} zL(0v9EbB}G*|E8q)SGiuZl+mZ=mRfD$TprOM@*WvIyc9w?v0Zfm@@r~Of+#=5LAa9+qPXp{I(mhQUO~~zOhg4xq|O20m>pitBdkp= zpr%xOQ#}bk*r-dAIDkyxm}vPBLP4688E}1+zx2gz1j+{XoyZ`vkb)M3U& zw5KL2EJ^|(*v_zSDS~ABnBw?zQ$q656+@y=mx|D+&ovH4Shh^xv z`vcg6l{)Kjs!}@Z@h_+#p&BNW*9%eaa~ga3lp;j0CFfrLh#ZOYf*%8}WpB-dnh?Fes zh=R@ilDiL)!zT+nt}ScM4cHephS6YSloqD=NhQn--N1+hQARe&hpeH>JF386hac$krSDKyz%(feNGYavFudgXf2I0DrdJg>?T=3R z{dcN@BklisdCK2{flT`s(Y^jiHVtMEF6L5HT%>{{)I;r%3XY;jrx2e~uWU}xbMA~e zxEv}RH&Wqv`D?5;oY|vDg>@BICd%1!bmuZVpZI#P&kw z-UQFbSWdFQ=DDJryfwCdAQ?RHtK%Q|i{CMxy$ zTD>L9)tO3EjcTo^l$c>*s})seTC!D_&Dlb$5f)o=zTBE@ubm8=a;9Fd1o|rESSxHr zqZl8jD~n_5#=>4~n3gU#%*_U4Ut%8XWsE(FHih;A+8(s*?;qG$tk=|rxaug*;cke2 z{NkPMOPQu@O-Aw#$OQHvle7y4`}=Q}e&fU}$)*_H{$`fTQG3u3bVP!Uw(f!3JDrpr}!~4tC*{YcV)3bXAyU1AX zCD}8qG@`JyAPW(c8ef8yl8dw&8&-4WrX)XE=qDp3FV1L8hNYjr*J3cS{@DvI8d+G1 zl!@_m8ijeWmb5MtbAN z>=bEDIZ8LQfn)Tf*m_n8=Xo{~az0=k`xl4+G( z{T-x@_)M^8I&#wt9JWabS$~jVOlZ}!l=>(U=hz<2lbW^hVo+J)D~19&W+F4D;vs5a zY;$#5f9+5h7S=l!6Hn0QA3hefbfU5zs{BkgQ9#VTfpL{SyT2e2 z(AqPZ^9bJ8=8HygY*9CR7d|{8EhG}E@klCWlF9u9T(c&xEwRtyn5Dp>uUiRfR~0w3 z=G~4Pr5>g~#wGOGs;dd>!&it8e#Zgx_3rKT`M=If_N!rA#aEk~?80|j&u^Wd;;*2w z4X!pvjkeDs#C&bGT7Uz>lWj3PQwfVvQ^GGxvY?OQxT5YTJ?vUoKK>M|{e#XRTNf2N z_M;QsyaZf{Y&Qy30HGXj)*JOgSQ~4WrfA4z!UOTnZ``z-mYdEDo976Y zJy5S!>$N-Zq5DX*KoD&kTR-%g7g2%}jAGc%rPbRh&BSwh1RA6Iy~B>(#0#v&w{zL! zlqc_sS|NRJ*HC*d_8QM4sP&n*e($+)ldZ|4+FTVx?Yk~}k0M=fzX*3srW;MXlIYEQ zb`Fl*Hn>v{@XR!t@GCw2kzGTBLxa0+-aSzmzO6K|b7c4M@SdGJ_YLn3_m1o-?kp6d TUAy-cb`^$h+qY+=w441G9Y(^` diff --git a/mocks/pool_v100_mock.wasm b/mocks/pool_v100_mock.wasm new file mode 100755 index 0000000000000000000000000000000000000000..ec416c5062ded7d9cd21083707f74237d92a1a78 GIT binary patch literal 69390 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 literal 0 HcmV?d00001 diff --git a/mocks/pool_v2_mock.wasm b/mocks/pool_v2_mock.wasm deleted file mode 100755 index 45a722599099dece97a07c0fa5ea3d0d40119a31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61120 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 diff --git a/mocks/s_token_v100_mock.wasm b/mocks/s_token_v100_mock.wasm new file mode 100755 index 0000000000000000000000000000000000000000..811031235dfed5ca93eab209ef62ebaf4d32484b GIT binary patch literal 21320 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 literal 0 HcmV?d00001 diff --git a/mocks/s_token_v2_mock.wasm b/mocks/s_token_v2_mock.wasm deleted file mode 100755 index 328c701b45f3a981b71cd5acc4b68718e0950c24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19126 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 From bc4e5a2e15dfe0be00dfdc31507f02df86b5ba7a Mon Sep 17 00:00:00 2001 From: Artur Abliazimov Date: Tue, 30 Sep 2025 18:04:46 +0300 Subject: [PATCH 08/11] Fix liquidation tests --- .../tests/snapshots/budget_utilization.snap | 42 ++--- integration-tests/tests/pool.sut.ts | 164 +++++++++++------- .../tests/pool/2.liquidator.spec.ts | 25 ++- 3 files changed, 138 insertions(+), 93 deletions(-) diff --git a/contracts/pool/src/tests/snapshots/budget_utilization.snap b/contracts/pool/src/tests/snapshots/budget_utilization.snap index 7d460587..81000bc9 100644 --- a/contracts/pool/src/tests/snapshots/budget_utilization.snap +++ b/contracts/pool/src/tests/snapshots/budget_utilization.snap @@ -1,17 +1,17 @@ ['pool::tests::budget::account_position'] = { - "cpu_cost": 4476827, + "cpu_cost": 4474187, "memory_cost": 4117146, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::borrow'] = { - "cpu_cost": 7169913, + "cpu_cost": 7166697, "memory_cost": 6859780, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::collat_coeff'] = { - "cpu_cost": 1623018, + "cpu_cost": 1622106, "memory_cost": 1434496, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, @@ -23,13 +23,13 @@ "memory_limit_exceeded": false, } ['pool::tests::budget::debt_coeff'] = { - "cpu_cost": 1302976, + "cpu_cost": 1302448, "memory_cost": 1380365, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::deposit'] = { - "cpu_cost": 3676175, + "cpu_cost": 3674687, "memory_cost": 2924951, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, @@ -41,13 +41,13 @@ "memory_limit_exceeded": false, } ['pool::tests::budget::flash_loan_with_borrow'] = { - "cpu_cost": 15132652, + "cpu_cost": 15125596, "memory_cost": 16202476, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::flash_loan_without_borrow'] = { - "cpu_cost": 7596216, + "cpu_cost": 7591464, "memory_cost": 7144825, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, @@ -59,19 +59,19 @@ "memory_limit_exceeded": false, } ['pool::tests::budget::init_reserve'] = { - "cpu_cost": 250821, + "cpu_cost": 249861, "memory_cost": 47924, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::liquidate_receive_underlying_when_borrower_has_one_debt'] = { - "cpu_cost": 9186247, + "cpu_cost": 9181447, "memory_cost": 7138407, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::liquidate_receive_underlying_when_borrower_has_two_debts'] = { - "cpu_cost": 9481212, + "cpu_cost": 9476268, "memory_cost": 7136171, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, @@ -89,25 +89,25 @@ "memory_limit_exceeded": false, } ['pool::tests::budget::repay_full'] = { - "cpu_cost": 5985031, + "cpu_cost": 5981767, "memory_cost": 4420457, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::repay_partial'] = { - "cpu_cost": 6917678, + "cpu_cost": 6914030, "memory_cost": 5678774, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::s_token_transfer'] = { - "cpu_cost": 5319589, + "cpu_cost": 5316421, "memory_cost": 5430156, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::set_as_collateral'] = { - "cpu_cost": 3987598, + "cpu_cost": 3985534, "memory_cost": 4063447, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, @@ -137,43 +137,43 @@ "memory_limit_exceeded": false, } ['pool::tests::budget::stoken_underlying_balance'] = { - "cpu_cost": 819973, + "cpu_cost": 819829, "memory_cost": 1300655, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::upgrade'] = { - "cpu_cost": 1301147, + "cpu_cost": 1300859, "memory_cost": 1404488, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::upgrade_debt_token'] = { - "cpu_cost": 1689621, + "cpu_cost": 1689093, "memory_cost": 2600588, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::upgrade_s_token'] = { - "cpu_cost": 1730724, + "cpu_cost": 1730484, "memory_cost": 2607287, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::user_configuration'] = { - "cpu_cost": 827235, + "cpu_cost": 827091, "memory_cost": 1303753, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::withdraw_full'] = { - "cpu_cost": 6567639, + "cpu_cost": 6564807, "memory_cost": 5566723, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, } ['pool::tests::budget::withdraw_partial'] = { - "cpu_cost": 6389899, + "cpu_cost": 6386875, "memory_cost": 5581247, "cpu_limit_exceeded": false, "memory_limit_exceeded": false, diff --git a/integration-tests/tests/pool.sut.ts b/integration-tests/tests/pool.sut.ts index 4b72b443..b7bdc8bc 100644 --- a/integration-tests/tests/pool.sut.ts +++ b/integration-tests/tests/pool.sut.ts @@ -80,7 +80,7 @@ export async function init(client: SorobanClient, customXlm = true): Promise { const generateSalt = (value: number): string => String(value).padStart(64, "0"); - await initPool(client, `${generateSalt(++salt)}`); + await initPool(client, `${generateSalt(++salt)}`, true); await initSToken(client, "XRP", `${generateSalt(++salt)}`); await initSToken(client, "USDC", `${generateSalt(++salt)}`); @@ -200,9 +200,9 @@ export async function releaseInit(client: SorobanClient): Promise { await initPoolReserve(client, "XRP"); await initPoolReserve(client, "USDC"); - await initPoolCollateral(client, "XRP", 1); - await initPoolCollateral(client, "USDC", 2); - await initPoolCollateral(client, "XLM", 3); + await initPoolCollateral(client, "XRP", 1, true); + await initPoolCollateral(client, "USDC", 2, true); + await initPoolCollateral(client, "XLM", 3, true); await initPoolBorrowing(client, "XLM"); await initPoolBorrowing(client, "XRP"); @@ -480,8 +480,7 @@ export async function withdraw( export async function liquidate( client: SorobanClient, signer: Keypair, - who: string, - receiveStoken: boolean + who: string ): Promise { const txResult = await client.sendTransaction( process.env.SLENDER_POOL, @@ -490,7 +489,6 @@ export async function liquidate( 10, convertToScvAddress(signer.publicKey()), convertToScvAddress(who), - convertToScvBool(receiveStoken) ); return txResult; @@ -578,8 +576,7 @@ export async function deployReceiverMock(): Promise { export async function liquidateCli( liquidatorKeys: Keypair, borrower: string, - debtAsset: SlenderAsset, - receiveStoken: boolean + debtAsset: SlenderAsset ): Promise { const liquidateResult = ( (await new Promise((resolve) => { @@ -593,8 +590,7 @@ export async function liquidateCli( liquidate \ --liquidator ${liquidatorKeys.publicKey()} \ --who ${borrower} \ - --debt_asset ${process.env[`SLENDER_TOKEN_${debtAsset}`]} \ - --receive_stoken ${receiveStoken}`, + --debt_asset ${process.env[`SLENDER_TOKEN_${debtAsset}`]}`, (error, stdout, stderr) => { if (error) { resolve(stderr); @@ -841,36 +837,66 @@ async function initDToken( async function initPool( client: SorobanClient, - salt: string + salt: string, + isRelease: boolean ): Promise { await initContract>( "POOL", - () => - client.sendTransaction( - process.env.SLENDER_DEPLOYER, - "deploy_pool", - adminKeys, - 3, - convertToScvBytes(salt, "hex"), - convertToScvBytes(process.env.SLENDER_POOL_HASH, "hex"), - convertToScvAddress(adminKeys.publicKey()), - convertToScvMap({ - base_asset_address: convertToScvAddress(process.env[`SLENDER_TOKEN_${process.env[`BASE_ASSET`] ?? 'XLM'}`]), - base_asset_decimals: convertToScvU32(+(process.env['BASE_ASSET_DECIMALS'] ?? 7)), - flash_loan_fee: convertToScvU32(+(process.env['FLASH_LOAN_FEE_BPS'] ?? 5)), - grace_period: convertToScvU64(+(process.env['GRACE_PERIOD_SEC'] ?? 1)), - initial_health: convertToScvU32(+(process.env['INITIAL_HEALTH_BPS'] ?? 2_500)), - ir_alpha: convertToScvU32(+(process.env['IR_ALPHA'] ?? 143)), - ir_initial_rate: convertToScvU32(+(process.env['IR_INITIAL_RATE_BPS'] ?? 200)), - ir_max_rate: convertToScvU32(+(process.env['IR_MAX_RATE_BPS'] ?? 50_000)), - ir_scaling_coeff: convertToScvU32(+(process.env['IR_SCALING_COEFF_BPS'] ?? 9_000)), - liquidation_protocol_fee: convertToScvU32(+(process.env['LIQUIDATION_PROTOCOL_FEE_BPS'] ?? 0)), - min_collat_amount: convertToScvI128(process.env['MIN_COLLAT_AMOUNT_IN_BASE'] ? BigInt(process.env['MIN_COLLAT_AMOUNT_IN_BASE']) : 1n), - min_debt_amount: convertToScvI128(process.env['MIN_DEBT_AMOUNT_IN_BASE'] ? BigInt(process.env['MIN_DEBT_AMOUNT_IN_BASE']) : 1n), - timestamp_window: convertToScvU64(+(process.env['TIMESTAMP_WINDOW_SEC'] ?? 20)), - user_assets_limit: convertToScvU32(+(process.env['USER_ASSET_LIMIT'] ?? 4)), - }) - ), + () => { + if (isRelease) { + return client.sendTransaction( + process.env.SLENDER_DEPLOYER, + "deploy_pool", + adminKeys, + 3, + convertToScvBytes(salt, "hex"), + convertToScvBytes(process.env.SLENDER_POOL_HASH, "hex"), + convertToScvAddress(adminKeys.publicKey()), + convertToScvMap({ + base_asset_address: convertToScvAddress(process.env[`SLENDER_TOKEN_${process.env[`BASE_ASSET`]}`]), + base_asset_decimals: convertToScvU32(+(process.env['BASE_ASSET_DECIMALS'])), + flash_loan_fee: convertToScvU32(+(process.env['FLASH_LOAN_FEE_BPS'])), + grace_period: convertToScvU64(+(process.env['GRACE_PERIOD_SEC'])), + initial_health: convertToScvU32(+(process.env['INITIAL_HEALTH_BPS'])), + ir_alpha: convertToScvU32(+(process.env['IR_ALPHA'])), + ir_initial_rate: convertToScvU32(+(process.env['IR_INITIAL_RATE_BPS'])), + ir_max_rate: convertToScvU32(+(process.env['IR_MAX_RATE_BPS'])), + ir_scaling_coeff: convertToScvU32(+(process.env['IR_SCALING_COEFF_BPS'])), + liquidation_protocol_fee: convertToScvU32(+(process.env['LIQUIDATION_PROTOCOL_FEE_BPS'])), + min_collat_amount: convertToScvI128(BigInt(process.env['MIN_COLLAT_AMOUNT_IN_BASE'])), + min_debt_amount: convertToScvI128(BigInt(process.env['MIN_DEBT_AMOUNT_IN_BASE'])), + timestamp_window: convertToScvU64(+(process.env['TIMESTAMP_WINDOW_SEC'])), + user_assets_limit: convertToScvU32(+(process.env['USER_ASSET_LIMIT'])), + }) + ); + } else { + return client.sendTransaction( + process.env.SLENDER_DEPLOYER, + "deploy_pool", + adminKeys, + 3, + convertToScvBytes(salt, "hex"), + convertToScvBytes(process.env.SLENDER_POOL_HASH, "hex"), + convertToScvAddress(adminKeys.publicKey()), + convertToScvMap({ + base_asset_address: convertToScvAddress(process.env['SLENDER_TOKEN_XLM']), + base_asset_decimals: convertToScvU32(7), + flash_loan_fee: convertToScvU32(5), + grace_period: convertToScvU64(1), + initial_health: convertToScvU32(2_500), + ir_alpha: convertToScvU32(143), + ir_initial_rate: convertToScvU32(200), + ir_max_rate: convertToScvU32(50_000), + ir_scaling_coeff: convertToScvU32(9_000), + liquidation_protocol_fee: convertToScvU32(100), + min_collat_amount: convertToScvI128(1n), + min_debt_amount: convertToScvI128(1n), + timestamp_window: convertToScvU64(20), + user_assets_limit: convertToScvU32(4), + }) + ); + } + }, (result) => result[0] ); } @@ -898,23 +924,43 @@ async function initPoolReserve( async function initPoolCollateral( client: SorobanClient, asset: SlenderAsset, - order: number + order: number, + isRelease: boolean ): Promise { - await initContract(`POOL_${asset}_COLLATERAL_CONFIGURED`, () => - client.sendTransaction( - process.env.SLENDER_POOL, - "configure_as_collateral", - adminKeys, - 3, - convertToScvAddress(process.env[`SLENDER_TOKEN_${asset}`]), - convertToScvMap({ - // todo: trim to short string - discount: convertToScvU32(+(process.env[`${asset}_DISCOUNT_BPS`] ?? 6000)), - liq_cap: convertToScvI128(process.env[`${asset}_LIQUIDITY_CAP`] ? BigInt(process.env[`${asset}_LIQUIDITY_CAP`]) : 1000000000000000n), - pen_order: convertToScvU32(+(process.env[`${asset}_PENALTY_ORDER`] ?? order)), - util_cap: convertToScvU32(+(process.env[`${asset}_UTILIZATION_CAP`] ?? 9000)), - }) - ) + await initContract(`POOL_${asset}_COLLATERAL_CONFIGURED`, () => { + if (isRelease) { + return client.sendTransaction( + process.env.SLENDER_POOL, + "configure_as_collateral", + adminKeys, + 3, + convertToScvAddress(process.env[`SLENDER_TOKEN_${asset}`]), + convertToScvMap({ + // todo: trim to short string + discount: convertToScvU32(+(process.env[`${asset}_DISCOUNT_BPS`])), + liq_cap: convertToScvI128(BigInt(process.env[`${asset}_LIQUIDITY_CAP`])), + pen_order: convertToScvU32(+(process.env[`${asset}_PENALTY_ORDER`])), + util_cap: convertToScvU32(+(process.env[`${asset}_UTILIZATION_CAP`])), + }) + ); + } else { + + return client.sendTransaction( + process.env.SLENDER_POOL, + "configure_as_collateral", + adminKeys, + 3, + convertToScvAddress(process.env[`SLENDER_TOKEN_${asset}`]), + convertToScvMap({ + // todo: trim to short string + discount: convertToScvU32(6000), + liq_cap: convertToScvI128(1000000000000000n), + pen_order: convertToScvU32(order), + util_cap: convertToScvU32(9000), + }) + ); + } + } ); } diff --git a/integration-tests/tests/pool/2.liquidator.spec.ts b/integration-tests/tests/pool/2.liquidator.spec.ts index a1539c43..3aa90040 100644 --- a/integration-tests/tests/pool/2.liquidator.spec.ts +++ b/integration-tests/tests/pool/2.liquidator.spec.ts @@ -64,7 +64,6 @@ describe("LendingPool: Liquidation (receive underlying assets)", function () { await deposit(client, borrower1Keys, "XRP", 10_000_000_000n); // Borrower1 deposits 10_000_000_000 USDC await deposit(client, borrower1Keys, "USDC", 10_000_000_000n); - // Liquidator1 deposits 200_000_000n XLM await deposit(client, liquidator1Keys, "XLM", 200_000_000n); @@ -110,8 +109,8 @@ describe("LendingPool: Liquidation (receive underlying assets)", function () { it("Case 2: Borrower borrows XLM with health ~= initial_health", async function () { await delay(20_000); - // Borrower1 borrows 11_999_000_000n XLM - await borrow(client, borrower1Keys, "XLM", 90_000_000n); + // Borrower1 borrows 89_999_000n XLM + await borrow(client, borrower1Keys, "XLM", 89_999_000n); const borrower1XlmBalance = await tokenBalanceOf(client, "XLM", borrower1Address); const borrower1DXlmBalance = await debtTokenBalanceOf(client, "XLM", borrower1Address); @@ -119,16 +118,16 @@ describe("LendingPool: Liquidation (receive underlying assets)", function () { const dXlmSupply = await debtTokenTotalSupply(client, "XLM"); const borrower1Position = await accountPosition(client, borrower1Keys); - assert.equal(borrower1XlmBalance, 90_000_000n); - assert.equal(borrower1DXlmBalance, 90_000_001n); - assert.equal(sXlmBalance, 210000000n); - assert.equal(dXlmSupply, 90_000_001n); + assert.equal(borrower1XlmBalance, 89_999_000n); + assert.equal(borrower1DXlmBalance, 89_999_001n); + assert.equal(sXlmBalance, 210001000n); + assert.equal(dXlmSupply, 89_999_001n); - assert(borrower1Position.debt > 90_000_000n - && borrower1Position.debt < 120_000_000n); + assert(borrower1Position.debt > 89_999_000n + && borrower1Position.debt < 90_000_000n); assert.equal(borrower1Position.discounted_collateral, 120_000_000n); - assert(borrower1Position.npv > 0 - && borrower1Position.npv < 90_000_000n); + assert(borrower1Position.npv > 30_000_000n + && borrower1Position.npv < 30_100_000n); }); it("Case 3: Liquidator borrows USDC with npv > 0", async function () { @@ -176,7 +175,7 @@ describe("LendingPool: Liquidation (receive underlying assets)", function () { console.log("liquidator1Address", liquidator1Address); console.log("borrower1Address", borrower1Address); - await liquidate(client, liquidator1Keys, borrower1Address, false); + await liquidate(client, liquidator1Keys, borrower1Address); const liquidator1XrpBalanceAfter = await tokenBalanceOf(client, "XRP", liquidator1Address); const liquidator1SXrpBalance = await sTokenBalanceOf(client, "XRP", liquidator1Address); @@ -227,7 +226,7 @@ describe("LendingPool: Liquidation (receive underlying assets)", function () { const borrower1DXlmBalanceBefore = await debtTokenBalanceOf(client, "XLM", borrower1Address); const dXlmSupplyBefore = await debtTokenTotalSupply(client, "XLM"); - await liquidate(client, liquidator1Keys, borrower1Address, false); + await liquidate(client, liquidator1Keys, borrower1Address); const liquidator1UsdcBalanceAfter = await tokenBalanceOf(client, "USDC", liquidator1Address); const liquidator1SUsdcBalance = await sTokenBalanceOf(client, "USDC", liquidator1Address); From c761f268ae1b7d9a02c9717ff75f4e326d8a2190 Mon Sep 17 00:00:00 2001 From: Artur Abliazimov Date: Wed, 1 Oct 2025 15:52:18 +0300 Subject: [PATCH 09/11] Fix integration tests #3 --- .../tests/pool/3.liquidator.spec.ts | 51 +++++++++---------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/integration-tests/tests/pool/3.liquidator.spec.ts b/integration-tests/tests/pool/3.liquidator.spec.ts index f36aad8d..a6205d7d 100644 --- a/integration-tests/tests/pool/3.liquidator.spec.ts +++ b/integration-tests/tests/pool/3.liquidator.spec.ts @@ -38,11 +38,10 @@ describe("LendingPool: Liquidation (receive STokens)", function () { await deploy(); await init(client); - lender1Address = lender1Keys.publicKey(); borrower1Address = borrower1Keys.publicKey(); liquidator1Address = liquidator1Keys.publicKey(); - + // uncomment to resume test with existing contracts // require("dotenv").config({ path: contractsFilename }); // return; @@ -181,13 +180,7 @@ describe("LendingPool: Liquidation (receive STokens)", function () { && borrower1Position.npv > -210_000); }); - it("Case 5: Liquidator tries to liquidate Borrower's position", async function () { - await expect(liquidate(client, liquidator1Keys, borrower1Address, true)) - .to.eventually.rejected; - }); - - // TODO: requires optimization - it("Case 6: Liquidator liquidates Borrower's positions partialy", async function () { + it("Case 5: Liquidator liquidates Borrower's positions partialy", async function () { await mintUnderlyingTo(client, "XRP", liquidator1Address, 1_000_000_000n); await repay(client, liquidator1Keys, "XRP", I128_MAX); // Liquidator1 liquidates Borrower1's positions @@ -196,8 +189,8 @@ describe("LendingPool: Liquidation (receive STokens)", function () { const liquidator1SUsdcBalanceBefore = await sTokenBalanceOf(client, "USDC", liquidator1Address); const borrower1SXrpBalanceBefore = await sTokenBalanceOf(client, "XRP", borrower1Address); const borrower1SUsdcBalanceBefore = await sTokenBalanceOf(client, "USDC", borrower1Address); - - await liquidate(client, liquidator1Keys, borrower1Address, true); + + await liquidate(client, liquidator1Keys, borrower1Address); const liquidator1XrpBalanceAfter = await tokenBalanceOf(client, "XRP", liquidator1Address); const liquidator1SXrpBalanceAfter = await sTokenBalanceOf(client, "XRP", liquidator1Address); @@ -216,8 +209,8 @@ describe("LendingPool: Liquidation (receive STokens)", function () { const borrower1Position = await accountPosition(client, borrower1Keys); - assert.equal(liquidator1XrpBalanceBefore, liquidator1XrpBalanceAfter); - assert(liquidator1SXrpBalanceBefore < liquidator1SXrpBalanceAfter); + assert.equal(liquidator1SXrpBalanceBefore, liquidator1SXrpBalanceAfter); + assert(liquidator1XrpBalanceBefore < liquidator1XrpBalanceAfter); assert.equal(liquidator1USDCBalance, 0n); assert(liquidator1SUsdcBalanceBefore <= liquidator1SUsdcBalanceAfter); @@ -225,7 +218,7 @@ describe("LendingPool: Liquidation (receive STokens)", function () { assert(borrower1SUsdcBalanceBefore >= borrower1SUsdcBalanceAfter); assert.notEqual(borrower1DXlmBalance, 0n); - assert.equal(sXrpSupply, 40_000_000_000n); + assert.equal(sXrpSupply, 40000000000n - (borrower1SXrpBalanceBefore - borrower1SXrpBalanceAfter)); assert.equal(sUsdcSupply, 40_000_000_000n); assert.notEqual(dXlmSupply, 0n); @@ -235,16 +228,19 @@ describe("LendingPool: Liquidation (receive STokens)", function () { assert(borrower1Position.npv > 0n); }); - it("Case 7: Borrower withdraw XRP partialy to NPV ~= 0", async function () { + it("Case 6: Borrower withdraw XRP partialy to NPV ~= 0", async function () { const borrower1SXrpBalanceBefore = await sTokenBalanceOf(client, "XRP", borrower1Address); // target balance ~3.3 XRP - const targetXRPBalance = 3_300_000_000n; + const targetXRPBalance = 1_000_000_000n; const toWithdraw = borrower1SXrpBalanceBefore - targetXRPBalance; + const borrower1Position = await accountPosition(client, borrower1Keys); - await withdraw(client, borrower1Keys, "XRP", toWithdraw < 0n ? 0n : toWithdraw); + assert(Number(borrower1Position.npv) / Number(borrower1Position.discounted_collateral) < 0.25); + + await expect(withdraw(client, borrower1Keys, "XRP", toWithdraw < 0n ? 0n : toWithdraw)).to.eventually.rejected; }); - it("Case 8: Drop the XRP price so Borrower's NPV <= 0", async function () { + it("Case 7: Drop the XRP price so Borrower's NPV <= 0", async function () { // XRP price is set to 0.4799999 await initPrice(client, "XRP", 4_799_999_000_000_000n, 0); @@ -253,7 +249,7 @@ describe("LendingPool: Liquidation (receive STokens)", function () { assert(borrower1Position.npv < 0n); }); - it("Case 9: Liquidator liquidates Borrower's position partialy 2", async function () { + it("Case 8: Liquidator liquidates Borrower's position partialy 2", async function () { // Liquidator1 liquidates Borrower1's positions const liquidator1XrpBalanceBefore = await tokenBalanceOf(client, "XRP", liquidator1Address); const liquidator1SXrpBalanceBefore = await sTokenBalanceOf(client, "XRP", liquidator1Address); @@ -267,7 +263,7 @@ describe("LendingPool: Liquidation (receive STokens)", function () { const sUsdcSupplyBefore = await sTokenTotalSupply(client, "USDC"); const borrower1PositionBefore = await accountPosition(client, borrower1Keys); - await liquidate(client, liquidator1Keys, borrower1Address, true); + await liquidate(client, liquidator1Keys, borrower1Address); const liquidator1XrpBalanceAfter = await tokenBalanceOf(client, "XRP", liquidator1Address); const liquidator1SXrpBalanceAfter = await sTokenBalanceOf(client, "XRP", liquidator1Address); @@ -288,26 +284,25 @@ describe("LendingPool: Liquidation (receive STokens)", function () { assert(borrower1SXrpBalanceBefore > borrower1SXrpBalanceAfter); assert(borrower1DXlmBalanceBefore > borrower1DXlmBalanceAfter); - assert(borrower1SUsdcBalanceBefore > borrower1SUsdcBalanceAfter, `borrower1SUsdcBalanceBefore ${borrower1SUsdcBalanceBefore} borrower1SUsdcBalanceAfter ${borrower1SUsdcBalanceAfter}`); + assert.equal(borrower1SUsdcBalanceBefore, borrower1SUsdcBalanceAfter); - assert.equal(liquidator1XrpBalanceAfter, liquidator1XrpBalanceBefore); - assert(liquidator1SXrpBalanceBefore < liquidator1SXrpBalanceAfter); + assert.equal(liquidator1SXrpBalanceBefore, liquidator1SXrpBalanceAfter); + assert(liquidator1XrpBalanceBefore < liquidator1XrpBalanceAfter); assert.equal(liquidator1USDCBalanceAfter, 0n); - assert(liquidator1SUsdcBalanceBefore < liquidator1SUsdcBalanceAfter, `liquidator1SUsdcBalanceBefore ${liquidator1SUsdcBalanceBefore} liquidator1SUsdcBalanceAfter ${liquidator1SUsdcBalanceAfter}`); - - assert.equal(sXrpSupplyBefore, sXrpSupplyAfter); + assert(sXrpSupplyAfter < sXrpSupplyBefore); assert.equal(sUsdcSupplyBefore, sUsdcSupplyAfter); assert.equal(dXlmSupply, borrower1DXlmBalanceAfter); assert(borrower1PositionBefore.npv <= borrower1PositionAfter.npv); + assert(borrower1PositionAfter.npv > 0n); }); - it("Case 10: Liquidator cannot liquidate borrower without collateral", async function () { + it("Case 9: Liquidator cannot liquidate borrower without collateral", async function () { const borrower1Position = await accountPosition(client, borrower1Keys); if (borrower1Position.discounted_collateral === 0n) { - await expect(liquidate(client, liquidator1Keys, borrower1Address, true)) + await expect(liquidate(client, liquidator1Keys, borrower1Address)) .to.eventually.rejected; } }); From ed3fec49cda3bcfacbaa958362dbe0aa2e3fd40a Mon Sep 17 00:00:00 2001 From: Artur Abliazimov Date: Wed, 1 Oct 2025 17:00:22 +0300 Subject: [PATCH 10/11] Fix integration tests #4 --- integration-tests/tests/pool/4.npv.spec.ts | 70 +++++++++++----------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/integration-tests/tests/pool/4.npv.spec.ts b/integration-tests/tests/pool/4.npv.spec.ts index 8a3abf09..99a785bb 100644 --- a/integration-tests/tests/pool/4.npv.spec.ts +++ b/integration-tests/tests/pool/4.npv.spec.ts @@ -134,7 +134,7 @@ describe("LendingPool: Borrower position", function () { const borrower1PositionBefore = await accountPosition(client, borrower1Keys); console.log(borrower1PositionBefore); - await withdraw(client, borrower1Keys, "XRP", 5_000_000_000n); + await withdraw(client, borrower1Keys, "XRP", 100_000n); const borrower1XrpBalance = await tokenBalanceOf(client, "XRP", borrower1Address); const borrower1SXrpBalance = await sTokenBalanceOf(client, "XRP", borrower1Address); @@ -142,21 +142,21 @@ describe("LendingPool: Borrower position", function () { const sXrpSupply = await sTokenTotalSupply(client, "XRP"); const borrower1Position = await accountPosition(client, borrower1Keys); - assert.equal(borrower1XrpBalance, 85_000_000_000n); - assert.equal(borrower1SXrpBalance, 15_000_000_000n); - assert.equal(sXrpBalance, 15_000_000_000n); + assert.equal(borrower1XrpBalance, 80_000_100_000n); + assert.equal(borrower1SXrpBalance, 19_999_900_000n); + assert.equal(sXrpBalance, 19_999_900_000n); assert.equal(sXrpSupply, borrower1SXrpBalance); assert(borrower1Position.debt >= 89_000_000n && borrower1Position.debt < 89_000_100n, `borrower1Position.debt ${borrower1Position.debt}`); - assert.equal(borrower1Position.discounted_collateral, 90_000_000n); - assert(borrower1Position.npv > 999_000n - && borrower1Position.npv <= 1_000_000n, `borrower1Position.npv ${borrower1Position.npv}`); + assert.equal(borrower1Position.discounted_collateral, 119_999_400n); + assert(borrower1Position.npv > 30_999_000 + && borrower1Position.npv <= 31_000_000n, `borrower1Position.npv ${borrower1Position.npv}`); }); it("Case 5: Drop the XRP price so Borrower's NPV <= 0", async function () { // XRP price is set to 0.9 - await initPrice(client, "XRP", 9_000_000_000_000_000n, 0); + await initPrice(client, "XRP", 7_000_000_000_000_000n, 0); const borrower1Position = await accountPosition(client, borrower1Keys); @@ -182,7 +182,7 @@ describe("LendingPool: Borrower position", function () { assert(borrower1Position.debt >= 89_000_000n && borrower1Position.debt < 90_000_000n, `borrower1Position.debt ${borrower1Position.debt}`); - assert.equal(borrower1Position.discounted_collateral, 81_000_000n); + assert.equal(borrower1Position.discounted_collateral, 83_999_580n); assert(borrower1Position.npv < 0n && borrower1Position.npv > -10_000_000n); }); @@ -197,14 +197,14 @@ describe("LendingPool: Borrower position", function () { const sXrpSupply = await sTokenTotalSupply(client, "XRP"); const borrower1Position = await accountPosition(client, borrower1Keys); - assert.equal(borrower1XrpBalance, 85_000_000_000n); - assert.equal(borrower1SXrpBalance, 15_000_000_000n); - assert.equal(sXrpBalance, 15_000_000_000n); + assert.equal(borrower1XrpBalance, 80_000_100_000n); + assert.equal(borrower1SXrpBalance, 19_999_900_000n); + assert.equal(sXrpBalance, 19_999_900_000n); assert.equal(sXrpSupply, borrower1SXrpBalance); assert(borrower1Position.debt >= 89_000_000n && borrower1Position.debt < 90_000_000n, `borrower1Position.debt ${borrower1Position.debt}`); - assert.equal(borrower1Position.discounted_collateral, 81_000_000n); + assert.equal(borrower1Position.discounted_collateral, 83_999_580n); assert(borrower1Position.npv < 0n && borrower1Position.npv > -10_000_000n); }); @@ -222,18 +222,18 @@ describe("LendingPool: Borrower position", function () { const borrower1Position = await accountPosition(client, borrower1Keys); - assert.equal(borrower1XrpBalance, 81_500_000_000n); - assert.equal(borrower1SXrpBalance, 18_500_000_000n); + assert.equal(borrower1XrpBalance, 76_500_100_000n); + assert.equal(borrower1SXrpBalance, 23_499_900_000n); - assert.equal(sXrpBalance, 18_500_000_000n); + assert.equal(sXrpBalance, 23_499_900_000n); - assert.equal(sXrpSupply, 18_500_000_000n); + assert.equal(sXrpSupply, 23_499_900_000n); assert(borrower1Position.debt >= 89_000_000n && borrower1Position.debt < 90_000_000n, `borrower1Position.debt ${borrower1Position.debt}`); - assert.equal(borrower1Position.discounted_collateral, 99_900_000n); - assert(borrower1Position.npv < 11_000_000n - && borrower1Position.npv > 10_000_000n); + assert.equal(borrower1Position.discounted_collateral, 98_699_580n); + assert(borrower1Position.npv > 9_600_000n + && borrower1Position.npv < 10_000_000n); assert(healthFactor(borrower1Position) < 0.25); }); @@ -255,15 +255,15 @@ describe("LendingPool: Borrower position", function () { assert(borrower1Position.debt >= 89_000_000n && borrower1Position.debt < 90_000_000n, `borrower1Position.debt ${borrower1Position.debt}`); - assert.equal(borrower1Position.discounted_collateral, 99_900_000n); - assert(borrower1Position.npv < 11_000_000n - && borrower1Position.npv > 10_000_000n); + assert.equal(borrower1Position.discounted_collateral, 98_699_580n); + assert(borrower1Position.npv > 9_600_000n + && borrower1Position.npv < 10_000_000n); assert(healthFactor(borrower1Position) < 0.25); }); it("Case 10: Borrower deposits more to achieve health >= 0.25", async function () { - // Borrower1 deposits 3.5 XRP - await deposit(client, borrower1Keys, "XRP", 3_500_000_000n); + // Borrower1 deposits 7 XRP + await deposit(client, borrower1Keys, "XRP", 7_000_000_000n); const borrower1XrpBalance = await tokenBalanceOf(client, "XRP", borrower1Address); const borrower1SXrpBalance = await sTokenBalanceOf(client, "XRP", borrower1Address); @@ -274,18 +274,18 @@ describe("LendingPool: Borrower position", function () { const borrower1Position = await accountPosition(client, borrower1Keys); - assert.equal(borrower1XrpBalance, 78_000_000_000n); - assert.equal(borrower1SXrpBalance, 22_000_000_000n); + assert.equal(borrower1XrpBalance, 69_500_100_000n); + assert.equal(borrower1SXrpBalance, 30_499_900_000n); - assert.equal(sXrpBalance, 22_000_000_000n); + assert.equal(sXrpBalance, 30_499_900_000n); - assert.equal(sXrpSupply, 22_000_000_000n); + assert.equal(sXrpSupply, 30_499_900_000n); assert(borrower1Position.debt >= 89_000_000n && borrower1Position.debt < 90_000_000n, `borrower1Position.debt ${borrower1Position.debt}`); - assert.equal(borrower1Position.discounted_collateral, 118_800_000n); - assert(borrower1Position.npv < 30_000_000n - && borrower1Position.npv > 29_000_000n); + assert.equal(borrower1Position.discounted_collateral, 128_099_580n); + assert(borrower1Position.npv < 40_000_000n + && borrower1Position.npv > 39_000_000n); assert(healthFactor(borrower1Position) >= 0.25); }); @@ -307,9 +307,9 @@ describe("LendingPool: Borrower position", function () { assert(borrower1Position.debt >= 89_000_000n && borrower1Position.debt < 90_000_000n, `borrower1Position.debt ${borrower1Position.debt}`); - assert.equal(borrower1Position.discounted_collateral, 118_800_000n); - assert(borrower1Position.npv < 30_000_000n - && borrower1Position.npv > 29_000_000n); + assert.equal(borrower1Position.discounted_collateral, 128_099_580n); + assert(borrower1Position.npv < 40_000_000n + && borrower1Position.npv > 39_000_000n); assert(healthFactor(borrower1Position) > 0.25); }); }); \ No newline at end of file From b8825d04e99329b5146948bc783c5c12ef1fdc70 Mon Sep 17 00:00:00 2001 From: Artur Abliazimov Date: Thu, 2 Oct 2025 11:26:30 +0300 Subject: [PATCH 11/11] Fix integration tests #6 --- integration-tests/tests/pool/6.tx.budget.spec.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/integration-tests/tests/pool/6.tx.budget.spec.ts b/integration-tests/tests/pool/6.tx.budget.spec.ts index 32e9696d..ea30301a 100644 --- a/integration-tests/tests/pool/6.tx.budget.spec.ts +++ b/integration-tests/tests/pool/6.tx.budget.spec.ts @@ -77,10 +77,10 @@ describe("LendingPool: methods must not exceed CPU/MEM limits", function () { await deposit(client, borrower1Keys, "XRP", 30_000_000_000n); await borrow(client, borrower1Keys, "USDC", 6_000_000_000n); - // Borrower2 deposits 20_000_000_000 USDC, borrows 60_000_000 XLM, 5_999_000_000 XRP + // Borrower2 deposits 20_000_000_000 USDC, borrows 60_000_000 XLM, 4_000_000_000 XRP await deposit(client, borrower2Keys, "USDC", 20_000_000_000n); await borrow(client, borrower2Keys, "XLM", 60_000_000n); - await borrow(client, borrower2Keys, "XRP", 5_900_000_000n); + await borrow(client, borrower2Keys, "XRP", 2_000_000_000n); try { fs.unlinkSync(BUDGET_SNAPSHOT_FILE); @@ -137,7 +137,7 @@ describe("LendingPool: methods must not exceed CPU/MEM limits", function () { await initPrice(client, "USDC", 15_000_000_000_000_000n, 0); await expect( - liquidate(client, liquidator1Keys, borrower1Address, false) + liquidate(client, liquidator1Keys, borrower1Address) .then((result) => writeBudgetSnapshot("liquidate", result)) ).to.not.eventually.rejected; // await expect(

4 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 diff --git a/deploy/artifacts/testnet/price_feed_mock.wasm b/deploy/artifacts/testnet/price_feed_mock.wasm index 79589b7bf02e0488a5f401bc327ef76eb773c416..3c3847f58fd9b43a1c8705ab07f0f01a9173366c 100755 GIT binary patch delta 1013 zcmZWo&rcIU6n<}J+ubs|Wr_!tc$gLrB`WfxSVa`I1)14TB%&hxSvs)Z6>YMc@#Fwzb(Wv@S2w5u# zYxNC(owoKh!f0!Kw^`rXq@+>_{H9+CHv`T@rSdHFw<~%J=Y1bc@q;lIV`~UpwN_xm zz-ASCr}*0Y0#A%t1s*GNuu&+KkT(=_;Wo1rQ%L2QqT#8xGt8!jTvbf=vDxmU*a(*e z^w?vChc50k9MGjJ18-zCmzY^hTwx-Ygek(1UXr?=&Wx zzQPlS+yP~jxkW+yqV4J$r?J%PFo=7IvF?)M0+~mHJTO|iFv7`~Po8??8GACNF-WG1 ztK_l=DUS)l6FJaJ7wJ4u!CJonae&C;yL4)@cWR(rrWMTnNO#H=($O-Qd!RE%I)YKJ z$Y4&d8R1s)iw&;vGv+hL(|Ho(0a4P)Qn1J%N%A`zbdS_NqH&??5j8**5nBq+aQ=>B z<~e!Lfda(|D*4S{Nn7UT9D-I{+69ogLw;Lrb@n91Bqci&6tg_w$%tCNLI`R>RdZIF-wS-lT+(Dn;uJUWUk(t932~-81kpf mfxmpGI##X)%M+z=x*C+G!pTx8s7{Uh6XVtC&@Y#RN%#ZWSHal; delta 1179 zcmZ8g&2Jl35TAK(z211e&N@&Dhs(2530u(MHvUKgs{B@h08vTBsfSAIwRZ#lc5SB> z2fP+o5#oZPy>j3daR?ywAAl<#5+@{1E&l-Gz`e{{r;5~F?VFwN`OVDxEBoJu3Ep&o z0D#rhnYoo^VTki4(1&vjn*e8T7sD2I$>1S=OlKd<06b%HjVC})0vHHu367A}b38=3 zSo{QL2=bpx`mdtNle9hv2BXQR40LZg4Q5kVPmCv>b^x{>(P3f=2q9>m=dSY$?lkQZ6{NSiw>A+V&ZE*x>{XiGam{XufVZjBiZn0bu?@vC@d z0j?6@xqOBX3Lrno90-uVz`=tH%4ud}n>!jcUqEl&1oJawAx*}P2gBw9?rIJB4Xuo{ z>HAo&Y01wd^4n(To&Xk7mJ0kld1ydfI`HjO@LJI;aqD#JQY&LQuBLcw4HNC zspZip% zB}n~NFU=^UtoGu$$nBnap%zRe9Q|~ePf&H(qm&wTFt3q~NgCtS$t>4tGMAtPK5w@k zeak<$Eqmh~+5>`STLrK;qFdT>%c9L?wx%jncpawt$iOroA*^oSF#1!g><>pX(HV^U z!5|pU0>AC``++Z-M`Lws_V-VQk0#!@SZa#VPC799K|Ol(M)I}jYrV2&xRangn)uV`H~rwb&*RPH`-s;f-*}zX_o6c+ x_vX#*%656nuN_xwJA22q%8p;J1@-D~D+t=HR=Mr%?A<)xZTmarO8Zs?{s)m(@Y4VQ diff --git a/deploy/artifacts/testnet/s_token.wasm b/deploy/artifacts/testnet/s_token.wasm index 9d65a472cdb5bfb40d4a0df269c5c56b7800e683..9318c650eb64f48d58c77c0bfbfababf03b3bdf8 100755 GIT binary patch delta 5872 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 Ar~m)} delta 4740 zcmaJ_eQaCR6~Fhs=a2Z=@lBhgPSTJ2oD>pDQ`4q(CGM@rVsE&TJvNt%Pl{1jE1G&QqLo zi*eo_iA5~VI-)&Rz`YYEzQ>$^c|ZJ|Xh;7R;(zx`y|QLO0}#hV?Oc1FUlM*0GVbwcjhxFp7sjFIC!(3i^! zco|mFA~-l+@%Uv6gjq0Q7Ql-H3qXRLWh)p?Dce8&_FupB-EaT#T?~N?FH?~_(8Mzp zY;6&A;1a-{C}ZEVZZUrU=?h_}R@}+xBq2245DuvjBnY&N5%f zENn@w2>%f|5d0I-M7JnZvKExGlmHyj&}Do=iKQJY3UHf+9XOzwg>&(YYw%z!Tn--s zyW`l}g67Ju_}B+`ge{t;=Hv?hRdyuBpz4s&*q zq&;qjRXntx|;Orr*;3nm6H|3oI#d;lb*lmYEu7yqr zjJj#esEUfIDDaAzLDGXP*QVlTCPONzq;hB&s94@Qi@U36-g=VSbly5eEqr%^TExOb zXuvQHG}sY%{~GrUY1rQA7&vf!K<v}v|O<|3z{FNeQxQ(NII1O}G^Xcf>(qg4RQI4*EmP zdiPH_>RwQhj&mQuA@^P$<`_``y~gfJapn*yE9S&0Cb;Z#y3zRn^*PSf>)d7ygfCc~ znU+G&3n5H)Gc*?dBsqMGW(Ov1{{%krV?^zj45aG|+;lH-Pl~lhiY~-@rQ77DaDQq? zpjCu|S8$_>`X{k-d!C?3gr2EnBc6r4Nn2vICNWr)afK+@!;esqClY??t&5ugy6 z7)lH&&yXG7ST8^dm2e{M4$*4DB2rRj>Q+R8Vdy0|-Ug2ow!y9-@9@d=_CObBu+K2q z;6tsyk?at+tum?U@w_#PMU?yURt~$v7)Zt@57M=br*PfVt`mN(X#`MrO>i%4paKhKyGT`x^IDtTKm&4jj z9EJ(oJNw(MUgxRx7|ew?cW&81A^4&0(A1;CMrSq{#AR$ME(Iv?!W&6qI`Sh}P_-`syoHWDU?=D1dpA(9AD85d`Tq}z*`JQjrphFdhtJPFks-}cnvfvM~Ff; z%I8*4dDtSm4|jI2 ztQ$YxSG_}cAUYxo_E z5DDleIAJfjNs|b<2Yy59Cl}!2op>G98wv#16!qmHN8okzB_Wv3M@~R3WZj|Zw0#?PGjk!knRL_oVt-hk>7aP^`V!5_bp1WkP`%BA;eohEq>gn4x zTdG#eb833BLBBv8Jh)nWaH-T79GX`3nkuR3JL|Rbv^rL*u9m|$dIqlU0c*r?2n?YQ z8$cUn|NeOUY`un`HD*_!&Frz?3?{e5=AweFv@YH6gANo_@!GKT`eNDYQ+^;sy}YJj_|zu}{3^$c3V)u-F|H%yOS z$-GD2XMP^VX))g(8w4f_l3`ce F<^QekD2V_7 delta 211 zcmbPgFvDQOQ%1(~o1ZbVv$L#bWMrKDk;8Se1*ZoKiz7$YjmPw3EjFabb%1_?M zDQn9tpduiq#3H~fC7`arpuniWETE*oq`+X#tO2B0%$XGwn4J1PZNAQ9&Mcw8ceu4CbMUD9uqrSB%~D`hU;-KpF%igCV0KdISS}#zc)#%g ngCo0ukRqD`ivlCa5*CnM3P6etWC07r0+3r3ST|Sj%;g3E*<2|B diff --git a/deploy/scripts/deploy.sh b/deploy/scripts/deploy.sh index 0d0b24bc..257490c3 100755 --- a/deploy/scripts/deploy.sh +++ b/deploy/scripts/deploy.sh @@ -17,7 +17,7 @@ deploy() { install() { local hash - hash=$(stellar contract install \ + hash=$(stellar contract upload \ --wasm $1 \ --source $2 \ --rpc-url "$SOROBAN_RPC_URL" \ diff --git a/integration-tests/package.json b/integration-tests/package.json index 5de92027..d93fcf5b 100644 --- a/integration-tests/package.json +++ b/integration-tests/package.json @@ -13,18 +13,18 @@ "author": "EQ LAB", "license": "ISC", "devDependencies": { - "@types/chai": "^5.2.2", - "@types/chai-as-promised": "^8.0.2", + "@types/chai": "4.3.20", + "@types/chai-as-promised": "7.1.8", "@types/mocha": "^10.0.10", - "@types/node": "^24.5.2", + "@types/node": "20.19.17", "@stellar/stellar-sdk": "14.2.0", "bigint-conversion": "^2.4.3", "bignumber.js": "^9.3.1", - "chai": "^6.0.1", - "chai-as-promised": "^8.0.2", - "cross-env": "^10.0.0", - "dotenv": "^17.2.2", - "mocha": "^11.7.2", + "chai": "4.5.0", + "chai-as-promised": "7.1.2", + "cross-env": "7.0.3", + "dotenv": "16.6.1", + "mocha": "10.8.2", "ts-node": "^10.9.2", "typescript": "^5.9.2" } diff --git a/integration-tests/tests/pool.sut.ts b/integration-tests/tests/pool.sut.ts index ba838a68..4b72b443 100644 --- a/integration-tests/tests/pool.sut.ts +++ b/integration-tests/tests/pool.sut.ts @@ -115,8 +115,8 @@ export async function init(client: SorobanClient, customXlm = true): Promise { + const xdrResponse = await client.simulateTransaction( + process.env.SLENDER_POOL, + "protocol_fee", + convertToScvAddress(process.env[`SLENDER_TOKEN_${asset}`]), + ); + + return parseScvToJs(xdrResponse); +} + export async function sTokenTotalSupply( client: SorobanClient, asset: SlenderAsset diff --git a/integration-tests/tests/pool/1.borrower.spec.ts b/integration-tests/tests/pool/1.borrower.spec.ts index 8376a56a..166d17b9 100644 --- a/integration-tests/tests/pool/1.borrower.spec.ts +++ b/integration-tests/tests/pool/1.borrower.spec.ts @@ -11,6 +11,7 @@ import { inPoolBalanceOf, init, mintUnderlyingTo, + protocolFee, repay, sTokenBalanceOf, sTokenTotalSupply, @@ -36,7 +37,6 @@ describe("LendingPool: Lenders get and borrowers pay interest when time passed", let borrower1Address: string; let lender2Address: string; let borrower2Address: string; - let treasuryAddress: string; before(async function () { client = new SorobanClient(); @@ -51,7 +51,6 @@ describe("LendingPool: Lenders get and borrowers pay interest when time passed", lender2Address = lender2Keys.publicKey(); borrower1Address = borrower1Keys.publicKey(); borrower2Address = borrower2Keys.publicKey(); - treasuryAddress = treasuryKeys.publicKey(); // uncomment to resume test with existing contracts // require("dotenv").config({ path: contractsFilename }); @@ -248,17 +247,19 @@ describe("LendingPool: Lenders get and borrowers pay interest when time passed", // Borrower1 repays 1.0 XLM await repay(client, borrower1Keys, "XLM", 10_000_000n); + const sXlmTokenBalance = await tokenBalanceOf(client, "XLM", process.env.SLENDER_S_TOKEN_XLM); const borrower1XlmBalance = await tokenBalanceOf(client, "XLM", borrower1Address); - const treasuryXlmBalance = await tokenBalanceOf(client, "XLM", treasuryAddress); const borrower1DXlmBalance = await debtTokenBalanceOf(client, "XLM", borrower1Address); const sXlmBalance = await sTokenUnderlyingBalanceOf(client, "XLM"); + const protocolFeeXlmBalance = await protocolFee(client, "XLM"); const dXlmSupply = await debtTokenTotalSupply(client, "XLM"); assert.equal(borrower1XlmBalance, 79_999_999n); - assert(treasuryXlmBalance > 0 && treasuryXlmBalance < 1_000n); + assert(protocolFeeXlmBalance > 0 && protocolFeeXlmBalance < 1_000n); assert(borrower1DXlmBalance > 80_000_000n && borrower1DXlmBalance < 80_010_000n); - assert.equal(sXlmBalance + treasuryXlmBalance, 10_000_000n); + assert.equal(sXlmBalance + protocolFeeXlmBalance, 10_000_000n); + assert.equal(sXlmTokenBalance, 10_000_000n); assert.equal(dXlmSupply, borrower1DXlmBalance); }); @@ -268,17 +269,17 @@ describe("LendingPool: Lenders get and borrowers pay interest when time passed", await repay(client, borrower1Keys, "XLM", 90_000_000n); const borrower1XlmBalance = await tokenBalanceOf(client, "XLM", borrower1Address); - const treasuryXlmBalance = await tokenBalanceOf(client, "XLM", treasuryAddress); + const protocolFeeXlmBalance = await protocolFee(client, "XLM"); const borrower1DXlmBalance = await debtTokenBalanceOf(client, "XLM", borrower1Address); const sXlmBalance = await sTokenUnderlyingBalanceOf(client, "XLM"); const dXlmSupply = await debtTokenTotalSupply(client, "XLM"); assert(borrower1XlmBalance < 10_000_000n && borrower1XlmBalance > 9_990_000n); - assert(treasuryXlmBalance > 0 && treasuryXlmBalance < 1_000n); + assert(protocolFeeXlmBalance > 0 && protocolFeeXlmBalance < 1_000n); assert.equal(borrower1DXlmBalance, 0n); - assert(sXlmBalance + treasuryXlmBalance > 90_000_000n - && sXlmBalance + treasuryXlmBalance < 90_010_000n); + assert(sXlmBalance + protocolFeeXlmBalance > 90_000_000n + && sXlmBalance + protocolFeeXlmBalance < 90_010_000n); assert.equal(dXlmSupply, borrower1DXlmBalance); }); @@ -288,17 +289,17 @@ describe("LendingPool: Lenders get and borrowers pay interest when time passed", await repay(client, borrower2Keys, "XRP", 10_000_000_000n); const borrower2XrpBalance = await tokenBalanceOf(client, "XRP", borrower2Address); - const treasuryXrpBalance = await tokenBalanceOf(client, "XRP", treasuryAddress); + const protocolFeeXrpBalance = await protocolFee(client, "XRP"); const borrower2DXrpBalance = await debtTokenBalanceOf(client, "XRP", borrower2Address); const sXrpBalance = await sTokenUnderlyingBalanceOf(client, "XRP"); const dXrpSupply = await debtTokenTotalSupply(client, "XRP"); assert(borrower2XrpBalance < 1_000_000_000n && borrower2XrpBalance > 999_000_000n); - assert(treasuryXrpBalance > 0 && treasuryXrpBalance < 100_000n); + assert(protocolFeeXrpBalance > 0 && protocolFeeXrpBalance < 100_000n); assert.equal(borrower2DXrpBalance, 0n); - assert(sXrpBalance + treasuryXrpBalance > 9_000_000_000n - && sXrpBalance + treasuryXrpBalance < 9_001_000_000n); + assert(sXrpBalance + protocolFeeXrpBalance > 9_000_000_000n + && sXrpBalance + protocolFeeXrpBalance < 9_001_000_000n); assert.equal(dXrpSupply, borrower2DXrpBalance); }); @@ -456,8 +457,9 @@ describe("LendingPool: Lenders get and borrowers pay interest when time passed", const borrower1InPoolBalanceAfter = await inPoolBalanceOf(client, "RWA", borrower1Address); const borrower1AccountPositionAfter = await accountPosition(client, borrower1Keys); - assert.equal(borrwer1RWABalanceAfter - borrwer1RWABalanceBefore, 0n); - assert.equal(borrower1InPoolBalanceBefore - borrower1InPoolBalanceAfter, 0n); + assert.equal(borrwer1RWABalanceBefore + toWithdraw, borrwer1RWABalanceAfter); + assert.equal(borrower1InPoolBalanceBefore - toWithdraw, 0n); + assert.equal(borrower1InPoolBalanceAfter, 0n); assert(borrower1AccountPositionBefore.npv > borrower1AccountPositionAfter.npv); }) diff --git a/integration-tests/tests/soroban.converter.ts b/integration-tests/tests/soroban.converter.ts index 2fff150b..3311eaee 100644 --- a/integration-tests/tests/soroban.converter.ts +++ b/integration-tests/tests/soroban.converter.ts @@ -67,7 +67,7 @@ export function convertToScvBytes(value: string, encoding: BufferEncoding): xdr. } export function parseMetaXdrToJs(meta: xdr.TransactionMeta): T { - const value = meta.v3() + const value = meta.v4() .sorobanMeta() .returnValue(); diff --git a/integration-tests/yarn.lock b/integration-tests/yarn.lock index 696b1390..8fa8cd4f 100644 --- a/integration-tests/yarn.lock +++ b/integration-tests/yarn.lock @@ -9,23 +9,6 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@epic-web/invariant@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@epic-web/invariant/-/invariant-1.0.0.tgz#1073e5dee6dd540410784990eb73e4acd25c9813" - integrity sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - "@jridgewell/resolve-uri@^3.0.3": version "3.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" @@ -61,11 +44,6 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a" integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - "@stellar/js-xdr@^3.1.2": version "3.1.2" resolved "https://registry.yarnpkg.com/@stellar/js-xdr/-/js-xdr-3.1.2.tgz#db7611135cf21e989602fd72f513c3bed621bc74" @@ -117,20 +95,25 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== -"@types/chai-as-promised@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-8.0.2.tgz#5ac957d346fec5b686b62606baa5704787669704" - integrity sha512-meQ1wDr1K5KRCSvG2lX7n7/5wf70BeptTKst0axGvnN6zqaVpRqegoIbugiAPSqOW9K9aL8gDVrm7a2LXOtn2Q== +"@types/chai-as-promised@7.1.8": + version "7.1.8" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz#f2b3d82d53c59626b5d6bbc087667ccb4b677fe9" + integrity sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw== dependencies: "@types/chai" "*" -"@types/chai@*", "@types/chai@^5.2.2": +"@types/chai@*": version "5.2.2" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.2.tgz#6f14cea18180ffc4416bc0fd12be05fdd73bdd6b" integrity sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg== dependencies: "@types/deep-eql" "*" +"@types/chai@4.3.20": + version "4.3.20" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.20.tgz#cb291577ed342ca92600430841a00329ba05cecc" + integrity sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ== + "@types/deep-eql@*": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" @@ -141,12 +124,12 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.10.tgz#91f62905e8d23cbd66225312f239454a23bebfa0" integrity sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q== -"@types/node@^24.5.2": - version "24.5.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.5.2.tgz#52ceb83f50fe0fcfdfbd2a9fab6db2e9e7ef6446" - integrity sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ== +"@types/node@20.19.17": + version "20.19.17" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.19.17.tgz#41b52697373aef8a43b3b92f33b43f329b2d674b" + integrity sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ== dependencies: - undici-types "~7.12.0" + undici-types "~6.21.0" acorn-walk@^8.1.1: version "8.3.4" @@ -160,16 +143,16 @@ acorn@^8.11.0, acorn@^8.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== +ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^6.0.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" - integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== - ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -177,10 +160,13 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -ansi-styles@^6.1.0: - version "6.2.3" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" - integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" arg@^4.1.0: version "4.1.3" @@ -192,6 +178,11 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -240,6 +231,11 @@ bignumber.js@^9.3.1: resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.3.1.tgz#759c5aaddf2ffdc4f154f7b493e1c8770f88c4d7" integrity sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ== +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + brace-expansion@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" @@ -247,6 +243,13 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" +braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + browser-stdout@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -291,17 +294,25 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -chai-as-promised@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-8.0.2.tgz#cd9b77afaa976383eb4cbef9463ac5230f7a1cba" - integrity sha512-1GadL+sEJVLzDjcawPM4kjfnL+p/9vrxiEUonowKOAzvVg0PixJUdtuDzdkDeQhK3zfOE76GqGkZIQ7/Adcrqw== +chai-as-promised@7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.2.tgz#70cd73b74afd519754161386421fb71832c6d041" + integrity sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw== dependencies: - check-error "^2.1.1" + check-error "^1.0.2" -chai@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/chai/-/chai-6.0.1.tgz#88c2b4682fb56050647e222d2cf9d6772f2607b3" - integrity sha512-/JOoU2//6p5vCXh00FpNgtlw0LjvhGttaWc+y7wpW9yjBm3ys0dI8tSKZxIOgNruz5J0RleccatSIC3uxEZP0g== +chai@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" + integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" + pathval "^1.1.1" + type-detect "^4.1.0" chalk@^4.1.0: version "4.1.2" @@ -311,25 +322,35 @@ chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -check-error@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" - integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== - -chokidar@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" - integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== - dependencies: - readdirp "^4.0.1" +check-error@^1.0.2, check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" + +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" - strip-ansi "^6.0.1" + strip-ansi "^6.0.0" wrap-ansi "^7.0.0" color-convert@^2.0.1: @@ -356,15 +377,14 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -cross-env@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-10.0.0.tgz#ba25823cfa1ed6af293dcded8796fa16cd162456" - integrity sha512-aU8qlEK/nHYtVuN4p7UQgAwVljzMg8hB4YK5ThRqD2l/ziSnryncPNn7bMLt5cFYsKVKBh8HqLqyCoTupEUu7Q== +cross-env@7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== dependencies: - "@epic-web/invariant" "^1.0.0" - cross-spawn "^7.0.6" + cross-spawn "^7.0.1" -cross-spawn@^7.0.6: +cross-spawn@^7.0.1: version "7.0.6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== @@ -385,6 +405,13 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== +deep-eql@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" + integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== + dependencies: + type-detect "^4.0.0" + define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" @@ -404,15 +431,15 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -diff@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a" - integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== +diff@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== -dotenv@^17.2.2: - version "17.2.2" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.2.2.tgz#4010cfe1c2be4fc0f46fd3d951afb424bc067ac6" - integrity sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q== +dotenv@16.6.1: + version "16.6.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.6.1.tgz#773f0e69527a8315c7285d5ee73c4459d20a8020" + integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow== dunder-proto@^1.0.1: version "1.0.1" @@ -423,21 +450,11 @@ dunder-proto@^1.0.1: es-errors "^1.3.0" gopd "^1.2.0" -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - es-define-property@^1.0.0, es-define-property@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" @@ -487,6 +504,13 @@ feaxios@^0.0.23: dependencies: is-retry-allowed "^3.0.0" +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -512,14 +536,6 @@ for-each@^0.3.5: dependencies: is-callable "^1.2.7" -foreground-child@^3.1.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" - integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== - dependencies: - cross-spawn "^7.0.6" - signal-exit "^4.0.1" - form-data@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4" @@ -531,6 +547,16 @@ form-data@^4.0.4: hasown "^2.0.2" mime-types "^2.1.12" +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" @@ -541,6 +567,11 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-func-name@^2.0.1, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + get-intrinsic@^1.2.4, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" @@ -565,17 +596,23 @@ get-proto@^1.0.1: dunder-proto "^1.0.1" es-object-atoms "^1.0.0" -glob@^10.4.5: - version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" + is-glob "^4.0.1" + +glob@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" @@ -623,21 +660,53 @@ ieee754@^1.2.1: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -inherits@^2.0.4: +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + is-plain-obj@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" @@ -670,15 +739,6 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -701,10 +761,12 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" -lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== +loupe@^2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== + dependencies: + get-func-name "^2.0.1" make-error@^1.1.1: version "1.3.6" @@ -728,42 +790,37 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" -minimatch@^9.0.4, minimatch@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== +minimatch@^5.0.1, minimatch@^5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: brace-expansion "^2.0.1" -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -mocha@^11.7.2: - version "11.7.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.7.2.tgz#3c0079fe5cc2f8ea86d99124debcc42bb1ab22b5" - integrity sha512-lkqVJPmqqG/w5jmmFtiRvtA2jkDyNVUcefFJKb2uyX4dekk8Okgqop3cgbFiaIvj8uCRJVTP5x9dfxGyXm2jvQ== +mocha@10.8.2: + version "10.8.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.8.2.tgz#8d8342d016ed411b12a429eb731b825f961afb96" + integrity sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg== dependencies: + ansi-colors "^4.1.3" browser-stdout "^1.3.1" - chokidar "^4.0.1" + chokidar "^3.5.3" debug "^4.3.5" - diff "^7.0.0" + diff "^5.2.0" escape-string-regexp "^4.0.0" find-up "^5.0.0" - glob "^10.4.5" + glob "^8.1.0" he "^1.2.0" js-yaml "^4.1.0" log-symbols "^4.1.0" - minimatch "^9.0.5" + minimatch "^5.1.6" ms "^2.1.3" - picocolors "^1.1.1" serialize-javascript "^6.0.2" strip-json-comments "^3.1.1" supports-color "^8.1.1" - workerpool "^9.2.0" - yargs "^17.7.2" - yargs-parser "^21.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" yargs-unparser "^2.0.0" ms@^2.1.3: @@ -771,6 +828,18 @@ ms@^2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -785,11 +854,6 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" -package-json-from-dist@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" - integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== - path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -800,18 +864,15 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -picocolors@^1.1.1: +pathval@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== possible-typed-array-names@^1.0.0: version "1.1.0" @@ -830,10 +891,12 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -readdirp@^4.0.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" - integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" require-directory@^2.1.1: version "2.1.1" @@ -885,12 +948,7 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -899,29 +957,13 @@ signal-exit@^4.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.2.tgz#132875abde678c7ea8d691533f2e7e22bb744dba" - integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== - dependencies: - ansi-regex "^6.0.1" - strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -950,6 +992,13 @@ to-buffer@^1.2.0: safe-buffer "^5.2.1" typed-array-buffer "^1.0.3" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + toml@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" @@ -974,6 +1023,11 @@ ts-node@^10.9.2: v8-compile-cache-lib "^3.0.1" yn "3.1.1" +type-detect@^4.0.0, type-detect@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" + integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== + typed-array-buffer@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" @@ -988,10 +1042,10 @@ typescript@^5.9.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.2.tgz#d93450cddec5154a2d5cabe3b8102b83316fb2a6" integrity sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A== -undici-types@~7.12.0: - version "7.12.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.12.0.tgz#15c5c7475c2a3ba30659529f5cdb4674b622fafb" - integrity sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ== +undici-types@~6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" + integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== urijs@^1.19.1: version "1.19.11" @@ -1023,12 +1077,12 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -workerpool@^9.2.0: - version "9.3.4" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-9.3.4.tgz#f6c92395b2141afd78e2a889e80cb338fe9fca41" - integrity sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg== +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -1037,24 +1091,20 @@ workerpool@^9.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== +yargs-parser@^20.2.2, yargs-parser@^20.2.9: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== yargs-unparser@^2.0.0: version "2.0.0" @@ -1066,18 +1116,18 @@ yargs-unparser@^2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@^17.7.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: - cliui "^8.0.1" + cliui "^7.0.2" escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" - string-width "^4.2.3" + string-width "^4.2.0" y18n "^5.0.5" - yargs-parser "^21.1.1" + yargs-parser "^20.2.2" yn@3.1.1: version "3.1.1" From cf2f257555e4674612df40be71fb1641a1dad618 Mon Sep 17 00:00:00 2001 From: Artur Abliazimov Date: Tue, 30 Sep 2025 14:39:42 +0300 Subject: [PATCH 06/11] Upgrade mainnet contracts to Protocol 23 --- contracts/debt-token/src/lib.rs | 2 +- contracts/pool/src/lib.rs | 2 +- contracts/s-token/src/lib.rs | 2 +- deploy/artifacts/mainnet/.contracts | 6 +++--- deploy/artifacts/mainnet/debt_token.wasm | Bin 7616 -> 0 bytes .../mainnet/debt_token_optimized.wasm | Bin 0 -> 9146 bytes deploy/artifacts/mainnet/deployer.wasm | Bin 7496 -> 0 bytes .../mainnet/flash_loan_receiver_mock.wasm | Bin 2519 -> 0 bytes deploy/artifacts/mainnet/pool.wasm | Bin 62033 -> 0 bytes deploy/artifacts/mainnet/pool_optimized.wasm | Bin 0 -> 60724 bytes deploy/artifacts/mainnet/price_feed_mock.wasm | Bin 2420 -> 0 bytes .../{s_token.wasm => s_token_optimized.wasm} | Bin 17791 -> 19512 bytes deploy/scripts/upgrade.sh | 2 +- .../tests/pool/1.borrower.spec.ts | 3 +-- 14 files changed, 8 insertions(+), 9 deletions(-) delete mode 100755 deploy/artifacts/mainnet/debt_token.wasm create mode 100644 deploy/artifacts/mainnet/debt_token_optimized.wasm delete mode 100755 deploy/artifacts/mainnet/deployer.wasm delete mode 100755 deploy/artifacts/mainnet/flash_loan_receiver_mock.wasm delete mode 100755 deploy/artifacts/mainnet/pool.wasm create mode 100644 deploy/artifacts/mainnet/pool_optimized.wasm delete mode 100755 deploy/artifacts/mainnet/price_feed_mock.wasm rename deploy/artifacts/mainnet/{s_token.wasm => s_token_optimized.wasm} (53%) mode change 100755 => 100644 diff --git a/contracts/debt-token/src/lib.rs b/contracts/debt-token/src/lib.rs index f01a8413..05ca14e0 100644 --- a/contracts/debt-token/src/lib.rs +++ b/contracts/debt-token/src/lib.rs @@ -89,7 +89,7 @@ impl DebtTokenTrait for DebtToken { /// Returns the current version of the contract. fn version() -> u32 { - 1 + 2 } /// Returns the balance of tokens for a specified `id`. diff --git a/contracts/pool/src/lib.rs b/contracts/pool/src/lib.rs index 792771f2..145e88dd 100644 --- a/contracts/pool/src/lib.rs +++ b/contracts/pool/src/lib.rs @@ -53,7 +53,7 @@ impl LendingPoolTrait for LendingPool { } fn version() -> u32 { - 1 + 2 } fn init_reserve(env: Env, asset: Address, reserve_type: ReserveType) -> Result<(), Error> { diff --git a/contracts/s-token/src/lib.rs b/contracts/s-token/src/lib.rs index c55ab9a2..3f464db2 100644 --- a/contracts/s-token/src/lib.rs +++ b/contracts/s-token/src/lib.rs @@ -89,7 +89,7 @@ impl STokenTrait for SToken { } fn version() -> u32 { - 1 + 2 } /// Returns the amount of tokens that the `spender` is allowed to withdraw from the `from` address. diff --git a/deploy/artifacts/mainnet/.contracts b/deploy/artifacts/mainnet/.contracts index 4c51283e..db4c69f0 100644 --- a/deploy/artifacts/mainnet/.contracts +++ b/deploy/artifacts/mainnet/.contracts @@ -1,11 +1,11 @@ SLENDER_TOKEN_XLM=CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA SLENDER_TOKEN_XRP=CAAV3AE3VKD2P4TY7LWTQMMJHIJ4WOCZ5ANCIJPC3NRSERKVXNHBU2W7 SLENDER_TOKEN_USDC=CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75 -SLENDER_S_TOKEN_HASH=d14e8cf2e2c07ac4237e4804a50d02c717333ab2a1a4ed63cc63228e265b0a0d -SLENDER_DEBT_TOKEN_HASH=aab6f670caa14f0e428bb592487e3bdfb10cc906967bb3139111409715d46b80 +SLENDER_S_TOKEN_HASH=903bf59c7c6a9733543282e98136806dd4f5a9c775132ff5a42e9fcb4ddb6f2a +SLENDER_DEBT_TOKEN_HASH=004dc6f0eb924b7e4fcb51cc4680f97603ca2c4e20bab54865ba8efc0a7db33f SLENDER_DEPLOYER=CCDZI7OYKBLKSDZ3IGDSPMQPNOAYSPEONPOPZGLAVCVPZGQNUTPB7WCA SLENDER_PRICE_FEED=CALI2BYU2JE6WVRUFYTS6MSBNEHGJ35P4AVCZYF3B6QOE3QKOB2PLE6M -SLENDER_POOL_HASH=1d704331dda9871c03acd8b33cc27ea846e723d661fc27126b7e88e7fb924888 +SLENDER_POOL_HASH=75de44fc7f75f26d9fcc25c5e3fe15822afc94ad0074b6c35998a7b703ad153b SLENDER_POOL=CCL2KTHYOVMNNOFDT7PEAHACUBYVFLRH2LYWVQB6IPMHHAVUBC7ZUUC2 SLENDER_S_TOKEN_XRP=CD677VJOOQY5SMNQND7NYL64K4ZQYO24PXQSZKGTKSHXSGR2DHXWM2Q7 diff --git a/deploy/artifacts/mainnet/debt_token.wasm b/deploy/artifacts/mainnet/debt_token.wasm deleted file mode 100755 index a9d43a4b317495a1ee4260ae0ab8ff8158f5a64b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7616 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 beCTj^@X(=h@$mlO!2aUVFqoJqA7uXnTfC|J literal 0 HcmV?d00001 diff --git a/deploy/artifacts/mainnet/deployer.wasm b/deploy/artifacts/mainnet/deployer.wasm deleted file mode 100755 index 64615c56ae5e8132cf86ad955a67e9ddcd5517e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7496 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 diff --git a/deploy/artifacts/mainnet/flash_loan_receiver_mock.wasm b/deploy/artifacts/mainnet/flash_loan_receiver_mock.wasm deleted file mode 100755 index 4eaf81a8cb53d78ad308bb1b6727983f9b233a94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2519 zcmaJ?O^j1T9RJVEYx~;iYu~bf%VNm9LLwYo78Z6FJka+P2*Ctcj0ZimZ`-%hZa>!7 z?ji=a7+CORIN-@62Tn`8=*7g~!Nf#OO!TV8D+e#$yx?!;pDK zf`x3F7+V9b_ak_(%|c2+ItS?*dk>rjn}@Ukj^1a%S!7M@bygwHTDXC*>$5G*5ye6} zV_7!OF-duH3Ra4(Fd0FjYlL0VnBiL8PvCwkdq1d=aAfU-bq3F+H#&tz~jp>9dK${ZU#@-O_d7Lw{LkV zC49Dw7cHMPJqtP#68m;gxK)&jHUo7#ux=?fMBJR*4S)W_PRl(o{2<@y-$QQvqQ)l< z^88qqU8fNh?(QxX zA85Zz!sizpri8*S zm?{LH{`L5?Z@&8dZ+L{D`oi7e?lEs=Rc<2~Y{2xqa;}$b<-E12z`TCFBsXpbblI_$ zt)x5QX)Dlr699H%nwyvg3!j>%wwty+i!V0q*RTKi?cwL>MQxd-Ez74;FGxN~`X7}&)Q+4~cBnQ|JZtK>mQ>V`3fBx_DKc|A7PdyO^K@h$aZ`ct&6F##edd7Z_ zJ`?PSjvft(eUC5iml&74} z^1r-Z-qN0u>O#Q3fnLF2N2`~%j#PaWzG+JbJ8DI>8Vo&QjQ&?Ws@m(^^9Wej0E*V= zRjud%Ps(IDNWE%(3Zfs0)`pLVn}Qa<+k=GP_Xc6OCwxD@Ph0v4^6RAE&m=x==_kU? zmcD~BPlWzgZ#^Auw4C+SbJ*V98LqdIyUE!TZXmsf@&T=Ewvwvz30haps`D}H!_(mh ztjtD!5A(DhK59=Nwfgr^M)mlbzd${E?CBn>XOES6G@Ky+Q5(e*)Rxf7PR96X_=NRs zJx>qQlR7=|Y5ErbTzERH4XkJ`j+%{1vr?%H3{;Z#z(BOJ9W^Th$v`;RXjGywu8c;j z>a}R~k|jfno7Y9xyH2GtSXr9gkS=PZi)!(j+VHYUt#;$kP0jkvjj>y99j?`C!?#8H zFI`)UhL)}ys6_9Hmk+j=-yQ~0QV$2hP-GI+gCJR-EP8M2eF^C>3BsTig+ciKIF75! zYK@UQ8Y9(4qnT8~{b8+EiNjz~bwzwM%%`SigXYm7KlT&;I<0H%&16mWiCs@TdGH6K zps{D)o5*TJXuJh?CU zM`24ZZ9ll{sa*%3-WB{zIQ-PE-tG3M4(&Yj#ixRQ9FFeVxAW1*cWr<4$%6-<{L-F% zU)cWSzTQhe8!rFcllwlu=L=svxNG~)r?!9Y$;Thxd1%+cosS2n!sZv|>kCeYE&q@* zyFUN<;Gcwz$96q>sJQ#NaG4t4|KyX8ljAGgc}U&-r{VB5a$gOHto*?}pWC(l^SgFE z_Ehj%*xcWD`?aw4*slFgKDFmi@bh8i;I92Ue<1jUaM9=Y>@z5BKXh>CzNbFF>tOKD z!upr?9NPWZ!JS_UUJt8&n87cH1J=OKFFv&^_?57+Uy1E|_I>`z;B1)g{M_fB{Ng_K zm-^Mqe;y7zzUROf_dLenga0X9q<0sB<5$CBYB+es=)NAdZDO`Ry7Td!`#!fT_@BdJ zpK<8PLpvYe{?r%u?|=LUf?o?8pMQMkQ@gi6{^ZVm!LNsl4t;6o{_RifdTh_mecNr+ z!Ec1E{Rf{s^dvwQK!Se}4u9_PoqL|(abNEL5<+7CDr{`uPEU7k-?i_tIBag;zIzwd zJ-YL$U2!z9C=BwjS^Zzb-wb~%-1=MLzYH6%|44i~TphR|UDpk}$ENsi?sSou{kM1JYn*&wf^ z-SqFc@RqpViF8R@1A06%k^i|K*UQHv{;_M-^>}O|{|h}HO1m!L-Slp~JLb!*Z`D+0 z^F;o_4^gJEpv-1pX1rBZnRCHJ{!=P6u%OTuUubKqqCyua^bb_1*Vk?S`Hohi=NEbY zik>$YRI=L_+TV&*=;u|Sm3B7)SQo0(>8AK>k*sfu&ydV72NV3B4kyxkG@ir0hN-X> zsfrWfME97^5#7Rp0rb?s>dUCQTHbbH4R5ET8FdI&+37Tt}#88u% z?#+@lHsLOze^Gk7O8~5k({QCr@>GTY4$mF4)cx=eAMXYak`Q9>-}q$ro#MaXk%P%I zDwJjw3e=zPHjgzoQBlwhHpM}+sXD^+)^7Mf^Pn~E40Bv~Dt{+DkVW}#2KOc7F3Owt zwSf~YTZ6o-7rXTzrm`-4l<}sn6Z6~Y6y@TgkT1btgYI+FbT3p!NH2nB%W82^H%i~r zJQ{{a{m?5y-)`VymmJ&L4px!`2IcUkrj8yzrUCQ#x$e;i58gu&$M6^@S?TYGt^z{e z5(o6BqDw+^>Xl1u=#C!Hu*PD2tax~S6%leY5%kXod$UM=aN#}4csEo9Olh~#sc=&T z8tFtQj>nnf@M8v@U}N-AvNun-s;kkLgqt^liS(OvDj(mgPE=fUOT4+mldXGomnf&zRb1*5)}n89Rr%7YHUPBI>y0|? z)7z&z8c4GnG#N$@9@QQ^DoRBFKnV6g7{WvVeDEpy7G^P_UYUv2-`|g;_-I2DcqZyKFc#G_NN6l-ecakncWfL~>5|vF z?)h$VEKNEUrZdjRJhD%PpvHvtiOf2a%`40o(5Q6Z37_k}5j+TZEBR%SH#3{_1`O#z z^>ixCe4%ezp-3D=`6t5k`?`_P=N7n5R%1XmuV*!0O;lY^&V-!->MP!v4%7Gg@>{`j zKc9`Fm^1{(-!4t7{Qc5l(DLxO&E>3Ca^g} zkxjV=B8h)0c>RAX)l{wfbROSYZ#|GktuI;l1H^tMGa$p-gH*mF0 z@ra4l7-;eLJUc&FG89u>c$U>wfW&%mrRVE^Sz2H-AF8k=@YXY zqR!K?;j?D(yZ_PuSEIdy^-@Fz&2HQYzuP-57_44r#RE}wkiQk|9jr>aHfY##rsKVX zm1WCER;(;CzC%Vlx@xtEB>z|8-gdLqYIdK4uF@fYb;Wgkah+utR^WV@m~E9gWn!*O zTq+Y&?V`+dnV4Ep=9G!q8_Rmi#9W!UR3@fwD&Hy-GiBmTnV5QCS*A?Pl!-HCVz!s~ zP}yjinEOyig0p#BpBM}ggCUyF2W{F5aVb$4danJ)F@@`;;se(PbuLM8-x6=5%v>O@ ziTH%H4jbzxM-O-NkaE3;yWyWvZJaODfaU2r&(NSV@= z`nPS0PbwLErXpnKj!M^-87Lc;F;-^Gg!$V)IveDYDPkejG*<`2L?kH?9lAN3j;sDH z)|>U#nay;@aTAOlb!#U_&(T2kbXdnqWKs|WZLuiL}nO=$}6of0P?|mgVZZ_rr?PA znUaezl2lvI1)(y=#Y1d!e(`xhmuWyTj?>(xitgM-y9ltJZnljMm`+wbhHy?-_bX;& z!g{(W?XWk7=&Hfo*!&u72b~cf6XpXSftMqv9V(B+Su!3S%|n;03*eXe9|iYHQHt{Q zd!^gu4GF|3|Bb-kuJpJ6M{&F2BW>aS2lq<1i}DS7J&wF*Z}T-tK;&Tc`C}ktj5R@v z5*3|g#w9_%}4y_q05tRq0|#6k5Op3DfUcF!`qD-qCx(&%G20p@0`9 zvF5w)CC~1g_w^8_XvJ`O1nl#uoca{_(`!6lP*3DB=<6YfQ7LsoVFpuwRth}VnNYvr zw#hpo%Y7o=0(EAUk7)FCNV5)#raZXMujHRZqJK-enb68}xq6SwrEn~?*-cV4g=E4t z#xGohdLVQW-{w*aF?_2SzCr&W+^q{hhobdNH)6(AiO5G3Y&1jB@r5iGh9OH)qJJz( z(hq3zL-kwIKb;?wnSVA-hrMbyPojRBWM#yN={&tRc_t4!5kuidYL=$TMf{Jd1sF7+ z!UEGAeZTr>S%_xEy;3$`uz9HL`TBx82$CRN(4BhePrns+gY}ah!aTU|HN!Kt4XAmTuNP!b2rtZ1qtyy%QIRsfmJ96w-m+~n z)|x_I8H?76`&ML;jF4@Tgt#ccCbrngKIdMR;8SAB2hwRFS%itov>@75El z|LgWdI6+U;eB!MpI#cullldC9f+_YzFFp=9jDIr!UIuFt^6B3R((h$fM{F>$ghnbV zFzI1{6;wS=c|#%cboX>W{YGGaH+s;xm8$hBab0$URmh|nZun+=wVthX1u0`-YM62! zdtj2ZDx5CNV7h1mLmYaZKR+UC1G{?bsAet@TWg4|QBN8-S5V7Xv?RayY(mkn6w1LipV}hIwY<#`uTPCgd|BS%P4Qu+ZV&JHV0ed8W6}DJ z(R%-MOvE2}1*cG7Y`oHQfH%JdCCP|Yj#mVH87UK9Y4G<_7Z`W(2EBzmjX#Qul`}yar8N_pr6s$BvOD_9 z!jS}whVm)Zgm1;x*Y)CCzWS@pLzUj0m3@1#Em6=@?q~(&?!laHtP4(tSq#1B;UV}* zc<(58(Y=(n=CYQJE};Tn8e1_bN+V?{ofM@dUG&bGf+EgooL0-(Fl+Z}QIXj&8(fgF zANx~4Jco@cMe~A*qRx;CpAS2!tEHo6=kI^cE~zhuhfXC9r$5R-#-c6K5pIdMb`}*- z;byAnjX_;{t)Omhm|>Nj2|J7D3u6js3n5Q>t;OtDa#xqGXklUw?04rmDwQu??b9M zH5i5X#56KhKSqt|$*|q%hMi@ttMc>cW9_>9qlNRL(M!$eAs>sUI6;dPhINs`pIM~v zTox&Kt@!1FL5!S|jgD9c8 zm!+N~E%xjPBs*|tAlB0|u!{8zT52t+wxz~MA&(K-VTF<{#ndmHWb*L-qtadAf9nzXROL=wzU3VE**llMy*NfE&D4?F7tW9)=xlVB% z=?0yZz&sDgxKNqMqP=;1Aj5q(0SecWaTrRJ2X_X{tlTV-tKQ!h@>TQoj#1X~BL}hp zv>`W;2j6SOtI{!md!9^W5SA}qQ>|4IkE0jWcdOL|9kV983Iy=xRe%aX@6J~y^3C$) zASrp@bym5R9p_eeRz~V&eJnZ~b)tm}3bCJor7q0|%u}4o5sDGIk-}V8V*JU61B+ed z)*N?h_**sUoV(?b*Cw;%_;cOhq4uD=#kt8&C9MJCv9z9vzGH_&c~g9`xSr=KiyHcV zgQP%kPFbMctcq|wtNe?x;L2dQ4!GKD=IC?-=_4-9XM>N!jlfC)(n zVDGF1A$*auF^+A4_FT-=bA2QJxH4eXaPZPrO#}_Y4;yuC{rK%baxVr{D`^3E%&8DU z`9c8?1DP=PL(y9?>m5*%?@2Y?ND>yE`2MZ-`RTpsKxZ{wYr3^*ohA{`(5UIV=A?s1 z7=5lX`gCZ=TgZV-*Z7QEjB!W@yUk~;^E|;U7UK}&7pphLjtdhe4#XvBwbe6$?uPV} z0>Xs~b7ug|R?D#$yTxuv{&rxF#`?P8El9=HM(<%ZHII}$6Q|p<73rs#nE_};xhv97 z-{V$iE4SWr5Q6HPFgkDsSOemyGpZ|SeO=Lky8Mj*_50P0^Obg;{5esr6oKnin7(yH z18zv3*dg>IH=2H?NC%zF4PkgtT70&iPgC0{^6ImCbvoiP>><+gX6HuIOxp|eCBKXa z@3`w-=9K$FWX1y6Og1lG2H)~2d#%*tS>EtuML%DN+6@W_fK_*cUbq-$H)ZxdUDnQtdg5Z%bz^z zZgSVTRq01GrZeF^Huf10C=?#Og13lQvg@#J$J8BEr<>A7c00>kkj$97DQ#w}3L<*2 zU1`F2sNLOwN2;b4HQ{P4nt;a}(v7(5h0=@Mjk*lGTXm_s&ZhV>+{R^_;yGP!#`i@H z;zpOa*Y!eGP<3j16x-_Fv;|)UF>EBg9-_XiO52?==@E4|P;k!zQ*8y3!OlhL$9j`~ zn7MJw1VLun9EG>K)zY50=|k+5SIpnazWM81F@F&IN)P&NosL^>P`~b7rq0h9B%w+4 zxGts8rmnCyJiTmbb~3A@t?6%T`inl0*7UdgrysTL2A&(aY_{n)@1`dfA$UQc5X*I7 z!i^Bj^;UaJwYU0eZxubvlw0%=^>3voMkJnEha6d;Zf4iHEZxzg5%Qq&>rwYQvbRRQQce3 zee4BEUH5~^RvNchgP6WWrGq0G;u}z|fmw`tW)VwIaHE|yVj2wjW_O#tbemg8N7fz5 z*6{|J^KU?58=?!5q}O+&yhS1|k(^Op-Cb9Z8uVzShK?Xo6DdM!Yo(%TDbGl)-C2to zv(l~VIJ$P5i8koyO~gy7Xd{B4HuQ7Uf|^`9o6vB=qv@e&JU>k^L%J?QBTv_7kq}JD zsArk5WX4Ft6lHF-Il@!(r`B{UU;x10qds5Mzn>4 zBV7*>o9?fh$gk0jWHGY39nxNqhjdsZS1iD}a>0(A(t83wWGtif3Hwc+=Amtg`H;Iw zx=KoH^WL&s#2Cn<8lfVgaL5=8pYMjpvZVV?z)Se1kkT$WB`pc(7)^j&Yv{!Rt)`7H z@GV*;289nx5A?4htb1zK)fN1#99QNu>N)Nl4hf7)y7YIkoxL*yp-$d5d5xl@5miIC zSw;NLyQBmUEzu(St>kXr#KHhsT_v3~pWi8S-{k+9#Y=1(xr5{m6dS;es}dMRGStk8 z1kU9_Q+jsc>Kg!-%=OsT<})Sa$_~o~qV)&OBswZ45Q=pt;$NtqGOYv-*tDAeQ8y9x zE-j9jM41UI3i#}k5 z+aJRh%R}6Xhr!*7;%YD$Dz?C~-ozR!*KnE;kX6$k$HQEf#Io^l!C;>XJA^XGMBwrM z^p1R*a0;AJ_)-YB@Q$QTT_*Zww6=Z+D0Bf-(8a#H^AlAMmm||^W_~eC{|-K;Sz=mC z_oHS>j!9E07fzBweuD0^ESg?o@i#8rswo^-;*{j8BB{7)2lWD~ zX2Qv2^w$>ZoGGz2F*LoDCC`Pdat17kO?9y zC?@C63lc)uH5oe(jD#q$aB?&cL0*<#a0B(tKaqKCwAK{OG6gjto!+*x`Ri>~wQ7dz z$=+<(Tl^@wH3R=}9(*uFea4}*F*>FzQ$591hT~kwJxFl(#^?lD@@(;oMw))k4P#;` zq=yVC=wK+&%2uY|572ow9q}wG{@kD&Qfp9iRr5P6^HC$Ny5U>mlM$W(`mr&3llG)| zs(d*;^}Sz3PNU5#|D^gVhhDafyR%-Kt)&~d zfwAiqHLa2msv5LMsFdp03OytSZIs8NZq>e_9D%v8Gz$1DykJF?11ng_X_ks8cv9tt&?4>kUlb;BdsvaPQj$*La1z=^7B8z#10%Pj*5T?^BK zOwh1ZqG1B6;b0jygOU=$LR5NyU@VcDGDOEuLm#$L4$W|J`Z3*YK4nmX9=16i7bKA_ z{Umow9~f;%ebTq!3RCYBb(-(Zn1pl*X>?ULU_FHesi$pMx1J8r)1~UE0-lEDHH=-F zepcAw6~}D38#?Zm^EWi9E{$a)Zt!6|8Y{}T2-BMi(`}u_yo9dj@pTMT#G5n>UGXDa zd`u%=gH+?ex5hNJANCP(>mbYz2 zSNwTrbcGq6)>YAry22FkmJG`~H>)e<&vO;tzEE5*i+)x>H+s%!Ce4vxRa{gS6ckTD zOFliT^f8}4t@M;nPb>Yl=neMLM{cY95Jw84!ySUOLD-2xH>Y3F@TZdw2sakJnq-R& z?8hiIoWGJx+!6(wVAaF<+p%(9p3edH(M!pu=sRkCF@ph+Vgi@AH_|p^x6aLF=$w#A z(T-rND|j7G$xb?qx1F%tRU-x zMn7j6CeV;8zCFg9a$_n-y4y9uo(Aj}2;7zK$-0|#sB!v z{-EWH(hJtnk!BbK##dM>a^SwCMEbbRQsja3($zp3q%t@{D}91%UBsB~qgtW)lie3D zf9Jn_^ViV%)BCAVEbFdxP*GzvCXwyTbu3v5PT~;~GZJsE6ybLQqV+gH1-fE(a2#e)%B6=iL|6Xt{(*(?m(xsw-n*h6!B|j6|9m6qBTiZLRfp z!!q2qFhoKO5h4tNtO8Jtau8Hu`sq$0kxYFGTKTX-T;eVZvt$(J#qZLve*uLRP1+(U zHE{49U(C_t&v`sUeegGRm)wJ&m(YeZGs$a}?cErqf`h$vtoI5j$}>4CE>Asg1QcRO zDTKuEyj|2>V!0n#XawFKM$fP`k?@aU>7`X%3{JG;S5VMG!GFJ=`n`b-7X8^)HposM zcCgHc^n;9JR$cYeP*Uwv`gs6fXw)p?=++A%O$J)(XF`vISSuI{aG6duGQ>MZUGXtR zR$IbLJBwV9+D>Nr5p;d<1P(PKky|P36nbo|8@2Fb#^NN9tzzBPKh3*^&Yp#zQbp?U ze23;!6jK<5t2S?5U`DD#QM%lWQF+kkf&2G_EoHz3q4D|aFU|(}vh?pO9$Thg42w); zIi*}+_b|(mcVUi+#4x;3arD<@jdYBMnAe^sCe~TPtNnZ4e(&+6X7kyeB?~44YOqej z_^dP2riaQ&sih0YLDVA|6NuW8n4a#JM1-`!9%}I>kfvK&_&&1ftn3xwieDXnk15WA zH|(a{ip-j z6l(x06BlBj9*C5lb;I;MnAvL$G*{F&)jwmQGJ4`6G=Or~EnxpPXq5Afp~(>yZ+S&%->d$hxXQu-w^A|^DFiyaIOE8($*cAjpm%#*IDn# zP2^k!$#eN%wG~bFyfPz;lLeQgGwXqi3bj+%S41M>4+TrK;{!8oKDL()Z85<{rse?7 z%?gP@`AU(9B-RDvSyV*rL>9FZ<;3{#1P6;IUx_XD4zp&sjbl~a0}x;ZO?hUAj^KG* zQ=HPpcLoH3iadSnfC9SY^)S5j@f(2BG72xTp@qo}Aw;3o*$Xnky>__-fEB=k5I$@q z*8KIz3za!QIso=w;R5r%4l!KT|LhV z5-I>tx;k6tF7k8S8jE(@9FuswH^(i_@nf!KULMxr_LIaXRZen?4Kn5)YsnYN^Q}Dh zNYFRC(fItIqx#2$4z0rN!}RdpIBe3|x{J%0+%<_gHe2~!zJ8>;N-Ei9D!s46CCBZqiq@G>YP)qw!RsbuA{4e8`l7+5_8EmjYo%0V3F0 zpiQx$SmAoZ>klKr1w~cp^zB63Sm&`uzNsDxDKxBiv!EDwDf2~Q#{SdJJJtAH_vix$ z+5tL_-?>2GcFhEo7E&n?HecGO3p+kTplSMW^+TNHs^(-!`*KDo$mRJ&*7d zPYQZNoBBlGQn#!te|2RhWyI?|-8NxsEw941Wcnc4n0*iqSn}iLm-)+LZ;;0FHL|>4Ot6Q{u70pfF)n?{tsLJbI`PMBL64V%2UF?V;inH|6{d^Sq>Fy2qoo7C zY{mu1u=F1aUZBf10f)R#8<0lnYx8^9h-RA?(eV*5Sar8#LAgoR$FLG1d;$hrh0U|c z3r2dKz-9XRPb?5nRR&!Zx&qf8z7wThmE;~!1ejr2gIPr#uTi=ttnSWz_4%Q0z%;p< zuuvt@g6gj3VJDEnK*if@%#t;NNE1y^^9ZF4d(&rZb1hkNsM_w@YC%+NTmszCC#QYy&#`z#?KnnLU*L3E08L-rV4E3}>la7}-P67fa;JSM`tor!@IumOEu>__N3ubd%5W3qGk!rNK_;}13!cYa8)PP8R8Awz;daQf7ORCNiBL;P zA8kfe1~sC&71&~{FwE3eO*CjH$kNaprWLoKwndUMvJ%|^R+1|JmUu@|*ss8VP=*(~ zF}te|)4AG1`gvd!oB(6UbR>`-b<@6RbDM8-3)Ki`P_=}vRJ@ftFKGo!Th3JhuZn=T zvMU4*-1v|Ry1V)-=AUVCC5*|?V5Xd6$L*ZTIzJ%~Y2S5NO3)h>fLI9{-T62_;E3p*$T=cCg7^< zt4bGMG^gUX$=`6K6M+RGqd;x3P#UDkBW-g?Sc~T^K!^=Qrfd+dnv55fOs`Nae<{~l z85(2j2i`*l5@>whPVl1yx)x!g21!NS%Uad$i2%bI*Ryqs5v|9>60l^+yXag&WiQ zy0%XRVBlVW;}{@Jc_jDVO!-2Xse|4i5h0fIYlvXuN71%ejCYBe`m%Lqgw>QQ`Y<0f zWg#%V7ClD&l7ee&qbGVajT-EnhaF^dHSD5s{|7w0d%$l-df`WB17xQLoG1P~2*TPu zVB|mmP^luUiaEmZAvQqnh~Ee^hJ^q}gy;C3O8AG+RUn(PoGZ&|MqsV5e=7l4L^KMm z_OTdrOrX{74S+W$-1o!;Di|@DLMD!D28k`&_;4DjQ5M1B^JL`ul(A1em6uJbd-EO( ziE?&S%0gurJs9Z0%i`kH7xQlRaOXO_cIvY1rDhR$GoZkmZoenn6)ZIFnh|=H9~;t- zLEtMq&ySVVgQ{+3H>&sxY(~VaptxUI0pv!vQ=hb1*TWpZw~Z%ckJ{yy72c3jO}^X*sMP2F?OuLSnnAXdKDKwA5Bop8stj<@d1NO$z@g<%D`{gWAjmC#uL8%3Dar#fB>ED$|w-Q@1xi%F!Ps z$+9+I5HD~kQUo;=Db(2_Wt-QG@GU~tQnq+*DGQ*nlspuk8OS~HH)a~%UHkL0hHYU6 zW-AIc%3;JJ58N+N%9cBU*#bLt-%P)3bXvC{A!FsD#JphT;#O8RN`HiMOqx_}xC?u{ zN}m)=tMrPo_=aByHJ6JVZ!!mQv~x+Z54gBagTj)TUdheiR@A1&4^EkonyRqRf+xXl z$GBsiL)-J|t#u`RDNLCautN3N`{0K$Xc@w$>4GMO6xesHGX3Dod!b(nQRMGMbPDYoXH#JO|#+A~gM$XkV5J-PpWVf@Fzx zTJmJ6hXdo(-HMo&7W`>j$RfA=VWwx95Uw~si3Q32O|rfZS2HHa!HY|A4%GWEBQCYr zN{@5)$NJtDoIvacxMHX!1+S1=!)t7PYVZ!~`8jO_VghD$_0;zU$$U;`Lq3~KXd5Us z%*Cfvm3D{e_F}A^pd`*K-+;-@g*box`Puospg{mDwM$ z>SwQLcD88tjBoZ_+3Xpgk2@jmAn_y`({zcc_bH2aC}3&2G-I4h(y1(F{Qzitkk->> zy-B^N&6=#h1J)+_4B=4-ZiF;1Jl&}#ZT* zuvb>-h4n_0BNW6SyY@RqWI{49r)V%P|{kFbPC%pa@*XlUpcvZCW0-G>4k6eQ3Z>lhlVZ zGfa{-b~-LZkI6%wokn{|m1KUCHMEOCJ7reo|e%AHAyE#0P+D~Axi7C1b} zOC=7&;thxWMq9(-sVn+3MSs)|;b^MlM2Sq7BJ!mYGvVZ4j`E9NS%Aeb$A#$Hj&j43 zD{{eZMe|U{*|N(BW54D16e_5;1D`_QY_hXrpfk#Lrr090*wz4YAsw~dK*xzOQ`-Ir z8AcP}vQBEqPrL}F*U~QdnSWJjj&E$TDFfp0Mk@2Hp`g-x*6iTv?%jr5@Z+FGAP)m(H)(bP5MY% zSmU{a_@`j17c4iO@FJFkUD zpbH}4^e~0=WX=ZQCoCRi0nA%V}V)P+z>nT(#TwWGUS$~*hebTLZi zhbk5@J<&}u93w>WKLz#r(!(@RO1*n%z{-}#KF}7WRrCz~neWS)`M#WuvH_cS*Y-#Z ziM}crZ$xes@a(=%1w&;S`PG+BRX=6Z= z%LhEfsKhFuWtt!IpqRGinI`k|&bNn8lY*Dz)6_%n%Jq!sa>)3#z+{s@3_ct3PG*g? z9}5P(L|<(kO*+?6o)AsEsw(DL)?CP*Y?`?kqFjUL_IRLp3}%O?{PPPTO9HKjHE3}# zHV7s1zp^!NHJIJ<;CaJGzyqE)LQ0B98L%PP@z#0zpr;6K(I+p*A?GA>nBy`N{rI%gYnXU=fN%3I1a3>>!t z=WVg+gLRvw4*?Y-*Ygmljcns)3EQCEk_Sc!>+^wgmn5ESjj)UglTKn@UN7vZc&mmb zFQv~()kB$M?M^DT3|%fV=qVTMFGONVLtZk_}$+rW)? ztb;#1-U^acQQy@Ed+2xYAYgeoj@40>S6+1!2LvIsiiM&GpUHr;#hCW{MCj(+}1FiPbAW z6=R(bj41bGfrDCY6nTI^YFA5e<~p)?L>CC~C|OdsD35lnb4Via(MQ;jul|_BNBQcO zOf-B>gw(jG3^H=u$nwP4&I|ut2$=ET<;4SInLgo^l#UqwwH%M};Pf@zB`Xx&sor(?V7U;;XFSIgxTF$o^A8RG8& z0}IE@e`jho$X63tD=$Z&uzdyWqa5BDtP}3Yt;>aAKQ(8|+rKA=wapSPc^UNY63hLm z-Wmx9v`OjmJ5D)@D0oD=7qxX2gHSt_g{i{2?U*)dBdy0am6+It)vATLV;;IPR#~6m zk`}q}B$wPXe-A3 z49>uc^_d>HuLd;}V9UKdaF?JC1!}|s>+$UEDPaDKg88by66VBA_F(>aZ~Dz2;9?Uq z@?M2D{m4p9KitPpf9$7UfGVdSc&WUmf7jI$Oo%6P%TMrsOz_y43v#ABS~(iW|D!pS zRRpk20SM*f1Z~dhC@N*b|00R~+3)30}HRN$m4@Kl8?Aw_+qW zL`P6DxE$8eR~sTk2rj@4(MzF@wAv7%1hC0)12RLWR_V1JEIrZ%tu&q16|dL~2qKhJ zKTAW!A__fBVnJA1$+avKE0V>85`GV*5D0CBW!j1&_wf3vzZbGaVs=O=co`)|@Lv&z ziTvc&^&&M-(o6aGPw3h#S=^NFu-|-O=4Ex9#ez%4050lks%io`&FOBaEPFwBoL}$X zJg>XL>4RaWyW#TLtnL<+Mm)1+R8ahHMKz3cmsP*ih6L!bU1kYuThzMUSTiS zsItj`EItb<&BhkAQD7bm!HsKnkI8UueqCy#NrdwNkOj3X0a(llK9PffO9ww`)eMbb z3wXnrp@PB@{!#KFj0j#*9O|~-&O;M*h*F9}-JHB2I41!ixnoxz>xL5qXFip)Xs<)v zB0JK5L0%qxL@RWfsJ_P1BJg}<;iAZV5inA(G2z83NzYAGVgBP{{#B#RKLy9lKO){I zRV|VZ>6Is3H^GEor?a?=BB{$ZoDe8Q$7h4|6^nnzqA5!P`!b2HTqdV_N#%%H`8X3F z@vXcQeR;&BiY16_^YDY5ObGaWTt1VbIf18)bG8~Y#V}=HPPvB*BjtQ?euJ z_E2C{KRMxg4E_tw`e2I|Y zWdv7o`V?cM-aCW47#fiyNC`m%_ddl4H+WV<2Bar}p7&Kjru0B(BL^mVnP}m)00zO;iCCRPNNB9_!XX^BPd8jiySHO zQU?(DuY33!3bawCugRm0#=k~r^J*X3$nQ`?WP&+}`t@AU8^tfM5ANmyRyi(U{s)6$&QO@^fD38uQqO zyRR1|Fy-+zfW!{_XajMSP%^3?@4zJdLG(;~LeJ1SB#Ffz%KeqzJ?TR14f z{H^)f000|VYDNPP>yD*SP=H#}uZF6`AAUiH2rxw>kO!C>_NHCv`q=98Q4VlC#;|Xye;G}J?zls`Z{3#D?Zg^{udz+ zy_35K5#v`Tthe97AiIk-iH*@_ExFC-Q7?}+Lq6yrHs-s^EVxZ*`@5%EeBCUdZ=OiC zWn#{B%KxV@nrG*Meg(+S&Vzim069FsD{548mqz-HD>SWzVMANTR` zIEC#Yj^lTES-bv7WWTsl%U_iMgBmEqVii%2((rr{Z}O6nvaM3A*w)FoAIVa?_e*`Y zql{d|Y;oCaQbrbn?#8h!%K~E*uzW~H<+5lLQ&xqr_eg7rlnduUIMj&IPE+>TiBk|7 zHwniyVAzgg-PTw`Akjvx)TnWzl`;b!slc+Zi&7_ag*wKeRPE^D&bCm7V&Exv7L*Vw z>ST;NAJ-rzb znd-6n71AN;M9*kSsEK;)@#QBQcp(ObFP8{|=vie8u!gDO?Ls`tw1{6UVJZV$rEl;wJ#TTEZWB!a-6Iu)))`3S<{<6Y}xnlE})j1nw!<Fo)ps`+m?V#JPSB=5Mr9GGt?*N=vla1sW6|9jN3jJClHips z_;6yGgQVA!GKYB?RIiAEUKmdi^@pkrRkFRSeuRw?+Juj;-FN4F86f2Z|PU{Oi9ToC04JVXsz ztIp^6wO9=C6X6sd0(mB?#UV2W04$Z_Kn42Zd+~S={o&vQMLbbr4Fha)>OnzpTn%)& zNQ80%TZ+$3F+14O1RR3kqQ_Q6xZ%6yt%P1@0-FdHBvcI6s7(RTvWJ49Ay%2t*pL+G zVLM$ZEyx$>LCvEfDy-oLu?~VaXIvS)Bj7#Y@dF;#dvhS&*8~t>d-;F=H$Pi8ct6j@ zRqQkzbHf_VI%tz81YI24n!Ze7@51Mz)7_KwNy)gL)8&$#HS_mF&udvBsUVht00nR7 ziYtpxjY#+A{2@D{gFVIYeHL%dzW8VV z;U|CXm;dd5k_(z(QCybbjSd1_6HvQ<-vfRAwdPmac+!@LXU|p_@a&#QxQbsZNUPx2 z=SzMKSJd1Pxu-cV`8ABS;Mb@qo?p)u{JQ4(wdyMPHLrmuiuv;VTAc1X#;?D11;4%o z+{Ldia$Og^9Ko;WeRO(FN+LB~3bWK0AjqlSS?JtZJ{CX`1c-`U#(uOSXMB-{GBK(Yksl+GKkx71do)2V2 zPtXsj%Xw*}=U-nzn4kd$@5(SwPI^u`qEoOi49YsKHqTOHj!HAJgEm8-&v_971dfm` z*@Gdg2UCRPk^>pjlT2dg?S+!!2udfw@X~5GNiV4SCBq_AfR@CE%pms2ZKISIRvEnX zlMteIS!rRI2YB$*v`o~G>Wy)NG341r;}I;ZmMv7M%}uoqe1E_#KF$x9N#0zd{WOJ$ zQO6k3U0k3$o=w7mhiEP?b}nm)OKlKZ>J790UIR33YgTD9%wRg)AUP(fgO^4!HstiR z)o_Eyoucdp+4<_0Yv)Z7UWb~eXOb`WY>}QdN)}dgBgW=Nbm|yYHz%{jN3ta*3rFB} z!(~AeA%=H^bZuja;-^E?sOe~Gu#={FTAYbxmB~!U*69W<^o*_?Yd5Pa--e~= zrI8(D7w0cn&a3k|%vJPCbyIXq+oEuoysRt!lPN868VL#gNuS`jq7@4@HYlWu+n7`A znDFz3Pk`hJb(A1CFj7xWTEBa@mxQmJiB~+G5_nD+Z{=h%|2Nc03Vzw#Ffi}HsOAt3*%)1%&LL{)!G%oIjVOHSslu@m_7)+iwO=OON=es-kKYty5;E*BS@DHVdF zu6b{xm7G!-Lrtr+1PZMSUa?HXZUrIMEW|Q~GGk^3ELuEP|1p**FyX9biB~G#50|b< zJP96PYH89eQFCZ|OLaYr*rx33S|#RshA13mo2=%_8o`M2zaFA|)MS{wLZvzYX@;xh zGKLEWqe>V+$a+@G-;rEqMOHgP`MHde@;OyF5idE z@79M;Q5cJ??~ObB8|!%ktBCKmEa>*J?!W%I;xE98dhmdPrEHU{RRJeKX?ARfPyYv- zlri{(VG7m|TbN$+X_d`MFqv%u7T}|c8XQ3QmMW-u ziD>7ba%Wb|jB2RmGn$RJd?9!qA5QUU)UJ&jNKXmbLGut=;>VjZUXU0@XA{a9sROWl zrVoAtii~jxX~rimw5j$DEA(ynsb~4M{2P{oL!iu|OPC;=qOYq@4UP}iRo{Kk=tK;3 z*@y;RaQOlN^ZYETp*TKe_TvObDWUnp1V<8`1?G7Kr?=wbSlL`pYv+G0_u41w5?L(q z)nrZy)s|`3J?HE0W=0o*X9Rhtd$KzGmGuH5xB~b;)x&9N=nyG5EvdDnFroAaMoXRa znD7f*g(xvMG0lN*B{)vssJavb3A+TPp2XxP}K0$a&A^mh!fEOx14~{6gpOXBv313i!=Q9?3EZgE_2-|~C zS->jnFK9ivBBKHlQTmcJB1puV7AK|UlL^F7Y(dCp zXl%~=itQur#1n(R^n5nVS`cX&>59*Y%pDd^3wP8FuA>nvQAF}s(D+t(b0SVj?6DXw zhJ;1Bifdb-_c)wV;?$wF+CxF!M;`M6M#^$f*cw}(E#ZL=oRo6H$;iz4j$#N99`aCH zx?Tf_uK5VX{Y2pgANT~EYT$uU=*z?1x8ZAFV%m-zv3xoTuZ@R_qMM6}E^4KP0i;$F zJ3u4>v((Yi3d!W?Xf$yt=yulhL+n0*`i|4{MS9lu&z5;IY0BXMiMaGQ4YTY#2_HoR z?`iM~2gZa*EW)1goQ=$bAYDI89p`(C-_pr3gkS=5^d*r2{)iLmaIl z^WFr}0*<~_6E8*m5>zbR`l7Dr3W9|n z;VM7E5!>MdM#G61hbiw2+?02&mnx_kTwkbWHMu~O{4F~l^jJ?-PxL`J^55ntWzXB` z%`MS)Dx3JK2t6Y*@7ubf#ABosSR*7REggCJ0>~<};#oO;ImuCU4_H+H$J%nc;Lk4)iFR1nhmu7t)-{*e{fQ4tD(s)Xb!MYszQ{sO3lEQ+5Qwy}^gt4U#b z!%zw(q93JR*F;I=T2FoJhkWb%*%)jb@UMd}n&ZDsd;!M=wi!&pzTwlzRXC$LEO5s5 zZGbbzef}13Mt<*poVl;fw&5_fqtqq4ka%Vw8uAFk(tSF98!Ncjh#@VZqFsl|sx<@p zI;L363JY|er%^|j@Dcx?4m1ND3f3=e*Yw3W{Uw1{j2@=n#mS+~C4|}_;yGpno0D2k z5|WD^Lh5BCqjZ!O{A?KpXjvVM5VfMLrw|!tUQ$l-0rOHLF-lZb#zAy?`JepiAAa*! z|0{Cbh~$2rpqgm(h0!zd_Z z$`qX6xVqfBvNTM0GqY5rzOk{{DJs({aW0*;HSg%n4G+>Lig-t ztR?E(kEy98E`L5!O<9{!My&19c^jFV@e&5Nd@UDfuF#6iw^w0A@`(EAiiT&RW| z{dM3ZxW*ahe}ot**Uh{i6wU_wZGn#H#Hv^wvxp19$nl}e z^ilK4_#PU#C}GQYw!N%)4cn)jkMt<=K~Vne&tn#gEy8B12=?IozG%Fs#`_2x zmbHCo%w{H$<>0Z+0 zkjh_>m?ff))e=zm3u=cj9vZ@SB%H?(F0{4dF#k4&nO86@&V=`f?2M3J9zAXC!(-2YRP<3bPmK=Vos&(&V_skraM-@GUHMtob1mE6A7y0abuv zNqS1vdpA3Lh>Z0%Xb>2!$>%t|E!HS>FZSAu)47@tH{cyq#x407h30AQ?eyH7o@mPP zW;fFhkjPp01+9MLdJgVhFaC07pbUK+j~4v(rm=tZNIC&fMaRVGk#R+&IetZuY+b-M zSNI5lVrLWm&L-j{px6gP)=;?G`bnfIJI_5iXQW+z$ERV{d|O22(DC_Ye;n!pk#(=? z3$0vFC+u*H^0}I!6B%IRu7B~>)-?qGO*GjBV_*?W=ZBz6XFDu;OZCx?`=D5mb?J<+{PkKq^Ov577 zVRZv|^}2MXlCg#^#Y3)eT`7ic72)eRBVW9ruND{?(q$H~TMzFor<;eOga&5RaW*Y*n#vECWe z^>VHAUiDa$flIE!VRu}o0UBy)j$KN(J8M*u{f;-1bs5JA$FKWxm!UY7JK@VMwVD&$ ze+(2Js~w&!cyO*G?{jd3zPCw?wmHcO_t9}^Zs<8UbVCI$Vs$>(A&0;L(2oxTU7^$9 zqEeM!U+GANX-sw+O+1zME$w6YXTsxXJ6tAR{F*ZHVYcNknal>gO05o@qif{K5!hzy zu=Vbo?_C2OhJO#!4qHn3K~IlIvzyev^YN#78SfP!q2oN{qaE4xpX7z>%ayIA?)u~8 zbD5;3o7C|8e8UYg*Z5~^^z24GdwGdU&GlT3MMthDYn@wl zovwALis#kN4VGW!yIRVxc3gyA!qHax4(@W$U@=E{1Z=TI!-K{=1ZJxq)lPzHpoyY! z)HGpQ((4ibHqMu<*Sv9ud%sYQ+?QArCf4N_6rTwsUy3nA7_;;zv+TfHtEzuB5cD=( z3Zwy(0Oci3^op zWgY7Wd*6H?&hz3T*XfOs{l?b;AOrS!;3CC_*W_+xe=$qPY^GB$`@yh?mBRV4W6P-> zoLwP*Os%o~i?!@JVMpN^=9^S*#c_VPOhOkc^(-tghfh&YA}z?CL|ABlUb|zY*WW78 z>a|*dwOXtG<8(vrX8sKNN3xq)%7&ZHW4VYG&~u`J-=((EZ74ubXrCd2MRxEyQNgg7 zeAYwmwjPl9KDRiYrkisQbi@IC(HB~KoI5_UK1r3-a5~J^X=wKCxQE*M7~ZrhixzaG|esklztu< zJxG14L72?l%7k%7wT=k`AE;vqO?;NL2ch`qdgu6T8ZGT68y^XkyZ5*o1PjRY2Mc5d zS|Us;6@Z&KA9#L+{F5cW@;H^Plyh^?Ir%Pc_p`}|&NwZivyux$P>9G6h%hBi-OyG( z>IeRzS*(ykv4VTsx9iVxGlqRe@##>RhcF=uUY0hE1D*^sqQwN`)kTARP;aFRT!*j3 z^Lyyd+-|VYK?ZtH(u}6y_$EB;rj}Z(+#f>n!ZR~0yQ29fIG)-y$9MjRyLQXLEk1w z+_qKD=_PKRTdU=Hzq1Jk4O7T;nu6*!;RjwKBoNju#=U|gSh%IW?~tlo0k}jU8sBg5 zvGP^!x+B>tD1uBVq6jW*cwxjR`aDS@TcAD-s|XWefya$JC=JJ}d?>E1P6MhO(y|nd zJ%;>;5Xi*MOm2YE-_^#U^PHtB1E4~ITGO}lUOAd0H+C(RV60Cikj6TD4b>o)EaqPt z+faql_%q?7eab<-UpX+>PSCNV6eOYXrvzU6JTJs%4$ju38zQ*pbp_K#&(us?mCj%~ zBszm34?2VC7ALFd6qS1b=c;2{b+!<7ppc06G*ME$P5vzgPr@F%;?#O*m!fdRrdvfo z5*;FPsv(ta*po2{AI~$axFV*E=opV5D{kplbmLV-`f$8c8%1Tc7X|&jUF90Q(i7FOU z@XkP@jjiw=xJJ{P9X18faRX8Ci$=jL94$9yY3oAX;#hBLzk>zxgj3l3A`9FDeOh20 z@nF^P#*D+7z;c>so596J2TG1WbQLgYAg|mA906$ZnO;7NYGTu>HI7gO5hs)eIP`Kg z?^wiZS#3W@7-jxcUmr(+y91Enjy^#rvX@2rWd38%VqQ13pUP^rJykgL6fIlq8RrSo zZ%DT?l;;?j%Hlypzp}P1Mz`3jr!zdji?^`(w5@{V-K6aJ4$?9O&1qwl>m4-6x&fK+ z|FX)~4m(fxJl>ZDq59V}-P=J<*SzB>DK>Dj%lY0>_E_`X9E?#dW3KmRy}7XP+e9L9 zoKm~>+(I|xfWxGJjN%x=JAA<8X71#F+sJvGO8u_Z`xWSicSFJAnDV^677qrOF(%Br z$jq~d02Bi@m)J#p*OfH`$-?=#d2P|FLO7;k^d4l<6{~0XMF4dr{glEY$^rB`UwBtK zjHC3%m}7J*WR_t7`=LZS_o~8SxDu3N{=OLnqwpA~je^EOV~q#)5kjCW`%%4$!J0ZuTxg&kxzBE-^>FvRh=cu&i#A2K_7aGqw zukO%!tu}ig%!Ig7E$~(hlWGt9?HRlK;;;oK5eh&PxV!g3n9Je-jyDZU(bjnC%E>!w4uwc&Vc@9br^8~56}%EP9i;x?4tCEfu?1cLyv=P?qta=@y> zyjNj==lzErZSPwE*R|fl;Chu5oi{J;zZk+5Xa|o>R~7_kT(f)5$HlSxstCe3M-YZZ zVTgNRvJ@c~*e!SkiHLxt@e0}rlSPEXls@&z(jS<}`e@Q~+!bp^1cpVJ_6bfq&XUo> zYk`V(j@_&s7s3vCHW6#DE@!=&qNBaOAW4${av~>&9b(28L6T08qC4j6?{;C3xp1z?ngMcI1%6s%5forj%Yj&e3|#;A4{;UA69-)b?) z#_6!QZMm2PlP0J2{I@KTt}nj%tAFt2fBkO@sMs3Ta?h75d2~OuROFhp6=sf-2s#1H z1#Se4WaWU>H(P0EX&&SV{3bji;FENgch&_&tQbEZz^_DZC+>C7Hh7mE^eaw%-SQzd z+LSr$siJu?^mSJOE*;IPmVWR+%i~=0w7N*>bluIqQPyB>&6s08dTRvlYUr zSSF0zD1zk4g_T$_Ga)I)fvaj28LvS-q~cSyXh_xmee2YTQ0I8->E%cYUsaRG^i|Qj z*;boJHENj@oXzBft!Rm1V~&@jYNOp7RbIjYb~Y&r!5QJdqTX?5t3a&IkRxeUsN z1?c2I4Q%1-#cPUmk?&b7&z6ma0T069dG~}Cpog0I%hJT`ydtU+xn3;h$>z&O(m!W^ zJu<*dPF;1hgN=ikNn&XJJ)Lw_P6ml<&8a5EriGC)hb;C|5MIvUg-u#*h8h^N)I)rx z2(j0SI3D78rWmyfp(+A^O0l>Njk60hD0YFqD?WGudWKJCE0)mr6aLW87wXdUfVT)r zWX7Z?7!e#a7jS6k4;B0fP1Zu-1ZQ8CW7$#AsxIM_ro>Q2W3T3GJO!=`e#y=XUKhNs zLlitV)bii=acd22#T;Pi*VW-{OCYP~;nRz3iMsNdTW-GiMNWq>45fPk02HU`m+AyS zXjPCd+j0YU(i){2chZ^@qlcxGZ6$Iny{>WKtN;OtxMCKQ{B`eG0(p3dAjp}X^iGaT zSq7t3umr~gDQJQx7Oa9HN?0IZ>2o>pY??~dOPfiemBrBT3JFN_r&8L)*2`ICNlt^& zS9KT+e{w8YC__tUZ?>3R1!r*bOyHJY$#rvjxU`seVg4~;KKqUpuGR~2s7QtRc33Xg zqQ#(DATZE5C6G}63eKUmCaejJnSxXLJ-l!DBb)M+I=-7;jIFGE|!kA;3P%paT3^}bfqu7X(1tJXgN(aK%Adh&Y zWz!;s>Q|(|7N3$4W*;y4i{3dkv)4ZP2u5KxE*g~ef16>OIpUbqjtxZ%&sIoU38vOI zjZmt+f0I5>Sw3-FU(oZ-9dkH7oauC^C||3BZ@_H5MjqvBl)*mQGJ{b^cWvTaD42%M zo@XNT>2`ULF$Q4da!6>v_CUTCjvOe?8lccv^cfuj=yNH=aRcTFWwN_}waUloocu{~ zytdBw%fc61x!2)aAWSqKp<|SD+ZS9SX4ONl3)MD zEO?3&AG7GSPCLK3LlZQ>Ql>Pqwk;MwPPKf1(Q$%9p6q2!gU3_ZVE585#LuuhRR_qw z^GyWuTWZ0ya_)rZF0E0&kq~Fk)wu-JHj=|3#@((N_UIGg&t23Uz;hP}m z0pI(yWA>QNmkQSfuG8{0>0l+dpesnSvMU^4yO(n;g&LqjV1V+`1M6MG;~o)L*kW`u zvP;o>9t!&y4IW!-z;Vn-icVqUQN5iAl;+QRld0~(I0ysyU&I-5ft{Vf9P+sVVG_|M zq>MSLKk9IbZO&yx(Incd6<*QF5KEksbwwb(PBLrsl};gE{UCKCcvI4PtfqsQ!Meyt zylG?_y0yBnN`r`t?(d-bXh(~vtNFvtuyqu?5uMRBE=i|W4mIP`!vQPGbhw@cESp5M zMDOU2)}FbeKr5@uhh8n_-gieBf+D7~Zs>~(*9HMV3%*aE%nWnXk|5u4zrTrfv)^t4 zJHTsLM`K_ zC+evDW`X(u)A>G%@3{XUzx(gEPcteY=|J9VH7Hu;TDD5^s#fibn2~@%V4^6O3*S2x z_&M@vg2wXkEeghrI=E3-{pK?%0sCXD&Koo^}l}fdj-1C+A40M{+qaWLv0B#$`S(zQw7R|1`(@;#|6rG zxTzGA%eP}Rx&}R*ZxZ=hM}y!=tO`P3fig?)a0K{(SNCSU;+iK(h2D^=r4?H=SQE)Yfrm&UVZvt{_GDO zs~-Tz#B+k;3Exs#@C5XImnW@jKA{hC%Yeo$k3>Y~>!3-voe+#LyQlMao_)J^fTUd~ z@@J=#$8(%18mVI&6ja7mhx~1DD>?-H)bX(BL^$6)V9z3gj20$ALx_qpd^fB&1Sy`gRh~YRbt=PtO3DwN?+Knl}W&h;8+z!%`XUSZZQfNoETvc`RuMWjLRno+SfC7=K2zh78nR zX~$?dhoG3Zc|2k7uw+Z-D{92YYfg(DJjAO$g7iDFEU-CAF4*fPS5FcOeE