@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,834 @@
1
+ use crate::{
2
+ events::{DVNFeePaid, ExecutorFeePaid},
3
+ interfaces::{ExecutorConfig, UlnConfig},
4
+ tests::setup::{
5
+ setup, DummyDVNClient, DummyExecutorClient, CONFIRMATIONS, DVN_FEE, EXECUTOR_FEE, LOCAL_EID as EID,
6
+ MAX_MESSAGE_SIZE, REMOTE_EID as DST_EID, TREASURY_NATIVE_FEE, TREASURY_ZRO_FEE,
7
+ },
8
+ };
9
+ use endpoint_v2::{FeeRecipient, OutboundPacket};
10
+ use message_lib_common::{packet_codec_v1, testing_utils::create_type3_options};
11
+ use soroban_sdk::{
12
+ log,
13
+ testutils::{Address as _, MockAuth, MockAuthInvoke},
14
+ vec, Bytes, BytesN, IntoVal,
15
+ };
16
+ use soroban_sdk::{Address, Env, Vec};
17
+ use utils::testing_utils::{assert_events, IntoExpectedEvent};
18
+
19
+ // Note that all the hot paths and assertions are covered in the quote test so here we only test the events emittance
20
+ #[test]
21
+ fn test_send_events_emittance() {
22
+ let mut setup = setup();
23
+ let oapp = Address::generate(&setup.env);
24
+
25
+ // setup workers
26
+ let mut dvns = Vec::new(&setup.env);
27
+ DVN_FEE.iter().for_each(|fee| {
28
+ let dvn = setup.register_dvn(*fee);
29
+ dvns.push_back(dvn);
30
+ });
31
+ let executor = setup.register_executor(EXECUTOR_FEE);
32
+ setup.treasury.set_native_fee(&TREASURY_NATIVE_FEE);
33
+ setup.treasury.set_zro_fee(&TREASURY_ZRO_FEE);
34
+
35
+ // setup configs
36
+ setup.set_default_send_uln_config(
37
+ DST_EID,
38
+ UlnConfig::new(
39
+ CONFIRMATIONS,
40
+ &vec![&setup.env, dvns.get_unchecked(0), dvns.get_unchecked(1)],
41
+ &vec![&setup.env],
42
+ 0,
43
+ ),
44
+ );
45
+ setup.set_default_executor_config(DST_EID, ExecutorConfig::new(MAX_MESSAGE_SIZE, &executor));
46
+
47
+ let effective_send_uln_config = setup.uln302.effective_send_uln_config(&oapp, &DST_EID);
48
+ log!(&setup.env, "effective_send_uln_config: {:?}", effective_send_uln_config);
49
+
50
+ // quote
51
+ let packet = OutboundPacket {
52
+ nonce: 1,
53
+ src_eid: EID,
54
+ sender: oapp,
55
+ dst_eid: DST_EID,
56
+ receiver: BytesN::<32>::from_array(&setup.env, &[0u8; 32]),
57
+ guid: BytesN::<32>::from_array(&setup.env, &[0u8; 32]),
58
+ message: Bytes::from_array(&setup.env, b"dummy testing message"),
59
+ };
60
+ let options = create_type3_options(&setup.env, &vec![&setup.env, dvns.get_unchecked(0)], true);
61
+ let pay_in_zro = false;
62
+
63
+ setup.env.mock_auths(&[MockAuth {
64
+ address: &setup.endpoint.address,
65
+ invoke: &MockAuthInvoke {
66
+ contract: &setup.uln302.address,
67
+ fn_name: "send",
68
+ args: (&packet, &options, &pay_in_zro).into_val(&setup.env),
69
+ sub_invokes: &[],
70
+ },
71
+ }]);
72
+ let send_result = setup.uln302.send(&packet, &options, &pay_in_zro);
73
+ let native_fee_recipients = &send_result.native_fee_recipients;
74
+ let zro_fee_recipients = &send_result.zro_fee_recipients;
75
+ assert_events(
76
+ &setup.env,
77
+ &setup.uln302.address,
78
+ &[
79
+ ExecutorFeePaid { executor: executor.clone(), fee: native_fee_recipients.get(0).unwrap().clone() }
80
+ .expected(&setup.env),
81
+ DVNFeePaid { dvns: dvns.slice(0..2).clone(), fees: native_fee_recipients.slice(1..3).clone() }
82
+ .expected(&setup.env),
83
+ ],
84
+ );
85
+
86
+ // executor, dvn1, dvn2, treasury native fee
87
+ assert_eq!(native_fee_recipients.len(), 4);
88
+ assert_eq!(zro_fee_recipients.len(), 0);
89
+ assert_eq!(
90
+ native_fee_recipients.get(0).unwrap(),
91
+ FeeRecipient { amount: EXECUTOR_FEE, address: DummyExecutorClient::new(&setup.env, &executor).recipient() }
92
+ );
93
+ assert_eq!(
94
+ native_fee_recipients.get(1).unwrap(),
95
+ FeeRecipient {
96
+ amount: DVN_FEE[0],
97
+ address: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient()
98
+ }
99
+ );
100
+ assert_eq!(
101
+ native_fee_recipients.get(2).unwrap(),
102
+ FeeRecipient {
103
+ amount: DVN_FEE[1],
104
+ address: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(1)).recipient()
105
+ }
106
+ );
107
+ assert_eq!(
108
+ native_fee_recipients.get(3).unwrap(),
109
+ FeeRecipient { amount: TREASURY_NATIVE_FEE, address: setup.treasury.address }
110
+ );
111
+ assert_eq!(send_result.encoded_packet, packet_codec_v1::encode_packet(&setup.env, &packet));
112
+ }
113
+
114
+ #[test]
115
+ fn test_send_events_emittance_with_zro() {
116
+ let mut setup = setup();
117
+ let oapp = Address::generate(&setup.env);
118
+
119
+ // setup workers
120
+ let mut dvns = Vec::new(&setup.env);
121
+ DVN_FEE.iter().for_each(|fee| {
122
+ let dvn = setup.register_dvn(*fee);
123
+ dvns.push_back(dvn);
124
+ });
125
+ let executor = setup.register_executor(EXECUTOR_FEE);
126
+ setup.treasury.set_native_fee(&TREASURY_NATIVE_FEE);
127
+ setup.treasury.set_zro_fee(&TREASURY_ZRO_FEE);
128
+
129
+ // setup configs
130
+ setup.set_default_send_uln_config(
131
+ DST_EID,
132
+ UlnConfig::new(
133
+ CONFIRMATIONS,
134
+ &vec![&setup.env, dvns.get_unchecked(0), dvns.get_unchecked(1)],
135
+ &vec![&setup.env],
136
+ 0,
137
+ ),
138
+ );
139
+ setup.set_default_executor_config(DST_EID, ExecutorConfig::new(MAX_MESSAGE_SIZE, &executor));
140
+
141
+ let effective_send_uln_config = setup.uln302.effective_send_uln_config(&oapp, &DST_EID);
142
+ log!(&setup.env, "effective_send_uln_config: {:?}", effective_send_uln_config);
143
+
144
+ // quote
145
+ let packet = OutboundPacket {
146
+ nonce: 1,
147
+ src_eid: EID,
148
+ sender: oapp,
149
+ dst_eid: DST_EID,
150
+ receiver: BytesN::<32>::from_array(&setup.env, &[0u8; 32]),
151
+ guid: BytesN::<32>::from_array(&setup.env, &[0u8; 32]),
152
+ message: Bytes::from_array(&setup.env, b"dummy testing message"),
153
+ };
154
+ let options = create_type3_options(&setup.env, &vec![&setup.env, dvns.get_unchecked(0)], true);
155
+ let pay_in_zro = true;
156
+
157
+ setup.env.mock_auths(&[MockAuth {
158
+ address: &setup.endpoint.address,
159
+ invoke: &MockAuthInvoke {
160
+ contract: &setup.uln302.address,
161
+ fn_name: "send",
162
+ args: (&packet, &options, &pay_in_zro).into_val(&setup.env),
163
+ sub_invokes: &[],
164
+ },
165
+ }]);
166
+
167
+ let send_result = setup.uln302.send(&packet, &options, &pay_in_zro);
168
+ let native_fee_recipients = &send_result.native_fee_recipients;
169
+ let zro_fee_recipients = &send_result.zro_fee_recipients;
170
+
171
+ assert_events(
172
+ &setup.env,
173
+ &setup.uln302.address,
174
+ &[
175
+ ExecutorFeePaid { executor: executor.clone(), fee: native_fee_recipients.get(0).unwrap().clone() }
176
+ .expected(&setup.env),
177
+ DVNFeePaid { dvns: dvns.slice(0..2).clone(), fees: native_fee_recipients.slice(1..3).clone() }
178
+ .expected(&setup.env),
179
+ ],
180
+ );
181
+
182
+ assert_eq!(send_result.encoded_packet, packet_codec_v1::encode_packet(&setup.env, &packet));
183
+ // executor, dvn1, dvn2
184
+ assert_eq!(native_fee_recipients.len(), 3);
185
+ assert_eq!(
186
+ native_fee_recipients.get(0).unwrap(),
187
+ FeeRecipient { amount: EXECUTOR_FEE, address: DummyExecutorClient::new(&setup.env, &executor).recipient() }
188
+ );
189
+ assert_eq!(
190
+ native_fee_recipients.get(1).unwrap(),
191
+ FeeRecipient {
192
+ amount: DVN_FEE[0],
193
+ address: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient()
194
+ }
195
+ );
196
+ assert_eq!(
197
+ native_fee_recipients.get(2).unwrap(),
198
+ FeeRecipient {
199
+ amount: DVN_FEE[1],
200
+ address: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(1)).recipient()
201
+ }
202
+ );
203
+ assert_eq!(
204
+ zro_fee_recipients.get(0).unwrap(),
205
+ FeeRecipient { amount: TREASURY_ZRO_FEE, address: setup.treasury.address }
206
+ );
207
+ assert_eq!(send_result.encoded_packet, packet_codec_v1::encode_packet(&setup.env, &packet));
208
+ }
209
+
210
+ #[test]
211
+ fn test_send_single_dvn() {
212
+ let mut setup = setup();
213
+ let oapp = Address::generate(&setup.env);
214
+
215
+ // setup workers
216
+ let mut dvns = Vec::new(&setup.env);
217
+ DVN_FEE.iter().for_each(|fee| {
218
+ let dvn = setup.register_dvn(*fee);
219
+ dvns.push_back(dvn);
220
+ });
221
+ let executor = setup.register_executor(EXECUTOR_FEE);
222
+ setup.treasury.set_native_fee(&TREASURY_NATIVE_FEE);
223
+ setup.treasury.set_zro_fee(&TREASURY_ZRO_FEE);
224
+
225
+ // setup configs
226
+ setup.set_default_send_uln_config(
227
+ DST_EID,
228
+ UlnConfig::new(CONFIRMATIONS, &vec![&setup.env, dvns.get_unchecked(0)], &vec![&setup.env], 0),
229
+ );
230
+ setup.set_default_executor_config(DST_EID, ExecutorConfig::new(MAX_MESSAGE_SIZE, &executor));
231
+
232
+ // send
233
+ let packet = OutboundPacket {
234
+ nonce: 1,
235
+ src_eid: EID,
236
+ sender: oapp,
237
+ dst_eid: DST_EID,
238
+ receiver: BytesN::<32>::from_array(&setup.env, &[0u8; 32]),
239
+ guid: BytesN::<32>::from_array(&setup.env, &[0u8; 32]),
240
+ message: Bytes::from_array(&setup.env, b"dummy testing message"),
241
+ };
242
+ let options = create_type3_options(&setup.env, &vec![&setup.env, dvns.get_unchecked(0)], true);
243
+ let pay_in_zro = false;
244
+
245
+ setup.env.mock_auths(&[MockAuth {
246
+ address: &setup.endpoint.address,
247
+ invoke: &MockAuthInvoke {
248
+ contract: &setup.uln302.address,
249
+ fn_name: "send",
250
+ args: (&packet, &options, &pay_in_zro).into_val(&setup.env),
251
+ sub_invokes: &[],
252
+ },
253
+ }]);
254
+ let send_result = setup.uln302.send(&packet, &options, &pay_in_zro);
255
+ let native_fee_recipients = &send_result.native_fee_recipients;
256
+ let zro_fee_recipients = &send_result.zro_fee_recipients;
257
+
258
+ // executor, dvn, treasury
259
+ assert_eq!(native_fee_recipients.len(), 3);
260
+ assert_eq!(zro_fee_recipients.len(), 0);
261
+ assert_eq!(
262
+ native_fee_recipients.get(0).unwrap(),
263
+ FeeRecipient { amount: EXECUTOR_FEE, address: DummyExecutorClient::new(&setup.env, &executor).recipient() }
264
+ );
265
+ assert_eq!(
266
+ native_fee_recipients.get(1).unwrap(),
267
+ FeeRecipient {
268
+ amount: DVN_FEE[0],
269
+ address: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient()
270
+ }
271
+ );
272
+ assert_eq!(
273
+ native_fee_recipients.get(2).unwrap(),
274
+ FeeRecipient { amount: TREASURY_NATIVE_FEE, address: setup.treasury.address }
275
+ );
276
+ assert_eq!(send_result.encoded_packet, packet_codec_v1::encode_packet(&setup.env, &packet));
277
+ }
278
+
279
+ #[test]
280
+ #[should_panic(expected = "HostError: Error(Auth, InvalidAction)")]
281
+ fn test_send_from_non_endpoint() {
282
+ let mut setup = setup();
283
+ let oapp = Address::generate(&setup.env);
284
+
285
+ // setup workers
286
+ let mut dvns = Vec::new(&setup.env);
287
+ DVN_FEE.iter().for_each(|fee| {
288
+ let dvn = setup.register_dvn(*fee);
289
+ dvns.push_back(dvn);
290
+ });
291
+ let executor = setup.register_executor(EXECUTOR_FEE);
292
+ setup.treasury.set_native_fee(&TREASURY_NATIVE_FEE);
293
+ setup.treasury.set_zro_fee(&TREASURY_ZRO_FEE);
294
+
295
+ // setup configs
296
+ setup.set_default_send_uln_config(
297
+ DST_EID,
298
+ UlnConfig::new(CONFIRMATIONS, &vec![&setup.env, dvns.get_unchecked(0)], &vec![&setup.env], 0),
299
+ );
300
+ setup.set_default_executor_config(DST_EID, ExecutorConfig::new(MAX_MESSAGE_SIZE, &executor));
301
+
302
+ // send without proper auth
303
+ let packet = OutboundPacket {
304
+ nonce: 1,
305
+ src_eid: EID,
306
+ sender: oapp,
307
+ dst_eid: DST_EID,
308
+ receiver: BytesN::<32>::from_array(&setup.env, &[0u8; 32]),
309
+ guid: BytesN::<32>::from_array(&setup.env, &[0u8; 32]),
310
+ message: Bytes::from_array(&setup.env, b"dummy testing message"),
311
+ };
312
+ let options = create_type3_options(&setup.env, &vec![&setup.env, dvns.get_unchecked(0)], true);
313
+ let pay_in_zro = false;
314
+
315
+ setup.uln302.send(&packet, &options, &pay_in_zro);
316
+ }
317
+
318
+ #[test]
319
+ fn test_send_multiple_dvns() {
320
+ let mut setup = setup();
321
+ let oapp = Address::generate(&setup.env);
322
+
323
+ // setup workers
324
+ let mut dvns = Vec::new(&setup.env);
325
+ DVN_FEE.iter().for_each(|fee| {
326
+ let dvn = setup.register_dvn(*fee);
327
+ dvns.push_back(dvn);
328
+ });
329
+ let executor = setup.register_executor(EXECUTOR_FEE);
330
+ setup.treasury.set_native_fee(&TREASURY_NATIVE_FEE);
331
+ setup.treasury.set_zro_fee(&TREASURY_ZRO_FEE);
332
+
333
+ // setup configs
334
+ setup.set_default_send_uln_config(
335
+ DST_EID,
336
+ UlnConfig::new(
337
+ CONFIRMATIONS,
338
+ &vec![&setup.env, dvns.get_unchecked(0), dvns.get_unchecked(1)],
339
+ &vec![&setup.env],
340
+ 0,
341
+ ),
342
+ );
343
+ setup.set_default_executor_config(DST_EID, ExecutorConfig::new(MAX_MESSAGE_SIZE, &executor));
344
+
345
+ // send
346
+ let packet = OutboundPacket {
347
+ nonce: 1,
348
+ src_eid: EID,
349
+ sender: oapp,
350
+ dst_eid: DST_EID,
351
+ receiver: BytesN::<32>::from_array(&setup.env, &[0u8; 32]),
352
+ guid: BytesN::<32>::from_array(&setup.env, &[0u8; 32]),
353
+ message: Bytes::from_array(&setup.env, b"dummy testing message"),
354
+ };
355
+ let options =
356
+ create_type3_options(&setup.env, &vec![&setup.env, dvns.get_unchecked(0), dvns.get_unchecked(1)], true);
357
+ let pay_in_zro = false;
358
+
359
+ setup.env.mock_auths(&[MockAuth {
360
+ address: &setup.endpoint.address,
361
+ invoke: &MockAuthInvoke {
362
+ contract: &setup.uln302.address,
363
+ fn_name: "send",
364
+ args: (&packet, &options, &pay_in_zro).into_val(&setup.env),
365
+ sub_invokes: &[],
366
+ },
367
+ }]);
368
+ let send_result = setup.uln302.send(&packet, &options, &pay_in_zro);
369
+ let native_fee_recipients = &send_result.native_fee_recipients;
370
+ let zro_fee_recipients = &send_result.zro_fee_recipients;
371
+
372
+ // executor, dvn1, dvn2, treasury
373
+ assert_eq!(native_fee_recipients.len(), 4);
374
+ assert_eq!(zro_fee_recipients.len(), 0);
375
+ assert_eq!(
376
+ native_fee_recipients.get(0).unwrap(),
377
+ FeeRecipient { amount: EXECUTOR_FEE, address: DummyExecutorClient::new(&setup.env, &executor).recipient() }
378
+ );
379
+ assert_eq!(
380
+ native_fee_recipients.get(1).unwrap(),
381
+ FeeRecipient {
382
+ amount: DVN_FEE[0],
383
+ address: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient()
384
+ }
385
+ );
386
+ assert_eq!(
387
+ native_fee_recipients.get(2).unwrap(),
388
+ FeeRecipient {
389
+ amount: DVN_FEE[1],
390
+ address: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(1)).recipient()
391
+ }
392
+ );
393
+ assert_eq!(
394
+ native_fee_recipients.get(3).unwrap(),
395
+ FeeRecipient { amount: TREASURY_NATIVE_FEE, address: setup.treasury.address }
396
+ );
397
+ assert_eq!(send_result.encoded_packet, packet_codec_v1::encode_packet(&setup.env, &packet));
398
+ }
399
+
400
+ #[test]
401
+ fn test_send_with_only_optional_dvns() {
402
+ let mut setup = setup();
403
+ let oapp = Address::generate(&setup.env);
404
+
405
+ // setup workers
406
+ let mut dvns = Vec::new(&setup.env);
407
+ DVN_FEE.iter().for_each(|fee| {
408
+ let dvn = setup.register_dvn(*fee);
409
+ dvns.push_back(dvn);
410
+ });
411
+ let executor = setup.register_executor(EXECUTOR_FEE);
412
+ setup.treasury.set_native_fee(&TREASURY_NATIVE_FEE);
413
+ setup.treasury.set_zro_fee(&TREASURY_ZRO_FEE);
414
+
415
+ // setup configs
416
+ setup.set_default_send_uln_config(
417
+ DST_EID,
418
+ UlnConfig::new(CONFIRMATIONS, &vec![&setup.env], &vec![&setup.env, dvns.get_unchecked(0)], 1),
419
+ );
420
+ setup.set_default_executor_config(DST_EID, ExecutorConfig::new(MAX_MESSAGE_SIZE, &executor));
421
+
422
+ // send
423
+ let packet = OutboundPacket {
424
+ nonce: 1,
425
+ src_eid: EID,
426
+ sender: oapp,
427
+ dst_eid: DST_EID,
428
+ receiver: BytesN::<32>::from_array(&setup.env, &[0u8; 32]),
429
+ guid: BytesN::<32>::from_array(&setup.env, &[0u8; 32]),
430
+ message: Bytes::from_array(&setup.env, b"dummy testing message"),
431
+ };
432
+ let options = create_type3_options(&setup.env, &vec![&setup.env, dvns.get_unchecked(0)], true);
433
+ let pay_in_zro = false;
434
+
435
+ setup.env.mock_auths(&[MockAuth {
436
+ address: &setup.endpoint.address,
437
+ invoke: &MockAuthInvoke {
438
+ contract: &setup.uln302.address,
439
+ fn_name: "send",
440
+ args: (&packet, &options, &pay_in_zro).into_val(&setup.env),
441
+ sub_invokes: &[],
442
+ },
443
+ }]);
444
+ let send_result = setup.uln302.send(&packet, &options, &pay_in_zro);
445
+ let native_fee_recipients = &send_result.native_fee_recipients;
446
+ let zro_fee_recipients = &send_result.zro_fee_recipients;
447
+
448
+ // executor, dvn, treasury
449
+ assert_eq!(native_fee_recipients.len(), 3);
450
+ assert_eq!(zro_fee_recipients.len(), 0);
451
+ assert_eq!(
452
+ native_fee_recipients.get(0).unwrap(),
453
+ FeeRecipient { amount: EXECUTOR_FEE, address: DummyExecutorClient::new(&setup.env, &executor).recipient() }
454
+ );
455
+ assert_eq!(
456
+ native_fee_recipients.get(1).unwrap(),
457
+ FeeRecipient {
458
+ amount: DVN_FEE[0],
459
+ address: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient()
460
+ }
461
+ );
462
+ assert_eq!(
463
+ native_fee_recipients.get(2).unwrap(),
464
+ FeeRecipient { amount: TREASURY_NATIVE_FEE, address: setup.treasury.address }
465
+ );
466
+ assert_eq!(send_result.encoded_packet, packet_codec_v1::encode_packet(&setup.env, &packet));
467
+ }
468
+
469
+ #[test]
470
+ fn test_send_with_bad_options() {
471
+ let mut setup = setup();
472
+ let oapp = Address::generate(&setup.env);
473
+
474
+ // setup workers
475
+ let mut dvns = Vec::new(&setup.env);
476
+ DVN_FEE.iter().for_each(|fee| {
477
+ let dvn = setup.register_dvn(*fee);
478
+ dvns.push_back(dvn);
479
+ });
480
+ let executor = setup.register_executor(EXECUTOR_FEE);
481
+ setup.treasury.set_native_fee(&TREASURY_NATIVE_FEE);
482
+ setup.treasury.set_zro_fee(&TREASURY_ZRO_FEE);
483
+
484
+ // setup configs
485
+ setup.set_default_send_uln_config(
486
+ DST_EID,
487
+ UlnConfig::new(CONFIRMATIONS, &vec![&setup.env], &vec![&setup.env, dvns.get_unchecked(0)], 1),
488
+ );
489
+ setup.set_default_executor_config(DST_EID, ExecutorConfig::new(MAX_MESSAGE_SIZE, &executor));
490
+
491
+ // send
492
+ let packet = OutboundPacket {
493
+ nonce: 1,
494
+ src_eid: EID,
495
+ sender: oapp,
496
+ dst_eid: DST_EID,
497
+ receiver: BytesN::<32>::from_array(&setup.env, &[0u8; 32]),
498
+ guid: BytesN::<32>::from_array(&setup.env, &[0u8; 32]),
499
+ message: Bytes::from_array(&setup.env, b"dummy testing message"),
500
+ };
501
+ let options = Bytes::from_array(&setup.env, b"ensure bad options can be captured");
502
+ let pay_in_zro = false;
503
+
504
+ setup.env.mock_auths(&[MockAuth {
505
+ address: &setup.endpoint.address,
506
+ invoke: &MockAuthInvoke {
507
+ contract: &setup.uln302.address,
508
+ fn_name: "send",
509
+ args: (&packet, &options, &pay_in_zro).into_val(&setup.env),
510
+ sub_invokes: &[],
511
+ },
512
+ }]);
513
+ let result = setup.uln302.try_send(&packet, &options, &pay_in_zro);
514
+ assert_eq!(
515
+ result.err().unwrap().ok().unwrap(),
516
+ message_lib_common::errors::WorkerOptionsError::InvalidOptionType.into()
517
+ );
518
+ }
519
+
520
+ #[test]
521
+ fn test_send_exceeding_message_size() {
522
+ let mut setup = setup();
523
+ let oapp = Address::generate(&setup.env);
524
+
525
+ // setup workers
526
+ let mut dvns = Vec::new(&setup.env);
527
+ DVN_FEE.iter().for_each(|fee| {
528
+ let dvn = setup.register_dvn(*fee);
529
+ dvns.push_back(dvn);
530
+ });
531
+ let executor = setup.register_executor(EXECUTOR_FEE);
532
+ setup.treasury.set_native_fee(&TREASURY_NATIVE_FEE);
533
+ setup.treasury.set_zro_fee(&TREASURY_ZRO_FEE);
534
+
535
+ // setup configs
536
+ setup.set_default_send_uln_config(
537
+ DST_EID,
538
+ UlnConfig::new(CONFIRMATIONS, &vec![&setup.env], &vec![&setup.env, dvns.get_unchecked(0)], 1),
539
+ );
540
+ setup.set_default_executor_config(DST_EID, ExecutorConfig::new(2, &executor));
541
+
542
+ // send
543
+ let packet = OutboundPacket {
544
+ nonce: 1,
545
+ src_eid: EID,
546
+ sender: oapp,
547
+ dst_eid: DST_EID,
548
+ receiver: BytesN::<32>::from_array(&setup.env, &[0u8; 32]),
549
+ guid: BytesN::<32>::from_array(&setup.env, &[0u8; 32]),
550
+ // message length bigger than max_message_size=2
551
+ message: Bytes::from_array(&setup.env, b"dummy testing message"),
552
+ };
553
+ let options = create_type3_options(&setup.env, &vec![&setup.env, dvns.get_unchecked(0)], true);
554
+ let pay_in_zro = false;
555
+
556
+ setup.env.mock_auths(&[MockAuth {
557
+ address: &setup.endpoint.address,
558
+ invoke: &MockAuthInvoke {
559
+ contract: &setup.uln302.address,
560
+ fn_name: "send",
561
+ args: (&packet, &options, &pay_in_zro).into_val(&setup.env),
562
+ sub_invokes: &[],
563
+ },
564
+ }]);
565
+ let result = setup.uln302.try_send(&packet, &options, &pay_in_zro);
566
+ assert_eq!(result.err().unwrap().ok().unwrap(), crate::errors::Uln302Error::InvalidMessageSize.into());
567
+ }
568
+
569
+ #[test]
570
+ fn test_send_with_missing_dvn_options() {
571
+ let mut setup = setup();
572
+ let oapp = Address::generate(&setup.env);
573
+
574
+ // setup workers
575
+ let mut dvns = Vec::new(&setup.env);
576
+ DVN_FEE.iter().for_each(|fee| {
577
+ let dvn = setup.register_dvn(*fee);
578
+ dvns.push_back(dvn);
579
+ });
580
+ let executor = setup.register_executor(EXECUTOR_FEE);
581
+ setup.treasury.set_native_fee(&TREASURY_NATIVE_FEE);
582
+ setup.treasury.set_zro_fee(&TREASURY_ZRO_FEE);
583
+
584
+ // setup configs
585
+ setup.set_default_send_uln_config(
586
+ DST_EID,
587
+ UlnConfig::new(
588
+ CONFIRMATIONS,
589
+ &vec![&setup.env, dvns.get_unchecked(0)],
590
+ &vec![&setup.env, dvns.get_unchecked(1)],
591
+ 1,
592
+ ),
593
+ );
594
+ setup.set_default_executor_config(DST_EID, ExecutorConfig::new(MAX_MESSAGE_SIZE, &executor));
595
+
596
+ // send
597
+ let packet = OutboundPacket {
598
+ nonce: 1,
599
+ src_eid: EID,
600
+ sender: oapp,
601
+ dst_eid: DST_EID,
602
+ receiver: BytesN::<32>::from_array(&setup.env, &[0u8; 32]),
603
+ guid: BytesN::<32>::from_array(&setup.env, &[0u8; 32]),
604
+ message: Bytes::from_array(&setup.env, b"dummy testing message"),
605
+ };
606
+ let options = create_type3_options(&setup.env, &vec![&setup.env, dvns.get_unchecked(0)], true); // only provide dvn option for index 0
607
+ let pay_in_zro = false;
608
+
609
+ setup.env.mock_auths(&[MockAuth {
610
+ address: &setup.endpoint.address,
611
+ invoke: &MockAuthInvoke {
612
+ contract: &setup.uln302.address,
613
+ fn_name: "send",
614
+ args: (&packet, &options, &pay_in_zro).into_val(&setup.env),
615
+ sub_invokes: &[],
616
+ },
617
+ }]);
618
+ let send_result = setup.uln302.send(&packet, &options, &pay_in_zro);
619
+ let native_fee_recipients = &send_result.native_fee_recipients;
620
+ let zro_fee_recipients = &send_result.zro_fee_recipients;
621
+
622
+ // executor, dvn1, dvn2, treasury
623
+ assert_eq!(native_fee_recipients.len(), 4);
624
+ assert_eq!(zro_fee_recipients.len(), 0);
625
+ assert_eq!(
626
+ native_fee_recipients.get(0).unwrap(),
627
+ FeeRecipient { amount: EXECUTOR_FEE, address: DummyExecutorClient::new(&setup.env, &executor).recipient() }
628
+ );
629
+ assert_eq!(
630
+ native_fee_recipients.get(1).unwrap(),
631
+ FeeRecipient {
632
+ amount: DVN_FEE[0],
633
+ address: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient()
634
+ }
635
+ );
636
+ assert_eq!(
637
+ native_fee_recipients.get(2).unwrap(),
638
+ FeeRecipient {
639
+ amount: DVN_FEE[1],
640
+ address: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(1)).recipient()
641
+ }
642
+ );
643
+ assert_eq!(
644
+ native_fee_recipients.get(3).unwrap(),
645
+ FeeRecipient { amount: TREASURY_NATIVE_FEE, address: setup.treasury.address }
646
+ );
647
+ assert_eq!(send_result.encoded_packet, packet_codec_v1::encode_packet(&setup.env, &packet));
648
+ }
649
+
650
+ #[test]
651
+ fn test_send_with_missing_executor_options() {
652
+ let mut setup = setup();
653
+ let oapp = Address::generate(&setup.env);
654
+
655
+ // setup workers
656
+ let mut dvns = Vec::new(&setup.env);
657
+ DVN_FEE.iter().for_each(|fee| {
658
+ let dvn = setup.register_dvn(*fee);
659
+ dvns.push_back(dvn);
660
+ });
661
+ let executor = setup.register_executor(EXECUTOR_FEE);
662
+ setup.treasury.set_native_fee(&TREASURY_NATIVE_FEE);
663
+ setup.treasury.set_zro_fee(&TREASURY_ZRO_FEE);
664
+
665
+ // setup configs
666
+ setup.set_default_send_uln_config(
667
+ DST_EID,
668
+ UlnConfig::new(CONFIRMATIONS, &vec![&setup.env, dvns.get_unchecked(0)], &vec![&setup.env], 0),
669
+ );
670
+ setup.set_default_executor_config(DST_EID, ExecutorConfig::new(MAX_MESSAGE_SIZE, &executor));
671
+
672
+ // send
673
+ let packet = OutboundPacket {
674
+ nonce: 1,
675
+ src_eid: EID,
676
+ sender: oapp,
677
+ dst_eid: DST_EID,
678
+ receiver: BytesN::<32>::from_array(&setup.env, &[0u8; 32]),
679
+ guid: BytesN::<32>::from_array(&setup.env, &[0u8; 32]),
680
+ message: Bytes::from_array(&setup.env, b"dummy testing message"),
681
+ };
682
+ let options = create_type3_options(&setup.env, &vec![&setup.env, dvns.get_unchecked(0)], false); // only provide dvn options, not executor options
683
+ let pay_in_zro = false;
684
+ setup.env.mock_auths(&[MockAuth {
685
+ address: &setup.endpoint.address,
686
+ invoke: &MockAuthInvoke {
687
+ contract: &setup.uln302.address,
688
+ fn_name: "send",
689
+ args: (&packet, &options, &pay_in_zro).into_val(&setup.env),
690
+ sub_invokes: &[],
691
+ },
692
+ }]);
693
+ let send_result = setup.uln302.send(&packet, &options, &pay_in_zro);
694
+ let native_fee_recipients = &send_result.native_fee_recipients;
695
+ let zro_fee_recipients = &send_result.zro_fee_recipients;
696
+
697
+ // executor, dvn, treasury
698
+ assert_eq!(native_fee_recipients.len(), 3);
699
+ assert_eq!(zro_fee_recipients.len(), 0);
700
+ assert_eq!(
701
+ native_fee_recipients.get(0).unwrap(),
702
+ FeeRecipient { amount: EXECUTOR_FEE, address: DummyExecutorClient::new(&setup.env, &executor).recipient() }
703
+ );
704
+ assert_eq!(
705
+ native_fee_recipients.get(1).unwrap(),
706
+ FeeRecipient {
707
+ amount: DVN_FEE[0],
708
+ address: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient()
709
+ }
710
+ );
711
+ assert_eq!(
712
+ native_fee_recipients.get(2).unwrap(),
713
+ FeeRecipient { amount: TREASURY_NATIVE_FEE, address: setup.treasury.address }
714
+ );
715
+ assert_eq!(send_result.encoded_packet, packet_codec_v1::encode_packet(&setup.env, &packet));
716
+ }
717
+
718
+ #[test]
719
+ fn test_send_derives_from_quote() {
720
+ // Sui equivalent: test_send_derives_from_quote
721
+ // Test that send() produces consistent results with quote() for the same config
722
+ let mut setup = setup();
723
+ let oapp = Address::generate(&setup.env);
724
+
725
+ // setup workers with multiple required and optional DVNs
726
+ let mut dvns = Vec::new(&setup.env);
727
+ DVN_FEE.iter().for_each(|fee| {
728
+ let dvn = setup.register_dvn(*fee);
729
+ dvns.push_back(dvn);
730
+ });
731
+ let executor = setup.register_executor(EXECUTOR_FEE);
732
+ setup.treasury.set_native_fee(&TREASURY_NATIVE_FEE);
733
+ setup.treasury.set_zro_fee(&TREASURY_ZRO_FEE);
734
+
735
+ // Setup complex config with 2 required DVNs + 1 optional DVN (like Sui test)
736
+ setup.set_default_send_uln_config(
737
+ DST_EID,
738
+ UlnConfig::new(
739
+ CONFIRMATIONS,
740
+ &vec![&setup.env, dvns.get_unchecked(0), dvns.get_unchecked(1)], // 2 required DVNs
741
+ &vec![&setup.env, dvns.get_unchecked(2)], // 1 optional DVN
742
+ 1, // threshold = 1
743
+ ),
744
+ );
745
+ setup.set_default_executor_config(DST_EID, ExecutorConfig::new(MAX_MESSAGE_SIZE, &executor));
746
+
747
+ // Create the same packet for both quote and send
748
+ let packet = OutboundPacket {
749
+ nonce: 1,
750
+ src_eid: EID,
751
+ sender: oapp.clone(),
752
+ dst_eid: DST_EID,
753
+ receiver: BytesN::<32>::from_array(&setup.env, &[0u8; 32]),
754
+ guid: BytesN::<32>::from_array(&setup.env, &[0u8; 32]),
755
+ message: Bytes::from_array(&setup.env, b"dummy testing message"),
756
+ };
757
+ let options = create_type3_options(
758
+ &setup.env,
759
+ &vec![&setup.env, dvns.get_unchecked(0), dvns.get_unchecked(1), dvns.get_unchecked(2)],
760
+ true,
761
+ );
762
+ let pay_in_zro = false;
763
+
764
+ // Get quote
765
+ setup.env.mock_auths(&[MockAuth {
766
+ address: &setup.endpoint.address,
767
+ invoke: &MockAuthInvoke {
768
+ contract: &setup.uln302.address,
769
+ fn_name: "quote",
770
+ args: (&packet, &options, &pay_in_zro).into_val(&setup.env),
771
+ sub_invokes: &[],
772
+ },
773
+ }]);
774
+ let quote_fee = setup.uln302.quote(&packet, &options, &pay_in_zro);
775
+
776
+ // Get send result
777
+ setup.env.mock_auths(&[MockAuth {
778
+ address: &setup.endpoint.address,
779
+ invoke: &MockAuthInvoke {
780
+ contract: &setup.uln302.address,
781
+ fn_name: "send",
782
+ args: (&packet, &options, &pay_in_zro).into_val(&setup.env),
783
+ sub_invokes: &[],
784
+ },
785
+ }]);
786
+ let send_result = setup.uln302.send(&packet, &options, &pay_in_zro);
787
+ let native_fee_recipients = &send_result.native_fee_recipients;
788
+
789
+ // Verify send results are consistent with quote results
790
+ // Total native fee should match: executor + dvn0 + dvn1 + dvn2 + treasury
791
+ let expected_native_fee = EXECUTOR_FEE + DVN_FEE[0] + DVN_FEE[1] + DVN_FEE[2] + TREASURY_NATIVE_FEE;
792
+ assert_eq!(quote_fee.native_fee, expected_native_fee);
793
+
794
+ // Verify DVN count: executor + 2 required + 1 optional + treasury = 5
795
+ assert_eq!(native_fee_recipients.len(), 5);
796
+
797
+ // Verify executor fee is first
798
+ assert_eq!(
799
+ native_fee_recipients.get(0).unwrap(),
800
+ FeeRecipient { amount: EXECUTOR_FEE, address: DummyExecutorClient::new(&setup.env, &executor).recipient() }
801
+ );
802
+
803
+ // Verify DVN ordering is maintained (required first, then optional)
804
+ // DVN 0 (first required)
805
+ assert_eq!(
806
+ native_fee_recipients.get(1).unwrap(),
807
+ FeeRecipient {
808
+ amount: DVN_FEE[0],
809
+ address: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient()
810
+ }
811
+ );
812
+ // DVN 1 (second required)
813
+ assert_eq!(
814
+ native_fee_recipients.get(2).unwrap(),
815
+ FeeRecipient {
816
+ amount: DVN_FEE[1],
817
+ address: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(1)).recipient()
818
+ }
819
+ );
820
+ // DVN 2 (optional)
821
+ assert_eq!(
822
+ native_fee_recipients.get(3).unwrap(),
823
+ FeeRecipient {
824
+ amount: DVN_FEE[2],
825
+ address: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(2)).recipient()
826
+ }
827
+ );
828
+
829
+ // Treasury fee is last
830
+ assert_eq!(
831
+ native_fee_recipients.get(4).unwrap(),
832
+ FeeRecipient { amount: TREASURY_NATIVE_FEE, address: setup.treasury.address }
833
+ );
834
+ }