@layerzerolabs/protocol-stellar-v2 0.2.20 → 0.2.22

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 (198) hide show
  1. package/.turbo/turbo-build.log +783 -802
  2. package/.turbo/turbo-lint.log +320 -157
  3. package/.turbo/turbo-test.log +1414 -1457
  4. package/Cargo.lock +109 -108
  5. package/Cargo.toml +32 -18
  6. package/contracts/common-macros/Cargo.toml +7 -7
  7. package/contracts/common-macros/src/auth.rs +18 -37
  8. package/contracts/common-macros/src/contract_ttl.rs +2 -2
  9. package/contracts/common-macros/src/lib.rs +27 -10
  10. package/contracts/common-macros/src/lz_contract.rs +38 -7
  11. package/contracts/common-macros/src/storage.rs +251 -292
  12. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +6 -12
  13. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +12 -17
  14. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +2 -7
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +20 -9
  16. package/contracts/common-macros/src/tests/upgradeable.rs +26 -4
  17. package/contracts/common-macros/src/ttl_configurable.rs +2 -10
  18. package/contracts/common-macros/src/ttl_extendable.rs +2 -10
  19. package/contracts/common-macros/src/upgradeable.rs +56 -15
  20. package/contracts/common-macros/src/utils.rs +0 -9
  21. package/contracts/endpoint-v2/src/lib.rs +3 -2
  22. package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +2 -2
  23. package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +3 -3
  24. package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +4 -4
  25. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +17 -5
  26. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +4 -4
  27. package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +2 -2
  28. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +2 -2
  29. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +6 -6
  30. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +67 -37
  31. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +5 -5
  32. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +44 -54
  33. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +7 -7
  34. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +8 -8
  35. package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +3 -3
  36. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +4 -4
  37. package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +3 -3
  38. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +2 -2
  39. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +3 -3
  40. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +2 -2
  41. package/contracts/layerzero-views/Cargo.toml +0 -1
  42. package/contracts/layerzero-views/src/layerzero_view.rs +1 -13
  43. package/contracts/macro-integration-tests/Cargo.toml +5 -15
  44. package/contracts/macro-integration-tests/tests/runtime/oapp/mod.rs +48 -0
  45. package/contracts/macro-integration-tests/tests/runtime/oapp/oapp_core.rs +170 -0
  46. package/contracts/macro-integration-tests/tests/runtime/oapp/options_type3.rs +154 -0
  47. package/contracts/macro-integration-tests/tests/runtime/oapp/receiver.rs +338 -0
  48. package/contracts/macro-integration-tests/tests/runtime/oapp/sender.rs +435 -0
  49. package/contracts/macro-integration-tests/tests/runtime.rs +1 -0
  50. package/contracts/macro-integration-tests/tests/ui/oapp/fail/custom_wrong_value.rs +8 -0
  51. package/contracts/macro-integration-tests/tests/ui/oapp/fail/custom_wrong_value.stderr +5 -0
  52. package/contracts/macro-integration-tests/tests/ui/oapp/fail/missing_lz_receive_internal.rs +8 -0
  53. package/contracts/macro-integration-tests/tests/ui/oapp/fail/missing_lz_receive_internal.stderr +71 -0
  54. package/contracts/macro-integration-tests/tests/ui/oapp/fail/non_struct_input.rs +10 -0
  55. package/contracts/macro-integration-tests/tests/ui/oapp/fail/non_struct_input.stderr +5 -0
  56. package/contracts/macro-integration-tests/tests/ui/oapp/fail/unknown_custom_option.rs +8 -0
  57. package/contracts/macro-integration-tests/tests/ui/oapp/fail/unknown_custom_option.stderr +5 -0
  58. package/contracts/macro-integration-tests/tests/ui/oapp/fail/wrong_key.rs +8 -0
  59. package/contracts/macro-integration-tests/tests/ui/oapp/fail/wrong_key.stderr +5 -0
  60. package/contracts/macro-integration-tests/tests/ui/oapp/pass/custom_all.rs +38 -0
  61. package/contracts/macro-integration-tests/tests/ui/oapp/pass/custom_single_trait.rs +96 -0
  62. package/contracts/macro-integration-tests/tests/ui/oapp/pass/minimal_contract.rs +64 -0
  63. package/contracts/macro-integration-tests/tests/ui/oapp/pass/struct_with_fields.rs +46 -0
  64. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.stderr +8 -0
  65. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +1 -1
  66. package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_auth_env_param_variants.rs +1 -1
  67. package/contracts/macro-integration-tests/tests/ui_oapp.rs +11 -0
  68. package/contracts/message-libs/message-lib-common/Cargo.toml +0 -1
  69. package/contracts/message-libs/message-lib-common/src/errors.rs +1 -1
  70. package/contracts/message-libs/treasury/Cargo.toml +0 -2
  71. package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +2 -2
  72. package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +2 -2
  73. package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +2 -2
  74. package/contracts/message-libs/uln-302/src/tests/receive_uln302/verify.rs +2 -2
  75. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_executor_config.rs +2 -2
  76. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +2 -2
  77. package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +7 -27
  78. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +2 -2
  79. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +2 -2
  80. package/contracts/oapps/counter/Cargo.toml +4 -6
  81. package/contracts/oapps/counter/integration_tests/utils.rs +19 -12
  82. package/contracts/oapps/oapp/src/errors.rs +1 -1
  83. package/contracts/oapps/oapp/src/interfaces/mod.rs +3 -0
  84. package/contracts/oapps/oapp/src/interfaces/oapp_msg_inspector.rs +47 -0
  85. package/contracts/oapps/oapp/src/lib.rs +1 -0
  86. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +4 -4
  87. package/contracts/oapps/oapp/src/oapp_core.rs +5 -5
  88. package/contracts/oapps/oapp/src/oapp_options_type3.rs +12 -4
  89. package/contracts/oapps/oapp/src/oapp_receiver.rs +14 -9
  90. package/contracts/oapps/oapp/src/tests/mod.rs +4 -4
  91. package/contracts/oapps/oapp/src/tests/{test_oapp_core.rs → oapp_core.rs} +4 -4
  92. package/contracts/oapps/oapp/src/tests/{test_oapp_options_type3.rs → oapp_options_type3.rs} +3 -4
  93. package/contracts/oapps/oapp-macros/Cargo.toml +8 -4
  94. package/contracts/oapps/oapp-macros/src/generators.rs +9 -34
  95. package/contracts/oapps/oapp-macros/src/lib.rs +3 -0
  96. package/contracts/oapps/oapp-macros/src/tests/mod.rs +2 -0
  97. package/contracts/oapps/oapp-macros/src/tests/oapp.rs +88 -0
  98. package/contracts/oapps/oapp-macros/src/tests/parse_custom_impls.rs +86 -0
  99. package/contracts/oapps/oapp-macros/src/tests/snapshots/oapp_macros__tests__oapp__snapshot_generate_oapp.snap +103 -0
  100. package/contracts/oapps/oft/integration-tests/utils.rs +28 -8
  101. package/contracts/oapps/oft/src/extensions/oft_fee.rs +136 -74
  102. package/contracts/oapps/oft/src/extensions/pausable.rs +44 -10
  103. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +170 -130
  104. package/contracts/oapps/oft/src/oft.rs +19 -12
  105. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +1 -1
  106. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +1 -1
  107. package/contracts/oapps/oft-core/Cargo.toml +1 -4
  108. package/contracts/oapps/oft-core/integration-tests/setup.rs +2 -2
  109. package/contracts/oapps/oft-core/integration-tests/utils.rs +21 -3
  110. package/contracts/oapps/oft-core/src/errors.rs +3 -2
  111. package/contracts/oapps/oft-core/src/events.rs +6 -0
  112. package/contracts/oapps/oft-core/src/lib.rs +1 -1
  113. package/contracts/oapps/oft-core/src/oft_core.rs +115 -60
  114. package/contracts/oapps/oft-core/src/storage.rs +7 -3
  115. package/contracts/oapps/oft-core/src/tests/mod.rs +1 -0
  116. package/contracts/oapps/oft-core/src/tests/test_decimals.rs +37 -2
  117. package/contracts/oapps/oft-core/src/tests/test_lz_receive.rs +2 -2
  118. package/contracts/oapps/oft-core/src/tests/test_msg_inspector.rs +323 -0
  119. package/contracts/oapps/oft-core/src/tests/test_send.rs +2 -2
  120. package/contracts/oapps/oft-core/src/tests/test_utils.rs +59 -14
  121. package/contracts/utils/Cargo.toml +0 -1
  122. package/contracts/utils/src/errors.rs +1 -1
  123. package/contracts/utils/src/multisig.rs +17 -8
  124. package/contracts/utils/src/ownable.rs +6 -6
  125. package/contracts/utils/src/testing_utils.rs +124 -54
  126. package/contracts/utils/src/tests/multisig.rs +12 -12
  127. package/contracts/utils/src/tests/ownable.rs +6 -6
  128. package/contracts/utils/src/tests/testing_utils.rs +50 -167
  129. package/contracts/utils/src/tests/ttl_configurable.rs +5 -5
  130. package/contracts/utils/src/tests/upgradeable.rs +1 -1
  131. package/contracts/utils/src/ttl_configurable.rs +10 -4
  132. package/contracts/utils/src/upgradeable.rs +5 -5
  133. package/contracts/workers/dvn/Cargo.toml +5 -6
  134. package/contracts/workers/dvn/src/dvn.rs +2 -12
  135. package/contracts/workers/dvn-fee-lib/Cargo.toml +1 -1
  136. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +37 -19
  137. package/contracts/workers/dvn-fee-lib/src/lib.rs +12 -2
  138. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +15 -13
  139. package/contracts/workers/executor/Cargo.toml +3 -0
  140. package/contracts/workers/executor/src/executor.rs +2 -12
  141. package/contracts/workers/executor/src/lib.rs +2 -2
  142. package/contracts/workers/executor/src/tests/auth.rs +394 -0
  143. package/contracts/workers/executor/src/tests/executor.rs +410 -0
  144. package/contracts/workers/executor/src/tests/mod.rs +3 -0
  145. package/contracts/workers/executor/src/tests/setup.rs +250 -0
  146. package/contracts/workers/executor-fee-lib/Cargo.toml +5 -0
  147. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +1 -12
  148. package/contracts/workers/executor-fee-lib/src/lib.rs +8 -2
  149. package/contracts/workers/executor-helper/Cargo.toml +0 -1
  150. package/contracts/workers/price-feed/Cargo.toml +5 -0
  151. package/contracts/workers/price-feed/src/lib.rs +9 -4
  152. package/contracts/workers/price-feed/src/price_feed.rs +1 -11
  153. package/contracts/workers/worker/src/errors.rs +1 -1
  154. package/contracts/workers/worker/src/tests/setup.rs +1 -1
  155. package/contracts/workers/worker/src/tests/worker.rs +55 -41
  156. package/contracts/workers/worker/src/worker.rs +34 -25
  157. package/docs/error-spec.md +55 -0
  158. package/docs/layerzero-v2-on-stellar.md +447 -0
  159. package/docs/oapp-guide.md +212 -0
  160. package/docs/oft-guide.md +314 -0
  161. package/package.json +3 -3
  162. package/sdk/.turbo/turbo-test.log +260 -257
  163. package/sdk/dist/generated/bml.d.ts +3 -3
  164. package/sdk/dist/generated/bml.js +4 -4
  165. package/sdk/dist/generated/counter.d.ts +295 -295
  166. package/sdk/dist/generated/counter.js +43 -43
  167. package/sdk/dist/generated/dvn.d.ts +91 -91
  168. package/sdk/dist/generated/dvn.js +24 -24
  169. package/sdk/dist/generated/dvn_fee_lib.d.ts +92 -92
  170. package/sdk/dist/generated/dvn_fee_lib.js +25 -25
  171. package/sdk/dist/generated/endpoint.d.ts +99 -99
  172. package/sdk/dist/generated/endpoint.js +16 -16
  173. package/sdk/dist/generated/executor.d.ts +91 -91
  174. package/sdk/dist/generated/executor.js +24 -24
  175. package/sdk/dist/generated/executor_fee_lib.d.ts +92 -92
  176. package/sdk/dist/generated/executor_fee_lib.js +25 -25
  177. package/sdk/dist/generated/executor_helper.d.ts +3 -3
  178. package/sdk/dist/generated/executor_helper.js +4 -4
  179. package/sdk/dist/generated/layerzero_view.d.ts +186 -186
  180. package/sdk/dist/generated/layerzero_view.js +35 -35
  181. package/sdk/dist/generated/oft.d.ts +366 -352
  182. package/sdk/dist/generated/oft.js +74 -79
  183. package/sdk/dist/generated/price_feed.d.ts +198 -198
  184. package/sdk/dist/generated/price_feed.js +39 -39
  185. package/sdk/dist/generated/sml.d.ts +99 -99
  186. package/sdk/dist/generated/sml.js +16 -16
  187. package/sdk/dist/generated/treasury.d.ts +99 -99
  188. package/sdk/dist/generated/treasury.js +16 -16
  189. package/sdk/dist/generated/uln302.d.ts +99 -99
  190. package/sdk/dist/generated/uln302.js +16 -16
  191. package/sdk/dist/generated/upgrader.d.ts +3 -3
  192. package/sdk/dist/generated/upgrader.js +3 -3
  193. package/sdk/package.json +1 -1
  194. package/sdk/test/suites/localnet.ts +84 -20
  195. package/contracts/ERROR_SPEC.md +0 -51
  196. package/contracts/endpoint-v2/ARCHITECTURE.md +0 -233
  197. /package/contracts/oapps/oapp/src/tests/{test_oapp_receiver.rs → oapp_receiver.rs} +0 -0
  198. /package/contracts/oapps/oapp/src/tests/{test_oapp_sender.rs → oapp_sender.rs} +0 -0
@@ -2,7 +2,6 @@ use crate::{errors::ExecutorFeeLibError, executor_option};
2
2
  use common_macros::{contract_impl, lz_contract};
3
3
  use fee_lib_interfaces::{FeeParams, IExecutorFeeLib, LayerZeroPriceFeedClient};
4
4
  use soroban_sdk::{assert_with_error, Address, Bytes, Env};
5
- use utils::upgradeable::UpgradeableInternal;
6
5
 
7
6
  // ============================================================================
8
7
  // Constants
@@ -25,7 +24,7 @@ const NATIVE_DECIMALS_RATE: u128 = 10_000_000;
25
24
  /// Provides fee calculation logic based on executor options, destination configuration,
26
25
  /// and current gas prices from the price feed. Handles fee multipliers, margins, and
27
26
  /// native token value conversions.
28
- #[lz_contract(upgradeable)]
27
+ #[lz_contract(upgradeable(no_migration))]
29
28
  pub struct ExecutorFeeLib;
30
29
 
31
30
  #[contract_impl]
@@ -106,16 +105,6 @@ impl IExecutorFeeLib for ExecutorFeeLib {
106
105
  }
107
106
  }
108
107
 
109
- // ============================================================================
110
- // Upgradeable Implementation
111
- // ============================================================================
112
-
113
- /// No migration logic needed for initial upgrade capability
114
- impl UpgradeableInternal for ExecutorFeeLib {
115
- type MigrationData = ();
116
- fn __migrate(_env: &Env, _migration_data: &Self::MigrationData) {}
117
- }
118
-
119
108
  // ========================================================================
120
109
  // Helper Functions
121
110
  // ========================================================================
@@ -1,10 +1,16 @@
1
1
  #![no_std]
2
2
 
3
3
  pub mod errors;
4
- pub mod executor_fee_lib;
5
4
  pub mod executor_option;
6
5
 
7
- pub use executor_fee_lib::{ExecutorFeeLib, ExecutorFeeLibClient};
6
+ cfg_if::cfg_if! {
7
+ // Include implementation when NOT in library mode, OR when testutils is enabled (for tests)
8
+ if #[cfg(any(not(feature = "library"), feature = "testutils"))] {
9
+ mod executor_fee_lib;
10
+ // Export the contract and client for testing purposes
11
+ pub use executor_fee_lib::{ExecutorFeeLib, ExecutorFeeLibClient};
12
+ }
13
+ }
8
14
 
9
15
  #[cfg(test)]
10
16
  mod tests;
@@ -14,7 +14,6 @@ soroban-sdk = { workspace = true }
14
14
  # workspace dependencies
15
15
  common-macros = { workspace = true }
16
16
  utils = { workspace = true }
17
- worker = { workspace = true }
18
17
  endpoint-v2 = { workspace = true, features = ["library"] }
19
18
  executor = { workspace = true, features = ["library"] }
20
19
 
@@ -9,7 +9,12 @@ publish = false
9
9
  crate-type = ["cdylib", "rlib"]
10
10
  doctest = false
11
11
 
12
+ [features]
13
+ library = []
14
+ testutils = []
15
+
12
16
  [dependencies]
17
+ cfg-if = { workspace = true }
13
18
  soroban-sdk = { workspace = true }
14
19
  utils = { workspace = true }
15
20
  fee-lib-interfaces = { workspace = true }
@@ -1,13 +1,18 @@
1
1
  #![no_std]
2
2
 
3
- mod storage;
4
-
5
3
  pub mod errors;
6
4
  pub mod events;
7
- pub mod price_feed;
8
5
  pub mod types;
9
6
 
10
- pub use price_feed::{LzPriceFeed, LzPriceFeedClient};
7
+ cfg_if::cfg_if! {
8
+ // Include implementation when NOT in library mode, OR when testutils is enabled (for tests)
9
+ if #[cfg(any(not(feature = "library"), feature = "testutils"))] {
10
+ mod storage;
11
+ mod price_feed;
12
+ // Export the contract and client for testing purposes
13
+ pub use price_feed::{LzPriceFeed, LzPriceFeedClient};
14
+ }
15
+ }
11
16
 
12
17
  #[cfg(test)]
13
18
  mod tests;
@@ -1,7 +1,6 @@
1
1
  use common_macros::{contract_impl, lz_contract, only_auth};
2
2
  use fee_lib_interfaces::{FeeEstimate, ILayerZeroPriceFeed, Price};
3
3
  use soroban_sdk::{assert_with_error, panic_with_error, Address, Env, Vec};
4
- use utils::upgradeable::UpgradeableInternal;
5
4
 
6
5
  use crate::{
7
6
  errors::PriceFeedError,
@@ -10,7 +9,7 @@ use crate::{
10
9
  types::{ArbitrumPriceExt, ModelType, SetEidToModelTypeParam, UpdatePrice, UpdatePriceExt},
11
10
  };
12
11
 
13
- #[lz_contract(upgradeable)]
12
+ #[lz_contract(upgradeable(no_migration))]
14
13
  pub struct LzPriceFeed;
15
14
 
16
15
  #[contract_impl]
@@ -267,12 +266,3 @@ impl LzPriceFeed {
267
266
  }
268
267
  }
269
268
 
270
- // ============================================================================
271
- // Upgradeable Implementation
272
- // ============================================================================
273
-
274
- /// No migration logic needed for initial upgrade capability
275
- impl UpgradeableInternal for LzPriceFeed {
276
- type MigrationData = ();
277
- fn __migrate(_env: &Env, _migration_data: &Self::MigrationData) {}
278
- }
@@ -1,7 +1,7 @@
1
1
  use common_macros::contract_error;
2
2
 
3
3
  // Worker library error codes: 1200-1299
4
- // See ERROR_SPEC.md for allocation rules
4
+ // See docs/error-spec.md for allocation rules
5
5
 
6
6
  /// WorkerError: 1200-1299
7
7
  #[contract_error]
@@ -1,6 +1,6 @@
1
1
  use soroban_sdk::{
2
2
  testutils::{Address as _, MockAuth, MockAuthInvoke},
3
- Address, Bytes, Env, IntoVal, Val, Vec,
3
+ Address, Env, IntoVal, Val, Vec,
4
4
  };
5
5
 
6
6
  use crate::{init_worker, set_admin_by_admin, Worker};
@@ -1,5 +1,6 @@
1
1
  use super::setup::{bare_worker, TestSetup, WorkerTester};
2
2
  use crate::{
3
+ errors::WorkerError,
3
4
  events::{
4
5
  Paused, SetAdmin, SetAllowlist, SetDefaultMultiplierBps, SetDenylist, SetDepositAddress, SetPriceFeed,
5
6
  SetSupportedMessageLib, SetSupportedOptionTypes, SetWorkerFeeLib, Unpaused,
@@ -7,17 +8,16 @@ use crate::{
7
8
  init_worker,
8
9
  };
9
10
  use soroban_sdk::{testutils::Address as _, vec, Address, Bytes, Env, IntoVal};
10
- use utils::testing_utils::assert_event;
11
+ use utils::testing_utils::assert_eq_event;
11
12
 
12
13
  // pause
13
14
 
14
15
  #[test]
15
- #[should_panic(expected = "Error(Contract, #1210)")] // WorkerError::PauseStatusUnchanged
16
16
  fn test_set_paused_rejects_unchanged_status() {
17
17
  let setup = TestSetup::new();
18
18
 
19
19
  setup.mock_owner_auth("set_paused", (false,));
20
- setup.client.set_paused(&false);
20
+ assert_eq!(setup.client.try_set_paused(&false).unwrap_err().unwrap(), WorkerError::PauseStatusUnchanged.into());
21
21
  }
22
22
 
23
23
  #[test]
@@ -26,19 +26,18 @@ fn test_set_paused_toggles_state() {
26
26
 
27
27
  setup.mock_owner_auth("set_paused", (true,));
28
28
  setup.client.set_paused(&true);
29
- assert_event(&setup.env, &setup.contract_id, Paused { pauser: setup.owner.clone() });
29
+ assert_eq_event(&setup.env, &setup.contract_id, Paused { pauser: setup.owner.clone() });
30
30
  assert_eq!(setup.client.paused(), true);
31
31
 
32
32
  setup.mock_owner_auth("set_paused", (false,));
33
33
  setup.client.set_paused(&false);
34
- assert_event(&setup.env, &setup.contract_id, Unpaused { unpauser: setup.owner.clone() });
34
+ assert_eq_event(&setup.env, &setup.contract_id, Unpaused { unpauser: setup.owner.clone() });
35
35
  assert_eq!(setup.client.paused(), false);
36
36
  }
37
37
 
38
38
  // allowlist
39
39
 
40
40
  #[test]
41
- #[should_panic(expected = "Error(Contract, #1202)")] // WorkerError::AlreadyOnAllowlist
42
41
  fn test_allowlist_rejects_duplicate_add() {
43
42
  let setup = TestSetup::new();
44
43
  let oapp = Address::generate(&setup.env);
@@ -47,17 +46,19 @@ fn test_allowlist_rejects_duplicate_add() {
47
46
  setup.client.set_allowlist(&oapp, &true);
48
47
 
49
48
  setup.mock_owner_auth("set_allowlist", (&oapp, true));
50
- setup.client.set_allowlist(&oapp, &true);
49
+ assert_eq!(
50
+ setup.client.try_set_allowlist(&oapp, &true).unwrap_err().unwrap(),
51
+ WorkerError::AlreadyOnAllowlist.into()
52
+ );
51
53
  }
52
54
 
53
55
  #[test]
54
- #[should_panic(expected = "Error(Contract, #1208)")] // WorkerError::NotOnAllowlist
55
56
  fn test_allowlist_rejects_remove_missing() {
56
57
  let setup = TestSetup::new();
57
58
  let oapp = Address::generate(&setup.env);
58
59
 
59
60
  setup.mock_owner_auth("set_allowlist", (&oapp, false));
60
- setup.client.set_allowlist(&oapp, &false);
61
+ assert_eq!(setup.client.try_set_allowlist(&oapp, &false).unwrap_err().unwrap(), WorkerError::NotOnAllowlist.into());
61
62
  }
62
63
 
63
64
  #[test]
@@ -70,7 +71,7 @@ fn test_allowlist_remove_decrements_size_and_restores_default_acl() {
70
71
  assert_eq!(setup.client.is_on_allowlist(&oapp_a), false);
71
72
  setup.mock_owner_auth("set_allowlist", (&oapp_a, true));
72
73
  setup.client.set_allowlist(&oapp_a, &true);
73
- assert_event(&setup.env, &setup.contract_id, SetAllowlist { oapp: oapp_a.clone(), allowed: true });
74
+ assert_eq_event(&setup.env, &setup.contract_id, SetAllowlist { oapp: oapp_a.clone(), allowed: true });
74
75
  assert_eq!(setup.client.is_on_allowlist(&oapp_a), true);
75
76
  assert_eq!(setup.client.allowlist_size(), 1);
76
77
  assert_eq!(setup.client.has_acl(&oapp_a), true);
@@ -79,7 +80,7 @@ fn test_allowlist_remove_decrements_size_and_restores_default_acl() {
79
80
  // Remove last allowlist entry => allowlist empty; default allows all (unless denylisted)
80
81
  setup.mock_owner_auth("set_allowlist", (&oapp_a, false));
81
82
  setup.client.set_allowlist(&oapp_a, &false);
82
- assert_event(&setup.env, &setup.contract_id, SetAllowlist { oapp: oapp_a.clone(), allowed: false });
83
+ assert_eq_event(&setup.env, &setup.contract_id, SetAllowlist { oapp: oapp_a.clone(), allowed: false });
83
84
  assert_eq!(setup.client.is_on_allowlist(&oapp_a), false);
84
85
  assert_eq!(setup.client.allowlist_size(), 0);
85
86
  assert_eq!(setup.client.has_acl(&oapp_b), true);
@@ -88,7 +89,6 @@ fn test_allowlist_remove_decrements_size_and_restores_default_acl() {
88
89
  // denylist
89
90
 
90
91
  #[test]
91
- #[should_panic(expected = "Error(Contract, #1203)")] // WorkerError::AlreadyOnDenylist
92
92
  fn test_denylist_rejects_duplicate_add() {
93
93
  let setup = TestSetup::new();
94
94
  let oapp = Address::generate(&setup.env);
@@ -97,17 +97,19 @@ fn test_denylist_rejects_duplicate_add() {
97
97
  setup.client.set_denylist(&oapp, &true);
98
98
 
99
99
  setup.mock_owner_auth("set_denylist", (&oapp, true));
100
- setup.client.set_denylist(&oapp, &true);
100
+ assert_eq!(
101
+ setup.client.try_set_denylist(&oapp, &true).unwrap_err().unwrap(),
102
+ WorkerError::AlreadyOnDenylist.into()
103
+ );
101
104
  }
102
105
 
103
106
  #[test]
104
- #[should_panic(expected = "Error(Contract, #1209)")] // WorkerError::NotOnDenylist
105
107
  fn test_denylist_rejects_remove_missing() {
106
108
  let setup = TestSetup::new();
107
109
  let oapp = Address::generate(&setup.env);
108
110
 
109
111
  setup.mock_owner_auth("set_denylist", (&oapp, false));
110
- setup.client.set_denylist(&oapp, &false);
112
+ assert_eq!(setup.client.try_set_denylist(&oapp, &false).unwrap_err().unwrap(), WorkerError::NotOnDenylist.into());
111
113
  }
112
114
 
113
115
  // message_libs
@@ -122,7 +124,7 @@ fn test_message_lib_add_remove_and_errors() {
122
124
  // Add new supported lib
123
125
  setup.mock_owner_auth("set_supported_message_lib", (&new_lib, true));
124
126
  setup.client.set_supported_message_lib(&new_lib, &true);
125
- assert_event(
127
+ assert_eq_event(
126
128
  &setup.env,
127
129
  &setup.contract_id,
128
130
  SetSupportedMessageLib { message_lib: new_lib.clone(), supported: true },
@@ -132,7 +134,7 @@ fn test_message_lib_add_remove_and_errors() {
132
134
  // Remove it
133
135
  setup.mock_owner_auth("set_supported_message_lib", (&new_lib, false));
134
136
  setup.client.set_supported_message_lib(&new_lib, &false);
135
- assert_event(
137
+ assert_eq_event(
136
138
  &setup.env,
137
139
  &setup.contract_id,
138
140
  SetSupportedMessageLib { message_lib: new_lib.clone(), supported: false },
@@ -144,29 +146,32 @@ fn test_message_lib_add_remove_and_errors() {
144
146
  }
145
147
 
146
148
  #[test]
147
- #[should_panic(expected = "Error(Contract, #1205)")] // WorkerError::MessageLibAlreadySupported
148
149
  fn test_message_lib_rejects_duplicate_add() {
149
150
  let setup = TestSetup::new();
150
151
  let existing = setup.message_libs.get(0).unwrap();
151
152
 
152
153
  setup.mock_owner_auth("set_supported_message_lib", (&existing, true));
153
- setup.client.set_supported_message_lib(&existing, &true);
154
+ assert_eq!(
155
+ setup.client.try_set_supported_message_lib(&existing, &true).unwrap_err().unwrap(),
156
+ WorkerError::MessageLibAlreadySupported.into()
157
+ );
154
158
  }
155
159
 
156
160
  #[test]
157
- #[should_panic(expected = "Error(Contract, #1206)")] // WorkerError::MessageLibNotSupported
158
161
  fn test_message_lib_rejects_remove_missing() {
159
162
  let setup = TestSetup::new();
160
163
  let missing = Address::generate(&setup.env);
161
164
 
162
165
  setup.mock_owner_auth("set_supported_message_lib", (&missing, false));
163
- setup.client.set_supported_message_lib(&missing, &false);
166
+ assert_eq!(
167
+ setup.client.try_set_supported_message_lib(&missing, &false).unwrap_err().unwrap(),
168
+ WorkerError::MessageLibNotSupported.into()
169
+ );
164
170
  }
165
171
 
166
172
  // admin-only setters
167
173
 
168
174
  #[test]
169
- #[should_panic(expected = "Error(Contract, #1212)")] // WorkerError::Unauthorized
170
175
  fn test_admin_only_set_default_multiplier_requires_admin_membership() {
171
176
  let setup = TestSetup::new();
172
177
 
@@ -175,7 +180,10 @@ fn test_admin_only_set_default_multiplier_requires_admin_membership() {
175
180
 
176
181
  // Auth passes, but address isn't in admins list => Unauthorized
177
182
  setup.mock_auth(&non_admin, "set_default_multiplier_bps", (&non_admin, bps));
178
- setup.client.set_default_multiplier_bps(&non_admin, &bps);
183
+ assert_eq!(
184
+ setup.client.try_set_default_multiplier_bps(&non_admin, &bps).unwrap_err().unwrap(),
185
+ WorkerError::Unauthorized.into()
186
+ );
179
187
  }
180
188
 
181
189
  #[test]
@@ -187,14 +195,14 @@ fn test_admin_setters_update_storage_and_events() {
187
195
  let bps = 12_000u32;
188
196
  setup.mock_auth(&admin, "set_default_multiplier_bps", (&admin, bps));
189
197
  setup.client.set_default_multiplier_bps(&admin, &bps);
190
- assert_event(&setup.env, &setup.contract_id, SetDefaultMultiplierBps { multiplier_bps: bps });
198
+ assert_eq_event(&setup.env, &setup.contract_id, SetDefaultMultiplierBps { multiplier_bps: bps });
191
199
  assert_eq!(setup.client.default_multiplier_bps(), bps);
192
200
 
193
201
  // set_deposit_address
194
202
  let new_deposit = Address::generate(&setup.env);
195
203
  setup.mock_auth(&admin, "set_deposit_address", (&admin, &new_deposit));
196
204
  setup.client.set_deposit_address(&admin, &new_deposit);
197
- assert_event(&setup.env, &setup.contract_id, SetDepositAddress { deposit_address: new_deposit.clone() });
205
+ assert_eq_event(&setup.env, &setup.contract_id, SetDepositAddress { deposit_address: new_deposit.clone() });
198
206
  assert_eq!(setup.client.deposit_address(), Some(new_deposit));
199
207
 
200
208
  // set_supported_option_types
@@ -204,7 +212,7 @@ fn test_admin_setters_update_storage_and_events() {
204
212
  let option_types = Bytes::from_slice(&setup.env, &[0xAA, 0xBB, 0xCC]);
205
213
  setup.mock_auth(&admin, "set_supported_option_types", (&admin, eid_a, option_types.clone()));
206
214
  setup.client.set_supported_option_types(&admin, &eid_a, &option_types);
207
- assert_event(
215
+ assert_eq_event(
208
216
  &setup.env,
209
217
  &setup.contract_id,
210
218
  SetSupportedOptionTypes { dst_eid: eid_a, option_types: option_types.clone() },
@@ -217,14 +225,14 @@ fn test_admin_setters_update_storage_and_events() {
217
225
  let new_fee_lib = Address::generate(&setup.env);
218
226
  setup.mock_auth(&admin, "set_worker_fee_lib", (&admin, &new_fee_lib));
219
227
  setup.client.set_worker_fee_lib(&admin, &new_fee_lib);
220
- assert_event(&setup.env, &setup.contract_id, SetWorkerFeeLib { fee_lib: new_fee_lib.clone() });
228
+ assert_eq_event(&setup.env, &setup.contract_id, SetWorkerFeeLib { fee_lib: new_fee_lib.clone() });
221
229
  assert_eq!(setup.client.worker_fee_lib(), Some(new_fee_lib));
222
230
 
223
231
  // set_price_feed
224
232
  let new_price_feed = Address::generate(&setup.env);
225
233
  setup.mock_auth(&admin, "set_price_feed", (&admin, &new_price_feed));
226
234
  setup.client.set_price_feed(&admin, &new_price_feed);
227
- assert_event(&setup.env, &setup.contract_id, SetPriceFeed { price_feed: new_price_feed.clone() });
235
+ assert_eq_event(&setup.env, &setup.contract_id, SetPriceFeed { price_feed: new_price_feed.clone() });
228
236
  assert_eq!(setup.client.price_feed(), Some(new_price_feed));
229
237
  }
230
238
 
@@ -243,14 +251,14 @@ fn test_acl_allowlist_denylist_precedence() {
243
251
  assert_eq!(setup.client.is_on_denylist(&oapp_a), false);
244
252
  setup.mock_owner_auth("set_denylist", (&oapp_a, true));
245
253
  setup.client.set_denylist(&oapp_a, &true);
246
- assert_event(&setup.env, &setup.contract_id, SetDenylist { oapp: oapp_a.clone(), denied: true });
254
+ assert_eq_event(&setup.env, &setup.contract_id, SetDenylist { oapp: oapp_a.clone(), denied: true });
247
255
  assert_eq!(setup.client.is_on_denylist(&oapp_a), true);
248
256
  assert_eq!(setup.client.has_acl(&oapp_a), false);
249
257
 
250
258
  // Remove from denylist => allowed again (since allowlist is empty)
251
259
  setup.mock_owner_auth("set_denylist", (&oapp_a, false));
252
260
  setup.client.set_denylist(&oapp_a, &false);
253
- assert_event(&setup.env, &setup.contract_id, SetDenylist { oapp: oapp_a.clone(), denied: false });
261
+ assert_eq_event(&setup.env, &setup.contract_id, SetDenylist { oapp: oapp_a.clone(), denied: false });
254
262
  assert_eq!(setup.client.is_on_denylist(&oapp_a), false);
255
263
  assert_eq!(setup.client.has_acl(&oapp_a), true);
256
264
 
@@ -264,13 +272,13 @@ fn test_acl_allowlist_denylist_precedence() {
264
272
  // Denylist must override allowlist even for the same OApp.
265
273
  setup.mock_owner_auth("set_denylist", (&oapp_a, true));
266
274
  setup.client.set_denylist(&oapp_a, &true);
267
- assert_event(&setup.env, &setup.contract_id, SetDenylist { oapp: oapp_a.clone(), denied: true });
275
+ assert_eq_event(&setup.env, &setup.contract_id, SetDenylist { oapp: oapp_a.clone(), denied: true });
268
276
  assert_eq!(setup.client.has_acl(&oapp_a), false);
269
277
 
270
278
  // Removing from denylist should restore allowlist effect.
271
279
  setup.mock_owner_auth("set_denylist", (&oapp_a, false));
272
280
  setup.client.set_denylist(&oapp_a, &false);
273
- assert_event(&setup.env, &setup.contract_id, SetDenylist { oapp: oapp_a.clone(), denied: false });
281
+ assert_eq_event(&setup.env, &setup.contract_id, SetDenylist { oapp: oapp_a.clone(), denied: false });
274
282
  assert_eq!(setup.client.has_acl(&oapp_a), true);
275
283
  }
276
284
 
@@ -383,33 +391,37 @@ fn test_admin_management_by_owner_adds_and_removes_admin() {
383
391
 
384
392
  setup.mock_owner_auth("set_admin", (&new_admin, true));
385
393
  setup.client.set_admin(&new_admin, &true);
386
- assert_event(&setup.env, &setup.contract_id, SetAdmin { admin: new_admin.clone(), active: true });
394
+ assert_eq_event(&setup.env, &setup.contract_id, SetAdmin { admin: new_admin.clone(), active: true });
387
395
  assert_eq!(setup.client.is_admin(&new_admin), true);
388
396
 
389
397
  setup.mock_owner_auth("set_admin", (&new_admin, false));
390
398
  setup.client.set_admin(&new_admin, &false);
391
- assert_event(&setup.env, &setup.contract_id, SetAdmin { admin: new_admin.clone(), active: false });
399
+ assert_eq_event(&setup.env, &setup.contract_id, SetAdmin { admin: new_admin.clone(), active: false });
392
400
  assert_eq!(setup.client.is_admin(&new_admin), false);
393
401
  }
394
402
 
395
403
  #[test]
396
- #[should_panic(expected = "Error(Contract, #1200)")] // WorkerError::AdminAlreadyExists
397
404
  fn test_admin_management_by_owner_rejects_duplicate_add() {
398
405
  let setup = TestSetup::new();
399
406
  let existing_admin = setup.admins.get(0).unwrap();
400
407
 
401
408
  setup.mock_owner_auth("set_admin", (&existing_admin, true));
402
- setup.client.set_admin(&existing_admin, &true);
409
+ assert_eq!(
410
+ setup.client.try_set_admin(&existing_admin, &true).unwrap_err().unwrap(),
411
+ WorkerError::AdminAlreadyExists.into()
412
+ );
403
413
  }
404
414
 
405
415
  #[test]
406
- #[should_panic(expected = "Error(Contract, #1201)")] // WorkerError::AdminNotFound
407
416
  fn test_admin_management_by_owner_rejects_remove_missing_admin() {
408
417
  let setup = TestSetup::new();
409
418
  let missing_admin = Address::generate(&setup.env);
410
419
 
411
420
  setup.mock_owner_auth("set_admin", (&missing_admin, false));
412
- setup.client.set_admin(&missing_admin, &false);
421
+ assert_eq!(
422
+ setup.client.try_set_admin(&missing_admin, &false).unwrap_err().unwrap(),
423
+ WorkerError::AdminNotFound.into()
424
+ );
413
425
  }
414
426
 
415
427
  #[test]
@@ -454,19 +466,21 @@ fn test_admin_management_by_admin_can_add_admin() {
454
466
 
455
467
  setup.mock_auth(&caller, "set_admin_by_admin_for_test", (&caller, &new_admin, true));
456
468
  setup.client.set_admin_by_admin_for_test(&caller, &new_admin, &true);
457
- assert_event(&setup.env, &setup.contract_id, SetAdmin { admin: new_admin.clone(), active: true });
469
+ assert_eq_event(&setup.env, &setup.contract_id, SetAdmin { admin: new_admin.clone(), active: true });
458
470
  assert_eq!(setup.client.is_admin(&new_admin), true);
459
471
  }
460
472
 
461
473
  #[test]
462
- #[should_panic(expected = "Error(Contract, #1212)")] // WorkerError::Unauthorized
463
474
  fn test_admin_management_by_admin_requires_caller_is_admin() {
464
475
  let setup = TestSetup::new();
465
476
  let non_admin = Address::generate(&setup.env);
466
477
  let new_admin = Address::generate(&setup.env);
467
478
 
468
479
  setup.mock_auth(&non_admin, "set_admin_by_admin_for_test", (&non_admin, &new_admin, true));
469
- setup.client.set_admin_by_admin_for_test(&non_admin, &new_admin, &true);
480
+ assert_eq!(
481
+ setup.client.try_set_admin_by_admin_for_test(&non_admin, &new_admin, &true).unwrap_err().unwrap(),
482
+ WorkerError::Unauthorized.into()
483
+ );
470
484
  }
471
485
 
472
486
  #[test]