@layerzerolabs/protocol-stellar-v2 0.2.13 → 0.2.18

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 (435) hide show
  1. package/.turbo/turbo-build.log +484 -337
  2. package/.turbo/turbo-lint.log +126 -56
  3. package/.turbo/turbo-test.log +1403 -984
  4. package/Cargo.lock +142 -3
  5. package/Cargo.toml +5 -1
  6. package/contracts/ERROR_SPEC.md +44 -0
  7. package/contracts/common-macros/src/auth.rs +113 -0
  8. package/contracts/common-macros/src/contract_ttl.rs +84 -0
  9. package/contracts/common-macros/src/lib.rs +219 -29
  10. package/contracts/common-macros/src/lz_contract.rs +83 -0
  11. package/contracts/common-macros/src/storage.rs +1 -1
  12. package/contracts/common-macros/src/tests/{ownable.rs → auth.rs} +48 -15
  13. package/contracts/common-macros/src/tests/contract_ttl.rs +662 -0
  14. package/contracts/common-macros/src/tests/mod.rs +3 -2
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +20 -0
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +24 -0
  17. package/contracts/common-macros/src/tests/snapshots/{common_macros__tests__ownable__snapshot_only_owner_preserves_function_signature.snap → common_macros__tests__auth__snapshot_only_auth_preserves_function_signature.snap} +4 -4
  18. package/contracts/common-macros/src/tests/snapshots/{common_macros__tests__contract_impl__snapshot_generated_contract_impl_code.snap → common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap} +26 -10
  19. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contracttrait_code.snap +69 -0
  20. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +48 -48
  21. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +7 -41
  22. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +21 -0
  23. package/contracts/common-macros/src/tests/upgradeable.rs +31 -0
  24. package/contracts/common-macros/src/ttl_configurable.rs +21 -66
  25. package/contracts/common-macros/src/ttl_extendable.rs +36 -0
  26. package/contracts/common-macros/src/upgradeable.rs +76 -0
  27. package/contracts/common-macros/src/utils.rs +9 -0
  28. package/contracts/endpoint-v2/src/constants.rs +4 -4
  29. package/contracts/endpoint-v2/src/endpoint_v2.rs +58 -36
  30. package/contracts/endpoint-v2/src/errors.rs +4 -3
  31. package/contracts/endpoint-v2/src/events.rs +1 -1
  32. package/contracts/endpoint-v2/src/message_lib_manager.rs +18 -5
  33. package/contracts/endpoint-v2/src/messaging_channel.rs +11 -1
  34. package/contracts/endpoint-v2/src/messaging_composer.rs +11 -1
  35. package/contracts/endpoint-v2/src/storage.rs +1 -1
  36. package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +175 -8
  37. package/contracts/endpoint-v2/src/tests/endpoint_v2/build_outbound_packet.rs +76 -0
  38. package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +342 -159
  39. package/contracts/endpoint-v2/src/tests/endpoint_v2/delegate.rs +3 -15
  40. package/contracts/endpoint-v2/src/tests/endpoint_v2/initializable.rs +20 -31
  41. package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +126 -164
  42. package/contracts/endpoint-v2/src/tests/endpoint_v2/mod.rs +1 -0
  43. package/contracts/endpoint-v2/src/tests/endpoint_v2/native_token.rs +0 -1
  44. package/contracts/endpoint-v2/src/tests/endpoint_v2/owner.rs +0 -1
  45. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +311 -304
  46. package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +423 -96
  47. package/contracts/endpoint-v2/src/tests/endpoint_v2/recover_token.rs +1 -1
  48. package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +47 -20
  49. package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +373 -403
  50. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +96 -22
  51. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +62 -10
  52. package/contracts/endpoint-v2/src/tests/endpoint_v2/transfer_ownership.rs +4 -4
  53. package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +8 -11
  54. package/contracts/endpoint-v2/src/tests/endpoint_v2/verifiable.rs +81 -30
  55. package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +209 -76
  56. package/contracts/endpoint-v2/src/tests/endpoint_v2/zro.rs +0 -1
  57. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library.rs +24 -0
  58. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library_timeout.rs +40 -0
  59. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_send_library.rs +24 -0
  60. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_config.rs +108 -0
  61. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_library_index.rs +52 -0
  62. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_receive_library.rs +92 -0
  63. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_registered_libraries.rs +74 -0
  64. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_send_library.rs +83 -0
  65. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_registered_library.rs +32 -0
  66. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_supported_eid.rs +28 -0
  67. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_valid_receive_library.rs +261 -0
  68. package/contracts/endpoint-v2/src/tests/message_lib_manager/mod.rs +16 -0
  69. package/contracts/endpoint-v2/src/tests/message_lib_manager/receive_library_timeout.rs +62 -0
  70. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +65 -43
  71. package/contracts/endpoint-v2/src/tests/message_lib_manager/registered_libraries_count.rs +42 -0
  72. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +61 -0
  73. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +4 -6
  74. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +59 -0
  75. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +16 -2
  76. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_config.rs +155 -51
  77. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +114 -92
  78. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +235 -132
  79. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +93 -87
  80. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +346 -245
  81. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +406 -60
  82. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +252 -78
  83. package/contracts/endpoint-v2/src/tests/message_lib_manager/timeout.rs +102 -0
  84. package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +212 -273
  85. package/contracts/endpoint-v2/src/tests/messaging_channel/clear_payload.rs +203 -0
  86. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound.rs +94 -0
  87. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_nonce.rs +78 -248
  88. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_payload_hash.rs +7 -282
  89. package/contracts/endpoint-v2/src/tests/messaging_channel/lazy_inbound_nonce.rs +6 -274
  90. package/contracts/endpoint-v2/src/tests/messaging_channel/mod.rs +3 -2
  91. package/contracts/endpoint-v2/src/tests/messaging_channel/next_guid.rs +86 -178
  92. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +328 -212
  93. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound.rs +68 -0
  94. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound_nonce.rs +6 -209
  95. package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +207 -159
  96. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +142 -153
  97. package/contracts/endpoint-v2/src/tests/messaging_composer/compose_queue.rs +6 -179
  98. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +163 -221
  99. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +90 -121
  100. package/contracts/endpoint-v2/src/tests/mock.rs +18 -4
  101. package/contracts/endpoint-v2/src/tests/util/build_payload.rs +4 -70
  102. package/contracts/endpoint-v2/src/tests/util/compute_guid.rs +2 -1
  103. package/contracts/endpoint-v2/src/tests/util/keccak256.rs +17 -106
  104. package/contracts/layerzero-views/Cargo.toml +35 -0
  105. package/contracts/layerzero-views/src/errors.rs +10 -0
  106. package/contracts/layerzero-views/src/layerzero_view.rs +226 -0
  107. package/contracts/layerzero-views/src/lib.rs +38 -0
  108. package/contracts/layerzero-views/src/storage.rs +18 -0
  109. package/contracts/layerzero-views/src/tests/layerzero_view_tests.rs +423 -0
  110. package/contracts/layerzero-views/src/tests/mod.rs +4 -0
  111. package/contracts/layerzero-views/src/tests/setup.rs +377 -0
  112. package/contracts/layerzero-views/src/types.rs +50 -0
  113. package/contracts/macro-integration-tests/Cargo.toml +30 -0
  114. package/contracts/macro-integration-tests/src/lib.rs +1 -0
  115. package/contracts/macro-integration-tests/tests/runtime/ownable/initialization.rs +62 -0
  116. package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +22 -0
  117. package/contracts/macro-integration-tests/tests/runtime/ownable/only_auth_guard.rs +97 -0
  118. package/contracts/macro-integration-tests/tests/runtime/ownable/ownership_transfer.rs +101 -0
  119. package/contracts/macro-integration-tests/tests/runtime/storage/keyed_roundtrip.rs +225 -0
  120. package/contracts/macro-integration-tests/tests/runtime/storage/mod.rs +4 -0
  121. package/contracts/macro-integration-tests/tests/runtime/storage/name_override_runtime.rs +52 -0
  122. package/contracts/macro-integration-tests/tests/runtime/storage/ttl_extension.rs +261 -0
  123. package/contracts/macro-integration-tests/tests/runtime/storage/unkeyed_roundtrip.rs +137 -0
  124. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +113 -0
  125. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +139 -0
  126. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/mod.rs +2 -0
  127. package/contracts/macro-integration-tests/tests/runtime.rs +5 -0
  128. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.rs +12 -0
  129. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.stderr +7 -0
  130. package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.rs +12 -0
  131. package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.stderr +7 -0
  132. package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.rs +21 -0
  133. package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.stderr +7 -0
  134. package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.rs +13 -0
  135. package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.stderr +7 -0
  136. package/contracts/macro-integration-tests/tests/ui/error/pass/attr_on_variant_allowed.rs +20 -0
  137. package/contracts/macro-integration-tests/tests/ui/error/pass/basic_auto_discriminants.rs +15 -0
  138. package/contracts/macro-integration-tests/tests/ui/error/pass/mixed_discriminants.rs +16 -0
  139. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.rs +22 -0
  140. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.stderr +16 -0
  141. package/contracts/macro-integration-tests/tests/ui/ownable/pass/minimal_contract.rs +26 -0
  142. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +21 -0
  143. package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_auth_env_param_variants.rs +46 -0
  144. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.rs +13 -0
  145. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.stderr +7 -0
  146. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.rs +13 -0
  147. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.stderr +7 -0
  148. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.rs +10 -0
  149. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.stderr +7 -0
  150. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.rs +12 -0
  151. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.stderr +7 -0
  152. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.rs +10 -0
  153. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.stderr +7 -0
  154. package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.rs +10 -0
  155. package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.stderr +7 -0
  156. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.rs +12 -0
  157. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.stderr +7 -0
  158. package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.rs +13 -0
  159. package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.stderr +7 -0
  160. package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.rs +13 -0
  161. package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.stderr +7 -0
  162. package/contracts/macro-integration-tests/tests/ui/storage/pass/default_value_on_variant.rs +14 -0
  163. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_instance_unit_basic.rs +14 -0
  164. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_persistent_named_fields_keyed.rs +16 -0
  165. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_temporary_unit_option.rs +15 -0
  166. package/contracts/macro-integration-tests/tests/ui/storage/pass/name_override.rs +14 -0
  167. package/contracts/macro-integration-tests/tests/ui/storage/pass/no_auto_ttl_extension.rs +19 -0
  168. package/contracts/macro-integration-tests/tests/ui/storage/pass/ttl_provider_basic.rs +15 -0
  169. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/minimal_contract.rs +44 -0
  170. package/contracts/macro-integration-tests/tests/ui_error.rs +11 -0
  171. package/contracts/macro-integration-tests/tests/ui_ownable.rs +11 -0
  172. package/contracts/macro-integration-tests/tests/ui_storage.rs +11 -0
  173. package/contracts/macro-integration-tests/tests/ui_ttl_configurable.rs +12 -0
  174. package/contracts/message-libs/blocked-message-lib/src/lib.rs +17 -17
  175. package/contracts/message-libs/message-lib-common/src/errors.rs +7 -2
  176. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/decode_packet_header.rs +64 -0
  177. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet.rs +58 -0
  178. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet_header.rs +138 -0
  179. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/mod.rs +6 -0
  180. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload.rs +30 -0
  181. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload_hash.rs +15 -0
  182. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/test_helper.rs +39 -0
  183. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_dvn_option.rs +57 -0
  184. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_lz_receive_option.rs +49 -0
  185. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_native_drop_option.rs +73 -0
  186. package/contracts/message-libs/message-lib-common/src/tests/worker_options/convert_legacy_options.rs +280 -0
  187. package/contracts/message-libs/message-lib-common/src/tests/worker_options/extract_type_3_options.rs +126 -0
  188. package/contracts/message-libs/message-lib-common/src/tests/worker_options/left_pad_to_bytes32.rs +48 -0
  189. package/contracts/message-libs/message-lib-common/src/tests/worker_options/mod.rs +7 -0
  190. package/contracts/message-libs/message-lib-common/src/tests/worker_options/split_worker_options.rs +139 -0
  191. package/contracts/message-libs/message-lib-common/src/worker_options.rs +31 -1
  192. package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +7 -9
  193. package/contracts/message-libs/treasury/src/errors.rs +2 -3
  194. package/contracts/message-libs/treasury/src/events.rs +1 -1
  195. package/contracts/message-libs/treasury/src/interfaces/zro_fee_lib.rs +2 -2
  196. package/contracts/message-libs/treasury/src/lib.rs +3 -3
  197. package/contracts/message-libs/treasury/src/storage.rs +3 -1
  198. package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +1 -1
  199. package/contracts/message-libs/treasury/src/treasury.rs +23 -26
  200. package/contracts/message-libs/uln-302/Cargo.toml +1 -1
  201. package/contracts/message-libs/uln-302/src/errors.rs +0 -5
  202. package/contracts/message-libs/uln-302/src/events.rs +5 -6
  203. package/contracts/message-libs/uln-302/src/receive_uln.rs +37 -56
  204. package/contracts/message-libs/uln-302/src/send_uln.rs +112 -138
  205. package/contracts/message-libs/uln-302/src/storage.rs +5 -5
  206. package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +5 -7
  207. package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +3 -3
  208. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +6 -9
  209. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +2 -2
  210. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +3 -3
  211. package/contracts/message-libs/uln-302/src/tests/setup.rs +9 -0
  212. package/contracts/message-libs/uln-302/src/tests/testing_utils.rs +5 -0
  213. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_receive_uln_config.rs +1 -2
  214. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_send_uln_config.rs +1 -2
  215. package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +37 -55
  216. package/contracts/message-libs/uln-302/src/uln302.rs +10 -25
  217. package/contracts/oapps/counter/Cargo.toml +14 -1
  218. package/contracts/oapps/counter/integration_tests/mod.rs +4 -1
  219. package/contracts/oapps/counter/integration_tests/setup_sml.rs +169 -0
  220. package/contracts/oapps/counter/integration_tests/setup_uln.rs +997 -0
  221. package/contracts/oapps/counter/integration_tests/signing.rs +62 -0
  222. package/contracts/oapps/counter/integration_tests/test_with_sml.rs +24 -55
  223. package/contracts/oapps/counter/integration_tests/test_with_uln.rs +314 -0
  224. package/contracts/oapps/counter/integration_tests/utils.rs +196 -53
  225. package/contracts/oapps/counter/src/counter.rs +67 -44
  226. package/contracts/oapps/counter/src/tests/mod.rs +0 -13
  227. package/contracts/oapps/counter/src/tests/test_counter.rs +5 -7
  228. package/contracts/oapps/oapp/src/errors.rs +5 -1
  229. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +318 -221
  230. package/contracts/oapps/oapp/src/oapp_core.rs +36 -21
  231. package/contracts/oapps/oapp/src/oapp_options_type3.rs +48 -12
  232. package/contracts/oapps/oapp/src/oapp_receiver.rs +106 -41
  233. package/contracts/oapps/oapp/src/oapp_sender.rs +26 -34
  234. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +9 -9
  235. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +25 -18
  236. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +7 -8
  237. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +14 -16
  238. package/contracts/oapps/oapp-macros/src/generators.rs +128 -0
  239. package/contracts/oapps/oapp-macros/src/lib.rs +211 -0
  240. package/contracts/oapps/oft/integration-tests/setup.rs +34 -9
  241. package/contracts/oapps/oft/integration-tests/utils.rs +1 -1
  242. package/contracts/oapps/oft/src/errors.rs +6 -1
  243. package/contracts/oapps/oft/src/extensions/oft_fee.rs +13 -13
  244. package/contracts/oapps/oft/src/extensions/pausable.rs +5 -5
  245. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +23 -23
  246. package/contracts/oapps/oft/src/lib.rs +4 -2
  247. package/contracts/oapps/oft/src/oft.rs +31 -71
  248. package/contracts/oapps/oft/src/oft_impl.rs +201 -0
  249. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +2 -4
  250. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +1 -4
  251. package/contracts/oapps/oft/src/storage.rs +2 -0
  252. package/contracts/oapps/oft/src/tests/extensions/setup.rs +60 -31
  253. package/contracts/oapps/oft/src/tests/extensions/test_oft_fee.rs +5 -3
  254. package/contracts/oapps/oft/src/tests/extensions/test_pausable.rs +5 -3
  255. package/contracts/oapps/oft/src/tests/extensions/test_rate_limiter.rs +6 -4
  256. package/contracts/oapps/oft/src/tests/test_decimals.rs +2 -2
  257. package/contracts/oapps/oft/src/tests/test_oft_msg_codec.rs +1 -2
  258. package/contracts/oapps/oft/src/tests/test_send.rs +4 -4
  259. package/contracts/oapps/oft/src/tests/test_utils.rs +122 -81
  260. package/contracts/oapps/oft/src/types.rs +20 -0
  261. package/contracts/oapps/oft-std/Cargo.toml +6 -0
  262. package/contracts/oapps/oft-std/integration-tests/extensions/mod.rs +3 -0
  263. package/contracts/oapps/oft-std/integration-tests/extensions/test_oft_fee.rs +157 -0
  264. package/contracts/oapps/oft-std/integration-tests/extensions/test_pausable.rs +162 -0
  265. package/contracts/oapps/oft-std/integration-tests/extensions/test_rate_limiter.rs +186 -0
  266. package/contracts/oapps/oft-std/integration-tests/mod.rs +3 -0
  267. package/contracts/oapps/{counter/integration_tests → oft-std/integration-tests}/setup.rs +76 -30
  268. package/contracts/oapps/oft-std/integration-tests/utils.rs +427 -0
  269. package/contracts/oapps/oft-std/src/lib.rs +12 -1
  270. package/contracts/oapps/oft-std/src/oft.rs +141 -26
  271. package/contracts/upgrader/Cargo.toml +19 -0
  272. package/contracts/upgrader/src/lib.rs +96 -0
  273. package/contracts/upgrader/src/tests/mod.rs +1 -0
  274. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract1.wasm +0 -0
  275. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract2.wasm +0 -0
  276. package/contracts/upgrader/src/tests/test_upgrader.rs +120 -0
  277. package/contracts/utils/src/auth.rs +44 -0
  278. package/contracts/utils/src/errors.rs +32 -5
  279. package/contracts/utils/src/lib.rs +5 -1
  280. package/contracts/utils/src/multisig.rs +211 -0
  281. package/contracts/utils/src/ownable.rs +50 -60
  282. package/contracts/utils/src/tests/buffer_reader.rs +6 -6
  283. package/contracts/utils/src/tests/buffer_writer.rs +6 -6
  284. package/contracts/utils/src/tests/bytes_ext.rs +2 -4
  285. package/contracts/utils/src/tests/mod.rs +4 -1
  286. package/contracts/utils/src/tests/multisig.rs +731 -0
  287. package/contracts/utils/src/tests/option_ext.rs +18 -0
  288. package/contracts/utils/src/tests/ownable.rs +22 -70
  289. package/contracts/utils/src/tests/ttl_configurable.rs +607 -0
  290. package/contracts/utils/src/tests/upgradeable.rs +290 -0
  291. package/contracts/utils/src/ttl_configurable.rs +153 -0
  292. package/contracts/utils/src/ttl_extendable.rs +27 -0
  293. package/contracts/utils/src/upgradeable.rs +56 -0
  294. package/contracts/workers/dvn/Cargo.toml +2 -2
  295. package/contracts/workers/dvn/src/auth.rs +24 -35
  296. package/contracts/workers/dvn/src/dvn.rs +23 -14
  297. package/contracts/workers/dvn/src/errors.rs +1 -7
  298. package/contracts/workers/dvn/src/events.rs +1 -14
  299. package/contracts/workers/dvn/src/interfaces/dvn.rs +2 -2
  300. package/contracts/workers/dvn/src/interfaces/mod.rs +0 -2
  301. package/contracts/workers/dvn/src/storage.rs +3 -13
  302. package/contracts/workers/dvn/src/tests/auth.rs +4 -4
  303. package/contracts/workers/dvn/src/tests/dvn.rs +1 -2
  304. package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +7 -8
  305. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +11 -8
  306. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +11 -12
  307. package/contracts/workers/dvn/src/tests/setup.rs +5 -5
  308. package/contracts/workers/dvn-fee-lib/Cargo.toml +0 -1
  309. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +45 -16
  310. package/contracts/workers/dvn-fee-lib/src/errors.rs +3 -2
  311. package/contracts/workers/dvn-fee-lib/src/lib.rs +5 -11
  312. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +30 -16
  313. package/contracts/workers/executor/src/auth.rs +80 -16
  314. package/contracts/workers/executor/src/executor.rs +17 -29
  315. package/contracts/workers/executor/src/storage.rs +2 -9
  316. package/contracts/workers/executor-fee-lib/Cargo.toml +1 -1
  317. package/contracts/workers/executor-fee-lib/src/errors.rs +9 -7
  318. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +153 -121
  319. package/contracts/workers/executor-helper/Cargo.toml +1 -6
  320. package/contracts/workers/executor-helper/src/executor_helper.rs +53 -73
  321. package/contracts/workers/executor-helper/src/lib.rs +1 -7
  322. package/contracts/workers/price-feed/Cargo.toml +1 -2
  323. package/contracts/workers/price-feed/src/errors.rs +3 -2
  324. package/contracts/workers/price-feed/src/lib.rs +5 -6
  325. package/contracts/workers/price-feed/src/price_feed.rs +42 -23
  326. package/contracts/workers/worker/Cargo.toml +4 -0
  327. package/contracts/workers/worker/src/errors.rs +4 -0
  328. package/contracts/workers/worker/src/interfaces/price_feed.rs +3 -3
  329. package/contracts/workers/worker/src/lib.rs +2 -2
  330. package/contracts/workers/worker/src/tests/mod.rs +4 -0
  331. package/contracts/workers/worker/src/tests/setup.rs +147 -0
  332. package/contracts/workers/worker/src/tests/worker.rs +502 -0
  333. package/contracts/workers/worker/src/worker.rs +28 -30
  334. package/package.json +8 -5
  335. package/sdk/.turbo/turbo-build.log +1 -0
  336. package/sdk/.turbo/turbo-test.log +1009 -0
  337. package/sdk/dist/generated/bml.d.ts +104 -37
  338. package/sdk/dist/generated/bml.js +83 -42
  339. package/sdk/dist/generated/counter.d.ts +334 -175
  340. package/sdk/dist/generated/counter.js +109 -63
  341. package/sdk/dist/generated/dvn.d.ts +1985 -0
  342. package/sdk/dist/generated/dvn.js +326 -0
  343. package/sdk/dist/generated/dvn_fee_lib.d.ts +690 -0
  344. package/sdk/dist/generated/dvn_fee_lib.js +163 -0
  345. package/sdk/dist/generated/endpoint.d.ts +155 -46
  346. package/sdk/dist/generated/endpoint.js +93 -50
  347. package/sdk/dist/generated/executor.d.ts +1841 -0
  348. package/sdk/dist/generated/executor.js +312 -0
  349. package/sdk/dist/generated/executor_fee_lib.d.ts +1083 -0
  350. package/sdk/dist/generated/executor_fee_lib.js +255 -0
  351. package/sdk/dist/generated/executor_helper.d.ts +981 -0
  352. package/sdk/dist/generated/executor_helper.js +236 -0
  353. package/sdk/dist/generated/oft_std.d.ts +1722 -0
  354. package/sdk/dist/generated/oft_std.js +316 -0
  355. package/sdk/dist/generated/price_feed.d.ts +1077 -0
  356. package/sdk/dist/generated/price_feed.js +210 -0
  357. package/sdk/dist/generated/sml.d.ts +171 -56
  358. package/sdk/dist/generated/sml.js +111 -62
  359. package/sdk/dist/generated/treasury.d.ts +896 -0
  360. package/sdk/dist/generated/treasury.js +219 -0
  361. package/sdk/dist/generated/uln302.d.ts +175 -75
  362. package/sdk/dist/generated/uln302.js +126 -82
  363. package/sdk/dist/generated/upgrader.d.ts +70 -0
  364. package/sdk/dist/generated/upgrader.js +19 -0
  365. package/sdk/dist/index.d.ts +10 -0
  366. package/sdk/dist/index.js +14 -0
  367. package/sdk/dist/wasm/blocked-message-lib.d.ts +1 -0
  368. package/sdk/dist/wasm/blocked-message-lib.js +2 -0
  369. package/sdk/dist/wasm/counter.d.ts +1 -0
  370. package/sdk/dist/wasm/counter.js +2 -0
  371. package/sdk/dist/wasm/dvn-fee-lib.d.ts +1 -0
  372. package/sdk/dist/wasm/dvn-fee-lib.js +2 -0
  373. package/sdk/dist/wasm/dvn.d.ts +1 -0
  374. package/sdk/dist/wasm/dvn.js +2 -0
  375. package/sdk/dist/wasm/endpoint-v2.d.ts +1 -0
  376. package/sdk/dist/wasm/endpoint-v2.js +2 -0
  377. package/sdk/dist/wasm/executor-fee-lib.d.ts +1 -0
  378. package/sdk/dist/wasm/executor-fee-lib.js +2 -0
  379. package/sdk/dist/wasm/executor-helper.d.ts +1 -0
  380. package/sdk/dist/wasm/executor-helper.js +2 -0
  381. package/sdk/dist/wasm/executor.d.ts +1 -0
  382. package/sdk/dist/wasm/executor.js +2 -0
  383. package/sdk/dist/wasm/layerzero-views.d.ts +1 -0
  384. package/sdk/dist/wasm/layerzero-views.js +2 -0
  385. package/sdk/dist/wasm/oft-std.d.ts +1 -0
  386. package/sdk/dist/wasm/oft-std.js +2 -0
  387. package/sdk/dist/wasm/price-feed.d.ts +1 -0
  388. package/sdk/dist/wasm/price-feed.js +2 -0
  389. package/sdk/dist/wasm/simple-message-lib.d.ts +1 -0
  390. package/sdk/dist/wasm/simple-message-lib.js +2 -0
  391. package/sdk/dist/wasm/treasury.d.ts +1 -0
  392. package/sdk/dist/wasm/treasury.js +2 -0
  393. package/sdk/dist/wasm/uln302.d.ts +1 -0
  394. package/sdk/dist/wasm/uln302.js +2 -0
  395. package/sdk/dist/wasm/upgrader.d.ts +1 -0
  396. package/sdk/dist/wasm/upgrader.js +2 -0
  397. package/sdk/dist/wasm.d.ts +15 -0
  398. package/sdk/dist/wasm.js +15 -0
  399. package/sdk/package.json +7 -4
  400. package/sdk/src/index.ts +17 -0
  401. package/sdk/test/counter-sml.test.ts +376 -0
  402. package/sdk/test/counter-uln.test.ts +493 -0
  403. package/sdk/test/{oft.test.ts → oft-sml.test.ts} +187 -323
  404. package/sdk/test/suites/constants.ts +22 -2
  405. package/sdk/test/suites/dummyContractClient.ts +169 -0
  406. package/sdk/test/suites/globalSetup.ts +450 -0
  407. package/sdk/test/suites/localnet.ts +23 -6
  408. package/sdk/test/upgrader.test.ts +300 -0
  409. package/sdk/test/utils.ts +558 -85
  410. package/sdk/vitest.config.ts +21 -0
  411. package/tools/ts-bindings-gen/src/main.rs +12 -1
  412. package/turbo.json +2 -0
  413. package/contracts/common-macros/src/contract_impl.rs +0 -47
  414. package/contracts/common-macros/src/ownable.rs +0 -59
  415. package/contracts/common-macros/src/tests/contract_impl.rs +0 -381
  416. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +0 -32
  417. package/contracts/endpoint-v2/src/tests/messaging_channel/clear.rs +0 -316
  418. package/contracts/endpoint-v2/src/tests/messaging_channel/internal.rs +0 -388
  419. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +0 -162
  420. package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +0 -319
  421. package/contracts/oapp-macros/src/lib.rs +0 -154
  422. package/contracts/oapp-macros/src/oapp_core.rs +0 -40
  423. package/contracts/oapp-macros/src/oapp_full.rs +0 -21
  424. package/contracts/oapp-macros/src/oapp_options_type3.rs +0 -31
  425. package/contracts/oapp-macros/src/oapp_receiver.rs +0 -48
  426. package/contracts/oapp-macros/src/oapp_sender.rs +0 -21
  427. package/contracts/oapp-macros/src/util.rs +0 -107
  428. package/contracts/oapps/oft/src/constants.rs +0 -5
  429. package/contracts/oapps/oft/src/default_oft_impl.rs +0 -146
  430. package/contracts/utils/src/tests/ttl.rs +0 -421
  431. package/contracts/utils/src/ttl.rs +0 -123
  432. package/contracts/workers/dvn/src/interfaces/multisig.rs +0 -56
  433. package/contracts/workers/dvn/src/multisig.rs +0 -153
  434. package/sdk/test/index.test.ts +0 -376
  435. /package/contracts/{oapp-macros → oapps/oapp-macros}/Cargo.toml +0 -0
@@ -0,0 +1,62 @@
1
+ //! Key generation utilities for DVN initialization in integration tests.
2
+ //!
3
+ //! Generates secp256k1 addresses (for DVN multisig) and Ed25519 addresses (for admin).
4
+
5
+ use ed25519_dalek::SigningKey as Ed25519SigningKey;
6
+ use k256::ecdsa::{SigningKey, VerifyingKey};
7
+ use rand::thread_rng;
8
+ use sha3::{Digest, Keccak256};
9
+ use soroban_sdk::{address_payload::AddressPayload, Address, BytesN, Env};
10
+
11
+ /// Generates an Ethereum-style address from a secp256k1 key (for DVN multisig signer).
12
+ #[derive(Clone)]
13
+ pub struct Secp256k1KeyPair {
14
+ /// The derived Ethereum-style address (last 20 bytes of keccak256(pubkey))
15
+ pub eth_address: [u8; 20],
16
+ }
17
+
18
+ impl Secp256k1KeyPair {
19
+ /// Generate a new random secp256k1 address.
20
+ pub fn generate() -> Self {
21
+ let signing_key = SigningKey::random(&mut thread_rng());
22
+ let eth_address = Self::derive_eth_address(&signing_key);
23
+ Self { eth_address }
24
+ }
25
+
26
+ fn derive_eth_address(signing_key: &SigningKey) -> [u8; 20] {
27
+ let verifying_key: &VerifyingKey = signing_key.verifying_key();
28
+ let pubkey_bytes = verifying_key.to_encoded_point(false);
29
+ let pubkey_uncompressed = pubkey_bytes.as_bytes();
30
+
31
+ let mut hasher = Keccak256::new();
32
+ hasher.update(&pubkey_uncompressed[1..65]);
33
+ let hash = hasher.finalize();
34
+
35
+ let mut eth_address = [0u8; 20];
36
+ eth_address.copy_from_slice(&hash[12..32]);
37
+ eth_address
38
+ }
39
+
40
+ /// Get the signer address as BytesN<20> for use in Soroban.
41
+ pub fn signer(&self, env: &Env) -> BytesN<20> {
42
+ BytesN::from_array(env, &self.eth_address)
43
+ }
44
+ }
45
+
46
+ /// Generates an Ed25519 address (for DVN admin).
47
+ pub struct Ed25519KeyPair {
48
+ signing_key: Ed25519SigningKey,
49
+ }
50
+
51
+ impl Ed25519KeyPair {
52
+ /// Generate a new random Ed25519 key pair.
53
+ pub fn generate() -> Self {
54
+ Self { signing_key: Ed25519SigningKey::generate(&mut thread_rng()) }
55
+ }
56
+
57
+ /// Get the public key as a Soroban Address.
58
+ pub fn address(&self, env: &Env) -> Address {
59
+ let bytes_n = BytesN::from_array(env, &self.signing_key.verifying_key().to_bytes());
60
+ Address::from_payload(env, AddressPayload::AccountIdPublicKeyEd25519(bytes_n))
61
+ }
62
+ }
@@ -1,35 +1,27 @@
1
- use crate::codec::MsgType;
2
- use crate::integration_tests::{setup::*, utils::*};
3
- use crate::tests::{approve, mint_to};
1
+ use crate::{
2
+ codec::MsgType,
3
+ integration_tests::{setup_sml::*, utils::*},
4
+ tests::mint_to,
5
+ };
4
6
  use soroban_sdk::{testutils::Address as _, Address, Bytes};
5
7
 
6
8
  #[test]
7
9
  fn test_increment_vanilla() {
8
- let TestSetup { env, chain_a, chain_b } = setup();
10
+ let TestSetup { env, chain_a, chain_b } = wired_setup();
9
11
 
10
- wire_endpoint(&env, &[&chain_a, &chain_b]);
11
- wire_counter(&env, &[&chain_a, &chain_b]);
12
-
13
- // on Chain A, quote and increment
14
12
  let sender = Address::generate(&env);
15
13
  let options = Bytes::new(&env);
16
- let msg_type = MsgType::Vanilla;
17
-
18
- let fee = quote(&chain_a, chain_b.eid, msg_type, &options);
14
+ let fee = quote(&chain_a, chain_b.eid, MsgType::Vanilla, &options);
19
15
 
20
16
  mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, fee.native_fee);
21
- increment(&env, &chain_a, &sender, chain_b.eid, msg_type, &options, &fee);
22
- let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
17
+ increment(&env, &chain_a, &sender, chain_b.eid, MsgType::Vanilla, &options, &fee);
23
18
 
24
- // // validate packet on Chain B
25
- validate_packet(&env, &chain_b, &packet_event);
26
- let packet = decode_packet(&env, &packet_event.0);
19
+ let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
20
+ let packet = validate_packet(&env, &chain_b, &packet_event);
27
21
 
28
- // deliver the message on Chain B
29
22
  let executor = Address::generate(&env);
30
- lz_receive(&env, &chain_b, &executor, &packet, 0, false);
23
+ lz_receive(&env, &chain_b, &executor, &packet, 0);
31
24
 
32
- // state assertion
33
25
  assert_eq!(chain_a.counter.outbound_count(&chain_b.eid), 1);
34
26
  assert_eq!(chain_b.counter.count(), 1);
35
27
  assert_eq!(chain_b.counter.inbound_count(&chain_a.eid), 1);
@@ -37,12 +29,8 @@ fn test_increment_vanilla() {
37
29
 
38
30
  #[test]
39
31
  fn test_increment_aba() {
40
- let TestSetup { env, chain_a, chain_b } = setup();
41
-
42
- wire_endpoint(&env, &[&chain_a, &chain_b]);
43
- wire_counter(&env, &[&chain_a, &chain_b]);
32
+ let TestSetup { env, chain_a, chain_b } = wired_setup();
44
33
 
45
- // on Chain A, quote and increment
46
34
  let sender = Address::generate(&env);
47
35
  let msg_type = MsgType::ABA;
48
36
  let options = Bytes::new(&env);
@@ -53,24 +41,18 @@ fn test_increment_aba() {
53
41
 
54
42
  // validate packet on Chain B
55
43
  let packet_event_chain_a = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
56
- validate_packet(&env, &chain_b, &packet_event_chain_a);
57
- let packet_chain_a = decode_packet(&env, &packet_event_chain_a.0);
44
+ let packet_chain_a = validate_packet(&env, &chain_b, &packet_event_chain_a);
58
45
 
59
46
  // deliver the message on Chain B and execute lz_receive
60
47
  let executor = Address::generate(&env);
61
- mint_to(&env, &chain_b.owner, &chain_b.native_token, &executor, fee.native_fee);
62
- approve(&env, &executor, &chain_b.native_token, fee.native_fee);
63
- lz_receive(&env, &chain_b, &executor, &packet_chain_a, fee.native_fee, true);
48
+ lz_receive(&env, &chain_b, &executor, &packet_chain_a, fee.native_fee);
64
49
 
65
50
  // validate packet on Chain A
66
51
  let packet_event_chain_b = scan_packet_sent_event(&env, &chain_b.endpoint.address).unwrap();
67
- validate_packet(&env, &chain_a, &packet_event_chain_b);
68
- let packet_chain_b = decode_packet(&env, &packet_event_chain_b.0);
52
+ let packet_chain_b = validate_packet(&env, &chain_a, &packet_event_chain_b);
69
53
 
70
- mint_to(&env, &chain_a.owner, &chain_a.native_token, &executor, fee.native_fee);
71
- approve(&env, &executor, &chain_a.native_token, fee.native_fee);
72
54
  // deliver the message on Chain A and execute lz_receive
73
- lz_receive(&env, &chain_a, &executor, &packet_chain_b, fee.native_fee, false);
55
+ lz_receive(&env, &chain_a, &executor, &packet_chain_b, fee.native_fee);
74
56
 
75
57
  // state assertion
76
58
  assert_eq!(chain_a.counter.count(), 1);
@@ -84,12 +66,8 @@ fn test_increment_aba() {
84
66
 
85
67
  #[test]
86
68
  fn test_increment_composed() {
87
- let TestSetup { env, chain_a, chain_b } = setup();
69
+ let TestSetup { env, chain_a, chain_b } = wired_setup();
88
70
 
89
- wire_endpoint(&env, &[&chain_a, &chain_b]);
90
- wire_counter(&env, &[&chain_a, &chain_b]);
91
-
92
- // increment
93
71
  let sender = Address::generate(&env);
94
72
  let msg_type = MsgType::Composed;
95
73
  let options = Bytes::new(&env);
@@ -100,12 +78,11 @@ fn test_increment_composed() {
100
78
 
101
79
  // validate packet on Chain B
102
80
  let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
103
- validate_packet(&env, &chain_b, &packet_event);
104
- let packet = decode_packet(&env, &packet_event.0);
81
+ let packet = validate_packet(&env, &chain_b, &packet_event);
105
82
 
106
83
  // deliver the message on Chain B and execute lz_receive
107
84
  let executor = Address::generate(&env);
108
- lz_receive(&env, &chain_b, &executor, &packet, 0, false);
85
+ lz_receive(&env, &chain_b, &executor, &packet, 0);
109
86
 
110
87
  // execute lz_compose
111
88
  lz_compose(&env, &chain_b, &executor, &packet, 0);
@@ -119,12 +96,8 @@ fn test_increment_composed() {
119
96
 
120
97
  #[test]
121
98
  fn test_increment_composed_aba() {
122
- let TestSetup { env, chain_a, chain_b } = setup();
123
-
124
- wire_endpoint(&env, &[&chain_a, &chain_b]);
125
- wire_counter(&env, &[&chain_a, &chain_b]);
99
+ let TestSetup { env, chain_a, chain_b } = wired_setup();
126
100
 
127
- // on Chain A, quote and increment
128
101
  let sender = Address::generate(&env);
129
102
  let msg_type = MsgType::ComposedABA;
130
103
  let options = Bytes::new(&env);
@@ -135,24 +108,20 @@ fn test_increment_composed_aba() {
135
108
 
136
109
  // validate packet on Chain B
137
110
  let packet_event_chain_a = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
138
- validate_packet(&env, &chain_b, &packet_event_chain_a);
139
- let packet_chain_a = decode_packet(&env, &packet_event_chain_a.0);
111
+ let packet_chain_a = validate_packet(&env, &chain_b, &packet_event_chain_a);
140
112
 
141
113
  // deliver the message on Chain B and execute lz_receive
142
114
  let executor = Address::generate(&env);
143
- lz_receive(&env, &chain_b, &executor, &packet_chain_a, 0, false);
115
+ lz_receive(&env, &chain_b, &executor, &packet_chain_a, 0);
144
116
  // supply native token for lz_send(inside lz_compose) on Chain B
145
- mint_to(&env, &chain_b.owner, &chain_b.native_token, &executor, fee.native_fee);
146
- approve(&env, &executor, &chain_b.native_token, fee.native_fee);
147
117
  lz_compose(&env, &chain_b, &executor, &packet_chain_a, fee.native_fee);
148
118
 
149
119
  // validate packet on Chain A(packet emitted on Chain B)
150
120
  let packet_event_chain_b = scan_packet_sent_event(&env, &chain_b.endpoint.address).unwrap();
151
- validate_packet(&env, &chain_a, &packet_event_chain_b);
152
- let packet_chain_b = decode_packet(&env, &packet_event_chain_b.0);
121
+ let packet_chain_b = validate_packet(&env, &chain_a, &packet_event_chain_b);
153
122
 
154
123
  // deliver the message on Chain A and execute lz_receive
155
- lz_receive(&env, &chain_a, &executor, &packet_chain_b, 0, false);
124
+ lz_receive(&env, &chain_a, &executor, &packet_chain_b, 0);
156
125
 
157
126
  // state assertion
158
127
  assert_eq!(chain_a.counter.count(), 1);
@@ -0,0 +1,314 @@
1
+ extern crate std;
2
+
3
+ use crate::{
4
+ codec::MsgType,
5
+ integration_tests::{setup_uln::*, utils::*},
6
+ tests::mint_to,
7
+ };
8
+ use message_lib_common::packet_codec_v1;
9
+ use soroban_sdk::{
10
+ testutils::{Address as _, MockAuth, MockAuthInvoke},
11
+ Address, IntoVal,
12
+ };
13
+ use uln302::ReceiveUln302Client;
14
+
15
+ #[test]
16
+ fn test_increment_vanilla() {
17
+ let TestSetup { env, chain_a, chain_b } = wired_setup_with_dvn_mode(DvnMode::Single);
18
+
19
+ let sender = Address::generate(&env);
20
+ let options = create_default_options(&env);
21
+ let fee = quote(&chain_a, chain_b.eid, MsgType::Vanilla, &options);
22
+
23
+ mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, fee.native_fee);
24
+ increment(&env, &chain_a, &sender, chain_b.eid, MsgType::Vanilla, &options, &fee);
25
+
26
+ let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
27
+ let packet = validate_packet(&env, &chain_b, &packet_event);
28
+
29
+ // Execute via executor using the packet options value.
30
+ let executor_value_b = get_executor_value_from_options(&env, &packet_event.1);
31
+ let admin = Address::generate(&env);
32
+ lz_receive_via_executor(&env, &chain_b, &admin, &packet, executor_value_b);
33
+
34
+ assert_eq!(chain_a.counter.outbound_count(&chain_b.eid), 1);
35
+ assert_eq!(chain_b.counter.count(), 1);
36
+ assert_eq!(chain_b.counter.inbound_count(&chain_a.eid), 1);
37
+ }
38
+
39
+ #[test]
40
+ fn test_increment_aba() {
41
+ let TestSetup { env, chain_a, chain_b } = wired_setup_with_dvn_mode(DvnMode::Single);
42
+
43
+ let sender = Address::generate(&env);
44
+ let msg_type = MsgType::ABA;
45
+
46
+ // Quote return fee first, then embed it as value in the send options.
47
+ let return_options = create_aba_return_options(&env);
48
+ let fee_b_to_a = quote(&chain_b, chain_a.eid, MsgType::Vanilla, &return_options);
49
+ let fee_with_buffer = fee_b_to_a.native_fee + fee_b_to_a.native_fee / 100; // 1% buffer
50
+ // ABA message doesn't use lz_compose, so pass 0 for lz_compose params
51
+ let options = create_options_with_gas_and_value(&env, 100000, fee_with_buffer as u128, 0, 0);
52
+
53
+ let fee_a_to_b = quote(&chain_a, chain_b.eid, msg_type, &options);
54
+ mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, fee_a_to_b.native_fee);
55
+ increment(&env, &chain_a, &sender, chain_b.eid, msg_type, &options, &fee_a_to_b);
56
+
57
+ // validate packet on Chain B
58
+ let packet_event_chain_a = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
59
+ let packet_chain_a = validate_packet(&env, &chain_b, &packet_event_chain_a);
60
+
61
+ // Deliver the message on Chain B via executor_helper using the packet options value.
62
+ let executor_value_b = get_executor_value_from_options(&env, &packet_event_chain_a.1);
63
+ let admin = Address::generate(&env);
64
+ lz_receive_via_executor(&env, &chain_b, &admin, &packet_chain_a, executor_value_b);
65
+
66
+ // validate packet on Chain A
67
+ let packet_event_chain_b = scan_packet_sent_event(&env, &chain_b.endpoint.address).unwrap();
68
+ let packet_chain_b = validate_packet(&env, &chain_a, &packet_event_chain_b);
69
+
70
+ // Extract executor value from the actual packet options
71
+ let executor_value = get_executor_value_from_options(&env, &packet_event_chain_b.1);
72
+ // deliver the message on Chain A via executor_helper
73
+ lz_receive_via_executor(&env, &chain_a, &admin, &packet_chain_b, executor_value);
74
+
75
+ // state assertion
76
+ assert_eq!(chain_a.counter.count(), 1);
77
+ assert_eq!(chain_a.counter.inbound_count(&chain_b.eid), 1);
78
+ assert_eq!(chain_a.counter.outbound_count(&chain_b.eid), 1);
79
+
80
+ assert_eq!(chain_b.counter.count(), 1);
81
+ assert_eq!(chain_b.counter.inbound_count(&chain_a.eid), 1);
82
+ assert_eq!(chain_a.counter.outbound_count(&chain_b.eid), 1);
83
+ }
84
+
85
+ #[test]
86
+ fn test_increment_composed() {
87
+ let TestSetup { env, chain_a, chain_b } = wired_setup_with_dvn_mode(DvnMode::Single);
88
+
89
+ let sender = Address::generate(&env);
90
+ let msg_type = MsgType::Composed;
91
+ // Composed message needs lzCompose gas for execution
92
+ let options = create_options_with_gas(&env, 100000, 100000);
93
+
94
+ let fee = quote(&chain_a, chain_b.eid, msg_type, &options);
95
+ mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, fee.native_fee);
96
+ increment(&env, &chain_a, &sender, chain_b.eid, msg_type, &options, &fee);
97
+
98
+ // validate packet on Chain B
99
+ let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
100
+ let packet = validate_packet(&env, &chain_b, &packet_event);
101
+
102
+ // deliver the message on Chain B via executor_helper
103
+ let executor_value_b = get_executor_value_from_options(&env, &packet_event.1);
104
+ let admin = Address::generate(&env);
105
+ lz_receive_via_executor(&env, &chain_b, &admin, &packet, executor_value_b);
106
+
107
+ // scan compose_sent event emitted by lz_receive
108
+ let compose_event = scan_compose_sent_event(&env, &chain_b.endpoint.address);
109
+ assert!(compose_event.is_some(), "compose_sent event should be emitted");
110
+ let (from, to, guid, index, _message) = compose_event.unwrap();
111
+ assert_eq!(from, chain_b.counter.address);
112
+ assert_eq!(to, chain_b.counter.address);
113
+ assert_eq!(guid, packet.guid);
114
+ assert_eq!(index, 0);
115
+
116
+ // execute lz_compose via executor_helper
117
+ let compose_value_b = get_compose_value_from_options(&env, &packet_event.1);
118
+ lz_compose_via_executor(&env, &chain_b, &admin, &packet, compose_value_b);
119
+
120
+ // state assertion
121
+ assert_eq!(chain_a.counter.outbound_count(&chain_b.eid), 1);
122
+ assert_eq!(chain_b.counter.count(), 1);
123
+ assert_eq!(chain_b.counter.inbound_count(&chain_a.eid), 1);
124
+ assert_eq!(chain_b.counter.composed_count(), 1);
125
+ }
126
+
127
+ #[test]
128
+ fn test_increment_composed_aba() {
129
+ let TestSetup { env, chain_a, chain_b } = wired_setup_with_dvn_mode(DvnMode::Single);
130
+
131
+ let sender = Address::generate(&env);
132
+ let msg_type = MsgType::ComposedABA;
133
+
134
+ // Quote return fee first, then embed it as value in the send options.
135
+ let return_options = create_composed_aba_return_options(&env);
136
+ let fee_b_to_a = quote(&chain_b, chain_a.eid, MsgType::Vanilla, &return_options);
137
+ let fee_with_buffer = fee_b_to_a.native_fee + fee_b_to_a.native_fee / 100; // 1% buffer
138
+ // ComposedABA uses lz_compose to send the return message, so include lzCompose gas and value
139
+ let options = create_options_with_gas_and_value(&env, 100000, 0, 100000, fee_with_buffer as u128);
140
+
141
+ let fee_a_to_b = quote(&chain_a, chain_b.eid, msg_type, &options);
142
+ mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, fee_a_to_b.native_fee);
143
+ increment(&env, &chain_a, &sender, chain_b.eid, msg_type, &options, &fee_a_to_b);
144
+
145
+ // validate packet on Chain B
146
+ let packet_event_chain_a = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
147
+ let packet_chain_a = validate_packet(&env, &chain_b, &packet_event_chain_a);
148
+
149
+ // Deliver the message on Chain B via executor_helper using the packet options value.
150
+ let executor_value_b = get_executor_value_from_options(&env, &packet_event_chain_a.1);
151
+ let admin = Address::generate(&env);
152
+ lz_receive_via_executor(&env, &chain_b, &admin, &packet_chain_a, executor_value_b);
153
+
154
+ // scan compose_sent event emitted by lz_receive
155
+ let compose_event = scan_compose_sent_event(&env, &chain_b.endpoint.address);
156
+ assert!(compose_event.is_some(), "compose_sent event should be emitted");
157
+ let (from, to, guid, index, _message) = compose_event.unwrap();
158
+ assert_eq!(from, chain_b.counter.address);
159
+ assert_eq!(to, chain_b.counter.address);
160
+ assert_eq!(guid, packet_chain_a.guid);
161
+ assert_eq!(index, 0);
162
+
163
+ // execute lz_compose on Chain B (lz_send happens inside)
164
+ let compose_value_b = get_compose_value_from_options(&env, &packet_event_chain_a.1);
165
+ lz_compose_via_executor(&env, &chain_b, &admin, &packet_chain_a, compose_value_b);
166
+
167
+ // validate packet on Chain A (packet emitted on Chain B)
168
+ let packet_event_chain_b = scan_packet_sent_event(&env, &chain_b.endpoint.address).unwrap();
169
+ let packet_chain_b = validate_packet(&env, &chain_a, &packet_event_chain_b);
170
+
171
+ // Extract executor value from the actual packet options
172
+ let executor_value = get_executor_value_from_options(&env, &packet_event_chain_b.1);
173
+ // deliver the message on Chain A via executor_helper
174
+ lz_receive_via_executor(&env, &chain_a, &admin, &packet_chain_b, executor_value);
175
+
176
+ // state assertion
177
+ assert_eq!(chain_a.counter.count(), 1);
178
+ assert_eq!(chain_a.counter.outbound_count(&chain_b.eid), 1);
179
+ assert_eq!(chain_a.counter.inbound_count(&chain_b.eid), 1);
180
+
181
+ assert_eq!(chain_b.counter.count(), 1);
182
+ assert_eq!(chain_b.counter.inbound_count(&chain_a.eid), 1);
183
+ assert_eq!(chain_b.counter.outbound_count(&chain_a.eid), 1);
184
+ assert_eq!(chain_b.counter.composed_count(), 1);
185
+ }
186
+
187
+ // ============================================================================
188
+ // Multi-DVN Verification Tests
189
+ // ============================================================================
190
+
191
+ /// Multi-DVN: both DVNs required (no optional threshold)
192
+ #[test]
193
+ fn test_multi_dvn_two_required() {
194
+ let TestSetup { env, chain_a, chain_b } = wired_setup_with_dvn_mode(DvnMode::TwoRequired);
195
+
196
+ // Send a message A → B
197
+ let sender = Address::generate(&env);
198
+ let options = create_default_options(&env);
199
+ let fee = quote(&chain_a, chain_b.eid, MsgType::Vanilla, &options);
200
+ mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, fee.native_fee);
201
+ increment(&env, &chain_a, &sender, chain_b.eid, MsgType::Vanilla, &options, &fee);
202
+
203
+ let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
204
+ let packet = decode_packet(&env, &packet_event.0);
205
+ let encoded_header = packet_codec_v1::encode_packet_header(&env, &packet);
206
+ let payload_hash = packet_codec_v1::payload_hash(&env, &packet);
207
+
208
+ let receive_uln302 = ReceiveUln302Client::new(&env, &chain_b.uln302.address);
209
+
210
+ // Verify with first DVN only - should NOT be verifiable yet (need 2 DVNs)
211
+ env.mock_auths(&[MockAuth {
212
+ address: &chain_b.dvn.address,
213
+ invoke: &MockAuthInvoke {
214
+ contract: &chain_b.uln302.address,
215
+ fn_name: "verify",
216
+ args: (&chain_b.dvn.address, &encoded_header, &payload_hash, &CONFIRMATIONS).into_val(&env),
217
+ sub_invokes: &[],
218
+ },
219
+ }]);
220
+ receive_uln302.verify(&chain_b.dvn.address, &encoded_header, &payload_hash, &CONFIRMATIONS);
221
+
222
+ // Check verifiable status - should be false (only 1 of 2 required DVNs verified)
223
+ let is_verifiable = receive_uln302.verifiable(&encoded_header, &payload_hash);
224
+ assert!(!is_verifiable, "Should NOT be verifiable with only 1 DVN");
225
+
226
+ // Verify with second DVN
227
+ env.mock_auths(&[MockAuth {
228
+ address: &chain_b.dvn2.address,
229
+ invoke: &MockAuthInvoke {
230
+ contract: &chain_b.uln302.address,
231
+ fn_name: "verify",
232
+ args: (&chain_b.dvn2.address, &encoded_header, &payload_hash, &CONFIRMATIONS).into_val(&env),
233
+ sub_invokes: &[],
234
+ },
235
+ }]);
236
+ receive_uln302.verify(&chain_b.dvn2.address, &encoded_header, &payload_hash, &CONFIRMATIONS);
237
+
238
+ // Now should be verifiable (both required DVNs verified)
239
+ let is_verifiable = receive_uln302.verifiable(&encoded_header, &payload_hash);
240
+ assert!(is_verifiable, "Should be verifiable with both DVNs");
241
+
242
+ // Commit and deliver
243
+ receive_uln302.commit_verification(&encoded_header, &payload_hash);
244
+
245
+ let executor_value_b = get_executor_value_from_options(&env, &packet_event.1);
246
+ let admin = Address::generate(&env);
247
+ lz_receive_via_executor(&env, &chain_b, &admin, &packet, executor_value_b);
248
+
249
+ // State assertions
250
+ assert_eq!(chain_a.counter.outbound_count(&chain_b.eid), 1);
251
+ assert_eq!(chain_b.counter.count(), 1);
252
+ assert_eq!(chain_b.counter.inbound_count(&chain_a.eid), 1);
253
+ }
254
+
255
+ /// Multi-DVN: duplicate DVN in required+optional (optional threshold = 1)
256
+ #[test]
257
+ fn test_multi_dvn_duplicate_required_optional() {
258
+ let TestSetup { env, chain_a, chain_b } = wired_setup_with_dvn_mode(DvnMode::DuplicateOptional);
259
+
260
+ // Send a message A → B
261
+ let sender = Address::generate(&env);
262
+ let options = create_default_options(&env);
263
+ let fee = quote(&chain_a, chain_b.eid, MsgType::Vanilla, &options);
264
+ mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, fee.native_fee);
265
+ increment(&env, &chain_a, &sender, chain_b.eid, MsgType::Vanilla, &options, &fee);
266
+
267
+ let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
268
+ let packet = decode_packet(&env, &packet_event.0);
269
+ let encoded_header = packet_codec_v1::encode_packet_header(&env, &packet);
270
+ let payload_hash = packet_codec_v1::payload_hash(&env, &packet);
271
+
272
+ let receive_uln302 = ReceiveUln302Client::new(&env, &chain_b.uln302.address);
273
+
274
+ // Verify with DVN only - because DVN is present in both required and optional lists (optional threshold = 1),
275
+ // this alone should satisfy verifiability.
276
+ env.mock_auths(&[MockAuth {
277
+ address: &chain_b.dvn.address,
278
+ invoke: &MockAuthInvoke {
279
+ contract: &chain_b.uln302.address,
280
+ fn_name: "verify",
281
+ args: (&chain_b.dvn.address, &encoded_header, &payload_hash, &CONFIRMATIONS).into_val(&env),
282
+ sub_invokes: &[],
283
+ },
284
+ }]);
285
+ receive_uln302.verify(&chain_b.dvn.address, &encoded_header, &payload_hash, &CONFIRMATIONS);
286
+
287
+ let is_verifiable = receive_uln302.verifiable(&encoded_header, &payload_hash);
288
+ assert!(is_verifiable, "Should be verifiable with duplicate DVN satisfying required + optional");
289
+
290
+ // Optionally verify with dvn2 (not required, but matches SUI pattern)
291
+ env.mock_auths(&[MockAuth {
292
+ address: &chain_b.dvn2.address,
293
+ invoke: &MockAuthInvoke {
294
+ contract: &chain_b.uln302.address,
295
+ fn_name: "verify",
296
+ args: (&chain_b.dvn2.address, &encoded_header, &payload_hash, &CONFIRMATIONS).into_val(&env),
297
+ sub_invokes: &[],
298
+ },
299
+ }]);
300
+ receive_uln302.verify(&chain_b.dvn2.address, &encoded_header, &payload_hash, &CONFIRMATIONS);
301
+
302
+ let is_verifiable = receive_uln302.verifiable(&encoded_header, &payload_hash);
303
+ assert!(is_verifiable, "Should be verifiable once optional threshold is met");
304
+
305
+ receive_uln302.commit_verification(&encoded_header, &payload_hash);
306
+
307
+ let executor_value_b = get_executor_value_from_options(&env, &packet_event.1);
308
+ let admin = Address::generate(&env);
309
+ lz_receive_via_executor(&env, &chain_b, &admin, &packet, executor_value_b);
310
+
311
+ assert_eq!(chain_a.counter.outbound_count(&chain_b.eid), 1);
312
+ assert_eq!(chain_b.counter.count(), 1);
313
+ assert_eq!(chain_b.counter.inbound_count(&chain_a.eid), 1);
314
+ }