@layerzerolabs/protocol-stellar-v2 0.2.21 → 0.2.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/.turbo/turbo-build.log +347 -271
  2. package/.turbo/turbo-lint.log +277 -208
  3. package/.turbo/turbo-test.log +1700 -1370
  4. package/Cargo.lock +22 -51
  5. package/Cargo.toml +6 -1
  6. package/contracts/common-macros/src/auth.rs +10 -9
  7. package/contracts/common-macros/src/contract_ttl.rs +1 -4
  8. package/contracts/common-macros/src/error.rs +1 -3
  9. package/contracts/common-macros/src/lib.rs +65 -61
  10. package/contracts/common-macros/src/storage.rs +212 -65
  11. package/contracts/common-macros/src/tests/auth.rs +75 -6
  12. package/contracts/common-macros/src/tests/contract_ttl.rs +383 -350
  13. package/contracts/common-macros/src/tests/error.rs +9 -21
  14. package/contracts/common-macros/src/tests/lz_contract.rs +80 -0
  15. package/contracts/common-macros/src/tests/mod.rs +2 -0
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +20 -3
  17. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +28 -1
  18. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap +8 -43
  19. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contracttrait_code.snap +6 -29
  20. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__lz_contract__snapshot_generated_lz_contract_code.snap +31 -0
  21. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_extendable__snapshot_generated_ttl_extendable_code.snap +8 -0
  22. package/contracts/common-macros/src/tests/storage/extract_fields.rs +87 -0
  23. package/contracts/common-macros/src/tests/storage/gen_accessor_methods.rs +223 -0
  24. package/contracts/common-macros/src/tests/storage/gen_args.rs +65 -0
  25. package/contracts/common-macros/src/tests/storage/gen_enum_variant.rs +78 -0
  26. package/contracts/common-macros/src/tests/storage/gen_key.rs +108 -0
  27. package/contracts/common-macros/src/tests/storage/gen_params.rs +105 -0
  28. package/contracts/common-macros/src/tests/{storage.rs → storage/generate_storage.rs} +54 -129
  29. package/contracts/common-macros/src/tests/storage/is_primitive_type.rs +48 -0
  30. package/contracts/common-macros/src/tests/storage/mod.rs +16 -0
  31. package/contracts/common-macros/src/tests/storage/parse_default.rs +164 -0
  32. package/contracts/common-macros/src/tests/storage/parse_name.rs +159 -0
  33. package/contracts/common-macros/src/tests/storage/parse_no_ttl_extension.rs +124 -0
  34. package/contracts/common-macros/src/tests/storage/parse_storage_type.rs +174 -0
  35. package/contracts/common-macros/src/tests/storage/snapshots/common_macros__tests__storage__generate_storage__snapshot_generated_storage_code.snap +412 -0
  36. package/contracts/common-macros/src/tests/storage/storage_kind.rs +39 -0
  37. package/contracts/common-macros/src/tests/storage/test_setup.rs +25 -0
  38. package/contracts/common-macros/src/tests/storage/validate_attrs.rs +138 -0
  39. package/contracts/common-macros/src/tests/storage/variant_config.rs +226 -0
  40. package/contracts/common-macros/src/tests/test_helpers.rs +4 -10
  41. package/contracts/common-macros/src/tests/ttl_configurable.rs +2 -2
  42. package/contracts/common-macros/src/tests/ttl_extendable.rs +32 -0
  43. package/contracts/common-macros/src/tests/upgradeable.rs +118 -2
  44. package/contracts/common-macros/src/ttl_configurable.rs +1 -4
  45. package/contracts/common-macros/src/upgradeable.rs +21 -3
  46. package/contracts/endpoint-v2/Cargo.toml +0 -4
  47. package/contracts/endpoint-v2/src/endpoint_v2.rs +37 -17
  48. package/contracts/endpoint-v2/src/errors.rs +26 -1
  49. package/contracts/endpoint-v2/src/interfaces/layerzero_endpoint_v2.rs +1 -1
  50. package/contracts/endpoint-v2/src/interfaces/message_lib_manager.rs +4 -4
  51. package/contracts/endpoint-v2/src/interfaces/messaging_composer.rs +2 -2
  52. package/contracts/endpoint-v2/src/lib.rs +0 -1
  53. package/contracts/endpoint-v2/src/message_lib_manager.rs +39 -8
  54. package/contracts/endpoint-v2/src/messaging_channel.rs +36 -4
  55. package/contracts/endpoint-v2/src/messaging_composer.rs +18 -4
  56. package/contracts/endpoint-v2/src/storage.rs +9 -1
  57. package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +2 -2
  58. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +1 -1
  59. package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +2 -2
  60. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +3 -3
  61. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +5 -5
  62. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +2 -2
  63. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +5 -5
  64. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +3 -3
  65. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +1 -1
  66. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +4 -3
  67. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +7 -2
  68. package/contracts/endpoint-v2/src/tests/messaging_composer/mod.rs +4 -0
  69. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +7 -2
  70. package/contracts/layerzero-views/src/layerzero_view.rs +0 -1
  71. package/contracts/layerzero-views/src/tests/mod.rs +1 -0
  72. package/contracts/layerzero-views/src/tests/types_tests.rs +31 -0
  73. package/contracts/layerzero-views/src/types.rs +2 -3
  74. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/constructor.rs +61 -0
  75. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/contract_impl_ttl_extension.rs +97 -0
  76. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/contract_trait_ttl_extension.rs +99 -0
  77. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/mod.rs +3 -0
  78. package/contracts/macro-integration-tests/tests/runtime/lz_contract/mod.rs +5 -0
  79. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_default.rs +86 -0
  80. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_multisig.rs +47 -0
  81. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_multisig_upgradeable.rs +77 -0
  82. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_upgradeable.rs +114 -0
  83. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_upgradeable_no_migration.rs +105 -0
  84. package/contracts/macro-integration-tests/tests/runtime/multisig/admin_entrypoints.rs +242 -0
  85. package/contracts/macro-integration-tests/tests/runtime/multisig/mod.rs +9 -0
  86. package/contracts/macro-integration-tests/tests/runtime/multisig/self_auth.rs +54 -0
  87. package/contracts/macro-integration-tests/tests/runtime/ownable/initialization.rs +13 -0
  88. package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +1 -0
  89. package/contracts/macro-integration-tests/tests/runtime/ownable/ownership_transfer.rs +70 -1
  90. package/contracts/macro-integration-tests/tests/runtime/ownable/two_step_transfer.rs +219 -0
  91. package/contracts/macro-integration-tests/tests/runtime/storage/keyed_roundtrip.rs +41 -0
  92. package/contracts/macro-integration-tests/tests/runtime/storage/ttl_extension.rs +48 -16
  93. package/contracts/macro-integration-tests/tests/runtime/storage/unkeyed_roundtrip.rs +10 -0
  94. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +96 -3
  95. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +4 -0
  96. package/contracts/macro-integration-tests/tests/runtime/ttl_extendable/extend_instance_ttl.rs +64 -0
  97. package/contracts/macro-integration-tests/tests/runtime/ttl_extendable/mod.rs +16 -0
  98. package/contracts/macro-integration-tests/tests/runtime/upgradeable/migrate_guard_and_state.rs +305 -0
  99. package/contracts/macro-integration-tests/tests/runtime/upgradeable/mod.rs +3 -0
  100. package/contracts/macro-integration-tests/tests/runtime/upgradeable/no_migration.rs +59 -0
  101. package/contracts/macro-integration-tests/tests/runtime/upgradeable/upgrade_then_migrate.rs +88 -0
  102. package/contracts/macro-integration-tests/tests/runtime.rs +5 -0
  103. package/contracts/macro-integration-tests/tests/ui/contract_impl/fail/not_impl_item.rs +6 -0
  104. package/contracts/macro-integration-tests/tests/ui/contract_impl/fail/not_impl_item.stderr +7 -0
  105. package/contracts/macro-integration-tests/tests/ui/contract_impl/pass/basic.rs +102 -0
  106. package/contracts/macro-integration-tests/tests/ui/contract_trait/fail/not_a_trait.rs +6 -0
  107. package/contracts/macro-integration-tests/tests/ui/contract_trait/fail/not_a_trait.stderr +7 -0
  108. package/contracts/macro-integration-tests/tests/ui/contract_trait/pass/basic.rs +83 -0
  109. package/contracts/macro-integration-tests/tests/ui/error/fail/discriminant_too_large.rs +11 -0
  110. package/contracts/macro-integration-tests/tests/ui/error/fail/discriminant_too_large.stderr +7 -0
  111. package/contracts/macro-integration-tests/tests/ui/error/fail/non_enum_input.rs +11 -0
  112. package/contracts/macro-integration-tests/tests/ui/error/fail/non_enum_input.stderr +7 -0
  113. package/contracts/macro-integration-tests/tests/ui/error/pass/basic.rs +22 -0
  114. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/invalid_option.rs +6 -0
  115. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/invalid_option.stderr +7 -0
  116. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/multisig_rejects_ownable_api.rs +20 -0
  117. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/multisig_rejects_ownable_api.stderr +20 -0
  118. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/not_a_struct.rs +8 -0
  119. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/not_a_struct.stderr +7 -0
  120. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_invalid_inner_option.rs +10 -0
  121. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_invalid_inner_option.stderr +7 -0
  122. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_missing_internal.rs +20 -0
  123. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_missing_internal.stderr +86 -0
  124. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/basic.rs +45 -0
  125. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/multisig.rs +34 -0
  126. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/multisig_upgradeable.rs +30 -0
  127. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/upgradeable.rs +39 -0
  128. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/upgradeable_no_migration.rs +28 -0
  129. package/contracts/macro-integration-tests/tests/ui/multisig/fail/non_struct_input.rs +8 -0
  130. package/contracts/macro-integration-tests/tests/ui/multisig/fail/non_struct_input.stderr +7 -0
  131. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_api.rs +20 -0
  132. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_api.stderr +12 -0
  133. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_trait.rs +20 -0
  134. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_trait.stderr +5 -0
  135. package/contracts/macro-integration-tests/tests/ui/multisig/pass/basic.rs +49 -0
  136. package/contracts/macro-integration-tests/tests/ui/ownable/fail/non_struct_input.rs +8 -0
  137. package/contracts/macro-integration-tests/tests/ui/ownable/fail/non_struct_input.stderr +7 -0
  138. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_auth.rs +19 -0
  139. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_auth.stderr +12 -0
  140. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.rs +1 -1
  141. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.stderr +0 -8
  142. package/contracts/macro-integration-tests/tests/ui/ownable/pass/basic.rs +39 -0
  143. package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_auth_env_param_variants.rs +7 -1
  144. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.stderr +1 -1
  145. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.stderr +1 -1
  146. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_default_values.rs +11 -0
  147. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_default_values.stderr +7 -0
  148. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_name_attrs.rs +11 -0
  149. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_name_attrs.stderr +7 -0
  150. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_no_ttl_extension.rs +11 -0
  151. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_no_ttl_extension.stderr +7 -0
  152. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.stderr +1 -1
  153. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_rejects_args.rs +13 -0
  154. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_rejects_args.stderr +7 -0
  155. package/contracts/macro-integration-tests/tests/ui/storage/pass/api_surface.rs +102 -0
  156. package/contracts/macro-integration-tests/tests/ui/storage/pass/basic.rs +43 -0
  157. package/contracts/macro-integration-tests/tests/ui/storage/pass/multi_key.rs +38 -0
  158. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/missing_auth_trait.rs +14 -0
  159. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/missing_auth_trait.stderr +71 -0
  160. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/non_struct_input.rs +8 -0
  161. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/non_struct_input.stderr +7 -0
  162. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/{minimal_contract.rs → basic.rs} +2 -0
  163. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/multisig_contract.rs +28 -0
  164. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/ownable_contract.rs +32 -0
  165. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/fail/non_struct_input.rs +8 -0
  166. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/fail/non_struct_input.stderr +7 -0
  167. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/pass/basic.rs +23 -0
  168. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/pass/no_user_contractimpl.rs +21 -0
  169. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/attr_args.rs +11 -0
  170. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/attr_args.stderr +29 -0
  171. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_auth_trait.rs +20 -0
  172. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_auth_trait.stderr +71 -0
  173. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_upgradeable_internal.rs +10 -0
  174. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_upgradeable_internal.stderr +79 -0
  175. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/non_struct_input.rs +8 -0
  176. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/non_struct_input.stderr +7 -0
  177. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/basic.rs +43 -0
  178. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/multisig_contract.rs +35 -0
  179. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/no_migration.rs +30 -0
  180. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/no_user_contractimpl.rs +29 -0
  181. package/contracts/macro-integration-tests/tests/ui_contract_impl.rs +12 -0
  182. package/contracts/macro-integration-tests/tests/ui_contract_trait.rs +12 -0
  183. package/contracts/macro-integration-tests/tests/ui_lz_contract.rs +11 -0
  184. package/contracts/macro-integration-tests/tests/ui_multisig.rs +11 -0
  185. package/contracts/macro-integration-tests/tests/ui_ttl_extendable.rs +12 -0
  186. package/contracts/macro-integration-tests/tests/ui_upgradeable.rs +11 -0
  187. package/contracts/message-libs/blocked-message-lib/Cargo.toml +1 -1
  188. package/contracts/message-libs/blocked-message-lib/src/lib.rs +4 -1
  189. package/contracts/message-libs/blocked-message-lib/src/tests/blocked_message_lib_tests.rs +108 -0
  190. package/contracts/message-libs/blocked-message-lib/src/tests/mod.rs +4 -0
  191. package/contracts/message-libs/blocked-message-lib/src/tests/setup.rs +40 -0
  192. package/contracts/message-libs/simple-message-lib/src/lib.rs +1 -1
  193. package/contracts/message-libs/simple-message-lib/src/tests/mod.rs +2 -0
  194. package/contracts/message-libs/simple-message-lib/src/tests/setup.rs +124 -0
  195. package/contracts/message-libs/simple-message-lib/src/tests/simple_message_lib_tests.rs +309 -0
  196. package/contracts/message-libs/uln-302/src/errors.rs +21 -0
  197. package/contracts/message-libs/uln-302/src/interfaces/receive_uln.rs +1 -1
  198. package/contracts/message-libs/uln-302/src/receive_uln.rs +6 -4
  199. package/contracts/message-libs/uln-302/src/send_uln.rs +15 -6
  200. package/contracts/message-libs/uln-302/src/storage.rs +5 -5
  201. package/contracts/message-libs/uln-302/src/tests/uln302/get_config.rs +71 -0
  202. package/contracts/message-libs/uln-302/src/tests/uln302/mod.rs +1 -0
  203. package/contracts/message-libs/uln-302/src/uln302.rs +3 -0
  204. package/contracts/oapps/counter/Cargo.toml +2 -0
  205. package/contracts/oapps/counter/integration_tests/mod.rs +1 -0
  206. package/contracts/oapps/counter/integration_tests/setup_sml.rs +6 -4
  207. package/contracts/oapps/counter/integration_tests/setup_uln.rs +12 -5
  208. package/contracts/oapps/counter/integration_tests/test_with_blocked.rs +67 -0
  209. package/contracts/oapps/counter/src/tests/mod.rs +1 -0
  210. package/contracts/oapps/counter/src/tests/test_u256_ext.rs +48 -0
  211. package/contracts/oapps/oapp/src/lib.rs +0 -3
  212. package/contracts/oapps/oapp/src/tests/mod.rs +1 -0
  213. package/contracts/oapps/oft/integration-tests/setup.rs +2 -3
  214. package/contracts/oapps/oft/src/lib.rs +3 -0
  215. package/contracts/oapps/oft/src/tests/extensions/mod.rs +3 -0
  216. package/contracts/oapps/oft/src/tests/extensions/oft_fee.rs +240 -0
  217. package/contracts/oapps/oft/src/tests/extensions/pausable.rs +141 -0
  218. package/contracts/oapps/oft/src/tests/extensions/rate_limiter.rs +447 -0
  219. package/contracts/oapps/oft/src/tests/mod.rs +2 -0
  220. package/contracts/oapps/oft/src/tests/oft_types/lock_unlock.rs +180 -0
  221. package/contracts/oapps/oft/src/tests/oft_types/mod.rs +1 -0
  222. package/contracts/oapps/oft-core/integration-tests/setup.rs +2 -3
  223. package/contracts/oapps/oft-core/src/lib.rs +2 -2
  224. package/contracts/oapps/oft-core/src/tests/mod.rs +1 -1
  225. package/contracts/oapps/oft-core/src/tests/{test_oft_version.rs → test_oft_version_and_approval.rs} +9 -0
  226. package/contracts/oapps/oft-core/src/tests/test_utils.rs +0 -43
  227. package/contracts/upgrader/src/tests/test_upgrader.rs +18 -0
  228. package/contracts/utils/src/auth.rs +2 -2
  229. package/contracts/utils/src/buffer_reader.rs +61 -10
  230. package/contracts/utils/src/buffer_writer.rs +35 -20
  231. package/contracts/utils/src/bytes_ext.rs +1 -2
  232. package/contracts/utils/src/errors.rs +5 -3
  233. package/contracts/utils/src/multisig.rs +59 -36
  234. package/contracts/utils/src/option_ext.rs +3 -3
  235. package/contracts/utils/src/ownable.rs +12 -6
  236. package/contracts/utils/src/tests/auth.rs +179 -0
  237. package/contracts/utils/src/tests/buffer_reader.rs +203 -1
  238. package/contracts/utils/src/tests/buffer_writer.rs +176 -5
  239. package/contracts/utils/src/tests/mod.rs +2 -0
  240. package/contracts/utils/src/tests/multisig.rs +170 -141
  241. package/contracts/utils/src/tests/option_ext.rs +1 -1
  242. package/contracts/utils/src/tests/ownable.rs +156 -161
  243. package/contracts/utils/src/tests/test_helper.rs +21 -1
  244. package/contracts/utils/src/tests/testing_utils.rs +84 -2
  245. package/contracts/utils/src/tests/ttl_configurable.rs +66 -86
  246. package/contracts/utils/src/tests/ttl_extendable.rs +64 -0
  247. package/contracts/utils/src/tests/upgradeable.rs +115 -6
  248. package/contracts/utils/src/ttl_configurable.rs +22 -12
  249. package/contracts/utils/src/ttl_extendable.rs +1 -3
  250. package/contracts/utils/src/upgradeable.rs +21 -24
  251. package/contracts/workers/dvn/src/auth.rs +1 -1
  252. package/contracts/workers/dvn/src/interfaces/dvn.rs +2 -2
  253. package/contracts/workers/dvn/src/storage.rs +1 -1
  254. package/contracts/workers/dvn/src/tests/auth.rs +136 -3
  255. package/contracts/workers/dvn/src/tests/mod.rs +0 -1
  256. package/contracts/workers/dvn/src/tests/setup.rs +4 -10
  257. package/contracts/workers/executor-helper/src/tests/executor_helper.rs +279 -0
  258. package/contracts/workers/executor-helper/src/tests/setup.rs +106 -1
  259. package/contracts/workers/worker/src/worker.rs +1 -1
  260. package/docs/oft-guide.md +5 -5
  261. package/package.json +5 -7
  262. package/sdk/.turbo/turbo-test.log +662 -466
  263. package/sdk/LICENSE +23 -0
  264. package/sdk/dist/generated/bml.d.ts +101 -106
  265. package/sdk/dist/generated/bml.js +108 -26
  266. package/sdk/dist/generated/counter.d.ts +123 -484
  267. package/sdk/dist/generated/counter.js +103 -25
  268. package/sdk/dist/generated/dvn.d.ts +141 -699
  269. package/sdk/dist/generated/dvn.js +106 -28
  270. package/sdk/dist/generated/dvn_fee_lib.d.ts +31 -248
  271. package/sdk/dist/generated/dvn_fee_lib.js +27 -24
  272. package/sdk/dist/generated/endpoint.d.ts +158 -836
  273. package/sdk/dist/generated/endpoint.js +107 -29
  274. package/sdk/dist/generated/executor.d.ts +139 -671
  275. package/sdk/dist/generated/executor.js +106 -28
  276. package/sdk/dist/generated/executor_fee_lib.d.ts +109 -264
  277. package/sdk/dist/generated/executor_fee_lib.js +106 -28
  278. package/sdk/dist/generated/executor_helper.d.ts +95 -92
  279. package/sdk/dist/generated/executor_helper.js +103 -25
  280. package/sdk/dist/generated/layerzero_view.d.ts +178 -335
  281. package/sdk/dist/generated/layerzero_view.js +172 -33
  282. package/sdk/dist/generated/oft.d.ts +137 -680
  283. package/sdk/dist/generated/oft.js +103 -25
  284. package/sdk/dist/generated/price_feed.d.ts +45 -444
  285. package/sdk/dist/generated/price_feed.js +27 -24
  286. package/sdk/dist/generated/sml.d.ts +119 -428
  287. package/sdk/dist/generated/sml.js +103 -25
  288. package/sdk/dist/generated/treasury.d.ts +109 -288
  289. package/sdk/dist/generated/treasury.js +103 -25
  290. package/sdk/dist/generated/uln302.d.ts +190 -527
  291. package/sdk/dist/generated/uln302.js +170 -31
  292. package/sdk/dist/generated/upgrader.d.ts +14 -34
  293. package/sdk/dist/generated/upgrader.js +24 -21
  294. package/sdk/package.json +3 -4
  295. package/sdk/test/counter-sml.test.ts +218 -142
  296. package/sdk/test/counter-uln.test.ts +189 -145
  297. package/sdk/test/oft-sml.test.ts +173 -156
  298. package/sdk/test/suites/constants.ts +7 -1
  299. package/sdk/test/suites/globalSetup.ts +140 -74
  300. package/sdk/turbo.json +1 -1
  301. package/tools/ts-bindings-gen/Cargo.toml +4 -4
  302. package/tools/ts-bindings-gen/src/main.rs +4 -0
  303. package/turbo.json +3 -0
  304. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +0 -1072
  305. package/contracts/endpoint-v2/src/constants.rs +0 -52
  306. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.rs +0 -12
  307. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.stderr +0 -7
  308. package/contracts/macro-integration-tests/tests/ui/error/pass/attr_on_variant_allowed.rs +0 -20
  309. package/contracts/macro-integration-tests/tests/ui/error/pass/basic_auto_discriminants.rs +0 -15
  310. package/contracts/macro-integration-tests/tests/ui/error/pass/mixed_discriminants.rs +0 -16
  311. package/contracts/macro-integration-tests/tests/ui/ownable/pass/minimal_contract.rs +0 -26
  312. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +0 -21
  313. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.rs +0 -12
  314. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.stderr +0 -7
  315. package/contracts/macro-integration-tests/tests/ui/storage/pass/default_value_on_variant.rs +0 -14
  316. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_instance_unit_basic.rs +0 -14
  317. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_persistent_named_fields_keyed.rs +0 -16
  318. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_temporary_unit_option.rs +0 -15
  319. package/contracts/macro-integration-tests/tests/ui/storage/pass/name_override.rs +0 -14
  320. package/contracts/macro-integration-tests/tests/ui/storage/pass/no_auto_ttl_extension.rs +0 -19
  321. package/contracts/macro-integration-tests/tests/ui/storage/pass/ttl_provider_basic.rs +0 -15
  322. package/contracts/message-libs/simple-message-lib/src/test.rs +0 -280
  323. package/contracts/oapps/oapp/src/macro_tests/mod.rs +0 -1
  324. package/contracts/workers/dvn/src/tests/multisig/mod.rs +0 -3
  325. package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +0 -132
  326. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +0 -109
  327. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +0 -106
  328. /package/contracts/oapps/oapp/src/{macro_tests → tests}/test_macros.rs +0 -0
@@ -0,0 +1,77 @@
1
+ // Runtime tests: `#[lz_contract(multisig, upgradeable)]` wrapper macro.
2
+ //
3
+ // This ensures upgradeability works under self-owning (multisig) authorization.
4
+
5
+ use soroban_sdk::{
6
+ testutils::{storage::Instance as _, Ledger as _},
7
+ xdr::ToXdr,
8
+ xdr::{ScErrorCode, ScErrorType},
9
+ Env, Error, Val,
10
+ };
11
+ use utils::upgradeable::{UpgradeableInternal, UpgradeableStorage};
12
+
13
+ #[common_macros::lz_contract(multisig, upgradeable)]
14
+ pub struct MultisigUpgradeableLzContract;
15
+
16
+ impl UpgradeableInternal for MultisigUpgradeableLzContract {
17
+ type MigrationData = Val;
18
+
19
+ fn __migrate(env: &Env, _migration_data: &Self::MigrationData) {
20
+ env.storage().instance().set(&soroban_sdk::Symbol::new(env, "migrated"), &true);
21
+ }
22
+ }
23
+
24
+ #[test]
25
+ fn self_auth_can_migrate_when_flag_set() {
26
+ let env = Env::default();
27
+ let contract_id = env.register(MultisigUpgradeableLzContract, ());
28
+ let client = MultisigUpgradeableLzContractClient::new(&env, &contract_id);
29
+ let migration_data = Val::VOID.to_xdr(&env);
30
+
31
+ // MultiSig auth => authorizer should be the contract address, without any init.
32
+ let expected = env.as_contract(&contract_id, || env.current_contract_address());
33
+ assert_eq!(client.authorizer(), expected);
34
+
35
+ // Unauthorized migrate should fail.
36
+ let unauthorized = client.try_migrate(&migration_data);
37
+ assert_eq!(
38
+ unauthorized.unwrap_err().unwrap(),
39
+ Error::from_type_and_code(ScErrorType::Context, ScErrorCode::InvalidAction)
40
+ );
41
+
42
+ // Enable self-auth for subsequent calls.
43
+ env.mock_all_auths();
44
+
45
+ // With auth, migrate without flag should fail with UpgradeableError.
46
+ let no_flag = client.try_migrate(&migration_data);
47
+ assert_eq!(no_flag.err().unwrap().ok().unwrap(), utils::errors::UpgradeableError::MigrationNotAllowed.into());
48
+
49
+ // Set migrating flag and migrate with self-auth should succeed.
50
+ env.as_contract(&contract_id, || {
51
+ UpgradeableStorage::set_migrating(&env, &true);
52
+ });
53
+
54
+ client.migrate(&migration_data);
55
+
56
+ env.as_contract(&contract_id, || {
57
+ assert_eq!(UpgradeableStorage::migrating(&env), false);
58
+ let migrated: Option<bool> = env.storage().instance().get(&soroban_sdk::Symbol::new(&env, "migrated"));
59
+ assert_eq!(migrated, Some(true));
60
+ });
61
+
62
+ // TTL-configurable read methods exist.
63
+ let _cfg = client.ttl_configs();
64
+ let _frozen = client.is_ttl_configs_frozen();
65
+
66
+ // ttl_extendable entry exists and extends instance TTL.
67
+ env.as_contract(&contract_id, || {
68
+ env.storage().instance().set(&soroban_sdk::Symbol::new(&env, "seed"), &true);
69
+ });
70
+ let before = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
71
+ let before_seq = env.ledger().sequence();
72
+ let live_until = before_seq + before;
73
+ env.ledger().set_sequence_number(live_until.saturating_sub(1));
74
+ client.extend_instance_ttl(&1, &50);
75
+ let after = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
76
+ assert_eq!(after, 50);
77
+ }
@@ -0,0 +1,114 @@
1
+ // Runtime tests: `#[lz_contract(upgradeable)]` wrapper macro.
2
+ //
3
+ // This ensures:
4
+ // - ownable auth is present (owner-based)
5
+ // - upgradeable entrypoints exist and are guarded by `only_auth`
6
+ // - migrate obeys the migrating flag wiring
7
+
8
+ use soroban_sdk::{
9
+ contractimpl,
10
+ testutils::{storage::Instance as _, Address as _, Ledger as _, MockAuth, MockAuthInvoke},
11
+ xdr::ToXdr,
12
+ xdr::{ScErrorCode, ScErrorType},
13
+ Address, Env, Error, IntoVal, Val,
14
+ };
15
+ use utils::upgradeable::{UpgradeableInternal, UpgradeableStorage};
16
+
17
+ #[common_macros::lz_contract(upgradeable)]
18
+ pub struct UpgradeableLzContract;
19
+
20
+ impl UpgradeableInternal for UpgradeableLzContract {
21
+ type MigrationData = Val;
22
+
23
+ fn __migrate(env: &Env, _migration_data: &Self::MigrationData) {
24
+ env.storage().instance().set(&soroban_sdk::Symbol::new(env, "migrated"), &true);
25
+ }
26
+ }
27
+
28
+ #[contractimpl]
29
+ impl UpgradeableLzContract {
30
+ pub fn init(env: Env, owner: Address) {
31
+ Self::init_owner(&env, &owner);
32
+ }
33
+ }
34
+
35
+ #[test]
36
+ fn migrate_is_guarded_and_wired() {
37
+ let env = Env::default();
38
+ let contract_id = env.register(UpgradeableLzContract, ());
39
+ let client = UpgradeableLzContractClient::new(&env, &contract_id);
40
+
41
+ let owner = Address::generate(&env);
42
+ client.init(&owner);
43
+ let migration_data = Val::VOID.to_xdr(&env);
44
+
45
+ // Unauthorized migrate should fail.
46
+ let unauthorized = client.try_migrate(&migration_data);
47
+ assert_eq!(
48
+ unauthorized.unwrap_err().unwrap(),
49
+ Error::from_type_and_code(ScErrorType::Context, ScErrorCode::InvalidAction)
50
+ );
51
+
52
+ // Authorized migrate without migrating flag should fail with UpgradeableError.
53
+ let result = client
54
+ .mock_auths(&[MockAuth {
55
+ address: &owner,
56
+ invoke: &MockAuthInvoke {
57
+ contract: &contract_id,
58
+ fn_name: "migrate",
59
+ args: (&migration_data,).into_val(&env),
60
+ sub_invokes: &[],
61
+ },
62
+ }])
63
+ .try_migrate(&migration_data);
64
+ assert_eq!(result.err().unwrap().ok().unwrap(), utils::errors::UpgradeableError::MigrationNotAllowed.into());
65
+
66
+ // Set flag and migrate should succeed and clear the flag + run __migrate.
67
+ env.as_contract(&contract_id, || {
68
+ UpgradeableStorage::set_migrating(&env, &true);
69
+ });
70
+
71
+ client
72
+ .mock_auths(&[MockAuth {
73
+ address: &owner,
74
+ invoke: &MockAuthInvoke {
75
+ contract: &contract_id,
76
+ fn_name: "migrate",
77
+ args: (&migration_data,).into_val(&env),
78
+ sub_invokes: &[],
79
+ },
80
+ }])
81
+ .migrate(&migration_data);
82
+
83
+ env.as_contract(&contract_id, || {
84
+ assert_eq!(UpgradeableStorage::migrating(&env), false);
85
+ let migrated: Option<bool> = env.storage().instance().get(&soroban_sdk::Symbol::new(&env, "migrated"));
86
+ assert_eq!(migrated, Some(true));
87
+ });
88
+ }
89
+
90
+ #[test]
91
+ fn still_exposes_ttl_features() {
92
+ let env = Env::default();
93
+ let contract_id = env.register(UpgradeableLzContract, ());
94
+ let client = UpgradeableLzContractClient::new(&env, &contract_id);
95
+
96
+ let owner = Address::generate(&env);
97
+ client.init(&owner);
98
+
99
+ // TTL-configurable read methods exist.
100
+ let _cfg = client.ttl_configs();
101
+ let _frozen = client.is_ttl_configs_frozen();
102
+
103
+ // ttl_extendable entry exists and extends instance TTL.
104
+ env.as_contract(&contract_id, || {
105
+ env.storage().instance().set(&soroban_sdk::Symbol::new(&env, "seed"), &true);
106
+ });
107
+ let before = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
108
+ let before_seq = env.ledger().sequence();
109
+ let live_until = before_seq + before;
110
+ env.ledger().set_sequence_number(live_until.saturating_sub(1));
111
+ client.extend_instance_ttl(&1, &50);
112
+ let after = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
113
+ assert_eq!(after, 50);
114
+ }
@@ -0,0 +1,105 @@
1
+ // Runtime tests: `#[lz_contract(upgradeable(no_migration))]` wrapper macro.
2
+ //
3
+ // This ensures:
4
+ // - ownable auth is present (owner-based)
5
+ // - upgradeable entrypoints exist without requiring manual UpgradeableInternal impl
6
+ // - migrate obeys the migrating flag wiring (no-op migration)
7
+ // - ttl_configurable + ttl_extendable are still present
8
+
9
+ use soroban_sdk::{
10
+ contractimpl,
11
+ testutils::{storage::Instance as _, Address as _, Ledger as _, MockAuth, MockAuthInvoke},
12
+ xdr::ToXdr,
13
+ xdr::{ScErrorCode, ScErrorType},
14
+ Address, Env, Error, IntoVal, Val,
15
+ };
16
+ use utils::upgradeable::UpgradeableStorage;
17
+
18
+ #[common_macros::lz_contract(upgradeable(no_migration))]
19
+ pub struct NoMigrationUpgradeableLzContract;
20
+
21
+ #[contractimpl]
22
+ impl NoMigrationUpgradeableLzContract {
23
+ pub fn init(env: Env, owner: Address) {
24
+ Self::init_owner(&env, &owner);
25
+ }
26
+ }
27
+
28
+ #[test]
29
+ fn migrate_is_guarded_and_noop_migration_works() {
30
+ let env = Env::default();
31
+ let contract_id = env.register(NoMigrationUpgradeableLzContract, ());
32
+ let client = NoMigrationUpgradeableLzContractClient::new(&env, &contract_id);
33
+
34
+ let owner = Address::generate(&env);
35
+ client.init(&owner);
36
+ let migration_data = Val::VOID.to_xdr(&env);
37
+
38
+ // Unauthorized migrate should fail.
39
+ let unauthorized = client.try_migrate(&migration_data);
40
+ assert_eq!(
41
+ unauthorized.unwrap_err().unwrap(),
42
+ Error::from_type_and_code(ScErrorType::Context, ScErrorCode::InvalidAction)
43
+ );
44
+
45
+ // Authorized migrate without migrating flag should fail with UpgradeableError.
46
+ let no_flag = client
47
+ .mock_auths(&[MockAuth {
48
+ address: &owner,
49
+ invoke: &MockAuthInvoke {
50
+ contract: &contract_id,
51
+ fn_name: "migrate",
52
+ args: (&migration_data,).into_val(&env),
53
+ sub_invokes: &[],
54
+ },
55
+ }])
56
+ .try_migrate(&migration_data);
57
+ assert_eq!(no_flag.err().unwrap().ok().unwrap(), utils::errors::UpgradeableError::MigrationNotAllowed.into());
58
+
59
+ // Set flag and migrate should succeed (no-op migration) and clear the flag.
60
+ env.as_contract(&contract_id, || {
61
+ UpgradeableStorage::set_migrating(&env, &true);
62
+ });
63
+
64
+ client
65
+ .mock_auths(&[MockAuth {
66
+ address: &owner,
67
+ invoke: &MockAuthInvoke {
68
+ contract: &contract_id,
69
+ fn_name: "migrate",
70
+ args: (&migration_data,).into_val(&env),
71
+ sub_invokes: &[],
72
+ },
73
+ }])
74
+ .migrate(&migration_data);
75
+
76
+ env.as_contract(&contract_id, || {
77
+ assert_eq!(UpgradeableStorage::migrating(&env), false);
78
+ });
79
+ }
80
+
81
+ #[test]
82
+ fn still_exposes_ttl_features() {
83
+ let env = Env::default();
84
+ let contract_id = env.register(NoMigrationUpgradeableLzContract, ());
85
+ let client = NoMigrationUpgradeableLzContractClient::new(&env, &contract_id);
86
+
87
+ let owner = Address::generate(&env);
88
+ client.init(&owner);
89
+
90
+ // TTL-configurable read methods exist.
91
+ let _cfg = client.ttl_configs();
92
+ let _frozen = client.is_ttl_configs_frozen();
93
+
94
+ // ttl_extendable entry exists and extends instance TTL.
95
+ env.as_contract(&contract_id, || {
96
+ env.storage().instance().set(&soroban_sdk::Symbol::new(&env, "seed"), &true);
97
+ });
98
+ let before = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
99
+ let before_seq = env.ledger().sequence();
100
+ let live_until = before_seq + before;
101
+ env.ledger().set_sequence_number(live_until.saturating_sub(1));
102
+ client.extend_instance_ttl(&1, &50);
103
+ let after = env.as_contract(&contract_id, || env.storage().instance().get_ttl());
104
+ assert_eq!(after, 50);
105
+ }
@@ -0,0 +1,242 @@
1
+ // Runtime tests: `#[multisig]` ensures the contract implements `utils::multisig::MultiSig`.
2
+ //
3
+ // We exercise:
4
+ // - `set_signer` / `set_threshold` behavior (via direct trait calls inside `as_contract`)
5
+ // - `verify_signatures` / `verify_n_signatures` error paths (via exported contract entrypoints)
6
+
7
+ use super::{TestContract, TestContractClient};
8
+ use soroban_sdk::{
9
+ xdr::{ScErrorCode, ScErrorType},
10
+ BytesN, Env, Error, Vec,
11
+ };
12
+ use utils::{
13
+ multisig::{SignerSet, ThresholdSet},
14
+ testing_utils::assert_eq_event,
15
+ };
16
+
17
+ // Test vectors copied from `utils/src/tests/multisig.rs` so we can exercise success paths
18
+ // through the macro-generated contract entrypoints.
19
+ fn test_digest(env: &Env) -> BytesN<32> {
20
+ BytesN::from_array(
21
+ env,
22
+ &[
23
+ 0x7d, 0x84, 0xfd, 0x50, 0x8a, 0x27, 0xac, 0x81, 0xde, 0xe4, 0xbf, 0xa9, 0x7f, 0x29, 0xbe, 0xdb, 0x88, 0x5c,
24
+ 0x1b, 0xd7, 0xfc, 0x46, 0x50, 0xf4, 0x91, 0xe6, 0x4f, 0xbd, 0xaa, 0x05, 0xcd, 0xac,
25
+ ],
26
+ )
27
+ }
28
+
29
+ // Signer 1: 0x9b6ababd080456f900ed64e74d122ff9ca40daa1
30
+ fn test_signer1(env: &Env) -> BytesN<20> {
31
+ BytesN::from_array(
32
+ env,
33
+ &[
34
+ 0x9b, 0x6a, 0xba, 0xbd, 0x08, 0x04, 0x56, 0xf9, 0x00, 0xed, 0x64, 0xe7, 0x4d, 0x12, 0x2f, 0xf9, 0xca, 0x40,
35
+ 0xda, 0xa1,
36
+ ],
37
+ )
38
+ }
39
+
40
+ // Signer 2: 0xd6869dacf9c6ce629cf042864737690641d0e2d7
41
+ fn test_signer2(env: &Env) -> BytesN<20> {
42
+ BytesN::from_array(
43
+ env,
44
+ &[
45
+ 0xd6, 0x86, 0x9d, 0xac, 0xf9, 0xc6, 0xce, 0x62, 0x9c, 0xf0, 0x42, 0x86, 0x47, 0x37, 0x69, 0x06, 0x41, 0xd0,
46
+ 0xe2, 0xd7,
47
+ ],
48
+ )
49
+ }
50
+
51
+ // Signature from signer1 for test_digest
52
+ fn test_sig1(env: &Env) -> BytesN<65> {
53
+ BytesN::from_array(
54
+ env,
55
+ &[
56
+ 0x31, 0x53, 0x7d, 0xcf, 0xe1, 0xec, 0x4d, 0x7e, 0x89, 0xf5, 0x97, 0x2c, 0xcd, 0x30, 0x65, 0xe3, 0x4e, 0x17,
57
+ 0x8e, 0x30, 0x2c, 0x1b, 0x9e, 0x8e, 0x17, 0x5d, 0x38, 0x43, 0xa2, 0x96, 0x4f, 0x28, // r
58
+ 0x63, 0xf2, 0xb6, 0x0c, 0x7e, 0xf7, 0x43, 0x63, 0xb6, 0x87, 0xf8, 0x22, 0xdb, 0x6c, 0x31, 0x3e, 0x87, 0x62,
59
+ 0xb3, 0x8d, 0x30, 0x97, 0xb6, 0xfe, 0xc9, 0xb7, 0xb7, 0x61, 0x65, 0x63, 0x0a, 0xaa, // s
60
+ 0x1b, // v = 27
61
+ ],
62
+ )
63
+ }
64
+
65
+ // Signature from signer2 for test_digest
66
+ fn test_sig2(env: &Env) -> BytesN<65> {
67
+ BytesN::from_array(
68
+ env,
69
+ &[
70
+ 0x42, 0x67, 0x4f, 0xc6, 0x30, 0xe3, 0x2f, 0x90, 0x00, 0xbc, 0x95, 0x27, 0x1e, 0xc5, 0x42, 0x83, 0xc8, 0xad,
71
+ 0x35, 0x00, 0x16, 0xbb, 0x66, 0xa1, 0x84, 0x64, 0x95, 0x89, 0x63, 0xa5, 0x1f, 0x03, // r
72
+ 0x14, 0x6e, 0x8b, 0x3f, 0xbb, 0x3a, 0x5b, 0xd0, 0xb8, 0x9d, 0x3b, 0x6c, 0x1e, 0x01, 0xdd, 0x61, 0x4e, 0x86,
73
+ 0xba, 0xe0, 0x13, 0x51, 0xdc, 0x3d, 0x1f, 0xfe, 0x35, 0x22, 0xc8, 0x3e, 0xd4, 0x50, // s
74
+ 0x1c, // v = 28
75
+ ],
76
+ )
77
+ }
78
+
79
+ #[test]
80
+ fn set_signer_requires_auth() {
81
+ let env = Env::default();
82
+ let contract_id = env.register(TestContract, ());
83
+ let client = TestContractClient::new(&env, &contract_id);
84
+ let signer = BytesN::<20>::from_array(&env, &[1u8; 20]);
85
+
86
+ // No auth provided -> should fail.
87
+ let res = client.try_set_signer(&signer, &true);
88
+ assert_eq!(res.unwrap_err().unwrap(), Error::from_type_and_code(ScErrorType::Context, ScErrorCode::InvalidAction));
89
+ }
90
+
91
+ #[test]
92
+ fn set_threshold_requires_auth() {
93
+ let env = Env::default();
94
+ let contract_id = env.register(TestContract, ());
95
+ let client = TestContractClient::new(&env, &contract_id);
96
+
97
+ // No auth provided -> should fail (auth happens before any threshold validation).
98
+ let res = client.try_set_threshold(&1);
99
+ assert_eq!(res.unwrap_err().unwrap(), Error::from_type_and_code(ScErrorType::Context, ScErrorCode::InvalidAction));
100
+ }
101
+
102
+ #[test]
103
+ fn set_signer_and_threshold_work_with_auth() {
104
+ let env = Env::default();
105
+ env.mock_all_auths();
106
+
107
+ let contract_id = env.register(TestContract, ());
108
+ let client = TestContractClient::new(&env, &contract_id);
109
+
110
+ let signer = BytesN::<20>::from_array(&env, &[1u8; 20]);
111
+
112
+ // These must be exported contract entrypoints via the macro-generated contractimpl(contracttrait).
113
+ client.set_signer(&signer, &true);
114
+ assert_eq_event(&env, &contract_id, SignerSet { signer: signer.clone(), active: true });
115
+
116
+ client.set_threshold(&1);
117
+ assert_eq_event(&env, &contract_id, ThresholdSet { threshold: 1 });
118
+
119
+ assert!(client.is_signer(&signer));
120
+ assert_eq!(client.total_signers(), 1);
121
+ assert_eq!(client.threshold(), 1);
122
+
123
+ // Cannot set threshold higher than total signers.
124
+ let res = client.try_set_threshold(&2);
125
+ assert_eq!(res.err().unwrap().ok().unwrap(), utils::errors::MultiSigError::TotalSignersLessThanThreshold.into());
126
+ // Threshold should remain unchanged.
127
+ assert_eq!(client.threshold(), 1);
128
+ }
129
+
130
+ #[test]
131
+ fn set_signer_remove_path_works() {
132
+ let env = Env::default();
133
+ env.mock_all_auths();
134
+
135
+ let contract_id = env.register(TestContract, ());
136
+ let client = TestContractClient::new(&env, &contract_id);
137
+
138
+ let signer = BytesN::<20>::from_array(&env, &[1u8; 20]);
139
+ client.set_signer(&signer, &true);
140
+ assert_eq_event(&env, &contract_id, SignerSet { signer: signer.clone(), active: true });
141
+ assert!(client.is_signer(&signer));
142
+ assert_eq!(client.total_signers(), 1);
143
+
144
+ // active=false branch should remove the signer.
145
+ client.set_signer(&signer, &false);
146
+ assert_eq_event(&env, &contract_id, SignerSet { signer: signer.clone(), active: false });
147
+ assert!(!client.is_signer(&signer));
148
+ assert_eq!(client.total_signers(), 0);
149
+ }
150
+
151
+ #[test]
152
+ fn verify_signatures_rejects_zero_threshold_by_default() {
153
+ let env = Env::default();
154
+ let contract_id = env.register(TestContract, ());
155
+ let client = TestContractClient::new(&env, &contract_id);
156
+
157
+ // Default threshold is 0 (from storage default), so verify should error with ZeroThreshold.
158
+ let digest = BytesN::<32>::from_array(&env, &[9u8; 32]);
159
+ let sigs = Vec::<BytesN<65>>::new(&env);
160
+
161
+ let result = client.try_verify_signatures(&digest, &sigs);
162
+ assert_eq!(result.err().unwrap().ok().unwrap(), utils::errors::MultiSigError::ZeroThreshold.into());
163
+ }
164
+
165
+ #[test]
166
+ fn verify_n_signatures_rejects_insufficient_signatures() {
167
+ let env = Env::default();
168
+ let contract_id = env.register(TestContract, ());
169
+ let client = TestContractClient::new(&env, &contract_id);
170
+
171
+ let digest = BytesN::<32>::from_array(&env, &[8u8; 32]);
172
+ let sigs = Vec::<BytesN<65>>::new(&env);
173
+
174
+ // threshold=1 but 0 signatures => SignatureError
175
+ let result = client.try_verify_n_signatures(&digest, &sigs, &1);
176
+ assert_eq!(result.err().unwrap().ok().unwrap(), utils::errors::MultiSigError::SignatureError.into());
177
+
178
+ // threshold=1 with a valid signature but no registered signers => SignerNotFound
179
+ let digest = test_digest(&env);
180
+ let sigs = Vec::from_array(&env, [test_sig1(&env)]);
181
+ let result = client.try_verify_n_signatures(&digest, &sigs, &1);
182
+ assert_eq!(result.err().unwrap().ok().unwrap(), utils::errors::MultiSigError::SignerNotFound.into());
183
+ }
184
+
185
+ #[test]
186
+ fn verify_signatures_success() {
187
+ let env = Env::default();
188
+ env.mock_all_auths();
189
+
190
+ let contract_id = env.register(TestContract, ());
191
+ let client = TestContractClient::new(&env, &contract_id);
192
+
193
+ // Configure signers + threshold=2 using macro-exported entrypoints.
194
+ let s1 = test_signer1(&env);
195
+ let s2 = test_signer2(&env);
196
+ client.set_signer(&s1, &true);
197
+ client.set_signer(&s2, &true);
198
+ client.set_threshold(&2);
199
+
200
+ let digest = test_digest(&env);
201
+ // Must be sorted by signer address (s1 < s2).
202
+ let sigs = Vec::from_array(&env, [test_sig1(&env), test_sig2(&env)]);
203
+ client.verify_signatures(&digest, &sigs);
204
+
205
+ // Unsorted signatures should be rejected.
206
+ let unsorted = Vec::from_array(&env, [test_sig2(&env), test_sig1(&env)]);
207
+ let result = client.try_verify_signatures(&digest, &unsorted);
208
+ assert_eq!(result.err().unwrap().ok().unwrap(), utils::errors::MultiSigError::UnsortedSigners.into());
209
+ }
210
+
211
+ #[test]
212
+ fn verify_n_signatures_success() {
213
+ let env = Env::default();
214
+ env.mock_all_auths();
215
+
216
+ let contract_id = env.register(TestContract, ());
217
+ let client = TestContractClient::new(&env, &contract_id);
218
+
219
+ // Configure signers (threshold stored is irrelevant for verify_n_signatures).
220
+ let s1 = test_signer1(&env);
221
+ let s2 = test_signer2(&env);
222
+ client.set_signer(&s1, &true);
223
+ client.set_signer(&s2, &true);
224
+ client.set_threshold(&2);
225
+
226
+ let digest = test_digest(&env);
227
+ let sigs = Vec::from_array(&env, [test_sig1(&env), test_sig2(&env)]);
228
+ client.verify_n_signatures(&digest, &sigs, &1);
229
+ }
230
+
231
+ #[test]
232
+ fn set_signer_rejects_zero_address() {
233
+ let env = Env::default();
234
+ env.mock_all_auths();
235
+
236
+ let contract_id = env.register(TestContract, ());
237
+ let client = TestContractClient::new(&env, &contract_id);
238
+
239
+ let zero = BytesN::<20>::from_array(&env, &[0u8; 20]);
240
+ let res = client.try_set_signer(&zero, &true);
241
+ assert_eq!(res.err().unwrap().ok().unwrap(), utils::errors::MultiSigError::InvalidSigner.into());
242
+ }
@@ -0,0 +1,9 @@
1
+ use soroban_sdk::contract;
2
+
3
+ mod admin_entrypoints;
4
+ mod self_auth;
5
+
6
+ /// Shared contract used by multisig runtime tests.
7
+ #[contract]
8
+ #[common_macros::multisig]
9
+ pub struct TestContract;
@@ -0,0 +1,54 @@
1
+ // Runtime tests: `#[multisig]` self-owning authorization behavior.
2
+ //
3
+ // Tests covered:
4
+ // - `Auth::authorizer()` resolves to the contract's own address.
5
+ // - MultiSig mutation calls can be authorized by the contract address (self-owning pattern).
6
+
7
+ use super::{TestContract, TestContractClient};
8
+ use soroban_sdk::{BytesN, Env, Vec};
9
+ use utils::{
10
+ multisig::{SignerSet, ThresholdSet},
11
+ testing_utils::assert_contains_events,
12
+ };
13
+
14
+ #[test]
15
+ fn authorizer_is_current_contract_address() {
16
+ let env = Env::default();
17
+ let contract_id = env.register(TestContract, ());
18
+ let client = TestContractClient::new(&env, &contract_id);
19
+
20
+ let expected = env.as_contract(&contract_id, || env.current_contract_address());
21
+ let got = client.authorizer();
22
+ assert_eq!(got, expected);
23
+ }
24
+
25
+ #[test]
26
+ fn self_auth_allows_multisig_admin_calls() {
27
+ let env = Env::default();
28
+ let contract_id = env.register(TestContract, ());
29
+ let client = TestContractClient::new(&env, &contract_id);
30
+
31
+ // Seed multisig storage directly, then verify view methods are wired via the macro-generated
32
+ // `MultiSig` trait impl.
33
+ let signer = BytesN::<20>::from_array(&env, &[1u8; 20]);
34
+ let mut signers = Vec::<BytesN<20>>::new(&env);
35
+ signers.push_back(signer.clone());
36
+ env.as_contract(&contract_id, || {
37
+ utils::multisig::init_multisig(&env, &signers, 1);
38
+ });
39
+
40
+ assert_contains_events(
41
+ &env,
42
+ &contract_id,
43
+ &[&SignerSet { signer: signer.clone(), active: true }, &ThresholdSet { threshold: 1 }],
44
+ );
45
+
46
+ // Verify stored state through view calls.
47
+ assert_eq!(client.threshold(), 1);
48
+ assert!(client.is_signer(&signer));
49
+ assert_eq!(client.total_signers(), 1);
50
+
51
+ let signers: Vec<BytesN<20>> = client.get_signers();
52
+ assert_eq!(signers.len(), 1);
53
+ assert_eq!(signers.get(0).unwrap(), signer);
54
+ }
@@ -53,6 +53,7 @@ fn uninitialized_returns_none() {
53
53
  assert_eq!(client.owner(), None);
54
54
 
55
55
  // All owner-protected operations should fail
56
+ assert_eq!(client.try_authorizer().unwrap_err().unwrap(), OwnableError::OwnerNotSet.into());
56
57
  assert_eq!(client.try_guarded().unwrap_err().unwrap(), OwnableError::OwnerNotSet.into());
57
58
  assert_eq!(
58
59
  client.try_transfer_ownership(&Address::generate(&env)).unwrap_err().unwrap(),
@@ -60,3 +61,15 @@ fn uninitialized_returns_none() {
60
61
  );
61
62
  assert_eq!(client.try_renounce_ownership().unwrap_err().unwrap(), OwnableError::OwnerNotSet.into());
62
63
  }
64
+
65
+ #[test]
66
+ fn authorizer_returns_owner() {
67
+ let env = Env::default();
68
+ let contract_id = env.register(TestContract, ());
69
+ let client = TestContractClient::new(&env, &contract_id);
70
+
71
+ let owner = Address::generate(&env);
72
+ client.init(&owner);
73
+
74
+ assert_eq!(client.authorizer(), owner);
75
+ }
@@ -2,6 +2,7 @@ use soroban_sdk::{contract, contractimpl, Address, Env};
2
2
 
3
3
  mod initialization;
4
4
  mod only_auth_guard;
5
+ mod two_step_transfer;
5
6
  mod ownership_transfer;
6
7
 
7
8
  /// Shared contract used by ownable runtime tests.