@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,31 @@
1
1
  use soroban_sdk::{
2
- testutils::{Address as _, Ledger, MockAuth, MockAuthInvoke},
3
- vec, Address, IntoVal,
2
+ testutils::{Address as _, Ledger},
3
+ vec, Address,
4
4
  };
5
+ use utils::testing_utils::assert_event;
5
6
 
6
7
  use crate::{
7
8
  errors::EndpointError,
8
9
  events::{ReceiveLibrarySet, ReceiveLibraryTimeoutSet},
9
- storage,
10
10
  tests::endpoint_setup::setup,
11
- MessageLibType, Timeout,
11
+ tests::endpoint_setup::TestSetup,
12
+ MessageLibType, ResolvedLibrary, Timeout,
12
13
  };
13
- use utils::testing_utils::assert_event;
14
14
 
15
- // Tests for set_receive_library
15
+ // Helpers
16
+ fn try_set_receive_library_with_auth(
17
+ context: &TestSetup,
18
+ caller: &Address,
19
+ receiver: &Address,
20
+ src_eid: u32,
21
+ new_lib: &Option<Address>,
22
+ grace_period: u64,
23
+ ) -> Result<Result<(), soroban_sdk::ConversionError>, Result<soroban_sdk::Error, soroban_sdk::InvokeError>> {
24
+ context.mock_auth(caller, "set_receive_library", (caller, receiver, src_eid, new_lib, grace_period));
25
+ context.endpoint_client.try_set_receive_library(caller, receiver, &src_eid, new_lib, &grace_period)
26
+ }
27
+
28
+ // Authorization (OApp auth required)
16
29
  #[test]
17
30
  fn test_set_receive_library_requires_oapp_auth() {
18
31
  let context = setup();
@@ -22,218 +35,191 @@ fn test_set_receive_library_requires_oapp_auth() {
22
35
  let oapp = Address::generate(env);
23
36
  let unauthorized_caller = Address::generate(env);
24
37
 
25
- // Create and register a valid receive lib
38
+ // Create and register a valid receive lib.
26
39
  let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
40
+ context.register_library_with_auth(&receive_lib);
41
+
42
+ // Mock auth for unauthorized caller (not the oapp or its delegate).
43
+ context.mock_auth(
44
+ &unauthorized_caller,
45
+ "set_receive_library",
46
+ (&unauthorized_caller, &oapp, &context.eid, &Some(receive_lib.clone()), &0u64),
47
+ );
27
48
 
28
- // Register the library with owner auth
29
- context.mock_owner_auth("register_library", (&receive_lib,));
30
- endpoint_client.register_library(&receive_lib);
31
-
32
- // Mock auth for unauthorized caller (not the oapp or its delegate)
33
- env.mock_auths(&[MockAuth {
34
- address: &unauthorized_caller,
35
- invoke: &MockAuthInvoke {
36
- contract: &endpoint_client.address,
37
- fn_name: "set_receive_library",
38
- args: (&unauthorized_caller, &oapp, &context.eid, &Some(receive_lib.clone()), &0u64).into_val(env),
39
- sub_invokes: &[],
40
- },
41
- }]);
42
-
43
- // Should fail with Unauthorized error
44
49
  let result =
45
50
  endpoint_client.try_set_receive_library(&unauthorized_caller, &oapp, &context.eid, &Some(receive_lib), &0u64);
46
51
  assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::Unauthorized.into());
47
52
  }
48
53
 
49
54
  #[test]
50
- fn test_set_receive_library_unregistered_lib() {
55
+ fn test_set_receive_library_allows_delegate() {
51
56
  let context = setup();
52
57
  let env = &context.env;
53
58
  let endpoint_client = &context.endpoint_client;
54
59
 
55
60
  let oapp = Address::generate(env);
61
+ let delegate = Address::generate(env);
62
+
63
+ // Set delegate for the OApp.
64
+ let delegate_opt = Some(delegate.clone());
65
+ context.mock_auth(&oapp, "set_delegate", (&oapp, &delegate_opt));
66
+ endpoint_client.set_delegate(&oapp, &delegate_opt);
56
67
 
57
- // Create but don't register a valid receive lib
68
+ // Create and register a valid receive lib.
58
69
  let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
70
+ context.register_library_with_auth(&receive_lib);
71
+
72
+ // Delegate should succeed.
73
+ context.set_receive_library_with_auth(&delegate, &oapp, context.eid, &Some(receive_lib.clone()), 0);
74
+
75
+ // Verify event emission.
76
+ assert_event(
77
+ env,
78
+ &endpoint_client.address,
79
+ ReceiveLibrarySet { receiver: oapp.clone(), src_eid: context.eid, new_lib: Some(receive_lib.clone()) },
80
+ );
81
+ assert_event(
82
+ env,
83
+ &endpoint_client.address,
84
+ ReceiveLibraryTimeoutSet { receiver: oapp.clone(), eid: context.eid, timeout: None },
85
+ );
86
+
87
+ // Verify state update via public interface.
88
+ assert_eq!(
89
+ endpoint_client.get_receive_library(&oapp, &context.eid),
90
+ ResolvedLibrary { lib: receive_lib, is_default: false }
91
+ );
92
+ assert_eq!(endpoint_client.receive_library_timeout(&oapp, &context.eid), None);
93
+ }
59
94
 
60
- // Mock auth for oapp
61
- env.mock_auths(&[MockAuth {
62
- address: &oapp,
63
- invoke: &MockAuthInvoke {
64
- contract: &endpoint_client.address,
65
- fn_name: "set_receive_library",
66
- args: (&oapp, &oapp, &context.eid, &Some(receive_lib.clone()), &0u64).into_val(env),
67
- sub_invokes: &[],
68
- },
69
- }]);
70
-
71
- // Should fail with unregistered library error
72
- let result = endpoint_client.try_set_receive_library(&oapp, &oapp, &context.eid, &Some(receive_lib), &0u64);
95
+ // Unregistered library rejection
96
+ #[test]
97
+ fn test_set_receive_library_unregistered_lib() {
98
+ let context = setup();
99
+ let env = &context.env;
100
+
101
+ let oapp = Address::generate(env);
102
+
103
+ // Create but do not register a valid receive lib.
104
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
105
+
106
+ let result = try_set_receive_library_with_auth(&context, &oapp, &oapp, context.eid, &Some(receive_lib), 0);
73
107
  assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::OnlyRegisteredLib.into());
74
108
  }
75
109
 
110
+ // Wrong library type rejection (must be Receive)
76
111
  #[test]
77
112
  fn test_set_receive_library_wrong_lib_type() {
78
113
  let context = setup();
79
114
  let env = &context.env;
80
- let endpoint_client = &context.endpoint_client;
81
115
 
82
116
  let oapp = Address::generate(env);
83
117
 
84
- // Create and register a send-only lib
118
+ // Create and register a send-only lib.
85
119
  let send_lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
120
+ context.register_library_with_auth(&send_lib);
86
121
 
87
- // Register the library with owner auth
88
- context.mock_owner_auth("register_library", (&send_lib,));
89
- endpoint_client.register_library(&send_lib);
90
-
91
- // Mock auth for oapp
92
- env.mock_auths(&[MockAuth {
93
- address: &oapp,
94
- invoke: &MockAuthInvoke {
95
- contract: &endpoint_client.address,
96
- fn_name: "set_receive_library",
97
- args: (&oapp, &oapp, &context.eid, &Some(send_lib.clone()), &0u64).into_val(env),
98
- sub_invokes: &[],
99
- },
100
- }]);
101
-
102
- // Should fail with wrong library type error
103
- let result = endpoint_client.try_set_receive_library(&oapp, &oapp, &context.eid, &Some(send_lib), &0u64);
122
+ let result = try_set_receive_library_with_auth(&context, &oapp, &oapp, context.eid, &Some(send_lib), 0);
104
123
  assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::OnlyReceiveLib.into());
105
124
  }
106
125
 
126
+ // Unsupported EID rejection (library must support src_eid)
107
127
  #[test]
108
128
  fn test_set_receive_library_unsupported_eid() {
109
129
  let context = setup();
110
130
  let env = &context.env;
111
- let endpoint_client = &context.endpoint_client;
112
131
 
113
132
  let oapp = Address::generate(env);
114
133
  let unsupported_eid = context.eid + 1;
115
134
 
116
- // Create and register a receive lib that only supports TEST_context.eid
135
+ // Create and register a receive lib that only supports `context.eid`.
117
136
  let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
137
+ context.register_library_with_auth(&receive_lib);
118
138
 
119
- // Register the library with owner auth
120
- context.mock_owner_auth("register_library", (&receive_lib,));
121
- endpoint_client.register_library(&receive_lib);
122
-
123
- // Mock auth for oapp
124
- env.mock_auths(&[MockAuth {
125
- address: &oapp,
126
- invoke: &MockAuthInvoke {
127
- contract: &endpoint_client.address,
128
- fn_name: "set_receive_library",
129
- args: (&oapp, &oapp, &unsupported_eid, &Some(receive_lib.clone()), &0u64).into_val(env),
130
- sub_invokes: &[],
131
- },
132
- }]);
133
-
134
- // Should fail with unsupported eid error
135
- let result = endpoint_client.try_set_receive_library(&oapp, &oapp, &unsupported_eid, &Some(receive_lib), &0u64);
139
+ let result = try_set_receive_library_with_auth(&context, &oapp, &oapp, unsupported_eid, &Some(receive_lib), 0);
136
140
  assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::UnsupportedEid.into());
137
141
  }
138
142
 
143
+ // Successful update (state update + event emission)
139
144
  #[test]
140
- fn test_set_receive_library_same_value() {
145
+ fn test_set_receive_library_success() {
141
146
  let context = setup();
142
147
  let env = &context.env;
143
148
  let endpoint_client = &context.endpoint_client;
144
149
 
145
150
  let oapp = Address::generate(env);
146
151
 
147
- // Create and register a valid receive lib
152
+ // Set up a default receive library first.
153
+ let default_receive_lib = context.setup_default_receive_lib(context.eid, 0);
154
+
155
+ // Create and register a valid receive lib that supports `context.eid`.
148
156
  let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
157
+ context.register_library_with_auth(&receive_lib);
149
158
 
150
- // Register the library with owner auth
151
- context.mock_owner_auth("register_library", (&receive_lib,));
152
- endpoint_client.register_library(&receive_lib);
153
-
154
- // First set with oapp auth
155
- env.mock_auths(&[MockAuth {
156
- address: &oapp,
157
- invoke: &MockAuthInvoke {
158
- contract: &endpoint_client.address,
159
- fn_name: "set_receive_library",
160
- args: (&oapp, &oapp, &context.eid, &Some(receive_lib.clone()), &0u64).into_val(env),
161
- sub_invokes: &[],
162
- },
163
- }]);
164
- endpoint_client.set_receive_library(&oapp, &oapp, &context.eid, &Some(receive_lib.clone()), &0u64);
165
-
166
- // Try to set the same library again
167
- env.mock_auths(&[MockAuth {
168
- address: &oapp,
169
- invoke: &MockAuthInvoke {
170
- contract: &endpoint_client.address,
171
- fn_name: "set_receive_library",
172
- args: (&oapp, &oapp, &context.eid, &Some(receive_lib.clone()), &0u64).into_val(env),
173
- sub_invokes: &[],
174
- },
175
- }]);
176
-
177
- let result = endpoint_client.try_set_receive_library(&oapp, &oapp, &context.eid, &Some(receive_lib), &0u64);
178
- assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::SameValue.into());
159
+ // Verify initial state via public interface (should use default).
160
+ assert_eq!(
161
+ endpoint_client.get_receive_library(&oapp, &context.eid),
162
+ ResolvedLibrary { lib: default_receive_lib.clone(), is_default: true }
163
+ );
164
+
165
+ // Should succeed.
166
+ context.set_receive_library_with_auth(&oapp, &oapp, context.eid, &Some(receive_lib.clone()), 0);
167
+
168
+ // Verify event emission.
169
+ assert_event(
170
+ env,
171
+ &endpoint_client.address,
172
+ ReceiveLibrarySet { receiver: oapp.clone(), src_eid: context.eid, new_lib: Some(receive_lib.clone()) },
173
+ );
174
+ assert_event(
175
+ env,
176
+ &endpoint_client.address,
177
+ ReceiveLibraryTimeoutSet { receiver: oapp.clone(), eid: context.eid, timeout: None },
178
+ );
179
+
180
+ // Verify state update via public interface.
181
+ assert_eq!(
182
+ endpoint_client.get_receive_library(&oapp, &context.eid),
183
+ ResolvedLibrary { lib: receive_lib.clone(), is_default: false }
184
+ );
185
+ assert_eq!(endpoint_client.receive_library_timeout(&oapp, &context.eid), None);
179
186
  }
180
187
 
188
+ // Successful update with SendAndReceive library type (valid for receive)
181
189
  #[test]
182
- fn test_set_receive_library_success_no_grace_period() {
190
+ fn test_set_receive_library_success_with_send_and_receive_type() {
183
191
  let context = setup();
184
192
  let env = &context.env;
185
193
  let endpoint_client = &context.endpoint_client;
186
194
 
187
195
  let oapp = Address::generate(env);
188
196
 
189
- // Create and register a valid receive lib
190
- let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
197
+ // Create and register a SendAndReceive lib that supports `context.eid`.
198
+ let send_and_receive_lib = context.setup_mock_message_lib(MessageLibType::SendAndReceive, vec![env, context.eid]);
199
+ context.register_library_with_auth(&send_and_receive_lib);
191
200
 
192
- // Register the library with owner auth
193
- context.mock_owner_auth("register_library", (&receive_lib,));
194
- endpoint_client.register_library(&receive_lib);
201
+ // Should succeed.
202
+ context.set_receive_library_with_auth(&oapp, &oapp, context.eid, &Some(send_and_receive_lib.clone()), 0);
195
203
 
196
- // Verify it was not set
197
- assert_eq!(
198
- env.as_contract(&endpoint_client.address, || storage::EndpointStorage::receive_library(
199
- env,
200
- &oapp,
201
- context.eid
202
- )),
203
- None
204
+ // Verify event emission.
205
+ assert_event(
206
+ env,
207
+ &endpoint_client.address,
208
+ ReceiveLibrarySet { receiver: oapp.clone(), src_eid: context.eid, new_lib: Some(send_and_receive_lib.clone()) },
204
209
  );
205
-
206
- // Set with oapp auth
207
- env.mock_auths(&[MockAuth {
208
- address: &oapp,
209
- invoke: &MockAuthInvoke {
210
- contract: &endpoint_client.address,
211
- fn_name: "set_receive_library",
212
- args: (&oapp, &oapp, &context.eid, &Some(receive_lib.clone()), &0u64).into_val(env),
213
- sub_invokes: &[],
214
- },
215
- }]);
216
-
217
- endpoint_client.set_receive_library(&oapp, &oapp, &context.eid, &Some(receive_lib.clone()), &0u64);
218
-
219
210
  assert_event(
220
211
  env,
221
212
  &endpoint_client.address,
222
213
  ReceiveLibraryTimeoutSet { receiver: oapp.clone(), eid: context.eid, timeout: None },
223
214
  );
224
215
 
225
- // Verify it was set correctly
226
216
  assert_eq!(
227
- env.as_contract(&endpoint_client.address, || storage::EndpointStorage::receive_library(
228
- env,
229
- &oapp,
230
- context.eid
231
- )),
232
- Some(receive_lib)
217
+ endpoint_client.get_receive_library(&oapp, &context.eid),
218
+ ResolvedLibrary { lib: send_and_receive_lib.clone(), is_default: false }
233
219
  );
234
- assert_eq!(endpoint_client.receive_library_timeout(&oapp, &context.eid), None);
235
220
  }
236
221
 
222
+ // Successful update with grace period (timeout should be set)
237
223
  #[test]
238
224
  fn test_set_receive_library_success_with_grace_period() {
239
225
  let context = setup();
@@ -241,147 +227,196 @@ fn test_set_receive_library_success_with_grace_period() {
241
227
  let endpoint_client = &context.endpoint_client;
242
228
 
243
229
  let oapp = Address::generate(env);
244
- let current_timestamp = 1_700_000_000;
245
- let grace_period = 1000;
230
+ let current_timestamp = 1_700_000_000u64;
231
+ let grace_period = 1000u64;
246
232
 
247
- // Set the ledger timestamp
233
+ // Set an arbitrary unix timestamp (seconds).
248
234
  env.ledger().with_mut(|li| {
249
235
  li.timestamp = current_timestamp;
250
236
  });
251
237
 
252
- // Create and register two valid receive libs
238
+ // Create and register valid receive libs that support `context.eid`.
253
239
  let old_receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
254
240
  let new_receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
255
241
 
256
- // Register both libraries with owner auth
257
- context.mock_owner_auth("register_library", (&old_receive_lib,));
258
- endpoint_client.register_library(&old_receive_lib);
259
- context.mock_owner_auth("register_library", (&new_receive_lib,));
260
- endpoint_client.register_library(&new_receive_lib);
261
-
262
- // First set the old library without grace period
263
- env.mock_auths(&[MockAuth {
264
- address: &oapp,
265
- invoke: &MockAuthInvoke {
266
- contract: &endpoint_client.address,
267
- fn_name: "set_receive_library",
268
- args: (&oapp, &oapp, &context.eid, &Some(old_receive_lib.clone()), &0u64).into_val(env),
269
- sub_invokes: &[],
270
- },
271
- }]);
272
- endpoint_client.set_receive_library(&oapp, &oapp, &context.eid, &Some(old_receive_lib.clone()), &0u64);
273
-
274
- // Now set the new library with grace period
275
- env.mock_auths(&[MockAuth {
276
- address: &oapp,
277
- invoke: &MockAuthInvoke {
278
- contract: &endpoint_client.address,
279
- fn_name: "set_receive_library",
280
- args: (&oapp, &oapp, &context.eid, &Some(new_receive_lib.clone()), &grace_period).into_val(env),
281
- sub_invokes: &[],
282
- },
283
- }]);
284
- endpoint_client.set_receive_library(&oapp, &oapp, &context.eid, &Some(new_receive_lib.clone()), &grace_period);
242
+ context.register_library_with_auth(&old_receive_lib);
243
+ context.register_library_with_auth(&new_receive_lib);
244
+
245
+ // First set the old library without grace period.
246
+ context.set_receive_library_with_auth(&oapp, &oapp, context.eid, &Some(old_receive_lib.clone()), 0);
247
+
248
+ // Then set the new library with grace period.
249
+ context.set_receive_library_with_auth(&oapp, &oapp, context.eid, &Some(new_receive_lib.clone()), grace_period);
285
250
 
286
251
  let expected_timeout = Some(Timeout { lib: old_receive_lib.clone(), expiry: current_timestamp + grace_period });
287
252
 
288
- // Verify the events were published
253
+ // Verify event emission (from the second call).
289
254
  assert_event(
290
255
  env,
291
256
  &endpoint_client.address,
292
- ReceiveLibraryTimeoutSet { receiver: oapp.clone(), eid: context.eid, timeout: expected_timeout.clone() },
257
+ ReceiveLibrarySet { receiver: oapp.clone(), src_eid: context.eid, new_lib: Some(new_receive_lib.clone()) },
293
258
  );
294
259
  assert_event(
295
260
  env,
296
261
  &endpoint_client.address,
297
- ReceiveLibrarySet { receiver: oapp.clone(), src_eid: context.eid, new_lib: Some(new_receive_lib.clone()) },
262
+ ReceiveLibraryTimeoutSet { receiver: oapp.clone(), eid: context.eid, timeout: expected_timeout.clone() },
298
263
  );
299
264
 
300
- // Verify the library was updated
265
+ // Verify state update via public interface.
301
266
  assert_eq!(
302
- env.as_contract(&endpoint_client.address, || storage::EndpointStorage::receive_library(
303
- env,
304
- &oapp,
305
- context.eid
306
- )),
307
- Some(new_receive_lib)
267
+ endpoint_client.get_receive_library(&oapp, &context.eid),
268
+ ResolvedLibrary { lib: new_receive_lib.clone(), is_default: false }
308
269
  );
309
-
310
- // Verify the timeout was set correctly
311
270
  assert_eq!(endpoint_client.receive_library_timeout(&oapp, &context.eid), expected_timeout);
312
271
  }
313
272
 
273
+ // Grace period > 0 requires both old and new libraries to be custom (non-default)
314
274
  #[test]
315
275
  fn test_set_receive_library_grace_period_requires_both_libs() {
316
276
  let context = setup();
317
277
  let env = &context.env;
318
- let endpoint_client = &context.endpoint_client;
319
278
 
320
279
  let oapp = Address::generate(env);
321
- let grace_period = 1000;
280
+ let grace_period = 1000u64;
322
281
 
323
- // Create and register a valid receive lib
282
+ // Create and register a valid receive lib that supports `context.eid`.
324
283
  let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
284
+ context.register_library_with_auth(&receive_lib);
325
285
 
326
- // Register the library with owner auth
327
- context.mock_owner_auth("register_library", (&receive_lib,));
328
- endpoint_client.register_library(&receive_lib);
329
-
330
- // Try to set library with grace period when there's no existing library
331
- env.mock_auths(&[MockAuth {
332
- address: &oapp,
333
- invoke: &MockAuthInvoke {
334
- contract: &endpoint_client.address,
335
- fn_name: "set_receive_library",
336
- args: (&oapp, &oapp, &context.eid, &Some(receive_lib.clone()), &grace_period).into_val(env),
337
- sub_invokes: &[],
338
- },
339
- }]);
340
-
341
- let result = endpoint_client.try_set_receive_library(&oapp, &oapp, &context.eid, &Some(receive_lib), &grace_period);
286
+ let result =
287
+ try_set_receive_library_with_auth(&context, &oapp, &oapp, context.eid, &Some(receive_lib), grace_period);
342
288
  assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::OnlyNonDefaultLib.into());
343
289
  }
344
290
 
345
291
  #[test]
346
- fn test_set_receive_library_clear_library() {
292
+ fn test_set_receive_library_grace_period_requires_both_libs_even_with_default_receive_lib() {
293
+ let context = setup();
294
+ let env = &context.env;
295
+
296
+ let oapp = Address::generate(env);
297
+ let grace_period = 1000u64;
298
+
299
+ // Set up a default receive library. Even with a default, grace period logic still requires
300
+ // both old and new libraries to be custom (non-default).
301
+ context.setup_default_receive_lib(context.eid, 0);
302
+
303
+ // Create and register a valid receive lib that supports `context.eid`.
304
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
305
+ context.register_library_with_auth(&receive_lib);
306
+
307
+ let result =
308
+ try_set_receive_library_with_auth(&context, &oapp, &oapp, context.eid, &Some(receive_lib), grace_period);
309
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::OnlyNonDefaultLib.into());
310
+ }
311
+
312
+ #[test]
313
+ fn test_set_receive_library_cannot_clear_to_none_with_grace_period() {
314
+ let context = setup();
315
+ let env = &context.env;
316
+
317
+ let oapp = Address::generate(env);
318
+ let grace_period = 1000u64;
319
+
320
+ // Create and register a valid receive lib that supports `context.eid`.
321
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
322
+ context.register_library_with_auth(&receive_lib);
323
+
324
+ // First set a custom library.
325
+ context.set_receive_library_with_auth(&oapp, &oapp, context.eid, &Some(receive_lib), 0);
326
+
327
+ // Clearing to default must use grace_period = 0. Any grace period should be rejected.
328
+ let result = try_set_receive_library_with_auth(&context, &oapp, &oapp, context.eid, &None, grace_period);
329
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::OnlyNonDefaultLib.into());
330
+ }
331
+
332
+ // The grace_period = 0 clears an existing timeout
333
+ #[test]
334
+ fn test_set_receive_library_grace_period_zero_clears_timeout() {
335
+ let context = setup();
336
+ let env = &context.env;
337
+ let endpoint_client = &context.endpoint_client;
338
+
339
+ let oapp = Address::generate(env);
340
+ let src_eid = context.eid;
341
+
342
+ let t0 = 1_700_000_000u64;
343
+ env.ledger().with_mut(|li| li.timestamp = t0);
344
+
345
+ let lib_a = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, src_eid]);
346
+ let lib_b = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, src_eid]);
347
+ let lib_c = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, src_eid]);
348
+
349
+ context.register_library_with_auth(&lib_a);
350
+ context.register_library_with_auth(&lib_b);
351
+ context.register_library_with_auth(&lib_c);
352
+
353
+ // A: initial set (no timeout).
354
+ context.set_receive_library_with_auth(&oapp, &oapp, src_eid, &Some(lib_a.clone()), 0);
355
+ assert_event(
356
+ env,
357
+ &endpoint_client.address,
358
+ ReceiveLibrarySet { receiver: oapp.clone(), src_eid, new_lib: Some(lib_a.clone()) },
359
+ );
360
+ assert_event(
361
+ env,
362
+ &endpoint_client.address,
363
+ ReceiveLibraryTimeoutSet { receiver: oapp.clone(), eid: src_eid, timeout: None },
364
+ );
365
+
366
+ // B: rotate with grace -> timeout for A must be set.
367
+ let grace_period = 1_000u64;
368
+ context.set_receive_library_with_auth(&oapp, &oapp, src_eid, &Some(lib_b.clone()), grace_period);
369
+ let expected_timeout_b = Some(Timeout { lib: lib_a.clone(), expiry: t0 + grace_period });
370
+ assert_event(
371
+ env,
372
+ &endpoint_client.address,
373
+ ReceiveLibrarySet { receiver: oapp.clone(), src_eid, new_lib: Some(lib_b.clone()) },
374
+ );
375
+ assert_event(
376
+ env,
377
+ &endpoint_client.address,
378
+ ReceiveLibraryTimeoutSet { receiver: oapp.clone(), eid: src_eid, timeout: expected_timeout_b.clone() },
379
+ );
380
+ assert_eq!(endpoint_client.receive_library_timeout(&oapp, &src_eid), expected_timeout_b.clone());
381
+
382
+ // C: rotate with grace=0 -> timeout must be cleared (None).
383
+ context.set_receive_library_with_auth(&oapp, &oapp, src_eid, &Some(lib_c.clone()), 0);
384
+ assert_event(
385
+ env,
386
+ &endpoint_client.address,
387
+ ReceiveLibrarySet { receiver: oapp.clone(), src_eid, new_lib: Some(lib_c.clone()) },
388
+ );
389
+ assert_event(
390
+ env,
391
+ &endpoint_client.address,
392
+ ReceiveLibraryTimeoutSet { receiver: oapp.clone(), eid: src_eid, timeout: None },
393
+ );
394
+ assert_eq!(endpoint_client.receive_library_timeout(&oapp, &src_eid), None);
395
+ }
396
+
397
+ // Clearing to None (removes custom library)
398
+ #[test]
399
+ fn test_set_receive_library_clear_to_none() {
347
400
  let context = setup();
348
401
  let env = &context.env;
349
402
  let endpoint_client = &context.endpoint_client;
350
403
 
351
404
  let oapp = Address::generate(env);
352
405
 
353
- // Create and register a valid receive lib
406
+ // Set up a default receive library first.
407
+ let default_receive_lib = context.setup_default_receive_lib(context.eid, 0);
408
+
409
+ // Create and register a valid receive lib that supports `context.eid`.
354
410
  let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
411
+ context.register_library_with_auth(&receive_lib);
412
+
413
+ // First set Some(receive_lib).
414
+ context.set_receive_library_with_auth(&oapp, &oapp, context.eid, &Some(receive_lib.clone()), 0);
415
+
416
+ // Then clear to None.
417
+ context.set_receive_library_with_auth(&oapp, &oapp, context.eid, &None, 0);
355
418
 
356
- // Register the library with owner auth
357
- context.mock_owner_auth("register_library", (&receive_lib,));
358
- endpoint_client.register_library(&receive_lib);
359
-
360
- // First set a library
361
- env.mock_auths(&[MockAuth {
362
- address: &oapp,
363
- invoke: &MockAuthInvoke {
364
- contract: &endpoint_client.address,
365
- fn_name: "set_receive_library",
366
- args: (&oapp, &oapp, &context.eid, &Some(receive_lib.clone()), &0u64).into_val(env),
367
- sub_invokes: &[],
368
- },
369
- }]);
370
- endpoint_client.set_receive_library(&oapp, &oapp, &context.eid, &Some(receive_lib.clone()), &0u64);
371
-
372
- // Now clear the library by setting to None
373
- env.mock_auths(&[MockAuth {
374
- address: &oapp,
375
- invoke: &MockAuthInvoke {
376
- contract: &endpoint_client.address,
377
- fn_name: "set_receive_library",
378
- args: (&oapp, &oapp, &context.eid, &None::<Address>, &0u64).into_val(env),
379
- sub_invokes: &[],
380
- },
381
- }]);
382
- endpoint_client.set_receive_library(&oapp, &oapp, &context.eid, &None, &0u64);
383
-
384
- // Verify the event was published with None for both receive_library_set and receive_library_timeout_set
419
+ // Verify event emission.
385
420
  assert_event(
386
421
  env,
387
422
  &endpoint_client.address,
@@ -393,13 +428,79 @@ fn test_set_receive_library_clear_library() {
393
428
  ReceiveLibraryTimeoutSet { receiver: oapp.clone(), eid: context.eid, timeout: None },
394
429
  );
395
430
 
396
- // Verify it was cleared
431
+ // Verify state update via public interface (should fall back to default).
397
432
  assert_eq!(
398
- env.as_contract(&endpoint_client.address, || storage::EndpointStorage::receive_library(
399
- env,
400
- &oapp,
401
- context.eid
402
- )),
403
- None
433
+ endpoint_client.get_receive_library(&oapp, &context.eid),
434
+ ResolvedLibrary { lib: default_receive_lib, is_default: true }
404
435
  );
405
436
  }
437
+
438
+ // Updating from one custom library to another (A -> B)
439
+ #[test]
440
+ fn test_set_receive_library_can_change_library() {
441
+ let context = setup();
442
+ let env = &context.env;
443
+ let endpoint_client = &context.endpoint_client;
444
+
445
+ let oapp = Address::generate(env);
446
+
447
+ let receive_lib_a = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
448
+ let receive_lib_b = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
449
+
450
+ context.register_library_with_auth(&receive_lib_a);
451
+ context.register_library_with_auth(&receive_lib_b);
452
+
453
+ // Set A first.
454
+ context.set_receive_library_with_auth(&oapp, &oapp, context.eid, &Some(receive_lib_a.clone()), 0);
455
+ assert_event(
456
+ env,
457
+ &endpoint_client.address,
458
+ ReceiveLibrarySet { receiver: oapp.clone(), src_eid: context.eid, new_lib: Some(receive_lib_a.clone()) },
459
+ );
460
+ assert_eq!(
461
+ endpoint_client.get_receive_library(&oapp, &context.eid),
462
+ ResolvedLibrary { lib: receive_lib_a.clone(), is_default: false }
463
+ );
464
+
465
+ // Then change to B.
466
+ context.set_receive_library_with_auth(&oapp, &oapp, context.eid, &Some(receive_lib_b.clone()), 0);
467
+ assert_event(
468
+ env,
469
+ &endpoint_client.address,
470
+ ReceiveLibrarySet { receiver: oapp.clone(), src_eid: context.eid, new_lib: Some(receive_lib_b.clone()) },
471
+ );
472
+ assert_eq!(
473
+ endpoint_client.get_receive_library(&oapp, &context.eid),
474
+ ResolvedLibrary { lib: receive_lib_b.clone(), is_default: false }
475
+ );
476
+ }
477
+
478
+ // Same value rejection (no-op is not allowed)
479
+ #[test]
480
+ fn test_set_receive_library_same_value() {
481
+ let context = setup();
482
+ let env = &context.env;
483
+
484
+ let oapp = Address::generate(env);
485
+
486
+ // Create and register a valid receive lib that supports `context.eid`.
487
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
488
+ context.register_library_with_auth(&receive_lib);
489
+
490
+ context.set_receive_library_with_auth(&oapp, &oapp, context.eid, &Some(receive_lib.clone()), 0);
491
+
492
+ let result = try_set_receive_library_with_auth(&context, &oapp, &oapp, context.eid, &Some(receive_lib), 0);
493
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::SameValue.into());
494
+ }
495
+
496
+ // Setting None when already None (SameValue)
497
+ #[test]
498
+ fn test_set_receive_library_none_when_already_none() {
499
+ let context = setup();
500
+ let env = &context.env;
501
+
502
+ let oapp = Address::generate(env);
503
+
504
+ let result = try_set_receive_library_with_auth(&context, &oapp, &oapp, context.eid, &None, 0);
505
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::SameValue.into());
506
+ }