@layerzerolabs/protocol-stellar-v2 0.2.13 → 0.2.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/.turbo/turbo-build.log +384 -278
  2. package/.turbo/turbo-lint.log +110 -78
  3. package/.turbo/turbo-test.log +1248 -1014
  4. package/Cargo.lock +130 -3
  5. package/Cargo.toml +2 -1
  6. package/contracts/common-macros/src/contract_impl.rs +6 -1
  7. package/contracts/common-macros/src/lib.rs +47 -8
  8. package/contracts/common-macros/src/ownable.rs +7 -25
  9. package/contracts/common-macros/src/storage.rs +1 -1
  10. package/contracts/common-macros/src/tests/contract_impl.rs +5 -0
  11. package/contracts/common-macros/src/tests/mod.rs +1 -0
  12. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_impl__snapshot_generated_contract_impl_code.snap +23 -7
  13. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +5 -25
  14. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +48 -48
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +5 -25
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +21 -0
  17. package/contracts/common-macros/src/tests/upgradeable.rs +31 -0
  18. package/contracts/common-macros/src/ttl_configurable.rs +14 -44
  19. package/contracts/common-macros/src/upgradeable.rs +76 -0
  20. package/contracts/endpoint-v2/src/endpoint_v2.rs +25 -1
  21. package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +175 -8
  22. package/contracts/endpoint-v2/src/tests/endpoint_v2/build_outbound_packet.rs +76 -0
  23. package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +342 -159
  24. package/contracts/endpoint-v2/src/tests/endpoint_v2/delegate.rs +3 -15
  25. package/contracts/endpoint-v2/src/tests/endpoint_v2/initializable.rs +20 -31
  26. package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +126 -164
  27. package/contracts/endpoint-v2/src/tests/endpoint_v2/mod.rs +1 -0
  28. package/contracts/endpoint-v2/src/tests/endpoint_v2/native_token.rs +0 -1
  29. package/contracts/endpoint-v2/src/tests/endpoint_v2/owner.rs +0 -1
  30. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +311 -304
  31. package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +423 -96
  32. package/contracts/endpoint-v2/src/tests/endpoint_v2/recover_token.rs +1 -1
  33. package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +47 -20
  34. package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +373 -403
  35. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +96 -22
  36. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +61 -9
  37. package/contracts/endpoint-v2/src/tests/endpoint_v2/transfer_ownership.rs +4 -4
  38. package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +8 -11
  39. package/contracts/endpoint-v2/src/tests/endpoint_v2/verifiable.rs +81 -30
  40. package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +209 -76
  41. package/contracts/endpoint-v2/src/tests/endpoint_v2/zro.rs +0 -1
  42. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library.rs +24 -0
  43. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library_timeout.rs +40 -0
  44. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_send_library.rs +24 -0
  45. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_config.rs +108 -0
  46. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_library_index.rs +52 -0
  47. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_receive_library.rs +92 -0
  48. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_registered_libraries.rs +74 -0
  49. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_send_library.rs +83 -0
  50. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_registered_library.rs +32 -0
  51. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_supported_eid.rs +28 -0
  52. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_valid_receive_library.rs +261 -0
  53. package/contracts/endpoint-v2/src/tests/message_lib_manager/mod.rs +16 -0
  54. package/contracts/endpoint-v2/src/tests/message_lib_manager/receive_library_timeout.rs +62 -0
  55. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +65 -43
  56. package/contracts/endpoint-v2/src/tests/message_lib_manager/registered_libraries_count.rs +42 -0
  57. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +61 -0
  58. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +3 -5
  59. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +59 -0
  60. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +15 -1
  61. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_config.rs +155 -51
  62. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +114 -92
  63. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +235 -132
  64. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +93 -87
  65. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +346 -245
  66. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +406 -60
  67. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +252 -78
  68. package/contracts/endpoint-v2/src/tests/message_lib_manager/timeout.rs +102 -0
  69. package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +212 -273
  70. package/contracts/endpoint-v2/src/tests/messaging_channel/clear_payload.rs +203 -0
  71. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound.rs +94 -0
  72. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_nonce.rs +78 -248
  73. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_payload_hash.rs +7 -282
  74. package/contracts/endpoint-v2/src/tests/messaging_channel/lazy_inbound_nonce.rs +6 -274
  75. package/contracts/endpoint-v2/src/tests/messaging_channel/mod.rs +3 -2
  76. package/contracts/endpoint-v2/src/tests/messaging_channel/next_guid.rs +86 -178
  77. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +328 -212
  78. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound.rs +68 -0
  79. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound_nonce.rs +6 -209
  80. package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +207 -159
  81. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +142 -153
  82. package/contracts/endpoint-v2/src/tests/messaging_composer/compose_queue.rs +6 -179
  83. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +163 -221
  84. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +90 -121
  85. package/contracts/endpoint-v2/src/tests/mock.rs +18 -4
  86. package/contracts/endpoint-v2/src/tests/util/build_payload.rs +4 -70
  87. package/contracts/endpoint-v2/src/tests/util/compute_guid.rs +2 -1
  88. package/contracts/endpoint-v2/src/tests/util/keccak256.rs +17 -106
  89. package/contracts/layerzero-views/Cargo.toml +35 -0
  90. package/contracts/layerzero-views/src/errors.rs +10 -0
  91. package/contracts/layerzero-views/src/layerzero_view.rs +229 -0
  92. package/contracts/layerzero-views/src/lib.rs +38 -0
  93. package/contracts/layerzero-views/src/storage.rs +18 -0
  94. package/contracts/layerzero-views/src/tests/layerzero_view_tests.rs +423 -0
  95. package/contracts/layerzero-views/src/tests/mod.rs +4 -0
  96. package/contracts/layerzero-views/src/tests/setup.rs +377 -0
  97. package/contracts/layerzero-views/src/types.rs +50 -0
  98. package/contracts/macro-integration-tests/Cargo.toml +30 -0
  99. package/contracts/macro-integration-tests/src/lib.rs +1 -0
  100. package/contracts/macro-integration-tests/tests/runtime/ownable/initialization.rs +62 -0
  101. package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +22 -0
  102. package/contracts/macro-integration-tests/tests/runtime/ownable/only_owner_guard.rs +97 -0
  103. package/contracts/macro-integration-tests/tests/runtime/ownable/ownership_transfer.rs +101 -0
  104. package/contracts/macro-integration-tests/tests/runtime/storage/keyed_roundtrip.rs +225 -0
  105. package/contracts/macro-integration-tests/tests/runtime/storage/mod.rs +4 -0
  106. package/contracts/macro-integration-tests/tests/runtime/storage/name_override_runtime.rs +52 -0
  107. package/contracts/macro-integration-tests/tests/runtime/storage/ttl_extension.rs +261 -0
  108. package/contracts/macro-integration-tests/tests/runtime/storage/unkeyed_roundtrip.rs +137 -0
  109. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +113 -0
  110. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/extend_instance_ttl.rs +50 -0
  111. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +139 -0
  112. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/mod.rs +3 -0
  113. package/contracts/macro-integration-tests/tests/runtime.rs +5 -0
  114. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.rs +12 -0
  115. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.stderr +7 -0
  116. package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.rs +12 -0
  117. package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.stderr +7 -0
  118. package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.rs +21 -0
  119. package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.stderr +7 -0
  120. package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.rs +13 -0
  121. package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.stderr +7 -0
  122. package/contracts/macro-integration-tests/tests/ui/error/pass/attr_on_variant_allowed.rs +20 -0
  123. package/contracts/macro-integration-tests/tests/ui/error/pass/basic_auto_discriminants.rs +15 -0
  124. package/contracts/macro-integration-tests/tests/ui/error/pass/mixed_discriminants.rs +16 -0
  125. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_owner_missing_env.rs +22 -0
  126. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_owner_missing_env.stderr +16 -0
  127. package/contracts/macro-integration-tests/tests/ui/ownable/pass/minimal_contract.rs +26 -0
  128. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +22 -0
  129. package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_owner_env_param_variants.rs +46 -0
  130. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.rs +13 -0
  131. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.stderr +7 -0
  132. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.rs +13 -0
  133. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.stderr +7 -0
  134. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.rs +10 -0
  135. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.stderr +7 -0
  136. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.rs +12 -0
  137. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.stderr +7 -0
  138. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.rs +10 -0
  139. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.stderr +7 -0
  140. package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.rs +10 -0
  141. package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.stderr +7 -0
  142. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.rs +12 -0
  143. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.stderr +7 -0
  144. package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.rs +13 -0
  145. package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.stderr +7 -0
  146. package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.rs +13 -0
  147. package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.stderr +7 -0
  148. package/contracts/macro-integration-tests/tests/ui/storage/pass/default_value_on_variant.rs +14 -0
  149. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_instance_unit_basic.rs +14 -0
  150. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_persistent_named_fields_keyed.rs +16 -0
  151. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_temporary_unit_option.rs +15 -0
  152. package/contracts/macro-integration-tests/tests/ui/storage/pass/name_override.rs +14 -0
  153. package/contracts/macro-integration-tests/tests/ui/storage/pass/no_auto_ttl_extension.rs +19 -0
  154. package/contracts/macro-integration-tests/tests/ui/storage/pass/ttl_provider_basic.rs +15 -0
  155. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/minimal_contract.rs +44 -0
  156. package/contracts/macro-integration-tests/tests/ui_error.rs +11 -0
  157. package/contracts/macro-integration-tests/tests/ui_ownable.rs +11 -0
  158. package/contracts/macro-integration-tests/tests/ui_storage.rs +11 -0
  159. package/contracts/macro-integration-tests/tests/ui_ttl_configurable.rs +12 -0
  160. package/contracts/message-libs/blocked-message-lib/src/lib.rs +17 -17
  161. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/decode_packet_header.rs +64 -0
  162. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet.rs +58 -0
  163. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet_header.rs +138 -0
  164. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/mod.rs +6 -0
  165. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload.rs +30 -0
  166. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload_hash.rs +15 -0
  167. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/test_helper.rs +39 -0
  168. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_dvn_option.rs +57 -0
  169. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_lz_receive_option.rs +50 -0
  170. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_native_drop_option.rs +74 -0
  171. package/contracts/message-libs/message-lib-common/src/tests/worker_options/convert_legacy_options.rs +280 -0
  172. package/contracts/message-libs/message-lib-common/src/tests/worker_options/extract_type_3_options.rs +126 -0
  173. package/contracts/message-libs/message-lib-common/src/tests/worker_options/left_pad_to_bytes32.rs +48 -0
  174. package/contracts/message-libs/message-lib-common/src/tests/worker_options/mod.rs +7 -0
  175. package/contracts/message-libs/message-lib-common/src/tests/worker_options/split_worker_options.rs +139 -0
  176. package/contracts/message-libs/message-lib-common/src/worker_options.rs +31 -1
  177. package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +2 -2
  178. package/contracts/message-libs/treasury/src/errors.rs +0 -1
  179. package/contracts/message-libs/treasury/src/lib.rs +3 -3
  180. package/contracts/message-libs/treasury/src/storage.rs +2 -0
  181. package/contracts/message-libs/treasury/src/treasury.rs +12 -13
  182. package/contracts/message-libs/uln-302/Cargo.toml +1 -1
  183. package/contracts/message-libs/uln-302/src/errors.rs +0 -5
  184. package/contracts/message-libs/uln-302/src/events.rs +5 -6
  185. package/contracts/message-libs/uln-302/src/receive_uln.rs +24 -54
  186. package/contracts/message-libs/uln-302/src/send_uln.rs +89 -135
  187. package/contracts/message-libs/uln-302/src/storage.rs +5 -5
  188. package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +5 -7
  189. package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +3 -3
  190. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +6 -9
  191. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +2 -2
  192. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +3 -3
  193. package/contracts/message-libs/uln-302/src/tests/setup.rs +9 -0
  194. package/contracts/message-libs/uln-302/src/tests/testing_utils.rs +5 -0
  195. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_receive_uln_config.rs +1 -2
  196. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_send_uln_config.rs +1 -2
  197. package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +37 -55
  198. package/contracts/message-libs/uln-302/src/uln302.rs +8 -5
  199. package/contracts/oapps/counter/src/counter.rs +0 -1
  200. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +306 -224
  201. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +0 -1
  202. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +0 -1
  203. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +0 -1
  204. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +0 -1
  205. package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_core.rs +1 -0
  206. package/contracts/oapps/oft/integration-tests/setup.rs +10 -3
  207. package/contracts/oapps/oft/integration-tests/utils.rs +1 -1
  208. package/contracts/oapps/oft/src/default_oft_impl.rs +9 -3
  209. package/contracts/oapps/oft/src/extensions/oft_fee.rs +5 -5
  210. package/contracts/oapps/oft/src/extensions/pausable.rs +1 -1
  211. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +18 -18
  212. package/contracts/oapps/oft/src/oft.rs +9 -9
  213. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +1 -1
  214. package/contracts/oapps/oft/src/tests/extensions/setup.rs +26 -11
  215. package/contracts/oapps/oft/src/tests/extensions/test_rate_limiter.rs +1 -1
  216. package/contracts/oapps/oft/src/tests/test_send.rs +4 -4
  217. package/contracts/oapps/oft/src/tests/test_utils.rs +93 -74
  218. package/contracts/oapps/oft-std/Cargo.toml +6 -0
  219. package/contracts/oapps/oft-std/integration-tests/extensions/mod.rs +3 -0
  220. package/contracts/oapps/oft-std/integration-tests/extensions/test_oft_fee.rs +157 -0
  221. package/contracts/oapps/oft-std/integration-tests/extensions/test_pausable.rs +162 -0
  222. package/contracts/oapps/oft-std/integration-tests/extensions/test_rate_limiter.rs +186 -0
  223. package/contracts/oapps/oft-std/integration-tests/mod.rs +3 -0
  224. package/contracts/oapps/oft-std/integration-tests/setup.rs +245 -0
  225. package/contracts/oapps/oft-std/integration-tests/utils.rs +427 -0
  226. package/contracts/oapps/oft-std/src/lib.rs +12 -1
  227. package/contracts/oapps/oft-std/src/oft.rs +122 -25
  228. package/contracts/upgrader/Cargo.toml +19 -0
  229. package/contracts/upgrader/src/lib.rs +96 -0
  230. package/contracts/upgrader/src/tests/mod.rs +1 -0
  231. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract1.wasm +0 -0
  232. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract2.wasm +0 -0
  233. package/contracts/upgrader/src/tests/test_upgrader.rs +120 -0
  234. package/contracts/utils/src/errors.rs +6 -1
  235. package/contracts/utils/src/lib.rs +2 -1
  236. package/contracts/utils/src/ownable.rs +49 -61
  237. package/contracts/utils/src/tests/mod.rs +3 -1
  238. package/contracts/utils/src/tests/option_ext.rs +21 -0
  239. package/contracts/utils/src/tests/ownable.rs +10 -69
  240. package/contracts/utils/src/tests/ttl_configurable.rs +596 -0
  241. package/contracts/utils/src/tests/upgradeable.rs +288 -0
  242. package/contracts/utils/src/{ttl.rs → ttl_configurable.rs} +67 -52
  243. package/contracts/utils/src/upgradeable.rs +54 -0
  244. package/contracts/workers/dvn/Cargo.toml +1 -1
  245. package/contracts/workers/dvn/src/auth.rs +21 -32
  246. package/contracts/workers/dvn/src/dvn.rs +40 -3
  247. package/contracts/workers/dvn/src/errors.rs +1 -0
  248. package/contracts/workers/dvn/src/multisig.rs +10 -6
  249. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +2 -2
  250. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +4 -4
  251. package/contracts/workers/dvn-fee-lib/Cargo.toml +1 -2
  252. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +46 -14
  253. package/contracts/workers/dvn-fee-lib/src/errors.rs +3 -2
  254. package/contracts/workers/dvn-fee-lib/src/lib.rs +5 -11
  255. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +30 -16
  256. package/contracts/workers/executor/src/executor.rs +16 -2
  257. package/contracts/workers/executor-fee-lib/src/errors.rs +9 -7
  258. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +154 -119
  259. package/contracts/workers/executor-helper/Cargo.toml +0 -5
  260. package/contracts/workers/executor-helper/src/lib.rs +1 -7
  261. package/contracts/workers/price-feed/Cargo.toml +0 -1
  262. package/contracts/workers/price-feed/src/errors.rs +3 -2
  263. package/contracts/workers/price-feed/src/lib.rs +5 -6
  264. package/contracts/workers/price-feed/src/price_feed.rs +39 -17
  265. package/contracts/workers/worker/Cargo.toml +4 -0
  266. package/contracts/workers/worker/src/interfaces/price_feed.rs +3 -3
  267. package/contracts/workers/worker/src/lib.rs +2 -2
  268. package/contracts/workers/worker/src/tests/mod.rs +4 -0
  269. package/contracts/workers/worker/src/tests/setup.rs +147 -0
  270. package/contracts/workers/worker/src/tests/worker.rs +501 -0
  271. package/contracts/workers/worker/src/worker.rs +10 -16
  272. package/package.json +3 -3
  273. package/sdk/dist/generated/bml.d.ts +40 -30
  274. package/sdk/dist/generated/bml.js +16 -11
  275. package/sdk/dist/generated/counter.d.ts +168 -134
  276. package/sdk/dist/generated/counter.js +26 -21
  277. package/sdk/dist/generated/dvn.d.ts +1932 -0
  278. package/sdk/dist/generated/dvn.js +288 -0
  279. package/sdk/dist/generated/dvn_fee_lib.d.ts +615 -0
  280. package/sdk/dist/generated/dvn_fee_lib.js +123 -0
  281. package/sdk/dist/generated/endpoint.d.ts +75 -41
  282. package/sdk/dist/generated/endpoint.js +22 -17
  283. package/sdk/dist/generated/executor.d.ts +1809 -0
  284. package/sdk/dist/generated/executor.js +269 -0
  285. package/sdk/dist/generated/executor_fee_lib.d.ts +999 -0
  286. package/sdk/dist/generated/executor_fee_lib.js +208 -0
  287. package/sdk/dist/generated/executor_helper.d.ts +869 -0
  288. package/sdk/dist/generated/executor_helper.js +187 -0
  289. package/sdk/dist/generated/oft_std.d.ts +1544 -0
  290. package/sdk/dist/generated/oft_std.js +271 -0
  291. package/sdk/dist/generated/price_feed.d.ts +1002 -0
  292. package/sdk/dist/generated/price_feed.js +170 -0
  293. package/sdk/dist/generated/sml.d.ts +75 -41
  294. package/sdk/dist/generated/sml.js +22 -17
  295. package/sdk/dist/generated/uln302.d.ts +79 -60
  296. package/sdk/dist/generated/uln302.js +37 -37
  297. package/sdk/dist/generated/upgrader.d.ts +70 -0
  298. package/sdk/dist/generated/upgrader.js +19 -0
  299. package/sdk/dist/index.d.ts +8 -0
  300. package/sdk/dist/index.js +11 -0
  301. package/sdk/package.json +4 -3
  302. package/sdk/src/index.ts +13 -0
  303. package/sdk/test/index.test.ts +0 -1
  304. package/sdk/test/oft.test.ts +12 -23
  305. package/sdk/test/suites/testUpgradeable.ts +169 -0
  306. package/sdk/test/upgrader.test.ts +309 -0
  307. package/tools/ts-bindings-gen/src/main.rs +11 -1
  308. package/contracts/endpoint-v2/src/tests/messaging_channel/clear.rs +0 -316
  309. package/contracts/endpoint-v2/src/tests/messaging_channel/internal.rs +0 -388
  310. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +0 -162
  311. package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +0 -319
  312. package/contracts/utils/src/tests/ttl.rs +0 -421
  313. /package/contracts/{oapp-macros → oapps/oapp-macros}/Cargo.toml +0 -0
  314. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/lib.rs +0 -0
  315. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_full.rs +0 -0
  316. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_options_type3.rs +0 -0
  317. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_receiver.rs +0 -0
  318. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_sender.rs +0 -0
  319. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/util.rs +0 -0
@@ -0,0 +1,377 @@
1
+ //! Test setup and mock contracts for LayerZero view tests.
2
+
3
+ use common_macros::contract_impl;
4
+ use endpoint_v2::{MessageLibClient, Origin, OutboundPacket, SetConfigParam};
5
+ use message_lib_common::packet_codec_v1;
6
+ use soroban_sdk::{
7
+ address_payload::AddressPayload, contract, log, testutils::Address as _, Address, Bytes, BytesN, Env, Vec,
8
+ };
9
+
10
+ use crate::{LayerZeroView, LayerZeroViewClient};
11
+
12
+ pub const LOCAL_EID: u32 = 30010;
13
+ pub const REMOTE_EID: u32 = 30011;
14
+
15
+ // ============================================================================
16
+ // Mock Endpoint Contract
17
+ // ============================================================================
18
+
19
+ /// Mock endpoint that provides basic endpoint functionality for testing.
20
+ /// Uses simple setters to control return values - real endpoint logic is tested separately.
21
+ #[contract]
22
+ pub struct MockEndpoint;
23
+
24
+ mod endpoint_storage {
25
+ use soroban_sdk::{contracttype, Address, BytesN};
26
+
27
+ #[contracttype]
28
+ pub enum MockEndpointStorage {
29
+ // Simple return value controls
30
+ Initializable(Address, u32, BytesN<32>),
31
+ Verifiable(Address, u32, BytesN<32>),
32
+ // State for executable tests
33
+ LazyInboundNonce(Address, u32, BytesN<32>),
34
+ InboundNonce(Address, u32, BytesN<32>),
35
+ InboundPayloadHash(Address, u32, BytesN<32>, u64),
36
+ ReceiveLibrary(Address, u32),
37
+ }
38
+ }
39
+
40
+ #[contract_impl]
41
+ impl MockEndpoint {
42
+ pub fn eid(_env: &Env) -> u32 {
43
+ LOCAL_EID
44
+ }
45
+
46
+ pub fn set_config(env: &Env, _caller: &Address, oapp: &Address, lib: &Address, params: &Vec<SetConfigParam>) {
47
+ let msglib = MessageLibClient::new(env, lib);
48
+ msglib.set_config(oapp, params);
49
+ }
50
+
51
+ /// Returns initializable state - controlled by set_initializable setter.
52
+ pub fn initializable(env: &Env, origin: &Origin, receiver: &Address) -> bool {
53
+ env.storage()
54
+ .persistent()
55
+ .get(&endpoint_storage::MockEndpointStorage::Initializable(
56
+ receiver.clone(),
57
+ origin.src_eid,
58
+ origin.sender.clone(),
59
+ ))
60
+ .unwrap_or(false)
61
+ }
62
+
63
+ /// Returns verifiable state - controlled by set_verifiable setter.
64
+ pub fn verifiable(env: &Env, origin: &Origin, receiver: &Address) -> bool {
65
+ env.storage()
66
+ .persistent()
67
+ .get(&endpoint_storage::MockEndpointStorage::Verifiable(
68
+ receiver.clone(),
69
+ origin.src_eid,
70
+ origin.sender.clone(),
71
+ ))
72
+ .unwrap_or(true) // Default true so tests can focus on other conditions
73
+ }
74
+
75
+ // =========================================================================
76
+ // Setters for controlling mock behavior
77
+ // =========================================================================
78
+
79
+ /// Set what initializable() returns for a given path.
80
+ pub fn set_initializable(env: &Env, receiver: &Address, src_eid: &u32, sender: &BytesN<32>, value: &bool) {
81
+ env.storage().persistent().set(
82
+ &endpoint_storage::MockEndpointStorage::Initializable(receiver.clone(), *src_eid, sender.clone()),
83
+ value,
84
+ );
85
+ }
86
+
87
+ /// Set what verifiable() returns for a given path.
88
+ pub fn set_verifiable(env: &Env, receiver: &Address, src_eid: &u32, sender: &BytesN<32>, value: &bool) {
89
+ env.storage()
90
+ .persistent()
91
+ .set(&endpoint_storage::MockEndpointStorage::Verifiable(receiver.clone(), *src_eid, sender.clone()), value);
92
+ }
93
+
94
+ pub fn set_lazy_inbound_nonce(env: &Env, receiver: &Address, src_eid: &u32, sender: &BytesN<32>, nonce: &u64) {
95
+ env.storage().persistent().set(
96
+ &endpoint_storage::MockEndpointStorage::LazyInboundNonce(receiver.clone(), *src_eid, sender.clone()),
97
+ nonce,
98
+ );
99
+ }
100
+
101
+ pub fn set_inbound_nonce(env: &Env, receiver: &Address, src_eid: &u32, sender: &BytesN<32>, nonce: &u64) {
102
+ env.storage().persistent().set(
103
+ &endpoint_storage::MockEndpointStorage::InboundNonce(receiver.clone(), *src_eid, sender.clone()),
104
+ nonce,
105
+ );
106
+ }
107
+
108
+ pub fn set_inbound_payload_hash(
109
+ env: &Env,
110
+ receiver: &Address,
111
+ src_eid: &u32,
112
+ sender: &BytesN<32>,
113
+ nonce: &u64,
114
+ payload_hash: &Option<BytesN<32>>,
115
+ ) {
116
+ let key = endpoint_storage::MockEndpointStorage::InboundPayloadHash(
117
+ receiver.clone(),
118
+ *src_eid,
119
+ sender.clone(),
120
+ *nonce,
121
+ );
122
+ match payload_hash {
123
+ Some(hash) => env.storage().persistent().set(&key, hash),
124
+ None => env.storage().persistent().remove(&key),
125
+ }
126
+ }
127
+
128
+ pub fn set_receive_library(env: &Env, receiver: &Address, src_eid: &u32, lib: &Address) {
129
+ env.storage()
130
+ .persistent()
131
+ .set(&endpoint_storage::MockEndpointStorage::ReceiveLibrary(receiver.clone(), *src_eid), lib);
132
+ }
133
+
134
+ // =========================================================================
135
+ // Getters required by LayerZeroView
136
+ // =========================================================================
137
+
138
+ pub fn lazy_inbound_nonce(env: &Env, receiver: &Address, src_eid: &u32, sender: &BytesN<32>) -> u64 {
139
+ env.storage()
140
+ .persistent()
141
+ .get(&endpoint_storage::MockEndpointStorage::LazyInboundNonce(receiver.clone(), *src_eid, sender.clone()))
142
+ .unwrap_or(0)
143
+ }
144
+
145
+ pub fn inbound_nonce(env: &Env, receiver: &Address, src_eid: &u32, sender: &BytesN<32>) -> u64 {
146
+ env.storage()
147
+ .persistent()
148
+ .get(&endpoint_storage::MockEndpointStorage::InboundNonce(receiver.clone(), *src_eid, sender.clone()))
149
+ .unwrap_or(0)
150
+ }
151
+
152
+ pub fn inbound_payload_hash(
153
+ env: &Env,
154
+ receiver: &Address,
155
+ src_eid: &u32,
156
+ sender: &BytesN<32>,
157
+ nonce: &u64,
158
+ ) -> Option<BytesN<32>> {
159
+ env.storage().persistent().get(&endpoint_storage::MockEndpointStorage::InboundPayloadHash(
160
+ receiver.clone(),
161
+ *src_eid,
162
+ sender.clone(),
163
+ *nonce,
164
+ ))
165
+ }
166
+
167
+ pub fn is_valid_receive_library(env: &Env, receiver: &Address, src_eid: &u32, lib: &Address) -> bool {
168
+ let stored_lib: Option<Address> = env
169
+ .storage()
170
+ .persistent()
171
+ .get(&endpoint_storage::MockEndpointStorage::ReceiveLibrary(receiver.clone(), *src_eid));
172
+
173
+ match stored_lib {
174
+ Some(stored) => &stored == lib,
175
+ None => true, // Default: any lib is valid if not set
176
+ }
177
+ }
178
+ }
179
+
180
+ // ============================================================================
181
+ // Mock ULN302 Contract (minimal for testing)
182
+ // ============================================================================
183
+
184
+ mod uln_storage {
185
+ use soroban_sdk::{contracttype, BytesN};
186
+
187
+ #[contracttype]
188
+ pub enum MockUlnStorage {
189
+ Owner,
190
+ Endpoint,
191
+ Treasury,
192
+ // Simple return value control for verifiable()
193
+ Verifiable(BytesN<32>, BytesN<32>), // (header_hash, payload_hash) -> bool
194
+ }
195
+ }
196
+
197
+ #[contract]
198
+ pub struct MockUln302;
199
+
200
+ #[contract_impl]
201
+ impl MockUln302 {
202
+ pub fn __constructor(env: &Env, owner: &Address, endpoint: &Address, treasury: &Address) {
203
+ env.storage().persistent().set(&uln_storage::MockUlnStorage::Owner, owner);
204
+ env.storage().persistent().set(&uln_storage::MockUlnStorage::Endpoint, endpoint);
205
+ env.storage().persistent().set(&uln_storage::MockUlnStorage::Treasury, treasury);
206
+ }
207
+
208
+ /// Returns verifiable state - controlled by set_verifiable setter.
209
+ /// Default is false (Verifying state) unless explicitly set.
210
+ pub fn verifiable(env: &Env, packet_header: &Bytes, payload_hash: &BytesN<32>) -> bool {
211
+ let header_hash = endpoint_v2::util::keccak256(env, packet_header);
212
+ env.storage()
213
+ .persistent()
214
+ .get(&uln_storage::MockUlnStorage::Verifiable(header_hash, payload_hash.clone()))
215
+ .unwrap_or(false)
216
+ }
217
+
218
+ /// Set what verifiable() returns for a given packet header and payload hash.
219
+ pub fn set_verifiable(env: &Env, packet_header: &Bytes, payload_hash: &BytesN<32>, value: &bool) {
220
+ let header_hash = endpoint_v2::util::keccak256(env, packet_header);
221
+ env.storage()
222
+ .persistent()
223
+ .set(&uln_storage::MockUlnStorage::Verifiable(header_hash, payload_hash.clone()), value);
224
+ }
225
+ }
226
+
227
+ // ============================================================================
228
+ // Test Setup
229
+ // ============================================================================
230
+
231
+ pub struct TestSetup<'a> {
232
+ pub env: Env,
233
+ pub _owner: Address,
234
+ pub endpoint: Address,
235
+ pub endpoint_client: MockEndpointClient<'a>,
236
+ pub uln302: Address,
237
+ pub uln302_client: MockUln302Client<'a>,
238
+ pub view_client: LayerZeroViewClient<'a>,
239
+ }
240
+
241
+ /// Creates a full test setup with endpoint, ULN302, and view contract.
242
+ pub fn setup<'a>() -> TestSetup<'a> {
243
+ let env = Env::default();
244
+ let owner = Address::generate(&env);
245
+
246
+ // Deploy mock endpoint
247
+ let endpoint = env.register(MockEndpoint, ());
248
+ let endpoint_client = MockEndpointClient::new(&env, &endpoint);
249
+
250
+ // Deploy Mock ULN302 (treasury not needed for simplified mock)
251
+ let treasury = Address::generate(&env);
252
+ let uln302 = env.register(MockUln302, (&owner, &endpoint, &treasury));
253
+ let uln302_client = MockUln302Client::new(&env, &uln302);
254
+
255
+ // Deploy LayerZeroView
256
+ let view = env.register(LayerZeroView, (&owner, &endpoint, &uln302));
257
+ let view_client = LayerZeroViewClient::new(&env, &view);
258
+
259
+ log!(&env, "owner: {}", owner);
260
+ log!(&env, "endpoint: {}", endpoint);
261
+ log!(&env, "uln302: {}", uln302);
262
+ log!(&env, "view: {}", view);
263
+
264
+ TestSetup { env, _owner: owner, endpoint, endpoint_client, uln302, uln302_client, view_client }
265
+ }
266
+
267
+ impl<'a> TestSetup<'a> {
268
+ /// Register a mock OApp address.
269
+ pub fn register_oapp(&self) -> Address {
270
+ Address::generate(&self.env)
271
+ }
272
+
273
+ /// Set initializable return value for a path (endpoint mock).
274
+ pub fn set_initializable(&self, receiver: &Address, src_eid: u32, sender: &Address, value: bool) {
275
+ let sender_bytes32 = address_to_bytes32(sender);
276
+ self.endpoint_client.set_initializable(receiver, &src_eid, &sender_bytes32, &value);
277
+ }
278
+
279
+ /// Set verifiable return value for a path (endpoint mock).
280
+ pub fn set_verifiable(&self, receiver: &Address, src_eid: u32, sender: &Address, value: bool) {
281
+ let sender_bytes32 = address_to_bytes32(sender);
282
+ self.endpoint_client.set_verifiable(receiver, &src_eid, &sender_bytes32, &value);
283
+ }
284
+
285
+ /// Set lazy inbound nonce (marks messages up to this nonce as processed).
286
+ pub fn set_lazy_inbound_nonce(&self, receiver: &Address, src_eid: u32, sender: &Address, nonce: u64) {
287
+ let sender_bytes32 = address_to_bytes32(sender);
288
+ self.endpoint_client.set_lazy_inbound_nonce(receiver, &src_eid, &sender_bytes32, &nonce);
289
+ }
290
+
291
+ /// Set inbound nonce (marks messages up to this nonce as verified and executable).
292
+ pub fn set_inbound_nonce(&self, receiver: &Address, src_eid: u32, sender: &Address, nonce: u64) {
293
+ let sender_bytes32 = address_to_bytes32(sender);
294
+ self.endpoint_client.set_inbound_nonce(receiver, &src_eid, &sender_bytes32, &nonce);
295
+ }
296
+
297
+ /// Set payload hash for a specific message.
298
+ pub fn set_payload_hash(
299
+ &self,
300
+ receiver: &Address,
301
+ src_eid: u32,
302
+ sender: &Address,
303
+ nonce: u64,
304
+ payload_hash: &Option<BytesN<32>>,
305
+ ) {
306
+ let sender_bytes32 = address_to_bytes32(sender);
307
+ self.endpoint_client.set_inbound_payload_hash(receiver, &src_eid, &sender_bytes32, &nonce, payload_hash);
308
+ }
309
+
310
+ /// Set receive library for a receiver/src_eid combination.
311
+ pub fn set_receive_library(&self, receiver: &Address, src_eid: u32, lib: &Address) {
312
+ self.endpoint_client.set_receive_library(receiver, &src_eid, lib);
313
+ }
314
+
315
+ /// Set ULN302 verifiable return value for a packet header and payload hash.
316
+ pub fn set_uln_verifiable(&self, packet_header: &Bytes, payload_hash: &BytesN<32>, value: bool) {
317
+ self.uln302_client.set_verifiable(packet_header, payload_hash, &value);
318
+ }
319
+ }
320
+
321
+ // ============================================================================
322
+ // Helper Functions
323
+ // ============================================================================
324
+
325
+ /// Extract BytesN<32> from an Address.
326
+ pub fn address_to_bytes32(address: &Address) -> BytesN<32> {
327
+ match address.to_payload().unwrap() {
328
+ AddressPayload::AccountIdPublicKeyEd25519(payload) => payload,
329
+ AddressPayload::ContractIdHash(payload) => payload,
330
+ }
331
+ }
332
+
333
+ /// Create a test packet header.
334
+ pub fn create_test_packet_header(env: &Env, receiver: &Address, sender: &Address, nonce: u64) -> Bytes {
335
+ let guid = BytesN::from_array(env, &[5u8; 32]);
336
+ let message = Bytes::from_array(env, &[0x01, 0x02, 0x03, 0x04]);
337
+
338
+ let packet = OutboundPacket {
339
+ nonce,
340
+ src_eid: REMOTE_EID,
341
+ sender: sender.clone(),
342
+ dst_eid: LOCAL_EID,
343
+ receiver: address_to_bytes32(receiver),
344
+ guid,
345
+ message,
346
+ };
347
+ packet_codec_v1::encode_packet_header(env, &packet)
348
+ }
349
+
350
+ /// Create a test packet header with custom dst_eid.
351
+ pub fn create_test_packet_header_with_eid(
352
+ env: &Env,
353
+ receiver: &Address,
354
+ sender: &Address,
355
+ nonce: u64,
356
+ dst_eid: u32,
357
+ ) -> Bytes {
358
+ let guid = BytesN::from_array(env, &[5u8; 32]);
359
+ let message = Bytes::from_array(env, &[0x01, 0x02, 0x03, 0x04]);
360
+
361
+ let packet = OutboundPacket {
362
+ nonce,
363
+ src_eid: REMOTE_EID,
364
+ sender: sender.clone(),
365
+ dst_eid,
366
+ receiver: address_to_bytes32(receiver),
367
+ guid,
368
+ message,
369
+ };
370
+ packet_codec_v1::encode_packet_header(env, &packet)
371
+ }
372
+
373
+ /// Create a test payload hash.
374
+ pub fn create_test_payload_hash(env: &Env) -> BytesN<32> {
375
+ let random_data = Bytes::from_array(env, &[0xde, 0xad, 0xbe, 0xef]);
376
+ endpoint_v2::util::keccak256(env, &random_data)
377
+ }
@@ -0,0 +1,50 @@
1
+ //! Shared types for LayerZero view contracts.
2
+
3
+ use endpoint_v2::constants::{EMPTY_PAYLOAD_HASH_BYTES, NIL_PAYLOAD_HASH_BYTES};
4
+ use soroban_sdk::{contracttype, BytesN, Env};
5
+
6
+ /// Represents the execution state of a cross-chain message.
7
+ ///
8
+ /// Used by executors to determine when a message is ready to be delivered.
9
+ #[contracttype]
10
+ #[derive(Clone, Debug, Eq, PartialEq)]
11
+ pub enum ExecutionState {
12
+ /// Message is not ready for execution - waiting for verification.
13
+ NotExecutable,
14
+ /// Message is verified but cannot be executed yet (prior nonces pending).
15
+ VerifiedButNotExecutable,
16
+ /// Message is ready to be executed.
17
+ Executable,
18
+ /// Message has already been executed.
19
+ Executed,
20
+ }
21
+
22
+ /// Represents the verification state of a cross-chain message at the ULN level.
23
+ ///
24
+ /// Used by DVNs and executors to track verification progress.
25
+ #[contracttype]
26
+ #[derive(Clone, Debug, Eq, PartialEq)]
27
+ pub enum VerificationState {
28
+ /// DVNs are still collecting signatures/confirmations.
29
+ Verifying,
30
+ /// Has enough DVN confirmations, ready to be committed to endpoint.
31
+ Verifiable,
32
+ /// Already verified at the endpoint.
33
+ Verified,
34
+ /// Cannot be initialized (path blocked).
35
+ NotInitializable,
36
+ }
37
+
38
+ // ============================================================================
39
+ // Helper Functions
40
+ // ============================================================================
41
+
42
+ /// Returns the empty payload hash as BytesN<32>.
43
+ pub fn empty_payload_hash(env: &Env) -> BytesN<32> {
44
+ BytesN::from_array(env, &EMPTY_PAYLOAD_HASH_BYTES)
45
+ }
46
+
47
+ /// Returns the nil payload hash as BytesN<32>.
48
+ pub fn nil_payload_hash(env: &Env) -> BytesN<32> {
49
+ BytesN::from_array(env, &NIL_PAYLOAD_HASH_BYTES)
50
+ }
@@ -0,0 +1,30 @@
1
+ [package]
2
+ name = "macro-integration-tests"
3
+ version.workspace = true
4
+ edition.workspace = true
5
+ license.workspace = true
6
+ publish = false
7
+
8
+ [lib]
9
+ # This crate is primarily for testing macros.
10
+ # The lib.rs provides shared testing utilities.
11
+ doctest = false
12
+
13
+ [dependencies]
14
+ soroban-sdk = { workspace = true }
15
+
16
+ # Macro crates to be tested
17
+ common-macros = { workspace = true }
18
+ oapp-macros = { workspace = true }
19
+ # oft-macros = { workspace = true } # TODO: Add when available
20
+
21
+ # Runtime libraries (for verifying generated code behavior)
22
+ utils = { workspace = true }
23
+ oapp = { workspace = true }
24
+ # oft = { workspace = true } # TODO: Add when available
25
+ endpoint-v2 = { workspace = true, features = ["library"] }
26
+
27
+ [dev-dependencies]
28
+ soroban-sdk = { workspace = true, features = ["testutils"] }
29
+ utils = { workspace = true, features = ["testutils"] }
30
+ trybuild = "1.0.114"
@@ -0,0 +1,62 @@
1
+ // Runtime tests: Owner initialization behavior.
2
+ //
3
+ // Tests covered:
4
+ // - `init_owner` + `owner()` query works correctly.
5
+ // - Double initialization is rejected.
6
+ // - Uninitialized owner returns None and operations fail.
7
+
8
+ use super::{TestContract, TestContractClient};
9
+ use soroban_sdk::{testutils::Address as _, Address, Env};
10
+ use utils::errors::OwnableError;
11
+
12
+ #[test]
13
+ fn init_and_query() {
14
+ let env = Env::default();
15
+ let contract_id = env.register(TestContract, ());
16
+ let client = TestContractClient::new(&env, &contract_id);
17
+
18
+ let owner = Address::generate(&env);
19
+ client.init(&owner);
20
+
21
+ let got = client.owner();
22
+ assert_eq!(got, Some(owner));
23
+ }
24
+
25
+ #[test]
26
+ fn double_init_fails() {
27
+ let env = Env::default();
28
+ let contract_id = env.register(TestContract, ());
29
+ let client = TestContractClient::new(&env, &contract_id);
30
+
31
+ let owner_a = Address::generate(&env);
32
+ let owner_b = Address::generate(&env);
33
+
34
+ // First initialization should succeed
35
+ client.init(&owner_a);
36
+ assert_eq!(client.owner(), Some(owner_a.clone()));
37
+
38
+ // Second initialization should fail
39
+ let result = client.try_init(&owner_b);
40
+ assert_eq!(result.unwrap_err().unwrap(), OwnableError::OwnerAlreadySet.into());
41
+
42
+ // Original owner should remain unchanged
43
+ assert_eq!(client.owner(), Some(owner_a));
44
+ }
45
+
46
+ #[test]
47
+ fn uninitialized_returns_none() {
48
+ let env = Env::default();
49
+ let contract_id = env.register(TestContract, ());
50
+ let client = TestContractClient::new(&env, &contract_id);
51
+
52
+ // No init() call - owner should be None
53
+ assert_eq!(client.owner(), None);
54
+
55
+ // All owner-protected operations should fail
56
+ assert_eq!(client.try_guarded().unwrap_err().unwrap(), OwnableError::OwnerNotSet.into());
57
+ assert_eq!(
58
+ client.try_transfer_ownership(&Address::generate(&env)).unwrap_err().unwrap(),
59
+ OwnableError::OwnerNotSet.into()
60
+ );
61
+ assert_eq!(client.try_renounce_ownership().unwrap_err().unwrap(), OwnableError::OwnerNotSet.into());
62
+ }
@@ -0,0 +1,22 @@
1
+ use soroban_sdk::{contract, contractimpl, Address, Env};
2
+
3
+ mod initialization;
4
+ mod only_owner_guard;
5
+ mod ownership_transfer;
6
+
7
+ /// Shared contract used by ownable runtime tests.
8
+ #[contract]
9
+ #[common_macros::ownable]
10
+ pub struct TestContract;
11
+
12
+ #[contractimpl]
13
+ impl TestContract {
14
+ pub fn init(env: Env, owner: Address) {
15
+ Self::init_owner(&env, &owner);
16
+ }
17
+
18
+ #[common_macros::only_owner]
19
+ pub fn guarded(env: &Env) {
20
+ let _ = env;
21
+ }
22
+ }
@@ -0,0 +1,97 @@
1
+ // Runtime tests: `#[only_owner]` guard behavior.
2
+ //
3
+ // Tests covered:
4
+ // - Guard enforces owner authorization (unauthorized fails, authorized succeeds).
5
+ // - Guard respects ownership transfer (old owner rejected, new owner accepted).
6
+
7
+ use super::{TestContract, TestContractClient};
8
+ use soroban_sdk::{
9
+ testutils::{Address as _, MockAuth, MockAuthInvoke},
10
+ xdr::{ScErrorCode, ScErrorType},
11
+ Address, Env, Error, IntoVal,
12
+ };
13
+
14
+ #[test]
15
+ fn guard_enforces_auth() {
16
+ let env = Env::default();
17
+ let contract_id = env.register(TestContract, ());
18
+ let client = TestContractClient::new(&env, &contract_id);
19
+
20
+ let owner = Address::generate(&env);
21
+ client.init(&owner);
22
+
23
+ // Unauthorized call should fail
24
+ let unauthorized = client.try_guarded();
25
+ assert_eq!(
26
+ unauthorized.unwrap_err().unwrap(),
27
+ Error::from_type_and_code(ScErrorType::Context, ScErrorCode::InvalidAction)
28
+ );
29
+
30
+ // Authorized call should succeed
31
+ client
32
+ .mock_auths(&[MockAuth {
33
+ address: &owner,
34
+ invoke: &MockAuthInvoke {
35
+ contract: &contract_id,
36
+ fn_name: "guarded",
37
+ args: ().into_val(&env),
38
+ sub_invokes: &[],
39
+ },
40
+ }])
41
+ .guarded();
42
+ }
43
+
44
+ #[test]
45
+ fn guard_respects_transfer() {
46
+ let env = Env::default();
47
+ let contract_id = env.register(TestContract, ());
48
+ let client = TestContractClient::new(&env, &contract_id);
49
+
50
+ let owner_a = Address::generate(&env);
51
+ let owner_b = Address::generate(&env);
52
+
53
+ client.init(&owner_a);
54
+
55
+ // Transfer ownership A -> B
56
+ client
57
+ .mock_auths(&[MockAuth {
58
+ address: &owner_a,
59
+ invoke: &MockAuthInvoke {
60
+ contract: &contract_id,
61
+ fn_name: "transfer_ownership",
62
+ args: (&owner_b,).into_val(&env),
63
+ sub_invokes: &[],
64
+ },
65
+ }])
66
+ .transfer_ownership(&owner_b);
67
+
68
+ // Old owner (A) should be rejected even with auth
69
+ let a_call = client
70
+ .mock_auths(&[MockAuth {
71
+ address: &owner_a,
72
+ invoke: &MockAuthInvoke {
73
+ contract: &contract_id,
74
+ fn_name: "guarded",
75
+ args: ().into_val(&env),
76
+ sub_invokes: &[],
77
+ },
78
+ }])
79
+ .try_guarded();
80
+ assert_eq!(
81
+ a_call.unwrap_err().unwrap(),
82
+ Error::from_type_and_code(ScErrorType::Context, ScErrorCode::InvalidAction)
83
+ );
84
+
85
+ // New owner (B) should be accepted with auth
86
+ client
87
+ .mock_auths(&[MockAuth {
88
+ address: &owner_b,
89
+ invoke: &MockAuthInvoke {
90
+ contract: &contract_id,
91
+ fn_name: "guarded",
92
+ args: ().into_val(&env),
93
+ sub_invokes: &[],
94
+ },
95
+ }])
96
+ .guarded();
97
+ }