@layerzerolabs/protocol-stellar-v2 0.2.33 → 0.2.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/.turbo/turbo-build.log +377 -392
  2. package/.turbo/turbo-lint.log +209 -207
  3. package/.turbo/turbo-test.log +1687 -1753
  4. package/contracts/oapps/oft/integration-tests/extensions/test_oft_fee.rs +5 -11
  5. package/contracts/oapps/oft/integration-tests/extensions/test_pausable.rs +7 -14
  6. package/contracts/oapps/oft/integration-tests/extensions/test_rate_limiter.rs +11 -22
  7. package/contracts/oapps/oft/integration-tests/setup.rs +59 -7
  8. package/contracts/oapps/oft/integration-tests/utils.rs +28 -2
  9. package/contracts/oapps/oft/src/interfaces/mintable.rs +14 -0
  10. package/contracts/oapps/oft/src/interfaces/mod.rs +2 -2
  11. package/contracts/oapps/oft/src/oft.rs +3 -3
  12. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +8 -8
  13. package/contracts/oapps/oft/src/oft_types/mod.rs +3 -4
  14. package/contracts/oapps/oft/src/tests/extensions/rate_limiter.rs +7 -5
  15. package/contracts/oapps/sac-manager/src/errors.rs +14 -0
  16. package/contracts/{sac-manager → oapps/sac-manager}/src/lib.rs +0 -4
  17. package/contracts/oapps/sac-manager/src/sac_manager.rs +115 -0
  18. package/contracts/oapps/sac-manager/src/storage.rs +20 -0
  19. package/contracts/{sac-manager → oapps/sac-manager}/src/tests/mod.rs +0 -4
  20. package/contracts/oapps/sac-manager/src/tests/sac_manager/clawback.rs +86 -0
  21. package/contracts/oapps/sac-manager/src/tests/sac_manager/mint.rs +58 -0
  22. package/contracts/{sac-manager → oapps/sac-manager}/src/tests/sac_manager/mod.rs +1 -3
  23. package/contracts/oapps/sac-manager/src/tests/sac_manager/set_minter.rs +69 -0
  24. package/contracts/oapps/sac-manager/src/tests/sac_manager/test_helper.rs +18 -0
  25. package/contracts/oapps/sac-manager/src/tests/sac_manager/view_functions.rs +28 -0
  26. package/contracts/{sac-manager → oapps/sac-manager}/src/tests/test_helper.rs +16 -59
  27. package/package.json +8 -3
  28. package/sdk/.turbo/turbo-test.log +373 -374
  29. package/sdk/dist/generated/oft.d.ts +3 -3
  30. package/sdk/dist/generated/oft.js +4 -4
  31. package/sdk/dist/generated/sac_manager.d.ts +26 -318
  32. package/sdk/dist/generated/sac_manager.js +23 -129
  33. package/sdk/package.json +6 -1
  34. package/sdk/test/oft-sml.test.ts +72 -36
  35. package/sdk/test/sac-manager-redistribution.test.ts +38 -182
  36. package/contracts/oapps/oft/src/interfaces/mint_burnable.rs +0 -18
  37. package/contracts/sac-manager/src/errors.rs +0 -18
  38. package/contracts/sac-manager/src/extensions/mod.rs +0 -6
  39. package/contracts/sac-manager/src/extensions/redistribution.rs +0 -109
  40. package/contracts/sac-manager/src/extensions/supply_control/mod.rs +0 -488
  41. package/contracts/sac-manager/src/extensions/supply_control/rate_limit.rs +0 -126
  42. package/contracts/sac-manager/src/interfaces/mod.rs +0 -3
  43. package/contracts/sac-manager/src/interfaces/sac_manager.rs +0 -52
  44. package/contracts/sac-manager/src/sac_manager.rs +0 -193
  45. package/contracts/sac-manager/src/storage.rs +0 -20
  46. package/contracts/sac-manager/src/tests/redistribution/mod.rs +0 -1
  47. package/contracts/sac-manager/src/tests/redistribution/redistribute_funds.rs +0 -82
  48. package/contracts/sac-manager/src/tests/sac_manager/admin_mint.rs +0 -206
  49. package/contracts/sac-manager/src/tests/sac_manager/burn.rs +0 -215
  50. package/contracts/sac-manager/src/tests/sac_manager/clawback.rs +0 -209
  51. package/contracts/sac-manager/src/tests/sac_manager/mint.rs +0 -252
  52. package/contracts/sac-manager/src/tests/sac_manager/set_oft_address.rs +0 -47
  53. package/contracts/sac-manager/src/tests/sac_manager/test_helper.rs +0 -75
  54. package/contracts/sac-manager/src/tests/sac_manager/view_functions.rs +0 -60
  55. package/contracts/sac-manager/src/tests/supply_control/enumerable_set.rs +0 -256
  56. package/contracts/sac-manager/src/tests/supply_control/mod.rs +0 -8
  57. package/contracts/sac-manager/src/tests/supply_control/refill.rs +0 -90
  58. package/contracts/sac-manager/src/tests/supply_control/set_mint_whitelist.rs +0 -245
  59. package/contracts/sac-manager/src/tests/supply_control/set_supply_controller.rs +0 -267
  60. package/contracts/sac-manager/src/tests/supply_control/set_supply_controller_manager.rs +0 -122
  61. package/contracts/sac-manager/src/tests/supply_control/test_helper.rs +0 -38
  62. package/contracts/sac-manager/src/tests/supply_control/update_allow_any_mint_burn.rs +0 -114
  63. package/contracts/sac-manager/src/tests/supply_control/update_limit_config.rs +0 -257
  64. /package/contracts/{sac-manager → oapps/sac-manager}/Cargo.toml +0 -0
  65. /package/contracts/{sac-manager → oapps/sac-manager}/src/tests/sac_manager/set_admin.rs +0 -0
  66. /package/contracts/{sac-manager → oapps/sac-manager}/src/tests/sac_manager/set_authorized.rs +0 -0
@@ -1,122 +0,0 @@
1
- //! set_supply_controller_manager Integration Tests
2
-
3
- use super::test_helper::mock_set_supply_controller_manager_auth;
4
- use crate::extensions::supply_control::{SupplyControlError, SupplyCtrlManagerSet};
5
- use crate::tests::test_helper::TestSetup;
6
- use utils::testing_utils::assert_eq_event;
7
-
8
- // =========================================================================
9
- // set_supply_controller_manager Tests (add)
10
- // =========================================================================
11
-
12
- #[test]
13
- fn test_set_supply_controller_manager_add() {
14
- let setup = TestSetup::new().build();
15
- let new_manager = setup.generate_address();
16
-
17
- mock_set_supply_controller_manager_auth(&setup, &new_manager, true);
18
- setup.sac_manager_client.set_supply_controller_manager(&new_manager, &true);
19
-
20
- // Verify event
21
- let expected = SupplyCtrlManagerSet { manager: new_manager.clone(), active: true };
22
- assert_eq_event(&setup.env, &setup.sac_manager, expected);
23
-
24
- // Verify via view function
25
- assert!(setup.sac_manager_client.is_supply_controller_manager(&new_manager));
26
-
27
- // Verify manager list via view function
28
- let managers = setup.sac_manager_client.get_supply_controller_managers();
29
- assert_eq!(managers.len(), 2);
30
- assert!(managers.contains(&setup.sc_manager));
31
- assert!(managers.contains(&new_manager));
32
-
33
- // Verify non-manager is not in the manager list
34
- let non_manager = setup.generate_address();
35
- assert!(!setup.sac_manager_client.is_supply_controller_manager(&non_manager));
36
- }
37
-
38
- #[test]
39
- fn test_set_supply_controller_manager_add_fails_if_already_exists() {
40
- let setup = TestSetup::new().build();
41
-
42
- // sc_manager was already added during TestSetup::build()
43
- mock_set_supply_controller_manager_auth(&setup, &setup.sc_manager, true);
44
- let result = setup.sac_manager_client.try_set_supply_controller_manager(&setup.sc_manager, &true);
45
- assert_eq!(result.err().unwrap().unwrap(), SupplyControlError::AlreadyExists.into());
46
- }
47
-
48
- // =========================================================================
49
- // set_supply_controller_manager Tests (remove)
50
- // =========================================================================
51
-
52
- #[test]
53
- fn test_set_supply_controller_manager_remove() {
54
- let setup = TestSetup::new().build();
55
-
56
- // Verify sc_manager exists before removal
57
- assert!(setup.sac_manager_client.is_supply_controller_manager(&setup.sc_manager));
58
-
59
- mock_set_supply_controller_manager_auth(&setup, &setup.sc_manager, false);
60
- setup.sac_manager_client.set_supply_controller_manager(&setup.sc_manager, &false);
61
-
62
- // Verify event
63
- let expected = SupplyCtrlManagerSet { manager: setup.sc_manager.clone(), active: false };
64
- assert_eq_event(&setup.env, &setup.sac_manager, expected);
65
-
66
- // Verify via view function
67
- assert!(!setup.sac_manager_client.is_supply_controller_manager(&setup.sc_manager));
68
- }
69
-
70
- #[test]
71
- fn test_set_supply_controller_manager_remove_fails_if_not_found() {
72
- let setup = TestSetup::new().build();
73
- let non_manager = setup.generate_address();
74
-
75
- mock_set_supply_controller_manager_auth(&setup, &non_manager, false);
76
- let result = setup.sac_manager_client.try_set_supply_controller_manager(&non_manager, &false);
77
- assert_eq!(result.err().unwrap().unwrap(), SupplyControlError::NotFound.into());
78
- }
79
-
80
- #[test]
81
- fn test_get_supply_controller_managers_after_remove() {
82
- let setup = TestSetup::new().build();
83
-
84
- // Add a second manager
85
- let new_manager = setup.generate_address();
86
- mock_set_supply_controller_manager_auth(&setup, &new_manager, true);
87
- setup.sac_manager_client.set_supply_controller_manager(&new_manager, &true);
88
-
89
- assert_eq!(setup.sac_manager_client.get_supply_controller_managers().len(), 2);
90
-
91
- // Remove original manager
92
- mock_set_supply_controller_manager_auth(&setup, &setup.sc_manager, false);
93
- setup.sac_manager_client.set_supply_controller_manager(&setup.sc_manager, &false);
94
-
95
- let managers: soroban_sdk::Vec<soroban_sdk::Address> = setup.sac_manager_client.get_supply_controller_managers();
96
- assert_eq!(managers.len(), 1);
97
- assert!(!managers.contains(&setup.sc_manager));
98
- assert!(managers.contains(&new_manager));
99
- }
100
-
101
- // =========================================================================
102
- // Auth Tests (owner-only operations)
103
- // =========================================================================
104
-
105
- #[test]
106
- #[should_panic(expected = "Error(Auth, InvalidAction)")]
107
- fn test_set_supply_controller_manager_without_auth() {
108
- let setup = TestSetup::new().without_oft().build();
109
- let new_manager = setup.generate_address();
110
-
111
- // No owner auth mocked — should panic
112
- setup.sac_manager_client.set_supply_controller_manager(&new_manager, &true);
113
- }
114
-
115
- #[test]
116
- #[should_panic(expected = "Error(Auth, InvalidAction)")]
117
- fn test_set_supply_controller_manager_remove_without_auth() {
118
- let setup = TestSetup::new().build();
119
-
120
- // No auth mocked for this call — should panic
121
- setup.sac_manager_client.set_supply_controller_manager(&setup.sc_manager, &false);
122
- }
@@ -1,38 +0,0 @@
1
- use crate::extensions::supply_control::LimitConfig;
2
- use crate::tests::test_helper::{mock_auth, TestSetup};
3
- use soroban_sdk::Address;
4
-
5
- pub use crate::tests::test_helper::{mock_oft_mint_auth, mock_set_supply_controller_auth};
6
-
7
- pub fn mock_update_limit_config_auth(setup: &TestSetup, sender: &Address, controller: &Address, limit: &LimitConfig) {
8
- mock_auth(&setup.env, &setup.sac_manager, sender, "update_limit_config", (sender, controller, limit.clone()));
9
- }
10
-
11
- pub fn mock_update_allow_any_mint_burn_auth(
12
- setup: &TestSetup,
13
- sender: &Address,
14
- controller: &Address,
15
- allow_any_mint_burn: bool,
16
- ) {
17
- mock_auth(
18
- &setup.env,
19
- &setup.sac_manager,
20
- sender,
21
- "update_allow_any_mint_burn",
22
- (sender, controller, allow_any_mint_burn),
23
- );
24
- }
25
-
26
- pub fn mock_set_mint_whitelist_auth(
27
- setup: &TestSetup,
28
- sender: &Address,
29
- controller: &Address,
30
- mint_addr: &Address,
31
- active: bool,
32
- ) {
33
- mock_auth(&setup.env, &setup.sac_manager, sender, "set_mint_whitelist", (sender, controller, mint_addr, active));
34
- }
35
-
36
- pub fn mock_set_supply_controller_manager_auth(setup: &TestSetup, manager: &Address, active: bool) {
37
- mock_auth(&setup.env, &setup.sac_manager, &setup.owner, "set_supply_controller_manager", (manager, active));
38
- }
@@ -1,114 +0,0 @@
1
- //! update_allow_any_mint_burn Integration Tests
2
-
3
- use super::test_helper::{mock_set_mint_whitelist_auth, mock_set_supply_controller_auth, mock_update_allow_any_mint_burn_auth};
4
- use crate::extensions::supply_control::SupplyControlClient;
5
- use crate::extensions::supply_control::{
6
- AllowAnyMintBurnUpdated, LimitConfig, SupplyControlError, SupplyControllerConfig,
7
- };
8
- use crate::tests::test_helper::TestSetup;
9
- use soroban_sdk::Vec;
10
- use utils::testing_utils::assert_eq_event;
11
-
12
- #[test]
13
- fn test_update_allow_any_mint_burn() {
14
- let setup = TestSetup::new().build();
15
- let controller = setup.generate_address();
16
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
17
-
18
- let config = SupplyControllerConfig {
19
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 10 },
20
- allow_any_mint_burn: true,
21
- whitelist_addresses: Vec::new(&setup.env),
22
- };
23
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
24
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
25
-
26
- mock_update_allow_any_mint_burn_auth(&setup, &setup.sc_manager, &controller, false);
27
- sc_client.update_allow_any_mint_burn(&setup.sc_manager, &controller, &false);
28
-
29
- // Verify event
30
- let expected = AllowAnyMintBurnUpdated { supply_controller: controller.clone(), new_allow: false, old_allow: true };
31
- assert_eq_event(&setup.env, &setup.sac_manager, expected);
32
-
33
- // Verify config was updated
34
- let stored = sc_client.get_supply_controller_config(&controller).unwrap();
35
- assert!(!stored.allow_any_mint_burn);
36
- }
37
-
38
- #[test]
39
- fn test_update_allow_any_mint_burn_by_non_manager_fails() {
40
- let setup = TestSetup::new().build();
41
- let non_manager = setup.generate_address();
42
- let controller = setup.generate_address();
43
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
44
-
45
- let config = SupplyControllerConfig {
46
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 10 },
47
- allow_any_mint_burn: true,
48
- whitelist_addresses: Vec::new(&setup.env),
49
- };
50
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
51
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config));
52
-
53
- mock_update_allow_any_mint_burn_auth(&setup, &non_manager, &controller, false);
54
- let result = sc_client.try_update_allow_any_mint_burn(&non_manager, &controller, &false);
55
- assert_eq!(result.err().unwrap().unwrap(), SupplyControlError::Unauthorized.into());
56
- }
57
-
58
- #[test]
59
- fn test_update_allow_any_mint_burn_fails_if_not_supply_controller() {
60
- let setup = TestSetup::new().build();
61
- let non_controller = setup.generate_address();
62
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
63
-
64
- mock_update_allow_any_mint_burn_auth(&setup, &setup.sc_manager, &non_controller, false);
65
- let result = sc_client.try_update_allow_any_mint_burn(&setup.sc_manager, &non_controller, &false);
66
- assert_eq!(result.err().unwrap().unwrap(), SupplyControlError::NotFound.into());
67
- }
68
-
69
- #[test]
70
- fn test_update_allow_any_mint_burn_preserves_limit_and_whitelist() {
71
- let setup = TestSetup::new().build();
72
- let controller = setup.generate_address();
73
- let whitelisted = setup.generate_address();
74
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
75
-
76
- let config = SupplyControllerConfig {
77
- limit_config: LimitConfig { limit_capacity: 2_000, refill_per_second: 20 },
78
- allow_any_mint_burn: false,
79
- whitelist_addresses: Vec::new(&setup.env),
80
- };
81
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
82
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
83
-
84
- // Add whitelisted address before updating allow_any_mint_burn
85
- mock_set_mint_whitelist_auth(&setup, &setup.sc_manager, &controller, &whitelisted, true);
86
- sc_client.set_mint_whitelist(&setup.sc_manager, &controller, &whitelisted, &true);
87
-
88
- mock_update_allow_any_mint_burn_auth(&setup, &setup.sc_manager, &controller, true);
89
- sc_client.update_allow_any_mint_burn(&setup.sc_manager, &controller, &true);
90
-
91
- let stored = sc_client.get_supply_controller_config(&controller).unwrap();
92
- assert!(stored.allow_any_mint_burn);
93
- assert_eq!(stored.limit_config, config.limit_config);
94
- assert!(sc_client.is_address_whitelisted(&controller, &whitelisted));
95
- }
96
-
97
- #[test]
98
- #[should_panic(expected = "Error(Auth, InvalidAction)")]
99
- fn test_update_allow_any_mint_burn_without_auth() {
100
- let setup = TestSetup::new().build();
101
- let controller = setup.generate_address();
102
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
103
-
104
- let config = SupplyControllerConfig {
105
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 10 },
106
- allow_any_mint_burn: true,
107
- whitelist_addresses: Vec::new(&setup.env),
108
- };
109
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
110
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
111
-
112
- // sc_manager's auth is not mocked — sender.require_auth() fails
113
- sc_client.update_allow_any_mint_burn(&setup.sc_manager, &controller, &false);
114
- }
@@ -1,257 +0,0 @@
1
- //! update_limit_config Integration Tests
2
-
3
- use super::test_helper::{
4
- mock_oft_mint_auth, mock_set_mint_whitelist_auth, mock_set_supply_controller_auth, mock_update_limit_config_auth,
5
- };
6
- use crate::extensions::supply_control::SupplyControlClient;
7
- use crate::extensions::supply_control::{LimitConfig, LimitConfigUpdated, SupplyControlError, SupplyControllerConfig};
8
- use crate::tests::test_helper::TestSetup;
9
- use soroban_sdk::Vec;
10
- use utils::testing_utils::assert_eq_event;
11
-
12
- #[test]
13
- fn test_update_limit_config() {
14
- let setup = TestSetup::new().build();
15
- let controller = setup.generate_address();
16
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
17
-
18
- let config = SupplyControllerConfig {
19
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 10 },
20
- allow_any_mint_burn: true,
21
- whitelist_addresses: Vec::new(&setup.env),
22
- };
23
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
24
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
25
-
26
- let new_limit = LimitConfig { limit_capacity: 5_000, refill_per_second: 50 };
27
- mock_update_limit_config_auth(&setup, &setup.sc_manager, &controller, &new_limit);
28
- sc_client.update_limit_config(&setup.sc_manager, &controller, &new_limit);
29
-
30
- // Verify event
31
- let expected = LimitConfigUpdated {
32
- supply_controller: controller.clone(),
33
- new_limit_config: new_limit.clone(),
34
- old_limit_config: config.limit_config,
35
- };
36
- assert_eq_event(&setup.env, &setup.sac_manager, expected);
37
-
38
- // Verify config was updated
39
- let stored = sc_client.get_supply_controller_config(&controller).unwrap();
40
- assert_eq!(stored.limit_config.limit_capacity, 5_000);
41
- assert_eq!(stored.limit_config.refill_per_second, 50);
42
- }
43
-
44
- #[test]
45
- fn test_update_limit_config_preserves_rate_limit_state() {
46
- let setup = TestSetup::new().with_manager_as_sac_admin().with_supply_control_enabled().build();
47
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
48
-
49
- let config = SupplyControllerConfig {
50
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 1 },
51
- allow_any_mint_burn: true,
52
- whitelist_addresses: Vec::new(&setup.env),
53
- };
54
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &setup.oft, &Some(config.clone()));
55
- sc_client.set_supply_controller(&setup.sc_manager, &setup.oft, &Some(config.clone()));
56
-
57
- // Mint some tokens to consume rate limit
58
- let recipient = setup.generate_address();
59
- mock_oft_mint_auth(&setup, &recipient, 400_i128);
60
- setup.sac_manager_client.mint(&recipient, &400);
61
- assert_eq!(sc_client.get_remaining_mint_amount(&setup.oft), 600);
62
-
63
- // Update limit config (should NOT reset remaining amount)
64
- let new_limit = LimitConfig { limit_capacity: 2_000, refill_per_second: 1 };
65
- mock_update_limit_config_auth(&setup, &setup.sc_manager, &setup.oft, &new_limit);
66
- sc_client.update_limit_config(&setup.sc_manager, &setup.oft, &new_limit);
67
-
68
- // Remaining amount should still be 600 (not reset to 2000)
69
- assert_eq!(sc_client.get_remaining_mint_amount(&setup.oft), 600);
70
- }
71
-
72
- #[test]
73
- fn test_update_limit_config_fails_with_invalid_config() {
74
- let setup = TestSetup::new().build();
75
- let controller = setup.generate_address();
76
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
77
-
78
- let config = SupplyControllerConfig {
79
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 10 },
80
- allow_any_mint_burn: true,
81
- whitelist_addresses: Vec::new(&setup.env),
82
- };
83
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
84
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
85
-
86
- let invalid_limit = LimitConfig { limit_capacity: -100, refill_per_second: 10 };
87
- mock_update_limit_config_auth(&setup, &setup.sc_manager, &controller, &invalid_limit);
88
- let result = sc_client.try_update_limit_config(&setup.sc_manager, &controller, &invalid_limit);
89
- assert_eq!(result.err().unwrap().unwrap(), SupplyControlError::InvalidConfig.into());
90
-
91
- // Verify config remains unchanged after failed update.
92
- let stored = sc_client.get_supply_controller_config(&controller).unwrap();
93
- assert_eq!(stored.limit_config, config.limit_config);
94
- }
95
-
96
- #[test]
97
- fn test_update_limit_config_fails_with_negative_refill_per_second() {
98
- let setup = TestSetup::new().build();
99
- let controller = setup.generate_address();
100
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
101
-
102
- let config = SupplyControllerConfig {
103
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 10 },
104
- allow_any_mint_burn: true,
105
- whitelist_addresses: Vec::new(&setup.env),
106
- };
107
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
108
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
109
-
110
- let invalid_limit = LimitConfig { limit_capacity: 1_000, refill_per_second: -1 };
111
- mock_update_limit_config_auth(&setup, &setup.sc_manager, &controller, &invalid_limit);
112
- let result = sc_client.try_update_limit_config(&setup.sc_manager, &controller, &invalid_limit);
113
- assert_eq!(result.err().unwrap().unwrap(), SupplyControlError::InvalidConfig.into());
114
-
115
- // Verify config remains unchanged after failed update.
116
- let stored = sc_client.get_supply_controller_config(&controller).unwrap();
117
- assert_eq!(stored.limit_config, config.limit_config);
118
- }
119
-
120
- #[test]
121
- fn test_update_limit_config_preserves_allow_any_and_whitelist() {
122
- let setup = TestSetup::new().build();
123
- let controller = setup.generate_address();
124
- let whitelisted = setup.generate_address();
125
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
126
-
127
- let config = SupplyControllerConfig {
128
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 10 },
129
- allow_any_mint_burn: false,
130
- whitelist_addresses: Vec::new(&setup.env),
131
- };
132
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
133
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
134
-
135
- // Add whitelisted address before updating limit config
136
- mock_set_mint_whitelist_auth(&setup, &setup.sc_manager, &controller, &whitelisted, true);
137
- sc_client.set_mint_whitelist(&setup.sc_manager, &controller, &whitelisted, &true);
138
-
139
- let new_limit = LimitConfig { limit_capacity: 3_000, refill_per_second: 30 };
140
- mock_update_limit_config_auth(&setup, &setup.sc_manager, &controller, &new_limit);
141
- sc_client.update_limit_config(&setup.sc_manager, &controller, &new_limit);
142
-
143
- let stored = sc_client.get_supply_controller_config(&controller).unwrap();
144
- assert_eq!(stored.limit_config, new_limit);
145
- assert_eq!(stored.allow_any_mint_burn, config.allow_any_mint_burn);
146
- assert!(sc_client.is_address_whitelisted(&controller, &whitelisted));
147
- }
148
-
149
- #[test]
150
- fn test_update_limit_config_switch_to_unlimited_and_back() {
151
- let setup = TestSetup::new().with_manager_as_sac_admin().with_supply_control_enabled().build();
152
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
153
-
154
- let config = SupplyControllerConfig {
155
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 1 },
156
- allow_any_mint_burn: true,
157
- whitelist_addresses: Vec::new(&setup.env),
158
- };
159
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &setup.oft, &Some(config.clone()));
160
- sc_client.set_supply_controller(&setup.sc_manager, &setup.oft, &Some(config));
161
-
162
- let recipient = setup.generate_address();
163
- mock_oft_mint_auth(&setup, &recipient, 400_i128);
164
- setup.sac_manager_client.mint(&recipient, &400);
165
- assert_eq!(sc_client.get_remaining_mint_amount(&setup.oft), 600);
166
-
167
- let unlimited = LimitConfig { limit_capacity: 1_000, refill_per_second: 0 };
168
- mock_update_limit_config_auth(&setup, &setup.sc_manager, &setup.oft, &unlimited);
169
- sc_client.update_limit_config(&setup.sc_manager, &setup.oft, &unlimited);
170
- assert_eq!(sc_client.get_remaining_mint_amount(&setup.oft), i128::MAX);
171
-
172
- let limited_again = LimitConfig { limit_capacity: 2_000, refill_per_second: 1 };
173
- mock_update_limit_config_auth(&setup, &setup.sc_manager, &setup.oft, &limited_again);
174
- sc_client.update_limit_config(&setup.sc_manager, &setup.oft, &limited_again);
175
- assert_eq!(sc_client.get_remaining_mint_amount(&setup.oft), 600);
176
- }
177
-
178
- #[test]
179
- fn test_update_limit_config_event_tracks_previous_value_across_updates() {
180
- let setup = TestSetup::new().build();
181
- let controller = setup.generate_address();
182
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
183
-
184
- let initial = LimitConfig { limit_capacity: 1_000, refill_per_second: 10 };
185
- let config = SupplyControllerConfig {
186
- limit_config: initial.clone(),
187
- allow_any_mint_burn: true,
188
- whitelist_addresses: Vec::new(&setup.env),
189
- };
190
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
191
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config));
192
-
193
- let first = LimitConfig { limit_capacity: 2_000, refill_per_second: 20 };
194
- mock_update_limit_config_auth(&setup, &setup.sc_manager, &controller, &first);
195
- sc_client.update_limit_config(&setup.sc_manager, &controller, &first);
196
-
197
- let second = LimitConfig { limit_capacity: 3_000, refill_per_second: 30 };
198
- mock_update_limit_config_auth(&setup, &setup.sc_manager, &controller, &second);
199
- sc_client.update_limit_config(&setup.sc_manager, &controller, &second);
200
-
201
- let expected =
202
- LimitConfigUpdated { supply_controller: controller, new_limit_config: second, old_limit_config: first };
203
- assert_eq_event(&setup.env, &setup.sac_manager, expected);
204
- }
205
-
206
- #[test]
207
- fn test_update_limit_config_fails_if_not_supply_controller() {
208
- let setup = TestSetup::new().build();
209
- let non_controller = setup.generate_address();
210
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
211
-
212
- let limit = LimitConfig { limit_capacity: 1_000, refill_per_second: 10 };
213
- mock_update_limit_config_auth(&setup, &setup.sc_manager, &non_controller, &limit);
214
- let result = sc_client.try_update_limit_config(&setup.sc_manager, &non_controller, &limit);
215
- assert_eq!(result.err().unwrap().unwrap(), SupplyControlError::NotFound.into());
216
- }
217
-
218
- #[test]
219
- fn test_update_limit_config_by_non_manager_fails() {
220
- let setup = TestSetup::new().build();
221
- let non_manager = setup.generate_address();
222
- let controller = setup.generate_address();
223
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
224
-
225
- let config = SupplyControllerConfig {
226
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 10 },
227
- allow_any_mint_burn: true,
228
- whitelist_addresses: Vec::new(&setup.env),
229
- };
230
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
231
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
232
-
233
- let new_limit = LimitConfig { limit_capacity: 5_000, refill_per_second: 50 };
234
- mock_update_limit_config_auth(&setup, &non_manager, &controller, &new_limit);
235
- let result = sc_client.try_update_limit_config(&non_manager, &controller, &new_limit);
236
- assert_eq!(result.err().unwrap().unwrap(), SupplyControlError::Unauthorized.into());
237
- }
238
-
239
- #[test]
240
- #[should_panic(expected = "Error(Auth, InvalidAction)")]
241
- fn test_update_limit_config_without_auth() {
242
- let setup = TestSetup::new().build();
243
- let controller = setup.generate_address();
244
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
245
-
246
- let config = SupplyControllerConfig {
247
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 10 },
248
- allow_any_mint_burn: true,
249
- whitelist_addresses: Vec::new(&setup.env),
250
- };
251
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
252
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
253
-
254
- // sc_manager's auth is not mocked — sender.require_auth() fails
255
- let new_limit = LimitConfig { limit_capacity: 5_000, refill_per_second: 50 };
256
- sc_client.update_limit_config(&setup.sc_manager, &controller, &new_limit);
257
- }