@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,18 +1,76 @@
1
+ use soroban_sdk::{testutils::Address as _, Address, Bytes, BytesN};
2
+ use utils::testing_utils::assert_event;
3
+
1
4
  use crate::{
5
+ errors::EndpointError,
2
6
  events::PacketDelivered,
3
- storage,
7
+ tests::endpoint_setup::TestSetup,
4
8
  tests::{endpoint_setup::setup, mock::MockReceiver},
5
9
  util::{build_payload, keccak256},
6
10
  Origin,
7
11
  };
8
- use soroban_sdk::{
9
- testutils::{MockAuth, MockAuthInvoke},
10
- vec, Bytes, BytesN, IntoVal,
11
- };
12
- use utils::testing_utils::assert_event;
13
12
 
13
+ fn build_payload_hash(env: &soroban_sdk::Env, guid: &BytesN<32>, message: &Bytes) -> BytesN<32> {
14
+ let payload = build_payload(env, guid, message);
15
+ keccak256(env, &payload)
16
+ }
17
+
18
+ fn verify_packet_with_auth(
19
+ context: &TestSetup,
20
+ receive_lib: &soroban_sdk::Address,
21
+ origin: &Origin,
22
+ receiver: &soroban_sdk::Address,
23
+ payload_hash: &BytesN<32>,
24
+ ) {
25
+ context.mock_auth(receive_lib, "verify", (receive_lib, origin, receiver, payload_hash));
26
+ context.endpoint_client.verify(receive_lib, origin, receiver, payload_hash);
27
+ }
28
+
29
+ fn clear_packet_with_auth(
30
+ context: &TestSetup,
31
+ caller: &soroban_sdk::Address,
32
+ origin: &Origin,
33
+ receiver: &soroban_sdk::Address,
34
+ guid: &BytesN<32>,
35
+ message: &Bytes,
36
+ ) {
37
+ context.mock_auth(caller, "clear", (caller, origin, receiver, guid, message));
38
+ context.endpoint_client.clear(caller, origin, receiver, guid, message);
39
+ }
40
+
41
+ fn try_clear_packet_with_auth(
42
+ context: &TestSetup,
43
+ caller: &soroban_sdk::Address,
44
+ origin: &Origin,
45
+ receiver: &soroban_sdk::Address,
46
+ guid: &BytesN<32>,
47
+ message: &Bytes,
48
+ ) -> Result<Result<(), soroban_sdk::ConversionError>, Result<soroban_sdk::Error, soroban_sdk::InvokeError>> {
49
+ context.mock_auth(caller, "clear", (caller, origin, receiver, guid, message));
50
+ context.endpoint_client.try_clear(caller, origin, receiver, guid, message)
51
+ }
52
+
53
+ fn arrange_verified_packet_with_auth(
54
+ context: &TestSetup,
55
+ src_eid: u32,
56
+ sender: &BytesN<32>,
57
+ receiver: &soroban_sdk::Address,
58
+ nonce: u64,
59
+ guid: &BytesN<32>,
60
+ message: &Bytes,
61
+ ) -> (soroban_sdk::Address, Origin, BytesN<32>) {
62
+ let receive_lib = context.setup_default_receive_lib(src_eid, 0);
63
+ let origin = Origin { src_eid, sender: sender.clone(), nonce };
64
+ let payload_hash = build_payload_hash(&context.env, guid, message);
65
+
66
+ verify_packet_with_auth(context, &receive_lib, &origin, receiver, &payload_hash);
67
+
68
+ (receive_lib, origin, payload_hash)
69
+ }
70
+
71
+ // Inbound payload hash storage / removal
14
72
  #[test]
15
- fn test_clear_success() {
73
+ fn test_clear_removes_inbound_payload_hash() {
16
74
  let context = setup();
17
75
  let env = &context.env;
18
76
  let endpoint_client = &context.endpoint_client;
@@ -22,83 +80,48 @@ fn test_clear_success() {
22
80
  let receiver = env.register(MockReceiver, ());
23
81
  let nonce = 1u64;
24
82
 
25
- // Setup receive library
26
- let receive_lib = context.setup_mock_receive_lib(vec![env, src_eid]);
27
- context.mock_owner_auth("register_library", (&receive_lib,));
28
- endpoint_client.register_library(&receive_lib);
29
- context.mock_owner_auth("set_default_receive_library", (&src_eid, &receive_lib, &0u64));
30
- endpoint_client.set_default_receive_library(&src_eid, &receive_lib, &0);
31
-
32
- // Create message and payload
33
83
  let message = Bytes::from_array(env, &[1, 2, 3, 4]);
34
84
  let guid = BytesN::from_array(env, &[5u8; 32]);
35
- let payload = build_payload(env, &guid, &message);
36
- let payload_hash = keccak256(env, &payload);
37
-
38
- let origin = Origin { src_eid, sender: sender.clone(), nonce };
39
-
40
- // First verify the packet
41
- env.mock_auths(&[MockAuth {
42
- address: &receive_lib,
43
- invoke: &MockAuthInvoke {
44
- contract: &endpoint_client.address,
45
- fn_name: "verify",
46
- args: (&receive_lib, &origin, &receiver, &payload_hash).into_val(env),
47
- sub_invokes: &[],
48
- },
49
- }]);
50
- endpoint_client.verify(&receive_lib, &origin, &receiver, &payload_hash);
85
+ let (_receive_lib, origin, payload_hash) =
86
+ arrange_verified_packet_with_auth(&context, src_eid, &sender, &receiver, nonce, &guid, &message);
51
87
 
52
88
  // Verify payload hash exists before clear
53
- let hash_before_clear = env.as_contract(&endpoint_client.address, || {
54
- storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce)
55
- });
89
+ let hash_before_clear = endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce);
56
90
  assert_eq!(hash_before_clear, Some(payload_hash.clone()), "Payload hash should exist before clear");
57
91
 
58
- // Verify initial lazy inbound nonce
59
- let initial_lazy_nonce = env.as_contract(&endpoint_client.address, || {
60
- storage::EndpointStorage::lazy_inbound_nonce(env, &receiver, src_eid, &sender)
61
- });
62
- assert_eq!(initial_lazy_nonce, 0, "Initial lazy inbound nonce should be 0");
63
-
64
92
  // Now clear the payload
65
- env.mock_auths(&[MockAuth {
66
- address: &receiver,
67
- invoke: &MockAuthInvoke {
68
- contract: &endpoint_client.address,
69
- fn_name: "clear",
70
- args: (&receiver, &origin, &receiver, &guid, &message).into_val(env),
71
- sub_invokes: &[],
72
- },
73
- }]);
74
- endpoint_client.clear(&receiver, &origin, &receiver, &guid, &message);
75
-
76
- // Verify PacketDelivered event was published
77
- assert_event(env, &endpoint_client.address, PacketDelivered { origin: origin.clone(), receiver: receiver.clone() });
93
+ clear_packet_with_auth(&context, &receiver, &origin, &receiver, &guid, &message);
78
94
 
79
95
  // Verify payload hash was removed via public interface
80
96
  let stored_hash = endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce);
81
97
  assert_eq!(stored_hash, None);
98
+ }
82
99
 
83
- // Assert storage change directly - payload hash removed
84
- let stored_hash_direct = env.as_contract(&endpoint_client.address, || {
85
- storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce)
86
- });
87
- assert_eq!(stored_hash_direct, None, "Storage should have payload hash removed");
100
+ // Event emission
101
+ #[test]
102
+ fn test_clear_emits_packet_delivered_event() {
103
+ let context = setup();
104
+ let env = &context.env;
105
+ let endpoint_client = &context.endpoint_client;
88
106
 
89
- // Verify lazy inbound nonce was updated via public interface
90
- let lazy_nonce = endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender);
91
- assert_eq!(lazy_nonce, nonce);
107
+ let src_eid = 2u32;
108
+ let sender = BytesN::from_array(env, &[1u8; 32]);
109
+ let receiver = env.register(MockReceiver, ());
110
+ let nonce = 1u64;
111
+
112
+ let message = Bytes::from_array(env, &[1, 2, 3, 4]);
113
+ let guid = BytesN::from_array(env, &[5u8; 32]);
114
+ let (_receive_lib, origin, _payload_hash) =
115
+ arrange_verified_packet_with_auth(&context, src_eid, &sender, &receiver, nonce, &guid, &message);
116
+
117
+ clear_packet_with_auth(&context, &receiver, &origin, &receiver, &guid, &message);
92
118
 
93
- // Assert storage change directly - lazy inbound nonce updated
94
- let stored_lazy_nonce = env.as_contract(&endpoint_client.address, || {
95
- storage::EndpointStorage::lazy_inbound_nonce(env, &receiver, src_eid, &sender)
96
- });
97
- assert_eq!(stored_lazy_nonce, nonce, "Storage should contain updated lazy inbound nonce");
119
+ assert_event(env, &endpoint_client.address, PacketDelivered { origin: origin.clone(), receiver: receiver.clone() });
98
120
  }
99
121
 
122
+ // Lazy inbound nonce updates
100
123
  #[test]
101
- fn test_clear_updates_lazy_nonce() {
124
+ fn test_clear_updates_lazy_inbound_nonce() {
102
125
  let context = setup();
103
126
  let env = &context.env;
104
127
  let endpoint_client = &context.endpoint_client;
@@ -108,56 +131,25 @@ fn test_clear_updates_lazy_nonce() {
108
131
  let receiver = env.register(MockReceiver, ());
109
132
  let nonce = 1u64;
110
133
 
111
- // Setup receive library
112
- let receive_lib = context.setup_mock_receive_lib(vec![env, src_eid]);
113
- context.mock_owner_auth("register_library", (&receive_lib,));
114
- endpoint_client.register_library(&receive_lib);
115
- context.mock_owner_auth("set_default_receive_library", (&src_eid, &receive_lib, &0u64));
116
- endpoint_client.set_default_receive_library(&src_eid, &receive_lib, &0);
117
-
118
- // Create message and payload
119
134
  let message = Bytes::from_array(env, &[1, 2, 3, 4]);
120
135
  let guid = BytesN::from_array(env, &[5u8; 32]);
121
- let payload = build_payload(env, &guid, &message);
122
- let payload_hash = keccak256(env, &payload);
136
+ let (_receive_lib, origin, _payload_hash) =
137
+ arrange_verified_packet_with_auth(&context, src_eid, &sender, &receiver, nonce, &guid, &message);
123
138
 
124
- let origin = Origin { src_eid, sender: sender.clone(), nonce };
125
-
126
- // First verify the packet
127
- env.mock_auths(&[MockAuth {
128
- address: &receive_lib,
129
- invoke: &MockAuthInvoke {
130
- contract: &endpoint_client.address,
131
- fn_name: "verify",
132
- args: (&receive_lib, &origin, &receiver, &payload_hash).into_val(env),
133
- sub_invokes: &[],
134
- },
135
- }]);
136
- endpoint_client.verify(&receive_lib, &origin, &receiver, &payload_hash);
137
-
138
- // Check initial lazy nonce
139
+ // Verify initial lazy inbound nonce
139
140
  let initial_lazy_nonce = endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender);
140
- assert_eq!(initial_lazy_nonce, 0);
141
-
142
- // Clear the payload
143
- env.mock_auths(&[MockAuth {
144
- address: &receiver,
145
- invoke: &MockAuthInvoke {
146
- contract: &endpoint_client.address,
147
- fn_name: "clear",
148
- args: (&receiver, &origin, &receiver, &guid, &message).into_val(env),
149
- sub_invokes: &[],
150
- },
151
- }]);
152
- endpoint_client.clear(&receiver, &origin, &receiver, &guid, &message);
153
-
154
- // Verify lazy inbound nonce was updated
141
+ assert_eq!(initial_lazy_nonce, 0, "Initial lazy inbound nonce should be 0");
142
+
143
+ clear_packet_with_auth(&context, &receiver, &origin, &receiver, &guid, &message);
144
+
145
+ // Verify lazy inbound nonce was updated via public interface
155
146
  let lazy_nonce = endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender);
156
147
  assert_eq!(lazy_nonce, nonce);
157
148
  }
158
149
 
150
+ // Sequential nonce behavior
159
151
  #[test]
160
- fn test_clear_sequential_nonces() {
152
+ fn test_clear_success_sequential_nonces_update_lazy_nonce_to_latest() {
161
153
  let context = setup();
162
154
  let env = &context.env;
163
155
  let endpoint_client = &context.endpoint_client;
@@ -167,71 +159,262 @@ fn test_clear_sequential_nonces() {
167
159
  let receiver = env.register(MockReceiver, ());
168
160
 
169
161
  // Setup receive library
170
- let receive_lib = context.setup_mock_receive_lib(vec![env, src_eid]);
171
- context.mock_owner_auth("register_library", (&receive_lib,));
172
- endpoint_client.register_library(&receive_lib);
173
- context.mock_owner_auth("set_default_receive_library", (&src_eid, &receive_lib, &0u64));
174
- endpoint_client.set_default_receive_library(&src_eid, &receive_lib, &0);
162
+ let receive_lib = context.setup_default_receive_lib(src_eid, 0);
175
163
 
176
164
  // Verify and clear nonce 1
177
165
  let message1 = Bytes::from_array(env, &[1, 2, 3]);
178
166
  let guid1 = BytesN::from_array(env, &[1u8; 32]);
179
- let payload1 = build_payload(env, &guid1, &message1);
180
- let payload_hash1 = keccak256(env, &payload1);
167
+ let payload_hash1 = build_payload_hash(env, &guid1, &message1);
181
168
  let origin1 = Origin { src_eid, sender: sender.clone(), nonce: 1 };
182
169
 
183
- env.mock_auths(&[MockAuth {
184
- address: &receive_lib,
185
- invoke: &MockAuthInvoke {
186
- contract: &endpoint_client.address,
187
- fn_name: "verify",
188
- args: (&receive_lib, &origin1, &receiver, &payload_hash1).into_val(env),
189
- sub_invokes: &[],
190
- },
191
- }]);
192
- endpoint_client.verify(&receive_lib, &origin1, &receiver, &payload_hash1);
193
-
194
- env.mock_auths(&[MockAuth {
195
- address: &receiver,
196
- invoke: &MockAuthInvoke {
197
- contract: &endpoint_client.address,
198
- fn_name: "clear",
199
- args: (&receiver, &origin1, &receiver, &guid1, &message1).into_val(env),
200
- sub_invokes: &[],
201
- },
202
- }]);
203
- endpoint_client.clear(&receiver, &origin1, &receiver, &guid1, &message1);
170
+ verify_packet_with_auth(&context, &receive_lib, &origin1, &receiver, &payload_hash1);
171
+ clear_packet_with_auth(&context, &receiver, &origin1, &receiver, &guid1, &message1);
204
172
 
205
173
  // Verify and clear nonce 2
206
174
  let message2 = Bytes::from_array(env, &[4, 5, 6]);
207
175
  let guid2 = BytesN::from_array(env, &[2u8; 32]);
208
- let payload2 = build_payload(env, &guid2, &message2);
209
- let payload_hash2 = keccak256(env, &payload2);
176
+ let payload_hash2 = build_payload_hash(env, &guid2, &message2);
210
177
  let origin2 = Origin { src_eid, sender: sender.clone(), nonce: 2 };
211
178
 
212
- env.mock_auths(&[MockAuth {
213
- address: &receive_lib,
214
- invoke: &MockAuthInvoke {
215
- contract: &endpoint_client.address,
216
- fn_name: "verify",
217
- args: (&receive_lib, &origin2, &receiver, &payload_hash2).into_val(env),
218
- sub_invokes: &[],
219
- },
220
- }]);
221
- endpoint_client.verify(&receive_lib, &origin2, &receiver, &payload_hash2);
222
-
223
- env.mock_auths(&[MockAuth {
224
- address: &receiver,
225
- invoke: &MockAuthInvoke {
226
- contract: &endpoint_client.address,
227
- fn_name: "clear",
228
- args: (&receiver, &origin2, &receiver, &guid2, &message2).into_val(env),
229
- sub_invokes: &[],
230
- },
231
- }]);
232
- endpoint_client.clear(&receiver, &origin2, &receiver, &guid2, &message2);
179
+ verify_packet_with_auth(&context, &receive_lib, &origin2, &receiver, &payload_hash2);
180
+ clear_packet_with_auth(&context, &receiver, &origin2, &receiver, &guid2, &message2);
233
181
 
234
182
  // Verify lazy inbound nonce was updated to 2
235
183
  let lazy_nonce = endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender);
236
184
  assert_eq!(lazy_nonce, 2);
237
185
  }
186
+
187
+ // Authorization
188
+ #[test]
189
+ fn test_clear_failure_unauthorized_caller() {
190
+ let context = setup();
191
+ let env = &context.env;
192
+
193
+ let src_eid = 2u32;
194
+ let sender = BytesN::from_array(env, &[1u8; 32]);
195
+ // Use MockReceiver (not MockReceiverReject) so verification succeeds
196
+ let receiver = env.register(crate::tests::mock::MockReceiver, ());
197
+ let nonce = 1u64;
198
+
199
+ // Create message and payload
200
+ let message = Bytes::from_array(env, &[1, 2, 3, 4]);
201
+ let guid = BytesN::from_array(env, &[5u8; 32]);
202
+ let payload_hash = build_payload_hash(env, &guid, &message);
203
+
204
+ let origin = Origin { src_eid, sender: sender.clone(), nonce };
205
+
206
+ // Setup receive library
207
+ let receive_lib = context.setup_default_receive_lib(src_eid, 0);
208
+
209
+ // First verify the packet successfully (so we have something to clear)
210
+ verify_packet_with_auth(&context, &receive_lib, &origin, &receiver, &payload_hash);
211
+
212
+ // Now try to clear with unauthorized caller - caller is not receiver and not delegate
213
+ // require_oapp_auth checks caller == receiver || caller == delegate first, then calls require_auth
214
+ // Since caller != receiver and no delegate is set, it should fail with Unauthorized (21)
215
+ let unauthorized_caller = soroban_sdk::Address::generate(env);
216
+ let result = try_clear_packet_with_auth(&context, &unauthorized_caller, &origin, &receiver, &guid, &message);
217
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::Unauthorized.into());
218
+ }
219
+
220
+ #[test]
221
+ fn test_clear_failure_wrong_delegate() {
222
+ let context = setup();
223
+ let env = &context.env;
224
+ let endpoint_client = &context.endpoint_client;
225
+
226
+ let src_eid = 2u32;
227
+ let sender = BytesN::from_array(env, &[1u8; 32]);
228
+ // Use a regular Address for receiver to avoid requiring a receiver contract implementation.
229
+ // We initialize the path via `skip` so `verify` doesn't need to call `allow_initialize_path`.
230
+ let receiver = Address::generate(env);
231
+ let nonce = 2u64;
232
+
233
+ // Set a delegate for receiver.
234
+ let delegate = Address::generate(env);
235
+ let delegate_opt = Some(delegate);
236
+ context.set_delegate_with_auth(&receiver, &delegate_opt);
237
+
238
+ // Initialize path by skipping nonce 1.
239
+ context.mock_auth(&receiver, "skip", (&receiver, &receiver, &src_eid, &sender, &1u64));
240
+ endpoint_client.skip(&receiver, &receiver, &src_eid, &sender, &1u64);
241
+
242
+ // Create message and payload
243
+ let message = Bytes::from_array(env, &[1, 2, 3, 4]);
244
+ let guid = BytesN::from_array(env, &[5u8; 32]);
245
+ let payload_hash = build_payload_hash(env, &guid, &message);
246
+
247
+ let origin = Origin { src_eid, sender: sender.clone(), nonce };
248
+
249
+ // Setup receive library
250
+ let receive_lib = context.setup_default_receive_lib(src_eid, 0);
251
+
252
+ // First verify the packet successfully (so we have something to clear)
253
+ verify_packet_with_auth(&context, &receive_lib, &origin, &receiver, &payload_hash);
254
+
255
+ // Now try to clear with wrong delegate - caller is not receiver and not the configured delegate.
256
+ let wrong_delegate = Address::generate(env);
257
+ let result = try_clear_packet_with_auth(&context, &wrong_delegate, &origin, &receiver, &guid, &message);
258
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::Unauthorized.into());
259
+ }
260
+
261
+ #[test]
262
+ fn test_clear_success_delegate_can_clear() {
263
+ let context = setup();
264
+ let env = &context.env;
265
+ let endpoint_client = &context.endpoint_client;
266
+
267
+ let src_eid = 2u32;
268
+ let sender = BytesN::from_array(env, &[1u8; 32]);
269
+ // Use a regular Address for receiver to avoid requiring a receiver contract implementation.
270
+ // We initialize the path via `skip` so `verify` doesn't need to call `allow_initialize_path`.
271
+ let receiver = Address::generate(env);
272
+ let delegate = Address::generate(env);
273
+ let nonce = 2u64;
274
+
275
+ let delegate_opt = Some(delegate.clone());
276
+ context.set_delegate_with_auth(&receiver, &delegate_opt);
277
+
278
+ // Initialize path by skipping nonce 1.
279
+ context.mock_auth(&receiver, "skip", (&receiver, &receiver, &src_eid, &sender, &1u64));
280
+ endpoint_client.skip(&receiver, &receiver, &src_eid, &sender, &1u64);
281
+
282
+ let message = Bytes::from_array(env, &[1, 2, 3, 4]);
283
+ let guid = BytesN::from_array(env, &[5u8; 32]);
284
+ let receive_lib = context.setup_default_receive_lib(src_eid, 0);
285
+ let origin = Origin { src_eid, sender: sender.clone(), nonce };
286
+ let payload_hash = build_payload_hash(env, &guid, &message);
287
+ verify_packet_with_auth(&context, &receive_lib, &origin, &receiver, &payload_hash);
288
+
289
+ clear_packet_with_auth(&context, &delegate, &origin, &receiver, &guid, &message);
290
+
291
+ // Sanity: payload hash for nonce was removed.
292
+ let stored_hash = endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce);
293
+ assert_eq!(stored_hash, None);
294
+ }
295
+
296
+ // Payload hash validation
297
+ #[test]
298
+ fn test_clear_failure_wrong_payload_hash() {
299
+ let context = setup();
300
+ let env = &context.env;
301
+
302
+ let src_eid = 2u32;
303
+ let sender = BytesN::from_array(env, &[1u8; 32]);
304
+ let receiver = env.register(crate::tests::mock::MockReceiver, ());
305
+ let nonce = 1u64;
306
+
307
+ // Create message and payload
308
+ let message = Bytes::from_array(env, &[1, 2, 3, 4]);
309
+ let guid = BytesN::from_array(env, &[5u8; 32]);
310
+ let payload_hash = build_payload_hash(env, &guid, &message);
311
+
312
+ let origin = Origin { src_eid, sender: sender.clone(), nonce };
313
+
314
+ // Setup receive library
315
+ let receive_lib = context.setup_default_receive_lib(src_eid, 0);
316
+
317
+ // First verify the packet
318
+ verify_packet_with_auth(&context, &receive_lib, &origin, &receiver, &payload_hash);
319
+
320
+ // Try to clear with wrong message (different payload hash)
321
+ let wrong_message = Bytes::from_array(env, &[9, 9, 9, 9]);
322
+
323
+ let result = try_clear_packet_with_auth(&context, &receiver, &origin, &receiver, &guid, &wrong_message);
324
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::PayloadHashNotFound.into());
325
+ }
326
+
327
+ #[test]
328
+ fn test_clear_failure_duplicate_clear() {
329
+ let context = setup();
330
+ let env = &context.env;
331
+
332
+ let src_eid = 2u32;
333
+ let sender = BytesN::from_array(env, &[1u8; 32]);
334
+ let receiver = env.register(MockReceiver, ());
335
+ let nonce = 1u64;
336
+
337
+ let message = Bytes::from_array(env, &[1, 2, 3, 4]);
338
+ let guid = BytesN::from_array(env, &[5u8; 32]);
339
+ let (_receive_lib, origin, _payload_hash) =
340
+ arrange_verified_packet_with_auth(&context, src_eid, &sender, &receiver, nonce, &guid, &message);
341
+
342
+ // First clear succeeds.
343
+ clear_packet_with_auth(&context, &receiver, &origin, &receiver, &guid, &message);
344
+
345
+ // Second clear should fail because payload hash has been removed.
346
+ let result = try_clear_packet_with_auth(&context, &receiver, &origin, &receiver, &guid, &message);
347
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::PayloadHashNotFound.into());
348
+ }
349
+
350
+ // Nonce ordering validation
351
+ #[test]
352
+ fn test_clear_failure_missing_intermediate_nonce() {
353
+ let context = setup();
354
+ let env = &context.env;
355
+
356
+ let src_eid = 2u32;
357
+ let sender = BytesN::from_array(env, &[1u8; 32]);
358
+ let receiver = env.register(crate::tests::mock::MockReceiver, ());
359
+
360
+ // Setup receive library
361
+ let receive_lib = context.setup_default_receive_lib(src_eid, 0);
362
+
363
+ // Verify and store nonce 1
364
+ let message1 = Bytes::from_array(env, &[1, 2, 3]);
365
+ let guid1 = BytesN::from_array(env, &[1u8; 32]);
366
+ let payload_hash1 = build_payload_hash(env, &guid1, &message1);
367
+ let origin1 = Origin { src_eid, sender: sender.clone(), nonce: 1 };
368
+
369
+ verify_packet_with_auth(&context, &receive_lib, &origin1, &receiver, &payload_hash1);
370
+
371
+ // Verify and store nonce 3 (skip nonce 2)
372
+ let message3 = Bytes::from_array(env, &[3, 3, 3]);
373
+ let guid3 = BytesN::from_array(env, &[3u8; 32]);
374
+ let payload_hash3 = build_payload_hash(env, &guid3, &message3);
375
+ let origin3 = Origin { src_eid, sender: sender.clone(), nonce: 3 };
376
+
377
+ verify_packet_with_auth(&context, &receive_lib, &origin3, &receiver, &payload_hash3);
378
+
379
+ // Clear nonce 1 first
380
+ clear_packet_with_auth(&context, &receiver, &origin1, &receiver, &guid1, &message1);
381
+
382
+ // Try to clear nonce 3 - should panic because nonce 2 is missing
383
+ let result = try_clear_packet_with_auth(&context, &receiver, &origin3, &receiver, &guid3, &message3);
384
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::InvalidNonce.into());
385
+ }
386
+
387
+ #[test]
388
+ fn test_clear_does_not_advance_lazy_nonce_when_clearing_older_nonce() {
389
+ let context = setup();
390
+ let env = &context.env;
391
+ let endpoint_client = &context.endpoint_client;
392
+
393
+ let src_eid = 2u32;
394
+ let sender = BytesN::from_array(env, &[1u8; 32]);
395
+ let receiver = env.register(MockReceiver, ());
396
+
397
+ // Setup receive library once for the path.
398
+ let receive_lib = context.setup_default_receive_lib(src_eid, 0);
399
+
400
+ // Verify nonce 1 and nonce 2.
401
+ let message1 = Bytes::from_array(env, &[1, 2, 3]);
402
+ let guid1 = BytesN::from_array(env, &[1u8; 32]);
403
+ let payload_hash1 = build_payload_hash(env, &guid1, &message1);
404
+ let origin1 = Origin { src_eid, sender: sender.clone(), nonce: 1 };
405
+ verify_packet_with_auth(&context, &receive_lib, &origin1, &receiver, &payload_hash1);
406
+
407
+ let message2 = Bytes::from_array(env, &[4, 5, 6]);
408
+ let guid2 = BytesN::from_array(env, &[2u8; 32]);
409
+ let payload_hash2 = build_payload_hash(env, &guid2, &message2);
410
+ let origin2 = Origin { src_eid, sender: sender.clone(), nonce: 2 };
411
+ verify_packet_with_auth(&context, &receive_lib, &origin2, &receiver, &payload_hash2);
412
+
413
+ // Clear nonce 2 first (this advances lazy nonce to 2 because nonce 1..=2 are present).
414
+ clear_packet_with_auth(&context, &receiver, &origin2, &receiver, &guid2, &message2);
415
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), 2);
416
+
417
+ // Clearing an older nonce should not change lazy nonce.
418
+ clear_packet_with_auth(&context, &receiver, &origin1, &receiver, &guid1, &message1);
419
+ assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), 2);
420
+ }
@@ -1,9 +1,6 @@
1
- use crate::tests::endpoint_setup::setup;
2
- use soroban_sdk::{
3
- testutils::{Address as _, MockAuth, MockAuthInvoke},
4
- Address, IntoVal,
5
- };
1
+ use soroban_sdk::{testutils::Address as _, Address};
6
2
 
3
+ use crate::tests::endpoint_setup::setup;
7
4
  #[test]
8
5
  fn test_delegate_when_not_set() {
9
6
  let context = setup();
@@ -26,16 +23,7 @@ fn test_delegate_when_set() {
26
23
  let delegate = Address::generate(env);
27
24
 
28
25
  let delegate_option = Some(delegate.clone());
29
- env.mock_auths(&[MockAuth {
30
- address: &oapp,
31
- invoke: &MockAuthInvoke {
32
- contract: &endpoint_client.address,
33
- fn_name: "set_delegate",
34
- args: (&oapp, &delegate_option).into_val(env),
35
- sub_invokes: &[],
36
- },
37
- }]);
38
- endpoint_client.set_delegate(&oapp, &delegate_option);
26
+ context.set_delegate_with_auth(&oapp, &delegate_option);
39
27
 
40
28
  let actual_delegate = endpoint_client.delegate(&oapp);
41
29
  assert_eq!(actual_delegate, Some(delegate), "Delegate should be set");