@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,117 +1,114 @@
1
+ use soroban_sdk::{testutils::Address as _, vec, Address};
2
+ use utils::testing_utils::assert_event;
3
+
1
4
  use crate::{
5
+ errors::EndpointError,
2
6
  events::LibraryRegistered,
3
7
  storage,
4
8
  tests::{
5
9
  endpoint_setup::setup,
6
- mock::{MockMessageLib, MockValidMessageLib},
10
+ mock::{MockMessageLib, MockReceiver, MockValidMessageLib},
7
11
  },
8
12
  };
9
- use soroban_sdk::{testutils::Address as _, vec, Address};
10
- use utils::testing_utils::assert_event;
11
-
12
- use crate::errors::EndpointError;
13
13
 
14
+ // Successful registration (state update + event emission)
14
15
  #[test]
15
16
  fn test_register_library() {
16
17
  let context = setup();
17
18
  let env = &context.env;
18
19
  let endpoint_client = &context.endpoint_client;
19
20
 
20
- // mock a valid message lib
21
21
  let lib = env.register(MockValidMessageLib, ());
22
22
 
23
- // Verify initial state - library count should be 0
24
- let initial_count =
25
- env.as_contract(&endpoint_client.address, || storage::EndpointStorage::registered_library_count(env));
26
- assert_eq!(initial_count, 0, "Initial library count should be 0");
27
-
28
- // Mock owner auth for register_library
29
- context.mock_owner_auth("register_library", (&lib,));
23
+ // Verify initial state via public interface.
24
+ assert_eq!(endpoint_client.registered_libraries_count(), 0);
25
+ assert!(!endpoint_client.is_registered_library(&lib));
30
26
 
31
- endpoint_client.register_library(&lib);
27
+ context.register_library_with_auth(&lib);
32
28
 
33
- // Assert event was published
29
+ // Verify event emission.
34
30
  assert_event(env, &endpoint_client.address, LibraryRegistered { new_lib: lib.clone() });
35
31
 
36
- // Assert public interface methods work
32
+ // Verify state update via public interface.
37
33
  assert!(endpoint_client.is_registered_library(&lib));
34
+ assert_eq!(endpoint_client.registered_libraries_count(), 1);
38
35
 
39
36
  let libraries = endpoint_client.get_registered_libraries(&0, &1);
40
37
  assert_eq!(libraries, vec![&env, lib.clone()]);
41
38
 
42
- // Assert storage changes directly
39
+ // Verify storage invariants (bidirectional index mapping).
43
40
  let lib_clone = lib.clone();
44
41
  env.as_contract(&endpoint_client.address, || {
45
- // Verify library was assigned ID 0 (first library)
46
42
  let library_id = storage::EndpointStorage::library_to_index(env, &lib_clone);
47
- assert_eq!(library_id, Some(0), "Library should be assigned ID 0");
43
+ assert_eq!(library_id, Some(0));
48
44
 
49
- // Verify ID 0 maps back to the library
50
45
  let stored_lib = storage::EndpointStorage::index_to_library(env, 0);
51
- assert_eq!(stored_lib, Some(lib_clone.clone()), "ID 0 should map to the registered library");
46
+ assert_eq!(stored_lib, Some(lib_clone.clone()));
52
47
 
53
- // Verify library count was incremented
54
48
  let new_count = storage::EndpointStorage::registered_library_count(env);
55
- assert_eq!(new_count, 1, "Library count should be incremented to 1");
49
+ assert_eq!(new_count, 1);
56
50
 
57
- // Verify has_library_to_id returns true
58
51
  let has_library = storage::EndpointStorage::has_library_to_index(env, &lib_clone);
59
- assert!(has_library, "has_library_to_id should return true for registered library");
52
+ assert!(has_library);
60
53
  });
61
54
  }
62
55
 
56
+ // Duplicate registration rejection
63
57
  #[test]
64
58
  fn test_register_library_is_already_registered() {
65
59
  let context = setup();
66
60
  let env = &context.env;
67
61
  let endpoint_client = &context.endpoint_client;
68
62
 
69
- // mock a valid message lib
70
63
  let lib = env.register(MockValidMessageLib, ());
71
64
 
72
- // First registration with owner auth
73
- context.mock_owner_auth("register_library", (&lib,));
74
- endpoint_client.register_library(&lib);
65
+ context.register_library_with_auth(&lib);
75
66
 
76
- // Try to register the same library again with owner auth
77
67
  context.mock_owner_auth("register_library", (&lib,));
78
68
  let result = endpoint_client.try_register_library(&lib);
79
-
80
69
  assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::AlreadyRegistered.into());
81
70
  }
82
71
 
72
+ // Invalid library interface rejection (must implement message_lib_type)
83
73
  #[test]
84
74
  fn test_register_library_is_unsupported_interface() {
85
75
  let context = setup();
86
76
  let env = &context.env;
87
77
  let endpoint_client = &context.endpoint_client;
88
78
 
89
- let random_lib_address = Address::generate(env);
79
+ // A contract that does NOT implement `message_lib_type()`.
80
+ let invalid_lib = env.register(MockReceiver, ());
90
81
 
91
- // Mock owner auth for register_library
92
- context.mock_owner_auth("register_library", (&random_lib_address,));
93
-
94
- let result = endpoint_client.try_register_library(&random_lib_address);
82
+ // Must pass owner auth so this test actually exercises interface validation.
83
+ context.mock_owner_auth("register_library", (&invalid_lib,));
84
+ let result = endpoint_client.try_register_library(&invalid_lib);
95
85
  assert!(result.is_err());
86
+
87
+ // Verify no partial state updates.
88
+ assert_eq!(endpoint_client.registered_libraries_count(), 0);
89
+ assert!(!endpoint_client.is_registered_library(&invalid_lib));
90
+
91
+ // Verify no partial storage updates.
92
+ env.as_contract(&endpoint_client.address, || {
93
+ assert_eq!(storage::EndpointStorage::registered_library_count(env), 0);
94
+ assert_eq!(storage::EndpointStorage::library_to_index(env, &invalid_lib), None);
95
+ assert!(!storage::EndpointStorage::has_library_to_index(env, &invalid_lib));
96
+ });
96
97
  }
97
98
 
99
+ // Authorization (only owner)
98
100
  #[test]
99
101
  fn test_register_library_owner_auth() {
100
102
  let context = setup();
101
103
  let env = &context.env;
102
104
  let endpoint_client = &context.endpoint_client;
103
105
 
104
- // Deploy a mock message library contract
105
106
  let lib = env.register(MockMessageLib, ());
106
107
 
107
- // Mock owner auth for register_library
108
- context.mock_owner_auth("register_library", (&lib,));
109
-
110
- // should succeed
111
- endpoint_client.register_library(&lib);
108
+ context.register_library_with_auth(&lib);
112
109
 
113
110
  let library = endpoint_client.get_registered_libraries(&0, &1);
114
- assert_eq!(library, vec![env, lib]);
111
+ assert_eq!(library, vec![&env, lib]);
115
112
  }
116
113
 
117
114
  #[test]
@@ -129,3 +126,28 @@ fn test_register_library_without_owner_auth() {
129
126
 
130
127
  endpoint_client.register_library(&lib);
131
128
  }
129
+
130
+ // Sequential index assignment (storage invariants)
131
+ #[test]
132
+ fn test_register_multiple_libraries_assigns_sequential_indices_and_orders_results() {
133
+ let context = setup();
134
+ let env = &context.env;
135
+ let endpoint_client = &context.endpoint_client;
136
+
137
+ let lib0 = env.register(MockValidMessageLib, ());
138
+ let lib1 = env.register(MockValidMessageLib, ());
139
+
140
+ context.register_library_with_auth(&lib0);
141
+ context.register_library_with_auth(&lib1);
142
+
143
+ // storage invariants
144
+ let lib0c = lib0.clone();
145
+ let lib1c = lib1.clone();
146
+ env.as_contract(&endpoint_client.address, || {
147
+ assert_eq!(storage::EndpointStorage::registered_library_count(env), 2);
148
+ assert_eq!(storage::EndpointStorage::library_to_index(env, &lib0c), Some(0));
149
+ assert_eq!(storage::EndpointStorage::library_to_index(env, &lib1c), Some(1));
150
+ assert_eq!(storage::EndpointStorage::index_to_library(env, 0), Some(lib0c));
151
+ assert_eq!(storage::EndpointStorage::index_to_library(env, 1), Some(lib1c));
152
+ });
153
+ }
@@ -0,0 +1,42 @@
1
+ use crate::tests::{endpoint_setup::setup, mock::MockValidMessageLib};
2
+
3
+ // The registered_libraries_count increments after successful registrations
4
+ #[test]
5
+ fn test_registered_libraries_count_increments_with_registrations() {
6
+ let context = setup();
7
+ let env = &context.env;
8
+ let endpoint_client = &context.endpoint_client;
9
+
10
+ let lib0 = env.register(MockValidMessageLib, ());
11
+ let lib1 = env.register(MockValidMessageLib, ());
12
+ let lib2 = env.register(MockValidMessageLib, ());
13
+
14
+ assert_eq!(endpoint_client.registered_libraries_count(), 0);
15
+
16
+ context.register_library_with_auth(&lib0);
17
+ assert_eq!(endpoint_client.registered_libraries_count(), 1);
18
+
19
+ context.register_library_with_auth(&lib1);
20
+ assert_eq!(endpoint_client.registered_libraries_count(), 2);
21
+
22
+ context.register_library_with_auth(&lib2);
23
+ assert_eq!(endpoint_client.registered_libraries_count(), 3);
24
+ }
25
+
26
+ // Failed registration does not change registered_libraries_count
27
+ #[test]
28
+ fn test_registered_libraries_count_unchanged_on_duplicate_registration() {
29
+ let context = setup();
30
+ let env = &context.env;
31
+ let endpoint_client = &context.endpoint_client;
32
+
33
+ let lib = env.register(MockValidMessageLib, ());
34
+ context.register_library_with_auth(&lib);
35
+ assert_eq!(endpoint_client.registered_libraries_count(), 1);
36
+
37
+ // Duplicate registration should fail and not change count.
38
+ context.mock_owner_auth("register_library", (&lib,));
39
+ let result = endpoint_client.try_register_library(&lib);
40
+ assert!(result.is_err());
41
+ assert_eq!(endpoint_client.registered_libraries_count(), 1);
42
+ }
@@ -0,0 +1,61 @@
1
+ use soroban_sdk::vec;
2
+
3
+ use crate::{tests::endpoint_setup::setup, EndpointV2, MessageLibType};
4
+
5
+ // The require_receive_lib_for_eid internal validation (registered + type + supported_eid)
6
+ #[test]
7
+ #[should_panic(expected = "Error(Contract, #15)")] // EndpointError::OnlyRegisteredLib
8
+ fn test_require_receive_lib_for_eid_unregistered_lib() {
9
+ let context = setup();
10
+ let env = &context.env;
11
+ let endpoint_client = &context.endpoint_client;
12
+
13
+ let lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
14
+ env.as_contract(&endpoint_client.address, || EndpointV2::require_receive_lib_for_eid(env, &lib, context.eid));
15
+ }
16
+
17
+ #[test]
18
+ #[should_panic(expected = "Error(Contract, #14)")] // EndpointError::OnlyReceiveLib
19
+ fn test_require_receive_lib_for_eid_wrong_lib_type() {
20
+ let context = setup();
21
+ let env = &context.env;
22
+ let endpoint_client = &context.endpoint_client;
23
+
24
+ let lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
25
+ context.register_library_with_auth(&lib);
26
+
27
+ env.as_contract(&endpoint_client.address, || EndpointV2::require_receive_lib_for_eid(env, &lib, context.eid));
28
+ }
29
+
30
+ #[test]
31
+ #[should_panic(expected = "Error(Contract, #22)")] // EndpointError::UnsupportedEid
32
+ fn test_require_receive_lib_for_eid_unsupported_eid() {
33
+ let context = setup();
34
+ let env = &context.env;
35
+ let endpoint_client = &context.endpoint_client;
36
+
37
+ let unsupported_eid = context.eid + 1;
38
+ let lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
39
+ context.register_library_with_auth(&lib);
40
+
41
+ env.as_contract(&endpoint_client.address, || EndpointV2::require_receive_lib_for_eid(env, &lib, unsupported_eid));
42
+ }
43
+
44
+ #[test]
45
+ fn test_require_receive_lib_for_eid_success_for_receive_and_send_and_receive() {
46
+ let context = setup();
47
+ let env = &context.env;
48
+ let endpoint_client = &context.endpoint_client;
49
+
50
+ let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
51
+ context.register_library_with_auth(&receive_lib);
52
+ env.as_contract(&endpoint_client.address, || {
53
+ EndpointV2::require_receive_lib_for_eid(env, &receive_lib, context.eid)
54
+ });
55
+
56
+ let send_and_receive = context.setup_mock_message_lib(MessageLibType::SendAndReceive, vec![env, context.eid]);
57
+ context.register_library_with_auth(&send_and_receive);
58
+ env.as_contract(&endpoint_client.address, || {
59
+ EndpointV2::require_receive_lib_for_eid(env, &send_and_receive, context.eid)
60
+ });
61
+ }
@@ -1,8 +1,9 @@
1
+ use soroban_sdk::{testutils::Address as _, Address};
2
+
1
3
  use crate::{
2
4
  tests::{endpoint_setup::setup, mock::MockValidMessageLib},
3
5
  EndpointV2,
4
6
  };
5
- use soroban_sdk::{testutils::Address as _, Address};
6
7
 
7
8
  // Unit tests for require functions
8
9
 
@@ -25,10 +26,7 @@ fn test_require_registered_with_registered_lib() {
25
26
 
26
27
  // Register a valid message lib
27
28
  let lib = env.register(MockValidMessageLib, ());
28
-
29
- // Mock owner auth for register_library
30
- context.mock_owner_auth("register_library", (&lib,));
31
- endpoint_client.register_library(&lib);
29
+ context.register_library_with_auth(&lib);
32
30
 
33
31
  // Should not panic
34
32
  env.as_contract(&endpoint_client.address, || EndpointV2::require_registered(env, &lib));
@@ -0,0 +1,59 @@
1
+ use soroban_sdk::vec;
2
+
3
+ use crate::{tests::endpoint_setup::setup, EndpointV2, MessageLibType};
4
+
5
+ // The require_send_lib_for_eid internal validation (registered + type + supported_eid)
6
+ #[test]
7
+ #[should_panic(expected = "Error(Contract, #15)")] // EndpointError::OnlyRegisteredLib
8
+ fn test_require_send_lib_for_eid_unregistered_lib() {
9
+ let context = setup();
10
+ let env = &context.env;
11
+ let endpoint_client = &context.endpoint_client;
12
+
13
+ let lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
14
+ env.as_contract(&endpoint_client.address, || EndpointV2::require_send_lib_for_eid(env, &lib, context.eid));
15
+ }
16
+
17
+ #[test]
18
+ #[should_panic(expected = "Error(Contract, #16)")] // EndpointError::OnlySendLib
19
+ fn test_require_send_lib_for_eid_wrong_lib_type() {
20
+ let context = setup();
21
+ let env = &context.env;
22
+ let endpoint_client = &context.endpoint_client;
23
+
24
+ let lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
25
+ context.register_library_with_auth(&lib);
26
+
27
+ env.as_contract(&endpoint_client.address, || EndpointV2::require_send_lib_for_eid(env, &lib, context.eid));
28
+ }
29
+
30
+ #[test]
31
+ #[should_panic(expected = "Error(Contract, #22)")] // EndpointError::UnsupportedEid
32
+ fn test_require_send_lib_for_eid_unsupported_eid() {
33
+ let context = setup();
34
+ let env = &context.env;
35
+ let endpoint_client = &context.endpoint_client;
36
+
37
+ let unsupported_eid = context.eid + 1;
38
+ let lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
39
+ context.register_library_with_auth(&lib);
40
+
41
+ env.as_contract(&endpoint_client.address, || EndpointV2::require_send_lib_for_eid(env, &lib, unsupported_eid));
42
+ }
43
+
44
+ #[test]
45
+ fn test_require_send_lib_for_eid_success_for_send_and_send_and_receive() {
46
+ let context = setup();
47
+ let env = &context.env;
48
+ let endpoint_client = &context.endpoint_client;
49
+
50
+ let send_lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
51
+ context.register_library_with_auth(&send_lib);
52
+ env.as_contract(&endpoint_client.address, || EndpointV2::require_send_lib_for_eid(env, &send_lib, context.eid));
53
+
54
+ let send_and_receive = context.setup_mock_message_lib(MessageLibType::SendAndReceive, vec![env, context.eid]);
55
+ context.register_library_with_auth(&send_and_receive);
56
+ env.as_contract(&endpoint_client.address, || {
57
+ EndpointV2::require_send_lib_for_eid(env, &send_and_receive, context.eid)
58
+ });
59
+ }
@@ -1,6 +1,19 @@
1
- use crate::{tests::endpoint_setup::setup, EndpointV2, MessageLibType};
2
1
  use soroban_sdk::{testutils::Address as _, vec, Address};
3
2
 
3
+ use crate::{tests::endpoint_setup::setup, EndpointV2, MessageLibType};
4
+
5
+ // The require_supported_eid passes when the library supports the EID
6
+ #[test]
7
+ fn test_require_supported_eid_with_supported() {
8
+ let context = setup();
9
+ let env = &context.env;
10
+ let endpoint_client = &context.endpoint_client;
11
+
12
+ let send_lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
13
+ env.as_contract(&endpoint_client.address, || EndpointV2::require_supported_eid(env, &send_lib, context.eid));
14
+ }
15
+
16
+ // The require_supported_eid rejects when the library does not support the EID
4
17
  #[test]
5
18
  #[should_panic(expected = "Error(Contract, #22)")] // EndpointError::UnsupportedEid
6
19
  fn test_require_supported_eid_with_unsupported() {
@@ -13,6 +26,7 @@ fn test_require_supported_eid_with_unsupported() {
13
26
  env.as_contract(&endpoint_client.address, || EndpointV2::require_supported_eid(env, &send_lib, unsupported_eid));
14
27
  }
15
28
 
29
+ // The require_supported_eid panics if the library address has no deployed contract
16
30
  #[test]
17
31
  #[should_panic(expected = "trying to get non-existing value for contract instance")]
18
32
  fn test_require_supported_eid_with_non_deployed_lib() {
@@ -1,45 +1,44 @@
1
- use soroban_sdk::{
2
- testutils::{Address as _, MockAuth, MockAuthInvoke},
3
- vec, Address, IntoVal, Vec,
4
- };
1
+ use soroban_sdk::{testutils::Address as _, vec, Address, Bytes, Vec};
5
2
 
6
- use crate::{tests::endpoint_setup::setup, SetConfigParam};
3
+ use crate::{errors::EndpointError, tests::endpoint_setup::setup, tests::endpoint_setup::TestSetup, SetConfigParam};
7
4
 
8
- // Tests for set_config
9
- // Note: set_config is a pass-through method that delegates to MessageLibClient.
10
- // Since mock message libs don't implement set_config, we focus on testing authorization.
11
- // The actual config setting is tested in the message library contract tests.
5
+ // Helpers
6
+ fn set_config_with_auth(
7
+ context: &TestSetup,
8
+ caller: &Address,
9
+ oapp: &Address,
10
+ message_lib: &Address,
11
+ params: &Vec<SetConfigParam>,
12
+ ) {
13
+ context.mock_auth(caller, "set_config", (caller, oapp, message_lib, params));
14
+ context.endpoint_client.set_config(caller, oapp, message_lib, params);
15
+ }
12
16
 
17
+ // Authorization (caller == oapp)
13
18
  #[test]
14
- fn test_set_config_oapp_auth() {
19
+ fn test_set_config_allows_oapp() {
15
20
  let context = setup();
16
21
  let env = &context.env;
17
22
  let endpoint_client = &context.endpoint_client;
18
23
 
19
24
  let oapp = Address::generate(env);
20
- let message_lib = Address::generate(env); // Just use an address, won't actually call it
25
+ let message_lib = context.setup_mock_message_lib(crate::MessageLibType::Send, vec![env, context.eid]);
26
+ context.register_library_with_auth(&message_lib);
21
27
 
22
- let params: Vec<SetConfigParam> = vec![env];
28
+ let cfg = Bytes::from_slice(env, &[0x01, 0x02, 0x03]);
29
+ let params: Vec<SetConfigParam> =
30
+ vec![env, SetConfigParam { eid: context.eid, config_type: 1, config: cfg.clone() }];
23
31
 
24
- // Try with oapp auth - should pass authorization check
25
- // (will fail on lib call since it's not a real lib, but that's after auth)
26
- env.mock_auths(&[MockAuth {
27
- address: &oapp,
28
- invoke: &MockAuthInvoke {
29
- contract: &endpoint_client.address,
30
- fn_name: "set_config",
31
- args: (&oapp, &oapp, &message_lib, &params).into_val(env),
32
- sub_invokes: &[],
33
- },
34
- }]);
35
-
36
- // Call will fail at library invocation, but we verify auth works
37
- let _ = endpoint_client.try_set_config(&oapp, &oapp, &message_lib, &params);
38
- // We're just verifying the auth part - the library call failure is expected
32
+ set_config_with_auth(&context, &oapp, &oapp, &message_lib, &params);
33
+
34
+ // Assert config persisted in the message lib via endpoint's get_config passthrough.
35
+ let stored = endpoint_client.get_config(&oapp, &message_lib, &context.eid, &1u32);
36
+ assert_eq!(stored, cfg);
39
37
  }
40
38
 
39
+ // Authorization (caller == delegate(oapp))
41
40
  #[test]
42
- fn test_set_config_delegate_auth() {
41
+ fn test_set_config_allows_delegate() {
43
42
  let context = setup();
44
43
  let env = &context.env;
45
44
  let endpoint_client = &context.endpoint_client;
@@ -47,33 +46,138 @@ fn test_set_config_delegate_auth() {
47
46
  let oapp = Address::generate(env);
48
47
  let delegate = Address::generate(env);
49
48
 
50
- // Set delegate for oapp
49
+ // Set delegate for the OApp.
51
50
  let delegate_option = Some(delegate.clone());
52
- env.mock_auths(&[MockAuth {
53
- address: &oapp,
54
- invoke: &MockAuthInvoke {
55
- contract: &endpoint_client.address,
56
- fn_name: "set_delegate",
57
- args: (&oapp, &delegate_option).into_val(env),
58
- sub_invokes: &[],
59
- },
60
- }]);
51
+ context.mock_auth(&oapp, "set_delegate", (&oapp, &delegate_option));
61
52
  endpoint_client.set_delegate(&oapp, &delegate_option);
62
53
 
54
+ let message_lib = context.setup_mock_message_lib(crate::MessageLibType::Send, vec![env, context.eid]);
55
+ context.register_library_with_auth(&message_lib);
56
+ let cfg = Bytes::from_slice(env, &[0xAA, 0xBB, 0xCC, 0xDD]);
57
+ let params: Vec<SetConfigParam> =
58
+ vec![env, SetConfigParam { eid: context.eid, config_type: 2, config: cfg.clone() }];
59
+
60
+ set_config_with_auth(&context, &delegate, &oapp, &message_lib, &params);
61
+
62
+ // Assert config persisted in the message lib via endpoint's get_config passthrough.
63
+ let stored = endpoint_client.get_config(&oapp, &message_lib, &context.eid, &2u32);
64
+ assert_eq!(stored, cfg);
65
+ }
66
+
67
+ // Unauthorized caller is rejected
68
+ #[test]
69
+ fn test_set_config_unauthorized() {
70
+ let context = setup();
71
+ let env = &context.env;
72
+ let endpoint_client = &context.endpoint_client;
73
+
74
+ let oapp = Address::generate(env);
75
+ let unauthorized = Address::generate(env);
63
76
  let message_lib = Address::generate(env);
64
77
  let params: Vec<SetConfigParam> = vec![env];
65
78
 
66
- // Try with delegate auth - should pass authorization check
67
- env.mock_auths(&[MockAuth {
68
- address: &delegate,
69
- invoke: &MockAuthInvoke {
70
- contract: &endpoint_client.address,
71
- fn_name: "set_config",
72
- args: (&delegate, &oapp, &message_lib, &params).into_val(env),
73
- sub_invokes: &[],
74
- },
75
- }]);
76
-
77
- // Call will fail at library invocation, but we verify delegate auth works
78
- let _ = endpoint_client.try_set_config(&delegate, &oapp, &message_lib, &params);
79
+ // Unauthorized should fail before `require_auth()`, so no mock_auth needed.
80
+ let result = endpoint_client.try_set_config(&unauthorized, &oapp, &message_lib, &params);
81
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::Unauthorized.into());
82
+ }
83
+
84
+ // Library must be registered
85
+ #[test]
86
+ fn test_set_config_requires_registered_library() {
87
+ let context = setup();
88
+ let env = &context.env;
89
+ let endpoint_client = &context.endpoint_client;
90
+
91
+ let oapp = Address::generate(env);
92
+ let unregistered_lib = Address::generate(env);
93
+ let params: Vec<SetConfigParam> = vec![env];
94
+
95
+ // caller == oapp so it passes oapp auth, but should fail `require_registered`.
96
+ context.mock_auth(&oapp, "set_config", (&oapp, &oapp, &unregistered_lib, &params));
97
+ let result = endpoint_client.try_set_config(&oapp, &oapp, &unregistered_lib, &params);
98
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::OnlyRegisteredLib.into());
99
+ }
100
+
101
+ // Multiple params are persisted independently (keyed by eid + config_type)
102
+ #[test]
103
+ fn test_set_config_multiple_params_persists_each() {
104
+ let context = setup();
105
+ let env = &context.env;
106
+ let endpoint_client = &context.endpoint_client;
107
+
108
+ let oapp = Address::generate(env);
109
+ let message_lib = context.setup_mock_message_lib(crate::MessageLibType::Send, vec![env, context.eid]);
110
+ context.register_library_with_auth(&message_lib);
111
+
112
+ let cfg_a = Bytes::from_slice(env, &[0x10, 0x11]);
113
+ let cfg_b = Bytes::from_slice(env, &[0x20, 0x21, 0x22]);
114
+ let cfg_c = Bytes::from_slice(env, &[0x30]);
115
+
116
+ let params: Vec<SetConfigParam> = vec![
117
+ env,
118
+ SetConfigParam { eid: context.eid, config_type: 7, config: cfg_a.clone() },
119
+ // Same eid, different config_type (should be independent).
120
+ SetConfigParam { eid: context.eid, config_type: 8, config: cfg_c.clone() },
121
+ // Different eid (should be independent).
122
+ SetConfigParam { eid: context.eid + 1, config_type: 8, config: cfg_b.clone() },
123
+ ];
124
+
125
+ set_config_with_auth(&context, &oapp, &oapp, &message_lib, &params);
126
+
127
+ let stored_a = endpoint_client.get_config(&oapp, &message_lib, &context.eid, &7u32);
128
+ let stored_c = endpoint_client.get_config(&oapp, &message_lib, &context.eid, &8u32);
129
+ let stored_b = endpoint_client.get_config(&oapp, &message_lib, &(context.eid + 1), &8u32);
130
+ assert_eq!(stored_a, cfg_a);
131
+ assert_eq!(stored_c, cfg_c);
132
+ assert_eq!(stored_b, cfg_b);
133
+ }
134
+
135
+ // The set_config overwrites existing config for the same key
136
+ #[test]
137
+ fn test_set_config_overwrites_existing_config() {
138
+ let context = setup();
139
+ let env = &context.env;
140
+ let endpoint_client = &context.endpoint_client;
141
+
142
+ let oapp = Address::generate(env);
143
+ let message_lib = context.setup_mock_message_lib(crate::MessageLibType::Send, vec![env, context.eid]);
144
+ context.register_library_with_auth(&message_lib);
145
+
146
+ let cfg_v1 = Bytes::from_slice(env, &[0x01]);
147
+ let cfg_v2 = Bytes::from_slice(env, &[0x02, 0x03]);
148
+
149
+ let params_v1: Vec<SetConfigParam> =
150
+ vec![env, SetConfigParam { eid: context.eid, config_type: 9, config: cfg_v1.clone() }];
151
+ set_config_with_auth(&context, &oapp, &oapp, &message_lib, &params_v1);
152
+ assert_eq!(endpoint_client.get_config(&oapp, &message_lib, &context.eid, &9u32), cfg_v1);
153
+
154
+ let params_v2: Vec<SetConfigParam> =
155
+ vec![env, SetConfigParam { eid: context.eid, config_type: 9, config: cfg_v2.clone() }];
156
+ set_config_with_auth(&context, &oapp, &oapp, &message_lib, &params_v2);
157
+ assert_eq!(endpoint_client.get_config(&oapp, &message_lib, &context.eid, &9u32), cfg_v2);
158
+ }
159
+
160
+ // Config is isolated per OApp
161
+ #[test]
162
+ fn test_set_config_isolated_per_oapp() {
163
+ let context = setup();
164
+ let env = &context.env;
165
+ let endpoint_client = &context.endpoint_client;
166
+
167
+ let oapp_a = Address::generate(env);
168
+ let oapp_b = Address::generate(env);
169
+
170
+ let message_lib = context.setup_mock_message_lib(crate::MessageLibType::Send, vec![env, context.eid]);
171
+ context.register_library_with_auth(&message_lib);
172
+
173
+ let cfg_a = Bytes::from_slice(env, &[0xAA]);
174
+ let params: Vec<SetConfigParam> =
175
+ vec![env, SetConfigParam { eid: context.eid, config_type: 42, config: cfg_a.clone() }];
176
+
177
+ set_config_with_auth(&context, &oapp_a, &oapp_a, &message_lib, &params);
178
+
179
+ // OApp A sees its config.
180
+ assert_eq!(endpoint_client.get_config(&oapp_a, &message_lib, &context.eid, &42u32), cfg_a);
181
+ // OApp B should not see OApp A's config.
182
+ assert_eq!(endpoint_client.get_config(&oapp_b, &message_lib, &context.eid, &42u32), Bytes::new(env));
79
183
  }