@layerzerolabs/protocol-stellar-v2 0.2.13 → 0.2.18

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 (435) hide show
  1. package/.turbo/turbo-build.log +484 -337
  2. package/.turbo/turbo-lint.log +126 -56
  3. package/.turbo/turbo-test.log +1403 -984
  4. package/Cargo.lock +142 -3
  5. package/Cargo.toml +5 -1
  6. package/contracts/ERROR_SPEC.md +44 -0
  7. package/contracts/common-macros/src/auth.rs +113 -0
  8. package/contracts/common-macros/src/contract_ttl.rs +84 -0
  9. package/contracts/common-macros/src/lib.rs +219 -29
  10. package/contracts/common-macros/src/lz_contract.rs +83 -0
  11. package/contracts/common-macros/src/storage.rs +1 -1
  12. package/contracts/common-macros/src/tests/{ownable.rs → auth.rs} +48 -15
  13. package/contracts/common-macros/src/tests/contract_ttl.rs +662 -0
  14. package/contracts/common-macros/src/tests/mod.rs +3 -2
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +20 -0
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +24 -0
  17. package/contracts/common-macros/src/tests/snapshots/{common_macros__tests__ownable__snapshot_only_owner_preserves_function_signature.snap → common_macros__tests__auth__snapshot_only_auth_preserves_function_signature.snap} +4 -4
  18. package/contracts/common-macros/src/tests/snapshots/{common_macros__tests__contract_impl__snapshot_generated_contract_impl_code.snap → common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap} +26 -10
  19. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contracttrait_code.snap +69 -0
  20. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +48 -48
  21. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +7 -41
  22. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +21 -0
  23. package/contracts/common-macros/src/tests/upgradeable.rs +31 -0
  24. package/contracts/common-macros/src/ttl_configurable.rs +21 -66
  25. package/contracts/common-macros/src/ttl_extendable.rs +36 -0
  26. package/contracts/common-macros/src/upgradeable.rs +76 -0
  27. package/contracts/common-macros/src/utils.rs +9 -0
  28. package/contracts/endpoint-v2/src/constants.rs +4 -4
  29. package/contracts/endpoint-v2/src/endpoint_v2.rs +58 -36
  30. package/contracts/endpoint-v2/src/errors.rs +4 -3
  31. package/contracts/endpoint-v2/src/events.rs +1 -1
  32. package/contracts/endpoint-v2/src/message_lib_manager.rs +18 -5
  33. package/contracts/endpoint-v2/src/messaging_channel.rs +11 -1
  34. package/contracts/endpoint-v2/src/messaging_composer.rs +11 -1
  35. package/contracts/endpoint-v2/src/storage.rs +1 -1
  36. package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +175 -8
  37. package/contracts/endpoint-v2/src/tests/endpoint_v2/build_outbound_packet.rs +76 -0
  38. package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +342 -159
  39. package/contracts/endpoint-v2/src/tests/endpoint_v2/delegate.rs +3 -15
  40. package/contracts/endpoint-v2/src/tests/endpoint_v2/initializable.rs +20 -31
  41. package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +126 -164
  42. package/contracts/endpoint-v2/src/tests/endpoint_v2/mod.rs +1 -0
  43. package/contracts/endpoint-v2/src/tests/endpoint_v2/native_token.rs +0 -1
  44. package/contracts/endpoint-v2/src/tests/endpoint_v2/owner.rs +0 -1
  45. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +311 -304
  46. package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +423 -96
  47. package/contracts/endpoint-v2/src/tests/endpoint_v2/recover_token.rs +1 -1
  48. package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +47 -20
  49. package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +373 -403
  50. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +96 -22
  51. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +62 -10
  52. package/contracts/endpoint-v2/src/tests/endpoint_v2/transfer_ownership.rs +4 -4
  53. package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +8 -11
  54. package/contracts/endpoint-v2/src/tests/endpoint_v2/verifiable.rs +81 -30
  55. package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +209 -76
  56. package/contracts/endpoint-v2/src/tests/endpoint_v2/zro.rs +0 -1
  57. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library.rs +24 -0
  58. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library_timeout.rs +40 -0
  59. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_send_library.rs +24 -0
  60. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_config.rs +108 -0
  61. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_library_index.rs +52 -0
  62. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_receive_library.rs +92 -0
  63. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_registered_libraries.rs +74 -0
  64. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_send_library.rs +83 -0
  65. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_registered_library.rs +32 -0
  66. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_supported_eid.rs +28 -0
  67. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_valid_receive_library.rs +261 -0
  68. package/contracts/endpoint-v2/src/tests/message_lib_manager/mod.rs +16 -0
  69. package/contracts/endpoint-v2/src/tests/message_lib_manager/receive_library_timeout.rs +62 -0
  70. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +65 -43
  71. package/contracts/endpoint-v2/src/tests/message_lib_manager/registered_libraries_count.rs +42 -0
  72. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +61 -0
  73. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +4 -6
  74. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +59 -0
  75. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +16 -2
  76. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_config.rs +155 -51
  77. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +114 -92
  78. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +235 -132
  79. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +93 -87
  80. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +346 -245
  81. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +406 -60
  82. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +252 -78
  83. package/contracts/endpoint-v2/src/tests/message_lib_manager/timeout.rs +102 -0
  84. package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +212 -273
  85. package/contracts/endpoint-v2/src/tests/messaging_channel/clear_payload.rs +203 -0
  86. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound.rs +94 -0
  87. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_nonce.rs +78 -248
  88. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_payload_hash.rs +7 -282
  89. package/contracts/endpoint-v2/src/tests/messaging_channel/lazy_inbound_nonce.rs +6 -274
  90. package/contracts/endpoint-v2/src/tests/messaging_channel/mod.rs +3 -2
  91. package/contracts/endpoint-v2/src/tests/messaging_channel/next_guid.rs +86 -178
  92. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +328 -212
  93. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound.rs +68 -0
  94. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound_nonce.rs +6 -209
  95. package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +207 -159
  96. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +142 -153
  97. package/contracts/endpoint-v2/src/tests/messaging_composer/compose_queue.rs +6 -179
  98. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +163 -221
  99. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +90 -121
  100. package/contracts/endpoint-v2/src/tests/mock.rs +18 -4
  101. package/contracts/endpoint-v2/src/tests/util/build_payload.rs +4 -70
  102. package/contracts/endpoint-v2/src/tests/util/compute_guid.rs +2 -1
  103. package/contracts/endpoint-v2/src/tests/util/keccak256.rs +17 -106
  104. package/contracts/layerzero-views/Cargo.toml +35 -0
  105. package/contracts/layerzero-views/src/errors.rs +10 -0
  106. package/contracts/layerzero-views/src/layerzero_view.rs +226 -0
  107. package/contracts/layerzero-views/src/lib.rs +38 -0
  108. package/contracts/layerzero-views/src/storage.rs +18 -0
  109. package/contracts/layerzero-views/src/tests/layerzero_view_tests.rs +423 -0
  110. package/contracts/layerzero-views/src/tests/mod.rs +4 -0
  111. package/contracts/layerzero-views/src/tests/setup.rs +377 -0
  112. package/contracts/layerzero-views/src/types.rs +50 -0
  113. package/contracts/macro-integration-tests/Cargo.toml +30 -0
  114. package/contracts/macro-integration-tests/src/lib.rs +1 -0
  115. package/contracts/macro-integration-tests/tests/runtime/ownable/initialization.rs +62 -0
  116. package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +22 -0
  117. package/contracts/macro-integration-tests/tests/runtime/ownable/only_auth_guard.rs +97 -0
  118. package/contracts/macro-integration-tests/tests/runtime/ownable/ownership_transfer.rs +101 -0
  119. package/contracts/macro-integration-tests/tests/runtime/storage/keyed_roundtrip.rs +225 -0
  120. package/contracts/macro-integration-tests/tests/runtime/storage/mod.rs +4 -0
  121. package/contracts/macro-integration-tests/tests/runtime/storage/name_override_runtime.rs +52 -0
  122. package/contracts/macro-integration-tests/tests/runtime/storage/ttl_extension.rs +261 -0
  123. package/contracts/macro-integration-tests/tests/runtime/storage/unkeyed_roundtrip.rs +137 -0
  124. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +113 -0
  125. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +139 -0
  126. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/mod.rs +2 -0
  127. package/contracts/macro-integration-tests/tests/runtime.rs +5 -0
  128. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.rs +12 -0
  129. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.stderr +7 -0
  130. package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.rs +12 -0
  131. package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.stderr +7 -0
  132. package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.rs +21 -0
  133. package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.stderr +7 -0
  134. package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.rs +13 -0
  135. package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.stderr +7 -0
  136. package/contracts/macro-integration-tests/tests/ui/error/pass/attr_on_variant_allowed.rs +20 -0
  137. package/contracts/macro-integration-tests/tests/ui/error/pass/basic_auto_discriminants.rs +15 -0
  138. package/contracts/macro-integration-tests/tests/ui/error/pass/mixed_discriminants.rs +16 -0
  139. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.rs +22 -0
  140. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.stderr +16 -0
  141. package/contracts/macro-integration-tests/tests/ui/ownable/pass/minimal_contract.rs +26 -0
  142. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +21 -0
  143. package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_auth_env_param_variants.rs +46 -0
  144. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.rs +13 -0
  145. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.stderr +7 -0
  146. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.rs +13 -0
  147. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.stderr +7 -0
  148. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.rs +10 -0
  149. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.stderr +7 -0
  150. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.rs +12 -0
  151. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.stderr +7 -0
  152. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.rs +10 -0
  153. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.stderr +7 -0
  154. package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.rs +10 -0
  155. package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.stderr +7 -0
  156. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.rs +12 -0
  157. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.stderr +7 -0
  158. package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.rs +13 -0
  159. package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.stderr +7 -0
  160. package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.rs +13 -0
  161. package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.stderr +7 -0
  162. package/contracts/macro-integration-tests/tests/ui/storage/pass/default_value_on_variant.rs +14 -0
  163. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_instance_unit_basic.rs +14 -0
  164. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_persistent_named_fields_keyed.rs +16 -0
  165. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_temporary_unit_option.rs +15 -0
  166. package/contracts/macro-integration-tests/tests/ui/storage/pass/name_override.rs +14 -0
  167. package/contracts/macro-integration-tests/tests/ui/storage/pass/no_auto_ttl_extension.rs +19 -0
  168. package/contracts/macro-integration-tests/tests/ui/storage/pass/ttl_provider_basic.rs +15 -0
  169. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/minimal_contract.rs +44 -0
  170. package/contracts/macro-integration-tests/tests/ui_error.rs +11 -0
  171. package/contracts/macro-integration-tests/tests/ui_ownable.rs +11 -0
  172. package/contracts/macro-integration-tests/tests/ui_storage.rs +11 -0
  173. package/contracts/macro-integration-tests/tests/ui_ttl_configurable.rs +12 -0
  174. package/contracts/message-libs/blocked-message-lib/src/lib.rs +17 -17
  175. package/contracts/message-libs/message-lib-common/src/errors.rs +7 -2
  176. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/decode_packet_header.rs +64 -0
  177. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet.rs +58 -0
  178. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet_header.rs +138 -0
  179. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/mod.rs +6 -0
  180. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload.rs +30 -0
  181. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload_hash.rs +15 -0
  182. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/test_helper.rs +39 -0
  183. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_dvn_option.rs +57 -0
  184. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_lz_receive_option.rs +49 -0
  185. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_native_drop_option.rs +73 -0
  186. package/contracts/message-libs/message-lib-common/src/tests/worker_options/convert_legacy_options.rs +280 -0
  187. package/contracts/message-libs/message-lib-common/src/tests/worker_options/extract_type_3_options.rs +126 -0
  188. package/contracts/message-libs/message-lib-common/src/tests/worker_options/left_pad_to_bytes32.rs +48 -0
  189. package/contracts/message-libs/message-lib-common/src/tests/worker_options/mod.rs +7 -0
  190. package/contracts/message-libs/message-lib-common/src/tests/worker_options/split_worker_options.rs +139 -0
  191. package/contracts/message-libs/message-lib-common/src/worker_options.rs +31 -1
  192. package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +7 -9
  193. package/contracts/message-libs/treasury/src/errors.rs +2 -3
  194. package/contracts/message-libs/treasury/src/events.rs +1 -1
  195. package/contracts/message-libs/treasury/src/interfaces/zro_fee_lib.rs +2 -2
  196. package/contracts/message-libs/treasury/src/lib.rs +3 -3
  197. package/contracts/message-libs/treasury/src/storage.rs +3 -1
  198. package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +1 -1
  199. package/contracts/message-libs/treasury/src/treasury.rs +23 -26
  200. package/contracts/message-libs/uln-302/Cargo.toml +1 -1
  201. package/contracts/message-libs/uln-302/src/errors.rs +0 -5
  202. package/contracts/message-libs/uln-302/src/events.rs +5 -6
  203. package/contracts/message-libs/uln-302/src/receive_uln.rs +37 -56
  204. package/contracts/message-libs/uln-302/src/send_uln.rs +112 -138
  205. package/contracts/message-libs/uln-302/src/storage.rs +5 -5
  206. package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +5 -7
  207. package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +3 -3
  208. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +6 -9
  209. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +2 -2
  210. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +3 -3
  211. package/contracts/message-libs/uln-302/src/tests/setup.rs +9 -0
  212. package/contracts/message-libs/uln-302/src/tests/testing_utils.rs +5 -0
  213. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_receive_uln_config.rs +1 -2
  214. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_send_uln_config.rs +1 -2
  215. package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +37 -55
  216. package/contracts/message-libs/uln-302/src/uln302.rs +10 -25
  217. package/contracts/oapps/counter/Cargo.toml +14 -1
  218. package/contracts/oapps/counter/integration_tests/mod.rs +4 -1
  219. package/contracts/oapps/counter/integration_tests/setup_sml.rs +169 -0
  220. package/contracts/oapps/counter/integration_tests/setup_uln.rs +997 -0
  221. package/contracts/oapps/counter/integration_tests/signing.rs +62 -0
  222. package/contracts/oapps/counter/integration_tests/test_with_sml.rs +24 -55
  223. package/contracts/oapps/counter/integration_tests/test_with_uln.rs +314 -0
  224. package/contracts/oapps/counter/integration_tests/utils.rs +196 -53
  225. package/contracts/oapps/counter/src/counter.rs +67 -44
  226. package/contracts/oapps/counter/src/tests/mod.rs +0 -13
  227. package/contracts/oapps/counter/src/tests/test_counter.rs +5 -7
  228. package/contracts/oapps/oapp/src/errors.rs +5 -1
  229. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +318 -221
  230. package/contracts/oapps/oapp/src/oapp_core.rs +36 -21
  231. package/contracts/oapps/oapp/src/oapp_options_type3.rs +48 -12
  232. package/contracts/oapps/oapp/src/oapp_receiver.rs +106 -41
  233. package/contracts/oapps/oapp/src/oapp_sender.rs +26 -34
  234. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +9 -9
  235. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +25 -18
  236. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +7 -8
  237. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +14 -16
  238. package/contracts/oapps/oapp-macros/src/generators.rs +128 -0
  239. package/contracts/oapps/oapp-macros/src/lib.rs +211 -0
  240. package/contracts/oapps/oft/integration-tests/setup.rs +34 -9
  241. package/contracts/oapps/oft/integration-tests/utils.rs +1 -1
  242. package/contracts/oapps/oft/src/errors.rs +6 -1
  243. package/contracts/oapps/oft/src/extensions/oft_fee.rs +13 -13
  244. package/contracts/oapps/oft/src/extensions/pausable.rs +5 -5
  245. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +23 -23
  246. package/contracts/oapps/oft/src/lib.rs +4 -2
  247. package/contracts/oapps/oft/src/oft.rs +31 -71
  248. package/contracts/oapps/oft/src/oft_impl.rs +201 -0
  249. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +2 -4
  250. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +1 -4
  251. package/contracts/oapps/oft/src/storage.rs +2 -0
  252. package/contracts/oapps/oft/src/tests/extensions/setup.rs +60 -31
  253. package/contracts/oapps/oft/src/tests/extensions/test_oft_fee.rs +5 -3
  254. package/contracts/oapps/oft/src/tests/extensions/test_pausable.rs +5 -3
  255. package/contracts/oapps/oft/src/tests/extensions/test_rate_limiter.rs +6 -4
  256. package/contracts/oapps/oft/src/tests/test_decimals.rs +2 -2
  257. package/contracts/oapps/oft/src/tests/test_oft_msg_codec.rs +1 -2
  258. package/contracts/oapps/oft/src/tests/test_send.rs +4 -4
  259. package/contracts/oapps/oft/src/tests/test_utils.rs +122 -81
  260. package/contracts/oapps/oft/src/types.rs +20 -0
  261. package/contracts/oapps/oft-std/Cargo.toml +6 -0
  262. package/contracts/oapps/oft-std/integration-tests/extensions/mod.rs +3 -0
  263. package/contracts/oapps/oft-std/integration-tests/extensions/test_oft_fee.rs +157 -0
  264. package/contracts/oapps/oft-std/integration-tests/extensions/test_pausable.rs +162 -0
  265. package/contracts/oapps/oft-std/integration-tests/extensions/test_rate_limiter.rs +186 -0
  266. package/contracts/oapps/oft-std/integration-tests/mod.rs +3 -0
  267. package/contracts/oapps/{counter/integration_tests → oft-std/integration-tests}/setup.rs +76 -30
  268. package/contracts/oapps/oft-std/integration-tests/utils.rs +427 -0
  269. package/contracts/oapps/oft-std/src/lib.rs +12 -1
  270. package/contracts/oapps/oft-std/src/oft.rs +141 -26
  271. package/contracts/upgrader/Cargo.toml +19 -0
  272. package/contracts/upgrader/src/lib.rs +96 -0
  273. package/contracts/upgrader/src/tests/mod.rs +1 -0
  274. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract1.wasm +0 -0
  275. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract2.wasm +0 -0
  276. package/contracts/upgrader/src/tests/test_upgrader.rs +120 -0
  277. package/contracts/utils/src/auth.rs +44 -0
  278. package/contracts/utils/src/errors.rs +32 -5
  279. package/contracts/utils/src/lib.rs +5 -1
  280. package/contracts/utils/src/multisig.rs +211 -0
  281. package/contracts/utils/src/ownable.rs +50 -60
  282. package/contracts/utils/src/tests/buffer_reader.rs +6 -6
  283. package/contracts/utils/src/tests/buffer_writer.rs +6 -6
  284. package/contracts/utils/src/tests/bytes_ext.rs +2 -4
  285. package/contracts/utils/src/tests/mod.rs +4 -1
  286. package/contracts/utils/src/tests/multisig.rs +731 -0
  287. package/contracts/utils/src/tests/option_ext.rs +18 -0
  288. package/contracts/utils/src/tests/ownable.rs +22 -70
  289. package/contracts/utils/src/tests/ttl_configurable.rs +607 -0
  290. package/contracts/utils/src/tests/upgradeable.rs +290 -0
  291. package/contracts/utils/src/ttl_configurable.rs +153 -0
  292. package/contracts/utils/src/ttl_extendable.rs +27 -0
  293. package/contracts/utils/src/upgradeable.rs +56 -0
  294. package/contracts/workers/dvn/Cargo.toml +2 -2
  295. package/contracts/workers/dvn/src/auth.rs +24 -35
  296. package/contracts/workers/dvn/src/dvn.rs +23 -14
  297. package/contracts/workers/dvn/src/errors.rs +1 -7
  298. package/contracts/workers/dvn/src/events.rs +1 -14
  299. package/contracts/workers/dvn/src/interfaces/dvn.rs +2 -2
  300. package/contracts/workers/dvn/src/interfaces/mod.rs +0 -2
  301. package/contracts/workers/dvn/src/storage.rs +3 -13
  302. package/contracts/workers/dvn/src/tests/auth.rs +4 -4
  303. package/contracts/workers/dvn/src/tests/dvn.rs +1 -2
  304. package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +7 -8
  305. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +11 -8
  306. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +11 -12
  307. package/contracts/workers/dvn/src/tests/setup.rs +5 -5
  308. package/contracts/workers/dvn-fee-lib/Cargo.toml +0 -1
  309. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +45 -16
  310. package/contracts/workers/dvn-fee-lib/src/errors.rs +3 -2
  311. package/contracts/workers/dvn-fee-lib/src/lib.rs +5 -11
  312. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +30 -16
  313. package/contracts/workers/executor/src/auth.rs +80 -16
  314. package/contracts/workers/executor/src/executor.rs +17 -29
  315. package/contracts/workers/executor/src/storage.rs +2 -9
  316. package/contracts/workers/executor-fee-lib/Cargo.toml +1 -1
  317. package/contracts/workers/executor-fee-lib/src/errors.rs +9 -7
  318. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +153 -121
  319. package/contracts/workers/executor-helper/Cargo.toml +1 -6
  320. package/contracts/workers/executor-helper/src/executor_helper.rs +53 -73
  321. package/contracts/workers/executor-helper/src/lib.rs +1 -7
  322. package/contracts/workers/price-feed/Cargo.toml +1 -2
  323. package/contracts/workers/price-feed/src/errors.rs +3 -2
  324. package/contracts/workers/price-feed/src/lib.rs +5 -6
  325. package/contracts/workers/price-feed/src/price_feed.rs +42 -23
  326. package/contracts/workers/worker/Cargo.toml +4 -0
  327. package/contracts/workers/worker/src/errors.rs +4 -0
  328. package/contracts/workers/worker/src/interfaces/price_feed.rs +3 -3
  329. package/contracts/workers/worker/src/lib.rs +2 -2
  330. package/contracts/workers/worker/src/tests/mod.rs +4 -0
  331. package/contracts/workers/worker/src/tests/setup.rs +147 -0
  332. package/contracts/workers/worker/src/tests/worker.rs +502 -0
  333. package/contracts/workers/worker/src/worker.rs +28 -30
  334. package/package.json +8 -5
  335. package/sdk/.turbo/turbo-build.log +1 -0
  336. package/sdk/.turbo/turbo-test.log +1009 -0
  337. package/sdk/dist/generated/bml.d.ts +104 -37
  338. package/sdk/dist/generated/bml.js +83 -42
  339. package/sdk/dist/generated/counter.d.ts +334 -175
  340. package/sdk/dist/generated/counter.js +109 -63
  341. package/sdk/dist/generated/dvn.d.ts +1985 -0
  342. package/sdk/dist/generated/dvn.js +326 -0
  343. package/sdk/dist/generated/dvn_fee_lib.d.ts +690 -0
  344. package/sdk/dist/generated/dvn_fee_lib.js +163 -0
  345. package/sdk/dist/generated/endpoint.d.ts +155 -46
  346. package/sdk/dist/generated/endpoint.js +93 -50
  347. package/sdk/dist/generated/executor.d.ts +1841 -0
  348. package/sdk/dist/generated/executor.js +312 -0
  349. package/sdk/dist/generated/executor_fee_lib.d.ts +1083 -0
  350. package/sdk/dist/generated/executor_fee_lib.js +255 -0
  351. package/sdk/dist/generated/executor_helper.d.ts +981 -0
  352. package/sdk/dist/generated/executor_helper.js +236 -0
  353. package/sdk/dist/generated/oft_std.d.ts +1722 -0
  354. package/sdk/dist/generated/oft_std.js +316 -0
  355. package/sdk/dist/generated/price_feed.d.ts +1077 -0
  356. package/sdk/dist/generated/price_feed.js +210 -0
  357. package/sdk/dist/generated/sml.d.ts +171 -56
  358. package/sdk/dist/generated/sml.js +111 -62
  359. package/sdk/dist/generated/treasury.d.ts +896 -0
  360. package/sdk/dist/generated/treasury.js +219 -0
  361. package/sdk/dist/generated/uln302.d.ts +175 -75
  362. package/sdk/dist/generated/uln302.js +126 -82
  363. package/sdk/dist/generated/upgrader.d.ts +70 -0
  364. package/sdk/dist/generated/upgrader.js +19 -0
  365. package/sdk/dist/index.d.ts +10 -0
  366. package/sdk/dist/index.js +14 -0
  367. package/sdk/dist/wasm/blocked-message-lib.d.ts +1 -0
  368. package/sdk/dist/wasm/blocked-message-lib.js +2 -0
  369. package/sdk/dist/wasm/counter.d.ts +1 -0
  370. package/sdk/dist/wasm/counter.js +2 -0
  371. package/sdk/dist/wasm/dvn-fee-lib.d.ts +1 -0
  372. package/sdk/dist/wasm/dvn-fee-lib.js +2 -0
  373. package/sdk/dist/wasm/dvn.d.ts +1 -0
  374. package/sdk/dist/wasm/dvn.js +2 -0
  375. package/sdk/dist/wasm/endpoint-v2.d.ts +1 -0
  376. package/sdk/dist/wasm/endpoint-v2.js +2 -0
  377. package/sdk/dist/wasm/executor-fee-lib.d.ts +1 -0
  378. package/sdk/dist/wasm/executor-fee-lib.js +2 -0
  379. package/sdk/dist/wasm/executor-helper.d.ts +1 -0
  380. package/sdk/dist/wasm/executor-helper.js +2 -0
  381. package/sdk/dist/wasm/executor.d.ts +1 -0
  382. package/sdk/dist/wasm/executor.js +2 -0
  383. package/sdk/dist/wasm/layerzero-views.d.ts +1 -0
  384. package/sdk/dist/wasm/layerzero-views.js +2 -0
  385. package/sdk/dist/wasm/oft-std.d.ts +1 -0
  386. package/sdk/dist/wasm/oft-std.js +2 -0
  387. package/sdk/dist/wasm/price-feed.d.ts +1 -0
  388. package/sdk/dist/wasm/price-feed.js +2 -0
  389. package/sdk/dist/wasm/simple-message-lib.d.ts +1 -0
  390. package/sdk/dist/wasm/simple-message-lib.js +2 -0
  391. package/sdk/dist/wasm/treasury.d.ts +1 -0
  392. package/sdk/dist/wasm/treasury.js +2 -0
  393. package/sdk/dist/wasm/uln302.d.ts +1 -0
  394. package/sdk/dist/wasm/uln302.js +2 -0
  395. package/sdk/dist/wasm/upgrader.d.ts +1 -0
  396. package/sdk/dist/wasm/upgrader.js +2 -0
  397. package/sdk/dist/wasm.d.ts +15 -0
  398. package/sdk/dist/wasm.js +15 -0
  399. package/sdk/package.json +7 -4
  400. package/sdk/src/index.ts +17 -0
  401. package/sdk/test/counter-sml.test.ts +376 -0
  402. package/sdk/test/counter-uln.test.ts +493 -0
  403. package/sdk/test/{oft.test.ts → oft-sml.test.ts} +187 -323
  404. package/sdk/test/suites/constants.ts +22 -2
  405. package/sdk/test/suites/dummyContractClient.ts +169 -0
  406. package/sdk/test/suites/globalSetup.ts +450 -0
  407. package/sdk/test/suites/localnet.ts +23 -6
  408. package/sdk/test/upgrader.test.ts +300 -0
  409. package/sdk/test/utils.ts +558 -85
  410. package/sdk/vitest.config.ts +21 -0
  411. package/tools/ts-bindings-gen/src/main.rs +12 -1
  412. package/turbo.json +2 -0
  413. package/contracts/common-macros/src/contract_impl.rs +0 -47
  414. package/contracts/common-macros/src/ownable.rs +0 -59
  415. package/contracts/common-macros/src/tests/contract_impl.rs +0 -381
  416. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +0 -32
  417. package/contracts/endpoint-v2/src/tests/messaging_channel/clear.rs +0 -316
  418. package/contracts/endpoint-v2/src/tests/messaging_channel/internal.rs +0 -388
  419. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +0 -162
  420. package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +0 -319
  421. package/contracts/oapp-macros/src/lib.rs +0 -154
  422. package/contracts/oapp-macros/src/oapp_core.rs +0 -40
  423. package/contracts/oapp-macros/src/oapp_full.rs +0 -21
  424. package/contracts/oapp-macros/src/oapp_options_type3.rs +0 -31
  425. package/contracts/oapp-macros/src/oapp_receiver.rs +0 -48
  426. package/contracts/oapp-macros/src/oapp_sender.rs +0 -21
  427. package/contracts/oapp-macros/src/util.rs +0 -107
  428. package/contracts/oapps/oft/src/constants.rs +0 -5
  429. package/contracts/oapps/oft/src/default_oft_impl.rs +0 -146
  430. package/contracts/utils/src/tests/ttl.rs +0 -421
  431. package/contracts/utils/src/ttl.rs +0 -123
  432. package/contracts/workers/dvn/src/interfaces/multisig.rs +0 -56
  433. package/contracts/workers/dvn/src/multisig.rs +0 -153
  434. package/sdk/test/index.test.ts +0 -376
  435. /package/contracts/{oapp-macros → oapps/oapp-macros}/Cargo.toml +0 -0
@@ -3,24 +3,34 @@
3
3
  //! This crate provides foundational macros for Stellar contract development:
4
4
  //! - **Storage macros** - Strongly-typed contract storage API generation
5
5
  //! - **Error macros** - Contract error enum generation
6
- //! - **Ownable macros** - Owner-based access control implementation
6
+ //! - **Auth macros** - Authorization-based access control (ownable, multisig, only_auth)
7
7
  //! - **TTL macros** - Time-to-live configuration and automatic extension
8
+ //! - **Wrapper macros** - Convenient macro combinations for common patterns
8
9
  //!
9
10
  //! # Quick Links
10
11
  //! - [`storage`] - Storage enum to API macro
11
12
  //! - [`contract_error`] - Error enum generation macro
12
13
  //! - [`ownable`] - Ownable trait implementation macro
13
- //! - [`only_owner`] - Owner-only access control attribute macro
14
+ //! - [`multisig`] - Multisig trait implementation macro
15
+ //! - [`only_auth`] - Auth-based access control attribute macro
14
16
  //! - [`ttl_configurable`] - TTL configuration with freeze support
17
+ //! - [`ttl_extendable`] - Manual instance TTL extension
15
18
  //! - [`contract_impl`] - Contract impl with automatic instance TTL extension
19
+ //! - [`contract_trait`] - Contract trait with automatic instance TTL extension
20
+ //! - [`upgradeable`] - Upgradeable trait implementation macro
21
+ //! - [`lz_contract`] - Wrapper macro combining common LayerZero contract attributes
16
22
  //!
23
+
17
24
  use proc_macro::TokenStream;
18
25
 
19
- mod contract_impl;
26
+ mod auth;
27
+ mod contract_ttl;
20
28
  mod error;
21
- mod ownable;
29
+ mod lz_contract;
22
30
  mod storage;
23
31
  mod ttl_configurable;
32
+ mod ttl_extendable;
33
+ mod upgradeable;
24
34
  mod utils;
25
35
 
26
36
  #[cfg(test)]
@@ -139,60 +149,91 @@ pub fn contract_error(attr: TokenStream, item: TokenStream) -> TokenStream {
139
149
  /// - `Ownable` trait impl - `owner(env)`, `transfer_ownership(env, new_owner)`, `renounce_ownership(env)`
140
150
  #[proc_macro_attribute]
141
151
  pub fn ownable(_attr: TokenStream, item: TokenStream) -> TokenStream {
142
- ownable::generate_ownable_impl(item.into()).into()
152
+ auth::generate_ownable_impl(item.into()).into()
153
+ }
154
+
155
+ // ============================================================================
156
+ // Multisig Macro
157
+ // ============================================================================
158
+
159
+ /// Generates multisig implementation with self-owning access control.
160
+ ///
161
+ /// Implements the `Multisig` trait and the `Auth` trait with self-owning pattern,
162
+ /// where the contract's own address is the authorizer. This allows multisig
163
+ /// quorum approval to serve as the authorizer for owner-protected operations
164
+ /// like TTL configuration and upgrades.
165
+ ///
166
+ /// # Example
167
+ /// ```ignore
168
+ /// #[multisig]
169
+ /// pub struct MyContract;
170
+ /// ```
171
+ ///
172
+ /// Generated code includes:
173
+ /// - `Auth` trait impl - `authorizer(env)` returns `env.current_contract_address()`
174
+ /// - `Multisig` trait impl - `set_signer(...)`, `set_threshold(...)`, `verify_signatures(...)`
175
+ #[proc_macro_attribute]
176
+ pub fn multisig(_attr: TokenStream, item: TokenStream) -> TokenStream {
177
+ auth::generate_multisig_impl(item.into()).into()
143
178
  }
144
179
 
145
180
  // ============================================================================
146
- // Only Owner Macro
181
+ // Only Auth Macro
147
182
  // ============================================================================
148
183
 
149
- /// Restricts function access to the contract owner only.
184
+ /// Restricts function access to the contract authorizer only.
150
185
  ///
151
- /// This attribute macro injects an owner authentication check at the beginning
152
- /// of the function. The function will panic if called by a non-owner address.
186
+ /// This attribute macro injects an auth check at the beginning of the function
187
+ /// using the `Auth` trait. The function will panic if called without authorization.
188
+ ///
189
+ /// Works with any contract that implements `Auth`, including both `Ownable` and
190
+ /// `Multisig` contracts.
153
191
  ///
154
192
  /// # Requirements
155
193
  /// - The function must have an `Env` parameter (by value or reference)
156
- /// - The containing contract must implement the `Ownable` trait (use `#[ownable]`)
194
+ /// - The containing contract must implement the `Auth` trait
157
195
  ///
158
196
  /// # Example
159
197
  /// ```ignore
160
- /// #[ownable]
198
+ /// #[ownable] // or implement Multisig
161
199
  /// pub struct MyContract;
162
200
  ///
163
201
  /// #[soroban_sdk::contractimpl]
164
202
  /// impl MyContract {
165
- /// #[only_owner]
166
- /// pub fn admin_action(env: Env) {
167
- /// // Only the owner can execute this
203
+ /// #[only_auth]
204
+ /// pub fn protected_action(env: Env) {
205
+ /// // Only the authorizer can execute this
168
206
  /// }
169
207
  /// }
170
208
  /// ```
171
209
  ///
172
210
  /// Generated code (conceptual):
173
211
  /// ```ignore
174
- /// pub fn admin_action(env: Env) {
175
- /// utils::ownable::require_owner_auth::<Self>(&env);
212
+ /// pub fn protected_action(env: Env) {
213
+ /// utils::auth::require_auth::<Self>(&env);
176
214
  /// // Original function body
177
215
  /// }
178
216
  /// ```
179
217
  #[proc_macro_attribute]
180
- pub fn only_owner(_attr: TokenStream, item: TokenStream) -> TokenStream {
181
- ownable::prepend_only_owner_check(item.into()).into()
218
+ pub fn only_auth(_attr: TokenStream, item: TokenStream) -> TokenStream {
219
+ auth::prepend_only_auth_check(item.into()).into()
182
220
  }
183
221
 
184
222
  // ============================================================================
185
223
  // TTL Configuration Macro
186
224
  // ============================================================================
187
225
 
188
- /// Generates TtlConfigurable trait implementation with ownable support.
226
+ /// Generates TtlConfigurable trait implementation.
189
227
  ///
190
- /// This macro automatically applies `#[ownable]` for owner management.:
191
- /// - `#[ownable]` - Applies the ownable macro for owner management
192
- /// - TtlConfigurable trait implementation - TTL configuration with freeze support
228
+ /// This macro implements the `TtlConfigurable` trait for a contract struct,
229
+ /// providing TTL configuration management with auth-based access control.
230
+ ///
231
+ /// # Requirements
232
+ /// The contract must implement the `Auth` trait (typically via `#[ownable]` or `Multisig`).
193
233
  ///
194
234
  /// # Example
195
235
  /// ```ignore
236
+ /// #[ownable] // or implement Multisig for self-owning contracts
196
237
  /// #[ttl_configurable]
197
238
  /// pub struct MyContract;
198
239
  ///
@@ -205,18 +246,39 @@ pub fn only_owner(_attr: TokenStream, item: TokenStream) -> TokenStream {
205
246
  /// ```
206
247
  ///
207
248
  /// Generated code includes:
208
- /// - `#[ownable]` attribute on the struct (provides owner management)
209
- /// - `set_ttl_configs(env, instance, persistent)` - Set TTL configs (owner only)
249
+ /// - `set_ttl_configs(env, instance, persistent)` - Set TTL configs (auth required)
210
250
  /// - `ttl_configs(env)` - Get current TTL configs (instance, persistent)
211
- /// - `freeze_ttl_configs(env)` - Permanently freeze TTL configs (owner only)
251
+ /// - `freeze_ttl_configs(env)` - Permanently freeze TTL configs (auth required)
212
252
  /// - `is_ttl_configs_frozen(env)` - Check if TTL configs are frozen
213
- ///
214
- /// See [`ownable`] for the owner management methods also generated.
215
253
  #[proc_macro_attribute]
216
254
  pub fn ttl_configurable(_attr: TokenStream, item: TokenStream) -> TokenStream {
217
255
  ttl_configurable::generate_ttl_configurable_impl(item.into()).into()
218
256
  }
219
257
 
258
+ // ============================================================================
259
+ // TTL Extendable Macro
260
+ // ============================================================================
261
+
262
+ /// Generates TtlExtendable trait implementation for manual instance TTL extension.
263
+ ///
264
+ /// This macro implements the `TtlExtendable` trait, providing a public
265
+ /// `extend_instance_ttl` function that allows external callers to extend
266
+ /// the contract's instance storage TTL.
267
+ ///
268
+ /// # Example
269
+ /// ```ignore
270
+ /// #[contract]
271
+ /// #[ttl_extendable]
272
+ /// pub struct MyContract;
273
+ /// ```
274
+ ///
275
+ /// Generated code includes:
276
+ /// - `extend_instance_ttl(env, threshold, extend_to)` - Extends instance TTL
277
+ #[proc_macro_attribute]
278
+ pub fn ttl_extendable(_attr: TokenStream, item: TokenStream) -> TokenStream {
279
+ ttl_extendable::generate_ttl_extendable_impl(item.into()).into()
280
+ }
281
+
220
282
  // ============================================================================
221
283
  // Contract Impl Macro
222
284
  // ============================================================================
@@ -255,7 +317,7 @@ pub fn ttl_configurable(_attr: TokenStream, item: TokenStream) -> TokenStream {
255
317
  /// #[soroban_sdk::contractimpl]
256
318
  /// impl MyContract {
257
319
  /// pub fn my_method(env: &Env) {
258
- /// if let Some(ttl) = <Self as ::utils::ttl::TtlConfigurable>::ttl_config(env).0 {
320
+ /// if let Some(ttl) = <Self as ::utils::ttl_configurable::TtlConfigurable>::ttl_config(env).0 {
259
321
  /// env.storage().instance().extend_ttl(ttl.threshold, ttl.extend_to);
260
322
  /// }
261
323
  /// // ... your code
@@ -264,5 +326,133 @@ pub fn ttl_configurable(_attr: TokenStream, item: TokenStream) -> TokenStream {
264
326
  /// ```
265
327
  #[proc_macro_attribute]
266
328
  pub fn contract_impl(attr: TokenStream, item: TokenStream) -> TokenStream {
267
- contract_impl::contract_impl(attr.into(), item.into()).into()
329
+ contract_ttl::contractimpl_with_ttl(attr.into(), item.into()).into()
330
+ }
331
+
332
+ // ============================================================================
333
+ // Contract Trait Macro
334
+ // ============================================================================
335
+
336
+ /// Wraps `#[soroban_sdk::contracttrait]` with automatic instance TTL extension.
337
+ ///
338
+ /// This macro applies `#[soroban_sdk::contracttrait]` and injects TTL extension logic
339
+ /// at the beginning of each default trait method to keep the contract instance alive.
340
+ ///
341
+ /// # Requirements
342
+ /// - The implementing contract must have `#[ttl_configurable]` applied
343
+ /// - Methods must have an `Env` parameter to receive TTL extension
344
+ /// - Only methods with default implementations are processed
345
+ ///
346
+ /// # Behavior
347
+ /// - All default methods with an `Env` parameter receive TTL extension
348
+ /// - Methods without a body (abstract methods) are not modified
349
+ /// - Methods without an `Env` parameter are skipped
350
+ ///
351
+ /// # Example
352
+ /// ```ignore
353
+ /// #[contract_trait]
354
+ /// pub trait MyTrait {
355
+ /// /// This method will have TTL extension injected
356
+ /// fn my_method(env: &Env) {
357
+ /// // TTL extension is automatically injected here
358
+ /// // ... your code
359
+ /// }
360
+ ///
361
+ /// /// Abstract methods are not modified
362
+ /// fn abstract_method(env: &Env) -> u32;
363
+ /// }
364
+ /// ```
365
+ ///
366
+ /// Generated code (conceptual):
367
+ /// ```ignore
368
+ /// #[soroban_sdk::contracttrait]
369
+ /// pub trait MyTrait {
370
+ /// fn my_method(env: &Env) {
371
+ /// if let Some(ttl) = utils::ttl_configurable::TtlConfigStorage::instance(env) {
372
+ /// env.storage().instance().extend_ttl(ttl.threshold, ttl.extend_to);
373
+ /// }
374
+ /// // ... your code
375
+ /// }
376
+ ///
377
+ /// fn abstract_method(env: &Env) -> u32;
378
+ /// }
379
+ /// ```
380
+ #[proc_macro_attribute]
381
+ pub fn contract_trait(attr: TokenStream, item: TokenStream) -> TokenStream {
382
+ contract_ttl::contracttrait_with_ttl(attr.into(), item.into()).into()
383
+ }
384
+
385
+ // ============================================================================
386
+ // Upgradeable Macro
387
+ // ============================================================================
388
+
389
+ /// Generates upgradeable implementation with auth-based access control.
390
+ ///
391
+ /// Implements the `Upgradeable` trait for contract upgrade and migration functionality.
392
+ ///
393
+ /// # Requirements
394
+ /// - The contract must implement the `Auth` trait (via `#[ownable]` or `Multisig`)
395
+ /// - The contract must implement `UpgradeableInternal` trait with migration logic
396
+ ///
397
+ /// # Example
398
+ /// ```ignore
399
+ /// #[ownable] // or implement Multisig for self-owning contracts
400
+ /// #[upgradeable]
401
+ /// pub struct MyContract;
402
+ ///
403
+ /// impl utils::upgradeable::UpgradeableInternal for MyContract {
404
+ /// type MigrationData = ();
405
+ ///
406
+ /// fn _migrate(env: &Env, migration_data: &Self::MigrationData) {
407
+ /// // Migration logic here
408
+ /// }
409
+ /// }
410
+ /// ```
411
+ ///
412
+ /// Generated code includes:
413
+ /// - `upgrade(env, new_wasm_hash)` - Upgrades the contract WASM (auth required)
414
+ /// - `migrate(env, migration_data)` - Runs migration after upgrade (auth required)
415
+ /// - `contractmeta!` with `binver` set to the Cargo package version (if not 0.0.0)
416
+ #[proc_macro_attribute]
417
+ pub fn upgradeable(_attr: TokenStream, item: TokenStream) -> TokenStream {
418
+ upgradeable::generate_upgradeable_impl(item.into()).into()
419
+ }
420
+
421
+ // ============================================================================
422
+ // LZ Contract Wrapper Macro
423
+ // ============================================================================
424
+
425
+ /// Wrapper macro that combines common LayerZero contract attributes.
426
+ ///
427
+ /// This macro simplifies contract declarations by combining multiple commonly
428
+ /// used macros into a single attribute.
429
+ ///
430
+ /// # Default (no options)
431
+ /// `#[lz_contract]` generates:
432
+ /// - `#[contract]` - Soroban contract
433
+ /// - `#[ttl_configurable]` - TTL configuration with auth
434
+ /// - `#[ttl_extendable]` - Manual TTL extension
435
+ /// - `#[ownable]` - Single-owner access control
436
+ ///
437
+ /// # Options
438
+ /// - `upgradeable` - Adds `#[upgradeable]` for contract upgrade support
439
+ /// - `multisig` - Uses `#[multisig]` instead of `#[ownable]`
440
+ ///
441
+ /// # Examples
442
+ /// ```ignore
443
+ /// // Basic contract with ownable auth
444
+ /// #[lz_contract]
445
+ /// pub struct EndpointV2;
446
+ ///
447
+ /// // Contract with upgrade support
448
+ /// #[lz_contract(upgradeable)]
449
+ /// pub struct DVNFeeLib;
450
+ ///
451
+ /// // Contract with multisig auth and upgrade support
452
+ /// #[lz_contract(multisig, upgradeable)]
453
+ /// pub struct DVN;
454
+ /// ```
455
+ #[proc_macro_attribute]
456
+ pub fn lz_contract(attr: TokenStream, item: TokenStream) -> TokenStream {
457
+ lz_contract::generate_lz_contract(attr.into(), item.into()).into()
268
458
  }
@@ -0,0 +1,83 @@
1
+ //! LzContract wrapper macro for Stellar smart contracts.
2
+ //!
3
+ //! This module provides the `#[lz_contract]` macro which combines commonly used
4
+ //! LayerZero contract attributes into a single macro invocation.
5
+
6
+ use proc_macro2::TokenStream;
7
+ use quote::quote;
8
+ use syn::{
9
+ parse::{Parse, ParseStream},
10
+ punctuated::Punctuated,
11
+ Error, Ident, ItemStruct, Token,
12
+ };
13
+
14
+ /// Configuration options for the `#[lz_contract]` macro.
15
+ #[derive(Debug, Default)]
16
+ pub struct LzContractConfig {
17
+ /// If true, adds `#[upgradeable]` for contract upgrade support.
18
+ pub upgradeable: bool,
19
+ /// If true, uses `#[multisig]` instead of `#[ownable]` for auth.
20
+ pub multisig: bool,
21
+ }
22
+
23
+ impl Parse for LzContractConfig {
24
+ fn parse(input: ParseStream) -> syn::Result<Self> {
25
+ if input.is_empty() {
26
+ return Ok(Self::default());
27
+ }
28
+
29
+ let idents = Punctuated::<Ident, Token![,]>::parse_terminated(input)?;
30
+ let mut config = Self::default();
31
+
32
+ for ident in idents {
33
+ match ident.to_string().as_str() {
34
+ "upgradeable" => config.upgradeable = true,
35
+ "multisig" => config.multisig = true,
36
+ _ => {
37
+ return Err(Error::new(ident.span(), "expected one of `upgradeable`, `multisig`"));
38
+ }
39
+ }
40
+ }
41
+
42
+ Ok(config)
43
+ }
44
+ }
45
+
46
+ /// Generates a complete LayerZero contract with common macro attributes.
47
+ ///
48
+ /// # Default (no options)
49
+ /// Generates:
50
+ /// - `#[soroban_sdk::contract]` - Soroban contract
51
+ /// - `#[common_macros::ttl_configurable]` - TTL configuration with auth
52
+ /// - `#[common_macros::ttl_extendable]` - Manual TTL extension
53
+ /// - `#[common_macros::ownable]` - Single-owner access control
54
+ ///
55
+ /// # Options
56
+ /// - `upgradeable` - Adds `#[common_macros::upgradeable]` for contract upgrade support
57
+ /// - `multisig` - Uses `#[common_macros::multisig]` instead of `#[common_macros::ownable]`
58
+ pub fn generate_lz_contract(attr: TokenStream, input: TokenStream) -> TokenStream {
59
+ let config: LzContractConfig =
60
+ syn::parse2(attr).unwrap_or_else(|e| panic!("failed to parse lz_contract config: {}", e));
61
+ let item: ItemStruct = syn::parse2(input).unwrap_or_else(|e| panic!("failed to parse struct: {}", e));
62
+
63
+ let auth = if config.multisig {
64
+ quote! { #[common_macros::multisig] }
65
+ } else {
66
+ quote! { #[common_macros::ownable] }
67
+ };
68
+
69
+ let upgrade = if config.upgradeable {
70
+ quote! { #[common_macros::upgradeable] }
71
+ } else {
72
+ quote! {}
73
+ };
74
+
75
+ quote! {
76
+ #[soroban_sdk::contract]
77
+ #[common_macros::ttl_configurable]
78
+ #[common_macros::ttl_extendable]
79
+ #auth
80
+ #upgrade
81
+ #item
82
+ }
83
+ }
@@ -306,7 +306,7 @@ fn gen_ttl_extension(storage_type: &StorageType, use_stored_config: bool) -> Tok
306
306
  if use_stored_config {
307
307
  let method = format_ident!("{}", storage_type.accessor_name());
308
308
  quote! {
309
- if let Some(utils::ttl::TtlConfig { threshold, extend_to }) = utils::ttl::TtlConfigStorage::#method(env) {
309
+ if let Some(utils::ttl_configurable::TtlConfig { threshold, extend_to }) = utils::ttl_configurable::TtlConfigStorage::#method(env) {
310
310
  #extend_call
311
311
  }
312
312
  }
@@ -2,6 +2,7 @@ use proc_macro2::TokenStream;
2
2
  use quote::quote;
3
3
 
4
4
  use crate::tests::test_helpers::{assert_panics_contains, non_struct_item_inputs};
5
+
5
6
  // ============================================
6
7
  // Snapshot Test: Ownable Code Generation
7
8
  // ============================================
@@ -11,21 +12,40 @@ fn snapshot_generated_ownable_code() {
11
12
  let input = quote! {
12
13
  pub struct MyContract;
13
14
  };
14
- let result = crate::ownable::generate_ownable_impl(input);
15
+ let result = crate::auth::generate_ownable_impl(input);
16
+ let formatted = prettyplease::unparse(&syn::parse2::<syn::File>(result).expect("failed to parse generated code"));
17
+
18
+ insta::assert_snapshot!(formatted);
19
+ }
20
+
21
+ // ============================================
22
+ // Snapshot Test: Multisig Code Generation
23
+ // ============================================
24
+
25
+ #[test]
26
+ fn snapshot_generated_multisig_code() {
27
+ let input = quote! {
28
+ pub struct MyContract;
29
+ };
30
+ let result = crate::auth::generate_multisig_impl(input);
15
31
  let formatted = prettyplease::unparse(&syn::parse2::<syn::File>(result).expect("failed to parse generated code"));
16
32
 
17
33
  insta::assert_snapshot!(formatted);
18
34
  }
19
35
 
36
+ // ============================================
37
+ // Snapshot Test: Only Auth Macro
38
+ // ============================================
39
+
20
40
  #[test]
21
- fn snapshot_only_owner_preserves_function_signature() {
41
+ fn snapshot_only_auth_preserves_function_signature() {
22
42
  // Test with borrowed Env (&Env) - should use env directly
23
43
  let input_borrowed = quote! {
24
44
  pub(crate) async fn admin_action<T: Clone>(env: &Env, value: T) -> Result<T, Error> {
25
45
  Ok(value.clone())
26
46
  }
27
47
  };
28
- let result_borrowed = crate::ownable::prepend_only_owner_check(input_borrowed);
48
+ let result_borrowed = crate::auth::prepend_only_auth_check(input_borrowed);
29
49
  let formatted_borrowed =
30
50
  prettyplease::unparse(&syn::parse2::<syn::File>(result_borrowed).expect("failed to parse generated code"));
31
51
 
@@ -35,7 +55,7 @@ fn snapshot_only_owner_preserves_function_signature() {
35
55
  Ok(value.clone())
36
56
  }
37
57
  };
38
- let result_owned = crate::ownable::prepend_only_owner_check(input_owned);
58
+ let result_owned = crate::auth::prepend_only_auth_check(input_owned);
39
59
  let formatted_owned =
40
60
  prettyplease::unparse(&syn::parse2::<syn::File>(result_owned).expect("failed to parse generated code"));
41
61
 
@@ -49,30 +69,30 @@ fn snapshot_only_owner_preserves_function_signature() {
49
69
  }
50
70
 
51
71
  // ============================================
52
- // prepend_only_owner_check Tests
72
+ // prepend_only_auth_check Tests
53
73
  // ============================================
54
74
 
55
- /// Helper function to verify that the owner check is correctly inserted at the beginning of a function.
56
- fn assert_owner_check_inserted(input: TokenStream, expected_env_ref: &str, test_name: &str) {
57
- let result_tokens = crate::ownable::prepend_only_owner_check(input);
75
+ /// Helper function to verify that the auth check is correctly inserted at the beginning of a function.
76
+ fn assert_auth_check_inserted(input: TokenStream, expected_env_ref: &str, test_name: &str) {
77
+ let result_tokens = crate::auth::prepend_only_auth_check(input);
58
78
  let output_fn: syn::ItemFn =
59
79
  syn::parse2(result_tokens).unwrap_or_else(|e| panic!("{}: failed to parse output function: {}", test_name, e));
60
80
 
61
81
  assert!(!output_fn.block.stmts.is_empty(), "{}: function body should contain at least one statement", test_name);
62
82
 
63
83
  let first_stmt = &output_fn.block.stmts[0];
64
- let expected_stmt = format!("utils::ownable::require_owner_auth::<Self>({});", expected_env_ref);
84
+ let expected_stmt = format!("utils::auth::require_auth::<Self>({});", expected_env_ref);
65
85
  let actual_stmt = quote::quote!(#first_stmt).to_string().replace(" ", "");
66
86
 
67
87
  assert_eq!(
68
88
  actual_stmt, expected_stmt,
69
- "{}: expected owner check statement '{}', but got '{}'",
89
+ "{}: expected auth check statement '{}', but got '{}'",
70
90
  test_name, expected_stmt, actual_stmt
71
91
  );
72
92
  }
73
93
 
74
94
  #[test]
75
- fn test_only_owner_inserts_correct_code_at_the_beginning() {
95
+ fn test_only_auth_inserts_correct_code_at_the_beginning() {
76
96
  // (description, input, expected_env_ref)
77
97
  // Owned Env should produce &env, reference Env should produce env directly
78
98
  let test_cases = vec![
@@ -88,12 +108,12 @@ fn test_only_owner_inserts_correct_code_at_the_beginning() {
88
108
  ];
89
109
 
90
110
  for (description, input, expected_env_ref) in test_cases {
91
- assert_owner_check_inserted(input, expected_env_ref, description);
111
+ assert_auth_check_inserted(input, expected_env_ref, description);
92
112
  }
93
113
  }
94
114
 
95
115
  #[test]
96
- fn test_only_owner_requires_env_param() {
116
+ fn test_only_auth_requires_env_param() {
97
117
  // ============================================
98
118
  // Error Cases: Missing/Invalid Env Argument Patterns
99
119
  // ============================================
@@ -109,7 +129,7 @@ fn test_only_owner_requires_env_param() {
109
129
 
110
130
  for (case, input) in cases {
111
131
  assert_panics_contains(case, "function must have an Env argument", || {
112
- crate::ownable::prepend_only_owner_check(input.clone());
132
+ crate::auth::prepend_only_auth_check(input.clone());
113
133
  });
114
134
  }
115
135
  }
@@ -122,7 +142,20 @@ fn test_only_owner_requires_env_param() {
122
142
  fn test_ownable_rejects_non_struct_inputs() {
123
143
  for (case, input) in non_struct_item_inputs() {
124
144
  assert_panics_contains(case, "failed to parse struct", || {
125
- crate::ownable::generate_ownable_impl(input.clone());
145
+ crate::auth::generate_ownable_impl(input.clone());
146
+ });
147
+ }
148
+ }
149
+
150
+ // ============================================
151
+ // Error Cases: multisig macro non-struct input
152
+ // ============================================
153
+
154
+ #[test]
155
+ fn test_multisig_rejects_non_struct_inputs() {
156
+ for (case, input) in non_struct_item_inputs() {
157
+ assert_panics_contains(case, "failed to parse struct", || {
158
+ crate::auth::generate_multisig_impl(input.clone());
126
159
  });
127
160
  }
128
161
  }