@layerzerolabs/protocol-stellar-v2 0.2.21 → 0.2.23

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 (328) hide show
  1. package/.turbo/turbo-build.log +347 -271
  2. package/.turbo/turbo-lint.log +277 -208
  3. package/.turbo/turbo-test.log +1700 -1370
  4. package/Cargo.lock +22 -51
  5. package/Cargo.toml +6 -1
  6. package/contracts/common-macros/src/auth.rs +10 -9
  7. package/contracts/common-macros/src/contract_ttl.rs +1 -4
  8. package/contracts/common-macros/src/error.rs +1 -3
  9. package/contracts/common-macros/src/lib.rs +65 -61
  10. package/contracts/common-macros/src/storage.rs +212 -65
  11. package/contracts/common-macros/src/tests/auth.rs +75 -6
  12. package/contracts/common-macros/src/tests/contract_ttl.rs +383 -350
  13. package/contracts/common-macros/src/tests/error.rs +9 -21
  14. package/contracts/common-macros/src/tests/lz_contract.rs +80 -0
  15. package/contracts/common-macros/src/tests/mod.rs +2 -0
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +20 -3
  17. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +28 -1
  18. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap +8 -43
  19. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contracttrait_code.snap +6 -29
  20. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__lz_contract__snapshot_generated_lz_contract_code.snap +31 -0
  21. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_extendable__snapshot_generated_ttl_extendable_code.snap +8 -0
  22. package/contracts/common-macros/src/tests/storage/extract_fields.rs +87 -0
  23. package/contracts/common-macros/src/tests/storage/gen_accessor_methods.rs +223 -0
  24. package/contracts/common-macros/src/tests/storage/gen_args.rs +65 -0
  25. package/contracts/common-macros/src/tests/storage/gen_enum_variant.rs +78 -0
  26. package/contracts/common-macros/src/tests/storage/gen_key.rs +108 -0
  27. package/contracts/common-macros/src/tests/storage/gen_params.rs +105 -0
  28. package/contracts/common-macros/src/tests/{storage.rs → storage/generate_storage.rs} +54 -129
  29. package/contracts/common-macros/src/tests/storage/is_primitive_type.rs +48 -0
  30. package/contracts/common-macros/src/tests/storage/mod.rs +16 -0
  31. package/contracts/common-macros/src/tests/storage/parse_default.rs +164 -0
  32. package/contracts/common-macros/src/tests/storage/parse_name.rs +159 -0
  33. package/contracts/common-macros/src/tests/storage/parse_no_ttl_extension.rs +124 -0
  34. package/contracts/common-macros/src/tests/storage/parse_storage_type.rs +174 -0
  35. package/contracts/common-macros/src/tests/storage/snapshots/common_macros__tests__storage__generate_storage__snapshot_generated_storage_code.snap +412 -0
  36. package/contracts/common-macros/src/tests/storage/storage_kind.rs +39 -0
  37. package/contracts/common-macros/src/tests/storage/test_setup.rs +25 -0
  38. package/contracts/common-macros/src/tests/storage/validate_attrs.rs +138 -0
  39. package/contracts/common-macros/src/tests/storage/variant_config.rs +226 -0
  40. package/contracts/common-macros/src/tests/test_helpers.rs +4 -10
  41. package/contracts/common-macros/src/tests/ttl_configurable.rs +2 -2
  42. package/contracts/common-macros/src/tests/ttl_extendable.rs +32 -0
  43. package/contracts/common-macros/src/tests/upgradeable.rs +118 -2
  44. package/contracts/common-macros/src/ttl_configurable.rs +1 -4
  45. package/contracts/common-macros/src/upgradeable.rs +21 -3
  46. package/contracts/endpoint-v2/Cargo.toml +0 -4
  47. package/contracts/endpoint-v2/src/endpoint_v2.rs +37 -17
  48. package/contracts/endpoint-v2/src/errors.rs +26 -1
  49. package/contracts/endpoint-v2/src/interfaces/layerzero_endpoint_v2.rs +1 -1
  50. package/contracts/endpoint-v2/src/interfaces/message_lib_manager.rs +4 -4
  51. package/contracts/endpoint-v2/src/interfaces/messaging_composer.rs +2 -2
  52. package/contracts/endpoint-v2/src/lib.rs +0 -1
  53. package/contracts/endpoint-v2/src/message_lib_manager.rs +39 -8
  54. package/contracts/endpoint-v2/src/messaging_channel.rs +36 -4
  55. package/contracts/endpoint-v2/src/messaging_composer.rs +18 -4
  56. package/contracts/endpoint-v2/src/storage.rs +9 -1
  57. package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +2 -2
  58. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +1 -1
  59. package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +2 -2
  60. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +3 -3
  61. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +5 -5
  62. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +2 -2
  63. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +5 -5
  64. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +3 -3
  65. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +1 -1
  66. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +4 -3
  67. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +7 -2
  68. package/contracts/endpoint-v2/src/tests/messaging_composer/mod.rs +4 -0
  69. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +7 -2
  70. package/contracts/layerzero-views/src/layerzero_view.rs +0 -1
  71. package/contracts/layerzero-views/src/tests/mod.rs +1 -0
  72. package/contracts/layerzero-views/src/tests/types_tests.rs +31 -0
  73. package/contracts/layerzero-views/src/types.rs +2 -3
  74. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/constructor.rs +61 -0
  75. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/contract_impl_ttl_extension.rs +97 -0
  76. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/contract_trait_ttl_extension.rs +99 -0
  77. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/mod.rs +3 -0
  78. package/contracts/macro-integration-tests/tests/runtime/lz_contract/mod.rs +5 -0
  79. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_default.rs +86 -0
  80. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_multisig.rs +47 -0
  81. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_multisig_upgradeable.rs +77 -0
  82. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_upgradeable.rs +114 -0
  83. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_upgradeable_no_migration.rs +105 -0
  84. package/contracts/macro-integration-tests/tests/runtime/multisig/admin_entrypoints.rs +242 -0
  85. package/contracts/macro-integration-tests/tests/runtime/multisig/mod.rs +9 -0
  86. package/contracts/macro-integration-tests/tests/runtime/multisig/self_auth.rs +54 -0
  87. package/contracts/macro-integration-tests/tests/runtime/ownable/initialization.rs +13 -0
  88. package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +1 -0
  89. package/contracts/macro-integration-tests/tests/runtime/ownable/ownership_transfer.rs +70 -1
  90. package/contracts/macro-integration-tests/tests/runtime/ownable/two_step_transfer.rs +219 -0
  91. package/contracts/macro-integration-tests/tests/runtime/storage/keyed_roundtrip.rs +41 -0
  92. package/contracts/macro-integration-tests/tests/runtime/storage/ttl_extension.rs +48 -16
  93. package/contracts/macro-integration-tests/tests/runtime/storage/unkeyed_roundtrip.rs +10 -0
  94. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +96 -3
  95. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +4 -0
  96. package/contracts/macro-integration-tests/tests/runtime/ttl_extendable/extend_instance_ttl.rs +64 -0
  97. package/contracts/macro-integration-tests/tests/runtime/ttl_extendable/mod.rs +16 -0
  98. package/contracts/macro-integration-tests/tests/runtime/upgradeable/migrate_guard_and_state.rs +305 -0
  99. package/contracts/macro-integration-tests/tests/runtime/upgradeable/mod.rs +3 -0
  100. package/contracts/macro-integration-tests/tests/runtime/upgradeable/no_migration.rs +59 -0
  101. package/contracts/macro-integration-tests/tests/runtime/upgradeable/upgrade_then_migrate.rs +88 -0
  102. package/contracts/macro-integration-tests/tests/runtime.rs +5 -0
  103. package/contracts/macro-integration-tests/tests/ui/contract_impl/fail/not_impl_item.rs +6 -0
  104. package/contracts/macro-integration-tests/tests/ui/contract_impl/fail/not_impl_item.stderr +7 -0
  105. package/contracts/macro-integration-tests/tests/ui/contract_impl/pass/basic.rs +102 -0
  106. package/contracts/macro-integration-tests/tests/ui/contract_trait/fail/not_a_trait.rs +6 -0
  107. package/contracts/macro-integration-tests/tests/ui/contract_trait/fail/not_a_trait.stderr +7 -0
  108. package/contracts/macro-integration-tests/tests/ui/contract_trait/pass/basic.rs +83 -0
  109. package/contracts/macro-integration-tests/tests/ui/error/fail/discriminant_too_large.rs +11 -0
  110. package/contracts/macro-integration-tests/tests/ui/error/fail/discriminant_too_large.stderr +7 -0
  111. package/contracts/macro-integration-tests/tests/ui/error/fail/non_enum_input.rs +11 -0
  112. package/contracts/macro-integration-tests/tests/ui/error/fail/non_enum_input.stderr +7 -0
  113. package/contracts/macro-integration-tests/tests/ui/error/pass/basic.rs +22 -0
  114. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/invalid_option.rs +6 -0
  115. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/invalid_option.stderr +7 -0
  116. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/multisig_rejects_ownable_api.rs +20 -0
  117. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/multisig_rejects_ownable_api.stderr +20 -0
  118. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/not_a_struct.rs +8 -0
  119. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/not_a_struct.stderr +7 -0
  120. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_invalid_inner_option.rs +10 -0
  121. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_invalid_inner_option.stderr +7 -0
  122. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_missing_internal.rs +20 -0
  123. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_missing_internal.stderr +86 -0
  124. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/basic.rs +45 -0
  125. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/multisig.rs +34 -0
  126. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/multisig_upgradeable.rs +30 -0
  127. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/upgradeable.rs +39 -0
  128. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/upgradeable_no_migration.rs +28 -0
  129. package/contracts/macro-integration-tests/tests/ui/multisig/fail/non_struct_input.rs +8 -0
  130. package/contracts/macro-integration-tests/tests/ui/multisig/fail/non_struct_input.stderr +7 -0
  131. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_api.rs +20 -0
  132. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_api.stderr +12 -0
  133. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_trait.rs +20 -0
  134. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_trait.stderr +5 -0
  135. package/contracts/macro-integration-tests/tests/ui/multisig/pass/basic.rs +49 -0
  136. package/contracts/macro-integration-tests/tests/ui/ownable/fail/non_struct_input.rs +8 -0
  137. package/contracts/macro-integration-tests/tests/ui/ownable/fail/non_struct_input.stderr +7 -0
  138. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_auth.rs +19 -0
  139. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_auth.stderr +12 -0
  140. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.rs +1 -1
  141. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.stderr +0 -8
  142. package/contracts/macro-integration-tests/tests/ui/ownable/pass/basic.rs +39 -0
  143. package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_auth_env_param_variants.rs +7 -1
  144. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.stderr +1 -1
  145. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.stderr +1 -1
  146. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_default_values.rs +11 -0
  147. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_default_values.stderr +7 -0
  148. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_name_attrs.rs +11 -0
  149. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_name_attrs.stderr +7 -0
  150. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_no_ttl_extension.rs +11 -0
  151. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_no_ttl_extension.stderr +7 -0
  152. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.stderr +1 -1
  153. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_rejects_args.rs +13 -0
  154. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_rejects_args.stderr +7 -0
  155. package/contracts/macro-integration-tests/tests/ui/storage/pass/api_surface.rs +102 -0
  156. package/contracts/macro-integration-tests/tests/ui/storage/pass/basic.rs +43 -0
  157. package/contracts/macro-integration-tests/tests/ui/storage/pass/multi_key.rs +38 -0
  158. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/missing_auth_trait.rs +14 -0
  159. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/missing_auth_trait.stderr +71 -0
  160. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/non_struct_input.rs +8 -0
  161. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/non_struct_input.stderr +7 -0
  162. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/{minimal_contract.rs → basic.rs} +2 -0
  163. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/multisig_contract.rs +28 -0
  164. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/ownable_contract.rs +32 -0
  165. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/fail/non_struct_input.rs +8 -0
  166. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/fail/non_struct_input.stderr +7 -0
  167. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/pass/basic.rs +23 -0
  168. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/pass/no_user_contractimpl.rs +21 -0
  169. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/attr_args.rs +11 -0
  170. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/attr_args.stderr +29 -0
  171. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_auth_trait.rs +20 -0
  172. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_auth_trait.stderr +71 -0
  173. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_upgradeable_internal.rs +10 -0
  174. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_upgradeable_internal.stderr +79 -0
  175. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/non_struct_input.rs +8 -0
  176. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/non_struct_input.stderr +7 -0
  177. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/basic.rs +43 -0
  178. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/multisig_contract.rs +35 -0
  179. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/no_migration.rs +30 -0
  180. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/no_user_contractimpl.rs +29 -0
  181. package/contracts/macro-integration-tests/tests/ui_contract_impl.rs +12 -0
  182. package/contracts/macro-integration-tests/tests/ui_contract_trait.rs +12 -0
  183. package/contracts/macro-integration-tests/tests/ui_lz_contract.rs +11 -0
  184. package/contracts/macro-integration-tests/tests/ui_multisig.rs +11 -0
  185. package/contracts/macro-integration-tests/tests/ui_ttl_extendable.rs +12 -0
  186. package/contracts/macro-integration-tests/tests/ui_upgradeable.rs +11 -0
  187. package/contracts/message-libs/blocked-message-lib/Cargo.toml +1 -1
  188. package/contracts/message-libs/blocked-message-lib/src/lib.rs +4 -1
  189. package/contracts/message-libs/blocked-message-lib/src/tests/blocked_message_lib_tests.rs +108 -0
  190. package/contracts/message-libs/blocked-message-lib/src/tests/mod.rs +4 -0
  191. package/contracts/message-libs/blocked-message-lib/src/tests/setup.rs +40 -0
  192. package/contracts/message-libs/simple-message-lib/src/lib.rs +1 -1
  193. package/contracts/message-libs/simple-message-lib/src/tests/mod.rs +2 -0
  194. package/contracts/message-libs/simple-message-lib/src/tests/setup.rs +124 -0
  195. package/contracts/message-libs/simple-message-lib/src/tests/simple_message_lib_tests.rs +309 -0
  196. package/contracts/message-libs/uln-302/src/errors.rs +21 -0
  197. package/contracts/message-libs/uln-302/src/interfaces/receive_uln.rs +1 -1
  198. package/contracts/message-libs/uln-302/src/receive_uln.rs +6 -4
  199. package/contracts/message-libs/uln-302/src/send_uln.rs +15 -6
  200. package/contracts/message-libs/uln-302/src/storage.rs +5 -5
  201. package/contracts/message-libs/uln-302/src/tests/uln302/get_config.rs +71 -0
  202. package/contracts/message-libs/uln-302/src/tests/uln302/mod.rs +1 -0
  203. package/contracts/message-libs/uln-302/src/uln302.rs +3 -0
  204. package/contracts/oapps/counter/Cargo.toml +2 -0
  205. package/contracts/oapps/counter/integration_tests/mod.rs +1 -0
  206. package/contracts/oapps/counter/integration_tests/setup_sml.rs +6 -4
  207. package/contracts/oapps/counter/integration_tests/setup_uln.rs +12 -5
  208. package/contracts/oapps/counter/integration_tests/test_with_blocked.rs +67 -0
  209. package/contracts/oapps/counter/src/tests/mod.rs +1 -0
  210. package/contracts/oapps/counter/src/tests/test_u256_ext.rs +48 -0
  211. package/contracts/oapps/oapp/src/lib.rs +0 -3
  212. package/contracts/oapps/oapp/src/tests/mod.rs +1 -0
  213. package/contracts/oapps/oft/integration-tests/setup.rs +2 -3
  214. package/contracts/oapps/oft/src/lib.rs +3 -0
  215. package/contracts/oapps/oft/src/tests/extensions/mod.rs +3 -0
  216. package/contracts/oapps/oft/src/tests/extensions/oft_fee.rs +240 -0
  217. package/contracts/oapps/oft/src/tests/extensions/pausable.rs +141 -0
  218. package/contracts/oapps/oft/src/tests/extensions/rate_limiter.rs +447 -0
  219. package/contracts/oapps/oft/src/tests/mod.rs +2 -0
  220. package/contracts/oapps/oft/src/tests/oft_types/lock_unlock.rs +180 -0
  221. package/contracts/oapps/oft/src/tests/oft_types/mod.rs +1 -0
  222. package/contracts/oapps/oft-core/integration-tests/setup.rs +2 -3
  223. package/contracts/oapps/oft-core/src/lib.rs +2 -2
  224. package/contracts/oapps/oft-core/src/tests/mod.rs +1 -1
  225. package/contracts/oapps/oft-core/src/tests/{test_oft_version.rs → test_oft_version_and_approval.rs} +9 -0
  226. package/contracts/oapps/oft-core/src/tests/test_utils.rs +0 -43
  227. package/contracts/upgrader/src/tests/test_upgrader.rs +18 -0
  228. package/contracts/utils/src/auth.rs +2 -2
  229. package/contracts/utils/src/buffer_reader.rs +61 -10
  230. package/contracts/utils/src/buffer_writer.rs +35 -20
  231. package/contracts/utils/src/bytes_ext.rs +1 -2
  232. package/contracts/utils/src/errors.rs +5 -3
  233. package/contracts/utils/src/multisig.rs +59 -36
  234. package/contracts/utils/src/option_ext.rs +3 -3
  235. package/contracts/utils/src/ownable.rs +12 -6
  236. package/contracts/utils/src/tests/auth.rs +179 -0
  237. package/contracts/utils/src/tests/buffer_reader.rs +203 -1
  238. package/contracts/utils/src/tests/buffer_writer.rs +176 -5
  239. package/contracts/utils/src/tests/mod.rs +2 -0
  240. package/contracts/utils/src/tests/multisig.rs +170 -141
  241. package/contracts/utils/src/tests/option_ext.rs +1 -1
  242. package/contracts/utils/src/tests/ownable.rs +156 -161
  243. package/contracts/utils/src/tests/test_helper.rs +21 -1
  244. package/contracts/utils/src/tests/testing_utils.rs +84 -2
  245. package/contracts/utils/src/tests/ttl_configurable.rs +66 -86
  246. package/contracts/utils/src/tests/ttl_extendable.rs +64 -0
  247. package/contracts/utils/src/tests/upgradeable.rs +115 -6
  248. package/contracts/utils/src/ttl_configurable.rs +22 -12
  249. package/contracts/utils/src/ttl_extendable.rs +1 -3
  250. package/contracts/utils/src/upgradeable.rs +21 -24
  251. package/contracts/workers/dvn/src/auth.rs +1 -1
  252. package/contracts/workers/dvn/src/interfaces/dvn.rs +2 -2
  253. package/contracts/workers/dvn/src/storage.rs +1 -1
  254. package/contracts/workers/dvn/src/tests/auth.rs +136 -3
  255. package/contracts/workers/dvn/src/tests/mod.rs +0 -1
  256. package/contracts/workers/dvn/src/tests/setup.rs +4 -10
  257. package/contracts/workers/executor-helper/src/tests/executor_helper.rs +279 -0
  258. package/contracts/workers/executor-helper/src/tests/setup.rs +106 -1
  259. package/contracts/workers/worker/src/worker.rs +1 -1
  260. package/docs/oft-guide.md +5 -5
  261. package/package.json +5 -7
  262. package/sdk/.turbo/turbo-test.log +662 -466
  263. package/sdk/LICENSE +23 -0
  264. package/sdk/dist/generated/bml.d.ts +101 -106
  265. package/sdk/dist/generated/bml.js +108 -26
  266. package/sdk/dist/generated/counter.d.ts +123 -484
  267. package/sdk/dist/generated/counter.js +103 -25
  268. package/sdk/dist/generated/dvn.d.ts +141 -699
  269. package/sdk/dist/generated/dvn.js +106 -28
  270. package/sdk/dist/generated/dvn_fee_lib.d.ts +31 -248
  271. package/sdk/dist/generated/dvn_fee_lib.js +27 -24
  272. package/sdk/dist/generated/endpoint.d.ts +158 -836
  273. package/sdk/dist/generated/endpoint.js +107 -29
  274. package/sdk/dist/generated/executor.d.ts +139 -671
  275. package/sdk/dist/generated/executor.js +106 -28
  276. package/sdk/dist/generated/executor_fee_lib.d.ts +109 -264
  277. package/sdk/dist/generated/executor_fee_lib.js +106 -28
  278. package/sdk/dist/generated/executor_helper.d.ts +95 -92
  279. package/sdk/dist/generated/executor_helper.js +103 -25
  280. package/sdk/dist/generated/layerzero_view.d.ts +178 -335
  281. package/sdk/dist/generated/layerzero_view.js +172 -33
  282. package/sdk/dist/generated/oft.d.ts +137 -680
  283. package/sdk/dist/generated/oft.js +103 -25
  284. package/sdk/dist/generated/price_feed.d.ts +45 -444
  285. package/sdk/dist/generated/price_feed.js +27 -24
  286. package/sdk/dist/generated/sml.d.ts +119 -428
  287. package/sdk/dist/generated/sml.js +103 -25
  288. package/sdk/dist/generated/treasury.d.ts +109 -288
  289. package/sdk/dist/generated/treasury.js +103 -25
  290. package/sdk/dist/generated/uln302.d.ts +190 -527
  291. package/sdk/dist/generated/uln302.js +170 -31
  292. package/sdk/dist/generated/upgrader.d.ts +14 -34
  293. package/sdk/dist/generated/upgrader.js +24 -21
  294. package/sdk/package.json +3 -4
  295. package/sdk/test/counter-sml.test.ts +218 -142
  296. package/sdk/test/counter-uln.test.ts +189 -145
  297. package/sdk/test/oft-sml.test.ts +173 -156
  298. package/sdk/test/suites/constants.ts +7 -1
  299. package/sdk/test/suites/globalSetup.ts +140 -74
  300. package/sdk/turbo.json +1 -1
  301. package/tools/ts-bindings-gen/Cargo.toml +4 -4
  302. package/tools/ts-bindings-gen/src/main.rs +4 -0
  303. package/turbo.json +3 -0
  304. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +0 -1072
  305. package/contracts/endpoint-v2/src/constants.rs +0 -52
  306. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.rs +0 -12
  307. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.stderr +0 -7
  308. package/contracts/macro-integration-tests/tests/ui/error/pass/attr_on_variant_allowed.rs +0 -20
  309. package/contracts/macro-integration-tests/tests/ui/error/pass/basic_auto_discriminants.rs +0 -15
  310. package/contracts/macro-integration-tests/tests/ui/error/pass/mixed_discriminants.rs +0 -16
  311. package/contracts/macro-integration-tests/tests/ui/ownable/pass/minimal_contract.rs +0 -26
  312. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +0 -21
  313. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.rs +0 -12
  314. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.stderr +0 -7
  315. package/contracts/macro-integration-tests/tests/ui/storage/pass/default_value_on_variant.rs +0 -14
  316. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_instance_unit_basic.rs +0 -14
  317. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_persistent_named_fields_keyed.rs +0 -16
  318. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_temporary_unit_option.rs +0 -15
  319. package/contracts/macro-integration-tests/tests/ui/storage/pass/name_override.rs +0 -14
  320. package/contracts/macro-integration-tests/tests/ui/storage/pass/no_auto_ttl_extension.rs +0 -19
  321. package/contracts/macro-integration-tests/tests/ui/storage/pass/ttl_provider_basic.rs +0 -15
  322. package/contracts/message-libs/simple-message-lib/src/test.rs +0 -280
  323. package/contracts/oapps/oapp/src/macro_tests/mod.rs +0 -1
  324. package/contracts/workers/dvn/src/tests/multisig/mod.rs +0 -3
  325. package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +0 -132
  326. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +0 -109
  327. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +0 -106
  328. /package/contracts/oapps/oapp/src/{macro_tests → tests}/test_macros.rs +0 -0
@@ -6,18 +6,14 @@ use heck::ToSnakeCase;
6
6
  use itertools::Itertools;
7
7
  use proc_macro2::{Ident, TokenStream};
8
8
  use quote::{format_ident, quote};
9
- use syn::{Attribute, Expr, Fields, FieldsNamed, Type, Variant};
9
+ use syn::{Attribute, Expr, Fields, FieldsNamed, Meta, Type, Variant};
10
10
 
11
11
  // ============================================================================
12
12
  // Public API
13
13
  // ============================================================================
14
14
 
15
15
  /// Generates the storage API from the `#[storage]` attribute macro.
16
- pub fn generate_storage(attr: TokenStream, input: TokenStream) -> TokenStream {
17
- if !attr.is_empty() {
18
- panic!("the #[storage] attribute does not accept arguments");
19
- }
20
-
16
+ pub fn generate_storage(input: TokenStream) -> TokenStream {
21
17
  let item_enum: syn::ItemEnum = syn::parse2(input).unwrap_or_else(|e| panic!("failed to parse enum: {}", e));
22
18
  let enum_name = &item_enum.ident;
23
19
  let vis = &item_enum.vis;
@@ -33,13 +29,6 @@ pub fn generate_storage(attr: TokenStream, input: TokenStream) -> TokenStream {
33
29
  }
34
30
  }
35
31
 
36
- /// Checks if a type is a primitive (pass-by-value) type.
37
- pub(crate) fn is_primitive_type(ty: &Type) -> bool {
38
- const PRIMITIVES: &[&str] = &["u32", "i32", "u64", "i64", "u128", "i128", "bool"];
39
- matches!(ty, Type::Path(p) if p.path.segments.len() == 1
40
- && PRIMITIVES.contains(&p.path.segments[0].ident.to_string().as_str()))
41
- }
42
-
43
32
  // ============================================================================
44
33
  // Types
45
34
  // ============================================================================
@@ -66,32 +55,6 @@ impl StorageKind {
66
55
  let method = format_ident!("{}", self.name());
67
56
  quote! { env.storage().#method() }
68
57
  }
69
-
70
- /// Generates TTL extension code.
71
- ///
72
- /// - `use_stored_config=true`: reads TTL config from storage (for auto-extension)
73
- /// - `use_stored_config=false`: uses local `threshold`/`extend_to` variables (for manual)
74
- fn gen_ttl_extension(self, use_stored_config: bool) -> TokenStream {
75
- let accessor = self.accessor();
76
- let extend_call = if self == Self::Instance {
77
- quote! { #accessor.extend_ttl(threshold, extend_to); }
78
- } else {
79
- quote! { #accessor.extend_ttl(&key, threshold, extend_to); }
80
- };
81
-
82
- if use_stored_config {
83
- let method = format_ident!("{}", self.name());
84
- quote! {
85
- if let Some(utils::ttl_configurable::TtlConfig { threshold, extend_to }) =
86
- utils::ttl_configurable::TtlConfigStorage::#method(env)
87
- {
88
- #extend_call
89
- }
90
- }
91
- } else {
92
- extend_call
93
- }
94
- }
95
58
  }
96
59
 
97
60
  /// Parsed configuration for a storage enum variant.
@@ -148,28 +111,33 @@ fn gen_accessor_methods(enum_name: &Ident, variant: &Variant) -> TokenStream {
148
111
  let accessor = config.kind.accessor();
149
112
  let value_type = &config.value_type;
150
113
 
151
- // TTL extension tokens
152
- let auto_ttl = if config.auto_ttl { config.kind.gen_ttl_extension(true) } else { TokenStream::new() };
153
- let manual_ttl = config.kind.gen_ttl_extension(false);
114
+ // Auto TTL extension call — emitted after reads/writes for persistent storage.
115
+ // `Option<TokenStream>` integrates directly with `quote!` (None emits nothing).
116
+ let extend_ttl = config.auto_ttl.then(|| {
117
+ quote! { utils::ttl_configurable::extend_persistent_ttl(env, &key); }
118
+ });
154
119
 
155
- // Getter return type and expression
120
+ // Getter: returns the value directly (with default) or wrapped in Option.
156
121
  let (ret_type, ret_expr) = match &config.default_value {
157
122
  Some(default) => (quote! { #value_type }, quote! { value.unwrap_or(#default) }),
158
123
  None => (quote! { Option<#value_type> }, quote! { value }),
159
124
  };
160
- let ttl_on_get = if config.auto_ttl {
161
- quote! { if value.is_some() { #auto_ttl } }
162
- } else {
163
- TokenStream::new()
164
- };
125
+ let ttl_on_get = extend_ttl.as_ref().map(|call| quote! { if value.is_some() { #call } });
165
126
 
166
- // Has check body
167
- let has_body = if config.auto_ttl {
168
- quote! { let exists = #accessor.has(&key); if exists { #auto_ttl } exists }
169
- } else {
170
- quote! { #accessor.has(&key) }
127
+ // Has: conditionally extend TTL when key exists.
128
+ let has_body = match &extend_ttl {
129
+ Some(call) => quote! { let exists = #accessor.has(&key); if exists { #call } exists },
130
+ None => quote! { #accessor.has(&key) },
171
131
  };
172
132
 
133
+ // TTL extender method — only for persistent/temporary storage (instance has no per-key TTL).
134
+ let ttl_extender_method = (config.kind != StorageKind::Instance).then(|| quote! {
135
+ pub fn #ttl_extender(#params, threshold: u32, extend_to: u32) {
136
+ let key = #key;
137
+ #accessor.extend_ttl(&key, threshold, extend_to);
138
+ }
139
+ });
140
+
173
141
  quote! {
174
142
  pub fn #getter(#params) -> #ret_type {
175
143
  let key = #key;
@@ -181,7 +149,7 @@ fn gen_accessor_methods(enum_name: &Ident, variant: &Variant) -> TokenStream {
181
149
  pub fn #setter(#params, value: &#value_type) {
182
150
  let key = #key;
183
151
  #accessor.set(&key, value);
184
- #auto_ttl
152
+ #extend_ttl
185
153
  }
186
154
 
187
155
  pub fn #remover(#params) {
@@ -201,10 +169,7 @@ fn gen_accessor_methods(enum_name: &Ident, variant: &Variant) -> TokenStream {
201
169
  #has_body
202
170
  }
203
171
 
204
- pub fn #ttl_extender(#params, threshold: u32, extend_to: u32) {
205
- let key = #key;
206
- #manual_ttl
207
- }
172
+ #ttl_extender_method
208
173
  }
209
174
  }
210
175
 
@@ -244,7 +209,7 @@ fn gen_args(variant: &Variant) -> TokenStream {
244
209
  if fields.is_empty() {
245
210
  quote! { env }
246
211
  } else {
247
- let names = fields.iter().map(|(name, _)| *name);
212
+ let names = fields.iter().map(|(name, _)| name);
248
213
  quote! { env, #(#names),* }
249
214
  }
250
215
  }
@@ -268,6 +233,14 @@ fn gen_key(enum_name: &Ident, variant: &Variant) -> TokenStream {
268
233
  }
269
234
  }
270
235
 
236
+ /// Checks if a type is a primitive (pass-by-value) type.
237
+ fn is_primitive_type(ty: &Type) -> bool {
238
+ // https://developers.stellar.org/docs/learn/fundamentals/contract-development/types/built-in-types#primitive-types
239
+ const PRIMITIVES: &[&str] = &["u32", "i32", "u64", "i64", "u128", "i128", "bool"];
240
+ matches!(ty, Type::Path(p) if p.path.segments.len() == 1
241
+ && PRIMITIVES.contains(&p.path.segments[0].ident.to_string().as_str()))
242
+ }
243
+
271
244
  // ============================================================================
272
245
  // Attribute Parsing
273
246
  // ============================================================================
@@ -329,7 +302,10 @@ fn parse_storage_type(attrs: &[Attribute]) -> Result<(StorageKind, Type), String
329
302
  "temporary" => StorageKind::Temporary,
330
303
  _ => return None,
331
304
  };
332
- Some((kind, attr.parse_args::<Type>().ok()?))
305
+ let value_type = attr
306
+ .parse_args::<Type>()
307
+ .unwrap_or_else(|e| panic!("failed to parse storage type for #[{}(...)] : {}", ident, e));
308
+ Some((kind, value_type))
333
309
  })
334
310
  .exactly_one()
335
311
  .map_err(|e| {
@@ -346,7 +322,7 @@ fn parse_default(attrs: &[Attribute]) -> Result<Option<Expr>, String> {
346
322
  .iter()
347
323
  .filter(|attr| attr.path().is_ident("default"))
348
324
  .at_most_one()
349
- .map_err(|_| "multiple default values specified")?
325
+ .map_err(|e| format!("multiple default values specified: {}", e))?
350
326
  .map(|attr| attr.parse_args::<Expr>())
351
327
  .transpose()
352
328
  .map_err(|e| format!("failed to parse default value: {}", e))
@@ -357,17 +333,188 @@ fn parse_name(attrs: &[Attribute]) -> Result<Option<String>, String> {
357
333
  .iter()
358
334
  .filter(|attr| attr.path().is_ident("name"))
359
335
  .at_most_one()
360
- .map_err(|_| "multiple name attributes specified")?
336
+ .map_err(|e| format!("multiple name attributes specified: {}", e))?
361
337
  .map(|attr| attr.parse_args::<syn::LitStr>().map(|lit| lit.value()))
362
338
  .transpose()
363
339
  .map_err(|e| format!("failed to parse name attribute: {}", e))
364
340
  }
365
341
 
366
342
  fn parse_no_ttl_extension(attrs: &[Attribute]) -> Result<bool, String> {
367
- Ok(attrs
343
+ let attr = attrs
368
344
  .iter()
369
345
  .filter(|attr| attr.path().is_ident("no_ttl_extension"))
370
346
  .at_most_one()
371
- .map_err(|_| "multiple #[no_ttl_extension] attributes specified")?
372
- .is_some())
347
+ .map_err(|e| format!("multiple #[no_ttl_extension] attributes specified: {}", e))?;
348
+
349
+ // Reject `#[no_ttl_extension(...)]` / `#[no_ttl_extension = ...]`
350
+ match attr {
351
+ None => Ok(false),
352
+ Some(attr) if matches!(attr.meta, Meta::Path(_)) => Ok(true),
353
+ Some(_) => Err("#[no_ttl_extension] does not accept arguments".to_string()),
354
+ }
355
+ }
356
+
357
+ // ============================================================================
358
+ // Test-only Functions
359
+ // ============================================================================
360
+
361
+ #[cfg(test)]
362
+ pub(crate) mod test {
363
+ use super::*;
364
+
365
+ // ========================================================================
366
+ // VariantConfigInfo - wrapper struct for test access
367
+ // ========================================================================
368
+
369
+ /// Test-only wrapper struct exposing VariantConfig data without exposing the type.
370
+ #[derive(Debug, Clone)]
371
+ pub struct VariantConfigInfo {
372
+ pub name: String,
373
+ pub kind_name: String,
374
+ pub value_type: String,
375
+ pub has_default: bool,
376
+ pub auto_ttl: bool,
377
+ }
378
+
379
+ // ========================================================================
380
+ // StorageKind wrapper functions
381
+ // ========================================================================
382
+
383
+ /// Returns the name for Instance storage kind.
384
+ pub fn storage_kind_instance_name() -> &'static str {
385
+ StorageKind::Instance.name()
386
+ }
387
+
388
+ /// Returns the name for Persistent storage kind.
389
+ pub fn storage_kind_persistent_name() -> &'static str {
390
+ StorageKind::Persistent.name()
391
+ }
392
+
393
+ /// Returns the name for Temporary storage kind.
394
+ pub fn storage_kind_temporary_name() -> &'static str {
395
+ StorageKind::Temporary.name()
396
+ }
397
+
398
+ /// Returns the accessor TokenStream for Instance storage kind.
399
+ pub fn storage_kind_instance_accessor() -> TokenStream {
400
+ StorageKind::Instance.accessor()
401
+ }
402
+
403
+ /// Returns the accessor TokenStream for Persistent storage kind.
404
+ pub fn storage_kind_persistent_accessor() -> TokenStream {
405
+ StorageKind::Persistent.accessor()
406
+ }
407
+
408
+ /// Returns the accessor TokenStream for Temporary storage kind.
409
+ pub fn storage_kind_temporary_accessor() -> TokenStream {
410
+ StorageKind::Temporary.accessor()
411
+ }
412
+
413
+ // ========================================================================
414
+ // VariantConfig wrapper functions
415
+ // ========================================================================
416
+
417
+ /// Gets VariantConfig info from a Variant.
418
+ pub fn get_variant_config_for_test(variant: &Variant) -> Result<VariantConfigInfo, String> {
419
+ VariantConfig::try_from(variant).map(|c| {
420
+ let value_type = c.value_type;
421
+ VariantConfigInfo {
422
+ name: c.name,
423
+ kind_name: c.kind.name().to_string(),
424
+ value_type: quote!(#value_type).to_string(),
425
+ has_default: c.default_value.is_some(),
426
+ auto_ttl: c.auto_ttl,
427
+ }
428
+ })
429
+ }
430
+
431
+ /// Gets method names from a Variant as strings.
432
+ pub fn get_variant_method_names_for_test(
433
+ variant: &Variant,
434
+ ) -> Result<(String, String, String, String, String, String), String> {
435
+ VariantConfig::try_from(variant).map(|c| {
436
+ let (getter, setter, remover, set_or_remove, has, ttl_extender) = c.method_names();
437
+ (
438
+ getter.to_string(),
439
+ setter.to_string(),
440
+ remover.to_string(),
441
+ set_or_remove.to_string(),
442
+ has.to_string(),
443
+ ttl_extender.to_string(),
444
+ )
445
+ })
446
+ }
447
+
448
+ // ========================================================================
449
+ // parse_storage_type wrapper - returns kind name instead of enum
450
+ // ========================================================================
451
+
452
+ /// Test-only wrapper for parse_storage_type that returns kind name as string.
453
+ pub fn parse_storage_type_for_test(attrs: &[Attribute]) -> Result<(String, Type), String> {
454
+ parse_storage_type(attrs).map(|(kind, ty)| (kind.name().to_string(), ty))
455
+ }
456
+
457
+ // ========================================================================
458
+ // Other wrapper functions
459
+ // ========================================================================
460
+
461
+ /// Test-only wrapper for is_primitive_type.
462
+ pub fn is_primitive_type_for_test(ty: &Type) -> bool {
463
+ is_primitive_type(ty)
464
+ }
465
+
466
+ /// Test-only wrapper for extract_fields.
467
+ pub fn extract_fields_for_test(variant: &Variant) -> Vec<(&Ident, &Type)> {
468
+ extract_fields(variant)
469
+ }
470
+
471
+ /// Test-only wrapper for gen_params.
472
+ pub fn gen_params_for_test(variant: &Variant) -> TokenStream {
473
+ gen_params(variant)
474
+ }
475
+
476
+ /// Test-only wrapper for gen_args.
477
+ pub fn gen_args_for_test(variant: &Variant) -> TokenStream {
478
+ gen_args(variant)
479
+ }
480
+
481
+ /// Test-only wrapper for gen_key.
482
+ pub fn gen_key_for_test(enum_name: &Ident, variant: &Variant) -> TokenStream {
483
+ gen_key(enum_name, variant)
484
+ }
485
+
486
+ /// Test-only wrapper for gen_enum_variant.
487
+ pub fn gen_enum_variant_for_test(variant: &Variant) -> TokenStream {
488
+ gen_enum_variant(variant)
489
+ }
490
+
491
+ /// Test-only wrapper for gen_accessor_methods.
492
+ pub fn gen_accessor_methods_for_test(enum_name: &Ident, variant: &Variant) -> TokenStream {
493
+ gen_accessor_methods(enum_name, variant)
494
+ }
495
+
496
+ /// Test-only wrapper for validate_attrs.
497
+ pub fn validate_attrs_for_test(attrs: &[Attribute], variant_ident: &Ident) -> Result<(), String> {
498
+ validate_attrs(attrs, variant_ident)
499
+ }
500
+
501
+ /// Test-only wrapper for parse_default.
502
+ pub fn parse_default_for_test(attrs: &[Attribute]) -> Result<Option<Expr>, String> {
503
+ parse_default(attrs)
504
+ }
505
+
506
+ /// Test-only wrapper for parse_name.
507
+ pub fn parse_name_for_test(attrs: &[Attribute]) -> Result<Option<String>, String> {
508
+ parse_name(attrs)
509
+ }
510
+
511
+ /// Test-only wrapper for parse_no_ttl_extension.
512
+ pub fn parse_no_ttl_extension_for_test(attrs: &[Attribute]) -> Result<bool, String> {
513
+ parse_no_ttl_extension(attrs)
514
+ }
515
+
516
+ /// Returns the list of known attributes for testing.
517
+ pub fn known_attrs_for_test() -> &'static [&'static str] {
518
+ KNOWN_ATTRS
519
+ }
373
520
  }
@@ -1,7 +1,7 @@
1
1
  use proc_macro2::TokenStream;
2
2
  use quote::quote;
3
3
 
4
- use crate::tests::test_helpers::{assert_panics_contains, non_struct_item_inputs};
4
+ use crate::tests::test_helpers::{assert_panics_contains, filter_item_inputs_excluding_labels};
5
5
 
6
6
  // ============================================
7
7
  // Snapshot Test: Ownable Code Generation
@@ -15,11 +15,29 @@ fn snapshot_generated_ownable_code() {
15
15
  let result = crate::auth::generate_ownable_impl(input);
16
16
  let formatted = prettyplease::unparse(&syn::parse2::<syn::File>(result).expect("failed to parse generated code"));
17
17
 
18
- insta::assert_snapshot!(formatted);
18
+ let input = quote! {
19
+ #[derive(Clone, Debug)]
20
+ pub struct MyContract<T>
21
+ where
22
+ T: Clone,
23
+ {
24
+ pub value: T,
25
+ }
26
+ };
27
+ let result = crate::auth::generate_ownable_impl(input);
28
+ let formatted_with_generics_and_fields =
29
+ prettyplease::unparse(&syn::parse2::<syn::File>(result).expect("failed to parse generated code"));
30
+
31
+ let combined = format!(
32
+ "// === Unit struct ===\n\n{}\n\n// === Generics + fields ===\n\n{}",
33
+ formatted, formatted_with_generics_and_fields
34
+ );
35
+
36
+ insta::assert_snapshot!(combined);
19
37
  }
20
38
 
21
39
  // ============================================
22
- // Snapshot Test: Multisig Code Generation
40
+ // Snapshot Test: MultiSig Code Generation
23
41
  // ============================================
24
42
 
25
43
  #[test]
@@ -30,7 +48,20 @@ fn snapshot_generated_multisig_code() {
30
48
  let result = crate::auth::generate_multisig_impl(input);
31
49
  let formatted = prettyplease::unparse(&syn::parse2::<syn::File>(result).expect("failed to parse generated code"));
32
50
 
33
- insta::assert_snapshot!(formatted);
51
+ let input = quote! {
52
+ #[derive(Copy, Clone)]
53
+ pub struct MyContract(pub u32);
54
+ };
55
+ let result = crate::auth::generate_multisig_impl(input);
56
+ let formatted_with_tuple_struct =
57
+ prettyplease::unparse(&syn::parse2::<syn::File>(result).expect("failed to parse generated code"));
58
+
59
+ let combined = format!(
60
+ "// === Unit struct ===\n\n{}\n\n// === Tuple struct ===\n\n{}",
61
+ formatted, formatted_with_tuple_struct
62
+ );
63
+
64
+ insta::assert_snapshot!(combined);
34
65
  }
35
66
 
36
67
  // ============================================
@@ -98,13 +129,33 @@ fn test_only_auth_inserts_correct_code_at_the_beginning() {
98
129
  let test_cases = vec![
99
130
  ("Env by value", quote! { pub fn f(my_custom_env: Env) {} }, "&my_custom_env"),
100
131
  ("Env not first param (ref)", quote! { pub fn f(x: u32, my_custom_env: &Env) {} }, "my_custom_env"),
132
+ ("Env after receiver", quote! { pub fn f(&self, my_custom_env: &Env) {} }, "my_custom_env"),
133
+ ("Env after mut receiver", quote! { pub fn f(&mut self, my_custom_env: &Env) {} }, "my_custom_env"),
134
+ ("Env after value receiver", quote! { pub fn f(self, my_custom_env: &Env) {} }, "my_custom_env"),
135
+ ("Env after mut value receiver", quote! { pub fn f(mut self, my_custom_env: &Env) {} }, "my_custom_env"),
136
+ ("Env with lifetime", quote! { pub fn f<'a>(my_custom_env: &'a Env) {} }, "my_custom_env"),
137
+ ("Env with mut ref", quote! { pub fn f(my_custom_env: &mut Env) {} }, "my_custom_env"),
138
+ ("Env with mut binding", quote! { pub fn f(mut my_custom_env: Env) {} }, "&my_custom_env"),
139
+ ("Ref Env with mut binding", quote! { pub fn f(mut my_custom_env: &Env) {} }, "my_custom_env"),
101
140
  (
102
141
  "Qualified path (soroban_sdk::Env)",
103
142
  quote! { pub fn f(my_custom_env: soroban_sdk::Env) {} },
104
143
  "&my_custom_env",
105
144
  ),
106
145
  ("Reference to qualified path", quote! { pub fn f(my_custom_env: &soroban_sdk::Env) {} }, "my_custom_env"),
146
+ (
147
+ "Leading :: qualified path (::soroban_sdk::Env)",
148
+ quote! { pub fn f(my_custom_env: ::soroban_sdk::Env) {} },
149
+ "&my_custom_env",
150
+ ),
151
+ ("Leading :: ref qualified path", quote! { pub fn f(my_custom_env: &::soroban_sdk::Env) {} }, "my_custom_env"),
152
+ (
153
+ "Mut reference to qualified path",
154
+ quote! { pub fn f(my_custom_env: &mut soroban_sdk::Env) {} },
155
+ "my_custom_env",
156
+ ),
107
157
  ("Nested reference (&&Env)", quote! { pub fn f(my_custom_env: &&Env) {} }, "my_custom_env"),
158
+ ("Multiple Env params picks first", quote! { pub fn f(first_env: Env, second_env: Env) {} }, "&first_env"),
108
159
  ];
109
160
 
110
161
  for (description, input, expected_env_ref) in test_cases {
@@ -125,6 +176,11 @@ fn test_only_auth_requires_env_param() {
125
176
  ("wildcard pattern", quote! { pub fn admin_action(_: &Env) {} }),
126
177
  // Struct destructuring pattern is not supported
127
178
  ("struct pattern", quote! { pub fn admin_action(Env { .. }: Env) {} }),
179
+ // Non-Env wrapper/container types are not recognized as Env params.
180
+ ("Option<Env>", quote! { pub fn admin_action(env: Option<Env>) {} }),
181
+ ("Option<&Env>", quote! { pub fn admin_action(env: Option<&Env>) {} }),
182
+ ("Vec<Env>", quote! { pub fn admin_action(env: Vec<Env>) {} }),
183
+ ("Box<Env>", quote! { pub fn admin_action(env: Box<Env>) {} }),
128
184
  ];
129
185
 
130
186
  for (case, input) in cases {
@@ -134,13 +190,26 @@ fn test_only_auth_requires_env_param() {
134
190
  }
135
191
  }
136
192
 
193
+ // ============================================
194
+ // Error Cases: only_auth macro non-function input
195
+ // ============================================
196
+
197
+ #[test]
198
+ fn test_only_auth_rejects_non_function_inputs() {
199
+ for (case, input) in filter_item_inputs_excluding_labels(&["function"]) {
200
+ assert_panics_contains(case, "failed to parse function", || {
201
+ crate::auth::prepend_only_auth_check(input.clone());
202
+ });
203
+ }
204
+ }
205
+
137
206
  // ============================================
138
207
  // Error Cases: ownable macro non-struct input
139
208
  // ============================================
140
209
 
141
210
  #[test]
142
211
  fn test_ownable_rejects_non_struct_inputs() {
143
- for (case, input) in non_struct_item_inputs() {
212
+ for (case, input) in filter_item_inputs_excluding_labels(&["struct"]) {
144
213
  assert_panics_contains(case, "failed to parse struct", || {
145
214
  crate::auth::generate_ownable_impl(input.clone());
146
215
  });
@@ -153,7 +222,7 @@ fn test_ownable_rejects_non_struct_inputs() {
153
222
 
154
223
  #[test]
155
224
  fn test_multisig_rejects_non_struct_inputs() {
156
- for (case, input) in non_struct_item_inputs() {
225
+ for (case, input) in filter_item_inputs_excluding_labels(&["struct"]) {
157
226
  assert_panics_contains(case, "failed to parse struct", || {
158
227
  crate::auth::generate_multisig_impl(input.clone());
159
228
  });