@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,13 +1,85 @@
1
- use soroban_sdk::{testutils::Address as _, Address, BytesN, IntoVal};
2
-
3
- use crate::{endpoint_v2::EndpointV2, events::PacketNilified, 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
+ endpoint_v2::EndpointV2, errors::EndpointError, events::PacketNilified, storage, tests::endpoint_setup::setup,
6
+ tests::endpoint_setup::TestSetup,
7
+ };
8
+
9
+ // Helpers
10
+ fn nil_hash(context: &TestSetup) -> BytesN<32> {
11
+ let env = &context.env;
12
+ let endpoint_client = &context.endpoint_client;
13
+ env.as_contract(&endpoint_client.address, || EndpointV2::nil_payload_hash(env))
14
+ }
15
+
16
+ fn nilify_with_auth(
17
+ context: &TestSetup,
18
+ caller: &Address,
19
+ receiver: &Address,
20
+ src_eid: u32,
21
+ sender: &BytesN<32>,
22
+ nonce: u64,
23
+ payload_hash: &Option<BytesN<32>>,
24
+ ) {
25
+ context.mock_auth(caller, "nilify", (caller, receiver, &src_eid, sender, &nonce, payload_hash));
26
+ context.endpoint_client.nilify(caller, receiver, &src_eid, sender, &nonce, payload_hash);
27
+ }
28
+
29
+ fn try_nilify_with_auth(
30
+ context: &TestSetup,
31
+ caller: &Address,
32
+ receiver: &Address,
33
+ src_eid: u32,
34
+ sender: &BytesN<32>,
35
+ nonce: u64,
36
+ payload_hash: &Option<BytesN<32>>,
37
+ ) -> Result<Result<(), soroban_sdk::ConversionError>, Result<soroban_sdk::Error, soroban_sdk::InvokeError>> {
38
+ context.mock_auth(caller, "nilify", (caller, receiver, &src_eid, sender, &nonce, payload_hash));
39
+ context.endpoint_client.try_nilify(caller, receiver, &src_eid, sender, &nonce, payload_hash)
40
+ }
41
+
42
+ // Authorization (receiver or delegate(receiver) must authorize)
43
+ #[test]
44
+ fn test_nilify_unauthorized() {
45
+ let context = setup();
46
+ let env = &context.env;
47
+ let endpoint_client = &context.endpoint_client;
48
+
49
+ let receiver = Address::generate(env);
50
+ let unauthorized = Address::generate(env);
51
+ let src_eid = 2;
52
+ let sender = BytesN::from_array(env, &[1u8; 32]);
53
+ let nonce = 1u64;
54
+
55
+ // Unauthorized should fail before require_auth, so no mock_auth is needed.
56
+ let result = endpoint_client.try_nilify(&unauthorized, &receiver, &src_eid, &sender, &nonce, &None);
57
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::Unauthorized.into());
58
+ }
59
+
60
+ #[test]
61
+ #[should_panic(expected = "Error(Auth, InvalidAction)")]
62
+ fn test_nilify_requires_auth_even_when_caller_is_receiver() {
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
+ let nonce = 1u64;
71
+
72
+ // No mock_auth here: require_oapp_auth passes the (caller == receiver) check,
73
+ // then panics at caller.require_auth().
74
+ endpoint_client.nilify(&receiver, &receiver, &src_eid, &sender, &nonce, &None);
75
+ }
76
+
77
+ // Successful nilify with stored (verified) payload hash (state update + event emission)
6
78
  #[test]
7
79
  fn test_nilify_success_with_stored_payload() {
8
- let test_setup = setup();
9
- let env = &test_setup.env;
10
- let endpoint_client = &test_setup.endpoint_client;
80
+ let context = setup();
81
+ let env = &context.env;
82
+ let endpoint_client = &context.endpoint_client;
11
83
 
12
84
  let receiver = Address::generate(env);
13
85
  let src_eid = 2;
@@ -15,31 +87,17 @@ fn test_nilify_success_with_stored_payload() {
15
87
  let nonce = 1;
16
88
  let payload_hash = BytesN::from_array(env, &[0xabu8; 32]);
17
89
 
18
- // Store a payload hash first
19
- env.as_contract(&endpoint_client.address, || {
20
- EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce, &payload_hash)
21
- });
90
+ // Store a payload hash first.
91
+ context.inbound_as_verified(&receiver, src_eid, &sender, nonce, &payload_hash);
22
92
 
23
- // Verify payload hash is stored
24
- let stored_hash = env.as_contract(&endpoint_client.address, || {
25
- storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce)
26
- });
27
- assert_eq!(stored_hash, Some(payload_hash.clone()));
28
-
29
- // Nilify the payload
30
- endpoint_client
31
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
32
- address: &receiver,
33
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
34
- contract: &endpoint_client.address,
35
- fn_name: "nilify",
36
- args: (&receiver, &receiver, &src_eid, &sender, &nonce, &Some(payload_hash.clone())).into_val(env),
37
- sub_invokes: &[],
38
- },
39
- }])
40
- .nilify(&receiver, &receiver, &src_eid, &sender, &nonce, &Some(payload_hash.clone()));
41
-
42
- // Verify PacketNilified event was emitted
93
+ // Verify payload hash is stored.
94
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce), Some(payload_hash.clone()));
95
+
96
+ // Nilify the payload.
97
+ let payload_hash_opt = Some(payload_hash.clone());
98
+ nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce, &payload_hash_opt);
99
+
100
+ // Verify PacketNilified event was emitted.
43
101
  assert_event(
44
102
  env,
45
103
  &endpoint_client.address,
@@ -52,63 +110,132 @@ fn test_nilify_success_with_stored_payload() {
52
110
  },
53
111
  );
54
112
 
55
- // Verify payload hash was replaced with nil hash
56
- let nilified_hash = env.as_contract(&endpoint_client.address, || {
57
- storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce)
58
- });
59
- let expected_nil_hash = env.as_contract(&endpoint_client.address, || EndpointV2::nil_payload_hash(env));
113
+ // Verify payload hash was replaced with nil hash.
114
+ let nilified_hash = endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce);
115
+ let expected_nil_hash = nil_hash(&context);
60
116
  assert_eq!(nilified_hash, Some(expected_nil_hash));
61
117
  }
62
118
 
119
+ // Successful nilify with None (non-verified nonce) when nonce > lazy nonce
63
120
  #[test]
64
121
  fn test_nilify_success_with_empty_payload() {
65
- let test_setup = setup();
66
- let env = &test_setup.env;
67
- let endpoint_client = &test_setup.endpoint_client;
122
+ let context = setup();
123
+ let env = &context.env;
124
+ let endpoint_client = &context.endpoint_client;
68
125
 
69
126
  let receiver = Address::generate(env);
70
127
  let src_eid = 2;
71
128
  let sender = BytesN::from_array(env, &[1u8; 32]);
72
129
  let nonce = 2;
73
130
 
74
- // Set lazy nonce to 1 so nonce 2 is greater than lazy nonce
131
+ // Set lazy nonce to 1 so nonce 2 is greater than lazy nonce.
75
132
  env.as_contract(&endpoint_client.address, || {
76
133
  storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &1)
77
134
  });
78
135
 
79
- // Nilify with None
80
- endpoint_client
81
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
82
- address: &receiver,
83
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
84
- contract: &endpoint_client.address,
85
- fn_name: "nilify",
86
- args: (&receiver, &receiver, &src_eid, &sender, &nonce, &None::<BytesN<32>>).into_val(env),
87
- sub_invokes: &[],
88
- },
89
- }])
90
- .nilify(&receiver, &receiver, &src_eid, &sender, &nonce, &None);
91
-
92
- // Verify PacketNilified event was emitted
136
+ // Nilify with None.
137
+ nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce, &None);
138
+
139
+ // Verify PacketNilified event was emitted.
93
140
  assert_event(
94
141
  env,
95
142
  &endpoint_client.address,
96
143
  PacketNilified { src_eid, sender: sender.clone(), receiver: receiver.clone(), nonce, payload_hash: None },
97
144
  );
98
145
 
99
- // Verify payload hash was set to nil hash
100
- let nilified_hash = env.as_contract(&endpoint_client.address, || {
101
- storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce)
102
- });
103
- let expected_nil_hash = env.as_contract(&endpoint_client.address, || EndpointV2::nil_payload_hash(env));
146
+ // Verify payload hash was set to nil hash.
147
+ let nilified_hash = endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce);
148
+ let expected_nil_hash = nil_hash(&context);
104
149
  assert_eq!(nilified_hash, Some(expected_nil_hash));
105
150
  }
106
151
 
152
+ // Nilify with None counts as "verified" for inbound_nonce (but does not change lazy nonce)
153
+ #[test]
154
+ fn test_nilify_with_none_advances_inbound_nonce_without_changing_lazy_nonce() {
155
+ let context = setup();
156
+ let env = &context.env;
157
+ let endpoint_client = &context.endpoint_client;
158
+
159
+ let receiver = Address::generate(env);
160
+ let src_eid = 2;
161
+ let sender = BytesN::from_array(env, &[1u8; 32]);
162
+
163
+ // Initial state.
164
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), 0);
165
+ assert_eq!(endpoint_client.inbound_nonce(&receiver, &src_eid, &sender), 0);
166
+
167
+ // Nilify nonce 1 with None (non-verified nonce).
168
+ nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, 1, &None);
169
+
170
+ // Nilify writes a payload hash, so inbound_nonce can now advance to 1.
171
+ assert_eq!(endpoint_client.inbound_nonce(&receiver, &src_eid, &sender), 1);
172
+
173
+ // But nilify does not update lazy_inbound_nonce.
174
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), 0);
175
+ }
176
+
177
+ // Nilify is allowed when nonce <= lazy nonce if a payload hash exists
178
+ #[test]
179
+ fn test_nilify_allows_when_nonce_is_checkpointed_if_payload_exists() {
180
+ let context = setup();
181
+ let env = &context.env;
182
+ let endpoint_client = &context.endpoint_client;
183
+
184
+ let receiver = Address::generate(env);
185
+ let src_eid = 2;
186
+ let sender = BytesN::from_array(env, &[1u8; 32]);
187
+ let nonce = 5u64;
188
+ let payload_hash = BytesN::from_array(env, &[0xabu8; 32]);
189
+
190
+ // Checkpoint past the target nonce.
191
+ env.as_contract(&endpoint_client.address, || {
192
+ storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &10)
193
+ });
194
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), 10);
195
+
196
+ // Store a verified payload hash at nonce 5.
197
+ context.inbound_as_verified(&receiver, src_eid, &sender, nonce, &payload_hash);
198
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce), Some(payload_hash.clone()));
199
+
200
+ // Even though nonce <= lazy_nonce, this should succeed because a payload hash exists.
201
+ let payload_hash_opt = Some(payload_hash.clone());
202
+ nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce, &payload_hash_opt);
203
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce), Some(nil_hash(&context)));
204
+ }
205
+
206
+ // Nilify is idempotent if the caller passes the current stored payload hash (including nil hash)
207
+ #[test]
208
+ fn test_nilify_allows_repeated_call_when_already_nilified() {
209
+ let context = setup();
210
+ let env = &context.env;
211
+ let endpoint_client = &context.endpoint_client;
212
+
213
+ let receiver = Address::generate(env);
214
+ let src_eid = 2;
215
+ let sender = BytesN::from_array(env, &[1u8; 32]);
216
+ let nonce = 1u64;
217
+ let payload_hash = BytesN::from_array(env, &[0xabu8; 32]);
218
+
219
+ // First nilify: verified payload hash -> nil hash.
220
+ context.inbound_as_verified(&receiver, src_eid, &sender, nonce, &payload_hash);
221
+ let payload_hash_opt = Some(payload_hash);
222
+ nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce, &payload_hash_opt);
223
+
224
+ let nil = nil_hash(&context);
225
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce), Some(nil.clone()));
226
+
227
+ // Second nilify: passing the current stored nil hash should succeed.
228
+ let nil_opt = Some(nil.clone());
229
+ nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce, &nil_opt);
230
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce), Some(nil));
231
+ }
232
+
233
+ // Delegate authorization (delegate(receiver) is allowed)
107
234
  #[test]
108
235
  fn test_nilify_with_delegate() {
109
- let test_setup = setup();
110
- let env = &test_setup.env;
111
- let endpoint_client = &test_setup.endpoint_client;
236
+ let context = setup();
237
+ let env = &context.env;
238
+ let endpoint_client = &context.endpoint_client;
112
239
 
113
240
  let receiver = Address::generate(env);
114
241
  let delegate = Address::generate(env);
@@ -117,28 +244,17 @@ fn test_nilify_with_delegate() {
117
244
  let nonce = 1;
118
245
  let payload_hash = BytesN::from_array(env, &[0xcdu8; 32]);
119
246
 
120
- // Set delegate for receiver
247
+ // Set delegate for receiver.
121
248
  env.as_contract(&endpoint_client.address, || storage::EndpointStorage::set_delegate(env, &receiver, &delegate));
122
249
 
123
- // Store a payload hash first
124
- env.as_contract(&endpoint_client.address, || {
125
- EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce, &payload_hash)
126
- });
250
+ // Store a payload hash first.
251
+ context.inbound_as_verified(&receiver, src_eid, &sender, nonce, &payload_hash);
127
252
 
128
- // Delegate can nilify on behalf of receiver
129
- endpoint_client
130
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
131
- address: &delegate,
132
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
133
- contract: &endpoint_client.address,
134
- fn_name: "nilify",
135
- args: (&delegate, &receiver, &src_eid, &sender, &nonce, &Some(payload_hash.clone())).into_val(env),
136
- sub_invokes: &[],
137
- },
138
- }])
139
- .nilify(&delegate, &receiver, &src_eid, &sender, &nonce, &Some(payload_hash.clone()));
140
-
141
- // Verify PacketNilified event was emitted
253
+ // Delegate can nilify on behalf of receiver.
254
+ let payload_hash_opt = Some(payload_hash.clone());
255
+ nilify_with_auth(&context, &delegate, &receiver, src_eid, &sender, nonce, &payload_hash_opt);
256
+
257
+ // Verify PacketNilified event was emitted.
142
258
  assert_event(
143
259
  env,
144
260
  &endpoint_client.address,
@@ -151,19 +267,18 @@ fn test_nilify_with_delegate() {
151
267
  },
152
268
  );
153
269
 
154
- // Verify payload hash was replaced with nil hash
155
- let nilified_hash = env.as_contract(&endpoint_client.address, || {
156
- storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce)
157
- });
158
- let expected_nil_hash = env.as_contract(&endpoint_client.address, || EndpointV2::nil_payload_hash(env));
270
+ // Verify payload hash was replaced with nil hash.
271
+ let nilified_hash = endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce);
272
+ let expected_nil_hash = nil_hash(&context);
159
273
  assert_eq!(nilified_hash, Some(expected_nil_hash));
160
274
  }
161
275
 
276
+ // Nilify affects only the targeted nonce (multiple nonces stay independent)
162
277
  #[test]
163
278
  fn test_nilify_multiple_payloads() {
164
- let test_setup = setup();
165
- let env = &test_setup.env;
166
- let endpoint_client = &test_setup.endpoint_client;
279
+ let context = setup();
280
+ let env = &context.env;
281
+ let endpoint_client = &context.endpoint_client;
167
282
 
168
283
  let receiver = Address::generate(env);
169
284
  let src_eid = 2;
@@ -173,59 +288,34 @@ fn test_nilify_multiple_payloads() {
173
288
  let nonce1 = 1;
174
289
  let nonce2 = 2;
175
290
 
176
- // Store multiple payload hashes
177
- env.as_contract(&endpoint_client.address, || {
178
- EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce1, &payload_hash1)
179
- });
180
- env.as_contract(&endpoint_client.address, || {
181
- EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce2, &payload_hash2)
182
- });
291
+ // Store multiple payload hashes.
292
+ context.inbound_as_verified(&receiver, src_eid, &sender, nonce1, &payload_hash1);
293
+ context.inbound_as_verified(&receiver, src_eid, &sender, nonce2, &payload_hash2);
183
294
 
184
- // Nilify first payload
185
- endpoint_client
186
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
187
- address: &receiver,
188
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
189
- contract: &endpoint_client.address,
190
- fn_name: "nilify",
191
- args: (&receiver, &receiver, &src_eid, &sender, &nonce1, &Some(payload_hash1.clone())).into_val(env),
192
- sub_invokes: &[],
193
- },
194
- }])
195
- .nilify(&receiver, &receiver, &src_eid, &sender, &nonce1, &Some(payload_hash1.clone()));
196
-
197
- // Nilify second payload
198
- endpoint_client
199
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
200
- address: &receiver,
201
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
202
- contract: &endpoint_client.address,
203
- fn_name: "nilify",
204
- args: (&receiver, &receiver, &src_eid, &sender, &nonce2, &Some(payload_hash2.clone())).into_val(env),
205
- sub_invokes: &[],
206
- },
207
- }])
208
- .nilify(&receiver, &receiver, &src_eid, &sender, &nonce2, &Some(payload_hash2.clone()));
209
-
210
- // Verify both payload hashes were replaced with nil hash
211
- let expected_nil_hash = env.as_contract(&endpoint_client.address, || EndpointV2::nil_payload_hash(env));
212
-
213
- let nilified_hash1 = env.as_contract(&endpoint_client.address, || {
214
- storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce1)
215
- });
216
- let nilified_hash2 = env.as_contract(&endpoint_client.address, || {
217
- storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce2)
218
- });
295
+ // Nilify first payload.
296
+ let payload_hash1_opt = Some(payload_hash1.clone());
297
+ nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce1, &payload_hash1_opt);
298
+
299
+ // Nilify second payload.
300
+ let payload_hash2_opt = Some(payload_hash2.clone());
301
+ nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce2, &payload_hash2_opt);
302
+
303
+ // Verify both payload hashes were replaced with nil hash.
304
+ let expected_nil_hash = nil_hash(&context);
305
+
306
+ let nilified_hash1 = endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce1);
307
+ let nilified_hash2 = endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce2);
219
308
 
220
309
  assert_eq!(nilified_hash1, Some(expected_nil_hash.clone()));
221
310
  assert_eq!(nilified_hash2, Some(expected_nil_hash));
222
311
  }
223
312
 
313
+ // Path isolation (receiver/src_eid/sender are isolated)
224
314
  #[test]
225
315
  fn test_nilify_different_paths() {
226
- let test_setup = setup();
227
- let env = &test_setup.env;
228
- let endpoint_client = &test_setup.endpoint_client;
316
+ let context = setup();
317
+ let env = &context.env;
318
+ let endpoint_client = &context.endpoint_client;
229
319
 
230
320
  let receiver1 = Address::generate(env);
231
321
  let receiver2 = Address::generate(env);
@@ -236,89 +326,115 @@ fn test_nilify_different_paths() {
236
326
  let nonce = 1;
237
327
  let payload_hash = BytesN::from_array(env, &[0xefu8; 32]);
238
328
 
239
- // Store payload hashes for different paths
240
- env.as_contract(&endpoint_client.address, || {
241
- EndpointV2::inbound(env, &receiver1, src_eid1, &sender1, nonce, &payload_hash)
242
- });
243
- env.as_contract(&endpoint_client.address, || {
244
- EndpointV2::inbound(env, &receiver2, src_eid1, &sender1, nonce, &payload_hash)
245
- });
246
- env.as_contract(&endpoint_client.address, || {
247
- EndpointV2::inbound(env, &receiver1, src_eid2, &sender1, nonce, &payload_hash)
248
- });
249
- env.as_contract(&endpoint_client.address, || {
250
- EndpointV2::inbound(env, &receiver1, src_eid1, &sender2, nonce, &payload_hash)
251
- });
329
+ // Store payload hashes for different paths.
330
+ context.inbound_as_verified(&receiver1, src_eid1, &sender1, nonce, &payload_hash);
331
+ context.inbound_as_verified(&receiver2, src_eid1, &sender1, nonce, &payload_hash);
332
+ context.inbound_as_verified(&receiver1, src_eid2, &sender1, nonce, &payload_hash);
333
+ context.inbound_as_verified(&receiver1, src_eid1, &sender2, nonce, &payload_hash);
252
334
 
253
- // Nilify for different receivers
254
- endpoint_client
255
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
256
- address: &receiver1,
257
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
258
- contract: &endpoint_client.address,
259
- fn_name: "nilify",
260
- args: (&receiver1, &receiver1, &src_eid1, &sender1, &nonce, &Some(payload_hash.clone())).into_val(env),
261
- sub_invokes: &[],
262
- },
263
- }])
264
- .nilify(&receiver1, &receiver1, &src_eid1, &sender1, &nonce, &Some(payload_hash.clone()));
265
-
266
- endpoint_client
267
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
268
- address: &receiver2,
269
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
270
- contract: &endpoint_client.address,
271
- fn_name: "nilify",
272
- args: (&receiver2, &receiver2, &src_eid1, &sender1, &nonce, &Some(payload_hash.clone())).into_val(env),
273
- sub_invokes: &[],
274
- },
275
- }])
276
- .nilify(&receiver2, &receiver2, &src_eid1, &sender1, &nonce, &Some(payload_hash.clone()));
277
-
278
- // Nilify for different src_eids
279
- endpoint_client
280
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
281
- address: &receiver1,
282
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
283
- contract: &endpoint_client.address,
284
- fn_name: "nilify",
285
- args: (&receiver1, &receiver1, &src_eid2, &sender1, &nonce, &Some(payload_hash.clone())).into_val(env),
286
- sub_invokes: &[],
287
- },
288
- }])
289
- .nilify(&receiver1, &receiver1, &src_eid2, &sender1, &nonce, &Some(payload_hash.clone()));
290
-
291
- // Nilify for different senders
292
- endpoint_client
293
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
294
- address: &receiver1,
295
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
296
- contract: &endpoint_client.address,
297
- fn_name: "nilify",
298
- args: (&receiver1, &receiver1, &src_eid1, &sender2, &nonce, &Some(payload_hash.clone())).into_val(env),
299
- sub_invokes: &[],
300
- },
301
- }])
302
- .nilify(&receiver1, &receiver1, &src_eid1, &sender2, &nonce, &Some(payload_hash.clone()));
303
-
304
- // Verify all paths have been nilified independently
305
- let expected_nil_hash = env.as_contract(&endpoint_client.address, || EndpointV2::nil_payload_hash(env));
306
-
307
- let nilified_hash1 = env.as_contract(&endpoint_client.address, || {
308
- storage::EndpointStorage::inbound_payload_hash(env, &receiver1, src_eid1, &sender1, nonce)
309
- });
310
- let nilified_hash2 = env.as_contract(&endpoint_client.address, || {
311
- storage::EndpointStorage::inbound_payload_hash(env, &receiver2, src_eid1, &sender1, nonce)
312
- });
313
- let nilified_hash3 = env.as_contract(&endpoint_client.address, || {
314
- storage::EndpointStorage::inbound_payload_hash(env, &receiver1, src_eid2, &sender1, nonce)
315
- });
316
- let nilified_hash4 = env.as_contract(&endpoint_client.address, || {
317
- storage::EndpointStorage::inbound_payload_hash(env, &receiver1, src_eid1, &sender2, nonce)
318
- });
335
+ // Nilify for different receivers.
336
+ let payload_hash_opt = Some(payload_hash.clone());
337
+ nilify_with_auth(&context, &receiver1, &receiver1, src_eid1, &sender1, nonce, &payload_hash_opt);
338
+
339
+ nilify_with_auth(&context, &receiver2, &receiver2, src_eid1, &sender1, nonce, &payload_hash_opt);
340
+
341
+ // Nilify for different src_eids.
342
+ nilify_with_auth(&context, &receiver1, &receiver1, src_eid2, &sender1, nonce, &payload_hash_opt);
343
+
344
+ // Nilify for different senders.
345
+ nilify_with_auth(&context, &receiver1, &receiver1, src_eid1, &sender2, nonce, &payload_hash_opt);
346
+
347
+ // Verify all paths have been nilified independently.
348
+ let expected_nil_hash = nil_hash(&context);
349
+
350
+ let nilified_hash1 = endpoint_client.inbound_payload_hash(&receiver1, &src_eid1, &sender1, &nonce);
351
+ let nilified_hash2 = endpoint_client.inbound_payload_hash(&receiver2, &src_eid1, &sender1, &nonce);
352
+ let nilified_hash3 = endpoint_client.inbound_payload_hash(&receiver1, &src_eid2, &sender1, &nonce);
353
+ let nilified_hash4 = endpoint_client.inbound_payload_hash(&receiver1, &src_eid1, &sender2, &nonce);
319
354
 
320
355
  assert_eq!(nilified_hash1, Some(expected_nil_hash.clone()));
321
356
  assert_eq!(nilified_hash2, Some(expected_nil_hash.clone()));
322
357
  assert_eq!(nilified_hash3, Some(expected_nil_hash.clone()));
323
358
  assert_eq!(nilified_hash4, Some(expected_nil_hash));
324
359
  }
360
+
361
+ // Failure if payload_hash does not match the stored value
362
+ #[test]
363
+ fn test_nilify_payload_hash_not_found_when_mismatch() {
364
+ let context = setup();
365
+ let env = &context.env;
366
+
367
+ let receiver = Address::generate(env);
368
+ let src_eid = 2;
369
+ let sender = BytesN::from_array(env, &[1u8; 32]);
370
+ let nonce = 1u64;
371
+ let payload_hash = BytesN::from_array(env, &[0xabu8; 32]);
372
+ let wrong_payload_hash = BytesN::from_array(env, &[0x11u8; 32]);
373
+
374
+ // Store a payload hash first.
375
+ context.inbound_as_verified(&receiver, src_eid, &sender, nonce, &payload_hash);
376
+
377
+ // Attempt nilify with wrong expected hash.
378
+ let wrong_payload_hash_opt = Some(wrong_payload_hash.clone());
379
+ let result = try_nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce, &wrong_payload_hash_opt);
380
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::PayloadHashNotFound.into());
381
+ }
382
+
383
+ #[test]
384
+ fn test_nilify_payload_hash_not_found_when_expected_some_but_storage_none() {
385
+ let context = setup();
386
+ let env = &context.env;
387
+
388
+ let receiver = Address::generate(env);
389
+ let src_eid = 2;
390
+ let sender = BytesN::from_array(env, &[1u8; 32]);
391
+ let nonce = 1u64;
392
+ let expected_hash = BytesN::from_array(env, &[0xabu8; 32]);
393
+
394
+ // Storage has no payload hash for (receiver, src_eid, sender, nonce).
395
+ let expected_hash_opt = Some(expected_hash);
396
+ let result = try_nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce, &expected_hash_opt);
397
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::PayloadHashNotFound.into());
398
+ }
399
+
400
+ #[test]
401
+ fn test_nilify_payload_hash_not_found_when_none_but_payload_exists() {
402
+ let context = setup();
403
+ let env = &context.env;
404
+ let endpoint_client = &context.endpoint_client;
405
+
406
+ let receiver = Address::generate(env);
407
+ let src_eid = 2;
408
+ let sender = BytesN::from_array(env, &[1u8; 32]);
409
+ let nonce = 1u64;
410
+ let payload_hash = BytesN::from_array(env, &[0xabu8; 32]);
411
+
412
+ // Store a payload hash first.
413
+ context.inbound_as_verified(&receiver, src_eid, &sender, nonce, &payload_hash);
414
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce), Some(payload_hash));
415
+
416
+ // Calling nilify with None should fail, because payload_hash must match the stored value.
417
+ let result = try_nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce, &None);
418
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::PayloadHashNotFound.into());
419
+ }
420
+
421
+ // Failure when nonce is already checkpointed and there is no stored payload hash
422
+ #[test]
423
+ fn test_nilify_invalid_nonce_when_already_checkpointed_without_payload() {
424
+ let context = setup();
425
+ let env = &context.env;
426
+ let endpoint_client = &context.endpoint_client;
427
+
428
+ let receiver = Address::generate(env);
429
+ let src_eid = 2;
430
+ let sender = BytesN::from_array(env, &[1u8; 32]);
431
+ let nonce = 1u64;
432
+
433
+ // Set lazy nonce to 1 and ensure there is NO payload for nonce 1.
434
+ env.as_contract(&endpoint_client.address, || {
435
+ storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &1)
436
+ });
437
+
438
+ let result = try_nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce, &None);
439
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::InvalidNonce.into());
440
+ }