@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
@@ -1,17 +1,14 @@
1
1
  use crate::{
2
2
  auth::Auth,
3
- errors::MultisigError,
4
- multisig::{init_multisig, recover_signer, Multisig},
3
+ errors::MultiSigError,
4
+ multisig::{init_multisig, recover_signer, MultiSig, SignerSet, ThresholdSet},
5
+ testing_utils::{assert_eq_event, assert_eq_events},
5
6
  };
6
7
  use soroban_sdk::{
7
- contract, contractimpl,
8
- testutils::{AuthorizedFunction, Events},
9
- vec, Address, BytesN, Env, IntoVal, Symbol, TryIntoVal, Val, Vec,
8
+ contract, contractimpl, testutils::AuthorizedFunction, vec, Address, BytesN, Env, IntoVal, Symbol, Val, Vec,
10
9
  };
11
10
 
12
- use crate::testing_utils::decode_event_topics_data;
13
-
14
- // Test contract implementing Multisig + Auth (self-owning)
11
+ // Test contract implementing MultiSig + Auth (self-owning)
15
12
  #[contract]
16
13
  pub struct TestContract;
17
14
 
@@ -32,7 +29,7 @@ impl Auth for TestContract {
32
29
  }
33
30
 
34
31
  #[contractimpl(contracttrait)]
35
- impl Multisig for TestContract {}
32
+ impl MultiSig for TestContract {}
36
33
 
37
34
  fn signer(env: &Env, seed: u8) -> BytesN<20> {
38
35
  let mut bytes = [0u8; 20];
@@ -60,53 +57,6 @@ fn assert_auth(env: &Env, contract: &Address, func: &str, expected_args: Vec<Val
60
57
  }
61
58
  }
62
59
 
63
- fn assert_signer_set_event(env: &Env, contract: &Address, signer: &BytesN<20>, active: bool) {
64
- use soroban_sdk::Map;
65
- let events = env.events().all().filter_by_contract(contract);
66
- // Find the signer_set event for this contract (snake_case event name)
67
- let found = events.events().iter().any(|event| {
68
- let Some((topics, data)) = decode_event_topics_data(env, event) else {
69
- return false;
70
- };
71
- // Check topics: ["signer_set", signer]
72
- if topics.len() != 2 {
73
- return false;
74
- }
75
- let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(env).unwrap();
76
- let topic_signer: BytesN<20> = topics.get(1).unwrap().try_into_val(env).unwrap();
77
- if topic_symbol != Symbol::new(env, "signer_set") || &topic_signer != signer {
78
- return false;
79
- }
80
- // Check data is a map with "active" field
81
- let data_map: Map<Symbol, bool> = data.try_into_val(env).unwrap();
82
- data_map.get(Symbol::new(env, "active")) == Some(active)
83
- });
84
- assert!(found, "signer_set event not found");
85
- }
86
-
87
- fn assert_threshold_set_event(env: &Env, contract: &Address, threshold: u32) {
88
- use soroban_sdk::Map;
89
- let events = env.events().all().filter_by_contract(contract);
90
- // Find the threshold_set event for this contract (snake_case event name)
91
- let found = events.events().iter().any(|event| {
92
- let Some((topics, data)) = decode_event_topics_data(env, event) else {
93
- return false;
94
- };
95
- // Check topics: ["threshold_set"]
96
- if topics.len() != 1 {
97
- return false;
98
- }
99
- let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(env).unwrap();
100
- if topic_symbol != Symbol::new(env, "threshold_set") {
101
- return false;
102
- }
103
- // Check data is a map with "threshold" field
104
- let data_map: Map<Symbol, u32> = data.try_into_val(env).unwrap();
105
- data_map.get(Symbol::new(env, "threshold")) == Some(threshold)
106
- });
107
- assert!(found, "threshold_set event not found");
108
- }
109
-
110
60
  // ============================================
111
61
  // init: Initialization tests
112
62
  // ============================================
@@ -114,7 +64,6 @@ fn assert_threshold_set_event(env: &Env, contract: &Address, threshold: u32) {
114
64
  #[test]
115
65
  fn init_sets_signers_and_threshold() {
116
66
  let env = Env::default();
117
- env.mock_all_auths();
118
67
 
119
68
  let s1 = signer(&env, 1);
120
69
  let s2 = signer(&env, 2);
@@ -130,7 +79,7 @@ fn init_sets_signers_and_threshold() {
130
79
  }
131
80
 
132
81
  #[test]
133
- #[should_panic(expected = "Error(Contract, #1067)")] // ZeroThreshold
82
+ #[should_panic(expected = "Error(Contract, #1068)")] // ZeroThreshold
134
83
  fn init_zero_threshold_fails() {
135
84
  let env = Env::default();
136
85
  let s1 = signer(&env, 1);
@@ -140,7 +89,7 @@ fn init_zero_threshold_fails() {
140
89
  }
141
90
 
142
91
  #[test]
143
- #[should_panic(expected = "Error(Contract, #1065)")] // TotalSignersLessThanThreshold
92
+ #[should_panic(expected = "Error(Contract, #1066)")] // TotalSignersLessThanThreshold
144
93
  fn init_threshold_exceeds_signers_fails() {
145
94
  let env = Env::default();
146
95
  let s1 = signer(&env, 1);
@@ -164,6 +113,46 @@ fn init_already_initialized_fails() {
164
113
  });
165
114
  }
166
115
 
116
+ #[test]
117
+ fn init_emits_signer_and_threshold_events() {
118
+ let env = Env::default();
119
+
120
+ let s1 = signer(&env, 1);
121
+ let s2 = signer(&env, 2);
122
+ let signers = vec![&env, s1.clone(), s2.clone()];
123
+
124
+ let contract = env.register(TestContract, (&signers, 2u32));
125
+
126
+ assert_eq_events(
127
+ &env,
128
+ &contract,
129
+ &[
130
+ &SignerSet { signer: s1, active: true },
131
+ &SignerSet { signer: s2, active: true },
132
+ &ThresholdSet { threshold: 2 },
133
+ ],
134
+ );
135
+ }
136
+
137
+ #[test]
138
+ #[should_panic(expected = "Error(Contract, #1062)")] // InvalidSigner
139
+ fn init_zero_signer_fails() {
140
+ let env = Env::default();
141
+ let signers = vec![&env, zero_signer(&env)];
142
+
143
+ env.register(TestContract, (&signers, 1u32));
144
+ }
145
+
146
+ #[test]
147
+ #[should_panic(expected = "Error(Contract, #1064)")] // SignerAlreadyExists
148
+ fn init_duplicate_signers_fails() {
149
+ let env = Env::default();
150
+ let s1 = signer(&env, 1);
151
+ let signers = vec![&env, s1.clone(), s1];
152
+
153
+ env.register(TestContract, (&signers, 1u32));
154
+ }
155
+
167
156
  // ============================================
168
157
  // set_signer: Add/remove signer tests
169
158
  // ============================================
@@ -186,13 +175,29 @@ fn set_signer_add() {
186
175
  assert_auth(&env, &contract, "set_signer", (s2.clone(), true).into_val(&env));
187
176
 
188
177
  // Verify SignerSet event was emitted
189
- assert_signer_set_event(&env, &contract, &s2, true);
178
+ assert_eq_event(&env, &contract, SignerSet { signer: s2.clone(), active: true });
190
179
 
191
180
  assert_eq!(client.total_signers(), 2);
192
181
  assert!(client.is_signer(&s1));
193
182
  assert!(client.is_signer(&s2));
194
183
  }
195
184
 
185
+ #[test]
186
+ #[should_panic(expected = "Error(Auth, InvalidAction)")]
187
+ fn set_signer_requires_auth() {
188
+ let env = Env::default();
189
+
190
+ let s1 = signer(&env, 1);
191
+ let s2 = signer(&env, 2);
192
+ let signers = vec![&env, s1];
193
+
194
+ let contract = env.register(TestContract, (&signers, 1u32));
195
+ let client = TestContractClient::new(&env, &contract);
196
+
197
+ // No `mock_*auth*` provided -> contract.require_auth() must fail.
198
+ client.set_signer(&s2, &true);
199
+ }
200
+
196
201
  #[test]
197
202
  fn set_signer_remove() {
198
203
  let env = Env::default();
@@ -211,7 +216,7 @@ fn set_signer_remove() {
211
216
  assert_auth(&env, &contract, "set_signer", (s1.clone(), false).into_val(&env));
212
217
 
213
218
  // Verify SignerSet event was emitted
214
- assert_signer_set_event(&env, &contract, &s1, false);
219
+ assert_eq_event(&env, &contract, SignerSet { signer: s1.clone(), active: false });
215
220
 
216
221
  assert_eq!(client.total_signers(), 1);
217
222
  assert!(!client.is_signer(&s1));
@@ -230,7 +235,7 @@ fn set_signer_zero_address_fails() {
230
235
  let client = TestContractClient::new(&env, &contract);
231
236
 
232
237
  let res = client.try_set_signer(&zero_signer(&env), &true);
233
- assert_eq!(res.err().unwrap().ok().unwrap(), MultisigError::InvalidSigner.into());
238
+ assert_eq!(res.err().unwrap().ok().unwrap(), MultiSigError::InvalidSigner.into());
234
239
  }
235
240
 
236
241
  #[test]
@@ -245,7 +250,7 @@ fn set_signer_duplicate_fails() {
245
250
  let client = TestContractClient::new(&env, &contract);
246
251
 
247
252
  let res = client.try_set_signer(&s1, &true);
248
- assert_eq!(res.err().unwrap().ok().unwrap(), MultisigError::SignerAlreadyExists.into());
253
+ assert_eq!(res.err().unwrap().ok().unwrap(), MultiSigError::SignerAlreadyExists.into());
249
254
  }
250
255
 
251
256
  #[test]
@@ -261,7 +266,7 @@ fn set_signer_remove_not_found_fails() {
261
266
  let client = TestContractClient::new(&env, &contract);
262
267
 
263
268
  let res = client.try_set_signer(&s2, &false);
264
- assert_eq!(res.err().unwrap().ok().unwrap(), MultisigError::SignerNotFound.into());
269
+ assert_eq!(res.err().unwrap().ok().unwrap(), MultiSigError::SignerNotFound.into());
265
270
  }
266
271
 
267
272
  #[test]
@@ -277,7 +282,7 @@ fn set_signer_remove_violates_threshold_fails() {
277
282
  let client = TestContractClient::new(&env, &contract);
278
283
 
279
284
  let res = client.try_set_signer(&s1, &false);
280
- assert_eq!(res.err().unwrap().ok().unwrap(), MultisigError::TotalSignersLessThanThreshold.into());
285
+ assert_eq!(res.err().unwrap().ok().unwrap(), MultiSigError::TotalSignersLessThanThreshold.into());
281
286
  }
282
287
 
283
288
  // ============================================
@@ -302,11 +307,27 @@ fn set_threshold_success() {
302
307
  assert_auth(&env, &contract, "set_threshold", (2u32,).into_val(&env));
303
308
 
304
309
  // Verify ThresholdSet event was emitted
305
- assert_threshold_set_event(&env, &contract, 2);
310
+ assert_eq_event(&env, &contract, ThresholdSet { threshold: 2 });
306
311
 
307
312
  assert_eq!(client.threshold(), 2);
308
313
  }
309
314
 
315
+ #[test]
316
+ #[should_panic(expected = "Error(Auth, InvalidAction)")]
317
+ fn set_threshold_requires_auth() {
318
+ let env = Env::default();
319
+
320
+ let s1 = signer(&env, 1);
321
+ let s2 = signer(&env, 2);
322
+ let signers = vec![&env, s1, s2];
323
+
324
+ let contract = env.register(TestContract, (&signers, 1u32));
325
+ let client = TestContractClient::new(&env, &contract);
326
+
327
+ // No `mock_*auth*` provided -> contract.require_auth() must fail.
328
+ client.set_threshold(&2);
329
+ }
330
+
310
331
  #[test]
311
332
  fn set_threshold_zero_fails() {
312
333
  let env = Env::default();
@@ -319,7 +340,7 @@ fn set_threshold_zero_fails() {
319
340
  let client = TestContractClient::new(&env, &contract);
320
341
 
321
342
  let res = client.try_set_threshold(&0);
322
- assert_eq!(res.err().unwrap().ok().unwrap(), MultisigError::ZeroThreshold.into());
343
+ assert_eq!(res.err().unwrap().ok().unwrap(), MultiSigError::ZeroThreshold.into());
323
344
  }
324
345
 
325
346
  #[test]
@@ -334,7 +355,7 @@ fn set_threshold_exceeds_signers_fails() {
334
355
  let client = TestContractClient::new(&env, &contract);
335
356
 
336
357
  let res = client.try_set_threshold(&2);
337
- assert_eq!(res.err().unwrap().ok().unwrap(), MultisigError::TotalSignersLessThanThreshold.into());
358
+ assert_eq!(res.err().unwrap().ok().unwrap(), MultiSigError::TotalSignersLessThanThreshold.into());
338
359
  }
339
360
 
340
361
  // ============================================
@@ -344,7 +365,6 @@ fn set_threshold_exceeds_signers_fails() {
344
365
  #[test]
345
366
  fn get_signers_returns_all() {
346
367
  let env = Env::default();
347
- env.mock_all_auths();
348
368
 
349
369
  let s1 = signer(&env, 1);
350
370
  let s2 = signer(&env, 2);
@@ -429,7 +449,6 @@ fn test_sig2(env: &Env) -> BytesN<65> {
429
449
  #[test]
430
450
  fn verify_signatures_success() {
431
451
  let env = Env::default();
432
- env.mock_all_auths();
433
452
 
434
453
  let s1 = test_signer1(&env);
435
454
  let s2 = test_signer2(&env);
@@ -449,7 +468,6 @@ fn verify_signatures_success() {
449
468
  #[test]
450
469
  fn verify_n_signatures_success() {
451
470
  let env = Env::default();
452
- env.mock_all_auths();
453
471
 
454
472
  let s1 = test_signer1(&env);
455
473
  let s2 = test_signer2(&env);
@@ -468,7 +486,6 @@ fn verify_n_signatures_success() {
468
486
  #[test]
469
487
  fn verify_n_signatures_zero_threshold_fails() {
470
488
  let env = Env::default();
471
- env.mock_all_auths();
472
489
 
473
490
  let s1 = test_signer1(&env);
474
491
  let signers = vec![&env, s1];
@@ -480,13 +497,12 @@ fn verify_n_signatures_zero_threshold_fails() {
480
497
  let signatures: Vec<BytesN<65>> = vec![&env];
481
498
 
482
499
  let res = client.try_verify_n_signatures(&digest, &signatures, &0);
483
- assert_eq!(res.err().unwrap().ok().unwrap(), MultisigError::ZeroThreshold.into());
500
+ assert_eq!(res.err().unwrap().ok().unwrap(), MultiSigError::ZeroThreshold.into());
484
501
  }
485
502
 
486
503
  #[test]
487
504
  fn verify_n_signatures_insufficient_signatures_fails() {
488
505
  let env = Env::default();
489
- env.mock_all_auths();
490
506
 
491
507
  let s1 = test_signer1(&env);
492
508
  let signers = vec![&env, s1];
@@ -498,13 +514,12 @@ fn verify_n_signatures_insufficient_signatures_fails() {
498
514
  let signatures: Vec<BytesN<65>> = vec![&env]; // Empty
499
515
 
500
516
  let res = client.try_verify_n_signatures(&digest, &signatures, &1);
501
- assert_eq!(res.err().unwrap().ok().unwrap(), MultisigError::SignatureError.into());
517
+ assert_eq!(res.err().unwrap().ok().unwrap(), MultiSigError::SignatureError.into());
502
518
  }
503
519
 
504
520
  #[test]
505
521
  fn verify_n_signatures_signer_not_found_fails() {
506
522
  let env = Env::default();
507
- env.mock_all_auths();
508
523
 
509
524
  // Register with only signer2, but provide sig1 (from signer1)
510
525
  let s2 = test_signer2(&env);
@@ -517,13 +532,12 @@ fn verify_n_signatures_signer_not_found_fails() {
517
532
  let signatures = vec![&env, test_sig1(&env)]; // sig1 is from signer1, not registered
518
533
 
519
534
  let res = client.try_verify_n_signatures(&digest, &signatures, &1);
520
- assert_eq!(res.err().unwrap().ok().unwrap(), MultisigError::SignerNotFound.into());
535
+ assert_eq!(res.err().unwrap().ok().unwrap(), MultiSigError::SignerNotFound.into());
521
536
  }
522
537
 
523
538
  #[test]
524
539
  fn verify_n_signatures_unsorted_signers_fails() {
525
540
  let env = Env::default();
526
- env.mock_all_auths();
527
541
 
528
542
  let s1 = test_signer1(&env);
529
543
  let s2 = test_signer2(&env);
@@ -537,7 +551,84 @@ fn verify_n_signatures_unsorted_signers_fails() {
537
551
  let signatures = vec![&env, test_sig2(&env), test_sig1(&env)];
538
552
 
539
553
  let res = client.try_verify_n_signatures(&digest, &signatures, &2);
540
- assert_eq!(res.err().unwrap().ok().unwrap(), MultisigError::UnsortedSigners.into());
554
+ assert_eq!(res.err().unwrap().ok().unwrap(), MultiSigError::UnsortedSigners.into());
555
+ }
556
+
557
+ #[test]
558
+ fn verify_n_signatures_duplicate_signers_fails() {
559
+ let env = Env::default();
560
+
561
+ let s1 = test_signer1(&env);
562
+ let s2 = test_signer2(&env);
563
+ let signers = vec![&env, s1, s2];
564
+
565
+ let contract = env.register(TestContract, (&signers, 2u32));
566
+ let client = TestContractClient::new(&env, &contract);
567
+
568
+ let digest = test_digest(&env);
569
+ // Duplicate signer (sig1 twice) must fail the strict ordering check (not strictly increasing).
570
+ let signatures = vec![&env, test_sig1(&env), test_sig1(&env)];
571
+
572
+ let res = client.try_verify_n_signatures(&digest, &signatures, &2);
573
+ assert_eq!(res.err().unwrap().ok().unwrap(), MultiSigError::UnsortedSigners.into());
574
+ }
575
+
576
+ #[test]
577
+ fn verify_n_signatures_threshold_one_still_requires_sorted_if_multiple_provided() {
578
+ let env = Env::default();
579
+
580
+ let s1 = test_signer1(&env);
581
+ let s2 = test_signer2(&env);
582
+ let signers = vec![&env, s1, s2];
583
+
584
+ let contract = env.register(TestContract, (&signers, 2u32));
585
+ let client = TestContractClient::new(&env, &contract);
586
+
587
+ let digest = test_digest(&env);
588
+ // Even though threshold=1, passing multiple signatures still requires them to be strictly sorted.
589
+ let signatures = vec![&env, test_sig2(&env), test_sig1(&env)];
590
+
591
+ let res = client.try_verify_n_signatures(&digest, &signatures, &1);
592
+ assert_eq!(res.err().unwrap().ok().unwrap(), MultiSigError::UnsortedSigners.into());
593
+ }
594
+
595
+ #[test]
596
+ fn verify_n_signatures_threshold_met_but_extra_invalid_signature_fails() {
597
+ let env = Env::default();
598
+
599
+ // Register only signer1 with threshold=1 (so sig1 alone would be sufficient).
600
+ let s1 = test_signer1(&env);
601
+ let signers = vec![&env, s1];
602
+
603
+ let contract = env.register(TestContract, (&signers, 1u32));
604
+ let client = TestContractClient::new(&env, &contract);
605
+
606
+ let digest = test_digest(&env);
607
+ // Provide an extra signature from signer2 (not registered). Even though threshold is met,
608
+ // verification checks *all provided signatures* and must fail.
609
+ let signatures = vec![&env, test_sig1(&env), test_sig2(&env)];
610
+
611
+ let res = client.try_verify_n_signatures(&digest, &signatures, &1);
612
+ assert_eq!(res.err().unwrap().ok().unwrap(), MultiSigError::SignerNotFound.into());
613
+ }
614
+
615
+ #[test]
616
+ fn verify_signatures_enforces_configured_threshold() {
617
+ let env = Env::default();
618
+
619
+ let s1 = test_signer1(&env);
620
+ let s2 = test_signer2(&env);
621
+ let signers = vec![&env, s1, s2];
622
+
623
+ // Configured threshold = 2
624
+ let contract = env.register(TestContract, (&signers, 2u32));
625
+ let client = TestContractClient::new(&env, &contract);
626
+
627
+ let digest = test_digest(&env);
628
+ // Only one signature -> must fail because `verify_signatures` uses configured threshold.
629
+ let signatures = vec![&env, test_sig1(&env)];
630
+ let res = client.try_verify_signatures(&digest, &signatures);
631
+ assert_eq!(res.err().unwrap().ok().unwrap(), MultiSigError::SignatureError.into());
541
632
  }
542
633
 
543
634
  // ============================================
@@ -667,65 +758,3 @@ fn recover_signer_invalid_v_fails() {
667
758
  // Should panic - recovery_id must be 0 or 1
668
759
  recover_signer(&env, &digest, &signature);
669
760
  }
670
-
671
- #[test]
672
- #[should_panic(expected = "Error(Crypto, InvalidInput)")]
673
- fn verify_signatures_invalid_r_zero_fails() {
674
- let env = Env::default();
675
- env.mock_all_auths();
676
-
677
- let s1 = signer(&env, 1);
678
- let signers = vec![&env, s1];
679
-
680
- let contract = env.register(TestContract, (&signers, 1u32));
681
- let client = TestContractClient::new(&env, &contract);
682
-
683
- let digest = BytesN::from_array(&env, &[0u8; 32]);
684
-
685
- // Create signature with r=0 (invalid)
686
- // Soroban's secp256k1_recover validates signatures and rejects r=0 at the crypto level
687
- let mut invalid_sig_bytes = [0u8; 65];
688
- // r = 0 (bytes 0-31 are already 0)
689
- // s = some value (bytes 32-63)
690
- for i in 32..64 {
691
- invalid_sig_bytes[i] = 1;
692
- }
693
- // v = 27 (byte 64)
694
- invalid_sig_bytes[64] = 27;
695
- let invalid_sig = BytesN::from_array(&env, &invalid_sig_bytes);
696
- let signatures = vec![&env, invalid_sig];
697
-
698
- // Soroban's crypto API rejects invalid signatures with HostError
699
- client.verify_signatures(&digest, &signatures);
700
- }
701
-
702
- #[test]
703
- #[should_panic(expected = "Error(Crypto, InvalidInput)")]
704
- fn verify_signatures_invalid_s_zero_fails() {
705
- let env = Env::default();
706
- env.mock_all_auths();
707
-
708
- let s1 = signer(&env, 1);
709
- let signers = vec![&env, s1];
710
-
711
- let contract = env.register(TestContract, (&signers, 1u32));
712
- let client = TestContractClient::new(&env, &contract);
713
-
714
- let digest = BytesN::from_array(&env, &[0u8; 32]);
715
-
716
- // Create signature with s=0 (invalid)
717
- // Soroban's secp256k1_recover validates signatures and rejects s=0 at the crypto level
718
- let mut invalid_sig_bytes = [0u8; 65];
719
- // r = some value (bytes 0-31)
720
- for i in 0..32 {
721
- invalid_sig_bytes[i] = 1;
722
- }
723
- // s = 0 (bytes 32-63 are already 0)
724
- // v = 27 (byte 64)
725
- invalid_sig_bytes[64] = 27;
726
- let invalid_sig = BytesN::from_array(&env, &invalid_sig_bytes);
727
- let signatures = vec![&env, invalid_sig];
728
-
729
- // Soroban's crypto API rejects invalid signatures with HostError
730
- client.verify_signatures(&digest, &signatures);
731
- }
@@ -10,7 +10,7 @@ fn unwrap_or_panic_some_returns_value() {
10
10
 
11
11
  #[test]
12
12
  fn unwrap_or_panic_none_panics_with_error() {
13
- const EXPECTED: &str = "Error(Contract, #1034)"; // OwnerNotSet
13
+ const EXPECTED: &str = "Error(Contract, #1035)"; // OwnerNotSet
14
14
  assert_panics_contains("none unwrap_or_panic", EXPECTED, || {
15
15
  let env = Env::default();
16
16
  let _got: u32 = None::<u32>.unwrap_or_panic(&env, OwnableError::OwnerNotSet);