@layerzerolabs/protocol-stellar-v2 0.2.22 → 0.2.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +331 -261
- package/.turbo/turbo-lint.log +262 -192
- package/.turbo/turbo-test.log +1696 -1368
- package/Cargo.lock +22 -51
- package/Cargo.toml +6 -1
- package/contracts/common-macros/src/auth.rs +10 -9
- package/contracts/common-macros/src/contract_ttl.rs +1 -4
- package/contracts/common-macros/src/error.rs +1 -3
- package/contracts/common-macros/src/lib.rs +65 -61
- package/contracts/common-macros/src/storage.rs +212 -65
- package/contracts/common-macros/src/tests/auth.rs +75 -6
- package/contracts/common-macros/src/tests/contract_ttl.rs +383 -350
- package/contracts/common-macros/src/tests/error.rs +9 -21
- package/contracts/common-macros/src/tests/lz_contract.rs +80 -0
- package/contracts/common-macros/src/tests/mod.rs +2 -0
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +20 -3
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +28 -1
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap +8 -43
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contracttrait_code.snap +6 -29
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__lz_contract__snapshot_generated_lz_contract_code.snap +31 -0
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_extendable__snapshot_generated_ttl_extendable_code.snap +8 -0
- package/contracts/common-macros/src/tests/storage/extract_fields.rs +87 -0
- package/contracts/common-macros/src/tests/storage/gen_accessor_methods.rs +223 -0
- package/contracts/common-macros/src/tests/storage/gen_args.rs +65 -0
- package/contracts/common-macros/src/tests/storage/gen_enum_variant.rs +78 -0
- package/contracts/common-macros/src/tests/storage/gen_key.rs +108 -0
- package/contracts/common-macros/src/tests/storage/gen_params.rs +105 -0
- package/contracts/common-macros/src/tests/{storage.rs → storage/generate_storage.rs} +54 -129
- package/contracts/common-macros/src/tests/storage/is_primitive_type.rs +48 -0
- package/contracts/common-macros/src/tests/storage/mod.rs +16 -0
- package/contracts/common-macros/src/tests/storage/parse_default.rs +164 -0
- package/contracts/common-macros/src/tests/storage/parse_name.rs +159 -0
- package/contracts/common-macros/src/tests/storage/parse_no_ttl_extension.rs +124 -0
- package/contracts/common-macros/src/tests/storage/parse_storage_type.rs +174 -0
- package/contracts/common-macros/src/tests/storage/snapshots/common_macros__tests__storage__generate_storage__snapshot_generated_storage_code.snap +412 -0
- package/contracts/common-macros/src/tests/storage/storage_kind.rs +39 -0
- package/contracts/common-macros/src/tests/storage/test_setup.rs +25 -0
- package/contracts/common-macros/src/tests/storage/validate_attrs.rs +138 -0
- package/contracts/common-macros/src/tests/storage/variant_config.rs +226 -0
- package/contracts/common-macros/src/tests/test_helpers.rs +4 -10
- package/contracts/common-macros/src/tests/ttl_configurable.rs +2 -2
- package/contracts/common-macros/src/tests/ttl_extendable.rs +32 -0
- package/contracts/common-macros/src/tests/upgradeable.rs +118 -2
- package/contracts/common-macros/src/ttl_configurable.rs +1 -4
- package/contracts/common-macros/src/upgradeable.rs +21 -3
- package/contracts/endpoint-v2/Cargo.toml +0 -4
- package/contracts/endpoint-v2/src/endpoint_v2.rs +37 -17
- package/contracts/endpoint-v2/src/errors.rs +26 -1
- package/contracts/endpoint-v2/src/interfaces/layerzero_endpoint_v2.rs +1 -1
- package/contracts/endpoint-v2/src/interfaces/message_lib_manager.rs +4 -4
- package/contracts/endpoint-v2/src/interfaces/messaging_composer.rs +2 -2
- package/contracts/endpoint-v2/src/lib.rs +0 -1
- package/contracts/endpoint-v2/src/message_lib_manager.rs +39 -8
- package/contracts/endpoint-v2/src/messaging_channel.rs +36 -4
- package/contracts/endpoint-v2/src/messaging_composer.rs +18 -4
- package/contracts/endpoint-v2/src/storage.rs +9 -1
- package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +2 -2
- package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +1 -1
- package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +2 -2
- package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +3 -3
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +5 -5
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +2 -2
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +5 -5
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +3 -3
- package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +1 -1
- package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +4 -3
- package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +7 -2
- package/contracts/endpoint-v2/src/tests/messaging_composer/mod.rs +4 -0
- package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +7 -2
- package/contracts/layerzero-views/src/layerzero_view.rs +0 -1
- package/contracts/layerzero-views/src/tests/mod.rs +1 -0
- package/contracts/layerzero-views/src/tests/types_tests.rs +31 -0
- package/contracts/layerzero-views/src/types.rs +2 -3
- package/contracts/macro-integration-tests/tests/runtime/contract_ttl/constructor.rs +61 -0
- package/contracts/macro-integration-tests/tests/runtime/contract_ttl/contract_impl_ttl_extension.rs +97 -0
- package/contracts/macro-integration-tests/tests/runtime/contract_ttl/contract_trait_ttl_extension.rs +99 -0
- package/contracts/macro-integration-tests/tests/runtime/contract_ttl/mod.rs +3 -0
- package/contracts/macro-integration-tests/tests/runtime/lz_contract/mod.rs +5 -0
- package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_default.rs +86 -0
- package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_multisig.rs +47 -0
- package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_multisig_upgradeable.rs +77 -0
- package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_upgradeable.rs +114 -0
- package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_upgradeable_no_migration.rs +105 -0
- package/contracts/macro-integration-tests/tests/runtime/multisig/admin_entrypoints.rs +242 -0
- package/contracts/macro-integration-tests/tests/runtime/multisig/mod.rs +9 -0
- package/contracts/macro-integration-tests/tests/runtime/multisig/self_auth.rs +54 -0
- package/contracts/macro-integration-tests/tests/runtime/ownable/initialization.rs +13 -0
- package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +1 -0
- package/contracts/macro-integration-tests/tests/runtime/ownable/ownership_transfer.rs +70 -1
- package/contracts/macro-integration-tests/tests/runtime/ownable/two_step_transfer.rs +219 -0
- package/contracts/macro-integration-tests/tests/runtime/storage/keyed_roundtrip.rs +41 -0
- package/contracts/macro-integration-tests/tests/runtime/storage/ttl_extension.rs +48 -16
- package/contracts/macro-integration-tests/tests/runtime/storage/unkeyed_roundtrip.rs +10 -0
- package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +96 -3
- package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +4 -0
- package/contracts/macro-integration-tests/tests/runtime/ttl_extendable/extend_instance_ttl.rs +64 -0
- package/contracts/macro-integration-tests/tests/runtime/ttl_extendable/mod.rs +16 -0
- package/contracts/macro-integration-tests/tests/runtime/upgradeable/migrate_guard_and_state.rs +305 -0
- package/contracts/macro-integration-tests/tests/runtime/upgradeable/mod.rs +3 -0
- package/contracts/macro-integration-tests/tests/runtime/upgradeable/no_migration.rs +59 -0
- package/contracts/macro-integration-tests/tests/runtime/upgradeable/upgrade_then_migrate.rs +88 -0
- package/contracts/macro-integration-tests/tests/runtime.rs +5 -0
- package/contracts/macro-integration-tests/tests/ui/contract_impl/fail/not_impl_item.rs +6 -0
- package/contracts/macro-integration-tests/tests/ui/contract_impl/fail/not_impl_item.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/contract_impl/pass/basic.rs +102 -0
- package/contracts/macro-integration-tests/tests/ui/contract_trait/fail/not_a_trait.rs +6 -0
- package/contracts/macro-integration-tests/tests/ui/contract_trait/fail/not_a_trait.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/contract_trait/pass/basic.rs +83 -0
- package/contracts/macro-integration-tests/tests/ui/error/fail/discriminant_too_large.rs +11 -0
- package/contracts/macro-integration-tests/tests/ui/error/fail/discriminant_too_large.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/error/fail/non_enum_input.rs +11 -0
- package/contracts/macro-integration-tests/tests/ui/error/fail/non_enum_input.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/error/pass/basic.rs +22 -0
- package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/invalid_option.rs +6 -0
- package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/invalid_option.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/multisig_rejects_ownable_api.rs +20 -0
- package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/multisig_rejects_ownable_api.stderr +20 -0
- package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/not_a_struct.rs +8 -0
- package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/not_a_struct.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_invalid_inner_option.rs +10 -0
- package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_invalid_inner_option.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_missing_internal.rs +20 -0
- package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_missing_internal.stderr +86 -0
- package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/basic.rs +45 -0
- package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/multisig.rs +34 -0
- package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/multisig_upgradeable.rs +30 -0
- package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/upgradeable.rs +39 -0
- package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/upgradeable_no_migration.rs +28 -0
- package/contracts/macro-integration-tests/tests/ui/multisig/fail/non_struct_input.rs +8 -0
- package/contracts/macro-integration-tests/tests/ui/multisig/fail/non_struct_input.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_api.rs +20 -0
- package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_api.stderr +12 -0
- package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_trait.rs +20 -0
- package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_trait.stderr +5 -0
- package/contracts/macro-integration-tests/tests/ui/multisig/pass/basic.rs +49 -0
- package/contracts/macro-integration-tests/tests/ui/ownable/fail/non_struct_input.rs +8 -0
- package/contracts/macro-integration-tests/tests/ui/ownable/fail/non_struct_input.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_auth.rs +19 -0
- package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_auth.stderr +12 -0
- package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.rs +1 -1
- package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.stderr +0 -8
- package/contracts/macro-integration-tests/tests/ui/ownable/pass/basic.rs +39 -0
- package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_auth_env_param_variants.rs +7 -1
- package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.stderr +1 -1
- package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.stderr +1 -1
- package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_default_values.rs +11 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_default_values.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_name_attrs.rs +11 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_name_attrs.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_no_ttl_extension.rs +11 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_no_ttl_extension.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.stderr +1 -1
- package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_rejects_args.rs +13 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_rejects_args.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/storage/pass/api_surface.rs +102 -0
- package/contracts/macro-integration-tests/tests/ui/storage/pass/basic.rs +43 -0
- package/contracts/macro-integration-tests/tests/ui/storage/pass/multi_key.rs +38 -0
- package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/missing_auth_trait.rs +14 -0
- package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/missing_auth_trait.stderr +71 -0
- package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/non_struct_input.rs +8 -0
- package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/non_struct_input.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/{minimal_contract.rs → basic.rs} +2 -0
- package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/multisig_contract.rs +28 -0
- package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/ownable_contract.rs +32 -0
- package/contracts/macro-integration-tests/tests/ui/ttl_extendable/fail/non_struct_input.rs +8 -0
- package/contracts/macro-integration-tests/tests/ui/ttl_extendable/fail/non_struct_input.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/ttl_extendable/pass/basic.rs +23 -0
- package/contracts/macro-integration-tests/tests/ui/ttl_extendable/pass/no_user_contractimpl.rs +21 -0
- package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/attr_args.rs +11 -0
- package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/attr_args.stderr +29 -0
- package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_auth_trait.rs +20 -0
- package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_auth_trait.stderr +71 -0
- package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_upgradeable_internal.rs +10 -0
- package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_upgradeable_internal.stderr +79 -0
- package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/non_struct_input.rs +8 -0
- package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/non_struct_input.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/basic.rs +43 -0
- package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/multisig_contract.rs +35 -0
- package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/no_migration.rs +30 -0
- package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/no_user_contractimpl.rs +29 -0
- package/contracts/macro-integration-tests/tests/ui_contract_impl.rs +12 -0
- package/contracts/macro-integration-tests/tests/ui_contract_trait.rs +12 -0
- package/contracts/macro-integration-tests/tests/ui_lz_contract.rs +11 -0
- package/contracts/macro-integration-tests/tests/ui_multisig.rs +11 -0
- package/contracts/macro-integration-tests/tests/ui_ttl_extendable.rs +12 -0
- package/contracts/macro-integration-tests/tests/ui_upgradeable.rs +11 -0
- package/contracts/message-libs/blocked-message-lib/Cargo.toml +1 -1
- package/contracts/message-libs/blocked-message-lib/src/lib.rs +4 -1
- package/contracts/message-libs/blocked-message-lib/src/tests/blocked_message_lib_tests.rs +108 -0
- package/contracts/message-libs/blocked-message-lib/src/tests/mod.rs +4 -0
- package/contracts/message-libs/blocked-message-lib/src/tests/setup.rs +40 -0
- package/contracts/message-libs/simple-message-lib/src/lib.rs +1 -1
- package/contracts/message-libs/simple-message-lib/src/tests/mod.rs +2 -0
- package/contracts/message-libs/simple-message-lib/src/tests/setup.rs +124 -0
- package/contracts/message-libs/simple-message-lib/src/tests/simple_message_lib_tests.rs +309 -0
- package/contracts/message-libs/uln-302/src/errors.rs +21 -0
- package/contracts/message-libs/uln-302/src/interfaces/receive_uln.rs +1 -1
- package/contracts/message-libs/uln-302/src/receive_uln.rs +6 -4
- package/contracts/message-libs/uln-302/src/send_uln.rs +15 -6
- package/contracts/message-libs/uln-302/src/storage.rs +5 -5
- package/contracts/message-libs/uln-302/src/tests/uln302/get_config.rs +71 -0
- package/contracts/message-libs/uln-302/src/tests/uln302/mod.rs +1 -0
- package/contracts/message-libs/uln-302/src/uln302.rs +3 -0
- package/contracts/oapps/counter/Cargo.toml +2 -0
- package/contracts/oapps/counter/integration_tests/mod.rs +1 -0
- package/contracts/oapps/counter/integration_tests/setup_sml.rs +6 -4
- package/contracts/oapps/counter/integration_tests/setup_uln.rs +12 -5
- package/contracts/oapps/counter/integration_tests/test_with_blocked.rs +67 -0
- package/contracts/oapps/counter/src/tests/mod.rs +1 -0
- package/contracts/oapps/counter/src/tests/test_u256_ext.rs +48 -0
- package/contracts/oapps/oapp/src/lib.rs +0 -3
- package/contracts/oapps/oapp/src/tests/mod.rs +1 -0
- package/contracts/oapps/oft/integration-tests/setup.rs +2 -3
- package/contracts/oapps/oft/src/lib.rs +3 -0
- package/contracts/oapps/oft/src/tests/extensions/mod.rs +3 -0
- package/contracts/oapps/oft/src/tests/extensions/oft_fee.rs +240 -0
- package/contracts/oapps/oft/src/tests/extensions/pausable.rs +141 -0
- package/contracts/oapps/oft/src/tests/extensions/rate_limiter.rs +447 -0
- package/contracts/oapps/oft/src/tests/mod.rs +2 -0
- package/contracts/oapps/oft/src/tests/oft_types/lock_unlock.rs +180 -0
- package/contracts/oapps/oft/src/tests/oft_types/mod.rs +1 -0
- package/contracts/oapps/oft-core/integration-tests/setup.rs +2 -3
- package/contracts/oapps/oft-core/src/lib.rs +2 -2
- package/contracts/oapps/oft-core/src/tests/mod.rs +1 -1
- package/contracts/oapps/oft-core/src/tests/{test_oft_version.rs → test_oft_version_and_approval.rs} +9 -0
- package/contracts/oapps/oft-core/src/tests/test_utils.rs +0 -43
- package/contracts/upgrader/src/tests/test_upgrader.rs +18 -0
- package/contracts/utils/src/auth.rs +2 -2
- package/contracts/utils/src/buffer_reader.rs +61 -10
- package/contracts/utils/src/buffer_writer.rs +35 -20
- package/contracts/utils/src/bytes_ext.rs +1 -2
- package/contracts/utils/src/errors.rs +5 -3
- package/contracts/utils/src/multisig.rs +59 -36
- package/contracts/utils/src/option_ext.rs +3 -3
- package/contracts/utils/src/ownable.rs +12 -6
- package/contracts/utils/src/tests/auth.rs +179 -0
- package/contracts/utils/src/tests/buffer_reader.rs +203 -1
- package/contracts/utils/src/tests/buffer_writer.rs +176 -5
- package/contracts/utils/src/tests/mod.rs +2 -0
- package/contracts/utils/src/tests/multisig.rs +170 -141
- package/contracts/utils/src/tests/option_ext.rs +1 -1
- package/contracts/utils/src/tests/ownable.rs +156 -161
- package/contracts/utils/src/tests/test_helper.rs +21 -1
- package/contracts/utils/src/tests/testing_utils.rs +84 -2
- package/contracts/utils/src/tests/ttl_configurable.rs +66 -86
- package/contracts/utils/src/tests/ttl_extendable.rs +64 -0
- package/contracts/utils/src/tests/upgradeable.rs +115 -6
- package/contracts/utils/src/ttl_configurable.rs +22 -12
- package/contracts/utils/src/ttl_extendable.rs +1 -3
- package/contracts/utils/src/upgradeable.rs +21 -24
- package/contracts/workers/dvn/src/auth.rs +1 -1
- package/contracts/workers/dvn/src/interfaces/dvn.rs +2 -2
- package/contracts/workers/dvn/src/storage.rs +1 -1
- package/contracts/workers/dvn/src/tests/auth.rs +136 -3
- package/contracts/workers/dvn/src/tests/mod.rs +0 -1
- package/contracts/workers/dvn/src/tests/setup.rs +4 -10
- package/contracts/workers/executor-helper/src/tests/executor_helper.rs +279 -0
- package/contracts/workers/executor-helper/src/tests/setup.rs +106 -1
- package/contracts/workers/worker/src/worker.rs +1 -1
- package/docs/oft-guide.md +5 -5
- package/package.json +5 -7
- package/sdk/.turbo/turbo-test.log +667 -466
- package/sdk/LICENSE +23 -0
- package/sdk/dist/generated/bml.d.ts +101 -106
- package/sdk/dist/generated/bml.js +108 -26
- package/sdk/dist/generated/counter.d.ts +123 -484
- package/sdk/dist/generated/counter.js +103 -25
- package/sdk/dist/generated/dvn.d.ts +141 -699
- package/sdk/dist/generated/dvn.js +106 -28
- package/sdk/dist/generated/dvn_fee_lib.d.ts +31 -248
- package/sdk/dist/generated/dvn_fee_lib.js +27 -24
- package/sdk/dist/generated/endpoint.d.ts +158 -836
- package/sdk/dist/generated/endpoint.js +107 -29
- package/sdk/dist/generated/executor.d.ts +139 -671
- package/sdk/dist/generated/executor.js +106 -28
- package/sdk/dist/generated/executor_fee_lib.d.ts +109 -264
- package/sdk/dist/generated/executor_fee_lib.js +106 -28
- package/sdk/dist/generated/executor_helper.d.ts +95 -92
- package/sdk/dist/generated/executor_helper.js +103 -25
- package/sdk/dist/generated/layerzero_view.d.ts +178 -335
- package/sdk/dist/generated/layerzero_view.js +172 -33
- package/sdk/dist/generated/oft.d.ts +137 -680
- package/sdk/dist/generated/oft.js +103 -25
- package/sdk/dist/generated/price_feed.d.ts +45 -444
- package/sdk/dist/generated/price_feed.js +27 -24
- package/sdk/dist/generated/sml.d.ts +119 -428
- package/sdk/dist/generated/sml.js +103 -25
- package/sdk/dist/generated/treasury.d.ts +109 -288
- package/sdk/dist/generated/treasury.js +103 -25
- package/sdk/dist/generated/uln302.d.ts +190 -527
- package/sdk/dist/generated/uln302.js +170 -31
- package/sdk/dist/generated/upgrader.d.ts +14 -34
- package/sdk/dist/generated/upgrader.js +24 -21
- package/sdk/package.json +3 -4
- package/sdk/test/counter-sml.test.ts +218 -142
- package/sdk/test/counter-uln.test.ts +189 -145
- package/sdk/test/oft-sml.test.ts +173 -156
- package/sdk/test/suites/constants.ts +7 -1
- package/sdk/test/suites/globalSetup.ts +140 -74
- package/sdk/turbo.json +1 -1
- package/tools/ts-bindings-gen/Cargo.toml +4 -4
- package/tools/ts-bindings-gen/src/main.rs +4 -0
- package/turbo.json +3 -0
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +0 -1072
- package/contracts/endpoint-v2/src/constants.rs +0 -52
- package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.rs +0 -12
- package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.stderr +0 -7
- package/contracts/macro-integration-tests/tests/ui/error/pass/attr_on_variant_allowed.rs +0 -20
- package/contracts/macro-integration-tests/tests/ui/error/pass/basic_auto_discriminants.rs +0 -15
- package/contracts/macro-integration-tests/tests/ui/error/pass/mixed_discriminants.rs +0 -16
- package/contracts/macro-integration-tests/tests/ui/ownable/pass/minimal_contract.rs +0 -26
- package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +0 -21
- package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.rs +0 -12
- package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.stderr +0 -7
- package/contracts/macro-integration-tests/tests/ui/storage/pass/default_value_on_variant.rs +0 -14
- package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_instance_unit_basic.rs +0 -14
- package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_persistent_named_fields_keyed.rs +0 -16
- package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_temporary_unit_option.rs +0 -15
- package/contracts/macro-integration-tests/tests/ui/storage/pass/name_override.rs +0 -14
- package/contracts/macro-integration-tests/tests/ui/storage/pass/no_auto_ttl_extension.rs +0 -19
- package/contracts/macro-integration-tests/tests/ui/storage/pass/ttl_provider_basic.rs +0 -15
- package/contracts/message-libs/simple-message-lib/src/test.rs +0 -280
- package/contracts/oapps/oapp/src/macro_tests/mod.rs +0 -1
- package/contracts/workers/dvn/src/tests/multisig/mod.rs +0 -3
- package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +0 -132
- package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +0 -109
- package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +0 -106
- /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::
|
|
4
|
-
multisig::{init_multisig, recover_signer,
|
|
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
|
-
|
|
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
|
|
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, #
|
|
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, #
|
|
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
|
-
|
|
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
|
-
|
|
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(),
|
|
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(),
|
|
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(),
|
|
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(),
|
|
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
|
-
|
|
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(),
|
|
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(),
|
|
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(),
|
|
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(),
|
|
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(),
|
|
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(),
|
|
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, #
|
|
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);
|