diff --git a/README.md b/README.md index 531af823..a2814f34 100644 --- a/README.md +++ b/README.md @@ -82,13 +82,13 @@ For Phoenix: ``` cd protocols/phoenix-contracts/ make build -cp target/wasm32-unknown-unknown/release/*.wasm ../../contracts/adapters/phoenix/phoenix_contracts/ +cp target/wasm32v1-none/release/*.wasm ../../contracts/adapters/phoenix/phoenix_contracts/ # make sure the tests still pass cd /workspace/contracts/adapters/phoenix rustup install 1.79.0 # Phoenix needs to downgrade rustup override set 1.79.0 -rustup target add wasm32-unknown-unknown +rustup target add wasm32v1-none make test ``` @@ -98,7 +98,7 @@ For Aqua: cd protocols/aqua npm install -g @go-task/cli task build -cp target/wasm32-unknown-unknown/release/*.wasm ../../contracts/adapters/aqua/aqua_contracts/ +cp target/wasm32v1-none/release/*.wasm ../../contracts/adapters/aqua/aqua_contracts/ ``` ## 2. Run Tests and Scout Audit @@ -140,7 +140,7 @@ yarn build yarn setup-phoenix testnet # To Setup Phoenix. Now you will have the new deployed addresses in .soroban/testnet.contrats.json ``` -### 4.2 Deploy the Aggregator Aggregator +### 4.2 Deploy the Aggregator To deploy the smart contracts you first would need to build the source with ```bash @@ -148,7 +148,7 @@ cd /workspace/contracts make build ``` The .wasm files will already be optimized and will be available in -`/workspace/contracts/target/wasm32-unknown-unknown/release/` with a name like `[NAME-OF-CONTRACT].optimized.wasm` +`/workspace/contracts/target/wasm32v1-none/release/` with a name like `[NAME-OF-CONTRACT].optimized.wasm` after the WASMs are built you can run this to deploy, networks can be `testnet`, `standalone`, `futurenet`, `mainnet`. The RPCs will be taken from the `configs.json` file. @@ -171,7 +171,7 @@ when deployment is completed you can find the addresses in ./.soroban directory Run javascript tests ``` cd /workspace -yarn test +yarn test testnet ``` diff --git a/configs.json b/configs.json index 0ecc9363..e5287489 100644 --- a/configs.json +++ b/configs.json @@ -1,7 +1,7 @@ { - "protocolVersion": "22", - "previewHash": "22.0.1@sha256:e020c9c3925bd83ddfbde7b69397a0e6aa1e68d4a4a78eb9fac5a37875f8961a", - "quickstartHash": "latest@sha256:b7f5a1b2c8ec06cb30a1b79b377ad2bc762cf8cb69ce1fcf7b91185b2acd8a15", + "protocolVersion": "23", + "previewHash": "23@sha256:2981e593f04a0fa11f704c83d1a6a2fc86ae76ce9f74a4e365ed6da579430c1c", + "quickstartHash": "pr753-latest@sha256:563165b9891cc967cb99981ad3d9de1131d25120bcede931eaf3637ee257e349", "networkConfig": [ { "network": "mainnet", diff --git a/contracts/Cargo.lock b/contracts/Cargo.lock index bd1a3da2..7c42fe68 100644 --- a/contracts/Cargo.lock +++ b/contracts/Cargo.lock @@ -2,13 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "adapter-interface" -version = "2.0.0" -dependencies = [ - "soroban-sdk", -] - [[package]] name = "ahash" version = "0.8.11" @@ -36,14 +29,6 @@ dependencies = [ "libc", ] -[[package]] -name = "aqua-adapter" -version = "0.1.0" -dependencies = [ - "adapter-interface", - "soroban-sdk", -] - [[package]] name = "arbitrary" version = "1.3.2" @@ -183,12 +168,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - [[package]] name = "base64" version = "0.22.1" @@ -240,6 +219,17 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[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.100", +] + [[package]] name = "chrono" version = "0.4.38" @@ -253,14 +243,6 @@ dependencies = [ "windows-targets", ] -[[package]] -name = "comet-adapter" -version = "0.1.0" -dependencies = [ - "adapter-interface", - "soroban-sdk", -] - [[package]] name = "const-oid" version = "0.9.6" @@ -354,9 +336,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.9" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ "darling_core", "darling_macro", @@ -364,9 +346,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.9" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", @@ -378,9 +360,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.20.9" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", @@ -453,6 +435,12 @@ 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 = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + [[package]] name = "ecdsa" version = "0.16.9" @@ -611,6 +599,12 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hex" version = "0.4.3" @@ -755,6 +749,23 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "macro-string" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + [[package]] name = "num-bigint" version = "0.4.4" @@ -826,15 +837,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[package]] -name = "phoenix-adapter" -version = "0.1.0" -dependencies = [ - "adapter-interface", - "soroban-sdk", - "test-utils", -] - [[package]] name = "pkcs8" version = "0.10.2" @@ -924,6 +926,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.100", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -949,6 +971,41 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +[[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" @@ -970,18 +1027,18 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.192" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.192" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", @@ -990,26 +1047,30 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.143" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] [[package]] name = "serde_with" -version = "3.8.3" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e73139bc5ec2d45e6c5fd85be5a46949c1c39a4c18e56915f5eb4c12f975e377" +checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" dependencies = [ - "base64 0.22.1", + "base64", "chrono", "hex", "indexmap 1.9.3", "indexmap 2.2.6", + "schemars 0.8.22", + "schemars 0.9.0", + "schemars 1.0.4", "serde", "serde_derive", "serde_json", @@ -1019,9 +1080,9 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.8.3" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b80d3d6b56b64335c0180e5ffde23b3c5e08c14c585b51a15bd0e95393f46703" +checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" dependencies = [ "darling", "proc-macro2", @@ -1031,9 +1092,9 @@ dependencies = [ [[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", @@ -1068,9 +1129,9 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "soroban-builtin-sdk-macros" -version = "22.1.3" +version = "23.0.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2e42bf80fcdefb3aae6ff3c7101a62cf942e95320ed5b518a1705bc11c6b2f" +checksum = "2ae7f1f1908c9cdb7740eb9bb7a467770ff26fa4c82e49fdb4de88027b5fb93c" dependencies = [ "itertools", "proc-macro2", @@ -1080,9 +1141,9 @@ dependencies = [ [[package]] name = "soroban-env-common" -version = "22.1.3" +version = "23.0.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "027cd856171bfd6ad2c0ffb3b7dfe55ad7080fb3050c36ad20970f80da634472" +checksum = "6c20fd873e412036f93916c946d497216d8a997a5f8c13a342127fe0043cde49" dependencies = [ "arbitrary", "crate-git-revision", @@ -1099,9 +1160,9 @@ dependencies = [ [[package]] name = "soroban-env-guest" -version = "22.1.3" +version = "23.0.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a07dda1ae5220d975979b19ad4fd56bc86ec7ec1b4b25bc1c5d403f934e592e" +checksum = "f18662e41bcfc9914ec365c3743ac040513403f1ca2cc7bad0a7a846f179391c" dependencies = [ "soroban-env-common", "static_assertions", @@ -1109,9 +1170,9 @@ dependencies = [ [[package]] name = "soroban-env-host" -version = "22.1.3" +version = "23.0.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66e8b03a4191d485eab03f066336112b2a50541a7553179553dc838b986b94dd" +checksum = "c1a03f55efb228e2b687276a4171291c814b7ee38d2aed926d7cb5a786bf269a" dependencies = [ "ark-bls12-381", "ark-ec", @@ -1145,9 +1206,9 @@ dependencies = [ [[package]] name = "soroban-env-macros" -version = "22.1.3" +version = "23.0.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00eff744764ade3bc480e4909e3a581a240091f3d262acdce80b41f7069b2bd9" +checksum = "273c716dcf8797dd70517cc79af7b788934a17ced73a156bd6511f51930d4cd7" dependencies = [ "itertools", "proc-macro2", @@ -1160,9 +1221,9 @@ dependencies = [ [[package]] name = "soroban-ledger-snapshot" -version = "22.0.7" +version = "23.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80bbe59497cb50e81861187e6bd2a2c805df253573d44ed56e7d373f79530758" +checksum = "e4f055250bfa4c3f70d56c932ca0763321a44240ffe9549c5f61880e0cdd3e24" dependencies = [ "serde", "serde_json", @@ -1174,12 +1235,13 @@ dependencies = [ [[package]] name = "soroban-sdk" -version = "22.0.7" +version = "23.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c85edd55eb09aa5dd7ba5ab595d2be7ac3f453e90e2f26d704ff26c130f2926f" +checksum = "fefe46e9767014f74021e9d5461df6d87f2d55bde2d2fa85fae74bf774fcc995" dependencies = [ "arbitrary", "bytes-lit", + "crate-git-revision", "ctor", "derive_arbitrary", "ed25519-dalek", @@ -1196,16 +1258,16 @@ dependencies = [ [[package]] name = "soroban-sdk-macros" -version = "22.0.7" +version = "23.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a141230aa65006d4b3eeee9d0589172d734a2abfbe15b84670e38e76e200b370" +checksum = "e9f581c62211a70a02bfdc6a734fc91da49337831bd338bafb13678d6106ab98" dependencies = [ - "crate-git-revision", "darling", + "heck", "itertools", + "macro-string", "proc-macro2", "quote", - "rustc_version", "sha2", "soroban-env-common", "soroban-spec", @@ -1216,11 +1278,11 @@ dependencies = [ [[package]] name = "soroban-spec" -version = "22.0.7" +version = "23.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b54326e9516b33be99c701b37242b27efb8e66cc1f1eff994b9d9a013a4be136" +checksum = "cc25b2f35ce9e25af41003987cff4c4d679ec1c62f7664c5bd9f8d44e82aa3ae" dependencies = [ - "base64 0.13.1", + "base64", "stellar-xdr", "thiserror", "wasmparser", @@ -1228,9 +1290,9 @@ dependencies = [ [[package]] name = "soroban-spec-rust" -version = "22.0.7" +version = "23.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f009cab4dfd653bc94a06c5022f1ca9d30e198b0e451f84cf307231563d11de2" +checksum = "30e253d697163fbbd8d2c88f702e7f5ccba191ccdc9d85d570e2f065060331bc" dependencies = [ "prettyplease", "proc-macro2", @@ -1255,19 +1317,10 @@ dependencies = [ "wasmparser-nostd", ] -[[package]] -name = "soroswap-adapter" -version = "0.1.0" -dependencies = [ - "adapter-interface", - "soroban-sdk", -] - [[package]] name = "soroswap-aggregator" version = "2.0.0" dependencies = [ - "adapter-interface", "soroban-sdk", "test-utils", ] @@ -1276,7 +1329,6 @@ dependencies = [ name = "soroswap-aggregator-deployer" version = "2.0.0" dependencies = [ - "adapter-interface", "soroban-sdk", ] @@ -1304,28 +1356,30 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "stellar-strkey" -version = "0.0.9" +version = "0.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e3aa3ed00e70082cb43febc1c2afa5056b9bb3e348bbb43d0cd0aa88a611144" +checksum = "ee1832fb50c651ad10f734aaf5d31ca5acdfb197a6ecda64d93fcdb8885af913" dependencies = [ "crate-git-revision", "data-encoding", - "thiserror", ] [[package]] name = "stellar-xdr" -version = "22.1.0" +version = "23.0.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ce69db907e64d1e70a3dce8d4824655d154749426a6132b25395c49136013e4" +checksum = "632bf15309c2992c059fb499275a706f6afdfd68c690508d5d9bfa96c771477f" dependencies = [ "arbitrary", - "base64 0.13.1", + "base64", + "cfg_eval", "crate-git-revision", "escape-bytes", + "ethnum", "hex", "serde", "serde_with", + "sha2", "stellar-strkey", ] diff --git a/contracts/Cargo.toml b/contracts/Cargo.toml index f58bf6f8..94ea55e9 100644 --- a/contracts/Cargo.toml +++ b/contracts/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["adapters/*", "aggregator", "deployer", "test-utils"] +members = ["aggregator", "deployer", "test-utils"] resolver = "2" [workspace.package] @@ -10,8 +10,7 @@ repository = "https://github.com/soroswap/aggregator" homepage = "https://github.com/soroswap/aggregator" [workspace.dependencies] -soroban-sdk = "22.0.7" -adapter-interface={path="./adapters/interface", package="adapter-interface"} +soroban-sdk = "23.0.0-rc.2.4" test-utils = { path = "./test-utils" } [profile.release] diff --git a/contracts/Makefile b/contracts/Makefile index c7ff76e0..8732d9b0 100644 --- a/contracts/Makefile +++ b/contracts/Makefile @@ -1,5 +1,5 @@ $MAKEFILES = $(shell find . -maxdepth 3 -type f -name Makefile) -SUBDIRS = adapters aggregator deployer +SUBDIRS = aggregator deployer default: build all: test diff --git a/contracts/adapters/Makefile b/contracts/adapters/Makefile deleted file mode 100644 index c3d01c6d..00000000 --- a/contracts/adapters/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -SUBDIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d | grep -v ./interface | xargs echo) -default: build - -all: test - -build: - @for dir in $(SUBDIRS) ; do \ - $(MAKE) -C $$dir build || break; \ - done - -test: build - @for dir in $(SUBDIRS) ; do \ - $(MAKE) -C $$dir test || break; \ - done - -fmt: - @for dir in $(SUBDIRS) ; do \ - $(MAKE) -C $$dir fmt || break; \ - done - -clean: - @for dir in $(SUBDIRS) ; do \ - $(MAKE) -C $$dir clean || break; \ - done \ No newline at end of file diff --git a/contracts/adapters/aqua/Cargo.toml b/contracts/adapters/aqua/Cargo.toml deleted file mode 100644 index d1b1b1cf..00000000 --- a/contracts/adapters/aqua/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "aqua-adapter" -version = "0.1.0" -edition = { workspace = true } -description = "Aqua-Adapter is a smart contract on the Soroban platform, tailored for use with the Soroswap-Aggregator. It facilitates efficient transaction routing through the Aqua protocol." -homepage = { workspace = true } -repository = { workspace = true } -authors = ["esteblock"] -readme = "README.md" -keywords = ["no_std", "wasm", "soroswap", "amm", "soroban"] -publish = true - -[lib] -crate-type = ["cdylib"] - -[dependencies] -soroban-sdk = { workspace = true } -adapter-interface = { workspace = true } - -[dev-dependencies] -soroban-sdk = { workspace = true, features = ["testutils"] } diff --git a/contracts/adapters/aqua/Makefile b/contracts/adapters/aqua/Makefile deleted file mode 100644 index 05060bd6..00000000 --- a/contracts/adapters/aqua/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -default: build - -all: test - -test: build - cargo test - -build: - cargo build --target wasm32-unknown-unknown --release - soroban contract optimize --wasm ../../target/wasm32-unknown-unknown/release/aqua_adapter.wasm - @rm ../../target/wasm32-unknown-unknown/release/aqua_adapter.wasm - -fmt: - cargo fmt --all --check - -clean: - cargo clean \ No newline at end of file diff --git a/contracts/adapters/aqua/src/event.rs b/contracts/adapters/aqua/src/event.rs deleted file mode 100644 index 1e522a44..00000000 --- a/contracts/adapters/aqua/src/event.rs +++ /dev/null @@ -1,45 +0,0 @@ -//! Definition of the Events used in the contract -use soroban_sdk::{contracttype, symbol_short, Env, Address, Vec, String}; - -// INITIALIZED -#[contracttype] -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct InitializedEvent { - pub state: bool, - pub protocol_id: String, - pub protocol_address: Address -} - -pub(crate) fn initialized(e: &Env, state: bool, protocol_id: String, protocol_address: Address) { - - let event: InitializedEvent = InitializedEvent { - state: state, - protocol_id, - protocol_address, - }; - e.events().publish(("SoroswapAggregatorAquaAdapter", symbol_short!("init")), event); -} - -// SWAP EVENT -#[contracttype] -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct SwapEvent { - pub amount_in: i128, - pub path: Vec
, - pub to: Address -} - -pub(crate) fn swap( - e: &Env, - amount_in: i128, - path: Vec
, - to: Address -) { - let event = SwapEvent { - amount_in, - path, - to, - }; - - e.events().publish(("SoroswapAggregatorAquaAdapter", symbol_short!("swap")), event); -} \ No newline at end of file diff --git a/contracts/adapters/aqua/src/lib.rs b/contracts/adapters/aqua/src/lib.rs deleted file mode 100644 index b94689dd..00000000 --- a/contracts/adapters/aqua/src/lib.rs +++ /dev/null @@ -1,146 +0,0 @@ -#![no_std] -use soroban_sdk::{contract, contractimpl, Address, Env, Vec, String, BytesN}; -mod event; -mod storage; -mod protocol_interface; -mod test; - -use storage::{ - extend_instance_ttl, - set_initialized, - is_initialized, - set_protocol_id, - get_protocol_id, - set_protocol_address, - get_protocol_address, -}; -use adapter_interface::{ - AdapterTrait, AdapterError -}; -use protocol_interface::{ - protocol_swap_exact_tokens_for_tokens, - protocol_swap_tokens_for_exact_tokens -}; - -fn check_nonnegative_amount(amount: i128) -> Result<(), AdapterError> { - if amount < 0 { - Err(AdapterError::NegativeNotAllowed) - } else { - Ok(()) - } -} - -fn check_initialized(e: &Env) -> Result<(), AdapterError> { - if is_initialized(e) { - Ok(()) - } else { - Err(AdapterError::NotInitialized) - } -} - -#[contract] -struct SoroswapAggregatorAquaAdapter; - -#[contractimpl] -impl AdapterTrait for SoroswapAggregatorAquaAdapter { - - /// Initializes the contract and sets the Aqua multihop address. - /// - /// # Arguments - /// - /// * `e` - The contract environment. - /// * `protocol_id` - The identifier for the protocol. - /// * `protocol_address` - The address associated with the protocol. - /// - /// # Errors - /// - /// Returns an error if the contract is already initialized (`AdapterError::AlreadyInitialized`). - fn initialize( - e: Env, - protocol_id: String, - protocol_address: Address, - ) -> Result<(), AdapterError> { - if check_initialized(&e).is_ok() { - return Err(AdapterError::AlreadyInitialized); - } - - set_protocol_id(&e, protocol_id.clone()); - set_protocol_address(&e, protocol_address.clone()); - - set_initialized(&e); - event::initialized(&e, true, protocol_id, protocol_address); - extend_instance_ttl(&e); - Ok(()) - } - - fn swap_exact_tokens_for_tokens( - e: Env, - amount_in: i128, - amount_out_min: i128, - path: Vec
, - to: Address, - _deadline: u64, - bytes: Option>>, - ) -> Result, AdapterError> { - check_initialized(&e)?; - extend_instance_ttl(&e); - to.require_auth(); - - check_nonnegative_amount(amount_in)?; - check_nonnegative_amount(amount_out_min)?; - - let swap_result = protocol_swap_exact_tokens_for_tokens( - &e, - &amount_in, - &amount_out_min, - &path, - &to, - &bytes, - )?; - - event::swap(&e, amount_in, path, to); - Ok(swap_result) - } - - fn swap_tokens_for_exact_tokens( - e: Env, - amount_out: i128, - amount_in_max: i128, - path: Vec
, - to: Address, - _deadline: u64, - bytes: Option>>, - ) -> Result, AdapterError> { - check_initialized(&e)?; - extend_instance_ttl(&e); - to.require_auth(); - - check_nonnegative_amount(amount_out)?; - check_nonnegative_amount(amount_in_max)?; - - let swap_result = protocol_swap_tokens_for_exact_tokens( - &e, - &amount_out, - &amount_in_max, - &path, - &to, - &bytes, - )?; - - event::swap(&e, amount_in_max, path, to); - Ok(swap_result) - } - - /* *** Read only functions: *** */ - fn get_protocol_id(e: &Env) -> Result { - check_initialized(&e)?; - extend_instance_ttl(&e); - Ok(get_protocol_id(e)?) - } - - fn get_protocol_address(e: &Env) -> Result { - check_initialized(&e)?; - extend_instance_ttl(&e); - Ok(get_protocol_address(e)?) - } -} diff --git a/contracts/adapters/aqua/src/protocol_interface.rs b/contracts/adapters/aqua/src/protocol_interface.rs deleted file mode 100644 index 0d37ca1d..00000000 --- a/contracts/adapters/aqua/src/protocol_interface.rs +++ /dev/null @@ -1,151 +0,0 @@ -use soroban_sdk::{Env, Address, Vec, token::Client as TokenClient, BytesN, vec}; -use crate::storage::{get_protocol_address}; -use adapter_interface::{AdapterError}; - -soroban_sdk::contractimport!( - file = "./aqua_contracts/soroban_liquidity_pool_router_contract.wasm" -); -pub type AquaRouterClient<'a> = Client<'a>; - -/* - This first version of the AquaAdapter, is written just for pools with 2 tokens, so we will build from - path = (TokenA, TokenB, TokenC, TokenD) - bytes = (pool_hash_0, pool_hash_1, pool_hash_2) - where pool_hash_0 = hash of the pool with tokenA and tokenB - where pool_hash_1 = hash of the pool with tokenB and tokenC - where pool_hash_2 = hash of the pool with tokenC and tokenD - where token_out = tokenD - where token_in = tokenA - where in_amount = amount_in - where out_min = amount_out_min - - The interface is based on https://github.com/AquaToken/soroban-amm/ -*/ - - -fn convert_to_swaps_chain( - e: &Env, - path: &Vec
, - bytes: &Option>>, -) -> Result< - Vec<(Vec
, BytesN<32>, Address)>, // (path, pool_hash, token_out) - AdapterError -> { - - // We check that bytes is not None - let pool_hashes_vec = bytes.as_ref().ok_or(AdapterError::MissingPoolHashes)?; - - // path should have at least 2 elements. ifnot error WrongMinimumPathLength - if path.len() < 2 { - return Err(AdapterError::WrongMinimumPathLength); - } - // We check that the length of bytes is equal to the length of path - 1 - if pool_hashes_vec.len() != path.len().checked_sub(1).unwrap() { // unwrap safe as we checked the length of path - return Err(AdapterError::WrongPoolHashesLength); - } - - let mut swaps_chain = Vec::new(e); - for i in 0..(path.len() - 1) { - let token_in = path.get(i).unwrap(); // This should be safe as we checked the length of path - let token_out = path.get(i + 1).unwrap(); // This should be safe as we checked the length of path - let pool_hash = pool_hashes_vec.get(i).unwrap(); // This should be safe as we checked the length of pool_hashes_vec - - let swap_chain_path = if token_in < token_out { - vec![&e, token_in.clone(), token_out.clone()] - } else { - vec![&e, token_out.clone(), token_in.clone()] - }; - - swaps_chain.push_back((swap_chain_path, pool_hash.clone(), token_out.clone())); - } - - Ok(swaps_chain) -} - -pub fn protocol_swap_exact_tokens_for_tokens( - e: &Env, - amount_in: &i128, - amount_out_min: &i128, - path: &Vec
, // (TokenA, TokenB, TokenC, TokenD), being TokenC the token to get - to: &Address, - bytes: &Option>>, // (pool_hash_0, pool_hash_1, pool_hash_2) -) -> Result, AdapterError> { - - let aqua_router_address = get_protocol_address(&e)?; - let aqua_router_client = AquaRouterClient::new(&e, &aqua_router_address); - let swaps_chain = convert_to_swaps_chain(e, path, bytes)?; - - let token_in = path.get(0).expect("Failed to get token in address"); // should be safe as we checked the length of path - let token_out_address = path.get(path.len().checked_sub(1).unwrap()).expect("Failed to get token out address"); // should be safe as we checked the length of path - - // TODO Remove this if we remove the check - let initial_token_out_balance = TokenClient::new(&e, &token_out_address).balance(&to); - - // let final_amount_out = aqua_router_client.swap_chained( - aqua_router_client.swap_chained( - &to, // user: Address - &swaps_chain, // swaps_chain: Vec<(Vec
, BytesN<32>, Address)>, - &token_in, // token_in: Address, - &(*amount_in as u128), // in_amount: i128, - &(*amount_out_min as u128), // out_min: i128 - ); - - - // Check if the amount of token_out received is greater than the minimum amount expected - // TODO: Remove this checks if we want to reduce the number of total instructions - // TODO: Do benchmarking - // We could get the final_amount_out from the aqua_router_client.swap_chained function - let final_token_out_balance = TokenClient::new(&e, &token_out_address).balance(&to); - let final_amount_out = final_token_out_balance.checked_sub(initial_token_out_balance).unwrap(); - if final_amount_out < *amount_out_min { - // panic - panic!("Amount of token out received is less than the minimum amount expected"); - } - - let mut swap_amounts: Vec = Vec::new(e); - swap_amounts.push_back(*amount_in); - swap_amounts.push_back(final_amount_out as i128); - - Ok(swap_amounts) -} - -pub fn protocol_swap_tokens_for_exact_tokens( - e: &Env, - amount_out: &i128, - amount_in_max: &i128, - path: &Vec
, - to: &Address, - bytes: &Option>>, // (pool_hash_0, pool_hash_1, pool_hash_2) -) -> Result, AdapterError> { - - let aqua_router_address = get_protocol_address(&e)?; - let aqua_router_client = AquaRouterClient::new(&e, &aqua_router_address); - let swaps_chain = convert_to_swaps_chain(e, path, bytes)?; - /* - fn swap_chained_strict_receive( - e: Env, - user: Address, - swaps_chain: Vec<(Vec
, BytesN<32>, Address)>, - token_in: Address, - out_amount: u128, // fixed amount of output token to receive - max_in: u128, // maximum input token amount allowed - ) -> u128 // final_amount_in - */ - - - let token_in = path.get(0).expect("Failed to get token in address"); - - let final_amount_in = aqua_router_client.swap_chained_strict_receive( - &to, // user: Address - &swaps_chain, // swaps_chain: Vec<(Vec
, BytesN<32>, Address)>, - &token_in, // token_in: Address, - &(*amount_out as u128), // out_amount: u128, - &(*amount_in_max as u128), // max_in: u128, - ); - - let mut swap_amounts: Vec = Vec::new(e); - swap_amounts.push_back(final_amount_in as i128); - swap_amounts.push_back(*amount_out); - - Ok(swap_amounts) -} \ No newline at end of file diff --git a/contracts/adapters/aqua/src/storage.rs b/contracts/adapters/aqua/src/storage.rs deleted file mode 100644 index ce448618..00000000 --- a/contracts/adapters/aqua/src/storage.rs +++ /dev/null @@ -1,51 +0,0 @@ -use soroban_sdk::{contracttype, Env, Address, String}; -use adapter_interface::AdapterError; - -#[derive(Clone)] -#[contracttype] - -enum DataKey { - Initialized, - ProtocolId, - ProtocolAddress, -} - -const DAY_IN_LEDGERS: u32 = 17280; -const INSTANCE_BUMP_AMOUNT: u32 = 30 * DAY_IN_LEDGERS; -const INSTANCE_LIFETIME_THRESHOLD: u32 = INSTANCE_BUMP_AMOUNT - DAY_IN_LEDGERS; - -pub fn extend_instance_ttl(e: &Env) { - e.storage() - .instance() - .extend_ttl(INSTANCE_LIFETIME_THRESHOLD, INSTANCE_BUMP_AMOUNT); -} - -/* INITIALIZED */ -pub fn set_initialized(e: &Env) { - e.storage().instance().set(&DataKey::Initialized, &true); -} - -pub fn is_initialized(e: &Env) -> bool { - e.storage().instance().has(&DataKey::Initialized) -} - - -/* PROTOCOL ID - STRING */ -pub fn set_protocol_id(e: &Env, protocol_id: String) { - e.storage().instance().set(&DataKey::ProtocolId, &protocol_id); -} - -pub fn get_protocol_id(e: &Env) -> Result { - e.storage().instance().get(&DataKey::ProtocolId).ok_or(AdapterError::NotInitialized) -} - - -/* PROTOCOL ADDRESS */ -pub fn set_protocol_address(e: &Env, address: Address) { - e.storage().instance().set(&DataKey::ProtocolAddress, &address); -} - -pub fn get_protocol_address(e: &Env) -> Result { - e.storage().instance().get(&DataKey::ProtocolAddress).ok_or(AdapterError::NotInitialized) -} - diff --git a/contracts/adapters/aqua/src/test.rs b/contracts/adapters/aqua/src/test.rs deleted file mode 100644 index 58a440a4..00000000 --- a/contracts/adapters/aqua/src/test.rs +++ /dev/null @@ -1,100 +0,0 @@ -#![cfg(test)] -extern crate std; -pub mod aqua_setup; - -use soroban_sdk::testutils::Address as _; - -use soroban_sdk::{ - Env, - Address, - BytesN, - Symbol, - String, - Vec, - Val, - IntoVal -}; -use crate::{SoroswapAggregatorAquaAdapter, SoroswapAggregatorAquaAdapterClient}; -use aqua_setup::{AquaTest, TokenClient, AquaRouter}; - -mod deployer_contract { - soroban_sdk::contractimport!(file = "../../target/wasm32-unknown-unknown/release/soroswap_aggregator_deployer.optimized.wasm"); - pub type DeployerClient<'a> = Client<'a>; -} -use deployer_contract::DeployerClient; - -fn create_deployer<'a>(e: &Env) -> DeployerClient<'a> { - let deployer_address = &e.register(deployer_contract::WASM, ()); - let deployer = DeployerClient::new(e, deployer_address); - deployer -} - -// AquaAggregatorAdapter Contract -fn create_soroswap_aggregator_aqua_adapter<'a>(e: &Env) -> SoroswapAggregatorAquaAdapterClient<'a> { - SoroswapAggregatorAquaAdapterClient::new(e, &e.register(SoroswapAggregatorAquaAdapter, {})) -} - -pub mod aqua_adapter_contract { - soroban_sdk::contractimport!(file = "../../target/wasm32-unknown-unknown/release/aqua_adapter.optimized.wasm"); - pub type SoroswapAggregatorAquaAdapterClientFromWasm<'a> = Client<'a>; -} -use aqua_adapter_contract::SoroswapAggregatorAquaAdapterClientFromWasm; - -pub struct AquaAggregatorAdapterTest<'a> { - env: Env, - adapter_client: SoroswapAggregatorAquaAdapterClientFromWasm<'a>, - adapter_client_not_initialized: SoroswapAggregatorAquaAdapterClient<'a>, - router: AquaRouter<'a>, - tokens: [TokenClient<'a>; 4], - user: Address, - admin: Address, - reward_token: TokenClient<'a>, -} - -impl<'a> AquaAggregatorAdapterTest<'a> { - fn setup() -> Self { - let test = AquaTest::aqua_setup(); - - let wasm_hash = test.env.deployer().upload_contract_wasm(aqua_adapter_contract::WASM); - let deployer_client = create_deployer(&test.env); - - let adapter_client_not_initialized = create_soroswap_aggregator_aqua_adapter(&test.env); - // Deploy contract using deployer, and include an init function to call. - let salt = BytesN::from_array(&test.env, &[0; 32]); - let init_fn = Symbol::new(&test.env, &("initialize")); - - let protocol_id = String::from_str(&test.env, "aqua"); - let protocol_address = test.router.address.clone(); - - // Convert the arguments into a Vec - let init_fn_args: Vec = (protocol_id.clone(), protocol_address.clone()).into_val(&test.env); - - test.env.mock_all_auths(); - let (contract_id, _init_result) = deployer_client.deploy( - &deployer_client.address, - &wasm_hash, - &salt, - &init_fn, - &init_fn_args, - ); - - let adapter_client = aqua_adapter_contract::Client::new(&test.env, &contract_id); - - let user = Address::generate(&test.env); - - AquaAggregatorAdapterTest { - env: test.env, - adapter_client, - adapter_client_not_initialized, - router: test.router, - tokens: test.tokens, - user, - admin: test.admin, - reward_token: test.reward_token, - } - } -} - -pub mod initialize; -pub mod swap_exact_tokens_for_tokens; -pub mod swap_tokens_for_exact_tokens; \ No newline at end of file diff --git a/contracts/adapters/aqua/src/test/aqua_setup.rs b/contracts/adapters/aqua/src/test/aqua_setup.rs deleted file mode 100644 index 889fe6c2..00000000 --- a/contracts/adapters/aqua/src/test/aqua_setup.rs +++ /dev/null @@ -1,250 +0,0 @@ -#![cfg(test)] -extern crate std; - -use soroban_sdk::testutils::Address as _; -use soroban_sdk::{Address, BytesN, Env, Symbol, Vec}; - - -/* ************* AQUA FACTORY AND ROUTER IS THE SAME CONTRACT ************* */ - -#[allow(clippy::too_many_arguments)] -pub mod router { - soroban_sdk::contractimport!( - file = "./aqua_contracts/soroban_liquidity_pool_router_contract.wasm" - ); -} - - -pub use router::Client as AquaRouter; - -pub fn create_liqpool_router_contract<'a>(e: &Env) -> AquaRouter<'a> { - AquaRouter::new(e, &e.register(router::WASM, ())) -} - -/* ************* TOKEN ************* */ - -pub mod test_token { - soroban_sdk::contractimport!( - file = "./aqua_contracts/soroban_token_contract.wasm" - ); -} - -pub fn create_token_contract<'a>(e: &Env, admin: &Address) -> test_token::Client<'a> { - test_token::Client::new( - e, - &e.register_stellar_asset_contract_v2(admin.clone()) - .address(), - ) -} - - -pub use test_token::Client as TokenClient; - - -pub fn install_token_wasm(env: &Env) -> BytesN<32> { - soroban_sdk::contractimport!( - file = "./aqua_contracts/soroban_token_contract.wasm" - ); - env.deployer().upload_contract_wasm(WASM) -} - -// pub fn deploy_token_contract<'a>(env: & Env, admin: & Address) -> token_contract::Client<'a> { -// test_token::Client::new(env, &env.register_stellar_asset_contract(admin.clone())) -// } - - -/* ************* POOL CONTRACTS ************* */ - -pub mod standard_pool { - soroban_sdk::contractimport!( - file = "./aqua_contracts/soroban_liquidity_pool_contract.wasm" - ); -} - -pub fn install_liq_pool_hash(e: &Env) -> BytesN<32> { - e.deployer().upload_contract_wasm(standard_pool::WASM) -} - -pub mod stableswap_pool { - soroban_sdk::contractimport!( - file = "./aqua_contracts/soroban_liquidity_pool_stableswap_contract.wasm" - ); -} - -pub fn install_stableswap_liq_pool_hash(e: &Env) -> BytesN<32> { - e.deployer().upload_contract_wasm(stableswap_pool::WASM) -} - -mod pool_plane { - soroban_sdk::contractimport!( - file = - "./aqua_contracts/soroban_liquidity_pool_plane_contract.wasm" - ); -} - -pub fn create_plane_contract<'a>(e: &Env) -> pool_plane::Client<'a> { - pool_plane::Client::new(e, &e.register(pool_plane::WASM, ())) -} - -mod liquidity_calculator { - soroban_sdk::contractimport!( - file = - "./aqua_contracts/soroban_liquidity_pool_liquidity_calculator_contract.wasm" - ); -} - -pub fn create_liquidity_calculator_contract<'a>(e: &Env) -> liquidity_calculator::Client<'a> { - liquidity_calculator::Client::new(e, &e.register(liquidity_calculator::WASM, ())) -} - -mod reward_boost_feed { - soroban_sdk::contractimport!( - file = "./aqua_contracts/soroban_locker_feed_contract.wasm" - ); -} - -pub(crate) fn create_reward_boost_feed_contract<'a>( - e: &Env, - admin: &Address, - operations_admin: &Address, - emergency_admin: &Address, -) -> reward_boost_feed::Client<'a> { - reward_boost_feed::Client::new( - e, - &e.register( - reward_boost_feed::WASM, - reward_boost_feed::Args::__constructor(admin, operations_admin, emergency_admin), - ), - ) -} - -pub struct AquaTest<'a> { - pub env: Env, - - pub admin: Address, - - pub tokens: [test_token::Client<'a>; 4], - pub reward_token: test_token::Client<'a>, - // pub reward_boost_token: test_token::Client<'a>, - // pub reward_boost_feed: reward_boost_feed::Client<'a>, - - pub router: AquaRouter<'a>, - - // pub emergency_admin: Address, - // pub rewards_admin: Address, - // pub operations_admin: Address, - // pub pause_admin: Address, - // pub emergency_pause_admin: Address, -} - -impl<'a> AquaTest<'a> { - pub fn aqua_setup() -> Self { - let env = Env::default(); - env.mock_all_auths(); - env.cost_estimate().budget().reset_unlimited(); - - let admin = Address::generate(&env); - - // let user = Address::generate(&env); - // let initial_admin_balance = 10_000_000i128; - - let mut tokens = std::vec![ - create_token_contract(&env, &admin).address, - create_token_contract(&env, &admin).address, - create_token_contract(&env, &admin).address, - create_token_contract(&env, &admin).address, - ]; - tokens.sort(); - let tokens = [ - test_token::Client::new(&env, &tokens[0]), - test_token::Client::new(&env, &tokens[1]), - test_token::Client::new(&env, &tokens[2]), - test_token::Client::new(&env, &tokens[3]), - ]; - - let reward_admin = Address::generate(&env); - let admin = Address::generate(&env); - let payment_for_creation_address = Address::generate(&env); - - let reward_token = create_token_contract(&env, &reward_admin); - let reward_boost_token = create_token_contract(&env, &reward_admin); - - let pool_hash = install_liq_pool_hash(&env); - let token_hash = install_token_wasm(&env); - let router = create_liqpool_router_contract(&env); - - router.init_admin(&admin); - - let rewards_admin = soroban_sdk::Address::generate(&env); - let operations_admin = soroban_sdk::Address::generate(&env); - let pause_admin = soroban_sdk::Address::generate(&env); - let emergency_pause_admin = soroban_sdk::Address::generate(&env); - let reward_boost_feed = create_reward_boost_feed_contract( - &env, - &admin, - &operations_admin, - &emergency_pause_admin, - ); - router.set_privileged_addrs( - &admin, - &rewards_admin, - &operations_admin, - &pause_admin, - &Vec::from_array(&env, [emergency_pause_admin.clone()]), - ); - - router.set_pool_hash(&admin, &pool_hash); - router.set_stableswap_pool_hash(&admin, &install_stableswap_liq_pool_hash(&env)); - router.set_token_hash(&admin, &token_hash); - router.set_reward_token(&admin, &reward_token.address); - router.configure_init_pool_payment( - &admin, - &reward_token.address, - &1_0000000, - &1_0000000, - &payment_for_creation_address, - ); - router.set_reward_boost_config( - &admin, - &reward_boost_token.address, - &reward_boost_feed.address, - ); - - let emergency_admin = Address::generate(&env); - router.commit_transfer_ownership( - &admin, - &Symbol::new(&env, "EmergencyAdmin"), - &emergency_admin, - ); - router.apply_transfer_ownership(&admin, &Symbol::new(&env, "EmergencyAdmin")); - - let plane = create_plane_contract(&env); - router.set_pools_plane(&admin, &plane.address); - - let liquidity_calculator = create_liquidity_calculator_contract(&env); - liquidity_calculator.init_admin(&admin); - liquidity_calculator.set_pools_plane(&admin, &plane.address); - router.set_liquidity_calculator(&admin, &liquidity_calculator.address); - - - // assert_eq!(token_0.balance(&user), 1000i128); - // assert_eq!(token_1.balance(&user), 0i128); - // assert_eq!(token_2.balance(&user), 0i128); - // assert_eq!(token_3.balance(&user), 0i128); - - AquaTest { - env, - admin, - tokens, - reward_token, - router, - // emergency_admin, - // rewards_admin, - // operations_admin, - // pause_admin, - // emergency_pause_admin, - // reward_boost_token, - // reward_boost_feed, - } - } -} \ No newline at end of file diff --git a/contracts/adapters/aqua/src/test/initialize.rs b/contracts/adapters/aqua/src/test/initialize.rs deleted file mode 100644 index 2562db2b..00000000 --- a/contracts/adapters/aqua/src/test/initialize.rs +++ /dev/null @@ -1,75 +0,0 @@ -use soroban_sdk::String; -use crate::test::AquaAggregatorAdapterTest; -use adapter_interface::AdapterError; -use super::aqua_adapter_contract::AdapterError as AdapterErrorDeployer; - -#[test] -fn test_initialize_and_get_values() { - let test = AquaAggregatorAdapterTest::setup(); - - test.adapter_client_not_initialized.initialize( - &String::from_str(&test.env, "aqua"), - &test.router.address); - - let protocol_id = test.adapter_client_not_initialized.get_protocol_id(); - assert_eq!(protocol_id, String::from_str(&test.env, "aqua")); - - let protocol_address = test.adapter_client_not_initialized.get_protocol_address(); - assert_eq!(protocol_address, test.router.address); -} - -#[test] -fn test_get_values() { - let test = AquaAggregatorAdapterTest::setup(); - - let protocol_id = test.adapter_client.get_protocol_id(); - assert_eq!(protocol_id, String::from_str(&test.env, "aqua")); - - let protocol_address = test.adapter_client.get_protocol_address(); - assert_eq!(protocol_address, test.router.address); -} - -// test initialize twice -#[test] -fn test_initialize_twice() { - let test = AquaAggregatorAdapterTest::setup(); - - test.adapter_client_not_initialized.initialize( - &String::from_str(&test.env, "aqua"), - &test.router.address); - - let result = test.adapter_client_not_initialized.try_initialize( - &String::from_str(&test.env, "aqua"), - &test.router.address); - - assert_eq!(result,Err(Ok(AdapterError::AlreadyInitialized))); -} - -#[test] -fn test_initialize_twice_deployer() { - let test = AquaAggregatorAdapterTest::setup(); - - let result = test.adapter_client.try_initialize( - &String::from_str(&test.env, "aqua"), - &test.router.address); - - assert_eq!(result,Err(Ok(AdapterErrorDeployer::AlreadyInitialized))); -} - -// test get protocol id not initialized -#[test] -fn test_get_protocol_id_not_initialized() { - let test = AquaAggregatorAdapterTest::setup(); - - let result = test.adapter_client_not_initialized.try_get_protocol_id(); - assert_eq!(result,Err(Ok(AdapterError::NotInitialized))); -} - -// test get protocol address not initialized -#[test] -fn test_get_protocol_address_not_initialized() { - let test = AquaAggregatorAdapterTest::setup(); - - let result = test.adapter_client_not_initialized.try_get_protocol_address(); - assert_eq!(result,Err(Ok(AdapterError::NotInitialized))); -} diff --git a/contracts/adapters/aqua/src/test/swap_exact_tokens_for_tokens.rs b/contracts/adapters/aqua/src/test/swap_exact_tokens_for_tokens.rs deleted file mode 100644 index fec4b23d..00000000 --- a/contracts/adapters/aqua/src/test/swap_exact_tokens_for_tokens.rs +++ /dev/null @@ -1,487 +0,0 @@ -use soroban_sdk::testutils::{ - Address as _, -}; -use soroban_sdk::{ - Address, - vec, Vec, BytesN, Symbol, token::TokenClient, U256, FromVal}; -use crate::test::{AquaAggregatorAdapterTest, }; -use adapter_interface::AdapterError; -use super::aqua_adapter_contract::AdapterError as AdapterErrorDeployer; -use crate::test::aqua_setup::create_token_contract; - -#[test] -fn swap_exact_tokens_for_tokens_not_initialized() { - let test = AquaAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - let path: Vec
= Vec::new(&test.env); - - let result = test.adapter_client_not_initialized.try_swap_exact_tokens_for_tokens( - &0, // amount_in - &0, // amount_out_min - &path, // path - &test.user, // to - &0, // deadline, - &None, - ); - - assert_eq!(result,Err(Ok(AdapterError::NotInitialized))); - -} - -#[test] -fn swap_exact_tokens_for_tokens_amount_in_negative() { - let test = AquaAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let path: Vec
= Vec::new(&test.env); - - let result = test.adapter_client.try_swap_exact_tokens_for_tokens( - &-1, // amount_in - &0, // amount_out_min - &path, // path - &test.user, // to - &0, // deadline - &None, - ); - - assert_eq!( - result, - Err(Ok(AdapterErrorDeployer::NegativeNotAllowed)) - ); -} - -#[test] -fn swap_exact_tokens_for_tokens_amount_out_min_negative() { - let test = AquaAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let path: Vec
= Vec::new(&test.env); - - let result = test.adapter_client.try_swap_exact_tokens_for_tokens( - &0, // amount_in - &-1, // amount_out_min - &path, // path - &test.user, // to - &0, // deadline - &None, - ); - - assert_eq!( - result, - Err(Ok(AdapterErrorDeployer::NegativeNotAllowed)) - ); -} - -#[test] -fn swap_exact_tokens_for_tokens_missing_hash() { - let test = AquaAggregatorAdapterTest::setup(); - - let path: Vec
= Vec::new(&test.env); - - let result = test.adapter_client.try_swap_exact_tokens_for_tokens( - &0, // amount_in - &0, // amount_out_min - &path, // path - &test.user, // to - &0, // deadline - &None, - ); - - assert_eq!( - result, - Err(Ok(AdapterErrorDeployer::MissingPoolHashes)) - ); -} - - -#[test] -fn try_swap_exact_tokens_for_tokens_invalid_path_lenght() { - let test = AquaAggregatorAdapterTest::setup(); - - let path: Vec
= vec![&test.env, test.tokens[0].address.clone()]; - // vec with dummy bytes - let bytes_vec: Vec> = vec![&test.env, BytesN::from_array(&test.env, &[0; 32])]; - - let result = test.adapter_client.try_swap_exact_tokens_for_tokens( - &0, // amount_in - &0, // amount_out_min - &path, // path - &test.user, // to - &0, // deadline - &Some(bytes_vec), - - ); - - //WrongMinimumPathLength - assert_eq!( - result, - Err(Ok(AdapterErrorDeployer::WrongMinimumPathLength)) - ); -} - -#[test] -fn try_swap_exact_tokens_for_tokens_invalid_bytes_lenght() { - let test = AquaAggregatorAdapterTest::setup(); - - let path: Vec
= vec![&test.env, - test.tokens[0].address.clone(), - test.tokens[1].address.clone(), - test.tokens[2].address.clone()]; - // vec with dummy bytes - let bytes_vec: Vec> = vec![&test.env, BytesN::from_array(&test.env, &[0; 32])]; - - let result = test.adapter_client.try_swap_exact_tokens_for_tokens( - &0, // amount_in - &0, // amount_out_min - &path, // path - &test.user, // to - &0, // deadline - &Some(bytes_vec), - - ); - - //WrongMinimumPathLength - assert_eq!( - result, - Err(Ok(AdapterErrorDeployer::WrongPoolHashesLength)) - ); -} - -#[test] -// panic with error PoolNotFound = 404, -#[should_panic(expected = "Error(Contract, #404)")] -fn try_swap_exact_tokens_for_tokens_pool_not_found() { - let test = AquaAggregatorAdapterTest::setup(); - - - let path: Vec
= vec![&test.env, - test.tokens[0].address.clone(), - test.tokens[1].address.clone()]; - - // vec with dummy bytes - let bytes_vec: Vec> = vec![&test.env, BytesN::from_array(&test.env, &[0; 32])]; - - test.env.cost_estimate().budget().reset_unlimited(); - test.adapter_client.swap_exact_tokens_for_tokens( - &0, // amount_in - &0, // amount_out_min - &path, // path - &test.user, // to - &0, // deadline, - &Some(bytes_vec), - ); -} - - - - -#[test] -fn swap_exact_tokens_for_tokens_constant_product_pool_1_hop() { - let test = AquaAggregatorAdapterTest::setup(); - - let router = test.router; - let [token1, token2, _, _] = test.tokens; - - let tokens = Vec::from_array(&test.env, [token1.address.clone(), token2.address.clone()]); - let user1 = Address::generate(&test.env); - test.reward_token.mint(&user1, &10_0000000); - - let (pool_hash, pool_address) = router.init_standard_pool(&user1, &tokens, &30); - assert_eq!( - router.pool_type(&tokens, &pool_hash), - Symbol::new(&test.env, "constant_product") - ); - let pool_info = router.get_info(&tokens, &pool_hash); - assert_eq!( - Symbol::from_val(&test.env, &pool_info.get(Symbol::new(&test.env, "pool_type")).unwrap()), - Symbol::new(&test.env, "constant_product") - ); - - let token_share = TokenClient::new(&test.env, &router.share_id(&tokens, &pool_hash)); - - token1.mint(&user1, &1000); - assert_eq!(token1.balance(&user1), 1000); - - token2.mint(&user1, &1000); - assert_eq!(token2.balance(&user1), 1000); - - assert_eq!(token_share.balance(&user1), 0); - - let desired_amounts = Vec::from_array(&test.env, [100, 100]); - router.deposit(&user1, &tokens, &pool_hash, &desired_amounts, &0); - assert_eq!(router.get_total_liquidity(&tokens), U256::from_u32(&test.env, 2)); - - assert_eq!(token_share.balance(&user1), 100); - assert_eq!(router.get_total_shares(&tokens, &pool_hash), 100); - assert_eq!(token_share.balance(&pool_address), 0); - assert_eq!(token1.balance(&user1), 900); - assert_eq!(token1.balance(&pool_address), 100); - assert_eq!(token2.balance(&user1), 900); - assert_eq!(token2.balance(&pool_address), 100); - - assert_eq!( - router.get_reserves(&tokens, &pool_hash), - Vec::from_array(&test.env, [100, 100]) - ); - - assert_eq!( - router.estimate_swap(&tokens, &token1.address, &token2.address, &pool_hash, &97), - 48 - ); - - // Here we will swap using the adapter instead of directly using the pool: - // assert_eq!( - // router.swap( - // &user1, - // &tokens, - // &token1.address, - // &token2.address, - // &pool_hash, - // &97_u128, // amount_in - // &48_u128, // amount_out_min - // ), - // 48 - // ); - - let path: Vec
= vec![&test.env, - token1.address.clone(), - token2.address.clone()]; - - // vec pool hash - let bytes_vec: Vec> = vec![&test.env, pool_hash.clone()]; - - let executed_amounts = test.adapter_client.swap_exact_tokens_for_tokens( - &97, // amount_in - &48, // amount_out_min - &path, // path - &user1, // to - &0, // deadline, - &Some(bytes_vec), - ); - - - assert_eq!(token1.balance(&user1), 803); - assert_eq!(token1.balance(&pool_address), 197); - assert_eq!(token2.balance(&user1), 948); - assert_eq!(token2.balance(&pool_address), 52); - assert_eq!( - router.get_reserves(&tokens, &pool_hash), - Vec::from_array(&test.env, [197, 52]) - ); - - - assert_eq!(executed_amounts.get(0).unwrap(), 97); - assert_eq!(executed_amounts.get(1).unwrap(), 48); -} - - - -#[test] -fn swap_exact_tokens_for_tokens_constant_product_pool_2_hops() { - let test = AquaAggregatorAdapterTest::setup(); - - let router = test.router; - let admin = test.admin; - let [token1, token2, token3, _] = test.tokens; - let reward_token = test.reward_token; - - let user1 = Address::generate(&test.env); - reward_token.mint(&user1, &10_0000000); - test.env.mock_auths(&[]); - - let tokens1 = Vec::from_array(&test.env, [token1.address.clone(), token2.address.clone()]); - let tokens2 = Vec::from_array(&test.env, [token2.address.clone(), token3.address.clone()]); - - let swapper = Address::generate(&test.env); - - router.mock_all_auths().configure_init_pool_payment( - &admin, - &create_token_contract(&test.env, &admin).address, - &0, - &0, - &router.address, - ); - - let (pool_index1, _pool_address1) = router - .mock_all_auths() - .init_standard_pool(&swapper, &tokens1, &30); - let (pool_index2, _pool_address2) = router - .mock_all_auths() - .init_standard_pool(&swapper, &tokens2, &30); - token1.mock_all_auths().mint(&admin, &10000); - token2.mock_all_auths().mint(&admin, &20000); - token3.mock_all_auths().mint(&admin, &10000); - router.mock_all_auths().deposit( - &admin, - &tokens1, - &pool_index1, - &Vec::from_array(&test.env, [10000, 10000]), - &0, - ); - router.mock_all_auths().deposit( - &admin, - &tokens2, - &pool_index2, - &Vec::from_array(&test.env, [10000, 10000]), - &0, - ); - - token1.mock_all_auths().mint(&swapper, &1000); - - - - assert_eq!(token1.balance(&swapper), 1000); - assert_eq!(token2.balance(&swapper), 0); - assert_eq!(token3.balance(&swapper), 0); - assert_eq!(token1.balance(&router.address), 0); - assert_eq!(token2.balance(&router.address), 0); - assert_eq!(token3.balance(&router.address), 0); - - // swapping token 1 to 3 through combination of 2 pools as we don't have pool (1, 3) - // Here we will swap using the adapter instead of directly using the pool: - - // let swap_root_args = vec![ - // &test.env, - // swapper.clone().to_val(), - // vec![ - // &test.env, - // (tokens1.clone(), pool_index1.clone(), token2.address.clone()), - // (tokens2.clone(), pool_index2.clone(), token3.address.clone()), - // ] - // .into_val(&test.env), - // token1.address.clone().clone().to_val(), - // 100_u128.into_val(&test.env), - // 96_u128.into_val(&test.env), - // ]; - - - - - - let path: Vec
= vec![&test.env, - token1.address.clone(), - token2.address.clone(), - token3.address.clone()]; - - // vec pool hash - let bytes_vec: Vec> = vec![&test.env, - pool_index1.clone(), - pool_index2.clone()]; - - - let executed_amounts = test.adapter_client.mock_all_auths().swap_exact_tokens_for_tokens( - &100, // amount_in - &96, // amount_out_min - &path, // path - &swapper, // to - &0, // deadline, - &Some(bytes_vec.clone()), - ); - // // Build the same call as above with mock auth - // let swap_root_args = vec![ - // &test.env, - // 100_i128.into_val(&test.env), - // 96_i128.into_val(&test.env), - // path.to_val(), - // swapper.clone().to_val(), - // 0_i128.into_val(&test.env), - // bytes_vec.clone().into_val(&test.env), - - // ]; - - // let swap_chained_args = vec![ - // &test.env, - // swapper.clone().to_val(), - // vec![ - // &test.env, - // (tokens1.clone(), pool_index1.clone(), token2.address.clone()), - // (tokens2.clone(), pool_index2.clone(), token3.address.clone()), - // ] - // .into_val(&test.env), - // token1.address.clone().clone().to_val(), - // 100_u128.into_val(&test.env), - // 96_u128.into_val(&test.env), - // ]; - - - // assert_eq!( - // test.adapter_client - // .mock_auths(&[MockAuth { - // address: &swapper, - // invoke: &MockAuthInvoke { - // contract: &test.adapter_client.address, - // fn_name: "swap_exact_tokens_for_tokens", - // args: swap_root_args.into_val(&test.env), - // sub_invokes: &[MockAuthInvoke { - // contract: &router.address, - // fn_name: "swap_chained", - // args: swap_chained_args.into_val(&test.env), - // sub_invokes: &[MockAuthInvoke { - // contract: &token1.address.clone(), - // fn_name: "transfer", - // args: Vec::from_array( - // &test.env, - // [ - // swapper.to_val(), - // router.address.to_val(), - // 100_i128.into_val(&test.env), - // ] - // ) - // .into_val(&test.env), - // sub_invokes: &[], - // }], - // }], - // }, - // }]) - // .swap_exact_tokens_for_tokens( - // &100, // amount_in - // &96, // amount_out_min - // &path, // path - // &swapper.clone(), // to - // &0, // deadline, - // &Some(bytes_vec), - // ), - // vec![&test.env, 96, 0] - // ); - // assert_eq!( - // e.auths(), - // std::vec![( - // swapper.clone(), - // AuthorizedInvocation { - // function: AuthorizedFunction::Contract(( - // router.address.clone(), - // Symbol::new(&e, "swap_chained"), - // swap_root_args.into_val(&e) - // )), - // sub_invocations: std::vec![AuthorizedInvocation { - // function: AuthorizedFunction::Contract(( - // token1.address.clone(), - // Symbol::new(&e, "transfer"), - // Vec::from_array( - // &e, - // [ - // swapper.to_val(), - // router.address.to_val(), - // 100_i128.into_val(&e), - // ] - // ), - // )), - // sub_invocations: std::vec![], - // },], - // } - // ),] - // ); - - - - assert_eq!(token1.balance(&swapper), 900); - assert_eq!(token2.balance(&swapper), 0); - assert_eq!(token3.balance(&swapper), 96); - assert_eq!(token1.balance(&router.address), 0); - assert_eq!(token2.balance(&router.address), 0); - assert_eq!(token3.balance(&router.address), 0); - - - assert_eq!(executed_amounts.get(0).unwrap(), 100); - assert_eq!(executed_amounts.get(1).unwrap(), 96); -} \ No newline at end of file diff --git a/contracts/adapters/aqua/src/test/swap_tokens_for_exact_tokens.rs b/contracts/adapters/aqua/src/test/swap_tokens_for_exact_tokens.rs deleted file mode 100644 index 7916b5fe..00000000 --- a/contracts/adapters/aqua/src/test/swap_tokens_for_exact_tokens.rs +++ /dev/null @@ -1,334 +0,0 @@ -use soroban_sdk::testutils::{ - Address as _, -}; -use soroban_sdk::{ - Address, - vec, Vec, BytesN, Symbol, token::TokenClient, U256, FromVal}; -use crate::test::{AquaAggregatorAdapterTest, }; -use adapter_interface::AdapterError; -use super::aqua_adapter_contract::AdapterError as AdapterErrorDeployer; -use crate::test::aqua_setup::create_token_contract; - - -#[test] -fn swap_tokens_for_exact_tokens_not_initialized() { - let test = AquaAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - let path: Vec
= Vec::new(&test.env); - - let result = test.adapter_client_not_initialized.try_swap_tokens_for_exact_tokens( - &0, // amount_out - &0, // amount_in_max - &path, // path - &test.user, // to - &0, // deadline - &None, - ); - - assert_eq!(result,Err(Ok(AdapterError::NotInitialized))); - -} - -#[test] -fn swap_tokens_for_exact_tokens_amount_out_negative() { - let test = AquaAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let path: Vec
= Vec::new(&test.env); - - let result = test.adapter_client.try_swap_tokens_for_exact_tokens( - &-1, // amount_out - &0, // amount_in_max - &path, // path - &test.user, // to - &0, // deadline - &None, - ); - - assert_eq!( - result, - Err(Ok(AdapterErrorDeployer::NegativeNotAllowed)) - ); -} - -#[test] -fn swap_tokens_for_exact_tokens_amount_in_max_negative() { - let test = AquaAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let path: Vec
= Vec::new(&test.env); - - let result = test.adapter_client.try_swap_tokens_for_exact_tokens( - &0, // amount_out - &-1, // amount_in_max - &path, // path - &test.user, // to - &0, // deadline - &None, - ); - - assert_eq!( - result, - Err(Ok(AdapterErrorDeployer::NegativeNotAllowed)) - ); -} - - -#[test] -fn swap_tokens_for_exact_tokens_missing_hash() { - let test = AquaAggregatorAdapterTest::setup(); - - let path: Vec
= Vec::new(&test.env); - - let result = test.adapter_client.try_swap_tokens_for_exact_tokens( - &0, // amount_out - &0, // amount_in_max - &path, // path - &test.user, // to - &0, // deadline - &None, // bytes - ); - - assert_eq!( - result, - Err(Ok(AdapterErrorDeployer::MissingPoolHashes)) - ); -} - - -#[test] -fn try_swap_tokens_for_exact_tokens_invalid_path_lenght() { - let test = AquaAggregatorAdapterTest::setup(); - - let path: Vec
= vec![&test.env, test.tokens[0].address.clone()]; - // vec with dummy bytes - let bytes_vec: Vec> = vec![&test.env, BytesN::from_array(&test.env, &[0; 32])]; - - let result = test.adapter_client.try_swap_tokens_for_exact_tokens( - &0, // amount_out - &0, // amount_in_max - &path, // path - &test.user, // to - &0, // deadline - &Some(bytes_vec), - - ); - - //WrongMinimumPathLength - assert_eq!( - result, - Err(Ok(AdapterErrorDeployer::WrongMinimumPathLength)) - ); -} - - -#[test] -// panic with error PoolNotFound = 404, -#[should_panic(expected = "Error(Contract, #404)")] -fn try_swap_tokens_for_exact_tokens_pool_not_found() { - let test = AquaAggregatorAdapterTest::setup(); - - let path: Vec
= vec![&test.env, - test.tokens[0].address.clone(), - test.tokens[1].address.clone()]; - - // vec with dummy bytes - let bytes_vec: Vec> = vec![&test.env, BytesN::from_array(&test.env, &[0; 32])]; - - test.env.cost_estimate().budget().reset_unlimited(); - test.adapter_client.swap_tokens_for_exact_tokens( - &0, // amount_out - &0, // amount_in_max - &path, // path - &test.user, // to - &0, // deadline, - &Some(bytes_vec), - ); -} - - -#[test] -fn swap_tokens_for_exact_tokens_constant_product_pool_1_hop() { - let test = AquaAggregatorAdapterTest::setup(); - - let router = test.router; - let [token1, token2, _, _] = test.tokens; - - let tokens = Vec::from_array(&test.env, [token1.address.clone(), token2.address.clone()]); - let user1 = Address::generate(&test.env); - test.reward_token.mint(&user1, &10_0000000); - - let (pool_hash, pool_address) = router.init_standard_pool(&user1, &tokens, &30); - assert_eq!( - router.pool_type(&tokens, &pool_hash), - Symbol::new(&test.env, "constant_product") - ); - let pool_info = router.get_info(&tokens, &pool_hash); - assert_eq!( - Symbol::from_val(&test.env, &pool_info.get(Symbol::new(&test.env, "pool_type")).unwrap()), - Symbol::new(&test.env, "constant_product") - ); - - let token_share = TokenClient::new(&test.env, &router.share_id(&tokens, &pool_hash)); - - token1.mint(&user1, &1000); - assert_eq!(token1.balance(&user1), 1000); - - token2.mint(&user1, &1000); - assert_eq!(token2.balance(&user1), 1000); - - assert_eq!(token_share.balance(&user1), 0); - - let desired_amounts = Vec::from_array(&test.env, [100, 100]); - router.deposit(&user1, &tokens, &pool_hash, &desired_amounts, &0); - assert_eq!(router.get_total_liquidity(&tokens), U256::from_u32(&test.env, 2)); - - assert_eq!(token_share.balance(&user1), 100); - assert_eq!(router.get_total_shares(&tokens, &pool_hash), 100); - assert_eq!(token_share.balance(&pool_address), 0); - assert_eq!(token1.balance(&user1), 900); - assert_eq!(token1.balance(&pool_address), 100); - assert_eq!(token2.balance(&user1), 900); - assert_eq!(token2.balance(&pool_address), 100); - - assert_eq!( - router.get_reserves(&tokens, &pool_hash), - Vec::from_array(&test.env, [100, 100]) - ); - - assert_eq!( - router.estimate_swap(&tokens, &token1.address, &token2.address, &pool_hash, &97), - 48 - ); - - - let path: Vec
= vec![&test.env, - token1.address.clone(), - token2.address.clone()]; - - // vec pool hash - let bytes_vec: Vec> = vec![&test.env, pool_hash.clone()]; - // in 97, our 48 - - let executed_amounts = test.adapter_client.swap_tokens_for_exact_tokens( - &48, // amount_out - &98, // amount_in_max - &path, // path - &user1, // to - &0, // deadline, - &Some(bytes_vec), - ); - - // error OutMinNotSatisfied = 2006, - - assert_eq!(token1.balance(&user1), 803); - assert_eq!(token1.balance(&pool_address), 197); - assert_eq!(token2.balance(&user1), 948); - assert_eq!(token2.balance(&pool_address), 52); - assert_eq!( - router.get_reserves(&tokens, &pool_hash), - Vec::from_array(&test.env, [197, 52]) - ); - - - assert_eq!(executed_amounts.get(0).unwrap(), 97); - assert_eq!(executed_amounts.get(1).unwrap(), 48); -} - - - -#[test] -fn swap_tokens_for_exact_tokens_constant_product_pool_2_hops() { - let test = AquaAggregatorAdapterTest::setup(); - - let router = test.router; - let admin = test.admin; - let [token1, token2, token3, _] = test.tokens; - let reward_token = test.reward_token; - - let user1 = Address::generate(&test.env); - reward_token.mint(&user1, &10_0000000); - test.env.mock_auths(&[]); - - let tokens1 = Vec::from_array(&test.env, [token1.address.clone(), token2.address.clone()]); - let tokens2 = Vec::from_array(&test.env, [token2.address.clone(), token3.address.clone()]); - - let swapper = Address::generate(&test.env); - - router.mock_all_auths().configure_init_pool_payment( - &admin, - &create_token_contract(&test.env, &admin).address, - &0, - &0, - &router.address, - ); - - let (pool_index1, _pool_address1) = router - .mock_all_auths() - .init_standard_pool(&swapper, &tokens1, &30); - let (pool_index2, _pool_address2) = router - .mock_all_auths() - .init_standard_pool(&swapper, &tokens2, &30); - token1.mock_all_auths().mint(&admin, &10000); - token2.mock_all_auths().mint(&admin, &20000); - token3.mock_all_auths().mint(&admin, &10000); - router.mock_all_auths().deposit( - &admin, - &tokens1, - &pool_index1, - &Vec::from_array(&test.env, [10000, 10000]), - &0, - ); - router.mock_all_auths().deposit( - &admin, - &tokens2, - &pool_index2, - &Vec::from_array(&test.env, [10000, 10000]), - &0, - ); - - token1.mock_all_auths().mint(&swapper, &1000); - - - - assert_eq!(token1.balance(&swapper), 1000); - assert_eq!(token2.balance(&swapper), 0); - assert_eq!(token3.balance(&swapper), 0); - assert_eq!(token1.balance(&router.address), 0); - assert_eq!(token2.balance(&router.address), 0); - assert_eq!(token3.balance(&router.address), 0); - - - let path: Vec
= vec![&test.env, - token1.address.clone(), - token2.address.clone(), - token3.address.clone()]; - - // vec pool hash - let bytes_vec: Vec> = vec![&test.env, - pool_index1.clone(), - pool_index2.clone()]; - - - let executed_amounts = test.adapter_client.mock_all_auths().swap_tokens_for_exact_tokens( - &96, // amount_out - &100, // amount_in_max - &path, // path - &swapper, // to - &0, // deadline, - &Some(bytes_vec.clone()), - ); - - - - assert_eq!(token1.balance(&swapper), 900); - assert_eq!(token2.balance(&swapper), 0); - assert_eq!(token3.balance(&swapper), 96); - assert_eq!(token1.balance(&router.address), 0); - assert_eq!(token2.balance(&router.address), 0); - assert_eq!(token3.balance(&router.address), 0); - - - assert_eq!(executed_amounts.get(0).unwrap(), 100); - assert_eq!(executed_amounts.get(1).unwrap(), 96); -} diff --git a/contracts/adapters/comet/Cargo.toml b/contracts/adapters/comet/Cargo.toml deleted file mode 100644 index 3b4e2453..00000000 --- a/contracts/adapters/comet/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "comet-adapter" -version = "0.1.0" -edition = { workspace = true } -description = "Comet-Adapter is a smart contract on the Soroban platform, tailored for use with the Soroswap-Aggregator. It facilitates efficient transaction routing through the Comet protocol." -homepage = { workspace = true } -repository = { workspace = true } -authors = ["rahimklaber "] -readme = "README.md" -keywords = ["no_std", "wasm", "soroswap", "amm", "soroban"] -publish = true - -[lib] -crate-type = ["cdylib"] - -[dependencies] -soroban-sdk = { workspace = true } -adapter-interface = { workspace = true } - -[dev-dependencies] -soroban-sdk = { workspace = true, features = ["testutils"] } \ No newline at end of file diff --git a/contracts/adapters/comet/Makefile b/contracts/adapters/comet/Makefile deleted file mode 100644 index dc20fa24..00000000 --- a/contracts/adapters/comet/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -default: build - -all: test - -test: build - cargo test - -build: - cargo build --target wasm32-unknown-unknown --release - soroban contract optimize --wasm ../../target/wasm32-unknown-unknown/release/comet_adapter.wasm - @rm ../../target/wasm32-unknown-unknown/release/comet_adapter.wasm - -fmt: - cargo fmt --all --check - -clean: - cargo clean \ No newline at end of file diff --git a/contracts/adapters/comet/src/event.rs b/contracts/adapters/comet/src/event.rs deleted file mode 100644 index bd5f10bc..00000000 --- a/contracts/adapters/comet/src/event.rs +++ /dev/null @@ -1,47 +0,0 @@ -//! Definition of the Events used in the contract -use soroban_sdk::{contracttype, symbol_short, Env, Address, Vec, String}; - -// INITIALIZED -#[contracttype] -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct InitializedEvent { - pub state: bool, - pub protocol_id: String, - pub protocol_address: Address -} - -pub(crate) fn initialized(e: &Env, state: bool, protocol_id: String, protocol_address: Address) { - - let event: InitializedEvent = InitializedEvent { - state: state, - protocol_id, - protocol_address, - }; - e.events().publish(("SoroswapAggregatorAdapter", symbol_short!("init")), event); -} - -// SWAP EVENT -#[contracttype] -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct SwapEvent { - pub amount_in: i128, - pub path: Vec
, - pub to: Address -} - -pub(crate) fn swap( - e: &Env, - amount_in: i128, - path: Vec
, - to: Address -) { - let event = SwapEvent { - amount_in, - path, - to, - }; - - e.events().publish(("SoroswapAggregatorAdapter", symbol_short!("swap")), event); -} - -// TODO IMPROVE EVENTS \ No newline at end of file diff --git a/contracts/adapters/comet/src/lib.rs b/contracts/adapters/comet/src/lib.rs deleted file mode 100644 index fcacb81f..00000000 --- a/contracts/adapters/comet/src/lib.rs +++ /dev/null @@ -1,125 +0,0 @@ -#![no_std] -use soroban_sdk::{contract, contractimpl, Address, BytesN, Env, String, Vec}; - -mod event; -mod storage; -mod protocol_interface; -mod test; - -use storage::{ - extend_instance_ttl, - set_initialized, - is_initialized, - set_protocol_id, - get_protocol_id, - set_protocol_address, - get_protocol_address, -}; -use adapter_interface::{AdapterTrait, AdapterError}; -use protocol_interface::{protocol_swap_exact_tokens_for_tokens, - protocol_swap_tokens_for_exact_tokens}; - -fn check_initialized(e: &Env) -> Result<(), AdapterError> { - if is_initialized(e) { - Ok(()) - } else { - Err(AdapterError::NotInitialized) - } -} - -fn check_deadline(e: &Env, deadline: u64) -> Result<(), AdapterError> { - if e.ledger().timestamp() >= deadline{ - Err(AdapterError::DeadlineExpired) - }else{ - Ok(()) - } -} - -#[contract] -struct CometAggregatorAdapter; - -#[contractimpl] -impl AdapterTrait for CometAggregatorAdapter { - fn initialize( - e: Env, - protocol_id: String, - protocol_address: Address, - ) -> Result<(), AdapterError> { - if check_initialized(&e).is_ok() { - return Err(AdapterError::AlreadyInitialized); - } - - set_protocol_id(&e, protocol_id.clone()); - set_protocol_address(&e, protocol_address.clone()); - - set_initialized(&e); - event::initialized(&e, true, protocol_id, protocol_address); - extend_instance_ttl(&e); - Ok(()) - } - - fn swap_exact_tokens_for_tokens( - e: Env, - amount_in: i128, - amount_out_min: i128, - path: Vec
, - to: Address, - deadline: u64, - _bytes: Option>> - ) -> Result, AdapterError> { - check_initialized(&e)?; - extend_instance_ttl(&e); - check_deadline(&e, deadline)?; - to.require_auth(); - - let swap_result = protocol_swap_exact_tokens_for_tokens( - &e, - &amount_in, - &amount_out_min, - &path, - &to, - )?; - - event::swap(&e, amount_in, path, to); - Ok(swap_result) - } - - fn swap_tokens_for_exact_tokens( - e: Env, - amount_out: i128, - amount_in_max: i128, - path: Vec
, - to: Address, - deadline: u64, - _bytes: Option>> - ) -> Result, AdapterError> { - check_initialized(&e)?; - extend_instance_ttl(&e); - check_deadline(&e, deadline)?; - to.require_auth(); - - let swap_result = protocol_swap_tokens_for_exact_tokens( - &e, - &amount_out, - &amount_in_max, - &path, - &to, - )?; - - event::swap(&e, amount_in_max, path, to); - Ok(swap_result) - } - - /* *** Read only functions: *** */ - fn get_protocol_id(e: &Env) -> Result { - check_initialized(&e)?; - extend_instance_ttl(&e); - Ok(get_protocol_id(e)?) - } - - fn get_protocol_address(e: &Env) -> Result { - check_initialized(&e)?; - extend_instance_ttl(&e); - Ok(get_protocol_address(e)?) - } -} diff --git a/contracts/adapters/comet/src/protocol_interface.rs b/contracts/adapters/comet/src/protocol_interface.rs deleted file mode 100644 index 0272ddce..00000000 --- a/contracts/adapters/comet/src/protocol_interface.rs +++ /dev/null @@ -1,54 +0,0 @@ -use soroban_sdk::{vec, Address, Env, Vec}; -use crate::storage::get_protocol_address; -use adapter_interface::AdapterError; - -soroban_sdk::contractimport!( - file = "./comet_contracts/comet_pool.wasm" -); -pub type CometPoolClient<'a> = Client<'a>; - -pub fn protocol_swap_exact_tokens_for_tokens( - e: &Env, - amount_in: &i128, - amount_out_min: &i128, - path: &Vec
, - to: &Address, -) -> Result, AdapterError> { - - let comet_pool_address = get_protocol_address(&e)?; - let comet_client = CometPoolClient::new(&e, &comet_pool_address); - - let (amount_out, _) = comet_client.swap_exact_amount_in( - &path.get(0).unwrap(), - amount_in, - &path.get(1).unwrap(), - amount_out_min, - &i128::MAX, - to - ); - - Ok(vec![e, *amount_in, amount_out]) -} - -pub fn protocol_swap_tokens_for_exact_tokens( - e: &Env, - amount_out: &i128, - amount_in_max: &i128, - path: &Vec
, - to: &Address, -) -> Result, AdapterError> { - - let comet_pool_address = get_protocol_address(&e)?; - let comet_client = CometPoolClient::new(&e, &comet_pool_address); - - let (amount_in, _) = comet_client.swap_exact_amount_out( - &path.get(0).unwrap(), - amount_in_max, - &path.get(1).unwrap(), - amount_out, - &i128::MAX, - to - ); - - Ok(vec![e, amount_in, *amount_out]) -} diff --git a/contracts/adapters/comet/src/storage.rs b/contracts/adapters/comet/src/storage.rs deleted file mode 100644 index dee8a44a..00000000 --- a/contracts/adapters/comet/src/storage.rs +++ /dev/null @@ -1,51 +0,0 @@ -use soroban_sdk::{contracttype, Env, Address, String}; -use adapter_interface::AdapterError; - -#[derive(Clone)] -#[contracttype] - -enum DataKey { - Initialized, - ProtocolId, - ProtocolAddress, -} - -const DAY_IN_LEDGERS: u32 = 17280; -const INSTANCE_BUMP_AMOUNT: u32 = 60 * DAY_IN_LEDGERS; -const INSTANCE_LIFETIME_THRESHOLD: u32 = INSTANCE_BUMP_AMOUNT - DAY_IN_LEDGERS; - -pub fn extend_instance_ttl(e: &Env) { - e.storage() - .instance() - .extend_ttl(INSTANCE_LIFETIME_THRESHOLD, INSTANCE_BUMP_AMOUNT); -} - -/* INITIALIZED */ -pub fn set_initialized(e: &Env) { - e.storage().instance().set(&DataKey::Initialized, &true); -} - -pub fn is_initialized(e: &Env) -> bool { - e.storage().instance().has(&DataKey::Initialized) -} - - -/* PROTOCOL ID - STRING */ -pub fn set_protocol_id(e: &Env, protocol_id: String) { - e.storage().instance().set(&DataKey::ProtocolId, &protocol_id); -} - -pub fn get_protocol_id(e: &Env) -> Result { - e.storage().instance().get(&DataKey::ProtocolId).ok_or(AdapterError::NotInitialized) -} - - -/* PROTOCOL ADDRESS */ -pub fn set_protocol_address(e: &Env, address: Address) { - e.storage().instance().set(&DataKey::ProtocolAddress, &address); -} - -pub fn get_protocol_address(e: &Env) -> Result { - e.storage().instance().get(&DataKey::ProtocolAddress).ok_or(AdapterError::NotInitialized) -} - diff --git a/contracts/adapters/comet/src/test.rs b/contracts/adapters/comet/src/test.rs deleted file mode 100644 index b3b67716..00000000 --- a/contracts/adapters/comet/src/test.rs +++ /dev/null @@ -1,119 +0,0 @@ -#![cfg(test)] -extern crate std; -pub mod comet_setup; - -use comet_adapter_contract::CometAggregatorAdapterClientFromWasm; -use comet_setup::{create_comet_factory, create_token_contract, pair::CometPairClient}; -use soroban_sdk::{ - testutils::Address as _, token::TokenClient, vec, Address, BytesN, Env, IntoVal, String, - Symbol, Val, Vec, -}; - -mod deployer_contract { - soroban_sdk::contractimport!(file = "../../target/wasm32-unknown-unknown/release/soroswap_aggregator_deployer.optimized.wasm"); - pub type DeployerClient<'a> = Client<'a>; -} -use deployer_contract::DeployerClient; - -use crate::{CometAggregatorAdapter, CometAggregatorAdapterClient}; - -fn create_deployer<'a>(e: &Env) -> DeployerClient<'a> { - let deployer_address = &e.register(deployer_contract::WASM, ()); - let deployer = DeployerClient::new(e, deployer_address); - deployer -} - -fn create_comet_aggregator_adapter<'a>(e: &Env) -> CometAggregatorAdapterClient<'a> { - CometAggregatorAdapterClient::new(e, &e.register(CometAggregatorAdapter {}, ())) -} - -pub mod comet_adapter_contract { - soroban_sdk::contractimport!( - file = "../../target/wasm32-unknown-unknown/release/comet_adapter.optimized.wasm" - ); - pub type CometAggregatorAdapterClientFromWasm<'a> = Client<'a>; -} - -pub struct CometAggregatorAdapterTest<'a> { - pub env: Env, - pub adapter_contract: CometAggregatorAdapterClientFromWasm<'a>, - pub adapter_contract_not_initialized: CometAggregatorAdapterClient<'a>, - pub comet_contract: CometPairClient<'a>, - // pub factory_contract: CometFactoryClient<'a>, - pub token_0: TokenClient<'a>, - pub token_1: TokenClient<'a>, - pub user: Address, - // pub admin: Address, -} - -impl<'a> CometAggregatorAdapterTest<'a> { - fn setup() -> Self { - let e = Env::default(); - e.mock_all_auths(); - - let admin = Address::generate(&e); - let user = Address::generate(&e); - - let (token_a, admin_token_a) = create_token_contract(&e, &admin); - let (token_b, admin_token_b) = create_token_contract(&e, &admin); - - admin_token_a.mint(&admin, &1000000_000_000_0); - admin_token_b.mint(&admin, &1000000_000_000_0); - - admin_token_a.mint(&user, &1000000_000_000_0); - admin_token_b.mint(&user, &1000000_000_000_0); - - let comet_factory_client = create_comet_factory(&e); - let comet_address = comet_factory_client.new_c_pool( - &BytesN::from_array(&e, &[0; 32]), - &admin, - &vec![&e, token_a.address.clone(), token_b.address.clone()], - &vec![&e, 8000000, 2000000], - &vec![&e, 800000000000, 200000000000], // these balances make the tokens have an equal value - &30000, - ); - let comet_client = CometPairClient::new(&e, &comet_address); - - let adapter_wasm_hash = e - .deployer() - .upload_contract_wasm(comet_adapter_contract::WASM); - let deployer_client = create_deployer(&e); - - let adapter_contract_not_initialized = create_comet_aggregator_adapter(&e); - - // Deploy contract using deployer, and include an init function to call. - let salt = BytesN::from_array(&e, &[0; 32]); - let init_fn = Symbol::new(&e, &("initialize")); - - let protocol_id = String::from_str(&e, "comet_blend"); - let protocol_address = comet_address.clone(); - - // Convert the arguments into a Vec - let init_fn_args: Vec = (protocol_id.clone(), protocol_address.clone()).into_val(&e); - - let (adapter_address, _init_result) = deployer_client.deploy( - &deployer_client.address, - &adapter_wasm_hash, - &salt, - &init_fn, - &init_fn_args, - ); - - let adapter_contract = CometAggregatorAdapterClientFromWasm::new(&e, &adapter_address); - - CometAggregatorAdapterTest { - env: e.clone(), - adapter_contract: adapter_contract, - adapter_contract_not_initialized: adapter_contract_not_initialized, - comet_contract: comet_client, - // factory_contract: comet_factory_client, - token_0: token_a, - token_1: token_b, - user: user, - } - } -} - -pub mod initialize; -pub mod swap_exact_tokens_for_tokens; -pub mod swap_tokens_for_exact_tokens; diff --git a/contracts/adapters/comet/src/test/comet_setup.rs b/contracts/adapters/comet/src/test/comet_setup.rs deleted file mode 100644 index 62774bbf..00000000 --- a/contracts/adapters/comet/src/test/comet_setup.rs +++ /dev/null @@ -1,38 +0,0 @@ -#![cfg(test)] -extern crate std; -use soroban_sdk::{ - token::{StellarAssetClient as TokenAdminClient, TokenClient}, Address, BytesN, Env -}; - - -pub mod pair{ - soroban_sdk::contractimport!(file = "./comet_contracts/comet_pool.wasm"); - pub type CometPairClient<'a> = Client<'a>; -} - -fn pair_contract_wasm(e: &Env) -> BytesN<32> { - e.deployer().upload_contract_wasm(pair::WASM) -} - -pub mod factory{ - soroban_sdk::contractimport!(file = "./comet_contracts/comet_factory.wasm"); - pub type CometFactoryClient<'a> = Client<'a>; -} -use factory::CometFactoryClient; - -pub fn create_comet_factory<'a>(e: &Env) -> CometFactoryClient{ - let pair_hash = pair_contract_wasm(e); - - let factory_address = e.register(factory::WASM, ()); - let factory_client = CometFactoryClient::new(&e.clone(), &factory_address); - - factory_client.init(&pair_hash); - - factory_client -} - -pub fn create_token_contract<'a>(e: &Env, admin: & Address) -> (TokenClient<'a>, TokenAdminClient<'a>) { - let stellar_asset_contract = e.register_stellar_asset_contract_v2(admin.clone()); - - (TokenClient::new(&e, &stellar_asset_contract.address()), TokenAdminClient::new(&e, &stellar_asset_contract.address())) -} \ No newline at end of file diff --git a/contracts/adapters/comet/src/test/initialize.rs b/contracts/adapters/comet/src/test/initialize.rs deleted file mode 100644 index 45a04110..00000000 --- a/contracts/adapters/comet/src/test/initialize.rs +++ /dev/null @@ -1,75 +0,0 @@ -use soroban_sdk::String; -use crate::test::CometAggregatorAdapterTest; -use adapter_interface::AdapterError; -use super::comet_adapter_contract::AdapterError as AdapterErrorDeployer; - -#[test] -fn test_initialize_and_get_values() { - let test = CometAggregatorAdapterTest::setup(); - - test.adapter_contract_not_initialized.initialize( - &String::from_str(&test.env, "comet_blend"), - &test.comet_contract.address); - - let protocol_id = test.adapter_contract_not_initialized.get_protocol_id(); - assert_eq!(protocol_id, String::from_str(&test.env, "comet_blend")); - - let protocol_address = test.adapter_contract_not_initialized.get_protocol_address(); - assert_eq!(protocol_address, test.comet_contract.address); -} - -#[test] -fn test_get_values() { - let test = CometAggregatorAdapterTest::setup(); - - let protocol_id = test.adapter_contract.get_protocol_id(); - assert_eq!(protocol_id, String::from_str(&test.env, "comet_blend")); - - let protocol_address = test.adapter_contract.get_protocol_address(); - assert_eq!(protocol_address, test.comet_contract.address); -} - -// test initialize twice -#[test] -fn test_initialize_twice() { - let test = CometAggregatorAdapterTest::setup(); - - test.adapter_contract_not_initialized.initialize( - &String::from_str(&test.env, "comet_blend"), - &test.comet_contract.address); - - let result = test.adapter_contract_not_initialized.try_initialize( - &String::from_str(&test.env, "comet_blend"), - &test.comet_contract.address); - - assert_eq!(result,Err(Ok(AdapterError::AlreadyInitialized))); -} - -#[test] -fn test_initialize_twice_deployer() { - let test = CometAggregatorAdapterTest::setup(); - - let result = test.adapter_contract.try_initialize( - &String::from_str(&test.env, "comet_blend"), - &test.comet_contract.address); - - assert_eq!(result,Err(Ok(AdapterErrorDeployer::AlreadyInitialized))); -} - -// test get protocol id not initialized -#[test] -fn test_get_protocol_id_not_initialized() { - let test = CometAggregatorAdapterTest::setup(); - - let result = test.adapter_contract_not_initialized.try_get_protocol_id(); - assert_eq!(result,Err(Ok(AdapterError::NotInitialized))); -} - -// test get protocol address not initialized -#[test] -fn test_get_protocol_address_not_initialized() { - let test = CometAggregatorAdapterTest::setup(); - - let result = test.adapter_contract_not_initialized.try_get_protocol_address(); - assert_eq!(result,Err(Ok(AdapterError::NotInitialized))); -} diff --git a/contracts/adapters/comet/src/test/swap_exact_tokens_for_tokens.rs b/contracts/adapters/comet/src/test/swap_exact_tokens_for_tokens.rs deleted file mode 100644 index 120301b9..00000000 --- a/contracts/adapters/comet/src/test/swap_exact_tokens_for_tokens.rs +++ /dev/null @@ -1,220 +0,0 @@ -extern crate std; - -use soroban_sdk::{Address, vec, Vec}; -use crate::test::CometAggregatorAdapterTest; -use adapter_interface::AdapterError; - -#[test] -fn swap_exact_tokens_for_tokens_not_initialized() { - let test = CometAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - let path: Vec
= Vec::new(&test.env); - - let result = test.adapter_contract_not_initialized.try_swap_exact_tokens_for_tokens( - &0, // amount_in - &0, // amount_out_min - &path, // path - &test.user, // to - &0, // deadline - &None - ); - - assert_eq!(result,Err(Ok(AdapterError::NotInitialized))); - -} - -#[test] -#[should_panic(expected = "HostError: Error(Contract, #37)")] -fn swap_exact_tokens_for_tokens_amount_in_negative() { - let test = CometAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let path: Vec
= vec![&test.env, test.token_0.address, test.token_1.address]; - - test.adapter_contract.swap_exact_tokens_for_tokens( - &-1, // amount_in - &0, // amount_out_min - &path, // path - &test.user, // to - &1, // deadline - &None - ); -} - -#[test] -#[should_panic(expected = "HostError: Error(Contract, #37)")] -fn swap_exact_tokens_for_tokens_amount_out_min_negative() { - let test: CometAggregatorAdapterTest<'_> = CometAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let path: Vec
= vec![&test.env, test.token_0.address, test.token_1.address]; - - test.adapter_contract.swap_exact_tokens_for_tokens( - &0, // amount_in - &-1, // amount_out_min - &path, // path - &test.user, // to - &1, // deadline - &None - ); -} - -#[test] -#[should_panic(expected = "HostError: Error(Contract, #405)")] -fn swap_exact_tokens_for_tokens_expired() { - let test = CometAggregatorAdapterTest::setup(); - - let path: Vec
= vec![&test.env, test.token_0.address, test.token_1.address]; - - test.adapter_contract.swap_exact_tokens_for_tokens( - &10000, // amount_in - &1, // amount_out_min - &path, // path - &test.user, // to - &0, // deadline - &None - ); -} - - - -#[test] -#[should_panic] // TODO: Test the imported error -fn try_swap_exact_tokens_for_tokens_invalid_path() { - let test = CometAggregatorAdapterTest::setup(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - let path: Vec
= vec![&test.env, test.token_0.address.clone()]; - test.adapter_contract.swap_exact_tokens_for_tokens( - &0, // amount_in - &0, // amount_out_min - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); -} - - -#[test] -#[should_panic] // TODO: Test the imported error -fn try_swap_exact_tokens_for_tokens_insufficient_input_amount() { - let test = CometAggregatorAdapterTest::setup(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let mut path: Vec
= Vec::new(&test.env); - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_1.address.clone()); - - test.env.cost_estimate().budget().reset_unlimited(); - - - let amount = 100_000; - - test.adapter_contract.swap_exact_tokens_for_tokens( - &amount, // amount_in - &amount, // amount_out_min - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); -} - - - -#[test] -#[should_panic(expected = "HostError: Error(Contract, #20)")] -fn swap_exact_tokens_for_tokens_insufficient_output_amount() { - let test = CometAggregatorAdapterTest::setup(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let mut path: Vec
= Vec::new(&test.env); - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_1.address.clone()); - - let amount_in = 1_000_000; - - let expected_amount_out = 996996; - - - // bone = 10**18 - // fee_ratio = (10**7 - 30000) * 10**11 => 997000000000000000 - // scaled_reserve_(out|in) = token_(out|in)_reserve * 10**7 - // adjusted_in = amount_in * fee_ratio / BONE - // base = (scaled_reserve_in * BONE) / (scaled_reserve_in) + adjusted_in) - // weight_ratio = in_token_weight * 10**18 / out_token_weight - // power = ((base / BONE) ** (weight_ratio / BONE)) * BONE // The code treats the numbers as 18 digit fixed point values. So code does it differently, but this is equivelant - // balance_ratio = BONE - power - // <= scaled_reserve_out * balance_ratio / BONE / 10**7 - - // scaled_reserve_in = 800000000000 * 10**7 => 8000000000000000000 - // scaled_reserve_out = 200000000000 * 10**7 => 2000000000000000000 - // adjusted_in = 1_000_000 * 997000000000000000 / BONE => 99700000000000000 - // base = (8000000000000000000 * BONE) / (8000000000000000000 + 99700000000000000) => 999998753751553137 - // weight_ratio = 8000000 * bone / 2000000 => 4000000000000000000 - // power = ((999998753751553137 / BONE) ** (4000000000000000000 / BONE)) * 10**18 => 999995015015531351 - // balance_ratio = BONE - 999995015015531351 => 4984984468649 - // 2000000000000000000 * 4984984468649 / BONE / 10**7 => 996996 - - test.env.cost_estimate().budget().reset_unlimited(); - test.adapter_contract.swap_exact_tokens_for_tokens( - &amount_in, // amount_in - &(expected_amount_out + 1), // amount_out_min - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); -} - - - -#[test] -fn swap_exact_tokens_for_tokens_enough_output_amount() { - let test = CometAggregatorAdapterTest::setup(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let mut path: Vec
= Vec::new(&test.env); - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_1.address.clone()); - - let amount_in = 1_000_000; - - let expected_amount_out = 996996; - - // bone = 10**18 - // fee_ratio = (10**7 - 30000) * 10**11 => 997000000000000000 - // scaled_reserve_(out|in) = token_(out|in)_reserve * 10**7 - // adjusted_in = amount_in * fee_ratio / BONE - // base = (scaled_reserve_in * BONE) / (scaled_reserve_in) + adjusted_in) - // weight_ratio = in_token_weight * 10**18 / out_token_weight - // power = ((base / BONE) ** (weight_ratio / BONE)) * BONE // The code treats the numbers as 18 digit fixed point values. So code does it differently, but this is equivelant - // balance_ratio = BONE - power - // <= scaled_reserve_out * balance_ratio / BONE / 10**7 - - // scaled_reserve_in = 800000000000 * 10**7 => 8000000000000000000 - // scaled_reserve_out = 200000000000 * 10**7 => 2000000000000000000 - // adjusted_in = 1_000_000 * 997000000000000000 / BONE => 99700000000000000 - // base = (8000000000000000000 * BONE) / (8000000000000000000 + 99700000000000000) => 999998753751553137 - // weight_ratio = 8000000 * bone / 2000000 => 4000000000000000000 - // power = ((999998753751553137 / BONE) ** (4000000000000000000 / BONE)) * 10**18 => 999995015015531351 - // balance_ratio = BONE - 999995015015531351 => 4984984468649 - // 2000000000000000000 * 4984984468649 / BONE / 10**7 => 996996 - - test.env.cost_estimate().budget().reset_unlimited(); - let executed_amounts = test.adapter_contract.swap_exact_tokens_for_tokens( - &amount_in, //amount_in - &(expected_amount_out), // amount_out_min - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); - assert_eq!(executed_amounts.get(0).unwrap(), amount_in); - assert_eq!(executed_amounts.get(1).unwrap(), expected_amount_out); - -} \ No newline at end of file diff --git a/contracts/adapters/comet/src/test/swap_tokens_for_exact_tokens.rs b/contracts/adapters/comet/src/test/swap_tokens_for_exact_tokens.rs deleted file mode 100644 index 123e6e12..00000000 --- a/contracts/adapters/comet/src/test/swap_tokens_for_exact_tokens.rs +++ /dev/null @@ -1,204 +0,0 @@ -extern crate std; - -use soroban_sdk::{Address, vec, Vec}; -use crate::test::CometAggregatorAdapterTest; -use adapter_interface::AdapterError; - -#[test] -fn swap_tokens_for_exact_tokens_not_initialized() { - let test = CometAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - let path: Vec
= Vec::new(&test.env); - - let result = test.adapter_contract_not_initialized.try_swap_tokens_for_exact_tokens( - &0, // amount_out - &0, // amount_in_max - &path, // path - &test.user, // to - &0, // deadline - &None - ); - - assert_eq!(result,Err(Ok(AdapterError::NotInitialized))); - -} - -#[test] -#[should_panic(expected = "HostError: Error(Contract, #37)")] -fn swap_tokens_for_exact_tokens_amount_out_negative() { - let test = CometAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let path: Vec
= vec![&test.env, test.token_0.address, test.token_1.address]; - - test.adapter_contract.swap_tokens_for_exact_tokens( - &-1, // amount_out - &0, // amount_in_max - &path, // path - &test.user, // to - &1, // deadline - &None - ); -} - -#[test] -#[should_panic(expected = "HostError: Error(Contract, #37)")] -fn swap_tokens_for_exact_tokens_amount_in_max_negative() { - let test = CometAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let path: Vec
= vec![&test.env, test.token_0.address, test.token_1.address]; - - test.adapter_contract.swap_tokens_for_exact_tokens( - &1, // amount_out - &-1, // amount_in_max - &path, // path - &test.user, // to - &1, // deadline - &None - ); -} - -#[test] -#[should_panic(expected = "HostError: Error(Contract, #405)")] -fn swap_tokens_for_exact_tokens_expired() { - let test = CometAggregatorAdapterTest::setup(); - - let path: Vec
= Vec::new(&test.env); - - test.adapter_contract.swap_tokens_for_exact_tokens( - &0, // amount_out - &0, // amount_in_max - &path, // path - &test.user, // to - &0, // deadline - &None - ); -} - - -#[test] -#[should_panic] // TODO: Test the imported error -fn try_swap_tokens_for_exact_tokens_invalid_path() { - let test = CometAggregatorAdapterTest::setup(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let path: Vec
= vec![&test.env, test.token_0.address.clone()]; - - test.adapter_contract.swap_tokens_for_exact_tokens( // add try_ to test the error - &0, // amount_out - &0, // amount_in_max - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); - - // assert_eq!(result, Err(Ok(CombinedRouterError::LibraryInvalidPath))); -} - - -#[test] -#[should_panic(expected = "HostError: Error(Contract, #19)")] -fn try_swap_tokens_for_exact_tokens_insufficient_input_amount() { - let test = CometAggregatorAdapterTest::setup(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let mut path: Vec
= Vec::new(&test.env); - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_1.address.clone()); - - - test.env.cost_estimate().budget().reset_unlimited(); - - let amount_out = 1_000_000; - let expected_amount_in = 1_003_015; - - // bone = 10**18 - // fee_ratio = (10**7 - 30000) * 10**11 => 997000000000000000 - // scaled_reserve_(out|in) = token_(out|in)_reserve * 10**7 - // adjusted_out = amount_out * 10**7 - // base = (scaled_reserve_out * BONE) / (scaled_reserve_out) - adjusted_out) - // weight_ratio = out_token_weight * 10**18 / out_token_weight - // power = ((base / BONE) ** (weight_ratio / BONE)) * BONE // The code treats the numbers as 18 digit fixed point values. So code does it differently, but this is equivelant - // balance_ratio = power - BONE - // amount_in = scaled_reserve_in * balance_ratio / BONE - // adjusted_in = amount_in * BONE / fee_ratio - // <= adjusted_in / 10**7 - - // scaled_reserve_in = 800000000000 * 10**7 => 8000000000000000000 - // scaled_reserve_out = 200000000000 * 10**7 => 2000000000000000000 - // adjusted_out = 1_000_000 * 10**7 => 10000000000000 - // base = (2000000000000000000 * BONE) / (2000000000000000000 - 10000000000000) => 1000005000025000125 - // weight_ratio = 2000000 * BONE / 8000000 => 250000000000000000 - // power = ((1000005000025000125 / BONE) ** (250000000000000000 / BONE)) * 10**18 => 1250006250031 - // balance_ratio = 1000001250006250031 - BONE => 1250006250031 - // amount_in = 8000000000000000000 * 1250006250031 / BONE = 10000050000248 - // adjusted_in = 10000050000248 * BONE / fee_ratio => 10030140421512 - // 10030140421512 / 10**7 => 1003015 - - test.adapter_contract.swap_tokens_for_exact_tokens( - &amount_out, // amount_out - &(expected_amount_in - 1), // amount_in_max - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); -} - -#[test] -fn try_swap_tokens_for_exact_tokens_sufficient_input_amount() { - let test = CometAggregatorAdapterTest::setup(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let mut path: Vec
= Vec::new(&test.env); - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_1.address.clone()); - - - test.env.cost_estimate().budget().reset_unlimited(); - - let amount_out = 1_000_000; - let expected_amount_in = 1_003_015; - - - // bone = 10**18 - // fee_ratio = (10**7 - 30000) * 10**11 => 997000000000000000 - // scaled_reserve_(out|in) = token_(out|in)_reserve * 10**7 - // adjusted_out = amount_out * 10**7 - // base = (scaled_reserve_out * BONE) / (scaled_reserve_out) - adjusted_out) - // weight_ratio = out_token_weight * 10**18 / out_token_weight - // power = ((base / BONE) ** (weight_ratio / BONE)) * BONE // The code treats the numbers as 18 digit fixed point values. So code does it differently, but this is equivelant - // balance_ratio = power - BONE - // amount_in = scaled_reserve_in * balance_ratio / BONE - // adjusted_in = amount_in * BONE / fee_ratio - // <= adjusted_in / 10**7 - - // scaled_reserve_in = 800000000000 * 10**7 => 8000000000000000000 - // scaled_reserve_out = 200000000000 * 10**7 => 2000000000000000000 - // adjusted_out = 1_000_000 * 10**7 => 10000000000000 - // base = (2000000000000000000 * BONE) / (2000000000000000000 - 10000000000000) => 1000005000025000125 - // weight_ratio = 2000000 * BONE / 8000000 => 250000000000000000 - // power = ((1000005000025000125 / BONE) ** (250000000000000000 / BONE)) * 10**18 => 1250006250031 - // balance_ratio = 1000001250006250031 - BONE => 1250006250031 - // amount_in = 8000000000000000000 * 1250006250031 / BONE = 10000050000248 - // adjusted_in = 10000050000248 * BONE / fee_ratio => 10030140421512 - // 10030140421512 / 10**7 => 1003015 - - - let executed_amounts = test.adapter_contract.swap_tokens_for_exact_tokens( - &amount_out, // amount_out - &expected_amount_in, // amount_in_max - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); - - assert_eq!(executed_amounts.get(0).unwrap(), expected_amount_in); - assert_eq!(executed_amounts.get(1).unwrap(), amount_out); -} \ No newline at end of file diff --git a/contracts/adapters/interface/Cargo.toml b/contracts/adapters/interface/Cargo.toml deleted file mode 100644 index 691316ad..00000000 --- a/contracts/adapters/interface/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "adapter-interface" -authors = ["coderipper , esteblock"] -version = { workspace = true } -edition = { workspace = true } -repository = { workspace = true } -publish = false - -[dependencies] -soroban-sdk = { workspace = true } - -[dev-dependencies] -soroban-sdk = { workspace = true, features = ["testutils"] } \ No newline at end of file diff --git a/contracts/adapters/interface/src/error.rs b/contracts/adapters/interface/src/error.rs deleted file mode 100644 index 3f997810..00000000 --- a/contracts/adapters/interface/src/error.rs +++ /dev/null @@ -1,17 +0,0 @@ -use soroban_sdk::{self, contracterror}; - -#[contracterror] -#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] -#[repr(u32)] -pub enum AdapterError { - NotInitialized = 401, - AlreadyInitialized = 402, - NegativeNotAllowed = 403, - ProtocolAddressNotFound = 404, - DeadlineExpired = 405, - MissingPoolHashes = 406, // For AQUA - WrongMinimumPathLength = 407, - WrongPoolHashesLength = 408, // For AQUA - -} - diff --git a/contracts/adapters/interface/src/lib.rs b/contracts/adapters/interface/src/lib.rs deleted file mode 100644 index 7fad9f8e..00000000 --- a/contracts/adapters/interface/src/lib.rs +++ /dev/null @@ -1,72 +0,0 @@ -// #![deny(warnings)] -#![no_std] - -use soroban_sdk::{contractclient, contractspecfn, Address, Env, Vec, String, BytesN}; -pub struct Spec; - -mod error; -pub use error::AdapterError; - -#[contractspecfn(name = "Spec", export = false)] -#[contractclient(name = "AdapterClient")] - -pub trait AdapterTrait { - fn initialize( - e: Env, - protocol_id: String, - protocol_address: Address) -> Result<(), AdapterError>; - - /// Swaps an exact amount of input tokens for as many output tokens as possible - /// along the specified trading route. The route is determined by the `path` vector, - /// where the first element is the input token, the last is the output token, - /// and any intermediate elements represent pairs to trade through if a direct pair does not exist. - /// # Arguments - /// * `amount_in` - The exact amount of input tokens to be swapped. - /// * `amount_out_min` - The minimum required amount of output tokens to receive. - /// * `path` - A vector representing the trading route, where the first element is the input token - /// and the last is the output token. Intermediate elements represent pairs to trade through. - /// * `to` - The address where the output tokens will be sent to. - /// * `deadline` - The deadline for executing the operation. - /// * `bytes` - Optional bytes containing additional data for the swap. - /// # Returns - /// A vector containing the amounts of tokens received at each step of the trading route. - fn swap_exact_tokens_for_tokens( - env: Env, - amount_in: i128, - amount_out_min: i128, - path: Vec
, - to: Address, - deadline: u64, - bytes: Option>>, - ) -> Result, AdapterError>; - - - /// Swaps tokens for an exact amount of output token, following the specified trading route. - /// The route is determined by the `path` vector, where the first element is the input token, - /// the last is the output token, and any intermediate elements represent pairs to trade through. - - /// # Arguments - /// * `amount_out` - The exact amount of output token to be received. - /// * `amount_in_max` - The maximum allowed amount of input tokens to be swapped. - /// * `path` - A vector representing the trading route, where the first element is the input token - /// and the last is the output token. Intermediate elements represent pairs to trade through. - /// * `to` - The address where the output tokens will be sent to. - /// * `deadline` - The deadline for executing the operation. - /// * `bytes` - Optional bytes containing additional data for the swap. - - /// # Returns - /// A vector containing the amounts of tokens used at each step of the trading route. - fn swap_tokens_for_exact_tokens( - e: Env, - amount_out: i128, - amount_in_max: i128, - path: Vec
, - to: Address, - deadline: u64, - bytes: Option>>, - ) -> Result, AdapterError>; - - /* *** Read only functions: *** */ - fn get_protocol_id(e: &Env) -> Result; - fn get_protocol_address(e: &Env) -> Result; -} diff --git a/contracts/adapters/phoenix/Cargo.toml b/contracts/adapters/phoenix/Cargo.toml deleted file mode 100644 index e76803ac..00000000 --- a/contracts/adapters/phoenix/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "phoenix-adapter" -version = "0.1.0" -edition = { workspace = true } -description = "Phoenix-Adapter is a smart contract on the Soroban platform, tailored for use with the Soroswap-Aggregator. It facilitates efficient transaction routing through the Phoenix protocol." -homepage = { workspace = true } -repository = { workspace = true } -authors = ["coderipper "] -readme = "README.md" -keywords = ["no_std", "wasm", "soroswap", "amm", "soroban"] -publish = true - -[lib] -crate-type = ["cdylib"] - -[dependencies] -soroban-sdk = { workspace = true } -adapter-interface = { workspace = true } - -[dev-dependencies] -soroban-sdk = { workspace = true, features = ["testutils"] } -test-utils = { workspace = true, features = ["testutils"] } \ No newline at end of file diff --git a/contracts/adapters/phoenix/Makefile b/contracts/adapters/phoenix/Makefile deleted file mode 100644 index e8fc34c2..00000000 --- a/contracts/adapters/phoenix/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -default: build - -all: test - -test: build - cargo test - -build: - cargo build --target wasm32-unknown-unknown --release - soroban contract optimize --wasm ../../target/wasm32-unknown-unknown/release/phoenix_adapter.wasm - @rm ../../target/wasm32-unknown-unknown/release/phoenix_adapter.wasm - -fmt: - cargo fmt --all --check - -clean: - cargo clean \ No newline at end of file diff --git a/contracts/adapters/phoenix/README.md b/contracts/adapters/phoenix/README.md deleted file mode 100644 index 7d726629..00000000 --- a/contracts/adapters/phoenix/README.md +++ /dev/null @@ -1 +0,0 @@ -# SoroswapAggregator: Phoenix Adapter \ No newline at end of file diff --git a/contracts/adapters/phoenix/src/event.rs b/contracts/adapters/phoenix/src/event.rs deleted file mode 100644 index ad71bf2c..00000000 --- a/contracts/adapters/phoenix/src/event.rs +++ /dev/null @@ -1,45 +0,0 @@ -//! Definition of the Events used in the contract -use soroban_sdk::{contracttype, symbol_short, Env, Address, Vec, String}; - -// INITIALIZED -#[contracttype] -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct InitializedEvent { - pub state: bool, - pub protocol_id: String, - pub protocol_address: Address -} - -pub(crate) fn initialized(e: &Env, state: bool, protocol_id: String, protocol_address: Address) { - - let event: InitializedEvent = InitializedEvent { - state: state, - protocol_id, - protocol_address, - }; - e.events().publish(("SoroswapAggregatorPhoenixAdapter", symbol_short!("init")), event); -} - -// SWAP EVENT -#[contracttype] -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct SwapEvent { - pub amount_in: i128, - pub path: Vec
, - pub to: Address -} - -pub(crate) fn swap( - e: &Env, - amount_in: i128, - path: Vec
, - to: Address -) { - let event = SwapEvent { - amount_in, - path, - to, - }; - - e.events().publish(("SoroswapAggregatorPhoenixAdapter", symbol_short!("swap")), event); -} \ No newline at end of file diff --git a/contracts/adapters/phoenix/src/lib.rs b/contracts/adapters/phoenix/src/lib.rs deleted file mode 100644 index 88379cbe..00000000 --- a/contracts/adapters/phoenix/src/lib.rs +++ /dev/null @@ -1,157 +0,0 @@ -#![no_std] -use soroban_sdk::{contract, contractimpl, Address, BytesN, Env, String, Vec}; -mod event; -mod storage; -mod protocol_interface; -mod test; - -use storage::{ - extend_instance_ttl, - set_initialized, - is_initialized, - set_protocol_id, - get_protocol_id, - set_protocol_address, - get_protocol_address, -}; -use adapter_interface::{ - AdapterTrait, AdapterError -}; -use protocol_interface::{ - protocol_swap_exact_tokens_for_tokens, - protocol_swap_tokens_for_exact_tokens -}; - -fn check_nonnegative_amount(amount: i128) -> Result<(), AdapterError> { - if amount < 0 { - Err(AdapterError::NegativeNotAllowed) - } else { - Ok(()) - } -} - -fn ensure_deadline(e: &Env, timestamp: u64) -> Result<(), AdapterError> { - let ledger_timestamp = e.ledger().timestamp(); - if ledger_timestamp >= timestamp { - Err(AdapterError::DeadlineExpired) - } else { - Ok(()) - } -} - -fn check_initialized(e: &Env) -> Result<(), AdapterError> { - if is_initialized(e) { - Ok(()) - } else { - Err(AdapterError::NotInitialized) - } -} - -#[contract] -struct SoroswapAggregatorPhoenixAdapter; - -#[contractimpl] -impl AdapterTrait for SoroswapAggregatorPhoenixAdapter { - - /// Initializes the contract and sets the Phoenix multihop address. - /// - /// # Arguments - /// - /// * `e` - The contract environment. - /// * `protocol_id` - The identifier for the protocol. - /// * `protocol_address` - The address associated with the protocol. - /// - /// # Errors - /// - /// Returns an error if the contract is already initialized (`AdapterError::AlreadyInitialized`). - fn initialize( - e: Env, - protocol_id: String, - protocol_address: Address, - ) -> Result<(), AdapterError> { - if check_initialized(&e).is_ok() { - return Err(AdapterError::AlreadyInitialized); - } - - set_protocol_id(&e, protocol_id.clone()); - set_protocol_address(&e, protocol_address.clone()); - - set_initialized(&e); - event::initialized(&e, true, protocol_id, protocol_address); - extend_instance_ttl(&e); - Ok(()) - } - - fn swap_exact_tokens_for_tokens( - e: Env, - amount_in: i128, - amount_out_min: i128, - path: Vec
, - to: Address, - deadline: u64, - _bytes: Option>> - ) -> Result, AdapterError> { - check_initialized(&e)?; - extend_instance_ttl(&e); - to.require_auth(); - - check_nonnegative_amount(amount_in)?; - check_nonnegative_amount(amount_out_min)?; - ensure_deadline(&e, deadline)?; - - let swap_result = protocol_swap_exact_tokens_for_tokens( - &e, - &amount_in, - &amount_out_min, - &path, - &to, - &deadline, - )?; - - event::swap(&e, amount_in, path, to); - Ok(swap_result) - } - - fn swap_tokens_for_exact_tokens( - e: Env, - amount_out: i128, - amount_in_max: i128, - path: Vec
, - to: Address, - deadline: u64, - _bytes: Option>> - ) -> Result, AdapterError> { - check_initialized(&e)?; - extend_instance_ttl(&e); - to.require_auth(); - - check_nonnegative_amount(amount_out)?; - check_nonnegative_amount(amount_in_max)?; - ensure_deadline(&e, deadline)?; - - let swap_result = protocol_swap_tokens_for_exact_tokens( - &e, - &amount_out, - &amount_in_max, - &path, - &to, - &deadline, - )?; - - event::swap(&e, amount_in_max, path, to); - Ok(swap_result) - } - - /* *** Read only functions: *** */ - fn get_protocol_id(e: &Env) -> Result { - check_initialized(&e)?; - extend_instance_ttl(&e); - Ok(get_protocol_id(e)?) - } - - fn get_protocol_address(e: &Env) -> Result { - check_initialized(&e)?; - extend_instance_ttl(&e); - Ok(get_protocol_address(e)?) - } -} diff --git a/contracts/adapters/phoenix/src/protocol_interface.rs b/contracts/adapters/phoenix/src/protocol_interface.rs deleted file mode 100644 index 10988764..00000000 --- a/contracts/adapters/phoenix/src/protocol_interface.rs +++ /dev/null @@ -1,203 +0,0 @@ -// based on https://github.com/Phoenix-Protocol-Group/phoenix_contracts/tree/v1.0.0 - -use soroban_sdk::{Env, Address, Vec, token::Client as TokenClient}; -use crate::storage::get_protocol_address; -use adapter_interface::AdapterError; -// use phoenix_contracts::PoolType; - -soroban_sdk::contractimport!( - file = "./phoenix_contracts/phoenix_multihop.wasm" -); -pub type PhoenixMultihopClient<'a> = Client<'a>; - -fn convert_to_swaps(e: &Env, path: &Vec
) -> Vec { - let mut swaps = Vec::new(e); - - // Iterate through the addresses in the path, creating a Swap object for each pair - // If path is [token0, token1, token2, token3], swaps should be - // swap_0 = Swap{ - // offer_asset: token0, - // ask_asset: token1, - // ask_asset_min_amount: None, - // }, - // swap_1 = Swap{ - // offer_asset: token1, - // ask_asset: token2, - // ask_asset_min_amount: None, - // }, - // swap_2 = Swap{ - // offer_asset: token2, - // ask_asset: token3, - // ask_asset_min_amount: None, - // } - - for i in 0..(path.len() - 1) { - let offer_asset = path.get(i).expect("Failed to get offer asset"); - let ask_asset = path.get(i + 1).expect("Failed to get ask a sset"); - - swaps.push_back(Swap { - offer_asset: offer_asset.clone(), // asset being sold (token_in) - ask_asset: ask_asset.clone(), // asset buying (token_out) - ask_asset_min_amount: None, - }); - } - - swaps -} - -pub fn protocol_swap_exact_tokens_for_tokens( - e: &Env, - amount_in: &i128, - amount_out_min: &i128, - path: &Vec
, - to: &Address, - _deadline: &u64, -) -> Result, AdapterError> { - - let phoenix_multihop_address = get_protocol_address(&e)?; - let phoenix_multihop_client = PhoenixMultihopClient::new(&e, &phoenix_multihop_address); - let operations = convert_to_swaps(e, path); - - // TODO: Remove this checks if we want to reduce the number of total instructions - // TODO: Do benchmarking - let token_out_address = path.get(path.len() - 1).expect("Failed to get token out address"); - let initial_token_out_balance = TokenClient::new(&e, &token_out_address).balance(&to); - - let pool_type = PoolType::Xyk; // currently we only support XYK pools - - // By using max_spread_bps = None, the Phoenix LP will use the maximum allowed slippage - // amount_in is the amount being sold of the first token in the operations. - - // fn swap( - // env: Env, - // recipient: Address, - // // FIXM: Disable Referral struct - // // referral: Option, - // operations: Vec, - // max_spread_bps: Option, - // amount: i128, - // pool_type: PoolType, - // deadline: Option, - // max_allowed_fee_bps: Option, - // ); - phoenix_multihop_client.swap( - &to, // recipient: Address, - &operations, // operations: Vec, - &None, // max_spread_bps: Option. - &amount_in, //amout: i128. Amount being sold. Input from the user, - &pool_type, // pool_type: PoolType, - &None, // deadline: Option, - &None, // max_allowed_fee_bps: Option, - ); - - let final_token_out_balance = TokenClient::new(&e, &token_out_address).balance(&to); - - // check if the amount of token_out received is greater than the minimum amount expected - // TODO: Remove this checks if we want to reduce the number of total instructions - // TODO: Do benchmarking - let final_amount_out = final_token_out_balance.checked_sub(initial_token_out_balance).unwrap(); - if final_amount_out < *amount_out_min { - // panic - panic!("Amount of token out received is less than the minimum amount expected"); - } - - let mut swap_amounts: Vec = Vec::new(e); - swap_amounts.push_back(amount_in.clone()); - swap_amounts.push_back(final_amount_out); - - Ok(swap_amounts) -} - -pub fn protocol_swap_tokens_for_exact_tokens( - e: &Env, - amount_out: &i128, - amount_in_max: &i128, - path: &Vec
, - to: &Address, - _deadline: &u64, -) -> Result, AdapterError> { - - let phoenix_multihop_address = get_protocol_address(&e)?; - let phoenix_multihop_client = PhoenixMultihopClient::new(&e, &phoenix_multihop_address); - let operations = convert_to_swaps(e, path); - - // let pool_type = PoolType::Xyk; // currently we only support XYK pools - - - // We first need to get the "reverse_amount from phoenix.simulate_reverse_swap" - // however here, if the path is [t0, t1, t2, t3, t4], the operations should be - // swap_0 = Swap{ - // offer_asset: t3, - // ask_asset: t4, - // ask_asset_min_amount: None, - // }, - // swap_1 = Swap{ - // offer_asset: t2, - // ask_asset: t3, - // ask_asset_min_amount: None, - // }, - // swap_2 = Swap{ - // offer_asset: t1, - // ask_asset: t2, - // ask_asset_min_amount: None, - // }, - // swap_3 = Swap{ - // offer_asset: t0, - // ask_asset: t1, - // ask_asset_min_amount: None, - // } - - let mut operations_reversed = soroban_sdk::Vec::new(&e); - for op in operations.iter().rev() { - operations_reversed.push_back(op.clone()); - } - - // fn simulate_reverse_swap( - // env: Env, - // operations: Vec, - // amount: i128, - // pool_type: PoolType, - // ) -> SimulateReverseSwapResponse; - - let reverse_simulated_swap = phoenix_multihop_client.simulate_reverse_swap( - &operations_reversed, //operations: Vec, - amount_out, //amount: i128, - &PoolType::Xyk //PoolType, - ); - - // TODO: Eliminate this check. The overall in max is checked by the Aggregator - // Removing this check will reduce the amount of instructions/ - // TODO: Do Benchmarking - if reverse_simulated_swap.offer_amount > *amount_in_max { - panic!("Amount of token in required is greater than the maximum amount expected"); - } - - // fn swap( - // env: Env, - // recipient: Address, - // // FIXM: Disable Referral struct - // // referral: Option, - // operations: Vec, - // max_spread_bps: Option, - // amount: i128, - // pool_type: PoolType, - // deadline: Option, - // max_allowed_fee_bps: Option, - // ); - phoenix_multihop_client.swap( - &to, // recipient: Address, - &operations, // operations: Vec, - &None, // max_spread_bps: Option. - &reverse_simulated_swap.offer_amount, //amout: i128. Amount being sold. Input from the user, - &PoolType::Xyk, // pool_type: PoolType, - &None, // deadline: Option, - &None, // max_allowed_fee_bps: Option, - ); - - // Here we trust in the amounts returned by Phoenix contracts - let mut swap_amounts: Vec = Vec::new(e); - swap_amounts.push_back(reverse_simulated_swap.offer_amount); - swap_amounts.push_back(*amount_out); - - Ok(swap_amounts) -} \ No newline at end of file diff --git a/contracts/adapters/phoenix/src/storage.rs b/contracts/adapters/phoenix/src/storage.rs deleted file mode 100644 index ce448618..00000000 --- a/contracts/adapters/phoenix/src/storage.rs +++ /dev/null @@ -1,51 +0,0 @@ -use soroban_sdk::{contracttype, Env, Address, String}; -use adapter_interface::AdapterError; - -#[derive(Clone)] -#[contracttype] - -enum DataKey { - Initialized, - ProtocolId, - ProtocolAddress, -} - -const DAY_IN_LEDGERS: u32 = 17280; -const INSTANCE_BUMP_AMOUNT: u32 = 30 * DAY_IN_LEDGERS; -const INSTANCE_LIFETIME_THRESHOLD: u32 = INSTANCE_BUMP_AMOUNT - DAY_IN_LEDGERS; - -pub fn extend_instance_ttl(e: &Env) { - e.storage() - .instance() - .extend_ttl(INSTANCE_LIFETIME_THRESHOLD, INSTANCE_BUMP_AMOUNT); -} - -/* INITIALIZED */ -pub fn set_initialized(e: &Env) { - e.storage().instance().set(&DataKey::Initialized, &true); -} - -pub fn is_initialized(e: &Env) -> bool { - e.storage().instance().has(&DataKey::Initialized) -} - - -/* PROTOCOL ID - STRING */ -pub fn set_protocol_id(e: &Env, protocol_id: String) { - e.storage().instance().set(&DataKey::ProtocolId, &protocol_id); -} - -pub fn get_protocol_id(e: &Env) -> Result { - e.storage().instance().get(&DataKey::ProtocolId).ok_or(AdapterError::NotInitialized) -} - - -/* PROTOCOL ADDRESS */ -pub fn set_protocol_address(e: &Env, address: Address) { - e.storage().instance().set(&DataKey::ProtocolAddress, &address); -} - -pub fn get_protocol_address(e: &Env) -> Result { - e.storage().instance().get(&DataKey::ProtocolAddress).ok_or(AdapterError::NotInitialized) -} - diff --git a/contracts/adapters/phoenix/src/test.rs b/contracts/adapters/phoenix/src/test.rs deleted file mode 100644 index 5a0ae18b..00000000 --- a/contracts/adapters/phoenix/src/test.rs +++ /dev/null @@ -1,102 +0,0 @@ -#![cfg(test)] -extern crate std; -use soroban_sdk::{ - Env, - Address, - BytesN, - Symbol, - String, - Vec, - Val, - IntoVal -}; -use crate::{SoroswapAggregatorPhoenixAdapter, SoroswapAggregatorPhoenixAdapterClient}; -use test_utils::phoenix_setup::{PhoenixTest, MultihopClient, TokenClient, PhoenixFactory}; -// use factory::SoroswapFactoryClient; -// use router::SoroswapRouterClient; - -mod deployer_contract { - soroban_sdk::contractimport!(file = "../../target/wasm32-unknown-unknown/release/soroswap_aggregator_deployer.optimized.wasm"); - pub type DeployerClient<'a> = Client<'a>; -} -use deployer_contract::DeployerClient; - -fn create_deployer<'a>(e: &Env) -> DeployerClient<'a> { - let deployer_address = &e.register(deployer_contract::WASM, ()); - let deployer = DeployerClient::new(e, deployer_address); - deployer -} - -// PhoenixAggregatorAdapter Contract -fn create_soroswap_aggregator_phoenix_adapter<'a>(e: &Env) -> SoroswapAggregatorPhoenixAdapterClient<'a> { - SoroswapAggregatorPhoenixAdapterClient::new(e, &e.register(SoroswapAggregatorPhoenixAdapter {}, ())) -} - -pub mod phoenix_adapter_contract { - soroban_sdk::contractimport!(file = "../../target/wasm32-unknown-unknown/release/phoenix_adapter.optimized.wasm"); - pub type SoroswapAggregatorPhoenixAdapterClientFromWasm<'a> = Client<'a>; -} -use phoenix_adapter_contract::SoroswapAggregatorPhoenixAdapterClientFromWasm; - -pub struct PhoenixAggregatorAdapterTest<'a> { - env: Env, - adapter_client: SoroswapAggregatorPhoenixAdapterClientFromWasm<'a>, - adapter_client_not_initialized: SoroswapAggregatorPhoenixAdapterClient<'a>, - factory_client: PhoenixFactory<'a>, - multihop_client: MultihopClient<'a>, - token_0: TokenClient<'a>, - token_1: TokenClient<'a>, - token_2: TokenClient<'a>, - token_3: TokenClient<'a>, - user: Address, - admin: Address -} - -impl<'a> PhoenixAggregatorAdapterTest<'a> { - fn setup() -> Self { - let test = PhoenixTest::phoenix_setup(); - - let wasm_hash = test.env.deployer().upload_contract_wasm(phoenix_adapter_contract::WASM); - let deployer_client = create_deployer(&test.env); - - let adapter_client_not_initialized = create_soroswap_aggregator_phoenix_adapter(&test.env); - // Deploy contract using deployer, and include an init function to call. - let salt = BytesN::from_array(&test.env, &[0; 32]); - let init_fn = Symbol::new(&test.env, &("initialize")); - - let protocol_id = String::from_str(&test.env, "phoenix"); - let protocol_address = test.multihop_client.address.clone(); - - // Convert the arguments into a Vec - let init_fn_args: Vec = (protocol_id.clone(), protocol_address.clone()).into_val(&test.env); - - test.env.mock_all_auths(); - let (contract_id, _init_result) = deployer_client.deploy( - &deployer_client.address, - &wasm_hash, - &salt, - &init_fn, - &init_fn_args, - ); - - let adapter_client = phoenix_adapter_contract::Client::new(&test.env, &contract_id); - - PhoenixAggregatorAdapterTest { - env: test.env, - adapter_client, - adapter_client_not_initialized, - factory_client: test.factory_client, - multihop_client: test.multihop_client, - token_0: test.token_0, - token_1: test.token_1, - token_2: test.token_2, - token_3: test.token_3, - user: test.user, - admin: test.admin - } - } -} - -pub mod initialize; -pub mod swap_exact_tokens_for_tokens; -pub mod swap_tokens_for_exact_tokens; \ No newline at end of file diff --git a/contracts/adapters/phoenix/src/test/initialize.rs b/contracts/adapters/phoenix/src/test/initialize.rs deleted file mode 100644 index 8f43e3a0..00000000 --- a/contracts/adapters/phoenix/src/test/initialize.rs +++ /dev/null @@ -1,75 +0,0 @@ -use soroban_sdk::String; -use crate::test::PhoenixAggregatorAdapterTest; -use adapter_interface::AdapterError; -use super::phoenix_adapter_contract::AdapterError as AdapterErrorDeployer; - -#[test] -fn test_initialize_and_get_values() { - let test = PhoenixAggregatorAdapterTest::setup(); - - test.adapter_client_not_initialized.initialize( - &String::from_str(&test.env, "phoenix"), - &test.multihop_client.address); - - let protocol_id = test.adapter_client_not_initialized.get_protocol_id(); - assert_eq!(protocol_id, String::from_str(&test.env, "phoenix")); - - let protocol_address = test.adapter_client_not_initialized.get_protocol_address(); - assert_eq!(protocol_address, test.multihop_client.address); -} - -#[test] -fn test_get_values() { - let test = PhoenixAggregatorAdapterTest::setup(); - - let protocol_id = test.adapter_client.get_protocol_id(); - assert_eq!(protocol_id, String::from_str(&test.env, "phoenix")); - - let protocol_address = test.adapter_client.get_protocol_address(); - assert_eq!(protocol_address, test.multihop_client.address); -} - -// test initialize twice -#[test] -fn test_initialize_twice() { - let test = PhoenixAggregatorAdapterTest::setup(); - - test.adapter_client_not_initialized.initialize( - &String::from_str(&test.env, "phoenix"), - &test.multihop_client.address); - - let result = test.adapter_client_not_initialized.try_initialize( - &String::from_str(&test.env, "phoenix"), - &test.multihop_client.address); - - assert_eq!(result,Err(Ok(AdapterError::AlreadyInitialized))); -} - -#[test] -fn test_initialize_twice_deployer() { - let test = PhoenixAggregatorAdapterTest::setup(); - - let result = test.adapter_client.try_initialize( - &String::from_str(&test.env, "phoenix"), - &test.multihop_client.address); - - assert_eq!(result,Err(Ok(AdapterErrorDeployer::AlreadyInitialized))); -} - -// test get protocol id not initialized -#[test] -fn test_get_protocol_id_not_initialized() { - let test = PhoenixAggregatorAdapterTest::setup(); - - let result = test.adapter_client_not_initialized.try_get_protocol_id(); - assert_eq!(result,Err(Ok(AdapterError::NotInitialized))); -} - -// test get protocol address not initialized -#[test] -fn test_get_protocol_address_not_initialized() { - let test = PhoenixAggregatorAdapterTest::setup(); - - let result = test.adapter_client_not_initialized.try_get_protocol_address(); - assert_eq!(result,Err(Ok(AdapterError::NotInitialized))); -} diff --git a/contracts/adapters/phoenix/src/test/swap_exact_tokens_for_tokens.rs b/contracts/adapters/phoenix/src/test/swap_exact_tokens_for_tokens.rs deleted file mode 100644 index 6eb31d78..00000000 --- a/contracts/adapters/phoenix/src/test/swap_exact_tokens_for_tokens.rs +++ /dev/null @@ -1,1204 +0,0 @@ -#[cfg(test)] -use soroban_sdk::{Address, vec, Vec}; -use crate::test::{PhoenixAggregatorAdapterTest}; -use test_utils::phoenix_setup::deploy_and_initialize_lp; -use adapter_interface::AdapterError; -use super::phoenix_adapter_contract::AdapterError as AdapterErrorDeployer; - -#[test] -fn swap_exact_tokens_for_tokens_not_initialized() { - let test = PhoenixAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - let path: Vec
= Vec::new(&test.env); - - let result = test.adapter_client_not_initialized.try_swap_exact_tokens_for_tokens( - &0, // amount_in - &0, // amount_out_min - &path, // path - &test.user, // to - &0, // deadline - &None - ); - - assert_eq!(result,Err(Ok(AdapterError::NotInitialized))); - -} - -#[test] -fn swap_exact_tokens_for_tokens_amount_in_negative() { - let test = PhoenixAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let path: Vec
= Vec::new(&test.env); - - let result = test.adapter_client.try_swap_exact_tokens_for_tokens( - &-1, // amount_in - &0, // amount_out_min - &path, // path - &test.user, // to - &0, // deadline - &None - ); - - assert_eq!( - result, - Err(Ok(AdapterErrorDeployer::NegativeNotAllowed)) - ); -} - -#[test] -fn swap_exact_tokens_for_tokens_amount_out_min_negative() { - let test = PhoenixAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let path: Vec
= Vec::new(&test.env); - - let result = test.adapter_client.try_swap_exact_tokens_for_tokens( - &0, // amount_in - &-1, // amount_out_min - &path, // path - &test.user, // to - &0, // deadline - &None - ); - - assert_eq!( - result, - Err(Ok(AdapterErrorDeployer::NegativeNotAllowed)) - ); -} - -#[test] -fn swap_exact_tokens_for_tokens_expired() { - let test = PhoenixAggregatorAdapterTest::setup(); - - let path: Vec
= Vec::new(&test.env); - - let result = test.adapter_client.try_swap_exact_tokens_for_tokens( - &0, // amount_in - &0, // amount_out_min - &path, // path - &test.user, // to - &0, // deadline - &None - ); - - assert_eq!( - result, - Err(Ok(AdapterErrorDeployer::DeadlineExpired)) - ); -} - - - -#[test] -#[should_panic] // TODO: Test the imported error -fn try_swap_exact_tokens_for_tokens_invalid_path() { - let test = PhoenixAggregatorAdapterTest::setup(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - let path: Vec
= vec![&test.env, test.token_0.address.clone()]; - test.adapter_client.swap_exact_tokens_for_tokens( - &0, // amount_in - &0, // amount_out_min - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); -} - -#[test] -#[should_panic] // TODO: Test the imported error -fn try_swap_exact_tokens_for_tokens_insufficient_input_amount() { - let test = PhoenixAggregatorAdapterTest::setup(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let mut path: Vec
= Vec::new(&test.env); - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_1.address.clone()); - - test.env.cost_estimate().budget().reset_unlimited(); - test.adapter_client.swap_exact_tokens_for_tokens( - &0, // amount_in - &0, // amount_out_min - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); - // assert_eq!(result, Err(Ok(CombinedRouterError::LibraryInsufficientInputAmount))); -} - - - -#[test] -// #[should_panic] // TODO: Change to an error object (If we dont delete this check) -// TODO: Check why it fails with the adapter_client? -// #[should_panic(expected = "Amount of token out received is less than the minimum amount expected")] -#[should_panic(expected = "HostError: Error(WasmVm, InvalidAction)")] //TODO: Why it changed using the deployer? -fn swap_exact_tokens_for_tokens_insufficient_output_amount() { - let test = PhoenixAggregatorAdapterTest::setup(); - // test.adapter_client_not_initialized.initialize( - // &String::from_str(&test.env, "phoenix"), - // &test.multihop_client.address); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let mut path: Vec
= Vec::new(&test.env); - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_1.address.clone()); - path.push_back(test.token_2.address.clone()); - path.push_back(test.token_3.address.clone()); - - let amount_in = 50i128; - // The next taken from phoenix contract tests - let expected_amount_out = 50i128; - - test.env.cost_estimate().budget().reset_unlimited(); - test.adapter_client.swap_exact_tokens_for_tokens( - &amount_in, // amount_in - &(expected_amount_out + 1), // amount_out_min - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); -} - - - -#[test] -fn swap_exact_tokens_for_tokens_enough_output_amount() { - let test = PhoenixAggregatorAdapterTest::setup(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let mut path: Vec
= Vec::new(&test.env); - - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_1.address.clone()); - path.push_back(test.token_2.address.clone()); - path.push_back(test.token_3.address.clone()); - - let amount_in = 500i128; - // The next taken from phoenix contract tests - // TODO: Check with future versions of phoenix - let expected_amount_out = 500i128; - - let initial_user_balance_0 = test.token_0.balance(&test.user); - let initial_user_balance_1 = test.token_1.balance(&test.user); - let initial_user_balance_2 = test.token_2.balance(&test.user); - let initial_user_balance_3 = test.token_3.balance(&test.user); - - let token_out_address = path.get(path.len() - 1).expect("Failed to get token out address"); - - assert_eq!(token_out_address, test.token_3.address); - - test.env.cost_estimate().budget().reset_unlimited(); - let executed_amounts = test.adapter_client.swap_exact_tokens_for_tokens( - &amount_in, // amount_in - &(expected_amount_out), // amount_out_min - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); - - - assert_eq!(test.token_0.balance(&test.user), initial_user_balance_0 - amount_in); - assert_eq!(test.token_1.balance(&test.user), initial_user_balance_1); - assert_eq!(test.token_2.balance(&test.user), initial_user_balance_2); - assert_eq!(test.token_3.balance(&test.user), initial_user_balance_3 + expected_amount_out); - - // WE NEED TO RETURN THE VALUES - assert_eq!(executed_amounts.get(0).unwrap(), amount_in); - assert_eq!(executed_amounts.get(1).unwrap(), expected_amount_out); -} - - - -#[test] -fn swap_exact_tokens_for_tokens_enough_output_amount_with_fees() { - let test = PhoenixAggregatorAdapterTest::setup(); - - // we will make a pool betwern token 0 and token 2 with fees - deploy_and_initialize_lp( - &test.env, - &test.factory_client, - test.admin.clone(), - test.token_0.address.clone(), - 1_000_000, - test.token_2.address.clone(), - 1_000_000, - Some(2000), - ); - - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let mut path: Vec
= Vec::new(&test.env); - - path.push_back(test.token_0.address.clone()); - // path.push_back(test.token_1.address.clone()); - path.push_back(test.token_2.address.clone()); - // path.push_back(test.token_3.address.clone()); - - let amount_in = 300i128; - // The next taken from phoenix contract tests - // TODO: Check with future versions of phoenix - // 1000 tokens initially - // swap 300 from token0 to token1 with 2000 bps (20%) - // tokens1 will be 240 - let expected_amount_out = 240i128; - - let initial_user_balance_0 = test.token_0.balance(&test.user); - // let initial_user_balance_1 = test.token_1.balance(&test.user); - let initial_user_balance_2 = test.token_2.balance(&test.user); - // let initial_user_balance_3 = test.token_3.balance(&test.user); - - test.env.cost_estimate().budget().reset_unlimited(); - let executed_amounts = test.adapter_client.swap_exact_tokens_for_tokens( - &amount_in, // amount_in - &(expected_amount_out), // amount_out_min - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); - - - assert_eq!(test.token_0.balance(&test.user), initial_user_balance_0 - amount_in); - assert_eq!(test.token_2.balance(&test.user), initial_user_balance_2 + expected_amount_out); - - // WE NEED TO RETURN THE VALUES - assert_eq!(executed_amounts.get(0).unwrap(), amount_in); - assert_eq!(executed_amounts.get(1).unwrap(), expected_amount_out); -} - - -// use crate::factory_contract::PoolType; -// // FIXM: Disable Referral struct -// // use crate::lp_contract::Referral; -// use crate::storage::Swap; -// use crate::tests::setup::{ -// deploy_and_initialize_factory, deploy_and_initialize_pool, deploy_and_mint_tokens, -// deploy_multihop_contract, deploy_token_contract, -// }; - -// use soroban_sdk::contracterror; -// use soroban_sdk::{testutils::Address as _, vec, Address, Env}; - -// #[contracterror] -// #[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] -// #[repr(u32)] -// pub enum ContractError { -// SpreadExceedsLimit = 1, -// } - -// #[test] -// fn swap_three_equal_pools_no_fees() { -// let env = Env::default(); - -// let admin = Address::generate(&env); - -// env.mock_all_auths(); -// env.cost_estimate().budget().reset_unlimited(); - -// let token1 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); -// let token2 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); -// let token3 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); -// let token4 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); - -// // 1. deploy factory -// let factory_client = deploy_and_initialize_factory(&env, admin.clone()); - -// deploy_and_initialize_pool( -// &env, -// &factory_client, -// admin.clone(), -// token1.address.clone(), -// 1_000_000, -// token2.address.clone(), -// 1_000_000, -// None, -// PoolType::Xyk, -// ); -// deploy_and_initialize_pool( -// &env, -// &factory_client, -// admin.clone(), -// token2.address.clone(), -// 1_000_000, -// token3.address.clone(), -// 1_000_000, -// None, -// PoolType::Xyk, -// ); -// deploy_and_initialize_pool( -// &env, -// &factory_client, -// admin.clone(), -// token3.address.clone(), -// 1_000_000, -// token4.address.clone(), -// 1_000_000, -// None, -// PoolType::Xyk, -// ); - -// // 4. swap with multihop -// let multihop = deploy_multihop_contract(&env, admin.clone(), &factory_client.address); -// let recipient = Address::generate(&env); -// token1.mint(&recipient, &50i128); -// assert_eq!(token1.balance(&recipient), 50i128); -// assert_eq!(token4.balance(&recipient), 0i128); - -// let swap1 = Swap { -// offer_asset: token1.address.clone(), -// ask_asset: token2.address.clone(), -// ask_asset_min_amount: None::, -// }; -// let swap2 = Swap { -// offer_asset: token2.address.clone(), -// ask_asset: token3.address.clone(), -// ask_asset_min_amount: None::, -// }; -// let swap3 = Swap { -// offer_asset: token3.address.clone(), -// ask_asset: token4.address.clone(), -// ask_asset_min_amount: None::, -// }; - -// let operations = vec![&env, swap1, swap2, swap3]; - -// // FIXM: Disable Referral struct -// // multihop.swap(&recipient, &None, &operations, &None, &None, &50i128); -// multihop.swap( -// &recipient, -// &operations, -// &None, -// &50i128, -// &PoolType::Xyk, -// &None::, -// ); - -// // 5. check if it goes according to plan -// assert_eq!(token1.balance(&recipient), 0i128); -// assert_eq!(token4.balance(&recipient), 50i128); -// } - -// // FIXM: Disable Referral struct -// #[ignore] -// #[test] -// fn swap_three_equal_pools_no_fees_referral_fee() { -// let env = Env::default(); - -// let admin = Address::generate(&env); - -// env.mock_all_auths(); -// env.cost_estimate().budget().reset_unlimited(); - -// let token1 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); -// let token2 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); -// let token3 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); -// let token4 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); - -// // 1. deploy factory -// let factory_client = deploy_and_initialize_factory(&env, admin.clone()); - -// deploy_and_initialize_pool( -// &env, -// &factory_client, -// admin.clone(), -// token1.address.clone(), -// 1_000_000, -// token2.address.clone(), -// 1_000_000, -// None, -// PoolType::Xyk, -// ); -// deploy_and_initialize_pool( -// &env, -// &factory_client, -// admin.clone(), -// token2.address.clone(), -// 1_000_000, -// token3.address.clone(), -// 1_000_000, -// None, -// PoolType::Xyk, -// ); -// deploy_and_initialize_pool( -// &env, -// &factory_client, -// admin.clone(), -// token3.address.clone(), -// 1_000_000, -// token4.address.clone(), -// 1_000_000, -// None, -// PoolType::Xyk, -// ); - -// // 4. swap with multihop -// let multihop = deploy_multihop_contract(&env, admin.clone(), &factory_client.address); -// let recipient = Address::generate(&env); -// token1.mint(&recipient, &50i128); -// assert_eq!(token1.balance(&recipient), 50i128); -// assert_eq!(token4.balance(&recipient), 0i128); - -// let swap1 = Swap { -// offer_asset: token1.address.clone(), -// ask_asset: token2.address.clone(), -// ask_asset_min_amount: None::, -// }; -// let swap2 = Swap { -// offer_asset: token2.address.clone(), -// ask_asset: token3.address.clone(), -// ask_asset_min_amount: None::, -// }; -// let swap3 = Swap { -// offer_asset: token3.address.clone(), -// ask_asset: token4.address.clone(), -// ask_asset_min_amount: None::, -// }; - -// let operations = vec![&env, swap1, swap2, swap3]; -// let referral_addr = Address::generate(&env); -// // FIXM: Disable Referral struct -// // let referral = Referral { -// // address: referral_addr.clone(), -// // fee: 1_000, -// // }; - -// // multihop.swap( -// // &recipient, -// // &Some(referral), -// // &operations, -// // &None, -// // &None, -// // &50i128, -// // ); -// multihop.swap( -// &recipient, -// &operations, -// &None, -// &50i128, -// &PoolType::Xyk, -// &None::, -// ); - -// // 5. check if it goes according to plan -// assert_eq!(token1.balance(&recipient), 0i128); -// assert_eq!(token4.balance(&recipient), 37i128); -// // referral fee from first swap should be 5 (10% out of 50) -// assert_eq!(token2.balance(&referral_addr), 5i128); -// // referral fee from 2nd swap should be 4 (10% out of 45) rounded down -// assert_eq!(token3.balance(&referral_addr), 4i128); -// // referral fee from the last swap should also be 4 (10% out of 41) rounded down -// assert_eq!(token4.balance(&referral_addr), 4i128); -// } - -// #[test] -// fn swap_single_pool_no_fees() { -// let env = Env::default(); -// let admin = Address::generate(&env); - -// env.mock_all_auths(); -// env.cost_estimate().budget().reset_unlimited(); - -// let token1 = deploy_and_mint_tokens(&env, &admin, 1_001_000i128); -// let token2 = deploy_and_mint_tokens(&env, &admin, 1_001_000i128); - -// // 1. deploy factory -// let factory_client = deploy_and_initialize_factory(&env, admin.clone()); - -// deploy_and_initialize_pool( -// &env, -// &factory_client, -// admin.clone(), -// token1.address.clone(), -// 1_000_000, -// token2.address.clone(), -// 1_000_000, -// None, -// PoolType::Xyk, -// ); - -// // 4. swap with multihop -// let multihop = deploy_multihop_contract(&env, admin.clone(), &factory_client.address); -// let recipient = Address::generate(&env); -// token1.mint(&recipient, &5_000i128); // mints 50 token0 to recipient -// assert_eq!(token1.balance(&recipient), 5_000i128); -// assert_eq!(token2.balance(&recipient), 0i128); - -// let swap1 = Swap { -// offer_asset: token1.address.clone(), -// ask_asset: token2.address.clone(), -// ask_asset_min_amount: None::, -// }; - -// let operations = vec![&env, swap1]; - -// // FIXM: Disable Referral struct -// // multihop.swap(&recipient, /*&None,*/ &operations, &None, &None, &50i128); -// multihop.swap( -// &recipient, -// &operations, -// &None, -// &1_000, -// &PoolType::Xyk, -// &None::, -// ); - -// // 5. check if it goes according to plan -// assert_eq!(token1.balance(&recipient), 4_000i128); // -1_000 token0 -// assert_eq!(token2.balance(&recipient), 1_000i128); // +1_000 token1 -// } - -// #[test] -// /// Asserting HostError, because of panic messages are not propagated and IIUC are normally compiled out -// #[should_panic(expected = "HostError: Error(Contract, #1)")] -// fn swap_should_fail_when_spread_exceeds_the_limit() { -// let env = Env::default(); -// let admin = Address::generate(&env); - -// env.mock_all_auths(); -// env.cost_estimate().budget().reset_unlimited(); - -// let token1 = deploy_and_mint_tokens(&env, &admin, 1_001_000i128); -// let token2 = deploy_and_mint_tokens(&env, &admin, 3_001_000i128); - -// let factory_client = deploy_and_initialize_factory(&env, admin.clone()); - -// deploy_and_initialize_pool( -// &env, -// &factory_client, -// admin.clone(), -// token1.address.clone(), -// 5_000, -// token2.address.clone(), -// 2_000_000, -// None, -// PoolType::Xyk, -// ); - -// let multihop = deploy_multihop_contract(&env, admin.clone(), &factory_client.address); -// let recipient = Address::generate(&env); -// token1.mint(&recipient, &5_000i128); // mints 50 token0 to recipient - -// let swap1 = Swap { -// offer_asset: token1.address.clone(), -// ask_asset: token2.address.clone(), -// ask_asset_min_amount: None::, -// }; - -// let operations = vec![&env, swap1]; - -// // FIXM: Disable Referral struct -// // multihop.swap(&recipient, &None, &operations, &None, &Some(50), &50); -// multihop.swap( -// &recipient, -// &operations, -// &Some(50), -// &50, -// &PoolType::Xyk, -// &None::, -// ); -// } - -// #[test] -// fn swap_single_pool_with_fees() { -// let env = Env::default(); -// let admin = Address::generate(&env); - -// env.mock_all_auths(); -// env.cost_estimate().budget().reset_unlimited(); - -// let token1 = deploy_and_mint_tokens(&env, &admin, 1_001_000i128); -// let token2 = deploy_and_mint_tokens(&env, &admin, 1_001_000i128); - -// // 1. deploy factory -// let factory_client = deploy_and_initialize_factory(&env, admin.clone()); - -// deploy_and_initialize_pool( -// &env, -// &factory_client, -// admin.clone(), -// token1.address.clone(), -// 1_000_000, -// token2.address.clone(), -// 1_000_000, -// Some(2000), -// PoolType::Xyk, -// ); - -// // 4. swap with multihop -// let multihop = deploy_multihop_contract(&env, admin.clone(), &factory_client.address); -// let recipient = Address::generate(&env); -// token1.mint(&recipient, &1000i128); -// assert_eq!(token1.balance(&recipient), 1000i128); -// assert_eq!(token2.balance(&recipient), 0i128); - -// let swap1 = Swap { -// offer_asset: token1.address.clone(), -// ask_asset: token2.address.clone(), -// ask_asset_min_amount: None::, -// }; - -// let operations = vec![&env, swap1]; - -// // FIXM: Disable Referral struct -// // multihop.swap(&recipient, &None, &operations, &None, &None, &300i128); -// multihop.swap( -// &recipient, -// &operations, -// &None, -// &300i128, -// &PoolType::Xyk, -// &None::, -// ); - -// // 5. check if it goes according to plan -// // 1000 tokens initially -// // swap 300 from token0 to token1 with 2000 bps (20%) -// // tokens1 will be 240 -// assert_eq!(token1.balance(&recipient), 700i128); -// assert_eq!(token2.balance(&recipient), 240i128); -// } - -// #[test] -// fn swap_three_different_pools_no_fees() { -// let env = Env::default(); - -// let admin = Address::generate(&env); - -// env.mock_all_auths(); -// env.cost_estimate().budget().reset_unlimited(); - -// let token1 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); -// let token2 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); -// let token3 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); -// let token4 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); - -// // 1. deploy factory -// let factory_client = deploy_and_initialize_factory(&env, admin.clone()); - -// deploy_and_initialize_pool( -// &env, -// &factory_client, -// admin.clone(), -// token1.address.clone(), -// 1_000_000, -// token2.address.clone(), -// 1_000_000, -// None, -// PoolType::Xyk, -// ); -// deploy_and_initialize_pool( -// &env, -// &factory_client, -// admin.clone(), -// token2.address.clone(), -// 2_000_000, -// token3.address.clone(), -// 2_000_000, -// None, -// PoolType::Xyk, -// ); -// deploy_and_initialize_pool( -// &env, -// &factory_client, -// admin.clone(), -// token3.address.clone(), -// 3_000_000, -// token4.address.clone(), -// 3_000_000, -// None, -// PoolType::Xyk, -// ); - -// // 4. swap with multihop -// let multihop = deploy_multihop_contract(&env, admin.clone(), &factory_client.address); -// let recipient = Address::generate(&env); -// token1.mint(&recipient, &5_000i128); - -// assert_eq!(token1.balance(&recipient), 5_000i128); -// assert_eq!(token4.balance(&recipient), 0i128); - -// let swap1 = Swap { -// offer_asset: token1.address.clone(), -// ask_asset: token2.address.clone(), -// ask_asset_min_amount: None::, -// }; -// let swap2 = Swap { -// offer_asset: token2.address.clone(), -// ask_asset: token3.address.clone(), -// ask_asset_min_amount: None::, -// }; -// let swap3 = Swap { -// offer_asset: token3.address.clone(), -// ask_asset: token4.address.clone(), -// ask_asset_min_amount: None::, -// }; - -// let operations = vec![&env, swap1, swap2, swap3]; - -// // FIXM: Disable Referral struct -// // multihop.swap(&recipient, &None, &operations, &None, &None, &5_000i128); -// multihop.swap( -// &recipient, -// &operations, -// &None, -// &5_000i128, -// &PoolType::Xyk, -// &None::, -// ); - -// // 5. check if it goes according to plan -// assert_eq!(token1.balance(&recipient), 0i128); -// assert_eq!( -// token4.balance(&recipient), -// 4_956i128, -// "token4 not as expected" -// ); -// } - -// #[test] -// fn swap_three_different_pools_with_fees() { -// let env = Env::default(); - -// let admin = Address::generate(&env); - -// env.mock_all_auths(); -// env.cost_estimate().budget().reset_unlimited(); - -// let token1 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); -// let token2 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); -// let token3 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); -// let token4 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); - -// // 1. deploy factory -// let factory_client = deploy_and_initialize_factory(&env, admin.clone()); - -// deploy_and_initialize_pool( -// &env, -// &factory_client, -// admin.clone(), -// token1.address.clone(), -// 1_000_000, -// token2.address.clone(), -// 1_000_000, -// Some(1_000), -// PoolType::Xyk, -// ); -// deploy_and_initialize_pool( -// &env, -// &factory_client, -// admin.clone(), -// token2.address.clone(), -// 2_000_000, -// token3.address.clone(), -// 2_000_000, -// Some(1_000), -// PoolType::Xyk, -// ); -// deploy_and_initialize_pool( -// &env, -// &factory_client, -// admin.clone(), -// token3.address.clone(), -// 3_000_000, -// token4.address.clone(), -// 3_000_000, -// Some(1_000), -// PoolType::Xyk, -// ); - -// // 4. swap with multihop -// let multihop = deploy_multihop_contract(&env, admin.clone(), &factory_client.address); -// let recipient = Address::generate(&env); -// token1.mint(&recipient, &10_000i128); -// assert_eq!(token1.balance(&recipient), 10_000i128); - -// let swap1 = Swap { -// offer_asset: token1.address.clone(), -// ask_asset: token2.address.clone(), -// ask_asset_min_amount: None::, -// }; -// let swap2 = Swap { -// offer_asset: token2.address.clone(), -// ask_asset: token3.address.clone(), -// ask_asset_min_amount: None::, -// }; -// let swap3 = Swap { -// offer_asset: token3.address.clone(), -// ask_asset: token4.address.clone(), -// ask_asset_min_amount: None::, -// }; - -// let operations = vec![&env, swap1, swap2, swap3]; - -// // FIXM: Disable Referral struct -// // multihop.swap(&recipient, &None, &operations, &None, &None, &10_000i128); -// multihop.swap( -// &recipient, -// &operations, -// &None, -// &10_000i128, -// &PoolType::Xyk, -// &None::, -// ); - -// // we start swapping 10_000 tokens - -// // token1 => token2 -// // (10_000 * 1_000_000) / (10_000 + 1_000_000) -// // 10_000_000_000 / 1_010_000 -// // 9900.99009901 -// // 9901 - 10% = 8911 - -// // token2 => token3 -// // (8911 * 2_000_000) / (8911 + 2_000_000) -// // 17_822_000_000 / 2_008_911 -// // 8871.47315137 -// // 8872 - 10% = 7985 - -// // token3 => token4 -// // (7985 * 3_000_000) / (7985 + 3_000_000) -// // 23_955_000_000 / 3_007_985 -// // 7963.80301099 -// // 7964 - 10% = 7168 -// assert_eq!(token1.balance(&recipient), 0i128); -// assert_eq!(token2.balance(&recipient), 0i128); -// assert_eq!(token3.balance(&recipient), 0i128); -// assert_eq!(token4.balance(&recipient), 7_168i128); -// } - -// #[test] -// #[should_panic(expected = "Multihop: Swap: operations is empty!")] -// fn swap_panics_with_no_operations() { -// let env = Env::default(); -// env.mock_all_auths(); -// let admin = Address::generate(&env); -// let factory = Address::generate(&env); -// let recipient = Address::generate(&env); - -// let token = deploy_token_contract(&env, &admin); -// token.mint(&recipient, &50i128); - -// let multihop = deploy_multihop_contract(&env, admin, &factory); - -// let swap_vec = vec![&env]; - -// // FIXM: Disable Referral struct -// // multihop.swap(&recipient, &None, &swap_vec, &None, &None, &50i128); -// multihop.swap( -// &recipient, -// &swap_vec, -// &None, -// &50i128, -// &PoolType::Xyk, -// &None::, -// ); -// } - -// #[test] -// fn test_v_phx_vul_013_add_belief_price_for_every_swap() { -// let env = Env::default(); - -// let admin = Address::generate(&env); - -// env.mock_all_auths(); -// env.cost_estimate().budget().reset_unlimited(); - -// let token1 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); -// let token2 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); -// let token3 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); -// let token4 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); - -// let factory_client = deploy_and_initialize_factory(&env, admin.clone()); -// deploy_and_initialize_pool( -// &env, -// &factory_client, -// admin.clone(), -// token1.address.clone(), -// 1_000_000, -// token2.address.clone(), -// 1_000_000, -// None, -// PoolType::Xyk, -// ); -// deploy_and_initialize_pool( -// &env, -// &factory_client, -// admin.clone(), -// token2.address.clone(), -// 2_000_000, -// token3.address.clone(), -// 2_000_000, -// None, -// PoolType::Xyk, -// ); -// deploy_and_initialize_pool( -// &env, -// &factory_client, -// admin.clone(), -// token3.address.clone(), -// 3_000_000, -// token4.address.clone(), -// 3_000_000, -// None, -// PoolType::Xyk, -// ); - -// let multihop = deploy_multihop_contract(&env, admin.clone(), &factory_client.address); -// let recipient = Address::generate(&env); -// token1.mint(&recipient, &5_000i128); - -// let swap1 = Swap { -// offer_asset: token1.address.clone(), -// ask_asset: token2.address.clone(), -// ask_asset_min_amount: Some(1_050), -// }; -// let swap2 = Swap { -// offer_asset: token2.address.clone(), -// ask_asset: token3.address.clone(), -// ask_asset_min_amount: Some(2_100), -// }; -// let swap3 = Swap { -// offer_asset: token3.address.clone(), -// ask_asset: token4.address.clone(), -// ask_asset_min_amount: Some(3_150), -// }; - -// let operations = vec![&env, swap1, swap2, swap3]; - -// multihop.swap( -// &recipient, -// &operations, -// &None, -// &5_000i128, -// &PoolType::Xyk, -// &None::, -// ); - -// assert_eq!( -// token1.balance(&recipient), -// 0i128, -// "token1 balance incorrect" -// ); -// assert_eq!( -// token4.balance(&recipient), -// 4_956i128, -// "token4 balance incorrect" -// ); -// } - -// #[test] -// #[should_panic(expected = "Error(Contract, #21)")] -// fn test_swap_with_ask_asset_min_amount() { -// let env = Env::default(); -// let admin = Address::generate(&env); - -// env.mock_all_auths(); -// env.cost_estimate().budget().reset_unlimited(); - -// let token1 = deploy_and_mint_tokens(&env, &admin, 1_001_000i128); -// let token2 = deploy_and_mint_tokens(&env, &admin, 1_001_000i128); - -// let factory_client = deploy_and_initialize_factory(&env, admin.clone()); - -// deploy_and_initialize_pool( -// &env, -// &factory_client, -// admin.clone(), -// token1.address.clone(), -// 1_000_000, -// token2.address.clone(), -// 1_000_000, -// None, -// PoolType::Xyk, -// ); - -// let multihop = deploy_multihop_contract(&env, admin.clone(), &factory_client.address); -// let recipient = Address::generate(&env); -// token1.mint(&recipient, &5_000i128); -// assert_eq!(token1.balance(&recipient), 5_000i128); -// assert_eq!(token2.balance(&recipient), 0i128); - -// let swap1 = Swap { -// offer_asset: token1.address.clone(), -// ask_asset: token2.address.clone(), -// ask_asset_min_amount: Some(1_000), -// }; - -// let operations = vec![&env, swap1]; - -// multihop.swap( -// &recipient, -// &operations, -// &None, -// &1_000, -// &PoolType::Xyk, -// &None::, -// ); - -// assert_eq!(token1.balance(&recipient), 4_000i128); -// assert_eq!(token2.balance(&recipient), 1_000i128); - -// let greedy_swap = Swap { -// offer_asset: token1.address.clone(), -// ask_asset: token2.address.clone(), -// ask_asset_min_amount: Some(10_000), -// }; -// let operations = vec![&env, greedy_swap]; -// multihop.swap( -// &recipient, -// &operations, -// &None, -// &1_000, -// &PoolType::Xyk, -// &None::, -// ); -// } - -// #[test] -// #[ignore = "fails with NewtonMethodFailed "] -// fn swap_three_equal_stable_pool() { -// let env = Env::default(); - -// let admin = Address::generate(&env); - -// env.mock_all_auths(); -// env.cost_estimate().budget().reset_unlimited(); - -// let token1 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); -// let token2 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); -// let token3 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); -// let token4 = deploy_and_mint_tokens(&env, &admin, 10_000_000i128); - -// // 1. deploy factory -// let factory_client = deploy_and_initialize_factory(&env, admin.clone()); - -// deploy_and_initialize_pool( -// &env, -// &factory_client, -// admin.clone(), -// token1.address.clone(), -// 1_000_000, -// token2.address.clone(), -// 1_000_000, -// None, -// PoolType::Stable, -// ); -// deploy_and_initialize_pool( -// &env, -// &factory_client, -// admin.clone(), -// token2.address.clone(), -// 1_000_000, -// token3.address.clone(), -// 1_000_000, -// None, -// PoolType::Stable, -// ); -// deploy_and_initialize_pool( -// &env, -// &factory_client, -// admin.clone(), -// token3.address.clone(), -// 1_000_000, -// token4.address.clone(), -// 1_000_000, -// None, -// PoolType::Stable, -// ); - -// // 4. swap with multihop -// let multihop = deploy_multihop_contract(&env, admin.clone(), &factory_client.address); -// let recipient = Address::generate(&env); -// token1.mint(&recipient, &50i128); -// assert_eq!(token1.balance(&recipient), 50i128); -// assert_eq!(token4.balance(&recipient), 0i128); - -// let swap1 = Swap { -// offer_asset: token1.address.clone(), -// ask_asset: token2.address.clone(), -// ask_asset_min_amount: None::, -// }; -// let swap2 = Swap { -// offer_asset: token2.address.clone(), -// ask_asset: token3.address.clone(), -// ask_asset_min_amount: None::, -// }; -// let swap3 = Swap { -// offer_asset: token3.address.clone(), -// ask_asset: token4.address.clone(), -// ask_asset_min_amount: None::, -// }; - -// let operations = vec![&env, swap1, swap2, swap3]; - -// multihop.swap( -// &recipient, -// &operations, -// &None, -// &50i128, -// &PoolType::Stable, -// &None::, -// ); - -// assert_eq!(token1.balance(&recipient), 0i128); -// assert_eq!(token4.balance(&recipient), 50i128); -// } - -// #[test] -// fn swap_exact_tokens_for_tokens_2_hops() { -// let test = PhoenixAggregatorAdapterTest::setup(); -// test.env.cost_estimate().budget().reset_unlimited(); -// test.adapter_client.initialize( -// &String::from_str(&test.env, "phoenix"), -// &test.multihop_client.address); - -// let deadline: u64 = test.env.ledger().timestamp() + 1000; -// let initial_user_balance = 20_000_000_000_000_000_000; -// let amount_0: i128 = 1_000_000_000_000_000_000; -// let amount_1: i128 = 4_000_000_000_000_000_000; -// let amount_2: i128 = 8_000_000_000_000_000_000; - - -// let mut path: Vec
= Vec::new(&test.env); -// path.push_back(test.token_0.address.clone()); -// path.push_back(test.token_1.address.clone()); -// path.push_back(test.token_2.address.clone()); - - -// let amount_in = 123_456_789; -// // fee = 123456789 * 3 /1000 = 370370,367 = 370371 // USE CEILING -// // amount_in less fee = 123456789- 370371 = 123086418 -// // First out = (123086418*4000000000000000000)/(1000000000000000000 + 123086418) = 492345671.939398935 = 492345671 -// let first_out = 492345671; -// // fee = 492345671 * 3 /1000 = 1477037.013 = 1477038 // USE CEILING -// // in less fee = 492345671 - 1477038 = 490868633 -// // Second out = (490868633*8000000000000000000)/(4000000000000000000 + 490868633) = 981737265.879523993 = 981737265 -// let expected_amount_out = 981737265; - -// let executed_amounts = test.adapter_client.swap_exact_tokens_for_tokens( -// &amount_in, //amount_in -// &0, // amount_out_min -// &path, // path -// &test.user, // to -// &deadline); // deadline - -// assert_eq!(executed_amounts.get(0).unwrap(), amount_in); -// assert_eq!(executed_amounts.get(1).unwrap(), first_out); -// assert_eq!(executed_amounts.get(2).unwrap(), expected_amount_out); - -// assert_eq!(test.token_0.balance(&test.user), initial_user_balance - amount_0 - amount_in); -// assert_eq!(test.token_1.balance(&test.user), initial_user_balance - amount_1*2); -// assert_eq!(test.token_2.balance(&test.user), initial_user_balance -amount_2 + expected_amount_out); -// } - diff --git a/contracts/adapters/phoenix/src/test/swap_tokens_for_exact_tokens.rs b/contracts/adapters/phoenix/src/test/swap_tokens_for_exact_tokens.rs deleted file mode 100644 index 23ae14e7..00000000 --- a/contracts/adapters/phoenix/src/test/swap_tokens_for_exact_tokens.rs +++ /dev/null @@ -1,281 +0,0 @@ -use soroban_sdk::{Address, vec, Vec}; -use crate::test::PhoenixAggregatorAdapterTest; -use adapter_interface::AdapterError; -use soroban_sdk::testutils::Ledger; -use super::phoenix_adapter_contract::AdapterError as AdapterErrorDeployer; - - -#[test] -fn swap_tokens_for_exact_tokens_not_initialized() { - let test = PhoenixAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - let path: Vec
= Vec::new(&test.env); - - let result = test.adapter_client_not_initialized.try_swap_tokens_for_exact_tokens( - &0, // amount_out - &0, // amount_in_max - &path, // path - &test.user, // to - &0, // deadline - &None - ); - - assert_eq!(result,Err(Ok(AdapterError::NotInitialized))); - -} - -#[test] -fn swap_tokens_for_exact_tokens_amount_out_negative() { - let test = PhoenixAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let path: Vec
= Vec::new(&test.env); - - let result = test.adapter_client.try_swap_tokens_for_exact_tokens( - &-1, // amount_out - &0, // amount_in_max - &path, // path - &test.user, // to - &0, // deadline - &None - ); - - assert_eq!( - result, - Err(Ok(AdapterErrorDeployer::NegativeNotAllowed)) - ); -} - -#[test] -fn swap_tokens_for_exact_tokens_amount_in_max_negative() { - let test = PhoenixAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let path: Vec
= Vec::new(&test.env); - - let result = test.adapter_client.try_swap_tokens_for_exact_tokens( - &0, // amount_out - &-1, // amount_in_max - &path, // path - &test.user, // to - &0, // deadline - &None - ); - - assert_eq!( - result, - Err(Ok(AdapterErrorDeployer::NegativeNotAllowed)) - ); -} - -#[test] -fn swap_tokens_for_exact_tokens_expired() { - let test = PhoenixAggregatorAdapterTest::setup(); - - let path: Vec
= Vec::new(&test.env); - - let result = test.adapter_client.try_swap_tokens_for_exact_tokens( - &0, // amount_out - &0, // amount_in_max - &path, // path - &test.user, // to - &0, // deadline - &None - ); - - assert_eq!( - result, - Err(Ok(AdapterErrorDeployer::DeadlineExpired)) - ); -} - - -#[test] -#[should_panic] // TODO: Test the imported error -fn try_swap_tokens_for_exact_tokens_invalid_path() { - let test = PhoenixAggregatorAdapterTest::setup(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let path: Vec
= vec![&test.env, test.token_0.address.clone()]; - - test.adapter_client.swap_tokens_for_exact_tokens( // add try_ to test the error - &0, // amount_out - &0, // amount_in_max - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); - - // assert_eq!(result, Err(Ok(CombinedRouterError::LibraryInvalidPath))); -} - - -#[test] -// Panics because LP does not exist; here panics with a Error(Storage, MissingValue) -// We should implement a pair_address.exist() without needing to call the Factory -#[should_panic] -fn try_swap_tokens_for_exact_tokens_pair_does_not_exist() { - let test = PhoenixAggregatorAdapterTest::setup(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let mut path: Vec
= Vec::new(&test.env); - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_3.address.clone()); - - test.adapter_client.swap_tokens_for_exact_tokens( - &1, //amount_out - &0, // amount_in_max - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); -} - - -#[test] -#[should_panic] // TODO: Test the imported error -fn try_swap_tokens_for_exact_tokens_insufficient_output_amount() { - let test = PhoenixAggregatorAdapterTest::setup(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let mut path: Vec
= Vec::new(&test.env); - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_1.address.clone()); - - - test.env.cost_estimate().budget().reset_unlimited(); - test.adapter_client.swap_tokens_for_exact_tokens( - &0, // amount_out - &0, // amount_in_max - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); - // assert_eq!(result, Err(Ok(CombinedRouterError::LibraryInsufficientOutputAmount))); -} - -#[test] -// #[should_panic(expected = "Amount of token in required is greater than the maximum amount expected")] // TODO: Test the imported error -#[should_panic(expected = "HostError: Error(WasmVm, InvalidAction)")] //TODO: Why it changed using the deployer? -fn try_swap_tokens_for_exact_tokens_amount_in_max_not_enough() { - let test = PhoenixAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - // test.adapter_client_not_initialized.initialize( - // &String::from_str(&test.env, "phoenix"), - // &test.multihop_client.address); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let mut path: Vec
= Vec::new(&test.env); - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_1.address.clone()); - - let expected_amount_out = 50; - // From Phoenix tests - let amount_in_should = 50; - - test.adapter_client.swap_tokens_for_exact_tokens( - &expected_amount_out, // amount_out - &(amount_in_should-1), // amount_in_max - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); - - - // TODO: Evaluate if change panic message with error object (check benchmark) - // assert_eq!( - // result, - // Err(Ok(AdapterError::NotInitialized)) - // ); -} - -#[test] -fn swap_tokens_for_exact_tokens_amount_in_should() { - let test = PhoenixAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let mut path: Vec
= Vec::new(&test.env); - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_1.address.clone()); - - let expected_amount_out = 50; - // From Phoenix tests - let amount_in_should = 50; - - let initial_user_balance_0 = test.token_0.balance(&test.user); - let initial_user_balance_1 = test.token_1.balance(&test.user); - - let amounts = test.adapter_client.swap_tokens_for_exact_tokens( - &expected_amount_out, //amount_out - &(amount_in_should), // amount_in_max - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); - - assert_eq!(amounts.get(0).unwrap(), amount_in_should); - assert_eq!(amounts.get(1).unwrap(), expected_amount_out); - - - assert_eq!(test.token_0.balance(&test.user), initial_user_balance_0 - amount_in_should); - assert_eq!(test.token_1.balance(&test.user), initial_user_balance_1 + expected_amount_out); - -} - - -#[test] -fn swap_tokens_for_exact_tokens_3_hops() { - let test = PhoenixAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let ledger_timestamp = 100; - let desired_deadline = 1000; - assert!(desired_deadline > ledger_timestamp); - test.env.ledger().with_mut(|li| { - li.timestamp = ledger_timestamp; - }); - - let mut path: Vec
= Vec::new(&test.env); - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_1.address.clone()); - path.push_back(test.token_2.address.clone()); - path.push_back(test.token_3.address.clone()); - - let expected_amount_out = 50; - // From Phoenix tests - let amount_in_should =50; - - let initial_user_balance_0 = test.token_0.balance(&test.user); - let initial_user_balance_1 = test.token_1.balance(&test.user); - let initial_user_balance_2 = test.token_2.balance(&test.user); - let initial_user_balance_3 = test.token_3.balance(&test.user); - - let amounts = test.adapter_client.swap_tokens_for_exact_tokens( - &expected_amount_out, //amount_out - &amount_in_should, // amount_in_max - &path, // path - &test.user, // to - &desired_deadline, // deadline - &None - ); - - assert_eq!(amounts.get(0).unwrap(), amount_in_should); - assert_eq!(amounts.get(1).unwrap(), expected_amount_out); - - assert_eq!(test.token_0.balance(&test.user), initial_user_balance_0 - amount_in_should); - assert_eq!(test.token_1.balance(&test.user), initial_user_balance_1); - assert_eq!(test.token_2.balance(&test.user), initial_user_balance_2); - assert_eq!(test.token_3.balance(&test.user), initial_user_balance_3 + expected_amount_out); -} diff --git a/contracts/adapters/soroswap/Cargo.toml b/contracts/adapters/soroswap/Cargo.toml deleted file mode 100644 index cb0b6c47..00000000 --- a/contracts/adapters/soroswap/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "soroswap-adapter" -version = "0.1.0" -edition = { workspace = true } -description = "Soroswap-Adapter is a smart contract on the Soroban platform, tailored for use with the Soroswap-Aggregator. It facilitates efficient transaction routing through the Soroswap protocol." -homepage = { workspace = true } -repository = { workspace = true } -authors = ["coderipper "] -readme = "README.md" -keywords = ["no_std", "wasm", "soroswap", "amm", "soroban"] -publish = true - -[lib] -crate-type = ["cdylib"] - -[dependencies] -soroban-sdk = { workspace = true } -adapter-interface = { workspace = true } - -[dev-dependencies] -soroban-sdk = { workspace = true, features = ["testutils"] } \ No newline at end of file diff --git a/contracts/adapters/soroswap/Makefile b/contracts/adapters/soroswap/Makefile deleted file mode 100644 index 4c57d94f..00000000 --- a/contracts/adapters/soroswap/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -default: build - -all: test - -test: build - cargo test - -build: - cargo build --target wasm32-unknown-unknown --release - soroban contract optimize --wasm ../../target/wasm32-unknown-unknown/release/soroswap_adapter.wasm - @rm ../../target/wasm32-unknown-unknown/release/soroswap_adapter.wasm - -fmt: - cargo fmt --all --check - -clean: - cargo clean \ No newline at end of file diff --git a/contracts/adapters/soroswap/README.md b/contracts/adapters/soroswap/README.md deleted file mode 100644 index a6b7a8fd..00000000 --- a/contracts/adapters/soroswap/README.md +++ /dev/null @@ -1 +0,0 @@ -# SoroswapAggregator: Soroswap Adapter \ No newline at end of file diff --git a/contracts/adapters/soroswap/src/event.rs b/contracts/adapters/soroswap/src/event.rs deleted file mode 100644 index bd5f10bc..00000000 --- a/contracts/adapters/soroswap/src/event.rs +++ /dev/null @@ -1,47 +0,0 @@ -//! Definition of the Events used in the contract -use soroban_sdk::{contracttype, symbol_short, Env, Address, Vec, String}; - -// INITIALIZED -#[contracttype] -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct InitializedEvent { - pub state: bool, - pub protocol_id: String, - pub protocol_address: Address -} - -pub(crate) fn initialized(e: &Env, state: bool, protocol_id: String, protocol_address: Address) { - - let event: InitializedEvent = InitializedEvent { - state: state, - protocol_id, - protocol_address, - }; - e.events().publish(("SoroswapAggregatorAdapter", symbol_short!("init")), event); -} - -// SWAP EVENT -#[contracttype] -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct SwapEvent { - pub amount_in: i128, - pub path: Vec
, - pub to: Address -} - -pub(crate) fn swap( - e: &Env, - amount_in: i128, - path: Vec
, - to: Address -) { - let event = SwapEvent { - amount_in, - path, - to, - }; - - e.events().publish(("SoroswapAggregatorAdapter", symbol_short!("swap")), event); -} - -// TODO IMPROVE EVENTS \ No newline at end of file diff --git a/contracts/adapters/soroswap/src/lib.rs b/contracts/adapters/soroswap/src/lib.rs deleted file mode 100644 index 7be47917..00000000 --- a/contracts/adapters/soroswap/src/lib.rs +++ /dev/null @@ -1,117 +0,0 @@ -#![no_std] -use soroban_sdk::{contract, contractimpl, Address, Env, Vec, String, BytesN}; - -mod event; -mod storage; -mod protocol_interface; -mod test; - -use storage::{ - extend_instance_ttl, - set_initialized, - is_initialized, - set_protocol_id, - get_protocol_id, - set_protocol_address, - get_protocol_address, -}; -use adapter_interface::{AdapterTrait, AdapterError}; -use protocol_interface::{protocol_swap_exact_tokens_for_tokens, - protocol_swap_tokens_for_exact_tokens}; - -fn check_initialized(e: &Env) -> Result<(), AdapterError> { - if is_initialized(e) { - Ok(()) - } else { - Err(AdapterError::NotInitialized) - } -} - -#[contract] -struct SoroswapAggregatorAdapter; - -#[contractimpl] -impl AdapterTrait for SoroswapAggregatorAdapter { - fn initialize( - e: Env, - protocol_id: String, - protocol_address: Address, - ) -> Result<(), AdapterError> { - if check_initialized(&e).is_ok() { - return Err(AdapterError::AlreadyInitialized); - } - - set_protocol_id(&e, protocol_id.clone()); - set_protocol_address(&e, protocol_address.clone()); - - set_initialized(&e); - event::initialized(&e, true, protocol_id, protocol_address); - extend_instance_ttl(&e); - Ok(()) - } - - fn swap_exact_tokens_for_tokens( - e: Env, - amount_in: i128, - amount_out_min: i128, - path: Vec
, - to: Address, - deadline: u64, - _bytes: Option>>, - ) -> Result, AdapterError> { - check_initialized(&e)?; - extend_instance_ttl(&e); - to.require_auth(); - - let swap_result = protocol_swap_exact_tokens_for_tokens( - &e, - &amount_in, - &amount_out_min, - &path, - &to, - &deadline, - )?; - - event::swap(&e, amount_in, path, to); - Ok(swap_result) - } - - fn swap_tokens_for_exact_tokens( - e: Env, - amount_out: i128, - amount_in_max: i128, - path: Vec
, - to: Address, - deadline: u64, - _bytes: Option>>, - ) -> Result, AdapterError> { - check_initialized(&e)?; - extend_instance_ttl(&e); - to.require_auth(); - - let swap_result = protocol_swap_tokens_for_exact_tokens( - &e, - &amount_out, - &amount_in_max, - &path, - &to, - &deadline, - )?; - - event::swap(&e, amount_in_max, path, to); - Ok(swap_result) - } - - /* *** Read only functions: *** */ - fn get_protocol_id(e: &Env) -> Result { - check_initialized(&e)?; - extend_instance_ttl(&e); - Ok(get_protocol_id(e)?) - } - - fn get_protocol_address(e: &Env) -> Result { - check_initialized(&e)?; - extend_instance_ttl(&e); - Ok(get_protocol_address(e)?) - } -} diff --git a/contracts/adapters/soroswap/src/protocol_interface.rs b/contracts/adapters/soroswap/src/protocol_interface.rs deleted file mode 100644 index 6aa39072..00000000 --- a/contracts/adapters/soroswap/src/protocol_interface.rs +++ /dev/null @@ -1,50 +0,0 @@ -use soroban_sdk::{Env, Address, Vec}; -use crate::storage::get_protocol_address; -use adapter_interface::AdapterError; - -soroban_sdk::contractimport!( - file = "./soroswap_contracts/soroswap_router.wasm" -); -pub type SoroswapRouterClient<'a> = Client<'a>; - -pub fn protocol_swap_exact_tokens_for_tokens( - e: &Env, - amount_in: &i128, - amount_out_min: &i128, - path: &Vec
, - to: &Address, - deadline: &u64, -) -> Result, AdapterError> { - - let soroswap_router_address = get_protocol_address(&e)?; - let soroswap_router_client = SoroswapRouterClient::new(&e, &soroswap_router_address); - - Ok(soroswap_router_client.swap_exact_tokens_for_tokens( - &amount_in, - &amount_out_min, - &path, - &to, - &deadline - )) -} - -pub fn protocol_swap_tokens_for_exact_tokens( - e: &Env, - amount_out: &i128, - amount_in_max: &i128, - path: &Vec
, - to: &Address, - deadline: &u64, -) -> Result, AdapterError> { - - let soroswap_router_address = get_protocol_address(&e)?; - let soroswap_router_client = SoroswapRouterClient::new(&e, &soroswap_router_address); - - Ok(soroswap_router_client.swap_tokens_for_exact_tokens( - &amount_out, - &amount_in_max, - &path, - &to, - &deadline - )) -} diff --git a/contracts/adapters/soroswap/src/storage.rs b/contracts/adapters/soroswap/src/storage.rs deleted file mode 100644 index dee8a44a..00000000 --- a/contracts/adapters/soroswap/src/storage.rs +++ /dev/null @@ -1,51 +0,0 @@ -use soroban_sdk::{contracttype, Env, Address, String}; -use adapter_interface::AdapterError; - -#[derive(Clone)] -#[contracttype] - -enum DataKey { - Initialized, - ProtocolId, - ProtocolAddress, -} - -const DAY_IN_LEDGERS: u32 = 17280; -const INSTANCE_BUMP_AMOUNT: u32 = 60 * DAY_IN_LEDGERS; -const INSTANCE_LIFETIME_THRESHOLD: u32 = INSTANCE_BUMP_AMOUNT - DAY_IN_LEDGERS; - -pub fn extend_instance_ttl(e: &Env) { - e.storage() - .instance() - .extend_ttl(INSTANCE_LIFETIME_THRESHOLD, INSTANCE_BUMP_AMOUNT); -} - -/* INITIALIZED */ -pub fn set_initialized(e: &Env) { - e.storage().instance().set(&DataKey::Initialized, &true); -} - -pub fn is_initialized(e: &Env) -> bool { - e.storage().instance().has(&DataKey::Initialized) -} - - -/* PROTOCOL ID - STRING */ -pub fn set_protocol_id(e: &Env, protocol_id: String) { - e.storage().instance().set(&DataKey::ProtocolId, &protocol_id); -} - -pub fn get_protocol_id(e: &Env) -> Result { - e.storage().instance().get(&DataKey::ProtocolId).ok_or(AdapterError::NotInitialized) -} - - -/* PROTOCOL ADDRESS */ -pub fn set_protocol_address(e: &Env, address: Address) { - e.storage().instance().set(&DataKey::ProtocolAddress, &address); -} - -pub fn get_protocol_address(e: &Env) -> Result { - e.storage().instance().get(&DataKey::ProtocolAddress).ok_or(AdapterError::NotInitialized) -} - diff --git a/contracts/adapters/soroswap/src/test.rs b/contracts/adapters/soroswap/src/test.rs deleted file mode 100644 index 43e5e977..00000000 --- a/contracts/adapters/soroswap/src/test.rs +++ /dev/null @@ -1,105 +0,0 @@ -#![cfg(test)] -extern crate std; -pub mod soroswap_setup; - -use soroban_sdk::{ - Env, - Address, - BytesN, - Symbol, - String, - Vec, - Val, - IntoVal -}; -use crate::{SoroswapAggregatorAdapter, SoroswapAggregatorAdapterClient}; -use soroswap_setup::{SoroswapTest, router, factory, token::TokenClient}; -use factory::SoroswapFactoryClient; -use router::SoroswapRouterClient; - -mod deployer_contract { - soroban_sdk::contractimport!(file = "../../target/wasm32-unknown-unknown/release/soroswap_aggregator_deployer.optimized.wasm"); - pub type DeployerClient<'a> = Client<'a>; -} -use deployer_contract::DeployerClient; - -fn create_deployer<'a>(e: &Env) -> DeployerClient<'a> { - let deployer_address = &e.register(deployer_contract::WASM, ()); - let deployer = DeployerClient::new(e, deployer_address); - deployer -} - -// SoroswapAggregatorAdapter Contract -fn create_soroswap_aggregator_adapter<'a>(e: &Env) -> SoroswapAggregatorAdapterClient<'a> { - SoroswapAggregatorAdapterClient::new(e, &e.register(SoroswapAggregatorAdapter {}, ())) -} - -pub mod soroswap_adapter_contract { - soroban_sdk::contractimport!(file = "../../target/wasm32-unknown-unknown/release/soroswap_adapter.optimized.wasm"); - pub type SoroswapAggregatorAdapterClientFromWasm<'a> = Client<'a>; -} -use soroswap_adapter_contract::SoroswapAggregatorAdapterClientFromWasm; - - -pub struct SoroswapAggregatorAdapterTest<'a> { - env: Env, - adapter_contract: SoroswapAggregatorAdapterClientFromWasm<'a>, - adapter_contract_not_initialized: SoroswapAggregatorAdapterClient<'a>, - router_contract: SoroswapRouterClient<'a>, - factory_contract: SoroswapFactoryClient<'a>, - token_0: TokenClient<'a>, - token_1: TokenClient<'a>, - token_2: TokenClient<'a>, - user: Address, - // admin: Address -} - -impl<'a> SoroswapAggregatorAdapterTest<'a> { - fn setup() -> Self { - let test = SoroswapTest::soroswap_setup(); - - let wasm_hash = test.env.deployer().upload_contract_wasm(soroswap_adapter_contract::WASM); - let deployer_client = create_deployer(&test.env); - - let adapter_contract_not_initialized = create_soroswap_aggregator_adapter(&test.env); - - // Deploy contract using deployer, and include an init function to call. - let salt = BytesN::from_array(&test.env, &[0; 32]); - let init_fn = Symbol::new(&test.env, &("initialize")); - - let protocol_id = String::from_str(&test.env, "soroswap"); - let protocol_address = test.router_contract.address.clone(); - - // Convert the arguments into a Vec - let init_fn_args: Vec = (protocol_id.clone(), protocol_address.clone()).into_val(&test.env); - - test.env.mock_all_auths(); - let (contract_id, _init_result) = deployer_client.deploy( - &deployer_client.address, - &wasm_hash, - &salt, - &init_fn, - &init_fn_args, - ); - - let adapter_contract = soroswap_adapter_contract::Client::new(&test.env, &contract_id); - - - SoroswapAggregatorAdapterTest { - env: test.env, - adapter_contract, - adapter_contract_not_initialized, - router_contract: test.router_contract, - factory_contract: test.factory_contract, - token_0: test.token_0, - token_1: test.token_1, - token_2: test.token_2, - user: test.user, - // admin: test.admin - } - } -} - -pub mod initialize; -pub mod swap_exact_tokens_for_tokens; -pub mod swap_tokens_for_exact_tokens; \ No newline at end of file diff --git a/contracts/adapters/soroswap/src/test/initialize.rs b/contracts/adapters/soroswap/src/test/initialize.rs deleted file mode 100644 index 8f2326e4..00000000 --- a/contracts/adapters/soroswap/src/test/initialize.rs +++ /dev/null @@ -1,75 +0,0 @@ -use soroban_sdk::String; -use crate::test::SoroswapAggregatorAdapterTest; -use adapter_interface::AdapterError; -use super::soroswap_adapter_contract::AdapterError as AdapterErrorDeployer; - -#[test] -fn test_initialize_and_get_values() { - let test = SoroswapAggregatorAdapterTest::setup(); - - test.adapter_contract_not_initialized.initialize( - &String::from_str(&test.env, "soroswap"), - &test.router_contract.address); - - let protocol_id = test.adapter_contract_not_initialized.get_protocol_id(); - assert_eq!(protocol_id, String::from_str(&test.env, "soroswap")); - - let protocol_address = test.adapter_contract_not_initialized.get_protocol_address(); - assert_eq!(protocol_address, test.router_contract.address); -} - -#[test] -fn test_get_values() { - let test = SoroswapAggregatorAdapterTest::setup(); - - let protocol_id = test.adapter_contract.get_protocol_id(); - assert_eq!(protocol_id, String::from_str(&test.env, "soroswap")); - - let protocol_address = test.adapter_contract.get_protocol_address(); - assert_eq!(protocol_address, test.router_contract.address); -} - -// test initialize twice -#[test] -fn test_initialize_twice() { - let test = SoroswapAggregatorAdapterTest::setup(); - - test.adapter_contract_not_initialized.initialize( - &String::from_str(&test.env, "soroswap"), - &test.router_contract.address); - - let result = test.adapter_contract_not_initialized.try_initialize( - &String::from_str(&test.env, "soroswap"), - &test.router_contract.address); - - assert_eq!(result,Err(Ok(AdapterError::AlreadyInitialized))); -} - -#[test] -fn test_initialize_twice_deployer() { - let test = SoroswapAggregatorAdapterTest::setup(); - - let result = test.adapter_contract.try_initialize( - &String::from_str(&test.env, "soroswap"), - &test.router_contract.address); - - assert_eq!(result,Err(Ok(AdapterErrorDeployer::AlreadyInitialized))); -} - -// test get protocol id not initialized -#[test] -fn test_get_protocol_id_not_initialized() { - let test = SoroswapAggregatorAdapterTest::setup(); - - let result = test.adapter_contract_not_initialized.try_get_protocol_id(); - assert_eq!(result,Err(Ok(AdapterError::NotInitialized))); -} - -// test get protocol address not initialized -#[test] -fn test_get_protocol_address_not_initialized() { - let test = SoroswapAggregatorAdapterTest::setup(); - - let result = test.adapter_contract_not_initialized.try_get_protocol_address(); - assert_eq!(result,Err(Ok(AdapterError::NotInitialized))); -} diff --git a/contracts/adapters/soroswap/src/test/soroswap_setup.rs b/contracts/adapters/soroswap/src/test/soroswap_setup.rs deleted file mode 100644 index 6de8f55b..00000000 --- a/contracts/adapters/soroswap/src/test/soroswap_setup.rs +++ /dev/null @@ -1,185 +0,0 @@ -#![cfg(test)] -extern crate std; -use soroban_sdk::{ - Env, - BytesN, - Address, - testutils::{ - Address as _, - Ledger, - }, -}; - -// Token Contract -pub mod token { - soroban_sdk::contractimport!(file = "./soroswap_contracts/soroban_token_contract.wasm"); - pub type TokenClient<'a> = Client<'a>; -} -use token::TokenClient; - -pub fn create_token_contract<'a>(e: &Env, admin: & Address) -> TokenClient<'a> { - TokenClient::new(&e, &e.register_stellar_asset_contract_v2(admin.clone()).address()) -} - -// Pair Contract -pub mod pair { - soroban_sdk::contractimport!(file = "./soroswap_contracts/soroswap_pair.wasm"); -// pub type SoroswapPairClient<'a> = Client<'a>; -} -// use pair::SoroswapPairClient; - - -fn pair_contract_wasm(e: &Env) -> BytesN<32> { - soroban_sdk::contractimport!( - file = "./soroswap_contracts/soroswap_pair.wasm" - ); - e.deployer().upload_contract_wasm(WASM) -} - -// SoroswapFactory Contract -pub mod factory { - soroban_sdk::contractimport!(file = "./soroswap_contracts/soroswap_factory.wasm"); - pub type SoroswapFactoryClient<'a> = Client<'a>; -} -use factory::SoroswapFactoryClient; - -fn create_soroswap_factory<'a>(e: & Env, setter: & Address) -> SoroswapFactoryClient<'a> { - let pair_hash = pair_contract_wasm(&e); - let factory_address = &e.register(factory::WASM, ()); - let factory = SoroswapFactoryClient::new(e, factory_address); - factory.initialize(&setter, &pair_hash); - factory -} - -// SoroswapRouter Contract -pub mod router { - soroban_sdk::contractimport!(file = "./soroswap_contracts/soroswap_router.wasm"); - pub type SoroswapRouterClient<'a> = Client<'a>; -} -use router::SoroswapRouterClient; - -// SoroswapRouter Contract -fn create_soroswap_router<'a>(e: &Env) -> SoroswapRouterClient<'a> { - let router_address = &e.register(router::WASM, ()); - let router = SoroswapRouterClient::new(e, router_address); - router -} - -pub struct SoroswapTest<'a> { - pub env: Env, - pub router_contract: SoroswapRouterClient<'a>, - pub factory_contract: SoroswapFactoryClient<'a>, - pub token_0: TokenClient<'a>, - pub token_1: TokenClient<'a>, - pub token_2: TokenClient<'a>, - pub user: Address, - // pub admin: Address -} - -impl<'a> SoroswapTest<'a> { - pub fn soroswap_setup() -> Self { - let env = Env::default(); - env.mock_all_auths(); - let router_contract = create_soroswap_router(&env); - - let initial_user_balance = 20_000_000_000_000_000_000; - - let admin = Address::generate(&env); - let user = Address::generate(&env); - assert_ne!(admin, user); - - let token_0 = create_token_contract(&env, &admin); - let token_1 = create_token_contract(&env, &admin); - let token_2 = create_token_contract(&env, &admin); - - token_0.mint(&user, &initial_user_balance); - token_1.mint(&user, &initial_user_balance); - token_2.mint(&user, &initial_user_balance); - - let factory_contract = create_soroswap_factory(&env, &admin); - env.cost_estimate().budget().reset_unlimited(); - - let ledger_timestamp = 100; - let desired_deadline = 1000; - - assert!(desired_deadline > ledger_timestamp); - - env.ledger().with_mut(|li| { - li.timestamp = ledger_timestamp; - }); - - let amount_0: i128 = 1_000_000_000_000_000_000; - let amount_1: i128 = 4_000_000_000_000_000_000; - let amount_2: i128 = 8_000_000_000_000_000_000; - let expected_liquidity: i128 = 2_000_000_000_000_000_000; - - // Check initial user value of every token: - assert_eq!(token_0.balance(&user), initial_user_balance); - assert_eq!(token_1.balance(&user), initial_user_balance); - assert_eq!(token_2.balance(&user), initial_user_balance); - - router_contract.initialize(&factory_contract.address); - - assert_eq!(factory_contract.pair_exists(&token_0.address, &token_1.address), false); - let (added_token_0_0, added_token_1_0, added_liquidity_0_1) = router_contract.add_liquidity( - &token_0.address, // token_a: Address, - &token_1.address, // token_b: Address, - &amount_0, // amount_a_desired: i128, - &amount_1, // amount_b_desired: i128, - &0, // amount_a_min: i128, - &0 , // amount_b_min: i128, - &user, // to: Address, - &desired_deadline// deadline: u64, - ); - - let (added_token_1_1, added_token_2_0, added_liquidity_1_2) = router_contract.add_liquidity( - &token_1.address, // token_a: Address, - &token_2.address, // token_b: Address, - &amount_1, // amount_a_desired: i128, - &amount_2, // amount_b_desired: i128, - &0, // amount_a_min: i128, - &0 , // amount_b_min: i128, - &user, // to: Address, - &desired_deadline// deadline: u64, - ); - - // let (added_token_0_1, added_token_2_1, added_liquidity_0_2) = router_contract.add_liquidity( - // &token_0.address, // token_a: Address, - // &token_2.address, // token_b: Address, - // &amount_0, // amount_a_desired: i128, - // &amount_1, // amount_b_desired: i128, - // &0, // amount_a_min: i128, - // &0 , // amount_b_min: i128, - // &user, // to: Address, - // &desired_deadline// deadline: u64, - // ); - - static MINIMUM_LIQUIDITY: i128 = 1000; - - assert_eq!(added_token_0_0, amount_0); - assert_eq!(added_token_1_0, amount_1); - assert_eq!(added_token_1_1, amount_1); - assert_eq!(added_token_2_0, amount_2); - // assert_eq!(added_token_0_1, amount_0); - // assert_eq!(added_token_2_1, amount_1); - - assert_eq!(added_liquidity_0_1, expected_liquidity.checked_sub(MINIMUM_LIQUIDITY).unwrap()); - assert_eq!(added_liquidity_1_2, 5656854249492379195); - // assert_eq!(added_liquidity_0_2, expected_liquidity.checked_sub(MINIMUM_LIQUIDITY).unwrap()); - - assert_eq!(token_0.balance(&user), 19_000_000_000_000_000_000); - assert_eq!(token_1.balance(&user), 12_000_000_000_000_000_000); - assert_eq!(token_2.balance(&user), 12_000_000_000_000_000_000); - - SoroswapTest { - env, - router_contract, - factory_contract, - token_0, - token_1, - token_2, - user, - // admin - } - } -} \ No newline at end of file diff --git a/contracts/adapters/soroswap/src/test/swap_exact_tokens_for_tokens.rs b/contracts/adapters/soroswap/src/test/swap_exact_tokens_for_tokens.rs deleted file mode 100644 index ecd2d01e..00000000 --- a/contracts/adapters/soroswap/src/test/swap_exact_tokens_for_tokens.rs +++ /dev/null @@ -1,234 +0,0 @@ -use soroban_sdk::{Address, vec, Vec}; -use crate::test::SoroswapAggregatorAdapterTest; -use adapter_interface::AdapterError; - -#[test] -fn swap_exact_tokens_for_tokens_not_initialized() { - let test = SoroswapAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - let path: Vec
= Vec::new(&test.env); - - let result = test.adapter_contract_not_initialized.try_swap_exact_tokens_for_tokens( - &0, // amount_in - &0, // amount_out_min - &path, // path - &test.user, // to - &0, // deadline - &None - ); - - assert_eq!(result,Err(Ok(AdapterError::NotInitialized))); - -} - -#[test] -#[should_panic(expected = "HostError: Error(Contract, #502)")] -fn swap_exact_tokens_for_tokens_amount_in_negative() { - let test = SoroswapAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let path: Vec
= Vec::new(&test.env); - - test.adapter_contract.swap_exact_tokens_for_tokens( - &-1, // amount_in - &0, // amount_out_min - &path, // path - &test.user, // to - &0, // deadline - &None - ); -} - -#[test] -#[should_panic(expected = "HostError: Error(Contract, #502)")] -fn swap_exact_tokens_for_tokens_amount_out_min_negative() { - let test = SoroswapAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let path: Vec
= Vec::new(&test.env); - - test.adapter_contract.swap_exact_tokens_for_tokens( - &0, // amount_in - &-1, // amount_out_min - &path, // path - &test.user, // to - &0, // deadline - &None - ); -} - -#[test] -#[should_panic(expected = "HostError: Error(Contract, #503)")] -fn swap_exact_tokens_for_tokens_expired() { - let test = SoroswapAggregatorAdapterTest::setup(); - - let path: Vec
= Vec::new(&test.env); - - test.adapter_contract.swap_exact_tokens_for_tokens( - &0, // amount_in - &0, // amount_out_min - &path, // path - &test.user, // to - &0, // deadline - &None - ); -} - - - -#[test] -#[should_panic] // TODO: Test the imported error -fn try_swap_exact_tokens_for_tokens_invalid_path() { - let test = SoroswapAggregatorAdapterTest::setup(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - let path: Vec
= vec![&test.env, test.token_0.address.clone()]; - test.adapter_contract.swap_exact_tokens_for_tokens( - &0, // amount_in - &0, // amount_out_min - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); -} - - -#[test] -#[should_panic] // TODO: Test the imported error -fn try_swap_exact_tokens_for_tokens_insufficient_input_amount() { - let test = SoroswapAggregatorAdapterTest::setup(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let mut path: Vec
= Vec::new(&test.env); - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_1.address.clone()); - - test.env.cost_estimate().budget().reset_unlimited(); - test.adapter_contract.swap_exact_tokens_for_tokens( - &0, // amount_in - &0, // amount_out_min - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); - // assert_eq!(result, Err(Ok(CombinedRouterError::LibraryInsufficientInputAmount))); -} - - - -#[test] -#[should_panic] // TODO: Test the imported error -fn swap_exact_tokens_for_tokens_insufficient_output_amount() { - let test = SoroswapAggregatorAdapterTest::setup(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let mut path: Vec
= Vec::new(&test.env); - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_1.address.clone()); - - let amount_in = 1_000_000; - - //(1000000×997×4000000000000000000)÷(1000000000000000000×1000+997×1000000) = 3987999,9 - - let expected_amount_out = 3987999; - - test.env.cost_estimate().budget().reset_unlimited(); - test.adapter_contract.swap_exact_tokens_for_tokens( - &amount_in, // amount_in - &(expected_amount_out + 1), // amount_out_min - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); - - // assert_eq!( - // result, - // Err(Ok(CombinedRouterError::RouterInsufficientOutputAmount)) - // ); -} - - - -#[test] -fn swap_exact_tokens_for_tokens_enough_output_amount_soroswap_protocol() { - let test = SoroswapAggregatorAdapterTest::setup(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let mut path: Vec
= Vec::new(&test.env); - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_1.address.clone()); - - let amount_in = 1_000_000; - - //(1000000×997×4000000000000000000)÷(1000000000000000000×1000+997×1000000) = 3987999,9 - - let expected_amount_out = 3987999; - - test.env.cost_estimate().budget().reset_unlimited(); - let executed_amounts = test.adapter_contract.swap_exact_tokens_for_tokens( - &amount_in, //amount_in - &(expected_amount_out), // amount_out_min - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); - - assert_eq!(executed_amounts.get(0).unwrap(), amount_in); - assert_eq!(executed_amounts.get(1).unwrap(), expected_amount_out); - -} - - -#[test] -fn swap_exact_tokens_for_tokens_2_hops_soroswap_protocol() { - let test = SoroswapAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - let initial_user_balance = 20_000_000_000_000_000_000; - let amount_0: i128 = 1_000_000_000_000_000_000; - let amount_1: i128 = 4_000_000_000_000_000_000; - let amount_2: i128 = 8_000_000_000_000_000_000; - - - let mut path: Vec
= Vec::new(&test.env); - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_1.address.clone()); - path.push_back(test.token_2.address.clone()); - - - let amount_in = 123_456_789; - // fee = 123456789 * 3 /1000 = 370370,367 = 370371 // USE CEILING - // amount_in less fee = 123456789- 370371 = 123086418 - // First out = (123086418*4000000000000000000)/(1000000000000000000 + 123086418) = 492345671.939398935 = 492345671 - let first_out = 492345671; - // fee = 492345671 * 3 /1000 = 1477037.013 = 1477038 // USE CEILING - // in less fee = 492345671 - 1477038 = 490868633 - // Second out = (490868633*8000000000000000000)/(4000000000000000000 + 490868633) = 981737265.879523993 = 981737265 - let expected_amount_out = 981737265; - - let executed_amounts = test.adapter_contract.swap_exact_tokens_for_tokens( - &amount_in, //amount_in - &0, // amount_out_min - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); - - assert_eq!(executed_amounts.get(0).unwrap(), amount_in); - assert_eq!(executed_amounts.get(1).unwrap(), first_out); - assert_eq!(executed_amounts.get(2).unwrap(), expected_amount_out); - - assert_eq!(test.token_0.balance(&test.user), initial_user_balance - amount_0 - amount_in); - assert_eq!(test.token_1.balance(&test.user), initial_user_balance - amount_1*2); - assert_eq!(test.token_2.balance(&test.user), initial_user_balance -amount_2 + expected_amount_out); -} - diff --git a/contracts/adapters/soroswap/src/test/swap_tokens_for_exact_tokens.rs b/contracts/adapters/soroswap/src/test/swap_tokens_for_exact_tokens.rs deleted file mode 100644 index 14a88ecd..00000000 --- a/contracts/adapters/soroswap/src/test/swap_tokens_for_exact_tokens.rs +++ /dev/null @@ -1,344 +0,0 @@ -use soroban_sdk::{Address, vec, Vec}; -use soroban_sdk::testutils::Ledger; -use crate::test::SoroswapAggregatorAdapterTest; -use adapter_interface::AdapterError; - -#[test] -fn swap_tokens_for_exact_tokens_not_initialized() { - let test = SoroswapAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - let path: Vec
= Vec::new(&test.env); - - let result = test.adapter_contract_not_initialized.try_swap_tokens_for_exact_tokens( - &0, // amount_out - &0, // amount_in_max - &path, // path - &test.user, // to - &0, // deadline - &None - ); - - assert_eq!(result,Err(Ok(AdapterError::NotInitialized))); - -} - -#[test] -#[should_panic(expected = "HostError: Error(Contract, #502)")] -fn swap_tokens_for_exact_tokens_amount_out_negative() { - let test = SoroswapAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let path: Vec
= Vec::new(&test.env); - - test.adapter_contract.swap_tokens_for_exact_tokens( - &-1, // amount_out - &0, // amount_in_max - &path, // path - &test.user, // to - &0, // deadline - &None - ); -} - -#[test] -#[should_panic(expected = "HostError: Error(Contract, #502)")] -fn swap_tokens_for_exact_tokens_amount_in_max_negative() { - let test = SoroswapAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let path: Vec
= Vec::new(&test.env); - - test.adapter_contract.swap_tokens_for_exact_tokens( - &0, // amount_out - &-1, // amount_in_max - &path, // path - &test.user, // to - &0, // deadline - &None - ); -} - -#[test] -#[should_panic(expected = "HostError: Error(Contract, #503)")] -fn swap_tokens_for_exact_tokens_expired() { - let test = SoroswapAggregatorAdapterTest::setup(); - - let path: Vec
= Vec::new(&test.env); - - test.adapter_contract.swap_tokens_for_exact_tokens( - &0, // amount_out - &0, // amount_in_max - &path, // path - &test.user, // to - &0, // deadline - &None - ); -} - - -#[test] -#[should_panic] // TODO: Test the imported error -fn try_swap_tokens_for_exact_tokens_invalid_path() { - let test = SoroswapAggregatorAdapterTest::setup(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let path: Vec
= vec![&test.env, test.token_0.address.clone()]; - - test.adapter_contract.swap_tokens_for_exact_tokens( // add try_ to test the error - &0, // amount_out - &0, // amount_in_max - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); - - // assert_eq!(result, Err(Ok(CombinedRouterError::LibraryInvalidPath))); -} - - -#[test] -// Panics because LP does not exist; here panics with a Error(Storage, MissingValue) -// We should implement a pair_address.exist() without needing to call the Factory -#[should_panic] -fn swap_tokens_for_exact_tokens_pair_does_not_exist() { - let test = SoroswapAggregatorAdapterTest::setup(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let mut path: Vec
= Vec::new(&test.env); - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_1.address.clone()); - - test.adapter_contract.swap_tokens_for_exact_tokens( - &0, //amount_out - &0, // amount_in_max - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); -} - - -#[test] -#[should_panic] // TODO: Test the imported error -fn try_swap_tokens_for_exact_tokens_insufficient_output_amount() { - let test = SoroswapAggregatorAdapterTest::setup(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let mut path: Vec
= Vec::new(&test.env); - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_1.address.clone()); - - - test.env.cost_estimate().budget().reset_unlimited(); - test.adapter_contract.swap_tokens_for_exact_tokens( - &0, // amount_out - &0, // amount_in_max - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); - // assert_eq!(result, Err(Ok(CombinedRouterError::LibraryInsufficientOutputAmount))); -} - -#[test] -#[should_panic] // TODO: Test the imported error -fn swap_tokens_for_exact_tokens_amount_in_max_not_enough() { - let test = SoroswapAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let mut path: Vec
= Vec::new(&test.env); - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_1.address.clone()); - - let expected_amount_out = 5_000_000; - - test.adapter_contract.swap_tokens_for_exact_tokens( - &expected_amount_out, // amount_out - &0, // amount_in_max - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); - - // assert_eq!( - // result, - // Err(Ok(CombinedRouterError::RouterExcessiveInputAmount)) - // ); -} - -#[test] -#[should_panic] // TODO: Test the imported error -fn swap_tokens_for_exact_tokens_amount_in_max_not_enough_amount_in_should_minus_1() { - let test = SoroswapAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let mut path: Vec
= Vec::new(&test.env); - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_1.address.clone()); - - - let expected_amount_out = 5_000_000; - let amount_in_should = test - .router_contract - .router_get_amounts_in(&expected_amount_out, &path) - .get(0) - .unwrap(); - - test.adapter_contract.swap_tokens_for_exact_tokens( - &expected_amount_out, // amount_out - &(amount_in_should - 1), // amount_in_max - &path, // path - &test.user, // to - &deadline, // deadline - &None - ); - - // assert_eq!( - // result, - // Err(Ok(CombinedRouterError::RouterExcessiveInputAmount)) - // ); -} - - -#[test] -fn swap_tokens_for_exact_tokens_amount_in_should() { - let test = SoroswapAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let deadline: u64 = test.env.ledger().timestamp() + 1000; - - let mut path: Vec
= Vec::new(&test.env); - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_1.address.clone()); - - let amount_0: i128 = 1_000_000_000_000_000_000; - let amount_1: i128 = 4_000_000_000_000_000_000; - - let expected_amount_out = 5_000_000; - let amount_in_should = test.router_contract.router_get_amounts_in(&expected_amount_out, &path).get(0).unwrap(); - - let amounts = test.adapter_contract.swap_tokens_for_exact_tokens( - &expected_amount_out, //amount_out - &(amount_in_should), // amount_in_max - &path, // path - &test.user, // to - &deadline, // deadline - &None - - -); assert_eq!(amounts.get(0).unwrap(), amount_in_should); - assert_eq!(amounts.get(1).unwrap(), expected_amount_out); - - let initial_user_balance = 20_000_000_000_000_000_000; - - // pub fn get_amount_in(amount_out: i128, reserve_in: i128, reserve_out: i128) -> Result { - // if amount_out <= 0 { - // return Err(SoroswapLibraryError::InsufficientOutputAmount); - // } - // if reserve_in <= 0 || reserve_out <= 0 { - // return Err(SoroswapLibraryError::InsufficientLiquidity); - // } - // let numerator = reserve_in.checked_mul(amount_out).unwrap().checked_mul(1000).unwrap(); - // let denominator = reserve_out.checked_sub(amount_out).unwrap().checked_mul(997).unwrap(); - // Ok(numerator.checked_ceiling_div(denominator).unwrap().checked_add(1).unwrap()) - // } - - // numerator = 1_000_000_000_000_000_000 * 5_000_000 * 1_000 = 5_000_000_000_000_000_000_000_000_000 - // denominator = (4000000000000000000 - 5000000) * 997 = 3999999999995000000 * 997 = 3987999999995015000000 - - // num/den +1 = 5000000000000000000000000000 / 3987999999995015000000 +1 = ceil(1253761.283853122) +1 - // = 1253762 + 1 = 1253763 - - let expected_amount_0_in = 1253763; - assert_eq!(amounts.get(0).unwrap(), expected_amount_0_in); - - - assert_eq!(test.token_0.balance(&test.user), initial_user_balance - amount_0 - expected_amount_0_in); - assert_eq!(test.token_1.balance(&test.user), initial_user_balance - amount_1*2 + expected_amount_out); - - let pair_address = test.factory_contract.get_pair(&test.token_0.address, &test.token_1.address); - assert_eq!(test.token_0.balance(&pair_address), amount_0 + expected_amount_0_in); - assert_eq!(test.token_1.balance(&pair_address), amount_1 - expected_amount_out); - -} - - -#[test] -fn swap_tokens_for_exact_tokens_2_hops() { - let test = SoroswapAggregatorAdapterTest::setup(); - test.env.cost_estimate().budget().reset_unlimited(); - - let ledger_timestamp = 100; - let desired_deadline = 1000; - assert!(desired_deadline > ledger_timestamp); - test.env.ledger().with_mut(|li| { - li.timestamp = ledger_timestamp; - }); - - let initial_user_balance = 20_000_000_000_000_000_000; - - let amount_0: i128 = 1_000_000_000_000_000_000; - let amount_1: i128 = 4_000_000_000_000_000_000; - let amount_2: i128 = 8_000_000_000_000_000_000; - - let mut path: Vec
= Vec::new(&test.env); - path.push_back(test.token_0.address.clone()); - path.push_back(test.token_1.address.clone()); - path.push_back(test.token_2.address.clone()); - - let expected_amount_out = 123_456_789; - // pair token_1, token_2 - // token_1 is r_in, token_2 is r_out - // (r_in*amount_out)*1000 / (r_out - amount_out)*997 - // (4_000_000_000_000_000_000*123456789)*1000 / ((8_000_000_000_000_000_000 - 123456789)*997) + 1 = - // 493827156000000000000000000000 / (7999999999876543211 * 997) +1 = - // 493827156000000000000000000000 / 7975999999876913581367 +1 = CEIL(61914136.911687662) +1 = 61914137 +1 = 61914138 - // - let middle_amount_in =61914138; - - // pair token_0, token_1 - // token_0 is r_in, token_1 is r_out - // first amount in = - // (1_000_000_000_000_000_000*61914138)*1000 / ((4_000_000_000_000_000_000 - 61914138)*997) + 1 = - // 61914138000000000000000000000 / (3999999999938085862 * 997) + 1 = - // CEIL (61914138000000000000000000000 / 3987999999938271604414) +1 = ceil(15525109.8) +1 = 15525111 - - let amount_in_should =15525111; - - let amounts = test.adapter_contract.swap_tokens_for_exact_tokens( - &expected_amount_out, //amount_out - &amount_in_should, // amount_in_max - &path, // path - &test.user, // to - &desired_deadline, // deadline - &None - - - -); assert_eq!(amounts.get(0).unwrap(), amount_in_should); - assert_eq!(amounts.get(1).unwrap(), middle_amount_in); - assert_eq!(amounts.get(2).unwrap(), expected_amount_out); - - assert_eq!(test.token_0.balance(&test.user), initial_user_balance - amount_0 - amount_in_should); - assert_eq!(test.token_1.balance(&test.user), initial_user_balance - amount_1*2); - assert_eq!(test.token_2.balance(&test.user), initial_user_balance - amount_2 + expected_amount_out); - - let pair_address_0_1 = test.factory_contract.get_pair(&test.token_0.address, &test.token_1.address); - assert_eq!(test.token_0.balance(&pair_address_0_1), amount_0 + amount_in_should); - assert_eq!(test.token_1.balance(&pair_address_0_1), amount_1 - middle_amount_in); - - let pair_address_1_2 = test.factory_contract.get_pair(&test.token_1.address, &test.token_2.address); - assert_eq!(test.token_1.balance(&pair_address_1_2), amount_1 + middle_amount_in); - assert_eq!(test.token_2.balance(&pair_address_1_2), amount_2 - expected_amount_out); -} diff --git a/contracts/aggregator/Cargo.toml b/contracts/aggregator/Cargo.toml index ae5499c0..5de05358 100644 --- a/contracts/aggregator/Cargo.toml +++ b/contracts/aggregator/Cargo.toml @@ -16,7 +16,6 @@ crate-type = ["cdylib"] [dependencies] soroban-sdk = { workspace = true } -adapter-interface = { workspace = true } [dev-dependencies] soroban-sdk = { workspace = true, features = ["testutils"] } diff --git a/contracts/aggregator/Makefile b/contracts/aggregator/Makefile index 72cde85d..0e79aae8 100644 --- a/contracts/aggregator/Makefile +++ b/contracts/aggregator/Makefile @@ -6,9 +6,9 @@ test: build cargo test build: - cargo build --target wasm32-unknown-unknown --release - soroban contract optimize --wasm ../target/wasm32-unknown-unknown/release/soroswap_aggregator.wasm - @rm ../target/wasm32-unknown-unknown/release/soroswap_aggregator.wasm + cargo build --target wasm32v1-none --release + stellar contract optimize --wasm ../target/wasm32v1-none/release/soroswap_aggregator.wasm + @rm ../target/wasm32v1-none/release/soroswap_aggregator.wasm fmt: cargo fmt --all --check diff --git a/contracts/aggregator/aqua_contracts/README.md b/contracts/aggregator/aqua_contracts/README.md deleted file mode 100644 index cf3b738a..00000000 --- a/contracts/aggregator/aqua_contracts/README.md +++ /dev/null @@ -1,112 +0,0 @@ -# Aqua Contracts: -- Router: https://stellar.expert/explorer/public/contract/CBQDHNBFBZYE4MKPWBSJOPIYLW4SFSXAXUTSXJN76GNKYVYPCKWC6QUK -- Swap Chained -- Swap directo tambien lo envia como swap chained - -Swap 3 hops variable -https://stellar.expert/explorer/public/tx/aef69e0158e9fe689b123f1b174b2133b34f98da4a29f3b972b6b91fd9791b1c -swap_chained( - GA3C…T5SO, - [ - [ - [CAS3…OWMA, CAUI…OJPK], - suAvz8pslvitXL2E53hKd3s22clqJFlALE9FhGKqt/A=bytes, - CAUI…OJPK // the next token in the hop - ], - [ - [CAUI…OJPK, CDOF…U2P4], - suAvz8pslvitXL2E53hKd3s22clqJFlALE9FhGKqt/A=bytes, - CDOF…U2P4 // the next token in the hop - ], - [ - [CCW6…MI75, CDOF…U2P4], - bi7nVssQUCDL1liedhAVGYxMhfLoXh5NN/KAtit4gw4=bytes, - CCW6…MI75 // the final token to obtain - ] - - ], - CAS3…OWMA, - 100000000u128, - 25701927u128) → 25961542u128 - -Swap 1 hop variable -https://stellar.expert/explorer/public/tx/4724ed29ae79bf3c8ca031e10564916a878df8a9e5215980e92d5a467ef4a622 - -swap_chained( - GA3C…T5SO, - [ - [ - [CAS3…OWMA, CAUI…OJPK], - suAvz8pslvitXL2E53hKd3s22clqJFlALE9FhGKqt/A=bytes, - CAUI…OJPK // the final token to obtain - ] - ], - CAS3…OWMA, - 100000000u128, - 37785920757u128) → 38167596724u12 - - -Swap 1 hop variable -https://stellar.expert/explorer/public/tx/e066acf7f6eb3d3ecb7f0bca70b1fc64ad529f738352c6af3091325a382738e1 -swap_chained( - GA3C…T5SO, - [ - [ - [CCW6…MI75, CDIK…FJKP], - yy5OG7xqTdImPNVSp7ZU4S499xjgaGS//WWSMG+HFb4=bytes, - CDIK…FJKP]], - CCW6…MI75, - 100000000u128, - 98918707u128) → 99917886u128 - -This also works with stable pool with more than 2 tokens: -https://stellar.expert/explorer/public/contract/CD6VHCKSUPGQVQPEQUI6EAEO6Z4PXMFTPHW3UTAOF7W4UF7TH7ZSKZBG -swap_chained( - GB3J…NDBC, - [ - [ - [CAS3…OWMA, CCW6…MI75], - suAvz8pslvitXL2E53hKd3s22clqJFlALE9FhGKqt/A=bytes, - CCW6…MI75 - ], - [ - [CCW6…MI75, CDIK…FJKP, CDOF…U2P4], - 2AETnx8GUW8X4LAUztB8IFsEQUHi14aUE/60BCyHPss=bytes, - CDIK…FJKP] - ], - CAS3…OWMA, - 220000000u128, - 57425672u128) → 57468384u128 - - - - # Strict Receive - https://stellar.expert/explorer/public/tx/7ee1805bce4fe383358c0387d9adaa56de9032b997a34cf5879ce528c846a124 - - ``` - fn swap_chained_strict_receive( - e: Env, - user: Address, - swaps_chain: Vec<(Vec
, BytesN<32>, Address)>, - token_in: Address, - out_amount: u128, // fixed amount of output token to receive - max_in: u128, // maximum input token amount allowed - ) -> u128 - - // Returns The amount of the input token spent after all swaps have been executed. - - ``` - - swap_chained_strict_receive( - GA3C…T5SO, - [ - [ - [CAS3…OWMA, CAUI…OJPK], - N7lV83CNrnSMrUZUQfytcLJv/icjhSJ6SnNyNK5Cm98=bytes, - CAUI…OJPK - ] - ], - CAS3…OWMA, - 100000000u128, - 263446u128) → - 260838 \ No newline at end of file diff --git a/contracts/aggregator/aqua_contracts/soroban_fees_collector_contract.wasm b/contracts/aggregator/aqua_contracts/soroban_fees_collector_contract.wasm deleted file mode 100755 index 794e211c..00000000 Binary files a/contracts/aggregator/aqua_contracts/soroban_fees_collector_contract.wasm and /dev/null differ diff --git a/contracts/aggregator/aqua_contracts/soroban_liquidity_pool_contract.wasm b/contracts/aggregator/aqua_contracts/soroban_liquidity_pool_contract.wasm deleted file mode 100755 index 17e1106f..00000000 Binary files a/contracts/aggregator/aqua_contracts/soroban_liquidity_pool_contract.wasm and /dev/null differ diff --git a/contracts/aggregator/aqua_contracts/soroban_liquidity_pool_liquidity_calculator_contract.wasm b/contracts/aggregator/aqua_contracts/soroban_liquidity_pool_liquidity_calculator_contract.wasm deleted file mode 100755 index e236dcd1..00000000 Binary files a/contracts/aggregator/aqua_contracts/soroban_liquidity_pool_liquidity_calculator_contract.wasm and /dev/null differ diff --git a/contracts/aggregator/aqua_contracts/soroban_liquidity_pool_plane_contract.wasm b/contracts/aggregator/aqua_contracts/soroban_liquidity_pool_plane_contract.wasm deleted file mode 100755 index 04b4bb8e..00000000 Binary files a/contracts/aggregator/aqua_contracts/soroban_liquidity_pool_plane_contract.wasm and /dev/null differ diff --git a/contracts/aggregator/aqua_contracts/soroban_liquidity_pool_router_contract.wasm b/contracts/aggregator/aqua_contracts/soroban_liquidity_pool_router_contract.wasm deleted file mode 100755 index 11c888f3..00000000 Binary files a/contracts/aggregator/aqua_contracts/soroban_liquidity_pool_router_contract.wasm and /dev/null differ diff --git a/contracts/aggregator/aqua_contracts/soroban_liquidity_pool_stableswap_contract.wasm b/contracts/aggregator/aqua_contracts/soroban_liquidity_pool_stableswap_contract.wasm deleted file mode 100755 index 6fcc38d0..00000000 Binary files a/contracts/aggregator/aqua_contracts/soroban_liquidity_pool_stableswap_contract.wasm and /dev/null differ diff --git a/contracts/aggregator/aqua_contracts/soroban_liquidity_pool_swap_router_contract.wasm b/contracts/aggregator/aqua_contracts/soroban_liquidity_pool_swap_router_contract.wasm deleted file mode 100755 index f24094fe..00000000 Binary files a/contracts/aggregator/aqua_contracts/soroban_liquidity_pool_swap_router_contract.wasm and /dev/null differ diff --git a/contracts/aggregator/aqua_contracts/soroban_locker_feed_contract.wasm b/contracts/aggregator/aqua_contracts/soroban_locker_feed_contract.wasm deleted file mode 100644 index e144dc9d..00000000 Binary files a/contracts/aggregator/aqua_contracts/soroban_locker_feed_contract.wasm and /dev/null differ diff --git a/contracts/aggregator/aqua_contracts/soroban_token_contract.wasm b/contracts/aggregator/aqua_contracts/soroban_token_contract.wasm deleted file mode 100755 index 7f2509d1..00000000 Binary files a/contracts/aggregator/aqua_contracts/soroban_token_contract.wasm and /dev/null differ diff --git a/contracts/aggregator/comet_contracts/comet_factory.wasm b/contracts/aggregator/comet_contracts/comet_factory.wasm deleted file mode 100644 index 9db8020a..00000000 Binary files a/contracts/aggregator/comet_contracts/comet_factory.wasm and /dev/null differ diff --git a/contracts/aggregator/comet_contracts/comet_pool.wasm b/contracts/aggregator/comet_contracts/comet_pool.wasm deleted file mode 100644 index de1b1fa4..00000000 Binary files a/contracts/aggregator/comet_contracts/comet_pool.wasm and /dev/null differ diff --git a/contracts/aggregator/phoenix_contracts/phoenix_factory.wasm b/contracts/aggregator/phoenix_contracts/phoenix_factory.wasm deleted file mode 100644 index e5de540c..00000000 Binary files a/contracts/aggregator/phoenix_contracts/phoenix_factory.wasm and /dev/null differ diff --git a/contracts/aggregator/phoenix_contracts/phoenix_multihop.wasm b/contracts/aggregator/phoenix_contracts/phoenix_multihop.wasm deleted file mode 100644 index eab42850..00000000 Binary files a/contracts/aggregator/phoenix_contracts/phoenix_multihop.wasm and /dev/null differ diff --git a/contracts/aggregator/phoenix_contracts/phoenix_pool.wasm b/contracts/aggregator/phoenix_contracts/phoenix_pool.wasm deleted file mode 100644 index 67b08217..00000000 Binary files a/contracts/aggregator/phoenix_contracts/phoenix_pool.wasm and /dev/null differ diff --git a/contracts/aggregator/phoenix_contracts/phoenix_pool_stable.wasm b/contracts/aggregator/phoenix_contracts/phoenix_pool_stable.wasm deleted file mode 100644 index 12c353ae..00000000 Binary files a/contracts/aggregator/phoenix_contracts/phoenix_pool_stable.wasm and /dev/null differ diff --git a/contracts/aggregator/phoenix_contracts/phoenix_stake.wasm b/contracts/aggregator/phoenix_contracts/phoenix_stake.wasm deleted file mode 100644 index 067070cd..00000000 Binary files a/contracts/aggregator/phoenix_contracts/phoenix_stake.wasm and /dev/null differ diff --git a/contracts/aggregator/phoenix_contracts/phoenix_vesting.wasm b/contracts/aggregator/phoenix_contracts/phoenix_vesting.wasm deleted file mode 100644 index c20c3458..00000000 Binary files a/contracts/aggregator/phoenix_contracts/phoenix_vesting.wasm and /dev/null differ diff --git a/contracts/aggregator/phoenix_contracts/soroban_token_contract.wasm b/contracts/aggregator/phoenix_contracts/soroban_token_contract.wasm deleted file mode 100644 index c6303503..00000000 Binary files a/contracts/aggregator/phoenix_contracts/soroban_token_contract.wasm and /dev/null differ diff --git a/contracts/aggregator/soroswap_contracts/soroban_token_contract.wasm b/contracts/aggregator/soroswap_contracts/soroban_token_contract.wasm deleted file mode 100755 index 23805cc4..00000000 Binary files a/contracts/aggregator/soroswap_contracts/soroban_token_contract.wasm and /dev/null differ diff --git a/contracts/aggregator/soroswap_contracts/soroswap_factory.wasm b/contracts/aggregator/soroswap_contracts/soroswap_factory.wasm deleted file mode 100755 index 4d308164..00000000 Binary files a/contracts/aggregator/soroswap_contracts/soroswap_factory.wasm and /dev/null differ diff --git a/contracts/aggregator/soroswap_contracts/soroswap_pair.wasm b/contracts/aggregator/soroswap_contracts/soroswap_pair.wasm deleted file mode 100755 index d47b7cf5..00000000 Binary files a/contracts/aggregator/soroswap_contracts/soroswap_pair.wasm and /dev/null differ diff --git a/contracts/aggregator/soroswap_contracts/soroswap_router.optimized.wasm b/contracts/aggregator/soroswap_contracts/soroswap_router.optimized.wasm deleted file mode 100644 index bd621c59..00000000 Binary files a/contracts/aggregator/soroswap_contracts/soroswap_router.optimized.wasm and /dev/null differ diff --git a/contracts/aggregator/soroswap_contracts/soroswap_router.wasm b/contracts/aggregator/soroswap_contracts/soroswap_router.wasm deleted file mode 100755 index 88963310..00000000 Binary files a/contracts/aggregator/soroswap_contracts/soroswap_router.wasm and /dev/null differ diff --git a/contracts/aggregator/src/adapters/aqua.rs b/contracts/aggregator/src/adapters/aqua.rs index a57ed61b..47e3719b 100644 --- a/contracts/aggregator/src/adapters/aqua.rs +++ b/contracts/aggregator/src/adapters/aqua.rs @@ -5,7 +5,7 @@ use soroban_sdk::Symbol; use crate::error::AggregatorError; soroban_sdk::contractimport!( - file = "./aqua_contracts/soroban_liquidity_pool_router_contract.wasm" + file = "../external_wasms/aqua_contracts/soroban_liquidity_pool_router_contract.wasm" ); pub type AquaRouterClient<'a> = Client<'a>; diff --git a/contracts/aggregator/src/adapters/comet.rs b/contracts/aggregator/src/adapters/comet.rs index fb794ff3..df86de22 100644 --- a/contracts/aggregator/src/adapters/comet.rs +++ b/contracts/aggregator/src/adapters/comet.rs @@ -2,7 +2,7 @@ use soroban_sdk::{vec, Address, Env, Vec}; use crate::error::AggregatorError; soroban_sdk::contractimport!( - file = "./comet_contracts/comet_pool.wasm" + file = "../external_wasms/comet_contracts/comet_pool.wasm" ); pub type CometPoolClient<'a> = Client<'a>; diff --git a/contracts/aggregator/src/adapters/phoenix.rs b/contracts/aggregator/src/adapters/phoenix.rs index 0261e5d9..0b7ab68c 100644 --- a/contracts/aggregator/src/adapters/phoenix.rs +++ b/contracts/aggregator/src/adapters/phoenix.rs @@ -6,7 +6,7 @@ use crate::error::AggregatorError; // use phoenix_contracts::PoolType; soroban_sdk::contractimport!( - file = "./phoenix_contracts/phoenix_multihop.wasm" + file = "../external_wasms/phoenix_contracts/phoenix_multihop.wasm" ); pub type PhoenixMultihopClient<'a> = Client<'a>; diff --git a/contracts/aggregator/src/adapters/soroswap.rs b/contracts/aggregator/src/adapters/soroswap.rs index 7b17f793..5319339b 100644 --- a/contracts/aggregator/src/adapters/soroswap.rs +++ b/contracts/aggregator/src/adapters/soroswap.rs @@ -3,7 +3,7 @@ use soroban_sdk::{Env, Address, Vec}; use crate::error::AggregatorError; soroban_sdk::contractimport!( - file = "./soroswap_contracts/soroswap_router.wasm" + file = "../external_wasms/soroswap_contracts/soroswap_router.wasm" ); pub type SoroswapRouterClient<'a> = Client<'a>; diff --git a/contracts/aggregator/src/lib.rs b/contracts/aggregator/src/lib.rs index 9101dd3d..9c577b4b 100644 --- a/contracts/aggregator/src/lib.rs +++ b/contracts/aggregator/src/lib.rs @@ -12,7 +12,6 @@ mod test; use error::AggregatorError; use models::{Protocol, Adapter, DexDistribution, MAX_DISTRIBUTION_LENGTH}; -use adapter_interface::AdapterClient; use storage::{ extend_instance_ttl, get_adapter, get_admin, get_protocol_ids, has_adapter, is_initialized, put_adapter, remove_adapter, set_admin, set_initialized, set_pause_protocol, @@ -105,17 +104,6 @@ fn calculate_distribution_amounts_and_check_paths( Ok(swap_amounts) } -pub fn get_adapter_client( - e: &Env, - protocol_id: Protocol, -) -> Result { - let adapter = get_adapter(&e, protocol_id.clone())?; - if adapter.paused { - return Err(AggregatorError::ProtocolPaused); - } - Ok(AdapterClient::new(&e, &adapter.router)) -} - /* SOROSWAP AGGREGATOR SMART CONTRACT INTERFACE: */ diff --git a/contracts/aggregator/src/test.rs b/contracts/aggregator/src/test.rs index 5a7d117c..62a609f3 100644 --- a/contracts/aggregator/src/test.rs +++ b/contracts/aggregator/src/test.rs @@ -46,7 +46,7 @@ use aqua_setup::{AquaSetup}; // mod deployer_contract { -// soroban_sdk::contractimport!(file = "../target/wasm32-unknown-unknown/release/soroswap_aggregator_deployer.optimized.wasm"); +// soroban_sdk::contractimport!(file = "../target/wasm32v1-none/release/soroswap_aggregator_deployer.optimized.wasm"); // pub type DeployerClient<'a> = Client<'a>; // } // pub use deployer_contract::DeployerClient; @@ -63,7 +63,7 @@ fn create_soroswap_aggregator<'a>(e: &Env) -> SoroswapAggregatorClient<'a> { } pub mod soroswap_aggregator_contract { - soroban_sdk::contractimport!(file = "../target/wasm32-unknown-unknown/release/soroswap_aggregator.optimized.wasm"); + soroban_sdk::contractimport!(file = "../target/wasm32v1-none/release/soroswap_aggregator.optimized.wasm"); pub type SoroswapAggregatorClientFromWasm<'a> = Client<'a>; } use soroswap_aggregator_contract::{SoroswapAggregatorClientFromWasm, Adapter as AdapterFromWasm}; @@ -71,7 +71,7 @@ use soroswap_aggregator_contract::{SoroswapAggregatorClientFromWasm, Adapter as // Token Contract mod token { - soroban_sdk::contractimport!(file = "../adapters/soroswap/soroswap_contracts/soroban_token_contract.wasm"); + soroban_sdk::contractimport!(file = "../external_wasms/soroswap_contracts/soroban_token_contract.wasm"); pub type TokenClient<'a> = Client<'a>; } use token::TokenClient; @@ -81,7 +81,7 @@ pub fn create_token_contract<'a>(e: &Env, admin: &Address) -> TokenClient<'a> { // pub fn install_token_wasm(env: &Env) -> BytesN<32> { // soroban_sdk::contractimport!( -// file = "../adapters/soroswap/soroswap_contracts/soroban_token_contract.wasm" +// file = "../external_wasms/soroswap_contracts/soroban_token_contract.wasm" // ); // env.deployer().upload_contract_wasm(WASM) // } diff --git a/contracts/aggregator/src/test/aqua_setup.rs b/contracts/aggregator/src/test/aqua_setup.rs index c2f68cce..da739c0c 100644 --- a/contracts/aggregator/src/test/aqua_setup.rs +++ b/contracts/aggregator/src/test/aqua_setup.rs @@ -10,7 +10,7 @@ use soroban_sdk::{Address, BytesN, Env, Symbol, Vec}; #[allow(clippy::too_many_arguments)] pub mod router { soroban_sdk::contractimport!( - file = "./aqua_contracts/soroban_liquidity_pool_router_contract.wasm" + file = "../external_wasms/aqua_contracts/soroban_liquidity_pool_router_contract.wasm" ); } @@ -25,7 +25,7 @@ pub fn create_liqpool_router_contract<'a>(e: &Env) -> AquaRouter<'a> { pub mod test_token { soroban_sdk::contractimport!( - file = "./aqua_contracts/soroban_token_contract.wasm" + file = "../external_wasms/aqua_contracts/soroban_token_contract.wasm" ); } @@ -43,7 +43,7 @@ pub fn create_token_contract<'a>(e: &Env, admin: &Address) -> test_token::Client pub fn install_token_wasm(env: &Env) -> BytesN<32> { soroban_sdk::contractimport!( - file = "./aqua_contracts/soroban_token_contract.wasm" + file = "../external_wasms/aqua_contracts/soroban_token_contract.wasm" ); env.deployer().upload_contract_wasm(WASM) } @@ -57,7 +57,7 @@ pub fn install_token_wasm(env: &Env) -> BytesN<32> { pub mod standard_pool { soroban_sdk::contractimport!( - file = "./aqua_contracts/soroban_liquidity_pool_contract.wasm" + file = "../external_wasms/aqua_contracts/soroban_liquidity_pool_contract.wasm" ); } @@ -67,7 +67,7 @@ pub fn install_liq_pool_hash(e: &Env) -> BytesN<32> { pub mod stableswap_pool { soroban_sdk::contractimport!( - file = "./aqua_contracts/soroban_liquidity_pool_stableswap_contract.wasm" + file = "../external_wasms/aqua_contracts/soroban_liquidity_pool_stableswap_contract.wasm" ); } @@ -78,7 +78,7 @@ pub fn install_stableswap_liq_pool_hash(e: &Env) -> BytesN<32> { mod pool_plane { soroban_sdk::contractimport!( file = - "./aqua_contracts/soroban_liquidity_pool_plane_contract.wasm" + "../external_wasms/aqua_contracts/soroban_liquidity_pool_plane_contract.wasm" ); } @@ -89,7 +89,7 @@ pub fn create_plane_contract<'a>(e: &Env) -> pool_plane::Client<'a> { mod liquidity_calculator { soroban_sdk::contractimport!( file = - "./aqua_contracts/soroban_liquidity_pool_liquidity_calculator_contract.wasm" + "../external_wasms/aqua_contracts/soroban_liquidity_pool_liquidity_calculator_contract.wasm" ); } @@ -99,7 +99,7 @@ pub fn create_liquidity_calculator_contract<'a>(e: &Env) -> liquidity_calculator mod reward_boost_feed { soroban_sdk::contractimport!( - file = "./aqua_contracts/soroban_locker_feed_contract.wasm" + file = "../external_wasms/aqua_contracts/soroban_locker_feed_contract.wasm" ); } diff --git a/contracts/aggregator/src/test/comet_setup.rs b/contracts/aggregator/src/test/comet_setup.rs index a4a94654..cd7df277 100644 --- a/contracts/aggregator/src/test/comet_setup.rs +++ b/contracts/aggregator/src/test/comet_setup.rs @@ -5,7 +5,7 @@ use soroban_sdk::{vec, Address, BytesN, Env, IntoVal, String, Symbol, Val, Vec}; use test_utils::phoenix_setup::{generate_salt, DeployerClient}; pub mod pair { - soroban_sdk::contractimport!(file = "../adapters/comet/comet_contracts/comet_pool.wasm"); + soroban_sdk::contractimport!(file = "../external_wasms/comet_contracts/comet_pool.wasm"); pub type CometPairClient<'a> = Client<'a>; } @@ -14,13 +14,13 @@ fn pair_contract_wasm(e: &Env) -> BytesN<32> { } pub mod factory { - soroban_sdk::contractimport!(file = "../adapters/comet/comet_contracts/comet_factory.wasm"); + soroban_sdk::contractimport!(file = "../external_wasms/comet_contracts/comet_factory.wasm"); pub type CometFactoryClient<'a> = Client<'a>; } use factory::CometFactoryClient; pub mod comet_adapter{ - soroban_sdk::contractimport!(file = "../target/wasm32-unknown-unknown/release/comet_adapter.optimized.wasm"); + soroban_sdk::contractimport!(file = "../target/wasm32v1-none/release/comet_adapter.optimized.wasm"); pub type CometAdapterClient<'a> = Client<'a>; } diff --git a/contracts/aggregator/src/test/phoenix_setup.rs b/contracts/aggregator/src/test/phoenix_setup.rs index e2df757b..af0a7449 100644 --- a/contracts/aggregator/src/test/phoenix_setup.rs +++ b/contracts/aggregator/src/test/phoenix_setup.rs @@ -4,7 +4,7 @@ use super::{generate_salt, DeployerClient}; mod phoenix_adapter { soroban_sdk::contractimport!( file = - "../target/wasm32-unknown-unknown/release/phoenix_adapter.optimized.wasm" + "../target/wasm32v1-none/release/phoenix_adapter.optimized.wasm" ); pub type SoroswapAggregatorAdapterForPhoenixClient<'a> = Client<'a>; } @@ -60,7 +60,7 @@ use soroban_sdk::{ #[allow(clippy::too_many_arguments)] pub mod factory { soroban_sdk::contractimport!( - file = "../adapters/phoenix/phoenix_contracts/phoenix_factory.wasm" + file = "../external_wasms/phoenix_contracts/phoenix_factory.wasm" ); } use factory::{LiquidityPoolInitInfo, StakeInitInfo, TokenInitInfo}; @@ -71,14 +71,14 @@ pub use factory::Client as PhoenixFactory; /* ************* MULTIHOP ************* */ #[allow(clippy::too_many_arguments)] pub mod multihop { - soroban_sdk::contractimport!(file = "../adapters/phoenix/phoenix_contracts/phoenix_multihop.wasm"); + soroban_sdk::contractimport!(file = "../external_wasms/phoenix_contracts/phoenix_multihop.wasm"); pub type MultihopClient<'a> = Client<'a>; } pub use multihop::MultihopClient; pub fn install_multihop_wasm(env: &Env) -> BytesN<32> { soroban_sdk::contractimport!( - file = "../adapters/phoenix/phoenix_contracts/phoenix_multihop.wasm" + file = "../external_wasms/phoenix_contracts/phoenix_multihop.wasm" ); env.deployer().upload_contract_wasm(WASM) } @@ -99,7 +99,7 @@ pub fn deploy_multihop_contract<'a>( #[allow(clippy::too_many_arguments)] pub mod stable_contract { soroban_sdk::contractimport!( - file = "../adapters/phoenix/phoenix_contracts/phoenix_pool_stable.wasm" + file = "../external_wasms/phoenix_contracts/phoenix_pool_stable.wasm" ); } @@ -113,7 +113,7 @@ pub fn install_stable_contract(env: &Env) -> BytesN<32> { #[allow(clippy::too_many_arguments)] pub mod lp_contract { soroban_sdk::contractimport!( - file = "../adapters/phoenix/phoenix_contracts/phoenix_pool.wasm" + file = "../external_wasms/phoenix_contracts/phoenix_pool.wasm" ); } @@ -127,7 +127,7 @@ pub fn install_lp_contract(env: &Env) -> BytesN<32> { #[allow(clippy::too_many_arguments)] pub fn install_stake_wasm(env: &Env) -> BytesN<32> { soroban_sdk::contractimport!( - file = "../adapters/phoenix/phoenix_contracts/phoenix_stake.wasm" + file = "../external_wasms/phoenix_contracts/phoenix_stake.wasm" ); env.deployer().upload_contract_wasm(WASM) } diff --git a/contracts/aggregator/src/test/soroswap_setup.rs b/contracts/aggregator/src/test/soroswap_setup.rs index d54fb982..a5c95f1c 100644 --- a/contracts/aggregator/src/test/soroswap_setup.rs +++ b/contracts/aggregator/src/test/soroswap_setup.rs @@ -4,14 +4,14 @@ use soroban_sdk::{ use test_utils::phoenix_setup::{DeployerClient, generate_salt}; fn pair_contract_wasm(e: &Env) -> BytesN<32> { soroban_sdk::contractimport!( - file = "../adapters/soroswap/soroswap_contracts/soroswap_pair.wasm" + file = "../external_wasms/soroswap_contracts/soroswap_pair.wasm" ); e.deployer().upload_contract_wasm(WASM) } // SoroswapFactory Contract mod factory { - soroban_sdk::contractimport!(file = "../adapters/soroswap/soroswap_contracts/soroswap_factory.wasm"); + soroban_sdk::contractimport!(file = "../external_wasms/soroswap_contracts/soroswap_factory.wasm"); pub type SoroswapFactoryClient<'a> = Client<'a>; } use factory::SoroswapFactoryClient; @@ -26,7 +26,7 @@ pub fn create_soroswap_factory<'a>(e: &Env, setter: &Address) -> SoroswapFactory // SoroswapRouter Contract mod router { - soroban_sdk::contractimport!(file = "../adapters/soroswap/soroswap_contracts/soroswap_router.optimized.wasm"); + soroban_sdk::contractimport!(file = "../external_wasms/soroswap_contracts/soroswap_router.optimized.wasm"); pub type SoroswapRouterClient<'a> = Client<'a>; } pub use router::SoroswapRouterClient; @@ -42,7 +42,7 @@ pub fn create_soroswap_router<'a>(e: &Env) -> SoroswapRouterClient<'a> { // SoroswapAggregatorAdapter Contract // For Soroswap mod soroswap_adapter { - soroban_sdk::contractimport!(file = "../target/wasm32-unknown-unknown/release/soroswap_adapter.optimized.wasm"); + soroban_sdk::contractimport!(file = "../target/wasm32v1-none/release/soroswap_adapter.optimized.wasm"); pub type SoroswapAggregatorAdapterForSoroswapClient<'a> = Client<'a>; } pub use soroswap_adapter::SoroswapAggregatorAdapterForSoroswapClient; diff --git a/contracts/deployer/Cargo.toml b/contracts/deployer/Cargo.toml index eb99c822..40e62a9d 100644 --- a/contracts/deployer/Cargo.toml +++ b/contracts/deployer/Cargo.toml @@ -16,7 +16,6 @@ crate-type = ["cdylib"] [dependencies] soroban-sdk = { workspace = true } -adapter-interface = { workspace = true } [dev-dependencies] soroban-sdk = { workspace = true, features = ["testutils"] } \ No newline at end of file diff --git a/contracts/deployer/Makefile b/contracts/deployer/Makefile index dffb5a61..e7e2baef 100644 --- a/contracts/deployer/Makefile +++ b/contracts/deployer/Makefile @@ -6,9 +6,9 @@ test: build cargo test build: - cargo build --target wasm32-unknown-unknown --release - soroban contract optimize --wasm ../target/wasm32-unknown-unknown/release/soroswap_aggregator_deployer.wasm - @rm ../target/wasm32-unknown-unknown/release/soroswap_aggregator_deployer.wasm + cargo build --target wasm32v1-none --release + stellar contract optimize --wasm ../target/wasm32v1-none/release/soroswap_aggregator_deployer.wasm + @rm ../target/wasm32v1-none/release/soroswap_aggregator_deployer.wasm fmt: cargo fmt --all --check diff --git a/contracts/deployer/src/test.rs b/contracts/deployer/src/test.rs index 40004a22..e1d2a5e5 100644 --- a/contracts/deployer/src/test.rs +++ b/contracts/deployer/src/test.rs @@ -14,21 +14,21 @@ use soroswap_aggregator_contract::Adapter; mod soroswap_adapter_contract { soroban_sdk::contractimport!( file = - "../target/wasm32-unknown-unknown/release/soroswap_adapter.optimized.wasm" + "../target/wasm32v1-none/release/soroswap_adapter.optimized.wasm" ); } mod phoenix_adapter_contract { soroban_sdk::contractimport!( file = - "../target/wasm32-unknown-unknown/release/phoenix_adapter.optimized.wasm" + "../target/wasm32v1-none/release/phoenix_adapter.optimized.wasm" ); } mod soroswap_aggregator_contract { soroban_sdk::contractimport!( file = - "../target/wasm32-unknown-unknown/release/soroswap_aggregator.optimized.wasm" + "../target/wasm32v1-none/release/soroswap_aggregator.optimized.wasm" ); } diff --git a/contracts/adapters/aqua/aqua_contracts/README.md b/contracts/external_wasms/aqua_contracts/README.md similarity index 100% rename from contracts/adapters/aqua/aqua_contracts/README.md rename to contracts/external_wasms/aqua_contracts/README.md diff --git a/contracts/adapters/aqua/aqua_contracts/soroban_fees_collector_contract.wasm b/contracts/external_wasms/aqua_contracts/soroban_fees_collector_contract.wasm similarity index 100% rename from contracts/adapters/aqua/aqua_contracts/soroban_fees_collector_contract.wasm rename to contracts/external_wasms/aqua_contracts/soroban_fees_collector_contract.wasm diff --git a/contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_contract.wasm b/contracts/external_wasms/aqua_contracts/soroban_liquidity_pool_contract.wasm similarity index 100% rename from contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_contract.wasm rename to contracts/external_wasms/aqua_contracts/soroban_liquidity_pool_contract.wasm diff --git a/contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_liquidity_calculator_contract.wasm b/contracts/external_wasms/aqua_contracts/soroban_liquidity_pool_liquidity_calculator_contract.wasm similarity index 100% rename from contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_liquidity_calculator_contract.wasm rename to contracts/external_wasms/aqua_contracts/soroban_liquidity_pool_liquidity_calculator_contract.wasm diff --git a/contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_plane_contract.wasm b/contracts/external_wasms/aqua_contracts/soroban_liquidity_pool_plane_contract.wasm similarity index 100% rename from contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_plane_contract.wasm rename to contracts/external_wasms/aqua_contracts/soroban_liquidity_pool_plane_contract.wasm diff --git a/contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_router_contract.wasm b/contracts/external_wasms/aqua_contracts/soroban_liquidity_pool_router_contract.wasm similarity index 100% rename from contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_router_contract.wasm rename to contracts/external_wasms/aqua_contracts/soroban_liquidity_pool_router_contract.wasm diff --git a/contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_stableswap_contract.wasm b/contracts/external_wasms/aqua_contracts/soroban_liquidity_pool_stableswap_contract.wasm similarity index 100% rename from contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_stableswap_contract.wasm rename to contracts/external_wasms/aqua_contracts/soroban_liquidity_pool_stableswap_contract.wasm diff --git a/contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_swap_router_contract.wasm b/contracts/external_wasms/aqua_contracts/soroban_liquidity_pool_swap_router_contract.wasm similarity index 100% rename from contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_swap_router_contract.wasm rename to contracts/external_wasms/aqua_contracts/soroban_liquidity_pool_swap_router_contract.wasm diff --git a/contracts/adapters/aqua/aqua_contracts/soroban_locker_feed_contract.wasm b/contracts/external_wasms/aqua_contracts/soroban_locker_feed_contract.wasm similarity index 100% rename from contracts/adapters/aqua/aqua_contracts/soroban_locker_feed_contract.wasm rename to contracts/external_wasms/aqua_contracts/soroban_locker_feed_contract.wasm diff --git a/contracts/adapters/aqua/aqua_contracts/soroban_token_contract.wasm b/contracts/external_wasms/aqua_contracts/soroban_token_contract.wasm similarity index 100% rename from contracts/adapters/aqua/aqua_contracts/soroban_token_contract.wasm rename to contracts/external_wasms/aqua_contracts/soroban_token_contract.wasm diff --git a/contracts/adapters/comet/comet_contracts/comet_factory.wasm b/contracts/external_wasms/comet_contracts/comet_factory.wasm similarity index 100% rename from contracts/adapters/comet/comet_contracts/comet_factory.wasm rename to contracts/external_wasms/comet_contracts/comet_factory.wasm diff --git a/contracts/adapters/comet/comet_contracts/comet_pool.wasm b/contracts/external_wasms/comet_contracts/comet_pool.wasm similarity index 100% rename from contracts/adapters/comet/comet_contracts/comet_pool.wasm rename to contracts/external_wasms/comet_contracts/comet_pool.wasm diff --git a/contracts/adapters/phoenix/phoenix_contracts/phoenix_factory.wasm b/contracts/external_wasms/phoenix_contracts/phoenix_factory.wasm similarity index 100% rename from contracts/adapters/phoenix/phoenix_contracts/phoenix_factory.wasm rename to contracts/external_wasms/phoenix_contracts/phoenix_factory.wasm diff --git a/contracts/adapters/phoenix/phoenix_contracts/phoenix_multihop.wasm b/contracts/external_wasms/phoenix_contracts/phoenix_multihop.wasm similarity index 100% rename from contracts/adapters/phoenix/phoenix_contracts/phoenix_multihop.wasm rename to contracts/external_wasms/phoenix_contracts/phoenix_multihop.wasm diff --git a/contracts/adapters/phoenix/phoenix_contracts/phoenix_pool.wasm b/contracts/external_wasms/phoenix_contracts/phoenix_pool.wasm similarity index 100% rename from contracts/adapters/phoenix/phoenix_contracts/phoenix_pool.wasm rename to contracts/external_wasms/phoenix_contracts/phoenix_pool.wasm diff --git a/contracts/adapters/phoenix/phoenix_contracts/phoenix_pool_stable.wasm b/contracts/external_wasms/phoenix_contracts/phoenix_pool_stable.wasm similarity index 100% rename from contracts/adapters/phoenix/phoenix_contracts/phoenix_pool_stable.wasm rename to contracts/external_wasms/phoenix_contracts/phoenix_pool_stable.wasm diff --git a/contracts/adapters/phoenix/phoenix_contracts/phoenix_stake.wasm b/contracts/external_wasms/phoenix_contracts/phoenix_stake.wasm similarity index 100% rename from contracts/adapters/phoenix/phoenix_contracts/phoenix_stake.wasm rename to contracts/external_wasms/phoenix_contracts/phoenix_stake.wasm diff --git a/contracts/adapters/phoenix/phoenix_contracts/phoenix_vesting.wasm b/contracts/external_wasms/phoenix_contracts/phoenix_vesting.wasm similarity index 100% rename from contracts/adapters/phoenix/phoenix_contracts/phoenix_vesting.wasm rename to contracts/external_wasms/phoenix_contracts/phoenix_vesting.wasm diff --git a/contracts/adapters/phoenix/phoenix_contracts/soroban_token_contract.wasm b/contracts/external_wasms/phoenix_contracts/soroban_token_contract.wasm similarity index 100% rename from contracts/adapters/phoenix/phoenix_contracts/soroban_token_contract.wasm rename to contracts/external_wasms/phoenix_contracts/soroban_token_contract.wasm diff --git a/contracts/adapters/soroswap/soroswap_contracts/soroban_token_contract.wasm b/contracts/external_wasms/soroswap_contracts/soroban_token_contract.wasm similarity index 100% rename from contracts/adapters/soroswap/soroswap_contracts/soroban_token_contract.wasm rename to contracts/external_wasms/soroswap_contracts/soroban_token_contract.wasm diff --git a/contracts/adapters/soroswap/soroswap_contracts/soroswap_factory.wasm b/contracts/external_wasms/soroswap_contracts/soroswap_factory.wasm similarity index 100% rename from contracts/adapters/soroswap/soroswap_contracts/soroswap_factory.wasm rename to contracts/external_wasms/soroswap_contracts/soroswap_factory.wasm diff --git a/contracts/adapters/soroswap/soroswap_contracts/soroswap_pair.wasm b/contracts/external_wasms/soroswap_contracts/soroswap_pair.wasm similarity index 100% rename from contracts/adapters/soroswap/soroswap_contracts/soroswap_pair.wasm rename to contracts/external_wasms/soroswap_contracts/soroswap_pair.wasm diff --git a/contracts/adapters/soroswap/soroswap_contracts/soroswap_router.optimized.wasm b/contracts/external_wasms/soroswap_contracts/soroswap_router.optimized.wasm similarity index 100% rename from contracts/adapters/soroswap/soroswap_contracts/soroswap_router.optimized.wasm rename to contracts/external_wasms/soroswap_contracts/soroswap_router.optimized.wasm diff --git a/contracts/adapters/soroswap/soroswap_contracts/soroswap_router.wasm b/contracts/external_wasms/soroswap_contracts/soroswap_router.wasm similarity index 100% rename from contracts/adapters/soroswap/soroswap_contracts/soroswap_router.wasm rename to contracts/external_wasms/soroswap_contracts/soroswap_router.wasm diff --git a/contracts/test-utils/src/phoenix_setup.rs b/contracts/test-utils/src/phoenix_setup.rs index ccca41ae..ef0b3c57 100644 --- a/contracts/test-utils/src/phoenix_setup.rs +++ b/contracts/test-utils/src/phoenix_setup.rs @@ -22,7 +22,7 @@ use soroban_sdk::{ #[allow(clippy::too_many_arguments)] pub mod factory { soroban_sdk::contractimport!( - file = "../adapters/phoenix/phoenix_contracts/phoenix_factory.wasm" + file = "../external_wasms/phoenix_contracts/phoenix_factory.wasm" ); } use factory::{LiquidityPoolInitInfo, StakeInitInfo, TokenInitInfo}; @@ -34,14 +34,14 @@ pub use factory::PoolType; /* ************* MULTIHOP ************* */ #[allow(clippy::too_many_arguments)] pub mod multihop { - soroban_sdk::contractimport!(file = "../adapters/phoenix/phoenix_contracts/phoenix_multihop.wasm"); + soroban_sdk::contractimport!(file = "../external_wasms/phoenix_contracts/phoenix_multihop.wasm"); pub type MultihopClient<'a> = Client<'a>; } pub use multihop::MultihopClient; pub fn install_multihop_wasm(env: &Env) -> BytesN<32> { soroban_sdk::contractimport!( - file = "../adapters/phoenix/phoenix_contracts/phoenix_multihop.wasm" + file = "../external_wasms/phoenix_contracts/phoenix_multihop.wasm" ); env.deployer().upload_contract_wasm(WASM) } @@ -60,7 +60,7 @@ pub fn deploy_multihop_contract<'a>( pub mod token_contract { soroban_sdk::contractimport!( - file = "../adapters/phoenix/phoenix_contracts/soroban_token_contract.wasm" + file = "../external_wasms/phoenix_contracts/soroban_token_contract.wasm" ); } @@ -83,7 +83,7 @@ pub use token_contract::Client as TokenClient; pub fn install_token_wasm(env: &Env) -> BytesN<32> { soroban_sdk::contractimport!( - file = "../adapters/phoenix/phoenix_contracts/soroban_token_contract.wasm" + file = "../external_wasms/phoenix_contracts/soroban_token_contract.wasm" ); env.deployer().upload_contract_wasm(WASM) } @@ -98,7 +98,7 @@ pub fn deploy_token_contract<'a>(env: & Env, admin: & Address) -> token_contract #[allow(clippy::too_many_arguments)] pub mod stable_contract { soroban_sdk::contractimport!( - file = "../adapters/phoenix/phoenix_contracts/phoenix_pool_stable.wasm" + file = "../external_wasms/phoenix_contracts/phoenix_pool_stable.wasm" ); } @@ -111,7 +111,7 @@ pub fn install_stable_contract(env: &Env) -> BytesN<32> { #[allow(clippy::too_many_arguments)] pub mod lp_contract { soroban_sdk::contractimport!( - file = "../adapters/phoenix/phoenix_contracts/phoenix_pool.wasm" + file = "../external_wasms/phoenix_contracts/phoenix_pool.wasm" ); } @@ -125,7 +125,7 @@ pub fn install_lp_contract(env: &Env) -> BytesN<32> { #[allow(clippy::too_many_arguments)] pub fn install_stake_wasm(env: &Env) -> BytesN<32> { soroban_sdk::contractimport!( - file = "../adapters/phoenix/phoenix_contracts/phoenix_stake.wasm" + file = "../external_wasms/phoenix_contracts/phoenix_stake.wasm" ); env.deployer().upload_contract_wasm(WASM) } @@ -381,7 +381,7 @@ impl<'a> PhoenixTest<'a> { mod deployer_contract { - soroban_sdk::contractimport!(file = "../target/wasm32-unknown-unknown/release/soroswap_aggregator_deployer.optimized.wasm"); + soroban_sdk::contractimport!(file = "../target/wasm32v1-none/release/soroswap_aggregator_deployer.optimized.wasm"); pub type DeployerClient<'a> = Client<'a>; } pub use deployer_contract::DeployerClient; @@ -404,7 +404,7 @@ pub fn create_deployer<'a>(e: &Env) -> DeployerClient<'a> { mod phoenix_adapter { soroban_sdk::contractimport!( file = - "../target/wasm32-unknown-unknown/release/phoenix_adapter.optimized.wasm" + "../target/wasm32v1-none/release/phoenix_adapter.optimized.wasm" ); pub type SoroswapAggregatorAdapterForPhoenixClient<'a> = Client<'a>; } diff --git a/scripts/quickstart.sh b/scripts/quickstart.sh index 8ed2c2fe..c4edb8bb 100644 --- a/scripts/quickstart.sh +++ b/scripts/quickstart.sh @@ -11,7 +11,7 @@ set -e case "$1" in standalone) echo "Using standalone network" - ARGS="--local --enable-soroban-diagnostic-events" + ARGS="--local" ;; futurenet) echo "Using Futurenet network" @@ -83,6 +83,4 @@ docker run --rm -ti \ stellar/quickstart:${quickstartHash} \ $ARGS \ --enable-soroban-rpc \ - --protocol-version ${protocolVersion} \ - --enable-soroban-diagnostic-events \ - "$@" # Pass through args from the CLI + --protocol-version ${protocolVersion} diff --git a/src/multi_test.ts b/src/multi_test.ts index 16490856..a0cfe8bb 100644 --- a/src/multi_test.ts +++ b/src/multi_test.ts @@ -12,16 +12,16 @@ export async function testAggregator(addressBook: AddressBook) { const usdc_address = "CCGCRYUTDRP52NOPS35FL7XIOZKKGQWSP3IYFE6B66KD4YOGJMWVC5PR" const xtar_address = "CDPU5TPNUMZ5JY3AUSENSINOEB324WI65AHI7PJBUKR3DJP2ULCBWQCS" - console.log("Getting protocols") - const result = await invokeContract( - 'aggregator', - addressBook, - 'get_protocols', - [], - loadedConfig.admin, - true - ); - console.log('🚀 « result:', scValToNative(result.result.retval)); + // console.log("Getting protocols") + // const result = await invokeContract( + // 'aggregator', + // addressBook, + // 'get_protocols', + // [], + // loadedConfig.admin, + // true + // ); + // console.log('🚀 « result:', scValToNative(result.result.retval)); console.log("-------------------------------------------------------"); console.log("Starting Balances"); diff --git a/src/test.ts b/src/test.ts index 8f2902c3..9380e597 100644 --- a/src/test.ts +++ b/src/test.ts @@ -12,16 +12,16 @@ export async function testAggregator(addressBook: AddressBook) { const usdc_address = "CCGCRYUTDRP52NOPS35FL7XIOZKKGQWSP3IYFE6B66KD4YOGJMWVC5PR" const xtar_address = "CDPU5TPNUMZ5JY3AUSENSINOEB324WI65AHI7PJBUKR3DJP2ULCBWQCS" - console.log("Getting protocols") - const result = await invokeContract( - 'aggregator', - addressBook, - 'get_protocols', - [], - loadedConfig.admin, - true - ); - console.log('🚀 « result:', scValToNative(result.result.retval)); + // console.log("Getting protocols") + // const result = await invokeContract( + // 'aggregator', + // addressBook, + // 'get_protocols', + // [], + // loadedConfig.admin, + // true + // ); + // console.log('🚀 « result:', scValToNative(result.result.retval)); console.log("-------------------------------------------------------"); console.log("Starting Balances"); diff --git a/src/utils/contract.ts b/src/utils/contract.ts index 1e6ba410..b300f53d 100644 --- a/src/utils/contract.ts +++ b/src/utils/contract.ts @@ -21,21 +21,21 @@ import { createTxBuilder, invoke, invokeTransaction } from './tx.js'; // Relative paths from __dirname const CONTRACT_REL_PATH: object = { deployer: - '../../contracts/target/wasm32-unknown-unknown/release/soroswap_aggregator_deployer.optimized.wasm', + '../../contracts/target/wasm32v1-none/release/soroswap_aggregator_deployer.optimized.wasm', aggregator: - '../../contracts/target/wasm32-unknown-unknown/release/soroswap_aggregator.optimized.wasm', - soroswap_adapter: '../../contracts/target/wasm32-unknown-unknown/release/soroswap_adapter.optimized.wasm', - phoenix_adapter: '../../contracts/target/wasm32-unknown-unknown/release/phoenix_adapter.optimized.wasm', + '../../contracts/target/wasm32v1-none/release/soroswap_aggregator.optimized.wasm', + soroswap_adapter: '../../contracts/target/wasm32v1-none/release/soroswap_adapter.optimized.wasm', + phoenix_adapter: '../../contracts/target/wasm32v1-none/release/phoenix_adapter.optimized.wasm', phoenix_factory: '../../contracts/adapters/phoenix/phoenix_contracts/phoenix_factory.wasm', phoenix_multihop: '../../contracts/adapters/phoenix/phoenix_contracts/phoenix_multihop.wasm', phoenix_token: '../../contracts/adapters/phoenix/phoenix_contracts/soroban_token_contract.wasm', phoenix_pool: '../../contracts/adapters/phoenix/phoenix_contracts/phoenix_pool.wasm', phoenix_stake: '../../contracts/adapters/phoenix/phoenix_contracts/phoenix_stake.wasm', phoenix_stable: '../../contracts/adapters/phoenix/phoenix_contracts/phoenix_pool_stable.wasm', - comet_adapter: '../../contracts/target/wasm32-unknown-unknown/release/comet_adapter.optimized.wasm', + comet_adapter: '../../contracts/target/wasm32v1-none/release/comet_adapter.optimized.wasm', comet_factory: '../../contracts/adapters/comet/comet_contracts/comet_factory.wasm', comet_pool: '../../contracts/adapters/comet/comet_contracts/comet_pool.wasm', - aqua_adapter: '../../contracts/target/wasm32-unknown-unknown/release/aqua_adapter.optimized.wasm', + aqua_adapter: '../../contracts/target/wasm32v1-none/release/aqua_adapter.optimized.wasm', }; const network = process.argv[2]; diff --git a/yarn.lock b/yarn.lock index da2bd4fe..31e75c6b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,22 +2,17 @@ # yarn lockfile v1 -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + version "4.8.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.8.0.tgz#0e3b5e45566d1bce1ec47d8aae2fc2ad77ad0894" + integrity sha512-MJQFqrZgcW0UNYLGOuQpey/oTN59vyWwplvCGZztn1cKz9agZPPYpJB7h2OMmuu7VLqkvEjN8feFZJmxNF9D+Q== dependencies: - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.3" -"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -34,17 +29,17 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.56.0": - version "8.56.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" - integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== -"@humanwhocodes/config-array@^0.11.13": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: - "@humanwhocodes/object-schema" "^2.0.2" + "@humanwhocodes/object-schema" "^2.0.3" debug "^4.3.1" minimatch "^3.0.5" @@ -53,10 +48,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" - integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@noble/curves@^1.9.6": version "1.9.7" @@ -91,10 +86,10 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@pkgr/core@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" - integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== +"@pkgr/core@^0.2.9": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.2.9.tgz#d229a7b7f9dac167a156992ef23c7f023653f53b" + integrity sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA== "@stellar/js-xdr@^3.1.2": version "3.1.2" @@ -114,9 +109,9 @@ sha.js "^2.4.12" "@stellar/stellar-sdk@^14.0.0": - version "14.0.0" - resolved "https://registry.yarnpkg.com/@stellar/stellar-sdk/-/stellar-sdk-14.0.0.tgz#f4d7a4141da3afb3a8b15ea2a7a43d529bb2773e" - integrity sha512-nZUxsxdCCF+YygS4ViUKjNUkCXY9Ly+En3Wsrd9jc5pdV9b+lWXiyv5AM5WLGLVB+qQrOeQWIBrQQuiYLsxTIQ== + version "14.1.1" + resolved "https://registry.yarnpkg.com/@stellar/stellar-sdk/-/stellar-sdk-14.1.1.tgz#b18f2a036221c4cb4a7690de7f465e144552b9c2" + integrity sha512-yu9E9fENEOgt26U/YaApQUUn6TRRhnEzzEOey3y43Nf4l08nbUmlzWYLMl9lcEzEilM68D3ENnEWxBuPylKLQQ== dependencies: "@stellar/stellar-base" "^14.0.0" axios "^1.8.4" @@ -132,113 +127,98 @@ resolved "https://registry.yarnpkg.com/@stellar/tsconfig/-/tsconfig-1.0.2.tgz#18e9b1a1d6076e116bb405d11fc034401155292d" integrity sha512-lC51QSlYRM8K3oGe0/WGPq+p9+u+yPzwZXSKrZXKOe4sq79vzfiqFbQyp5enOffFzXlahcDyTgY67mBOkJytfw== -"@types/json-schema@^7.0.12": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - "@types/node@^20.11.20": - version "20.11.20" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.20.tgz#f0a2aee575215149a62784210ad88b3a34843659" - integrity sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg== + version "20.19.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.19.12.tgz#1ce0874e557c4a2fee6285167a10a8a0b89f8ab8" + integrity sha512-lSOjyS6vdO2G2g2CWrETTV3Jz2zlCXHpu1rcubLKpz9oj+z/1CceHlj+yq53W+9zgb98nSov/wjEKYDNauD+Hw== dependencies: - undici-types "~5.26.4" - -"@types/semver@^7.5.0": - version "7.5.7" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.7.tgz#326f5fdda70d13580777bcaa1bc6fa772a5aef0e" - integrity sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg== + undici-types "~6.21.0" "@typescript-eslint/eslint-plugin@^7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.0.2.tgz#c13a34057be425167cc4a765158c46fdf2fd981d" - integrity sha512-/XtVZJtbaphtdrWjr+CJclaCVGPtOdBpFEnvtNf/jRV0IiEemRrL0qABex/nEt8isYcnFacm3nPHYQwL+Wb7qg== - dependencies: - "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "7.0.2" - "@typescript-eslint/type-utils" "7.0.2" - "@typescript-eslint/utils" "7.0.2" - "@typescript-eslint/visitor-keys" "7.0.2" - debug "^4.3.4" + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz#b16d3cf3ee76bf572fdf511e79c248bdec619ea3" + integrity sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/type-utils" "7.18.0" + "@typescript-eslint/utils" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" graphemer "^1.4.0" - ignore "^5.2.4" + ignore "^5.3.1" natural-compare "^1.4.0" - semver "^7.5.4" - ts-api-utils "^1.0.1" + ts-api-utils "^1.3.0" "@typescript-eslint/parser@^7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.0.2.tgz#95c31233d343db1ca1df8df7811b5b87ca7b1a68" - integrity sha512-GdwfDglCxSmU+QTS9vhz2Sop46ebNCXpPPvsByK7hu0rFGRHL+AusKQJ7SoN+LbLh6APFpQwHKmDSwN35Z700Q== - dependencies: - "@typescript-eslint/scope-manager" "7.0.2" - "@typescript-eslint/types" "7.0.2" - "@typescript-eslint/typescript-estree" "7.0.2" - "@typescript-eslint/visitor-keys" "7.0.2" + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0" + integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg== + dependencies: + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.0.2.tgz#6ec4cc03752758ddd1fdaae6fbd0ed9a2ca4fe63" - integrity sha512-l6sa2jF3h+qgN2qUMjVR3uCNGjWw4ahGfzIYsCtFrQJCjhbrDPdiihYT8FnnqFwsWX+20hK592yX9I2rxKTP4g== +"@typescript-eslint/scope-manager@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83" + integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== dependencies: - "@typescript-eslint/types" "7.0.2" - "@typescript-eslint/visitor-keys" "7.0.2" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" -"@typescript-eslint/type-utils@7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.0.2.tgz#a7fc0adff0c202562721357e7478207d380a757b" - integrity sha512-IKKDcFsKAYlk8Rs4wiFfEwJTQlHcdn8CLwLaxwd6zb8HNiMcQIFX9sWax2k4Cjj7l7mGS5N1zl7RCHOVwHq2VQ== +"@typescript-eslint/type-utils@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz#2165ffaee00b1fbbdd2d40aa85232dab6998f53b" + integrity sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA== dependencies: - "@typescript-eslint/typescript-estree" "7.0.2" - "@typescript-eslint/utils" "7.0.2" + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/utils" "7.18.0" debug "^4.3.4" - ts-api-utils "^1.0.1" + ts-api-utils "^1.3.0" -"@typescript-eslint/types@7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.0.2.tgz#b6edd108648028194eb213887d8d43ab5750351c" - integrity sha512-ZzcCQHj4JaXFjdOql6adYV4B/oFOFjPOC9XYwCaZFRvqN8Llfvv4gSxrkQkd2u4Ci62i2c6W6gkDwQJDaRc4nA== +"@typescript-eslint/types@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" + integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== -"@typescript-eslint/typescript-estree@7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.0.2.tgz#3c6dc8a3b9799f4ef7eca0d224ded01974e4cb39" - integrity sha512-3AMc8khTcELFWcKcPc0xiLviEvvfzATpdPj/DXuOGIdQIIFybf4DMT1vKRbuAEOFMwhWt7NFLXRkbjsvKZQyvw== +"@typescript-eslint/typescript-estree@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" + integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== dependencies: - "@typescript-eslint/types" "7.0.2" - "@typescript-eslint/visitor-keys" "7.0.2" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" - minimatch "9.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" -"@typescript-eslint/utils@7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.0.2.tgz#8756123054cd934c8ba7db6a6cffbc654b10b5c4" - integrity sha512-PZPIONBIB/X684bhT1XlrkjNZJIEevwkKDsdwfiu1WeqBxYEEdIgVDgm8/bbKHVu+6YOpeRqcfImTdImx/4Bsw== +"@typescript-eslint/utils@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" + integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.12" - "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "7.0.2" - "@typescript-eslint/types" "7.0.2" - "@typescript-eslint/typescript-estree" "7.0.2" - semver "^7.5.4" - -"@typescript-eslint/visitor-keys@7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.0.2.tgz#2899b716053ad7094962beb895d11396fc12afc7" - integrity sha512-8Y+YiBmqPighbm5xA2k4wKTxRzx9EkBu7Rlw+WHqMvRJ3RPz/BMBO9b2ru0LUNmXg120PHUXD5+SWFy2R8DqlQ== - dependencies: - "@typescript-eslint/types" "7.0.2" - eslint-visitor-keys "^3.4.1" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" + +"@typescript-eslint/visitor-keys@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" + integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== + dependencies: + "@typescript-eslint/types" "7.18.0" + eslint-visitor-keys "^3.4.3" "@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + version "1.3.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== acorn-jsx@^5.3.2: version "5.3.2" @@ -246,9 +226,9 @@ acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn@^8.9.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + version "8.15.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== ajv@^6.12.4: version "6.12.6" @@ -295,12 +275,12 @@ available-typed-arrays@^1.0.7: possible-typed-array-names "^1.0.0" axios@^1.8.4: - version "1.9.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.9.0.tgz#25534e3b72b54540077d33046f77e3b8d7081901" - integrity sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg== + version "1.11.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.11.0.tgz#c2ec219e35e414c025b2095e8b8280278478fdb6" + integrity sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA== 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: @@ -324,26 +304,26 @@ bignumber.js@^9.3.1: integrity sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ== 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== + version "1.1.12" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" 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== +braces@^3.0.3: + 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.0.1" + fill-range "^7.1.1" buffer@^6.0.3: version "6.0.3" @@ -417,20 +397,20 @@ concat-map@0.0.1: integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + 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.1, debug@^4.3.2, 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== + version "4.4.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== dependencies: - ms "2.1.2" + ms "^2.1.3" deep-is@^0.1.3: version "0.1.4" @@ -466,9 +446,9 @@ doctrine@^3.0.0: esutils "^2.0.2" dotenv@^16.4.5: - version "16.4.5" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" - integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + 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" @@ -496,23 +476,33 @@ es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: 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" + 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== eslint-config-prettier@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" - integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== + version "9.1.2" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz#90deb4fa0259592df774b600dbd1d2249a78ce91" + integrity sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ== eslint-plugin-prettier@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz#17cfade9e732cef32b5f5be53bd4e07afd8e67e1" - integrity sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw== + version "5.5.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz#9d61c4ea11de5af704d4edf108c82ccfa7f2e61c" + integrity sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg== dependencies: prettier-linter-helpers "^1.0.0" - synckit "^0.8.6" + synckit "^0.11.7" eslint-scope@^7.2.2: version "7.2.2" @@ -522,21 +512,21 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: +eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.56.0: - version "8.56.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" - integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.56.0" - "@humanwhocodes/config-array" "^0.11.13" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" @@ -581,9 +571,9 @@ espree@^9.6.0, espree@^9.6.1: eslint-visitor-keys "^3.4.1" esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -620,15 +610,15 @@ fast-diff@^1.1.2: integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-glob@^3.2.9: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.4" + micromatch "^4.0.8" fast-json-stable-stringify@^2.0.0: version "2.1.0" @@ -641,9 +631,9 @@ fast-levenshtein@^2.0.6: integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + version "1.19.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" + integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== dependencies: reusify "^1.0.4" @@ -661,10 +651,10 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -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== +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" @@ -686,14 +676,14 @@ flat-cache@^3.0.4: rimraf "^3.0.2" flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + version "3.3.3" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== 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" @@ -702,13 +692,15 @@ for-each@^0.3.5: 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== +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: @@ -721,7 +713,7 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -get-intrinsic@^1.2.4, get-intrinsic@^1.3.0: +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== @@ -836,15 +828,15 @@ ieee754@^1.2.1: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^5.2.0, ignore@^5.2.4: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== +ignore@^5.2.0, ignore@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -965,13 +957,6 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - math-intrinsics@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" @@ -982,12 +967,12 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== +micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" mime-db@1.52.0: @@ -1002,13 +987,6 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -1016,10 +994,17 @@ minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -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== +minimatch@^9.0.4: + 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" + +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== natural-compare@^1.4.0: version "1.4.0" @@ -1034,16 +1019,16 @@ once@^1.3.0: wrappy "1" optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" + word-wrap "^1.2.5" p-limit@^3.0.2: version "3.1.0" @@ -1109,9 +1094,9 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier@^3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" - integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== + version "3.6.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393" + integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ== proxy-from-env@^1.1.0: version "1.1.0" @@ -1141,9 +1126,9 @@ resolve-from@^4.0.0: integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== rimraf@^3.0.2: version "3.0.2" @@ -1164,12 +1149,10 @@ safe-buffer@^5.1.0, safe-buffer@^5.2.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -semver@^7.5.4: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" +semver@^7.6.0: + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== set-function-length@^1.2.2: version "1.2.2" @@ -1228,13 +1211,12 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -synckit@^0.8.6: - version "0.8.8" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.8.tgz#fe7fe446518e3d3d49f5e429f443cf08b6edfcd7" - integrity sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ== +synckit@^0.11.7: + version "0.11.11" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.11.11.tgz#c0b619cf258a97faa209155d9cd1699b5c998cb0" + integrity sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw== dependencies: - "@pkgr/core" "^0.1.0" - tslib "^2.6.2" + "@pkgr/core" "^0.2.9" text-table@^0.2.0: version "0.2.0" @@ -1262,15 +1244,10 @@ toml@^3.0.0: resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== -ts-api-utils@^1.0.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.2.1.tgz#f716c7e027494629485b21c0df6180f4d08f5e8b" - integrity sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA== - -tslib@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +ts-api-utils@^1.3.0: + version "1.4.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064" + integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" @@ -1294,14 +1271,14 @@ typed-array-buffer@^1.0.3: is-typed-array "^1.1.14" typescript@^5.3.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" - integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== + version "5.9.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.2.tgz#d93450cddec5154a2d5cabe3b8102b83316fb2a6" + integrity sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A== -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +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== uri-js@^4.2.2: version "4.4.1" @@ -1335,16 +1312,16 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + 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== -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"