@layerzerolabs/protocol-stellar-v2 0.2.22 → 0.2.24

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 +331 -261
  2. package/.turbo/turbo-lint.log +262 -192
  3. package/.turbo/turbo-test.log +1696 -1368
  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 +667 -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
@@ -11,6 +11,8 @@ use soroban_sdk::{
11
11
  Address, Env, Error, IntoVal,
12
12
  };
13
13
  use utils::errors::OwnableError;
14
+ use utils::ownable::{OwnershipRenounced, OwnershipTransferred};
15
+ use utils::testing_utils::assert_eq_event;
14
16
 
15
17
  #[test]
16
18
  fn transfer_requires_auth() {
@@ -20,6 +22,7 @@ fn transfer_requires_auth() {
20
22
 
21
23
  let owner = Address::generate(&env);
22
24
  let new_owner = Address::generate(&env);
25
+ let third_owner = Address::generate(&env);
23
26
 
24
27
  client.init(&owner);
25
28
 
@@ -43,8 +46,51 @@ fn transfer_requires_auth() {
43
46
  }])
44
47
  .transfer_ownership(&new_owner);
45
48
 
49
+ assert_eq_event(
50
+ &env,
51
+ &contract_id,
52
+ OwnershipTransferred { old_owner: owner.clone(), new_owner: new_owner.clone() },
53
+ );
54
+
46
55
  // Owner should be updated
47
- assert_eq!(client.owner(), Some(new_owner));
56
+ assert_eq!(client.owner(), Some(new_owner.clone()));
57
+
58
+ // Old owner should no longer be able to transfer ownership (even with auth).
59
+ let old_owner_transfer = client
60
+ .mock_auths(&[MockAuth {
61
+ address: &owner,
62
+ invoke: &MockAuthInvoke {
63
+ contract: &contract_id,
64
+ fn_name: "transfer_ownership",
65
+ args: (&third_owner,).into_val(&env),
66
+ sub_invokes: &[],
67
+ },
68
+ }])
69
+ .try_transfer_ownership(&third_owner);
70
+ assert_eq!(
71
+ old_owner_transfer.unwrap_err().unwrap(),
72
+ Error::from_type_and_code(ScErrorType::Context, ScErrorCode::InvalidAction)
73
+ );
74
+
75
+ // New owner can transfer again.
76
+ client
77
+ .mock_auths(&[MockAuth {
78
+ address: &new_owner,
79
+ invoke: &MockAuthInvoke {
80
+ contract: &contract_id,
81
+ fn_name: "transfer_ownership",
82
+ args: (&third_owner,).into_val(&env),
83
+ sub_invokes: &[],
84
+ },
85
+ }])
86
+ .transfer_ownership(&third_owner);
87
+
88
+ assert_eq_event(
89
+ &env,
90
+ &contract_id,
91
+ OwnershipTransferred { old_owner: new_owner.clone(), new_owner: third_owner.clone() },
92
+ );
93
+ assert_eq!(client.owner(), Some(third_owner));
48
94
  }
49
95
 
50
96
  #[test]
@@ -54,6 +100,7 @@ fn renounce_clears_owner() {
54
100
  let client = TestContractClient::new(&env, &contract_id);
55
101
 
56
102
  let owner = Address::generate(&env);
103
+ let not_owner = Address::generate(&env);
57
104
  client.init(&owner);
58
105
  assert_eq!(client.owner(), Some(owner.clone()));
59
106
 
@@ -64,6 +111,23 @@ fn renounce_clears_owner() {
64
111
  Error::from_type_and_code(ScErrorType::Context, ScErrorCode::InvalidAction)
65
112
  );
66
113
 
114
+ // Wrong-address auth should also fail (auth must be provided by the current owner).
115
+ let wrong_auth = client
116
+ .mock_auths(&[MockAuth {
117
+ address: &not_owner,
118
+ invoke: &MockAuthInvoke {
119
+ contract: &contract_id,
120
+ fn_name: "renounce_ownership",
121
+ args: ().into_val(&env),
122
+ sub_invokes: &[],
123
+ },
124
+ }])
125
+ .try_renounce_ownership();
126
+ assert_eq!(
127
+ wrong_auth.unwrap_err().unwrap(),
128
+ Error::from_type_and_code(ScErrorType::Context, ScErrorCode::InvalidAction)
129
+ );
130
+
67
131
  // Renounce ownership (authorized by current owner)
68
132
  client
69
133
  .mock_auths(&[MockAuth {
@@ -77,9 +141,14 @@ fn renounce_clears_owner() {
77
141
  }])
78
142
  .renounce_ownership();
79
143
 
144
+ assert_eq_event(&env, &contract_id, OwnershipRenounced { old_owner: owner.clone() });
145
+
80
146
  // Owner should be None after renouncing
81
147
  assert_eq!(client.owner(), None);
82
148
 
149
+ // Renouncing again should fail because there is no owner anymore.
150
+ assert_eq!(client.try_renounce_ownership().unwrap_err().unwrap(), OwnableError::OwnerNotSet.into());
151
+
83
152
  // All owner-protected operations should now fail
84
153
  let guarded_result = client
85
154
  .mock_auths(&[MockAuth {
@@ -0,0 +1,219 @@
1
+ // Runtime tests: 2-step ownership transfer behavior (`propose_ownership_transfer` + `accept_ownership`).
2
+ //
3
+ // Ownable supports a safer two-step flow using temporary storage with TTL. These tests ensure
4
+ // the macro-exported contract entrypoints are wired and behave correctly at runtime.
5
+
6
+ use super::{TestContract, TestContractClient};
7
+ use soroban_sdk::{
8
+ testutils::{storage::Temporary as _, Address as _, Ledger as _, MockAuth, MockAuthInvoke},
9
+ Address, Env, IntoVal,
10
+ };
11
+ use utils::errors::OwnableError;
12
+ use utils::ownable::{OwnableStorage, OwnershipTransferred, OwnershipTransferring};
13
+ use utils::testing_utils::assert_eq_event;
14
+
15
+ #[test]
16
+ fn propose_requires_owner_auth() {
17
+ let env = Env::default();
18
+ let contract_id = env.register(TestContract, ());
19
+ let client = TestContractClient::new(&env, &contract_id);
20
+
21
+ let owner = Address::generate(&env);
22
+ let new_owner = Address::generate(&env);
23
+ client.init(&owner);
24
+
25
+ // No auth provided -> should fail at require_auth.
26
+ let ttl = 10u32;
27
+ let res = client.try_propose_ownership_transfer(&new_owner, &ttl);
28
+ assert_eq!(
29
+ res.err().unwrap().ok().unwrap(),
30
+ soroban_sdk::Error::from_type_and_code(soroban_sdk::xdr::ScErrorType::Context, soroban_sdk::xdr::ScErrorCode::InvalidAction)
31
+ );
32
+ }
33
+
34
+ #[test]
35
+ fn propose_rejects_invalid_ttl() {
36
+ let env = Env::default();
37
+ let contract_id = env.register(TestContract, ());
38
+ let client = TestContractClient::new(&env, &contract_id);
39
+
40
+ let owner = Address::generate(&env);
41
+ let new_owner = Address::generate(&env);
42
+ client.init(&owner);
43
+
44
+ let ttl = env.storage().max_ttl().saturating_add(1);
45
+ let res = client
46
+ .mock_auths(&[MockAuth {
47
+ address: &owner,
48
+ invoke: &MockAuthInvoke {
49
+ contract: &contract_id,
50
+ fn_name: "propose_ownership_transfer",
51
+ args: (&new_owner, &ttl).into_val(&env),
52
+ sub_invokes: &[],
53
+ },
54
+ }])
55
+ .try_propose_ownership_transfer(&new_owner, &ttl);
56
+ assert_eq!(res.err().unwrap().ok().unwrap(), OwnableError::InvalidTtl.into());
57
+ assert_eq!(client.pending_owner(), None);
58
+ }
59
+
60
+ #[test]
61
+ fn propose_and_accept_transfers_ownership() {
62
+ let env = Env::default();
63
+ let contract_id = env.register(TestContract, ());
64
+ let client = TestContractClient::new(&env, &contract_id);
65
+
66
+ let owner = Address::generate(&env);
67
+ let new_owner = Address::generate(&env);
68
+ client.init(&owner);
69
+
70
+ // Propose transfer (owner auth required).
71
+ let ttl = 10u32;
72
+ client
73
+ .mock_auths(&[MockAuth {
74
+ address: &owner,
75
+ invoke: &MockAuthInvoke {
76
+ contract: &contract_id,
77
+ fn_name: "propose_ownership_transfer",
78
+ args: (&new_owner, &ttl).into_val(&env),
79
+ sub_invokes: &[],
80
+ },
81
+ }])
82
+ .propose_ownership_transfer(&new_owner, &ttl);
83
+
84
+ assert_eq_event(
85
+ &env,
86
+ &contract_id,
87
+ OwnershipTransferring { old_owner: owner.clone(), new_owner: new_owner.clone(), ttl },
88
+ );
89
+ assert_eq!(client.pending_owner(), Some(new_owner.clone()));
90
+ assert_eq!(client.owner(), Some(owner.clone()));
91
+
92
+ // Accept transfer (pending owner auth required).
93
+ client
94
+ .mock_auths(&[MockAuth {
95
+ address: &new_owner,
96
+ invoke: &MockAuthInvoke {
97
+ contract: &contract_id,
98
+ fn_name: "accept_ownership",
99
+ args: ().into_val(&env),
100
+ sub_invokes: &[],
101
+ },
102
+ }])
103
+ .accept_ownership();
104
+
105
+ assert_eq_event(
106
+ &env,
107
+ &contract_id,
108
+ OwnershipTransferred { old_owner: owner.clone(), new_owner: new_owner.clone() },
109
+ );
110
+ assert_eq!(client.pending_owner(), None);
111
+ assert_eq!(client.owner(), Some(new_owner));
112
+ }
113
+
114
+ #[test]
115
+ fn pending_transfer_blocks_single_step_transfer_and_renounce() {
116
+ let env = Env::default();
117
+ let contract_id = env.register(TestContract, ());
118
+ let client = TestContractClient::new(&env, &contract_id);
119
+
120
+ let owner = Address::generate(&env);
121
+ let pending = Address::generate(&env);
122
+ let other = Address::generate(&env);
123
+ client.init(&owner);
124
+
125
+ let ttl = 10u32;
126
+ client
127
+ .mock_auths(&[MockAuth {
128
+ address: &owner,
129
+ invoke: &MockAuthInvoke {
130
+ contract: &contract_id,
131
+ fn_name: "propose_ownership_transfer",
132
+ args: (&pending, &ttl).into_val(&env),
133
+ sub_invokes: &[],
134
+ },
135
+ }])
136
+ .propose_ownership_transfer(&pending, &ttl);
137
+
138
+ // With owner auth, immediate transfer should fail due to TransferInProgress.
139
+ let transfer = client
140
+ .mock_auths(&[MockAuth {
141
+ address: &owner,
142
+ invoke: &MockAuthInvoke {
143
+ contract: &contract_id,
144
+ fn_name: "transfer_ownership",
145
+ args: (&other,).into_val(&env),
146
+ sub_invokes: &[],
147
+ },
148
+ }])
149
+ .try_transfer_ownership(&other);
150
+ assert_eq!(transfer.err().unwrap().ok().unwrap(), OwnableError::TransferInProgress.into());
151
+
152
+ // With owner auth, renounce should also fail due to TransferInProgress.
153
+ let renounce = client
154
+ .mock_auths(&[MockAuth {
155
+ address: &owner,
156
+ invoke: &MockAuthInvoke {
157
+ contract: &contract_id,
158
+ fn_name: "renounce_ownership",
159
+ args: ().into_val(&env),
160
+ sub_invokes: &[],
161
+ },
162
+ }])
163
+ .try_renounce_ownership();
164
+ assert_eq!(renounce.err().unwrap().ok().unwrap(), OwnableError::TransferInProgress.into());
165
+ }
166
+
167
+ #[test]
168
+ fn pending_transfer_expires_and_cannot_be_accepted() {
169
+ let env = Env::default();
170
+ let contract_id = env.register(TestContract, ());
171
+ let client = TestContractClient::new(&env, &contract_id);
172
+
173
+ let owner = Address::generate(&env);
174
+ let pending = Address::generate(&env);
175
+ client.init(&owner);
176
+
177
+ let ttl = 1u32;
178
+ client
179
+ .mock_auths(&[MockAuth {
180
+ address: &owner,
181
+ invoke: &MockAuthInvoke {
182
+ contract: &contract_id,
183
+ fn_name: "propose_ownership_transfer",
184
+ args: (&pending, &ttl).into_val(&env),
185
+ sub_invokes: &[],
186
+ },
187
+ }])
188
+ .propose_ownership_transfer(&pending, &ttl);
189
+
190
+ assert_eq!(client.pending_owner(), Some(pending.clone()));
191
+
192
+ // Advance beyond the pending owner's *actual* temporary TTL so it expires.
193
+ // Note: `extend_ttl` does not shrink TTL, so `ttl` is not guaranteed to be the TTL.
194
+ let (pending_ttl, seq) = env.as_contract(&contract_id, || {
195
+ (env.storage().temporary().get_ttl(&OwnableStorage::PendingOwner), env.ledger().sequence())
196
+ });
197
+ let live_until = seq + pending_ttl;
198
+ env.ledger().set_sequence_number(live_until + 1);
199
+
200
+ assert_eq!(client.pending_owner(), None);
201
+
202
+ // Even with pending-owner auth, accept should fail because the transfer expired.
203
+ let res = client
204
+ .mock_auths(&[MockAuth {
205
+ address: &pending,
206
+ invoke: &MockAuthInvoke {
207
+ contract: &contract_id,
208
+ fn_name: "accept_ownership",
209
+ args: ().into_val(&env),
210
+ sub_invokes: &[],
211
+ },
212
+ }])
213
+ .try_accept_ownership();
214
+ assert_eq!(res.err().unwrap().ok().unwrap(), OwnableError::NoPendingTransfer.into());
215
+
216
+ // Owner should remain unchanged.
217
+ assert_eq!(client.owner(), Some(owner));
218
+ }
219
+
@@ -59,6 +59,8 @@ fn single_field_keyed_all_storage_types() {
59
59
  // Initially absent
60
60
  assert_eq!(InstanceKeyed::value(&env, k1), None);
61
61
  assert_eq!(InstanceKeyed::value(&env, k2), None);
62
+ assert_eq!(InstanceKeyed::has_value(&env, k1), false);
63
+ assert_eq!(InstanceKeyed::has_value(&env, k2), false);
62
64
 
63
65
  // Set and verify isolation
64
66
  InstanceKeyed::set_value(&env, k1, &100);
@@ -66,6 +68,17 @@ fn single_field_keyed_all_storage_types() {
66
68
 
67
69
  assert_eq!(InstanceKeyed::value(&env, k1), Some(100));
68
70
  assert_eq!(InstanceKeyed::value(&env, k2), Some(200));
71
+ assert_eq!(InstanceKeyed::has_value(&env, k1), true);
72
+ assert_eq!(InstanceKeyed::has_value(&env, k2), true);
73
+
74
+ // set_or_remove for keyed instance storage
75
+ InstanceKeyed::set_or_remove_value(&env, k1, &Some(123));
76
+ assert_eq!(InstanceKeyed::value(&env, k1), Some(123));
77
+ assert_eq!(InstanceKeyed::has_value(&env, k1), true);
78
+
79
+ InstanceKeyed::set_or_remove_value(&env, k1, &None);
80
+ assert_eq!(InstanceKeyed::value(&env, k1), None);
81
+ assert_eq!(InstanceKeyed::has_value(&env, k1), false);
69
82
 
70
83
  // Remove k1, k2 unaffected
71
84
  InstanceKeyed::remove_value(&env, k1);
@@ -91,6 +104,15 @@ fn single_field_keyed_all_storage_types() {
91
104
  assert_eq!(PersistentKeyed::balance(&env, &k1), Some(111));
92
105
  assert_eq!(PersistentKeyed::balance(&env, &k2), Some(222));
93
106
 
107
+ // set_or_remove for keyed persistent storage
108
+ PersistentKeyed::set_or_remove_balance(&env, &k1, &Some(333));
109
+ assert_eq!(PersistentKeyed::balance(&env, &k1), Some(333));
110
+ assert_eq!(PersistentKeyed::has_balance(&env, &k1), true);
111
+
112
+ PersistentKeyed::set_or_remove_balance(&env, &k1, &None);
113
+ assert_eq!(PersistentKeyed::balance(&env, &k1), None);
114
+ assert_eq!(PersistentKeyed::has_balance(&env, &k1), false);
115
+
94
116
  // Remove k1, k2 unaffected
95
117
  PersistentKeyed::remove_balance(&env, &k1);
96
118
  assert_eq!(PersistentKeyed::has_balance(&env, &k1), false);
@@ -114,6 +136,16 @@ fn single_field_keyed_all_storage_types() {
114
136
  assert_eq!(PersistentKeyed::has_balance_with_default(&env, &k), true);
115
137
  assert_eq!(PersistentKeyed::balance_with_default(&env, &k), 111);
116
138
 
139
+ // set_or_remove(Some) updates value
140
+ PersistentKeyed::set_or_remove_balance_with_default(&env, &k, &Some(222));
141
+ assert_eq!(PersistentKeyed::has_balance_with_default(&env, &k), true);
142
+ assert_eq!(PersistentKeyed::balance_with_default(&env, &k), 222);
143
+
144
+ // set_or_remove(None) removes and returns to default
145
+ PersistentKeyed::set_or_remove_balance_with_default(&env, &k, &None);
146
+ assert_eq!(PersistentKeyed::has_balance_with_default(&env, &k), false);
147
+ assert_eq!(PersistentKeyed::balance_with_default(&env, &k), 999);
148
+
117
149
  // Removed: back to default, has_* is false
118
150
  PersistentKeyed::remove_balance_with_default(&env, &k);
119
151
  assert_eq!(PersistentKeyed::has_balance_with_default(&env, &k), false);
@@ -138,6 +170,15 @@ fn single_field_keyed_all_storage_types() {
138
170
  assert_eq!(TemporaryKeyed::flag(&env, &k1), Some(true));
139
171
  assert_eq!(TemporaryKeyed::flag(&env, &k2), Some(false));
140
172
 
173
+ // set_or_remove for keyed temporary storage
174
+ TemporaryKeyed::set_or_remove_flag(&env, &k1, &Some(false));
175
+ assert_eq!(TemporaryKeyed::flag(&env, &k1), Some(false));
176
+ assert_eq!(TemporaryKeyed::has_flag(&env, &k1), true);
177
+
178
+ TemporaryKeyed::set_or_remove_flag(&env, &k1, &None);
179
+ assert_eq!(TemporaryKeyed::flag(&env, &k1), None);
180
+ assert_eq!(TemporaryKeyed::has_flag(&env, &k1), false);
181
+
141
182
  // Remove k1, k2 unaffected
142
183
  TemporaryKeyed::remove_flag(&env, &k1);
143
184
  assert_eq!(TemporaryKeyed::flag(&env, &k1), None);
@@ -11,7 +11,7 @@
11
11
 
12
12
  use soroban_sdk::{
13
13
  contract, contractimpl,
14
- testutils::{storage::Instance as _, storage::Persistent as _, storage::Temporary as _, Ledger as _},
14
+ testutils::{storage::Persistent as _, storage::Temporary as _, Ledger as _},
15
15
  BytesN, Env,
16
16
  };
17
17
  use utils::ttl_configurable::{TtlConfig, TtlConfigStorage};
@@ -66,6 +66,32 @@ pub enum PersistentKeyNoTtl {
66
66
  mod auto_extension {
67
67
  use super::*;
68
68
 
69
+ #[test]
70
+ fn persistent_without_provider_does_not_auto_extend() {
71
+ let env = Env::default();
72
+ let contract_id = env.register(TestContract, ());
73
+ let k = BytesN::<32>::from_array(&env, &[7u8; 32]);
74
+
75
+ // Establish entry, but do NOT set any stored TTL config.
76
+ env.as_contract(&contract_id, || {
77
+ PersistentKeyWithTtl::set_balance(&env, &k, &1);
78
+ });
79
+
80
+ // Move ledger so TTL is small, then ensure get() doesn't extend without provider.
81
+ let (current_ttl, current_seq) = env.as_contract(&contract_id, || {
82
+ (env.storage().persistent().get_ttl(&PersistentKeyWithTtl::Balance(k.clone())), env.ledger().sequence())
83
+ });
84
+ let live_until = current_seq + current_ttl;
85
+ env.ledger().set_sequence_number(live_until.saturating_sub(1));
86
+
87
+ env.as_contract(&contract_id, || {
88
+ let ttl_before = env.storage().persistent().get_ttl(&PersistentKeyWithTtl::Balance(k.clone()));
89
+ let _ = PersistentKeyWithTtl::balance(&env, &k);
90
+ let ttl_after = env.storage().persistent().get_ttl(&PersistentKeyWithTtl::Balance(k.clone()));
91
+ assert_eq!(ttl_after, ttl_before);
92
+ });
93
+ }
94
+
69
95
  #[test]
70
96
  fn persistent_auto_ttl() {
71
97
  let env = Env::default();
@@ -183,6 +209,12 @@ mod auto_extension {
183
209
  mod manual_extend {
184
210
  use super::*;
185
211
 
212
+ #[common_macros::storage]
213
+ pub enum TemporaryKeyNoTtl {
214
+ #[temporary(u32)]
215
+ Counter,
216
+ }
217
+
186
218
  /// Tests manual TTL extension for all three storage types (instance, persistent, temporary).
187
219
  #[test]
188
220
  fn manual_extend_all_storage_types() {
@@ -190,21 +222,6 @@ mod manual_extend {
190
222
  let contract_id = env.register(TestContract, ());
191
223
  let k = BytesN::<32>::from_array(&env, &[1u8; 32]);
192
224
 
193
- // --- Instance storage: extend_ttl(threshold, extend_to) - no key parameter ---
194
- let (instance_ttl, instance_seq) = env.as_contract(&contract_id, || {
195
- InstanceKeyWithTtl::set_counter(&env, &42);
196
- (env.storage().instance().get_ttl(), env.ledger().sequence())
197
- });
198
- let instance_live_until = instance_seq + instance_ttl;
199
- let instance_threshold = instance_ttl.saturating_sub(1);
200
- let instance_extend_to = instance_ttl + 500;
201
- env.ledger().set_sequence_number(instance_live_until - instance_threshold);
202
- env.as_contract(&contract_id, || {
203
- InstanceKeyWithTtl::extend_counter_ttl(&env, instance_threshold, instance_extend_to);
204
- let updated_ttl = env.storage().instance().get_ttl();
205
- assert_eq!(updated_ttl, instance_extend_to);
206
- });
207
-
208
225
  // --- Persistent storage: extend_ttl(&key, threshold, extend_to) ---
209
226
  let (persistent_ttl, persistent_seq) = env.as_contract(&contract_id, || {
210
227
  PersistentKeyWithTtl::set_balance(&env, &k, &100);
@@ -234,6 +251,21 @@ mod manual_extend {
234
251
  let updated_ttl = env.storage().temporary().get_ttl(&TemporaryKeyWithTtl::Flag(k.clone()));
235
252
  assert_eq!(updated_ttl, temporary_extend_to);
236
253
  });
254
+
255
+ // --- Temporary storage (unit variant): extend_ttl(threshold, extend_to) ---
256
+ let (temporary_ttl, temporary_seq) = env.as_contract(&contract_id, || {
257
+ TemporaryKeyNoTtl::set_counter(&env, &42);
258
+ (env.storage().temporary().get_ttl(&TemporaryKeyNoTtl::Counter), env.ledger().sequence())
259
+ });
260
+ let temporary_live_until = temporary_seq + temporary_ttl;
261
+ let temporary_threshold = temporary_ttl.saturating_sub(1);
262
+ let temporary_extend_to = temporary_ttl + 123;
263
+ env.ledger().set_sequence_number(temporary_live_until - temporary_threshold);
264
+ env.as_contract(&contract_id, || {
265
+ TemporaryKeyNoTtl::extend_counter_ttl(&env, temporary_threshold, temporary_extend_to);
266
+ let updated_ttl = env.storage().temporary().get_ttl(&TemporaryKeyNoTtl::Counter);
267
+ assert_eq!(updated_ttl, temporary_extend_to);
268
+ });
237
269
  }
238
270
 
239
271
  /// Tests that manual TTL extension works even without a stored TTL config.
@@ -105,6 +105,16 @@ fn all_storage_types_unkeyed_roundtrip() {
105
105
  assert_eq!(PersistentKeyWithDefault::has_value(&env), true);
106
106
  assert_eq!(PersistentKeyWithDefault::value(&env), 100);
107
107
 
108
+ // set_or_remove(Some) updates value
109
+ PersistentKeyWithDefault::set_or_remove_value(&env, &Some(200));
110
+ assert_eq!(PersistentKeyWithDefault::has_value(&env), true);
111
+ assert_eq!(PersistentKeyWithDefault::value(&env), 200);
112
+
113
+ // set_or_remove(None) removes and returns to default
114
+ PersistentKeyWithDefault::set_or_remove_value(&env, &None);
115
+ assert_eq!(PersistentKeyWithDefault::has_value(&env), false);
116
+ assert_eq!(PersistentKeyWithDefault::value(&env), 42);
117
+
108
118
  // Remove value returns to default
109
119
  PersistentKeyWithDefault::remove_value(&env);
110
120
  assert_eq!(PersistentKeyWithDefault::has_value(&env), false);
@@ -12,7 +12,9 @@ use soroban_sdk::{
12
12
  xdr::{ScErrorCode, ScErrorType},
13
13
  Address, Env, Error, IntoVal,
14
14
  };
15
- use utils::{errors::TtlConfigurableError, ttl_configurable::TtlConfig};
15
+ use utils::testing_utils::assert_eq_event;
16
+ use utils::ttl_configurable::TtlConfigsSet;
17
+ use utils::{errors::{OwnableError, TtlConfigurableError}, ttl_configurable::TtlConfig};
16
18
 
17
19
  #[contract]
18
20
  #[ttl_configurable]
@@ -33,14 +35,14 @@ fn read_without_auth() {
33
35
  let client = TestContractClient::new(&env, &contract_id);
34
36
 
35
37
  // Read methods should be callable without initialization/auth
36
- client.ttl_configs();
38
+ assert_eq!(client.ttl_configs(), (None, None));
37
39
  assert!(!client.is_ttl_configs_frozen());
38
40
 
39
41
  // Also works after owner initialization
40
42
  let owner = Address::generate(&env);
41
43
  client.init(&owner);
42
44
 
43
- client.ttl_configs();
45
+ assert_eq!(client.ttl_configs(), (None, None));
44
46
  assert!(!client.is_ttl_configs_frozen());
45
47
  }
46
48
 
@@ -78,12 +80,72 @@ fn set_requires_auth() {
78
80
  }])
79
81
  .set_ttl_configs(&instance, &persistent);
80
82
 
83
+ assert_eq_event(&env, &contract_id, TtlConfigsSet { instance, persistent });
84
+
81
85
  // Config should be updated
82
86
  let after = client.ttl_configs();
83
87
  assert_ne!(before, after);
84
88
  assert_eq!(after, (instance, persistent));
85
89
  }
86
90
 
91
+ #[test]
92
+ fn set_before_init_fails_with_owner_not_set() {
93
+ let env = Env::default();
94
+ let contract_id = env.register(TestContract, ());
95
+ let client = TestContractClient::new(&env, &contract_id);
96
+
97
+ // No init() call => Ownable owner not set, so Auth::authorizer() fails.
98
+ let instance = Some(TtlConfig::new(1, 2));
99
+ let persistent = None::<TtlConfig>;
100
+ let err = client.try_set_ttl_configs(&instance, &persistent).unwrap_err().unwrap();
101
+ assert_eq!(err, OwnableError::OwnerNotSet.into());
102
+ }
103
+
104
+ #[test]
105
+ fn set_and_remove_configs_roundtrip() {
106
+ let env = Env::default();
107
+ let contract_id = env.register(TestContract, ());
108
+ let client = TestContractClient::new(&env, &contract_id);
109
+
110
+ let owner = Address::generate(&env);
111
+ client.init(&owner);
112
+
113
+ // Set both configs.
114
+ let instance = Some(TtlConfig::new(1, 2));
115
+ let persistent = Some(TtlConfig::new(3, 4));
116
+ client
117
+ .mock_auths(&[MockAuth {
118
+ address: &owner,
119
+ invoke: &MockAuthInvoke {
120
+ contract: &contract_id,
121
+ fn_name: "set_ttl_configs",
122
+ args: (&instance, &persistent).into_val(&env),
123
+ sub_invokes: &[],
124
+ },
125
+ }])
126
+ .set_ttl_configs(&instance, &persistent);
127
+
128
+ assert_eq_event(&env, &contract_id, TtlConfigsSet { instance, persistent });
129
+ assert_eq!(client.ttl_configs(), (instance, persistent));
130
+
131
+ // Remove (disable) both configs.
132
+ let none: Option<TtlConfig> = None::<TtlConfig>;
133
+ client
134
+ .mock_auths(&[MockAuth {
135
+ address: &owner,
136
+ invoke: &MockAuthInvoke {
137
+ contract: &contract_id,
138
+ fn_name: "set_ttl_configs",
139
+ args: (&none, &none).into_val(&env),
140
+ sub_invokes: &[],
141
+ },
142
+ }])
143
+ .set_ttl_configs(&none, &none);
144
+
145
+ assert_eq_event(&env, &contract_id, TtlConfigsSet { instance: none, persistent: none });
146
+ assert_eq!(client.ttl_configs(), (None, None));
147
+ }
148
+
87
149
  #[test]
88
150
  fn invalid_config_rejected() {
89
151
  let env = Env::default();
@@ -93,6 +155,8 @@ fn invalid_config_rejected() {
93
155
  let owner = Address::generate(&env);
94
156
  client.init(&owner);
95
157
 
158
+ let before = client.ttl_configs();
159
+
96
160
  // Invalid config: threshold > extend_to
97
161
  let invalid_instance = Some(TtlConfig::new(100, 50)); // threshold=100 > extend_to=50
98
162
  let none: Option<TtlConfig> = None::<TtlConfig>;
@@ -110,4 +174,33 @@ fn invalid_config_rejected() {
110
174
  .try_set_ttl_configs(&invalid_instance, &none);
111
175
 
112
176
  assert_eq!(result.unwrap_err().unwrap(), TtlConfigurableError::InvalidTtlConfig.into());
177
+ // Config should remain unchanged on validation failure.
178
+ assert_eq!(client.ttl_configs(), before);
179
+ }
180
+
181
+ #[test]
182
+ fn invalid_max_ttl_rejected() {
183
+ let env = Env::default();
184
+ let contract_id = env.register(TestContract, ());
185
+ let client = TestContractClient::new(&env, &contract_id);
186
+
187
+ let owner = Address::generate(&env);
188
+ client.init(&owner);
189
+
190
+ let invalid = Some(TtlConfig::new(1, u32::MAX));
191
+ let none: Option<TtlConfig> = None::<TtlConfig>;
192
+
193
+ let result = client
194
+ .mock_auths(&[MockAuth {
195
+ address: &owner,
196
+ invoke: &MockAuthInvoke {
197
+ contract: &contract_id,
198
+ fn_name: "set_ttl_configs",
199
+ args: (&invalid, &none).into_val(&env),
200
+ sub_invokes: &[],
201
+ },
202
+ }])
203
+ .try_set_ttl_configs(&invalid, &none);
204
+
205
+ assert_eq!(result.unwrap_err().unwrap(), TtlConfigurableError::InvalidTtlConfig.into());
113
206
  }
@@ -12,6 +12,8 @@ use soroban_sdk::{
12
12
  xdr::{ScErrorCode, ScErrorType},
13
13
  Address, Env, Error, IntoVal,
14
14
  };
15
+ use utils::testing_utils::assert_eq_event;
16
+ use utils::ttl_configurable::TtlConfigsFrozen;
15
17
  use utils::{errors::TtlConfigurableError, ttl_configurable::TtlConfig};
16
18
 
17
19
  #[contract]
@@ -54,6 +56,8 @@ fn freeze_requires_auth() {
54
56
  }])
55
57
  .freeze_ttl_configs();
56
58
 
59
+ assert_eq_event(&env, &contract_id, TtlConfigsFrozen {});
60
+
57
61
  assert!(client.is_ttl_configs_frozen());
58
62
  }
59
63