@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,8 +0,0 @@
1
- mod enumerable_set;
2
- mod refill;
3
- mod set_mint_whitelist;
4
- mod set_supply_controller;
5
- mod set_supply_controller_manager;
6
- mod test_helper;
7
- mod update_allow_any_mint_burn;
8
- mod update_limit_config;
@@ -1,90 +0,0 @@
1
- //! refill() Unit Tests
2
- //!
3
- //! Unit tests for the pure `refill` helper in the supply control extension.
4
- //! These tests do not require deploying the SacManager contract.
5
-
6
- use crate::extensions::supply_control::rate_limit::{test::refill_for_test, LimitConfig, RateLimitState};
7
- use crate::extensions::supply_control::SupplyControlError;
8
-
9
- #[test]
10
- fn test_refill_no_time_elapsed() {
11
- let limit_config = LimitConfig { limit_capacity: 1000, refill_per_second: 10 };
12
- let state = RateLimitState { remaining_amount: 500, last_refill_time: 100 };
13
-
14
- // No time elapsed
15
- let result = refill_for_test(&limit_config, &state, 100).unwrap();
16
- assert_eq!(result, 500);
17
- }
18
-
19
- #[test]
20
- fn test_refill_partial_refill() {
21
- let limit_config = LimitConfig { limit_capacity: 1000, refill_per_second: 10 };
22
- let state = RateLimitState { remaining_amount: 500, last_refill_time: 100 };
23
-
24
- // 10 seconds elapsed = 100 tokens refilled
25
- let result = refill_for_test(&limit_config, &state, 110).unwrap();
26
- assert_eq!(result, 600);
27
- }
28
-
29
- #[test]
30
- fn test_refill_capped_at_capacity() {
31
- let limit_config = LimitConfig { limit_capacity: 1000, refill_per_second: 10 };
32
- let state = RateLimitState { remaining_amount: 950, last_refill_time: 100 };
33
-
34
- // 100 seconds elapsed = 1000 tokens, but capped at capacity
35
- let result = refill_for_test(&limit_config, &state, 200).unwrap();
36
- assert_eq!(result, 1000);
37
- }
38
-
39
- #[test]
40
- fn test_refill_from_zero() {
41
- let limit_config = LimitConfig { limit_capacity: 1000, refill_per_second: 100 };
42
- let state = RateLimitState { remaining_amount: 0, last_refill_time: 0 };
43
-
44
- // 5 seconds elapsed = 500 tokens
45
- let result = refill_for_test(&limit_config, &state, 5).unwrap();
46
- assert_eq!(result, 500);
47
- }
48
-
49
- #[test]
50
- fn test_refill_with_zero_refill_rate() {
51
- // Note: In practice, refill_per_second=0 means unlimited (checked elsewhere)
52
- // but the refill function itself just does the math
53
- let limit_config = LimitConfig { limit_capacity: 1000, refill_per_second: 0 };
54
- let state = RateLimitState { remaining_amount: 500, last_refill_time: 100 };
55
-
56
- // Any time elapsed, but no refill since rate is 0
57
- let result = refill_for_test(&limit_config, &state, 200).unwrap();
58
- assert_eq!(result, 500);
59
- }
60
-
61
- #[test]
62
- fn test_refill_returns_capacity_on_overflow() {
63
- // On arithmetic overflow, returns limit_capacity (aligned with EVM RateLimiter)
64
- let limit_config = LimitConfig { limit_capacity: 5_000, refill_per_second: i128::MAX / 2 };
65
- let state = RateLimitState { remaining_amount: i128::MAX / 2, last_refill_time: 0 };
66
-
67
- // Multiplication overflows → returns limit_capacity
68
- let result = refill_for_test(&limit_config, &state, 1000).unwrap();
69
- assert_eq!(result, 5_000);
70
- }
71
-
72
- #[test]
73
- fn test_refill_returns_capacity_on_add_overflow() {
74
- // Addition overflows → returns limit_capacity
75
- let limit_config = LimitConfig { limit_capacity: 10_000, refill_per_second: 1 };
76
- let state = RateLimitState { remaining_amount: i128::MAX, last_refill_time: 0 };
77
-
78
- let result = refill_for_test(&limit_config, &state, 10).unwrap();
79
- assert_eq!(result, 10_000);
80
- }
81
-
82
- #[test]
83
- fn test_refill_errors_on_old_timestamp() {
84
- let limit_config = LimitConfig { limit_capacity: 1000, refill_per_second: 10 };
85
- let state = RateLimitState { remaining_amount: 500, last_refill_time: 200 };
86
-
87
- // timestamp (100) < last_refill_time (200) → should return Err
88
- let result = refill_for_test(&limit_config, &state, 100);
89
- assert_eq!(result.err().unwrap(), SupplyControlError::OldTimestamp.into());
90
- }
@@ -1,245 +0,0 @@
1
- //! set_mint_whitelist Integration Tests
2
-
3
- use super::test_helper::{mock_set_mint_whitelist_auth, mock_set_supply_controller_auth};
4
- use crate::extensions::supply_control::SupplyControlClient;
5
- use crate::extensions::supply_control::{LimitConfig, MintWhitelistSet, SupplyControlError, SupplyControllerConfig};
6
- use crate::tests::test_helper::TestSetup;
7
- use soroban_sdk::Vec;
8
- use utils::testing_utils::assert_eq_event;
9
-
10
- #[test]
11
- fn test_set_mint_whitelist_add() {
12
- let setup = TestSetup::new().build();
13
- let controller = setup.generate_address();
14
- let mint_addr = setup.generate_address();
15
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
16
-
17
- let config = SupplyControllerConfig {
18
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 0 },
19
- allow_any_mint_burn: false,
20
- whitelist_addresses: Vec::new(&setup.env),
21
- };
22
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
23
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
24
-
25
- mock_set_mint_whitelist_auth(&setup, &setup.sc_manager, &controller, &mint_addr, true);
26
- sc_client.set_mint_whitelist(&setup.sc_manager, &controller, &mint_addr, &true);
27
-
28
- // Verify event
29
- let expected =
30
- MintWhitelistSet { supply_controller: controller.clone(), mint_address: mint_addr.clone(), active: true };
31
- assert_eq_event(&setup.env, &setup.sac_manager, expected);
32
-
33
- // Verify whitelist updated
34
- assert!(sc_client.is_address_whitelisted(&controller, &mint_addr));
35
- }
36
-
37
- #[test]
38
- fn test_set_mint_whitelist_add_fails_if_duplicate() {
39
- let setup = TestSetup::new().build();
40
- let controller = setup.generate_address();
41
- let mint_addr = setup.generate_address();
42
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
43
-
44
- let config = SupplyControllerConfig {
45
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 0 },
46
- allow_any_mint_burn: false,
47
- whitelist_addresses: Vec::new(&setup.env),
48
- };
49
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
50
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
51
-
52
- // Pre-populate the whitelist with mint_addr
53
- mock_set_mint_whitelist_auth(&setup, &setup.sc_manager, &controller, &mint_addr, true);
54
- sc_client.set_mint_whitelist(&setup.sc_manager, &controller, &mint_addr, &true);
55
-
56
- // Attempt to add the same address again — should fail
57
- mock_set_mint_whitelist_auth(&setup, &setup.sc_manager, &controller, &mint_addr, true);
58
- let result = sc_client.try_set_mint_whitelist(&setup.sc_manager, &controller, &mint_addr, &true);
59
- assert_eq!(result.err().unwrap().unwrap(), SupplyControlError::AlreadyExists.into());
60
-
61
- // Verify whitelist remains unchanged after failed update.
62
- assert!(sc_client.is_address_whitelisted(&controller, &mint_addr));
63
- }
64
-
65
- #[test]
66
- fn test_set_mint_whitelist_add_by_non_manager_fails() {
67
- let setup = TestSetup::new().build();
68
- let non_manager = setup.generate_address();
69
- let controller = setup.generate_address();
70
- let mint_addr = setup.generate_address();
71
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
72
-
73
- let config = SupplyControllerConfig {
74
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 0 },
75
- allow_any_mint_burn: false,
76
- whitelist_addresses: Vec::new(&setup.env),
77
- };
78
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
79
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config));
80
-
81
- mock_set_mint_whitelist_auth(&setup, &non_manager, &controller, &mint_addr, true);
82
- let result = sc_client.try_set_mint_whitelist(&non_manager, &controller, &mint_addr, &true);
83
- assert_eq!(result.err().unwrap().unwrap(), SupplyControlError::Unauthorized.into());
84
- }
85
-
86
- #[test]
87
- #[should_panic(expected = "Error(Auth, InvalidAction)")]
88
- fn test_set_mint_whitelist_add_without_auth() {
89
- let setup = TestSetup::new().build();
90
- let controller = setup.generate_address();
91
- let mint_addr = setup.generate_address();
92
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
93
-
94
- let config = SupplyControllerConfig {
95
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 0 },
96
- allow_any_mint_burn: false,
97
- whitelist_addresses: Vec::new(&setup.env),
98
- };
99
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
100
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
101
-
102
- // sc_manager's auth is not mocked — sender.require_auth() fails
103
- sc_client.set_mint_whitelist(&setup.sc_manager, &controller, &mint_addr, &true);
104
- }
105
-
106
- #[test]
107
- fn test_set_mint_whitelist_remove() {
108
- let setup = TestSetup::new().build();
109
- let controller = setup.generate_address();
110
- let mint_addr = setup.generate_address();
111
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
112
-
113
- let config = SupplyControllerConfig {
114
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 0 },
115
- allow_any_mint_burn: false,
116
- whitelist_addresses: Vec::new(&setup.env),
117
- };
118
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
119
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
120
-
121
- // Pre-populate the whitelist with mint_addr
122
- mock_set_mint_whitelist_auth(&setup, &setup.sc_manager, &controller, &mint_addr, true);
123
- sc_client.set_mint_whitelist(&setup.sc_manager, &controller, &mint_addr, &true);
124
-
125
- // Now remove it
126
- mock_set_mint_whitelist_auth(&setup, &setup.sc_manager, &controller, &mint_addr, false);
127
- sc_client.set_mint_whitelist(&setup.sc_manager, &controller, &mint_addr, &false);
128
-
129
- // Verify event
130
- let expected =
131
- MintWhitelistSet { supply_controller: controller.clone(), mint_address: mint_addr.clone(), active: false };
132
- assert_eq_event(&setup.env, &setup.sac_manager, expected);
133
-
134
- // Verify whitelist updated
135
- assert!(!sc_client.is_address_whitelisted(&controller, &mint_addr));
136
- }
137
-
138
- #[test]
139
- fn test_set_mint_whitelist_remove_fails_if_not_in_whitelist() {
140
- let setup = TestSetup::new().build();
141
- let controller = setup.generate_address();
142
- let not_whitelisted = setup.generate_address();
143
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
144
-
145
- let config = SupplyControllerConfig {
146
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 0 },
147
- allow_any_mint_burn: false,
148
- whitelist_addresses: Vec::new(&setup.env),
149
- };
150
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
151
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
152
-
153
- mock_set_mint_whitelist_auth(&setup, &setup.sc_manager, &controller, &not_whitelisted, false);
154
- let result = sc_client.try_set_mint_whitelist(&setup.sc_manager, &controller, &not_whitelisted, &false);
155
- assert_eq!(result.err().unwrap().unwrap(), SupplyControlError::NotFound.into());
156
-
157
- // Verify whitelist remains unchanged after failed update.
158
- assert!(!sc_client.is_address_whitelisted(&controller, &not_whitelisted));
159
- }
160
-
161
- #[test]
162
- fn test_set_mint_whitelist_remove_by_non_manager_fails() {
163
- let setup = TestSetup::new().build();
164
- let non_manager = setup.generate_address();
165
- let controller = setup.generate_address();
166
- let mint_addr = setup.generate_address();
167
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
168
-
169
- let config = SupplyControllerConfig {
170
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 0 },
171
- allow_any_mint_burn: false,
172
- whitelist_addresses: Vec::new(&setup.env),
173
- };
174
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
175
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config));
176
-
177
- // Pre-populate the whitelist with mint_addr
178
- mock_set_mint_whitelist_auth(&setup, &setup.sc_manager, &controller, &mint_addr, true);
179
- sc_client.set_mint_whitelist(&setup.sc_manager, &controller, &mint_addr, &true);
180
-
181
- // Non-manager tries to remove — should fail
182
- mock_set_mint_whitelist_auth(&setup, &non_manager, &controller, &mint_addr, false);
183
- let result = sc_client.try_set_mint_whitelist(&non_manager, &controller, &mint_addr, &false);
184
- assert_eq!(result.err().unwrap().unwrap(), SupplyControlError::Unauthorized.into());
185
- }
186
-
187
- #[test]
188
- fn test_set_mint_whitelist_fails_if_supply_controller_not_found() {
189
- let setup = TestSetup::new().build();
190
- let non_controller = setup.generate_address();
191
- let mint_addr = setup.generate_address();
192
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
193
-
194
- mock_set_mint_whitelist_auth(&setup, &setup.sc_manager, &non_controller, &mint_addr, true);
195
- let result = sc_client.try_set_mint_whitelist(&setup.sc_manager, &non_controller, &mint_addr, &true);
196
- assert_eq!(result.err().unwrap().unwrap(), SupplyControlError::NotFound.into());
197
- }
198
-
199
- #[test]
200
- fn test_set_mint_whitelist_preserves_limit_and_allow_any() {
201
- let setup = TestSetup::new().build();
202
- let controller = setup.generate_address();
203
- let mint_addr = setup.generate_address();
204
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
205
-
206
- let config = SupplyControllerConfig {
207
- limit_config: LimitConfig { limit_capacity: 2_000, refill_per_second: 20 },
208
- allow_any_mint_burn: true,
209
- whitelist_addresses: Vec::new(&setup.env),
210
- };
211
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
212
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
213
-
214
- mock_set_mint_whitelist_auth(&setup, &setup.sc_manager, &controller, &mint_addr, true);
215
- sc_client.set_mint_whitelist(&setup.sc_manager, &controller, &mint_addr, &true);
216
-
217
- let stored = sc_client.get_supply_controller_config(&controller).unwrap();
218
- assert_eq!(stored.limit_config, config.limit_config);
219
- assert_eq!(stored.allow_any_mint_burn, config.allow_any_mint_burn);
220
- assert!(sc_client.is_address_whitelisted(&controller, &mint_addr));
221
- }
222
-
223
- #[test]
224
- #[should_panic(expected = "Error(Auth, InvalidAction)")]
225
- fn test_set_mint_whitelist_remove_without_auth() {
226
- let setup = TestSetup::new().build();
227
- let controller = setup.generate_address();
228
- let mint_addr = setup.generate_address();
229
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
230
-
231
- let config = SupplyControllerConfig {
232
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 0 },
233
- allow_any_mint_burn: false,
234
- whitelist_addresses: Vec::new(&setup.env),
235
- };
236
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
237
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
238
-
239
- // Pre-populate the whitelist with mint_addr
240
- mock_set_mint_whitelist_auth(&setup, &setup.sc_manager, &controller, &mint_addr, true);
241
- sc_client.set_mint_whitelist(&setup.sc_manager, &controller, &mint_addr, &true);
242
-
243
- // sc_manager's auth is not mocked — sender.require_auth() fails
244
- sc_client.set_mint_whitelist(&setup.sc_manager, &controller, &mint_addr, &false);
245
- }
@@ -1,267 +0,0 @@
1
- //! set_supply_controller Integration Tests
2
-
3
- use super::test_helper::mock_set_supply_controller_auth;
4
- use crate::extensions::supply_control::SupplyControlClient;
5
- use crate::extensions::supply_control::{
6
- LimitConfig, SupplyControlError, SupplyControllerAdded, SupplyControllerConfig, SupplyControllerRemoved,
7
- };
8
- use crate::tests::test_helper::TestSetup;
9
- use soroban_sdk::Vec;
10
- use utils::testing_utils::assert_eq_event;
11
-
12
- // =========================================================================
13
- // set_supply_controller Tests (add)
14
- // =========================================================================
15
-
16
- #[test]
17
- fn test_set_supply_controller() {
18
- let setup = TestSetup::new().with_manager_as_sac_admin().build();
19
- let controller = setup.generate_address();
20
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
21
-
22
- let config = SupplyControllerConfig {
23
- limit_config: LimitConfig { limit_capacity: 1_000_000, refill_per_second: 100 },
24
- allow_any_mint_burn: true,
25
- whitelist_addresses: Vec::new(&setup.env),
26
- };
27
-
28
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
29
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
30
-
31
- // Verify SupplyControllerAdded event
32
- let expected = SupplyControllerAdded { supply_controller: controller.clone(), config: config.clone() };
33
- assert_eq_event(&setup.env, &setup.sac_manager, expected);
34
-
35
- // Verify controller exists
36
- let stored_config = sc_client.get_supply_controller_config(&controller);
37
- assert!(stored_config.is_some());
38
- assert_eq!(stored_config.unwrap().limit_config.limit_capacity, 1_000_000);
39
- }
40
-
41
- #[test]
42
- fn test_set_supply_controller_fails_if_already_exists() {
43
- let setup = TestSetup::new().with_manager_as_sac_admin().build();
44
- let controller = setup.generate_address();
45
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
46
-
47
- let config = SupplyControllerConfig {
48
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 10 },
49
- allow_any_mint_burn: true,
50
- whitelist_addresses: Vec::new(&setup.env),
51
- };
52
-
53
- // Add supply controller first time - should succeed
54
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
55
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
56
-
57
- // Try to add the same supply controller again - should fail
58
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
59
- let result = sc_client.try_set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
60
- assert_eq!(result.err().unwrap().unwrap(), SupplyControlError::AlreadyExists.into());
61
- }
62
-
63
- #[test]
64
- fn test_set_supply_controller_fails_with_invalid_config() {
65
- let setup = TestSetup::new().with_manager_as_sac_admin().build();
66
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
67
-
68
- // Should fail due to negative capacity
69
- let controller1 = setup.generate_address();
70
- let invalid_config = SupplyControllerConfig {
71
- limit_config: LimitConfig { limit_capacity: -100, refill_per_second: 10 },
72
- allow_any_mint_burn: true,
73
- whitelist_addresses: Vec::new(&setup.env),
74
- };
75
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller1, &Some(invalid_config.clone()));
76
- let result = sc_client.try_set_supply_controller(&setup.sc_manager, &controller1, &Some(invalid_config.clone()));
77
- assert_eq!(result.err().unwrap().unwrap(), SupplyControlError::InvalidConfig.into());
78
-
79
- // Should fail due to negative refill rate
80
- let controller2 = setup.generate_address();
81
- let invalid_config = SupplyControllerConfig {
82
- limit_config: LimitConfig { limit_capacity: 1000, refill_per_second: -10 },
83
- allow_any_mint_burn: true,
84
- whitelist_addresses: Vec::new(&setup.env),
85
- };
86
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller2, &Some(invalid_config.clone()));
87
- let result = sc_client.try_set_supply_controller(&setup.sc_manager, &controller2, &Some(invalid_config.clone()));
88
- assert_eq!(result.err().unwrap().unwrap(), SupplyControlError::InvalidConfig.into());
89
- }
90
-
91
- #[test]
92
- fn test_set_supply_controller_by_non_manager_fails() {
93
- let setup = TestSetup::new().build();
94
- let non_manager = setup.generate_address();
95
- let controller = setup.generate_address();
96
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
97
-
98
- let config = SupplyControllerConfig {
99
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 10 },
100
- allow_any_mint_burn: true,
101
- whitelist_addresses: Vec::new(&setup.env),
102
- };
103
-
104
- // non_manager is NOT a supply controller manager — should fail
105
- mock_set_supply_controller_auth(&setup, &non_manager, &controller, &Some(config.clone()));
106
- let result = sc_client.try_set_supply_controller(&non_manager, &controller, &Some(config.clone()));
107
- assert_eq!(result.err().unwrap().unwrap(), SupplyControlError::Unauthorized.into());
108
- }
109
-
110
- #[test]
111
- #[should_panic(expected = "Error(Auth, InvalidAction)")]
112
- fn test_set_supply_controller_without_auth() {
113
- let setup = TestSetup::new().with_manager_as_sac_admin().build();
114
- let controller = setup.generate_address();
115
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
116
-
117
- let config = SupplyControllerConfig {
118
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 10 },
119
- allow_any_mint_burn: true,
120
- whitelist_addresses: Vec::new(&setup.env),
121
- };
122
-
123
- // sc_manager's auth is not mocked — sender.require_auth() fails
124
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
125
- }
126
-
127
- // =========================================================================
128
- // set_supply_controller Tests (remove)
129
- // =========================================================================
130
-
131
- #[test]
132
- fn test_set_supply_controller_remove() {
133
- let setup = TestSetup::new().build();
134
- let controller = setup.generate_address();
135
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
136
-
137
- let config = SupplyControllerConfig {
138
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 10 },
139
- allow_any_mint_burn: true,
140
- whitelist_addresses: Vec::new(&setup.env),
141
- };
142
-
143
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
144
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
145
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &None);
146
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &None);
147
-
148
- // Verify SupplyControllerRemoved event
149
- let expected = SupplyControllerRemoved { supply_controller: controller.clone() };
150
- assert_eq_event(&setup.env, &setup.sac_manager, expected);
151
-
152
- // Verify controller config is removed
153
- assert!(sc_client.get_supply_controller_config(&controller).is_none());
154
- }
155
-
156
- #[test]
157
- fn test_set_supply_controller_remove_fails_if_not_exists() {
158
- let setup = TestSetup::new().build();
159
- let non_controller = setup.generate_address();
160
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
161
-
162
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &non_controller, &None);
163
- let result = sc_client.try_set_supply_controller(&setup.sc_manager, &non_controller, &None);
164
- assert_eq!(result.err().unwrap().unwrap(), SupplyControlError::NotFound.into());
165
- }
166
-
167
- #[test]
168
- fn test_get_supply_controllers() {
169
- let setup = TestSetup::new().with_manager_as_sac_admin().build();
170
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
171
-
172
- // Initially no supply controllers
173
- let controllers = sc_client.get_supply_controllers();
174
- assert_eq!(controllers.len(), 0);
175
-
176
- let controller1 = setup.generate_address();
177
- let controller2 = setup.generate_address();
178
-
179
- let config = SupplyControllerConfig {
180
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 10 },
181
- allow_any_mint_burn: true,
182
- whitelist_addresses: Vec::new(&setup.env),
183
- };
184
-
185
- // Add two supply controllers
186
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller1, &Some(config.clone()));
187
- sc_client.set_supply_controller(&setup.sc_manager, &controller1, &Some(config.clone()));
188
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller2, &Some(config.clone()));
189
- sc_client.set_supply_controller(&setup.sc_manager, &controller2, &Some(config.clone()));
190
-
191
- // Should return both controllers
192
- let controllers = sc_client.get_supply_controllers();
193
- assert_eq!(controllers.len(), 2);
194
- assert!(controllers.contains(&controller1));
195
- assert!(controllers.contains(&controller2));
196
- }
197
-
198
- #[test]
199
- fn test_get_supply_controllers_after_remove() {
200
- let setup = TestSetup::new().build();
201
- let controller1 = setup.generate_address();
202
- let controller2 = setup.generate_address();
203
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
204
-
205
- let config = SupplyControllerConfig {
206
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 10 },
207
- allow_any_mint_burn: true,
208
- whitelist_addresses: Vec::new(&setup.env),
209
- };
210
-
211
- // Add two supply controllers
212
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller1, &Some(config.clone()));
213
- sc_client.set_supply_controller(&setup.sc_manager, &controller1, &Some(config.clone()));
214
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller2, &Some(config.clone()));
215
- sc_client.set_supply_controller(&setup.sc_manager, &controller2, &Some(config.clone()));
216
-
217
- // Remove one
218
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller1, &None);
219
- sc_client.set_supply_controller(&setup.sc_manager, &controller1, &None);
220
-
221
- // Should return only one controller
222
- let controllers = sc_client.get_supply_controllers();
223
- assert_eq!(controllers.len(), 1);
224
- assert!(!controllers.contains(&controller1));
225
- assert!(controllers.contains(&controller2));
226
- }
227
-
228
- #[test]
229
- fn test_set_supply_controller_remove_by_non_manager_fails() {
230
- let setup = TestSetup::new().build();
231
- let non_manager = setup.generate_address();
232
- let controller = setup.generate_address();
233
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
234
-
235
- let config = SupplyControllerConfig {
236
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 10 },
237
- allow_any_mint_burn: true,
238
- whitelist_addresses: Vec::new(&setup.env),
239
- };
240
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
241
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
242
-
243
- // non_manager tries to remove — should fail
244
- mock_set_supply_controller_auth(&setup, &non_manager, &controller, &None);
245
- let result = sc_client.try_set_supply_controller(&non_manager, &controller, &None);
246
- assert_eq!(result.err().unwrap().unwrap(), SupplyControlError::Unauthorized.into());
247
- }
248
-
249
- #[test]
250
- #[should_panic(expected = "Error(Auth, InvalidAction)")]
251
- fn test_set_supply_controller_remove_without_auth() {
252
- let setup = TestSetup::new().build();
253
- let controller = setup.generate_address();
254
- let sc_client = SupplyControlClient::new(&setup.env, &setup.sac_manager);
255
-
256
- let config = SupplyControllerConfig {
257
- limit_config: LimitConfig { limit_capacity: 1_000, refill_per_second: 10 },
258
- allow_any_mint_burn: true,
259
- whitelist_addresses: Vec::new(&setup.env),
260
- };
261
-
262
- mock_set_supply_controller_auth(&setup, &setup.sc_manager, &controller, &Some(config.clone()));
263
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &Some(config.clone()));
264
-
265
- // sc_manager's auth is not mocked for the remove call — should panic
266
- sc_client.set_supply_controller(&setup.sc_manager, &controller, &None);
267
- }