@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,211 @@
1
+ use crate::{events::LzReceiveAlert, tests::endpoint_setup::setup, Origin};
2
+ use soroban_sdk::{
3
+ testutils::{Address as _, MockAuth, MockAuthInvoke},
4
+ Bytes, BytesN, IntoVal,
5
+ };
6
+ use utils::testing_utils::assert_event;
7
+
8
+ #[test]
9
+ fn test_lz_receive_alert_auth() {
10
+ let context = setup();
11
+ let env = &context.env;
12
+ let endpoint_client = &context.endpoint_client;
13
+
14
+ let executor = soroban_sdk::Address::generate(env);
15
+ let receiver = soroban_sdk::Address::generate(env);
16
+ let src_eid = 2u32;
17
+ let sender = BytesN::from_array(env, &[1u8; 32]);
18
+ let nonce = 1u64;
19
+ let guid = BytesN::from_array(env, &[5u8; 32]);
20
+ let gas = 1000i128;
21
+ let value = 100i128;
22
+ let message = Bytes::from_array(env, &[1, 2, 3, 4]);
23
+ let extra_data = Bytes::from_array(env, &[5, 6]);
24
+ let reason = Bytes::from_array(env, &[7, 8, 9]);
25
+
26
+ let origin = Origin { src_eid, sender, nonce };
27
+
28
+ // Mock auth for executor - test that the function requires auth from executor
29
+ env.mock_auths(&[MockAuth {
30
+ address: &executor,
31
+ invoke: &MockAuthInvoke {
32
+ contract: &endpoint_client.address,
33
+ fn_name: "lz_receive_alert",
34
+ args: (&executor, &origin, &receiver, &guid, &gas, &value, &message, &extra_data, &reason).into_val(env),
35
+ sub_invokes: &[],
36
+ },
37
+ }]);
38
+
39
+ // This should not panic if auth is correct
40
+ endpoint_client.lz_receive_alert(
41
+ &executor,
42
+ &origin,
43
+ &receiver,
44
+ &guid,
45
+ &gas,
46
+ &value,
47
+ &message,
48
+ &extra_data,
49
+ &reason,
50
+ );
51
+
52
+ // Verify LzReceiveAlert event was published
53
+ assert_event(
54
+ env,
55
+ &endpoint_client.address,
56
+ LzReceiveAlert {
57
+ receiver: receiver.clone(),
58
+ executor: executor.clone(),
59
+ origin: origin.clone(),
60
+ guid: guid.clone(),
61
+ gas,
62
+ value,
63
+ message: message.clone(),
64
+ extra_data: extra_data.clone(),
65
+ reason: reason.clone(),
66
+ },
67
+ );
68
+ }
69
+
70
+ #[test]
71
+ fn test_lz_receive_alert_with_empty_data() {
72
+ let context = setup();
73
+ let env = &context.env;
74
+ let endpoint_client = &context.endpoint_client;
75
+
76
+ let executor = soroban_sdk::Address::generate(env);
77
+ let receiver = soroban_sdk::Address::generate(env);
78
+ let src_eid = 2u32;
79
+ let sender = BytesN::from_array(env, &[1u8; 32]);
80
+ let nonce = 1u64;
81
+ let guid = BytesN::from_array(env, &[5u8; 32]);
82
+ let gas = 0i128;
83
+ let value = 0i128;
84
+ let message = Bytes::new(env);
85
+ let extra_data = Bytes::new(env);
86
+ let reason = Bytes::new(env);
87
+
88
+ let origin = Origin { src_eid, sender, nonce };
89
+
90
+ // Mock auth for executor
91
+ env.mock_auths(&[MockAuth {
92
+ address: &executor,
93
+ invoke: &MockAuthInvoke {
94
+ contract: &endpoint_client.address,
95
+ fn_name: "lz_receive_alert",
96
+ args: (&executor, &origin, &receiver, &guid, &gas, &value, &message, &extra_data, &reason).into_val(env),
97
+ sub_invokes: &[],
98
+ },
99
+ }]);
100
+
101
+ // This should not panic
102
+ endpoint_client.lz_receive_alert(
103
+ &executor,
104
+ &origin,
105
+ &receiver,
106
+ &guid,
107
+ &gas,
108
+ &value,
109
+ &message,
110
+ &extra_data,
111
+ &reason,
112
+ );
113
+
114
+ // Verify LzReceiveAlert event was published with empty data
115
+ assert_event(
116
+ env,
117
+ &endpoint_client.address,
118
+ LzReceiveAlert {
119
+ receiver: receiver.clone(),
120
+ executor: executor.clone(),
121
+ origin: origin.clone(),
122
+ guid: guid.clone(),
123
+ gas,
124
+ value,
125
+ message: message.clone(),
126
+ extra_data: extra_data.clone(),
127
+ reason: reason.clone(),
128
+ },
129
+ );
130
+ }
131
+
132
+ #[test]
133
+ fn test_lz_receive_alert_with_different_origins() {
134
+ let context = setup();
135
+ let env = &context.env;
136
+ let endpoint_client = &context.endpoint_client;
137
+
138
+ let executor = soroban_sdk::Address::generate(env);
139
+ let receiver = soroban_sdk::Address::generate(env);
140
+ let src_eid = 2u32;
141
+ let sender = BytesN::from_array(env, &[1u8; 32]);
142
+ let guid = BytesN::from_array(env, &[5u8; 32]);
143
+ let gas = 1000i128;
144
+ let value = 100i128;
145
+ let message = Bytes::from_array(env, &[1, 2, 3, 4]);
146
+ let extra_data = Bytes::from_array(env, &[5, 6]);
147
+ let reason = Bytes::from_array(env, &[7, 8, 9]);
148
+
149
+ // Call with nonce 1
150
+ let origin1 = Origin { src_eid, sender: sender.clone(), nonce: 1 };
151
+ env.mock_auths(&[MockAuth {
152
+ address: &executor,
153
+ invoke: &MockAuthInvoke {
154
+ contract: &endpoint_client.address,
155
+ fn_name: "lz_receive_alert",
156
+ args: (&executor, &origin1, &receiver, &guid, &gas, &value, &message, &extra_data, &reason).into_val(env),
157
+ sub_invokes: &[],
158
+ },
159
+ }]);
160
+ endpoint_client.lz_receive_alert(
161
+ &executor,
162
+ &origin1,
163
+ &receiver,
164
+ &guid,
165
+ &gas,
166
+ &value,
167
+ &message,
168
+ &extra_data,
169
+ &reason,
170
+ );
171
+
172
+ // Call with nonce 2 should also succeed
173
+ let origin2 = Origin { src_eid, sender, nonce: 2 };
174
+ env.mock_auths(&[MockAuth {
175
+ address: &executor,
176
+ invoke: &MockAuthInvoke {
177
+ contract: &endpoint_client.address,
178
+ fn_name: "lz_receive_alert",
179
+ args: (&executor, &origin2, &receiver, &guid, &gas, &value, &message, &extra_data, &reason).into_val(env),
180
+ sub_invokes: &[],
181
+ },
182
+ }]);
183
+ endpoint_client.lz_receive_alert(
184
+ &executor,
185
+ &origin2,
186
+ &receiver,
187
+ &guid,
188
+ &gas,
189
+ &value,
190
+ &message,
191
+ &extra_data,
192
+ &reason,
193
+ );
194
+
195
+ // Verify LzReceiveAlert events were published for both calls
196
+ assert_event(
197
+ env,
198
+ &endpoint_client.address,
199
+ LzReceiveAlert {
200
+ receiver: receiver.clone(),
201
+ executor: executor.clone(),
202
+ origin: origin2.clone(),
203
+ guid: guid.clone(),
204
+ gas,
205
+ value,
206
+ message: message.clone(),
207
+ extra_data: extra_data.clone(),
208
+ reason: reason.clone(),
209
+ },
210
+ );
211
+ }
@@ -0,0 +1,18 @@
1
+ mod clear;
2
+ mod delegate;
3
+ mod initializable;
4
+ mod lz_receive_alert;
5
+ mod native_token;
6
+ mod owner;
7
+ mod pay_messaging_fees;
8
+ mod quote;
9
+ mod recover_token;
10
+ mod require_oapp_auth;
11
+ mod send;
12
+ mod set_delegate;
13
+ mod set_zro;
14
+ mod transfer_ownership;
15
+ mod ttl_config;
16
+ mod verifiable;
17
+ mod verify;
18
+ mod zro;
@@ -0,0 +1,10 @@
1
+ use crate::tests::endpoint_setup::setup;
2
+
3
+ #[test]
4
+ fn test_native_token() {
5
+ let context = setup();
6
+ let endpoint_client = &context.endpoint_client;
7
+
8
+ let native_token = endpoint_client.native_token();
9
+ assert_eq!(native_token, context.native_token_client.address);
10
+ }
@@ -0,0 +1,10 @@
1
+ use crate::tests::endpoint_setup::setup;
2
+
3
+ #[test]
4
+ fn test_owner() {
5
+ let context = setup();
6
+ let endpoint_client = &context.endpoint_client;
7
+
8
+ let owner = endpoint_client.owner();
9
+ assert_eq!(owner, Some(context.owner));
10
+ }
@@ -0,0 +1,424 @@
1
+ use crate::{tests::endpoint_setup::setup, EndpointV2, FeeRecipient, FeesAndPacket};
2
+ use soroban_sdk::{testutils::Address as _, Address, Bytes, Vec};
3
+
4
+ #[test]
5
+ fn test_pay_native_fees_exact_amount() {
6
+ let context = setup();
7
+ let env = &context.env;
8
+ let endpoint_client = &context.endpoint_client;
9
+ let recipient = Address::generate(env);
10
+ let refund_address = Address::generate(env);
11
+
12
+ // Setup: Mint native tokens to endpoint
13
+ context.mint_native(&endpoint_client.address, 100);
14
+
15
+ let mut native_fee_recipients = Vec::new(env);
16
+ native_fee_recipients.push_back(FeeRecipient { address: recipient.clone(), amount: 100 });
17
+ let send_result =
18
+ FeesAndPacket { native_fee_recipients, zro_fee_recipients: Vec::new(env), encoded_packet: Bytes::new(env) };
19
+
20
+ let fee = env.as_contract(&endpoint_client.address, || {
21
+ EndpointV2::pay_messaging_fees(
22
+ env,
23
+ false,
24
+ &send_result.native_fee_recipients,
25
+ &send_result.zro_fee_recipients,
26
+ &refund_address,
27
+ )
28
+ });
29
+
30
+ // Verify fee was calculated correctly
31
+ assert_eq!(fee.native_fee, 100);
32
+ assert_eq!(fee.zro_fee, 0);
33
+
34
+ // Verify recipient received payment
35
+ assert_eq!(context.native_token_client.balance(&recipient), 100);
36
+
37
+ // Verify no refund
38
+ assert_eq!(context.native_token_client.balance(&refund_address), 0);
39
+ }
40
+
41
+ #[test]
42
+ fn test_pay_native_fees_with_refund() {
43
+ let context = setup();
44
+ let env = &context.env;
45
+ let endpoint_client = &context.endpoint_client;
46
+ let recipient = Address::generate(env);
47
+ let refund_address = Address::generate(env);
48
+
49
+ // Setup: Mint more native tokens than needed
50
+ context.mint_native(&endpoint_client.address, 200);
51
+
52
+ let mut native_fee_recipients = Vec::new(env);
53
+ native_fee_recipients.push_back(FeeRecipient { address: recipient.clone(), amount: 100 });
54
+ let send_result =
55
+ FeesAndPacket { native_fee_recipients, zro_fee_recipients: Vec::new(env), encoded_packet: Bytes::new(env) };
56
+
57
+ let fee = env.as_contract(&endpoint_client.address, || {
58
+ EndpointV2::pay_messaging_fees(
59
+ env,
60
+ false,
61
+ &send_result.native_fee_recipients,
62
+ &send_result.zro_fee_recipients,
63
+ &refund_address,
64
+ )
65
+ });
66
+
67
+ // Verify fee was calculated correctly
68
+ assert_eq!(fee.native_fee, 100);
69
+ assert_eq!(fee.zro_fee, 0);
70
+
71
+ // Verify recipient received payment
72
+ assert_eq!(context.native_token_client.balance(&recipient), 100);
73
+
74
+ // Verify refund (200 - 100 = 100)
75
+ assert_eq!(context.native_token_client.balance(&refund_address), 100);
76
+ }
77
+
78
+ #[test]
79
+ fn test_pay_zro_fees_exact_amount() {
80
+ let context = setup();
81
+ let env = &context.env;
82
+ let endpoint_client = &context.endpoint_client;
83
+ let recipient = Address::generate(env);
84
+ let refund_address = Address::generate(env);
85
+
86
+ // Setup: Set ZRO token
87
+ context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
88
+ endpoint_client.set_zro(&context.zro_token_client.address);
89
+
90
+ // Mint ZRO tokens to endpoint
91
+ context.mint_zro(&endpoint_client.address, 50);
92
+
93
+ let mut zro_fee_recipients = Vec::new(env);
94
+ zro_fee_recipients.push_back(FeeRecipient { address: recipient.clone(), amount: 50 });
95
+ let send_result =
96
+ FeesAndPacket { native_fee_recipients: Vec::new(env), zro_fee_recipients, encoded_packet: Bytes::new(env) };
97
+
98
+ let fee = env.as_contract(&endpoint_client.address, || {
99
+ EndpointV2::pay_messaging_fees(
100
+ env,
101
+ true,
102
+ &send_result.native_fee_recipients,
103
+ &send_result.zro_fee_recipients,
104
+ &refund_address,
105
+ )
106
+ });
107
+
108
+ // Verify fee was calculated correctly
109
+ assert_eq!(fee.native_fee, 0);
110
+ assert_eq!(fee.zro_fee, 50);
111
+
112
+ // Verify recipient received payment
113
+ assert_eq!(context.zro_token_client.balance(&recipient), 50);
114
+
115
+ // Verify no refund
116
+ assert_eq!(context.zro_token_client.balance(&refund_address), 0);
117
+ }
118
+
119
+ #[test]
120
+ fn test_pay_zro_fees_with_refund() {
121
+ let context = setup();
122
+ let env = &context.env;
123
+ let endpoint_client = &context.endpoint_client;
124
+ let recipient = Address::generate(env);
125
+ let refund_address = Address::generate(env);
126
+
127
+ // Setup: Set ZRO token
128
+ context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
129
+ endpoint_client.set_zro(&context.zro_token_client.address);
130
+
131
+ // Mint more ZRO tokens than needed
132
+ context.mint_zro(&endpoint_client.address, 100);
133
+
134
+ let mut zro_fee_recipients = Vec::new(env);
135
+ zro_fee_recipients.push_back(FeeRecipient { address: recipient.clone(), amount: 50 });
136
+ let send_result =
137
+ FeesAndPacket { native_fee_recipients: Vec::new(env), zro_fee_recipients, encoded_packet: Bytes::new(env) };
138
+
139
+ let fee = env.as_contract(&endpoint_client.address, || {
140
+ EndpointV2::pay_messaging_fees(
141
+ env,
142
+ true,
143
+ &send_result.native_fee_recipients,
144
+ &send_result.zro_fee_recipients,
145
+ &refund_address,
146
+ )
147
+ });
148
+
149
+ // Verify fee was calculated correctly
150
+ assert_eq!(fee.native_fee, 0);
151
+ assert_eq!(fee.zro_fee, 50);
152
+
153
+ // Verify recipient received payment
154
+ assert_eq!(context.zro_token_client.balance(&recipient), 50);
155
+
156
+ // Verify refund (100 - 50 = 50)
157
+ assert_eq!(context.zro_token_client.balance(&refund_address), 50);
158
+ }
159
+
160
+ #[test]
161
+ fn test_pay_mixed_native_and_zro_fees() {
162
+ let context = setup();
163
+ let env = &context.env;
164
+ let endpoint_client = &context.endpoint_client;
165
+ let native_recipient = Address::generate(env);
166
+ let zro_recipient = Address::generate(env);
167
+ let refund_address = Address::generate(env);
168
+
169
+ // Setup: Set ZRO token
170
+ context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
171
+ endpoint_client.set_zro(&context.zro_token_client.address);
172
+
173
+ // Mint both types of tokens
174
+ context.mint_native(&endpoint_client.address, 100);
175
+ context.mint_zro(&endpoint_client.address, 50);
176
+
177
+ let mut native_fee_recipients = Vec::new(env);
178
+ native_fee_recipients.push_back(FeeRecipient { address: native_recipient.clone(), amount: 100 });
179
+ let mut zro_fee_recipients = Vec::new(env);
180
+ zro_fee_recipients.push_back(FeeRecipient { address: zro_recipient.clone(), amount: 50 });
181
+ let send_result = FeesAndPacket { native_fee_recipients, zro_fee_recipients, encoded_packet: Bytes::new(env) };
182
+
183
+ let fee = env.as_contract(&endpoint_client.address, || {
184
+ EndpointV2::pay_messaging_fees(
185
+ env,
186
+ true,
187
+ &send_result.native_fee_recipients,
188
+ &send_result.zro_fee_recipients,
189
+ &refund_address,
190
+ )
191
+ });
192
+
193
+ // Verify fees were calculated correctly
194
+ assert_eq!(fee.native_fee, 100);
195
+ assert_eq!(fee.zro_fee, 50);
196
+
197
+ // Verify recipients received payments
198
+ assert_eq!(context.native_token_client.balance(&native_recipient), 100);
199
+ assert_eq!(context.zro_token_client.balance(&zro_recipient), 50);
200
+
201
+ // Verify no refunds
202
+ assert_eq!(context.native_token_client.balance(&refund_address), 0);
203
+ assert_eq!(context.zro_token_client.balance(&refund_address), 0);
204
+ }
205
+
206
+ #[test]
207
+ fn test_pay_multiple_recipients_same_token() {
208
+ let context = setup();
209
+ let env = &context.env;
210
+ let endpoint_client = &context.endpoint_client;
211
+ let recipient1 = Address::generate(env);
212
+ let recipient2 = Address::generate(env);
213
+ let recipient3 = Address::generate(env);
214
+ let refund_address = Address::generate(env);
215
+
216
+ // Setup: Mint native tokens
217
+ context.mint_native(&endpoint_client.address, 300);
218
+
219
+ let mut native_fee_recipients = Vec::new(env);
220
+ native_fee_recipients.push_back(FeeRecipient { address: recipient1.clone(), amount: 100 });
221
+ native_fee_recipients.push_back(FeeRecipient { address: recipient2.clone(), amount: 150 });
222
+ native_fee_recipients.push_back(FeeRecipient { address: recipient3.clone(), amount: 50 });
223
+ let send_result =
224
+ FeesAndPacket { native_fee_recipients, zro_fee_recipients: Vec::new(env), encoded_packet: Bytes::new(env) };
225
+
226
+ let fee = env.as_contract(&endpoint_client.address, || {
227
+ EndpointV2::pay_messaging_fees(
228
+ env,
229
+ false,
230
+ &send_result.native_fee_recipients,
231
+ &send_result.zro_fee_recipients,
232
+ &refund_address,
233
+ )
234
+ });
235
+
236
+ // Verify total fee
237
+ assert_eq!(fee.native_fee, 300);
238
+ assert_eq!(fee.zro_fee, 0);
239
+
240
+ // Verify each recipient received correct amount
241
+ assert_eq!(context.native_token_client.balance(&recipient1), 100);
242
+ assert_eq!(context.native_token_client.balance(&recipient2), 150);
243
+ assert_eq!(context.native_token_client.balance(&recipient3), 50);
244
+
245
+ // Verify no refund
246
+ assert_eq!(context.native_token_client.balance(&refund_address), 0);
247
+ }
248
+
249
+ #[test]
250
+ fn test_pay_fees_with_zero_amounts_skipped() {
251
+ let context = setup();
252
+ let env = &context.env;
253
+ let endpoint_client = &context.endpoint_client;
254
+ let recipient1 = Address::generate(env);
255
+ let recipient2 = Address::generate(env);
256
+ let refund_address = Address::generate(env);
257
+
258
+ // Setup: Mint native tokens
259
+ context.mint_native(&endpoint_client.address, 100);
260
+
261
+ let mut native_fee_recipients = Vec::new(env);
262
+ native_fee_recipients.push_back(FeeRecipient { address: recipient1.clone(), amount: 100 });
263
+ native_fee_recipients.push_back(FeeRecipient { address: recipient2.clone(), amount: 0 }); // Zero amount
264
+ let send_result =
265
+ FeesAndPacket { native_fee_recipients, zro_fee_recipients: Vec::new(env), encoded_packet: Bytes::new(env) };
266
+
267
+ let fee = env.as_contract(&endpoint_client.address, || {
268
+ EndpointV2::pay_messaging_fees(
269
+ env,
270
+ false,
271
+ &send_result.native_fee_recipients,
272
+ &send_result.zro_fee_recipients,
273
+ &refund_address,
274
+ )
275
+ });
276
+
277
+ // Verify only non-zero fees were paid
278
+ assert_eq!(fee.native_fee, 100);
279
+ assert_eq!(context.native_token_client.balance(&recipient1), 100);
280
+ assert_eq!(context.native_token_client.balance(&recipient2), 0);
281
+ }
282
+
283
+ #[test]
284
+ #[should_panic(expected = "Error(Contract, #6)")]
285
+ fn test_panic_pay_native_fees_insufficient_balance() {
286
+ let context = setup();
287
+ let env = &context.env;
288
+ let endpoint_client = &context.endpoint_client;
289
+ let recipient = Address::generate(env);
290
+ let refund_address = Address::generate(env);
291
+
292
+ // Setup: Mint less than required
293
+ context.mint_native(&endpoint_client.address, 50);
294
+
295
+ let mut native_fee_recipients = Vec::new(env);
296
+ native_fee_recipients.push_back(FeeRecipient { address: recipient.clone(), amount: 100 });
297
+ let send_result =
298
+ FeesAndPacket { native_fee_recipients, zro_fee_recipients: Vec::new(env), encoded_packet: Bytes::new(env) };
299
+
300
+ // Should panic with InsufficientNativeFee error (code 27)
301
+ env.as_contract(&endpoint_client.address, || {
302
+ EndpointV2::pay_messaging_fees(
303
+ env,
304
+ false,
305
+ &send_result.native_fee_recipients,
306
+ &send_result.zro_fee_recipients,
307
+ &refund_address,
308
+ )
309
+ });
310
+ }
311
+
312
+ #[test]
313
+ #[should_panic(expected = "Error(Contract, #7)")]
314
+ fn test_panic_pay_zro_fees_insufficient_balance() {
315
+ let context = setup();
316
+ let env = &context.env;
317
+ let endpoint_client = &context.endpoint_client;
318
+ let recipient = Address::generate(env);
319
+ let refund_address = Address::generate(env);
320
+
321
+ // Setup: Set ZRO token
322
+ context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
323
+ endpoint_client.set_zro(&context.zro_token_client.address);
324
+
325
+ // Mint less ZRO than required
326
+ context.mint_zro(&endpoint_client.address, 25);
327
+
328
+ let mut zro_fee_recipients = Vec::new(env);
329
+ zro_fee_recipients.push_back(FeeRecipient { address: recipient.clone(), amount: 50 });
330
+ let send_result =
331
+ FeesAndPacket { native_fee_recipients: Vec::new(env), zro_fee_recipients, encoded_packet: Bytes::new(env) };
332
+
333
+ // Should panic with InsufficientZroFee error (code 28)
334
+ env.as_contract(&endpoint_client.address, || {
335
+ EndpointV2::pay_messaging_fees(
336
+ env,
337
+ true,
338
+ &send_result.native_fee_recipients,
339
+ &send_result.zro_fee_recipients,
340
+ &refund_address,
341
+ )
342
+ });
343
+ }
344
+
345
+ #[test]
346
+ fn test_pay_fees_with_empty_recipients() {
347
+ let context = setup();
348
+ let env = &context.env;
349
+ let endpoint_client = &context.endpoint_client;
350
+ let refund_address = Address::generate(env);
351
+
352
+ // Setup: Mint tokens
353
+ context.mint_native(&endpoint_client.address, 100);
354
+
355
+ let send_result = FeesAndPacket {
356
+ native_fee_recipients: Vec::new(env),
357
+ zro_fee_recipients: Vec::new(env),
358
+ encoded_packet: Bytes::new(env),
359
+ };
360
+
361
+ let fee = env.as_contract(&endpoint_client.address, || {
362
+ EndpointV2::pay_messaging_fees(
363
+ env,
364
+ false,
365
+ &send_result.native_fee_recipients,
366
+ &send_result.zro_fee_recipients,
367
+ &refund_address,
368
+ )
369
+ });
370
+
371
+ // Verify no fees paid
372
+ assert_eq!(fee.native_fee, 0);
373
+ assert_eq!(fee.zro_fee, 0);
374
+
375
+ // Verify all balance refunded
376
+ assert_eq!(context.native_token_client.balance(&refund_address), 100);
377
+ }
378
+
379
+ #[test]
380
+ fn test_pay_fees_with_mixed_zero_and_nonzero_amounts() {
381
+ let context = setup();
382
+ let env = &context.env;
383
+ let endpoint_client = &context.endpoint_client;
384
+ let recipient1 = Address::generate(env);
385
+ let recipient2 = Address::generate(env);
386
+ let recipient3 = Address::generate(env);
387
+ let refund_address = Address::generate(env);
388
+
389
+ // Setup
390
+ context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
391
+ endpoint_client.set_zro(&context.zro_token_client.address);
392
+ context.mint_native(&endpoint_client.address, 150);
393
+ context.mint_zro(&endpoint_client.address, 75);
394
+
395
+ let mut native_fee_recipients = Vec::new(env);
396
+ native_fee_recipients.push_back(FeeRecipient { address: recipient1.clone(), amount: 100 });
397
+ let mut zro_fee_recipients = Vec::new(env);
398
+ zro_fee_recipients.push_back(FeeRecipient { address: recipient2.clone(), amount: 0 }); // Zero ZRO
399
+ zro_fee_recipients.push_back(FeeRecipient { address: recipient3.clone(), amount: 50 });
400
+ let send_result = FeesAndPacket { native_fee_recipients, zro_fee_recipients, encoded_packet: Bytes::new(env) };
401
+
402
+ let fee = env.as_contract(&endpoint_client.address, || {
403
+ EndpointV2::pay_messaging_fees(
404
+ env,
405
+ true,
406
+ &send_result.native_fee_recipients,
407
+ &send_result.zro_fee_recipients,
408
+ &refund_address,
409
+ )
410
+ });
411
+
412
+ // Verify fees
413
+ assert_eq!(fee.native_fee, 100);
414
+ assert_eq!(fee.zro_fee, 50);
415
+
416
+ // Verify payments
417
+ assert_eq!(context.native_token_client.balance(&recipient1), 100);
418
+ assert_eq!(context.zro_token_client.balance(&recipient2), 0);
419
+ assert_eq!(context.zro_token_client.balance(&recipient3), 50);
420
+
421
+ // Verify refunds (150-100=50 native, 75-50=25 zro)
422
+ assert_eq!(context.native_token_client.balance(&refund_address), 50);
423
+ assert_eq!(context.zro_token_client.balance(&refund_address), 25);
424
+ }