@layerzerolabs/protocol-stellar-v2 0.2.12 → 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,114 +1,131 @@
1
- use soroban_sdk::{testutils::Address as _, Address, BytesN, IntoVal};
2
-
3
- use crate::{events::InboundNonceSkipped, storage, tests::endpoint_setup::setup};
1
+ use soroban_sdk::{testutils::Address as _, Address, BytesN};
4
2
  use utils::testing_utils::assert_event;
5
3
 
4
+ use crate::{
5
+ errors::EndpointError, events::InboundNonceSkipped, storage, tests::endpoint_setup::setup,
6
+ tests::endpoint_setup::TestSetup,
7
+ };
8
+
9
+ fn skip_with_auth(
10
+ context: &TestSetup,
11
+ caller: &Address,
12
+ receiver: &Address,
13
+ src_eid: u32,
14
+ sender: &BytesN<32>,
15
+ nonce: u64,
16
+ ) {
17
+ context.mock_auth(caller, "skip", (caller, receiver, &src_eid, sender, &nonce));
18
+ context.endpoint_client.skip(caller, receiver, &src_eid, sender, &nonce);
19
+ }
20
+
21
+ // Authorization (receiver or delegate(receiver) must authorize)
22
+ #[test]
23
+ fn test_skip_unauthorized() {
24
+ let context = setup();
25
+ let env = &context.env;
26
+ let endpoint_client = &context.endpoint_client;
27
+
28
+ let receiver = Address::generate(env);
29
+ let unauthorized = Address::generate(env);
30
+ let src_eid = 2;
31
+ let sender = BytesN::from_array(env, &[1u8; 32]);
32
+ let nonce = 1u64;
33
+
34
+ // Unauthorized should fail before require_auth, so no mock_auth is needed.
35
+ let result = endpoint_client.try_skip(&unauthorized, &receiver, &src_eid, &sender, &nonce);
36
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::Unauthorized.into());
37
+ }
38
+
39
+ #[test]
40
+ #[should_panic(expected = "Error(Auth, InvalidAction)")]
41
+ fn test_skip_requires_auth_even_when_caller_is_receiver() {
42
+ let context = setup();
43
+ let env = &context.env;
44
+ let endpoint_client = &context.endpoint_client;
45
+
46
+ let receiver = Address::generate(env);
47
+ let src_eid = 2;
48
+ let sender = BytesN::from_array(env, &[1u8; 32]);
49
+ let nonce = 1u64;
50
+
51
+ // No mock_auth here: require_oapp_auth passes the (caller == receiver) check,
52
+ // then panics at caller.require_auth().
53
+ endpoint_client.skip(&receiver, &receiver, &src_eid, &sender, &nonce);
54
+ }
55
+
56
+ // Successful skip updates inbound/lazy nonces and emits InboundNonceSkipped
6
57
  #[test]
7
58
  fn test_skip_success() {
8
- let test_setup = setup();
9
- let env = &test_setup.env;
10
- let endpoint_client = &test_setup.endpoint_client;
59
+ let context = setup();
60
+ let env = &context.env;
61
+ let endpoint_client = &context.endpoint_client;
11
62
 
12
63
  let receiver = Address::generate(env);
13
64
  let src_eid = 2;
14
65
  let sender = BytesN::from_array(env, &[1u8; 32]);
15
66
  let nonce = 1;
16
67
 
17
- // Verify initial state - lazy inbound nonce should be 0
18
- let initial_lazy_nonce = env.as_contract(&endpoint_client.address, || {
19
- storage::EndpointStorage::lazy_inbound_nonce(env, &receiver, src_eid, &sender)
20
- });
68
+ // Verify initial state: lazy inbound nonce should be 0.
69
+ let initial_lazy_nonce = endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender);
21
70
  assert_eq!(initial_lazy_nonce, 0, "Initial lazy inbound nonce should be 0");
22
71
 
23
- // Initially, inbound nonce should be 0
72
+ // Initially, inbound nonce should be 0.
24
73
  let initial_nonce = endpoint_client.inbound_nonce(&receiver, &src_eid, &sender);
25
74
  assert_eq!(initial_nonce, 0);
26
75
 
27
- // Skip nonce 1 (expected nonce is initial_nonce + 1 = 1)
28
- endpoint_client
29
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
30
- address: &receiver,
31
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
32
- contract: &endpoint_client.address,
33
- fn_name: "skip",
34
- args: (&receiver, &receiver, &src_eid, &sender, &nonce).into_val(env),
35
- sub_invokes: &[],
36
- },
37
- }])
38
- .skip(&receiver, &receiver, &src_eid, &sender, &nonce);
39
-
40
- // Verify InboundNonceSkipped event was emitted
76
+ // Skip nonce 1 (expected nonce is initial_nonce + 1 = 1).
77
+ skip_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce);
78
+
79
+ // Verify InboundNonceSkipped event was emitted.
41
80
  assert_event(
42
81
  env,
43
82
  &endpoint_client.address,
44
83
  InboundNonceSkipped { src_eid, sender: sender.clone(), receiver: receiver.clone(), nonce },
45
84
  );
46
85
 
47
- // Verify inbound nonce reflects the skip via public interface
86
+ // Verify inbound nonce reflects the skip via public interface.
48
87
  let updated_nonce = endpoint_client.inbound_nonce(&receiver, &src_eid, &sender);
49
88
  assert_eq!(updated_nonce, nonce);
50
89
 
51
- // Assert storage change directly - lazy inbound nonce was updated
52
- let lazy_nonce = env.as_contract(&endpoint_client.address, || {
53
- storage::EndpointStorage::lazy_inbound_nonce(env, &receiver, src_eid, &sender)
54
- });
55
- assert_eq!(lazy_nonce, nonce, "Storage should contain updated lazy inbound nonce");
90
+ // Verify lazy inbound nonce was updated.
91
+ let lazy_nonce = endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender);
92
+ assert_eq!(lazy_nonce, nonce);
56
93
  }
57
94
 
95
+ // Multiple sequential skips update to the latest nonce
58
96
  #[test]
59
97
  fn test_skip_multiple_nonces() {
60
- let test_setup = setup();
61
- let env = &test_setup.env;
62
- let endpoint_client = &test_setup.endpoint_client;
98
+ let context = setup();
99
+ let env = &context.env;
100
+ let endpoint_client = &context.endpoint_client;
63
101
 
64
102
  let receiver = Address::generate(env);
65
103
  let src_eid = 2;
66
104
  let sender = BytesN::from_array(env, &[1u8; 32]);
67
105
 
68
- // Skip nonce 1
106
+ // Skip nonce 1.
69
107
  let nonce1 = 1;
70
- endpoint_client
71
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
72
- address: &receiver,
73
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
74
- contract: &endpoint_client.address,
75
- fn_name: "skip",
76
- args: (&receiver, &receiver, &src_eid, &sender, &nonce1).into_val(env),
77
- sub_invokes: &[],
78
- },
79
- }])
80
- .skip(&receiver, &receiver, &src_eid, &sender, &nonce1);
81
-
82
- // Skip nonce 2
108
+ skip_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce1);
109
+
110
+ // Skip nonce 2.
83
111
  let nonce2 = 2;
84
- endpoint_client
85
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
86
- address: &receiver,
87
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
88
- contract: &endpoint_client.address,
89
- fn_name: "skip",
90
- args: (&receiver, &receiver, &src_eid, &sender, &nonce2).into_val(env),
91
- sub_invokes: &[],
92
- },
93
- }])
94
- .skip(&receiver, &receiver, &src_eid, &sender, &nonce2);
95
-
96
- // Verify lazy inbound nonce was updated to nonce2
97
- let lazy_nonce = env.as_contract(&endpoint_client.address, || {
98
- storage::EndpointStorage::lazy_inbound_nonce(env, &receiver, src_eid, &sender)
99
- });
112
+ skip_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce2);
113
+
114
+ // Verify lazy inbound nonce was updated to nonce2.
115
+ let lazy_nonce = endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender);
100
116
  assert_eq!(lazy_nonce, nonce2);
101
117
 
102
- // Verify inbound nonce reflects the latest skip
118
+ // Verify inbound nonce reflects the latest skip.
103
119
  let updated_nonce = endpoint_client.inbound_nonce(&receiver, &src_eid, &sender);
104
120
  assert_eq!(updated_nonce, nonce2);
105
121
  }
106
122
 
123
+ // Delegate authorization (delegate(receiver) is allowed)
107
124
  #[test]
108
125
  fn test_skip_with_delegate() {
109
- let test_setup = setup();
110
- let env = &test_setup.env;
111
- let endpoint_client = &test_setup.endpoint_client;
126
+ let context = setup();
127
+ let env = &context.env;
128
+ let endpoint_client = &context.endpoint_client;
112
129
 
113
130
  let receiver = Address::generate(env);
114
131
  let delegate = Address::generate(env);
@@ -116,41 +133,30 @@ fn test_skip_with_delegate() {
116
133
  let sender = BytesN::from_array(env, &[1u8; 32]);
117
134
  let nonce = 1;
118
135
 
119
- // Set delegate for receiver
136
+ // Set delegate for receiver.
120
137
  env.as_contract(&endpoint_client.address, || storage::EndpointStorage::set_delegate(env, &receiver, &delegate));
121
138
 
122
- // Delegate can skip on behalf of receiver
123
- endpoint_client
124
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
125
- address: &delegate,
126
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
127
- contract: &endpoint_client.address,
128
- fn_name: "skip",
129
- args: (&delegate, &receiver, &src_eid, &sender, &nonce).into_val(env),
130
- sub_invokes: &[],
131
- },
132
- }])
133
- .skip(&delegate, &receiver, &src_eid, &sender, &nonce);
134
-
135
- // Verify InboundNonceSkipped event was emitted
139
+ // Delegate can skip on behalf of receiver.
140
+ skip_with_auth(&context, &delegate, &receiver, src_eid, &sender, nonce);
141
+
142
+ // Verify InboundNonceSkipped event was emitted.
136
143
  assert_event(
137
144
  env,
138
145
  &endpoint_client.address,
139
146
  InboundNonceSkipped { src_eid, sender: sender.clone(), receiver: receiver.clone(), nonce },
140
147
  );
141
148
 
142
- // Verify lazy inbound nonce was updated
143
- let lazy_nonce = env.as_contract(&endpoint_client.address, || {
144
- storage::EndpointStorage::lazy_inbound_nonce(env, &receiver, src_eid, &sender)
145
- });
149
+ // Verify lazy inbound nonce was updated.
150
+ let lazy_nonce = endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender);
146
151
  assert_eq!(lazy_nonce, nonce);
147
152
  }
148
153
 
154
+ // Path isolation (receiver/src_eid/sender are isolated)
149
155
  #[test]
150
156
  fn test_skip_different_paths() {
151
- let test_setup = setup();
152
- let env = &test_setup.env;
153
- let endpoint_client = &test_setup.endpoint_client;
157
+ let context = setup();
158
+ let env = &context.env;
159
+ let endpoint_client = &context.endpoint_client;
154
160
 
155
161
  let receiver1 = Address::generate(env);
156
162
  let receiver2 = Address::generate(env);
@@ -160,73 +166,115 @@ fn test_skip_different_paths() {
160
166
  let sender2 = BytesN::from_array(env, &[2u8; 32]);
161
167
  let nonce = 1;
162
168
 
163
- // Skip for different receivers
164
- endpoint_client
165
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
166
- address: &receiver1,
167
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
168
- contract: &endpoint_client.address,
169
- fn_name: "skip",
170
- args: (&receiver1, &receiver1, &src_eid1, &sender1, &nonce).into_val(env),
171
- sub_invokes: &[],
172
- },
173
- }])
174
- .skip(&receiver1, &receiver1, &src_eid1, &sender1, &nonce);
175
-
176
- endpoint_client
177
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
178
- address: &receiver2,
179
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
180
- contract: &endpoint_client.address,
181
- fn_name: "skip",
182
- args: (&receiver2, &receiver2, &src_eid1, &sender1, &nonce).into_val(env),
183
- sub_invokes: &[],
184
- },
185
- }])
186
- .skip(&receiver2, &receiver2, &src_eid1, &sender1, &nonce);
187
-
188
- // Skip for different src_eids
189
- endpoint_client
190
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
191
- address: &receiver1,
192
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
193
- contract: &endpoint_client.address,
194
- fn_name: "skip",
195
- args: (&receiver1, &receiver1, &src_eid2, &sender1, &nonce).into_val(env),
196
- sub_invokes: &[],
197
- },
198
- }])
199
- .skip(&receiver1, &receiver1, &src_eid2, &sender1, &nonce);
200
-
201
- // Skip for different senders
202
- endpoint_client
203
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
204
- address: &receiver1,
205
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
206
- contract: &endpoint_client.address,
207
- fn_name: "skip",
208
- args: (&receiver1, &receiver1, &src_eid1, &sender2, &nonce).into_val(env),
209
- sub_invokes: &[],
210
- },
211
- }])
212
- .skip(&receiver1, &receiver1, &src_eid1, &sender2, &nonce);
213
-
214
- // Verify all paths have independent lazy nonces
215
- let lazy_nonce1 = env.as_contract(&endpoint_client.address, || {
216
- storage::EndpointStorage::lazy_inbound_nonce(env, &receiver1, src_eid1, &sender1)
217
- });
218
- let lazy_nonce2 = env.as_contract(&endpoint_client.address, || {
219
- storage::EndpointStorage::lazy_inbound_nonce(env, &receiver2, src_eid1, &sender1)
220
- });
221
- let lazy_nonce3 = env.as_contract(&endpoint_client.address, || {
222
- storage::EndpointStorage::lazy_inbound_nonce(env, &receiver1, src_eid2, &sender1)
223
- });
224
- let lazy_nonce4 = env.as_contract(&endpoint_client.address, || {
225
- storage::EndpointStorage::lazy_inbound_nonce(env, &receiver1, src_eid1, &sender2)
226
- });
227
-
228
- assert_eq!(lazy_nonce1, nonce);
229
- assert_eq!(lazy_nonce2, nonce);
230
- assert_eq!(lazy_nonce3, nonce);
231
- assert_eq!(lazy_nonce4, nonce);
169
+ // Skip for different receivers.
170
+ skip_with_auth(&context, &receiver1, &receiver1, src_eid1, &sender1, nonce);
171
+ skip_with_auth(&context, &receiver2, &receiver2, src_eid1, &sender1, nonce);
172
+
173
+ // Skip for different src_eids.
174
+ skip_with_auth(&context, &receiver1, &receiver1, src_eid2, &sender1, nonce);
175
+
176
+ // Skip for different senders.
177
+ skip_with_auth(&context, &receiver1, &receiver1, src_eid1, &sender2, nonce);
178
+
179
+ // Verify all paths have independent lazy nonces.
180
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver1, &src_eid1, &sender1), nonce);
181
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver2, &src_eid1, &sender1), nonce);
182
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver1, &src_eid2, &sender1), nonce);
183
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver1, &src_eid1, &sender2), nonce);
184
+ }
185
+
186
+ // Invalid nonce rejection (must match expected nonce)
187
+ #[test]
188
+ fn test_skip_invalid_nonce() {
189
+ let context = setup();
190
+ let env = &context.env;
191
+ let endpoint_client = &context.endpoint_client;
192
+
193
+ let receiver = Address::generate(env);
194
+ let src_eid = 2;
195
+ let sender = BytesN::from_array(env, &[1u8; 32]);
196
+
197
+ // Expected nonce is 1; skipping 2 should fail.
198
+ let invalid_nonce = 2u64;
199
+
200
+ context.mock_auth(&receiver, "skip", (&receiver, &receiver, &src_eid, &sender, &invalid_nonce));
201
+ let result = endpoint_client.try_skip(&receiver, &receiver, &src_eid, &sender, &invalid_nonce);
202
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::InvalidNonce.into());
203
+ }
204
+
205
+ // Next nonce is derived from inbound_nonce (includes verified payload hashes)
206
+ #[test]
207
+ fn test_skip_next_nonce_accounts_for_verified_payload_hashes() {
208
+ let context = setup();
209
+ let env = &context.env;
210
+ let endpoint_client = &context.endpoint_client;
211
+
212
+ let receiver = Address::generate(env);
213
+ let src_eid = 2;
214
+ let sender = BytesN::from_array(env, &[1u8; 32]);
215
+
216
+ // Simulate a verified message at nonce 1.
217
+ let payload_hash_1 = BytesN::from_array(env, &[0xabu8; 32]);
218
+ context.inbound_as_verified(&receiver, src_eid, &sender, 1, &payload_hash_1);
219
+
220
+ // Now inbound_nonce is 1, so the next nonce to skip must be 2 (not 1).
221
+ assert_eq!(endpoint_client.inbound_nonce(&receiver, &src_eid, &sender), 1);
222
+
223
+ context.mock_auth(&receiver, "skip", (&receiver, &receiver, &src_eid, &sender, &1u64));
224
+ let result = endpoint_client.try_skip(&receiver, &receiver, &src_eid, &sender, &1);
225
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::InvalidNonce.into());
226
+
227
+ // Skipping 2 should succeed and advance lazy inbound nonce to 2.
228
+ skip_with_auth(&context, &receiver, &receiver, src_eid, &sender, 2);
229
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), 2);
230
+ assert_eq!(endpoint_client.inbound_nonce(&receiver, &src_eid, &sender), 2);
231
+
232
+ // skip() does not clear any existing payload hashes.
233
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &1), Some(payload_hash_1));
234
+ }
235
+
236
+ // Skipping a missing nonce can "close the gap" and advance inbound_nonce
237
+ #[test]
238
+ fn test_skip_closes_gap_and_advances_inbound_nonce() {
239
+ let context = setup();
240
+ let env = &context.env;
241
+ let endpoint_client = &context.endpoint_client;
242
+
243
+ let receiver = Address::generate(env);
244
+ let src_eid = 2;
245
+ let sender = BytesN::from_array(env, &[1u8; 32]);
246
+
247
+ // Only nonce 2 is verified, so inbound_nonce is still 0 (there is a gap at nonce 1).
248
+ let payload_hash_2 = BytesN::from_array(env, &[0xcdu8; 32]);
249
+ context.inbound_as_verified(&receiver, src_eid, &sender, 2, &payload_hash_2);
250
+ assert_eq!(endpoint_client.inbound_nonce(&receiver, &src_eid, &sender), 0);
251
+
252
+ // Skip nonce 1 to close the gap. This should allow inbound_nonce to advance to 2.
253
+ skip_with_auth(&context, &receiver, &receiver, src_eid, &sender, 1);
254
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), 1);
255
+ assert_eq!(endpoint_client.inbound_nonce(&receiver, &src_eid, &sender), 2);
256
+
257
+ // Payload hash at nonce 2 remains intact.
258
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &2), Some(payload_hash_2));
259
+ }
260
+
261
+ // Repeated skip of the same nonce is rejected
262
+ #[test]
263
+ fn test_skip_rejects_repeated_same_nonce() {
264
+ let context = setup();
265
+ let env = &context.env;
266
+ let endpoint_client = &context.endpoint_client;
267
+
268
+ let receiver = Address::generate(env);
269
+ let src_eid = 2;
270
+ let sender = BytesN::from_array(env, &[1u8; 32]);
271
+
272
+ // Skip nonce 1 successfully.
273
+ skip_with_auth(&context, &receiver, &receiver, src_eid, &sender, 1);
274
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), 1);
275
+
276
+ // Skipping nonce 1 again should fail since the next expected nonce is now 2.
277
+ context.mock_auth(&receiver, "skip", (&receiver, &receiver, &src_eid, &sender, &1u64));
278
+ let result = endpoint_client.try_skip(&receiver, &receiver, &src_eid, &sender, &1);
279
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::InvalidNonce.into());
232
280
  }