@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,131 @@
1
+ use soroban_sdk::{
2
+ testutils::{Address as _, MockAuth, MockAuthInvoke},
3
+ vec, Address, IntoVal,
4
+ };
5
+
6
+ use crate::{errors::EndpointError, events::SendLibrarySet, storage, tests::endpoint_setup::setup, MessageLibType};
7
+ use utils::testing_utils::assert_event;
8
+
9
+ // Tests for set_send_library
10
+ #[test]
11
+ fn test_set_send_library_requires_oapp_auth() {
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 unauthorized_caller = Address::generate(env);
18
+
19
+ // Create and register a valid send lib
20
+ let send_lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
21
+
22
+ // Register the library with owner auth
23
+ context.mock_owner_auth("register_library", (&send_lib,));
24
+ endpoint_client.register_library(&send_lib);
25
+
26
+ // Mock auth for unauthorized caller (not the oapp or its delegate)
27
+ env.mock_auths(&[MockAuth {
28
+ address: &unauthorized_caller,
29
+ invoke: &MockAuthInvoke {
30
+ contract: &endpoint_client.address,
31
+ fn_name: "set_send_library",
32
+ args: (&unauthorized_caller, &oapp, &context.eid, &send_lib).into_val(env),
33
+ sub_invokes: &[],
34
+ },
35
+ }]);
36
+
37
+ // Should fail with Unauthorized error
38
+ let result = endpoint_client.try_set_send_library(&unauthorized_caller, &oapp, &context.eid, &Some(send_lib));
39
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::Unauthorized.into());
40
+ }
41
+
42
+ #[test]
43
+ fn test_set_send_library_same_value() {
44
+ let context = setup();
45
+ let env = &context.env;
46
+ let endpoint_client = &context.endpoint_client;
47
+
48
+ let oapp = Address::generate(env);
49
+
50
+ // Create and register a valid send lib
51
+ let send_lib_add = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
52
+ let send_lib = Some(send_lib_add.clone());
53
+ // Register the library with owner auth
54
+ context.mock_owner_auth("register_library", (&send_lib_add,));
55
+ endpoint_client.register_library(&send_lib_add);
56
+
57
+ // First set with oapp auth - oapp sets its own send library
58
+ env.mock_auths(&[MockAuth {
59
+ address: &oapp,
60
+ invoke: &MockAuthInvoke {
61
+ contract: &endpoint_client.address,
62
+ fn_name: "set_send_library",
63
+ args: (&oapp, &oapp, &context.eid, &send_lib).into_val(env),
64
+ sub_invokes: &[],
65
+ },
66
+ }]);
67
+ endpoint_client.set_send_library(&oapp, &oapp, &context.eid, &send_lib);
68
+
69
+ // Try to set the same library again with oapp auth
70
+ env.mock_auths(&[MockAuth {
71
+ address: &oapp,
72
+ invoke: &MockAuthInvoke {
73
+ contract: &endpoint_client.address,
74
+ fn_name: "set_send_library",
75
+ args: (&oapp, &oapp, &context.eid, &send_lib).into_val(env),
76
+ sub_invokes: &[],
77
+ },
78
+ }]);
79
+
80
+ let result = endpoint_client.try_set_send_library(&oapp, &oapp, &context.eid, &send_lib);
81
+
82
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::SameValue.into());
83
+ }
84
+
85
+ #[test]
86
+ fn test_set_send_library_success() {
87
+ let context = setup();
88
+ let env = &context.env;
89
+ let endpoint_client = &context.endpoint_client;
90
+
91
+ let oapp = Address::generate(env);
92
+
93
+ // Create and register a valid send lib
94
+ let send_lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
95
+
96
+ // Register the library with owner auth
97
+ context.mock_owner_auth("register_library", (&send_lib,));
98
+ endpoint_client.register_library(&send_lib);
99
+
100
+ // Verify it was not set
101
+ assert_eq!(
102
+ env.as_contract(&endpoint_client.address, || storage::EndpointStorage::send_library(env, &oapp, context.eid)),
103
+ None
104
+ );
105
+
106
+ // Set with oapp auth - oapp sets its own send library
107
+ env.mock_auths(&[MockAuth {
108
+ address: &oapp,
109
+ invoke: &MockAuthInvoke {
110
+ contract: &endpoint_client.address,
111
+ fn_name: "set_send_library",
112
+ args: (&oapp, &oapp, &context.eid, &send_lib).into_val(env),
113
+ sub_invokes: &[],
114
+ },
115
+ }]);
116
+
117
+ endpoint_client.set_send_library(&oapp, &oapp, &context.eid, &Some(send_lib.clone()));
118
+
119
+ // Verify the event was published
120
+ assert_event(
121
+ env,
122
+ &endpoint_client.address,
123
+ SendLibrarySet { sender: oapp.clone(), dst_eid: context.eid, new_lib: Some(send_lib.clone()) },
124
+ );
125
+
126
+ // Verify it was set correctly
127
+ assert_eq!(
128
+ env.as_contract(&endpoint_client.address, || storage::EndpointStorage::send_library(env, &oapp, context.eid)),
129
+ Some(send_lib)
130
+ );
131
+ }
@@ -0,0 +1,358 @@
1
+ use soroban_sdk::{testutils::Address as _, Address, BytesN, IntoVal};
2
+
3
+ use crate::{endpoint_v2::EndpointV2, events::PacketBurnt, storage, tests::endpoint_setup::setup};
4
+ use utils::testing_utils::assert_event;
5
+
6
+ #[test]
7
+ fn test_burn_success() {
8
+ let test_setup = setup();
9
+ let env = &test_setup.env;
10
+ let endpoint_client = &test_setup.endpoint_client;
11
+
12
+ let receiver = Address::generate(env);
13
+ let src_eid = 2;
14
+ let sender = BytesN::from_array(env, &[1u8; 32]);
15
+ let nonce = 1;
16
+ let payload_hash = BytesN::from_array(env, &[0xabu8; 32]);
17
+
18
+ // Set lazy nonce to 1 so nonce 1 is <= lazy nonce
19
+ env.as_contract(&endpoint_client.address, || {
20
+ storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &1)
21
+ });
22
+
23
+ // Store a payload hash first
24
+ env.as_contract(&endpoint_client.address, || {
25
+ EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce, &payload_hash)
26
+ });
27
+
28
+ // Verify payload hash is stored
29
+ let stored_hash = env.as_contract(&endpoint_client.address, || {
30
+ storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce)
31
+ });
32
+ assert_eq!(stored_hash, Some(payload_hash.clone()));
33
+
34
+ // Burn the payload
35
+ endpoint_client
36
+ .mock_auths(&[soroban_sdk::testutils::MockAuth {
37
+ address: &receiver,
38
+ invoke: &soroban_sdk::testutils::MockAuthInvoke {
39
+ contract: &endpoint_client.address,
40
+ fn_name: "burn",
41
+ args: (&receiver, &receiver, &src_eid, &sender, &nonce, &payload_hash).into_val(env),
42
+ sub_invokes: &[],
43
+ },
44
+ }])
45
+ .burn(&receiver, &receiver, &src_eid, &sender, &nonce, &payload_hash);
46
+
47
+ // Verify PacketBurnt event was emitted
48
+ assert_event(
49
+ env,
50
+ &endpoint_client.address,
51
+ PacketBurnt {
52
+ src_eid,
53
+ sender: sender.clone(),
54
+ receiver: receiver.clone(),
55
+ nonce,
56
+ payload_hash: payload_hash.clone(),
57
+ },
58
+ );
59
+
60
+ // Verify payload hash was removed
61
+ let removed_hash: Option<BytesN<32>> = env.as_contract(&endpoint_client.address, || {
62
+ storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce)
63
+ });
64
+ assert_eq!(removed_hash, None);
65
+ }
66
+
67
+ #[test]
68
+ fn test_burn_with_delegate() {
69
+ let test_setup = setup();
70
+ let env = &test_setup.env;
71
+ let endpoint_client = &test_setup.endpoint_client;
72
+
73
+ let receiver = Address::generate(env);
74
+ let delegate = Address::generate(env);
75
+ let src_eid = 2;
76
+ let sender = BytesN::from_array(env, &[1u8; 32]);
77
+ let nonce = 1;
78
+ let payload_hash = BytesN::from_array(env, &[0xcdu8; 32]);
79
+
80
+ // Set delegate for receiver
81
+ env.as_contract(&endpoint_client.address, || storage::EndpointStorage::set_delegate(env, &receiver, &delegate));
82
+
83
+ // Set lazy nonce to 1 so nonce 1 is <= lazy nonce
84
+ env.as_contract(&endpoint_client.address, || {
85
+ storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &1)
86
+ });
87
+
88
+ // Store a payload hash first
89
+ env.as_contract(&endpoint_client.address, || {
90
+ EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce, &payload_hash)
91
+ });
92
+
93
+ // Delegate can burn on behalf of receiver
94
+ endpoint_client
95
+ .mock_auths(&[soroban_sdk::testutils::MockAuth {
96
+ address: &delegate,
97
+ invoke: &soroban_sdk::testutils::MockAuthInvoke {
98
+ contract: &endpoint_client.address,
99
+ fn_name: "burn",
100
+ args: (&delegate, &receiver, &src_eid, &sender, &nonce, &payload_hash).into_val(env),
101
+ sub_invokes: &[],
102
+ },
103
+ }])
104
+ .burn(&delegate, &receiver, &src_eid, &sender, &nonce, &payload_hash);
105
+
106
+ // Verify PacketBurnt event was emitted
107
+ assert_event(
108
+ env,
109
+ &endpoint_client.address,
110
+ PacketBurnt {
111
+ src_eid,
112
+ sender: sender.clone(),
113
+ receiver: receiver.clone(),
114
+ nonce,
115
+ payload_hash: payload_hash.clone(),
116
+ },
117
+ );
118
+
119
+ // Verify payload hash was removed
120
+ let removed_hash = env.as_contract(&endpoint_client.address, || {
121
+ storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce)
122
+ });
123
+ assert_eq!(removed_hash, None);
124
+ }
125
+
126
+ #[test]
127
+ fn test_burn_multiple_payloads() {
128
+ let test_setup = setup();
129
+ let env = &test_setup.env;
130
+ let endpoint_client = &test_setup.endpoint_client;
131
+
132
+ let receiver = Address::generate(env);
133
+ let src_eid = 2;
134
+ let sender = BytesN::from_array(env, &[1u8; 32]);
135
+ let payload_hash1 = BytesN::from_array(env, &[0xabu8; 32]);
136
+ let payload_hash2 = BytesN::from_array(env, &[0xcdu8; 32]);
137
+ let nonce1 = 1;
138
+ let nonce2 = 2;
139
+
140
+ // Set lazy nonce to 2 so both nonces are <= lazy nonce
141
+ env.as_contract(&endpoint_client.address, || {
142
+ storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &2)
143
+ });
144
+
145
+ // Store multiple payload hashes
146
+ env.as_contract(&endpoint_client.address, || {
147
+ EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce1, &payload_hash1)
148
+ });
149
+ env.as_contract(&endpoint_client.address, || {
150
+ EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce2, &payload_hash2)
151
+ });
152
+
153
+ // Burn first payload
154
+ endpoint_client
155
+ .mock_auths(&[soroban_sdk::testutils::MockAuth {
156
+ address: &receiver,
157
+ invoke: &soroban_sdk::testutils::MockAuthInvoke {
158
+ contract: &endpoint_client.address,
159
+ fn_name: "burn",
160
+ args: (&receiver, &receiver, &src_eid, &sender, &nonce1, &payload_hash1).into_val(env),
161
+ sub_invokes: &[],
162
+ },
163
+ }])
164
+ .burn(&receiver, &receiver, &src_eid, &sender, &nonce1, &payload_hash1);
165
+
166
+ // Burn second payload
167
+ endpoint_client
168
+ .mock_auths(&[soroban_sdk::testutils::MockAuth {
169
+ address: &receiver,
170
+ invoke: &soroban_sdk::testutils::MockAuthInvoke {
171
+ contract: &endpoint_client.address,
172
+ fn_name: "burn",
173
+ args: (&receiver, &receiver, &src_eid, &sender, &nonce2, &payload_hash2).into_val(env),
174
+ sub_invokes: &[],
175
+ },
176
+ }])
177
+ .burn(&receiver, &receiver, &src_eid, &sender, &nonce2, &payload_hash2);
178
+
179
+ // Verify both payload hashes were removed
180
+ let removed_hash1 = env.as_contract(&endpoint_client.address, || {
181
+ storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce1)
182
+ });
183
+ let removed_hash2 = env.as_contract(&endpoint_client.address, || {
184
+ storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce2)
185
+ });
186
+
187
+ assert_eq!(removed_hash1, None);
188
+ assert_eq!(removed_hash2, None);
189
+ }
190
+
191
+ #[test]
192
+ fn test_burn_different_paths() {
193
+ let test_setup = setup();
194
+ let env = &test_setup.env;
195
+ let endpoint_client = &test_setup.endpoint_client;
196
+
197
+ let receiver1 = Address::generate(env);
198
+ let receiver2 = Address::generate(env);
199
+ let src_eid1 = 2;
200
+ let src_eid2 = 3;
201
+ let sender1 = BytesN::from_array(env, &[1u8; 32]);
202
+ let sender2 = BytesN::from_array(env, &[2u8; 32]);
203
+ let nonce = 1;
204
+ let payload_hash = BytesN::from_array(env, &[0xefu8; 32]);
205
+
206
+ // Set lazy nonces for all paths
207
+ env.as_contract(&endpoint_client.address, || {
208
+ storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver1, src_eid1, &sender1, &1)
209
+ });
210
+ env.as_contract(&endpoint_client.address, || {
211
+ storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver2, src_eid1, &sender1, &1)
212
+ });
213
+ env.as_contract(&endpoint_client.address, || {
214
+ storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver1, src_eid2, &sender1, &1)
215
+ });
216
+ env.as_contract(&endpoint_client.address, || {
217
+ storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver1, src_eid1, &sender2, &1)
218
+ });
219
+
220
+ // Store payload hashes for different paths
221
+ env.as_contract(&endpoint_client.address, || {
222
+ EndpointV2::inbound(env, &receiver1, src_eid1, &sender1, nonce, &payload_hash)
223
+ });
224
+ env.as_contract(&endpoint_client.address, || {
225
+ EndpointV2::inbound(env, &receiver2, src_eid1, &sender1, nonce, &payload_hash)
226
+ });
227
+ env.as_contract(&endpoint_client.address, || {
228
+ EndpointV2::inbound(env, &receiver1, src_eid2, &sender1, nonce, &payload_hash)
229
+ });
230
+ env.as_contract(&endpoint_client.address, || {
231
+ EndpointV2::inbound(env, &receiver1, src_eid1, &sender2, nonce, &payload_hash)
232
+ });
233
+
234
+ // Burn for different receivers
235
+ endpoint_client
236
+ .mock_auths(&[soroban_sdk::testutils::MockAuth {
237
+ address: &receiver1,
238
+ invoke: &soroban_sdk::testutils::MockAuthInvoke {
239
+ contract: &endpoint_client.address,
240
+ fn_name: "burn",
241
+ args: (&receiver1, &receiver1, &src_eid1, &sender1, &nonce, &payload_hash).into_val(env),
242
+ sub_invokes: &[],
243
+ },
244
+ }])
245
+ .burn(&receiver1, &receiver1, &src_eid1, &sender1, &nonce, &payload_hash);
246
+
247
+ endpoint_client
248
+ .mock_auths(&[soroban_sdk::testutils::MockAuth {
249
+ address: &receiver2,
250
+ invoke: &soroban_sdk::testutils::MockAuthInvoke {
251
+ contract: &endpoint_client.address,
252
+ fn_name: "burn",
253
+ args: (&receiver2, &receiver2, &src_eid1, &sender1, &nonce, &payload_hash).into_val(env),
254
+ sub_invokes: &[],
255
+ },
256
+ }])
257
+ .burn(&receiver2, &receiver2, &src_eid1, &sender1, &nonce, &payload_hash);
258
+
259
+ // Burn for different src_eids
260
+ endpoint_client
261
+ .mock_auths(&[soroban_sdk::testutils::MockAuth {
262
+ address: &receiver1,
263
+ invoke: &soroban_sdk::testutils::MockAuthInvoke {
264
+ contract: &endpoint_client.address,
265
+ fn_name: "burn",
266
+ args: (&receiver1, &receiver1, &src_eid2, &sender1, &nonce, &payload_hash).into_val(env),
267
+ sub_invokes: &[],
268
+ },
269
+ }])
270
+ .burn(&receiver1, &receiver1, &src_eid2, &sender1, &nonce, &payload_hash);
271
+
272
+ // Burn for different senders
273
+ endpoint_client
274
+ .mock_auths(&[soroban_sdk::testutils::MockAuth {
275
+ address: &receiver1,
276
+ invoke: &soroban_sdk::testutils::MockAuthInvoke {
277
+ contract: &endpoint_client.address,
278
+ fn_name: "burn",
279
+ args: (&receiver1, &receiver1, &src_eid1, &sender2, &nonce, &payload_hash).into_val(env),
280
+ sub_invokes: &[],
281
+ },
282
+ }])
283
+ .burn(&receiver1, &receiver1, &src_eid1, &sender2, &nonce, &payload_hash);
284
+
285
+ // Verify all paths have been burned independently
286
+ let removed_hash1 = env.as_contract(&endpoint_client.address, || {
287
+ storage::EndpointStorage::inbound_payload_hash(env, &receiver1, src_eid1, &sender1, nonce)
288
+ });
289
+ let removed_hash2 = env.as_contract(&endpoint_client.address, || {
290
+ storage::EndpointStorage::inbound_payload_hash(env, &receiver2, src_eid1, &sender1, nonce)
291
+ });
292
+ let removed_hash3 = env.as_contract(&endpoint_client.address, || {
293
+ storage::EndpointStorage::inbound_payload_hash(env, &receiver1, src_eid2, &sender1, nonce)
294
+ });
295
+ let removed_hash4 = env.as_contract(&endpoint_client.address, || {
296
+ storage::EndpointStorage::inbound_payload_hash(env, &receiver1, src_eid1, &sender2, nonce)
297
+ });
298
+
299
+ assert_eq!(removed_hash1, None);
300
+ assert_eq!(removed_hash2, None);
301
+ assert_eq!(removed_hash3, None);
302
+ assert_eq!(removed_hash4, None);
303
+ }
304
+
305
+ #[test]
306
+ fn test_burn_at_lazy_nonce_boundary() {
307
+ let test_setup = setup();
308
+ let env = &test_setup.env;
309
+ let endpoint_client = &test_setup.endpoint_client;
310
+
311
+ let receiver = Address::generate(env);
312
+ let src_eid = 2;
313
+ let sender = BytesN::from_array(env, &[1u8; 32]);
314
+ let nonce = 5;
315
+ let payload_hash = BytesN::from_array(env, &[0xabu8; 32]);
316
+
317
+ // Set lazy nonce to exactly the nonce we want to burn
318
+ env.as_contract(&endpoint_client.address, || {
319
+ storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &nonce)
320
+ });
321
+
322
+ // Store a payload hash
323
+ env.as_contract(&endpoint_client.address, || {
324
+ EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce, &payload_hash)
325
+ });
326
+
327
+ // Burn should succeed since nonce == lazy_nonce (nonce <= lazy_nonce)
328
+ endpoint_client
329
+ .mock_auths(&[soroban_sdk::testutils::MockAuth {
330
+ address: &receiver,
331
+ invoke: &soroban_sdk::testutils::MockAuthInvoke {
332
+ contract: &endpoint_client.address,
333
+ fn_name: "burn",
334
+ args: (&receiver, &receiver, &src_eid, &sender, &nonce, &payload_hash).into_val(env),
335
+ sub_invokes: &[],
336
+ },
337
+ }])
338
+ .burn(&receiver, &receiver, &src_eid, &sender, &nonce, &payload_hash);
339
+
340
+ // Verify PacketBurnt event was emitted
341
+ assert_event(
342
+ env,
343
+ &endpoint_client.address,
344
+ PacketBurnt {
345
+ src_eid,
346
+ sender: sender.clone(),
347
+ receiver: receiver.clone(),
348
+ nonce,
349
+ payload_hash: payload_hash.clone(),
350
+ },
351
+ );
352
+
353
+ // Verify payload hash was removed
354
+ let removed_hash = env.as_contract(&endpoint_client.address, || {
355
+ storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce)
356
+ });
357
+ assert_eq!(removed_hash, None);
358
+ }