@layerzerolabs/protocol-stellar-v2 0.2.19 → 0.2.21

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 (249) hide show
  1. package/.turbo/turbo-build.log +795 -791
  2. package/.turbo/turbo-lint.log +325 -155
  3. package/.turbo/turbo-test.log +1398 -1277
  4. package/Cargo.lock +122 -111
  5. package/Cargo.toml +32 -16
  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 +18 -7
  9. package/contracts/common-macros/src/lib.rs +31 -14
  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/contract_ttl.rs +1 -1
  13. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +6 -12
  14. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +12 -17
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap +2 -1
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +2 -7
  17. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +20 -14
  18. package/contracts/common-macros/src/tests/upgradeable.rs +26 -4
  19. package/contracts/common-macros/src/ttl_configurable.rs +2 -10
  20. package/contracts/common-macros/src/ttl_extendable.rs +2 -10
  21. package/contracts/common-macros/src/upgradeable.rs +61 -26
  22. package/contracts/common-macros/src/utils.rs +0 -9
  23. package/contracts/endpoint-v2/src/lib.rs +3 -2
  24. package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +2 -2
  25. package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +3 -3
  26. package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +4 -4
  27. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +17 -5
  28. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +4 -4
  29. package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +2 -2
  30. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +2 -2
  31. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +6 -6
  32. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +67 -37
  33. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +5 -5
  34. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +44 -54
  35. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +7 -7
  36. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +8 -8
  37. package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +3 -3
  38. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +4 -4
  39. package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +3 -3
  40. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +2 -2
  41. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +3 -3
  42. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +2 -2
  43. package/contracts/layerzero-views/Cargo.toml +0 -1
  44. package/contracts/layerzero-views/src/layerzero_view.rs +1 -13
  45. package/contracts/macro-integration-tests/Cargo.toml +5 -15
  46. package/contracts/macro-integration-tests/tests/runtime/oapp/mod.rs +48 -0
  47. package/contracts/macro-integration-tests/tests/runtime/oapp/oapp_core.rs +170 -0
  48. package/contracts/macro-integration-tests/tests/runtime/oapp/options_type3.rs +154 -0
  49. package/contracts/macro-integration-tests/tests/runtime/oapp/receiver.rs +338 -0
  50. package/contracts/macro-integration-tests/tests/runtime/oapp/sender.rs +435 -0
  51. package/contracts/macro-integration-tests/tests/runtime.rs +1 -0
  52. package/contracts/macro-integration-tests/tests/ui/oapp/fail/custom_wrong_value.rs +8 -0
  53. package/contracts/macro-integration-tests/tests/ui/oapp/fail/custom_wrong_value.stderr +5 -0
  54. package/contracts/macro-integration-tests/tests/ui/oapp/fail/missing_lz_receive_internal.rs +8 -0
  55. package/contracts/macro-integration-tests/tests/ui/oapp/fail/missing_lz_receive_internal.stderr +71 -0
  56. package/contracts/macro-integration-tests/tests/ui/oapp/fail/non_struct_input.rs +10 -0
  57. package/contracts/macro-integration-tests/tests/ui/oapp/fail/non_struct_input.stderr +5 -0
  58. package/contracts/macro-integration-tests/tests/ui/oapp/fail/unknown_custom_option.rs +8 -0
  59. package/contracts/macro-integration-tests/tests/ui/oapp/fail/unknown_custom_option.stderr +5 -0
  60. package/contracts/macro-integration-tests/tests/ui/oapp/fail/wrong_key.rs +8 -0
  61. package/contracts/macro-integration-tests/tests/ui/oapp/fail/wrong_key.stderr +5 -0
  62. package/contracts/macro-integration-tests/tests/ui/oapp/pass/custom_all.rs +38 -0
  63. package/contracts/macro-integration-tests/tests/ui/oapp/pass/custom_single_trait.rs +96 -0
  64. package/contracts/macro-integration-tests/tests/ui/oapp/pass/minimal_contract.rs +64 -0
  65. package/contracts/macro-integration-tests/tests/ui/oapp/pass/struct_with_fields.rs +46 -0
  66. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.stderr +8 -0
  67. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +1 -1
  68. package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_auth_env_param_variants.rs +1 -1
  69. package/contracts/macro-integration-tests/tests/ui_oapp.rs +11 -0
  70. package/contracts/message-libs/message-lib-common/Cargo.toml +0 -1
  71. package/contracts/message-libs/message-lib-common/src/errors.rs +1 -1
  72. package/contracts/message-libs/treasury/Cargo.toml +0 -2
  73. package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +2 -2
  74. package/contracts/message-libs/uln-302/src/events.rs +4 -0
  75. package/contracts/message-libs/uln-302/src/send_uln.rs +22 -6
  76. package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +2 -2
  77. package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +2 -2
  78. package/contracts/message-libs/uln-302/src/tests/receive_uln302/verify.rs +2 -2
  79. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_executor_config.rs +2 -2
  80. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +2 -2
  81. package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +21 -67
  82. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +2 -2
  83. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +2 -2
  84. package/contracts/oapps/counter/Cargo.toml +5 -6
  85. package/contracts/oapps/counter/integration_tests/setup_uln.rs +1 -1
  86. package/contracts/oapps/counter/integration_tests/utils.rs +19 -12
  87. package/contracts/oapps/oapp/src/errors.rs +1 -1
  88. package/contracts/oapps/oapp/src/interfaces/mod.rs +3 -0
  89. package/contracts/oapps/oapp/src/interfaces/oapp_msg_inspector.rs +47 -0
  90. package/contracts/oapps/oapp/src/lib.rs +1 -0
  91. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +4 -4
  92. package/contracts/oapps/oapp/src/oapp_core.rs +5 -5
  93. package/contracts/oapps/oapp/src/oapp_options_type3.rs +12 -4
  94. package/contracts/oapps/oapp/src/oapp_receiver.rs +14 -9
  95. package/contracts/oapps/oapp/src/tests/mod.rs +4 -4
  96. package/contracts/oapps/oapp/src/tests/oapp_core.rs +223 -0
  97. package/contracts/oapps/oapp/src/tests/oapp_options_type3.rs +240 -0
  98. package/contracts/oapps/oapp/src/tests/oapp_receiver.rs +381 -0
  99. package/contracts/oapps/oapp/src/tests/oapp_sender.rs +569 -0
  100. package/contracts/oapps/oapp-macros/Cargo.toml +8 -4
  101. package/contracts/oapps/oapp-macros/src/generators.rs +9 -34
  102. package/contracts/oapps/oapp-macros/src/lib.rs +3 -0
  103. package/contracts/oapps/oapp-macros/src/tests/mod.rs +2 -0
  104. package/contracts/oapps/oapp-macros/src/tests/oapp.rs +88 -0
  105. package/contracts/oapps/oapp-macros/src/tests/parse_custom_impls.rs +86 -0
  106. package/contracts/oapps/oapp-macros/src/tests/snapshots/oapp_macros__tests__oapp__snapshot_generate_oapp.snap +103 -0
  107. package/contracts/oapps/oft/integration-tests/utils.rs +28 -8
  108. package/contracts/oapps/oft/src/extensions/oft_fee.rs +153 -75
  109. package/contracts/oapps/oft/src/extensions/pausable.rs +61 -12
  110. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +198 -134
  111. package/contracts/oapps/oft/src/oft.rs +45 -50
  112. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +1 -1
  113. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +4 -26
  114. package/contracts/oapps/oft-core/Cargo.toml +1 -4
  115. package/contracts/oapps/oft-core/integration-tests/setup.rs +3 -3
  116. package/contracts/oapps/oft-core/integration-tests/utils.rs +21 -3
  117. package/contracts/oapps/oft-core/src/errors.rs +3 -2
  118. package/contracts/oapps/oft-core/src/events.rs +6 -0
  119. package/contracts/oapps/oft-core/src/lib.rs +1 -1
  120. package/contracts/oapps/oft-core/src/oft_core.rs +341 -246
  121. package/contracts/oapps/oft-core/src/storage.rs +7 -3
  122. package/contracts/oapps/oft-core/src/tests/mod.rs +1 -0
  123. package/contracts/oapps/oft-core/src/tests/test_decimals.rs +37 -2
  124. package/contracts/oapps/oft-core/src/tests/test_lz_receive.rs +2 -2
  125. package/contracts/oapps/oft-core/src/tests/test_msg_inspector.rs +323 -0
  126. package/contracts/oapps/oft-core/src/tests/test_send.rs +2 -2
  127. package/contracts/oapps/oft-core/src/tests/test_utils.rs +61 -16
  128. package/contracts/upgrader/src/lib.rs +30 -57
  129. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract1.wasm +0 -0
  130. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract2.wasm +0 -0
  131. package/contracts/upgrader/src/tests/test_upgrader.rs +44 -35
  132. package/contracts/utils/Cargo.toml +0 -1
  133. package/contracts/utils/src/buffer_reader.rs +1 -0
  134. package/contracts/utils/src/errors.rs +4 -2
  135. package/contracts/utils/src/multisig.rs +17 -8
  136. package/contracts/utils/src/ownable.rs +6 -6
  137. package/contracts/utils/src/testing_utils.rs +124 -54
  138. package/contracts/utils/src/tests/multisig.rs +12 -12
  139. package/contracts/utils/src/tests/ownable.rs +6 -6
  140. package/contracts/utils/src/tests/testing_utils.rs +50 -167
  141. package/contracts/utils/src/tests/ttl_configurable.rs +5 -5
  142. package/contracts/utils/src/tests/upgradeable.rs +372 -175
  143. package/contracts/utils/src/ttl_configurable.rs +13 -7
  144. package/contracts/utils/src/upgradeable.rs +48 -23
  145. package/contracts/workers/dvn/Cargo.toml +6 -6
  146. package/contracts/workers/dvn/src/auth.rs +12 -42
  147. package/contracts/workers/dvn/src/dvn.rs +15 -40
  148. package/contracts/workers/dvn/src/errors.rs +0 -1
  149. package/contracts/workers/dvn/src/interfaces/dvn.rs +35 -0
  150. package/contracts/workers/dvn/src/lib.rs +4 -3
  151. package/contracts/workers/dvn/src/tests/auth.rs +1 -1
  152. package/contracts/workers/dvn/src/tests/dvn.rs +19 -15
  153. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +2 -4
  154. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +1 -3
  155. package/contracts/workers/dvn/src/tests/setup.rs +5 -9
  156. package/contracts/workers/dvn-fee-lib/Cargo.toml +2 -2
  157. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +38 -22
  158. package/contracts/workers/dvn-fee-lib/src/lib.rs +12 -2
  159. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +17 -16
  160. package/contracts/workers/executor/Cargo.toml +4 -0
  161. package/contracts/workers/executor/src/executor.rs +15 -36
  162. package/contracts/workers/executor/src/lib.rs +2 -2
  163. package/contracts/workers/executor/src/tests/auth.rs +394 -0
  164. package/contracts/workers/executor/src/tests/executor.rs +410 -0
  165. package/contracts/workers/executor/src/tests/mod.rs +3 -0
  166. package/contracts/workers/executor/src/tests/setup.rs +250 -0
  167. package/contracts/workers/executor-fee-lib/Cargo.toml +7 -1
  168. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +62 -15
  169. package/contracts/workers/executor-fee-lib/src/executor_option.rs +28 -1
  170. package/contracts/workers/executor-fee-lib/src/lib.rs +11 -2
  171. package/contracts/workers/executor-fee-lib/src/tests/executor_fee_lib.rs +701 -0
  172. package/contracts/workers/executor-fee-lib/src/tests/executor_option.rs +370 -0
  173. package/contracts/workers/executor-fee-lib/src/tests/mod.rs +4 -0
  174. package/contracts/workers/executor-fee-lib/src/tests/setup.rs +60 -0
  175. package/contracts/workers/executor-helper/Cargo.toml +0 -1
  176. package/contracts/workers/executor-helper/src/lib.rs +3 -0
  177. package/contracts/workers/executor-helper/src/tests/executor_helper.rs +184 -0
  178. package/contracts/workers/executor-helper/src/tests/mod.rs +2 -0
  179. package/contracts/workers/executor-helper/src/tests/setup.rs +366 -0
  180. package/contracts/workers/fee-lib-interfaces/Cargo.toml +14 -0
  181. package/contracts/workers/{worker/src/interfaces/mod.rs → fee-lib-interfaces/src/lib.rs} +4 -3
  182. package/contracts/workers/price-feed/Cargo.toml +7 -1
  183. package/contracts/workers/price-feed/src/events.rs +1 -1
  184. package/contracts/workers/price-feed/src/lib.rs +12 -4
  185. package/contracts/workers/price-feed/src/price_feed.rs +5 -21
  186. package/contracts/workers/price-feed/src/storage.rs +1 -1
  187. package/contracts/workers/price-feed/src/tests/mod.rs +2 -0
  188. package/contracts/workers/price-feed/src/tests/price_feed.rs +869 -0
  189. package/contracts/workers/price-feed/src/tests/setup.rs +70 -0
  190. package/contracts/workers/price-feed/src/types.rs +1 -1
  191. package/contracts/workers/worker/src/errors.rs +1 -4
  192. package/contracts/workers/worker/src/lib.rs +0 -2
  193. package/contracts/workers/worker/src/storage.rs +32 -29
  194. package/contracts/workers/worker/src/tests/setup.rs +2 -8
  195. package/contracts/workers/worker/src/tests/worker.rs +96 -74
  196. package/contracts/workers/worker/src/worker.rs +75 -75
  197. package/docs/error-spec.md +55 -0
  198. package/docs/layerzero-v2-on-stellar.md +447 -0
  199. package/docs/oapp-guide.md +212 -0
  200. package/docs/oft-guide.md +314 -0
  201. package/package.json +3 -3
  202. package/sdk/.turbo/turbo-test.log +268 -263
  203. package/sdk/dist/generated/bml.d.ts +12 -4
  204. package/sdk/dist/generated/bml.js +9 -7
  205. package/sdk/dist/generated/counter.d.ts +306 -298
  206. package/sdk/dist/generated/counter.js +48 -46
  207. package/sdk/dist/generated/dvn.d.ts +450 -411
  208. package/sdk/dist/generated/dvn.js +66 -64
  209. package/sdk/dist/generated/dvn_fee_lib.d.ts +294 -338
  210. package/sdk/dist/generated/dvn_fee_lib.js +33 -64
  211. package/sdk/dist/generated/endpoint.d.ts +108 -100
  212. package/sdk/dist/generated/endpoint.js +21 -19
  213. package/sdk/dist/generated/executor.d.ts +414 -370
  214. package/sdk/dist/generated/executor.js +58 -55
  215. package/sdk/dist/generated/executor_fee_lib.d.ts +333 -377
  216. package/sdk/dist/generated/executor_fee_lib.js +34 -65
  217. package/sdk/dist/generated/executor_helper.d.ts +26 -190
  218. package/sdk/dist/generated/executor_helper.js +23 -28
  219. package/sdk/dist/generated/layerzero_view.d.ts +1271 -0
  220. package/sdk/dist/generated/layerzero_view.js +294 -0
  221. package/sdk/dist/generated/oft.d.ts +408 -385
  222. package/sdk/dist/generated/oft.js +89 -92
  223. package/sdk/dist/generated/price_feed.d.ts +385 -429
  224. package/sdk/dist/generated/price_feed.js +50 -81
  225. package/sdk/dist/generated/sml.d.ts +108 -100
  226. package/sdk/dist/generated/sml.js +21 -19
  227. package/sdk/dist/generated/treasury.d.ts +108 -100
  228. package/sdk/dist/generated/treasury.js +21 -19
  229. package/sdk/dist/generated/uln302.d.ts +108 -100
  230. package/sdk/dist/generated/uln302.js +23 -21
  231. package/sdk/dist/generated/upgrader.d.ts +189 -18
  232. package/sdk/dist/generated/upgrader.js +84 -4
  233. package/sdk/dist/index.d.ts +1 -0
  234. package/sdk/dist/index.js +2 -0
  235. package/sdk/package.json +1 -1
  236. package/sdk/src/index.ts +3 -0
  237. package/sdk/test/oft-sml.test.ts +4 -4
  238. package/sdk/test/suites/localnet.ts +84 -20
  239. package/sdk/test/upgrader.test.ts +2 -3
  240. package/tools/ts-bindings-gen/src/main.rs +2 -1
  241. package/contracts/ERROR_SPEC.md +0 -44
  242. package/contracts/endpoint-v2/ARCHITECTURE.md +0 -233
  243. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +0 -175
  244. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +0 -212
  245. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +0 -153
  246. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +0 -294
  247. /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/dvn_fee_lib.rs +0 -0
  248. /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/executor_fee_lib.rs +0 -0
  249. /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/price_feed.rs +0 -0
@@ -3,7 +3,7 @@ use soroban_sdk::{
3
3
  testutils::{Address as _, MockAuth, MockAuthInvoke},
4
4
  vec, Address, IntoVal,
5
5
  };
6
- use utils::testing_utils::assert_event;
6
+ use utils::testing_utils::assert_eq_event;
7
7
 
8
8
  use crate::{
9
9
  errors::Uln302Error,
@@ -44,7 +44,7 @@ fn test_set_default_executor_configs() {
44
44
  uln302.set_default_executor_configs(&executor_configs);
45
45
 
46
46
  // Assert DefaultExecutorConfigSet event was published with all params
47
- assert_event(&env, &uln302.address, DefaultExecutorConfigsSet { params: executor_configs.clone() });
47
+ assert_eq_event(&env, &uln302.address, DefaultExecutorConfigsSet { params: executor_configs.clone() });
48
48
 
49
49
  let uln302_send_client = SendUln302Client::new(&env, &uln302.address);
50
50
  for config_param in executor_configs.clone() {
@@ -3,7 +3,7 @@ use soroban_sdk::{
3
3
  testutils::{MockAuth, MockAuthInvoke},
4
4
  vec, IntoVal,
5
5
  };
6
- use utils::testing_utils::assert_event;
6
+ use utils::testing_utils::assert_eq_event;
7
7
 
8
8
  use crate::{
9
9
  errors::Uln302Error,
@@ -34,7 +34,7 @@ fn test_set_default_send_uln_configs() {
34
34
  uln302.set_default_send_uln_configs(&oapp_send_uln_configs);
35
35
 
36
36
  // Assert DefaultSendUlnConfigSet event was published with all params
37
- assert_event(&env, &uln302.address, DefaultSendUlnConfigsSet { params: oapp_send_uln_configs.clone() });
37
+ assert_eq_event(&env, &uln302.address, DefaultSendUlnConfigsSet { params: oapp_send_uln_configs.clone() });
38
38
 
39
39
  let uln302_send_client = SendUln302Client::new(&env, &uln302.address);
40
40
  for config in oapp_send_uln_configs.clone() {
@@ -18,7 +18,6 @@ oapp-macros = { workspace = true }
18
18
 
19
19
  [dev-dependencies]
20
20
  soroban-sdk = { workspace = true, features = ["testutils"] }
21
- assert_unordered = "0.3.5"
22
21
  simple-message-lib = { workspace = true }
23
22
  message-lib-common = { workspace = true, features = ["testutils"] }
24
23
  endpoint-v2 = { workspace = true, features = ["testutils"] }
@@ -27,12 +26,12 @@ uln302 = { workspace = true, features = ["testutils"] }
27
26
  dvn = { workspace = true, features = ["testutils"] }
28
27
  dvn-fee-lib = { workspace = true }
29
28
  executor-fee-lib = { workspace = true }
30
- worker = { workspace = true }
31
29
  treasury = { workspace = true, features = ["testutils"] }
32
30
  price-feed = { workspace = true }
31
+ fee-lib-interfaces = { workspace = true }
33
32
  executor-helper = { workspace = true }
34
33
  # For real DVN signature verification in integration tests
35
- k256 = "0.13"
36
- sha3 = "0.10"
37
- rand = "0.8"
38
- ed25519-dalek = "2"
34
+ k256 = { workspace = true }
35
+ sha3 = { workspace = true }
36
+ rand = { workspace = true }
37
+ ed25519-dalek = { workspace = true }
@@ -13,6 +13,7 @@ use endpoint_v2::{EndpointV2, EndpointV2Client};
13
13
  use executor::{DstConfig as ExecutorDstConfig, ExecutorClient, LzExecutor, SetDstConfigParam};
14
14
  use executor_fee_lib::ExecutorFeeLib;
15
15
  use executor_helper::{ExecutorHelper, ExecutorHelperClient};
16
+ use fee_lib_interfaces::Price;
16
17
  use price_feed::{types::UpdatePrice, LzPriceFeed};
17
18
  use soroban_sdk::{
18
19
  testutils::{Address as _, MockAuth, MockAuthInvoke},
@@ -25,7 +26,6 @@ use uln302::{
25
26
  Uln302, Uln302Client, UlnConfig,
26
27
  };
27
28
  use utils::{buffer_reader::BufferReader, buffer_writer::BufferWriter};
28
- use worker::Price;
29
29
 
30
30
  pub const CONFIRMATIONS: u64 = 1;
31
31
  pub const MAX_MESSAGE_SIZE: u32 = 10000;
@@ -11,6 +11,7 @@ use soroban_sdk::{
11
11
  Address, Bytes, BytesN, Env, IntoVal, Map, Symbol, Val, Vec,
12
12
  };
13
13
  use utils::buffer_reader::BufferReader;
14
+ use utils::testing_utils::decode_event_topics_data;
14
15
 
15
16
  /// Trait for common fields in chain setup structs.
16
17
  /// Both SML and ULN302 ChainSetup implement this trait.
@@ -215,13 +216,15 @@ pub fn validate_packet<'a, C: ChainSetupCommon<'a>>(
215
216
 
216
217
  /// Scans for the latest packet_sent event and returns (encoded_payload, options, send_library).
217
218
  pub fn scan_packet_sent_event(env: &Env, endpoint: &Address) -> Option<(Bytes, Bytes, Address)> {
218
- let events = env.events().all();
219
+ let events = env.events().all().filter_by_contract(endpoint);
219
220
  let packet_sent_symbol = Symbol::new(env, "packet_sent").to_val();
220
221
 
221
222
  // Iterate in reverse to find the most recent packet sent event
222
- for i in (0..events.len()).rev() {
223
- let (emitter, topics, data) = events.get(i).unwrap();
224
- if emitter == *endpoint && topics.contains(packet_sent_symbol) {
223
+ for event in events.events().iter().rev() {
224
+ let Some((topics, data)) = decode_event_topics_data(env, event) else {
225
+ continue;
226
+ };
227
+ if topics.contains(packet_sent_symbol) {
225
228
  let map: Map<Symbol, Val> = data.into_val(env);
226
229
 
227
230
  let encoded_payload: Bytes = map.get(Symbol::new(env, "encoded_packet")).unwrap().into_val(env);
@@ -240,13 +243,15 @@ pub fn scan_packet_sent_event(env: &Env, endpoint: &Address) -> Option<(Bytes, B
240
243
  /// Use this only after all messages have been sent in a single "transaction" or collect events incrementally.
241
244
  #[allow(dead_code)]
242
245
  pub fn scan_all_packet_sent_events(env: &Env, endpoint: &Address) -> Vec<(Bytes, Bytes, Address)> {
243
- let events = env.events().all();
246
+ let events = env.events().all().filter_by_contract(endpoint);
244
247
  let packet_sent_symbol = Symbol::new(env, "packet_sent").to_val();
245
248
  let mut result = Vec::new(env);
246
249
 
247
- for i in 0..events.len() {
248
- let (emitter, topics, data) = events.get(i).unwrap();
249
- if emitter == *endpoint && topics.contains(packet_sent_symbol) {
250
+ for event in events.events().iter() {
251
+ let Some((topics, data)) = decode_event_topics_data(env, event) else {
252
+ continue;
253
+ };
254
+ if topics.contains(packet_sent_symbol) {
250
255
  let map: Map<Symbol, Val> = data.into_val(env);
251
256
 
252
257
  let encoded_payload: Bytes = map.get(Symbol::new(env, "encoded_packet")).unwrap().into_val(env);
@@ -265,13 +270,15 @@ pub type ComposeSentEvent = (Address, Address, BytesN<32>, u32, Bytes);
265
270
 
266
271
  /// Scans for the latest compose_sent event and returns (from, to, guid, index, message).
267
272
  pub fn scan_compose_sent_event(env: &Env, endpoint: &Address) -> Option<ComposeSentEvent> {
268
- let events = env.events().all();
273
+ let events = env.events().all().filter_by_contract(endpoint);
269
274
  let compose_sent_symbol = Symbol::new(env, "compose_sent").to_val();
270
275
 
271
276
  // Iterate in reverse to find the most recent compose sent event
272
- for i in (0..events.len()).rev() {
273
- let (emitter, topics, data) = events.get(i).unwrap();
274
- if emitter == *endpoint && topics.contains(compose_sent_symbol) {
277
+ for event in events.events().iter().rev() {
278
+ let Some((topics, data)) = decode_event_topics_data(env, event) else {
279
+ continue;
280
+ };
281
+ if topics.contains(compose_sent_symbol) {
275
282
  let map: Map<Symbol, Val> = data.into_val(env);
276
283
  let from: Address = topics.get(1).unwrap().into_val(env);
277
284
  let to: Address = topics.get(2).unwrap().into_val(env);
@@ -1,7 +1,7 @@
1
1
  use common_macros::contract_error;
2
2
 
3
3
  // OApp library error codes: 2000-2099
4
- // See ERROR_SPEC.md for allocation rules
4
+ // See docs/error-spec.md for allocation rules
5
5
 
6
6
  /// OAppError: 2000-2099
7
7
  #[contract_error]
@@ -0,0 +1,3 @@
1
+ mod oapp_msg_inspector;
2
+
3
+ pub use oapp_msg_inspector::*;
@@ -0,0 +1,47 @@
1
+ //! OApp Message Inspector interface.
2
+ //!
3
+ //! This module defines the `IOAppMsgInspector` trait that external inspector contracts
4
+ //! must implement to validate outgoing LayerZero messages and options.
5
+ //!
6
+ //! ## Usage
7
+ //!
8
+ //! Inspector contracts should implement this trait and panic if inspection fails:
9
+ //!
10
+ //! ```ignore
11
+ //! use oapp::interfaces::IOAppMsgInspector;
12
+ //!
13
+ //! pub struct MyInspector;
14
+ //!
15
+ //! #[contractimpl]
16
+ //! impl IOAppMsgInspector for MyInspector {
17
+ //! fn inspect(env: &Env, oapp: &Address, message: &Bytes, options: &Bytes) {
18
+ //! // Validate message and options
19
+ //! // Panic if invalid
20
+ //! if !is_valid(message, options) {
21
+ //! panic_with_error!(env, MyError::InspectionFailed);
22
+ //! }
23
+ //! }
24
+ //! }
25
+ //! ```
26
+
27
+ use soroban_sdk::{contractclient, Address, Bytes, Env};
28
+
29
+ /// Interface for OApp message inspectors.
30
+ ///
31
+ /// Contracts implementing this trait can be set as message inspectors on OFT contracts
32
+ /// to validate outgoing messages and options before they are sent cross-chain.
33
+ ///
34
+ /// If inspection fails, the implementation should panic to revert the transaction.
35
+ #[contractclient(name = "OAppMsgInspectorClient")]
36
+ pub trait IOAppMsgInspector {
37
+ /// Inspects the LayerZero message and options before sending.
38
+ ///
39
+ /// # Arguments
40
+ /// * `oapp` - The address of the OApp contract sending the message
41
+ /// * `message` - The encoded message payload to be sent
42
+ /// * `options` - The LayerZero options for the message
43
+ ///
44
+ /// # Panics
45
+ /// Should panic if the message or options are invalid, reverting the transaction.
46
+ fn inspect(env: &Env, oapp: &Address, message: &Bytes, options: &Bytes);
47
+ }
@@ -1,6 +1,7 @@
1
1
  #![no_std]
2
2
 
3
3
  pub mod errors;
4
+ pub mod interfaces;
4
5
  pub mod oapp_core;
5
6
  pub mod oapp_options_type3;
6
7
  pub mod oapp_receiver;
@@ -149,10 +149,10 @@ mod test_full_manual_options {
149
149
  extern crate self as oapp;
150
150
 
151
151
  use endpoint_v2::Origin;
152
- use oapp::oapp_options_type3::{EnforcedOptionParam, OAppOptionsType3};
152
+ use oapp::oapp_options_type3::OAppOptionsType3;
153
153
  use oapp::oapp_receiver::LzReceiveInternal;
154
154
  use oapp_macros::oapp;
155
- use soroban_sdk::{contractimpl, Address, Bytes, BytesN, Env, Vec};
155
+ use soroban_sdk::{contractimpl, Address, Bytes, BytesN, Env};
156
156
 
157
157
  #[oapp(custom = [options_type3])]
158
158
  struct TestFullManualOptions;
@@ -354,12 +354,12 @@ mod test_full_manual_all {
354
354
  use endpoint_v2::Origin;
355
355
  use oapp::{
356
356
  oapp_core::OAppCore,
357
- oapp_options_type3::{EnforcedOptionParam, OAppOptionsType3},
357
+ oapp_options_type3::OAppOptionsType3,
358
358
  oapp_receiver::{LzReceiveInternal, OAppReceiver},
359
359
  oapp_sender::OAppSenderInternal,
360
360
  };
361
361
  use oapp_macros::oapp;
362
- use soroban_sdk::{contractimpl, Address, Bytes, BytesN, Env, Vec};
362
+ use soroban_sdk::{contractimpl, Address, Bytes, BytesN, Env};
363
363
 
364
364
  #[oapp(custom = [core, sender, receiver, options_type3])]
365
365
  struct TestFullManualAll;
@@ -57,7 +57,7 @@ pub trait OAppCore: Ownable {
57
57
  /// A tuple containing:
58
58
  /// - `sender_version`: The version of the OAppSender
59
59
  /// - `receiver_version`: The version of the OAppReceiver
60
- fn oapp_version(_env: &Env) -> (u64, u64) {
60
+ fn oapp_version(_env: &soroban_sdk::Env) -> (u64, u64) {
61
61
  (1, 1)
62
62
  }
63
63
 
@@ -65,7 +65,7 @@ pub trait OAppCore: Ownable {
65
65
  ///
66
66
  /// # Returns
67
67
  /// The LayerZero endpoint address
68
- fn endpoint(env: &Env) -> Address {
68
+ fn endpoint(env: &soroban_sdk::Env) -> soroban_sdk::Address {
69
69
  OAppCoreStorage::endpoint(env).unwrap()
70
70
  }
71
71
 
@@ -76,7 +76,7 @@ pub trait OAppCore: Ownable {
76
76
  ///
77
77
  /// # Returns
78
78
  /// The peer address (OApp instance) associated with the corresponding endpoint
79
- fn peer(env: &Env, eid: u32) -> Option<BytesN<32>> {
79
+ fn peer(env: &soroban_sdk::Env, eid: u32) -> Option<soroban_sdk::BytesN<32>> {
80
80
  OAppCoreStorage::peer(env, eid)
81
81
  }
82
82
 
@@ -86,7 +86,7 @@ pub trait OAppCore: Ownable {
86
86
  /// * `eid` - The endpoint ID
87
87
  /// * `peer` - The address of the peer to be associated with the corresponding endpoint, or None to remove the peer
88
88
  #[only_auth]
89
- fn set_peer(env: &Env, eid: u32, peer: &Option<BytesN<32>>) {
89
+ fn set_peer(env: &soroban_sdk::Env, eid: u32, peer: &Option<soroban_sdk::BytesN<32>>) {
90
90
  OAppCoreStorage::set_or_remove_peer(env, eid, peer);
91
91
  PeerSet { eid, peer: peer.clone() }.publish(env);
92
92
  }
@@ -96,7 +96,7 @@ pub trait OAppCore: Ownable {
96
96
  /// # Arguments
97
97
  /// * `delegate` - The address of the delegate to be set, or None to remove the delegate
98
98
  #[only_auth]
99
- fn set_delegate(env: &Env, delegate: &Option<Address>) {
99
+ fn set_delegate(env: &soroban_sdk::Env, delegate: &Option<soroban_sdk::Address>) {
100
100
  endpoint_client::<Self>(env).set_delegate(&env.current_contract_address(), delegate);
101
101
  }
102
102
  }
@@ -1,4 +1,4 @@
1
- use crate::errors::OAppError;
1
+ use crate::{self as oapp, errors::OAppError};
2
2
  use common_macros::{contract_trait, only_auth, storage};
3
3
  use soroban_sdk::{assert_with_error, contractevent, contracttype, panic_with_error, Bytes, Env, Vec};
4
4
  use utils::{buffer_reader::BufferReader, ownable::Ownable};
@@ -40,7 +40,7 @@ pub trait OAppOptionsType3: Ownable {
40
40
  ///
41
41
  /// # Returns
42
42
  /// The enforced options for the given endpoint and message type
43
- fn enforced_options(env: &Env, eid: u32, msg_type: u32) -> Bytes {
43
+ fn enforced_options(env: &soroban_sdk::Env, eid: u32, msg_type: u32) -> soroban_sdk::Bytes {
44
44
  OAppOptionsType3Storage::enforced_options(env, eid, msg_type)
45
45
  }
46
46
 
@@ -55,7 +55,10 @@ pub trait OAppOptionsType3: Ownable {
55
55
  /// # Arguments
56
56
  /// * `options` - A vector of EnforcedOptionParam structures specifying enforced options
57
57
  #[only_auth]
58
- fn set_enforced_options(env: &Env, options: Vec<EnforcedOptionParam>) {
58
+ fn set_enforced_options(
59
+ env: &soroban_sdk::Env,
60
+ options: soroban_sdk::Vec<oapp::oapp_options_type3::EnforcedOptionParam>,
61
+ ) {
59
62
  for option in &options {
60
63
  assert_option_type3(env, &option.options);
61
64
  OAppOptionsType3Storage::set_enforced_options(env, option.eid, option.msg_type, &option.options);
@@ -77,7 +80,12 @@ pub trait OAppOptionsType3: Ownable {
77
80
  ///
78
81
  /// # Returns
79
82
  /// The combination of caller specified options AND enforced options
80
- fn combine_options(env: &Env, eid: u32, msg_type: u32, extra_options: &Bytes) -> Bytes {
83
+ fn combine_options(
84
+ env: &soroban_sdk::Env,
85
+ eid: u32,
86
+ msg_type: u32,
87
+ extra_options: &soroban_sdk::Bytes,
88
+ ) -> soroban_sdk::Bytes {
81
89
  let mut enforced_options = Self::enforced_options(env, eid, msg_type);
82
90
 
83
91
  if enforced_options.is_empty() {
@@ -78,7 +78,7 @@ pub trait OAppReceiver: OAppCore + LzReceiveInternal {
78
78
  ///
79
79
  /// # Returns
80
80
  /// True if the path can be initialized, false otherwise
81
- fn allow_initialize_path(env: &Env, origin: &Origin) -> bool {
81
+ fn allow_initialize_path(env: &soroban_sdk::Env, origin: &endpoint_v2::Origin) -> bool {
82
82
  let peer = Self::peer(env, origin.src_eid);
83
83
  peer.is_some_and(|peer| peer == origin.sender)
84
84
  }
@@ -96,7 +96,7 @@ pub trait OAppReceiver: OAppCore + LzReceiveInternal {
96
96
  ///
97
97
  /// # Returns
98
98
  /// The next nonce
99
- fn next_nonce(_env: &Env, _src_eid: u32, _sender: &BytesN<32>) -> u64 {
99
+ fn next_nonce(_env: &soroban_sdk::Env, _src_eid: u32, _sender: &soroban_sdk::BytesN<32>) -> u64 {
100
100
  0
101
101
  }
102
102
 
@@ -116,12 +116,12 @@ pub trait OAppReceiver: OAppCore + LzReceiveInternal {
116
116
  /// * `extra_data` - Additional arbitrary data provided by the corresponding executor
117
117
  /// * `value` - The native token value sent with the message
118
118
  fn lz_receive(
119
- env: &Env,
120
- executor: &Address,
121
- origin: &Origin,
122
- guid: &BytesN<32>,
123
- message: &Bytes,
124
- extra_data: &Bytes,
119
+ env: &soroban_sdk::Env,
120
+ executor: &soroban_sdk::Address,
121
+ origin: &endpoint_v2::Origin,
122
+ guid: &soroban_sdk::BytesN<32>,
123
+ message: &soroban_sdk::Bytes,
124
+ extra_data: &soroban_sdk::Bytes,
125
125
  value: i128,
126
126
  ) {
127
127
  clear_payload_and_transfer::<Self>(env, executor, origin, guid, message, value);
@@ -140,7 +140,12 @@ pub trait OAppReceiver: OAppCore + LzReceiveInternal {
140
140
  ///
141
141
  /// # Returns
142
142
  /// True if the sender is a valid composeMsg sender, false otherwise
143
- fn is_compose_msg_sender(env: &Env, _origin: &Origin, _message: &Bytes, sender: &Address) -> bool {
143
+ fn is_compose_msg_sender(
144
+ env: &soroban_sdk::Env,
145
+ _origin: &endpoint_v2::Origin,
146
+ _message: &soroban_sdk::Bytes,
147
+ sender: &soroban_sdk::Address,
148
+ ) -> bool {
144
149
  env.current_contract_address() == *sender
145
150
  }
146
151
  }
@@ -1,4 +1,4 @@
1
- mod test_oapp_core;
2
- mod test_oapp_options_type3;
3
- mod test_oapp_receiver;
4
- mod test_oapp_sender;
1
+ mod oapp_core;
2
+ mod oapp_options_type3;
3
+ mod oapp_receiver;
4
+ mod oapp_sender;
@@ -0,0 +1,223 @@
1
+ use crate::{self as oapp, oapp_core::PeerSet, oapp_receiver::LzReceiveInternal};
2
+ use endpoint_v2::Origin;
3
+ use soroban_sdk::{
4
+ contract, contractimpl, contracttype,
5
+ testutils::{Address as _, MockAuth, MockAuthInvoke},
6
+ Address, Bytes, BytesN, Env, IntoVal,
7
+ };
8
+ use utils::testing_utils::assert_eq_event;
9
+
10
+ #[contract]
11
+ pub struct DummyEndpoint;
12
+
13
+ #[derive(Clone)]
14
+ #[contracttype]
15
+ enum DummyEndpointDataKey {
16
+ Delegate(Address),
17
+ }
18
+
19
+ #[contractimpl]
20
+ impl DummyEndpoint {
21
+ pub fn set_delegate(env: Env, oapp: &Address, delegate: &Option<Address>) {
22
+ let key = DummyEndpointDataKey::Delegate(oapp.clone());
23
+ match delegate {
24
+ Some(d) => env.storage().persistent().set(&key, d),
25
+ None => env.storage().persistent().remove(&key),
26
+ }
27
+ }
28
+
29
+ pub fn get_delegate(env: Env, oapp: Address) -> Option<Address> {
30
+ env.storage().persistent().get(&DummyEndpointDataKey::Delegate(oapp))
31
+ }
32
+ }
33
+
34
+ #[oapp_macros::oapp]
35
+ pub struct DummyOApp;
36
+
37
+ impl LzReceiveInternal for DummyOApp {
38
+ fn __lz_receive(
39
+ _env: &Env,
40
+ _origin: &Origin,
41
+ _guid: &BytesN<32>,
42
+ _message: &Bytes,
43
+ _extra_data: &Bytes,
44
+ _executor: &Address,
45
+ _value: i128,
46
+ ) {
47
+ // Not used in core tests
48
+ }
49
+ }
50
+
51
+ #[contractimpl]
52
+ impl DummyOApp {
53
+ pub fn __constructor(env: &Env, owner: &Address, endpoint: &Address) {
54
+ oapp::oapp_core::initialize_oapp::<Self>(env, owner, endpoint, &None);
55
+ }
56
+ }
57
+
58
+ const REMOTE_EID: u32 = 100;
59
+ const UNSET_EID: u32 = 999;
60
+
61
+ struct TestSetup<'a> {
62
+ env: Env,
63
+ owner: Address,
64
+ endpoint: Address,
65
+ oapp_client: DummyOAppClient<'a>,
66
+ }
67
+
68
+ fn setup<'a>() -> TestSetup<'a> {
69
+ let env = Env::default();
70
+
71
+ let owner = Address::generate(&env);
72
+ soroban_sdk::log!(&env, "owner: {}", owner);
73
+ let endpoint = env.register(DummyEndpoint, ());
74
+ soroban_sdk::log!(&env, "endpoint: {}", endpoint);
75
+ let oapp = env.register(DummyOApp, (&owner, &endpoint));
76
+ soroban_sdk::log!(&env, "oapp: {}", oapp);
77
+ let oapp_client = DummyOAppClient::new(&env, &oapp);
78
+ TestSetup { env, owner, endpoint, oapp_client }
79
+ }
80
+
81
+ fn set_peer_with_auth(
82
+ env: &Env,
83
+ signer: &Address,
84
+ oapp_client: &DummyOAppClient<'_>,
85
+ eid: u32,
86
+ peer: &Option<BytesN<32>>,
87
+ ) {
88
+ env.mock_auths(&[MockAuth {
89
+ address: signer,
90
+ invoke: &MockAuthInvoke {
91
+ contract: &oapp_client.address,
92
+ fn_name: "set_peer",
93
+ args: (&eid, peer).into_val(env),
94
+ sub_invokes: &[],
95
+ },
96
+ }]);
97
+ oapp_client.set_peer(&eid, peer);
98
+ }
99
+
100
+ fn set_delegate_with_auth(env: &Env, signer: &Address, oapp_client: &DummyOAppClient<'_>, delegate: &Option<Address>) {
101
+ env.mock_auths(&[MockAuth {
102
+ address: signer,
103
+ invoke: &MockAuthInvoke {
104
+ contract: &oapp_client.address,
105
+ fn_name: "set_delegate",
106
+ args: (delegate,).into_val(env),
107
+ sub_invokes: &[],
108
+ },
109
+ }]);
110
+ oapp_client.set_delegate(delegate);
111
+ }
112
+
113
+ #[test]
114
+ fn test_constructor_initializes_owner_and_endpoint_and_clears_delegate() {
115
+ let TestSetup { env, owner, endpoint, oapp_client } = setup();
116
+
117
+ // owner initialized via oapp_initialize -> init_owner
118
+ assert_eq!(Some(owner), oapp_client.owner());
119
+
120
+ // endpoint stored via OAppCoreStorage::set_endpoint
121
+ assert_eq!(endpoint, oapp_client.endpoint());
122
+
123
+ // delegate set via oapp_initialize(..., &None) -> endpoint.set_delegate(..., None)
124
+ let endpoint_client = DummyEndpointClient::new(&env, &endpoint);
125
+ assert_eq!(None, endpoint_client.get_delegate(&oapp_client.address));
126
+ }
127
+
128
+ #[test]
129
+ fn test_oapp_version_defaults_to_zero() {
130
+ let TestSetup { oapp_client, .. } = setup();
131
+ assert_eq!((1, 1), oapp_client.oapp_version());
132
+ }
133
+
134
+ #[test]
135
+ fn test_peer_lifecycle_set_get_update_remove_and_events() {
136
+ let TestSetup { env, owner, oapp_client, .. } = setup();
137
+
138
+ // Unset cases
139
+ assert_eq!(None, oapp_client.peer(&UNSET_EID));
140
+ assert_eq!(None, oapp_client.peer(&REMOTE_EID));
141
+
142
+ // Set peer v1
143
+ let peer_v1: BytesN<32> = BytesN::from_array(&env, &[33; 32]);
144
+ let peer_v1_option = Some(peer_v1.clone());
145
+ set_peer_with_auth(&env, &owner, &oapp_client, REMOTE_EID, &peer_v1_option);
146
+
147
+ assert_eq_event(&env, &oapp_client.address, PeerSet { eid: REMOTE_EID, peer: Some(peer_v1.clone()) });
148
+ assert_eq!(Some(peer_v1), oapp_client.peer(&REMOTE_EID));
149
+ assert_eq!(None, oapp_client.peer(&UNSET_EID));
150
+
151
+ // Update to peer v2
152
+ let peer_v2: BytesN<32> = BytesN::from_array(&env, &[2; 32]);
153
+ let peer_v2_option = Some(peer_v2.clone());
154
+ set_peer_with_auth(&env, &owner, &oapp_client, REMOTE_EID, &peer_v2_option);
155
+
156
+ assert_eq_event(&env, &oapp_client.address, PeerSet { eid: REMOTE_EID, peer: Some(peer_v2.clone()) });
157
+ assert_eq!(Some(peer_v2), oapp_client.peer(&REMOTE_EID));
158
+
159
+ // Remove peer
160
+ let none_peer: Option<BytesN<32>> = None;
161
+ set_peer_with_auth(&env, &owner, &oapp_client, REMOTE_EID, &none_peer);
162
+ assert_eq_event(&env, &oapp_client.address, PeerSet { eid: REMOTE_EID, peer: None });
163
+ assert_eq!(None, oapp_client.peer(&REMOTE_EID));
164
+ }
165
+
166
+ #[test]
167
+ #[should_panic(expected = "HostError: Error(Auth, InvalidAction)")]
168
+ fn test_set_peer_unauthorized() {
169
+ let TestSetup { env, oapp_client, .. } = setup();
170
+
171
+ let test_peer: BytesN<32> = BytesN::from_array(&env, &[33; 32]);
172
+ oapp_client.set_peer(&REMOTE_EID, &Some(test_peer));
173
+ }
174
+
175
+ #[test]
176
+ #[should_panic(expected = "HostError: Error(Auth, InvalidAction)")]
177
+ fn test_set_peer_non_owner_authorized() {
178
+ let TestSetup { env, owner, oapp_client, .. } = setup();
179
+ let non_owner = Address::generate(&env);
180
+ assert!(non_owner != owner);
181
+
182
+ let peer: BytesN<32> = BytesN::from_array(&env, &[33; 32]);
183
+ let peer_option = Some(peer);
184
+ set_peer_with_auth(&env, &non_owner, &oapp_client, REMOTE_EID, &peer_option);
185
+ }
186
+
187
+ #[test]
188
+ fn test_set_delegate_updates_and_clears_endpoint_delegate() {
189
+ let TestSetup { env, owner, endpoint, oapp_client } = setup();
190
+
191
+ let delegate = Address::generate(&env);
192
+ let delegate_option = Some(delegate.clone());
193
+ set_delegate_with_auth(&env, &owner, &oapp_client, &delegate_option);
194
+
195
+ let endpoint_client = DummyEndpointClient::new(&env, &endpoint);
196
+ assert_eq!(Some(delegate), endpoint_client.get_delegate(&oapp_client.address));
197
+
198
+ // Clear delegate
199
+ let none_delegate: Option<Address> = None;
200
+ set_delegate_with_auth(&env, &owner, &oapp_client, &none_delegate);
201
+ assert_eq!(None, endpoint_client.get_delegate(&oapp_client.address));
202
+ }
203
+
204
+ #[test]
205
+ #[should_panic(expected = "HostError: Error(Auth, InvalidAction)")]
206
+ fn test_set_delegate_unauthorized() {
207
+ let TestSetup { env, oapp_client, .. } = setup();
208
+
209
+ let delegate = Address::generate(&env);
210
+ oapp_client.set_delegate(&Some(delegate));
211
+ }
212
+
213
+ #[test]
214
+ #[should_panic(expected = "HostError: Error(Auth, InvalidAction)")]
215
+ fn test_set_delegate_non_owner_authorized() {
216
+ let TestSetup { env, owner, oapp_client, .. } = setup();
217
+ let non_owner = Address::generate(&env);
218
+ assert!(non_owner != owner);
219
+
220
+ let delegate = Address::generate(&env);
221
+ let delegate_option = Some(delegate);
222
+ set_delegate_with_auth(&env, &non_owner, &oapp_client, &delegate_option);
223
+ }