@layerzerolabs/protocol-stellar-v2 0.2.13 → 0.2.15

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 (319) hide show
  1. package/.turbo/turbo-build.log +384 -278
  2. package/.turbo/turbo-lint.log +110 -78
  3. package/.turbo/turbo-test.log +1248 -1014
  4. package/Cargo.lock +130 -3
  5. package/Cargo.toml +2 -1
  6. package/contracts/common-macros/src/contract_impl.rs +6 -1
  7. package/contracts/common-macros/src/lib.rs +47 -8
  8. package/contracts/common-macros/src/ownable.rs +7 -25
  9. package/contracts/common-macros/src/storage.rs +1 -1
  10. package/contracts/common-macros/src/tests/contract_impl.rs +5 -0
  11. package/contracts/common-macros/src/tests/mod.rs +1 -0
  12. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_impl__snapshot_generated_contract_impl_code.snap +23 -7
  13. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +5 -25
  14. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +48 -48
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +5 -25
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +21 -0
  17. package/contracts/common-macros/src/tests/upgradeable.rs +31 -0
  18. package/contracts/common-macros/src/ttl_configurable.rs +14 -44
  19. package/contracts/common-macros/src/upgradeable.rs +76 -0
  20. package/contracts/endpoint-v2/src/endpoint_v2.rs +25 -1
  21. package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +175 -8
  22. package/contracts/endpoint-v2/src/tests/endpoint_v2/build_outbound_packet.rs +76 -0
  23. package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +342 -159
  24. package/contracts/endpoint-v2/src/tests/endpoint_v2/delegate.rs +3 -15
  25. package/contracts/endpoint-v2/src/tests/endpoint_v2/initializable.rs +20 -31
  26. package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +126 -164
  27. package/contracts/endpoint-v2/src/tests/endpoint_v2/mod.rs +1 -0
  28. package/contracts/endpoint-v2/src/tests/endpoint_v2/native_token.rs +0 -1
  29. package/contracts/endpoint-v2/src/tests/endpoint_v2/owner.rs +0 -1
  30. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +311 -304
  31. package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +423 -96
  32. package/contracts/endpoint-v2/src/tests/endpoint_v2/recover_token.rs +1 -1
  33. package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +47 -20
  34. package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +373 -403
  35. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +96 -22
  36. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +61 -9
  37. package/contracts/endpoint-v2/src/tests/endpoint_v2/transfer_ownership.rs +4 -4
  38. package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +8 -11
  39. package/contracts/endpoint-v2/src/tests/endpoint_v2/verifiable.rs +81 -30
  40. package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +209 -76
  41. package/contracts/endpoint-v2/src/tests/endpoint_v2/zro.rs +0 -1
  42. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library.rs +24 -0
  43. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library_timeout.rs +40 -0
  44. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_send_library.rs +24 -0
  45. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_config.rs +108 -0
  46. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_library_index.rs +52 -0
  47. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_receive_library.rs +92 -0
  48. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_registered_libraries.rs +74 -0
  49. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_send_library.rs +83 -0
  50. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_registered_library.rs +32 -0
  51. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_supported_eid.rs +28 -0
  52. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_valid_receive_library.rs +261 -0
  53. package/contracts/endpoint-v2/src/tests/message_lib_manager/mod.rs +16 -0
  54. package/contracts/endpoint-v2/src/tests/message_lib_manager/receive_library_timeout.rs +62 -0
  55. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +65 -43
  56. package/contracts/endpoint-v2/src/tests/message_lib_manager/registered_libraries_count.rs +42 -0
  57. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +61 -0
  58. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +3 -5
  59. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +59 -0
  60. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +15 -1
  61. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_config.rs +155 -51
  62. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +114 -92
  63. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +235 -132
  64. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +93 -87
  65. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +346 -245
  66. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +406 -60
  67. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +252 -78
  68. package/contracts/endpoint-v2/src/tests/message_lib_manager/timeout.rs +102 -0
  69. package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +212 -273
  70. package/contracts/endpoint-v2/src/tests/messaging_channel/clear_payload.rs +203 -0
  71. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound.rs +94 -0
  72. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_nonce.rs +78 -248
  73. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_payload_hash.rs +7 -282
  74. package/contracts/endpoint-v2/src/tests/messaging_channel/lazy_inbound_nonce.rs +6 -274
  75. package/contracts/endpoint-v2/src/tests/messaging_channel/mod.rs +3 -2
  76. package/contracts/endpoint-v2/src/tests/messaging_channel/next_guid.rs +86 -178
  77. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +328 -212
  78. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound.rs +68 -0
  79. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound_nonce.rs +6 -209
  80. package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +207 -159
  81. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +142 -153
  82. package/contracts/endpoint-v2/src/tests/messaging_composer/compose_queue.rs +6 -179
  83. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +163 -221
  84. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +90 -121
  85. package/contracts/endpoint-v2/src/tests/mock.rs +18 -4
  86. package/contracts/endpoint-v2/src/tests/util/build_payload.rs +4 -70
  87. package/contracts/endpoint-v2/src/tests/util/compute_guid.rs +2 -1
  88. package/contracts/endpoint-v2/src/tests/util/keccak256.rs +17 -106
  89. package/contracts/layerzero-views/Cargo.toml +35 -0
  90. package/contracts/layerzero-views/src/errors.rs +10 -0
  91. package/contracts/layerzero-views/src/layerzero_view.rs +229 -0
  92. package/contracts/layerzero-views/src/lib.rs +38 -0
  93. package/contracts/layerzero-views/src/storage.rs +18 -0
  94. package/contracts/layerzero-views/src/tests/layerzero_view_tests.rs +423 -0
  95. package/contracts/layerzero-views/src/tests/mod.rs +4 -0
  96. package/contracts/layerzero-views/src/tests/setup.rs +377 -0
  97. package/contracts/layerzero-views/src/types.rs +50 -0
  98. package/contracts/macro-integration-tests/Cargo.toml +30 -0
  99. package/contracts/macro-integration-tests/src/lib.rs +1 -0
  100. package/contracts/macro-integration-tests/tests/runtime/ownable/initialization.rs +62 -0
  101. package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +22 -0
  102. package/contracts/macro-integration-tests/tests/runtime/ownable/only_owner_guard.rs +97 -0
  103. package/contracts/macro-integration-tests/tests/runtime/ownable/ownership_transfer.rs +101 -0
  104. package/contracts/macro-integration-tests/tests/runtime/storage/keyed_roundtrip.rs +225 -0
  105. package/contracts/macro-integration-tests/tests/runtime/storage/mod.rs +4 -0
  106. package/contracts/macro-integration-tests/tests/runtime/storage/name_override_runtime.rs +52 -0
  107. package/contracts/macro-integration-tests/tests/runtime/storage/ttl_extension.rs +261 -0
  108. package/contracts/macro-integration-tests/tests/runtime/storage/unkeyed_roundtrip.rs +137 -0
  109. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +113 -0
  110. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/extend_instance_ttl.rs +50 -0
  111. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +139 -0
  112. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/mod.rs +3 -0
  113. package/contracts/macro-integration-tests/tests/runtime.rs +5 -0
  114. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.rs +12 -0
  115. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.stderr +7 -0
  116. package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.rs +12 -0
  117. package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.stderr +7 -0
  118. package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.rs +21 -0
  119. package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.stderr +7 -0
  120. package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.rs +13 -0
  121. package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.stderr +7 -0
  122. package/contracts/macro-integration-tests/tests/ui/error/pass/attr_on_variant_allowed.rs +20 -0
  123. package/contracts/macro-integration-tests/tests/ui/error/pass/basic_auto_discriminants.rs +15 -0
  124. package/contracts/macro-integration-tests/tests/ui/error/pass/mixed_discriminants.rs +16 -0
  125. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_owner_missing_env.rs +22 -0
  126. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_owner_missing_env.stderr +16 -0
  127. package/contracts/macro-integration-tests/tests/ui/ownable/pass/minimal_contract.rs +26 -0
  128. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +22 -0
  129. package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_owner_env_param_variants.rs +46 -0
  130. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.rs +13 -0
  131. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.stderr +7 -0
  132. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.rs +13 -0
  133. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.stderr +7 -0
  134. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.rs +10 -0
  135. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.stderr +7 -0
  136. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.rs +12 -0
  137. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.stderr +7 -0
  138. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.rs +10 -0
  139. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.stderr +7 -0
  140. package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.rs +10 -0
  141. package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.stderr +7 -0
  142. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.rs +12 -0
  143. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.stderr +7 -0
  144. package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.rs +13 -0
  145. package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.stderr +7 -0
  146. package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.rs +13 -0
  147. package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.stderr +7 -0
  148. package/contracts/macro-integration-tests/tests/ui/storage/pass/default_value_on_variant.rs +14 -0
  149. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_instance_unit_basic.rs +14 -0
  150. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_persistent_named_fields_keyed.rs +16 -0
  151. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_temporary_unit_option.rs +15 -0
  152. package/contracts/macro-integration-tests/tests/ui/storage/pass/name_override.rs +14 -0
  153. package/contracts/macro-integration-tests/tests/ui/storage/pass/no_auto_ttl_extension.rs +19 -0
  154. package/contracts/macro-integration-tests/tests/ui/storage/pass/ttl_provider_basic.rs +15 -0
  155. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/minimal_contract.rs +44 -0
  156. package/contracts/macro-integration-tests/tests/ui_error.rs +11 -0
  157. package/contracts/macro-integration-tests/tests/ui_ownable.rs +11 -0
  158. package/contracts/macro-integration-tests/tests/ui_storage.rs +11 -0
  159. package/contracts/macro-integration-tests/tests/ui_ttl_configurable.rs +12 -0
  160. package/contracts/message-libs/blocked-message-lib/src/lib.rs +17 -17
  161. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/decode_packet_header.rs +64 -0
  162. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet.rs +58 -0
  163. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet_header.rs +138 -0
  164. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/mod.rs +6 -0
  165. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload.rs +30 -0
  166. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload_hash.rs +15 -0
  167. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/test_helper.rs +39 -0
  168. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_dvn_option.rs +57 -0
  169. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_lz_receive_option.rs +50 -0
  170. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_native_drop_option.rs +74 -0
  171. package/contracts/message-libs/message-lib-common/src/tests/worker_options/convert_legacy_options.rs +280 -0
  172. package/contracts/message-libs/message-lib-common/src/tests/worker_options/extract_type_3_options.rs +126 -0
  173. package/contracts/message-libs/message-lib-common/src/tests/worker_options/left_pad_to_bytes32.rs +48 -0
  174. package/contracts/message-libs/message-lib-common/src/tests/worker_options/mod.rs +7 -0
  175. package/contracts/message-libs/message-lib-common/src/tests/worker_options/split_worker_options.rs +139 -0
  176. package/contracts/message-libs/message-lib-common/src/worker_options.rs +31 -1
  177. package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +2 -2
  178. package/contracts/message-libs/treasury/src/errors.rs +0 -1
  179. package/contracts/message-libs/treasury/src/lib.rs +3 -3
  180. package/contracts/message-libs/treasury/src/storage.rs +2 -0
  181. package/contracts/message-libs/treasury/src/treasury.rs +12 -13
  182. package/contracts/message-libs/uln-302/Cargo.toml +1 -1
  183. package/contracts/message-libs/uln-302/src/errors.rs +0 -5
  184. package/contracts/message-libs/uln-302/src/events.rs +5 -6
  185. package/contracts/message-libs/uln-302/src/receive_uln.rs +24 -54
  186. package/contracts/message-libs/uln-302/src/send_uln.rs +89 -135
  187. package/contracts/message-libs/uln-302/src/storage.rs +5 -5
  188. package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +5 -7
  189. package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +3 -3
  190. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +6 -9
  191. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +2 -2
  192. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +3 -3
  193. package/contracts/message-libs/uln-302/src/tests/setup.rs +9 -0
  194. package/contracts/message-libs/uln-302/src/tests/testing_utils.rs +5 -0
  195. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_receive_uln_config.rs +1 -2
  196. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_send_uln_config.rs +1 -2
  197. package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +37 -55
  198. package/contracts/message-libs/uln-302/src/uln302.rs +8 -5
  199. package/contracts/oapps/counter/src/counter.rs +0 -1
  200. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +306 -224
  201. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +0 -1
  202. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +0 -1
  203. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +0 -1
  204. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +0 -1
  205. package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_core.rs +1 -0
  206. package/contracts/oapps/oft/integration-tests/setup.rs +10 -3
  207. package/contracts/oapps/oft/integration-tests/utils.rs +1 -1
  208. package/contracts/oapps/oft/src/default_oft_impl.rs +9 -3
  209. package/contracts/oapps/oft/src/extensions/oft_fee.rs +5 -5
  210. package/contracts/oapps/oft/src/extensions/pausable.rs +1 -1
  211. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +18 -18
  212. package/contracts/oapps/oft/src/oft.rs +9 -9
  213. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +1 -1
  214. package/contracts/oapps/oft/src/tests/extensions/setup.rs +26 -11
  215. package/contracts/oapps/oft/src/tests/extensions/test_rate_limiter.rs +1 -1
  216. package/contracts/oapps/oft/src/tests/test_send.rs +4 -4
  217. package/contracts/oapps/oft/src/tests/test_utils.rs +93 -74
  218. package/contracts/oapps/oft-std/Cargo.toml +6 -0
  219. package/contracts/oapps/oft-std/integration-tests/extensions/mod.rs +3 -0
  220. package/contracts/oapps/oft-std/integration-tests/extensions/test_oft_fee.rs +157 -0
  221. package/contracts/oapps/oft-std/integration-tests/extensions/test_pausable.rs +162 -0
  222. package/contracts/oapps/oft-std/integration-tests/extensions/test_rate_limiter.rs +186 -0
  223. package/contracts/oapps/oft-std/integration-tests/mod.rs +3 -0
  224. package/contracts/oapps/oft-std/integration-tests/setup.rs +245 -0
  225. package/contracts/oapps/oft-std/integration-tests/utils.rs +427 -0
  226. package/contracts/oapps/oft-std/src/lib.rs +12 -1
  227. package/contracts/oapps/oft-std/src/oft.rs +122 -25
  228. package/contracts/upgrader/Cargo.toml +19 -0
  229. package/contracts/upgrader/src/lib.rs +96 -0
  230. package/contracts/upgrader/src/tests/mod.rs +1 -0
  231. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract1.wasm +0 -0
  232. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract2.wasm +0 -0
  233. package/contracts/upgrader/src/tests/test_upgrader.rs +120 -0
  234. package/contracts/utils/src/errors.rs +6 -1
  235. package/contracts/utils/src/lib.rs +2 -1
  236. package/contracts/utils/src/ownable.rs +49 -61
  237. package/contracts/utils/src/tests/mod.rs +3 -1
  238. package/contracts/utils/src/tests/option_ext.rs +21 -0
  239. package/contracts/utils/src/tests/ownable.rs +10 -69
  240. package/contracts/utils/src/tests/ttl_configurable.rs +596 -0
  241. package/contracts/utils/src/tests/upgradeable.rs +288 -0
  242. package/contracts/utils/src/{ttl.rs → ttl_configurable.rs} +67 -52
  243. package/contracts/utils/src/upgradeable.rs +54 -0
  244. package/contracts/workers/dvn/Cargo.toml +1 -1
  245. package/contracts/workers/dvn/src/auth.rs +21 -32
  246. package/contracts/workers/dvn/src/dvn.rs +40 -3
  247. package/contracts/workers/dvn/src/errors.rs +1 -0
  248. package/contracts/workers/dvn/src/multisig.rs +10 -6
  249. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +2 -2
  250. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +4 -4
  251. package/contracts/workers/dvn-fee-lib/Cargo.toml +1 -2
  252. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +46 -14
  253. package/contracts/workers/dvn-fee-lib/src/errors.rs +3 -2
  254. package/contracts/workers/dvn-fee-lib/src/lib.rs +5 -11
  255. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +30 -16
  256. package/contracts/workers/executor/src/executor.rs +16 -2
  257. package/contracts/workers/executor-fee-lib/src/errors.rs +9 -7
  258. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +154 -119
  259. package/contracts/workers/executor-helper/Cargo.toml +0 -5
  260. package/contracts/workers/executor-helper/src/lib.rs +1 -7
  261. package/contracts/workers/price-feed/Cargo.toml +0 -1
  262. package/contracts/workers/price-feed/src/errors.rs +3 -2
  263. package/contracts/workers/price-feed/src/lib.rs +5 -6
  264. package/contracts/workers/price-feed/src/price_feed.rs +39 -17
  265. package/contracts/workers/worker/Cargo.toml +4 -0
  266. package/contracts/workers/worker/src/interfaces/price_feed.rs +3 -3
  267. package/contracts/workers/worker/src/lib.rs +2 -2
  268. package/contracts/workers/worker/src/tests/mod.rs +4 -0
  269. package/contracts/workers/worker/src/tests/setup.rs +147 -0
  270. package/contracts/workers/worker/src/tests/worker.rs +501 -0
  271. package/contracts/workers/worker/src/worker.rs +10 -16
  272. package/package.json +3 -3
  273. package/sdk/dist/generated/bml.d.ts +40 -30
  274. package/sdk/dist/generated/bml.js +16 -11
  275. package/sdk/dist/generated/counter.d.ts +168 -134
  276. package/sdk/dist/generated/counter.js +26 -21
  277. package/sdk/dist/generated/dvn.d.ts +1932 -0
  278. package/sdk/dist/generated/dvn.js +288 -0
  279. package/sdk/dist/generated/dvn_fee_lib.d.ts +615 -0
  280. package/sdk/dist/generated/dvn_fee_lib.js +123 -0
  281. package/sdk/dist/generated/endpoint.d.ts +75 -41
  282. package/sdk/dist/generated/endpoint.js +22 -17
  283. package/sdk/dist/generated/executor.d.ts +1809 -0
  284. package/sdk/dist/generated/executor.js +269 -0
  285. package/sdk/dist/generated/executor_fee_lib.d.ts +999 -0
  286. package/sdk/dist/generated/executor_fee_lib.js +208 -0
  287. package/sdk/dist/generated/executor_helper.d.ts +869 -0
  288. package/sdk/dist/generated/executor_helper.js +187 -0
  289. package/sdk/dist/generated/oft_std.d.ts +1544 -0
  290. package/sdk/dist/generated/oft_std.js +271 -0
  291. package/sdk/dist/generated/price_feed.d.ts +1002 -0
  292. package/sdk/dist/generated/price_feed.js +170 -0
  293. package/sdk/dist/generated/sml.d.ts +75 -41
  294. package/sdk/dist/generated/sml.js +22 -17
  295. package/sdk/dist/generated/uln302.d.ts +79 -60
  296. package/sdk/dist/generated/uln302.js +37 -37
  297. package/sdk/dist/generated/upgrader.d.ts +70 -0
  298. package/sdk/dist/generated/upgrader.js +19 -0
  299. package/sdk/dist/index.d.ts +8 -0
  300. package/sdk/dist/index.js +11 -0
  301. package/sdk/package.json +4 -3
  302. package/sdk/src/index.ts +13 -0
  303. package/sdk/test/index.test.ts +0 -1
  304. package/sdk/test/oft.test.ts +12 -23
  305. package/sdk/test/suites/testUpgradeable.ts +169 -0
  306. package/sdk/test/upgrader.test.ts +309 -0
  307. package/tools/ts-bindings-gen/src/main.rs +11 -1
  308. package/contracts/endpoint-v2/src/tests/messaging_channel/clear.rs +0 -316
  309. package/contracts/endpoint-v2/src/tests/messaging_channel/internal.rs +0 -388
  310. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +0 -162
  311. package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +0 -319
  312. package/contracts/utils/src/tests/ttl.rs +0 -421
  313. /package/contracts/{oapp-macros → oapps/oapp-macros}/Cargo.toml +0 -0
  314. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/lib.rs +0 -0
  315. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_full.rs +0 -0
  316. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_options_type3.rs +0 -0
  317. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_receiver.rs +0 -0
  318. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_sender.rs +0 -0
  319. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/util.rs +0 -0
@@ -1,10 +1,9 @@
1
- use crate::{events::DelegateSet, storage, 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
  use utils::testing_utils::assert_event;
7
3
 
4
+ use crate::{events::DelegateSet, tests::endpoint_setup::setup};
5
+
6
+ // Setting delegate (state update + event emission)
8
7
  #[test]
9
8
  fn test_set_delegate() {
10
9
  let context = setup();
@@ -14,30 +13,105 @@ fn test_set_delegate() {
14
13
  let oapp = Address::generate(env);
15
14
  let delegate = Address::generate(env);
16
15
 
17
- // Verify initial state - delegate should not be set
18
- let initial_delegate = env.as_contract(&endpoint_client.address, || storage::EndpointStorage::delegate(env, &oapp));
16
+ // Verify initial state - delegate should not be set.
17
+ let initial_delegate = endpoint_client.delegate(&oapp);
19
18
  assert_eq!(initial_delegate, None, "Initial delegate should be None");
20
19
 
21
20
  let delegate_option = Some(delegate.clone());
22
- env.mock_auths(&[MockAuth {
23
- address: &oapp,
24
- invoke: &MockAuthInvoke {
25
- contract: &endpoint_client.address,
26
- fn_name: "set_delegate",
27
- args: (&oapp, &delegate_option).into_val(env),
28
- sub_invokes: &[],
29
- },
30
- }]);
31
- endpoint_client.set_delegate(&oapp, &delegate_option);
21
+ context.set_delegate_with_auth(&oapp, &delegate_option);
32
22
 
33
- // Assert event was published
23
+ // Verify event emission.
34
24
  assert_event(env, &endpoint_client.address, DelegateSet { oapp: oapp.clone(), delegate: Some(delegate.clone()) });
35
25
 
36
- // Verify delegate via public interface
26
+ // Verify state update via public interface.
37
27
  let actual_delegate = endpoint_client.delegate(&oapp);
38
28
  assert_eq!(actual_delegate, Some(delegate.clone()), "Delegate should be set");
29
+ }
30
+
31
+ #[test]
32
+ fn test_set_delegate_overwrites_existing_delegate() {
33
+ let context = setup();
34
+ let env = &context.env;
35
+ let endpoint_client = &context.endpoint_client;
36
+
37
+ let oapp = Address::generate(env);
38
+ let delegate_a = Address::generate(env);
39
+ let delegate_b = Address::generate(env);
40
+
41
+ // Set delegate to A.
42
+ let delegate_a_opt = Some(delegate_a.clone());
43
+ context.set_delegate_with_auth(&oapp, &delegate_a_opt);
44
+ assert_event(env, &endpoint_client.address, DelegateSet { oapp: oapp.clone(), delegate: Some(delegate_a.clone()) });
45
+ assert_eq!(endpoint_client.delegate(&oapp), Some(delegate_a.clone()));
46
+
47
+ // Overwrite delegate with B.
48
+ let delegate_b_opt = Some(delegate_b.clone());
49
+ context.set_delegate_with_auth(&oapp, &delegate_b_opt);
50
+ assert_event(env, &endpoint_client.address, DelegateSet { oapp: oapp.clone(), delegate: Some(delegate_b.clone()) });
51
+ assert_eq!(endpoint_client.delegate(&oapp), Some(delegate_b.clone()));
52
+ }
53
+
54
+ #[test]
55
+ fn test_set_delegate_is_idempotent_for_same_value() {
56
+ let context = setup();
57
+ let env = &context.env;
58
+ let endpoint_client = &context.endpoint_client;
59
+
60
+ let oapp = Address::generate(env);
61
+ let delegate = Address::generate(env);
62
+ let delegate_opt = Some(delegate.clone());
63
+
64
+ // Setting the same delegate twice should succeed and keep state unchanged.
65
+ context.set_delegate_with_auth(&oapp, &delegate_opt);
66
+ context.set_delegate_with_auth(&oapp, &delegate_opt);
67
+
68
+ assert_eq!(endpoint_client.delegate(&oapp), Some(delegate.clone()));
69
+ }
39
70
 
40
- // Assert storage change directly
41
- let stored_delegate = env.as_contract(&endpoint_client.address, || storage::EndpointStorage::delegate(env, &oapp));
42
- assert_eq!(stored_delegate, Some(delegate.clone()), "Storage should contain the delegate address");
71
+ // Removing delegate (state update + event emission)
72
+ #[test]
73
+ fn test_set_delegate_remove() {
74
+ let context = setup();
75
+ let env = &context.env;
76
+ let endpoint_client = &context.endpoint_client;
77
+
78
+ let oapp = Address::generate(env);
79
+ let delegate = Address::generate(env);
80
+
81
+ // First set a delegate.
82
+ let delegate_option = Some(delegate.clone());
83
+ context.set_delegate_with_auth(&oapp, &delegate_option);
84
+
85
+ // Verify delegate was set.
86
+ let stored_delegate = endpoint_client.delegate(&oapp);
87
+ assert_eq!(stored_delegate, Some(delegate.clone()));
88
+
89
+ // Now remove the delegate.
90
+ let remove_option = None::<Address>;
91
+ context.set_delegate_with_auth(&oapp, &remove_option);
92
+
93
+ // Verify event emission.
94
+ assert_event(env, &endpoint_client.address, DelegateSet { oapp: oapp.clone(), delegate: None });
95
+
96
+ // Verify state update via public interface.
97
+ let stored_delegate_after = endpoint_client.delegate(&oapp);
98
+ assert_eq!(stored_delegate_after, None, "Delegate should be removed");
99
+ }
100
+
101
+ // Authorization (only oapp)
102
+ #[test]
103
+ #[should_panic(expected = "Error(Auth, InvalidAction)")]
104
+ fn test_set_delegate_unauthorized() {
105
+ let context = setup();
106
+ let env = &context.env;
107
+ let endpoint_client = &context.endpoint_client;
108
+
109
+ let oapp = Address::generate(env);
110
+ let unauthorized_caller = Address::generate(env);
111
+ let delegate = Address::generate(env);
112
+
113
+ let delegate_option = Some(delegate);
114
+ // Unauthorized caller must not be able to set delegate for an OApp.
115
+ context.mock_auth(&unauthorized_caller, "set_delegate", (&oapp, &delegate_option));
116
+ endpoint_client.set_delegate(&oapp, &delegate_option);
43
117
  }
@@ -1,6 +1,15 @@
1
- use crate::{events::ZROSet, storage, tests::endpoint_setup::setup};
1
+ use soroban_sdk::{testutils::Address as _, Address};
2
2
  use utils::testing_utils::assert_event;
3
3
 
4
+ use crate::{events::ZROSet, tests::endpoint_setup::setup, tests::endpoint_setup::TestSetup};
5
+
6
+ // Helpers
7
+ fn set_zro_with_auth(context: &TestSetup, zro: &Address) {
8
+ context.mock_owner_auth("set_zro", (zro,));
9
+ context.endpoint_client.set_zro(zro);
10
+ }
11
+
12
+ // Success path (state update + event emission)
4
13
  #[test]
5
14
  fn test_set_zro() {
6
15
  let context = setup();
@@ -8,20 +17,63 @@ fn test_set_zro() {
8
17
  let endpoint_client = &context.endpoint_client;
9
18
 
10
19
  // Verify initial state - ZRO should not be set
11
- let initial_zro = env.as_contract(&endpoint_client.address, || storage::EndpointStorage::zro(env));
20
+ let initial_zro = endpoint_client.zro();
12
21
  assert_eq!(initial_zro, None, "Initial ZRO should be None");
13
22
 
14
- context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
15
- endpoint_client.set_zro(&context.zro_token_client.address);
23
+ set_zro_with_auth(&context, &context.zro_token_client.address);
16
24
 
17
- // Assert event was published
25
+ // Verify event emission.
18
26
  assert_event(env, &endpoint_client.address, ZROSet { zro: context.zro_token_client.address.clone() });
19
27
 
20
- // Verify ZRO token is set via public interface
28
+ // Verify state update via public interface.
21
29
  let zro_token = endpoint_client.zro();
22
30
  assert_eq!(zro_token, Some(context.zro_token_client.address.clone()));
31
+ }
32
+
33
+ #[test]
34
+ fn test_set_zro_overwrites_existing_zro() {
35
+ let context = setup();
36
+ let env = &context.env;
37
+ let endpoint_client = &context.endpoint_client;
38
+
39
+ // Create a second token address to overwrite with.
40
+ let owner = context.owner.clone();
41
+ let zro_token_2 = env.register_stellar_asset_contract_v2(owner);
42
+ let zro_addr_2 = zro_token_2.address();
43
+
44
+ // Set ZRO to the first address.
45
+ set_zro_with_auth(&context, &context.zro_token_client.address);
46
+ assert_event(env, &endpoint_client.address, ZROSet { zro: context.zro_token_client.address.clone() });
47
+ assert_eq!(endpoint_client.zro(), Some(context.zro_token_client.address.clone()));
48
+
49
+ // Overwrite ZRO with the second address.
50
+ set_zro_with_auth(&context, &zro_addr_2);
51
+ assert_event(env, &endpoint_client.address, ZROSet { zro: zro_addr_2.clone() });
52
+ assert_eq!(endpoint_client.zro(), Some(zro_addr_2));
53
+ }
54
+
55
+ #[test]
56
+ fn test_set_zro_is_idempotent_for_same_value() {
57
+ let context = setup();
58
+ let endpoint_client = &context.endpoint_client;
59
+
60
+ // Setting the same ZRO twice should succeed and keep state unchanged.
61
+ set_zro_with_auth(&context, &context.zro_token_client.address);
62
+ set_zro_with_auth(&context, &context.zro_token_client.address);
63
+
64
+ assert_eq!(endpoint_client.zro(), Some(context.zro_token_client.address.clone()));
65
+ }
23
66
 
24
- // Assert storage change directly
25
- let stored_zro = env.as_contract(&endpoint_client.address, || storage::EndpointStorage::zro(env));
26
- assert_eq!(stored_zro, Some(context.zro_token_client.address.clone()), "Storage should contain the ZRO address");
67
+ // Authorization (only owner)
68
+ #[test]
69
+ #[should_panic(expected = "Error(Auth, InvalidAction)")]
70
+ fn test_set_zro_unauthorized() {
71
+ let context = setup();
72
+ let env = &context.env;
73
+ let endpoint_client = &context.endpoint_client;
74
+ let unauthorized = soroban_sdk::Address::generate(env);
75
+
76
+ // Unauthorized caller must not be able to set ZRO.
77
+ context.mock_auth(&unauthorized, "set_zro", (&context.zro_token_client.address,));
78
+ endpoint_client.set_zro(&context.zro_token_client.address);
27
79
  }
@@ -1,7 +1,7 @@
1
- use crate::tests::endpoint_setup::setup;
2
1
  use soroban_sdk::testutils::Address as _;
3
- use utils::ownable::DefaultOwnableStorage;
2
+ use utils::ownable::OwnableStorage;
4
3
 
4
+ use crate::tests::endpoint_setup::setup;
5
5
  #[test]
6
6
  fn test_transfer_ownership() {
7
7
  let context = setup();
@@ -14,7 +14,7 @@ fn test_transfer_ownership() {
14
14
  assert_eq!(initial_owner, Some(context.owner.clone()));
15
15
 
16
16
  // Verify initial owner in storage directly
17
- let initial_owner = env.as_contract(&endpoint_client.address, || DefaultOwnableStorage::owner(env));
17
+ let initial_owner = env.as_contract(&endpoint_client.address, || OwnableStorage::owner(env));
18
18
  assert_eq!(initial_owner, Some(context.owner.clone()), "Initial owner should be in storage");
19
19
 
20
20
  context.mock_owner_auth("transfer_ownership", (&new_owner,));
@@ -25,6 +25,6 @@ fn test_transfer_ownership() {
25
25
  assert_eq!(owner, Some(new_owner.clone()));
26
26
 
27
27
  // Assert storage change directly
28
- let stored_owner = env.as_contract(&endpoint_client.address, || DefaultOwnableStorage::owner(env));
28
+ let stored_owner = env.as_contract(&endpoint_client.address, || OwnableStorage::owner(env));
29
29
  assert_eq!(stored_owner, Some(new_owner), "Storage should contain the new owner");
30
30
  }
@@ -1,10 +1,10 @@
1
- use crate::tests::endpoint_setup::setup;
2
1
  use soroban_sdk::{testutils::Address as _, Address};
3
2
  use utils::{
4
- errors::TtlError,
5
- ttl::{TtlConfig, TtlConfigStorage},
3
+ errors::TtlConfigurableError,
4
+ ttl_configurable::{TtlConfig, TtlConfigStorage},
6
5
  };
7
6
 
7
+ use crate::tests::endpoint_setup::setup;
8
8
  fn ttl_defaults(env: &soroban_sdk::Env, contract: &Address) -> (TtlConfig, TtlConfig) {
9
9
  env.as_contract(contract, || {
10
10
  (
@@ -72,7 +72,7 @@ fn test_panic_set_ttl_configs_invalid_instance_range() {
72
72
 
73
73
  assert_eq!(
74
74
  endpoint.try_set_ttl_configs(&instance_config, &persistent_config).unwrap_err().unwrap(),
75
- TtlError::InvalidTtlConfig.into()
75
+ TtlConfigurableError::InvalidTtlConfig.into()
76
76
  );
77
77
  }
78
78
 
@@ -92,14 +92,11 @@ fn test_panic_set_ttl_configs_exceeds_max_ttl() {
92
92
 
93
93
  assert_eq!(
94
94
  endpoint.try_set_ttl_configs(&instance_config, &persistent_config).unwrap_err().unwrap(),
95
- TtlError::InvalidTtlConfig.into()
95
+ TtlConfigurableError::InvalidTtlConfig.into()
96
96
  );
97
97
  }
98
98
 
99
- // ============================================================================
100
99
  // Frozen TTL Config Tests
101
- // ============================================================================
102
-
103
100
  #[test]
104
101
  fn test_is_ttl_configs_frozen_default_false() {
105
102
  let context = setup();
@@ -144,7 +141,7 @@ fn test_freeze_ttl_configs_already_frozen() {
144
141
 
145
142
  // Try to freeze again
146
143
  context.mock_owner_auth("freeze_ttl_configs", ());
147
- assert_eq!(endpoint.try_freeze_ttl_configs().unwrap_err().unwrap(), TtlError::TtlConfigAlreadyFrozen.into());
144
+ assert_eq!(endpoint.try_freeze_ttl_configs().unwrap_err().unwrap(), TtlConfigurableError::TtlConfigAlreadyFrozen.into());
148
145
  }
149
146
 
150
147
  #[test]
@@ -163,7 +160,7 @@ fn test_set_ttl_configs_fails_when_frozen() {
163
160
  context.mock_owner_auth("set_ttl_configs", (&instance_config, &persistent_config));
164
161
  assert_eq!(
165
162
  endpoint.try_set_ttl_configs(&instance_config, &persistent_config).unwrap_err().unwrap(),
166
- TtlError::TtlConfigFrozen.into()
163
+ TtlConfigurableError::TtlConfigFrozen.into()
167
164
  );
168
165
  }
169
166
 
@@ -197,6 +194,6 @@ fn test_set_ttl_configs_then_freeze() {
197
194
  context.mock_owner_auth("set_ttl_configs", (&new_instance_config, &persistent_config));
198
195
  assert_eq!(
199
196
  endpoint.try_set_ttl_configs(&new_instance_config, &persistent_config).unwrap_err().unwrap(),
200
- TtlError::TtlConfigFrozen.into()
197
+ TtlConfigurableError::TtlConfigFrozen.into()
201
198
  );
202
199
  }
@@ -1,59 +1,110 @@
1
- use crate::{tests::endpoint_setup::setup, Origin};
2
1
  use soroban_sdk::{testutils::Address as _, BytesN};
3
2
 
3
+ use crate::{tests::endpoint_setup::setup, tests::endpoint_setup::TestSetup, Origin};
4
+
5
+ fn skip_with_auth(context: &TestSetup, receiver: &soroban_sdk::Address, src_eid: u32, sender: &BytesN<32>, nonce: u64) {
6
+ // `skip` requires authorization from `caller` (the receiver or its delegate).
7
+ context.mock_auth(receiver, "skip", (receiver, receiver, &src_eid, sender, &nonce));
8
+ context.endpoint_client.skip(receiver, receiver, &src_eid, sender, &nonce);
9
+ }
10
+
11
+ fn verify_with_auth(
12
+ context: &TestSetup,
13
+ receive_lib: &soroban_sdk::Address,
14
+ origin: &Origin,
15
+ receiver: &soroban_sdk::Address,
16
+ payload_hash: &BytesN<32>,
17
+ ) {
18
+ // `verify` requires authorization from `receive_lib`.
19
+ context.mock_auth(receive_lib, "verify", (receive_lib, origin, receiver, payload_hash));
20
+ context.endpoint_client.verify(receive_lib, origin, receiver, payload_hash);
21
+ }
22
+
23
+ // New path (lazy nonce == 0) => verifiable when origin.nonce > lazy nonce
4
24
  #[test]
5
- fn test_verifiable_with_new_path() {
25
+ fn test_verifiable_new_path_nonce_1_true() {
6
26
  let context = setup();
7
27
  let endpoint_client = &context.endpoint_client;
8
28
  let receiver = soroban_sdk::Address::generate(&context.env);
9
- let src_eid = 2;
29
+ let src_eid = 2u32;
10
30
  let sender = BytesN::from_array(&context.env, &[1u8; 32]);
11
31
  let origin = Origin { src_eid, sender, nonce: 1 };
12
32
 
13
- // For a new path (lazy nonce is 0), nonce 1 > 0 should be verifiable
33
+ // For a new path (lazy nonce is 0), nonce 1 > 0 should be verifiable.
14
34
  let result = endpoint_client.verifiable(&origin, &receiver);
15
35
  assert!(result);
16
36
  }
17
37
 
38
+ // Established path (lazy nonce > 0) => verifiable when origin.nonce > lazy nonce
18
39
  #[test]
19
- fn test_verifiable_with_higher_nonce() {
40
+ fn test_verifiable_after_skip_nonce_gt_lazy_true() {
20
41
  let context = setup();
42
+ let env = &context.env;
21
43
  let endpoint_client = &context.endpoint_client;
22
- let receiver = soroban_sdk::Address::generate(&context.env);
23
- let src_eid = 2;
24
- let sender = BytesN::from_array(&context.env, &[1u8; 32]);
25
- let origin = Origin { src_eid, sender, nonce: 10 };
44
+ let receiver = soroban_sdk::Address::generate(env);
45
+ let src_eid = 2u32;
46
+ let sender = BytesN::from_array(env, &[1u8; 32]);
47
+
48
+ // Establish the path by skipping nonce 1.
49
+ skip_with_auth(&context, &receiver, src_eid, &sender, 1);
26
50
 
27
- // For a new path (lazy nonce is 0), nonce 10 > 0 should be verifiable
51
+ // Now lazy_nonce = 1, nonce 2 > 1 should be verifiable.
52
+ let origin = Origin { src_eid, sender, nonce: 2 };
28
53
  let result = endpoint_client.verifiable(&origin, &receiver);
29
54
  assert!(result);
30
55
  }
31
56
 
57
+ // Nonce <= lazy is still verifiable when inbound payload hash exists
32
58
  #[test]
33
- fn test_verifiable_after_skip() {
59
+ fn test_verifiable_true_when_nonce_leq_lazy_but_payload_hash_exists() {
34
60
  let context = setup();
35
61
  let env = &context.env;
36
62
  let endpoint_client = &context.endpoint_client;
37
- let receiver = soroban_sdk::Address::generate(env);
38
- let src_eid = 2;
63
+
64
+ let src_eid = 2u32;
39
65
  let sender = BytesN::from_array(env, &[1u8; 32]);
66
+ let receiver = soroban_sdk::Address::generate(env);
40
67
 
41
- // Skip nonce 1
42
- use soroban_sdk::{testutils::MockAuth, testutils::MockAuthInvoke, IntoVal};
43
- env.mock_auths(&[MockAuth {
44
- address: &receiver,
45
- invoke: &MockAuthInvoke {
46
- contract: &endpoint_client.address,
47
- fn_name: "skip",
48
- args: (&receiver, &receiver, &src_eid, &sender, &1u64).into_val(env),
49
- sub_invokes: &[],
50
- },
51
- }]);
52
- endpoint_client.skip(&receiver, &receiver, &src_eid, &sender, &1);
53
-
54
- // Now lazy_nonce = 1, nonce 2 > 1 should be verifiable
55
- let origin = Origin { src_eid, sender, nonce: 2 };
56
- let result = endpoint_client.verifiable(&origin, &receiver);
57
- assert!(result);
68
+ // Setup receive library (needed to store a payload hash via verify).
69
+ let receive_lib = context.setup_default_receive_lib(src_eid, 0);
70
+
71
+ // Establish the path by skipping nonce 1 (lazy becomes 1).
72
+ skip_with_auth(&context, &receiver, src_eid, &sender, 1);
73
+
74
+ // Verify nonce 2 (allowed because 2 > lazy 1) which stores inbound payload hash for nonce 2.
75
+ let origin2 = Origin { src_eid, sender: sender.clone(), nonce: 2u64 };
76
+ let payload_hash2 = BytesN::from_array(env, &[0x33u8; 32]);
77
+ verify_with_auth(&context, &receive_lib, &origin2, &receiver, &payload_hash2);
78
+
79
+ // Advance lazy nonce to 3 while keeping payload hash for 2 (skip sets lazy nonce only).
80
+ skip_with_auth(&context, &receiver, src_eid, &sender, 3);
81
+
82
+ // Sanity: lazy nonce was advanced, and the payload hash for nonce 2 still exists.
83
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), 3);
84
+ assert!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &2u64).is_some());
85
+
86
+ // Now nonce 2 <= lazy 3, but payload hash exists -> verifiable should be true.
87
+ assert!(endpoint_client.verifiable(&origin2, &receiver));
58
88
  }
59
89
 
90
+ // Boundary case (nonce == lazy)
91
+ #[test]
92
+ fn test_verifiable_nonce_eq_lazy_false_without_payload_hash() {
93
+ let context = setup();
94
+ let env = &context.env;
95
+ let endpoint_client = &context.endpoint_client;
96
+
97
+ let src_eid = 2u32;
98
+ let sender = BytesN::from_array(env, &[1u8; 32]);
99
+ let receiver = soroban_sdk::Address::generate(env);
100
+
101
+ // Set lazy nonce to 2 without storing any payload hashes.
102
+ skip_with_auth(&context, &receiver, src_eid, &sender, 1);
103
+ skip_with_auth(&context, &receiver, src_eid, &sender, 2);
104
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), 2);
105
+
106
+ // nonce == lazy and payload hash missing -> verifiable should be false.
107
+ let origin2 = Origin { src_eid, sender: sender.clone(), nonce: 2u64 };
108
+ assert!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &2u64).is_none());
109
+ assert!(!endpoint_client.verifiable(&origin2, &receiver));
110
+ }