@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,10 @@
1
+ mod burn;
2
+ mod clear;
3
+ mod inbound_nonce;
4
+ mod inbound_payload_hash;
5
+ mod internal;
6
+ mod lazy_inbound_nonce;
7
+ mod next_guid;
8
+ mod nilify;
9
+ mod outbound_nonce;
10
+ mod skip;
@@ -0,0 +1,239 @@
1
+ use soroban_sdk::{testutils::Address as _, Address, BytesN};
2
+
3
+ use crate::{storage, tests::endpoint_setup::setup, util};
4
+
5
+ #[test]
6
+ fn test_next_guid_basic() {
7
+ let test_setup = setup();
8
+ let env = &test_setup.env;
9
+ let endpoint_client = &test_setup.endpoint_client;
10
+
11
+ let sender = Address::generate(env);
12
+ let dst_eid = 2;
13
+ let receiver = BytesN::from_array(env, &[1u8; 32]);
14
+
15
+ // Initially outbound nonce should be 0, so next_guid should use nonce 1
16
+ let initial_outbound_nonce = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver);
17
+ assert_eq!(initial_outbound_nonce, 0);
18
+
19
+ // Get next GUID
20
+ let guid = endpoint_client.next_guid(&sender, &dst_eid, &receiver);
21
+
22
+ // Verify GUID is computed correctly using nonce 1
23
+ let expected_guid = env.as_contract(&endpoint_client.address, || {
24
+ util::compute_guid(env, 1, test_setup.eid, &sender, dst_eid, &receiver)
25
+ });
26
+ assert_eq!(guid, expected_guid);
27
+
28
+ // Verify outbound nonce hasn't changed (next_guid is a view function)
29
+ let after_outbound_nonce = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver);
30
+ assert_eq!(after_outbound_nonce, 0);
31
+ }
32
+
33
+ #[test]
34
+ fn test_next_guid_with_existing_nonce() {
35
+ let test_setup = setup();
36
+ let env = &test_setup.env;
37
+ let endpoint_client = &test_setup.endpoint_client;
38
+
39
+ let sender = Address::generate(env);
40
+ let dst_eid = 2;
41
+ let receiver = BytesN::from_array(env, &[1u8; 32]);
42
+
43
+ // Set outbound nonce to 5
44
+ env.as_contract(&endpoint_client.address, || {
45
+ storage::EndpointStorage::set_outbound_nonce(env, &sender, dst_eid, &receiver, &5)
46
+ });
47
+
48
+ // Verify outbound nonce is 5
49
+ let current_outbound_nonce = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver);
50
+ assert_eq!(current_outbound_nonce, 5);
51
+
52
+ // Get next GUID (should use nonce 6)
53
+ let guid = endpoint_client.next_guid(&sender, &dst_eid, &receiver);
54
+
55
+ // Verify GUID is computed correctly using nonce 6
56
+ let expected_guid = env.as_contract(&endpoint_client.address, || {
57
+ util::compute_guid(env, 6, test_setup.eid, &sender, dst_eid, &receiver)
58
+ });
59
+ assert_eq!(guid, expected_guid);
60
+
61
+ // Verify outbound nonce hasn't changed
62
+ let after_outbound_nonce = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver);
63
+ assert_eq!(after_outbound_nonce, 5);
64
+ }
65
+
66
+ #[test]
67
+ fn test_next_guid_different_senders() {
68
+ let test_setup = setup();
69
+ let env = &test_setup.env;
70
+ let endpoint_client = &test_setup.endpoint_client;
71
+
72
+ let sender1 = Address::generate(env);
73
+ let sender2 = Address::generate(env);
74
+ let dst_eid = 2;
75
+ let receiver = BytesN::from_array(env, &[1u8; 32]);
76
+
77
+ // Get GUIDs for different senders
78
+ let guid1 = endpoint_client.next_guid(&sender1, &dst_eid, &receiver);
79
+ let guid2 = endpoint_client.next_guid(&sender2, &dst_eid, &receiver);
80
+
81
+ // Verify GUIDs are different (different senders should produce different GUIDs)
82
+ assert_ne!(guid1, guid2);
83
+
84
+ // Verify both use nonce 1 (independent nonce counters)
85
+ let expected_guid1 = env.as_contract(&endpoint_client.address, || {
86
+ util::compute_guid(env, 1, test_setup.eid, &sender1, dst_eid, &receiver)
87
+ });
88
+ let expected_guid2 = env.as_contract(&endpoint_client.address, || {
89
+ util::compute_guid(env, 1, test_setup.eid, &sender2, dst_eid, &receiver)
90
+ });
91
+
92
+ assert_eq!(guid1, expected_guid1);
93
+ assert_eq!(guid2, expected_guid2);
94
+ }
95
+
96
+ #[test]
97
+ fn test_next_guid_different_dst_eids() {
98
+ let test_setup = setup();
99
+ let env = &test_setup.env;
100
+ let endpoint_client = &test_setup.endpoint_client;
101
+
102
+ let sender = Address::generate(env);
103
+ let dst_eid1 = 2;
104
+ let dst_eid2 = 3;
105
+ let receiver = BytesN::from_array(env, &[1u8; 32]);
106
+
107
+ // Get GUIDs for different destination EIDs
108
+ let guid1 = endpoint_client.next_guid(&sender, &dst_eid1, &receiver);
109
+ let guid2 = endpoint_client.next_guid(&sender, &dst_eid2, &receiver);
110
+
111
+ // Verify GUIDs are different (different dst_eids should produce different GUIDs)
112
+ assert_ne!(guid1, guid2);
113
+
114
+ // Verify both use nonce 1 (independent nonce counters per dst_eid)
115
+ let expected_guid1 = env.as_contract(&endpoint_client.address, || {
116
+ util::compute_guid(env, 1, test_setup.eid, &sender, dst_eid1, &receiver)
117
+ });
118
+ let expected_guid2 = env.as_contract(&endpoint_client.address, || {
119
+ util::compute_guid(env, 1, test_setup.eid, &sender, dst_eid2, &receiver)
120
+ });
121
+
122
+ assert_eq!(guid1, expected_guid1);
123
+ assert_eq!(guid2, expected_guid2);
124
+ }
125
+
126
+ #[test]
127
+ fn test_next_guid_different_receivers() {
128
+ let test_setup = setup();
129
+ let env = &test_setup.env;
130
+ let endpoint_client = &test_setup.endpoint_client;
131
+
132
+ let sender = Address::generate(env);
133
+ let dst_eid = 2;
134
+ let receiver1 = BytesN::from_array(env, &[1u8; 32]);
135
+ let receiver2 = BytesN::from_array(env, &[2u8; 32]);
136
+
137
+ // Get GUIDs for different receivers
138
+ let guid1 = endpoint_client.next_guid(&sender, &dst_eid, &receiver1);
139
+ let guid2 = endpoint_client.next_guid(&sender, &dst_eid, &receiver2);
140
+
141
+ // Verify GUIDs are different (different receivers should produce different GUIDs)
142
+ assert_ne!(guid1, guid2);
143
+
144
+ // Verify both use nonce 1 (independent nonce counters per receiver)
145
+ let expected_guid1 = env.as_contract(&endpoint_client.address, || {
146
+ util::compute_guid(env, 1, test_setup.eid, &sender, dst_eid, &receiver1)
147
+ });
148
+ let expected_guid2 = env.as_contract(&endpoint_client.address, || {
149
+ util::compute_guid(env, 1, test_setup.eid, &sender, dst_eid, &receiver2)
150
+ });
151
+
152
+ assert_eq!(guid1, expected_guid1);
153
+ assert_eq!(guid2, expected_guid2);
154
+ }
155
+
156
+ #[test]
157
+ fn test_next_guid_sequential_calls() {
158
+ let test_setup = setup();
159
+ let env = &test_setup.env;
160
+ let endpoint_client = &test_setup.endpoint_client;
161
+
162
+ let sender = Address::generate(env);
163
+ let dst_eid = 2;
164
+ let receiver = BytesN::from_array(env, &[1u8; 32]);
165
+
166
+ // Multiple calls to next_guid should return the same GUID (view function)
167
+ let guid1 = endpoint_client.next_guid(&sender, &dst_eid, &receiver);
168
+ let guid2 = endpoint_client.next_guid(&sender, &dst_eid, &receiver);
169
+ let guid3 = endpoint_client.next_guid(&sender, &dst_eid, &receiver);
170
+
171
+ // All GUIDs should be the same since outbound nonce hasn't changed
172
+ assert_eq!(guid1, guid2);
173
+ assert_eq!(guid2, guid3);
174
+
175
+ // All should use nonce 1
176
+ let expected_guid = env.as_contract(&endpoint_client.address, || {
177
+ util::compute_guid(env, 1, test_setup.eid, &sender, dst_eid, &receiver)
178
+ });
179
+ assert_eq!(guid1, expected_guid);
180
+ }
181
+
182
+ #[test]
183
+ fn test_next_guid_after_outbound_increment() {
184
+ let test_setup = setup();
185
+ let env = &test_setup.env;
186
+ let endpoint_client = &test_setup.endpoint_client;
187
+
188
+ let sender = Address::generate(env);
189
+ let dst_eid = 2;
190
+ let receiver = BytesN::from_array(env, &[1u8; 32]);
191
+
192
+ // Get initial GUID (should use nonce 1)
193
+ let guid1 = endpoint_client.next_guid(&sender, &dst_eid, &receiver);
194
+ let expected_guid1 = env.as_contract(&endpoint_client.address, || {
195
+ util::compute_guid(env, 1, test_setup.eid, &sender, dst_eid, &receiver)
196
+ });
197
+ assert_eq!(guid1, expected_guid1);
198
+
199
+ // Simulate incrementing outbound nonce (as would happen in actual send)
200
+ env.as_contract(&endpoint_client.address, || {
201
+ storage::EndpointStorage::set_outbound_nonce(env, &sender, dst_eid, &receiver, &1)
202
+ });
203
+
204
+ // Get next GUID (should now use nonce 2)
205
+ let guid2 = endpoint_client.next_guid(&sender, &dst_eid, &receiver);
206
+ let expected_guid2 = env.as_contract(&endpoint_client.address, || {
207
+ util::compute_guid(env, 2, test_setup.eid, &sender, dst_eid, &receiver)
208
+ });
209
+ assert_eq!(guid2, expected_guid2);
210
+
211
+ // Verify GUIDs are different
212
+ assert_ne!(guid1, guid2);
213
+ }
214
+
215
+ #[test]
216
+ fn test_next_guid_large_nonce() {
217
+ let test_setup = setup();
218
+ let env = &test_setup.env;
219
+ let endpoint_client = &test_setup.endpoint_client;
220
+
221
+ let sender = Address::generate(env);
222
+ let dst_eid = 2;
223
+ let receiver = BytesN::from_array(env, &[1u8; 32]);
224
+ let large_nonce = u64::MAX - 1;
225
+
226
+ // Set outbound nonce to a large value
227
+ env.as_contract(&endpoint_client.address, || {
228
+ storage::EndpointStorage::set_outbound_nonce(env, &sender, dst_eid, &receiver, &large_nonce)
229
+ });
230
+
231
+ // Get next GUID (should use nonce u64::MAX)
232
+ let guid = endpoint_client.next_guid(&sender, &dst_eid, &receiver);
233
+
234
+ // Verify GUID is computed correctly with large nonce
235
+ let expected_guid = env.as_contract(&endpoint_client.address, || {
236
+ util::compute_guid(env, u64::MAX, test_setup.eid, &sender, dst_eid, &receiver)
237
+ });
238
+ assert_eq!(guid, expected_guid);
239
+ }
@@ -0,0 +1,324 @@
1
+ use soroban_sdk::{testutils::Address as _, Address, BytesN, IntoVal};
2
+
3
+ use crate::{endpoint_v2::EndpointV2, events::PacketNilified, storage, tests::endpoint_setup::setup};
4
+ use utils::testing_utils::assert_event;
5
+
6
+ #[test]
7
+ fn test_nilify_success_with_stored_payload() {
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
+ // Store a payload hash first
19
+ env.as_contract(&endpoint_client.address, || {
20
+ EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce, &payload_hash)
21
+ });
22
+
23
+ // Verify payload hash is stored
24
+ let stored_hash = env.as_contract(&endpoint_client.address, || {
25
+ storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce)
26
+ });
27
+ assert_eq!(stored_hash, Some(payload_hash.clone()));
28
+
29
+ // Nilify the payload
30
+ endpoint_client
31
+ .mock_auths(&[soroban_sdk::testutils::MockAuth {
32
+ address: &receiver,
33
+ invoke: &soroban_sdk::testutils::MockAuthInvoke {
34
+ contract: &endpoint_client.address,
35
+ fn_name: "nilify",
36
+ args: (&receiver, &receiver, &src_eid, &sender, &nonce, &Some(payload_hash.clone())).into_val(env),
37
+ sub_invokes: &[],
38
+ },
39
+ }])
40
+ .nilify(&receiver, &receiver, &src_eid, &sender, &nonce, &Some(payload_hash.clone()));
41
+
42
+ // Verify PacketNilified event was emitted
43
+ assert_event(
44
+ env,
45
+ &endpoint_client.address,
46
+ PacketNilified {
47
+ src_eid,
48
+ sender: sender.clone(),
49
+ receiver: receiver.clone(),
50
+ nonce,
51
+ payload_hash: Some(payload_hash.clone()),
52
+ },
53
+ );
54
+
55
+ // Verify payload hash was replaced with nil hash
56
+ let nilified_hash = env.as_contract(&endpoint_client.address, || {
57
+ storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce)
58
+ });
59
+ let expected_nil_hash = env.as_contract(&endpoint_client.address, || EndpointV2::nil_payload_hash(env));
60
+ assert_eq!(nilified_hash, Some(expected_nil_hash));
61
+ }
62
+
63
+ #[test]
64
+ fn test_nilify_success_with_empty_payload() {
65
+ let test_setup = setup();
66
+ let env = &test_setup.env;
67
+ let endpoint_client = &test_setup.endpoint_client;
68
+
69
+ let receiver = Address::generate(env);
70
+ let src_eid = 2;
71
+ let sender = BytesN::from_array(env, &[1u8; 32]);
72
+ let nonce = 2;
73
+
74
+ // Set lazy nonce to 1 so nonce 2 is greater than lazy nonce
75
+ env.as_contract(&endpoint_client.address, || {
76
+ storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &1)
77
+ });
78
+
79
+ // Nilify with None
80
+ endpoint_client
81
+ .mock_auths(&[soroban_sdk::testutils::MockAuth {
82
+ address: &receiver,
83
+ invoke: &soroban_sdk::testutils::MockAuthInvoke {
84
+ contract: &endpoint_client.address,
85
+ fn_name: "nilify",
86
+ args: (&receiver, &receiver, &src_eid, &sender, &nonce, &None::<BytesN<32>>).into_val(env),
87
+ sub_invokes: &[],
88
+ },
89
+ }])
90
+ .nilify(&receiver, &receiver, &src_eid, &sender, &nonce, &None);
91
+
92
+ // Verify PacketNilified event was emitted
93
+ assert_event(
94
+ env,
95
+ &endpoint_client.address,
96
+ PacketNilified { src_eid, sender: sender.clone(), receiver: receiver.clone(), nonce, payload_hash: None },
97
+ );
98
+
99
+ // Verify payload hash was set to nil hash
100
+ let nilified_hash = env.as_contract(&endpoint_client.address, || {
101
+ storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce)
102
+ });
103
+ let expected_nil_hash = env.as_contract(&endpoint_client.address, || EndpointV2::nil_payload_hash(env));
104
+ assert_eq!(nilified_hash, Some(expected_nil_hash));
105
+ }
106
+
107
+ #[test]
108
+ fn test_nilify_with_delegate() {
109
+ let test_setup = setup();
110
+ let env = &test_setup.env;
111
+ let endpoint_client = &test_setup.endpoint_client;
112
+
113
+ let receiver = Address::generate(env);
114
+ let delegate = Address::generate(env);
115
+ let src_eid = 2;
116
+ let sender = BytesN::from_array(env, &[1u8; 32]);
117
+ let nonce = 1;
118
+ let payload_hash = BytesN::from_array(env, &[0xcdu8; 32]);
119
+
120
+ // Set delegate for receiver
121
+ env.as_contract(&endpoint_client.address, || storage::EndpointStorage::set_delegate(env, &receiver, &delegate));
122
+
123
+ // Store a payload hash first
124
+ env.as_contract(&endpoint_client.address, || {
125
+ EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce, &payload_hash)
126
+ });
127
+
128
+ // Delegate can nilify on behalf of receiver
129
+ endpoint_client
130
+ .mock_auths(&[soroban_sdk::testutils::MockAuth {
131
+ address: &delegate,
132
+ invoke: &soroban_sdk::testutils::MockAuthInvoke {
133
+ contract: &endpoint_client.address,
134
+ fn_name: "nilify",
135
+ args: (&delegate, &receiver, &src_eid, &sender, &nonce, &Some(payload_hash.clone())).into_val(env),
136
+ sub_invokes: &[],
137
+ },
138
+ }])
139
+ .nilify(&delegate, &receiver, &src_eid, &sender, &nonce, &Some(payload_hash.clone()));
140
+
141
+ // Verify PacketNilified event was emitted
142
+ assert_event(
143
+ env,
144
+ &endpoint_client.address,
145
+ PacketNilified {
146
+ src_eid,
147
+ sender: sender.clone(),
148
+ receiver: receiver.clone(),
149
+ nonce,
150
+ payload_hash: Some(payload_hash.clone()),
151
+ },
152
+ );
153
+
154
+ // Verify payload hash was replaced with nil hash
155
+ let nilified_hash = env.as_contract(&endpoint_client.address, || {
156
+ storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce)
157
+ });
158
+ let expected_nil_hash = env.as_contract(&endpoint_client.address, || EndpointV2::nil_payload_hash(env));
159
+ assert_eq!(nilified_hash, Some(expected_nil_hash));
160
+ }
161
+
162
+ #[test]
163
+ fn test_nilify_multiple_payloads() {
164
+ let test_setup = setup();
165
+ let env = &test_setup.env;
166
+ let endpoint_client = &test_setup.endpoint_client;
167
+
168
+ let receiver = Address::generate(env);
169
+ let src_eid = 2;
170
+ let sender = BytesN::from_array(env, &[1u8; 32]);
171
+ let payload_hash1 = BytesN::from_array(env, &[0xabu8; 32]);
172
+ let payload_hash2 = BytesN::from_array(env, &[0xcdu8; 32]);
173
+ let nonce1 = 1;
174
+ let nonce2 = 2;
175
+
176
+ // Store multiple payload hashes
177
+ env.as_contract(&endpoint_client.address, || {
178
+ EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce1, &payload_hash1)
179
+ });
180
+ env.as_contract(&endpoint_client.address, || {
181
+ EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce2, &payload_hash2)
182
+ });
183
+
184
+ // Nilify first payload
185
+ endpoint_client
186
+ .mock_auths(&[soroban_sdk::testutils::MockAuth {
187
+ address: &receiver,
188
+ invoke: &soroban_sdk::testutils::MockAuthInvoke {
189
+ contract: &endpoint_client.address,
190
+ fn_name: "nilify",
191
+ args: (&receiver, &receiver, &src_eid, &sender, &nonce1, &Some(payload_hash1.clone())).into_val(env),
192
+ sub_invokes: &[],
193
+ },
194
+ }])
195
+ .nilify(&receiver, &receiver, &src_eid, &sender, &nonce1, &Some(payload_hash1.clone()));
196
+
197
+ // Nilify second payload
198
+ endpoint_client
199
+ .mock_auths(&[soroban_sdk::testutils::MockAuth {
200
+ address: &receiver,
201
+ invoke: &soroban_sdk::testutils::MockAuthInvoke {
202
+ contract: &endpoint_client.address,
203
+ fn_name: "nilify",
204
+ args: (&receiver, &receiver, &src_eid, &sender, &nonce2, &Some(payload_hash2.clone())).into_val(env),
205
+ sub_invokes: &[],
206
+ },
207
+ }])
208
+ .nilify(&receiver, &receiver, &src_eid, &sender, &nonce2, &Some(payload_hash2.clone()));
209
+
210
+ // Verify both payload hashes were replaced with nil hash
211
+ let expected_nil_hash = env.as_contract(&endpoint_client.address, || EndpointV2::nil_payload_hash(env));
212
+
213
+ let nilified_hash1 = env.as_contract(&endpoint_client.address, || {
214
+ storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce1)
215
+ });
216
+ let nilified_hash2 = env.as_contract(&endpoint_client.address, || {
217
+ storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce2)
218
+ });
219
+
220
+ assert_eq!(nilified_hash1, Some(expected_nil_hash.clone()));
221
+ assert_eq!(nilified_hash2, Some(expected_nil_hash));
222
+ }
223
+
224
+ #[test]
225
+ fn test_nilify_different_paths() {
226
+ let test_setup = setup();
227
+ let env = &test_setup.env;
228
+ let endpoint_client = &test_setup.endpoint_client;
229
+
230
+ let receiver1 = Address::generate(env);
231
+ let receiver2 = Address::generate(env);
232
+ let src_eid1 = 2;
233
+ let src_eid2 = 3;
234
+ let sender1 = BytesN::from_array(env, &[1u8; 32]);
235
+ let sender2 = BytesN::from_array(env, &[2u8; 32]);
236
+ let nonce = 1;
237
+ let payload_hash = BytesN::from_array(env, &[0xefu8; 32]);
238
+
239
+ // Store payload hashes for different paths
240
+ env.as_contract(&endpoint_client.address, || {
241
+ EndpointV2::inbound(env, &receiver1, src_eid1, &sender1, nonce, &payload_hash)
242
+ });
243
+ env.as_contract(&endpoint_client.address, || {
244
+ EndpointV2::inbound(env, &receiver2, src_eid1, &sender1, nonce, &payload_hash)
245
+ });
246
+ env.as_contract(&endpoint_client.address, || {
247
+ EndpointV2::inbound(env, &receiver1, src_eid2, &sender1, nonce, &payload_hash)
248
+ });
249
+ env.as_contract(&endpoint_client.address, || {
250
+ EndpointV2::inbound(env, &receiver1, src_eid1, &sender2, nonce, &payload_hash)
251
+ });
252
+
253
+ // Nilify for different receivers
254
+ endpoint_client
255
+ .mock_auths(&[soroban_sdk::testutils::MockAuth {
256
+ address: &receiver1,
257
+ invoke: &soroban_sdk::testutils::MockAuthInvoke {
258
+ contract: &endpoint_client.address,
259
+ fn_name: "nilify",
260
+ args: (&receiver1, &receiver1, &src_eid1, &sender1, &nonce, &Some(payload_hash.clone())).into_val(env),
261
+ sub_invokes: &[],
262
+ },
263
+ }])
264
+ .nilify(&receiver1, &receiver1, &src_eid1, &sender1, &nonce, &Some(payload_hash.clone()));
265
+
266
+ endpoint_client
267
+ .mock_auths(&[soroban_sdk::testutils::MockAuth {
268
+ address: &receiver2,
269
+ invoke: &soroban_sdk::testutils::MockAuthInvoke {
270
+ contract: &endpoint_client.address,
271
+ fn_name: "nilify",
272
+ args: (&receiver2, &receiver2, &src_eid1, &sender1, &nonce, &Some(payload_hash.clone())).into_val(env),
273
+ sub_invokes: &[],
274
+ },
275
+ }])
276
+ .nilify(&receiver2, &receiver2, &src_eid1, &sender1, &nonce, &Some(payload_hash.clone()));
277
+
278
+ // Nilify for different src_eids
279
+ endpoint_client
280
+ .mock_auths(&[soroban_sdk::testutils::MockAuth {
281
+ address: &receiver1,
282
+ invoke: &soroban_sdk::testutils::MockAuthInvoke {
283
+ contract: &endpoint_client.address,
284
+ fn_name: "nilify",
285
+ args: (&receiver1, &receiver1, &src_eid2, &sender1, &nonce, &Some(payload_hash.clone())).into_val(env),
286
+ sub_invokes: &[],
287
+ },
288
+ }])
289
+ .nilify(&receiver1, &receiver1, &src_eid2, &sender1, &nonce, &Some(payload_hash.clone()));
290
+
291
+ // Nilify for different senders
292
+ endpoint_client
293
+ .mock_auths(&[soroban_sdk::testutils::MockAuth {
294
+ address: &receiver1,
295
+ invoke: &soroban_sdk::testutils::MockAuthInvoke {
296
+ contract: &endpoint_client.address,
297
+ fn_name: "nilify",
298
+ args: (&receiver1, &receiver1, &src_eid1, &sender2, &nonce, &Some(payload_hash.clone())).into_val(env),
299
+ sub_invokes: &[],
300
+ },
301
+ }])
302
+ .nilify(&receiver1, &receiver1, &src_eid1, &sender2, &nonce, &Some(payload_hash.clone()));
303
+
304
+ // Verify all paths have been nilified independently
305
+ let expected_nil_hash = env.as_contract(&endpoint_client.address, || EndpointV2::nil_payload_hash(env));
306
+
307
+ let nilified_hash1 = env.as_contract(&endpoint_client.address, || {
308
+ storage::EndpointStorage::inbound_payload_hash(env, &receiver1, src_eid1, &sender1, nonce)
309
+ });
310
+ let nilified_hash2 = env.as_contract(&endpoint_client.address, || {
311
+ storage::EndpointStorage::inbound_payload_hash(env, &receiver2, src_eid1, &sender1, nonce)
312
+ });
313
+ let nilified_hash3 = env.as_contract(&endpoint_client.address, || {
314
+ storage::EndpointStorage::inbound_payload_hash(env, &receiver1, src_eid2, &sender1, nonce)
315
+ });
316
+ let nilified_hash4 = env.as_contract(&endpoint_client.address, || {
317
+ storage::EndpointStorage::inbound_payload_hash(env, &receiver1, src_eid1, &sender2, nonce)
318
+ });
319
+
320
+ assert_eq!(nilified_hash1, Some(expected_nil_hash.clone()));
321
+ assert_eq!(nilified_hash2, Some(expected_nil_hash.clone()));
322
+ assert_eq!(nilified_hash3, Some(expected_nil_hash.clone()));
323
+ assert_eq!(nilified_hash4, Some(expected_nil_hash));
324
+ }