@layerzerolabs/protocol-stellar-v2 0.2.33 → 0.2.35

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 (123) hide show
  1. package/.turbo/turbo-build.log +351 -367
  2. package/.turbo/turbo-lint.log +220 -223
  3. package/.turbo/turbo-test.log +1993 -1796
  4. package/Cargo.lock +10 -10
  5. package/Cargo.toml +1 -1
  6. package/contracts/common-macros/src/storage.rs +7 -5
  7. package/contracts/common-macros/src/tests/storage/snapshots/common_macros__tests__storage__generate_storage__snapshot_generated_storage_code.snap +3 -3
  8. package/contracts/endpoint-v2/src/endpoint_v2.rs +5 -4
  9. package/contracts/endpoint-v2/src/interfaces/messaging_channel.rs +7 -8
  10. package/contracts/endpoint-v2/src/messaging_channel.rs +78 -45
  11. package/contracts/endpoint-v2/src/storage.rs +8 -3
  12. package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +2 -2
  13. package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +12 -15
  14. package/contracts/endpoint-v2/src/tests/endpoint_v2/verifiable.rs +46 -9
  15. package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +7 -23
  16. package/contracts/endpoint-v2/src/tests/messaging_channel/clear_payload.rs +23 -20
  17. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound.rs +94 -1
  18. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_nonce.rs +17 -15
  19. package/contracts/endpoint-v2/src/tests/messaging_channel/mod.rs +1 -1
  20. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +48 -13
  21. package/contracts/endpoint-v2/src/tests/messaging_channel/pending_inbound_nonces.rs +111 -0
  22. package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +15 -25
  23. package/contracts/layerzero-views/src/layerzero_view.rs +2 -2
  24. package/contracts/layerzero-views/src/tests/layerzero_view_tests.rs +3 -4
  25. package/contracts/layerzero-views/src/tests/setup.rs +0 -21
  26. package/contracts/message-libs/blocked-message-lib/src/lib.rs +4 -4
  27. package/contracts/message-libs/uln-302/src/send_uln.rs +5 -5
  28. package/contracts/oapps/counter/src/counter.rs +6 -0
  29. package/contracts/oapps/oapp/src/oapp_sender.rs +3 -2
  30. package/contracts/oapps/oft/integration-tests/extensions/test_oft_fee.rs +5 -11
  31. package/contracts/oapps/oft/integration-tests/extensions/test_pausable.rs +7 -14
  32. package/contracts/oapps/oft/integration-tests/extensions/test_rate_limiter.rs +11 -22
  33. package/contracts/oapps/oft/integration-tests/setup.rs +59 -7
  34. package/contracts/oapps/oft/integration-tests/utils.rs +28 -2
  35. package/contracts/oapps/oft/src/extensions/oft_fee.rs +5 -0
  36. package/contracts/oapps/oft/src/interfaces/mintable.rs +14 -0
  37. package/contracts/oapps/oft/src/interfaces/mod.rs +2 -2
  38. package/contracts/oapps/oft/src/oft.rs +8 -7
  39. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +8 -8
  40. package/contracts/oapps/oft/src/oft_types/mod.rs +3 -4
  41. package/contracts/oapps/oft/src/tests/extensions/rate_limiter.rs +7 -5
  42. package/contracts/oapps/sac-manager/src/errors.rs +14 -0
  43. package/contracts/{sac-manager → oapps/sac-manager}/src/lib.rs +0 -4
  44. package/contracts/oapps/sac-manager/src/sac_manager.rs +115 -0
  45. package/contracts/oapps/sac-manager/src/storage.rs +20 -0
  46. package/contracts/{sac-manager → oapps/sac-manager}/src/tests/mod.rs +0 -4
  47. package/contracts/oapps/sac-manager/src/tests/sac_manager/clawback.rs +86 -0
  48. package/contracts/oapps/sac-manager/src/tests/sac_manager/mint.rs +58 -0
  49. package/contracts/{sac-manager → oapps/sac-manager}/src/tests/sac_manager/mod.rs +1 -3
  50. package/contracts/oapps/sac-manager/src/tests/sac_manager/set_minter.rs +69 -0
  51. package/contracts/oapps/sac-manager/src/tests/sac_manager/test_helper.rs +18 -0
  52. package/contracts/oapps/sac-manager/src/tests/sac_manager/view_functions.rs +28 -0
  53. package/contracts/{sac-manager → oapps/sac-manager}/src/tests/test_helper.rs +16 -59
  54. package/docs/layerzero-v2-on-stellar.md +46 -2
  55. package/package.json +8 -3
  56. package/sdk/.turbo/turbo-test.log +424 -429
  57. package/sdk/dist/generated/bml.d.ts +3 -3
  58. package/sdk/dist/generated/bml.js +3 -3
  59. package/sdk/dist/generated/counter.d.ts +32 -3
  60. package/sdk/dist/generated/counter.js +6 -3
  61. package/sdk/dist/generated/dvn.d.ts +3 -3
  62. package/sdk/dist/generated/dvn.js +3 -3
  63. package/sdk/dist/generated/dvn_fee_lib.d.ts +2 -2
  64. package/sdk/dist/generated/dvn_fee_lib.js +2 -2
  65. package/sdk/dist/generated/endpoint.d.ts +12 -13
  66. package/sdk/dist/generated/endpoint.js +7 -7
  67. package/sdk/dist/generated/executor.d.ts +3 -3
  68. package/sdk/dist/generated/executor.js +3 -3
  69. package/sdk/dist/generated/executor_fee_lib.d.ts +2 -2
  70. package/sdk/dist/generated/executor_fee_lib.js +2 -2
  71. package/sdk/dist/generated/executor_helper.d.ts +2 -2
  72. package/sdk/dist/generated/executor_helper.js +2 -2
  73. package/sdk/dist/generated/layerzero_view.d.ts +3 -3
  74. package/sdk/dist/generated/layerzero_view.js +3 -3
  75. package/sdk/dist/generated/oft.d.ts +32 -3
  76. package/sdk/dist/generated/oft.js +7 -4
  77. package/sdk/dist/generated/price_feed.d.ts +3 -3
  78. package/sdk/dist/generated/price_feed.js +3 -3
  79. package/sdk/dist/generated/sac_manager.d.ts +47 -318
  80. package/sdk/dist/generated/sac_manager.js +24 -129
  81. package/sdk/dist/generated/sml.d.ts +2 -2
  82. package/sdk/dist/generated/sml.js +2 -2
  83. package/sdk/dist/generated/treasury.d.ts +2 -2
  84. package/sdk/dist/generated/treasury.js +2 -2
  85. package/sdk/dist/generated/uln302.d.ts +3 -3
  86. package/sdk/dist/generated/uln302.js +3 -3
  87. package/sdk/dist/generated/upgrader.d.ts +2 -2
  88. package/sdk/dist/generated/upgrader.js +2 -2
  89. package/sdk/package.json +6 -1
  90. package/sdk/test/oft-sml.test.ts +72 -36
  91. package/sdk/test/sac-manager-redistribution.test.ts +38 -182
  92. package/contracts/endpoint-v2/src/tests/messaging_channel/lazy_inbound_nonce.rs +0 -39
  93. package/contracts/oapps/oft/src/interfaces/mint_burnable.rs +0 -18
  94. package/contracts/sac-manager/src/errors.rs +0 -18
  95. package/contracts/sac-manager/src/extensions/mod.rs +0 -6
  96. package/contracts/sac-manager/src/extensions/redistribution.rs +0 -109
  97. package/contracts/sac-manager/src/extensions/supply_control/mod.rs +0 -488
  98. package/contracts/sac-manager/src/extensions/supply_control/rate_limit.rs +0 -126
  99. package/contracts/sac-manager/src/interfaces/mod.rs +0 -3
  100. package/contracts/sac-manager/src/interfaces/sac_manager.rs +0 -52
  101. package/contracts/sac-manager/src/sac_manager.rs +0 -193
  102. package/contracts/sac-manager/src/storage.rs +0 -20
  103. package/contracts/sac-manager/src/tests/redistribution/mod.rs +0 -1
  104. package/contracts/sac-manager/src/tests/redistribution/redistribute_funds.rs +0 -82
  105. package/contracts/sac-manager/src/tests/sac_manager/admin_mint.rs +0 -206
  106. package/contracts/sac-manager/src/tests/sac_manager/burn.rs +0 -215
  107. package/contracts/sac-manager/src/tests/sac_manager/clawback.rs +0 -209
  108. package/contracts/sac-manager/src/tests/sac_manager/mint.rs +0 -252
  109. package/contracts/sac-manager/src/tests/sac_manager/set_oft_address.rs +0 -47
  110. package/contracts/sac-manager/src/tests/sac_manager/test_helper.rs +0 -75
  111. package/contracts/sac-manager/src/tests/sac_manager/view_functions.rs +0 -60
  112. package/contracts/sac-manager/src/tests/supply_control/enumerable_set.rs +0 -256
  113. package/contracts/sac-manager/src/tests/supply_control/mod.rs +0 -8
  114. package/contracts/sac-manager/src/tests/supply_control/refill.rs +0 -90
  115. package/contracts/sac-manager/src/tests/supply_control/set_mint_whitelist.rs +0 -245
  116. package/contracts/sac-manager/src/tests/supply_control/set_supply_controller.rs +0 -267
  117. package/contracts/sac-manager/src/tests/supply_control/set_supply_controller_manager.rs +0 -122
  118. package/contracts/sac-manager/src/tests/supply_control/test_helper.rs +0 -38
  119. package/contracts/sac-manager/src/tests/supply_control/update_allow_any_mint_burn.rs +0 -114
  120. package/contracts/sac-manager/src/tests/supply_control/update_limit_config.rs +0 -257
  121. /package/contracts/{sac-manager → oapps/sac-manager}/Cargo.toml +0 -0
  122. /package/contracts/{sac-manager → oapps/sac-manager}/src/tests/sac_manager/set_admin.rs +0 -0
  123. /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
- }