@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,463 @@
1
+ use soroban_sdk::{
2
+ testutils::{Address as _, MockAuth, MockAuthInvoke},
3
+ vec, Address, IntoVal,
4
+ };
5
+
6
+ use crate::{
7
+ errors::Uln302Error,
8
+ interfaces::{ReceiveUln302Client, UlnConfig},
9
+ tests::setup::{setup, TestSetup, REMOTE_EID as SRC_EID},
10
+ };
11
+
12
+ use super::{create_test_packet_header, create_test_packet_header_with_eid, create_test_payload_hash, CONFIRMATIONS};
13
+
14
+ fn create_test_uln_config(env: &soroban_sdk::Env) -> UlnConfig {
15
+ // Config with 2 required DVNs and 1 optional DVN with threshold 1
16
+ UlnConfig::generate(env, CONFIRMATIONS, 2, 1, 1)
17
+ }
18
+
19
+ fn create_only_required_dvns_config(env: &soroban_sdk::Env) -> UlnConfig {
20
+ // Config with 2 required DVNs and no optional DVNs
21
+ UlnConfig::generate(env, CONFIRMATIONS, 2, 0, 0)
22
+ }
23
+
24
+ fn create_only_optional_dvns_config(env: &soroban_sdk::Env) -> UlnConfig {
25
+ // Config with no required DVNs and 1 optional DVN with threshold 1
26
+ UlnConfig::generate(env, CONFIRMATIONS, 0, 1, 1)
27
+ }
28
+
29
+ #[test]
30
+ fn test_verifiable_with_all_required_dvns() {
31
+ let test_setup = setup();
32
+ let TestSetup { env, uln302, .. } = &test_setup;
33
+
34
+ let dvn1 = Address::generate(env);
35
+ let dvn2 = Address::generate(env);
36
+ let receiver = Address::generate(env);
37
+
38
+ // Set up config with only required DVNs
39
+ let mut config = create_only_required_dvns_config(env);
40
+ config.required_dvns = vec![env, dvn1.clone(), dvn2.clone()];
41
+ TestSetup::set_default_receive_uln_config(&test_setup, SRC_EID, config);
42
+
43
+ let packet_header = create_test_packet_header(env, &receiver);
44
+ let payload_hash = create_test_payload_hash(env);
45
+
46
+ let receive_client = ReceiveUln302Client::new(env, &uln302.address);
47
+
48
+ // Initially not verifiable
49
+ assert!(!receive_client.verifiable(&packet_header, &payload_hash));
50
+
51
+ // DVN1 verifies
52
+ env.mock_auths(&[MockAuth {
53
+ address: &dvn1,
54
+ invoke: &MockAuthInvoke {
55
+ contract: &uln302.address,
56
+ fn_name: "verify",
57
+ args: (&dvn1, &packet_header, &payload_hash, &CONFIRMATIONS).into_val(env),
58
+ sub_invokes: &[],
59
+ },
60
+ }]);
61
+ receive_client.verify(&dvn1, &packet_header, &payload_hash, &CONFIRMATIONS);
62
+
63
+ // Still not verifiable (need both required DVNs)
64
+ assert!(!receive_client.verifiable(&packet_header, &payload_hash));
65
+
66
+ // DVN2 verifies
67
+ env.mock_auths(&[MockAuth {
68
+ address: &dvn2,
69
+ invoke: &MockAuthInvoke {
70
+ contract: &uln302.address,
71
+ fn_name: "verify",
72
+ args: (&dvn2, &packet_header, &payload_hash, &CONFIRMATIONS).into_val(env),
73
+ sub_invokes: &[],
74
+ },
75
+ }]);
76
+ receive_client.verify(&dvn2, &packet_header, &payload_hash, &CONFIRMATIONS);
77
+
78
+ // Now verifiable
79
+ assert!(receive_client.verifiable(&packet_header, &payload_hash));
80
+ }
81
+
82
+ #[test]
83
+ fn test_verifiable_with_optional_dvns_only() {
84
+ let test_setup = setup();
85
+ let TestSetup { env, uln302, .. } = &test_setup;
86
+
87
+ let dvn1 = Address::generate(env);
88
+ let receiver = Address::generate(env);
89
+
90
+ // Set up config with only optional DVNs
91
+ let mut config = create_only_optional_dvns_config(env);
92
+ config.optional_dvns = vec![env, dvn1.clone()];
93
+ config.optional_dvn_threshold = 1;
94
+ TestSetup::set_default_receive_uln_config(&test_setup, SRC_EID, config);
95
+
96
+ let packet_header = create_test_packet_header(env, &receiver);
97
+ let payload_hash = create_test_payload_hash(env);
98
+
99
+ let receive_client = ReceiveUln302Client::new(env, &uln302.address);
100
+
101
+ // Initially not verifiable
102
+ assert!(!receive_client.verifiable(&packet_header, &payload_hash));
103
+
104
+ // DVN1 verifies (meets threshold of 1)
105
+ env.mock_auths(&[MockAuth {
106
+ address: &dvn1,
107
+ invoke: &MockAuthInvoke {
108
+ contract: &uln302.address,
109
+ fn_name: "verify",
110
+ args: (&dvn1, &packet_header, &payload_hash, &CONFIRMATIONS).into_val(env),
111
+ sub_invokes: &[],
112
+ },
113
+ }]);
114
+ receive_client.verify(&dvn1, &packet_header, &payload_hash, &CONFIRMATIONS);
115
+
116
+ // Now verifiable
117
+ assert!(receive_client.verifiable(&packet_header, &payload_hash));
118
+ }
119
+
120
+ #[test]
121
+ fn test_verifiable_with_mixed_dvns() {
122
+ let test_setup = setup();
123
+ let TestSetup { env, uln302, .. } = &test_setup;
124
+
125
+ let dvn1 = Address::generate(env);
126
+ let dvn2 = Address::generate(env);
127
+ let dvn3 = Address::generate(env);
128
+ let receiver = Address::generate(env);
129
+
130
+ // Set up config with both required and optional DVNs
131
+ let mut config = create_test_uln_config(env);
132
+ config.required_dvns = vec![env, dvn1.clone(), dvn2.clone()];
133
+ config.optional_dvns = vec![env, dvn3.clone()];
134
+ config.optional_dvn_threshold = 1;
135
+ TestSetup::set_default_receive_uln_config(&test_setup, SRC_EID, config);
136
+
137
+ let packet_header = create_test_packet_header(env, &receiver);
138
+ let payload_hash = create_test_payload_hash(env);
139
+
140
+ let receive_client = ReceiveUln302Client::new(env, &uln302.address);
141
+
142
+ // Verify all DVNs
143
+ env.mock_auths(&[MockAuth {
144
+ address: &dvn1,
145
+ invoke: &MockAuthInvoke {
146
+ contract: &uln302.address,
147
+ fn_name: "verify",
148
+ args: (&dvn1, &packet_header, &payload_hash, &CONFIRMATIONS).into_val(env),
149
+ sub_invokes: &[],
150
+ },
151
+ }]);
152
+ receive_client.verify(&dvn1, &packet_header, &payload_hash, &CONFIRMATIONS);
153
+
154
+ env.mock_auths(&[MockAuth {
155
+ address: &dvn2,
156
+ invoke: &MockAuthInvoke {
157
+ contract: &uln302.address,
158
+ fn_name: "verify",
159
+ args: (&dvn2, &packet_header, &payload_hash, &CONFIRMATIONS).into_val(env),
160
+ sub_invokes: &[],
161
+ },
162
+ }]);
163
+ receive_client.verify(&dvn2, &packet_header, &payload_hash, &CONFIRMATIONS);
164
+
165
+ env.mock_auths(&[MockAuth {
166
+ address: &dvn3,
167
+ invoke: &MockAuthInvoke {
168
+ contract: &uln302.address,
169
+ fn_name: "verify",
170
+ args: (&dvn3, &packet_header, &payload_hash, &CONFIRMATIONS).into_val(env),
171
+ sub_invokes: &[],
172
+ },
173
+ }]);
174
+ receive_client.verify(&dvn3, &packet_header, &payload_hash, &CONFIRMATIONS);
175
+
176
+ // Now verifiable with all DVNs verified
177
+ assert!(receive_client.verifiable(&packet_header, &payload_hash));
178
+ }
179
+
180
+ #[test]
181
+ fn test_not_verifiable_missing_required_dvn() {
182
+ let test_setup = setup();
183
+ let TestSetup { env, uln302, .. } = &test_setup;
184
+
185
+ let dvn1 = Address::generate(env);
186
+ let dvn2 = Address::generate(env);
187
+ let receiver = Address::generate(env);
188
+
189
+ // Set up config with 2 required DVNs
190
+ let mut config = create_only_required_dvns_config(env);
191
+ config.required_dvns = vec![env, dvn1.clone(), dvn2.clone()];
192
+ test_setup.set_default_receive_uln_config(SRC_EID, config);
193
+
194
+ let packet_header = create_test_packet_header(env, &receiver);
195
+ let payload_hash = create_test_payload_hash(env);
196
+
197
+ let receive_client = ReceiveUln302Client::new(env, &uln302.address);
198
+
199
+ // Only DVN1 verifies (DVN2 missing)
200
+ env.mock_auths(&[MockAuth {
201
+ address: &dvn1,
202
+ invoke: &MockAuthInvoke {
203
+ contract: &uln302.address,
204
+ fn_name: "verify",
205
+ args: (&dvn1, &packet_header, &payload_hash, &CONFIRMATIONS).into_val(env),
206
+ sub_invokes: &[],
207
+ },
208
+ }]);
209
+ receive_client.verify(&dvn1, &packet_header, &payload_hash, &CONFIRMATIONS);
210
+
211
+ // Not verifiable because DVN2 hasn't verified
212
+ assert!(!receive_client.verifiable(&packet_header, &payload_hash));
213
+ }
214
+
215
+ #[test]
216
+ fn test_not_verifiable_optional_threshold_not_met() {
217
+ let test_setup = setup();
218
+ let TestSetup { env, uln302, .. } = &test_setup;
219
+
220
+ let dvn1 = Address::generate(env);
221
+ let dvn2 = Address::generate(env);
222
+ let dvn3 = Address::generate(env);
223
+ let receiver = Address::generate(env);
224
+
225
+ // Set up config with 3 optional DVNs and threshold of 2
226
+ let mut config = create_only_optional_dvns_config(env);
227
+ config.optional_dvns = vec![env, dvn1.clone(), dvn2.clone(), dvn3.clone()];
228
+ config.optional_dvn_threshold = 2; // Need 2 out of 3
229
+ TestSetup::set_default_receive_uln_config(&test_setup, SRC_EID, config);
230
+
231
+ let packet_header = create_test_packet_header(env, &receiver);
232
+ let payload_hash = create_test_payload_hash(env);
233
+
234
+ let receive_client = ReceiveUln302Client::new(env, &uln302.address);
235
+
236
+ // Only 1 optional DVN verifies (need 2)
237
+ env.mock_auths(&[MockAuth {
238
+ address: &dvn1,
239
+ invoke: &MockAuthInvoke {
240
+ contract: &uln302.address,
241
+ fn_name: "verify",
242
+ args: (&dvn1, &packet_header, &payload_hash, &CONFIRMATIONS).into_val(env),
243
+ sub_invokes: &[],
244
+ },
245
+ }]);
246
+ receive_client.verify(&dvn1, &packet_header, &payload_hash, &CONFIRMATIONS);
247
+
248
+ // Not verifiable because optional threshold not met
249
+ assert!(!receive_client.verifiable(&packet_header, &payload_hash));
250
+ }
251
+
252
+ #[test]
253
+ fn test_not_verifiable_insufficient_confirmations() {
254
+ let test_setup = setup();
255
+ let TestSetup { env, uln302, .. } = &test_setup;
256
+
257
+ let dvn1 = Address::generate(env);
258
+ let dvn2 = Address::generate(env);
259
+ let receiver = Address::generate(env);
260
+
261
+ // Set up config with 2 required DVNs
262
+ let mut config = create_only_required_dvns_config(env);
263
+ config.required_dvns = vec![env, dvn1.clone(), dvn2.clone()];
264
+ test_setup.set_default_receive_uln_config(SRC_EID, config);
265
+
266
+ let packet_header = create_test_packet_header(env, &receiver);
267
+ let payload_hash = create_test_payload_hash(env);
268
+
269
+ let receive_client = ReceiveUln302Client::new(env, &uln302.address);
270
+
271
+ // DVNs verify with insufficient confirmations
272
+ let insufficient_confirmations = CONFIRMATIONS - 1;
273
+
274
+ env.mock_auths(&[MockAuth {
275
+ address: &dvn1,
276
+ invoke: &MockAuthInvoke {
277
+ contract: &uln302.address,
278
+ fn_name: "verify",
279
+ args: (&dvn1, &packet_header, &payload_hash, &insufficient_confirmations).into_val(env),
280
+ sub_invokes: &[],
281
+ },
282
+ }]);
283
+ receive_client.verify(&dvn1, &packet_header, &payload_hash, &insufficient_confirmations);
284
+
285
+ env.mock_auths(&[MockAuth {
286
+ address: &dvn2,
287
+ invoke: &MockAuthInvoke {
288
+ contract: &uln302.address,
289
+ fn_name: "verify",
290
+ args: (&dvn2, &packet_header, &payload_hash, &insufficient_confirmations).into_val(env),
291
+ sub_invokes: &[],
292
+ },
293
+ }]);
294
+ receive_client.verify(&dvn2, &packet_header, &payload_hash, &insufficient_confirmations);
295
+
296
+ // Not verifiable because confirmations are insufficient
297
+ assert!(!receive_client.verifiable(&packet_header, &payload_hash));
298
+ }
299
+
300
+ #[test]
301
+ fn test_verifiable_with_higher_confirmations() {
302
+ let test_setup = setup();
303
+ let TestSetup { env, uln302, .. } = &test_setup;
304
+
305
+ let dvn1 = Address::generate(env);
306
+ let dvn2 = Address::generate(env);
307
+ let receiver = Address::generate(env);
308
+
309
+ // Set up config with 2 required DVNs
310
+ let mut config = create_only_required_dvns_config(env);
311
+ config.required_dvns = vec![env, dvn1.clone(), dvn2.clone()];
312
+ test_setup.set_default_receive_uln_config(SRC_EID, config);
313
+
314
+ let packet_header = create_test_packet_header(env, &receiver);
315
+ let payload_hash = create_test_payload_hash(env);
316
+
317
+ let receive_client = ReceiveUln302Client::new(env, &uln302.address);
318
+
319
+ // DVNs verify with more confirmations than required
320
+ env.mock_auths(&[MockAuth {
321
+ address: &dvn1,
322
+ invoke: &MockAuthInvoke {
323
+ contract: &uln302.address,
324
+ fn_name: "verify",
325
+ args: (&dvn1, &packet_header, &payload_hash, &(CONFIRMATIONS + 10)).into_val(env),
326
+ sub_invokes: &[],
327
+ },
328
+ }]);
329
+ receive_client.verify(&dvn1, &packet_header, &payload_hash, &(CONFIRMATIONS + 10));
330
+
331
+ env.mock_auths(&[MockAuth {
332
+ address: &dvn2,
333
+ invoke: &MockAuthInvoke {
334
+ contract: &uln302.address,
335
+ fn_name: "verify",
336
+ args: (&dvn2, &packet_header, &payload_hash, &(CONFIRMATIONS + 5)).into_val(env),
337
+ sub_invokes: &[],
338
+ },
339
+ }]);
340
+ receive_client.verify(&dvn2, &packet_header, &payload_hash, &(CONFIRMATIONS + 5));
341
+
342
+ // Verifiable because confirmations exceed requirement
343
+ assert!(receive_client.verifiable(&packet_header, &payload_hash));
344
+ }
345
+
346
+ #[test]
347
+ fn test_verifiable_invalid_eid() {
348
+ let test_setup = setup();
349
+ let TestSetup { env, uln302, .. } = &test_setup;
350
+
351
+ let receiver = Address::generate(env);
352
+
353
+ // Set up config
354
+ let config = create_only_required_dvns_config(env);
355
+ TestSetup::set_default_receive_uln_config(&test_setup, SRC_EID, config);
356
+
357
+ let invalid_eid = 999u32;
358
+ let packet_header = create_test_packet_header_with_eid(env, &receiver, invalid_eid);
359
+ let payload_hash = create_test_payload_hash(env);
360
+
361
+ let receive_client = ReceiveUln302Client::new(env, &uln302.address);
362
+
363
+ let result = receive_client.try_verifiable(&packet_header, &payload_hash);
364
+ assert_eq!(result.err().unwrap().ok().unwrap(), Uln302Error::InvalidEID.into());
365
+ }
366
+
367
+ #[test]
368
+ fn test_verifiable_optional_threshold_zero() {
369
+ let test_setup = setup();
370
+ let TestSetup { env, uln302, .. } = &test_setup;
371
+
372
+ let dvn1 = Address::generate(env);
373
+ let dvn2 = Address::generate(env);
374
+ let receiver = Address::generate(env);
375
+
376
+ // Set up config with required DVNs but optional threshold = 0
377
+ let mut config = create_only_required_dvns_config(env);
378
+ config.required_dvns = vec![env, dvn1.clone(), dvn2.clone()];
379
+ config.optional_dvn_threshold = 0;
380
+ TestSetup::set_default_receive_uln_config(&test_setup, SRC_EID, config);
381
+
382
+ let packet_header = create_test_packet_header(env, &receiver);
383
+ let payload_hash = create_test_payload_hash(env);
384
+
385
+ let receive_client = ReceiveUln302Client::new(env, &uln302.address);
386
+
387
+ // Verify all required DVNs
388
+ env.mock_auths(&[MockAuth {
389
+ address: &dvn1,
390
+ invoke: &MockAuthInvoke {
391
+ contract: &uln302.address,
392
+ fn_name: "verify",
393
+ args: (&dvn1, &packet_header, &payload_hash, &CONFIRMATIONS).into_val(env),
394
+ sub_invokes: &[],
395
+ },
396
+ }]);
397
+ receive_client.verify(&dvn1, &packet_header, &payload_hash, &CONFIRMATIONS);
398
+
399
+ env.mock_auths(&[MockAuth {
400
+ address: &dvn2,
401
+ invoke: &MockAuthInvoke {
402
+ contract: &uln302.address,
403
+ fn_name: "verify",
404
+ args: (&dvn2, &packet_header, &payload_hash, &CONFIRMATIONS).into_val(env),
405
+ sub_invokes: &[],
406
+ },
407
+ }]);
408
+ receive_client.verify(&dvn2, &packet_header, &payload_hash, &CONFIRMATIONS);
409
+
410
+ // Verifiable with all required DVNs and threshold = 0
411
+ assert!(receive_client.verifiable(&packet_header, &payload_hash));
412
+ }
413
+
414
+ #[test]
415
+ fn test_verifiable_partial_optional_verification() {
416
+ let test_setup = setup();
417
+ let TestSetup { env, uln302, .. } = &test_setup;
418
+
419
+ let dvn1 = Address::generate(env);
420
+ let dvn2 = Address::generate(env);
421
+ let dvn3 = Address::generate(env);
422
+ let receiver = Address::generate(env);
423
+
424
+ // Set up config with 1 required DVN and 2 optional DVNs with threshold of 1
425
+ let mut config = create_test_uln_config(env);
426
+ config.required_dvns = vec![env, dvn1.clone()];
427
+ config.optional_dvns = vec![env, dvn2.clone(), dvn3.clone()];
428
+ config.optional_dvn_threshold = 1; // Only need 1 out of 2
429
+ TestSetup::set_default_receive_uln_config(&test_setup, SRC_EID, config);
430
+
431
+ let packet_header = create_test_packet_header(env, &receiver);
432
+ let payload_hash = create_test_payload_hash(env);
433
+
434
+ let receive_client = ReceiveUln302Client::new(env, &uln302.address);
435
+
436
+ // Verify required DVN
437
+ env.mock_auths(&[MockAuth {
438
+ address: &dvn1,
439
+ invoke: &MockAuthInvoke {
440
+ contract: &uln302.address,
441
+ fn_name: "verify",
442
+ args: (&dvn1, &packet_header, &payload_hash, &CONFIRMATIONS).into_val(env),
443
+ sub_invokes: &[],
444
+ },
445
+ }]);
446
+ receive_client.verify(&dvn1, &packet_header, &payload_hash, &CONFIRMATIONS);
447
+
448
+ // Verify only one optional DVN (threshold = 1, so this is enough)
449
+ env.mock_auths(&[MockAuth {
450
+ address: &dvn2,
451
+ invoke: &MockAuthInvoke {
452
+ contract: &uln302.address,
453
+ fn_name: "verify",
454
+ args: (&dvn2, &packet_header, &payload_hash, &CONFIRMATIONS).into_val(env),
455
+ sub_invokes: &[],
456
+ },
457
+ }]);
458
+ receive_client.verify(&dvn2, &packet_header, &payload_hash, &CONFIRMATIONS);
459
+ // DVN3 doesn't verify
460
+
461
+ // Verifiable because threshold is met
462
+ assert!(receive_client.verifiable(&packet_header, &payload_hash));
463
+ }
@@ -0,0 +1,173 @@
1
+ use soroban_sdk::{
2
+ testutils::{Address as _, MockAuth, MockAuthInvoke},
3
+ Address, IntoVal,
4
+ };
5
+ use utils::testing_utils::assert_event;
6
+
7
+ use crate::{
8
+ events::PayloadVerified,
9
+ interfaces::ReceiveUln302Client,
10
+ tests::setup::{setup, TestSetup},
11
+ };
12
+
13
+ use super::{create_test_packet_header, create_test_payload_hash, CONFIRMATIONS};
14
+
15
+ #[test]
16
+ fn test_verify_stores_verification_correctly() {
17
+ let TestSetup { env, uln302, .. } = setup();
18
+ let dvn = Address::generate(&env);
19
+ let receiver = Address::generate(&env);
20
+
21
+ let packet_header = create_test_packet_header(&env, &receiver);
22
+ let payload_hash = create_test_payload_hash(&env);
23
+
24
+ let receive_client = ReceiveUln302Client::new(&env, &uln302.address);
25
+
26
+ // Mock DVN auth
27
+ env.mock_auths(&[MockAuth {
28
+ address: &dvn,
29
+ invoke: &MockAuthInvoke {
30
+ contract: &uln302.address,
31
+ fn_name: "verify",
32
+ args: (&dvn, &packet_header, &payload_hash, &CONFIRMATIONS).into_val(&env),
33
+ sub_invokes: &[],
34
+ },
35
+ }]);
36
+
37
+ receive_client.verify(&dvn, &packet_header, &payload_hash, &CONFIRMATIONS);
38
+
39
+ // Verify that verification was stored
40
+ let header_hash = endpoint_v2::util::keccak256(&env, &packet_header);
41
+ let confirmations = receive_client.confirmations(&dvn, &header_hash, &payload_hash);
42
+ assert!(confirmations.is_some());
43
+ assert_eq!(confirmations.unwrap(), CONFIRMATIONS);
44
+ }
45
+
46
+ #[test]
47
+ fn test_verify_multiple_dvns_same_payload() {
48
+ let TestSetup { env, uln302, .. } = setup();
49
+ let dvn1 = Address::generate(&env);
50
+ let dvn2 = Address::generate(&env);
51
+ let receiver = Address::generate(&env);
52
+
53
+ let packet_header = create_test_packet_header(&env, &receiver);
54
+ let payload_hash = create_test_payload_hash(&env);
55
+ let confirmations1 = 25u64;
56
+ let confirmations2 = 30u64;
57
+
58
+ let receive_client = ReceiveUln302Client::new(&env, &uln302.address);
59
+
60
+ // DVN1 verifies
61
+ env.mock_auths(&[MockAuth {
62
+ address: &dvn1,
63
+ invoke: &MockAuthInvoke {
64
+ contract: &uln302.address,
65
+ fn_name: "verify",
66
+ args: (&dvn1, &packet_header, &payload_hash, &confirmations1).into_val(&env),
67
+ sub_invokes: &[],
68
+ },
69
+ }]);
70
+ receive_client.verify(&dvn1, &packet_header, &payload_hash, &confirmations1);
71
+
72
+ // DVN2 verifies with different confirmations
73
+ env.mock_auths(&[MockAuth {
74
+ address: &dvn2,
75
+ invoke: &MockAuthInvoke {
76
+ contract: &uln302.address,
77
+ fn_name: "verify",
78
+ args: (&dvn2, &packet_header, &payload_hash, &confirmations2).into_val(&env),
79
+ sub_invokes: &[],
80
+ },
81
+ }]);
82
+ receive_client.verify(&dvn2, &packet_header, &payload_hash, &confirmations2);
83
+
84
+ // Verify both verifications were stored separately
85
+ let header_hash = endpoint_v2::util::keccak256(&env, &packet_header);
86
+ let received_confirmations1 = receive_client.confirmations(&dvn1, &header_hash, &payload_hash);
87
+ let received_confirmations2 = receive_client.confirmations(&dvn2, &header_hash, &payload_hash);
88
+
89
+ assert!(received_confirmations1.is_some());
90
+ assert_eq!(received_confirmations1.unwrap(), confirmations1);
91
+
92
+ assert!(received_confirmations2.is_some());
93
+ assert_eq!(received_confirmations2.unwrap(), confirmations2);
94
+ }
95
+
96
+ #[test]
97
+ fn test_verify_same_dvn_can_overwrite_verification() {
98
+ let TestSetup { env, uln302, .. } = setup();
99
+ let dvn = Address::generate(&env);
100
+ let receiver = Address::generate(&env);
101
+
102
+ let packet_header = create_test_packet_header(&env, &receiver);
103
+ let payload_hash = create_test_payload_hash(&env);
104
+ let confirmations1 = 25u64;
105
+ let confirmations2 = 35u64;
106
+
107
+ let receive_client = ReceiveUln302Client::new(&env, &uln302.address);
108
+
109
+ // DVN verifies first time
110
+ env.mock_auths(&[MockAuth {
111
+ address: &dvn,
112
+ invoke: &MockAuthInvoke {
113
+ contract: &uln302.address,
114
+ fn_name: "verify",
115
+ args: (&dvn, &packet_header, &payload_hash, &confirmations1).into_val(&env),
116
+ sub_invokes: &[],
117
+ },
118
+ }]);
119
+ receive_client.verify(&dvn, &packet_header, &payload_hash, &confirmations1);
120
+
121
+ // Verify first confirmation was stored
122
+ let header_hash = endpoint_v2::util::keccak256(&env, &packet_header);
123
+ let received_confirmations = receive_client.confirmations(&dvn, &header_hash, &payload_hash);
124
+ assert_eq!(received_confirmations.unwrap(), confirmations1);
125
+
126
+ // DVN verifies second time with different confirmations
127
+ env.mock_auths(&[MockAuth {
128
+ address: &dvn,
129
+ invoke: &MockAuthInvoke {
130
+ contract: &uln302.address,
131
+ fn_name: "verify",
132
+ args: (&dvn, &packet_header, &payload_hash, &confirmations2).into_val(&env),
133
+ sub_invokes: &[],
134
+ },
135
+ }]);
136
+ receive_client.verify(&dvn, &packet_header, &payload_hash, &confirmations2);
137
+
138
+ // Verify second confirmation overwrote the first
139
+ let received_confirmations = receive_client.confirmations(&dvn, &header_hash, &payload_hash);
140
+ assert_eq!(received_confirmations.unwrap(), confirmations2);
141
+ }
142
+
143
+ #[test]
144
+ fn test_verify_emits_event() {
145
+ let TestSetup { env, uln302, .. } = setup();
146
+ let dvn = Address::generate(&env);
147
+ let receiver = Address::generate(&env);
148
+
149
+ let packet_header = create_test_packet_header(&env, &receiver);
150
+ let payload_hash = create_test_payload_hash(&env);
151
+
152
+ let receive_client = ReceiveUln302Client::new(&env, &uln302.address);
153
+
154
+ // Mock DVN auth
155
+ env.mock_auths(&[MockAuth {
156
+ address: &dvn,
157
+ invoke: &MockAuthInvoke {
158
+ contract: &uln302.address,
159
+ fn_name: "verify",
160
+ args: (&dvn, &packet_header, &payload_hash, &CONFIRMATIONS).into_val(&env),
161
+ sub_invokes: &[],
162
+ },
163
+ }]);
164
+
165
+ receive_client.verify(&dvn, &packet_header, &payload_hash, &CONFIRMATIONS);
166
+
167
+ // Verify PayloadVerified event was emitted
168
+ assert_event(
169
+ &env,
170
+ &uln302.address,
171
+ PayloadVerified { dvn, header: packet_header, proof_hash: payload_hash, confirmations: CONFIRMATIONS },
172
+ );
173
+ }