@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,55 @@
1
+ use endpoint_v2::FeeRecipient;
2
+ use soroban_sdk::{contractclient, Address, Bytes, BytesN, Env};
3
+
4
+ /// Interface for Decentralized Verifier Networks (DVNs) that verify cross-chain messages.
5
+ #[allow(clippy::upper_case_acronyms)]
6
+ #[contractclient(name = "LayerZeroDVNClient")]
7
+ pub trait ILayerZeroDVN {
8
+ /// Quotes the fee for verifying a message.
9
+ ///
10
+ /// # Arguments
11
+ /// * `send_lib` - The send library address
12
+ /// * `sender` - The sender OApp address
13
+ /// * `dst_eid` - The destination endpoint ID
14
+ /// * `packet_header` - The packet header bytes
15
+ /// * `payload_hash` - The hash of the message payload
16
+ /// * `confirmations` - The number of block confirmations required
17
+ /// * `options` - DVN-specific options
18
+ ///
19
+ /// # Returns
20
+ /// The verification fee in native token
21
+ fn get_fee(
22
+ env: &Env,
23
+ send_lib: &Address,
24
+ sender: &Address,
25
+ dst_eid: u32,
26
+ packet_header: &Bytes,
27
+ payload_hash: &BytesN<32>,
28
+ confirmations: u64,
29
+ options: &Bytes,
30
+ ) -> i128;
31
+
32
+ /// Assigns a verification job to the DVN.
33
+ ///
34
+ /// # Arguments
35
+ /// * `send_lib` - The send library address
36
+ /// * `sender` - The sender OApp address
37
+ /// * `dst_eid` - The destination endpoint ID
38
+ /// * `packet_header` - The packet header bytes
39
+ /// * `payload_hash` - The hash of the message payload
40
+ /// * `confirmations` - The number of block confirmations required
41
+ /// * `options` - DVN-specific options
42
+ ///
43
+ /// # Returns
44
+ /// `FeeRecipient` containing the fee recipient address and fee amount
45
+ fn assign_job(
46
+ env: &Env,
47
+ send_lib: &Address,
48
+ sender: &Address,
49
+ dst_eid: u32,
50
+ packet_header: &Bytes,
51
+ payload_hash: &BytesN<32>,
52
+ confirmations: u64,
53
+ options: &Bytes,
54
+ ) -> FeeRecipient;
55
+ }
@@ -0,0 +1,46 @@
1
+ use endpoint_v2::FeeRecipient;
2
+ use soroban_sdk::{contractclient, Address, Bytes, Env};
3
+
4
+ /// Interface for executors that handle message delivery on the destination chain.
5
+ #[contractclient(name = "LayerZeroExecutorClient")]
6
+ pub trait ILayerZeroExecutor {
7
+ /// Quotes the fee for executing a message on the destination chain.
8
+ ///
9
+ /// # Arguments
10
+ /// * `send_lib` - The send library address
11
+ /// * `sender` - The sender OApp address
12
+ /// * `dst_eid` - The destination endpoint ID
13
+ /// * `calldata_size` - The size of the calldata to execute
14
+ /// * `options` - Execution options (gas limit, airdrop, etc.)
15
+ ///
16
+ /// # Returns
17
+ /// The execution fee in native token
18
+ fn get_fee(
19
+ env: &Env,
20
+ send_lib: &Address,
21
+ sender: &Address,
22
+ dst_eid: u32,
23
+ calldata_size: u32,
24
+ options: &Bytes,
25
+ ) -> i128;
26
+
27
+ /// Assigns an execution job to the executor.
28
+ ///
29
+ /// # Arguments
30
+ /// * `send_lib` - The send library address
31
+ /// * `sender` - The sender OApp address
32
+ /// * `dst_eid` - The destination endpoint ID
33
+ /// * `calldata_size` - The size of the calldata to execute
34
+ /// * `options` - Execution options (gas limit, airdrop, etc.)
35
+ ///
36
+ /// # Returns
37
+ /// `FeeRecipient` containing the fee recipient address and fee amount
38
+ fn assign_job(
39
+ env: &Env,
40
+ send_lib: &Address,
41
+ sender: &Address,
42
+ dst_eid: u32,
43
+ calldata_size: u32,
44
+ options: &Bytes,
45
+ ) -> FeeRecipient;
46
+ }
@@ -0,0 +1,7 @@
1
+ pub mod dvn;
2
+ pub mod executor;
3
+ pub mod treasury;
4
+
5
+ pub use dvn::*;
6
+ pub use executor::*;
7
+ pub use treasury::*;
@@ -0,0 +1,17 @@
1
+ use soroban_sdk::{contractclient, Address, Env};
2
+
3
+ /// Interface for the treasury that collects protocol fees.
4
+ #[contractclient(name = "LayerZeroTreasuryClient")]
5
+ pub trait ILayerZeroTreasury {
6
+ /// Quotes the treasury fee for a message.
7
+ ///
8
+ /// # Arguments
9
+ /// * `sender` - The sender OApp address
10
+ /// * `dst_eid` - The destination endpoint ID
11
+ /// * `total_native_fee` - The total native fee for the message
12
+ /// * `pay_in_zro` - Whether to pay fees in ZRO token
13
+ ///
14
+ /// # Returns
15
+ /// The treasury fee amount
16
+ fn get_fee(env: &Env, sender: &Address, dst_eid: u32, total_native_fee: i128, pay_in_zro: bool) -> i128;
17
+ }
@@ -0,0 +1,14 @@
1
+ #![no_std]
2
+
3
+ pub mod errors;
4
+ pub mod interfaces;
5
+ pub mod packet_codec_v1;
6
+ pub mod worker_options;
7
+
8
+ pub use interfaces::*;
9
+
10
+ #[cfg(test)]
11
+ mod tests;
12
+
13
+ #[cfg(any(test, feature = "testutils"))]
14
+ pub mod testing_utils;
@@ -0,0 +1,99 @@
1
+ use endpoint_v2::{
2
+ util::{build_payload, keccak256},
3
+ OutboundPacket,
4
+ };
5
+ use soroban_sdk::{assert_with_error, Bytes, BytesN, Env};
6
+ use utils::{buffer_reader::BufferReader, buffer_writer::BufferWriter};
7
+
8
+ use crate::errors::PacketCodecV1Error;
9
+
10
+ pub const PACKET_VERSION: u8 = 1;
11
+ pub const HEADER_LENGTH: u32 = 81;
12
+
13
+ #[derive(Clone, Debug, Eq, PartialEq)]
14
+ pub struct PacketHeader {
15
+ pub version: u8,
16
+ pub nonce: u64,
17
+ pub src_eid: u32,
18
+ pub sender: BytesN<32>,
19
+ pub dst_eid: u32,
20
+ pub receiver: BytesN<32>,
21
+ }
22
+
23
+ /// Encodes a complete outbound packet including header, GUID, and message.
24
+ ///
25
+ /// Packet layout: [header (81 bytes)] + [guid (32 bytes)] + [message (variable)]
26
+ ///
27
+ /// # Arguments
28
+ /// * `packet` - The outbound packet containing routing info and message
29
+ ///
30
+ /// # Returns
31
+ /// Encoded packet bytes ready for cross-chain transmission
32
+ pub fn encode_packet(env: &Env, packet: &OutboundPacket) -> Bytes {
33
+ let mut result = encode_packet_header(env, packet);
34
+ result.extend_from_array(&packet.guid.to_array());
35
+ result.append(&packet.message);
36
+ result
37
+ }
38
+
39
+ /// Encodes only the packet header from an outbound packet.
40
+ ///
41
+ /// Header layout (81 bytes):
42
+ /// - `[0]`: version (1 byte)
43
+ /// - `[1..9]`: nonce (8 bytes, big-endian)
44
+ /// - `[9..13]`: src_eid (4 bytes, big-endian)
45
+ /// - `[13..45]`: sender (32 bytes)
46
+ /// - `[45..49]`: dst_eid (4 bytes, big-endian)
47
+ /// - `[49..81]`: receiver (32 bytes)
48
+ ///
49
+ /// # Arguments
50
+ /// * `packet` - The outbound packet to encode header from
51
+ ///
52
+ /// # Returns
53
+ /// Encoded 81-byte packet header
54
+ pub fn encode_packet_header(env: &Env, packet: &OutboundPacket) -> Bytes {
55
+ let mut writer = BufferWriter::new(env);
56
+ writer
57
+ .write_u8(PACKET_VERSION)
58
+ .write_u64(packet.nonce)
59
+ .write_u32(packet.src_eid)
60
+ .write_address_payload(&packet.sender)
61
+ .write_u32(packet.dst_eid)
62
+ .write_bytes_n(&packet.receiver);
63
+ writer.to_bytes()
64
+ }
65
+
66
+ /// Decodes a byte vector into a packet header and validates the format.
67
+ ///
68
+ /// Validates header length (81 bytes) and packet version before decoding.
69
+ ///
70
+ /// # Arguments
71
+ /// * `encoded_header` - The raw 81-byte packet header
72
+ ///
73
+ /// # Returns
74
+ /// Decoded `PacketHeader` struct with version, nonce, src_eid, sender, dst_eid, receiver
75
+ pub fn decode_packet_header(env: &Env, encoded_header: &Bytes) -> PacketHeader {
76
+ assert_with_error!(env, encoded_header.len() == HEADER_LENGTH, PacketCodecV1Error::InvalidPacketHeader);
77
+
78
+ let mut reader = BufferReader::new(encoded_header);
79
+ let packet_version = reader.read_u8();
80
+ assert_with_error!(env, packet_version == PACKET_VERSION, PacketCodecV1Error::InvalidPacketVersion);
81
+
82
+ let nonce = reader.read_u64();
83
+ let src_eid = reader.read_u32();
84
+ let sender = reader.read_bytes_n();
85
+ let dst_eid = reader.read_u32();
86
+ let receiver = reader.read_bytes_n();
87
+
88
+ PacketHeader { version: PACKET_VERSION, nonce, src_eid, sender, dst_eid, receiver }
89
+ }
90
+
91
+ /// Returns the payload (GUID + message) from an outbound packet.
92
+ pub fn payload(env: &Env, packet: &OutboundPacket) -> Bytes {
93
+ build_payload(env, &packet.guid, &packet.message)
94
+ }
95
+
96
+ /// Returns the keccak256 hash of the packet payload.
97
+ pub fn payload_hash(env: &Env, packet: &OutboundPacket) -> BytesN<32> {
98
+ keccak256(env, &payload(env, packet))
99
+ }
@@ -0,0 +1,27 @@
1
+ use soroban_sdk::{bytes, Address, Bytes, Env, Vec};
2
+
3
+ use crate::worker_options::{DVN_WORKER_ID, EXECUTOR_OPTION_TYPE_LZRECEIVE, EXECUTOR_WORKER_ID, OPTIONS_TYPE_3};
4
+
5
+ pub fn create_type3_options(env: &Env, dvns: &Vec<Address>, enable_executor_option: bool) -> Bytes {
6
+ let mut result = bytes!(env);
7
+
8
+ result.extend_from_array(&OPTIONS_TYPE_3.to_be_bytes());
9
+
10
+ // append executor option
11
+ if enable_executor_option {
12
+ result.extend_from_array(&[EXECUTOR_WORKER_ID]);
13
+ result.extend_from_array(&17u16.to_be_bytes()); // option_size: option_type(1) + data(16) = 17 bytes
14
+ result.extend_from_array(&[EXECUTOR_OPTION_TYPE_LZRECEIVE]); // option_type (1 byte)
15
+ result.extend_from_array(&200000_u128.to_be_bytes()); // execution gas (16 bytes)
16
+ }
17
+
18
+ // append dvn options
19
+ for (idx, _dvn) in dvns.iter().enumerate() {
20
+ result.extend_from_array(&[DVN_WORKER_ID]);
21
+ result.extend_from_array(&5u16.to_be_bytes()); // idx(1) + data(4) = 5 bytes
22
+ result.extend_from_array(&[idx as u8]); // dvn_idx
23
+ result.extend_from_array(&1000_u32.to_be_bytes()); // custom data (4 bytes)
24
+ }
25
+
26
+ result
27
+ }
@@ -0,0 +1,2 @@
1
+ mod packet_codec_v1;
2
+ mod worker_options;
@@ -0,0 +1,162 @@
1
+ use crate::packet_codec_v1::*;
2
+ use endpoint_v2::{
3
+ util::{compute_guid, keccak256},
4
+ OutboundPacket,
5
+ };
6
+ use hex_literal::hex;
7
+ use soroban_sdk::{address_payload::AddressPayload, Address, Bytes, BytesN, Env};
8
+ use utils::buffer_reader::BufferReader;
9
+
10
+ // Test constants matching Sui's test values
11
+ const TEST_SRC_EID: u32 = 101;
12
+ const TEST_DST_EID: u32 = 102;
13
+ const TEST_NONCE: u64 = 0x123456789abcdef0;
14
+ const TEST_MESSAGE: [u8; 5] = hex!("0102030405");
15
+ // @0x1234567890abcdef1234567890abcdef12345678 padded to 32 bytes
16
+ const TEST_SENDER_BYTES: [u8; 32] = hex!("0000000000000000000000001234567890abcdef1234567890abcdef12345678");
17
+ // @0x9876543210fedcba9876543210fedcba98765432 padded to 32 bytes
18
+ const TEST_RECEIVER_BYTES: [u8; 32] = hex!("0000000000000000000000009876543210fedcba9876543210fedcba98765432");
19
+
20
+ #[test]
21
+ fn test_encode_decode_packet_header() {
22
+ let env = Env::default();
23
+ let packet = create_test_outbound_packet(&env);
24
+
25
+ // Encode the packet header
26
+ let encoded_header = encode_packet_header(&env, &packet);
27
+
28
+ // Verify the encoded header has the correct length
29
+ assert_eq!(encoded_header.len(), HEADER_LENGTH); // HEADER_LENGTH = 81
30
+
31
+ // Decode the header back
32
+ let decoded_header = decode_packet_header(&env, &encoded_header);
33
+
34
+ // Verify all fields match
35
+ assert_eq!(decoded_header.version, PACKET_VERSION);
36
+ assert_eq!(decoded_header.nonce, TEST_NONCE);
37
+ assert_eq!(decoded_header.src_eid, TEST_SRC_EID);
38
+ assert_eq!(decoded_header.dst_eid, TEST_DST_EID);
39
+ assert_eq!(decoded_header.sender, BytesN::from_array(&env, &TEST_SENDER_BYTES));
40
+ assert_eq!(decoded_header.receiver, BytesN::from_array(&env, &TEST_RECEIVER_BYTES));
41
+ }
42
+
43
+ #[test]
44
+ fn test_payload_functions() {
45
+ let env = Env::default();
46
+ let packet = create_test_outbound_packet(&env);
47
+
48
+ // Test payload extraction
49
+ let payload_result = payload(&env, &packet);
50
+
51
+ // Expected payload is guid + message
52
+ let mut expected_payload = Bytes::new(&env);
53
+ expected_payload.extend_from_array(&packet.guid.to_array());
54
+ expected_payload.append(&packet.message);
55
+ assert_eq!(payload_result, expected_payload);
56
+
57
+ // Test payload hash
58
+ let hash_result = payload_hash(&env, &packet);
59
+ let expected_hash = keccak256(&env, &payload_result);
60
+ assert_eq!(hash_result, expected_hash);
61
+ }
62
+
63
+ #[test]
64
+ #[should_panic(expected = "Error(Contract, #11002)")] // PacketCodecV1Error::InvalidPacketHeader
65
+ fn test_invalid_header_length() {
66
+ let env = Env::default();
67
+ // Create a header with wrong length (too short) - only 3 bytes instead of 81
68
+ let invalid_header = Bytes::from_array(&env, &[0x01, 0x02, 0x03]);
69
+ decode_packet_header(&env, &invalid_header);
70
+ }
71
+
72
+ #[test]
73
+ #[should_panic(expected = "Error(Contract, #11001)")] // PacketCodecV1Error::InvalidPacketVersion
74
+ fn test_invalid_packet_version() {
75
+ let env = Env::default();
76
+ // Create a header with correct length but wrong version
77
+ let mut invalid_header_bytes: [u8; 81] = [0u8; HEADER_LENGTH as usize];
78
+ invalid_header_bytes[0] = 2; // Wrong version (should be 1)
79
+ let invalid_header = Bytes::from_array(&env, &invalid_header_bytes);
80
+ decode_packet_header(&env, &invalid_header);
81
+ }
82
+
83
+ #[test]
84
+ fn test_header_getters() {
85
+ let env = Env::default();
86
+ let header = create_test_header(&env);
87
+ // Test all getter/field accesses
88
+ assert_eq!(header.version, PACKET_VERSION);
89
+ assert_eq!(header.nonce, TEST_NONCE);
90
+ assert_eq!(header.src_eid, TEST_SRC_EID);
91
+ assert_eq!(header.dst_eid, TEST_DST_EID);
92
+ assert_eq!(header.sender, BytesN::from_array(&env, &TEST_SENDER_BYTES));
93
+ assert_eq!(header.receiver, BytesN::from_array(&env, &TEST_RECEIVER_BYTES));
94
+ }
95
+
96
+ #[test]
97
+ fn test_empty_message() {
98
+ let env = Env::default();
99
+ let empty_message = Bytes::new(&env);
100
+ let packet = create_test_outbound_packet_with_message(&env, empty_message);
101
+
102
+ // Test encoding and decoding with empty message
103
+ let encoded = encode_packet(&env, &packet);
104
+ let (header, decoded_guid, decoded_message) = decode_packet_for_test(&env, &encoded);
105
+
106
+ assert_eq!(header.src_eid, TEST_SRC_EID);
107
+ assert_eq!(decoded_guid, packet.guid);
108
+ assert_eq!(decoded_message.len(), 0);
109
+ }
110
+
111
+ #[test]
112
+ fn test_large_message() {
113
+ let env = Env::default();
114
+
115
+ // Create a large message (1024 bytes, matching Sui's 1KB)
116
+ let mut large_msg_array = [0u8; 1024];
117
+ for (i, byte) in large_msg_array.iter_mut().enumerate() {
118
+ *byte = (i % 256) as u8;
119
+ }
120
+ let large_message = Bytes::from_slice(&env, &large_msg_array);
121
+ let packet = create_test_outbound_packet_with_message(&env, large_message.clone());
122
+
123
+ // Test encoding and decoding with large message
124
+ let encoded = encode_packet(&env, &packet);
125
+ let (header, decoded_guid, decoded_message) = decode_packet_for_test(&env, &encoded);
126
+
127
+ assert_eq!(header.src_eid, TEST_SRC_EID);
128
+ assert_eq!(decoded_guid, packet.guid);
129
+ assert_eq!(decoded_message.len(), 1024);
130
+ assert_eq!(decoded_message, large_message);
131
+ }
132
+
133
+ fn create_test_header(env: &Env) -> PacketHeader {
134
+ let mut header_bytes = Bytes::new(env);
135
+ header_bytes.extend_from_array(&[PACKET_VERSION]); // version
136
+ header_bytes.extend_from_array(&TEST_NONCE.to_be_bytes()); // nonce
137
+ header_bytes.extend_from_array(&TEST_SRC_EID.to_be_bytes()); // src_eid
138
+ header_bytes.extend_from_array(&TEST_SENDER_BYTES); // sender
139
+ header_bytes.extend_from_array(&TEST_DST_EID.to_be_bytes()); // dst_eid
140
+ header_bytes.extend_from_array(&TEST_RECEIVER_BYTES); // receiver
141
+ decode_packet_header(env, &header_bytes)
142
+ }
143
+
144
+ fn create_test_outbound_packet(env: &Env) -> OutboundPacket {
145
+ create_test_outbound_packet_with_message(env, Bytes::from_array(env, &TEST_MESSAGE))
146
+ }
147
+
148
+ fn create_test_outbound_packet_with_message(env: &Env, message: Bytes) -> OutboundPacket {
149
+ let sender =
150
+ Address::from_payload(env, AddressPayload::ContractIdHash(BytesN::from_array(env, &TEST_SENDER_BYTES)));
151
+ let receiver = BytesN::from_array(env, &TEST_RECEIVER_BYTES);
152
+ let guid = compute_guid(env, TEST_NONCE, TEST_SRC_EID, &sender, TEST_DST_EID, &receiver);
153
+ OutboundPacket { nonce: TEST_NONCE, src_eid: TEST_SRC_EID, sender, dst_eid: TEST_DST_EID, receiver, guid, message }
154
+ }
155
+
156
+ fn decode_packet_for_test(env: &Env, encoded: &Bytes) -> (PacketHeader, BytesN<32>, Bytes) {
157
+ let mut reader = BufferReader::new(encoded);
158
+ let header = decode_packet_header(env, &reader.read_bytes(HEADER_LENGTH));
159
+ let guid = reader.read_bytes_n();
160
+ let message = reader.read_bytes_until_end();
161
+ (header, guid, message)
162
+ }