@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,79 @@
1
+ use soroban_sdk::{
2
+ testutils::{Address as _, MockAuth, MockAuthInvoke},
3
+ vec, Address, IntoVal, Vec,
4
+ };
5
+
6
+ use crate::{tests::endpoint_setup::setup, SetConfigParam};
7
+
8
+ // Tests for set_config
9
+ // Note: set_config is a pass-through method that delegates to MessageLibClient.
10
+ // Since mock message libs don't implement set_config, we focus on testing authorization.
11
+ // The actual config setting is tested in the message library contract tests.
12
+
13
+ #[test]
14
+ fn test_set_config_oapp_auth() {
15
+ let context = setup();
16
+ let env = &context.env;
17
+ let endpoint_client = &context.endpoint_client;
18
+
19
+ let oapp = Address::generate(env);
20
+ let message_lib = Address::generate(env); // Just use an address, won't actually call it
21
+
22
+ let params: Vec<SetConfigParam> = vec![env];
23
+
24
+ // Try with oapp auth - should pass authorization check
25
+ // (will fail on lib call since it's not a real lib, but that's after auth)
26
+ env.mock_auths(&[MockAuth {
27
+ address: &oapp,
28
+ invoke: &MockAuthInvoke {
29
+ contract: &endpoint_client.address,
30
+ fn_name: "set_config",
31
+ args: (&oapp, &oapp, &message_lib, &params).into_val(env),
32
+ sub_invokes: &[],
33
+ },
34
+ }]);
35
+
36
+ // Call will fail at library invocation, but we verify auth works
37
+ let _ = endpoint_client.try_set_config(&oapp, &oapp, &message_lib, &params);
38
+ // We're just verifying the auth part - the library call failure is expected
39
+ }
40
+
41
+ #[test]
42
+ fn test_set_config_delegate_auth() {
43
+ let context = setup();
44
+ let env = &context.env;
45
+ let endpoint_client = &context.endpoint_client;
46
+
47
+ let oapp = Address::generate(env);
48
+ let delegate = Address::generate(env);
49
+
50
+ // Set delegate for oapp
51
+ let delegate_option = Some(delegate.clone());
52
+ env.mock_auths(&[MockAuth {
53
+ address: &oapp,
54
+ invoke: &MockAuthInvoke {
55
+ contract: &endpoint_client.address,
56
+ fn_name: "set_delegate",
57
+ args: (&oapp, &delegate_option).into_val(env),
58
+ sub_invokes: &[],
59
+ },
60
+ }]);
61
+ endpoint_client.set_delegate(&oapp, &delegate_option);
62
+
63
+ let message_lib = Address::generate(env);
64
+ let params: Vec<SetConfigParam> = vec![env];
65
+
66
+ // Try with delegate auth - should pass authorization check
67
+ env.mock_auths(&[MockAuth {
68
+ address: &delegate,
69
+ invoke: &MockAuthInvoke {
70
+ contract: &endpoint_client.address,
71
+ fn_name: "set_config",
72
+ args: (&delegate, &oapp, &message_lib, &params).into_val(env),
73
+ sub_invokes: &[],
74
+ },
75
+ }]);
76
+
77
+ // Call will fail at library invocation, but we verify delegate auth works
78
+ let _ = endpoint_client.try_set_config(&delegate, &oapp, &message_lib, &params);
79
+ }
@@ -0,0 +1,246 @@
1
+ use soroban_sdk::{testutils::Address as _, testutils::Ledger, vec, Address};
2
+
3
+ use crate::{
4
+ errors::EndpointError, events::DefaultReceiveLibraryTimeoutSet, storage, tests::endpoint_setup::setup,
5
+ MessageLibType, Timeout,
6
+ };
7
+ use utils::testing_utils::assert_event;
8
+
9
+ // Tests for set_default_receive_lib_timeout
10
+ #[test]
11
+ #[should_panic(expected = "Error(Auth, InvalidAction)")]
12
+ fn test_set_default_receive_lib_timeout_requires_owner_auth() {
13
+ let context = setup();
14
+ let env = &context.env;
15
+ let endpoint_client = &context.endpoint_client;
16
+
17
+ let non_owner = Address::generate(env);
18
+
19
+ // Create a valid timeout
20
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
21
+ let timeout = Some(Timeout { lib: receive_lib, expiry: env.ledger().timestamp() + 1000 });
22
+
23
+ // Mock auth for non-owner
24
+ context.mock_auth(&non_owner, "set_default_receive_lib_timeout", (&context.eid, &timeout));
25
+
26
+ // Should fail when non-owner tries to set
27
+ endpoint_client.set_default_receive_lib_timeout(&context.eid, &timeout);
28
+ }
29
+
30
+ #[test]
31
+ fn test_set_default_receive_lib_timeout_unregistered_lib() {
32
+ let context = setup();
33
+ let env = &context.env;
34
+ let endpoint_client = &context.endpoint_client;
35
+
36
+ // Create but don't register a valid receive lib
37
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
38
+ let timeout = Some(Timeout { lib: receive_lib, expiry: env.ledger().timestamp() + 1000 });
39
+
40
+ // Mock owner auth
41
+ context.mock_owner_auth("set_default_receive_lib_timeout", (&context.eid, &timeout));
42
+
43
+ // Should fail with unregistered library
44
+ let result = endpoint_client.try_set_default_receive_lib_timeout(&context.eid, &timeout);
45
+
46
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::OnlyRegisteredLib.into());
47
+ }
48
+
49
+ #[test]
50
+ fn test_set_default_receive_lib_timeout_wrong_lib_type() {
51
+ let context = setup();
52
+ let env = &context.env;
53
+ let endpoint_client = &context.endpoint_client;
54
+
55
+ // Create and register a send-only lib
56
+ let send_lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
57
+
58
+ // Register the library
59
+ context.mock_owner_auth("register_library", (&send_lib,));
60
+ endpoint_client.register_library(&send_lib);
61
+
62
+ let timeout = Some(Timeout { lib: send_lib, expiry: env.ledger().timestamp() + 1000 });
63
+
64
+ // Mock owner auth
65
+ context.mock_owner_auth("set_default_receive_lib_timeout", (&context.eid, &timeout));
66
+
67
+ // Should fail with send-only library
68
+ let result = endpoint_client.try_set_default_receive_lib_timeout(&context.eid, &timeout);
69
+
70
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::OnlyReceiveLib.into());
71
+ }
72
+
73
+ #[test]
74
+ fn test_set_default_receive_lib_timeout_unsupported_eid() {
75
+ let context = setup();
76
+ let env = &context.env;
77
+ let endpoint_client = &context.endpoint_client;
78
+
79
+ let unsupported_eid = context.eid + 1;
80
+
81
+ // Create and register a receive lib that only supports TEST_EID
82
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
83
+
84
+ // Register the library
85
+ context.mock_owner_auth("register_library", (&receive_lib,));
86
+ endpoint_client.register_library(&receive_lib);
87
+
88
+ let timeout = Some(Timeout { lib: receive_lib, expiry: env.ledger().timestamp() + 1000 });
89
+
90
+ // Mock owner auth
91
+ context.mock_owner_auth("set_default_receive_lib_timeout", (&unsupported_eid, &timeout));
92
+
93
+ // Should fail with unsupported eid
94
+ let result = endpoint_client.try_set_default_receive_lib_timeout(&unsupported_eid, &timeout);
95
+
96
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::UnsupportedEid.into());
97
+ }
98
+
99
+ #[test]
100
+ fn test_set_default_receive_lib_timeout_invalid_expiry() {
101
+ let context = setup();
102
+ let env = &context.env;
103
+ let endpoint_client = &context.endpoint_client;
104
+
105
+ let current_timestamp = 1_700_000_000;
106
+ // Set the ledger timestamp
107
+ env.ledger().with_mut(|li| {
108
+ li.timestamp = current_timestamp;
109
+ });
110
+
111
+ // Create and register a valid receive lib
112
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
113
+
114
+ // Register the library
115
+ context.mock_owner_auth("register_library", (&receive_lib,));
116
+ endpoint_client.register_library(&receive_lib);
117
+
118
+ // Create timeout with expiry in the past
119
+ let timeout = Some(Timeout {
120
+ lib: receive_lib,
121
+ expiry: current_timestamp - 100, // Past expiry
122
+ });
123
+
124
+ // Mock owner auth
125
+ context.mock_owner_auth("set_default_receive_lib_timeout", (&context.eid, &timeout));
126
+
127
+ // Should fail with invalid expiry
128
+ let result = endpoint_client.try_set_default_receive_lib_timeout(&context.eid, &timeout);
129
+
130
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::InvalidExpiry.into());
131
+ }
132
+
133
+ #[test]
134
+ fn test_set_default_receive_lib_timeout_invalid_expiry_equal_timestamp() {
135
+ let context = setup();
136
+ let env = &context.env;
137
+ let endpoint_client = &context.endpoint_client;
138
+
139
+ let current_timestamp = 1_700_000_000;
140
+ // Set the ledger timestamp
141
+ env.ledger().with_mut(|li| {
142
+ li.timestamp = current_timestamp;
143
+ });
144
+
145
+ // Create and register a valid receive lib
146
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
147
+
148
+ // Register the library
149
+ context.mock_owner_auth("register_library", (&receive_lib,));
150
+ endpoint_client.register_library(&receive_lib);
151
+
152
+ // Create timeout with expiry equal to current timestamp
153
+ let timeout = Some(Timeout {
154
+ lib: receive_lib,
155
+ expiry: current_timestamp, // Equal to current
156
+ });
157
+
158
+ // Mock owner auth
159
+ context.mock_owner_auth("set_default_receive_lib_timeout", (&context.eid, &timeout));
160
+
161
+ // Should fail with invalid expiry (must be greater than current timestamp)
162
+ let result = endpoint_client.try_set_default_receive_lib_timeout(&context.eid, &timeout);
163
+
164
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::InvalidExpiry.into());
165
+ }
166
+
167
+ #[test]
168
+ fn test_set_default_receive_lib_timeout_success() {
169
+ let context = setup();
170
+ let env = &context.env;
171
+ let endpoint_client = &context.endpoint_client;
172
+
173
+ let current_timestamp = 1_700_000_000;
174
+ let grace_period = 1000;
175
+
176
+ // Set the ledger timestamp
177
+ env.ledger().with_mut(|li| {
178
+ li.timestamp = current_timestamp;
179
+ });
180
+
181
+ // Create and register a valid receive lib
182
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
183
+
184
+ // Register the library
185
+ context.mock_owner_auth("register_library", (&receive_lib,));
186
+ endpoint_client.register_library(&receive_lib);
187
+
188
+ let timeout = Some(Timeout { lib: receive_lib.clone(), expiry: current_timestamp + grace_period });
189
+
190
+ // Verify initial state - timeout should not be set
191
+ let initial_timeout = env.as_contract(&endpoint_client.address, || {
192
+ storage::EndpointStorage::default_receive_library_timeout(env, context.eid)
193
+ });
194
+ assert_eq!(initial_timeout, None, "Initial default receive library timeout should be None");
195
+
196
+ // Mock owner auth
197
+ context.mock_owner_auth("set_default_receive_lib_timeout", (&context.eid, &timeout));
198
+
199
+ // Should succeed
200
+ endpoint_client.set_default_receive_lib_timeout(&context.eid, &timeout);
201
+
202
+ // Verify the event was published
203
+ assert_event(
204
+ env,
205
+ &endpoint_client.address,
206
+ DefaultReceiveLibraryTimeoutSet { src_eid: context.eid, timeout: timeout.clone() },
207
+ );
208
+
209
+ // Verify it was set correctly via public interface
210
+ assert_eq!(endpoint_client.default_receive_library_timeout(&context.eid), timeout.clone());
211
+
212
+ // Assert storage change directly
213
+ let stored_timeout = env.as_contract(&endpoint_client.address, || {
214
+ storage::EndpointStorage::default_receive_library_timeout(env, context.eid)
215
+ });
216
+ assert_eq!(stored_timeout, timeout, "Storage should contain the timeout");
217
+ }
218
+
219
+ #[test]
220
+ fn test_set_default_receive_lib_timeout_success_with_none() {
221
+ let context = setup();
222
+ let env = &context.env;
223
+ let endpoint_client = &context.endpoint_client;
224
+
225
+ // Mock owner auth
226
+ context.mock_owner_auth("set_default_receive_lib_timeout", (&context.eid, &None::<Timeout>));
227
+
228
+ // Should succeed with None (clears the timeout)
229
+ endpoint_client.set_default_receive_lib_timeout(&context.eid, &None);
230
+
231
+ // Verify the event was published
232
+ assert_event(
233
+ env,
234
+ &endpoint_client.address,
235
+ DefaultReceiveLibraryTimeoutSet { src_eid: context.eid, timeout: None },
236
+ );
237
+
238
+ // Verify it was cleared via public interface
239
+ assert_eq!(endpoint_client.default_receive_library_timeout(&context.eid), None);
240
+
241
+ // Assert storage change directly
242
+ let stored_timeout = env.as_contract(&endpoint_client.address, || {
243
+ storage::EndpointStorage::default_receive_library_timeout(env, context.eid)
244
+ });
245
+ assert_eq!(stored_timeout, None, "Storage should have timeout removed");
246
+ }
@@ -0,0 +1,285 @@
1
+ use soroban_sdk::{
2
+ testutils::{Address as _, Ledger},
3
+ vec, Address,
4
+ };
5
+
6
+ use crate::{
7
+ errors::EndpointError,
8
+ events::{DefaultReceiveLibrarySet, DefaultReceiveLibraryTimeoutSet},
9
+ storage,
10
+ tests::endpoint_setup::setup,
11
+ MessageLibType, Timeout,
12
+ };
13
+ use utils::testing_utils::assert_event;
14
+
15
+ // Integration tests for set_default_receive_library
16
+ #[test]
17
+ fn test_set_default_receive_library_unsupported_eid() {
18
+ let context = setup();
19
+ let env = &context.env;
20
+ let endpoint_client = &context.endpoint_client;
21
+
22
+ let unsupported_eid = context.eid + 1;
23
+
24
+ // Create and register a receive lib that only supports TEST_context.eid
25
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
26
+
27
+ // Mock owner auth for register_library
28
+ context.mock_owner_auth("register_library", (&receive_lib,));
29
+ endpoint_client.register_library(&receive_lib);
30
+
31
+ // Mock owner auth for set_default_receive_library
32
+ context.mock_owner_auth("set_default_receive_library", (&unsupported_eid, &receive_lib, &0u64));
33
+
34
+ // Try to set it as default for unsupported eid
35
+ let result = endpoint_client.try_set_default_receive_library(&unsupported_eid, &receive_lib, &0u64);
36
+
37
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::UnsupportedEid.into());
38
+ }
39
+
40
+ #[test]
41
+ fn test_set_default_receive_library_wrong_lib_type() {
42
+ let context = setup();
43
+ let env = &context.env;
44
+ let endpoint_client = &context.endpoint_client;
45
+
46
+ // Create and register a send-only lib that supports eid 1
47
+ let send_lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
48
+
49
+ // Mock owner auth for register_library
50
+ context.mock_owner_auth("register_library", (&send_lib,));
51
+ endpoint_client.register_library(&send_lib);
52
+
53
+ // Mock owner auth for set_default_receive_library
54
+ context.mock_owner_auth("set_default_receive_library", (&context.eid, &send_lib, &0u64));
55
+
56
+ // Try to set it as default receive library
57
+ let result = endpoint_client.try_set_default_receive_library(&context.eid, &send_lib, &0u64);
58
+
59
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::OnlyReceiveLib.into());
60
+ }
61
+
62
+ #[test]
63
+ fn test_set_default_receive_library_unregistered_lib() {
64
+ let context = setup();
65
+ let env = &context.env;
66
+ let endpoint_client = &context.endpoint_client;
67
+
68
+ // Create but don't register a valid receive lib
69
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
70
+
71
+ // Mock owner auth for set_default_receive_library
72
+ context.mock_owner_auth("set_default_receive_library", (&context.eid, &receive_lib, &0u64));
73
+
74
+ // Try to set it as default without registering
75
+ let result = endpoint_client.try_set_default_receive_library(&context.eid, &receive_lib, &0u64);
76
+
77
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::OnlyRegisteredLib.into());
78
+ }
79
+
80
+ #[test]
81
+ fn test_set_default_receive_library_non_deployed_lib() {
82
+ let context = setup();
83
+ let env = &context.env;
84
+ let endpoint_client = &context.endpoint_client;
85
+
86
+ // Address without any contract deployed
87
+ let non_existent_lib = Address::generate(env);
88
+
89
+ // Mock owner auth for set_default_receive_library
90
+ context.mock_owner_auth("set_default_receive_library", (&context.eid, &non_existent_lib, &0u64));
91
+
92
+ // Try to set a non-existent contract as default
93
+ let result = endpoint_client.try_set_default_receive_library(&context.eid, &non_existent_lib, &0u64);
94
+
95
+ assert!(result.is_err());
96
+ }
97
+
98
+ #[test]
99
+ fn test_set_default_receive_library_success() {
100
+ let context = setup();
101
+ let env = &context.env;
102
+ let endpoint_client = &context.endpoint_client;
103
+
104
+ // Create and register a valid receive lib that supports eid 1
105
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
106
+
107
+ // Mock owner auth for register_library
108
+ context.mock_owner_auth("register_library", (&receive_lib,));
109
+ endpoint_client.register_library(&receive_lib);
110
+
111
+ // Verify initial state - default receive library should not be set
112
+ assert_eq!(endpoint_client.default_receive_library(&context.eid), None);
113
+ let initial_lib = env
114
+ .as_contract(&endpoint_client.address, || storage::EndpointStorage::default_receive_library(env, context.eid));
115
+ assert_eq!(initial_lib, None, "Initial default receive library should be None");
116
+
117
+ let initial_timeout = env.as_contract(&endpoint_client.address, || {
118
+ storage::EndpointStorage::default_receive_library_timeout(env, context.eid)
119
+ });
120
+ assert_eq!(initial_timeout, None, "Initial default receive library timeout should be None");
121
+
122
+ // Mock owner auth for set_default_receive_library
123
+ context.mock_owner_auth("set_default_receive_library", (&context.eid, &receive_lib, &0u64));
124
+
125
+ // Should succeed
126
+ endpoint_client.set_default_receive_library(&context.eid, &receive_lib, &0u64);
127
+
128
+ // Verify the events were published
129
+ assert_event(
130
+ env,
131
+ &endpoint_client.address,
132
+ DefaultReceiveLibrarySet { src_eid: context.eid, new_lib: receive_lib.clone() },
133
+ );
134
+ assert_event(
135
+ env,
136
+ &endpoint_client.address,
137
+ DefaultReceiveLibraryTimeoutSet { src_eid: context.eid, timeout: None },
138
+ );
139
+
140
+ // Verify it was set correctly via public interface
141
+ assert_eq!(endpoint_client.default_receive_library(&context.eid), Some(receive_lib.clone()));
142
+
143
+ // Assert storage changes directly
144
+ let stored_lib = env
145
+ .as_contract(&endpoint_client.address, || storage::EndpointStorage::default_receive_library(env, context.eid));
146
+ assert_eq!(stored_lib, Some(receive_lib), "Storage should contain the default receive library");
147
+
148
+ let stored_timeout = env.as_contract(&endpoint_client.address, || {
149
+ storage::EndpointStorage::default_receive_library_timeout(env, context.eid)
150
+ });
151
+ assert_eq!(stored_timeout, None, "Storage timeout should be None when grace_period is 0");
152
+ }
153
+
154
+ #[test]
155
+ fn test_set_default_receive_library_success_with_grace_period() {
156
+ let context = setup();
157
+ let env = &context.env;
158
+ let endpoint_client = &context.endpoint_client;
159
+
160
+ let current_timestamp = 1_700_000_000;
161
+ let grace_period = 1000;
162
+ // Set an arbitrary unix timestamp (seconds)
163
+ env.ledger().with_mut(|li| {
164
+ li.timestamp = current_timestamp;
165
+ });
166
+
167
+ // Create and register a valid receive lib that supports eid 1
168
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
169
+ let new_receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
170
+
171
+ // Mock owner auth for register_library
172
+ context.mock_owner_auth("register_library", (&receive_lib,));
173
+ endpoint_client.register_library(&receive_lib);
174
+ context.mock_owner_auth("register_library", (&new_receive_lib,));
175
+ endpoint_client.register_library(&new_receive_lib);
176
+
177
+ // first set the default receive library
178
+ context.mock_owner_auth("set_default_receive_library", (&context.eid, &receive_lib, &0u64));
179
+ endpoint_client.set_default_receive_library(&context.eid, &receive_lib, &0u64);
180
+
181
+ // then set the default receive library with the grace period
182
+ context.mock_owner_auth("set_default_receive_library", (&context.eid, &new_receive_lib, &grace_period));
183
+ endpoint_client.set_default_receive_library(&context.eid, &new_receive_lib, &grace_period);
184
+
185
+ let expected_timeout = Some(Timeout { lib: receive_lib.clone(), expiry: current_timestamp + grace_period });
186
+
187
+ // Verify the events were published
188
+ assert_event(
189
+ env,
190
+ &endpoint_client.address,
191
+ DefaultReceiveLibrarySet { src_eid: context.eid, new_lib: new_receive_lib.clone() },
192
+ );
193
+ assert_event(
194
+ env,
195
+ &endpoint_client.address,
196
+ DefaultReceiveLibraryTimeoutSet { src_eid: context.eid, timeout: expected_timeout.clone() },
197
+ );
198
+
199
+ // Verify it was set correctly via public interface
200
+ assert_eq!(endpoint_client.default_receive_library(&context.eid), Some(new_receive_lib.clone()));
201
+ assert_eq!(endpoint_client.default_receive_library_timeout(&context.eid), expected_timeout.clone());
202
+
203
+ // Assert storage changes directly
204
+ let stored_lib = env
205
+ .as_contract(&endpoint_client.address, || storage::EndpointStorage::default_receive_library(env, context.eid));
206
+ assert_eq!(stored_lib, Some(new_receive_lib), "Storage should contain the new default receive library");
207
+
208
+ let stored_timeout = env.as_contract(&endpoint_client.address, || {
209
+ storage::EndpointStorage::default_receive_library_timeout(env, context.eid)
210
+ });
211
+ assert_eq!(stored_timeout, expected_timeout, "Storage should contain the timeout");
212
+ }
213
+
214
+ #[test]
215
+ #[should_panic(expected = "Error(Auth, InvalidAction)")]
216
+ fn test_set_default_receive_library_requires_owner_auth() {
217
+ let context = setup();
218
+ let env = &context.env;
219
+ let endpoint_client = &context.endpoint_client;
220
+
221
+ let non_owner = Address::generate(env);
222
+
223
+ // Create and register a valid receive lib
224
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
225
+
226
+ // Mock owner auth for register_library
227
+ context.mock_owner_auth("register_library", (&receive_lib,));
228
+ endpoint_client.register_library(&receive_lib);
229
+
230
+ // Mock auth for the non-owner (not the owner)
231
+ context.mock_auth(&non_owner, "set_default_receive_library", (&context.eid, &receive_lib, &0u64));
232
+
233
+ // Should fail when non-owner tries to set
234
+ endpoint_client.set_default_receive_library(&context.eid, &receive_lib, &0u64);
235
+ }
236
+
237
+ #[test]
238
+ fn test_set_default_receive_library_same_value() {
239
+ let context = setup();
240
+ let env = &context.env;
241
+ let endpoint_client = &context.endpoint_client;
242
+
243
+ // Create and register a valid receive lib that supports eid 1
244
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
245
+
246
+ // Mock owner auth for register_library
247
+ context.mock_owner_auth("register_library", (&receive_lib,));
248
+ endpoint_client.register_library(&receive_lib);
249
+
250
+ // Mock owner auth for first set_default_receive_library
251
+ context.mock_owner_auth("set_default_receive_library", (&context.eid, &receive_lib, &0u64));
252
+ endpoint_client.set_default_receive_library(&context.eid, &receive_lib, &0u64);
253
+
254
+ // Mock owner auth for second set_default_receive_library (same value)
255
+ context.mock_owner_auth("set_default_receive_library", (&context.eid, &receive_lib, &0u64));
256
+
257
+ // Try to set the same library again
258
+ let result = endpoint_client.try_set_default_receive_library(&context.eid, &receive_lib, &0u64);
259
+
260
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::SameValue.into());
261
+ }
262
+
263
+ // Test with SendAndReceive library type (valid for receive)
264
+ #[test]
265
+ fn test_set_default_receive_library_with_send_and_receive_type() {
266
+ let context = setup();
267
+ let env = &context.env;
268
+ let endpoint_client = &context.endpoint_client;
269
+
270
+ // Create and register a SendAndReceive lib that supports eid 1
271
+ let send_and_receive_lib = context.setup_mock_message_lib(MessageLibType::SendAndReceive, vec![env, context.eid]);
272
+
273
+ // Mock owner auth for register_library
274
+ context.mock_owner_auth("register_library", (&send_and_receive_lib,));
275
+ endpoint_client.register_library(&send_and_receive_lib);
276
+
277
+ // Mock owner auth for set_default_receive_library
278
+ context.mock_owner_auth("set_default_receive_library", (&context.eid, &send_and_receive_lib, &0u64));
279
+
280
+ // Should succeed with SendAndReceive type
281
+ endpoint_client.set_default_receive_library(&context.eid, &send_and_receive_lib, &0u64);
282
+
283
+ // Verify it was set correctly
284
+ assert_eq!(endpoint_client.default_receive_library(&context.eid), Some(send_and_receive_lib));
285
+ }