@layerzerolabs/protocol-stellar-v2 0.2.13 → 0.2.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/.turbo/turbo-build.log +384 -278
  2. package/.turbo/turbo-lint.log +110 -78
  3. package/.turbo/turbo-test.log +1248 -1014
  4. package/Cargo.lock +130 -3
  5. package/Cargo.toml +2 -1
  6. package/contracts/common-macros/src/contract_impl.rs +6 -1
  7. package/contracts/common-macros/src/lib.rs +47 -8
  8. package/contracts/common-macros/src/ownable.rs +7 -25
  9. package/contracts/common-macros/src/storage.rs +1 -1
  10. package/contracts/common-macros/src/tests/contract_impl.rs +5 -0
  11. package/contracts/common-macros/src/tests/mod.rs +1 -0
  12. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_impl__snapshot_generated_contract_impl_code.snap +23 -7
  13. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +5 -25
  14. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +48 -48
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +5 -25
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +21 -0
  17. package/contracts/common-macros/src/tests/upgradeable.rs +31 -0
  18. package/contracts/common-macros/src/ttl_configurable.rs +14 -44
  19. package/contracts/common-macros/src/upgradeable.rs +76 -0
  20. package/contracts/endpoint-v2/src/endpoint_v2.rs +25 -1
  21. package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +175 -8
  22. package/contracts/endpoint-v2/src/tests/endpoint_v2/build_outbound_packet.rs +76 -0
  23. package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +342 -159
  24. package/contracts/endpoint-v2/src/tests/endpoint_v2/delegate.rs +3 -15
  25. package/contracts/endpoint-v2/src/tests/endpoint_v2/initializable.rs +20 -31
  26. package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +126 -164
  27. package/contracts/endpoint-v2/src/tests/endpoint_v2/mod.rs +1 -0
  28. package/contracts/endpoint-v2/src/tests/endpoint_v2/native_token.rs +0 -1
  29. package/contracts/endpoint-v2/src/tests/endpoint_v2/owner.rs +0 -1
  30. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +311 -304
  31. package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +423 -96
  32. package/contracts/endpoint-v2/src/tests/endpoint_v2/recover_token.rs +1 -1
  33. package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +47 -20
  34. package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +373 -403
  35. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +96 -22
  36. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +61 -9
  37. package/contracts/endpoint-v2/src/tests/endpoint_v2/transfer_ownership.rs +4 -4
  38. package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +8 -11
  39. package/contracts/endpoint-v2/src/tests/endpoint_v2/verifiable.rs +81 -30
  40. package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +209 -76
  41. package/contracts/endpoint-v2/src/tests/endpoint_v2/zro.rs +0 -1
  42. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library.rs +24 -0
  43. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library_timeout.rs +40 -0
  44. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_send_library.rs +24 -0
  45. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_config.rs +108 -0
  46. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_library_index.rs +52 -0
  47. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_receive_library.rs +92 -0
  48. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_registered_libraries.rs +74 -0
  49. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_send_library.rs +83 -0
  50. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_registered_library.rs +32 -0
  51. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_supported_eid.rs +28 -0
  52. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_valid_receive_library.rs +261 -0
  53. package/contracts/endpoint-v2/src/tests/message_lib_manager/mod.rs +16 -0
  54. package/contracts/endpoint-v2/src/tests/message_lib_manager/receive_library_timeout.rs +62 -0
  55. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +65 -43
  56. package/contracts/endpoint-v2/src/tests/message_lib_manager/registered_libraries_count.rs +42 -0
  57. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +61 -0
  58. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +3 -5
  59. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +59 -0
  60. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +15 -1
  61. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_config.rs +155 -51
  62. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +114 -92
  63. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +235 -132
  64. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +93 -87
  65. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +346 -245
  66. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +406 -60
  67. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +252 -78
  68. package/contracts/endpoint-v2/src/tests/message_lib_manager/timeout.rs +102 -0
  69. package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +212 -273
  70. package/contracts/endpoint-v2/src/tests/messaging_channel/clear_payload.rs +203 -0
  71. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound.rs +94 -0
  72. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_nonce.rs +78 -248
  73. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_payload_hash.rs +7 -282
  74. package/contracts/endpoint-v2/src/tests/messaging_channel/lazy_inbound_nonce.rs +6 -274
  75. package/contracts/endpoint-v2/src/tests/messaging_channel/mod.rs +3 -2
  76. package/contracts/endpoint-v2/src/tests/messaging_channel/next_guid.rs +86 -178
  77. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +328 -212
  78. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound.rs +68 -0
  79. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound_nonce.rs +6 -209
  80. package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +207 -159
  81. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +142 -153
  82. package/contracts/endpoint-v2/src/tests/messaging_composer/compose_queue.rs +6 -179
  83. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +163 -221
  84. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +90 -121
  85. package/contracts/endpoint-v2/src/tests/mock.rs +18 -4
  86. package/contracts/endpoint-v2/src/tests/util/build_payload.rs +4 -70
  87. package/contracts/endpoint-v2/src/tests/util/compute_guid.rs +2 -1
  88. package/contracts/endpoint-v2/src/tests/util/keccak256.rs +17 -106
  89. package/contracts/layerzero-views/Cargo.toml +35 -0
  90. package/contracts/layerzero-views/src/errors.rs +10 -0
  91. package/contracts/layerzero-views/src/layerzero_view.rs +229 -0
  92. package/contracts/layerzero-views/src/lib.rs +38 -0
  93. package/contracts/layerzero-views/src/storage.rs +18 -0
  94. package/contracts/layerzero-views/src/tests/layerzero_view_tests.rs +423 -0
  95. package/contracts/layerzero-views/src/tests/mod.rs +4 -0
  96. package/contracts/layerzero-views/src/tests/setup.rs +377 -0
  97. package/contracts/layerzero-views/src/types.rs +50 -0
  98. package/contracts/macro-integration-tests/Cargo.toml +30 -0
  99. package/contracts/macro-integration-tests/src/lib.rs +1 -0
  100. package/contracts/macro-integration-tests/tests/runtime/ownable/initialization.rs +62 -0
  101. package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +22 -0
  102. package/contracts/macro-integration-tests/tests/runtime/ownable/only_owner_guard.rs +97 -0
  103. package/contracts/macro-integration-tests/tests/runtime/ownable/ownership_transfer.rs +101 -0
  104. package/contracts/macro-integration-tests/tests/runtime/storage/keyed_roundtrip.rs +225 -0
  105. package/contracts/macro-integration-tests/tests/runtime/storage/mod.rs +4 -0
  106. package/contracts/macro-integration-tests/tests/runtime/storage/name_override_runtime.rs +52 -0
  107. package/contracts/macro-integration-tests/tests/runtime/storage/ttl_extension.rs +261 -0
  108. package/contracts/macro-integration-tests/tests/runtime/storage/unkeyed_roundtrip.rs +137 -0
  109. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +113 -0
  110. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/extend_instance_ttl.rs +50 -0
  111. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +139 -0
  112. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/mod.rs +3 -0
  113. package/contracts/macro-integration-tests/tests/runtime.rs +5 -0
  114. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.rs +12 -0
  115. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.stderr +7 -0
  116. package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.rs +12 -0
  117. package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.stderr +7 -0
  118. package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.rs +21 -0
  119. package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.stderr +7 -0
  120. package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.rs +13 -0
  121. package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.stderr +7 -0
  122. package/contracts/macro-integration-tests/tests/ui/error/pass/attr_on_variant_allowed.rs +20 -0
  123. package/contracts/macro-integration-tests/tests/ui/error/pass/basic_auto_discriminants.rs +15 -0
  124. package/contracts/macro-integration-tests/tests/ui/error/pass/mixed_discriminants.rs +16 -0
  125. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_owner_missing_env.rs +22 -0
  126. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_owner_missing_env.stderr +16 -0
  127. package/contracts/macro-integration-tests/tests/ui/ownable/pass/minimal_contract.rs +26 -0
  128. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +22 -0
  129. package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_owner_env_param_variants.rs +46 -0
  130. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.rs +13 -0
  131. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.stderr +7 -0
  132. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.rs +13 -0
  133. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.stderr +7 -0
  134. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.rs +10 -0
  135. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.stderr +7 -0
  136. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.rs +12 -0
  137. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.stderr +7 -0
  138. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.rs +10 -0
  139. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.stderr +7 -0
  140. package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.rs +10 -0
  141. package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.stderr +7 -0
  142. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.rs +12 -0
  143. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.stderr +7 -0
  144. package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.rs +13 -0
  145. package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.stderr +7 -0
  146. package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.rs +13 -0
  147. package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.stderr +7 -0
  148. package/contracts/macro-integration-tests/tests/ui/storage/pass/default_value_on_variant.rs +14 -0
  149. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_instance_unit_basic.rs +14 -0
  150. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_persistent_named_fields_keyed.rs +16 -0
  151. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_temporary_unit_option.rs +15 -0
  152. package/contracts/macro-integration-tests/tests/ui/storage/pass/name_override.rs +14 -0
  153. package/contracts/macro-integration-tests/tests/ui/storage/pass/no_auto_ttl_extension.rs +19 -0
  154. package/contracts/macro-integration-tests/tests/ui/storage/pass/ttl_provider_basic.rs +15 -0
  155. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/minimal_contract.rs +44 -0
  156. package/contracts/macro-integration-tests/tests/ui_error.rs +11 -0
  157. package/contracts/macro-integration-tests/tests/ui_ownable.rs +11 -0
  158. package/contracts/macro-integration-tests/tests/ui_storage.rs +11 -0
  159. package/contracts/macro-integration-tests/tests/ui_ttl_configurable.rs +12 -0
  160. package/contracts/message-libs/blocked-message-lib/src/lib.rs +17 -17
  161. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/decode_packet_header.rs +64 -0
  162. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet.rs +58 -0
  163. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet_header.rs +138 -0
  164. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/mod.rs +6 -0
  165. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload.rs +30 -0
  166. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload_hash.rs +15 -0
  167. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/test_helper.rs +39 -0
  168. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_dvn_option.rs +57 -0
  169. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_lz_receive_option.rs +50 -0
  170. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_native_drop_option.rs +74 -0
  171. package/contracts/message-libs/message-lib-common/src/tests/worker_options/convert_legacy_options.rs +280 -0
  172. package/contracts/message-libs/message-lib-common/src/tests/worker_options/extract_type_3_options.rs +126 -0
  173. package/contracts/message-libs/message-lib-common/src/tests/worker_options/left_pad_to_bytes32.rs +48 -0
  174. package/contracts/message-libs/message-lib-common/src/tests/worker_options/mod.rs +7 -0
  175. package/contracts/message-libs/message-lib-common/src/tests/worker_options/split_worker_options.rs +139 -0
  176. package/contracts/message-libs/message-lib-common/src/worker_options.rs +31 -1
  177. package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +2 -2
  178. package/contracts/message-libs/treasury/src/errors.rs +0 -1
  179. package/contracts/message-libs/treasury/src/lib.rs +3 -3
  180. package/contracts/message-libs/treasury/src/storage.rs +2 -0
  181. package/contracts/message-libs/treasury/src/treasury.rs +12 -13
  182. package/contracts/message-libs/uln-302/Cargo.toml +1 -1
  183. package/contracts/message-libs/uln-302/src/errors.rs +0 -5
  184. package/contracts/message-libs/uln-302/src/events.rs +5 -6
  185. package/contracts/message-libs/uln-302/src/receive_uln.rs +24 -54
  186. package/contracts/message-libs/uln-302/src/send_uln.rs +89 -135
  187. package/contracts/message-libs/uln-302/src/storage.rs +5 -5
  188. package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +5 -7
  189. package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +3 -3
  190. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +6 -9
  191. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +2 -2
  192. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +3 -3
  193. package/contracts/message-libs/uln-302/src/tests/setup.rs +9 -0
  194. package/contracts/message-libs/uln-302/src/tests/testing_utils.rs +5 -0
  195. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_receive_uln_config.rs +1 -2
  196. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_send_uln_config.rs +1 -2
  197. package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +37 -55
  198. package/contracts/message-libs/uln-302/src/uln302.rs +8 -5
  199. package/contracts/oapps/counter/src/counter.rs +0 -1
  200. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +306 -224
  201. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +0 -1
  202. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +0 -1
  203. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +0 -1
  204. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +0 -1
  205. package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_core.rs +1 -0
  206. package/contracts/oapps/oft/integration-tests/setup.rs +10 -3
  207. package/contracts/oapps/oft/integration-tests/utils.rs +1 -1
  208. package/contracts/oapps/oft/src/default_oft_impl.rs +9 -3
  209. package/contracts/oapps/oft/src/extensions/oft_fee.rs +5 -5
  210. package/contracts/oapps/oft/src/extensions/pausable.rs +1 -1
  211. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +18 -18
  212. package/contracts/oapps/oft/src/oft.rs +9 -9
  213. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +1 -1
  214. package/contracts/oapps/oft/src/tests/extensions/setup.rs +26 -11
  215. package/contracts/oapps/oft/src/tests/extensions/test_rate_limiter.rs +1 -1
  216. package/contracts/oapps/oft/src/tests/test_send.rs +4 -4
  217. package/contracts/oapps/oft/src/tests/test_utils.rs +93 -74
  218. package/contracts/oapps/oft-std/Cargo.toml +6 -0
  219. package/contracts/oapps/oft-std/integration-tests/extensions/mod.rs +3 -0
  220. package/contracts/oapps/oft-std/integration-tests/extensions/test_oft_fee.rs +157 -0
  221. package/contracts/oapps/oft-std/integration-tests/extensions/test_pausable.rs +162 -0
  222. package/contracts/oapps/oft-std/integration-tests/extensions/test_rate_limiter.rs +186 -0
  223. package/contracts/oapps/oft-std/integration-tests/mod.rs +3 -0
  224. package/contracts/oapps/oft-std/integration-tests/setup.rs +245 -0
  225. package/contracts/oapps/oft-std/integration-tests/utils.rs +427 -0
  226. package/contracts/oapps/oft-std/src/lib.rs +12 -1
  227. package/contracts/oapps/oft-std/src/oft.rs +122 -25
  228. package/contracts/upgrader/Cargo.toml +19 -0
  229. package/contracts/upgrader/src/lib.rs +96 -0
  230. package/contracts/upgrader/src/tests/mod.rs +1 -0
  231. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract1.wasm +0 -0
  232. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract2.wasm +0 -0
  233. package/contracts/upgrader/src/tests/test_upgrader.rs +120 -0
  234. package/contracts/utils/src/errors.rs +6 -1
  235. package/contracts/utils/src/lib.rs +2 -1
  236. package/contracts/utils/src/ownable.rs +49 -61
  237. package/contracts/utils/src/tests/mod.rs +3 -1
  238. package/contracts/utils/src/tests/option_ext.rs +21 -0
  239. package/contracts/utils/src/tests/ownable.rs +10 -69
  240. package/contracts/utils/src/tests/ttl_configurable.rs +596 -0
  241. package/contracts/utils/src/tests/upgradeable.rs +288 -0
  242. package/contracts/utils/src/{ttl.rs → ttl_configurable.rs} +67 -52
  243. package/contracts/utils/src/upgradeable.rs +54 -0
  244. package/contracts/workers/dvn/Cargo.toml +1 -1
  245. package/contracts/workers/dvn/src/auth.rs +21 -32
  246. package/contracts/workers/dvn/src/dvn.rs +40 -3
  247. package/contracts/workers/dvn/src/errors.rs +1 -0
  248. package/contracts/workers/dvn/src/multisig.rs +10 -6
  249. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +2 -2
  250. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +4 -4
  251. package/contracts/workers/dvn-fee-lib/Cargo.toml +1 -2
  252. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +46 -14
  253. package/contracts/workers/dvn-fee-lib/src/errors.rs +3 -2
  254. package/contracts/workers/dvn-fee-lib/src/lib.rs +5 -11
  255. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +30 -16
  256. package/contracts/workers/executor/src/executor.rs +16 -2
  257. package/contracts/workers/executor-fee-lib/src/errors.rs +9 -7
  258. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +154 -119
  259. package/contracts/workers/executor-helper/Cargo.toml +0 -5
  260. package/contracts/workers/executor-helper/src/lib.rs +1 -7
  261. package/contracts/workers/price-feed/Cargo.toml +0 -1
  262. package/contracts/workers/price-feed/src/errors.rs +3 -2
  263. package/contracts/workers/price-feed/src/lib.rs +5 -6
  264. package/contracts/workers/price-feed/src/price_feed.rs +39 -17
  265. package/contracts/workers/worker/Cargo.toml +4 -0
  266. package/contracts/workers/worker/src/interfaces/price_feed.rs +3 -3
  267. package/contracts/workers/worker/src/lib.rs +2 -2
  268. package/contracts/workers/worker/src/tests/mod.rs +4 -0
  269. package/contracts/workers/worker/src/tests/setup.rs +147 -0
  270. package/contracts/workers/worker/src/tests/worker.rs +501 -0
  271. package/contracts/workers/worker/src/worker.rs +10 -16
  272. package/package.json +3 -3
  273. package/sdk/dist/generated/bml.d.ts +40 -30
  274. package/sdk/dist/generated/bml.js +16 -11
  275. package/sdk/dist/generated/counter.d.ts +168 -134
  276. package/sdk/dist/generated/counter.js +26 -21
  277. package/sdk/dist/generated/dvn.d.ts +1932 -0
  278. package/sdk/dist/generated/dvn.js +288 -0
  279. package/sdk/dist/generated/dvn_fee_lib.d.ts +615 -0
  280. package/sdk/dist/generated/dvn_fee_lib.js +123 -0
  281. package/sdk/dist/generated/endpoint.d.ts +75 -41
  282. package/sdk/dist/generated/endpoint.js +22 -17
  283. package/sdk/dist/generated/executor.d.ts +1809 -0
  284. package/sdk/dist/generated/executor.js +269 -0
  285. package/sdk/dist/generated/executor_fee_lib.d.ts +999 -0
  286. package/sdk/dist/generated/executor_fee_lib.js +208 -0
  287. package/sdk/dist/generated/executor_helper.d.ts +869 -0
  288. package/sdk/dist/generated/executor_helper.js +187 -0
  289. package/sdk/dist/generated/oft_std.d.ts +1544 -0
  290. package/sdk/dist/generated/oft_std.js +271 -0
  291. package/sdk/dist/generated/price_feed.d.ts +1002 -0
  292. package/sdk/dist/generated/price_feed.js +170 -0
  293. package/sdk/dist/generated/sml.d.ts +75 -41
  294. package/sdk/dist/generated/sml.js +22 -17
  295. package/sdk/dist/generated/uln302.d.ts +79 -60
  296. package/sdk/dist/generated/uln302.js +37 -37
  297. package/sdk/dist/generated/upgrader.d.ts +70 -0
  298. package/sdk/dist/generated/upgrader.js +19 -0
  299. package/sdk/dist/index.d.ts +8 -0
  300. package/sdk/dist/index.js +11 -0
  301. package/sdk/package.json +4 -3
  302. package/sdk/src/index.ts +13 -0
  303. package/sdk/test/index.test.ts +0 -1
  304. package/sdk/test/oft.test.ts +12 -23
  305. package/sdk/test/suites/testUpgradeable.ts +169 -0
  306. package/sdk/test/upgrader.test.ts +309 -0
  307. package/tools/ts-bindings-gen/src/main.rs +11 -1
  308. package/contracts/endpoint-v2/src/tests/messaging_channel/clear.rs +0 -316
  309. package/contracts/endpoint-v2/src/tests/messaging_channel/internal.rs +0 -388
  310. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +0 -162
  311. package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +0 -319
  312. package/contracts/utils/src/tests/ttl.rs +0 -421
  313. /package/contracts/{oapp-macros → oapps/oapp-macros}/Cargo.toml +0 -0
  314. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/lib.rs +0 -0
  315. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_full.rs +0 -0
  316. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_options_type3.rs +0 -0
  317. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_receiver.rs +0 -0
  318. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_sender.rs +0 -0
  319. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/util.rs +0 -0
@@ -1,50 +1,100 @@
1
- use soroban_sdk::{testutils::Address as _, Address, BytesN, IntoVal};
2
-
3
- use crate::{endpoint_v2::EndpointV2, events::PacketBurnt, storage, tests::endpoint_setup::setup};
1
+ use soroban_sdk::{testutils::Address as _, Address, BytesN};
4
2
  use utils::testing_utils::assert_event;
5
3
 
4
+ use crate::{
5
+ errors::EndpointError,
6
+ events::PacketBurnt,
7
+ storage,
8
+ tests::endpoint_setup::{setup, TestSetup},
9
+ };
10
+
11
+ // Helpers
12
+ fn burn_with_auth(
13
+ context: &TestSetup,
14
+ caller: &Address,
15
+ receiver: &Address,
16
+ src_eid: u32,
17
+ sender: &BytesN<32>,
18
+ nonce: u64,
19
+ payload_hash: &BytesN<32>,
20
+ ) {
21
+ context.mock_auth(caller, "burn", (caller, receiver, &src_eid, sender, &nonce, payload_hash));
22
+ context.endpoint_client.burn(caller, receiver, &src_eid, sender, &nonce, payload_hash);
23
+ }
24
+
25
+ fn try_burn_with_auth(
26
+ context: &TestSetup,
27
+ caller: &Address,
28
+ receiver: &Address,
29
+ src_eid: u32,
30
+ sender: &BytesN<32>,
31
+ nonce: u64,
32
+ payload_hash: &BytesN<32>,
33
+ ) -> Result<Result<(), soroban_sdk::ConversionError>, Result<soroban_sdk::Error, soroban_sdk::InvokeError>> {
34
+ context.mock_auth(caller, "burn", (caller, receiver, &src_eid, sender, &nonce, payload_hash));
35
+ context.endpoint_client.try_burn(caller, receiver, &src_eid, sender, &nonce, payload_hash)
36
+ }
37
+
38
+ // Authorization (receiver or delegate(receiver) must authorize)
6
39
  #[test]
7
- fn test_burn_success() {
8
- let test_setup = setup();
9
- let env = &test_setup.env;
10
- let endpoint_client = &test_setup.endpoint_client;
40
+ fn test_burn_unauthorized() {
41
+ let context = setup();
42
+ let env = &context.env;
43
+ let endpoint_client = &context.endpoint_client;
11
44
 
12
45
  let receiver = Address::generate(env);
46
+ let unauthorized = Address::generate(env);
13
47
  let src_eid = 2;
14
48
  let sender = BytesN::from_array(env, &[1u8; 32]);
15
- let nonce = 1;
49
+ let nonce = 1u64;
50
+ let payload_hash = BytesN::from_array(env, &[0xabu8; 32]);
51
+
52
+ let result = endpoint_client.try_burn(&unauthorized, &receiver, &src_eid, &sender, &nonce, &payload_hash);
53
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::Unauthorized.into());
54
+ }
55
+
56
+ #[test]
57
+ #[should_panic(expected = "Error(Auth, InvalidAction)")]
58
+ fn test_burn_requires_auth_even_when_caller_is_receiver() {
59
+ let context = setup();
60
+ let env = &context.env;
61
+ let endpoint_client = &context.endpoint_client;
62
+
63
+ let receiver = Address::generate(env);
64
+ let src_eid = 2;
65
+ let sender = BytesN::from_array(env, &[1u8; 32]);
66
+ let nonce = 1u64;
67
+ let payload_hash = BytesN::from_array(env, &[0xabu8; 32]);
68
+
69
+ // No mock_auth here: require_oapp_auth passes the (caller == receiver) check,
70
+ // then panics at caller.require_auth().
71
+ endpoint_client.burn(&receiver, &receiver, &src_eid, &sender, &nonce, &payload_hash);
72
+ }
73
+
74
+ // Successful burn removes stored payload hash (state update + event emission)
75
+ #[test]
76
+ fn test_burn_success_with_stored_payload() {
77
+ let context = setup();
78
+ let env = &context.env;
79
+ let endpoint_client = &context.endpoint_client;
80
+
81
+ let receiver = Address::generate(env);
82
+ let src_eid = 2;
83
+ let sender = BytesN::from_array(env, &[1u8; 32]);
84
+ let nonce = 1u64;
16
85
  let payload_hash = BytesN::from_array(env, &[0xabu8; 32]);
17
86
 
18
- // Set lazy nonce to 1 so nonce 1 is <= lazy nonce
19
- env.as_contract(&endpoint_client.address, || {
20
- storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &1)
21
- });
22
-
23
- // Store a payload hash first
24
- env.as_contract(&endpoint_client.address, || {
25
- EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce, &payload_hash)
26
- });
27
-
28
- // Verify payload hash is stored
29
- let stored_hash = env.as_contract(&endpoint_client.address, || {
30
- storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce)
31
- });
32
- assert_eq!(stored_hash, Some(payload_hash.clone()));
33
-
34
- // Burn the payload
35
- endpoint_client
36
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
37
- address: &receiver,
38
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
39
- contract: &endpoint_client.address,
40
- fn_name: "burn",
41
- args: (&receiver, &receiver, &src_eid, &sender, &nonce, &payload_hash).into_val(env),
42
- sub_invokes: &[],
43
- },
44
- }])
45
- .burn(&receiver, &receiver, &src_eid, &sender, &nonce, &payload_hash);
46
-
47
- // Verify PacketBurnt event was emitted
87
+ // Boundary condition: burn requires nonce <= lazy_nonce.
88
+ context.set_lazy_inbound_nonce(&receiver, src_eid, &sender, nonce);
89
+
90
+ // Store a payload hash first.
91
+ context.inbound_as_verified(&receiver, src_eid, &sender, nonce, &payload_hash);
92
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce), Some(payload_hash.clone()));
93
+
94
+ // Burn the payload.
95
+ burn_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce, &payload_hash);
96
+
97
+ // Verify PacketBurnt event was emitted.
48
98
  assert_event(
49
99
  env,
50
100
  &endpoint_client.address,
@@ -57,18 +107,16 @@ fn test_burn_success() {
57
107
  },
58
108
  );
59
109
 
60
- // Verify payload hash was removed
61
- let removed_hash: Option<BytesN<32>> = env.as_contract(&endpoint_client.address, || {
62
- storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce)
63
- });
64
- assert_eq!(removed_hash, None);
110
+ // Verify payload hash was removed.
111
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce), None);
65
112
  }
66
113
 
114
+ // Delegate authorization (delegate(receiver) is allowed)
67
115
  #[test]
68
116
  fn test_burn_with_delegate() {
69
- let test_setup = setup();
70
- let env = &test_setup.env;
71
- let endpoint_client = &test_setup.endpoint_client;
117
+ let context = setup();
118
+ let env = &context.env;
119
+ let endpoint_client = &context.endpoint_client;
72
120
 
73
121
  let receiver = Address::generate(env);
74
122
  let delegate = Address::generate(env);
@@ -77,33 +125,19 @@ fn test_burn_with_delegate() {
77
125
  let nonce = 1;
78
126
  let payload_hash = BytesN::from_array(env, &[0xcdu8; 32]);
79
127
 
80
- // Set delegate for receiver
128
+ // Set delegate for receiver.
81
129
  env.as_contract(&endpoint_client.address, || storage::EndpointStorage::set_delegate(env, &receiver, &delegate));
82
130
 
83
- // Set lazy nonce to 1 so nonce 1 is <= lazy nonce
84
- env.as_contract(&endpoint_client.address, || {
85
- storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &1)
86
- });
87
-
88
- // Store a payload hash first
89
- env.as_contract(&endpoint_client.address, || {
90
- EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce, &payload_hash)
91
- });
92
-
93
- // Delegate can burn on behalf of receiver
94
- endpoint_client
95
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
96
- address: &delegate,
97
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
98
- contract: &endpoint_client.address,
99
- fn_name: "burn",
100
- args: (&delegate, &receiver, &src_eid, &sender, &nonce, &payload_hash).into_val(env),
101
- sub_invokes: &[],
102
- },
103
- }])
104
- .burn(&delegate, &receiver, &src_eid, &sender, &nonce, &payload_hash);
105
-
106
- // Verify PacketBurnt event was emitted
131
+ // Burn requires nonce <= lazy_nonce.
132
+ context.set_lazy_inbound_nonce(&receiver, src_eid, &sender, 1);
133
+
134
+ // Store a payload hash first.
135
+ context.inbound_as_verified(&receiver, src_eid, &sender, nonce, &payload_hash);
136
+
137
+ // Delegate can burn on behalf of receiver.
138
+ burn_with_auth(&context, &delegate, &receiver, src_eid, &sender, nonce, &payload_hash);
139
+
140
+ // Verify PacketBurnt event was emitted.
107
141
  assert_event(
108
142
  env,
109
143
  &endpoint_client.address,
@@ -116,18 +150,16 @@ fn test_burn_with_delegate() {
116
150
  },
117
151
  );
118
152
 
119
- // Verify payload hash was removed
120
- let removed_hash = env.as_contract(&endpoint_client.address, || {
121
- storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce)
122
- });
123
- assert_eq!(removed_hash, None);
153
+ // Verify payload hash was removed.
154
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce), None);
124
155
  }
125
156
 
157
+ // Burn affects only the targeted nonce (multiple nonces stay independent)
126
158
  #[test]
127
159
  fn test_burn_multiple_payloads() {
128
- let test_setup = setup();
129
- let env = &test_setup.env;
130
- let endpoint_client = &test_setup.endpoint_client;
160
+ let context = setup();
161
+ let env = &context.env;
162
+ let endpoint_client = &context.endpoint_client;
131
163
 
132
164
  let receiver = Address::generate(env);
133
165
  let src_eid = 2;
@@ -137,62 +169,30 @@ fn test_burn_multiple_payloads() {
137
169
  let nonce1 = 1;
138
170
  let nonce2 = 2;
139
171
 
140
- // Set lazy nonce to 2 so both nonces are <= lazy nonce
141
- env.as_contract(&endpoint_client.address, || {
142
- storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &2)
143
- });
144
-
145
- // Store multiple payload hashes
146
- env.as_contract(&endpoint_client.address, || {
147
- EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce1, &payload_hash1)
148
- });
149
- env.as_contract(&endpoint_client.address, || {
150
- EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce2, &payload_hash2)
151
- });
152
-
153
- // Burn first payload
154
- endpoint_client
155
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
156
- address: &receiver,
157
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
158
- contract: &endpoint_client.address,
159
- fn_name: "burn",
160
- args: (&receiver, &receiver, &src_eid, &sender, &nonce1, &payload_hash1).into_val(env),
161
- sub_invokes: &[],
162
- },
163
- }])
164
- .burn(&receiver, &receiver, &src_eid, &sender, &nonce1, &payload_hash1);
165
-
166
- // Burn second payload
167
- endpoint_client
168
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
169
- address: &receiver,
170
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
171
- contract: &endpoint_client.address,
172
- fn_name: "burn",
173
- args: (&receiver, &receiver, &src_eid, &sender, &nonce2, &payload_hash2).into_val(env),
174
- sub_invokes: &[],
175
- },
176
- }])
177
- .burn(&receiver, &receiver, &src_eid, &sender, &nonce2, &payload_hash2);
178
-
179
- // Verify both payload hashes were removed
180
- let removed_hash1 = env.as_contract(&endpoint_client.address, || {
181
- storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce1)
182
- });
183
- let removed_hash2 = env.as_contract(&endpoint_client.address, || {
184
- storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce2)
185
- });
186
-
187
- assert_eq!(removed_hash1, None);
188
- assert_eq!(removed_hash2, None);
172
+ // Burn requires nonce <= lazy_nonce.
173
+ context.set_lazy_inbound_nonce(&receiver, src_eid, &sender, 2);
174
+
175
+ // Store multiple payload hashes.
176
+ context.inbound_as_verified(&receiver, src_eid, &sender, nonce1, &payload_hash1);
177
+ context.inbound_as_verified(&receiver, src_eid, &sender, nonce2, &payload_hash2);
178
+
179
+ // Burn first payload.
180
+ burn_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce1, &payload_hash1);
181
+
182
+ // Burn second payload.
183
+ burn_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce2, &payload_hash2);
184
+
185
+ // Verify both payload hashes were removed.
186
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce1), None);
187
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce2), None);
189
188
  }
190
189
 
190
+ // Path isolation (receiver/src_eid/sender are isolated)
191
191
  #[test]
192
192
  fn test_burn_different_paths() {
193
- let test_setup = setup();
194
- let env = &test_setup.env;
195
- let endpoint_client = &test_setup.endpoint_client;
193
+ let context = setup();
194
+ let env = &context.env;
195
+ let endpoint_client = &context.endpoint_client;
196
196
 
197
197
  let receiver1 = Address::generate(env);
198
198
  let receiver2 = Address::generate(env);
@@ -203,156 +203,95 @@ fn test_burn_different_paths() {
203
203
  let nonce = 1;
204
204
  let payload_hash = BytesN::from_array(env, &[0xefu8; 32]);
205
205
 
206
- // Set lazy nonces for all paths
207
- env.as_contract(&endpoint_client.address, || {
208
- storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver1, src_eid1, &sender1, &1)
209
- });
210
- env.as_contract(&endpoint_client.address, || {
211
- storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver2, src_eid1, &sender1, &1)
212
- });
213
- env.as_contract(&endpoint_client.address, || {
214
- storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver1, src_eid2, &sender1, &1)
215
- });
216
- env.as_contract(&endpoint_client.address, || {
217
- storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver1, src_eid1, &sender2, &1)
218
- });
219
-
220
- // Store payload hashes for different paths
221
- env.as_contract(&endpoint_client.address, || {
222
- EndpointV2::inbound(env, &receiver1, src_eid1, &sender1, nonce, &payload_hash)
223
- });
224
- env.as_contract(&endpoint_client.address, || {
225
- EndpointV2::inbound(env, &receiver2, src_eid1, &sender1, nonce, &payload_hash)
226
- });
227
- env.as_contract(&endpoint_client.address, || {
228
- EndpointV2::inbound(env, &receiver1, src_eid2, &sender1, nonce, &payload_hash)
229
- });
230
- env.as_contract(&endpoint_client.address, || {
231
- EndpointV2::inbound(env, &receiver1, src_eid1, &sender2, nonce, &payload_hash)
232
- });
233
-
234
- // Burn for different receivers
235
- endpoint_client
236
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
237
- address: &receiver1,
238
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
239
- contract: &endpoint_client.address,
240
- fn_name: "burn",
241
- args: (&receiver1, &receiver1, &src_eid1, &sender1, &nonce, &payload_hash).into_val(env),
242
- sub_invokes: &[],
243
- },
244
- }])
245
- .burn(&receiver1, &receiver1, &src_eid1, &sender1, &nonce, &payload_hash);
246
-
247
- endpoint_client
248
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
249
- address: &receiver2,
250
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
251
- contract: &endpoint_client.address,
252
- fn_name: "burn",
253
- args: (&receiver2, &receiver2, &src_eid1, &sender1, &nonce, &payload_hash).into_val(env),
254
- sub_invokes: &[],
255
- },
256
- }])
257
- .burn(&receiver2, &receiver2, &src_eid1, &sender1, &nonce, &payload_hash);
258
-
259
- // Burn for different src_eids
260
- endpoint_client
261
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
262
- address: &receiver1,
263
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
264
- contract: &endpoint_client.address,
265
- fn_name: "burn",
266
- args: (&receiver1, &receiver1, &src_eid2, &sender1, &nonce, &payload_hash).into_val(env),
267
- sub_invokes: &[],
268
- },
269
- }])
270
- .burn(&receiver1, &receiver1, &src_eid2, &sender1, &nonce, &payload_hash);
271
-
272
- // Burn for different senders
273
- endpoint_client
274
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
275
- address: &receiver1,
276
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
277
- contract: &endpoint_client.address,
278
- fn_name: "burn",
279
- args: (&receiver1, &receiver1, &src_eid1, &sender2, &nonce, &payload_hash).into_val(env),
280
- sub_invokes: &[],
281
- },
282
- }])
283
- .burn(&receiver1, &receiver1, &src_eid1, &sender2, &nonce, &payload_hash);
284
-
285
- // Verify all paths have been burned independently
286
- let removed_hash1 = env.as_contract(&endpoint_client.address, || {
287
- storage::EndpointStorage::inbound_payload_hash(env, &receiver1, src_eid1, &sender1, nonce)
288
- });
289
- let removed_hash2 = env.as_contract(&endpoint_client.address, || {
290
- storage::EndpointStorage::inbound_payload_hash(env, &receiver2, src_eid1, &sender1, nonce)
291
- });
292
- let removed_hash3 = env.as_contract(&endpoint_client.address, || {
293
- storage::EndpointStorage::inbound_payload_hash(env, &receiver1, src_eid2, &sender1, nonce)
294
- });
295
- let removed_hash4 = env.as_contract(&endpoint_client.address, || {
296
- storage::EndpointStorage::inbound_payload_hash(env, &receiver1, src_eid1, &sender2, nonce)
297
- });
298
-
299
- assert_eq!(removed_hash1, None);
300
- assert_eq!(removed_hash2, None);
301
- assert_eq!(removed_hash3, None);
302
- assert_eq!(removed_hash4, None);
206
+ // Burn requires nonce <= lazy_nonce.
207
+ context.set_lazy_inbound_nonce(&receiver1, src_eid1, &sender1, 1);
208
+ context.set_lazy_inbound_nonce(&receiver2, src_eid1, &sender1, 1);
209
+ context.set_lazy_inbound_nonce(&receiver1, src_eid2, &sender1, 1);
210
+ context.set_lazy_inbound_nonce(&receiver1, src_eid1, &sender2, 1);
211
+
212
+ // Store payload hashes for different paths.
213
+ context.inbound_as_verified(&receiver1, src_eid1, &sender1, nonce, &payload_hash);
214
+ context.inbound_as_verified(&receiver2, src_eid1, &sender1, nonce, &payload_hash);
215
+ context.inbound_as_verified(&receiver1, src_eid2, &sender1, nonce, &payload_hash);
216
+ context.inbound_as_verified(&receiver1, src_eid1, &sender2, nonce, &payload_hash);
217
+
218
+ // Burn for different receivers.
219
+ burn_with_auth(&context, &receiver1, &receiver1, src_eid1, &sender1, nonce, &payload_hash);
220
+
221
+ burn_with_auth(&context, &receiver2, &receiver2, src_eid1, &sender1, nonce, &payload_hash);
222
+
223
+ // Burn for different src_eids.
224
+ burn_with_auth(&context, &receiver1, &receiver1, src_eid2, &sender1, nonce, &payload_hash);
225
+
226
+ // Burn for different senders.
227
+ burn_with_auth(&context, &receiver1, &receiver1, src_eid1, &sender2, nonce, &payload_hash);
228
+
229
+ // Verify all paths have been burned independently.
230
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver1, &src_eid1, &sender1, &nonce), None);
231
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver2, &src_eid1, &sender1, &nonce), None);
232
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver1, &src_eid2, &sender1, &nonce), None);
233
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver1, &src_eid1, &sender2, &nonce), None);
303
234
  }
304
235
 
236
+ // Failure if payload_hash does not match the stored value
305
237
  #[test]
306
- fn test_burn_at_lazy_nonce_boundary() {
307
- let test_setup = setup();
308
- let env = &test_setup.env;
309
- let endpoint_client = &test_setup.endpoint_client;
238
+ fn test_burn_payload_hash_not_found_when_mismatch() {
239
+ let context = setup();
240
+ let env = &context.env;
241
+ let endpoint_client = &context.endpoint_client;
310
242
 
311
243
  let receiver = Address::generate(env);
312
244
  let src_eid = 2;
313
245
  let sender = BytesN::from_array(env, &[1u8; 32]);
314
- let nonce = 5;
246
+ let nonce = 1u64;
315
247
  let payload_hash = BytesN::from_array(env, &[0xabu8; 32]);
248
+ let wrong_payload_hash = BytesN::from_array(env, &[0x11u8; 32]);
316
249
 
317
- // Set lazy nonce to exactly the nonce we want to burn
318
- env.as_contract(&endpoint_client.address, || {
319
- storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &nonce)
320
- });
321
-
322
- // Store a payload hash
323
- env.as_contract(&endpoint_client.address, || {
324
- EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce, &payload_hash)
325
- });
326
-
327
- // Burn should succeed since nonce == lazy_nonce (nonce <= lazy_nonce)
328
- endpoint_client
329
- .mock_auths(&[soroban_sdk::testutils::MockAuth {
330
- address: &receiver,
331
- invoke: &soroban_sdk::testutils::MockAuthInvoke {
332
- contract: &endpoint_client.address,
333
- fn_name: "burn",
334
- args: (&receiver, &receiver, &src_eid, &sender, &nonce, &payload_hash).into_val(env),
335
- sub_invokes: &[],
336
- },
337
- }])
338
- .burn(&receiver, &receiver, &src_eid, &sender, &nonce, &payload_hash);
339
-
340
- // Verify PacketBurnt event was emitted
341
- assert_event(
342
- env,
343
- &endpoint_client.address,
344
- PacketBurnt {
345
- src_eid,
346
- sender: sender.clone(),
347
- receiver: receiver.clone(),
348
- nonce,
349
- payload_hash: payload_hash.clone(),
350
- },
351
- );
250
+ // Burn requires nonce <= lazy_nonce.
251
+ context.set_lazy_inbound_nonce(&receiver, src_eid, &sender, nonce);
252
+
253
+ // Store a payload hash first.
254
+ context.inbound_as_verified(&receiver, src_eid, &sender, nonce, &payload_hash);
255
+ assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce), Some(payload_hash.clone()));
256
+
257
+ // Mismatched expected hash should fail.
258
+ let result = try_burn_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce, &wrong_payload_hash);
259
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::PayloadHashNotFound.into());
260
+ }
261
+
262
+ #[test]
263
+ fn test_burn_payload_hash_not_found_when_storage_none() {
264
+ let context = setup();
265
+ let env = &context.env;
266
+
267
+ let receiver = Address::generate(env);
268
+ let src_eid = 2;
269
+ let sender = BytesN::from_array(env, &[1u8; 32]);
270
+ let nonce = 1u64;
271
+ let payload_hash = BytesN::from_array(env, &[0xabu8; 32]);
272
+
273
+ // Even if nonce <= lazy_nonce, burn must fail without a stored payload hash.
274
+ context.set_lazy_inbound_nonce(&receiver, src_eid, &sender, nonce);
275
+ let result = try_burn_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce, &payload_hash);
276
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::PayloadHashNotFound.into());
277
+ }
278
+
279
+ // Failure when nonce is greater than lazy nonce
280
+ #[test]
281
+ fn test_burn_invalid_nonce_when_greater_than_lazy_nonce() {
282
+ let context = setup();
283
+ let env = &context.env;
284
+
285
+ let receiver = Address::generate(env);
286
+ let src_eid = 2;
287
+ let sender = BytesN::from_array(env, &[1u8; 32]);
288
+ let nonce = 2u64;
289
+ let payload_hash = BytesN::from_array(env, &[0xabu8; 32]);
290
+
291
+ // lazy nonce is 1, trying to burn nonce 2 should fail.
292
+ context.set_lazy_inbound_nonce(&receiver, src_eid, &sender, 1);
293
+ context.inbound_as_verified(&receiver, src_eid, &sender, nonce, &payload_hash);
352
294
 
353
- // Verify payload hash was removed
354
- let removed_hash = env.as_contract(&endpoint_client.address, || {
355
- storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce)
356
- });
357
- assert_eq!(removed_hash, None);
295
+ let result = try_burn_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce, &payload_hash);
296
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::InvalidNonce.into());
358
297
  }