@layerzerolabs/protocol-stellar-v2 0.2.8

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 (265) hide show
  1. package/.turbo/turbo-build.log +727 -0
  2. package/.turbo/turbo-lint.log +158 -0
  3. package/.turbo/turbo-test.log +796 -0
  4. package/Cargo.lock +2237 -0
  5. package/Cargo.toml +63 -0
  6. package/clippy.toml +7 -0
  7. package/contracts/common-macros/Cargo.toml +20 -0
  8. package/contracts/common-macros/src/error.rs +53 -0
  9. package/contracts/common-macros/src/event.rs +16 -0
  10. package/contracts/common-macros/src/lib.rs +255 -0
  11. package/contracts/common-macros/src/ownable.rs +63 -0
  12. package/contracts/common-macros/src/snapshots/common_macros__tests__tests__snapshot_generated_storage_code.snap +310 -0
  13. package/contracts/common-macros/src/storage.rs +439 -0
  14. package/contracts/common-macros/src/tests.rs +287 -0
  15. package/contracts/common-macros/src/ttl_configurable.rs +60 -0
  16. package/contracts/endpoint-v2/ARCHITECTURE.md +233 -0
  17. package/contracts/endpoint-v2/Cargo.toml +30 -0
  18. package/contracts/endpoint-v2/src/constants.rs +52 -0
  19. package/contracts/endpoint-v2/src/endpoint_v2.rs +305 -0
  20. package/contracts/endpoint-v2/src/errors.rs +29 -0
  21. package/contracts/endpoint-v2/src/events.rs +207 -0
  22. package/contracts/endpoint-v2/src/interfaces/layerzero_composer.rs +26 -0
  23. package/contracts/endpoint-v2/src/interfaces/layerzero_endpoint_v2.rs +170 -0
  24. package/contracts/endpoint-v2/src/interfaces/layerzero_receiver.rs +43 -0
  25. package/contracts/endpoint-v2/src/interfaces/message_lib.rs +62 -0
  26. package/contracts/endpoint-v2/src/interfaces/message_lib_manager.rs +220 -0
  27. package/contracts/endpoint-v2/src/interfaces/messaging_channel.rs +121 -0
  28. package/contracts/endpoint-v2/src/interfaces/messaging_composer.rs +63 -0
  29. package/contracts/endpoint-v2/src/interfaces/mod.rs +17 -0
  30. package/contracts/endpoint-v2/src/interfaces/send_lib.rs +70 -0
  31. package/contracts/endpoint-v2/src/lib.rs +22 -0
  32. package/contracts/endpoint-v2/src/message_lib_manager.rs +315 -0
  33. package/contracts/endpoint-v2/src/messaging_channel.rs +218 -0
  34. package/contracts/endpoint-v2/src/messaging_composer.rs +76 -0
  35. package/contracts/endpoint-v2/src/storage.rs +78 -0
  36. package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +131 -0
  37. package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +237 -0
  38. package/contracts/endpoint-v2/src/tests/endpoint_v2/delegate.rs +42 -0
  39. package/contracts/endpoint-v2/src/tests/endpoint_v2/initializable.rs +76 -0
  40. package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +211 -0
  41. package/contracts/endpoint-v2/src/tests/endpoint_v2/mod.rs +18 -0
  42. package/contracts/endpoint-v2/src/tests/endpoint_v2/native_token.rs +10 -0
  43. package/contracts/endpoint-v2/src/tests/endpoint_v2/owner.rs +10 -0
  44. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +424 -0
  45. package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +144 -0
  46. package/contracts/endpoint-v2/src/tests/endpoint_v2/recover_token.rs +72 -0
  47. package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +29 -0
  48. package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +513 -0
  49. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +43 -0
  50. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +27 -0
  51. package/contracts/endpoint-v2/src/tests/endpoint_v2/transfer_ownership.rs +30 -0
  52. package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +202 -0
  53. package/contracts/endpoint-v2/src/tests/endpoint_v2/verifiable.rs +59 -0
  54. package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +172 -0
  55. package/contracts/endpoint-v2/src/tests/endpoint_v2/zro.rs +23 -0
  56. package/contracts/endpoint-v2/src/tests/message_lib_manager/mod.rs +10 -0
  57. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +131 -0
  58. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +35 -0
  59. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +28 -0
  60. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_config.rs +79 -0
  61. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +246 -0
  62. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +285 -0
  63. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +180 -0
  64. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +405 -0
  65. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +80 -0
  66. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +131 -0
  67. package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +358 -0
  68. package/contracts/endpoint-v2/src/tests/messaging_channel/clear.rs +316 -0
  69. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_nonce.rs +288 -0
  70. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_payload_hash.rs +316 -0
  71. package/contracts/endpoint-v2/src/tests/messaging_channel/internal.rs +388 -0
  72. package/contracts/endpoint-v2/src/tests/messaging_channel/lazy_inbound_nonce.rs +307 -0
  73. package/contracts/endpoint-v2/src/tests/messaging_channel/mod.rs +10 -0
  74. package/contracts/endpoint-v2/src/tests/messaging_channel/next_guid.rs +239 -0
  75. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +324 -0
  76. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound_nonce.rs +242 -0
  77. package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +232 -0
  78. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +212 -0
  79. package/contracts/endpoint-v2/src/tests/messaging_composer/compose_queue.rs +213 -0
  80. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +269 -0
  81. package/contracts/endpoint-v2/src/tests/messaging_composer/mod.rs +4 -0
  82. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +173 -0
  83. package/contracts/endpoint-v2/src/tests/mock.rs +132 -0
  84. package/contracts/endpoint-v2/src/tests/mod.rs +12 -0
  85. package/contracts/endpoint-v2/src/tests/util/build_payload.rs +126 -0
  86. package/contracts/endpoint-v2/src/tests/util/compute_guid.rs +82 -0
  87. package/contracts/endpoint-v2/src/tests/util/keccak256.rs +115 -0
  88. package/contracts/endpoint-v2/src/tests/util/mod.rs +3 -0
  89. package/contracts/endpoint-v2/src/util.rs +52 -0
  90. package/contracts/message-libs/Cargo.toml +12 -0
  91. package/contracts/message-libs/block-message-lib/Cargo.toml +19 -0
  92. package/contracts/message-libs/block-message-lib/src/lib.rs +70 -0
  93. package/contracts/message-libs/lib.rs +2 -0
  94. package/contracts/message-libs/message-lib-common/Cargo.toml +24 -0
  95. package/contracts/message-libs/message-lib-common/src/errors.rs +20 -0
  96. package/contracts/message-libs/message-lib-common/src/interfaces/dvn.rs +55 -0
  97. package/contracts/message-libs/message-lib-common/src/interfaces/executor.rs +46 -0
  98. package/contracts/message-libs/message-lib-common/src/interfaces/mod.rs +7 -0
  99. package/contracts/message-libs/message-lib-common/src/interfaces/treasury.rs +17 -0
  100. package/contracts/message-libs/message-lib-common/src/lib.rs +14 -0
  101. package/contracts/message-libs/message-lib-common/src/packet_codec_v1.rs +99 -0
  102. package/contracts/message-libs/message-lib-common/src/testing_utils.rs +27 -0
  103. package/contracts/message-libs/message-lib-common/src/tests/mod.rs +2 -0
  104. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +162 -0
  105. package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +319 -0
  106. package/contracts/message-libs/message-lib-common/src/worker_options.rs +190 -0
  107. package/contracts/message-libs/simple-message-lib/Cargo.toml +26 -0
  108. package/contracts/message-libs/simple-message-lib/src/errors.rs +11 -0
  109. package/contracts/message-libs/simple-message-lib/src/lib.rs +14 -0
  110. package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +136 -0
  111. package/contracts/message-libs/simple-message-lib/src/storage.rs +27 -0
  112. package/contracts/message-libs/simple-message-lib/src/test.rs +280 -0
  113. package/contracts/message-libs/treasury/Cargo.toml +27 -0
  114. package/contracts/message-libs/treasury/src/errors.rs +10 -0
  115. package/contracts/message-libs/treasury/src/events.rs +28 -0
  116. package/contracts/message-libs/treasury/src/interfaces/mod.rs +3 -0
  117. package/contracts/message-libs/treasury/src/interfaces/zro_fee_lib.rs +20 -0
  118. package/contracts/message-libs/treasury/src/lib.rs +20 -0
  119. package/contracts/message-libs/treasury/src/storage.rs +18 -0
  120. package/contracts/message-libs/treasury/src/tests/mod.rs +2 -0
  121. package/contracts/message-libs/treasury/src/tests/setup.rs +112 -0
  122. package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +562 -0
  123. package/contracts/message-libs/treasury/src/treasury.rs +140 -0
  124. package/contracts/message-libs/uln-302/Cargo.toml +28 -0
  125. package/contracts/message-libs/uln-302/src/config_validation.rs +173 -0
  126. package/contracts/message-libs/uln-302/src/errors.rs +29 -0
  127. package/contracts/message-libs/uln-302/src/events.rs +72 -0
  128. package/contracts/message-libs/uln-302/src/interfaces/mod.rs +5 -0
  129. package/contracts/message-libs/uln-302/src/interfaces/receive.rs +82 -0
  130. package/contracts/message-libs/uln-302/src/interfaces/send.rs +159 -0
  131. package/contracts/message-libs/uln-302/src/lib.rs +20 -0
  132. package/contracts/message-libs/uln-302/src/receive.rs +199 -0
  133. package/contracts/message-libs/uln-302/src/send.rs +349 -0
  134. package/contracts/message-libs/uln-302/src/storage.rs +47 -0
  135. package/contracts/message-libs/uln-302/src/tests/config/mod.rs +2 -0
  136. package/contracts/message-libs/uln-302/src/tests/config/oapp_uln_config.rs +291 -0
  137. package/contracts/message-libs/uln-302/src/tests/config/uln_config.rs +163 -0
  138. package/contracts/message-libs/uln-302/src/tests/mod.rs +7 -0
  139. package/contracts/message-libs/uln-302/src/tests/receive_uln302/commit_verification.rs +183 -0
  140. package/contracts/message-libs/uln-302/src/tests/receive_uln302/confirmations.rs +128 -0
  141. package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +104 -0
  142. package/contracts/message-libs/uln-302/src/tests/receive_uln302/mod.rs +66 -0
  143. package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +79 -0
  144. package/contracts/message-libs/uln-302/src/tests/receive_uln302/verifiable.rs +463 -0
  145. package/contracts/message-libs/uln-302/src/tests/receive_uln302/verify.rs +173 -0
  146. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_executor_config.rs +132 -0
  147. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +117 -0
  148. package/contracts/message-libs/uln-302/src/tests/send_uln302/mod.rs +6 -0
  149. package/contracts/message-libs/uln-302/src/tests/send_uln302/quote.rs +586 -0
  150. package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +834 -0
  151. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +95 -0
  152. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +80 -0
  153. package/contracts/message-libs/uln-302/src/tests/setup.rs +268 -0
  154. package/contracts/message-libs/uln-302/src/tests/testing_utils.rs +47 -0
  155. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_receive_uln_config.rs +51 -0
  156. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_send_uln_config.rs +51 -0
  157. package/contracts/message-libs/uln-302/src/tests/uln302/get_oapp_executor_config.rs +48 -0
  158. package/contracts/message-libs/uln-302/src/tests/uln302/mod.rs +4 -0
  159. package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +998 -0
  160. package/contracts/message-libs/uln-302/src/uln302.rs +117 -0
  161. package/contracts/oapp-macros/Cargo.toml +21 -0
  162. package/contracts/oapp-macros/src/lib.rs +408 -0
  163. package/contracts/oapp-macros/src/oapp_core.rs +49 -0
  164. package/contracts/oapp-macros/src/oapp_full.rs +15 -0
  165. package/contracts/oapp-macros/src/oapp_options_type3.rs +46 -0
  166. package/contracts/oapp-macros/src/oapp_receiver.rs +67 -0
  167. package/contracts/oapp-macros/src/oapp_sender.rs +23 -0
  168. package/contracts/oapp-macros/src/util.rs +103 -0
  169. package/contracts/oapp-macros/tests/test_macros.rs +522 -0
  170. package/contracts/oapps/Cargo.toml +12 -0
  171. package/contracts/oapps/counter/Cargo.toml +24 -0
  172. package/contracts/oapps/counter/integration_tests/mod.rs +3 -0
  173. package/contracts/oapps/counter/integration_tests/setup.rs +201 -0
  174. package/contracts/oapps/counter/integration_tests/test_with_sml.rs +166 -0
  175. package/contracts/oapps/counter/integration_tests/utils.rs +144 -0
  176. package/contracts/oapps/counter/src/codec.rs +63 -0
  177. package/contracts/oapps/counter/src/counter.rs +235 -0
  178. package/contracts/oapps/counter/src/errors.rs +9 -0
  179. package/contracts/oapps/counter/src/lib.rs +16 -0
  180. package/contracts/oapps/counter/src/options.rs +30 -0
  181. package/contracts/oapps/counter/src/storage.rs +33 -0
  182. package/contracts/oapps/counter/src/tests/mod.rs +37 -0
  183. package/contracts/oapps/counter/src/tests/test_codec.rs +64 -0
  184. package/contracts/oapps/counter/src/tests/test_counter.rs +390 -0
  185. package/contracts/oapps/counter/src/u256_ext.rs +21 -0
  186. package/contracts/oapps/lib.rs +2 -0
  187. package/contracts/oapps/oapp/Cargo.toml +21 -0
  188. package/contracts/oapps/oapp/src/errors.rs +9 -0
  189. package/contracts/oapps/oapp/src/lib.rs +10 -0
  190. package/contracts/oapps/oapp/src/oapp_core.rs +92 -0
  191. package/contracts/oapps/oapp/src/oapp_options_type3.rs +89 -0
  192. package/contracts/oapps/oapp/src/oapp_receiver.rs +72 -0
  193. package/contracts/oapps/oapp/src/oapp_sender.rs +66 -0
  194. package/contracts/oapps/oapp/src/tests/mod.rs +4 -0
  195. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +162 -0
  196. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +180 -0
  197. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +157 -0
  198. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +283 -0
  199. package/contracts/utils/Cargo.toml +21 -0
  200. package/contracts/utils/src/buffer_reader.rs +143 -0
  201. package/contracts/utils/src/buffer_writer.rs +117 -0
  202. package/contracts/utils/src/bytes_ext.rs +19 -0
  203. package/contracts/utils/src/errors.rs +30 -0
  204. package/contracts/utils/src/lib.rs +15 -0
  205. package/contracts/utils/src/option_ext.rs +38 -0
  206. package/contracts/utils/src/ownable.rs +88 -0
  207. package/contracts/utils/src/testing_utils.rs +100 -0
  208. package/contracts/utils/src/tests/buffer_reader.rs +1006 -0
  209. package/contracts/utils/src/tests/buffer_writer.rs +330 -0
  210. package/contracts/utils/src/tests/bytes_ext.rs +77 -0
  211. package/contracts/utils/src/tests/mod.rs +4 -0
  212. package/contracts/utils/src/tests/ownable.rs +149 -0
  213. package/contracts/utils/src/ttl.rs +164 -0
  214. package/contracts/workers/Cargo.toml +13 -0
  215. package/contracts/workers/executor/Cargo.toml +26 -0
  216. package/contracts/workers/executor/src/events.rs +22 -0
  217. package/contracts/workers/executor/src/executor.rs +347 -0
  218. package/contracts/workers/executor/src/interfaces/executor.rs +40 -0
  219. package/contracts/workers/executor/src/interfaces/mod.rs +5 -0
  220. package/contracts/workers/executor/src/interfaces/types.rs +51 -0
  221. package/contracts/workers/executor/src/lib.rs +10 -0
  222. package/contracts/workers/executor/src/storage.rs +23 -0
  223. package/contracts/workers/lib.rs +2 -0
  224. package/contracts/workers/worker-common/Cargo.toml +18 -0
  225. package/contracts/workers/worker-common/src/constants.rs +17 -0
  226. package/contracts/workers/worker-common/src/errors.rs +6 -0
  227. package/contracts/workers/worker-common/src/events.rs +34 -0
  228. package/contracts/workers/worker-common/src/interfaces/executor_fee_lib.rs +35 -0
  229. package/contracts/workers/worker-common/src/interfaces/mod.rs +7 -0
  230. package/contracts/workers/worker-common/src/interfaces/price_feed.rs +40 -0
  231. package/contracts/workers/worker-common/src/interfaces/worker.rs +60 -0
  232. package/contracts/workers/worker-common/src/lib.rs +19 -0
  233. package/contracts/workers/worker-common/src/storage.rs +32 -0
  234. package/contracts/workers/worker-common/src/worker_common.rs +166 -0
  235. package/package.json +25 -0
  236. package/rust-toolchain.toml +4 -0
  237. package/rustfmt.toml +17 -0
  238. package/sdk/.turbo/turbo-build.log +4 -0
  239. package/sdk/dist/generated/bml.d.ts +452 -0
  240. package/sdk/dist/generated/bml.js +72 -0
  241. package/sdk/dist/generated/counter.d.ts +824 -0
  242. package/sdk/dist/generated/counter.js +125 -0
  243. package/sdk/dist/generated/endpoint.d.ts +1676 -0
  244. package/sdk/dist/generated/endpoint.js +216 -0
  245. package/sdk/dist/generated/sml.d.ts +810 -0
  246. package/sdk/dist/generated/sml.js +132 -0
  247. package/sdk/dist/generated/uln302.d.ts +1227 -0
  248. package/sdk/dist/generated/uln302.js +185 -0
  249. package/sdk/dist/index.d.ts +5 -0
  250. package/sdk/dist/index.js +5 -0
  251. package/sdk/node_modules/.bin/tsc +21 -0
  252. package/sdk/node_modules/.bin/tsserver +21 -0
  253. package/sdk/node_modules/.bin/vitest +21 -0
  254. package/sdk/node_modules/.bin/zx +21 -0
  255. package/sdk/package.json +40 -0
  256. package/sdk/src/index.ts +5 -0
  257. package/sdk/test/index.test.ts +271 -0
  258. package/sdk/test/suites/constants.ts +13 -0
  259. package/sdk/test/suites/deploy.ts +277 -0
  260. package/sdk/test/suites/localnet.ts +42 -0
  261. package/sdk/test/suites/scan.ts +189 -0
  262. package/sdk/tsconfig.json +106 -0
  263. package/tools/ts-bindings-gen/Cargo.toml +14 -0
  264. package/tools/ts-bindings-gen/src/main.rs +147 -0
  265. package/turbo.json +12 -0
@@ -0,0 +1,180 @@
1
+ use soroban_sdk::{testutils::Address as _, vec, Address};
2
+
3
+ use crate::{
4
+ errors::EndpointError, events::DefaultSendLibrarySet, storage, tests::endpoint_setup::setup, MessageLibType,
5
+ };
6
+ use utils::testing_utils::assert_event;
7
+
8
+ // Integration tests for set_default_send_library
9
+ #[test]
10
+ fn test_set_default_send_library_unsupported_eid() {
11
+ let context = setup();
12
+ let env = &context.env;
13
+ let endpoint_client = &context.endpoint_client;
14
+
15
+ let unsupported_eid = context.eid + 1;
16
+
17
+ // Create and register a send lib that only supports TEST_context.eid
18
+ let send_lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
19
+
20
+ // Mock owner auth for register_library
21
+ context.mock_owner_auth("register_library", (&send_lib,));
22
+ endpoint_client.register_library(&send_lib);
23
+
24
+ // Mock owner auth for set_default_send_library
25
+ context.mock_owner_auth("set_default_send_library", (&unsupported_eid, &send_lib));
26
+
27
+ // Try to set it as default for unsupported eid
28
+ let result = endpoint_client.try_set_default_send_library(&unsupported_eid, &send_lib);
29
+
30
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::UnsupportedEid.into());
31
+ }
32
+
33
+ #[test]
34
+ fn test_set_default_send_library_wrong_lib_type() {
35
+ let context = setup();
36
+ let env = &context.env;
37
+ let endpoint_client = &context.endpoint_client;
38
+
39
+ // Create and register a receive-only lib that supports eid 1
40
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
41
+
42
+ // Mock owner auth for register_library
43
+ context.mock_owner_auth("register_library", (&receive_lib,));
44
+ endpoint_client.register_library(&receive_lib);
45
+
46
+ // Mock owner auth for set_default_send_library
47
+ context.mock_owner_auth("set_default_send_library", (&context.eid, &receive_lib));
48
+
49
+ // Try to set it as default send library
50
+ let result = endpoint_client.try_set_default_send_library(&context.eid, &receive_lib);
51
+
52
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::OnlySendLib.into());
53
+ }
54
+
55
+ #[test]
56
+ fn test_set_default_send_library_unregistered_lib() {
57
+ let context = setup();
58
+ let env = &context.env;
59
+ let endpoint_client = &context.endpoint_client;
60
+
61
+ // Create but don't register a valid send lib
62
+ let send_lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
63
+
64
+ // Mock owner auth for set_default_send_library
65
+ context.mock_owner_auth("set_default_send_library", (&context.eid, &send_lib));
66
+
67
+ // Try to set it as default without registering
68
+ let result = endpoint_client.try_set_default_send_library(&context.eid, &send_lib);
69
+
70
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::OnlyRegisteredLib.into());
71
+ }
72
+
73
+ #[test]
74
+ fn test_set_default_send_library_non_deployed_lib() {
75
+ let context = setup();
76
+ let env = &context.env;
77
+ let endpoint_client = &context.endpoint_client;
78
+
79
+ // Address without any contract deployed
80
+ let non_existent_lib = Address::generate(env);
81
+
82
+ // Mock owner auth for set_default_send_library
83
+ context.mock_owner_auth("set_default_send_library", (&context.eid, &non_existent_lib));
84
+
85
+ // Try to set a non-existent contract as default
86
+ let result = endpoint_client.try_set_default_send_library(&context.eid, &non_existent_lib);
87
+
88
+ assert!(result.is_err());
89
+ }
90
+
91
+ #[test]
92
+ fn test_set_default_send_library_success() {
93
+ let context = setup();
94
+ let env = &context.env;
95
+ let endpoint_client = &context.endpoint_client;
96
+
97
+ // Create and register a valid send lib that supports eid 1
98
+ let send_lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
99
+
100
+ // Mock owner auth for register_library
101
+ context.mock_owner_auth("register_library", (&send_lib,));
102
+ endpoint_client.register_library(&send_lib);
103
+
104
+ // Verify initial state - default send library should not be set
105
+ assert_eq!(endpoint_client.default_send_library(&context.eid), None);
106
+ let initial_lib =
107
+ env.as_contract(&endpoint_client.address, || storage::EndpointStorage::default_send_library(env, context.eid));
108
+ assert_eq!(initial_lib, None, "Initial default send library should be None");
109
+
110
+ // Mock owner auth for set_default_send_library
111
+ context.mock_owner_auth("set_default_send_library", (&context.eid, &send_lib));
112
+
113
+ // Should succeed
114
+ endpoint_client.set_default_send_library(&context.eid, &send_lib);
115
+
116
+ // Verify the event was published
117
+ assert_event(
118
+ env,
119
+ &endpoint_client.address,
120
+ DefaultSendLibrarySet { dst_eid: context.eid, new_lib: send_lib.clone() },
121
+ );
122
+
123
+ // Verify it was set correctly via public interface
124
+ assert_eq!(endpoint_client.default_send_library(&context.eid), Some(send_lib.clone()));
125
+
126
+ // Assert storage change directly
127
+ let stored_lib =
128
+ env.as_contract(&endpoint_client.address, || storage::EndpointStorage::default_send_library(env, context.eid));
129
+ assert_eq!(stored_lib, Some(send_lib), "Storage should contain the default send library");
130
+ }
131
+
132
+ #[test]
133
+ #[should_panic(expected = "Error(Auth, InvalidAction)")]
134
+ fn test_set_default_send_library_requires_owner_auth() {
135
+ let context = setup();
136
+ let env = &context.env;
137
+ let endpoint_client = &context.endpoint_client;
138
+
139
+ let non_owner = Address::generate(env);
140
+
141
+ // Create and register a valid send lib
142
+ let send_lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
143
+
144
+ // Mock owner auth for register_library
145
+ context.mock_owner_auth("register_library", (&send_lib,));
146
+ endpoint_client.register_library(&send_lib);
147
+
148
+ // Mock auth for the non-owner (not the owner)
149
+ context.mock_auth(&non_owner, "set_default_send_library", (&context.eid, &send_lib));
150
+
151
+ // Should fail when non-owner tries to set
152
+ endpoint_client.set_default_send_library(&context.eid, &send_lib);
153
+ }
154
+
155
+ #[test]
156
+ fn test_set_default_send_library_same_value() {
157
+ let context = setup();
158
+ let env = &context.env;
159
+ let endpoint_client = &context.endpoint_client;
160
+
161
+ // Create and register a valid send lib that supports eid 1
162
+ let send_lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
163
+
164
+ // Mock owner auth for register_library
165
+ context.mock_owner_auth("register_library", (&send_lib,));
166
+ endpoint_client.register_library(&send_lib);
167
+
168
+ // Mock owner auth for set_default_send_library
169
+ context.mock_owner_auth("set_default_send_library", (&context.eid, &send_lib));
170
+
171
+ // Should succeed
172
+ endpoint_client.set_default_send_library(&context.eid, &send_lib);
173
+
174
+ context.mock_owner_auth("set_default_send_library", (&context.eid, &send_lib));
175
+
176
+ // Try to set same library again
177
+ let result = endpoint_client.try_set_default_send_library(&context.eid, &send_lib);
178
+
179
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::SameValue.into());
180
+ }
@@ -0,0 +1,405 @@
1
+ use soroban_sdk::{
2
+ testutils::{Address as _, Ledger, MockAuth, MockAuthInvoke},
3
+ vec, Address, IntoVal,
4
+ };
5
+
6
+ use crate::{
7
+ errors::EndpointError,
8
+ events::{ReceiveLibrarySet, ReceiveLibraryTimeoutSet},
9
+ storage,
10
+ tests::endpoint_setup::setup,
11
+ MessageLibType, Timeout,
12
+ };
13
+ use utils::testing_utils::assert_event;
14
+
15
+ // Tests for set_receive_library
16
+ #[test]
17
+ fn test_set_receive_library_requires_oapp_auth() {
18
+ let context = setup();
19
+ let env = &context.env;
20
+ let endpoint_client = &context.endpoint_client;
21
+
22
+ let oapp = Address::generate(env);
23
+ let unauthorized_caller = Address::generate(env);
24
+
25
+ // Create and register a valid receive lib
26
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
27
+
28
+ // Register the library with owner auth
29
+ context.mock_owner_auth("register_library", (&receive_lib,));
30
+ endpoint_client.register_library(&receive_lib);
31
+
32
+ // Mock auth for unauthorized caller (not the oapp or its delegate)
33
+ env.mock_auths(&[MockAuth {
34
+ address: &unauthorized_caller,
35
+ invoke: &MockAuthInvoke {
36
+ contract: &endpoint_client.address,
37
+ fn_name: "set_receive_library",
38
+ args: (&unauthorized_caller, &oapp, &context.eid, &Some(receive_lib.clone()), &0u64).into_val(env),
39
+ sub_invokes: &[],
40
+ },
41
+ }]);
42
+
43
+ // Should fail with Unauthorized error
44
+ let result =
45
+ endpoint_client.try_set_receive_library(&unauthorized_caller, &oapp, &context.eid, &Some(receive_lib), &0u64);
46
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::Unauthorized.into());
47
+ }
48
+
49
+ #[test]
50
+ fn test_set_receive_library_unregistered_lib() {
51
+ let context = setup();
52
+ let env = &context.env;
53
+ let endpoint_client = &context.endpoint_client;
54
+
55
+ let oapp = Address::generate(env);
56
+
57
+ // Create but don't register a valid receive lib
58
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
59
+
60
+ // Mock auth for oapp
61
+ env.mock_auths(&[MockAuth {
62
+ address: &oapp,
63
+ invoke: &MockAuthInvoke {
64
+ contract: &endpoint_client.address,
65
+ fn_name: "set_receive_library",
66
+ args: (&oapp, &oapp, &context.eid, &Some(receive_lib.clone()), &0u64).into_val(env),
67
+ sub_invokes: &[],
68
+ },
69
+ }]);
70
+
71
+ // Should fail with unregistered library error
72
+ let result = endpoint_client.try_set_receive_library(&oapp, &oapp, &context.eid, &Some(receive_lib), &0u64);
73
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::OnlyRegisteredLib.into());
74
+ }
75
+
76
+ #[test]
77
+ fn test_set_receive_library_wrong_lib_type() {
78
+ let context = setup();
79
+ let env = &context.env;
80
+ let endpoint_client = &context.endpoint_client;
81
+
82
+ let oapp = Address::generate(env);
83
+
84
+ // Create and register a send-only lib
85
+ let send_lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
86
+
87
+ // Register the library with owner auth
88
+ context.mock_owner_auth("register_library", (&send_lib,));
89
+ endpoint_client.register_library(&send_lib);
90
+
91
+ // Mock auth for oapp
92
+ env.mock_auths(&[MockAuth {
93
+ address: &oapp,
94
+ invoke: &MockAuthInvoke {
95
+ contract: &endpoint_client.address,
96
+ fn_name: "set_receive_library",
97
+ args: (&oapp, &oapp, &context.eid, &Some(send_lib.clone()), &0u64).into_val(env),
98
+ sub_invokes: &[],
99
+ },
100
+ }]);
101
+
102
+ // Should fail with wrong library type error
103
+ let result = endpoint_client.try_set_receive_library(&oapp, &oapp, &context.eid, &Some(send_lib), &0u64);
104
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::OnlyReceiveLib.into());
105
+ }
106
+
107
+ #[test]
108
+ fn test_set_receive_library_unsupported_eid() {
109
+ let context = setup();
110
+ let env = &context.env;
111
+ let endpoint_client = &context.endpoint_client;
112
+
113
+ let oapp = Address::generate(env);
114
+ let unsupported_eid = context.eid + 1;
115
+
116
+ // Create and register a receive lib that only supports TEST_context.eid
117
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
118
+
119
+ // Register the library with owner auth
120
+ context.mock_owner_auth("register_library", (&receive_lib,));
121
+ endpoint_client.register_library(&receive_lib);
122
+
123
+ // Mock auth for oapp
124
+ env.mock_auths(&[MockAuth {
125
+ address: &oapp,
126
+ invoke: &MockAuthInvoke {
127
+ contract: &endpoint_client.address,
128
+ fn_name: "set_receive_library",
129
+ args: (&oapp, &oapp, &unsupported_eid, &Some(receive_lib.clone()), &0u64).into_val(env),
130
+ sub_invokes: &[],
131
+ },
132
+ }]);
133
+
134
+ // Should fail with unsupported eid error
135
+ let result = endpoint_client.try_set_receive_library(&oapp, &oapp, &unsupported_eid, &Some(receive_lib), &0u64);
136
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::UnsupportedEid.into());
137
+ }
138
+
139
+ #[test]
140
+ fn test_set_receive_library_same_value() {
141
+ let context = setup();
142
+ let env = &context.env;
143
+ let endpoint_client = &context.endpoint_client;
144
+
145
+ let oapp = Address::generate(env);
146
+
147
+ // Create and register a valid receive lib
148
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
149
+
150
+ // Register the library with owner auth
151
+ context.mock_owner_auth("register_library", (&receive_lib,));
152
+ endpoint_client.register_library(&receive_lib);
153
+
154
+ // First set with oapp auth
155
+ env.mock_auths(&[MockAuth {
156
+ address: &oapp,
157
+ invoke: &MockAuthInvoke {
158
+ contract: &endpoint_client.address,
159
+ fn_name: "set_receive_library",
160
+ args: (&oapp, &oapp, &context.eid, &Some(receive_lib.clone()), &0u64).into_val(env),
161
+ sub_invokes: &[],
162
+ },
163
+ }]);
164
+ endpoint_client.set_receive_library(&oapp, &oapp, &context.eid, &Some(receive_lib.clone()), &0u64);
165
+
166
+ // Try to set the same library again
167
+ env.mock_auths(&[MockAuth {
168
+ address: &oapp,
169
+ invoke: &MockAuthInvoke {
170
+ contract: &endpoint_client.address,
171
+ fn_name: "set_receive_library",
172
+ args: (&oapp, &oapp, &context.eid, &Some(receive_lib.clone()), &0u64).into_val(env),
173
+ sub_invokes: &[],
174
+ },
175
+ }]);
176
+
177
+ let result = endpoint_client.try_set_receive_library(&oapp, &oapp, &context.eid, &Some(receive_lib), &0u64);
178
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::SameValue.into());
179
+ }
180
+
181
+ #[test]
182
+ fn test_set_receive_library_success_no_grace_period() {
183
+ let context = setup();
184
+ let env = &context.env;
185
+ let endpoint_client = &context.endpoint_client;
186
+
187
+ let oapp = Address::generate(env);
188
+
189
+ // Create and register a valid receive lib
190
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
191
+
192
+ // Register the library with owner auth
193
+ context.mock_owner_auth("register_library", (&receive_lib,));
194
+ endpoint_client.register_library(&receive_lib);
195
+
196
+ // Verify it was not set
197
+ assert_eq!(
198
+ env.as_contract(&endpoint_client.address, || storage::EndpointStorage::receive_library(
199
+ env,
200
+ &oapp,
201
+ context.eid
202
+ )),
203
+ None
204
+ );
205
+
206
+ // Set with oapp auth
207
+ env.mock_auths(&[MockAuth {
208
+ address: &oapp,
209
+ invoke: &MockAuthInvoke {
210
+ contract: &endpoint_client.address,
211
+ fn_name: "set_receive_library",
212
+ args: (&oapp, &oapp, &context.eid, &Some(receive_lib.clone()), &0u64).into_val(env),
213
+ sub_invokes: &[],
214
+ },
215
+ }]);
216
+
217
+ endpoint_client.set_receive_library(&oapp, &oapp, &context.eid, &Some(receive_lib.clone()), &0u64);
218
+
219
+ assert_event(
220
+ env,
221
+ &endpoint_client.address,
222
+ ReceiveLibraryTimeoutSet { receiver: oapp.clone(), eid: context.eid, timeout: None },
223
+ );
224
+
225
+ // Verify it was set correctly
226
+ assert_eq!(
227
+ env.as_contract(&endpoint_client.address, || storage::EndpointStorage::receive_library(
228
+ env,
229
+ &oapp,
230
+ context.eid
231
+ )),
232
+ Some(receive_lib)
233
+ );
234
+ assert_eq!(endpoint_client.receive_library_timeout(&oapp, &context.eid), None);
235
+ }
236
+
237
+ #[test]
238
+ fn test_set_receive_library_success_with_grace_period() {
239
+ let context = setup();
240
+ let env = &context.env;
241
+ let endpoint_client = &context.endpoint_client;
242
+
243
+ let oapp = Address::generate(env);
244
+ let current_timestamp = 1_700_000_000;
245
+ let grace_period = 1000;
246
+
247
+ // Set the ledger timestamp
248
+ env.ledger().with_mut(|li| {
249
+ li.timestamp = current_timestamp;
250
+ });
251
+
252
+ // Create and register two valid receive libs
253
+ let old_receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
254
+ let new_receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
255
+
256
+ // Register both libraries with owner auth
257
+ context.mock_owner_auth("register_library", (&old_receive_lib,));
258
+ endpoint_client.register_library(&old_receive_lib);
259
+ context.mock_owner_auth("register_library", (&new_receive_lib,));
260
+ endpoint_client.register_library(&new_receive_lib);
261
+
262
+ // First set the old library without grace period
263
+ env.mock_auths(&[MockAuth {
264
+ address: &oapp,
265
+ invoke: &MockAuthInvoke {
266
+ contract: &endpoint_client.address,
267
+ fn_name: "set_receive_library",
268
+ args: (&oapp, &oapp, &context.eid, &Some(old_receive_lib.clone()), &0u64).into_val(env),
269
+ sub_invokes: &[],
270
+ },
271
+ }]);
272
+ endpoint_client.set_receive_library(&oapp, &oapp, &context.eid, &Some(old_receive_lib.clone()), &0u64);
273
+
274
+ // Now set the new library with grace period
275
+ env.mock_auths(&[MockAuth {
276
+ address: &oapp,
277
+ invoke: &MockAuthInvoke {
278
+ contract: &endpoint_client.address,
279
+ fn_name: "set_receive_library",
280
+ args: (&oapp, &oapp, &context.eid, &Some(new_receive_lib.clone()), &grace_period).into_val(env),
281
+ sub_invokes: &[],
282
+ },
283
+ }]);
284
+ endpoint_client.set_receive_library(&oapp, &oapp, &context.eid, &Some(new_receive_lib.clone()), &grace_period);
285
+
286
+ let expected_timeout = Some(Timeout { lib: old_receive_lib.clone(), expiry: current_timestamp + grace_period });
287
+
288
+ // Verify the events were published
289
+ assert_event(
290
+ env,
291
+ &endpoint_client.address,
292
+ ReceiveLibraryTimeoutSet { receiver: oapp.clone(), eid: context.eid, timeout: expected_timeout.clone() },
293
+ );
294
+ assert_event(
295
+ env,
296
+ &endpoint_client.address,
297
+ ReceiveLibrarySet { receiver: oapp.clone(), src_eid: context.eid, new_lib: Some(new_receive_lib.clone()) },
298
+ );
299
+
300
+ // Verify the library was updated
301
+ assert_eq!(
302
+ env.as_contract(&endpoint_client.address, || storage::EndpointStorage::receive_library(
303
+ env,
304
+ &oapp,
305
+ context.eid
306
+ )),
307
+ Some(new_receive_lib)
308
+ );
309
+
310
+ // Verify the timeout was set correctly
311
+ assert_eq!(endpoint_client.receive_library_timeout(&oapp, &context.eid), expected_timeout);
312
+ }
313
+
314
+ #[test]
315
+ fn test_set_receive_library_grace_period_requires_both_libs() {
316
+ let context = setup();
317
+ let env = &context.env;
318
+ let endpoint_client = &context.endpoint_client;
319
+
320
+ let oapp = Address::generate(env);
321
+ let grace_period = 1000;
322
+
323
+ // Create and register a valid receive lib
324
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
325
+
326
+ // Register the library with owner auth
327
+ context.mock_owner_auth("register_library", (&receive_lib,));
328
+ endpoint_client.register_library(&receive_lib);
329
+
330
+ // Try to set library with grace period when there's no existing library
331
+ env.mock_auths(&[MockAuth {
332
+ address: &oapp,
333
+ invoke: &MockAuthInvoke {
334
+ contract: &endpoint_client.address,
335
+ fn_name: "set_receive_library",
336
+ args: (&oapp, &oapp, &context.eid, &Some(receive_lib.clone()), &grace_period).into_val(env),
337
+ sub_invokes: &[],
338
+ },
339
+ }]);
340
+
341
+ let result = endpoint_client.try_set_receive_library(&oapp, &oapp, &context.eid, &Some(receive_lib), &grace_period);
342
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::OnlyNonDefaultLib.into());
343
+ }
344
+
345
+ #[test]
346
+ fn test_set_receive_library_clear_library() {
347
+ let context = setup();
348
+ let env = &context.env;
349
+ let endpoint_client = &context.endpoint_client;
350
+
351
+ let oapp = Address::generate(env);
352
+
353
+ // Create and register a valid receive lib
354
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
355
+
356
+ // Register the library with owner auth
357
+ context.mock_owner_auth("register_library", (&receive_lib,));
358
+ endpoint_client.register_library(&receive_lib);
359
+
360
+ // First set a library
361
+ env.mock_auths(&[MockAuth {
362
+ address: &oapp,
363
+ invoke: &MockAuthInvoke {
364
+ contract: &endpoint_client.address,
365
+ fn_name: "set_receive_library",
366
+ args: (&oapp, &oapp, &context.eid, &Some(receive_lib.clone()), &0u64).into_val(env),
367
+ sub_invokes: &[],
368
+ },
369
+ }]);
370
+ endpoint_client.set_receive_library(&oapp, &oapp, &context.eid, &Some(receive_lib.clone()), &0u64);
371
+
372
+ // Now clear the library by setting to None
373
+ env.mock_auths(&[MockAuth {
374
+ address: &oapp,
375
+ invoke: &MockAuthInvoke {
376
+ contract: &endpoint_client.address,
377
+ fn_name: "set_receive_library",
378
+ args: (&oapp, &oapp, &context.eid, &None::<Address>, &0u64).into_val(env),
379
+ sub_invokes: &[],
380
+ },
381
+ }]);
382
+ endpoint_client.set_receive_library(&oapp, &oapp, &context.eid, &None, &0u64);
383
+
384
+ // Verify the event was published with None for both receive_library_set and receive_library_timeout_set
385
+ assert_event(
386
+ env,
387
+ &endpoint_client.address,
388
+ ReceiveLibrarySet { receiver: oapp.clone(), src_eid: context.eid, new_lib: None },
389
+ );
390
+ assert_event(
391
+ env,
392
+ &endpoint_client.address,
393
+ ReceiveLibraryTimeoutSet { receiver: oapp.clone(), eid: context.eid, timeout: None },
394
+ );
395
+
396
+ // Verify it was cleared
397
+ assert_eq!(
398
+ env.as_contract(&endpoint_client.address, || storage::EndpointStorage::receive_library(
399
+ env,
400
+ &oapp,
401
+ context.eid
402
+ )),
403
+ None
404
+ );
405
+ }
@@ -0,0 +1,80 @@
1
+ use soroban_sdk::{
2
+ testutils::{Address as _, Ledger, MockAuth, MockAuthInvoke},
3
+ vec, Address, IntoVal,
4
+ };
5
+
6
+ use crate::{events::ReceiveLibraryTimeoutSet, storage, tests::endpoint_setup::setup, MessageLibType, Timeout};
7
+ use utils::testing_utils::assert_event;
8
+
9
+ // Tests for set_receive_library_timeout (OApp-level control)
10
+ #[test]
11
+ fn test_set_receive_library_timeout_success() {
12
+ let context = setup();
13
+ let env = &context.env;
14
+ let endpoint_client = &context.endpoint_client;
15
+
16
+ let oapp = Address::generate(env);
17
+ let current_timestamp = 1_700_000_000;
18
+ let grace_period = 1000;
19
+
20
+ // Set the ledger timestamp
21
+ env.ledger().with_mut(|li| {
22
+ li.timestamp = current_timestamp;
23
+ });
24
+
25
+ // Create and register a valid receive lib
26
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
27
+
28
+ // Register the library with owner auth
29
+ context.mock_owner_auth("register_library", (&receive_lib,));
30
+ endpoint_client.register_library(&receive_lib);
31
+
32
+ // First set a receive library (non-default) to satisfy the requirement
33
+ env.mock_auths(&[MockAuth {
34
+ address: &oapp,
35
+ invoke: &MockAuthInvoke {
36
+ contract: &endpoint_client.address,
37
+ fn_name: "set_receive_library",
38
+ args: (&oapp, &oapp, &context.eid, &Some(receive_lib.clone()), &0u64).into_val(env),
39
+ sub_invokes: &[],
40
+ },
41
+ }]);
42
+ endpoint_client.set_receive_library(&oapp, &oapp, &context.eid, &Some(receive_lib.clone()), &0u64);
43
+
44
+ // Create a timeout
45
+ let timeout = Some(Timeout { lib: receive_lib.clone(), expiry: current_timestamp + grace_period });
46
+
47
+ // Verify initial state - timeout should not be set
48
+ let initial_timeout = env.as_contract(&endpoint_client.address, || {
49
+ storage::EndpointStorage::receive_library_timeout(env, &oapp, context.eid)
50
+ });
51
+ assert_eq!(initial_timeout, None, "Initial receive library timeout should be None");
52
+
53
+ // Set the timeout with oapp auth
54
+ env.mock_auths(&[MockAuth {
55
+ address: &oapp,
56
+ invoke: &MockAuthInvoke {
57
+ contract: &endpoint_client.address,
58
+ fn_name: "set_receive_library_timeout",
59
+ args: (&oapp, &oapp, &context.eid, &timeout).into_val(env),
60
+ sub_invokes: &[],
61
+ },
62
+ }]);
63
+ endpoint_client.set_receive_library_timeout(&oapp, &oapp, &context.eid, &timeout);
64
+
65
+ // Verify the event was published
66
+ assert_event(
67
+ env,
68
+ &endpoint_client.address,
69
+ ReceiveLibraryTimeoutSet { receiver: oapp.clone(), eid: context.eid, timeout: timeout.clone() },
70
+ );
71
+
72
+ // Verify storage was updated via public interface
73
+ assert_eq!(endpoint_client.receive_library_timeout(&oapp, &context.eid), timeout.clone());
74
+
75
+ // Assert storage change directly
76
+ let stored_timeout = env.as_contract(&endpoint_client.address, || {
77
+ storage::EndpointStorage::receive_library_timeout(env, &oapp, context.eid)
78
+ });
79
+ assert_eq!(stored_timeout, timeout, "Storage should contain the receive library timeout");
80
+ }