@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
@@ -0,0 +1,39 @@
1
+ //! Unit tests for the `StorageKind` enum methods via wrapper functions.
2
+
3
+ use crate::storage::test::{
4
+ storage_kind_instance_accessor, storage_kind_instance_name, storage_kind_persistent_accessor,
5
+ storage_kind_persistent_name, storage_kind_temporary_accessor, storage_kind_temporary_name,
6
+ };
7
+
8
+ #[test]
9
+ fn test_instance_name() {
10
+ assert_eq!(storage_kind_instance_name(), "instance");
11
+ }
12
+
13
+ #[test]
14
+ fn test_persistent_name() {
15
+ assert_eq!(storage_kind_persistent_name(), "persistent");
16
+ }
17
+
18
+ #[test]
19
+ fn test_temporary_name() {
20
+ assert_eq!(storage_kind_temporary_name(), "temporary");
21
+ }
22
+
23
+ #[test]
24
+ fn test_instance_accessor() {
25
+ let accessor = storage_kind_instance_accessor();
26
+ assert_eq!(accessor.to_string(), "env . storage () . instance ()");
27
+ }
28
+
29
+ #[test]
30
+ fn test_persistent_accessor() {
31
+ let accessor = storage_kind_persistent_accessor();
32
+ assert_eq!(accessor.to_string(), "env . storage () . persistent ()");
33
+ }
34
+
35
+ #[test]
36
+ fn test_temporary_accessor() {
37
+ let accessor = storage_kind_temporary_accessor();
38
+ assert_eq!(accessor.to_string(), "env . storage () . temporary ()");
39
+ }
@@ -0,0 +1,25 @@
1
+ //! Shared helpers for storage macro unit tests.
2
+ //!
3
+ //! Keep these helpers scoped to the storage test module to avoid leaking
4
+ //! test-only utilities across the crate.
5
+ /// Parse the first `syn::Variant` from a single-variant `enum` token stream.
6
+ pub(in crate::tests::storage) fn parse_variant(input: proc_macro2::TokenStream) -> syn::Variant {
7
+ let item_enum: syn::ItemEnum = syn::parse2(input).expect("failed to parse enum");
8
+ item_enum.variants.into_iter().next().expect("no variant found")
9
+ }
10
+
11
+ /// Parse the attributes from the first variant in a single-variant `enum` token stream.
12
+ pub(in crate::tests::storage) fn parse_attrs(input: proc_macro2::TokenStream) -> Vec<syn::Attribute> {
13
+ let item_enum: syn::ItemEnum = syn::parse2(input).expect("failed to parse enum");
14
+ item_enum.variants.into_iter().next().expect("no variant found").attrs
15
+ }
16
+
17
+ /// Normalize whitespace in a `TokenStream` for stable string comparisons.
18
+ pub(in crate::tests::storage) fn normalize(ts: proc_macro2::TokenStream) -> String {
19
+ ts.to_string().split_whitespace().collect::<Vec<_>>().join(" ")
20
+ }
21
+
22
+ /// Convenience for tests building input via `format!(...)`.
23
+ pub(in crate::tests::storage) fn parse_variant_str(input: &str) -> syn::Variant {
24
+ parse_variant(input.parse().expect("failed to parse token stream"))
25
+ }
@@ -0,0 +1,138 @@
1
+ //! Unit tests for the `validate_attrs` function.
2
+
3
+ use crate::storage::test::{known_attrs_for_test, validate_attrs_for_test};
4
+ use quote::{format_ident, quote};
5
+
6
+ use super::test_setup::parse_attrs;
7
+
8
+ #[test]
9
+ fn test_accepts_known_attributes() {
10
+ let known_attrs = known_attrs_for_test();
11
+
12
+ for attr_name in known_attrs {
13
+ if *attr_name == "doc" {
14
+ // doc attribute uses /// syntax
15
+ let attrs = parse_attrs(quote! {
16
+ enum Test {
17
+ /// This is a doc comment
18
+ #[persistent(u32)]
19
+ Variant,
20
+ }
21
+ });
22
+ let variant_ident = format_ident!("Variant");
23
+ assert!(validate_attrs_for_test(&attrs, &variant_ident).is_ok(), "doc attribute should be accepted");
24
+ } else {
25
+ // Other attributes use #[attr] or #[attr(...)] syntax
26
+ let input = match *attr_name {
27
+ "instance" => quote! {
28
+ enum Test {
29
+ #[instance(u32)]
30
+ Variant,
31
+ }
32
+ },
33
+ "persistent" => quote! {
34
+ enum Test {
35
+ #[persistent(u32)]
36
+ Variant,
37
+ }
38
+ },
39
+ "temporary" => quote! {
40
+ enum Test {
41
+ #[temporary(u32)]
42
+ Variant,
43
+ }
44
+ },
45
+ "default" => quote! {
46
+ enum Test {
47
+ #[persistent(u32)]
48
+ #[default(0)]
49
+ Variant,
50
+ }
51
+ },
52
+ "name" => quote! {
53
+ enum Test {
54
+ #[persistent(u32)]
55
+ #[name("custom")]
56
+ Variant,
57
+ }
58
+ },
59
+ "no_ttl_extension" => quote! {
60
+ enum Test {
61
+ #[persistent(u32)]
62
+ #[no_ttl_extension]
63
+ Variant,
64
+ }
65
+ },
66
+ _ => continue,
67
+ };
68
+
69
+ let attrs = parse_attrs(input);
70
+ let variant_ident = format_ident!("Variant");
71
+ assert!(
72
+ validate_attrs_for_test(&attrs, &variant_ident).is_ok(),
73
+ "attribute '{}' should be accepted",
74
+ attr_name
75
+ );
76
+ }
77
+ }
78
+ }
79
+
80
+ #[test]
81
+ fn test_rejects_unknown_attribute() {
82
+ let attrs = parse_attrs(quote! {
83
+ enum Test {
84
+ #[persistent(u32)]
85
+ #[unknown_attr]
86
+ Variant,
87
+ }
88
+ });
89
+ let variant_ident = format_ident!("Variant");
90
+
91
+ let result = validate_attrs_for_test(&attrs, &variant_ident);
92
+ assert!(result.is_err(), "unknown attribute should be rejected");
93
+ let err = result.unwrap_err();
94
+ assert!(
95
+ err.contains("unknown attribute 'unknown_attr' on variant 'Variant'"),
96
+ "error should mention unknown attribute"
97
+ );
98
+ }
99
+
100
+ #[test]
101
+ fn test_accepts_multiple_valid_attributes() {
102
+ let attrs = parse_attrs(quote! {
103
+ enum Test {
104
+ /// Doc comment
105
+ #[persistent(u32)]
106
+ #[default(0)]
107
+ #[name("custom")]
108
+ Variant,
109
+ }
110
+ });
111
+ let variant_ident = format_ident!("Variant");
112
+
113
+ assert!(validate_attrs_for_test(&attrs, &variant_ident).is_ok(), "multiple valid attributes should be accepted");
114
+ }
115
+
116
+ #[test]
117
+ fn test_empty_attrs_is_valid() {
118
+ let attrs: Vec<syn::Attribute> = vec![];
119
+ let variant_ident = format_ident!("Variant");
120
+
121
+ // Empty attrs is valid for validate_attrs (storage type check is separate)
122
+ assert!(validate_attrs_for_test(&attrs, &variant_ident).is_ok());
123
+ }
124
+
125
+ #[test]
126
+ fn test_rejects_path_attribute() {
127
+ let attrs = parse_attrs(quote! {
128
+ enum Test {
129
+ #[persistent(u32)]
130
+ #[some::path::attr]
131
+ Variant,
132
+ }
133
+ });
134
+ let variant_ident = format_ident!("Variant");
135
+
136
+ let result = validate_attrs_for_test(&attrs, &variant_ident);
137
+ assert!(result.is_err(), "path attributes should be rejected");
138
+ }
@@ -0,0 +1,226 @@
1
+ //! Unit tests for the `VariantConfig` struct and its `TryFrom` implementation via wrapper functions.
2
+
3
+ use crate::storage::test::{get_variant_config_for_test, get_variant_method_names_for_test};
4
+ use quote::quote;
5
+
6
+ use super::test_setup::parse_variant;
7
+
8
+ // ============================================================================
9
+ // TryFrom<&Variant> Tests
10
+ // ============================================================================
11
+
12
+ #[test]
13
+ fn test_try_from_instance_variant() {
14
+ let variant = parse_variant(quote! {
15
+ enum Test {
16
+ #[instance(u32)]
17
+ Counter,
18
+ }
19
+ });
20
+
21
+ let config = get_variant_config_for_test(&variant);
22
+ assert!(config.is_ok());
23
+ let config = config.unwrap();
24
+ assert_eq!(config.kind_name, "instance");
25
+ assert_eq!(config.value_type, "u32");
26
+ assert_eq!(config.name, "counter"); // snake_case conversion
27
+ assert!(!config.auto_ttl); // instance storage doesn't have auto TTL
28
+ assert!(!config.has_default);
29
+ }
30
+
31
+ #[test]
32
+ fn test_try_from_persistent_variant() {
33
+ let variant = parse_variant(quote! {
34
+ enum Test {
35
+ #[persistent(Address)]
36
+ Owner,
37
+ }
38
+ });
39
+
40
+ let config = get_variant_config_for_test(&variant);
41
+ assert!(config.is_ok());
42
+ let config = config.unwrap();
43
+ assert_eq!(config.kind_name, "persistent");
44
+ assert_eq!(config.value_type, "Address");
45
+ assert_eq!(config.name, "owner");
46
+ assert!(config.auto_ttl); // persistent has auto TTL by default
47
+ assert!(!config.has_default);
48
+ }
49
+
50
+ #[test]
51
+ fn test_try_from_temporary_variant() {
52
+ let variant = parse_variant(quote! {
53
+ enum Test {
54
+ #[temporary(bool)]
55
+ Flag,
56
+ }
57
+ });
58
+
59
+ let config = get_variant_config_for_test(&variant);
60
+ assert!(config.is_ok());
61
+ let config = config.unwrap();
62
+ assert_eq!(config.kind_name, "temporary");
63
+ assert_eq!(config.value_type, "bool");
64
+ assert_eq!(config.name, "flag");
65
+ assert!(!config.auto_ttl); // temporary doesn't have auto TTL
66
+ assert!(!config.has_default);
67
+ }
68
+
69
+ #[test]
70
+ fn test_try_from_with_default() {
71
+ let variant = parse_variant(quote! {
72
+ enum Test {
73
+ #[instance(u32)]
74
+ #[default(0)]
75
+ Counter,
76
+ }
77
+ });
78
+
79
+ let config = get_variant_config_for_test(&variant);
80
+ assert!(config.is_ok());
81
+ let config = config.unwrap();
82
+ assert!(config.has_default);
83
+ }
84
+
85
+ #[test]
86
+ fn test_try_from_with_custom_name() {
87
+ let variant = parse_variant(quote! {
88
+ enum Test {
89
+ #[instance(u32)]
90
+ #[name("custom_name")]
91
+ Counter,
92
+ }
93
+ });
94
+
95
+ let config = get_variant_config_for_test(&variant);
96
+ assert!(config.is_ok());
97
+ let config = config.unwrap();
98
+ assert_eq!(config.name, "custom_name");
99
+ }
100
+
101
+ #[test]
102
+ fn test_try_from_snake_case_conversion() {
103
+ let variant = parse_variant(quote! {
104
+ enum Test {
105
+ #[instance(u32)]
106
+ MyLongVariantName,
107
+ }
108
+ });
109
+
110
+ let config = get_variant_config_for_test(&variant);
111
+ assert!(config.is_ok());
112
+ let config = config.unwrap();
113
+ assert_eq!(config.name, "my_long_variant_name");
114
+ }
115
+
116
+ #[test]
117
+ fn test_try_from_persistent_with_no_ttl_extension() {
118
+ let variant = parse_variant(quote! {
119
+ enum Test {
120
+ #[persistent(u32)]
121
+ #[no_ttl_extension]
122
+ CachedValue,
123
+ }
124
+ });
125
+
126
+ let config = get_variant_config_for_test(&variant);
127
+ assert!(config.is_ok());
128
+ let config = config.unwrap();
129
+ assert_eq!(config.kind_name, "persistent");
130
+ assert!(!config.auto_ttl); // disabled by no_ttl_extension
131
+ }
132
+
133
+ #[test]
134
+ fn test_try_from_error_no_ttl_extension_on_instance() {
135
+ let variant = parse_variant(quote! {
136
+ enum Test {
137
+ #[instance(u32)]
138
+ #[no_ttl_extension]
139
+ Counter,
140
+ }
141
+ });
142
+
143
+ let config = get_variant_config_for_test(&variant);
144
+ assert!(config.is_err());
145
+ let err = config.unwrap_err();
146
+ assert!(err.contains("can only be used with #[persistent"));
147
+ }
148
+
149
+ #[test]
150
+ fn test_try_from_error_no_ttl_extension_on_temporary() {
151
+ let variant = parse_variant(quote! {
152
+ enum Test {
153
+ #[temporary(u32)]
154
+ #[no_ttl_extension]
155
+ TempData,
156
+ }
157
+ });
158
+
159
+ let config = get_variant_config_for_test(&variant);
160
+ assert!(config.is_err());
161
+ let err = config.unwrap_err();
162
+ assert!(err.contains("can only be used with #[persistent"));
163
+ }
164
+
165
+ #[test]
166
+ fn test_try_from_error_unknown_attribute() {
167
+ let variant = parse_variant(quote! {
168
+ enum Test {
169
+ #[persistent(u32)]
170
+ #[unknown_attr]
171
+ Counter,
172
+ }
173
+ });
174
+
175
+ let config = get_variant_config_for_test(&variant);
176
+ assert!(config.is_err());
177
+ let err = config.unwrap_err();
178
+ assert!(err.contains("unknown attribute"));
179
+ }
180
+
181
+ // ============================================================================
182
+ // method_names() Tests
183
+ // ============================================================================
184
+
185
+ #[test]
186
+ fn test_method_names_basic() {
187
+ let variant = parse_variant(quote! {
188
+ enum Test {
189
+ #[instance(u32)]
190
+ Counter,
191
+ }
192
+ });
193
+
194
+ let result = get_variant_method_names_for_test(&variant);
195
+ assert!(result.is_ok());
196
+ let (getter, setter, remover, set_or_remove, has, ttl_extender) = result.unwrap();
197
+
198
+ assert_eq!(getter, "counter");
199
+ assert_eq!(setter, "set_counter");
200
+ assert_eq!(remover, "remove_counter");
201
+ assert_eq!(set_or_remove, "set_or_remove_counter");
202
+ assert_eq!(has, "has_counter");
203
+ assert_eq!(ttl_extender, "extend_counter_ttl");
204
+ }
205
+
206
+ #[test]
207
+ fn test_method_names_with_custom_name() {
208
+ let variant = parse_variant(quote! {
209
+ enum Test {
210
+ #[instance(u32)]
211
+ #[name("custom")]
212
+ Counter,
213
+ }
214
+ });
215
+
216
+ let result = get_variant_method_names_for_test(&variant);
217
+ assert!(result.is_ok());
218
+ let (getter, setter, remover, set_or_remove, has, ttl_extender) = result.unwrap();
219
+
220
+ assert_eq!(getter, "custom");
221
+ assert_eq!(setter, "set_custom");
222
+ assert_eq!(remover, "remove_custom");
223
+ assert_eq!(set_or_remove, "set_or_remove_custom");
224
+ assert_eq!(has, "has_custom");
225
+ assert_eq!(ttl_extender, "extend_custom_ttl");
226
+ }
@@ -22,12 +22,10 @@ where
22
22
  );
23
23
  }
24
24
 
25
- pub(in crate::tests) fn non_struct_item_inputs() -> Vec<(&'static str, proc_macro2::TokenStream)> {
26
- filter_item_inputs_excluding_labels(&["struct"])
27
- }
28
-
29
- pub(in crate::tests) fn non_enum_item_inputs() -> Vec<(&'static str, proc_macro2::TokenStream)> {
30
- filter_item_inputs_excluding_labels(&["enum"])
25
+ pub(in crate::tests) fn filter_item_inputs_excluding_labels(
26
+ excluded: &[&str],
27
+ ) -> Vec<(&'static str, proc_macro2::TokenStream)> {
28
+ item_inputs().into_iter().filter(|(label, _)| !excluded.iter().any(|x| x == label)).collect()
31
29
  }
32
30
 
33
31
  /// Canonical list of syntactically-valid `syn::Item` inputs.
@@ -87,7 +85,3 @@ pub(in crate::tests) fn item_inputs() -> Vec<(&'static str, proc_macro2::TokenSt
87
85
  ("type alias", quote::quote! { type AnAlias = u32; }),
88
86
  ]
89
87
  }
90
-
91
- fn filter_item_inputs_excluding_labels(excluded: &[&str]) -> Vec<(&'static str, proc_macro2::TokenStream)> {
92
- item_inputs().into_iter().filter(|(label, _)| !excluded.iter().any(|x| x == label)).collect()
93
- }
@@ -1,6 +1,6 @@
1
1
  use quote::quote;
2
2
 
3
- use crate::tests::test_helpers::{assert_panics_contains, non_struct_item_inputs};
3
+ use crate::tests::test_helpers::{assert_panics_contains, filter_item_inputs_excluding_labels};
4
4
 
5
5
  // ============================================
6
6
  // Snapshot Test: TtlConfigurable Code Generation
@@ -26,7 +26,7 @@ fn snapshot_generated_ttl_configurable_code() {
26
26
 
27
27
  #[test]
28
28
  fn test_ttl_configurable_rejects_non_struct_inputs() {
29
- for (case, input) in non_struct_item_inputs() {
29
+ for (case, input) in filter_item_inputs_excluding_labels(&["struct"]) {
30
30
  assert_panics_contains(case, "failed to parse struct", || {
31
31
  crate::ttl_configurable::generate_ttl_configurable_impl(input.clone());
32
32
  });
@@ -0,0 +1,32 @@
1
+ use quote::quote;
2
+
3
+ use crate::tests::test_helpers::{assert_panics_contains, filter_item_inputs_excluding_labels};
4
+
5
+ // ============================================
6
+ // Snapshot Test: TtlExtendable Code Generation
7
+ // ============================================
8
+
9
+ #[test]
10
+ fn snapshot_generated_ttl_extendable_code() {
11
+ let input = quote! {
12
+ pub struct MyContract;
13
+ };
14
+
15
+ let result = crate::ttl_extendable::generate_ttl_extendable_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
+ // Error Cases: Non-Struct Input
23
+ // ============================================
24
+
25
+ #[test]
26
+ fn test_ttl_extendable_rejects_non_struct_inputs() {
27
+ for (case, input) in filter_item_inputs_excluding_labels(&["struct"]) {
28
+ assert_panics_contains(case, "failed to parse struct", || {
29
+ crate::ttl_extendable::generate_ttl_extendable_impl(input.clone());
30
+ });
31
+ }
32
+ }
@@ -1,7 +1,49 @@
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
+
6
+ static CARGO_PKG_VERSION_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(());
7
+
8
+ /// Small RAII helper for temporarily mutating a single environment variable in tests.
9
+ ///
10
+ /// Why this exists:
11
+ /// - `generate_upgradeable_impl` reads `CARGO_PKG_VERSION` at runtime to decide whether to emit
12
+ /// `soroban_sdk::contractmeta!(key = "binver", ...)`.
13
+ /// - Tests need to set/unset that env var deterministically and then restore it to avoid polluting
14
+ /// other tests (especially snapshot tests).
15
+ /// - `Drop` guarantees restoration even if the test panics.
16
+ struct EnvVarGuard {
17
+ key: &'static str,
18
+ prev: Option<String>,
19
+ }
20
+
21
+ impl EnvVarGuard {
22
+ /// Captures the current value of `key` (if any) so it can be restored on drop.
23
+ fn new(key: &'static str) -> Self {
24
+ Self { key, prev: std::env::var(key).ok() }
25
+ }
26
+
27
+ /// Sets the environment variable for the duration of this guard's lifetime.
28
+ fn set(&self, value: &str) {
29
+ std::env::set_var(self.key, value);
30
+ }
31
+
32
+ /// Removes the environment variable for the duration of this guard's lifetime.
33
+ fn remove(&self) {
34
+ std::env::remove_var(self.key);
35
+ }
36
+ }
37
+
38
+ impl Drop for EnvVarGuard {
39
+ /// Restores the original env var state captured in `new()`.
40
+ fn drop(&mut self) {
41
+ match &self.prev {
42
+ Some(v) => std::env::set_var(self.key, v),
43
+ None => std::env::remove_var(self.key),
44
+ }
45
+ }
46
+ }
5
47
 
6
48
  // ============================================
7
49
  // Snapshot Test: Upgradeable Code Generation
@@ -9,6 +51,7 @@ use crate::tests::test_helpers::{assert_panics_contains, non_struct_item_inputs}
9
51
 
10
52
  #[test]
11
53
  fn snapshot_generated_upgradeable_code() {
54
+ let _lock = CARGO_PKG_VERSION_LOCK.lock().expect("lock poisoned");
12
55
  let input = quote! {
13
56
  pub struct MyContract;
14
57
  };
@@ -41,13 +84,86 @@ fn snapshot_generated_upgradeable_code() {
41
84
  // Error Cases: upgradeable macro non-struct input
42
85
  // ============================================
43
86
 
87
+ #[test]
88
+ fn test_upgradeable_skips_binver_when_version_is_0_0_0() {
89
+ let _lock = CARGO_PKG_VERSION_LOCK.lock().expect("lock poisoned");
90
+ let guard = EnvVarGuard::new("CARGO_PKG_VERSION");
91
+ guard.set("0.0.0");
92
+
93
+ let input = quote! {
94
+ pub struct MyContract;
95
+ };
96
+ let result = crate::upgradeable::generate_upgradeable_impl(TokenStream::new(), input);
97
+ let result_str = result.to_string();
98
+
99
+ assert!(
100
+ !result_str.contains("contractmeta ! (key = \"binver\""),
101
+ "should skip binver contractmeta when version is 0.0.0. Got: {}",
102
+ result_str
103
+ );
104
+ }
105
+
106
+ #[test]
107
+ fn test_upgradeable_skips_binver_when_version_is_missing() {
108
+ let _lock = CARGO_PKG_VERSION_LOCK.lock().expect("lock poisoned");
109
+ let guard = EnvVarGuard::new("CARGO_PKG_VERSION");
110
+ guard.remove();
111
+
112
+ let input = quote! {
113
+ pub struct MyContract;
114
+ };
115
+ let result = crate::upgradeable::generate_upgradeable_impl(TokenStream::new(), input);
116
+ let result_str = result.to_string();
117
+
118
+ assert!(
119
+ !result_str.contains("contractmeta ! (key = \"binver\""),
120
+ "should skip binver contractmeta when version env is missing. Got: {}",
121
+ result_str
122
+ );
123
+ }
124
+
44
125
  #[test]
45
126
  fn test_upgradeable_rejects_non_struct_inputs() {
46
127
  let attr = TokenStream::new();
47
- for (case, input) in non_struct_item_inputs() {
128
+ for (case, input) in filter_item_inputs_excluding_labels(&["struct"]) {
48
129
  let attr_clone = attr.clone();
49
130
  assert_panics_contains(case, "failed to parse struct", || {
50
131
  crate::upgradeable::generate_upgradeable_impl(attr_clone, input.clone());
51
132
  });
52
133
  }
53
134
  }
135
+
136
+ #[test]
137
+ fn test_upgradeable_emits_binver_when_version_is_set() {
138
+ let _lock = CARGO_PKG_VERSION_LOCK.lock().expect("lock poisoned");
139
+ let guard = EnvVarGuard::new("CARGO_PKG_VERSION");
140
+ guard.set("9.9.9");
141
+
142
+ let input = quote! {
143
+ pub struct MyContract;
144
+ };
145
+ let result = crate::upgradeable::generate_upgradeable_impl(TokenStream::new(), input);
146
+ let result_str = result.to_string();
147
+
148
+ assert!(
149
+ result_str.contains("contractmeta ! (key = \"binver\" , val = \"9.9.9\""),
150
+ "should emit binver contractmeta when version is set. Got: {}",
151
+ result_str
152
+ );
153
+ }
154
+
155
+ #[test]
156
+ fn test_upgradeable_rejects_invalid_config_table_driven() {
157
+ let input = quote! { pub struct MyContract; };
158
+ let cases: Vec<(&str, TokenStream, &str)> = vec![
159
+ ("unknown option", quote! { not_migration }, "failed to parse upgradeable config"),
160
+ ("invalid attr syntax", quote! { 123 }, "failed to parse upgradeable config"),
161
+ ("extra tokens", quote! { no_migration, extra }, "failed to parse upgradeable config"),
162
+ ];
163
+
164
+ for (case, attr, expected) in cases {
165
+ assert_panics_contains(case, expected, || {
166
+ crate::upgradeable::generate_upgradeable_impl(attr.clone(), input.clone());
167
+ });
168
+ }
169
+ }
@@ -8,10 +8,7 @@ use syn::ItemStruct;
8
8
  ///
9
9
  /// This macro implements `TtlConfigurable` using the trait's default methods (which include auth).
10
10
  ///
11
- /// The contract must also implement `Auth` (typically via `#[ownable]` or `Multisig`).
12
- ///
13
- /// For manual TTL extension functionality, use the `#[ttl_extendable]` macro which provides
14
- /// the `extend_instance_ttl` function.
11
+ /// The contract must also implement `Auth` (typically via `#[ownable]` or `#[multisig]`).
15
12
  pub fn generate_ttl_configurable_impl(input: TokenStream) -> TokenStream {
16
13
  let item_struct: ItemStruct = syn::parse2(input).unwrap_or_else(|e| panic!("failed to parse struct: {}", e));
17
14
  let name = &item_struct.ident;