@layerzerolabs/protocol-stellar-v2 0.2.8 → 0.2.10

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 (239) hide show
  1. package/.turbo/turbo-build.log +443 -302
  2. package/.turbo/turbo-lint.log +118 -96
  3. package/.turbo/turbo-test.log +853 -731
  4. package/Cargo.lock +120 -37
  5. package/Cargo.toml +8 -5
  6. package/contracts/common-macros/src/contract_impl.rs +44 -0
  7. package/contracts/common-macros/src/lib.rs +86 -40
  8. package/contracts/common-macros/src/ownable.rs +24 -32
  9. package/contracts/common-macros/src/storage.rs +95 -120
  10. package/contracts/common-macros/src/tests/contract_impl.rs +289 -0
  11. package/contracts/common-macros/src/tests/mod.rs +9 -0
  12. package/contracts/common-macros/src/tests/ownable.rs +151 -0
  13. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_impl__snapshot_generated_contract_impl_code.snap +85 -0
  14. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +30 -0
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_only_owner_preserves_function_signature.snap +9 -0
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +1072 -0
  17. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +45 -0
  18. package/contracts/common-macros/src/tests/storage.rs +485 -0
  19. package/contracts/common-macros/src/tests/test_helpers.rs +93 -0
  20. package/contracts/common-macros/src/tests/ttl_configurable.rs +34 -0
  21. package/contracts/common-macros/src/ttl_configurable.rs +31 -14
  22. package/contracts/common-macros/src/utils.rs +27 -0
  23. package/contracts/endpoint-v2/ARCHITECTURE.md +4 -4
  24. package/contracts/endpoint-v2/src/endpoint_v2.rs +18 -15
  25. package/contracts/endpoint-v2/src/interfaces/message_lib.rs +2 -3
  26. package/contracts/endpoint-v2/src/interfaces/message_lib_manager.rs +5 -3
  27. package/contracts/endpoint-v2/src/interfaces/messaging_channel.rs +2 -2
  28. package/contracts/endpoint-v2/src/interfaces/messaging_composer.rs +2 -2
  29. package/contracts/endpoint-v2/src/interfaces/send_lib.rs +4 -4
  30. package/contracts/endpoint-v2/src/lib.rs +6 -5
  31. package/contracts/endpoint-v2/src/message_lib_manager.rs +14 -6
  32. package/contracts/endpoint-v2/src/messaging_channel.rs +6 -2
  33. package/contracts/endpoint-v2/src/messaging_composer.rs +6 -2
  34. package/contracts/endpoint-v2/src/storage.rs +10 -7
  35. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +16 -16
  36. package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +46 -46
  37. package/contracts/endpoint-v2/src/tests/mock.rs +2 -2
  38. package/contracts/endpoint-v2/src/util.rs +8 -2
  39. package/contracts/message-libs/block-message-lib/Cargo.toml +1 -0
  40. package/contracts/message-libs/block-message-lib/src/lib.rs +5 -5
  41. package/contracts/message-libs/message-lib-common/src/errors.rs +8 -8
  42. package/contracts/message-libs/message-lib-common/src/interfaces/dvn.rs +0 -1
  43. package/contracts/message-libs/message-lib-common/src/interfaces/mod.rs +3 -3
  44. package/contracts/message-libs/message-lib-common/src/lib.rs +0 -2
  45. package/contracts/message-libs/message-lib-common/src/packet_codec_v1.rs +4 -6
  46. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +2 -2
  47. package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +11 -11
  48. package/contracts/message-libs/message-lib-common/src/worker_options.rs +10 -16
  49. package/contracts/message-libs/simple-message-lib/src/errors.rs +0 -4
  50. package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +49 -34
  51. package/contracts/message-libs/simple-message-lib/src/storage.rs +3 -7
  52. package/contracts/message-libs/simple-message-lib/src/test.rs +3 -3
  53. package/contracts/message-libs/treasury/src/storage.rs +1 -2
  54. package/contracts/message-libs/treasury/src/tests/setup.rs +3 -2
  55. package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +0 -13
  56. package/contracts/message-libs/treasury/src/treasury.rs +18 -21
  57. package/contracts/message-libs/uln-302/Cargo.toml +1 -0
  58. package/contracts/message-libs/uln-302/src/interfaces/mod.rs +4 -4
  59. package/contracts/message-libs/uln-302/src/interfaces/{receive.rs → receive_uln.rs} +3 -3
  60. package/contracts/message-libs/uln-302/src/interfaces/{send.rs → send_uln.rs} +8 -80
  61. package/contracts/message-libs/uln-302/src/lib.rs +5 -4
  62. package/contracts/message-libs/uln-302/src/{receive.rs → receive_uln.rs} +20 -12
  63. package/contracts/message-libs/uln-302/src/{send.rs → send_uln.rs} +19 -13
  64. package/contracts/message-libs/uln-302/src/storage.rs +1 -2
  65. package/contracts/message-libs/uln-302/src/tests/config/uln_config.rs +3 -2
  66. package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +30 -30
  67. package/contracts/message-libs/uln-302/src/tests/setup.rs +12 -11
  68. package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +1 -1
  69. package/contracts/message-libs/uln-302/src/{config_validation.rs → types.rs} +79 -11
  70. package/contracts/message-libs/uln-302/src/uln302.rs +15 -10
  71. package/contracts/oapp-macros/Cargo.toml +2 -8
  72. package/contracts/oapp-macros/src/lib.rs +57 -311
  73. package/contracts/oapp-macros/src/oapp_core.rs +23 -32
  74. package/contracts/oapp-macros/src/oapp_full.rs +8 -2
  75. package/contracts/oapp-macros/src/oapp_options_type3.rs +21 -36
  76. package/contracts/oapp-macros/src/oapp_receiver.rs +38 -57
  77. package/contracts/oapp-macros/src/oapp_sender.rs +12 -14
  78. package/contracts/oapp-macros/src/util.rs +14 -10
  79. package/contracts/oapps/counter/Cargo.toml +2 -1
  80. package/contracts/oapps/counter/integration_tests/utils.rs +4 -4
  81. package/contracts/oapps/counter/src/codec.rs +8 -9
  82. package/contracts/oapps/counter/src/counter.rs +156 -147
  83. package/contracts/oapps/counter/src/storage.rs +1 -2
  84. package/contracts/oapps/counter/src/tests/test_codec.rs +5 -5
  85. package/contracts/oapps/counter/src/tests/test_counter.rs +11 -13
  86. package/contracts/oapps/oapp/Cargo.toml +1 -0
  87. package/contracts/oapps/oapp/src/errors.rs +1 -1
  88. package/contracts/oapps/oapp/src/lib.rs +3 -0
  89. package/contracts/oapps/oapp/src/macro_tests/mod.rs +1 -0
  90. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +312 -0
  91. package/contracts/oapps/oapp/src/oapp_core.rs +52 -53
  92. package/contracts/oapps/oapp/src/oapp_options_type3.rs +18 -28
  93. package/contracts/oapps/oapp/src/oapp_receiver.rs +82 -31
  94. package/contracts/oapps/oapp/src/oapp_sender.rs +55 -13
  95. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +16 -3
  96. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +33 -8
  97. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +6 -9
  98. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +28 -15
  99. package/contracts/oapps/oft/Cargo.toml +27 -0
  100. package/contracts/oapps/oft/integration-tests/mod.rs +3 -0
  101. package/contracts/oapps/oft/integration-tests/setup.rs +320 -0
  102. package/contracts/oapps/oft/integration-tests/test_with_sml.rs +155 -0
  103. package/contracts/oapps/oft/integration-tests/utils.rs +201 -0
  104. package/contracts/oapps/oft/src/codec/mod.rs +2 -0
  105. package/contracts/oapps/oft/src/codec/oft_compose_msg_codec.rs +55 -0
  106. package/contracts/oapps/oft/src/codec/oft_msg_codec.rs +62 -0
  107. package/contracts/oapps/oft/src/constants.rs +5 -0
  108. package/contracts/oapps/oft/src/errors.rs +8 -0
  109. package/contracts/oapps/oft/src/events.rs +19 -0
  110. package/contracts/oapps/oft/src/interfaces/mint_burn_token.rs +23 -0
  111. package/contracts/oapps/oft/src/interfaces/mod.rs +3 -0
  112. package/contracts/oapps/oft/src/lib.rs +22 -0
  113. package/contracts/oapps/oft/src/macro_tests/mod.rs +2 -0
  114. package/contracts/oapps/oft/src/macro_tests/test_all_default.rs +41 -0
  115. package/contracts/oapps/oft/src/macro_tests/test_override.rs +83 -0
  116. package/contracts/oapps/oft/src/oft.rs +320 -0
  117. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +50 -0
  118. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +50 -0
  119. package/contracts/oapps/oft/src/oft_types/mod.rs +10 -0
  120. package/contracts/oapps/oft/src/storage.rs +11 -0
  121. package/contracts/oapps/oft/src/tests/mod.rs +13 -0
  122. package/contracts/oapps/oft/src/tests/test_decimals.rs +89 -0
  123. package/contracts/oapps/oft/src/tests/test_lz_receive.rs +282 -0
  124. package/contracts/oapps/oft/src/tests/test_oft_compose_msg_codec.rs +68 -0
  125. package/contracts/oapps/oft/src/tests/test_oft_msg_codec.rs +136 -0
  126. package/contracts/oapps/oft/src/tests/test_oft_version.rs +13 -0
  127. package/contracts/oapps/oft/src/tests/test_quote_oft.rs +159 -0
  128. package/contracts/oapps/oft/src/tests/test_quote_send.rs +195 -0
  129. package/contracts/oapps/oft/src/tests/test_resolve_address.rs +37 -0
  130. package/contracts/oapps/oft/src/tests/test_send.rs +915 -0
  131. package/contracts/oapps/oft/src/tests/test_token.rs +47 -0
  132. package/contracts/oapps/oft/src/tests/test_utils.rs +789 -0
  133. package/contracts/oapps/oft/src/types.rs +38 -0
  134. package/contracts/oapps/oft/src/utils.rs +67 -0
  135. package/contracts/oapps/oft-mint-burn/Cargo.toml +26 -0
  136. package/contracts/oapps/oft-mint-burn/src/lib.rs +3 -0
  137. package/contracts/oapps/oft-mint-burn/src/oft.rs +28 -0
  138. package/contracts/oapps/oft-mint-burn/src/tests/mod.rs +1 -0
  139. package/contracts/utils/src/buffer_reader.rs +8 -9
  140. package/contracts/utils/src/buffer_writer.rs +11 -5
  141. package/contracts/utils/src/errors.rs +5 -5
  142. package/contracts/utils/src/ownable.rs +14 -6
  143. package/contracts/utils/src/testing_utils.rs +11 -1
  144. package/contracts/utils/src/tests/buffer_reader.rs +491 -730
  145. package/contracts/utils/src/tests/buffer_writer.rs +336 -148
  146. package/contracts/utils/src/tests/bytes_ext.rs +125 -40
  147. package/contracts/utils/src/tests/mod.rs +3 -0
  148. package/contracts/utils/src/tests/ownable.rs +379 -27
  149. package/contracts/utils/src/tests/test_helper.rs +47 -0
  150. package/contracts/utils/src/tests/testing_utils.rs +555 -0
  151. package/contracts/utils/src/tests/ttl.rs +421 -0
  152. package/contracts/utils/src/ttl.rs +29 -89
  153. package/contracts/workers/dvn/Cargo.toml +31 -0
  154. package/contracts/workers/dvn/src/auth.rs +66 -0
  155. package/contracts/workers/dvn/src/dvn.rs +143 -0
  156. package/contracts/workers/dvn/src/errors.rs +21 -0
  157. package/contracts/workers/dvn/src/events.rs +19 -0
  158. package/contracts/workers/dvn/src/interfaces/dvn.rs +12 -0
  159. package/contracts/workers/dvn/src/interfaces/mod.rs +5 -0
  160. package/contracts/workers/dvn/src/interfaces/multisig.rs +15 -0
  161. package/contracts/workers/dvn/src/lib.rs +24 -0
  162. package/contracts/workers/dvn/src/multisig.rs +127 -0
  163. package/contracts/workers/dvn/src/storage.rs +35 -0
  164. package/contracts/workers/dvn/src/tests/auth.rs +237 -0
  165. package/contracts/workers/dvn/src/tests/dvn.rs +349 -0
  166. package/contracts/workers/dvn/src/tests/key_pair.rs +66 -0
  167. package/contracts/workers/dvn/src/tests/mod.rs +5 -0
  168. package/contracts/workers/dvn/src/tests/multisig/mod.rs +3 -0
  169. package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +133 -0
  170. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +108 -0
  171. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +109 -0
  172. package/contracts/workers/dvn/src/tests/setup.rs +109 -0
  173. package/contracts/workers/dvn/src/types.rs +26 -0
  174. package/contracts/workers/dvn-fee-lib/Cargo.toml +24 -0
  175. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +113 -0
  176. package/contracts/workers/dvn-fee-lib/src/errors.rs +8 -0
  177. package/contracts/workers/dvn-fee-lib/src/lib.rs +17 -0
  178. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +282 -0
  179. package/contracts/workers/dvn-fee-lib/src/tests/mod.rs +1 -0
  180. package/contracts/workers/executor/Cargo.toml +10 -7
  181. package/contracts/workers/executor/src/errors.rs +8 -0
  182. package/contracts/workers/executor/src/events.rs +4 -7
  183. package/contracts/workers/executor/src/interfaces/executor.rs +72 -22
  184. package/contracts/workers/executor/src/interfaces/mod.rs +0 -2
  185. package/contracts/workers/executor/src/lib.rs +16 -7
  186. package/contracts/workers/executor/src/lz_executor.rs +308 -0
  187. package/contracts/workers/executor/src/storage.rs +24 -16
  188. package/contracts/workers/executor-fee-lib/Cargo.toml +22 -0
  189. package/contracts/workers/executor-fee-lib/src/errors.rs +15 -0
  190. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +215 -0
  191. package/contracts/workers/executor-fee-lib/src/executor_option.rs +203 -0
  192. package/contracts/workers/executor-fee-lib/src/lib.rs +7 -0
  193. package/contracts/workers/executor-helper/Cargo.toml +29 -0
  194. package/contracts/workers/executor-helper/src/executor_helper.rs +161 -0
  195. package/contracts/workers/executor-helper/src/lib.rs +11 -0
  196. package/contracts/workers/{worker-common → worker}/Cargo.toml +1 -4
  197. package/contracts/workers/worker/src/errors.rs +24 -0
  198. package/contracts/workers/worker/src/events.rs +62 -0
  199. package/contracts/workers/worker/src/interfaces/dvn_fee_lib.rs +75 -0
  200. package/contracts/workers/worker/src/interfaces/executor_fee_lib.rs +84 -0
  201. package/contracts/workers/{worker-common → worker}/src/interfaces/mod.rs +2 -2
  202. package/contracts/workers/worker/src/interfaces/price_feed.rs +85 -0
  203. package/contracts/workers/worker/src/lib.rs +14 -0
  204. package/contracts/workers/worker/src/storage.rs +63 -0
  205. package/contracts/workers/worker/src/worker.rs +459 -0
  206. package/package.json +3 -3
  207. package/sdk/dist/generated/bml.d.ts +88 -17
  208. package/sdk/dist/generated/bml.js +62 -16
  209. package/sdk/dist/generated/counter.d.ts +281 -102
  210. package/sdk/dist/generated/counter.js +93 -41
  211. package/sdk/dist/generated/endpoint.d.ts +128 -105
  212. package/sdk/dist/generated/endpoint.js +47 -45
  213. package/sdk/dist/generated/sml.d.ts +212 -69
  214. package/sdk/dist/generated/sml.js +103 -53
  215. package/sdk/dist/generated/uln302.d.ts +270 -173
  216. package/sdk/dist/generated/uln302.js +112 -64
  217. package/sdk/package.json +11 -11
  218. package/sdk/test/index.test.ts +147 -42
  219. package/sdk/test/suites/constants.ts +7 -3
  220. package/sdk/test/suites/deploy.ts +65 -42
  221. package/sdk/test/suites/localnet.ts +2 -2
  222. package/sdk/test/suites/scan.ts +28 -25
  223. package/sdk/test/utils.ts +199 -0
  224. package/sdk/tsconfig.json +93 -95
  225. package/tools/ts-bindings-gen/src/main.rs +2 -0
  226. package/contracts/common-macros/src/snapshots/common_macros__tests__tests__snapshot_generated_storage_code.snap +0 -310
  227. package/contracts/common-macros/src/tests.rs +0 -287
  228. package/contracts/oapp-macros/tests/test_macros.rs +0 -522
  229. package/contracts/workers/executor/src/executor.rs +0 -347
  230. package/contracts/workers/executor/src/interfaces/types.rs +0 -51
  231. package/contracts/workers/worker-common/src/constants.rs +0 -17
  232. package/contracts/workers/worker-common/src/errors.rs +0 -6
  233. package/contracts/workers/worker-common/src/events.rs +0 -34
  234. package/contracts/workers/worker-common/src/interfaces/executor_fee_lib.rs +0 -35
  235. package/contracts/workers/worker-common/src/interfaces/price_feed.rs +0 -40
  236. package/contracts/workers/worker-common/src/interfaces/worker.rs +0 -60
  237. package/contracts/workers/worker-common/src/lib.rs +0 -19
  238. package/contracts/workers/worker-common/src/storage.rs +0 -32
  239. package/contracts/workers/worker-common/src/worker_common.rs +0 -166
@@ -0,0 +1,47 @@
1
+ // `utils` crate is `#![no_std]`, but unit tests can use `std`.
2
+ extern crate std;
3
+
4
+ use soroban_sdk::{address_payload::AddressPayload, BytesN};
5
+
6
+ /// Same style as `common-macros` tests helper.
7
+ pub(in crate::tests) fn assert_panics_contains<F>(case: &str, expected_substring: &str, f: F)
8
+ where
9
+ F: FnOnce(),
10
+ {
11
+ use std::any::Any;
12
+ use std::boxed::Box;
13
+ use std::format;
14
+ use std::panic::{catch_unwind, AssertUnwindSafe};
15
+ use std::string::{String, ToString};
16
+
17
+ let result = catch_unwind(AssertUnwindSafe(f));
18
+ assert!(result.is_err(), "{case}: expected panic, but function returned normally");
19
+
20
+ let payload: Box<dyn Any + Send> = result.expect_err("checked above");
21
+ let msg = if let Some(s) = payload.downcast_ref::<&str>() {
22
+ (*s).to_string()
23
+ } else if let Some(s) = payload.downcast_ref::<String>() {
24
+ s.clone()
25
+ } else {
26
+ format!("{payload:?}")
27
+ };
28
+
29
+ assert!(
30
+ msg.contains(expected_substring),
31
+ "{case}: expected panic message to contain '{expected_substring}', got '{msg}'"
32
+ );
33
+ }
34
+
35
+ /// Helper to assert address payload matches expected payload.
36
+ ///
37
+ /// Used in buffer_reader and buffer_writer tests to verify address encoding/decoding.
38
+ pub(in crate::tests) fn assert_address_payload_matches(actual: BytesN<32>, expected: AddressPayload) {
39
+ match expected {
40
+ AddressPayload::ContractIdHash(expected_payload) => {
41
+ assert_eq!(actual, expected_payload);
42
+ }
43
+ AddressPayload::AccountIdPublicKeyEd25519(expected_payload) => {
44
+ assert_eq!(actual, expected_payload);
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,555 @@
1
+ use crate::testing_utils::{assert_event, assert_events, ExpectedEvent, IntoExpectedEvent};
2
+ use common_macros::event;
3
+ use soroban_sdk::{contract, contractimpl, testutils::Address as _, Address, Env, IntoVal, Val, Vec};
4
+
5
+ // ============================================
6
+ // Test Fixtures
7
+ // ============================================
8
+
9
+ #[event]
10
+ pub struct TestEvent1 {
11
+ pub value: u32,
12
+ }
13
+
14
+ #[event]
15
+ pub struct TestEvent2 {
16
+ pub name: u32,
17
+ pub count: u64,
18
+ }
19
+
20
+ #[event]
21
+ pub struct TestEvent3 {
22
+ pub address: Address,
23
+ }
24
+
25
+ #[contract]
26
+ pub struct TestingUtilsContract;
27
+
28
+ #[contractimpl]
29
+ impl TestingUtilsContract {
30
+ pub fn emit_event1(env: &Env, value: u32) {
31
+ TestEvent1 { value }.publish(env);
32
+ }
33
+
34
+ pub fn emit_event2(env: &Env, name: u32, count: u64) {
35
+ TestEvent2 { name, count }.publish(env);
36
+ }
37
+
38
+ pub fn emit_event3(env: &Env, address: Address) {
39
+ TestEvent3 { address }.publish(env);
40
+ }
41
+
42
+ pub fn emit_multiple_events(env: &Env, value1: u32, value2: u32) {
43
+ TestEvent1 { value: value1 }.publish(env);
44
+ TestEvent1 { value: value2 }.publish(env);
45
+ }
46
+
47
+ pub fn emit_both_events(env: &Env, value: u32, name: u32, count: u64) {
48
+ TestEvent1 { value }.publish(env);
49
+ TestEvent2 { name, count }.publish(env);
50
+ }
51
+
52
+ pub fn emit_three_events(env: &Env, value1: u32, value2: u32, value3: u32) {
53
+ TestEvent1 { value: value1 }.publish(env);
54
+ TestEvent1 { value: value2 }.publish(env);
55
+ TestEvent1 { value: value3 }.publish(env);
56
+ }
57
+
58
+ pub fn emit_mixed_four_events(env: &Env, v1: u32, name: u32, count: u64, v2: u32, v3: u32) {
59
+ TestEvent1 { value: v1 }.publish(env);
60
+ TestEvent2 { name, count }.publish(env);
61
+ TestEvent1 { value: v2 }.publish(env);
62
+ TestEvent1 { value: v3 }.publish(env);
63
+ }
64
+
65
+ pub fn emit_mixed_three_types(env: &Env, value: u32, name: u32, count: u64, address: Address) {
66
+ TestEvent1 { value }.publish(env);
67
+ TestEvent2 { name, count }.publish(env);
68
+ TestEvent3 { address }.publish(env);
69
+ }
70
+
71
+ pub fn emit_two_plus_event2(env: &Env, value1: u32, value2: u32, name: u32, count: u64) {
72
+ TestEvent1 { value: value1 }.publish(env);
73
+ TestEvent1 { value: value2 }.publish(env);
74
+ TestEvent2 { name, count }.publish(env);
75
+ }
76
+ }
77
+
78
+ // ============================================
79
+ // assert_event
80
+ // ============================================
81
+
82
+ // Basic functionality
83
+
84
+ #[test]
85
+ fn test_assert_event_found() {
86
+ let env = Env::default();
87
+ let contract_id = env.register(TestingUtilsContract, ());
88
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
89
+
90
+ client.emit_event1(&42);
91
+
92
+ assert_event(&env, &contract_id, TestEvent1 { value: 42 });
93
+ }
94
+
95
+ #[test]
96
+ fn test_assert_event_with_multiple_fields() {
97
+ let env = Env::default();
98
+ let contract_id = env.register(TestingUtilsContract, ());
99
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
100
+
101
+ client.emit_event2(&123, &456);
102
+
103
+ assert_event(&env, &contract_id, TestEvent2 { name: 123, count: 456 });
104
+ }
105
+
106
+ #[test]
107
+ fn test_assert_event_with_address() {
108
+ let env = Env::default();
109
+ let contract_id = env.register(TestingUtilsContract, ());
110
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
111
+
112
+ let addr = Address::generate(&env);
113
+ client.emit_event3(&addr);
114
+
115
+ assert_event(&env, &contract_id, TestEvent3 { address: addr });
116
+ }
117
+
118
+ #[test]
119
+ fn test_assert_event_among_multiple() {
120
+ let env = Env::default();
121
+ let contract_id = env.register(TestingUtilsContract, ());
122
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
123
+
124
+ client.emit_multiple_events(&10, &20);
125
+
126
+ assert_event(&env, &contract_id, TestEvent1 { value: 10 });
127
+ assert_event(&env, &contract_id, TestEvent1 { value: 20 });
128
+ }
129
+
130
+ // Edge cases
131
+
132
+ #[test]
133
+ fn test_assert_event_finds_first_matching_event() {
134
+ let env = Env::default();
135
+ let contract_id = env.register(TestingUtilsContract, ());
136
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
137
+
138
+ client.emit_multiple_events(&42, &42);
139
+
140
+ assert_event(&env, &contract_id, TestEvent1 { value: 42 });
141
+ }
142
+
143
+ #[test]
144
+ fn test_assert_event_finds_correct_event_among_many() {
145
+ let env = Env::default();
146
+ let contract_id = env.register(TestingUtilsContract, ());
147
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
148
+
149
+ // Use single contract call that emits all events (events don't accumulate across calls)
150
+ client.emit_mixed_four_events(&1, &100, &200, &2, &3);
151
+
152
+ assert_event(&env, &contract_id, TestEvent1 { value: 2 });
153
+ assert_event(&env, &contract_id, TestEvent2 { name: 100, count: 200 });
154
+ }
155
+
156
+ // Error cases
157
+
158
+ #[test]
159
+ #[should_panic(expected = "Expected event not found")]
160
+ fn test_assert_event_no_events_emitted() {
161
+ let env = Env::default();
162
+ let contract_id = env.register(TestingUtilsContract, ());
163
+
164
+ assert_event(&env, &contract_id, TestEvent1 { value: 42 });
165
+ }
166
+
167
+ #[test]
168
+ #[should_panic(expected = "Expected event not found")]
169
+ fn test_assert_event_not_found() {
170
+ let env = Env::default();
171
+ let contract_id = env.register(TestingUtilsContract, ());
172
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
173
+
174
+ client.emit_event1(&42);
175
+
176
+ assert_event(&env, &contract_id, TestEvent1 { value: 100 });
177
+ }
178
+
179
+ #[test]
180
+ #[should_panic(expected = "Expected event not found")]
181
+ fn test_assert_event_wrong_contract() {
182
+ let env = Env::default();
183
+ let contract_id = env.register(TestingUtilsContract, ());
184
+ let other_contract_id = env.register(TestingUtilsContract, ());
185
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
186
+
187
+ client.emit_event1(&42);
188
+
189
+ assert_event(&env, &other_contract_id, TestEvent1 { value: 42 });
190
+ }
191
+
192
+ #[test]
193
+ #[should_panic(expected = "Expected event not found")]
194
+ fn test_assert_event_topics_length_mismatch() {
195
+ let env = Env::default();
196
+ let contract_id = env.register(TestingUtilsContract, ());
197
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
198
+
199
+ client.emit_event1(&42);
200
+
201
+ assert_event(&env, &contract_id, TestEvent2 { name: 42, count: 0 });
202
+ }
203
+
204
+ #[test]
205
+ #[should_panic(expected = "Expected event not found")]
206
+ fn test_assert_event_data_mismatch() {
207
+ let env = Env::default();
208
+ let contract_id = env.register(TestingUtilsContract, ());
209
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
210
+
211
+ client.emit_event2(&123, &456);
212
+
213
+ assert_event(&env, &contract_id, TestEvent2 { name: 123, count: 789 });
214
+ }
215
+
216
+ // ============================================
217
+ // assert_events
218
+ // ============================================
219
+
220
+ // Basic functionality
221
+
222
+ #[test]
223
+ fn test_assert_events_single() {
224
+ let env = Env::default();
225
+ let contract_id = env.register(TestingUtilsContract, ());
226
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
227
+
228
+ client.emit_event1(&42);
229
+
230
+ assert_events(&env, &contract_id, &[TestEvent1 { value: 42 }.expected(&env)]);
231
+ }
232
+
233
+ #[test]
234
+ fn test_assert_events_multiple_same_type() {
235
+ let env = Env::default();
236
+ let contract_id = env.register(TestingUtilsContract, ());
237
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
238
+
239
+ client.emit_multiple_events(&10, &20);
240
+
241
+ assert_events(
242
+ &env,
243
+ &contract_id,
244
+ &[TestEvent1 { value: 10 }.expected(&env), TestEvent1 { value: 20 }.expected(&env)],
245
+ );
246
+ }
247
+
248
+ #[test]
249
+ fn test_assert_events_multiple_different_types() {
250
+ let env = Env::default();
251
+ let contract_id = env.register(TestingUtilsContract, ());
252
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
253
+
254
+ client.emit_both_events(&42, &123, &456);
255
+
256
+ assert_events(
257
+ &env,
258
+ &contract_id,
259
+ &[TestEvent1 { value: 42 }.expected(&env), TestEvent2 { name: 123, count: 456 }.expected(&env)],
260
+ );
261
+ }
262
+
263
+ #[test]
264
+ fn test_assert_events_order_independent() {
265
+ let env = Env::default();
266
+ let contract_id = env.register(TestingUtilsContract, ());
267
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
268
+
269
+ client.emit_both_events(&42, &123, &456);
270
+
271
+ assert_events(
272
+ &env,
273
+ &contract_id,
274
+ &[TestEvent2 { name: 123, count: 456 }.expected(&env), TestEvent1 { value: 42 }.expected(&env)],
275
+ );
276
+ }
277
+
278
+ #[test]
279
+ fn test_assert_events_empty_list() {
280
+ let env = Env::default();
281
+ let contract_id = env.register(TestingUtilsContract, ());
282
+
283
+ assert_events(&env, &contract_id, &[]);
284
+ }
285
+
286
+ #[test]
287
+ fn test_assert_events_with_duplicates() {
288
+ let env = Env::default();
289
+ let contract_id = env.register(TestingUtilsContract, ());
290
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
291
+
292
+ client.emit_multiple_events(&42, &42);
293
+
294
+ assert_events(
295
+ &env,
296
+ &contract_id,
297
+ &[TestEvent1 { value: 42 }.expected(&env), TestEvent1 { value: 42 }.expected(&env)],
298
+ );
299
+ }
300
+
301
+ // Edge cases
302
+
303
+ #[test]
304
+ fn test_assert_events_partial_match() {
305
+ let env = Env::default();
306
+ let contract_id = env.register(TestingUtilsContract, ());
307
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
308
+
309
+ // Use single contract call that emits all events (events don't accumulate across calls)
310
+ client.emit_two_plus_event2(&10, &20, &100, &200);
311
+
312
+ assert_events(&env, &contract_id, &[TestEvent1 { value: 10 }.expected(&env)]);
313
+ }
314
+
315
+ #[test]
316
+ fn test_assert_events_three_events() {
317
+ let env = Env::default();
318
+ let contract_id = env.register(TestingUtilsContract, ());
319
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
320
+
321
+ // Use single contract call that emits all events (events don't accumulate across calls)
322
+ client.emit_three_events(&1, &2, &3);
323
+
324
+ assert_events(
325
+ &env,
326
+ &contract_id,
327
+ &[
328
+ TestEvent1 { value: 1 }.expected(&env),
329
+ TestEvent1 { value: 2 }.expected(&env),
330
+ TestEvent1 { value: 3 }.expected(&env),
331
+ ],
332
+ );
333
+ }
334
+
335
+ #[test]
336
+ fn test_assert_events_mixed_event_types_three() {
337
+ let env = Env::default();
338
+ let contract_id = env.register(TestingUtilsContract, ());
339
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
340
+
341
+ let addr = Address::generate(&env);
342
+
343
+ // Use single contract call that emits all events (events don't accumulate across calls)
344
+ client.emit_mixed_three_types(&42, &100, &200, &addr);
345
+
346
+ assert_events(
347
+ &env,
348
+ &contract_id,
349
+ &[
350
+ TestEvent3 { address: addr.clone() }.expected(&env),
351
+ TestEvent1 { value: 42 }.expected(&env),
352
+ TestEvent2 { name: 100, count: 200 }.expected(&env),
353
+ ],
354
+ );
355
+ }
356
+
357
+ #[test]
358
+ fn test_assert_events_from_specific_contract_ignores_others() {
359
+ let env = Env::default();
360
+ let contract_id1 = env.register(TestingUtilsContract, ());
361
+ let contract_id2 = env.register(TestingUtilsContract, ());
362
+ let client1 = TestingUtilsContractClient::new(&env, &contract_id1);
363
+
364
+ // Emit events from contract1 only
365
+ // Note: Events don't accumulate across separate contract calls, so we use a single call
366
+ client1.emit_multiple_events(&10, &30);
367
+
368
+ // Assert events from contract1 are found when using contract1's address
369
+ assert_events(
370
+ &env,
371
+ &contract_id1,
372
+ &[TestEvent1 { value: 10 }.expected(&env), TestEvent1 { value: 30 }.expected(&env)],
373
+ );
374
+
375
+ // Verify that using contract2's address doesn't match contract1's events
376
+ // (this tests the filtering logic - events should not be found for wrong contract)
377
+ assert_events(&env, &contract_id2, &[]);
378
+ }
379
+
380
+ // Error cases
381
+
382
+ #[test]
383
+ #[should_panic(expected = "Expected event #0 not found")]
384
+ fn test_assert_events_first_not_found() {
385
+ let env = Env::default();
386
+ let contract_id = env.register(TestingUtilsContract, ());
387
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
388
+
389
+ client.emit_event1(&42);
390
+
391
+ assert_events(&env, &contract_id, &[TestEvent1 { value: 100 }.expected(&env)]);
392
+ }
393
+
394
+ #[test]
395
+ #[should_panic(expected = "Expected event #1 not found")]
396
+ fn test_assert_events_second_not_found() {
397
+ let env = Env::default();
398
+ let contract_id = env.register(TestingUtilsContract, ());
399
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
400
+
401
+ client.emit_event1(&42);
402
+
403
+ assert_events(
404
+ &env,
405
+ &contract_id,
406
+ &[TestEvent1 { value: 42 }.expected(&env), TestEvent1 { value: 100 }.expected(&env)],
407
+ );
408
+ }
409
+
410
+ #[test]
411
+ #[should_panic(expected = "Expected event #2 not found")]
412
+ fn test_assert_events_third_not_found() {
413
+ let env = Env::default();
414
+ let contract_id = env.register(TestingUtilsContract, ());
415
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
416
+
417
+ client.emit_multiple_events(&10, &20);
418
+
419
+ assert_events(
420
+ &env,
421
+ &contract_id,
422
+ &[
423
+ TestEvent1 { value: 10 }.expected(&env),
424
+ TestEvent1 { value: 20 }.expected(&env),
425
+ TestEvent1 { value: 30 }.expected(&env),
426
+ ],
427
+ );
428
+ }
429
+
430
+ #[test]
431
+ #[should_panic(expected = "Expected event #1 not found")]
432
+ fn test_assert_events_duplicate_expected_but_not_emitted() {
433
+ let env = Env::default();
434
+ let contract_id = env.register(TestingUtilsContract, ());
435
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
436
+
437
+ client.emit_event1(&42);
438
+
439
+ assert_events(
440
+ &env,
441
+ &contract_id,
442
+ &[TestEvent1 { value: 42 }.expected(&env), TestEvent1 { value: 42 }.expected(&env)],
443
+ );
444
+ }
445
+
446
+ #[test]
447
+ #[should_panic(expected = "Expected event #0 not found")]
448
+ fn test_assert_events_no_events_emitted() {
449
+ let env = Env::default();
450
+ let contract_id = env.register(TestingUtilsContract, ());
451
+
452
+ assert_events(&env, &contract_id, &[TestEvent1 { value: 42 }.expected(&env)]);
453
+ }
454
+
455
+ #[test]
456
+ #[should_panic(expected = "Expected event #0 not found")]
457
+ fn test_assert_events_wrong_contract() {
458
+ let env = Env::default();
459
+ let contract_id1 = env.register(TestingUtilsContract, ());
460
+ let contract_id2 = env.register(TestingUtilsContract, ());
461
+ let client1 = TestingUtilsContractClient::new(&env, &contract_id1);
462
+
463
+ client1.emit_event1(&42);
464
+
465
+ assert_events(&env, &contract_id2, &[TestEvent1 { value: 42 }.expected(&env)]);
466
+ }
467
+
468
+ #[test]
469
+ #[should_panic(expected = "Expected event #0 not found")]
470
+ fn test_assert_events_topics_length_mismatch() {
471
+ let env = Env::default();
472
+ let contract_id = env.register(TestingUtilsContract, ());
473
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
474
+
475
+ client.emit_event1(&42);
476
+
477
+ let empty_topics: Vec<Val> = Vec::new(&env);
478
+ let data: Val = 42u32.into_val(&env);
479
+ let expected_with_empty_topics = ExpectedEvent { topics: empty_topics, data };
480
+
481
+ assert_events(&env, &contract_id, &[expected_with_empty_topics]);
482
+ }
483
+
484
+ #[test]
485
+ #[should_panic(expected = "Expected event #0 not found")]
486
+ fn test_assert_events_data_mismatch() {
487
+ let env = Env::default();
488
+ let contract_id = env.register(TestingUtilsContract, ());
489
+ let client = TestingUtilsContractClient::new(&env, &contract_id);
490
+
491
+ client.emit_event2(&100, &200);
492
+
493
+ assert_events(&env, &contract_id, &[TestEvent2 { name: 100, count: 999 }.expected(&env)]);
494
+ }
495
+
496
+ // ============================================
497
+ // ExpectedEvent & IntoExpectedEvent
498
+ // ============================================
499
+
500
+ #[test]
501
+ fn test_into_expected_event() {
502
+ let env = Env::default();
503
+
504
+ let event = TestEvent1 { value: 42 };
505
+ let expected = event.expected(&env);
506
+
507
+ assert!(!expected.topics.is_empty());
508
+ }
509
+
510
+ #[test]
511
+ fn test_into_expected_event_with_multiple_fields() {
512
+ let env = Env::default();
513
+
514
+ let event = TestEvent2 { name: 123, count: 456 };
515
+ let expected = event.expected(&env);
516
+
517
+ assert!(!expected.topics.is_empty());
518
+ }
519
+
520
+ #[test]
521
+ fn test_into_expected_event_with_address() {
522
+ let env = Env::default();
523
+
524
+ let addr = Address::generate(&env);
525
+ let event = TestEvent3 { address: addr };
526
+ let expected = event.expected(&env);
527
+
528
+ assert!(!expected.topics.is_empty());
529
+ }
530
+
531
+ #[test]
532
+ fn test_expected_event_struct() {
533
+ let env = Env::default();
534
+
535
+ let topics: Vec<Val> = Vec::new(&env);
536
+ let data: Val = 42u32.into_val(&env);
537
+
538
+ let expected = ExpectedEvent { topics, data };
539
+
540
+ assert_eq!(expected.topics.len(), 0);
541
+ }
542
+
543
+ #[test]
544
+ fn test_expected_event_with_topics() {
545
+ let env = Env::default();
546
+
547
+ let mut topics: Vec<Val> = Vec::new(&env);
548
+ topics.push_back(42u32.into_val(&env));
549
+ topics.push_back(100u64.into_val(&env));
550
+ let data: Val = 999u32.into_val(&env);
551
+
552
+ let expected = ExpectedEvent { topics, data };
553
+
554
+ assert_eq!(expected.topics.len(), 2);
555
+ }