From 47291e2658d71f0c609ac2fa531478043ab3d831 Mon Sep 17 00:00:00 2001 From: esteblock Date: Tue, 2 Sep 2025 13:57:28 -0300 Subject: [PATCH 1/6] Upgrade to P23 --- configs.json | 6 +- contracts/adapters/aqua/Makefile | 6 +- contracts/adapters/aqua/src/test.rs | 4 +- contracts/adapters/comet/Makefile | 6 +- contracts/adapters/comet/src/test.rs | 4 +- contracts/adapters/phoenix/Makefile | 6 +- contracts/adapters/phoenix/src/test.rs | 4 +- contracts/adapters/soroswap/Makefile | 6 +- contracts/adapters/soroswap/src/test.rs | 4 +- contracts/aggregator/Makefile | 6 +- contracts/aggregator/src/test.rs | 4 +- contracts/aggregator/src/test/comet_setup.rs | 2 +- .../aggregator/src/test/phoenix_setup.rs | 2 +- .../aggregator/src/test/soroswap_setup.rs | 2 +- contracts/deployer/Makefile | 6 +- contracts/deployer/src/test.rs | 6 +- contracts/test-utils/src/phoenix_setup.rs | 4 +- scripts/quickstart.sh | 6 +- yarn.lock | 485 +++++++++--------- 19 files changed, 272 insertions(+), 297 deletions(-) diff --git a/configs.json b/configs.json index 0ecc9363..bb7715e1 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:f91162a3fde65345f915c992bb85dfbbf2cc73cd6b40fb733e6889c66fd8e95d", + "quickstartHash": "pr753-latest@sha256:563165b9891cc967cb99981ad3d9de1131d25120bcede931eaf3637ee257e349", "networkConfig": [ { "network": "mainnet", diff --git a/contracts/adapters/aqua/Makefile b/contracts/adapters/aqua/Makefile index 05060bd6..5781b80b 100644 --- a/contracts/adapters/aqua/Makefile +++ b/contracts/adapters/aqua/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/aqua_adapter.wasm - @rm ../../target/wasm32-unknown-unknown/release/aqua_adapter.wasm + cargo build --target wasm32v1-none --release + stellar contract optimize --wasm ../../target/wasm32v1-none/release/aqua_adapter.wasm + @rm ../../target/wasm32v1-none/release/aqua_adapter.wasm fmt: cargo fmt --all --check diff --git a/contracts/adapters/aqua/src/test.rs b/contracts/adapters/aqua/src/test.rs index 58a440a4..edb728de 100644 --- a/contracts/adapters/aqua/src/test.rs +++ b/contracts/adapters/aqua/src/test.rs @@ -18,7 +18,7 @@ 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"); + soroban_sdk::contractimport!(file = "../../target/wasm32v1-none/release/soroswap_aggregator_deployer.optimized.wasm"); pub type DeployerClient<'a> = Client<'a>; } use deployer_contract::DeployerClient; @@ -35,7 +35,7 @@ fn create_soroswap_aggregator_aqua_adapter<'a>(e: &Env) -> SoroswapAggregatorAqu } pub mod aqua_adapter_contract { - soroban_sdk::contractimport!(file = "../../target/wasm32-unknown-unknown/release/aqua_adapter.optimized.wasm"); + soroban_sdk::contractimport!(file = "../../target/wasm32v1-none/release/aqua_adapter.optimized.wasm"); pub type SoroswapAggregatorAquaAdapterClientFromWasm<'a> = Client<'a>; } use aqua_adapter_contract::SoroswapAggregatorAquaAdapterClientFromWasm; diff --git a/contracts/adapters/comet/Makefile b/contracts/adapters/comet/Makefile index dc20fa24..f4c10bc2 100644 --- a/contracts/adapters/comet/Makefile +++ b/contracts/adapters/comet/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/comet_adapter.wasm - @rm ../../target/wasm32-unknown-unknown/release/comet_adapter.wasm + cargo build --target wasm32v1-none --release + stellar contract optimize --wasm ../../target/wasm32v1-none/release/comet_adapter.wasm + @rm ../../target/wasm32v1-none/release/comet_adapter.wasm fmt: cargo fmt --all --check diff --git a/contracts/adapters/comet/src/test.rs b/contracts/adapters/comet/src/test.rs index b3b67716..2d86b35a 100644 --- a/contracts/adapters/comet/src/test.rs +++ b/contracts/adapters/comet/src/test.rs @@ -10,7 +10,7 @@ use soroban_sdk::{ }; 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>; } use deployer_contract::DeployerClient; @@ -29,7 +29,7 @@ fn create_comet_aggregator_adapter<'a>(e: &Env) -> CometAggregatorAdapterClient< pub mod comet_adapter_contract { soroban_sdk::contractimport!( - file = "../../target/wasm32-unknown-unknown/release/comet_adapter.optimized.wasm" + file = "../../target/wasm32v1-none/release/comet_adapter.optimized.wasm" ); pub type CometAggregatorAdapterClientFromWasm<'a> = Client<'a>; } diff --git a/contracts/adapters/phoenix/Makefile b/contracts/adapters/phoenix/Makefile index e8fc34c2..83114466 100644 --- a/contracts/adapters/phoenix/Makefile +++ b/contracts/adapters/phoenix/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/phoenix_adapter.wasm - @rm ../../target/wasm32-unknown-unknown/release/phoenix_adapter.wasm + cargo build --target wasm32v1-none --release + stellar contract optimize --wasm ../../target/wasm32v1-none/release/phoenix_adapter.wasm + @rm ../../target/wasm32v1-none/release/phoenix_adapter.wasm fmt: cargo fmt --all --check diff --git a/contracts/adapters/phoenix/src/test.rs b/contracts/adapters/phoenix/src/test.rs index 5a0ae18b..3ac1a0f0 100644 --- a/contracts/adapters/phoenix/src/test.rs +++ b/contracts/adapters/phoenix/src/test.rs @@ -16,7 +16,7 @@ use test_utils::phoenix_setup::{PhoenixTest, MultihopClient, TokenClient, Phoeni // use router::SoroswapRouterClient; 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>; } use deployer_contract::DeployerClient; @@ -33,7 +33,7 @@ fn create_soroswap_aggregator_phoenix_adapter<'a>(e: &Env) -> SoroswapAggregator } pub mod phoenix_adapter_contract { - soroban_sdk::contractimport!(file = "../../target/wasm32-unknown-unknown/release/phoenix_adapter.optimized.wasm"); + soroban_sdk::contractimport!(file = "../../target/wasm32v1-none/release/phoenix_adapter.optimized.wasm"); pub type SoroswapAggregatorPhoenixAdapterClientFromWasm<'a> = Client<'a>; } use phoenix_adapter_contract::SoroswapAggregatorPhoenixAdapterClientFromWasm; diff --git a/contracts/adapters/soroswap/Makefile b/contracts/adapters/soroswap/Makefile index 4c57d94f..c0395b13 100644 --- a/contracts/adapters/soroswap/Makefile +++ b/contracts/adapters/soroswap/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_adapter.wasm - @rm ../../target/wasm32-unknown-unknown/release/soroswap_adapter.wasm + cargo build --target wasm32v1-none --release + stellar contract optimize --wasm ../../target/wasm32v1-none/release/soroswap_adapter.wasm + @rm ../../target/wasm32v1-none/release/soroswap_adapter.wasm fmt: cargo fmt --all --check diff --git a/contracts/adapters/soroswap/src/test.rs b/contracts/adapters/soroswap/src/test.rs index 43e5e977..3d1404f1 100644 --- a/contracts/adapters/soroswap/src/test.rs +++ b/contracts/adapters/soroswap/src/test.rs @@ -18,7 +18,7 @@ use factory::SoroswapFactoryClient; use router::SoroswapRouterClient; 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>; } use deployer_contract::DeployerClient; @@ -35,7 +35,7 @@ fn create_soroswap_aggregator_adapter<'a>(e: &Env) -> SoroswapAggregatorAdapterC } pub mod soroswap_adapter_contract { - 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 SoroswapAggregatorAdapterClientFromWasm<'a> = Client<'a>; } use soroswap_adapter_contract::SoroswapAggregatorAdapterClientFromWasm; 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/src/test.rs b/contracts/aggregator/src/test.rs index 5a7d117c..e55e5526 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}; diff --git a/contracts/aggregator/src/test/comet_setup.rs b/contracts/aggregator/src/test/comet_setup.rs index a4a94654..bd63bcf3 100644 --- a/contracts/aggregator/src/test/comet_setup.rs +++ b/contracts/aggregator/src/test/comet_setup.rs @@ -20,7 +20,7 @@ pub mod factory { 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..2ae0fa74 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>; } diff --git a/contracts/aggregator/src/test/soroswap_setup.rs b/contracts/aggregator/src/test/soroswap_setup.rs index d54fb982..53cf899f 100644 --- a/contracts/aggregator/src/test/soroswap_setup.rs +++ b/contracts/aggregator/src/test/soroswap_setup.rs @@ -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/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/test-utils/src/phoenix_setup.rs b/contracts/test-utils/src/phoenix_setup.rs index ccca41ae..e9e09302 100644 --- a/contracts/test-utils/src/phoenix_setup.rs +++ b/contracts/test-utils/src/phoenix_setup.rs @@ -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/yarn.lock b/yarn.lock index da2bd4fe..8fa4e790 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.7.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" + integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== 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.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.19.11.tgz#728cab53092bd5f143beed7fbba7ba99de3c16c4" + integrity sha512-uug3FEEGv0r+jrecvUUpbY8lLisvIjg6AAic6a2bSP5OEOLeJsDSnvhCDov7ipFFMXS3orMpzlmi0ZcuGkBbow== 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" From 9e423c3f5b56396e21f945fc5c7842f7de336504 Mon Sep 17 00:00:00 2001 From: esteblock Date: Tue, 2 Sep 2025 14:06:51 -0300 Subject: [PATCH 2/6] Upgrade Soroban SDK and remove adapters contracts --- contracts/Cargo.lock | 246 ++-- contracts/Cargo.toml | 5 +- contracts/Makefile | 2 +- contracts/adapters/Makefile | 24 - contracts/adapters/aqua/Cargo.toml | 21 - contracts/adapters/aqua/Makefile | 17 - .../adapters/aqua/aqua_contracts/README.md | 112 -- .../soroban_fees_collector_contract.wasm | Bin 6070 -> 0 bytes .../soroban_liquidity_pool_contract.wasm | Bin 45087 -> 0 bytes ...ty_pool_liquidity_calculator_contract.wasm | Bin 20943 -> 0 bytes ...soroban_liquidity_pool_plane_contract.wasm | Bin 7370 -> 0 bytes ...oroban_liquidity_pool_router_contract.wasm | Bin 41974 -> 0 bytes ...an_liquidity_pool_stableswap_contract.wasm | Bin 55953 -> 0 bytes ...n_liquidity_pool_swap_router_contract.wasm | Bin 14737 -> 0 bytes .../soroban_locker_feed_contract.wasm | Bin 7386 -> 0 bytes .../soroban_token_contract.wasm | Bin 14405 -> 0 bytes contracts/adapters/aqua/src/event.rs | 45 - contracts/adapters/aqua/src/lib.rs | 146 -- .../adapters/aqua/src/protocol_interface.rs | 151 --- contracts/adapters/aqua/src/storage.rs | 51 - contracts/adapters/aqua/src/test.rs | 100 -- .../adapters/aqua/src/test/aqua_setup.rs | 250 ---- .../adapters/aqua/src/test/initialize.rs | 75 - .../src/test/swap_exact_tokens_for_tokens.rs | 487 ------- .../src/test/swap_tokens_for_exact_tokens.rs | 334 ----- contracts/adapters/comet/Cargo.toml | 21 - contracts/adapters/comet/Makefile | 17 - .../comet/comet_contracts/comet_factory.wasm | Bin 2502 -> 0 bytes .../comet/comet_contracts/comet_pool.wasm | Bin 29046 -> 0 bytes contracts/adapters/comet/src/event.rs | 47 - contracts/adapters/comet/src/lib.rs | 125 -- .../adapters/comet/src/protocol_interface.rs | 54 - contracts/adapters/comet/src/storage.rs | 51 - contracts/adapters/comet/src/test.rs | 119 -- .../adapters/comet/src/test/comet_setup.rs | 38 - .../adapters/comet/src/test/initialize.rs | 75 - .../src/test/swap_exact_tokens_for_tokens.rs | 220 --- .../src/test/swap_tokens_for_exact_tokens.rs | 204 --- contracts/adapters/interface/Cargo.toml | 13 - contracts/adapters/interface/src/error.rs | 17 - contracts/adapters/interface/src/lib.rs | 72 - contracts/adapters/phoenix/Cargo.toml | 22 - contracts/adapters/phoenix/Makefile | 17 - contracts/adapters/phoenix/README.md | 1 - .../phoenix_contracts/phoenix_factory.wasm | Bin 27141 -> 0 bytes .../phoenix_contracts/phoenix_multihop.wasm | Bin 20343 -> 0 bytes .../phoenix_contracts/phoenix_pool.wasm | Bin 42241 -> 0 bytes .../phoenix_pool_stable.wasm | Bin 43626 -> 0 bytes .../phoenix_contracts/phoenix_stake.wasm | Bin 53038 -> 0 bytes .../phoenix_contracts/phoenix_vesting.wasm | Bin 33833 -> 0 bytes .../soroban_token_contract.wasm | Bin 7163 -> 0 bytes contracts/adapters/phoenix/src/event.rs | 45 - contracts/adapters/phoenix/src/lib.rs | 157 --- .../phoenix/src/protocol_interface.rs | 203 --- contracts/adapters/phoenix/src/storage.rs | 51 - contracts/adapters/phoenix/src/test.rs | 102 -- .../adapters/phoenix/src/test/initialize.rs | 75 - .../src/test/swap_exact_tokens_for_tokens.rs | 1204 ----------------- .../src/test/swap_tokens_for_exact_tokens.rs | 281 ---- contracts/adapters/soroswap/Cargo.toml | 21 - contracts/adapters/soroswap/Makefile | 17 - contracts/adapters/soroswap/README.md | 1 - .../soroban_token_contract.wasm | Bin 7251 -> 0 bytes .../soroswap_contracts/soroswap_factory.wasm | Bin 11167 -> 0 bytes .../soroswap_contracts/soroswap_pair.wasm | Bin 31855 -> 0 bytes .../soroswap_router.optimized.wasm | Bin 34253 -> 0 bytes .../soroswap_contracts/soroswap_router.wasm | Bin 37099 -> 0 bytes contracts/adapters/soroswap/src/event.rs | 47 - contracts/adapters/soroswap/src/lib.rs | 117 -- .../soroswap/src/protocol_interface.rs | 50 - contracts/adapters/soroswap/src/storage.rs | 51 - contracts/adapters/soroswap/src/test.rs | 105 -- .../adapters/soroswap/src/test/initialize.rs | 75 - .../soroswap/src/test/soroswap_setup.rs | 185 --- .../src/test/swap_exact_tokens_for_tokens.rs | 234 ---- .../src/test/swap_tokens_for_exact_tokens.rs | 344 ----- contracts/aggregator/Cargo.toml | 1 - contracts/aggregator/src/lib.rs | 12 - contracts/deployer/Cargo.toml | 1 - 79 files changed, 153 insertions(+), 6405 deletions(-) delete mode 100644 contracts/adapters/Makefile delete mode 100644 contracts/adapters/aqua/Cargo.toml delete mode 100644 contracts/adapters/aqua/Makefile delete mode 100644 contracts/adapters/aqua/aqua_contracts/README.md delete mode 100755 contracts/adapters/aqua/aqua_contracts/soroban_fees_collector_contract.wasm delete mode 100755 contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_contract.wasm delete mode 100755 contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_liquidity_calculator_contract.wasm delete mode 100755 contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_plane_contract.wasm delete mode 100755 contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_router_contract.wasm delete mode 100755 contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_stableswap_contract.wasm delete mode 100755 contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_swap_router_contract.wasm delete mode 100644 contracts/adapters/aqua/aqua_contracts/soroban_locker_feed_contract.wasm delete mode 100755 contracts/adapters/aqua/aqua_contracts/soroban_token_contract.wasm delete mode 100644 contracts/adapters/aqua/src/event.rs delete mode 100644 contracts/adapters/aqua/src/lib.rs delete mode 100644 contracts/adapters/aqua/src/protocol_interface.rs delete mode 100644 contracts/adapters/aqua/src/storage.rs delete mode 100644 contracts/adapters/aqua/src/test.rs delete mode 100644 contracts/adapters/aqua/src/test/aqua_setup.rs delete mode 100644 contracts/adapters/aqua/src/test/initialize.rs delete mode 100644 contracts/adapters/aqua/src/test/swap_exact_tokens_for_tokens.rs delete mode 100644 contracts/adapters/aqua/src/test/swap_tokens_for_exact_tokens.rs delete mode 100644 contracts/adapters/comet/Cargo.toml delete mode 100644 contracts/adapters/comet/Makefile delete mode 100644 contracts/adapters/comet/comet_contracts/comet_factory.wasm delete mode 100644 contracts/adapters/comet/comet_contracts/comet_pool.wasm delete mode 100644 contracts/adapters/comet/src/event.rs delete mode 100644 contracts/adapters/comet/src/lib.rs delete mode 100644 contracts/adapters/comet/src/protocol_interface.rs delete mode 100644 contracts/adapters/comet/src/storage.rs delete mode 100644 contracts/adapters/comet/src/test.rs delete mode 100644 contracts/adapters/comet/src/test/comet_setup.rs delete mode 100644 contracts/adapters/comet/src/test/initialize.rs delete mode 100644 contracts/adapters/comet/src/test/swap_exact_tokens_for_tokens.rs delete mode 100644 contracts/adapters/comet/src/test/swap_tokens_for_exact_tokens.rs delete mode 100644 contracts/adapters/interface/Cargo.toml delete mode 100644 contracts/adapters/interface/src/error.rs delete mode 100644 contracts/adapters/interface/src/lib.rs delete mode 100644 contracts/adapters/phoenix/Cargo.toml delete mode 100644 contracts/adapters/phoenix/Makefile delete mode 100644 contracts/adapters/phoenix/README.md delete mode 100644 contracts/adapters/phoenix/phoenix_contracts/phoenix_factory.wasm delete mode 100644 contracts/adapters/phoenix/phoenix_contracts/phoenix_multihop.wasm delete mode 100644 contracts/adapters/phoenix/phoenix_contracts/phoenix_pool.wasm delete mode 100644 contracts/adapters/phoenix/phoenix_contracts/phoenix_pool_stable.wasm delete mode 100644 contracts/adapters/phoenix/phoenix_contracts/phoenix_stake.wasm delete mode 100644 contracts/adapters/phoenix/phoenix_contracts/phoenix_vesting.wasm delete mode 100644 contracts/adapters/phoenix/phoenix_contracts/soroban_token_contract.wasm delete mode 100644 contracts/adapters/phoenix/src/event.rs delete mode 100644 contracts/adapters/phoenix/src/lib.rs delete mode 100644 contracts/adapters/phoenix/src/protocol_interface.rs delete mode 100644 contracts/adapters/phoenix/src/storage.rs delete mode 100644 contracts/adapters/phoenix/src/test.rs delete mode 100644 contracts/adapters/phoenix/src/test/initialize.rs delete mode 100644 contracts/adapters/phoenix/src/test/swap_exact_tokens_for_tokens.rs delete mode 100644 contracts/adapters/phoenix/src/test/swap_tokens_for_exact_tokens.rs delete mode 100644 contracts/adapters/soroswap/Cargo.toml delete mode 100644 contracts/adapters/soroswap/Makefile delete mode 100644 contracts/adapters/soroswap/README.md delete mode 100755 contracts/adapters/soroswap/soroswap_contracts/soroban_token_contract.wasm delete mode 100755 contracts/adapters/soroswap/soroswap_contracts/soroswap_factory.wasm delete mode 100755 contracts/adapters/soroswap/soroswap_contracts/soroswap_pair.wasm delete mode 100644 contracts/adapters/soroswap/soroswap_contracts/soroswap_router.optimized.wasm delete mode 100755 contracts/adapters/soroswap/soroswap_contracts/soroswap_router.wasm delete mode 100644 contracts/adapters/soroswap/src/event.rs delete mode 100644 contracts/adapters/soroswap/src/lib.rs delete mode 100644 contracts/adapters/soroswap/src/protocol_interface.rs delete mode 100644 contracts/adapters/soroswap/src/storage.rs delete mode 100644 contracts/adapters/soroswap/src/test.rs delete mode 100644 contracts/adapters/soroswap/src/test/initialize.rs delete mode 100644 contracts/adapters/soroswap/src/test/soroswap_setup.rs delete mode 100644 contracts/adapters/soroswap/src/test/swap_exact_tokens_for_tokens.rs delete mode 100644 contracts/adapters/soroswap/src/test/swap_tokens_for_exact_tokens.rs 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 5781b80b..00000000 --- a/contracts/adapters/aqua/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -default: build - -all: test - -test: build - cargo test - -build: - cargo build --target wasm32v1-none --release - stellar contract optimize --wasm ../../target/wasm32v1-none/release/aqua_adapter.wasm - @rm ../../target/wasm32v1-none/release/aqua_adapter.wasm - -fmt: - cargo fmt --all --check - -clean: - cargo clean \ No newline at end of file diff --git a/contracts/adapters/aqua/aqua_contracts/README.md b/contracts/adapters/aqua/aqua_contracts/README.md deleted file mode 100644 index cf3b738a..00000000 --- a/contracts/adapters/aqua/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/adapters/aqua/aqua_contracts/soroban_fees_collector_contract.wasm b/contracts/adapters/aqua/aqua_contracts/soroban_fees_collector_contract.wasm deleted file mode 100755 index 794e211c07c6e03cc26819d85e1cd6df2e9db64d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6070 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 diff --git a/contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_liquidity_calculator_contract.wasm b/contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_liquidity_calculator_contract.wasm deleted file mode 100755 index e236dcd176503f27e5e1dd582c982c19a0dccd80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20943 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 ap`quV9h_u6HTWD0tY^o@T9bpr=6?ffce%#^ diff --git a/contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_plane_contract.wasm b/contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_plane_contract.wasm deleted file mode 100755 index 04b4bb8e05d17a085d4ab2c3b9bd82d84188b520..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7370 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 UJbG|&=J4Us3x^KHV}rx&KccjX&Hw-a diff --git a/contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_router_contract.wasm b/contracts/adapters/aqua/aqua_contracts/soroban_liquidity_pool_router_contract.wasm deleted file mode 100755 index 11c888f3be8e8eb4cefc21faa0ba87e915605a54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41974 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 Bp>_ZO diff --git a/contracts/adapters/aqua/aqua_contracts/soroban_token_contract.wasm b/contracts/adapters/aqua/aqua_contracts/soroban_token_contract.wasm deleted file mode 100755 index 7f2509d118a3230177bd3688e1d32c40cdc1dd7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14405 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 Is^vlTKXuaPTL1t6 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 edb728de..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/wasm32v1-none/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/wasm32v1-none/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 f4c10bc2..00000000 --- a/contracts/adapters/comet/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -default: build - -all: test - -test: build - cargo test - -build: - cargo build --target wasm32v1-none --release - stellar contract optimize --wasm ../../target/wasm32v1-none/release/comet_adapter.wasm - @rm ../../target/wasm32v1-none/release/comet_adapter.wasm - -fmt: - cargo fmt --all --check - -clean: - cargo clean \ No newline at end of file diff --git a/contracts/adapters/comet/comet_contracts/comet_factory.wasm b/contracts/adapters/comet/comet_contracts/comet_factory.wasm deleted file mode 100644 index 9db8020a75832879ce60472bcf1bf129d4c6cf62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2502 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 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 2d86b35a..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/wasm32v1-none/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/wasm32v1-none/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 83114466..00000000 --- a/contracts/adapters/phoenix/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -default: build - -all: test - -test: build - cargo test - -build: - cargo build --target wasm32v1-none --release - stellar contract optimize --wasm ../../target/wasm32v1-none/release/phoenix_adapter.wasm - @rm ../../target/wasm32v1-none/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/phoenix_contracts/phoenix_factory.wasm b/contracts/adapters/phoenix/phoenix_contracts/phoenix_factory.wasm deleted file mode 100644 index e5de540cba646cb48833b15dc25d70d911a4548d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27141 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 R?kLQL2xd#9jbU%~e*wWyNv;3@ diff --git a/contracts/adapters/phoenix/phoenix_contracts/phoenix_multihop.wasm b/contracts/adapters/phoenix/phoenix_contracts/phoenix_multihop.wasm deleted file mode 100644 index eab42850d595cc31066eeb279c0fc36f622b185d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20343 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 diff --git a/contracts/adapters/phoenix/phoenix_contracts/phoenix_stake.wasm b/contracts/adapters/phoenix/phoenix_contracts/phoenix_stake.wasm deleted file mode 100644 index 067070cdf1df43a09cbfdd7cc75a1e2b3d8072be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53038 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 diff --git a/contracts/adapters/phoenix/phoenix_contracts/phoenix_vesting.wasm b/contracts/adapters/phoenix/phoenix_contracts/phoenix_vesting.wasm deleted file mode 100644 index c20c34582097eccc5106d9ca54f4f30167ba51f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33833 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 Ky9+#0;rw5_7{Z1C diff --git a/contracts/adapters/phoenix/phoenix_contracts/soroban_token_contract.wasm b/contracts/adapters/phoenix/phoenix_contracts/soroban_token_contract.wasm deleted file mode 100644 index c6303503952e68d935e4e5dde8f7a9e92c4fbcc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7163 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 k*wpCs=-95&k&)>`Q_0Yw;l|`uhZ, - 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 3ac1a0f0..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/wasm32v1-none/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/wasm32v1-none/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 c0395b13..00000000 --- a/contracts/adapters/soroswap/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -default: build - -all: test - -test: build - cargo test - -build: - cargo build --target wasm32v1-none --release - stellar contract optimize --wasm ../../target/wasm32v1-none/release/soroswap_adapter.wasm - @rm ../../target/wasm32v1-none/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/soroswap_contracts/soroban_token_contract.wasm b/contracts/adapters/soroswap/soroswap_contracts/soroban_token_contract.wasm deleted file mode 100755 index 23805cc4ef375d36bd66d8ca1401646484cbeb56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7251 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 DSL;-?{hQ_ukCx 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 H$T0gi2iHK( diff --git a/contracts/adapters/soroswap/soroswap_contracts/soroswap_pair.wasm b/contracts/adapters/soroswap/soroswap_contracts/soroswap_pair.wasm deleted file mode 100755 index d47b7cf54b7f474b2d898f3a4ab6a03674a2e602..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31855 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�URH6m#Z_u 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 diff --git a/contracts/adapters/soroswap/soroswap_contracts/soroswap_router.optimized.wasm b/contracts/adapters/soroswap/soroswap_contracts/soroswap_router.optimized.wasm deleted file mode 100644 index bd621c598d44b4598630127899219bb73b02dd51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34253 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, - 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 3d1404f1..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/wasm32v1-none/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/wasm32v1-none/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/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/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 From 5b05318da51f60874800b511e303049c090d3223 Mon Sep 17 00:00:00 2001 From: esteblock Date: Tue, 2 Sep 2025 14:15:30 -0300 Subject: [PATCH 3/6] fix: external contracts folder --- contracts/aggregator/src/adapters/phoenix.rs | 2 +- contracts/aggregator/src/test.rs | 4 ++-- contracts/aggregator/src/test/comet_setup.rs | 4 ++-- contracts/aggregator/src/test/phoenix_setup.rs | 12 ++++++------ contracts/aggregator/src/test/soroswap_setup.rs | 6 +++--- contracts/test-utils/src/phoenix_setup.rs | 16 ++++++++-------- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/contracts/aggregator/src/adapters/phoenix.rs b/contracts/aggregator/src/adapters/phoenix.rs index 0261e5d9..6463044d 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 = "../aggregator/phoenix_contracts//phoenix_multihop.wasm" ); pub type PhoenixMultihopClient<'a> = Client<'a>; diff --git a/contracts/aggregator/src/test.rs b/contracts/aggregator/src/test.rs index e55e5526..ec571927 100644 --- a/contracts/aggregator/src/test.rs +++ b/contracts/aggregator/src/test.rs @@ -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 = "../aggregator/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 = "../aggregator/soroswap_contracts/soroban_token_contract.wasm" // ); // env.deployer().upload_contract_wasm(WASM) // } diff --git a/contracts/aggregator/src/test/comet_setup.rs b/contracts/aggregator/src/test/comet_setup.rs index bd63bcf3..a2a83c8c 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 = "../aggregator/comet_contracts/comet_pool.wasm"); pub type CometPairClient<'a> = Client<'a>; } @@ -14,7 +14,7 @@ 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 = "../aggregator/comet_contracts/comet_factory.wasm"); pub type CometFactoryClient<'a> = Client<'a>; } use factory::CometFactoryClient; diff --git a/contracts/aggregator/src/test/phoenix_setup.rs b/contracts/aggregator/src/test/phoenix_setup.rs index 2ae0fa74..a524ad09 100644 --- a/contracts/aggregator/src/test/phoenix_setup.rs +++ b/contracts/aggregator/src/test/phoenix_setup.rs @@ -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 = "../aggregator/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 = "../aggregator/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 = "../aggregator/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 = "../aggregator/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 = "../aggregator/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 = "../aggregator/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 53cf899f..434bddc7 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 = "../aggregator/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 = "../aggregator/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 = "../aggregator/soroswap_contracts/soroswap_router.optimized.wasm"); pub type SoroswapRouterClient<'a> = Client<'a>; } pub use router::SoroswapRouterClient; diff --git a/contracts/test-utils/src/phoenix_setup.rs b/contracts/test-utils/src/phoenix_setup.rs index e9e09302..ddfc49ad 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 = "../aggregator/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 = "../aggregator/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 = "../aggregator/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 = "../aggregator/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 = "../aggregator/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 = "../aggregator/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 = "../aggregator/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 = "../aggregator/phoenix_contracts/phoenix_stake.wasm" ); env.deployer().upload_contract_wasm(WASM) } From 6f3b7b3fd56cd35476b3a9d68b70b26892e8fad6 Mon Sep 17 00:00:00 2001 From: esteblock Date: Tue, 2 Sep 2025 14:22:58 -0300 Subject: [PATCH 4/6] more external wasms to external_wasms folder --- contracts/aggregator/src/adapters/aqua.rs | 2 +- contracts/aggregator/src/adapters/comet.rs | 2 +- contracts/aggregator/src/adapters/phoenix.rs | 2 +- contracts/aggregator/src/adapters/soroswap.rs | 2 +- contracts/aggregator/src/test.rs | 4 ++-- contracts/aggregator/src/test/aqua_setup.rs | 16 ++++++++-------- contracts/aggregator/src/test/comet_setup.rs | 4 ++-- contracts/aggregator/src/test/phoenix_setup.rs | 12 ++++++------ contracts/aggregator/src/test/soroswap_setup.rs | 6 +++--- .../aqua_contracts/README.md | 0 .../soroban_fees_collector_contract.wasm | Bin .../soroban_liquidity_pool_contract.wasm | Bin ...dity_pool_liquidity_calculator_contract.wasm | Bin .../soroban_liquidity_pool_plane_contract.wasm | Bin .../soroban_liquidity_pool_router_contract.wasm | Bin ...oban_liquidity_pool_stableswap_contract.wasm | Bin ...ban_liquidity_pool_swap_router_contract.wasm | Bin .../soroban_locker_feed_contract.wasm | Bin .../aqua_contracts/soroban_token_contract.wasm | Bin .../comet_contracts/comet_factory.wasm | Bin .../comet_contracts/comet_pool.wasm | Bin .../phoenix_contracts/phoenix_factory.wasm | Bin .../phoenix_contracts/phoenix_multihop.wasm | Bin .../phoenix_contracts/phoenix_pool.wasm | Bin .../phoenix_contracts/phoenix_pool_stable.wasm | Bin .../phoenix_contracts/phoenix_stake.wasm | Bin .../phoenix_contracts/phoenix_vesting.wasm | Bin .../soroban_token_contract.wasm | Bin .../soroban_token_contract.wasm | Bin .../soroswap_contracts/soroswap_factory.wasm | Bin .../soroswap_contracts/soroswap_pair.wasm | Bin .../soroswap_router.optimized.wasm | Bin .../soroswap_contracts/soroswap_router.wasm | Bin contracts/test-utils/src/phoenix_setup.rs | 16 ++++++++-------- 34 files changed, 33 insertions(+), 33 deletions(-) rename contracts/{aggregator => external_wasms}/aqua_contracts/README.md (100%) rename contracts/{aggregator => external_wasms}/aqua_contracts/soroban_fees_collector_contract.wasm (100%) rename contracts/{aggregator => external_wasms}/aqua_contracts/soroban_liquidity_pool_contract.wasm (100%) rename contracts/{aggregator => external_wasms}/aqua_contracts/soroban_liquidity_pool_liquidity_calculator_contract.wasm (100%) rename contracts/{aggregator => external_wasms}/aqua_contracts/soroban_liquidity_pool_plane_contract.wasm (100%) rename contracts/{aggregator => external_wasms}/aqua_contracts/soroban_liquidity_pool_router_contract.wasm (100%) rename contracts/{aggregator => external_wasms}/aqua_contracts/soroban_liquidity_pool_stableswap_contract.wasm (100%) rename contracts/{aggregator => external_wasms}/aqua_contracts/soroban_liquidity_pool_swap_router_contract.wasm (100%) rename contracts/{aggregator => external_wasms}/aqua_contracts/soroban_locker_feed_contract.wasm (100%) rename contracts/{aggregator => external_wasms}/aqua_contracts/soroban_token_contract.wasm (100%) rename contracts/{aggregator => external_wasms}/comet_contracts/comet_factory.wasm (100%) rename contracts/{aggregator => external_wasms}/comet_contracts/comet_pool.wasm (100%) rename contracts/{aggregator => external_wasms}/phoenix_contracts/phoenix_factory.wasm (100%) rename contracts/{aggregator => external_wasms}/phoenix_contracts/phoenix_multihop.wasm (100%) rename contracts/{aggregator => external_wasms}/phoenix_contracts/phoenix_pool.wasm (100%) rename contracts/{aggregator => external_wasms}/phoenix_contracts/phoenix_pool_stable.wasm (100%) rename contracts/{aggregator => external_wasms}/phoenix_contracts/phoenix_stake.wasm (100%) rename contracts/{aggregator => external_wasms}/phoenix_contracts/phoenix_vesting.wasm (100%) rename contracts/{aggregator => external_wasms}/phoenix_contracts/soroban_token_contract.wasm (100%) rename contracts/{aggregator => external_wasms}/soroswap_contracts/soroban_token_contract.wasm (100%) rename contracts/{aggregator => external_wasms}/soroswap_contracts/soroswap_factory.wasm (100%) rename contracts/{aggregator => external_wasms}/soroswap_contracts/soroswap_pair.wasm (100%) rename contracts/{aggregator => external_wasms}/soroswap_contracts/soroswap_router.optimized.wasm (100%) rename contracts/{aggregator => external_wasms}/soroswap_contracts/soroswap_router.wasm (100%) 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 6463044d..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 = "../aggregator/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/test.rs b/contracts/aggregator/src/test.rs index ec571927..62a609f3 100644 --- a/contracts/aggregator/src/test.rs +++ b/contracts/aggregator/src/test.rs @@ -71,7 +71,7 @@ use soroswap_aggregator_contract::{SoroswapAggregatorClientFromWasm, Adapter as // Token Contract mod token { - soroban_sdk::contractimport!(file = "../aggregator/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 = "../aggregator/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 a2a83c8c..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 = "../aggregator/comet_contracts/comet_pool.wasm"); + soroban_sdk::contractimport!(file = "../external_wasms/comet_contracts/comet_pool.wasm"); pub type CometPairClient<'a> = Client<'a>; } @@ -14,7 +14,7 @@ fn pair_contract_wasm(e: &Env) -> BytesN<32> { } pub mod factory { - soroban_sdk::contractimport!(file = "../aggregator/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; diff --git a/contracts/aggregator/src/test/phoenix_setup.rs b/contracts/aggregator/src/test/phoenix_setup.rs index a524ad09..af0a7449 100644 --- a/contracts/aggregator/src/test/phoenix_setup.rs +++ b/contracts/aggregator/src/test/phoenix_setup.rs @@ -60,7 +60,7 @@ use soroban_sdk::{ #[allow(clippy::too_many_arguments)] pub mod factory { soroban_sdk::contractimport!( - file = "../aggregator/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 = "../aggregator/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 = "../aggregator/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 = "../aggregator/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 = "../aggregator/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 = "../aggregator/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 434bddc7..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 = "../aggregator/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 = "../aggregator/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 = "../aggregator/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; diff --git a/contracts/aggregator/aqua_contracts/README.md b/contracts/external_wasms/aqua_contracts/README.md similarity index 100% rename from contracts/aggregator/aqua_contracts/README.md rename to contracts/external_wasms/aqua_contracts/README.md diff --git a/contracts/aggregator/aqua_contracts/soroban_fees_collector_contract.wasm b/contracts/external_wasms/aqua_contracts/soroban_fees_collector_contract.wasm similarity index 100% rename from contracts/aggregator/aqua_contracts/soroban_fees_collector_contract.wasm rename to contracts/external_wasms/aqua_contracts/soroban_fees_collector_contract.wasm diff --git a/contracts/aggregator/aqua_contracts/soroban_liquidity_pool_contract.wasm b/contracts/external_wasms/aqua_contracts/soroban_liquidity_pool_contract.wasm similarity index 100% rename from contracts/aggregator/aqua_contracts/soroban_liquidity_pool_contract.wasm rename to contracts/external_wasms/aqua_contracts/soroban_liquidity_pool_contract.wasm diff --git a/contracts/aggregator/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/aggregator/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/aggregator/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/aggregator/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/aggregator/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/aggregator/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/aggregator/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/aggregator/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/aggregator/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/aggregator/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/aggregator/aqua_contracts/soroban_locker_feed_contract.wasm b/contracts/external_wasms/aqua_contracts/soroban_locker_feed_contract.wasm similarity index 100% rename from contracts/aggregator/aqua_contracts/soroban_locker_feed_contract.wasm rename to contracts/external_wasms/aqua_contracts/soroban_locker_feed_contract.wasm diff --git a/contracts/aggregator/aqua_contracts/soroban_token_contract.wasm b/contracts/external_wasms/aqua_contracts/soroban_token_contract.wasm similarity index 100% rename from contracts/aggregator/aqua_contracts/soroban_token_contract.wasm rename to contracts/external_wasms/aqua_contracts/soroban_token_contract.wasm diff --git a/contracts/aggregator/comet_contracts/comet_factory.wasm b/contracts/external_wasms/comet_contracts/comet_factory.wasm similarity index 100% rename from contracts/aggregator/comet_contracts/comet_factory.wasm rename to contracts/external_wasms/comet_contracts/comet_factory.wasm diff --git a/contracts/aggregator/comet_contracts/comet_pool.wasm b/contracts/external_wasms/comet_contracts/comet_pool.wasm similarity index 100% rename from contracts/aggregator/comet_contracts/comet_pool.wasm rename to contracts/external_wasms/comet_contracts/comet_pool.wasm diff --git a/contracts/aggregator/phoenix_contracts/phoenix_factory.wasm b/contracts/external_wasms/phoenix_contracts/phoenix_factory.wasm similarity index 100% rename from contracts/aggregator/phoenix_contracts/phoenix_factory.wasm rename to contracts/external_wasms/phoenix_contracts/phoenix_factory.wasm diff --git a/contracts/aggregator/phoenix_contracts/phoenix_multihop.wasm b/contracts/external_wasms/phoenix_contracts/phoenix_multihop.wasm similarity index 100% rename from contracts/aggregator/phoenix_contracts/phoenix_multihop.wasm rename to contracts/external_wasms/phoenix_contracts/phoenix_multihop.wasm diff --git a/contracts/aggregator/phoenix_contracts/phoenix_pool.wasm b/contracts/external_wasms/phoenix_contracts/phoenix_pool.wasm similarity index 100% rename from contracts/aggregator/phoenix_contracts/phoenix_pool.wasm rename to contracts/external_wasms/phoenix_contracts/phoenix_pool.wasm diff --git a/contracts/aggregator/phoenix_contracts/phoenix_pool_stable.wasm b/contracts/external_wasms/phoenix_contracts/phoenix_pool_stable.wasm similarity index 100% rename from contracts/aggregator/phoenix_contracts/phoenix_pool_stable.wasm rename to contracts/external_wasms/phoenix_contracts/phoenix_pool_stable.wasm diff --git a/contracts/aggregator/phoenix_contracts/phoenix_stake.wasm b/contracts/external_wasms/phoenix_contracts/phoenix_stake.wasm similarity index 100% rename from contracts/aggregator/phoenix_contracts/phoenix_stake.wasm rename to contracts/external_wasms/phoenix_contracts/phoenix_stake.wasm diff --git a/contracts/aggregator/phoenix_contracts/phoenix_vesting.wasm b/contracts/external_wasms/phoenix_contracts/phoenix_vesting.wasm similarity index 100% rename from contracts/aggregator/phoenix_contracts/phoenix_vesting.wasm rename to contracts/external_wasms/phoenix_contracts/phoenix_vesting.wasm diff --git a/contracts/aggregator/phoenix_contracts/soroban_token_contract.wasm b/contracts/external_wasms/phoenix_contracts/soroban_token_contract.wasm similarity index 100% rename from contracts/aggregator/phoenix_contracts/soroban_token_contract.wasm rename to contracts/external_wasms/phoenix_contracts/soroban_token_contract.wasm diff --git a/contracts/aggregator/soroswap_contracts/soroban_token_contract.wasm b/contracts/external_wasms/soroswap_contracts/soroban_token_contract.wasm similarity index 100% rename from contracts/aggregator/soroswap_contracts/soroban_token_contract.wasm rename to contracts/external_wasms/soroswap_contracts/soroban_token_contract.wasm diff --git a/contracts/aggregator/soroswap_contracts/soroswap_factory.wasm b/contracts/external_wasms/soroswap_contracts/soroswap_factory.wasm similarity index 100% rename from contracts/aggregator/soroswap_contracts/soroswap_factory.wasm rename to contracts/external_wasms/soroswap_contracts/soroswap_factory.wasm diff --git a/contracts/aggregator/soroswap_contracts/soroswap_pair.wasm b/contracts/external_wasms/soroswap_contracts/soroswap_pair.wasm similarity index 100% rename from contracts/aggregator/soroswap_contracts/soroswap_pair.wasm rename to contracts/external_wasms/soroswap_contracts/soroswap_pair.wasm diff --git a/contracts/aggregator/soroswap_contracts/soroswap_router.optimized.wasm b/contracts/external_wasms/soroswap_contracts/soroswap_router.optimized.wasm similarity index 100% rename from contracts/aggregator/soroswap_contracts/soroswap_router.optimized.wasm rename to contracts/external_wasms/soroswap_contracts/soroswap_router.optimized.wasm diff --git a/contracts/aggregator/soroswap_contracts/soroswap_router.wasm b/contracts/external_wasms/soroswap_contracts/soroswap_router.wasm similarity index 100% rename from contracts/aggregator/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 ddfc49ad..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 = "../aggregator/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 = "../aggregator/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 = "../aggregator/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 = "../aggregator/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 = "../aggregator/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 = "../aggregator/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 = "../aggregator/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 = "../aggregator/phoenix_contracts/phoenix_stake.wasm" + file = "../external_wasms/phoenix_contracts/phoenix_stake.wasm" ); env.deployer().upload_contract_wasm(WASM) } From 2aa88ae3c54ed55300dd22ef33152ecd26988280 Mon Sep 17 00:00:00 2001 From: esteblock Date: Tue, 2 Sep 2025 14:30:59 -0300 Subject: [PATCH 5/6] remove get_protocols call from tests --- README.md | 10 +++++----- src/multi_test.ts | 20 ++++++++++---------- src/test.ts | 20 ++++++++++---------- src/utils/contract.ts | 12 ++++++------ 4 files changed, 31 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 531af823..1e8eb00e 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 @@ -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/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]; From 65530c002e1edfc0ccfeac5c46df3a9b5d86cfce Mon Sep 17 00:00:00 2001 From: esteblock Date: Wed, 3 Sep 2025 11:34:28 -0300 Subject: [PATCH 6/6] use soroban preview with node 22.19.0 --- README.md | 2 +- configs.json | 2 +- yarn.lock | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 1e8eb00e..a2814f34 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/configs.json b/configs.json index bb7715e1..e5287489 100644 --- a/configs.json +++ b/configs.json @@ -1,6 +1,6 @@ { "protocolVersion": "23", - "previewHash": "23@sha256:f91162a3fde65345f915c992bb85dfbbf2cc73cd6b40fb733e6889c66fd8e95d", + "previewHash": "23@sha256:2981e593f04a0fa11f704c83d1a6a2fc86ae76ce9f74a4e365ed6da579430c1c", "quickstartHash": "pr753-latest@sha256:563165b9891cc967cb99981ad3d9de1131d25120bcede931eaf3637ee257e349", "networkConfig": [ { diff --git a/yarn.lock b/yarn.lock index 8fa4e790..31e75c6b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,9 +3,9 @@ "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.7.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" - integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== + 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.4.3" @@ -128,9 +128,9 @@ integrity sha512-lC51QSlYRM8K3oGe0/WGPq+p9+u+yPzwZXSKrZXKOe4sq79vzfiqFbQyp5enOffFzXlahcDyTgY67mBOkJytfw== "@types/node@^20.11.20": - version "20.19.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.19.11.tgz#728cab53092bd5f143beed7fbba7ba99de3c16c4" - integrity sha512-uug3FEEGv0r+jrecvUUpbY8lLisvIjg6AAic6a2bSP5OEOLeJsDSnvhCDov7ipFFMXS3orMpzlmi0ZcuGkBbow== + 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 "~6.21.0"