@layerzerolabs/protocol-stellar-v2 0.2.21 → 0.2.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/.turbo/turbo-build.log +347 -271
  2. package/.turbo/turbo-lint.log +277 -208
  3. package/.turbo/turbo-test.log +1700 -1370
  4. package/Cargo.lock +22 -51
  5. package/Cargo.toml +6 -1
  6. package/contracts/common-macros/src/auth.rs +10 -9
  7. package/contracts/common-macros/src/contract_ttl.rs +1 -4
  8. package/contracts/common-macros/src/error.rs +1 -3
  9. package/contracts/common-macros/src/lib.rs +65 -61
  10. package/contracts/common-macros/src/storage.rs +212 -65
  11. package/contracts/common-macros/src/tests/auth.rs +75 -6
  12. package/contracts/common-macros/src/tests/contract_ttl.rs +383 -350
  13. package/contracts/common-macros/src/tests/error.rs +9 -21
  14. package/contracts/common-macros/src/tests/lz_contract.rs +80 -0
  15. package/contracts/common-macros/src/tests/mod.rs +2 -0
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +20 -3
  17. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +28 -1
  18. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap +8 -43
  19. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contracttrait_code.snap +6 -29
  20. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__lz_contract__snapshot_generated_lz_contract_code.snap +31 -0
  21. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_extendable__snapshot_generated_ttl_extendable_code.snap +8 -0
  22. package/contracts/common-macros/src/tests/storage/extract_fields.rs +87 -0
  23. package/contracts/common-macros/src/tests/storage/gen_accessor_methods.rs +223 -0
  24. package/contracts/common-macros/src/tests/storage/gen_args.rs +65 -0
  25. package/contracts/common-macros/src/tests/storage/gen_enum_variant.rs +78 -0
  26. package/contracts/common-macros/src/tests/storage/gen_key.rs +108 -0
  27. package/contracts/common-macros/src/tests/storage/gen_params.rs +105 -0
  28. package/contracts/common-macros/src/tests/{storage.rs → storage/generate_storage.rs} +54 -129
  29. package/contracts/common-macros/src/tests/storage/is_primitive_type.rs +48 -0
  30. package/contracts/common-macros/src/tests/storage/mod.rs +16 -0
  31. package/contracts/common-macros/src/tests/storage/parse_default.rs +164 -0
  32. package/contracts/common-macros/src/tests/storage/parse_name.rs +159 -0
  33. package/contracts/common-macros/src/tests/storage/parse_no_ttl_extension.rs +124 -0
  34. package/contracts/common-macros/src/tests/storage/parse_storage_type.rs +174 -0
  35. package/contracts/common-macros/src/tests/storage/snapshots/common_macros__tests__storage__generate_storage__snapshot_generated_storage_code.snap +412 -0
  36. package/contracts/common-macros/src/tests/storage/storage_kind.rs +39 -0
  37. package/contracts/common-macros/src/tests/storage/test_setup.rs +25 -0
  38. package/contracts/common-macros/src/tests/storage/validate_attrs.rs +138 -0
  39. package/contracts/common-macros/src/tests/storage/variant_config.rs +226 -0
  40. package/contracts/common-macros/src/tests/test_helpers.rs +4 -10
  41. package/contracts/common-macros/src/tests/ttl_configurable.rs +2 -2
  42. package/contracts/common-macros/src/tests/ttl_extendable.rs +32 -0
  43. package/contracts/common-macros/src/tests/upgradeable.rs +118 -2
  44. package/contracts/common-macros/src/ttl_configurable.rs +1 -4
  45. package/contracts/common-macros/src/upgradeable.rs +21 -3
  46. package/contracts/endpoint-v2/Cargo.toml +0 -4
  47. package/contracts/endpoint-v2/src/endpoint_v2.rs +37 -17
  48. package/contracts/endpoint-v2/src/errors.rs +26 -1
  49. package/contracts/endpoint-v2/src/interfaces/layerzero_endpoint_v2.rs +1 -1
  50. package/contracts/endpoint-v2/src/interfaces/message_lib_manager.rs +4 -4
  51. package/contracts/endpoint-v2/src/interfaces/messaging_composer.rs +2 -2
  52. package/contracts/endpoint-v2/src/lib.rs +0 -1
  53. package/contracts/endpoint-v2/src/message_lib_manager.rs +39 -8
  54. package/contracts/endpoint-v2/src/messaging_channel.rs +36 -4
  55. package/contracts/endpoint-v2/src/messaging_composer.rs +18 -4
  56. package/contracts/endpoint-v2/src/storage.rs +9 -1
  57. package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +2 -2
  58. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +1 -1
  59. package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +2 -2
  60. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +3 -3
  61. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +5 -5
  62. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +2 -2
  63. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +5 -5
  64. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +3 -3
  65. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +1 -1
  66. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +4 -3
  67. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +7 -2
  68. package/contracts/endpoint-v2/src/tests/messaging_composer/mod.rs +4 -0
  69. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +7 -2
  70. package/contracts/layerzero-views/src/layerzero_view.rs +0 -1
  71. package/contracts/layerzero-views/src/tests/mod.rs +1 -0
  72. package/contracts/layerzero-views/src/tests/types_tests.rs +31 -0
  73. package/contracts/layerzero-views/src/types.rs +2 -3
  74. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/constructor.rs +61 -0
  75. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/contract_impl_ttl_extension.rs +97 -0
  76. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/contract_trait_ttl_extension.rs +99 -0
  77. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/mod.rs +3 -0
  78. package/contracts/macro-integration-tests/tests/runtime/lz_contract/mod.rs +5 -0
  79. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_default.rs +86 -0
  80. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_multisig.rs +47 -0
  81. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_multisig_upgradeable.rs +77 -0
  82. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_upgradeable.rs +114 -0
  83. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_upgradeable_no_migration.rs +105 -0
  84. package/contracts/macro-integration-tests/tests/runtime/multisig/admin_entrypoints.rs +242 -0
  85. package/contracts/macro-integration-tests/tests/runtime/multisig/mod.rs +9 -0
  86. package/contracts/macro-integration-tests/tests/runtime/multisig/self_auth.rs +54 -0
  87. package/contracts/macro-integration-tests/tests/runtime/ownable/initialization.rs +13 -0
  88. package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +1 -0
  89. package/contracts/macro-integration-tests/tests/runtime/ownable/ownership_transfer.rs +70 -1
  90. package/contracts/macro-integration-tests/tests/runtime/ownable/two_step_transfer.rs +219 -0
  91. package/contracts/macro-integration-tests/tests/runtime/storage/keyed_roundtrip.rs +41 -0
  92. package/contracts/macro-integration-tests/tests/runtime/storage/ttl_extension.rs +48 -16
  93. package/contracts/macro-integration-tests/tests/runtime/storage/unkeyed_roundtrip.rs +10 -0
  94. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +96 -3
  95. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +4 -0
  96. package/contracts/macro-integration-tests/tests/runtime/ttl_extendable/extend_instance_ttl.rs +64 -0
  97. package/contracts/macro-integration-tests/tests/runtime/ttl_extendable/mod.rs +16 -0
  98. package/contracts/macro-integration-tests/tests/runtime/upgradeable/migrate_guard_and_state.rs +305 -0
  99. package/contracts/macro-integration-tests/tests/runtime/upgradeable/mod.rs +3 -0
  100. package/contracts/macro-integration-tests/tests/runtime/upgradeable/no_migration.rs +59 -0
  101. package/contracts/macro-integration-tests/tests/runtime/upgradeable/upgrade_then_migrate.rs +88 -0
  102. package/contracts/macro-integration-tests/tests/runtime.rs +5 -0
  103. package/contracts/macro-integration-tests/tests/ui/contract_impl/fail/not_impl_item.rs +6 -0
  104. package/contracts/macro-integration-tests/tests/ui/contract_impl/fail/not_impl_item.stderr +7 -0
  105. package/contracts/macro-integration-tests/tests/ui/contract_impl/pass/basic.rs +102 -0
  106. package/contracts/macro-integration-tests/tests/ui/contract_trait/fail/not_a_trait.rs +6 -0
  107. package/contracts/macro-integration-tests/tests/ui/contract_trait/fail/not_a_trait.stderr +7 -0
  108. package/contracts/macro-integration-tests/tests/ui/contract_trait/pass/basic.rs +83 -0
  109. package/contracts/macro-integration-tests/tests/ui/error/fail/discriminant_too_large.rs +11 -0
  110. package/contracts/macro-integration-tests/tests/ui/error/fail/discriminant_too_large.stderr +7 -0
  111. package/contracts/macro-integration-tests/tests/ui/error/fail/non_enum_input.rs +11 -0
  112. package/contracts/macro-integration-tests/tests/ui/error/fail/non_enum_input.stderr +7 -0
  113. package/contracts/macro-integration-tests/tests/ui/error/pass/basic.rs +22 -0
  114. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/invalid_option.rs +6 -0
  115. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/invalid_option.stderr +7 -0
  116. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/multisig_rejects_ownable_api.rs +20 -0
  117. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/multisig_rejects_ownable_api.stderr +20 -0
  118. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/not_a_struct.rs +8 -0
  119. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/not_a_struct.stderr +7 -0
  120. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_invalid_inner_option.rs +10 -0
  121. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_invalid_inner_option.stderr +7 -0
  122. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_missing_internal.rs +20 -0
  123. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_missing_internal.stderr +86 -0
  124. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/basic.rs +45 -0
  125. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/multisig.rs +34 -0
  126. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/multisig_upgradeable.rs +30 -0
  127. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/upgradeable.rs +39 -0
  128. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/upgradeable_no_migration.rs +28 -0
  129. package/contracts/macro-integration-tests/tests/ui/multisig/fail/non_struct_input.rs +8 -0
  130. package/contracts/macro-integration-tests/tests/ui/multisig/fail/non_struct_input.stderr +7 -0
  131. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_api.rs +20 -0
  132. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_api.stderr +12 -0
  133. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_trait.rs +20 -0
  134. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_trait.stderr +5 -0
  135. package/contracts/macro-integration-tests/tests/ui/multisig/pass/basic.rs +49 -0
  136. package/contracts/macro-integration-tests/tests/ui/ownable/fail/non_struct_input.rs +8 -0
  137. package/contracts/macro-integration-tests/tests/ui/ownable/fail/non_struct_input.stderr +7 -0
  138. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_auth.rs +19 -0
  139. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_auth.stderr +12 -0
  140. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.rs +1 -1
  141. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.stderr +0 -8
  142. package/contracts/macro-integration-tests/tests/ui/ownable/pass/basic.rs +39 -0
  143. package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_auth_env_param_variants.rs +7 -1
  144. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.stderr +1 -1
  145. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.stderr +1 -1
  146. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_default_values.rs +11 -0
  147. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_default_values.stderr +7 -0
  148. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_name_attrs.rs +11 -0
  149. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_name_attrs.stderr +7 -0
  150. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_no_ttl_extension.rs +11 -0
  151. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_no_ttl_extension.stderr +7 -0
  152. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.stderr +1 -1
  153. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_rejects_args.rs +13 -0
  154. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_rejects_args.stderr +7 -0
  155. package/contracts/macro-integration-tests/tests/ui/storage/pass/api_surface.rs +102 -0
  156. package/contracts/macro-integration-tests/tests/ui/storage/pass/basic.rs +43 -0
  157. package/contracts/macro-integration-tests/tests/ui/storage/pass/multi_key.rs +38 -0
  158. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/missing_auth_trait.rs +14 -0
  159. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/missing_auth_trait.stderr +71 -0
  160. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/non_struct_input.rs +8 -0
  161. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/non_struct_input.stderr +7 -0
  162. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/{minimal_contract.rs → basic.rs} +2 -0
  163. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/multisig_contract.rs +28 -0
  164. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/ownable_contract.rs +32 -0
  165. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/fail/non_struct_input.rs +8 -0
  166. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/fail/non_struct_input.stderr +7 -0
  167. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/pass/basic.rs +23 -0
  168. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/pass/no_user_contractimpl.rs +21 -0
  169. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/attr_args.rs +11 -0
  170. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/attr_args.stderr +29 -0
  171. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_auth_trait.rs +20 -0
  172. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_auth_trait.stderr +71 -0
  173. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_upgradeable_internal.rs +10 -0
  174. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_upgradeable_internal.stderr +79 -0
  175. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/non_struct_input.rs +8 -0
  176. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/non_struct_input.stderr +7 -0
  177. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/basic.rs +43 -0
  178. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/multisig_contract.rs +35 -0
  179. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/no_migration.rs +30 -0
  180. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/no_user_contractimpl.rs +29 -0
  181. package/contracts/macro-integration-tests/tests/ui_contract_impl.rs +12 -0
  182. package/contracts/macro-integration-tests/tests/ui_contract_trait.rs +12 -0
  183. package/contracts/macro-integration-tests/tests/ui_lz_contract.rs +11 -0
  184. package/contracts/macro-integration-tests/tests/ui_multisig.rs +11 -0
  185. package/contracts/macro-integration-tests/tests/ui_ttl_extendable.rs +12 -0
  186. package/contracts/macro-integration-tests/tests/ui_upgradeable.rs +11 -0
  187. package/contracts/message-libs/blocked-message-lib/Cargo.toml +1 -1
  188. package/contracts/message-libs/blocked-message-lib/src/lib.rs +4 -1
  189. package/contracts/message-libs/blocked-message-lib/src/tests/blocked_message_lib_tests.rs +108 -0
  190. package/contracts/message-libs/blocked-message-lib/src/tests/mod.rs +4 -0
  191. package/contracts/message-libs/blocked-message-lib/src/tests/setup.rs +40 -0
  192. package/contracts/message-libs/simple-message-lib/src/lib.rs +1 -1
  193. package/contracts/message-libs/simple-message-lib/src/tests/mod.rs +2 -0
  194. package/contracts/message-libs/simple-message-lib/src/tests/setup.rs +124 -0
  195. package/contracts/message-libs/simple-message-lib/src/tests/simple_message_lib_tests.rs +309 -0
  196. package/contracts/message-libs/uln-302/src/errors.rs +21 -0
  197. package/contracts/message-libs/uln-302/src/interfaces/receive_uln.rs +1 -1
  198. package/contracts/message-libs/uln-302/src/receive_uln.rs +6 -4
  199. package/contracts/message-libs/uln-302/src/send_uln.rs +15 -6
  200. package/contracts/message-libs/uln-302/src/storage.rs +5 -5
  201. package/contracts/message-libs/uln-302/src/tests/uln302/get_config.rs +71 -0
  202. package/contracts/message-libs/uln-302/src/tests/uln302/mod.rs +1 -0
  203. package/contracts/message-libs/uln-302/src/uln302.rs +3 -0
  204. package/contracts/oapps/counter/Cargo.toml +2 -0
  205. package/contracts/oapps/counter/integration_tests/mod.rs +1 -0
  206. package/contracts/oapps/counter/integration_tests/setup_sml.rs +6 -4
  207. package/contracts/oapps/counter/integration_tests/setup_uln.rs +12 -5
  208. package/contracts/oapps/counter/integration_tests/test_with_blocked.rs +67 -0
  209. package/contracts/oapps/counter/src/tests/mod.rs +1 -0
  210. package/contracts/oapps/counter/src/tests/test_u256_ext.rs +48 -0
  211. package/contracts/oapps/oapp/src/lib.rs +0 -3
  212. package/contracts/oapps/oapp/src/tests/mod.rs +1 -0
  213. package/contracts/oapps/oft/integration-tests/setup.rs +2 -3
  214. package/contracts/oapps/oft/src/lib.rs +3 -0
  215. package/contracts/oapps/oft/src/tests/extensions/mod.rs +3 -0
  216. package/contracts/oapps/oft/src/tests/extensions/oft_fee.rs +240 -0
  217. package/contracts/oapps/oft/src/tests/extensions/pausable.rs +141 -0
  218. package/contracts/oapps/oft/src/tests/extensions/rate_limiter.rs +447 -0
  219. package/contracts/oapps/oft/src/tests/mod.rs +2 -0
  220. package/contracts/oapps/oft/src/tests/oft_types/lock_unlock.rs +180 -0
  221. package/contracts/oapps/oft/src/tests/oft_types/mod.rs +1 -0
  222. package/contracts/oapps/oft-core/integration-tests/setup.rs +2 -3
  223. package/contracts/oapps/oft-core/src/lib.rs +2 -2
  224. package/contracts/oapps/oft-core/src/tests/mod.rs +1 -1
  225. package/contracts/oapps/oft-core/src/tests/{test_oft_version.rs → test_oft_version_and_approval.rs} +9 -0
  226. package/contracts/oapps/oft-core/src/tests/test_utils.rs +0 -43
  227. package/contracts/upgrader/src/tests/test_upgrader.rs +18 -0
  228. package/contracts/utils/src/auth.rs +2 -2
  229. package/contracts/utils/src/buffer_reader.rs +61 -10
  230. package/contracts/utils/src/buffer_writer.rs +35 -20
  231. package/contracts/utils/src/bytes_ext.rs +1 -2
  232. package/contracts/utils/src/errors.rs +5 -3
  233. package/contracts/utils/src/multisig.rs +59 -36
  234. package/contracts/utils/src/option_ext.rs +3 -3
  235. package/contracts/utils/src/ownable.rs +12 -6
  236. package/contracts/utils/src/tests/auth.rs +179 -0
  237. package/contracts/utils/src/tests/buffer_reader.rs +203 -1
  238. package/contracts/utils/src/tests/buffer_writer.rs +176 -5
  239. package/contracts/utils/src/tests/mod.rs +2 -0
  240. package/contracts/utils/src/tests/multisig.rs +170 -141
  241. package/contracts/utils/src/tests/option_ext.rs +1 -1
  242. package/contracts/utils/src/tests/ownable.rs +156 -161
  243. package/contracts/utils/src/tests/test_helper.rs +21 -1
  244. package/contracts/utils/src/tests/testing_utils.rs +84 -2
  245. package/contracts/utils/src/tests/ttl_configurable.rs +66 -86
  246. package/contracts/utils/src/tests/ttl_extendable.rs +64 -0
  247. package/contracts/utils/src/tests/upgradeable.rs +115 -6
  248. package/contracts/utils/src/ttl_configurable.rs +22 -12
  249. package/contracts/utils/src/ttl_extendable.rs +1 -3
  250. package/contracts/utils/src/upgradeable.rs +21 -24
  251. package/contracts/workers/dvn/src/auth.rs +1 -1
  252. package/contracts/workers/dvn/src/interfaces/dvn.rs +2 -2
  253. package/contracts/workers/dvn/src/storage.rs +1 -1
  254. package/contracts/workers/dvn/src/tests/auth.rs +136 -3
  255. package/contracts/workers/dvn/src/tests/mod.rs +0 -1
  256. package/contracts/workers/dvn/src/tests/setup.rs +4 -10
  257. package/contracts/workers/executor-helper/src/tests/executor_helper.rs +279 -0
  258. package/contracts/workers/executor-helper/src/tests/setup.rs +106 -1
  259. package/contracts/workers/worker/src/worker.rs +1 -1
  260. package/docs/oft-guide.md +5 -5
  261. package/package.json +5 -7
  262. package/sdk/.turbo/turbo-test.log +662 -466
  263. package/sdk/LICENSE +23 -0
  264. package/sdk/dist/generated/bml.d.ts +101 -106
  265. package/sdk/dist/generated/bml.js +108 -26
  266. package/sdk/dist/generated/counter.d.ts +123 -484
  267. package/sdk/dist/generated/counter.js +103 -25
  268. package/sdk/dist/generated/dvn.d.ts +141 -699
  269. package/sdk/dist/generated/dvn.js +106 -28
  270. package/sdk/dist/generated/dvn_fee_lib.d.ts +31 -248
  271. package/sdk/dist/generated/dvn_fee_lib.js +27 -24
  272. package/sdk/dist/generated/endpoint.d.ts +158 -836
  273. package/sdk/dist/generated/endpoint.js +107 -29
  274. package/sdk/dist/generated/executor.d.ts +139 -671
  275. package/sdk/dist/generated/executor.js +106 -28
  276. package/sdk/dist/generated/executor_fee_lib.d.ts +109 -264
  277. package/sdk/dist/generated/executor_fee_lib.js +106 -28
  278. package/sdk/dist/generated/executor_helper.d.ts +95 -92
  279. package/sdk/dist/generated/executor_helper.js +103 -25
  280. package/sdk/dist/generated/layerzero_view.d.ts +178 -335
  281. package/sdk/dist/generated/layerzero_view.js +172 -33
  282. package/sdk/dist/generated/oft.d.ts +137 -680
  283. package/sdk/dist/generated/oft.js +103 -25
  284. package/sdk/dist/generated/price_feed.d.ts +45 -444
  285. package/sdk/dist/generated/price_feed.js +27 -24
  286. package/sdk/dist/generated/sml.d.ts +119 -428
  287. package/sdk/dist/generated/sml.js +103 -25
  288. package/sdk/dist/generated/treasury.d.ts +109 -288
  289. package/sdk/dist/generated/treasury.js +103 -25
  290. package/sdk/dist/generated/uln302.d.ts +190 -527
  291. package/sdk/dist/generated/uln302.js +170 -31
  292. package/sdk/dist/generated/upgrader.d.ts +14 -34
  293. package/sdk/dist/generated/upgrader.js +24 -21
  294. package/sdk/package.json +3 -4
  295. package/sdk/test/counter-sml.test.ts +218 -142
  296. package/sdk/test/counter-uln.test.ts +189 -145
  297. package/sdk/test/oft-sml.test.ts +173 -156
  298. package/sdk/test/suites/constants.ts +7 -1
  299. package/sdk/test/suites/globalSetup.ts +140 -74
  300. package/sdk/turbo.json +1 -1
  301. package/tools/ts-bindings-gen/Cargo.toml +4 -4
  302. package/tools/ts-bindings-gen/src/main.rs +4 -0
  303. package/turbo.json +3 -0
  304. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +0 -1072
  305. package/contracts/endpoint-v2/src/constants.rs +0 -52
  306. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.rs +0 -12
  307. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.stderr +0 -7
  308. package/contracts/macro-integration-tests/tests/ui/error/pass/attr_on_variant_allowed.rs +0 -20
  309. package/contracts/macro-integration-tests/tests/ui/error/pass/basic_auto_discriminants.rs +0 -15
  310. package/contracts/macro-integration-tests/tests/ui/error/pass/mixed_discriminants.rs +0 -16
  311. package/contracts/macro-integration-tests/tests/ui/ownable/pass/minimal_contract.rs +0 -26
  312. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +0 -21
  313. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.rs +0 -12
  314. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.stderr +0 -7
  315. package/contracts/macro-integration-tests/tests/ui/storage/pass/default_value_on_variant.rs +0 -14
  316. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_instance_unit_basic.rs +0 -14
  317. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_persistent_named_fields_keyed.rs +0 -16
  318. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_temporary_unit_option.rs +0 -15
  319. package/contracts/macro-integration-tests/tests/ui/storage/pass/name_override.rs +0 -14
  320. package/contracts/macro-integration-tests/tests/ui/storage/pass/no_auto_ttl_extension.rs +0 -19
  321. package/contracts/macro-integration-tests/tests/ui/storage/pass/ttl_provider_basic.rs +0 -15
  322. package/contracts/message-libs/simple-message-lib/src/test.rs +0 -280
  323. package/contracts/oapps/oapp/src/macro_tests/mod.rs +0 -1
  324. package/contracts/workers/dvn/src/tests/multisig/mod.rs +0 -3
  325. package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +0 -132
  326. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +0 -109
  327. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +0 -106
  328. /package/contracts/oapps/oapp/src/{macro_tests → tests}/test_macros.rs +0 -0
@@ -11,7 +11,7 @@ fn test_require_receive_lib_for_eid_unregistered_lib() {
11
11
  let endpoint_client = &context.endpoint_client;
12
12
 
13
13
  let lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
14
- env.as_contract(&endpoint_client.address, || EndpointV2::require_receive_lib_for_eid(env, &lib, context.eid));
14
+ env.as_contract(&endpoint_client.address, || EndpointV2::require_receive_lib_for_eid_for_test(env, &lib, context.eid));
15
15
  }
16
16
 
17
17
  #[test]
@@ -24,7 +24,7 @@ fn test_require_receive_lib_for_eid_wrong_lib_type() {
24
24
  let lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
25
25
  context.register_library_with_auth(&lib);
26
26
 
27
- env.as_contract(&endpoint_client.address, || EndpointV2::require_receive_lib_for_eid(env, &lib, context.eid));
27
+ env.as_contract(&endpoint_client.address, || EndpointV2::require_receive_lib_for_eid_for_test(env, &lib, context.eid));
28
28
  }
29
29
 
30
30
  #[test]
@@ -38,7 +38,7 @@ fn test_require_receive_lib_for_eid_unsupported_eid() {
38
38
  let lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
39
39
  context.register_library_with_auth(&lib);
40
40
 
41
- env.as_contract(&endpoint_client.address, || EndpointV2::require_receive_lib_for_eid(env, &lib, unsupported_eid));
41
+ env.as_contract(&endpoint_client.address, || EndpointV2::require_receive_lib_for_eid_for_test(env, &lib, unsupported_eid));
42
42
  }
43
43
 
44
44
  #[test]
@@ -50,12 +50,12 @@ fn test_require_receive_lib_for_eid_success_for_receive_and_send_and_receive() {
50
50
  let receive_lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
51
51
  context.register_library_with_auth(&receive_lib);
52
52
  env.as_contract(&endpoint_client.address, || {
53
- EndpointV2::require_receive_lib_for_eid(env, &receive_lib, context.eid)
53
+ EndpointV2::require_receive_lib_for_eid_for_test(env, &receive_lib, context.eid)
54
54
  });
55
55
 
56
56
  let send_and_receive = context.setup_mock_message_lib(MessageLibType::SendAndReceive, vec![env, context.eid]);
57
57
  context.register_library_with_auth(&send_and_receive);
58
58
  env.as_contract(&endpoint_client.address, || {
59
- EndpointV2::require_receive_lib_for_eid(env, &send_and_receive, context.eid)
59
+ EndpointV2::require_receive_lib_for_eid_for_test(env, &send_and_receive, context.eid)
60
60
  });
61
61
  }
@@ -15,7 +15,7 @@ fn test_require_registered_with_unregistered_lib() {
15
15
  let endpoint_client = &context.endpoint_client;
16
16
  let unregistered_lib = Address::generate(env);
17
17
 
18
- env.as_contract(&endpoint_client.address, || EndpointV2::require_registered(env, &unregistered_lib));
18
+ env.as_contract(&endpoint_client.address, || EndpointV2::require_registered_for_test(env, &unregistered_lib));
19
19
  }
20
20
 
21
21
  #[test]
@@ -29,5 +29,5 @@ fn test_require_registered_with_registered_lib() {
29
29
  context.register_library_with_auth(&lib);
30
30
 
31
31
  // Should not panic
32
- env.as_contract(&endpoint_client.address, || EndpointV2::require_registered(env, &lib));
32
+ env.as_contract(&endpoint_client.address, || EndpointV2::require_registered_for_test(env, &lib));
33
33
  }
@@ -11,7 +11,7 @@ fn test_require_send_lib_for_eid_unregistered_lib() {
11
11
  let endpoint_client = &context.endpoint_client;
12
12
 
13
13
  let lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
14
- env.as_contract(&endpoint_client.address, || EndpointV2::require_send_lib_for_eid(env, &lib, context.eid));
14
+ env.as_contract(&endpoint_client.address, || EndpointV2::require_send_lib_for_eid_for_test(env, &lib, context.eid));
15
15
  }
16
16
 
17
17
  #[test]
@@ -24,7 +24,7 @@ fn test_require_send_lib_for_eid_wrong_lib_type() {
24
24
  let lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
25
25
  context.register_library_with_auth(&lib);
26
26
 
27
- env.as_contract(&endpoint_client.address, || EndpointV2::require_send_lib_for_eid(env, &lib, context.eid));
27
+ env.as_contract(&endpoint_client.address, || EndpointV2::require_send_lib_for_eid_for_test(env, &lib, context.eid));
28
28
  }
29
29
 
30
30
  #[test]
@@ -38,7 +38,7 @@ fn test_require_send_lib_for_eid_unsupported_eid() {
38
38
  let lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
39
39
  context.register_library_with_auth(&lib);
40
40
 
41
- env.as_contract(&endpoint_client.address, || EndpointV2::require_send_lib_for_eid(env, &lib, unsupported_eid));
41
+ env.as_contract(&endpoint_client.address, || EndpointV2::require_send_lib_for_eid_for_test(env, &lib, unsupported_eid));
42
42
  }
43
43
 
44
44
  #[test]
@@ -49,11 +49,11 @@ fn test_require_send_lib_for_eid_success_for_send_and_send_and_receive() {
49
49
 
50
50
  let send_lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
51
51
  context.register_library_with_auth(&send_lib);
52
- env.as_contract(&endpoint_client.address, || EndpointV2::require_send_lib_for_eid(env, &send_lib, context.eid));
52
+ env.as_contract(&endpoint_client.address, || EndpointV2::require_send_lib_for_eid_for_test(env, &send_lib, context.eid));
53
53
 
54
54
  let send_and_receive = context.setup_mock_message_lib(MessageLibType::SendAndReceive, vec![env, context.eid]);
55
55
  context.register_library_with_auth(&send_and_receive);
56
56
  env.as_contract(&endpoint_client.address, || {
57
- EndpointV2::require_send_lib_for_eid(env, &send_and_receive, context.eid)
57
+ EndpointV2::require_send_lib_for_eid_for_test(env, &send_and_receive, context.eid)
58
58
  });
59
59
  }
@@ -10,7 +10,7 @@ fn test_require_supported_eid_with_supported() {
10
10
  let endpoint_client = &context.endpoint_client;
11
11
 
12
12
  let send_lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
13
- env.as_contract(&endpoint_client.address, || EndpointV2::require_supported_eid(env, &send_lib, context.eid));
13
+ env.as_contract(&endpoint_client.address, || EndpointV2::require_supported_eid_for_test(env, &send_lib, context.eid));
14
14
  }
15
15
 
16
16
  // The require_supported_eid rejects when the library does not support the EID
@@ -23,7 +23,7 @@ fn test_require_supported_eid_with_unsupported() {
23
23
 
24
24
  let unsupported_eid = context.eid + 1;
25
25
  let send_lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
26
- env.as_contract(&endpoint_client.address, || EndpointV2::require_supported_eid(env, &send_lib, unsupported_eid));
26
+ env.as_contract(&endpoint_client.address, || EndpointV2::require_supported_eid_for_test(env, &send_lib, unsupported_eid));
27
27
  }
28
28
 
29
29
  // The require_supported_eid panics if the library address has no deployed contract
@@ -37,6 +37,6 @@ fn test_require_supported_eid_with_non_deployed_lib() {
37
37
  // Address that doesn't have a contract deployed
38
38
  let non_existent_lib = Address::generate(env);
39
39
  env.as_contract(&endpoint_client.address, || {
40
- EndpointV2::require_supported_eid(env, &non_existent_lib, context.eid)
40
+ EndpointV2::require_supported_eid_for_test(env, &non_existent_lib, context.eid)
41
41
  });
42
42
  }
@@ -10,7 +10,7 @@ use crate::{
10
10
  fn nil_hash(context: &TestSetup) -> BytesN<32> {
11
11
  let env = &context.env;
12
12
  let endpoint_client = &context.endpoint_client;
13
- env.as_contract(&endpoint_client.address, || EndpointV2::nil_payload_hash(env))
13
+ env.as_contract(&endpoint_client.address, || EndpointV2::nil_payload_hash_for_test(env))
14
14
  }
15
15
 
16
16
  fn nilify_with_auth(
@@ -2,11 +2,12 @@ use soroban_sdk::{testutils::Address as _, Address, Bytes, BytesN};
2
2
  use utils::testing_utils::assert_eq_event;
3
3
 
4
4
  use crate::{
5
- constants::{MAX_COMPOSE_INDEX, RECEIVED_MESSAGE_HASH_BYTES},
6
5
  errors::EndpointError,
7
6
  events::ComposeDelivered,
8
- tests::endpoint_setup::setup,
9
- tests::endpoint_setup::TestSetup,
7
+ tests::{
8
+ endpoint_setup::{setup, TestSetup},
9
+ messaging_composer::{MAX_COMPOSE_INDEX, RECEIVED_MESSAGE_HASH_BYTES},
10
+ },
10
11
  util::keccak256,
11
12
  };
12
13
 
@@ -2,8 +2,13 @@ use soroban_sdk::{testutils::Address as _, Address, Bytes, BytesN, Env};
2
2
  use utils::testing_utils::assert_eq_event;
3
3
 
4
4
  use crate::{
5
- constants::MAX_COMPOSE_INDEX, endpoint_v2::EndpointV2Client, errors::EndpointError, events::LzComposeAlert,
6
- tests::endpoint_setup::setup, tests::endpoint_setup::TestSetup,
5
+ endpoint_v2::EndpointV2Client,
6
+ errors::EndpointError,
7
+ events::LzComposeAlert,
8
+ tests::{
9
+ endpoint_setup::{setup, TestSetup},
10
+ messaging_composer::MAX_COMPOSE_INDEX,
11
+ },
7
12
  };
8
13
 
9
14
  // Helpers
@@ -2,3 +2,7 @@ mod clear_compose;
2
2
  mod compose_queue;
3
3
  mod lz_compose_alert;
4
4
  mod send_compose;
5
+
6
+ pub(crate) const MAX_COMPOSE_INDEX: u32 = u16::MAX as u32;
7
+ pub(crate) const RECEIVED_MESSAGE_HASH_BYTES: [u8; 32] =
8
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1];
@@ -2,8 +2,13 @@ use soroban_sdk::{testutils::Address as _, Address, Bytes, BytesN};
2
2
  use utils::testing_utils::assert_eq_event;
3
3
 
4
4
  use crate::{
5
- constants::MAX_COMPOSE_INDEX, errors::EndpointError, events::ComposeSent, tests::endpoint_setup::setup,
6
- tests::endpoint_setup::TestSetup, util::keccak256,
5
+ errors::EndpointError,
6
+ events::ComposeSent,
7
+ tests::{
8
+ endpoint_setup::{setup, TestSetup},
9
+ messaging_composer::MAX_COMPOSE_INDEX,
10
+ },
11
+ util::keccak256,
7
12
  };
8
13
 
9
14
  fn try_send_compose_with_auth(
@@ -211,4 +211,3 @@ impl LayerZeroView {
211
211
  true
212
212
  }
213
213
  }
214
-
@@ -2,3 +2,4 @@
2
2
 
3
3
  mod layerzero_view_tests;
4
4
  mod setup;
5
+ mod types_tests;
@@ -0,0 +1,31 @@
1
+ //! Unit tests for types module helper functions.
2
+
3
+ use soroban_sdk::{BytesN, Env};
4
+
5
+ use crate::types::{empty_payload_hash, nil_payload_hash};
6
+
7
+ // ============================================================================
8
+ // empty_payload_hash tests
9
+ // ============================================================================
10
+
11
+ #[test]
12
+ fn test_empty_payload_hash_returns_all_zeros() {
13
+ let env = Env::default();
14
+ let hash = empty_payload_hash(&env);
15
+
16
+ // Verify it matches the expected constant
17
+ assert_eq!(hash.to_array(), BytesN::from_array(&env, &[0u8; 32]));
18
+ }
19
+
20
+ // ============================================================================
21
+ // nil_payload_hash tests
22
+ // ============================================================================
23
+
24
+ #[test]
25
+ fn test_nil_payload_hash_returns_all_0xff() {
26
+ let env = Env::default();
27
+ let hash = nil_payload_hash(&env);
28
+
29
+ // Verify it matches the expected constant
30
+ assert_eq!(hash.to_array(), BytesN::from_array(&env, &[0xffu8; 32]));
31
+ }
@@ -1,6 +1,5 @@
1
1
  //! Shared types for LayerZero view contracts.
2
2
 
3
- use endpoint_v2::constants::{EMPTY_PAYLOAD_HASH_BYTES, NIL_PAYLOAD_HASH_BYTES};
4
3
  use soroban_sdk::{contracttype, BytesN, Env};
5
4
 
6
5
  /// Represents the execution state of a cross-chain message.
@@ -41,10 +40,10 @@ pub enum VerificationState {
41
40
 
42
41
  /// Returns the empty payload hash as BytesN<32>.
43
42
  pub fn empty_payload_hash(env: &Env) -> BytesN<32> {
44
- BytesN::from_array(env, &EMPTY_PAYLOAD_HASH_BYTES)
43
+ BytesN::from_array(env, &[0u8; 32])
45
44
  }
46
45
 
47
46
  /// Returns the nil payload hash as BytesN<32>.
48
47
  pub fn nil_payload_hash(env: &Env) -> BytesN<32> {
49
- BytesN::from_array(env, &NIL_PAYLOAD_HASH_BYTES)
48
+ BytesN::from_array(env, &[0xffu8; 32])
50
49
  }
@@ -0,0 +1,61 @@
1
+ // Runtime tests: `#[contract_impl]` injects default TTL config initialization into `__constructor`.
2
+ //
3
+ // This validates behavior end-to-end at runtime (not just snapshot tests):
4
+ // - Registering a contract that defines `__constructor` should initialize default TTL configs
5
+ // via `utils::ttl_configurable::init_default_ttl_configs`.
6
+
7
+ use soroban_sdk::{contract, Env};
8
+ use utils::ttl_configurable::{TtlConfig, TtlConfigStorage, LEDGERS_PER_DAY};
9
+
10
+ #[contract]
11
+ pub struct CtorContract;
12
+
13
+ #[common_macros::contract_impl]
14
+ impl CtorContract {
15
+ // Constructor signature uses &Env to exercise the `env` (not `&env`) injection path.
16
+ pub fn __constructor(env: &Env) {
17
+ let _ = env;
18
+ }
19
+ }
20
+
21
+ #[test]
22
+ fn constructor_initializes_default_ttl_configs() {
23
+ let env = Env::default();
24
+
25
+ // Registering with `()` will invoke `__constructor`.
26
+ let contract_id = env.register(CtorContract, ());
27
+
28
+ let (instance_cfg, persistent_cfg) = env.as_contract(&contract_id, || {
29
+ (TtlConfigStorage::instance(&env), TtlConfigStorage::persistent(&env))
30
+ });
31
+
32
+ let expected = TtlConfig::new(29 * LEDGERS_PER_DAY, 30 * LEDGERS_PER_DAY);
33
+ assert_eq!(instance_cfg, Some(expected));
34
+ assert_eq!(persistent_cfg, Some(expected));
35
+ }
36
+
37
+ #[contract]
38
+ pub struct CtorOwnedEnvContract;
39
+
40
+ #[common_macros::contract_impl]
41
+ impl CtorOwnedEnvContract {
42
+ // Owned Env to exercise the `&env` injection path.
43
+ pub fn __constructor(env: Env) {
44
+ let _ = env;
45
+ }
46
+ }
47
+
48
+ #[test]
49
+ fn constructor_with_owned_env_initializes_default_ttl_configs() {
50
+ let env = Env::default();
51
+ let contract_id = env.register(CtorOwnedEnvContract, ());
52
+
53
+ let (instance_cfg, persistent_cfg) = env.as_contract(&contract_id, || {
54
+ (TtlConfigStorage::instance(&env), TtlConfigStorage::persistent(&env))
55
+ });
56
+
57
+ let expected = TtlConfig::new(29 * LEDGERS_PER_DAY, 30 * LEDGERS_PER_DAY);
58
+ assert_eq!(instance_cfg, Some(expected));
59
+ assert_eq!(persistent_cfg, Some(expected));
60
+ }
61
+
@@ -0,0 +1,97 @@
1
+ // Runtime tests: `#[contract_impl]` injects instance TTL extension.
2
+
3
+ use soroban_sdk::{contract, testutils::storage::Instance as _, testutils::Ledger as _, Env};
4
+ use utils::ttl_configurable::{TtlConfig, TtlConfigStorage};
5
+
6
+ #[contract]
7
+ pub struct TestContract;
8
+
9
+ #[common_macros::contract_impl]
10
+ impl TestContract {
11
+ pub fn ping(env: &Env) {
12
+ let _ = env;
13
+ }
14
+ }
15
+
16
+ #[test]
17
+ fn ping_extends_instance_ttl_when_configured() {
18
+ let env = Env::default();
19
+ let contract_id = env.register(TestContract, ());
20
+
21
+ // Seed instance storage so TTL is present.
22
+ env.as_contract(&contract_id, || {
23
+ env.storage().instance().set(&soroban_sdk::Symbol::new(&env, "seed"), &true);
24
+ });
25
+
26
+ let before = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
27
+ let before_seq = env.ledger().sequence();
28
+ let live_until = before_seq + before;
29
+
30
+ // Configure the injected TTL extension to always trigger and extend beyond current TTL.
31
+ let cfg = TtlConfig::new(10, before + 100);
32
+ env.as_contract(&contract_id, || {
33
+ TtlConfigStorage::set_instance(&env, &cfg);
34
+ });
35
+
36
+ // Force current TTL to be at/below threshold, then call ping.
37
+ env.ledger().set_sequence_number(live_until.saturating_sub(cfg.threshold));
38
+ let client = TestContractClient::new(&env, &contract_id);
39
+ client.ping();
40
+
41
+ let after = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
42
+ assert_eq!(after, cfg.extend_to);
43
+ }
44
+
45
+ #[test]
46
+ fn ping_does_not_extend_instance_ttl_without_config() {
47
+ let env = Env::default();
48
+ let contract_id = env.register(TestContract, ());
49
+
50
+ // Seed instance storage so TTL is present.
51
+ env.as_contract(&contract_id, || {
52
+ env.storage().instance().set(&soroban_sdk::Symbol::new(&env, "seed"), &true);
53
+ });
54
+
55
+ // Move ledger near expiry (would trigger if config existed).
56
+ let before = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
57
+ let before_seq = env.ledger().sequence();
58
+ let live_until = before_seq + before;
59
+ env.ledger().set_sequence_number(live_until.saturating_sub(1));
60
+
61
+ let ttl_before_call = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
62
+ let client = TestContractClient::new(&env, &contract_id);
63
+ client.ping();
64
+ let ttl_after_call = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
65
+
66
+ assert_eq!(ttl_after_call, ttl_before_call);
67
+ }
68
+
69
+ #[test]
70
+ fn ping_does_not_extend_instance_ttl_when_above_threshold() {
71
+ let env = Env::default();
72
+ let contract_id = env.register(TestContract, ());
73
+
74
+ // Seed instance storage so TTL is present.
75
+ env.as_contract(&contract_id, || {
76
+ env.storage().instance().set(&soroban_sdk::Symbol::new(&env, "seed"), &true);
77
+ });
78
+
79
+ let initial_ttl = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
80
+ let initial_seq = env.ledger().sequence();
81
+ let live_until = initial_seq + initial_ttl;
82
+
83
+ // Configure auto extension, but keep remaining TTL strictly greater than threshold.
84
+ let cfg = TtlConfig::new(10, initial_ttl + 100);
85
+ env.as_contract(&contract_id, || {
86
+ TtlConfigStorage::set_instance(&env, &cfg);
87
+ });
88
+
89
+ env.ledger().set_sequence_number(live_until.saturating_sub(cfg.threshold.saturating_add(1)));
90
+ let ttl_before_call = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
91
+
92
+ let client = TestContractClient::new(&env, &contract_id);
93
+ client.ping();
94
+
95
+ let ttl_after_call = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
96
+ assert_eq!(ttl_after_call, ttl_before_call);
97
+ }
@@ -0,0 +1,99 @@
1
+ // Runtime tests: `#[contract_trait]` injects instance TTL extension into default methods.
2
+
3
+ use soroban_sdk::{contract, testutils::storage::Instance as _, testutils::Ledger as _, Env};
4
+ use utils::ttl_configurable::{TtlConfig, TtlConfigStorage};
5
+
6
+ #[common_macros::contract_trait]
7
+ pub trait MyTrait {
8
+ fn ping(env: &Env) {
9
+ let _ = env;
10
+ }
11
+ }
12
+
13
+ #[contract]
14
+ pub struct TestContract;
15
+
16
+ #[soroban_sdk::contractimpl(contracttrait)]
17
+ impl MyTrait for TestContract {}
18
+
19
+ #[test]
20
+ fn default_trait_method_extends_instance_ttl_when_configured() {
21
+ let env = Env::default();
22
+ let contract_id = env.register(TestContract, ());
23
+ let client = TestContractClient::new(&env, &contract_id);
24
+
25
+ // Seed instance storage so TTL is present.
26
+ env.as_contract(&contract_id, || {
27
+ env.storage().instance().set(&soroban_sdk::Symbol::new(&env, "seed"), &true);
28
+ });
29
+
30
+ let before = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
31
+ let before_seq = env.ledger().sequence();
32
+ let live_until = before_seq + before;
33
+
34
+ // Configure TTL extension.
35
+ let cfg = TtlConfig::new(10, before + 100);
36
+ env.as_contract(&contract_id, || {
37
+ TtlConfigStorage::set_instance(&env, &cfg);
38
+ });
39
+
40
+ env.ledger().set_sequence_number(live_until.saturating_sub(cfg.threshold));
41
+ client.ping();
42
+
43
+ let after = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
44
+ assert_eq!(after, cfg.extend_to);
45
+ }
46
+
47
+ #[test]
48
+ fn default_trait_method_does_not_extend_instance_ttl_without_config() {
49
+ let env = Env::default();
50
+ let contract_id = env.register(TestContract, ());
51
+ let client = TestContractClient::new(&env, &contract_id);
52
+
53
+ // Seed instance storage so TTL is present.
54
+ env.as_contract(&contract_id, || {
55
+ env.storage().instance().set(&soroban_sdk::Symbol::new(&env, "seed"), &true);
56
+ });
57
+
58
+ // Move ledger near expiry (would trigger if config existed).
59
+ let before = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
60
+ let before_seq = env.ledger().sequence();
61
+ let live_until = before_seq + before;
62
+ env.ledger().set_sequence_number(live_until.saturating_sub(1));
63
+
64
+ let ttl_before_call = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
65
+ client.ping();
66
+ let ttl_after_call = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
67
+
68
+ assert_eq!(ttl_after_call, ttl_before_call);
69
+ }
70
+
71
+ #[test]
72
+ fn default_trait_method_does_not_extend_instance_ttl_when_above_threshold() {
73
+ let env = Env::default();
74
+ let contract_id = env.register(TestContract, ());
75
+ let client = TestContractClient::new(&env, &contract_id);
76
+
77
+ // Seed instance storage so TTL is present.
78
+ env.as_contract(&contract_id, || {
79
+ env.storage().instance().set(&soroban_sdk::Symbol::new(&env, "seed"), &true);
80
+ });
81
+
82
+ let initial_ttl = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
83
+ let initial_seq = env.ledger().sequence();
84
+ let live_until = initial_seq + initial_ttl;
85
+
86
+ // Configure TTL extension, but keep remaining TTL strictly greater than threshold.
87
+ let cfg = TtlConfig::new(10, initial_ttl + 100);
88
+ env.as_contract(&contract_id, || {
89
+ TtlConfigStorage::set_instance(&env, &cfg);
90
+ });
91
+
92
+ env.ledger().set_sequence_number(live_until.saturating_sub(cfg.threshold.saturating_add(1)));
93
+ let ttl_before_call = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
94
+
95
+ client.ping();
96
+
97
+ let ttl_after_call = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
98
+ assert_eq!(ttl_after_call, ttl_before_call);
99
+ }
@@ -0,0 +1,3 @@
1
+ mod contract_impl_ttl_extension;
2
+ mod constructor;
3
+ mod contract_trait_ttl_extension;
@@ -0,0 +1,5 @@
1
+ mod wrapper_default;
2
+ mod wrapper_multisig;
3
+ mod wrapper_multisig_upgradeable;
4
+ mod wrapper_upgradeable;
5
+ mod wrapper_upgradeable_no_migration;
@@ -0,0 +1,86 @@
1
+ // Runtime tests: `#[lz_contract]` wrapper macro (default options).
2
+
3
+ use soroban_sdk::{
4
+ contractimpl,
5
+ testutils::{storage::Instance as _, Address as _, Ledger as _, MockAuth, MockAuthInvoke},
6
+ xdr::{ScErrorCode, ScErrorType},
7
+ Address, Env, Error, IntoVal,
8
+ };
9
+ use utils::ttl_configurable::TtlConfig;
10
+
11
+ #[common_macros::lz_contract]
12
+ pub struct TestContract;
13
+
14
+ #[contractimpl]
15
+ impl TestContract {
16
+ pub fn init(env: Env, owner: Address) {
17
+ Self::init_owner(&env, &owner);
18
+ }
19
+ }
20
+
21
+ #[test]
22
+ fn exposes_ttl_and_ownable_features() {
23
+ let env = Env::default();
24
+ let contract_id = env.register(TestContract, ());
25
+ let client = TestContractClient::new(&env, &contract_id);
26
+
27
+ // Ownable helper works.
28
+ let owner = Address::generate(&env);
29
+ client.init(&owner);
30
+ assert_eq!(client.authorizer(), owner);
31
+
32
+ // TTL-configurable read methods exist.
33
+ let _cfg = client.ttl_configs();
34
+ let _frozen = client.is_ttl_configs_frozen();
35
+
36
+ // ttl_extendable entry exists and extends instance TTL.
37
+ env.as_contract(&contract_id, || {
38
+ env.storage().instance().set(&soroban_sdk::Symbol::new(&env, "seed"), &true);
39
+ });
40
+
41
+ let before = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
42
+ let before_seq = env.ledger().sequence();
43
+ let live_until = before_seq + before;
44
+
45
+ // Reduce current TTL to a small value, then extend to a known target.
46
+ env.ledger().set_sequence_number(live_until.saturating_sub(1));
47
+ client.extend_instance_ttl(&1, &50);
48
+
49
+ let after = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
50
+ assert_eq!(after, 50);
51
+ }
52
+
53
+ #[test]
54
+ fn ttl_configurable_write_requires_owner_auth_and_roundtrips() {
55
+ let env = Env::default();
56
+ let contract_id = env.register(TestContract, ());
57
+ let client = TestContractClient::new(&env, &contract_id);
58
+
59
+ let owner = Address::generate(&env);
60
+ client.init(&owner);
61
+
62
+ let instance = Some(TtlConfig::new(1, 2));
63
+ let none: Option<TtlConfig> = None;
64
+
65
+ // Unauthorized set should fail.
66
+ let unauthorized = client.try_set_ttl_configs(&instance, &none);
67
+ assert_eq!(
68
+ unauthorized.unwrap_err().unwrap(),
69
+ Error::from_type_and_code(ScErrorType::Context, ScErrorCode::InvalidAction)
70
+ );
71
+
72
+ // Authorized set should succeed and be readable back.
73
+ client
74
+ .mock_auths(&[MockAuth {
75
+ address: &owner,
76
+ invoke: &MockAuthInvoke {
77
+ contract: &contract_id,
78
+ fn_name: "set_ttl_configs",
79
+ args: (&instance, &none).into_val(&env),
80
+ sub_invokes: &[],
81
+ },
82
+ }])
83
+ .set_ttl_configs(&instance, &none);
84
+
85
+ assert_eq!(client.ttl_configs(), (instance, none));
86
+ }
@@ -0,0 +1,47 @@
1
+ // Runtime tests: `#[lz_contract(multisig)]` wrapper macro.
2
+
3
+ use soroban_sdk::{
4
+ testutils::{storage::Instance as _, Ledger as _},
5
+ BytesN, Env, Vec,
6
+ };
7
+
8
+ #[common_macros::lz_contract(multisig)]
9
+ pub struct MultisigLzContract;
10
+
11
+ #[test]
12
+ fn uses_self_owning_auth_and_exposes_ttl() {
13
+ let env = Env::default();
14
+ let contract_id = env.register(MultisigLzContract, ());
15
+ let client = MultisigLzContractClient::new(&env, &contract_id);
16
+
17
+ // MultiSig auth => authorizer should be the contract address, without any init.
18
+ let expected = env.as_contract(&contract_id, || env.current_contract_address());
19
+ assert_eq!(client.authorizer(), expected);
20
+
21
+ // TTL-configurable read methods exist.
22
+ let _cfg = client.ttl_configs();
23
+ let _frozen = client.is_ttl_configs_frozen();
24
+
25
+ // MultiSig view methods exist.
26
+ assert_eq!(client.threshold(), 0);
27
+ assert_eq!(client.total_signers(), 0);
28
+ let signer = BytesN::<20>::from_array(&env, &[1u8; 20]);
29
+ assert!(!client.is_signer(&signer));
30
+ let signers: Vec<BytesN<20>> = client.get_signers();
31
+ assert_eq!(signers.len(), 0);
32
+
33
+ // ttl_extendable entry exists and extends instance TTL.
34
+ env.as_contract(&contract_id, || {
35
+ env.storage().instance().set(&soroban_sdk::Symbol::new(&env, "seed"), &true);
36
+ });
37
+
38
+ let before = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
39
+ let before_seq = env.ledger().sequence();
40
+ let live_until = before_seq + before;
41
+
42
+ env.ledger().set_sequence_number(live_until.saturating_sub(1));
43
+ client.extend_instance_ttl(&1, &50);
44
+
45
+ let after = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
46
+ assert_eq!(after, 50);
47
+ }