@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,132 @@
1
+ use crate::{interfaces::MessagingFee, FeeRecipient, FeesAndPacket, MessageLibType, Origin, OutboundPacket};
2
+ use soroban_sdk::{contract, contractimpl, vec, Address, Bytes, Env, Symbol, Vec};
3
+
4
+ // ============================================================================
5
+ // Mock Receiver Contract for Testing
6
+ // ============================================================================
7
+
8
+ #[contract]
9
+ pub struct MockReceiver;
10
+
11
+ #[contractimpl]
12
+ impl MockReceiver {
13
+ pub fn allow_initialize_path(_env: soroban_sdk::Env, _origin: Origin) -> bool {
14
+ // Default mock implementation returns true
15
+ true
16
+ }
17
+ }
18
+
19
+ #[contract]
20
+ pub struct MockReceiverReject;
21
+
22
+ #[contractimpl]
23
+ impl MockReceiverReject {
24
+ pub fn allow_initialize_path(_env: soroban_sdk::Env, _origin: Origin) -> bool {
25
+ // Mock implementation that rejects initialization
26
+ false
27
+ }
28
+ }
29
+
30
+ #[contract]
31
+ pub struct MockValidMessageLib;
32
+
33
+ #[contractimpl]
34
+ impl MockValidMessageLib {
35
+ pub fn message_lib_type(_env: &Env) -> MessageLibType {
36
+ MessageLibType::Send
37
+ }
38
+ }
39
+
40
+ // Configurable mock message library for testing
41
+ #[contract]
42
+ pub struct MockMessageLib;
43
+
44
+ #[contractimpl]
45
+ impl MockMessageLib {
46
+ pub fn setup(env: Env, lib_type: MessageLibType, supported_eids: Vec<u32>) {
47
+ env.storage().instance().set(&Symbol::new(&env, "lib_type"), &lib_type);
48
+ env.storage().instance().set(&Symbol::new(&env, "supported_eids"), &supported_eids);
49
+ }
50
+
51
+ pub fn message_lib_type(env: Env) -> MessageLibType {
52
+ env.storage().instance().get(&Symbol::new(&env, "lib_type")).unwrap_or(MessageLibType::Send)
53
+ }
54
+
55
+ pub fn is_supported_eid(env: Env, eid: u32) -> bool {
56
+ let supported_eids: Vec<u32> =
57
+ env.storage().instance().get(&Symbol::new(&env, "supported_eids")).unwrap_or(vec![&env]);
58
+ supported_eids.contains(eid)
59
+ }
60
+ }
61
+
62
+ // Mock send library for testing send/quote operations
63
+ #[contract]
64
+ pub struct MockSendLib;
65
+
66
+ #[contractimpl]
67
+ impl MockSendLib {
68
+ pub fn setup(env: Env, supported_eids: Vec<u32>, native_fee: i128, zro_fee: i128, fee_recipient: Address) {
69
+ env.storage().instance().set(&Symbol::new(&env, "supported_eids"), &supported_eids);
70
+ env.storage().instance().set(&Symbol::new(&env, "native_fee"), &native_fee);
71
+ env.storage().instance().set(&Symbol::new(&env, "zro_fee"), &zro_fee);
72
+ env.storage().instance().set(&Symbol::new(&env, "fee_recipient"), &fee_recipient);
73
+ }
74
+
75
+ pub fn message_lib_type(_env: Env) -> MessageLibType {
76
+ MessageLibType::Send
77
+ }
78
+
79
+ pub fn is_supported_eid(env: Env, eid: u32) -> bool {
80
+ let supported_eids: Vec<u32> =
81
+ env.storage().instance().get(&Symbol::new(&env, "supported_eids")).unwrap_or(vec![&env]);
82
+ supported_eids.contains(eid)
83
+ }
84
+
85
+ pub fn quote(env: Env, _packet: OutboundPacket, _options: Bytes, _pay_in_zro: bool) -> MessagingFee {
86
+ let native_fee = env.storage().instance().get(&Symbol::new(&env, "native_fee")).unwrap_or(100);
87
+ let zro_fee = env.storage().instance().get(&Symbol::new(&env, "zro_fee")).unwrap_or(0);
88
+ MessagingFee { native_fee, zro_fee }
89
+ }
90
+
91
+ pub fn send(env: Env, packet: OutboundPacket, _options: Bytes, _pay_in_zro: bool) -> FeesAndPacket {
92
+ let native_fee = env.storage().instance().get(&Symbol::new(&env, "native_fee")).unwrap_or(100);
93
+ let zro_fee = env.storage().instance().get(&Symbol::new(&env, "zro_fee")).unwrap_or(0);
94
+ let fee_recipient: Address = env.storage().instance().get(&Symbol::new(&env, "fee_recipient")).unwrap();
95
+
96
+ let mut native_fee_recipients = Vec::new(&env);
97
+ if native_fee > 0 {
98
+ native_fee_recipients.push_back(FeeRecipient { amount: native_fee, address: fee_recipient.clone() });
99
+ }
100
+
101
+ let mut zro_fee_recipients = Vec::new(&env);
102
+ if zro_fee > 0 {
103
+ zro_fee_recipients.push_back(FeeRecipient { amount: zro_fee, address: fee_recipient });
104
+ }
105
+
106
+ // Create a simple encoded payload (just the message for simplicity)
107
+ let encoded_packet = packet.message.clone();
108
+
109
+ FeesAndPacket { native_fee_recipients, zro_fee_recipients, encoded_packet }
110
+ }
111
+ }
112
+
113
+ // Mock receive library for testing verify operations
114
+ #[contract]
115
+ pub struct MockReceiveLib;
116
+
117
+ #[contractimpl]
118
+ impl MockReceiveLib {
119
+ pub fn setup(env: Env, supported_eids: Vec<u32>) {
120
+ env.storage().instance().set(&Symbol::new(&env, "supported_eids"), &supported_eids);
121
+ }
122
+
123
+ pub fn message_lib_type(_env: Env) -> MessageLibType {
124
+ MessageLibType::Receive
125
+ }
126
+
127
+ pub fn is_supported_eid(env: Env, eid: u32) -> bool {
128
+ let supported_eids: Vec<u32> =
129
+ env.storage().instance().get(&Symbol::new(&env, "supported_eids")).unwrap_or(vec![&env]);
130
+ supported_eids.contains(eid)
131
+ }
132
+ }
@@ -0,0 +1,12 @@
1
+ mod endpoint_setup;
2
+ mod endpoint_v2;
3
+ mod mock;
4
+
5
+ #[allow(non_snake_case)]
6
+ mod util;
7
+
8
+ mod messaging_channel;
9
+
10
+ mod message_lib_manager;
11
+
12
+ mod messaging_composer;
@@ -0,0 +1,126 @@
1
+ use crate::{tests::endpoint_setup::setup, util::build_payload};
2
+ use soroban_sdk::{Bytes, BytesN};
3
+
4
+ #[test]
5
+ fn test_build_payload_basic() {
6
+ let context = setup();
7
+ let env = &context.env;
8
+
9
+ let guid = BytesN::from_array(env, &[1u8; 32]);
10
+ let message = Bytes::from_array(env, &[1, 2, 3, 4, 5]);
11
+
12
+ let payload = build_payload(env, &guid, &message);
13
+
14
+ // Payload should be 32 bytes (guid) + message length
15
+ assert_eq!(payload.len(), 32 + 5);
16
+ }
17
+
18
+ #[test]
19
+ fn test_build_payload() {
20
+ let context = setup();
21
+ let env = &context.env;
22
+
23
+ // Create a guid with 32 periods (ASCII 46 = '.')
24
+ let guid_bytes = [46u8; 32];
25
+ let guid = BytesN::from_array(env, &guid_bytes);
26
+
27
+ // Create message with bytes [18, 19, 20]
28
+ let message = Bytes::from_array(env, &[18, 19, 20]);
29
+
30
+ let payload = build_payload(env, &guid, &message);
31
+
32
+ // Expected payload: 32 bytes of guid + 3 bytes of message
33
+ let expected_bytes: [u8; 35] = [
34
+ 46, 46, 46, 46, 46, 46, 46, 46, // guid bytes 0-7
35
+ 46, 46, 46, 46, 46, 46, 46, 46, // guid bytes 8-15
36
+ 46, 46, 46, 46, 46, 46, 46, 46, // guid bytes 16-23
37
+ 46, 46, 46, 46, 46, 46, 46, 46, // guid bytes 24-31 (32 periods)
38
+ 18, 19, 20, // message
39
+ ];
40
+ let expected = Bytes::from_array(env, &expected_bytes);
41
+
42
+ assert_eq!(payload, expected);
43
+ }
44
+
45
+
46
+ #[test]
47
+ fn test_build_payload_empty_message() {
48
+ let context = setup();
49
+ let env = &context.env;
50
+
51
+ let guid = BytesN::from_array(env, &[1u8; 32]);
52
+ let message = Bytes::new(env);
53
+
54
+ let payload = build_payload(env, &guid, &message);
55
+
56
+ // Payload should be just the 32 bytes of GUID
57
+ assert_eq!(payload.len(), 32);
58
+ }
59
+
60
+ #[test]
61
+ fn test_build_payload_large_message() {
62
+ let context = setup();
63
+ let env = &context.env;
64
+
65
+ let guid = BytesN::from_array(env, &[1u8; 32]);
66
+ let message = Bytes::from_array(env, &[255u8; 1000]);
67
+
68
+ let payload = build_payload(env, &guid, &message);
69
+
70
+ // Payload should be 32 bytes (guid) + 1000 bytes (message)
71
+ assert_eq!(payload.len(), 32 + 1000);
72
+ }
73
+
74
+
75
+ #[test]
76
+ fn test_build_payload_all_zero_guid() {
77
+ let context = setup();
78
+ let env = &context.env;
79
+
80
+ let guid = BytesN::from_array(env, &[0u8; 32]);
81
+ let message = Bytes::from_array(env, &[1, 2, 3]);
82
+
83
+ let payload = build_payload(env, &guid, &message);
84
+
85
+ // Should successfully build payload with all-zero GUID
86
+ assert_eq!(payload.len(), 32 + 3);
87
+
88
+ // First 32 bytes should be zeros
89
+ for i in 0..32 {
90
+ assert_eq!(payload.get(i).unwrap(), 0u8);
91
+ }
92
+ }
93
+
94
+
95
+ #[test]
96
+ fn test_build_payload_single_byte_message() {
97
+ let context = setup();
98
+ let env = &context.env;
99
+
100
+ let guid = BytesN::from_array(env, &[1u8; 32]);
101
+ let message = Bytes::from_array(env, &[42]);
102
+
103
+ let payload = build_payload(env, &guid, &message);
104
+
105
+ // Payload should be 32 bytes (guid) + 1 byte (message)
106
+ assert_eq!(payload.len(), 33);
107
+ assert_eq!(payload.get(32).unwrap(), 42u8);
108
+ }
109
+
110
+
111
+ #[test]
112
+ fn test_build_payload_preserves_message_order() {
113
+ let context = setup();
114
+ let env = &context.env;
115
+
116
+ let guid = BytesN::from_array(env, &[0u8; 32]);
117
+ let message = Bytes::from_array(env, &[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
118
+
119
+ let payload = build_payload(env, &guid, &message);
120
+
121
+ // Verify message bytes are preserved in order after GUID
122
+ for i in 0..10 {
123
+ assert_eq!(payload.get(32 + i).unwrap(), (i + 1) as u8);
124
+ }
125
+ }
126
+
@@ -0,0 +1,82 @@
1
+ use crate::{tests::endpoint_setup::setup, util::compute_guid};
2
+ use hex_literal::hex;
3
+ use soroban_sdk::{address_payload::AddressPayload, testutils::Address as _, Address, BytesN, Env};
4
+
5
+ #[test]
6
+ fn test_compute_guid_basic() {
7
+ let context = setup();
8
+ let env = &context.env;
9
+
10
+ let nonce = 1u64;
11
+ let src_eid = 1u32;
12
+ let sender = Address::generate(env);
13
+ let dst_eid = 2u32;
14
+ let receiver = BytesN::from_array(env, &[1u8; 32]);
15
+
16
+ let guid = compute_guid(env, nonce, src_eid, &sender, dst_eid, &receiver);
17
+
18
+ // Verify that GUID is 32 bytes
19
+ assert_eq!(guid.len(), 32);
20
+ }
21
+
22
+ #[test]
23
+ fn test_compute_guid() {
24
+ let env = Env::default();
25
+
26
+ let src_eid: u32 = 1;
27
+ let dst_eid: u32 = 2;
28
+ let nonce: u64 = 0x1234;
29
+
30
+ // Create sender address from bytes32 (0x00...03)
31
+ let sender_bytes = hex!("0000000000000000000000000000000000000000000000000000000000000003");
32
+ let sender = Address::from_payload(&env, AddressPayload::ContractIdHash(BytesN::from_array(&env, &sender_bytes)));
33
+
34
+ // Create receiver bytes32 (0x00...04)
35
+ let receiver_bytes = hex!("0000000000000000000000000000000000000000000000000000000000000004");
36
+ let receiver = BytesN::from_array(&env, &receiver_bytes);
37
+
38
+ let guid = compute_guid(&env, nonce, src_eid, &sender, dst_eid, &receiver);
39
+
40
+ // Expected GUID: 4e80f6fdccb10b2634b15fd900819c9d609ae2c61047ed47718f1dcca05587e4
41
+ // (generated from Aptos)
42
+ let expected_guid =
43
+ BytesN::from_array(&env, &hex!("4e80f6fdccb10b2634b15fd900819c9d609ae2c61047ed47718f1dcca05587e4"));
44
+
45
+ assert_eq!(guid, expected_guid);
46
+ }
47
+
48
+ #[test]
49
+ fn test_compute_guid_deterministic() {
50
+ let context = setup();
51
+ let env = &context.env;
52
+
53
+ let nonce = 1u64;
54
+ let src_eid = 1u32;
55
+ let sender = Address::generate(env);
56
+ let dst_eid = 2u32;
57
+ let receiver = BytesN::from_array(env, &[1u8; 32]);
58
+
59
+ // Compute GUID twice with same parameters
60
+ let guid1 = compute_guid(env, nonce, src_eid, &sender, dst_eid, &receiver);
61
+ let guid2 = compute_guid(env, nonce, src_eid, &sender, dst_eid, &receiver);
62
+
63
+ // Should produce the same GUID
64
+ assert_eq!(guid1, guid2);
65
+ }
66
+
67
+ #[test]
68
+ fn test_compute_guid_different_nonces() {
69
+ let context = setup();
70
+ let env = &context.env;
71
+
72
+ let src_eid = 1u32;
73
+ let sender = Address::generate(env);
74
+ let dst_eid = 2u32;
75
+ let receiver = BytesN::from_array(env, &[1u8; 32]);
76
+
77
+ let guid1 = compute_guid(env, 1, src_eid, &sender, dst_eid, &receiver);
78
+ let guid2 = compute_guid(env, 2, src_eid, &sender, dst_eid, &receiver);
79
+
80
+ // Different nonces should produce different GUIDs
81
+ assert_ne!(guid1, guid2);
82
+ }
@@ -0,0 +1,115 @@
1
+ use crate::{tests::endpoint_setup::setup, util::keccak256};
2
+ use soroban_sdk::Bytes;
3
+
4
+ #[test]
5
+ fn test_keccak256_basic() {
6
+ let context = setup();
7
+ let env = &context.env;
8
+
9
+ let message = Bytes::from_array(env, &[1, 2, 3, 4, 5]);
10
+
11
+ let hash = keccak256(env, &message);
12
+
13
+ // Hash should be 32 bytes
14
+ assert_eq!(hash.len(), 32);
15
+ }
16
+
17
+ #[test]
18
+ fn test_keccak256_empty_message() {
19
+ let context = setup();
20
+ let env = &context.env;
21
+
22
+ let message = Bytes::new(env);
23
+
24
+ let hash = keccak256(env, &message);
25
+
26
+ // Hash of empty message should still be 32 bytes
27
+ assert_eq!(hash.len(), 32);
28
+ }
29
+
30
+ #[test]
31
+ fn test_keccak256_deterministic() {
32
+ let context = setup();
33
+ let env = &context.env;
34
+
35
+ let message = Bytes::from_array(env, &[1, 2, 3, 4, 5]);
36
+
37
+ // Hash the same message twice
38
+ let hash1 = keccak256(env, &message);
39
+ let hash2 = keccak256(env, &message);
40
+
41
+ // Should produce the same hash
42
+ assert_eq!(hash1, hash2);
43
+ }
44
+
45
+ #[test]
46
+ fn test_keccak256_different_messages() {
47
+ let context = setup();
48
+ let env = &context.env;
49
+
50
+ let message1 = Bytes::from_array(env, &[1, 2, 3]);
51
+ let message2 = Bytes::from_array(env, &[4, 5, 6]);
52
+
53
+ let hash1 = keccak256(env, &message1);
54
+ let hash2 = keccak256(env, &message2);
55
+
56
+ // Different messages should produce different hashes
57
+ assert_ne!(hash1, hash2);
58
+ }
59
+
60
+ #[test]
61
+ fn test_keccak256_single_byte() {
62
+ let context = setup();
63
+ let env = &context.env;
64
+
65
+ let message = Bytes::from_array(env, &[42]);
66
+
67
+ let hash = keccak256(env, &message);
68
+
69
+ // Hash should be 32 bytes
70
+ assert_eq!(hash.len(), 32);
71
+ }
72
+
73
+ #[test]
74
+ fn test_keccak256_large_message() {
75
+ let context = setup();
76
+ let env = &context.env;
77
+
78
+ let message = Bytes::from_array(env, &[255u8; 1000]);
79
+
80
+ let hash = keccak256(env, &message);
81
+
82
+ // Hash should still be 32 bytes
83
+ assert_eq!(hash.len(), 32);
84
+ }
85
+
86
+ #[test]
87
+ fn test_keccak256_all_zeros() {
88
+ let context = setup();
89
+ let env = &context.env;
90
+
91
+ let message = Bytes::from_array(env, &[0u8; 100]);
92
+
93
+ let hash = keccak256(env, &message);
94
+
95
+ // Hash should be 32 bytes
96
+ assert_eq!(hash.len(), 32);
97
+ }
98
+
99
+ #[test]
100
+ fn test_keccak256_very_long_message() {
101
+ let context = setup();
102
+ let env = &context.env;
103
+
104
+ // Create a very long message (e.g., 10000 bytes)
105
+ let mut data = [0u8; 10000];
106
+ for i in 0..10000 {
107
+ data[i] = (i % 256) as u8;
108
+ }
109
+ let message = Bytes::from_array(env, &data);
110
+
111
+ let hash = keccak256(env, &message);
112
+
113
+ // Hash should still be 32 bytes regardless of input size
114
+ assert_eq!(hash.len(), 32);
115
+ }
@@ -0,0 +1,3 @@
1
+ mod build_payload;
2
+ mod compute_guid;
3
+ mod keccak256;
@@ -0,0 +1,52 @@
1
+ use soroban_sdk::{Address, Bytes, BytesN, Env};
2
+ use utils::buffer_writer::BufferWriter;
3
+
4
+ /// Computes a globally unique identifier (GUID) for cross-chain messages.
5
+ ///
6
+ /// # Arguments
7
+ /// * `nonce` - The nonce of the message
8
+ /// * `src_eid` - The source endpoint ID
9
+ /// * `sender` - The sender OApp address on the source chain
10
+ /// * `dst_eid` - The destination endpoint ID
11
+ /// * `receiver` - The receiver OApp address on the destination chain
12
+ ///
13
+ /// # Returns
14
+ /// * `BytesN<32>` - The GUID
15
+ pub fn compute_guid(
16
+ env: &Env,
17
+ nonce: u64,
18
+ src_eid: u32,
19
+ sender: &Address,
20
+ dst_eid: u32,
21
+ receiver: &BytesN<32>,
22
+ ) -> BytesN<32> {
23
+ let mut writer = BufferWriter::new(env);
24
+ writer.write_u64(nonce).write_u32(src_eid).write_address_payload(sender).write_u32(dst_eid).write_bytes_n(receiver);
25
+ keccak256(env, &writer.to_bytes())
26
+ }
27
+
28
+ /// Builds a payload from a GUID and message.
29
+ ///
30
+ /// # Arguments
31
+ /// * `env` - The environment
32
+ /// * `guid` - The GUID
33
+ /// * `message` - The message
34
+ ///
35
+ /// # Returns
36
+ /// * `Bytes` - The payload
37
+ pub fn build_payload(env: &Env, guid: &BytesN<32>, message: &Bytes) -> Bytes {
38
+ let mut data = Bytes::from_array(env, &guid.to_array());
39
+ data.append(message);
40
+ data
41
+ }
42
+
43
+ /// Computes the Keccak-256 hash of a message.
44
+ ///
45
+ /// # Arguments
46
+ /// * `message` - The message
47
+ ///
48
+ /// # Returns
49
+ /// * `BytesN<32>` - The hash
50
+ pub fn keccak256(env: &Env, message: &Bytes) -> BytesN<32> {
51
+ env.crypto().keccak256(message).into()
52
+ }
@@ -0,0 +1,12 @@
1
+ [package]
2
+ name = "message-libs"
3
+ version.workspace = true
4
+ edition.workspace = true
5
+ license.workspace = true
6
+ publish = false
7
+
8
+ [lib]
9
+ path = "lib.rs"
10
+
11
+ [dependencies]
12
+
@@ -0,0 +1,19 @@
1
+ [package]
2
+ name = "block-message-lib"
3
+ version.workspace = true
4
+ edition.workspace = true
5
+ license.workspace = true
6
+ publish = false
7
+
8
+ [lib]
9
+ crate-type = ["cdylib"]
10
+ doctest = false
11
+
12
+ [dependencies]
13
+ soroban-sdk = { workspace = true }
14
+ # workspace dependencies
15
+ endpoint-v2 = { workspace = true, features = ["library"] }
16
+ common-macros = { workspace = true }
17
+
18
+ [dev-dependencies]
19
+ soroban-sdk = { workspace = true, features = ["testutils"] }
@@ -0,0 +1,70 @@
1
+ //! # Block Message Library
2
+ //!
3
+ //! A special message library that blocks all messaging operations.
4
+ //!
5
+ //! This library is used as a blocklist mechanism to prevent OApps from sending
6
+ //! or receiving cross-chain messages. When assigned as an OApp's send or receive
7
+ //! library, all quote, send, and config operations will fail.
8
+ //!
9
+ //! Use cases:
10
+ //! - Temporarily disable messaging for an OApp
11
+ //! - Emergency circuit breaker for cross-chain communication
12
+
13
+ #![no_std]
14
+
15
+ use common_macros::contract_error;
16
+ use endpoint_v2::{
17
+ FeesAndPacket, IMessageLib, ISendLib, MessageLibType, MessageLibVersion, MessagingFee, OutboundPacket,
18
+ SetConfigParam,
19
+ };
20
+ use soroban_sdk::{contract, contractimpl, panic_with_error, Address, Bytes, Env, Vec};
21
+
22
+ #[contract_error]
23
+ enum BlockMessageLibError {
24
+ NotImplemented,
25
+ }
26
+
27
+ /// Block Message Library contract that rejects all messaging operations.
28
+ #[contract]
29
+ pub struct BlockMessageLib;
30
+
31
+ #[contractimpl]
32
+ impl IMessageLib for BlockMessageLib {
33
+ /// Always panics - config retrieval is not supported.
34
+ fn get_config(env: &Env, _eid: u32, _oapp: &Address, _config_type: u32) -> Bytes {
35
+ panic_with_error!(&env, BlockMessageLibError::NotImplemented);
36
+ }
37
+
38
+ /// Returns true for all EIDs to allow assignment as a blocking library.
39
+ fn is_supported_eid(_env: &Env, _eid: u32) -> bool {
40
+ true
41
+ }
42
+
43
+ /// Returns SendAndReceive to indicate it can block both directions.
44
+ fn message_lib_type(_env: &Env) -> MessageLibType {
45
+ MessageLibType::SendAndReceive
46
+ }
47
+
48
+ /// Always panics - config modification is not supported.
49
+ fn set_config(env: &Env, _oapp: &Address, _param: &Vec<SetConfigParam>) {
50
+ panic_with_error!(&env, BlockMessageLibError::NotImplemented);
51
+ }
52
+
53
+ /// Returns max version to ensure it's recognized as a valid library.
54
+ fn version(_env: &Env) -> MessageLibVersion {
55
+ MessageLibVersion { major: u64::MAX, minor: u8::MAX as u32, endpoint_version: 2 }
56
+ }
57
+ }
58
+
59
+ #[contractimpl]
60
+ impl ISendLib for BlockMessageLib {
61
+ /// Always panics - quoting is blocked.
62
+ fn quote(env: &Env, _packet: &OutboundPacket, _options: &Bytes, _pay_in_zro: bool) -> MessagingFee {
63
+ panic_with_error!(&env, BlockMessageLibError::NotImplemented);
64
+ }
65
+
66
+ /// Always panics - sending is blocked.
67
+ fn send(env: &Env, _packet: &OutboundPacket, _options: &Bytes, _pay_in_zro: bool) -> FeesAndPacket {
68
+ panic_with_error!(&env, BlockMessageLibError::NotImplemented);
69
+ }
70
+ }
@@ -0,0 +1,2 @@
1
+ #![no_std]
2
+ // This is an empty library crate that serves as a parent for message-lib packages
@@ -0,0 +1,24 @@
1
+ [package]
2
+ name = "message-lib-common"
3
+ version.workspace = true
4
+ edition.workspace = true
5
+ license.workspace = true
6
+
7
+ [lib]
8
+ crate-type = ["rlib"]
9
+ doctest = false
10
+
11
+ [features]
12
+ testutils = []
13
+
14
+ [dependencies]
15
+ cfg-if = "1.0"
16
+ soroban-sdk = { workspace = true }
17
+ # workspace dependencies
18
+ utils = { workspace = true }
19
+ common-macros = { workspace = true }
20
+ endpoint-v2 = { workspace = true, features = ["library"] }
21
+
22
+ [dev-dependencies]
23
+ soroban-sdk = { workspace = true, features = ["testutils"] }
24
+ hex-literal = { workspace = true }
@@ -0,0 +1,20 @@
1
+ use common_macros::contract_error;
2
+
3
+ #[contract_error]
4
+ pub enum PacketCodecV1Error {
5
+ InvalidPacketVersion = 11001,
6
+ InvalidPacketHeader,
7
+ }
8
+
9
+ #[contract_error]
10
+ pub enum WorkerOptionsError {
11
+ InvalidOptions = 11101,
12
+ InvalidWorkerId,
13
+ InvalidLegacyOptionsType1,
14
+ LegacyOptionsType1GasOverflow,
15
+ InvalidLegacyOptionsType2,
16
+ LegacyOptionsType2GasOverflow,
17
+ LegacyOptionsType2AmountOverflow,
18
+ InvalidOptionType,
19
+ InvalidBytesLength,
20
+ }