@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
@@ -0,0 +1,203 @@
1
+ use soroban_sdk::{testutils::Address as _, Address, Bytes, BytesN};
2
+
3
+ use crate::{
4
+ endpoint_v2::EndpointV2,
5
+ storage,
6
+ tests::endpoint_setup::{setup, TestSetup},
7
+ };
8
+
9
+ // Helpers
10
+ fn inbound_as_verified_from_payload(
11
+ context: &TestSetup,
12
+ receiver: &Address,
13
+ src_eid: u32,
14
+ sender: &BytesN<32>,
15
+ nonce: u64,
16
+ payload: &Bytes,
17
+ ) -> BytesN<32> {
18
+ let env = &context.env;
19
+ let payload_hash = BytesN::from_array(env, &env.crypto().keccak256(payload).to_array());
20
+ context.inbound_as_verified(receiver, src_eid, sender, nonce, &payload_hash);
21
+ payload_hash
22
+ }
23
+
24
+ fn clear_payload(
25
+ context: &TestSetup,
26
+ receiver: &Address,
27
+ src_eid: u32,
28
+ sender: &BytesN<32>,
29
+ nonce: u64,
30
+ payload: &Bytes,
31
+ ) {
32
+ let env = &context.env;
33
+ let endpoint_client = &context.endpoint_client;
34
+ env.as_contract(&endpoint_client.address, || {
35
+ EndpointV2::clear_payload(env, receiver, src_eid, sender, nonce, payload)
36
+ });
37
+ }
38
+
39
+ // Internal clear_payload() removes verified payload and advances lazy nonce
40
+ #[test]
41
+ fn test_clear_payload_success() {
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
+ let payload = Bytes::from_array(env, &[0xaa, 0xbb, 0xcc]);
51
+
52
+ let payload_hash = inbound_as_verified_from_payload(&context, &receiver, src_eid, &sender, nonce, &payload);
53
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce), Some(payload_hash.clone()));
54
+
55
+ clear_payload(&context, &receiver, src_eid, &sender, nonce, &payload);
56
+
57
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce), None);
58
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), nonce);
59
+ }
60
+
61
+ #[test]
62
+ fn test_clear_payload_with_lazy_nonce_update_skipping_intermediate() {
63
+ let context = setup();
64
+ let env = &context.env;
65
+ let endpoint_client = &context.endpoint_client;
66
+
67
+ let receiver = Address::generate(env);
68
+ let src_eid = 2;
69
+ let sender = BytesN::from_array(env, &[1u8; 32]);
70
+
71
+ let payload1 = Bytes::from_array(env, &[0x01]);
72
+ let payload2 = Bytes::from_array(env, &[0x02]);
73
+ let payload3 = Bytes::from_array(env, &[0x03]);
74
+
75
+ let hash1 = inbound_as_verified_from_payload(&context, &receiver, src_eid, &sender, 1, &payload1);
76
+ let hash2 = inbound_as_verified_from_payload(&context, &receiver, src_eid, &sender, 2, &payload2);
77
+ let hash3 = inbound_as_verified_from_payload(&context, &receiver, src_eid, &sender, 3, &payload3);
78
+
79
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), 0);
80
+
81
+ // Clearing nonce 3 advances lazy nonce from 0 -> 3, but only if 1..=3 all exist.
82
+ clear_payload(&context, &receiver, src_eid, &sender, 3, &payload3);
83
+
84
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), 3);
85
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &3), None);
86
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &1), Some(hash1));
87
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &2), Some(hash2));
88
+ let _ = hash3; // hash3 is only used to ensure it was computed and stored for nonce 3.
89
+ }
90
+
91
+ // Clearing a nonce <= lazy nonce does not update lazy nonce
92
+ #[test]
93
+ fn test_clear_payload_does_not_update_lazy_nonce_when_nonce_is_not_greater() {
94
+ let context = setup();
95
+ let env = &context.env;
96
+ let endpoint_client = &context.endpoint_client;
97
+
98
+ let receiver = Address::generate(env);
99
+ let src_eid = 2;
100
+ let sender = BytesN::from_array(env, &[1u8; 32]);
101
+
102
+ // Pretend we already checkpointed to 5.
103
+ env.as_contract(&endpoint_client.address, || {
104
+ storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &5u64)
105
+ });
106
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), 5);
107
+
108
+ // Store a payload hash at nonce 3, then clear it.
109
+ let nonce = 3u64;
110
+ let payload = Bytes::from_array(env, &[0xaa, 0xbb, 0xcc]);
111
+ let payload_hash = inbound_as_verified_from_payload(&context, &receiver, src_eid, &sender, nonce, &payload);
112
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce), Some(payload_hash));
113
+
114
+ clear_payload(&context, &receiver, src_eid, &sender, nonce, &payload);
115
+
116
+ // Clearing an older nonce should not mutate lazy_inbound_nonce.
117
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), 5);
118
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce), None);
119
+ }
120
+
121
+ #[test]
122
+ #[should_panic(expected = "Error(Contract, #19)")] // EndpointError::PayloadHashNotFound
123
+ fn test_clear_payload_payload_hash_not_found_when_nonce_is_checkpointed_but_missing() {
124
+ let context = setup();
125
+ let env = &context.env;
126
+ let endpoint_client = &context.endpoint_client;
127
+
128
+ let receiver = Address::generate(env);
129
+ let src_eid = 2;
130
+ let sender = BytesN::from_array(env, &[1u8; 32]);
131
+
132
+ // nonce <= lazy_nonce, so clear_payload will NOT run the "has_payload for all intermediate nonces" check.
133
+ // It should fail at the payload hash check instead.
134
+ env.as_contract(&endpoint_client.address, || {
135
+ storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &5u64)
136
+ });
137
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), 5);
138
+
139
+ // No payload hash is stored for nonce 3.
140
+ let nonce = 3u64;
141
+ let payload = Bytes::from_array(env, &[0xaa, 0xbb, 0xcc]);
142
+ clear_payload(&context, &receiver, src_eid, &sender, nonce, &payload);
143
+ }
144
+
145
+ #[test]
146
+ #[should_panic(expected = "Error(Contract, #19)")] // EndpointError::PayloadHashNotFound
147
+ fn test_clear_payload_wrong_payload() {
148
+ let context = setup();
149
+ let env = &context.env;
150
+ let endpoint_client = &context.endpoint_client;
151
+
152
+ let receiver = Address::generate(env);
153
+ let src_eid = 2;
154
+ let sender = BytesN::from_array(env, &[1u8; 32]);
155
+ let nonce = 1;
156
+
157
+ let payload = Bytes::from_array(env, &[0xaa, 0xbb, 0xcc]);
158
+ let wrong_payload = Bytes::from_array(env, &[0xdd, 0xee, 0xff]);
159
+
160
+ let payload_hash = inbound_as_verified_from_payload(&context, &receiver, src_eid, &sender, nonce, &payload);
161
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce), Some(payload_hash));
162
+
163
+ clear_payload(&context, &receiver, src_eid, &sender, nonce, &wrong_payload);
164
+ }
165
+
166
+ #[test]
167
+ #[should_panic(expected = "Error(Contract, #10)")] // EndpointError::InvalidNonce
168
+ fn test_clear_payload_not_stored() {
169
+ let context = setup();
170
+ let env = &context.env;
171
+
172
+ let receiver = Address::generate(env);
173
+ let src_eid = 2;
174
+ let sender = BytesN::from_array(env, &[1u8; 32]);
175
+ let nonce = 1;
176
+ let payload = Bytes::from_array(env, &[0xaa, 0xbb, 0xcc]);
177
+
178
+ clear_payload(&context, &receiver, src_eid, &sender, nonce, &payload);
179
+ }
180
+
181
+ #[test]
182
+ #[should_panic(expected = "Error(Contract, #10)")] // EndpointError::InvalidNonce
183
+ fn test_clear_payload_missing_intermediate_nonce() {
184
+ let context = setup();
185
+ let env = &context.env;
186
+
187
+ let receiver = Address::generate(env);
188
+ let src_eid = 2;
189
+ let sender = BytesN::from_array(env, &[1u8; 32]);
190
+
191
+ // Store only nonce 1 and 3, skip nonce 2
192
+ let payload1 = Bytes::from_array(env, &[0x01]);
193
+ let payload3 = Bytes::from_array(env, &[0x03]);
194
+
195
+ let _ = inbound_as_verified_from_payload(&context, &receiver, src_eid, &sender, 1, &payload1);
196
+ let _ = inbound_as_verified_from_payload(&context, &receiver, src_eid, &sender, 3, &payload3);
197
+
198
+ // Clearing nonce 1 advances lazy nonce from 0 -> 1.
199
+ clear_payload(&context, &receiver, src_eid, &sender, 1, &payload1);
200
+
201
+ // Try to clear nonce 3 - should panic because nonce 2 is missing
202
+ clear_payload(&context, &receiver, src_eid, &sender, 3, &payload3);
203
+ }
@@ -0,0 +1,94 @@
1
+ use soroban_sdk::{testutils::Address as _, Address, BytesN};
2
+
3
+ use crate::{endpoint_v2::EndpointV2, tests::endpoint_setup::setup};
4
+
5
+ // Internal inbound() stores payload hash per nonce and rejects empty payload hash
6
+ #[test]
7
+ fn test_inbound_success_stores_payload_hash() {
8
+ let context = setup();
9
+ let env = &context.env;
10
+ let endpoint_client = &context.endpoint_client;
11
+
12
+ let receiver = Address::generate(env);
13
+ let src_eid = 2;
14
+ let sender = BytesN::from_array(env, &[1u8; 32]);
15
+ let nonce = 1;
16
+ let payload_hash = BytesN::from_array(env, &[0xabu8; 32]); // Valid non-empty payload hash
17
+
18
+ env.as_contract(&endpoint_client.address, || {
19
+ EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce, &payload_hash)
20
+ });
21
+
22
+ let stored_hash = endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce);
23
+ assert_eq!(stored_hash, Some(payload_hash.clone()));
24
+
25
+ // Different nonce for same path
26
+ let nonce2 = 2;
27
+ let payload_hash2 = BytesN::from_array(env, &[0xcdu8; 32]);
28
+ env.as_contract(&endpoint_client.address, || {
29
+ EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce2, &payload_hash2)
30
+ });
31
+ assert_eq!(
32
+ endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce2),
33
+ Some(payload_hash2.clone())
34
+ );
35
+
36
+ // Different receiver should have independent storage
37
+ let different_receiver = Address::generate(env);
38
+ let payload_hash3 = BytesN::from_array(env, &[0xefu8; 32]);
39
+ env.as_contract(&endpoint_client.address, || {
40
+ EndpointV2::inbound(env, &different_receiver, src_eid, &sender, nonce, &payload_hash3)
41
+ });
42
+ assert_eq!(
43
+ endpoint_client.inbound_payload_hash(&different_receiver, &src_eid, &sender, &nonce),
44
+ Some(payload_hash3)
45
+ );
46
+ }
47
+
48
+ // Inbound() overwrites payload hash for the same (receiver, src_eid, sender, nonce)
49
+ #[test]
50
+ fn test_inbound_overwrites_same_nonce() {
51
+ let context = setup();
52
+ let env = &context.env;
53
+ let endpoint_client = &context.endpoint_client;
54
+
55
+ let receiver = Address::generate(env);
56
+ let src_eid = 2;
57
+ let sender = BytesN::from_array(env, &[1u8; 32]);
58
+ let nonce = 1;
59
+
60
+ let payload_hash_a = BytesN::from_array(env, &[0xabu8; 32]);
61
+ let payload_hash_b = BytesN::from_array(env, &[0xcdu8; 32]);
62
+
63
+ env.as_contract(&endpoint_client.address, || {
64
+ EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce, &payload_hash_a)
65
+ });
66
+ assert_eq!(
67
+ endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce),
68
+ Some(payload_hash_a.clone())
69
+ );
70
+
71
+ // Overwrite the same nonce with a different payload hash.
72
+ env.as_contract(&endpoint_client.address, || {
73
+ EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce, &payload_hash_b)
74
+ });
75
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce), Some(payload_hash_b));
76
+ }
77
+
78
+ #[test]
79
+ #[should_panic(expected = "Error(Contract, #11)")] // EndpointError::InvalidPayloadHash
80
+ fn test_inbound_rejects_empty_payload_hash() {
81
+ let context = setup();
82
+ let env = &context.env;
83
+ let endpoint_client = &context.endpoint_client;
84
+
85
+ let receiver = Address::generate(env);
86
+ let src_eid = 2;
87
+ let sender = BytesN::from_array(env, &[1u8; 32]);
88
+ let nonce = 1;
89
+ let empty_hash = BytesN::from_array(env, &[0u8; 32]); // empty payload hash is invalid for inbound()
90
+
91
+ env.as_contract(&endpoint_client.address, || {
92
+ EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce, &empty_hash)
93
+ });
94
+ }
@@ -1,288 +1,118 @@
1
1
  use soroban_sdk::{testutils::Address as _, Address, BytesN};
2
2
 
3
- use crate::{endpoint_v2::EndpointV2, storage, tests::endpoint_setup::setup};
4
-
5
- #[test]
6
- fn test_inbound_nonce_initial_value() {
7
- let test_setup = setup();
8
- let env = &test_setup.env;
9
- let endpoint_client = &test_setup.endpoint_client;
10
-
11
- let receiver = Address::generate(env);
12
- let src_eid = 2;
13
- let sender = BytesN::from_array(env, &[1u8; 32]);
14
-
15
- // Initial inbound nonce should be 0 (lazy nonce is 0, no payload hashes)
16
- let nonce = endpoint_client.inbound_nonce(&receiver, &src_eid, &sender);
17
- assert_eq!(nonce, 0);
3
+ use crate::tests::endpoint_setup::{setup, TestSetup};
4
+
5
+ // Helpers
6
+ fn inbound_as_verified_with_fixed_hash(
7
+ context: &TestSetup,
8
+ receiver: &Address,
9
+ src_eid: u32,
10
+ sender: &BytesN<32>,
11
+ nonce: u64,
12
+ ) {
13
+ let payload_hash = BytesN::from_array(&context.env, &[0xabu8; 32]);
14
+ context.inbound_as_verified(receiver, src_eid, sender, nonce, &payload_hash);
18
15
  }
19
16
 
17
+ // Initial value
20
18
  #[test]
21
- fn test_inbound_nonce_with_lazy_nonce_only() {
22
- let test_setup = setup();
23
- let env = &test_setup.env;
24
- let endpoint_client = &test_setup.endpoint_client;
19
+ fn test_inbound_nonce_initially_zero() {
20
+ let context = setup();
21
+ let env = &context.env;
22
+ let endpoint_client = &context.endpoint_client;
25
23
 
26
24
  let receiver = Address::generate(env);
27
25
  let src_eid = 2;
28
26
  let sender = BytesN::from_array(env, &[1u8; 32]);
29
- let lazy_nonce = 5;
30
27
 
31
- // Set lazy nonce without any payload hashes
32
- env.as_contract(&endpoint_client.address, || {
33
- storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &lazy_nonce)
34
- });
35
-
36
- // Inbound nonce should equal lazy nonce when no payload hashes exist
37
- let nonce = endpoint_client.inbound_nonce(&receiver, &src_eid, &sender);
38
- assert_eq!(nonce, lazy_nonce);
28
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), 0);
29
+ assert_eq!(endpoint_client.inbound_nonce(&receiver, &src_eid, &sender), 0);
39
30
  }
40
31
 
32
+ // Lazy nonce is the baseline when there are no consecutive payload hashes
41
33
  #[test]
42
- fn test_inbound_nonce_with_consecutive_payload_hashes() {
43
- let test_setup = setup();
44
- let env = &test_setup.env;
45
- let endpoint_client = &test_setup.endpoint_client;
34
+ fn test_inbound_nonce_equals_lazy_nonce_when_no_payload_hashes() {
35
+ let context = setup();
36
+ let env = &context.env;
37
+ let endpoint_client = &context.endpoint_client;
46
38
 
47
39
  let receiver = Address::generate(env);
48
40
  let src_eid = 2;
49
41
  let sender = BytesN::from_array(env, &[1u8; 32]);
50
- let lazy_nonce = 2;
51
-
52
- // Set lazy nonce to 2
53
- env.as_contract(&endpoint_client.address, || {
54
- storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &lazy_nonce)
55
- });
56
-
57
- // Add consecutive payload hashes starting from lazy_nonce + 1
58
- let payload_hash1 = BytesN::from_array(env, &[0xabu8; 32]);
59
- let payload_hash2 = BytesN::from_array(env, &[0xcdu8; 32]);
60
- let payload_hash3 = BytesN::from_array(env, &[0xefu8; 32]);
61
-
62
- env.as_contract(&endpoint_client.address, || {
63
- EndpointV2::inbound(env, &receiver, src_eid, &sender, 3, &payload_hash1)
64
- });
65
- env.as_contract(&endpoint_client.address, || {
66
- EndpointV2::inbound(env, &receiver, src_eid, &sender, 4, &payload_hash2)
67
- });
68
- env.as_contract(&endpoint_client.address, || {
69
- EndpointV2::inbound(env, &receiver, src_eid, &sender, 5, &payload_hash3)
70
- });
71
42
 
72
- // Inbound nonce should be 5 (lazy_nonce + 3 consecutive payload hashes)
73
- let nonce = endpoint_client.inbound_nonce(&receiver, &src_eid, &sender);
74
- assert_eq!(nonce, 5);
43
+ context.set_lazy_inbound_nonce(&receiver, src_eid, &sender, 5);
44
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), 5);
45
+ assert_eq!(endpoint_client.inbound_nonce(&receiver, &src_eid, &sender), 5);
75
46
  }
76
47
 
48
+ // The inbound_nonce advances through the longest gapless consecutive sequence
77
49
  #[test]
78
- fn test_inbound_nonce_with_gap_in_payload_hashes() {
79
- let test_setup = setup();
80
- let env = &test_setup.env;
81
- let endpoint_client = &test_setup.endpoint_client;
50
+ fn test_inbound_nonce_advances_through_consecutive_verified_payload_hashes() {
51
+ let context = setup();
52
+ let env = &context.env;
53
+ let endpoint_client = &context.endpoint_client;
82
54
 
83
55
  let receiver = Address::generate(env);
84
56
  let src_eid = 2;
85
57
  let sender = BytesN::from_array(env, &[1u8; 32]);
86
- let lazy_nonce = 2;
87
58
 
88
- // Set lazy nonce to 2
89
- env.as_contract(&endpoint_client.address, || {
90
- storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &lazy_nonce)
91
- });
59
+ // Start from lazy_nonce = 2 and add payloads at 3,4,5.
60
+ context.set_lazy_inbound_nonce(&receiver, src_eid, &sender, 2);
61
+ inbound_as_verified_with_fixed_hash(&context, &receiver, src_eid, &sender, 3);
62
+ inbound_as_verified_with_fixed_hash(&context, &receiver, src_eid, &sender, 4);
63
+ inbound_as_verified_with_fixed_hash(&context, &receiver, src_eid, &sender, 5);
92
64
 
93
- // Add payload hashes with a gap (nonce 3 and 5, but not 4)
94
- let payload_hash1 = BytesN::from_array(env, &[0xabu8; 32]);
95
- let payload_hash2 = BytesN::from_array(env, &[0xcdu8; 32]);
96
-
97
- env.as_contract(&endpoint_client.address, || {
98
- EndpointV2::inbound(env, &receiver, src_eid, &sender, 3, &payload_hash1)
99
- });
100
- env.as_contract(&endpoint_client.address, || {
101
- EndpointV2::inbound(env, &receiver, src_eid, &sender, 5, &payload_hash2)
102
- });
103
-
104
- // Inbound nonce should be 3 (stops at first gap)
105
- let nonce = endpoint_client.inbound_nonce(&receiver, &src_eid, &sender);
106
- assert_eq!(nonce, 3);
65
+ assert_eq!(endpoint_client.inbound_nonce(&receiver, &src_eid, &sender), 5);
107
66
  }
108
67
 
109
68
  #[test]
110
- fn test_inbound_nonce_with_zero_lazy_nonce_and_payload_hashes() {
111
- let test_setup = setup();
112
- let env = &test_setup.env;
113
- let endpoint_client = &test_setup.endpoint_client;
69
+ fn test_inbound_nonce_stops_at_first_gap() {
70
+ let context = setup();
71
+ let env = &context.env;
72
+ let endpoint_client = &context.endpoint_client;
114
73
 
115
74
  let receiver = Address::generate(env);
116
75
  let src_eid = 2;
117
76
  let sender = BytesN::from_array(env, &[1u8; 32]);
118
77
 
119
- // Lazy nonce is 0 by default
120
- // Add consecutive payload hashes starting from 1
121
- let payload_hash1 = BytesN::from_array(env, &[0xabu8; 32]);
122
- let payload_hash2 = BytesN::from_array(env, &[0xcdu8; 32]);
123
-
124
- env.as_contract(&endpoint_client.address, || {
125
- EndpointV2::inbound(env, &receiver, src_eid, &sender, 1, &payload_hash1)
126
- });
127
- env.as_contract(&endpoint_client.address, || {
128
- EndpointV2::inbound(env, &receiver, src_eid, &sender, 2, &payload_hash2)
129
- });
78
+ // Start from lazy_nonce = 2 and add payloads at 3 and 5 (gap at 4).
79
+ context.set_lazy_inbound_nonce(&receiver, src_eid, &sender, 2);
80
+ inbound_as_verified_with_fixed_hash(&context, &receiver, src_eid, &sender, 3);
81
+ inbound_as_verified_with_fixed_hash(&context, &receiver, src_eid, &sender, 5);
130
82
 
131
- // Inbound nonce should be 2 (0 + 2 consecutive payload hashes)
132
- let nonce = endpoint_client.inbound_nonce(&receiver, &src_eid, &sender);
133
- assert_eq!(nonce, 2);
83
+ assert_eq!(endpoint_client.inbound_nonce(&receiver, &src_eid, &sender), 3);
134
84
  }
135
85
 
86
+ // Path isolation (receiver/src_eid/sender are isolated)
136
87
  #[test]
137
- fn test_inbound_nonce_different_paths() {
138
- let test_setup = setup();
139
- let env = &test_setup.env;
140
- let endpoint_client = &test_setup.endpoint_client;
141
-
142
- let receiver1 = Address::generate(env);
143
- let receiver2 = Address::generate(env);
144
- let src_eid1 = 2;
145
- let src_eid2 = 3;
146
- let sender1 = BytesN::from_array(env, &[1u8; 32]);
147
- let sender2 = BytesN::from_array(env, &[2u8; 32]);
148
-
149
- // Set different lazy nonces for different paths
150
- env.as_contract(&endpoint_client.address, || {
151
- storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver1, src_eid1, &sender1, &10)
152
- });
153
- env.as_contract(&endpoint_client.address, || {
154
- storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver2, src_eid1, &sender1, &20)
155
- });
156
- env.as_contract(&endpoint_client.address, || {
157
- storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver1, src_eid2, &sender1, &30)
158
- });
159
- env.as_contract(&endpoint_client.address, || {
160
- storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver1, src_eid1, &sender2, &40)
161
- });
162
-
163
- // Add payload hashes for some paths
164
- let payload_hash = BytesN::from_array(env, &[0xabu8; 32]);
165
-
166
- // Add payload hash for receiver1, src_eid1, sender1 (nonce 11)
167
- env.as_contract(&endpoint_client.address, || {
168
- EndpointV2::inbound(env, &receiver1, src_eid1, &sender1, 11, &payload_hash)
169
- });
170
-
171
- // Add payload hash for receiver1, src_eid2, sender1 (nonce 31 and 32)
172
- env.as_contract(&endpoint_client.address, || {
173
- EndpointV2::inbound(env, &receiver1, src_eid2, &sender1, 31, &payload_hash)
174
- });
175
- env.as_contract(&endpoint_client.address, || {
176
- EndpointV2::inbound(env, &receiver1, src_eid2, &sender1, 32, &payload_hash)
177
- });
178
-
179
- // Verify each path has independent inbound nonce calculation
180
- let nonce1 = endpoint_client.inbound_nonce(&receiver1, &src_eid1, &sender1);
181
- let nonce2 = endpoint_client.inbound_nonce(&receiver2, &src_eid1, &sender1);
182
- let nonce3 = endpoint_client.inbound_nonce(&receiver1, &src_eid2, &sender1);
183
- let nonce4 = endpoint_client.inbound_nonce(&receiver1, &src_eid1, &sender2);
184
-
185
- assert_eq!(nonce1, 11); // lazy_nonce 10 + 1 payload hash
186
- assert_eq!(nonce2, 20); // lazy_nonce 20, no payload hashes
187
- assert_eq!(nonce3, 32); // lazy_nonce 30 + 2 consecutive payload hashes
188
- assert_eq!(nonce4, 40); // lazy_nonce 40, no payload hashes
189
- }
190
-
191
- #[test]
192
- fn test_inbound_nonce_large_consecutive_sequence() {
193
- let test_setup = setup();
194
- let env = &test_setup.env;
195
- let endpoint_client = &test_setup.endpoint_client;
196
-
197
- let receiver = Address::generate(env);
198
- let src_eid = 2;
199
- let sender = BytesN::from_array(env, &[1u8; 32]);
200
- let lazy_nonce = 100;
201
- let sequence_length = 50;
202
-
203
- // Set lazy nonce
204
- env.as_contract(&endpoint_client.address, || {
205
- storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &lazy_nonce)
206
- });
207
-
208
- // Add a long sequence of consecutive payload hashes
209
- let payload_hash = BytesN::from_array(env, &[0xabu8; 32]);
210
- for i in 1..=sequence_length {
211
- env.as_contract(&endpoint_client.address, || {
212
- EndpointV2::inbound(env, &receiver, src_eid, &sender, lazy_nonce + i, &payload_hash)
213
- });
214
- }
215
-
216
- // Inbound nonce should be lazy_nonce + sequence_length
217
- let nonce = endpoint_client.inbound_nonce(&receiver, &src_eid, &sender);
218
- assert_eq!(nonce, lazy_nonce + sequence_length);
219
- }
220
-
221
- #[test]
222
- fn test_inbound_nonce_after_payload_removal() {
223
- let test_setup = setup();
224
- let env = &test_setup.env;
225
- let endpoint_client = &test_setup.endpoint_client;
226
-
227
- let receiver = Address::generate(env);
228
- let src_eid = 2;
229
- let sender = BytesN::from_array(env, &[1u8; 32]);
230
- let lazy_nonce = 5;
231
-
232
- // Set lazy nonce
233
- env.as_contract(&endpoint_client.address, || {
234
- storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &lazy_nonce)
235
- });
236
-
237
- // Add consecutive payload hashes
238
- let payload_hash = BytesN::from_array(env, &[0xabu8; 32]);
239
- env.as_contract(&endpoint_client.address, || {
240
- EndpointV2::inbound(env, &receiver, src_eid, &sender, 6, &payload_hash)
241
- });
242
- env.as_contract(&endpoint_client.address, || {
243
- EndpointV2::inbound(env, &receiver, src_eid, &sender, 7, &payload_hash)
244
- });
245
- env.as_contract(&endpoint_client.address, || {
246
- EndpointV2::inbound(env, &receiver, src_eid, &sender, 8, &payload_hash)
247
- });
248
-
249
- // Verify inbound nonce is 8
250
- let nonce_before = endpoint_client.inbound_nonce(&receiver, &src_eid, &sender);
251
- assert_eq!(nonce_before, 8);
252
-
253
- // Remove payload hash at nonce 7 (creates a gap)
254
- env.as_contract(&endpoint_client.address, || {
255
- storage::EndpointStorage::remove_inbound_payload_hash(env, &receiver, src_eid, &sender, 7)
256
- });
257
-
258
- // Inbound nonce should now be 6 (stops at the gap)
259
- let nonce_after = endpoint_client.inbound_nonce(&receiver, &src_eid, &sender);
260
- assert_eq!(nonce_after, 6);
261
- }
262
-
263
- #[test]
264
- fn test_inbound_nonce_no_payload_hash_at_lazy_nonce_plus_one() {
265
- let test_setup = setup();
266
- let env = &test_setup.env;
267
- let endpoint_client = &test_setup.endpoint_client;
268
-
269
- let receiver = Address::generate(env);
270
- let src_eid = 2;
271
- let sender = BytesN::from_array(env, &[1u8; 32]);
272
- let lazy_nonce = 10;
273
-
274
- // Set lazy nonce
275
- env.as_contract(&endpoint_client.address, || {
276
- storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &lazy_nonce)
277
- });
278
-
279
- // Add payload hash at nonce 12 (skipping nonce 11)
280
- let payload_hash = BytesN::from_array(env, &[0xabu8; 32]);
281
- env.as_contract(&endpoint_client.address, || {
282
- EndpointV2::inbound(env, &receiver, src_eid, &sender, 12, &payload_hash)
283
- });
284
-
285
- // Inbound nonce should remain at lazy_nonce (no consecutive sequence from lazy_nonce + 1)
286
- let nonce = endpoint_client.inbound_nonce(&receiver, &src_eid, &sender);
287
- assert_eq!(nonce, lazy_nonce);
88
+ fn test_inbound_nonce_isolated_by_path() {
89
+ let context = setup();
90
+ let env = &context.env;
91
+ let endpoint_client = &context.endpoint_client;
92
+
93
+ let receiver_a = Address::generate(env);
94
+ let receiver_b = Address::generate(env);
95
+ let src_eid_a = 2;
96
+ let src_eid_b = 3;
97
+ let sender_a = BytesN::from_array(env, &[1u8; 32]);
98
+ let sender_b = BytesN::from_array(env, &[2u8; 32]);
99
+
100
+ // Path A: lazy 10 + payload at 11 => inbound_nonce 11.
101
+ context.set_lazy_inbound_nonce(&receiver_a, src_eid_a, &sender_a, 10);
102
+ inbound_as_verified_with_fixed_hash(&context, &receiver_a, src_eid_a, &sender_a, 11);
103
+ assert_eq!(endpoint_client.inbound_nonce(&receiver_a, &src_eid_a, &sender_a), 11);
104
+
105
+ // Path B: different receiver => independent.
106
+ context.set_lazy_inbound_nonce(&receiver_b, src_eid_a, &sender_a, 20);
107
+ assert_eq!(endpoint_client.inbound_nonce(&receiver_b, &src_eid_a, &sender_a), 20);
108
+
109
+ // Path C: different src_eid => independent (two consecutive payloads).
110
+ context.set_lazy_inbound_nonce(&receiver_a, src_eid_b, &sender_a, 30);
111
+ inbound_as_verified_with_fixed_hash(&context, &receiver_a, src_eid_b, &sender_a, 31);
112
+ inbound_as_verified_with_fixed_hash(&context, &receiver_a, src_eid_b, &sender_a, 32);
113
+ assert_eq!(endpoint_client.inbound_nonce(&receiver_a, &src_eid_b, &sender_a), 32);
114
+
115
+ // Path D: different sender => independent.
116
+ context.set_lazy_inbound_nonce(&receiver_a, src_eid_a, &sender_b, 40);
117
+ assert_eq!(endpoint_client.inbound_nonce(&receiver_a, &src_eid_a, &sender_b), 40);
288
118
  }