@layerzerolabs/protocol-stellar-v2 0.2.12 → 0.2.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/.turbo/turbo-build.log +384 -278
  2. package/.turbo/turbo-lint.log +110 -78
  3. package/.turbo/turbo-test.log +1248 -1014
  4. package/Cargo.lock +130 -3
  5. package/Cargo.toml +2 -1
  6. package/contracts/common-macros/src/contract_impl.rs +6 -1
  7. package/contracts/common-macros/src/lib.rs +47 -8
  8. package/contracts/common-macros/src/ownable.rs +7 -25
  9. package/contracts/common-macros/src/storage.rs +1 -1
  10. package/contracts/common-macros/src/tests/contract_impl.rs +5 -0
  11. package/contracts/common-macros/src/tests/mod.rs +1 -0
  12. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_impl__snapshot_generated_contract_impl_code.snap +23 -7
  13. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +5 -25
  14. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +48 -48
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +5 -25
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +21 -0
  17. package/contracts/common-macros/src/tests/upgradeable.rs +31 -0
  18. package/contracts/common-macros/src/ttl_configurable.rs +14 -44
  19. package/contracts/common-macros/src/upgradeable.rs +76 -0
  20. package/contracts/endpoint-v2/src/endpoint_v2.rs +25 -1
  21. package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +175 -8
  22. package/contracts/endpoint-v2/src/tests/endpoint_v2/build_outbound_packet.rs +76 -0
  23. package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +342 -159
  24. package/contracts/endpoint-v2/src/tests/endpoint_v2/delegate.rs +3 -15
  25. package/contracts/endpoint-v2/src/tests/endpoint_v2/initializable.rs +20 -31
  26. package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +126 -164
  27. package/contracts/endpoint-v2/src/tests/endpoint_v2/mod.rs +1 -0
  28. package/contracts/endpoint-v2/src/tests/endpoint_v2/native_token.rs +0 -1
  29. package/contracts/endpoint-v2/src/tests/endpoint_v2/owner.rs +0 -1
  30. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +311 -304
  31. package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +423 -96
  32. package/contracts/endpoint-v2/src/tests/endpoint_v2/recover_token.rs +1 -1
  33. package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +47 -20
  34. package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +373 -403
  35. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +96 -22
  36. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +61 -9
  37. package/contracts/endpoint-v2/src/tests/endpoint_v2/transfer_ownership.rs +4 -4
  38. package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +8 -11
  39. package/contracts/endpoint-v2/src/tests/endpoint_v2/verifiable.rs +81 -30
  40. package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +209 -76
  41. package/contracts/endpoint-v2/src/tests/endpoint_v2/zro.rs +0 -1
  42. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library.rs +24 -0
  43. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library_timeout.rs +40 -0
  44. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_send_library.rs +24 -0
  45. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_config.rs +108 -0
  46. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_library_index.rs +52 -0
  47. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_receive_library.rs +92 -0
  48. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_registered_libraries.rs +74 -0
  49. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_send_library.rs +83 -0
  50. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_registered_library.rs +32 -0
  51. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_supported_eid.rs +28 -0
  52. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_valid_receive_library.rs +261 -0
  53. package/contracts/endpoint-v2/src/tests/message_lib_manager/mod.rs +16 -0
  54. package/contracts/endpoint-v2/src/tests/message_lib_manager/receive_library_timeout.rs +62 -0
  55. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +65 -43
  56. package/contracts/endpoint-v2/src/tests/message_lib_manager/registered_libraries_count.rs +42 -0
  57. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +61 -0
  58. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +3 -5
  59. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +59 -0
  60. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +15 -1
  61. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_config.rs +155 -51
  62. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +114 -92
  63. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +235 -132
  64. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +93 -87
  65. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +346 -245
  66. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +406 -60
  67. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +252 -78
  68. package/contracts/endpoint-v2/src/tests/message_lib_manager/timeout.rs +102 -0
  69. package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +212 -273
  70. package/contracts/endpoint-v2/src/tests/messaging_channel/clear_payload.rs +203 -0
  71. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound.rs +94 -0
  72. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_nonce.rs +78 -248
  73. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_payload_hash.rs +7 -282
  74. package/contracts/endpoint-v2/src/tests/messaging_channel/lazy_inbound_nonce.rs +6 -274
  75. package/contracts/endpoint-v2/src/tests/messaging_channel/mod.rs +3 -2
  76. package/contracts/endpoint-v2/src/tests/messaging_channel/next_guid.rs +86 -178
  77. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +328 -212
  78. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound.rs +68 -0
  79. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound_nonce.rs +6 -209
  80. package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +207 -159
  81. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +142 -153
  82. package/contracts/endpoint-v2/src/tests/messaging_composer/compose_queue.rs +6 -179
  83. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +163 -221
  84. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +90 -121
  85. package/contracts/endpoint-v2/src/tests/mock.rs +18 -4
  86. package/contracts/endpoint-v2/src/tests/util/build_payload.rs +4 -70
  87. package/contracts/endpoint-v2/src/tests/util/compute_guid.rs +2 -1
  88. package/contracts/endpoint-v2/src/tests/util/keccak256.rs +17 -106
  89. package/contracts/layerzero-views/Cargo.toml +35 -0
  90. package/contracts/layerzero-views/src/errors.rs +10 -0
  91. package/contracts/layerzero-views/src/layerzero_view.rs +229 -0
  92. package/contracts/layerzero-views/src/lib.rs +38 -0
  93. package/contracts/layerzero-views/src/storage.rs +18 -0
  94. package/contracts/layerzero-views/src/tests/layerzero_view_tests.rs +423 -0
  95. package/contracts/layerzero-views/src/tests/mod.rs +4 -0
  96. package/contracts/layerzero-views/src/tests/setup.rs +377 -0
  97. package/contracts/layerzero-views/src/types.rs +50 -0
  98. package/contracts/macro-integration-tests/Cargo.toml +30 -0
  99. package/contracts/macro-integration-tests/src/lib.rs +1 -0
  100. package/contracts/macro-integration-tests/tests/runtime/ownable/initialization.rs +62 -0
  101. package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +22 -0
  102. package/contracts/macro-integration-tests/tests/runtime/ownable/only_owner_guard.rs +97 -0
  103. package/contracts/macro-integration-tests/tests/runtime/ownable/ownership_transfer.rs +101 -0
  104. package/contracts/macro-integration-tests/tests/runtime/storage/keyed_roundtrip.rs +225 -0
  105. package/contracts/macro-integration-tests/tests/runtime/storage/mod.rs +4 -0
  106. package/contracts/macro-integration-tests/tests/runtime/storage/name_override_runtime.rs +52 -0
  107. package/contracts/macro-integration-tests/tests/runtime/storage/ttl_extension.rs +261 -0
  108. package/contracts/macro-integration-tests/tests/runtime/storage/unkeyed_roundtrip.rs +137 -0
  109. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +113 -0
  110. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/extend_instance_ttl.rs +50 -0
  111. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +139 -0
  112. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/mod.rs +3 -0
  113. package/contracts/macro-integration-tests/tests/runtime.rs +5 -0
  114. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.rs +12 -0
  115. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.stderr +7 -0
  116. package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.rs +12 -0
  117. package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.stderr +7 -0
  118. package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.rs +21 -0
  119. package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.stderr +7 -0
  120. package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.rs +13 -0
  121. package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.stderr +7 -0
  122. package/contracts/macro-integration-tests/tests/ui/error/pass/attr_on_variant_allowed.rs +20 -0
  123. package/contracts/macro-integration-tests/tests/ui/error/pass/basic_auto_discriminants.rs +15 -0
  124. package/contracts/macro-integration-tests/tests/ui/error/pass/mixed_discriminants.rs +16 -0
  125. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_owner_missing_env.rs +22 -0
  126. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_owner_missing_env.stderr +16 -0
  127. package/contracts/macro-integration-tests/tests/ui/ownable/pass/minimal_contract.rs +26 -0
  128. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +22 -0
  129. package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_owner_env_param_variants.rs +46 -0
  130. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.rs +13 -0
  131. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.stderr +7 -0
  132. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.rs +13 -0
  133. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.stderr +7 -0
  134. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.rs +10 -0
  135. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.stderr +7 -0
  136. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.rs +12 -0
  137. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.stderr +7 -0
  138. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.rs +10 -0
  139. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.stderr +7 -0
  140. package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.rs +10 -0
  141. package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.stderr +7 -0
  142. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.rs +12 -0
  143. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.stderr +7 -0
  144. package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.rs +13 -0
  145. package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.stderr +7 -0
  146. package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.rs +13 -0
  147. package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.stderr +7 -0
  148. package/contracts/macro-integration-tests/tests/ui/storage/pass/default_value_on_variant.rs +14 -0
  149. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_instance_unit_basic.rs +14 -0
  150. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_persistent_named_fields_keyed.rs +16 -0
  151. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_temporary_unit_option.rs +15 -0
  152. package/contracts/macro-integration-tests/tests/ui/storage/pass/name_override.rs +14 -0
  153. package/contracts/macro-integration-tests/tests/ui/storage/pass/no_auto_ttl_extension.rs +19 -0
  154. package/contracts/macro-integration-tests/tests/ui/storage/pass/ttl_provider_basic.rs +15 -0
  155. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/minimal_contract.rs +44 -0
  156. package/contracts/macro-integration-tests/tests/ui_error.rs +11 -0
  157. package/contracts/macro-integration-tests/tests/ui_ownable.rs +11 -0
  158. package/contracts/macro-integration-tests/tests/ui_storage.rs +11 -0
  159. package/contracts/macro-integration-tests/tests/ui_ttl_configurable.rs +12 -0
  160. package/contracts/message-libs/blocked-message-lib/src/lib.rs +17 -17
  161. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/decode_packet_header.rs +64 -0
  162. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet.rs +58 -0
  163. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet_header.rs +138 -0
  164. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/mod.rs +6 -0
  165. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload.rs +30 -0
  166. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload_hash.rs +15 -0
  167. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/test_helper.rs +39 -0
  168. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_dvn_option.rs +57 -0
  169. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_lz_receive_option.rs +50 -0
  170. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_native_drop_option.rs +74 -0
  171. package/contracts/message-libs/message-lib-common/src/tests/worker_options/convert_legacy_options.rs +280 -0
  172. package/contracts/message-libs/message-lib-common/src/tests/worker_options/extract_type_3_options.rs +126 -0
  173. package/contracts/message-libs/message-lib-common/src/tests/worker_options/left_pad_to_bytes32.rs +48 -0
  174. package/contracts/message-libs/message-lib-common/src/tests/worker_options/mod.rs +7 -0
  175. package/contracts/message-libs/message-lib-common/src/tests/worker_options/split_worker_options.rs +139 -0
  176. package/contracts/message-libs/message-lib-common/src/worker_options.rs +31 -1
  177. package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +2 -2
  178. package/contracts/message-libs/treasury/src/errors.rs +0 -1
  179. package/contracts/message-libs/treasury/src/lib.rs +3 -3
  180. package/contracts/message-libs/treasury/src/storage.rs +2 -0
  181. package/contracts/message-libs/treasury/src/treasury.rs +12 -13
  182. package/contracts/message-libs/uln-302/Cargo.toml +1 -1
  183. package/contracts/message-libs/uln-302/src/errors.rs +0 -5
  184. package/contracts/message-libs/uln-302/src/events.rs +5 -6
  185. package/contracts/message-libs/uln-302/src/receive_uln.rs +24 -54
  186. package/contracts/message-libs/uln-302/src/send_uln.rs +89 -135
  187. package/contracts/message-libs/uln-302/src/storage.rs +5 -5
  188. package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +5 -7
  189. package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +3 -3
  190. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +6 -9
  191. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +2 -2
  192. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +3 -3
  193. package/contracts/message-libs/uln-302/src/tests/setup.rs +9 -0
  194. package/contracts/message-libs/uln-302/src/tests/testing_utils.rs +5 -0
  195. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_receive_uln_config.rs +1 -2
  196. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_send_uln_config.rs +1 -2
  197. package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +37 -55
  198. package/contracts/message-libs/uln-302/src/uln302.rs +8 -5
  199. package/contracts/oapps/counter/src/counter.rs +0 -1
  200. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +306 -224
  201. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +0 -1
  202. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +0 -1
  203. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +0 -1
  204. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +0 -1
  205. package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_core.rs +1 -0
  206. package/contracts/oapps/oft/integration-tests/setup.rs +10 -3
  207. package/contracts/oapps/oft/integration-tests/utils.rs +1 -1
  208. package/contracts/oapps/oft/src/default_oft_impl.rs +9 -3
  209. package/contracts/oapps/oft/src/extensions/oft_fee.rs +5 -5
  210. package/contracts/oapps/oft/src/extensions/pausable.rs +1 -1
  211. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +18 -18
  212. package/contracts/oapps/oft/src/oft.rs +9 -9
  213. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +1 -1
  214. package/contracts/oapps/oft/src/tests/extensions/setup.rs +26 -11
  215. package/contracts/oapps/oft/src/tests/extensions/test_rate_limiter.rs +1 -1
  216. package/contracts/oapps/oft/src/tests/test_send.rs +4 -4
  217. package/contracts/oapps/oft/src/tests/test_utils.rs +93 -74
  218. package/contracts/oapps/oft-std/Cargo.toml +6 -0
  219. package/contracts/oapps/oft-std/integration-tests/extensions/mod.rs +3 -0
  220. package/contracts/oapps/oft-std/integration-tests/extensions/test_oft_fee.rs +157 -0
  221. package/contracts/oapps/oft-std/integration-tests/extensions/test_pausable.rs +162 -0
  222. package/contracts/oapps/oft-std/integration-tests/extensions/test_rate_limiter.rs +186 -0
  223. package/contracts/oapps/oft-std/integration-tests/mod.rs +3 -0
  224. package/contracts/oapps/oft-std/integration-tests/setup.rs +245 -0
  225. package/contracts/oapps/oft-std/integration-tests/utils.rs +427 -0
  226. package/contracts/oapps/oft-std/src/lib.rs +12 -1
  227. package/contracts/oapps/oft-std/src/oft.rs +122 -25
  228. package/contracts/upgrader/Cargo.toml +19 -0
  229. package/contracts/upgrader/src/lib.rs +96 -0
  230. package/contracts/upgrader/src/tests/mod.rs +1 -0
  231. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract1.wasm +0 -0
  232. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract2.wasm +0 -0
  233. package/contracts/upgrader/src/tests/test_upgrader.rs +120 -0
  234. package/contracts/utils/src/errors.rs +6 -1
  235. package/contracts/utils/src/lib.rs +2 -1
  236. package/contracts/utils/src/ownable.rs +49 -61
  237. package/contracts/utils/src/tests/mod.rs +3 -1
  238. package/contracts/utils/src/tests/option_ext.rs +21 -0
  239. package/contracts/utils/src/tests/ownable.rs +10 -69
  240. package/contracts/utils/src/tests/ttl_configurable.rs +596 -0
  241. package/contracts/utils/src/tests/upgradeable.rs +288 -0
  242. package/contracts/utils/src/{ttl.rs → ttl_configurable.rs} +67 -52
  243. package/contracts/utils/src/upgradeable.rs +54 -0
  244. package/contracts/workers/dvn/Cargo.toml +1 -1
  245. package/contracts/workers/dvn/src/auth.rs +21 -32
  246. package/contracts/workers/dvn/src/dvn.rs +40 -3
  247. package/contracts/workers/dvn/src/errors.rs +1 -0
  248. package/contracts/workers/dvn/src/multisig.rs +10 -6
  249. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +2 -2
  250. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +4 -4
  251. package/contracts/workers/dvn-fee-lib/Cargo.toml +1 -2
  252. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +46 -14
  253. package/contracts/workers/dvn-fee-lib/src/errors.rs +3 -2
  254. package/contracts/workers/dvn-fee-lib/src/lib.rs +5 -11
  255. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +30 -16
  256. package/contracts/workers/executor/src/executor.rs +16 -2
  257. package/contracts/workers/executor-fee-lib/src/errors.rs +9 -7
  258. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +154 -119
  259. package/contracts/workers/executor-helper/Cargo.toml +0 -5
  260. package/contracts/workers/executor-helper/src/lib.rs +1 -7
  261. package/contracts/workers/price-feed/Cargo.toml +0 -1
  262. package/contracts/workers/price-feed/src/errors.rs +3 -2
  263. package/contracts/workers/price-feed/src/lib.rs +5 -6
  264. package/contracts/workers/price-feed/src/price_feed.rs +39 -17
  265. package/contracts/workers/worker/Cargo.toml +4 -0
  266. package/contracts/workers/worker/src/interfaces/price_feed.rs +3 -3
  267. package/contracts/workers/worker/src/lib.rs +2 -2
  268. package/contracts/workers/worker/src/tests/mod.rs +4 -0
  269. package/contracts/workers/worker/src/tests/setup.rs +147 -0
  270. package/contracts/workers/worker/src/tests/worker.rs +501 -0
  271. package/contracts/workers/worker/src/worker.rs +10 -16
  272. package/package.json +3 -3
  273. package/sdk/dist/generated/bml.d.ts +40 -30
  274. package/sdk/dist/generated/bml.js +16 -11
  275. package/sdk/dist/generated/counter.d.ts +168 -134
  276. package/sdk/dist/generated/counter.js +26 -21
  277. package/sdk/dist/generated/dvn.d.ts +1932 -0
  278. package/sdk/dist/generated/dvn.js +288 -0
  279. package/sdk/dist/generated/dvn_fee_lib.d.ts +615 -0
  280. package/sdk/dist/generated/dvn_fee_lib.js +123 -0
  281. package/sdk/dist/generated/endpoint.d.ts +75 -41
  282. package/sdk/dist/generated/endpoint.js +22 -17
  283. package/sdk/dist/generated/executor.d.ts +1809 -0
  284. package/sdk/dist/generated/executor.js +269 -0
  285. package/sdk/dist/generated/executor_fee_lib.d.ts +999 -0
  286. package/sdk/dist/generated/executor_fee_lib.js +208 -0
  287. package/sdk/dist/generated/executor_helper.d.ts +869 -0
  288. package/sdk/dist/generated/executor_helper.js +187 -0
  289. package/sdk/dist/generated/oft_std.d.ts +1544 -0
  290. package/sdk/dist/generated/oft_std.js +271 -0
  291. package/sdk/dist/generated/price_feed.d.ts +1002 -0
  292. package/sdk/dist/generated/price_feed.js +170 -0
  293. package/sdk/dist/generated/sml.d.ts +75 -41
  294. package/sdk/dist/generated/sml.js +22 -17
  295. package/sdk/dist/generated/uln302.d.ts +79 -60
  296. package/sdk/dist/generated/uln302.js +37 -37
  297. package/sdk/dist/generated/upgrader.d.ts +70 -0
  298. package/sdk/dist/generated/upgrader.js +19 -0
  299. package/sdk/dist/index.d.ts +8 -0
  300. package/sdk/dist/index.js +11 -0
  301. package/sdk/package.json +4 -3
  302. package/sdk/src/index.ts +13 -0
  303. package/sdk/test/index.test.ts +0 -1
  304. package/sdk/test/oft.test.ts +12 -23
  305. package/sdk/test/suites/testUpgradeable.ts +169 -0
  306. package/sdk/test/upgrader.test.ts +309 -0
  307. package/tools/ts-bindings-gen/src/main.rs +11 -1
  308. package/contracts/endpoint-v2/src/tests/messaging_channel/clear.rs +0 -316
  309. package/contracts/endpoint-v2/src/tests/messaging_channel/internal.rs +0 -388
  310. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +0 -162
  311. package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +0 -319
  312. package/contracts/utils/src/tests/ttl.rs +0 -421
  313. /package/contracts/{oapp-macros → oapps/oapp-macros}/Cargo.toml +0 -0
  314. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/lib.rs +0 -0
  315. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_full.rs +0 -0
  316. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_options_type3.rs +0 -0
  317. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_receiver.rs +0 -0
  318. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_sender.rs +0 -0
  319. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/util.rs +0 -0
@@ -0,0 +1,101 @@
1
+ // Runtime tests: Ownership transfer and renounce behavior.
2
+ //
3
+ // Tests covered:
4
+ // - `transfer_ownership` requires current owner authorization.
5
+ // - `renounce_ownership` clears owner and blocks further operations.
6
+
7
+ use super::{TestContract, TestContractClient};
8
+ use soroban_sdk::{
9
+ testutils::{Address as _, MockAuth, MockAuthInvoke},
10
+ xdr::{ScErrorCode, ScErrorType},
11
+ Address, Env, Error, IntoVal,
12
+ };
13
+ use utils::errors::OwnableError;
14
+
15
+ #[test]
16
+ fn transfer_requires_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
+
24
+ client.init(&owner);
25
+
26
+ // Unauthorized transfer should fail
27
+ let unauthorized = client.try_transfer_ownership(&new_owner);
28
+ assert_eq!(
29
+ unauthorized.unwrap_err().unwrap(),
30
+ Error::from_type_and_code(ScErrorType::Context, ScErrorCode::InvalidAction)
31
+ );
32
+
33
+ // Authorized transfer should succeed
34
+ client
35
+ .mock_auths(&[MockAuth {
36
+ address: &owner,
37
+ invoke: &MockAuthInvoke {
38
+ contract: &contract_id,
39
+ fn_name: "transfer_ownership",
40
+ args: (&new_owner,).into_val(&env),
41
+ sub_invokes: &[],
42
+ },
43
+ }])
44
+ .transfer_ownership(&new_owner);
45
+
46
+ // Owner should be updated
47
+ assert_eq!(client.owner(), Some(new_owner));
48
+ }
49
+
50
+ #[test]
51
+ fn renounce_clears_owner() {
52
+ let env = Env::default();
53
+ let contract_id = env.register(TestContract, ());
54
+ let client = TestContractClient::new(&env, &contract_id);
55
+
56
+ let owner = Address::generate(&env);
57
+ client.init(&owner);
58
+ assert_eq!(client.owner(), Some(owner.clone()));
59
+
60
+ // Unauthorized renounce should fail
61
+ let unauthorized = client.try_renounce_ownership();
62
+ assert_eq!(
63
+ unauthorized.unwrap_err().unwrap(),
64
+ Error::from_type_and_code(ScErrorType::Context, ScErrorCode::InvalidAction)
65
+ );
66
+
67
+ // Renounce ownership (authorized by current owner)
68
+ client
69
+ .mock_auths(&[MockAuth {
70
+ address: &owner,
71
+ invoke: &MockAuthInvoke {
72
+ contract: &contract_id,
73
+ fn_name: "renounce_ownership",
74
+ args: ().into_val(&env),
75
+ sub_invokes: &[],
76
+ },
77
+ }])
78
+ .renounce_ownership();
79
+
80
+ // Owner should be None after renouncing
81
+ assert_eq!(client.owner(), None);
82
+
83
+ // All owner-protected operations should now fail
84
+ let guarded_result = client
85
+ .mock_auths(&[MockAuth {
86
+ address: &owner,
87
+ invoke: &MockAuthInvoke {
88
+ contract: &contract_id,
89
+ fn_name: "guarded",
90
+ args: ().into_val(&env),
91
+ sub_invokes: &[],
92
+ },
93
+ }])
94
+ .try_guarded();
95
+ assert_eq!(guarded_result.unwrap_err().unwrap(), OwnableError::OwnerNotSet.into());
96
+
97
+ assert_eq!(
98
+ client.try_transfer_ownership(&Address::generate(&env)).unwrap_err().unwrap(),
99
+ OwnableError::OwnerNotSet.into()
100
+ );
101
+ }
@@ -0,0 +1,225 @@
1
+ // Runtime test: keyed (named field variant) roundtrip for all storage types.
2
+ //
3
+ // Purpose:
4
+ // - Validates all three storage types (instance, persistent, temporary) work correctly
5
+ // with keyed variants (named fields).
6
+ // - Validates key isolation: different keys map to distinct storage entries.
7
+ // - Validates single-field and multi-field keyed variants.
8
+ // - Complements unkeyed_roundtrip.rs for symmetric coverage.
9
+
10
+ use soroban_sdk::{contract, contractimpl, testutils::Address as _, Address, BytesN, Env};
11
+
12
+ #[contract]
13
+ pub struct TestContract;
14
+
15
+ #[contractimpl]
16
+ impl TestContract {}
17
+
18
+ // ============================================================================
19
+ // Single-field keyed variants (all storage types)
20
+ // ============================================================================
21
+
22
+ #[common_macros::storage]
23
+ pub enum InstanceKeyed {
24
+ #[instance(u32)]
25
+ Value { key: u32 },
26
+ }
27
+
28
+ #[common_macros::storage]
29
+ pub enum PersistentKeyed {
30
+ #[persistent(i128)]
31
+ Balance { key: BytesN<32> },
32
+
33
+ // Keyed variant with a default value: getter should return the default when absent,
34
+ // while has_* remains false until an explicit set.
35
+ #[persistent(i128)]
36
+ #[default(999)]
37
+ BalanceWithDefault { key: BytesN<32> },
38
+ }
39
+
40
+ #[common_macros::storage]
41
+ pub enum TemporaryKeyed {
42
+ #[temporary(bool)]
43
+ Flag { key: Address },
44
+ }
45
+
46
+ #[test]
47
+ fn single_field_keyed_all_storage_types() {
48
+ let env = Env::default();
49
+ let contract_id = env.register(TestContract, ());
50
+
51
+ env.as_contract(&contract_id, || {
52
+ // ====================================================================
53
+ // Instance storage (keyed by primitive u32)
54
+ // ====================================================================
55
+ {
56
+ let k1: u32 = 1;
57
+ let k2: u32 = 2;
58
+
59
+ // Initially absent
60
+ assert_eq!(InstanceKeyed::value(&env, k1), None);
61
+ assert_eq!(InstanceKeyed::value(&env, k2), None);
62
+
63
+ // Set and verify isolation
64
+ InstanceKeyed::set_value(&env, k1, &100);
65
+ InstanceKeyed::set_value(&env, k2, &200);
66
+
67
+ assert_eq!(InstanceKeyed::value(&env, k1), Some(100));
68
+ assert_eq!(InstanceKeyed::value(&env, k2), Some(200));
69
+
70
+ // Remove k1, k2 unaffected
71
+ InstanceKeyed::remove_value(&env, k1);
72
+ assert_eq!(InstanceKeyed::value(&env, k1), None);
73
+ assert_eq!(InstanceKeyed::value(&env, k2), Some(200));
74
+ }
75
+
76
+ // ====================================================================
77
+ // Persistent storage (keyed by BytesN<32>)
78
+ // ====================================================================
79
+ {
80
+ let k1 = BytesN::<32>::from_array(&env, &[1u8; 32]);
81
+ let k2 = BytesN::<32>::from_array(&env, &[2u8; 32]);
82
+
83
+ // Initially absent
84
+ assert_eq!(PersistentKeyed::has_balance(&env, &k1), false);
85
+ assert_eq!(PersistentKeyed::has_balance(&env, &k2), false);
86
+
87
+ // Set and verify isolation
88
+ PersistentKeyed::set_balance(&env, &k1, &111);
89
+ PersistentKeyed::set_balance(&env, &k2, &222);
90
+
91
+ assert_eq!(PersistentKeyed::balance(&env, &k1), Some(111));
92
+ assert_eq!(PersistentKeyed::balance(&env, &k2), Some(222));
93
+
94
+ // Remove k1, k2 unaffected
95
+ PersistentKeyed::remove_balance(&env, &k1);
96
+ assert_eq!(PersistentKeyed::has_balance(&env, &k1), false);
97
+ assert_eq!(PersistentKeyed::balance(&env, &k1), None);
98
+ assert_eq!(PersistentKeyed::has_balance(&env, &k2), true);
99
+ assert_eq!(PersistentKeyed::balance(&env, &k2), Some(222));
100
+ }
101
+
102
+ // ====================================================================
103
+ // Persistent storage (keyed) with default value
104
+ // ====================================================================
105
+ {
106
+ let k = BytesN::<32>::from_array(&env, &[9u8; 32]);
107
+
108
+ // Absent: getter returns default, but has_* is false
109
+ assert_eq!(PersistentKeyed::balance_with_default(&env, &k), 999);
110
+ assert_eq!(PersistentKeyed::has_balance_with_default(&env, &k), false);
111
+
112
+ // Present: getter returns stored value, has_* is true
113
+ PersistentKeyed::set_balance_with_default(&env, &k, &111);
114
+ assert_eq!(PersistentKeyed::has_balance_with_default(&env, &k), true);
115
+ assert_eq!(PersistentKeyed::balance_with_default(&env, &k), 111);
116
+
117
+ // Removed: back to default, has_* is false
118
+ PersistentKeyed::remove_balance_with_default(&env, &k);
119
+ assert_eq!(PersistentKeyed::has_balance_with_default(&env, &k), false);
120
+ assert_eq!(PersistentKeyed::balance_with_default(&env, &k), 999);
121
+ }
122
+
123
+ // ====================================================================
124
+ // Temporary storage (keyed by Address)
125
+ // ====================================================================
126
+ {
127
+ let k1 = Address::generate(&env);
128
+ let k2 = Address::generate(&env);
129
+
130
+ // Initially absent
131
+ assert_eq!(TemporaryKeyed::flag(&env, &k1), None);
132
+ assert_eq!(TemporaryKeyed::flag(&env, &k2), None);
133
+
134
+ // Set and verify isolation
135
+ TemporaryKeyed::set_flag(&env, &k1, &true);
136
+ TemporaryKeyed::set_flag(&env, &k2, &false);
137
+
138
+ assert_eq!(TemporaryKeyed::flag(&env, &k1), Some(true));
139
+ assert_eq!(TemporaryKeyed::flag(&env, &k2), Some(false));
140
+
141
+ // Remove k1, k2 unaffected
142
+ TemporaryKeyed::remove_flag(&env, &k1);
143
+ assert_eq!(TemporaryKeyed::flag(&env, &k1), None);
144
+ assert_eq!(TemporaryKeyed::flag(&env, &k2), Some(false));
145
+ }
146
+ });
147
+ }
148
+
149
+ // ============================================================================
150
+ // Multi-field keyed variant
151
+ // ============================================================================
152
+
153
+ #[common_macros::storage]
154
+ pub enum MultiFieldKeyed {
155
+ #[persistent(i128)]
156
+ Balance { user: Address, token_id: u64 },
157
+ }
158
+
159
+ #[test]
160
+ fn multi_field_keyed_isolation() {
161
+ let env = Env::default();
162
+ let contract_id = env.register(TestContract, ());
163
+
164
+ env.as_contract(&contract_id, || {
165
+ let user1 = Address::generate(&env);
166
+ let user2 = Address::generate(&env);
167
+ let token1: u64 = 1;
168
+ let token2: u64 = 2;
169
+
170
+ // Initially all absent
171
+ assert_eq!(MultiFieldKeyed::balance(&env, &user1, token1), None);
172
+ assert_eq!(MultiFieldKeyed::balance(&env, &user1, token2), None);
173
+ assert_eq!(MultiFieldKeyed::balance(&env, &user2, token1), None);
174
+ assert_eq!(MultiFieldKeyed::balance(&env, &user2, token2), None);
175
+
176
+ // Set (user1, token1) only
177
+ MultiFieldKeyed::set_balance(&env, &user1, token1, &100);
178
+
179
+ // Only (user1, token1) should have value
180
+ assert_eq!(MultiFieldKeyed::balance(&env, &user1, token1), Some(100));
181
+ assert_eq!(MultiFieldKeyed::balance(&env, &user1, token2), None);
182
+ assert_eq!(MultiFieldKeyed::balance(&env, &user2, token1), None);
183
+ assert_eq!(MultiFieldKeyed::balance(&env, &user2, token2), None);
184
+
185
+ // Set more combinations
186
+ MultiFieldKeyed::set_balance(&env, &user1, token2, &200);
187
+ MultiFieldKeyed::set_balance(&env, &user2, token1, &300);
188
+
189
+ // Verify all three are independent
190
+ assert_eq!(MultiFieldKeyed::balance(&env, &user1, token1), Some(100));
191
+ assert_eq!(MultiFieldKeyed::balance(&env, &user1, token2), Some(200));
192
+ assert_eq!(MultiFieldKeyed::balance(&env, &user2, token1), Some(300));
193
+ assert_eq!(MultiFieldKeyed::balance(&env, &user2, token2), None);
194
+
195
+ // Remove (user1, token1) should not affect others
196
+ MultiFieldKeyed::remove_balance(&env, &user1, token1);
197
+ assert_eq!(MultiFieldKeyed::balance(&env, &user1, token1), None);
198
+ assert_eq!(MultiFieldKeyed::balance(&env, &user1, token2), Some(200));
199
+ assert_eq!(MultiFieldKeyed::balance(&env, &user2, token1), Some(300));
200
+ });
201
+ }
202
+
203
+ #[test]
204
+ fn multi_field_keyed_set_or_remove() {
205
+ let env = Env::default();
206
+ let contract_id = env.register(TestContract, ());
207
+
208
+ env.as_contract(&contract_id, || {
209
+ let user = Address::generate(&env);
210
+ let token: u64 = 42;
211
+
212
+ // has returns false when absent
213
+ assert_eq!(MultiFieldKeyed::has_balance(&env, &user, token), false);
214
+
215
+ // set_or_remove with Some sets value
216
+ MultiFieldKeyed::set_or_remove_balance(&env, &user, token, &Some(500));
217
+ assert_eq!(MultiFieldKeyed::has_balance(&env, &user, token), true);
218
+ assert_eq!(MultiFieldKeyed::balance(&env, &user, token), Some(500));
219
+
220
+ // set_or_remove with None removes value
221
+ MultiFieldKeyed::set_or_remove_balance(&env, &user, token, &None);
222
+ assert_eq!(MultiFieldKeyed::has_balance(&env, &user, token), false);
223
+ assert_eq!(MultiFieldKeyed::balance(&env, &user, token), None);
224
+ });
225
+ }
@@ -0,0 +1,4 @@
1
+ mod keyed_roundtrip;
2
+ mod name_override_runtime;
3
+ mod ttl_extension;
4
+ mod unkeyed_roundtrip;
@@ -0,0 +1,52 @@
1
+ // Runtime test: #[name] attribute generates correct function names.
2
+ //
3
+ // Purpose:
4
+ // - Validates that #[name("custom")] attribute generates functions with the custom name.
5
+ // - Ensures the generated API (custom_counter, set_custom_counter, etc.) works at runtime.
6
+ // - Complements UI test that only verifies compilation.
7
+
8
+ use soroban_sdk::{contract, contractimpl, Env};
9
+
10
+ #[common_macros::storage]
11
+ pub enum StorageKey {
12
+ #[instance(u32)]
13
+ #[default(0)]
14
+ #[name("custom_counter")]
15
+ MyInternalCounter,
16
+ }
17
+
18
+ #[contract]
19
+ pub struct MyContract;
20
+
21
+ #[contractimpl]
22
+ impl MyContract {}
23
+
24
+ #[test]
25
+ fn name_override_generates_correct_functions() {
26
+ let env = Env::default();
27
+ let contract_id = env.register(MyContract, ());
28
+
29
+ env.as_contract(&contract_id, || {
30
+ // Verify getter uses custom name (custom_counter, not my_internal_counter)
31
+ let v0 = StorageKey::custom_counter(&env);
32
+ assert_eq!(v0, 0); // default value
33
+
34
+ // Verify has uses custom name
35
+ assert_eq!(StorageKey::has_custom_counter(&env), false);
36
+
37
+ // Verify setter uses custom name
38
+ StorageKey::set_custom_counter(&env, &42);
39
+ assert_eq!(StorageKey::has_custom_counter(&env), true);
40
+ assert_eq!(StorageKey::custom_counter(&env), 42);
41
+
42
+ // Verify set_or_remove uses custom name
43
+ StorageKey::set_or_remove_custom_counter(&env, &Some(100));
44
+ assert_eq!(StorageKey::custom_counter(&env), 100);
45
+
46
+ // Verify remover uses custom name
47
+ StorageKey::remove_custom_counter(&env);
48
+ assert_eq!(StorageKey::has_custom_counter(&env), false);
49
+ assert_eq!(StorageKey::custom_counter(&env), 0); // back to default
50
+ });
51
+ }
52
+
@@ -0,0 +1,261 @@
1
+ // Runtime test: TTL extension behavior for all storage types.
2
+ //
3
+ // Purpose:
4
+ // - Validates auto TTL extension triggered by get/has operations (persistent only, with stored config).
5
+ // - Validates #[no_ttl_extension] disables auto TTL extension for persistent storage.
6
+ // - Validates manual extend_ttl function works for all storage types.
7
+ //
8
+ // Key insight for TTL calculation:
9
+ // - TTL = live_until_ledger - current_sequence
10
+ // - To trigger auto extension, set sequence so TTL = threshold
11
+
12
+ use soroban_sdk::{
13
+ contract, contractimpl,
14
+ testutils::{storage::Instance as _, storage::Persistent as _, storage::Temporary as _, Ledger as _},
15
+ BytesN, Env,
16
+ };
17
+ use utils::ttl_configurable::{TtlConfig, TtlConfigStorage};
18
+
19
+ #[contract]
20
+ pub struct TestContract;
21
+
22
+ #[contractimpl]
23
+ impl TestContract {}
24
+
25
+ // ============================================================================
26
+ // Storage enums
27
+ // ============================================================================
28
+
29
+ #[common_macros::storage]
30
+ pub enum InstanceKeyWithTtl {
31
+ #[instance(u32)]
32
+ #[default(0)]
33
+ Counter,
34
+ }
35
+
36
+ #[common_macros::storage]
37
+ pub enum PersistentKeyWithTtl {
38
+ #[persistent(i128)]
39
+ Balance { key: BytesN<32> },
40
+
41
+ #[persistent(i128)]
42
+ #[no_ttl_extension]
43
+ BalanceNoAuto { key: BytesN<32> },
44
+ }
45
+
46
+ #[common_macros::storage]
47
+ pub enum TemporaryKeyWithTtl {
48
+ #[temporary(bool)]
49
+ Flag { key: BytesN<32> },
50
+ }
51
+
52
+ // ============================================================================
53
+ // Storage enum used to verify manual TTL extension without stored config
54
+ // ============================================================================
55
+
56
+ #[common_macros::storage]
57
+ pub enum PersistentKeyNoTtl {
58
+ #[persistent(u32)]
59
+ Counter,
60
+ }
61
+
62
+ // ============================================================================
63
+ // Tests: Auto TTL extension (persistent only)
64
+ // ============================================================================
65
+
66
+ mod auto_extension {
67
+ use super::*;
68
+
69
+ #[test]
70
+ fn persistent_auto_ttl() {
71
+ let env = Env::default();
72
+ let contract_id = env.register(TestContract, ());
73
+ let cfg = env.as_contract(&contract_id, || {
74
+ let cfg = TtlConfig::new(100, 110);
75
+ TtlConfigStorage::set_persistent(&env, &cfg);
76
+ cfg
77
+ });
78
+ let k = BytesN::<32>::from_array(&env, &[1u8; 32]);
79
+
80
+ // First write to establish entry
81
+ env.as_contract(&contract_id, || {
82
+ PersistentKeyWithTtl::set_balance(&env, &k, &1);
83
+ });
84
+
85
+ // Helper closure to test TTL trigger
86
+ let test_trigger = |action: &dyn Fn(&Env)| {
87
+ // Calculate live_until_ledger from current state
88
+ let current_seq = env.ledger().sequence();
89
+ let current_ttl = env.as_contract(&contract_id, || {
90
+ env.storage().persistent().get_ttl(&PersistentKeyWithTtl::Balance(k.clone()))
91
+ });
92
+ let live_until = current_seq + current_ttl;
93
+
94
+ // Set sequence so TTL = threshold
95
+ env.ledger().set_sequence_number(live_until - cfg.threshold);
96
+
97
+ env.as_contract(&contract_id, || {
98
+ action(&env);
99
+ assert_eq!(
100
+ env.storage().persistent().get_ttl(&PersistentKeyWithTtl::Balance(k.clone())),
101
+ cfg.extend_to
102
+ );
103
+ });
104
+ };
105
+
106
+ // Test get() triggers auto TTL extension
107
+ test_trigger(&|env| {
108
+ let _ = PersistentKeyWithTtl::balance(env, &k);
109
+ });
110
+
111
+ // Test has() triggers auto TTL extension
112
+ test_trigger(&|env| {
113
+ assert!(PersistentKeyWithTtl::has_balance(env, &k));
114
+ });
115
+
116
+ // Test set() triggers auto TTL extension (setter always appends auto-extend for persistent storage)
117
+ test_trigger(&|env| {
118
+ PersistentKeyWithTtl::set_balance(env, &k, &2);
119
+ });
120
+ }
121
+
122
+ #[test]
123
+ fn persistent_no_ttl_extension_respected() {
124
+ let env = Env::default();
125
+ let contract_id = env.register(TestContract, ());
126
+ let cfg = env.as_contract(&contract_id, || {
127
+ let cfg = TtlConfig::new(100, 110);
128
+ TtlConfigStorage::set_persistent(&env, &cfg);
129
+ cfg
130
+ });
131
+ let k = BytesN::<32>::from_array(&env, &[1u8; 32]);
132
+
133
+ let baseline_ttl = env.as_contract(&contract_id, || {
134
+ PersistentKeyWithTtl::set_balance_no_auto(&env, &k, &1);
135
+ env.storage().persistent().get_ttl(&PersistentKeyWithTtl::BalanceNoAuto(k.clone()))
136
+ });
137
+
138
+ env.ledger().set_sequence_number(baseline_ttl - cfg.threshold);
139
+
140
+ env.as_contract(&contract_id, || {
141
+ let _ = PersistentKeyWithTtl::balance_no_auto(&env, &k);
142
+ let _ = PersistentKeyWithTtl::has_balance_no_auto(&env, &k);
143
+ PersistentKeyWithTtl::set_balance_no_auto(&env, &k, &2);
144
+ assert_eq!(
145
+ env.storage().persistent().get_ttl(&PersistentKeyWithTtl::BalanceNoAuto(k.clone())),
146
+ cfg.threshold
147
+ );
148
+ });
149
+ }
150
+
151
+ #[test]
152
+ fn temporary_never_auto_ttl_extends() {
153
+ let env = Env::default();
154
+ let contract_id = env.register(TestContract, ());
155
+ let cfg = env.as_contract(&contract_id, || {
156
+ let cfg = TtlConfig::new(10, 40);
157
+ TtlConfigStorage::set_persistent(&env, &cfg);
158
+ TtlConfigStorage::set_instance(&env, &cfg);
159
+ cfg
160
+ });
161
+ let k = BytesN::<32>::from_array(&env, &[3u8; 32]);
162
+
163
+ let baseline_ttl = env.as_contract(&contract_id, || {
164
+ TemporaryKeyWithTtl::set_flag(&env, &k, &true);
165
+ env.storage().temporary().get_ttl(&TemporaryKeyWithTtl::Flag(k.clone()))
166
+ });
167
+
168
+ env.ledger().set_sequence_number(baseline_ttl - cfg.threshold);
169
+
170
+ env.as_contract(&contract_id, || {
171
+ let _ = TemporaryKeyWithTtl::flag(&env, &k);
172
+ let _ = TemporaryKeyWithTtl::has_flag(&env, &k);
173
+ TemporaryKeyWithTtl::set_flag(&env, &k, &false);
174
+ assert_eq!(env.storage().temporary().get_ttl(&TemporaryKeyWithTtl::Flag(k.clone())), cfg.threshold);
175
+ });
176
+ }
177
+ }
178
+
179
+ // ============================================================================
180
+ // Tests: Manual TTL extension
181
+ // ============================================================================
182
+
183
+ mod manual_extend {
184
+ use super::*;
185
+
186
+ /// Tests manual TTL extension for all three storage types (instance, persistent, temporary).
187
+ #[test]
188
+ fn manual_extend_all_storage_types() {
189
+ let env = Env::default();
190
+ let contract_id = env.register(TestContract, ());
191
+ let k = BytesN::<32>::from_array(&env, &[1u8; 32]);
192
+
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
+ // --- Persistent storage: extend_ttl(&key, threshold, extend_to) ---
209
+ let (persistent_ttl, persistent_seq) = env.as_contract(&contract_id, || {
210
+ PersistentKeyWithTtl::set_balance(&env, &k, &100);
211
+ (env.storage().persistent().get_ttl(&PersistentKeyWithTtl::Balance(k.clone())), env.ledger().sequence())
212
+ });
213
+ let persistent_live_until = persistent_seq + persistent_ttl;
214
+ let persistent_threshold = persistent_ttl.saturating_sub(1);
215
+ let persistent_extend_to = persistent_ttl + 200;
216
+ env.ledger().set_sequence_number(persistent_live_until - persistent_threshold);
217
+ env.as_contract(&contract_id, || {
218
+ PersistentKeyWithTtl::extend_balance_ttl(&env, &k, persistent_threshold, persistent_extend_to);
219
+ let updated_ttl = env.storage().persistent().get_ttl(&PersistentKeyWithTtl::Balance(k.clone()));
220
+ assert_eq!(updated_ttl, persistent_extend_to);
221
+ });
222
+
223
+ // --- Temporary storage: extend_ttl(&key, threshold, extend_to) ---
224
+ let (temporary_ttl, temporary_seq) = env.as_contract(&contract_id, || {
225
+ TemporaryKeyWithTtl::set_flag(&env, &k, &true);
226
+ (env.storage().temporary().get_ttl(&TemporaryKeyWithTtl::Flag(k.clone())), env.ledger().sequence())
227
+ });
228
+ let temporary_live_until = temporary_seq + temporary_ttl;
229
+ let temporary_threshold = temporary_ttl.saturating_sub(1);
230
+ let temporary_extend_to = temporary_ttl + 100;
231
+ env.ledger().set_sequence_number(temporary_live_until - temporary_threshold);
232
+ env.as_contract(&contract_id, || {
233
+ TemporaryKeyWithTtl::extend_flag_ttl(&env, &k, temporary_threshold, temporary_extend_to);
234
+ let updated_ttl = env.storage().temporary().get_ttl(&TemporaryKeyWithTtl::Flag(k.clone()));
235
+ assert_eq!(updated_ttl, temporary_extend_to);
236
+ });
237
+ }
238
+
239
+ /// Tests that manual TTL extension works even without a stored TTL config.
240
+ #[test]
241
+ fn manual_extend_works_without_provider() {
242
+ let env = Env::default();
243
+ let contract_id = env.register(TestContract, ());
244
+
245
+ env.as_contract(&contract_id, || {
246
+ PersistentKeyNoTtl::set_counter(&env, &42);
247
+ let current_ttl = env.storage().persistent().get_ttl(&PersistentKeyNoTtl::Counter);
248
+ let current_seq = env.ledger().sequence();
249
+ let live_until = current_seq + current_ttl;
250
+
251
+ let threshold = current_ttl.saturating_sub(1);
252
+ let extend_to = current_ttl + 500;
253
+ env.ledger().set_sequence_number(live_until - threshold);
254
+
255
+ PersistentKeyNoTtl::extend_counter_ttl(&env, threshold, extend_to);
256
+
257
+ let updated_ttl = env.storage().persistent().get_ttl(&PersistentKeyNoTtl::Counter);
258
+ assert_eq!(updated_ttl, extend_to);
259
+ });
260
+ }
261
+ }