From 362d65671306544ad99d71c25db0c336785c8976 Mon Sep 17 00:00:00 2001 From: Sorin Petreasca Date: Thu, 28 Dec 2023 13:31:35 +0200 Subject: [PATCH 1/2] new audit fixes --- Cargo.lock | 90 +++++------ common/common_structs/Cargo.toml | 2 +- .../src/common_subscriber.rs | 14 ++ farm-boosted-rewards-subscriber/Cargo.toml | 22 +-- .../src/claim_farm_boosted.rs | 7 +- farm-boosted-rewards-subscriber/src/lib.rs | 46 ++++-- .../src/service.rs | 52 ++++-- .../src/subscriber_config.rs | 12 +- .../tests/subscriber_setup/mod.rs | 4 +- .../tests/subscriber_test.rs | 150 +++++++++++------- .../wasm/Cargo.lock | 90 +++++------ .../wasm/src/lib.rs | 6 +- subscription-fee/Cargo.toml | 4 +- subscription-fee/src/service.rs | 4 - subscription-fee/src/subtract_payments.rs | 11 +- .../tests/subscription_setup/mod.rs | 18 ++- subscription-fee/tests/subscription_test.rs | 5 +- subscription-fee/wasm/Cargo.lock | 2 +- 18 files changed, 327 insertions(+), 212 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4c0497b..51a3ac4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -313,7 +313,7 @@ checksum = "2382f75942f4b3be3690fe4f86365e9c853c1587d6ee58212cebf6e2a9ccd101" [[package]] name = "common-types" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "multiversx-sc", ] @@ -321,7 +321,7 @@ dependencies = [ [[package]] name = "common_errors" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "multiversx-sc", ] @@ -337,7 +337,7 @@ dependencies = [ [[package]] name = "common_structs" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "fixed-supply-token", "math", @@ -357,10 +357,10 @@ dependencies = [ [[package]] name = "config" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common_errors", - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "multiversx-sc", "pausable", "permissions_module", @@ -376,10 +376,10 @@ checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" [[package]] name = "contexts" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common_errors", - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "config", "farm_token", "multiversx-sc", @@ -558,9 +558,9 @@ checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" [[package]] name = "energy-factory" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "legacy_token_decode_module", "math", "mergeable", @@ -575,7 +575,7 @@ dependencies = [ [[package]] name = "energy-query" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "energy-factory", "multiversx-sc", @@ -611,9 +611,9 @@ dependencies = [ [[package]] name = "events" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "contexts", "multiversx-sc", ] @@ -621,10 +621,10 @@ dependencies = [ [[package]] name = "farm" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common_errors", - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "config", "contexts", "energy-query", @@ -685,7 +685,7 @@ dependencies = [ [[package]] name = "farm-boosted-yields" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common-types", "config", @@ -700,10 +700,10 @@ dependencies = [ [[package]] name = "farm-with-locked-rewards" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common_errors", - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "config", "contexts", "energy-factory", @@ -731,10 +731,10 @@ dependencies = [ [[package]] name = "farm_base_impl" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common_errors", - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "config", "contexts", "events", @@ -754,10 +754,10 @@ dependencies = [ [[package]] name = "farm_token" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common_errors", - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "config", "multiversx-sc", "multiversx-sc-modules", @@ -775,7 +775,7 @@ checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "fees-collector" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common-types", "common_errors", @@ -800,7 +800,7 @@ checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77" [[package]] name = "fixed-supply-token" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "multiversx-sc", ] @@ -1202,9 +1202,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "legacy_token_decode_module" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "multiversx-sc", "utils", ] @@ -1234,7 +1234,7 @@ dependencies = [ [[package]] name = "locking_module" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "energy-factory", "multiversx-sc", @@ -1250,7 +1250,7 @@ checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "math" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "multiversx-sc", ] @@ -1264,7 +1264,7 @@ checksum = "5486aed0026218e61b8a01d5fbd5a0a134649abb71a0e53b7bc088529dced86e" [[package]] name = "mergeable" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "multiversx-sc", ] @@ -1604,10 +1604,10 @@ dependencies = [ [[package]] name = "pair" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common_errors", - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "fees-collector", "itertools 0.10.5", "multiversx-sc", @@ -1649,7 +1649,7 @@ checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" [[package]] name = "pausable" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "multiversx-sc", "permissions_module", @@ -1683,7 +1683,7 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "permissions_module" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "bitflags 2.4.1", "common_errors", @@ -1875,10 +1875,10 @@ dependencies = [ [[package]] name = "rewards" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common_errors", - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "config", "farm_token", "multiversx-sc", @@ -1949,7 +1949,7 @@ dependencies = [ [[package]] name = "sc_whitelist_module" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common_errors", "multiversx-sc", @@ -2102,9 +2102,9 @@ checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" [[package]] name = "simple-lock" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "multiversx-sc", "multiversx-sc-modules", ] @@ -2242,7 +2242,7 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "token_merge_helper" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common_errors", "multiversx-sc", @@ -2251,10 +2251,10 @@ dependencies = [ [[package]] name = "token_send" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common_errors", - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "multiversx-sc", ] @@ -2415,7 +2415,7 @@ checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" [[package]] name = "unwrappable" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "multiversx-sc", ] @@ -2440,9 +2440,9 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "utils" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "fixed-supply-token", "mergeable", "multiversx-sc", @@ -2584,7 +2584,7 @@ dependencies = [ [[package]] name = "week-timekeeping" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common-types", "multiversx-sc", @@ -2593,7 +2593,7 @@ dependencies = [ [[package]] name = "weekly-rewards-splitting" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common-types", "energy-query", diff --git a/common/common_structs/Cargo.toml b/common/common_structs/Cargo.toml index 6085081..674469a 100644 --- a/common/common_structs/Cargo.toml +++ b/common/common_structs/Cargo.toml @@ -13,4 +13,4 @@ features = ["esdt-token-payment-legacy-decode"] [dependencies.mergeable] git = "https://github.com/multiversx/mx-exchange-sc" -rev = "4be981b" +rev = "1fb9a1d" diff --git a/common/common_subscriber/src/common_subscriber.rs b/common/common_subscriber/src/common_subscriber.rs index e047e7d..44645ad 100644 --- a/common/common_subscriber/src/common_subscriber.rs +++ b/common/common_subscriber/src/common_subscriber.rs @@ -32,6 +32,17 @@ pub trait CommonSubscriberModule { &self, args: MultiValueEncoded, BigUint, Epoch>>, ) { + let wegld_token_id = self.wegld_token_id().get(); + + for arg in args.clone() { + let (token_id_opt, _, _) = arg.into_tuple(); + require!(token_id_opt.is_some(), "Invalid payment token"); + require!( + token_id_opt.unwrap() == wegld_token_id, + "Payment token must be WEGLD" + ); + } + let mut proxy_instance = self.get_subscription_fee_sc_proxy_instance(); let _: () = proxy_instance .register_service(args) @@ -95,6 +106,9 @@ pub trait CommonSubscriberModule { #[storage_mapper("feesContractAddress")] fn fees_contract_address(&self) -> SingleValueMapper; + #[storage_mapper("wegldTokenId")] + fn wegld_token_id(&self) -> SingleValueMapper; + #[view(getUserFees)] #[storage_mapper("userFees")] fn user_fees( diff --git a/farm-boosted-rewards-subscriber/Cargo.toml b/farm-boosted-rewards-subscriber/Cargo.toml index bb05763..e7e0b13 100644 --- a/farm-boosted-rewards-subscriber/Cargo.toml +++ b/farm-boosted-rewards-subscriber/Cargo.toml @@ -25,23 +25,23 @@ path = "../common/common_structs" [dependencies.energy-query] git = "https://github.com/multiversx/mx-exchange-sc" -rev = "4be981b" +rev = "1fb9a1d" [dependencies.energy-factory] git = "https://github.com/multiversx/mx-exchange-sc" -rev = "4be981b" +rev = "1fb9a1d" [dependencies.pair] git = "https://github.com/multiversx/mx-exchange-sc" -rev = "4be981b" +rev = "1fb9a1d" [dependencies.farm-with-locked-rewards] git = "https://github.com/multiversx/mx-exchange-sc" -rev = "4be981b" +rev = "1fb9a1d" [dependencies.config] git = "https://github.com/multiversx/mx-exchange-sc" -rev = "4be981b" +rev = "1fb9a1d" [dev-dependencies] num-bigint = "0.4.2" @@ -51,27 +51,27 @@ hex-literal = "0.3.4" [dev-dependencies.farm-boosted-yields] git = "https://github.com/multiversx/mx-exchange-sc" -rev = "4be981b" +rev = "1fb9a1d" [dev-dependencies.pausable] git = "https://github.com/multiversx/mx-exchange-sc" -rev = "4be981b" +rev = "1fb9a1d" [dev-dependencies.farm_token] git = "https://github.com/multiversx/mx-exchange-sc" -rev = "4be981b" +rev = "1fb9a1d" [dev-dependencies.sc_whitelist_module] git = "https://github.com/multiversx/mx-exchange-sc" -rev = "4be981b" +rev = "1fb9a1d" [dev-dependencies.simple-lock] git = "https://github.com/multiversx/mx-exchange-sc" -rev = "4be981b" +rev = "1fb9a1d" [dev-dependencies.locking_module] git = "https://github.com/multiversx/mx-exchange-sc" -rev = "4be981b" +rev = "1fb9a1d" [dev-dependencies.multiversx-sc-scenario] version = "=0.45.2" diff --git a/farm-boosted-rewards-subscriber/src/claim_farm_boosted.rs b/farm-boosted-rewards-subscriber/src/claim_farm_boosted.rs index 6f22cf9..7ffee7b 100644 --- a/farm-boosted-rewards-subscriber/src/claim_farm_boosted.rs +++ b/farm-boosted-rewards-subscriber/src/claim_farm_boosted.rs @@ -5,6 +5,7 @@ use crate::events; use crate::events::ClaimRewardsOperation; use crate::service; use crate::subscriber_config; +use crate::subscriber_config::SubscriptionUserType; #[multiversx_sc::module] pub trait ClaimFarmBoostedRewardsModule: @@ -37,7 +38,11 @@ pub trait ClaimFarmBoostedRewardsModule: service_index: usize, user_farms_pairs_to_claim: MultiValueEncoded>>, ) { - require!(service_index <= 1, "Invalid service index"); + require!( + service_index == SubscriptionUserType::Normal as usize + || service_index == SubscriptionUserType::Premium as usize, + "Invalid service index" + ); let fees_contract_address = self.fees_contract_address().get(); diff --git a/farm-boosted-rewards-subscriber/src/lib.rs b/farm-boosted-rewards-subscriber/src/lib.rs index c71724a..3903bc2 100644 --- a/farm-boosted-rewards-subscriber/src/lib.rs +++ b/farm-boosted-rewards-subscriber/src/lib.rs @@ -54,22 +54,44 @@ pub trait SubscriberContractMain: "Invalid pair address" ); + let first_token_id = self.first_token_id().get_from_address(&mex_pair_address); + let second_token_id = self.second_token_id().get_from_address(&mex_pair_address); + + require!( + first_token_id == wegld_token_id || first_token_id == mex_token_id, + "Wrong pair address" + ); + require!( + second_token_id == wegld_token_id || second_token_id == mex_token_id, + "Wrong pair address" + ); + self.base_init(fees_contract_address); - self.energy_threshold().set(energy_threshold); - self.mex_token_id().set(mex_token_id); - self.wegld_token_id().set(wegld_token_id); - self.normal_user_percentage().set(normal_user_percentages); - self.premium_user_percentage().set(premium_user_percentages); - self.simple_lock_address().set(simple_lock_address); - self.mex_pair().set(mex_pair_address); - self.lock_period().set(lock_period); + self.energy_threshold().set_if_empty(energy_threshold); + self.mex_token_id().set_if_empty(mex_token_id); + self.wegld_token_id().set_if_empty(wegld_token_id); + self.normal_user_percentage() + .set_if_empty(normal_user_percentages); + self.premium_user_percentage() + .set_if_empty(premium_user_percentages); + self.simple_lock_address().set_if_empty(simple_lock_address); + self.mex_pair().set_if_empty(mex_pair_address); + self.lock_period().set_if_empty(lock_period); + self.total_fees().set_if_empty(UniquePayments::new()); + } - self.total_fees().set(UniquePayments::new()); + #[upgrade] + fn upgrade(&self) {} + + #[only_owner] + #[endpoint(setLockPeriod)] + fn set_lock_period(&self, lock_period: Epoch) { + self.lock_period().set(lock_period); } - #[endpoint] - fn upgrade(&self, energy_threshold: BigUint, lock_period: Epoch) { + #[only_owner] + #[endpoint(setEnergyThreshold)] + fn set_energy_threshold(&self, energy_threshold: BigUint) { self.energy_threshold().set(energy_threshold); - self.lock_period().set(lock_period); } } diff --git a/farm-boosted-rewards-subscriber/src/service.rs b/farm-boosted-rewards-subscriber/src/service.rs index 4c2c2e4..5f5d8ec 100644 --- a/farm-boosted-rewards-subscriber/src/service.rs +++ b/farm-boosted-rewards-subscriber/src/service.rs @@ -35,8 +35,13 @@ pub trait ServiceModule: service_index: usize, user_ids: MultiValueEncoded, ) { - require!(service_index <= 1, "Invalid service index"); - let is_premium_service = service_index == 1; + require!( + service_index == SubscriptionUserType::Normal as usize + || service_index == SubscriptionUserType::Premium as usize, + "Invalid service index" + ); + let is_premium_service = service_index == SubscriptionUserType::Premium as usize; + let energy_threshold = self.energy_threshold().get(); let fees_contract_address = self.fees_contract_address().get(); @@ -80,6 +85,7 @@ pub trait ServiceModule: fn perform_mex_operations_endpoint( &self, service_index: usize, + total_min_amount_out: BigUint, user_ids: MultiValueEncoded, ) { let actions_percentage = if service_index == SubscriptionUserType::Normal as usize { @@ -120,8 +126,12 @@ pub trait ServiceModule: processed_user_ids.push(user_id); } - let total_tokens_to_lock = - self.perform_mex_operation(wegld_token_id, total_fees.clone(), &actions_percentage); + let total_tokens_to_lock = self.perform_mex_operation( + wegld_token_id, + total_fees.clone(), + &actions_percentage, + total_min_amount_out, + ); if total_tokens_to_lock.amount == 0 { return; @@ -133,16 +143,18 @@ pub trait ServiceModule: // Call lock for each user to properly update their energy for mex_operation in mex_operations_list.into_iter() { let user_amount = &total_tokens_to_lock.amount * &mex_operation.amount / &total_fees; - self.call_lock_tokens( - simple_lock_address.clone(), - EsdtTokenPayment::new( - total_tokens_to_lock.token_identifier.clone(), - 0, - user_amount, - ), - lock_period, - mex_operation.user_address, - ); + if user_amount > 0 { + self.call_lock_tokens( + simple_lock_address.clone(), + EsdtTokenPayment::new( + total_tokens_to_lock.token_identifier.clone(), + 0, + user_amount, + ), + lock_period, + mex_operation.user_address, + ); + } } self.emit_mex_operation_event(service_index, processed_user_ids); @@ -153,6 +165,7 @@ pub trait ServiceModule: token_id: TokenIdentifier, total_tokens: BigUint, actions_percentages: &MexActionsPercentages, + total_min_amount_out: BigUint, ) -> EsdtTokenPayment { let actions_value = actions_percentages.get_amounts_per_category(&total_tokens); let total_sell_amount = actions_value.get_sell_amount(); @@ -167,7 +180,7 @@ pub trait ServiceModule: }); } - let bought_mex = self.buy_mex(token_id, total_sell_amount); + let bought_mex = self.buy_mex(token_id, total_sell_amount, total_min_amount_out); let mex_to_lock = &bought_mex.amount * actions_percentages.lock / (actions_percentages.lock + actions_percentages.burn); let mex_to_burn = &bought_mex.amount - &mex_to_lock; @@ -180,13 +193,18 @@ pub trait ServiceModule: EsdtTokenPayment::new(bought_mex.token_identifier, 0, mex_to_lock) } - fn buy_mex(&self, token_id: TokenIdentifier, amount: BigUint) -> EsdtTokenPayment { + fn buy_mex( + &self, + token_id: TokenIdentifier, + amount: BigUint, + min_amount_out: BigUint, + ) -> EsdtTokenPayment { let pair_mapper = self.mex_pair(); require!(!pair_mapper.is_empty(), "The MEX pair is not set"); let mex_token_id = self.mex_token_id().get(); let pair_address = pair_mapper.get(); - self.call_swap_to_mex(pair_address, mex_token_id, token_id, amount) + self.call_swap_to_mex(pair_address, mex_token_id, token_id, amount, min_amount_out) } } diff --git a/farm-boosted-rewards-subscriber/src/subscriber_config.rs b/farm-boosted-rewards-subscriber/src/subscriber_config.rs index 59f5b83..21ec7f1 100644 --- a/farm-boosted-rewards-subscriber/src/subscriber_config.rs +++ b/farm-boosted-rewards-subscriber/src/subscriber_config.rs @@ -65,9 +65,10 @@ pub trait SubscriberConfigModule { mex_token_id: TokenIdentifier, input_token_id: TokenIdentifier, amount: BigUint, + min_amount_out: BigUint, ) -> EsdtTokenPayment { self.other_pair_proxy(pair_address) - .swap_tokens_fixed_input(mex_token_id, BigUint::from(1u32)) + .swap_tokens_fixed_input(mex_token_id, min_amount_out) .with_esdt_transfer(EsdtTokenPayment::new(input_token_id, 0, amount)) .execute_on_dest_context() } @@ -120,9 +121,6 @@ pub trait SubscriberConfigModule { #[storage_mapper("mexTokenId")] fn mex_token_id(&self) -> SingleValueMapper; - #[storage_mapper("wegldTokenId")] - fn wegld_token_id(&self) -> SingleValueMapper; - #[storage_mapper("mexPair")] fn mex_pair(&self) -> SingleValueMapper; @@ -156,4 +154,10 @@ pub trait SubscriberConfigModule { // used for external storage read #[storage_mapper("userId")] fn user_id(&self) -> AddressToIdMapper; + + #[storage_mapper("first_token_id")] + fn first_token_id(&self) -> SingleValueMapper; + + #[storage_mapper("second_token_id")] + fn second_token_id(&self) -> SingleValueMapper; } diff --git a/farm-boosted-rewards-subscriber/tests/subscriber_setup/mod.rs b/farm-boosted-rewards-subscriber/tests/subscriber_setup/mod.rs index 1e7fcb8..0672613 100644 --- a/farm-boosted-rewards-subscriber/tests/subscriber_setup/mod.rs +++ b/farm-boosted-rewards-subscriber/tests/subscriber_setup/mod.rs @@ -44,7 +44,7 @@ where b_mock: Rc>, builder: SubscriberObjBuilder, fee_contract_address: &Address, - pair_address: &Address, + mex_pair_address: &Address, energy_factory_address: &Address, owner_addr: &Address, reward_token_id: &[u8], @@ -80,7 +80,7 @@ where standard_mex_actions_percentages, premium_mex_actions_percentages, managed_address!(energy_factory_address), - managed_address!(pair_address), + managed_address!(mex_pair_address), LOCKING_PERIOD, ); diff --git a/farm-boosted-rewards-subscriber/tests/subscriber_test.rs b/farm-boosted-rewards-subscriber/tests/subscriber_test.rs index 0472df9..05415d8 100644 --- a/farm-boosted-rewards-subscriber/tests/subscriber_test.rs +++ b/farm-boosted-rewards-subscriber/tests/subscriber_test.rs @@ -18,10 +18,10 @@ mod pair_setup; mod subscriber_setup; mod subscription_setup; -static FIRST_TOKEN_ID: &[u8] = b"MYTOKEN-123456"; static USDC_TOKEN_ID: &[u8] = b"USDC-123456"; static WEGLD_TOKEN_ID: &[u8] = b"WEGLD-123456"; static LP_TOKEN_ID: &[u8] = b"LPTOK-123456"; +static STABLE_LP_TOKEN_ID: &[u8] = b"SLPTOK-123456"; static REWARD_TOKEN_ID: &[u8] = b"MEX-123456"; static LOCKED_TOKEN_ID: &[u8] = b"XMEX-123456"; const DEFAULT_BOOSTED_YIELDS_PERCENTAGE: u64 = 2_500; // 25% @@ -43,6 +43,7 @@ fn init_all< ) -> ( Rc>, PairSetup, + PairSetup, FarmSetup, SubscriptionSetup, SubscriberSetup, @@ -52,16 +53,26 @@ fn init_all< let b_mock_ref = RefCell::new(b_mock); let b_mock_rc = Rc::new(b_mock_ref); - let pair_setup = PairSetup::new( + let mex_pair_setup = PairSetup::new( b_mock_rc.clone(), pair_builder, &owner, - FIRST_TOKEN_ID, - USDC_TOKEN_ID, + WEGLD_TOKEN_ID, + REWARD_TOKEN_ID, LP_TOKEN_ID, 1_000_000_000, 2_000_000_000, ); + let stable_pair_setup = PairSetup::new( + b_mock_rc.clone(), + pair_builder, + &owner, + WEGLD_TOKEN_ID, + USDC_TOKEN_ID, + STABLE_LP_TOKEN_ID, + 1_000_000_000, + 2_000_000_000, + ); let farm_setup = FarmSetup::new( b_mock_rc.clone(), @@ -70,7 +81,7 @@ fn init_all< LOCKED_TOKEN_ID, LP_TOKEN_ID, DEFAULT_BOOSTED_YIELDS_PERCENTAGE, - pair_setup.pair_wrapper.address_ref(), + mex_pair_setup.pair_wrapper.address_ref(), farm_builder, energy_factory_builder, ); @@ -79,16 +90,16 @@ fn init_all< b_mock_rc.clone(), sub_builder, &owner, - pair_setup.pair_wrapper.address_ref(), - vec![FIRST_TOKEN_ID.to_vec()], + stable_pair_setup.pair_wrapper.address_ref(), + vec![WEGLD_TOKEN_ID.to_vec()], ); b_mock_rc .borrow_mut() .execute_tx(&owner, &sub_sc.s_wrapper, &rust_biguint!(0), |sc| { sc.add_pair_address( - managed_token_id!(FIRST_TOKEN_ID), - managed_address!(pair_setup.pair_wrapper.address_ref()), + managed_token_id!(WEGLD_TOKEN_ID), + managed_address!(stable_pair_setup.pair_wrapper.address_ref()), ); }) .assert_ok(); @@ -97,14 +108,21 @@ fn init_all< b_mock_rc.clone(), subscriber_builder, sub_sc.s_wrapper.address_ref(), - pair_setup.pair_wrapper.address_ref(), + mex_pair_setup.pair_wrapper.address_ref(), farm_setup.energy_factory_wrapper.address_ref(), &owner, REWARD_TOKEN_ID, WEGLD_TOKEN_ID, ); - (b_mock_rc, pair_setup, farm_setup, sub_sc, subscriber) + ( + b_mock_rc, + mex_pair_setup, + stable_pair_setup, + farm_setup, + sub_sc, + subscriber, + ) } #[test] @@ -120,14 +138,20 @@ fn init_test() { #[test] fn claim_boosted_rewards_for_user_test() { - let (b_mock_rc, _pair_setup, mut farm_setup, mut subscription_setup, mut subscriber_setup) = - init_all( - pair::contract_obj, - farm_with_locked_rewards::contract_obj, - energy_factory::contract_obj, - subscription_fee::contract_obj, - farm_boosted_rewards_subscriber::contract_obj, - ); + let ( + b_mock_rc, + _mex_pair_setup, + _stable_pair_setup, + mut farm_setup, + mut subscription_setup, + mut subscriber_setup, + ) = init_all( + pair::contract_obj, + farm_with_locked_rewards::contract_obj, + energy_factory::contract_obj, + subscription_fee::contract_obj, + farm_boosted_rewards_subscriber::contract_obj, + ); let farm_id = subscriber_setup.call_add_farm(farm_setup.farm_wrapper.address_ref()); let farm_list = vec![farm_id]; @@ -141,12 +165,12 @@ fn claim_boosted_rewards_for_user_test() { subscriber_setup .call_register_service(vec![ ( - Some(FIRST_TOKEN_ID.to_vec()), + Some(WEGLD_TOKEN_ID.to_vec()), 1_000, WEEKLY_SUBSCRIPTION_EPOCHS, ), ( - Some(FIRST_TOKEN_ID.to_vec()), + Some(WEGLD_TOKEN_ID.to_vec()), 500, WEEKLY_SUBSCRIPTION_EPOCHS, ), @@ -159,10 +183,10 @@ fn claim_boosted_rewards_for_user_test() { b_mock_rc .borrow_mut() - .set_esdt_balance(&user, FIRST_TOKEN_ID, &rust_biguint!(1_000_000)); + .set_esdt_balance(&user, WEGLD_TOKEN_ID, &rust_biguint!(1_000_000)); subscription_setup - .call_deposit(&user, FIRST_TOKEN_ID, 1_000_000) + .call_deposit(&user, WEGLD_TOKEN_ID, 1_000_000) .assert_ok(); let normal_service = 0; @@ -222,7 +246,7 @@ fn claim_boosted_rewards_for_user_test() { b_mock_rc.borrow().check_esdt_balance( subscriber_setup.sub_wrapper.address_ref(), - FIRST_TOKEN_ID, + WEGLD_TOKEN_ID, &rust_biguint!(1_000), ); @@ -245,7 +269,7 @@ fn claim_boosted_rewards_for_user_test() { // still same subscriber balance, no funds subtracted b_mock_rc.borrow().check_esdt_balance( subscriber_setup.sub_wrapper.address_ref(), - FIRST_TOKEN_ID, + WEGLD_TOKEN_ID, &rust_biguint!(1_000), ); @@ -258,21 +282,27 @@ fn claim_boosted_rewards_for_user_test() { // still same balance, subtraction is done manually once per month b_mock_rc.borrow().check_esdt_balance( subscriber_setup.sub_wrapper.address_ref(), - FIRST_TOKEN_ID, + WEGLD_TOKEN_ID, &rust_biguint!(1_000), ); } #[test] fn claim_boosted_rewards_for_user_multiple_farms_test() { - let (b_mock_rc, pair_setup, mut farm_setup, mut subscription_setup, mut subscriber_setup) = - init_all( - pair::contract_obj, - farm_with_locked_rewards::contract_obj, - energy_factory::contract_obj, - subscription_fee::contract_obj, - farm_boosted_rewards_subscriber::contract_obj, - ); + let ( + b_mock_rc, + mex_pair_setup, + _stable_pair_setup, + mut farm_setup, + mut subscription_setup, + mut subscriber_setup, + ) = init_all( + pair::contract_obj, + farm_with_locked_rewards::contract_obj, + energy_factory::contract_obj, + subscription_fee::contract_obj, + farm_boosted_rewards_subscriber::contract_obj, + ); let mut farm_setup2 = FarmSetup::new( b_mock_rc.clone(), @@ -281,7 +311,7 @@ fn claim_boosted_rewards_for_user_multiple_farms_test() { LOCKED_TOKEN_ID, LP_TOKEN_ID, 7_500u64, - pair_setup.pair_wrapper.address_ref(), + mex_pair_setup.pair_wrapper.address_ref(), farm_with_locked_rewards::contract_obj, energy_factory::contract_obj, ); @@ -298,12 +328,12 @@ fn claim_boosted_rewards_for_user_multiple_farms_test() { subscriber_setup .call_register_service(vec![ ( - Some(FIRST_TOKEN_ID.to_vec()), + Some(WEGLD_TOKEN_ID.to_vec()), 1_000, WEEKLY_SUBSCRIPTION_EPOCHS, ), ( - Some(FIRST_TOKEN_ID.to_vec()), + Some(WEGLD_TOKEN_ID.to_vec()), 500, WEEKLY_SUBSCRIPTION_EPOCHS, ), @@ -316,10 +346,10 @@ fn claim_boosted_rewards_for_user_multiple_farms_test() { b_mock_rc .borrow_mut() - .set_esdt_balance(&user, FIRST_TOKEN_ID, &rust_biguint!(1_000_000)); + .set_esdt_balance(&user, WEGLD_TOKEN_ID, &rust_biguint!(1_000_000)); subscription_setup - .call_deposit(&user, FIRST_TOKEN_ID, 1_000_000) + .call_deposit(&user, WEGLD_TOKEN_ID, 1_000_000) .assert_ok(); let normal_service = 0; @@ -402,7 +432,7 @@ fn claim_boosted_rewards_for_user_multiple_farms_test() { b_mock_rc.borrow().check_esdt_balance( subscriber_setup.sub_wrapper.address_ref(), - FIRST_TOKEN_ID, + WEGLD_TOKEN_ID, &rust_biguint!(1_000), ); @@ -430,7 +460,7 @@ fn claim_boosted_rewards_for_user_multiple_farms_test() { // still same subscriber balance, no funds subtracted b_mock_rc.borrow().check_esdt_balance( subscriber_setup.sub_wrapper.address_ref(), - FIRST_TOKEN_ID, + WEGLD_TOKEN_ID, &rust_biguint!(1_000), ); @@ -443,21 +473,27 @@ fn claim_boosted_rewards_for_user_multiple_farms_test() { // still same balance, subtraction is done manually once per month b_mock_rc.borrow().check_esdt_balance( subscriber_setup.sub_wrapper.address_ref(), - FIRST_TOKEN_ID, + WEGLD_TOKEN_ID, &rust_biguint!(1_000), ); } #[test] fn claim_boosted_rewards_for_premium_user_test() { - let (b_mock_rc, _pair_setup, mut farm_setup, mut subscription_setup, mut subscriber_setup) = - init_all( - pair::contract_obj, - farm_with_locked_rewards::contract_obj, - energy_factory::contract_obj, - subscription_fee::contract_obj, - farm_boosted_rewards_subscriber::contract_obj, - ); + let ( + b_mock_rc, + _mex_pair_setup, + _stable_pair_setup, + mut farm_setup, + mut subscription_setup, + mut subscriber_setup, + ) = init_all( + pair::contract_obj, + farm_with_locked_rewards::contract_obj, + energy_factory::contract_obj, + subscription_fee::contract_obj, + farm_boosted_rewards_subscriber::contract_obj, + ); let farm_id = subscriber_setup.call_add_farm(farm_setup.farm_wrapper.address_ref()); let farm_list = vec![farm_id]; @@ -471,12 +507,12 @@ fn claim_boosted_rewards_for_premium_user_test() { subscriber_setup .call_register_service(vec![ ( - Some(FIRST_TOKEN_ID.to_vec()), + Some(WEGLD_TOKEN_ID.to_vec()), 1_000, WEEKLY_SUBSCRIPTION_EPOCHS, ), ( - Some(FIRST_TOKEN_ID.to_vec()), + Some(WEGLD_TOKEN_ID.to_vec()), 500, WEEKLY_SUBSCRIPTION_EPOCHS, ), @@ -489,10 +525,10 @@ fn claim_boosted_rewards_for_premium_user_test() { b_mock_rc .borrow_mut() - .set_esdt_balance(&user, FIRST_TOKEN_ID, &rust_biguint!(1_000_000)); + .set_esdt_balance(&user, WEGLD_TOKEN_ID, &rust_biguint!(1_000_000)); subscription_setup - .call_deposit(&user, FIRST_TOKEN_ID, 1_000_000) + .call_deposit(&user, WEGLD_TOKEN_ID, 1_000_000) .assert_ok(); // Subscribe to premium service @@ -554,7 +590,7 @@ fn claim_boosted_rewards_for_premium_user_test() { // Different price for premium users b_mock_rc.borrow().check_esdt_balance( subscriber_setup.sub_wrapper.address_ref(), - FIRST_TOKEN_ID, + WEGLD_TOKEN_ID, &rust_biguint!(500), ); @@ -577,7 +613,7 @@ fn claim_boosted_rewards_for_premium_user_test() { // still same subscriber balance, no funds subtracted b_mock_rc.borrow().check_esdt_balance( subscriber_setup.sub_wrapper.address_ref(), - FIRST_TOKEN_ID, + WEGLD_TOKEN_ID, &rust_biguint!(500), ); @@ -590,7 +626,7 @@ fn claim_boosted_rewards_for_premium_user_test() { // still same balance, subtraction is done manually once per month b_mock_rc.borrow().check_esdt_balance( subscriber_setup.sub_wrapper.address_ref(), - FIRST_TOKEN_ID, + WEGLD_TOKEN_ID, &rust_biguint!(500), ); } diff --git a/farm-boosted-rewards-subscriber/wasm/Cargo.lock b/farm-boosted-rewards-subscriber/wasm/Cargo.lock index c40ee7e..2577620 100644 --- a/farm-boosted-rewards-subscriber/wasm/Cargo.lock +++ b/farm-boosted-rewards-subscriber/wasm/Cargo.lock @@ -47,7 +47,7 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "common-types" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "multiversx-sc", ] @@ -55,7 +55,7 @@ dependencies = [ [[package]] name = "common_errors" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "multiversx-sc", ] @@ -71,7 +71,7 @@ dependencies = [ [[package]] name = "common_structs" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "fixed-supply-token", "math", @@ -91,10 +91,10 @@ dependencies = [ [[package]] name = "config" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common_errors", - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "multiversx-sc", "pausable", "permissions_module", @@ -104,10 +104,10 @@ dependencies = [ [[package]] name = "contexts" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common_errors", - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "config", "farm_token", "multiversx-sc", @@ -134,9 +134,9 @@ checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" [[package]] name = "energy-factory" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "legacy_token_decode_module", "math", "mergeable", @@ -151,7 +151,7 @@ dependencies = [ [[package]] name = "energy-query" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "energy-factory", "multiversx-sc", @@ -160,9 +160,9 @@ dependencies = [ [[package]] name = "events" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "contexts", "multiversx-sc", ] @@ -170,10 +170,10 @@ dependencies = [ [[package]] name = "farm" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common_errors", - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "config", "contexts", "energy-query", @@ -223,7 +223,7 @@ dependencies = [ [[package]] name = "farm-boosted-yields" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common-types", "config", @@ -238,10 +238,10 @@ dependencies = [ [[package]] name = "farm-with-locked-rewards" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common_errors", - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "config", "contexts", "energy-factory", @@ -269,10 +269,10 @@ dependencies = [ [[package]] name = "farm_base_impl" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common_errors", - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "config", "contexts", "events", @@ -292,10 +292,10 @@ dependencies = [ [[package]] name = "farm_token" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common_errors", - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "config", "multiversx-sc", "multiversx-sc-modules", @@ -307,7 +307,7 @@ dependencies = [ [[package]] name = "fees-collector" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common-types", "common_errors", @@ -326,7 +326,7 @@ dependencies = [ [[package]] name = "fixed-supply-token" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "multiversx-sc", ] @@ -365,9 +365,9 @@ dependencies = [ [[package]] name = "legacy_token_decode_module" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "multiversx-sc", "utils", ] @@ -375,7 +375,7 @@ dependencies = [ [[package]] name = "locking_module" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "energy-factory", "multiversx-sc", @@ -385,7 +385,7 @@ dependencies = [ [[package]] name = "math" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "multiversx-sc", ] @@ -393,7 +393,7 @@ dependencies = [ [[package]] name = "mergeable" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "multiversx-sc", ] @@ -492,10 +492,10 @@ checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "pair" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common_errors", - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "fees-collector", "itertools", "multiversx-sc", @@ -508,7 +508,7 @@ dependencies = [ [[package]] name = "pausable" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "multiversx-sc", "permissions_module", @@ -517,7 +517,7 @@ dependencies = [ [[package]] name = "permissions_module" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "bitflags", "common_errors", @@ -555,10 +555,10 @@ dependencies = [ [[package]] name = "rewards" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common_errors", - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "config", "farm_token", "multiversx-sc", @@ -571,7 +571,7 @@ dependencies = [ [[package]] name = "sc_whitelist_module" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common_errors", "multiversx-sc", @@ -580,9 +580,9 @@ dependencies = [ [[package]] name = "simple-lock" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "multiversx-sc", "multiversx-sc-modules", ] @@ -616,7 +616,7 @@ dependencies = [ [[package]] name = "token_merge_helper" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common_errors", "multiversx-sc", @@ -625,10 +625,10 @@ dependencies = [ [[package]] name = "token_send" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common_errors", - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "multiversx-sc", ] @@ -641,7 +641,7 @@ checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unwrappable" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "multiversx-sc", ] @@ -649,9 +649,9 @@ dependencies = [ [[package]] name = "utils" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ - "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b)", + "common_structs 0.0.0 (git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d)", "fixed-supply-token", "mergeable", "multiversx-sc", @@ -666,7 +666,7 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "week-timekeeping" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common-types", "multiversx-sc", @@ -675,7 +675,7 @@ dependencies = [ [[package]] name = "weekly-rewards-splitting" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "common-types", "energy-query", diff --git a/farm-boosted-rewards-subscriber/wasm/src/lib.rs b/farm-boosted-rewards-subscriber/wasm/src/lib.rs index 0c212a1..2456234 100644 --- a/farm-boosted-rewards-subscriber/wasm/src/lib.rs +++ b/farm-boosted-rewards-subscriber/wasm/src/lib.rs @@ -5,9 +5,9 @@ //////////////////////////////////////////////////// // Init: 1 -// Endpoints: 19 +// Endpoints: 21 // Async Callback (empty): 1 -// Total number of exported functions: 21 +// Total number of exported functions: 23 #![no_std] @@ -23,6 +23,8 @@ multiversx_sc_wasm_adapter::endpoints! { ( init => init upgrade => upgrade + setLockPeriod => set_lock_period + setEnergyThreshold => set_energy_threshold getSimpleLockAddress => simple_lock_address getLockPeriod => lock_period getNormalUserPercentage => normal_user_percentage diff --git a/subscription-fee/Cargo.toml b/subscription-fee/Cargo.toml index 81adb7b..e5dab04 100644 --- a/subscription-fee/Cargo.toml +++ b/subscription-fee/Cargo.toml @@ -26,11 +26,11 @@ path = "../common/common_structs" [dev-dependencies.pair] git = "https://github.com/multiversx/mx-exchange-sc" -rev = "4be981b" +rev = "1fb9a1d" [dev-dependencies.pausable] git = "https://github.com/multiversx/mx-exchange-sc" -rev = "4be981b" +rev = "1fb9a1d" [dev-dependencies.multiversx-sc-scenario] version = "=0.45.2" \ No newline at end of file diff --git a/subscription-fee/src/service.rs b/subscription-fee/src/service.rs index d9869fb..7aa4af8 100644 --- a/subscription-fee/src/service.rs +++ b/subscription-fee/src/service.rs @@ -149,10 +149,6 @@ pub trait ServiceModule: #[endpoint] fn subscribe(&self, services: MultiValueEncoded>) { let caller = self.blockchain().get_caller(); - require!( - !self.blockchain().is_smart_contract(&caller), - "Only user accounts can subscribe to services" - ); let caller_id = self.user_id().get_id_non_zero(&caller); for service in services { diff --git a/subscription-fee/src/subtract_payments.rs b/subscription-fee/src/subtract_payments.rs index ae39ae5..d6f1395 100644 --- a/subscription-fee/src/subtract_payments.rs +++ b/subscription-fee/src/subtract_payments.rs @@ -53,11 +53,12 @@ pub trait SubtractPaymentsModule: let service_id = self.service_id().get_id_non_zero(&caller); let current_epoch = self.blockchain().get_block_epoch(); - require!( - self.subscribed_users(service_id, service_index) - .contains(&user_id), - "User is not subscribed to the service" - ); + if !self + .subscribed_users(service_id, service_index) + .contains(&user_id) + { + return ScResult::Err(()); + } let next_payment_mapper = self.user_next_payment_epoch(user_id, service_id, service_index); let next_payment_epoch = next_payment_mapper.get(); diff --git a/subscription-fee/tests/subscription_setup/mod.rs b/subscription-fee/tests/subscription_setup/mod.rs index c35956e..ff75e8d 100644 --- a/subscription-fee/tests/subscription_setup/mod.rs +++ b/subscription-fee/tests/subscription_setup/mod.rs @@ -12,7 +12,9 @@ use multiversx_sc_scenario::{ DebugApi, }; use subscription_fee::{ - fees::FeesModule, service::ServiceModule, subtract_payments::SubtractPaymentsModule, + fees::FeesModule, + service::ServiceModule, + subtract_payments::{ScResult, SubtractPaymentsModule}, SubscriptionFee, }; @@ -159,6 +161,20 @@ where }) } + pub fn call_subtract_payment_with_sc_error( + &mut self, + caller: &Address, + service_index: usize, + user_id: AddressId, + ) -> TxResult { + self.b_mock + .borrow_mut() + .execute_tx(caller, &self.s_wrapper, &rust_biguint!(0), |sc| { + let result = sc.subtract_payment(service_index, user_id); + assert_eq!(result, ScResult::Err(())); + }) + } + pub fn call_withdraw_funds( &mut self, caller: &Address, diff --git a/subscription-fee/tests/subscription_test.rs b/subscription-fee/tests/subscription_test.rs index 632733d..c67d741 100644 --- a/subscription-fee/tests/subscription_test.rs +++ b/subscription-fee/tests/subscription_test.rs @@ -447,9 +447,10 @@ fn try_substract_from_unsubscribed_user_test() { b_mock_rc.borrow_mut().set_block_epoch(10); + // The endpoint returns a ScResult::Err(()), but does not stop the execution sub_sc - .call_subtract_payment(&rand_service, 0, 1) - .assert_error(4, "User is not subscribed to the service"); + .call_subtract_payment_with_sc_error(&rand_service, 0, 1) + .assert_ok(); // The service was not able to substract the payment for the wrong service index b_mock_rc diff --git a/subscription-fee/wasm/Cargo.lock b/subscription-fee/wasm/Cargo.lock index 8937e97..924b91c 100644 --- a/subscription-fee/wasm/Cargo.lock +++ b/subscription-fee/wasm/Cargo.lock @@ -83,7 +83,7 @@ checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" [[package]] name = "mergeable" version = "0.0.0" -source = "git+https://github.com/multiversx/mx-exchange-sc?rev=4be981b#4be981b2477e9f9976dc598ee2aca926cac8456b" +source = "git+https://github.com/multiversx/mx-exchange-sc?rev=1fb9a1d#1fb9a1dcc47d5a37079b50f8bbd0caa2ebea441e" dependencies = [ "multiversx-sc", ] From 6e69c1a7f5aeead939d2a41b0b8805bf3fadb173 Mon Sep 17 00:00:00 2001 From: Sorin Petreasca Date: Thu, 28 Dec 2023 14:46:12 +0200 Subject: [PATCH 2/2] new unit test & code updates --- .../src/service.rs | 17 ++- .../tests/farm_setup/mod.rs | 8 ++ .../tests/subscriber_setup/mod.rs | 41 +++++- .../tests/subscriber_test.rs | 120 ++++++++++++++++++ 4 files changed, 180 insertions(+), 6 deletions(-) diff --git a/farm-boosted-rewards-subscriber/src/service.rs b/farm-boosted-rewards-subscriber/src/service.rs index 5f5d8ec..fa87e22 100644 --- a/farm-boosted-rewards-subscriber/src/service.rs +++ b/farm-boosted-rewards-subscriber/src/service.rs @@ -41,12 +41,10 @@ pub trait ServiceModule: "Invalid service index" ); let is_premium_service = service_index == SubscriptionUserType::Premium as usize; - let energy_threshold = self.energy_threshold().get(); - let fees_contract_address = self.fees_contract_address().get(); - let mut processed_user_ids = ManagedVec::new(); + for user_id in user_ids { if is_premium_service { let opt_user_address = self @@ -141,8 +139,17 @@ pub trait ServiceModule: let lock_period = self.lock_period().get(); // Call lock for each user to properly update their energy - for mex_operation in mex_operations_list.into_iter() { - let user_amount = &total_tokens_to_lock.amount * &mex_operation.amount / &total_fees; + let mut total_processed_amount = BigUint::zero(); + for i in 0..mex_operations_list.len() { + let mex_operation = mex_operations_list.get(i); + let user_amount = if i < mex_operations_list.len() - 1 { + let amount = &total_tokens_to_lock.amount * &mex_operation.amount / &total_fees; + total_processed_amount += &amount; + amount + } else { + &total_tokens_to_lock.amount - &total_processed_amount + }; + if user_amount > 0 { self.call_lock_tokens( simple_lock_address.clone(), diff --git a/farm-boosted-rewards-subscriber/tests/farm_setup/mod.rs b/farm-boosted-rewards-subscriber/tests/farm_setup/mod.rs index 1ab0ef4..68e5828 100644 --- a/farm-boosted-rewards-subscriber/tests/farm_setup/mod.rs +++ b/farm-boosted-rewards-subscriber/tests/farm_setup/mod.rs @@ -6,6 +6,7 @@ use std::rc::Rc; use multiversx_sc::codec::multi_types::OptionalValue; use multiversx_sc::storage::mappers::StorageTokenWrapper; use multiversx_sc::types::{Address, BigInt, EsdtLocalRole, ManagedAddress, MultiValueEncoded}; +use multiversx_sc_modules::pause::PauseModule; use multiversx_sc_scenario::testing_framework::TxResult; use multiversx_sc_scenario::{ managed_address, managed_biguint, managed_token_id, rust_biguint, @@ -101,6 +102,7 @@ where sc.locked_token() .set_token_id(managed_token_id!(locked_token_id)); + sc.unpause_endpoint(); }) .assert_ok(); @@ -171,6 +173,12 @@ where &locked_reward_token_roles[..], ); + b_mock.borrow_mut().set_esdt_local_roles( + energy_factory_wrapper.address_ref(), + reward_token_id, + &farming_token_roles[..], + ); + b_mock .borrow_mut() .execute_tx(owner, &energy_factory_wrapper, &rust_zero, |sc| { diff --git a/farm-boosted-rewards-subscriber/tests/subscriber_setup/mod.rs b/farm-boosted-rewards-subscriber/tests/subscriber_setup/mod.rs index 0672613..c83c583 100644 --- a/farm-boosted-rewards-subscriber/tests/subscriber_setup/mod.rs +++ b/farm-boosted-rewards-subscriber/tests/subscriber_setup/mod.rs @@ -11,7 +11,7 @@ use farm_boosted_rewards_subscriber::{ use multiversx_sc::{ codec::multi_types::MultiValue2, storage::mappers::AddressId, - types::{Address, ManagedVec, MultiValueEncoded}, + types::{Address, EsdtLocalRole, ManagedVec, MultiValueEncoded}, }; use multiversx_sc_scenario::{ managed_address, managed_biguint, managed_token_id, rust_biguint, @@ -88,6 +88,13 @@ where }) .assert_ok(); + let mex_token_roles = [EsdtLocalRole::Burn]; + b_mock.borrow_mut().set_esdt_local_roles( + sub_wrapper.address_ref(), + reward_token_id, + &mex_token_roles[..], + ); + Self { b_mock, owner_addr: owner_addr.clone(), @@ -185,4 +192,36 @@ where }, ) } + + pub fn call_perform_mex_operation( + &mut self, + service_index: usize, + users_list: Vec, + ) -> TxResult { + self.b_mock.borrow_mut().execute_tx( + &self.owner_addr, + &self.sub_wrapper, + &rust_biguint!(0), + |sc| { + let mut user_ids = MultiValueEncoded::new(); + for user_id in users_list { + user_ids.push(user_id); + } + + sc.perform_mex_operations_endpoint(service_index, managed_biguint!(1u64), user_ids); + }, + ) + } + + pub fn call_claim_fees(&mut self, expected_output_payments_no: usize) -> TxResult { + self.b_mock.borrow_mut().execute_tx( + &self.owner_addr, + &self.sub_wrapper, + &rust_biguint!(0), + |sc| { + let result = sc.claim_fees(); + assert_eq!(result.len(), expected_output_payments_no); + }, + ) + } } diff --git a/farm-boosted-rewards-subscriber/tests/subscriber_test.rs b/farm-boosted-rewards-subscriber/tests/subscriber_test.rs index 05415d8..8c4bb09 100644 --- a/farm-boosted-rewards-subscriber/tests/subscriber_test.rs +++ b/farm-boosted-rewards-subscriber/tests/subscriber_test.rs @@ -630,3 +630,123 @@ fn claim_boosted_rewards_for_premium_user_test() { &rust_biguint!(500), ); } + +#[test] +fn mex_operation_with_claim_fees_test() { + let ( + b_mock_rc, + _mex_pair_setup, + _stable_pair_setup, + _farm_setup, + mut subscription_setup, + mut subscriber_setup, + ) = init_all( + pair::contract_obj, + farm_with_locked_rewards::contract_obj, + energy_factory::contract_obj, + subscription_fee::contract_obj, + farm_boosted_rewards_subscriber::contract_obj, + ); + + let first_user = b_mock_rc + .borrow_mut() + .create_user_account(&rust_biguint!(0)); + let second_user = b_mock_rc + .borrow_mut() + .create_user_account(&rust_biguint!(0)); + let first_user_id = 1; + let second_user_id = 2; + + b_mock_rc.borrow_mut().set_block_epoch(2); + + subscriber_setup + .call_register_service(vec![ + ( + Some(WEGLD_TOKEN_ID.to_vec()), + 1_000, + WEEKLY_SUBSCRIPTION_EPOCHS, + ), + ( + Some(WEGLD_TOKEN_ID.to_vec()), + 500, + WEEKLY_SUBSCRIPTION_EPOCHS, + ), + ]) + .assert_ok(); + + subscription_setup + .call_approve_service(subscriber_setup.sub_wrapper.address_ref()) + .assert_ok(); + + b_mock_rc + .borrow_mut() + .set_esdt_balance(&first_user, WEGLD_TOKEN_ID, &rust_biguint!(1_000_000)); + + subscription_setup + .call_deposit(&first_user, WEGLD_TOKEN_ID, 1_000_000) + .assert_ok(); + + b_mock_rc.borrow_mut().set_esdt_balance( + &second_user, + WEGLD_TOKEN_ID, + &rust_biguint!(1_000_000), + ); + + subscription_setup + .call_deposit(&second_user, WEGLD_TOKEN_ID, 1_000_000) + .assert_ok(); + + // Subscribe to standard service + let standard_service = 0; + subscription_setup + .call_subscribe(&first_user, vec![(1, standard_service)]) + .assert_ok(); + subscription_setup + .call_subscribe(&second_user, vec![(1, standard_service)]) + .assert_ok(); + + subscriber_setup + .call_subtract_payment(standard_service, vec![first_user_id, second_user_id]) + .assert_ok(); + + subscriber_setup + .call_perform_mex_operation(standard_service, vec![first_user_id, second_user_id]) + .assert_ok(); + + // Expected locked tokens balance: 1799 + b_mock_rc + .borrow() + .check_nft_balance::>( + &first_user, + LOCKED_TOKEN_ID, + 1, + &rust_biguint!(1799), + None, + ); + + // Expected locked tokens balance: 1800 - the last user is computed by difference + b_mock_rc + .borrow() + .check_nft_balance::>( + &second_user, + LOCKED_TOKEN_ID, + 1, + &rust_biguint!(1800), + None, + ); + + b_mock_rc.borrow().check_esdt_balance( + &subscriber_setup.owner_addr, + WEGLD_TOKEN_ID, + &rust_biguint!(0), + ); + + let expected_fee_amount = 160; + subscriber_setup.call_claim_fees(1).assert_ok(); + + b_mock_rc.borrow().check_esdt_balance( + &subscriber_setup.owner_addr, + WEGLD_TOKEN_ID, + &rust_biguint!(expected_fee_amount), + ); +}