@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
@@ -1,18 +1,76 @@
1
+ use soroban_sdk::{testutils::Address as _, Address, Bytes, BytesN};
2
+ use utils::testing_utils::assert_event;
3
+
1
4
  use crate::{
5
+ errors::EndpointError,
2
6
  events::PacketDelivered,
3
- storage,
7
+ tests::endpoint_setup::TestSetup,
4
8
  tests::{endpoint_setup::setup, mock::MockReceiver},
5
9
  util::{build_payload, keccak256},
6
10
  Origin,
7
11
  };
8
- use soroban_sdk::{
9
- testutils::{MockAuth, MockAuthInvoke},
10
- vec, Bytes, BytesN, IntoVal,
11
- };
12
- use utils::testing_utils::assert_event;
13
12
 
13
+ fn build_payload_hash(env: &soroban_sdk::Env, guid: &BytesN<32>, message: &Bytes) -> BytesN<32> {
14
+ let payload = build_payload(env, guid, message);
15
+ keccak256(env, &payload)
16
+ }
17
+
18
+ fn verify_packet_with_auth(
19
+ context: &TestSetup,
20
+ receive_lib: &soroban_sdk::Address,
21
+ origin: &Origin,
22
+ receiver: &soroban_sdk::Address,
23
+ payload_hash: &BytesN<32>,
24
+ ) {
25
+ context.mock_auth(receive_lib, "verify", (receive_lib, origin, receiver, payload_hash));
26
+ context.endpoint_client.verify(receive_lib, origin, receiver, payload_hash);
27
+ }
28
+
29
+ fn clear_packet_with_auth(
30
+ context: &TestSetup,
31
+ caller: &soroban_sdk::Address,
32
+ origin: &Origin,
33
+ receiver: &soroban_sdk::Address,
34
+ guid: &BytesN<32>,
35
+ message: &Bytes,
36
+ ) {
37
+ context.mock_auth(caller, "clear", (caller, origin, receiver, guid, message));
38
+ context.endpoint_client.clear(caller, origin, receiver, guid, message);
39
+ }
40
+
41
+ fn try_clear_packet_with_auth(
42
+ context: &TestSetup,
43
+ caller: &soroban_sdk::Address,
44
+ origin: &Origin,
45
+ receiver: &soroban_sdk::Address,
46
+ guid: &BytesN<32>,
47
+ message: &Bytes,
48
+ ) -> Result<Result<(), soroban_sdk::ConversionError>, Result<soroban_sdk::Error, soroban_sdk::InvokeError>> {
49
+ context.mock_auth(caller, "clear", (caller, origin, receiver, guid, message));
50
+ context.endpoint_client.try_clear(caller, origin, receiver, guid, message)
51
+ }
52
+
53
+ fn arrange_verified_packet_with_auth(
54
+ context: &TestSetup,
55
+ src_eid: u32,
56
+ sender: &BytesN<32>,
57
+ receiver: &soroban_sdk::Address,
58
+ nonce: u64,
59
+ guid: &BytesN<32>,
60
+ message: &Bytes,
61
+ ) -> (soroban_sdk::Address, Origin, BytesN<32>) {
62
+ let receive_lib = context.setup_default_receive_lib(src_eid, 0);
63
+ let origin = Origin { src_eid, sender: sender.clone(), nonce };
64
+ let payload_hash = build_payload_hash(&context.env, guid, message);
65
+
66
+ verify_packet_with_auth(context, &receive_lib, &origin, receiver, &payload_hash);
67
+
68
+ (receive_lib, origin, payload_hash)
69
+ }
70
+
71
+ // Inbound payload hash storage / removal
14
72
  #[test]
15
- fn test_clear_success() {
73
+ fn test_clear_removes_inbound_payload_hash() {
16
74
  let context = setup();
17
75
  let env = &context.env;
18
76
  let endpoint_client = &context.endpoint_client;
@@ -22,83 +80,48 @@ fn test_clear_success() {
22
80
  let receiver = env.register(MockReceiver, ());
23
81
  let nonce = 1u64;
24
82
 
25
- // Setup receive library
26
- let receive_lib = context.setup_mock_receive_lib(vec![env, src_eid]);
27
- context.mock_owner_auth("register_library", (&receive_lib,));
28
- endpoint_client.register_library(&receive_lib);
29
- context.mock_owner_auth("set_default_receive_library", (&src_eid, &receive_lib, &0u64));
30
- endpoint_client.set_default_receive_library(&src_eid, &receive_lib, &0);
31
-
32
- // Create message and payload
33
83
  let message = Bytes::from_array(env, &[1, 2, 3, 4]);
34
84
  let guid = BytesN::from_array(env, &[5u8; 32]);
35
- let payload = build_payload(env, &guid, &message);
36
- let payload_hash = keccak256(env, &payload);
37
-
38
- let origin = Origin { src_eid, sender: sender.clone(), nonce };
39
-
40
- // First verify the packet
41
- env.mock_auths(&[MockAuth {
42
- address: &receive_lib,
43
- invoke: &MockAuthInvoke {
44
- contract: &endpoint_client.address,
45
- fn_name: "verify",
46
- args: (&receive_lib, &origin, &receiver, &payload_hash).into_val(env),
47
- sub_invokes: &[],
48
- },
49
- }]);
50
- endpoint_client.verify(&receive_lib, &origin, &receiver, &payload_hash);
85
+ let (_receive_lib, origin, payload_hash) =
86
+ arrange_verified_packet_with_auth(&context, src_eid, &sender, &receiver, nonce, &guid, &message);
51
87
 
52
88
  // Verify payload hash exists before clear
53
- let hash_before_clear = env.as_contract(&endpoint_client.address, || {
54
- storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce)
55
- });
89
+ let hash_before_clear = endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce);
56
90
  assert_eq!(hash_before_clear, Some(payload_hash.clone()), "Payload hash should exist before clear");
57
91
 
58
- // Verify initial lazy inbound nonce
59
- let initial_lazy_nonce = env.as_contract(&endpoint_client.address, || {
60
- storage::EndpointStorage::lazy_inbound_nonce(env, &receiver, src_eid, &sender)
61
- });
62
- assert_eq!(initial_lazy_nonce, 0, "Initial lazy inbound nonce should be 0");
63
-
64
92
  // Now clear the payload
65
- env.mock_auths(&[MockAuth {
66
- address: &receiver,
67
- invoke: &MockAuthInvoke {
68
- contract: &endpoint_client.address,
69
- fn_name: "clear",
70
- args: (&receiver, &origin, &receiver, &guid, &message).into_val(env),
71
- sub_invokes: &[],
72
- },
73
- }]);
74
- endpoint_client.clear(&receiver, &origin, &receiver, &guid, &message);
75
-
76
- // Verify PacketDelivered event was published
77
- assert_event(env, &endpoint_client.address, PacketDelivered { origin: origin.clone(), receiver: receiver.clone() });
93
+ clear_packet_with_auth(&context, &receiver, &origin, &receiver, &guid, &message);
78
94
 
79
95
  // Verify payload hash was removed via public interface
80
96
  let stored_hash = endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce);
81
97
  assert_eq!(stored_hash, None);
98
+ }
82
99
 
83
- // Assert storage change directly - payload hash removed
84
- let stored_hash_direct = env.as_contract(&endpoint_client.address, || {
85
- storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce)
86
- });
87
- assert_eq!(stored_hash_direct, None, "Storage should have payload hash removed");
100
+ // Event emission
101
+ #[test]
102
+ fn test_clear_emits_packet_delivered_event() {
103
+ let context = setup();
104
+ let env = &context.env;
105
+ let endpoint_client = &context.endpoint_client;
88
106
 
89
- // Verify lazy inbound nonce was updated via public interface
90
- let lazy_nonce = endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender);
91
- assert_eq!(lazy_nonce, nonce);
107
+ let src_eid = 2u32;
108
+ let sender = BytesN::from_array(env, &[1u8; 32]);
109
+ let receiver = env.register(MockReceiver, ());
110
+ let nonce = 1u64;
111
+
112
+ let message = Bytes::from_array(env, &[1, 2, 3, 4]);
113
+ let guid = BytesN::from_array(env, &[5u8; 32]);
114
+ let (_receive_lib, origin, _payload_hash) =
115
+ arrange_verified_packet_with_auth(&context, src_eid, &sender, &receiver, nonce, &guid, &message);
116
+
117
+ clear_packet_with_auth(&context, &receiver, &origin, &receiver, &guid, &message);
92
118
 
93
- // Assert storage change directly - lazy inbound nonce updated
94
- let stored_lazy_nonce = env.as_contract(&endpoint_client.address, || {
95
- storage::EndpointStorage::lazy_inbound_nonce(env, &receiver, src_eid, &sender)
96
- });
97
- assert_eq!(stored_lazy_nonce, nonce, "Storage should contain updated lazy inbound nonce");
119
+ assert_event(env, &endpoint_client.address, PacketDelivered { origin: origin.clone(), receiver: receiver.clone() });
98
120
  }
99
121
 
122
+ // Lazy inbound nonce updates
100
123
  #[test]
101
- fn test_clear_updates_lazy_nonce() {
124
+ fn test_clear_updates_lazy_inbound_nonce() {
102
125
  let context = setup();
103
126
  let env = &context.env;
104
127
  let endpoint_client = &context.endpoint_client;
@@ -108,56 +131,25 @@ fn test_clear_updates_lazy_nonce() {
108
131
  let receiver = env.register(MockReceiver, ());
109
132
  let nonce = 1u64;
110
133
 
111
- // Setup receive library
112
- let receive_lib = context.setup_mock_receive_lib(vec![env, src_eid]);
113
- context.mock_owner_auth("register_library", (&receive_lib,));
114
- endpoint_client.register_library(&receive_lib);
115
- context.mock_owner_auth("set_default_receive_library", (&src_eid, &receive_lib, &0u64));
116
- endpoint_client.set_default_receive_library(&src_eid, &receive_lib, &0);
117
-
118
- // Create message and payload
119
134
  let message = Bytes::from_array(env, &[1, 2, 3, 4]);
120
135
  let guid = BytesN::from_array(env, &[5u8; 32]);
121
- let payload = build_payload(env, &guid, &message);
122
- let payload_hash = keccak256(env, &payload);
136
+ let (_receive_lib, origin, _payload_hash) =
137
+ arrange_verified_packet_with_auth(&context, src_eid, &sender, &receiver, nonce, &guid, &message);
123
138
 
124
- let origin = Origin { src_eid, sender: sender.clone(), nonce };
125
-
126
- // First verify the packet
127
- env.mock_auths(&[MockAuth {
128
- address: &receive_lib,
129
- invoke: &MockAuthInvoke {
130
- contract: &endpoint_client.address,
131
- fn_name: "verify",
132
- args: (&receive_lib, &origin, &receiver, &payload_hash).into_val(env),
133
- sub_invokes: &[],
134
- },
135
- }]);
136
- endpoint_client.verify(&receive_lib, &origin, &receiver, &payload_hash);
137
-
138
- // Check initial lazy nonce
139
+ // Verify initial lazy inbound nonce
139
140
  let initial_lazy_nonce = endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender);
140
- assert_eq!(initial_lazy_nonce, 0);
141
-
142
- // Clear the payload
143
- env.mock_auths(&[MockAuth {
144
- address: &receiver,
145
- invoke: &MockAuthInvoke {
146
- contract: &endpoint_client.address,
147
- fn_name: "clear",
148
- args: (&receiver, &origin, &receiver, &guid, &message).into_val(env),
149
- sub_invokes: &[],
150
- },
151
- }]);
152
- endpoint_client.clear(&receiver, &origin, &receiver, &guid, &message);
153
-
154
- // Verify lazy inbound nonce was updated
141
+ assert_eq!(initial_lazy_nonce, 0, "Initial lazy inbound nonce should be 0");
142
+
143
+ clear_packet_with_auth(&context, &receiver, &origin, &receiver, &guid, &message);
144
+
145
+ // Verify lazy inbound nonce was updated via public interface
155
146
  let lazy_nonce = endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender);
156
147
  assert_eq!(lazy_nonce, nonce);
157
148
  }
158
149
 
150
+ // Sequential nonce behavior
159
151
  #[test]
160
- fn test_clear_sequential_nonces() {
152
+ fn test_clear_success_sequential_nonces_update_lazy_nonce_to_latest() {
161
153
  let context = setup();
162
154
  let env = &context.env;
163
155
  let endpoint_client = &context.endpoint_client;
@@ -167,71 +159,262 @@ fn test_clear_sequential_nonces() {
167
159
  let receiver = env.register(MockReceiver, ());
168
160
 
169
161
  // Setup receive library
170
- let receive_lib = context.setup_mock_receive_lib(vec![env, src_eid]);
171
- context.mock_owner_auth("register_library", (&receive_lib,));
172
- endpoint_client.register_library(&receive_lib);
173
- context.mock_owner_auth("set_default_receive_library", (&src_eid, &receive_lib, &0u64));
174
- endpoint_client.set_default_receive_library(&src_eid, &receive_lib, &0);
162
+ let receive_lib = context.setup_default_receive_lib(src_eid, 0);
175
163
 
176
164
  // Verify and clear nonce 1
177
165
  let message1 = Bytes::from_array(env, &[1, 2, 3]);
178
166
  let guid1 = BytesN::from_array(env, &[1u8; 32]);
179
- let payload1 = build_payload(env, &guid1, &message1);
180
- let payload_hash1 = keccak256(env, &payload1);
167
+ let payload_hash1 = build_payload_hash(env, &guid1, &message1);
181
168
  let origin1 = Origin { src_eid, sender: sender.clone(), nonce: 1 };
182
169
 
183
- env.mock_auths(&[MockAuth {
184
- address: &receive_lib,
185
- invoke: &MockAuthInvoke {
186
- contract: &endpoint_client.address,
187
- fn_name: "verify",
188
- args: (&receive_lib, &origin1, &receiver, &payload_hash1).into_val(env),
189
- sub_invokes: &[],
190
- },
191
- }]);
192
- endpoint_client.verify(&receive_lib, &origin1, &receiver, &payload_hash1);
193
-
194
- env.mock_auths(&[MockAuth {
195
- address: &receiver,
196
- invoke: &MockAuthInvoke {
197
- contract: &endpoint_client.address,
198
- fn_name: "clear",
199
- args: (&receiver, &origin1, &receiver, &guid1, &message1).into_val(env),
200
- sub_invokes: &[],
201
- },
202
- }]);
203
- endpoint_client.clear(&receiver, &origin1, &receiver, &guid1, &message1);
170
+ verify_packet_with_auth(&context, &receive_lib, &origin1, &receiver, &payload_hash1);
171
+ clear_packet_with_auth(&context, &receiver, &origin1, &receiver, &guid1, &message1);
204
172
 
205
173
  // Verify and clear nonce 2
206
174
  let message2 = Bytes::from_array(env, &[4, 5, 6]);
207
175
  let guid2 = BytesN::from_array(env, &[2u8; 32]);
208
- let payload2 = build_payload(env, &guid2, &message2);
209
- let payload_hash2 = keccak256(env, &payload2);
176
+ let payload_hash2 = build_payload_hash(env, &guid2, &message2);
210
177
  let origin2 = Origin { src_eid, sender: sender.clone(), nonce: 2 };
211
178
 
212
- env.mock_auths(&[MockAuth {
213
- address: &receive_lib,
214
- invoke: &MockAuthInvoke {
215
- contract: &endpoint_client.address,
216
- fn_name: "verify",
217
- args: (&receive_lib, &origin2, &receiver, &payload_hash2).into_val(env),
218
- sub_invokes: &[],
219
- },
220
- }]);
221
- endpoint_client.verify(&receive_lib, &origin2, &receiver, &payload_hash2);
222
-
223
- env.mock_auths(&[MockAuth {
224
- address: &receiver,
225
- invoke: &MockAuthInvoke {
226
- contract: &endpoint_client.address,
227
- fn_name: "clear",
228
- args: (&receiver, &origin2, &receiver, &guid2, &message2).into_val(env),
229
- sub_invokes: &[],
230
- },
231
- }]);
232
- endpoint_client.clear(&receiver, &origin2, &receiver, &guid2, &message2);
179
+ verify_packet_with_auth(&context, &receive_lib, &origin2, &receiver, &payload_hash2);
180
+ clear_packet_with_auth(&context, &receiver, &origin2, &receiver, &guid2, &message2);
233
181
 
234
182
  // Verify lazy inbound nonce was updated to 2
235
183
  let lazy_nonce = endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender);
236
184
  assert_eq!(lazy_nonce, 2);
237
185
  }
186
+
187
+ // Authorization
188
+ #[test]
189
+ fn test_clear_failure_unauthorized_caller() {
190
+ let context = setup();
191
+ let env = &context.env;
192
+
193
+ let src_eid = 2u32;
194
+ let sender = BytesN::from_array(env, &[1u8; 32]);
195
+ // Use MockReceiver (not MockReceiverReject) so verification succeeds
196
+ let receiver = env.register(crate::tests::mock::MockReceiver, ());
197
+ let nonce = 1u64;
198
+
199
+ // Create message and payload
200
+ let message = Bytes::from_array(env, &[1, 2, 3, 4]);
201
+ let guid = BytesN::from_array(env, &[5u8; 32]);
202
+ let payload_hash = build_payload_hash(env, &guid, &message);
203
+
204
+ let origin = Origin { src_eid, sender: sender.clone(), nonce };
205
+
206
+ // Setup receive library
207
+ let receive_lib = context.setup_default_receive_lib(src_eid, 0);
208
+
209
+ // First verify the packet successfully (so we have something to clear)
210
+ verify_packet_with_auth(&context, &receive_lib, &origin, &receiver, &payload_hash);
211
+
212
+ // Now try to clear with unauthorized caller - caller is not receiver and not delegate
213
+ // require_oapp_auth checks caller == receiver || caller == delegate first, then calls require_auth
214
+ // Since caller != receiver and no delegate is set, it should fail with Unauthorized (21)
215
+ let unauthorized_caller = soroban_sdk::Address::generate(env);
216
+ let result = try_clear_packet_with_auth(&context, &unauthorized_caller, &origin, &receiver, &guid, &message);
217
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::Unauthorized.into());
218
+ }
219
+
220
+ #[test]
221
+ fn test_clear_failure_wrong_delegate() {
222
+ let context = setup();
223
+ let env = &context.env;
224
+ let endpoint_client = &context.endpoint_client;
225
+
226
+ let src_eid = 2u32;
227
+ let sender = BytesN::from_array(env, &[1u8; 32]);
228
+ // Use a regular Address for receiver to avoid requiring a receiver contract implementation.
229
+ // We initialize the path via `skip` so `verify` doesn't need to call `allow_initialize_path`.
230
+ let receiver = Address::generate(env);
231
+ let nonce = 2u64;
232
+
233
+ // Set a delegate for receiver.
234
+ let delegate = Address::generate(env);
235
+ let delegate_opt = Some(delegate);
236
+ context.set_delegate_with_auth(&receiver, &delegate_opt);
237
+
238
+ // Initialize path by skipping nonce 1.
239
+ context.mock_auth(&receiver, "skip", (&receiver, &receiver, &src_eid, &sender, &1u64));
240
+ endpoint_client.skip(&receiver, &receiver, &src_eid, &sender, &1u64);
241
+
242
+ // Create message and payload
243
+ let message = Bytes::from_array(env, &[1, 2, 3, 4]);
244
+ let guid = BytesN::from_array(env, &[5u8; 32]);
245
+ let payload_hash = build_payload_hash(env, &guid, &message);
246
+
247
+ let origin = Origin { src_eid, sender: sender.clone(), nonce };
248
+
249
+ // Setup receive library
250
+ let receive_lib = context.setup_default_receive_lib(src_eid, 0);
251
+
252
+ // First verify the packet successfully (so we have something to clear)
253
+ verify_packet_with_auth(&context, &receive_lib, &origin, &receiver, &payload_hash);
254
+
255
+ // Now try to clear with wrong delegate - caller is not receiver and not the configured delegate.
256
+ let wrong_delegate = Address::generate(env);
257
+ let result = try_clear_packet_with_auth(&context, &wrong_delegate, &origin, &receiver, &guid, &message);
258
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::Unauthorized.into());
259
+ }
260
+
261
+ #[test]
262
+ fn test_clear_success_delegate_can_clear() {
263
+ let context = setup();
264
+ let env = &context.env;
265
+ let endpoint_client = &context.endpoint_client;
266
+
267
+ let src_eid = 2u32;
268
+ let sender = BytesN::from_array(env, &[1u8; 32]);
269
+ // Use a regular Address for receiver to avoid requiring a receiver contract implementation.
270
+ // We initialize the path via `skip` so `verify` doesn't need to call `allow_initialize_path`.
271
+ let receiver = Address::generate(env);
272
+ let delegate = Address::generate(env);
273
+ let nonce = 2u64;
274
+
275
+ let delegate_opt = Some(delegate.clone());
276
+ context.set_delegate_with_auth(&receiver, &delegate_opt);
277
+
278
+ // Initialize path by skipping nonce 1.
279
+ context.mock_auth(&receiver, "skip", (&receiver, &receiver, &src_eid, &sender, &1u64));
280
+ endpoint_client.skip(&receiver, &receiver, &src_eid, &sender, &1u64);
281
+
282
+ let message = Bytes::from_array(env, &[1, 2, 3, 4]);
283
+ let guid = BytesN::from_array(env, &[5u8; 32]);
284
+ let receive_lib = context.setup_default_receive_lib(src_eid, 0);
285
+ let origin = Origin { src_eid, sender: sender.clone(), nonce };
286
+ let payload_hash = build_payload_hash(env, &guid, &message);
287
+ verify_packet_with_auth(&context, &receive_lib, &origin, &receiver, &payload_hash);
288
+
289
+ clear_packet_with_auth(&context, &delegate, &origin, &receiver, &guid, &message);
290
+
291
+ // Sanity: payload hash for nonce was removed.
292
+ let stored_hash = endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce);
293
+ assert_eq!(stored_hash, None);
294
+ }
295
+
296
+ // Payload hash validation
297
+ #[test]
298
+ fn test_clear_failure_wrong_payload_hash() {
299
+ let context = setup();
300
+ let env = &context.env;
301
+
302
+ let src_eid = 2u32;
303
+ let sender = BytesN::from_array(env, &[1u8; 32]);
304
+ let receiver = env.register(crate::tests::mock::MockReceiver, ());
305
+ let nonce = 1u64;
306
+
307
+ // Create message and payload
308
+ let message = Bytes::from_array(env, &[1, 2, 3, 4]);
309
+ let guid = BytesN::from_array(env, &[5u8; 32]);
310
+ let payload_hash = build_payload_hash(env, &guid, &message);
311
+
312
+ let origin = Origin { src_eid, sender: sender.clone(), nonce };
313
+
314
+ // Setup receive library
315
+ let receive_lib = context.setup_default_receive_lib(src_eid, 0);
316
+
317
+ // First verify the packet
318
+ verify_packet_with_auth(&context, &receive_lib, &origin, &receiver, &payload_hash);
319
+
320
+ // Try to clear with wrong message (different payload hash)
321
+ let wrong_message = Bytes::from_array(env, &[9, 9, 9, 9]);
322
+
323
+ let result = try_clear_packet_with_auth(&context, &receiver, &origin, &receiver, &guid, &wrong_message);
324
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::PayloadHashNotFound.into());
325
+ }
326
+
327
+ #[test]
328
+ fn test_clear_failure_duplicate_clear() {
329
+ let context = setup();
330
+ let env = &context.env;
331
+
332
+ let src_eid = 2u32;
333
+ let sender = BytesN::from_array(env, &[1u8; 32]);
334
+ let receiver = env.register(MockReceiver, ());
335
+ let nonce = 1u64;
336
+
337
+ let message = Bytes::from_array(env, &[1, 2, 3, 4]);
338
+ let guid = BytesN::from_array(env, &[5u8; 32]);
339
+ let (_receive_lib, origin, _payload_hash) =
340
+ arrange_verified_packet_with_auth(&context, src_eid, &sender, &receiver, nonce, &guid, &message);
341
+
342
+ // First clear succeeds.
343
+ clear_packet_with_auth(&context, &receiver, &origin, &receiver, &guid, &message);
344
+
345
+ // Second clear should fail because payload hash has been removed.
346
+ let result = try_clear_packet_with_auth(&context, &receiver, &origin, &receiver, &guid, &message);
347
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::PayloadHashNotFound.into());
348
+ }
349
+
350
+ // Nonce ordering validation
351
+ #[test]
352
+ fn test_clear_failure_missing_intermediate_nonce() {
353
+ let context = setup();
354
+ let env = &context.env;
355
+
356
+ let src_eid = 2u32;
357
+ let sender = BytesN::from_array(env, &[1u8; 32]);
358
+ let receiver = env.register(crate::tests::mock::MockReceiver, ());
359
+
360
+ // Setup receive library
361
+ let receive_lib = context.setup_default_receive_lib(src_eid, 0);
362
+
363
+ // Verify and store nonce 1
364
+ let message1 = Bytes::from_array(env, &[1, 2, 3]);
365
+ let guid1 = BytesN::from_array(env, &[1u8; 32]);
366
+ let payload_hash1 = build_payload_hash(env, &guid1, &message1);
367
+ let origin1 = Origin { src_eid, sender: sender.clone(), nonce: 1 };
368
+
369
+ verify_packet_with_auth(&context, &receive_lib, &origin1, &receiver, &payload_hash1);
370
+
371
+ // Verify and store nonce 3 (skip nonce 2)
372
+ let message3 = Bytes::from_array(env, &[3, 3, 3]);
373
+ let guid3 = BytesN::from_array(env, &[3u8; 32]);
374
+ let payload_hash3 = build_payload_hash(env, &guid3, &message3);
375
+ let origin3 = Origin { src_eid, sender: sender.clone(), nonce: 3 };
376
+
377
+ verify_packet_with_auth(&context, &receive_lib, &origin3, &receiver, &payload_hash3);
378
+
379
+ // Clear nonce 1 first
380
+ clear_packet_with_auth(&context, &receiver, &origin1, &receiver, &guid1, &message1);
381
+
382
+ // Try to clear nonce 3 - should panic because nonce 2 is missing
383
+ let result = try_clear_packet_with_auth(&context, &receiver, &origin3, &receiver, &guid3, &message3);
384
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::InvalidNonce.into());
385
+ }
386
+
387
+ #[test]
388
+ fn test_clear_does_not_advance_lazy_nonce_when_clearing_older_nonce() {
389
+ let context = setup();
390
+ let env = &context.env;
391
+ let endpoint_client = &context.endpoint_client;
392
+
393
+ let src_eid = 2u32;
394
+ let sender = BytesN::from_array(env, &[1u8; 32]);
395
+ let receiver = env.register(MockReceiver, ());
396
+
397
+ // Setup receive library once for the path.
398
+ let receive_lib = context.setup_default_receive_lib(src_eid, 0);
399
+
400
+ // Verify nonce 1 and nonce 2.
401
+ let message1 = Bytes::from_array(env, &[1, 2, 3]);
402
+ let guid1 = BytesN::from_array(env, &[1u8; 32]);
403
+ let payload_hash1 = build_payload_hash(env, &guid1, &message1);
404
+ let origin1 = Origin { src_eid, sender: sender.clone(), nonce: 1 };
405
+ verify_packet_with_auth(&context, &receive_lib, &origin1, &receiver, &payload_hash1);
406
+
407
+ let message2 = Bytes::from_array(env, &[4, 5, 6]);
408
+ let guid2 = BytesN::from_array(env, &[2u8; 32]);
409
+ let payload_hash2 = build_payload_hash(env, &guid2, &message2);
410
+ let origin2 = Origin { src_eid, sender: sender.clone(), nonce: 2 };
411
+ verify_packet_with_auth(&context, &receive_lib, &origin2, &receiver, &payload_hash2);
412
+
413
+ // Clear nonce 2 first (this advances lazy nonce to 2 because nonce 1..=2 are present).
414
+ clear_packet_with_auth(&context, &receiver, &origin2, &receiver, &guid2, &message2);
415
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), 2);
416
+
417
+ // Clearing an older nonce should not change lazy nonce.
418
+ clear_packet_with_auth(&context, &receiver, &origin1, &receiver, &guid1, &message1);
419
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), 2);
420
+ }
@@ -1,9 +1,6 @@
1
- use crate::tests::endpoint_setup::setup;
2
- use soroban_sdk::{
3
- testutils::{Address as _, MockAuth, MockAuthInvoke},
4
- Address, IntoVal,
5
- };
1
+ use soroban_sdk::{testutils::Address as _, Address};
6
2
 
3
+ use crate::tests::endpoint_setup::setup;
7
4
  #[test]
8
5
  fn test_delegate_when_not_set() {
9
6
  let context = setup();
@@ -26,16 +23,7 @@ fn test_delegate_when_set() {
26
23
  let delegate = Address::generate(env);
27
24
 
28
25
  let delegate_option = Some(delegate.clone());
29
- env.mock_auths(&[MockAuth {
30
- address: &oapp,
31
- invoke: &MockAuthInvoke {
32
- contract: &endpoint_client.address,
33
- fn_name: "set_delegate",
34
- args: (&oapp, &delegate_option).into_val(env),
35
- sub_invokes: &[],
36
- },
37
- }]);
38
- endpoint_client.set_delegate(&oapp, &delegate_option);
26
+ context.set_delegate_with_auth(&oapp, &delegate_option);
39
27
 
40
28
  let actual_delegate = endpoint_client.delegate(&oapp);
41
29
  assert_eq!(actual_delegate, Some(delegate), "Delegate should be set");