From 7f79545cd75318c55468515e7f1fd3a36988e2f7 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Fri, 20 Sep 2024 21:51:37 +0700 Subject: [PATCH 01/90] chore(platform): protocol version 4 creation (#2153) --- .../rs-platform-version/src/version/mod.rs | 5 +- .../src/version/protocol_version.rs | 7 +- .../rs-platform-version/src/version/v4.rs | 1283 +++++++++++++++++ 3 files changed, 1290 insertions(+), 5 deletions(-) create mode 100644 packages/rs-platform-version/src/version/v4.rs diff --git a/packages/rs-platform-version/src/version/mod.rs b/packages/rs-platform-version/src/version/mod.rs index d7346a7097..9ee6257751 100644 --- a/packages/rs-platform-version/src/version/mod.rs +++ b/packages/rs-platform-version/src/version/mod.rs @@ -1,5 +1,5 @@ mod protocol_version; -use crate::version::v3::PROTOCOL_VERSION_3; +use crate::version::v4::PROTOCOL_VERSION_4; pub use protocol_version::*; mod consensus_versions; @@ -15,8 +15,9 @@ pub mod patches; pub mod v1; pub mod v2; pub mod v3; +pub mod v4; pub type ProtocolVersion = u32; -pub const LATEST_VERSION: ProtocolVersion = PROTOCOL_VERSION_3; +pub const LATEST_VERSION: ProtocolVersion = PROTOCOL_VERSION_4; pub const INITIAL_PROTOCOL_VERSION: ProtocolVersion = 1; diff --git a/packages/rs-platform-version/src/version/protocol_version.rs b/packages/rs-platform-version/src/version/protocol_version.rs index 607a267844..c6af2ec88c 100644 --- a/packages/rs-platform-version/src/version/protocol_version.rs +++ b/packages/rs-platform-version/src/version/protocol_version.rs @@ -18,6 +18,7 @@ use crate::version::consensus_versions::ConsensusVersions; use crate::version::limits::SystemLimits; use crate::version::v2::PLATFORM_V2; use crate::version::v3::PLATFORM_V3; +use crate::version::v4::PLATFORM_V4; use crate::version::ProtocolVersion; pub use versioned_feature_core::*; @@ -41,7 +42,8 @@ pub struct PlatformVersion { pub system_limits: SystemLimits, } -pub const PLATFORM_VERSIONS: &[PlatformVersion] = &[PLATFORM_V1, PLATFORM_V2, PLATFORM_V3]; +pub const PLATFORM_VERSIONS: &[PlatformVersion] = + &[PLATFORM_V1, PLATFORM_V2, PLATFORM_V3, PLATFORM_V4]; #[cfg(feature = "mock-versions")] // We use OnceLock to be able to modify the version mocks @@ -49,9 +51,8 @@ pub static PLATFORM_TEST_VERSIONS: OnceLock> = OnceLock::ne #[cfg(feature = "mock-versions")] const DEFAULT_PLATFORM_TEST_VERSIONS: &[PlatformVersion] = &[TEST_PLATFORM_V2, TEST_PLATFORM_V3]; -pub const LATEST_PLATFORM_VERSION: &PlatformVersion = &PLATFORM_V3; +pub const LATEST_PLATFORM_VERSION: &PlatformVersion = &PLATFORM_V4; -/// For V3 release we want to do an emergency version upgrade pub const DESIRED_PLATFORM_VERSION: &PlatformVersion = LATEST_PLATFORM_VERSION; impl PlatformVersion { diff --git a/packages/rs-platform-version/src/version/v4.rs b/packages/rs-platform-version/src/version/v4.rs new file mode 100644 index 0000000000..683023afc6 --- /dev/null +++ b/packages/rs-platform-version/src/version/v4.rs @@ -0,0 +1,1283 @@ +use crate::version::consensus_versions::ConsensusVersions; +use crate::version::contracts::SystemDataContractVersions; +use crate::version::dpp_versions::{ + AssetLockVersions, ContractVersions, CostVersions, DPPMethodVersions, DPPValidationVersions, + DPPVersion, DataContractMethodVersions, DataContractValidationVersions, + DocumentFeatureVersionBounds, DocumentMethodVersions, DocumentTransitionVersions, + DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, DocumentTypeMethodVersions, + DocumentTypeSchemaVersions, DocumentTypeValidationVersions, DocumentTypeVersions, + DocumentVersions, DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions, + IdentityKeyTypeMethodVersions, IdentityTransitionAssetLockVersions, IdentityTransitionVersions, + IdentityVersions, JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, + RecursiveSchemaValidatorVersions, StateTransitionConversionVersions, + StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions, + VotingValidationVersions, VotingVersions, +}; +use crate::version::drive_abci_versions::{ + DriveAbciAssetLockValidationVersions, DriveAbciBlockEndMethodVersions, + DriveAbciBlockFeeProcessingMethodVersions, DriveAbciBlockStartMethodVersions, + DriveAbciCoreBasedUpdatesMethodVersions, DriveAbciCoreChainLockMethodVersionsAndConstants, + DriveAbciCoreInstantSendLockMethodVersions, + DriveAbciDocumentsStateTransitionValidationVersions, DriveAbciEngineMethodVersions, + DriveAbciEpochMethodVersions, DriveAbciFeePoolInwardsDistributionMethodVersions, + DriveAbciFeePoolOutwardsDistributionMethodVersions, + DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, + DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, + DriveAbciPlatformStateStorageMethodVersions, DriveAbciProtocolUpgradeMethodVersions, + DriveAbciQueryDataContractVersions, DriveAbciQueryIdentityVersions, + DriveAbciQueryPrefundedSpecializedBalancesVersions, DriveAbciQuerySystemVersions, + DriveAbciQueryValidatorVersions, DriveAbciQueryVersions, DriveAbciQueryVotingVersions, + DriveAbciStateTransitionCommonValidationVersions, + DriveAbciStateTransitionProcessingMethodVersions, DriveAbciStateTransitionValidationVersion, + DriveAbciStateTransitionValidationVersions, DriveAbciStructureVersions, + DriveAbciValidationConstants, DriveAbciValidationDataTriggerAndBindingVersions, + DriveAbciValidationDataTriggerVersions, DriveAbciValidationVersions, DriveAbciVersion, + DriveAbciVotingMethodVersions, PenaltyAmounts, +}; +use crate::version::drive_versions::{ + DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, + DriveContractApplyMethodVersions, DriveContractCostsMethodVersions, + DriveContractGetMethodVersions, DriveContractInsertMethodVersions, DriveContractMethodVersions, + DriveContractProveMethodVersions, DriveContractUpdateMethodVersions, + DriveCreditPoolEpochsMethodVersions, DriveCreditPoolMethodVersions, + DriveCreditPoolPendingEpochRefundsMethodVersions, + DriveCreditPoolStorageFeeDistributionPoolMethodVersions, + DriveCreditPoolUnpaidEpochMethodVersions, DriveDataContractOperationMethodVersions, + DriveDocumentDeleteMethodVersions, DriveDocumentEstimationCostsMethodVersions, + DriveDocumentIndexUniquenessMethodVersions, DriveDocumentInsertContestedMethodVersions, + DriveDocumentInsertMethodVersions, DriveDocumentMethodVersions, + DriveDocumentQueryMethodVersions, DriveDocumentUpdateMethodVersions, + DriveEstimatedCostsMethodVersions, DriveFeesMethodVersions, DriveFetchMethodVersions, + DriveGroveApplyMethodVersions, DriveGroveBasicMethodVersions, DriveGroveBatchMethodVersions, + DriveGroveCostMethodVersions, DriveGroveMethodVersions, + DriveIdentityContractInfoMethodVersions, DriveIdentityCostEstimationMethodVersions, + DriveIdentityFetchAttributesMethodVersions, DriveIdentityFetchFullIdentityMethodVersions, + DriveIdentityFetchMethodVersions, DriveIdentityFetchPartialIdentityMethodVersions, + DriveIdentityFetchPublicKeyHashesMethodVersions, DriveIdentityInsertMethodVersions, + DriveIdentityKeyHashesToIdentityInsertMethodVersions, DriveIdentityKeysFetchMethodVersions, + DriveIdentityKeysInsertMethodVersions, DriveIdentityKeysMethodVersions, + DriveIdentityKeysProveMethodVersions, DriveIdentityMethodVersions, + DriveIdentityProveMethodVersions, DriveIdentityUpdateMethodVersions, + DriveIdentityWithdrawalDocumentMethodVersions, DriveIdentityWithdrawalMethodVersions, + DriveIdentityWithdrawalTransactionIndexMethodVersions, + DriveIdentityWithdrawalTransactionMethodVersions, + DriveIdentityWithdrawalTransactionQueueMethodVersions, DriveInitializationMethodVersions, + DriveMethodVersions, DriveOperationsMethodVersion, DrivePlatformStateMethodVersions, + DrivePlatformSystemMethodVersions, DrivePrefundedSpecializedMethodVersions, + DriveProtocolUpgradeVersions, DriveProveMethodVersions, + DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions, + DriveStateTransitionMethodVersions, DriveStateTransitionOperationMethodVersions, + DriveStructureVersion, DriveSystemEstimationCostsMethodVersions, + DriveVerifyContractMethodVersions, DriveVerifyDocumentMethodVersions, + DriveVerifyIdentityMethodVersions, DriveVerifyMethodVersions, + DriveVerifySingleDocumentMethodVersions, DriveVerifyStateTransitionMethodVersions, + DriveVerifySystemMethodVersions, DriveVerifyVoteMethodVersions, DriveVersion, + DriveVoteCleanupMethodVersions, DriveVoteContestedResourceInsertMethodVersions, + DriveVoteFetchMethodVersions, DriveVoteInsertMethodVersions, DriveVoteMethodVersions, + DriveVoteSetupMethodVersions, DriveVoteStorageFormMethodVersions, +}; +use crate::version::fee::v1::FEE_VERSION1; +use crate::version::limits::SystemLimits; +use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; +use crate::version::{PlatformArchitectureVersion, ProtocolVersion}; +use grovedb_version::version::v1::GROVE_V1; + +pub const PROTOCOL_VERSION_4: ProtocolVersion = 4; + +/// This version introduces withdrawals. + +pub const PLATFORM_V4: PlatformVersion = PlatformVersion { + protocol_version: PROTOCOL_VERSION_4, + proofs: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + drive: DriveVersion { + structure: DriveStructureVersion { + document_indexes: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_indexes: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + pools: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + methods: DriveMethodVersions { + initialization: DriveInitializationMethodVersions { + create_initial_state_structure: 0, + }, + credit_pools: DriveCreditPoolMethodVersions { + epochs: DriveCreditPoolEpochsMethodVersions { + get_epochs_infos: 0, + get_epochs_protocol_versions: 0, + prove_epochs_infos: 0, + get_epoch_fee_multiplier: 0, + get_epoch_processing_credits_for_distribution: 0, + get_epoch_storage_credits_for_distribution: 0, + get_epoch_total_credits_for_distribution: 0, + get_storage_credits_for_distribution_for_epochs_in_range: 0, + get_epoch_start_time: 0, + get_epoch_start_block_core_height: 0, + get_epoch_start_block_height: 0, + get_first_epoch_start_block_info_between_epochs: 0, + fetch_epoch_proposers: 0, + prove_epoch_proposers: 0, + get_epochs_proposer_block_count: 0, + add_update_pending_epoch_refunds_operations: 0, + is_epochs_proposers_tree_empty: 0, + }, + pending_epoch_refunds: DriveCreditPoolPendingEpochRefundsMethodVersions { + add_delete_pending_epoch_refunds_except_specified: 0, + fetch_and_add_pending_epoch_refunds_to_collection: 0, + fetch_pending_epoch_refunds: 0, + add_update_pending_epoch_refunds_operations: 0, + }, + storage_fee_distribution_pool: + DriveCreditPoolStorageFeeDistributionPoolMethodVersions { + get_storage_fees_from_distribution_pool: 0, + }, + unpaid_epoch: DriveCreditPoolUnpaidEpochMethodVersions { + get_unpaid_epoch_index: 0, + }, + }, + protocol_upgrade: DriveProtocolUpgradeVersions { + clear_version_information: 0, + fetch_versions_with_counter: 0, + fetch_proved_versions_with_counter: 0, + fetch_validator_version_votes: 0, + fetch_proved_validator_version_votes: 0, + remove_validators_proposed_app_versions: 0, + update_validator_proposed_app_version: 0, + }, + prove: DriveProveMethodVersions { + prove_elements: 0, + prove_multiple_state_transition_results: 0, + }, + balances: DriveBalancesMethodVersions { + add_to_system_credits: 0, + add_to_system_credits_operations: 0, + remove_from_system_credits: 0, + remove_from_system_credits_operations: 0, + calculate_total_credits_balance: 0, + }, + document: DriveDocumentMethodVersions { + query: DriveDocumentQueryMethodVersions { query_documents: 0, query_contested_documents: 0, query_contested_documents_vote_state: 0, query_documents_with_flags: 0 }, + delete: DriveDocumentDeleteMethodVersions { + add_estimation_costs_for_remove_document_to_primary_storage: 0, + delete_document_for_contract: 0, + delete_document_for_contract_id: 0, + delete_document_for_contract_apply_and_add_to_operations: 0, + remove_document_from_primary_storage: 0, + remove_reference_for_index_level_for_contract_operations: 0, + remove_indices_for_index_level_for_contract_operations: 0, + remove_indices_for_top_index_level_for_contract_operations: 0, + delete_document_for_contract_id_with_named_type_operations: 0, + delete_document_for_contract_with_named_type_operations: 0, + delete_document_for_contract_operations: 0, + }, + insert: DriveDocumentInsertMethodVersions { + add_document: 0, + add_document_for_contract: 0, + add_document_for_contract_apply_and_add_to_operations: 0, + add_document_for_contract_operations: 0, + add_document_to_primary_storage: 0, + add_indices_for_index_level_for_contract_operations: 0, + add_indices_for_top_index_level_for_contract_operations: 0, + add_reference_for_index_level_for_contract_operations: 0, + }, + insert_contested: DriveDocumentInsertContestedMethodVersions { + add_contested_document: 0, + add_contested_document_for_contract: 0, + add_contested_document_for_contract_apply_and_add_to_operations: 0, + add_contested_document_for_contract_operations: 0, + add_contested_document_to_primary_storage: 0, + add_contested_indices_for_contract_operations: 0, + add_contested_reference_and_vote_subtree_to_document_operations: 0, + add_contested_vote_subtree_for_non_identities_operations: 0, + }, + update: DriveDocumentUpdateMethodVersions { + add_update_multiple_documents_operations: 0, + update_document_for_contract: 0, + update_document_for_contract_apply_and_add_to_operations: 0, + update_document_for_contract_id: 0, + update_document_for_contract_operations: 0, + update_document_with_serialization_for_contract: 0, + update_serialized_document_for_contract: 0, + }, + estimation_costs: DriveDocumentEstimationCostsMethodVersions { + add_estimation_costs_for_add_document_to_primary_storage: 0, + add_estimation_costs_for_add_contested_document_to_primary_storage: 0, + stateless_delete_of_non_tree_for_costs: 0, + }, + index_uniqueness: DriveDocumentIndexUniquenessMethodVersions { + validate_document_uniqueness: 0, + validate_document_create_transition_action_uniqueness: 0, + validate_document_replace_transition_action_uniqueness: 0, + validate_document_transfer_transition_action_uniqueness: 0, + validate_document_purchase_transition_action_uniqueness: 0, + validate_document_update_price_transition_action_uniqueness: 0, + validate_uniqueness_of_data: 0, + }, + }, + vote: DriveVoteMethodVersions { + insert: DriveVoteInsertMethodVersions { + register_identity_vote: 0, + }, + contested_resource_insert: DriveVoteContestedResourceInsertMethodVersions { + register_contested_resource_identity_vote: 0, + insert_stored_info_for_contested_resource_vote_poll: 0, + register_identity_vote: 0, + add_vote_poll_end_date_query_operations: 0, + }, + cleanup: DriveVoteCleanupMethodVersions { + remove_specific_vote_references_given_by_identity: 0, + remove_specific_votes_given_by_identity: 0, + remove_contested_resource_vote_poll_end_date_query_operations: 1, + remove_contested_resource_vote_poll_votes_operations: 0, + remove_contested_resource_vote_poll_documents_operations: 1, + remove_contested_resource_vote_poll_contenders_operations: 1, + remove_contested_resource_top_level_index_operations: 0, + remove_contested_resource_info_operations: 0, + }, + setup: DriveVoteSetupMethodVersions { + add_initial_vote_tree_main_structure_operations: 0, + }, + storage_form: DriveVoteStorageFormMethodVersions { + resolve_with_contract: 0, + }, + fetch: DriveVoteFetchMethodVersions { + fetch_identities_voting_for_contenders: 0, + fetch_contested_document_vote_poll_stored_info: 0, + fetch_identity_contested_resource_vote: 0, + }, + }, + contract: DriveContractMethodVersions { + prove: DriveContractProveMethodVersions { + prove_contract: 0, + prove_contract_history: 0, + prove_contracts: 0, + }, + apply: DriveContractApplyMethodVersions { + apply_contract: 0, + apply_contract_with_serialization: 0, + }, + insert: DriveContractInsertMethodVersions { + add_contract_to_storage: 0, + insert_contract: 0, + }, + update: DriveContractUpdateMethodVersions { update_contract: 0 }, + costs: DriveContractCostsMethodVersions { + add_estimation_costs_for_contract_insertion: 0, + }, + get: DriveContractGetMethodVersions { + fetch_contract: 0, + fetch_contract_with_history: 0, + get_cached_contract_with_fetch_info: 0, + get_contract_with_fetch_info: 0, + get_contracts_with_fetch_info: 0, + }, + }, + fees: DriveFeesMethodVersions { calculate_fee: 0 }, + estimated_costs: DriveEstimatedCostsMethodVersions { + add_estimation_costs_for_levels_up_to_contract: 0, + add_estimation_costs_for_levels_up_to_contract_document_type_excluded: 0, + add_estimation_costs_for_contested_document_tree_levels_up_to_contract: 0, + add_estimation_costs_for_contested_document_tree_levels_up_to_contract_document_type_excluded: 0, + }, + asset_lock: DriveAssetLockMethodVersions { + add_asset_lock_outpoint: 0, + add_estimation_costs_for_adding_asset_lock: 0, + fetch_asset_lock_outpoint_info: 0, + }, + verify: DriveVerifyMethodVersions { + contract: DriveVerifyContractMethodVersions { + verify_contract: 0, + verify_contract_history: 0, + }, + document: DriveVerifyDocumentMethodVersions { + verify_proof: 0, + verify_proof_keep_serialized: 0, + verify_start_at_document_in_proof: 0, + }, + identity: DriveVerifyIdentityMethodVersions { + verify_full_identities_by_public_key_hashes: 0, + verify_full_identity_by_identity_id: 0, + verify_full_identity_by_public_key_hash: 0, + verify_identity_balance_for_identity_id: 0, + verify_identity_balances_for_identity_ids: 0, + verify_identity_id_by_public_key_hash: 0, + verify_identity_ids_by_public_key_hashes: 0, + verify_identity_keys_by_identity_id: 0, + verify_identity_nonce: 0, + verify_identity_contract_nonce: 0, + verify_identities_contract_keys: 0, + verify_identity_revision_for_identity_id: 0, + }, + single_document: DriveVerifySingleDocumentMethodVersions { + verify_proof: 0, + verify_proof_keep_serialized: 0, + }, + system: DriveVerifySystemMethodVersions { + verify_epoch_infos: 0, + verify_epoch_proposers: 0, + verify_elements: 0, + verify_total_credits_in_system: 0, + verify_upgrade_state: 0, + verify_upgrade_vote_status: 0, + }, + voting: DriveVerifyVoteMethodVersions { + verify_masternode_vote: 0, + verify_start_at_contender_in_proof: 0, + verify_vote_poll_votes_proof: 0, + verify_identity_votes_given_proof: 0, + verify_vote_poll_vote_state_proof: 0, + verify_contests_proof: 0, + verify_vote_polls_by_end_date_proof: 0, + verify_specialized_balance: 0, + }, + state_transition: DriveVerifyStateTransitionMethodVersions { + verify_state_transition_was_executed_with_proof: 0, + }, + }, + identity: DriveIdentityMethodVersions { + fetch: DriveIdentityFetchMethodVersions { + public_key_hashes: DriveIdentityFetchPublicKeyHashesMethodVersions { + fetch_full_identities_by_unique_public_key_hashes: 0, + fetch_full_identity_by_unique_public_key_hash: 0, + fetch_identity_id_by_unique_public_key_hash: 0, + fetch_identity_ids_by_non_unique_public_key_hash: 0, + fetch_identity_ids_by_unique_public_key_hashes: 0, + fetch_serialized_full_identity_by_unique_public_key_hash: 0, + has_any_of_unique_public_key_hashes: 0, + has_non_unique_public_key_hash: 0, + has_non_unique_public_key_hash_already_for_identity: 0, + has_unique_public_key_hash: 0, + }, + attributes: DriveIdentityFetchAttributesMethodVersions { + revision: 0, + nonce: 0, + identity_contract_nonce: 0, + balance: 0, + balance_include_debt: 0, + negative_balance: 0, + }, + partial_identity: DriveIdentityFetchPartialIdentityMethodVersions { + fetch_identity_revision_with_keys: 0, + fetch_identity_balance_with_keys: 0, + fetch_identity_balance_with_keys_and_revision: 0, + fetch_identity_with_balance: 0, + fetch_identity_keys: 0, + }, + full_identity: DriveIdentityFetchFullIdentityMethodVersions { + fetch_full_identity: Some(0), + fetch_full_identities: Some(0), + }, + }, + prove: DriveIdentityProveMethodVersions { + full_identity: 0, + full_identities: 0, + identity_nonce: 0, + identity_contract_nonce: 0, + identities_contract_keys: 0, + prove_full_identities_by_unique_public_key_hashes: 0, + prove_full_identity_by_unique_public_key_hash: 0, + prove_identity_id_by_unique_public_key_hash: 0, + prove_identity_ids_by_unique_public_key_hashes: 0, + }, + keys: DriveIdentityKeysMethodVersions { + fetch: DriveIdentityKeysFetchMethodVersions { + fetch_all_current_identity_keys: 0, + fetch_all_identity_keys: 0, + fetch_identities_all_keys: 0, + fetch_identity_keys: 0, + fetch_identities_contract_keys: 0, + }, + prove: DriveIdentityKeysProveMethodVersions { + prove_identities_all_keys: 0, + prove_identity_keys: 0, + }, + insert: DriveIdentityKeysInsertMethodVersions { + create_key_tree_with_keys: 0, + create_new_identity_key_query_trees: 0, + insert_key_searchable_references: 0, + insert_key_to_storage: 0, + insert_new_non_unique_key: 0, + insert_new_unique_key: 0, + replace_key_in_storage: 0, + }, + insert_key_hash_identity_reference: + DriveIdentityKeyHashesToIdentityInsertMethodVersions { + add_estimation_costs_for_insert_non_unique_public_key_hash_reference: 0, + add_estimation_costs_for_insert_unique_public_key_hash_reference: 0, + insert_non_unique_public_key_hash_reference_to_identity: 0, + insert_reference_to_non_unique_key: 0, + insert_reference_to_unique_key: 0, + insert_unique_public_key_hash_reference_to_identity: 0, + }, + }, + update: DriveIdentityUpdateMethodVersions { + update_identity_revision: 0, + merge_identity_nonce: 0, + update_identity_negative_credit_operation: 0, + initialize_identity_revision: 0, + disable_identity_keys: 0, + re_enable_identity_keys: 0, + add_new_non_unique_keys_to_identity: 0, + add_new_unique_keys_to_identity: 0, + add_new_keys_to_identity: 0, + insert_identity_balance: 0, + initialize_negative_identity_balance: 0, + add_to_identity_balance: 0, + add_to_previous_balance: 0, + apply_balance_change_from_fee_to_identity: 0, + remove_from_identity_balance: 0, + refresh_identity_key_reference_operations: 0, + }, + insert: DriveIdentityInsertMethodVersions { + add_new_identity: 0, + }, + contract_info: DriveIdentityContractInfoMethodVersions { + add_potential_contract_info_for_contract_bounded_key: 0, + refresh_potential_contract_info_key_references: 0, + merge_identity_contract_nonce: 0, + }, + cost_estimation: DriveIdentityCostEstimationMethodVersions { + for_authentication_keys_security_level_in_key_reference_tree: 0, + for_balances: 0, + for_contract_info: 0, + for_contract_info_group: 0, + for_contract_info_group_keys: 0, + for_contract_info_group_key_purpose: 0, + for_keys_for_identity_id: 0, + for_negative_credit: 0, + for_purpose_in_key_reference_tree: 0, + for_root_key_reference_tree: 0, + for_update_revision: 0, + }, + withdrawals: DriveIdentityWithdrawalMethodVersions { + document: DriveIdentityWithdrawalDocumentMethodVersions { + fetch_oldest_withdrawal_documents_by_status: 0, + find_up_to_100_withdrawal_documents_by_status_and_transaction_indices: 0, + }, + transaction: DriveIdentityWithdrawalTransactionMethodVersions { + index: DriveIdentityWithdrawalTransactionIndexMethodVersions { + fetch_next_withdrawal_transaction_index: 0, + add_update_next_withdrawal_transaction_index_operation: 0, + }, + queue: DriveIdentityWithdrawalTransactionQueueMethodVersions { + add_enqueue_untied_withdrawal_transaction_operations: 0, + dequeue_untied_withdrawal_transactions: 0, + }, + }, + }, + }, + platform_system: DrivePlatformSystemMethodVersions { + estimation_costs: DriveSystemEstimationCostsMethodVersions { + for_total_system_credits_update: 0, + }, + }, + operations: DriveOperationsMethodVersion { + rollback_transaction: 0, + drop_cache: 0, + commit_transaction: 0, + apply_partial_batch_low_level_drive_operations: 0, + apply_partial_batch_grovedb_operations: 0, + apply_batch_low_level_drive_operations: 0, + apply_batch_grovedb_operations: 0, + }, + state_transitions: DriveStateTransitionMethodVersions { + operations: DriveStateTransitionOperationMethodVersions { + finalization_tasks: 0, + contracts: DriveDataContractOperationMethodVersions { + finalization_tasks: 0, + }, + }, + convert_to_high_level_operations: + DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions { + data_contract_create_transition: 0, + data_contract_update_transition: 0, + document_create_transition: 0, + document_delete_transition: 0, + document_purchase_transition: 0, + document_replace_transition: 0, + document_transfer_transition: 0, + document_update_price_transition: 0, + documents_batch_transition: 0, + identity_create_transition: 0, + identity_credit_transfer_transition: 0, + identity_credit_withdrawal_transition: 0, + identity_top_up_transition: 0, + identity_update_transition: 0, + masternode_vote_transition: 0, + bump_identity_data_contract_nonce: 0, + bump_identity_nonce: 0, + partially_use_asset_lock: 0, + }, + }, + batch_operations: DriveBatchOperationsMethodVersion { + convert_drive_operations_to_grove_operations: 0, + apply_drive_operations: 0, + }, + platform_state: DrivePlatformStateMethodVersions { + fetch_platform_state_bytes: 0, + store_platform_state_bytes: 0, + }, + fetch: DriveFetchMethodVersions { fetch_elements: 0 }, + prefunded_specialized_balances: DrivePrefundedSpecializedMethodVersions { + fetch_single: 0, + prove_single: 0, + add_prefunded_specialized_balance: 0, + add_prefunded_specialized_balance_operations: 0, + deduct_from_prefunded_specialized_balance: 0, + deduct_from_prefunded_specialized_balance_operations: 0, + estimated_cost_for_prefunded_specialized_balance_update: 0, + }, + }, + grove_methods: DriveGroveMethodVersions { + basic: DriveGroveBasicMethodVersions { + grove_insert: 0, + grove_insert_empty_tree: 0, + grove_insert_empty_sum_tree: 0, + grove_insert_if_not_exists: 0, + grove_clear: 0, + grove_delete: 0, + grove_get_raw: 0, + grove_get_raw_optional: 0, + grove_get_raw_value_u64_from_encoded_var_vec: 0, + grove_get: 0, + grove_get_path_query_serialized_results: 0, + grove_get_path_query_serialized_or_sum_results: 0, + grove_get_path_query: 0, + grove_get_path_query_with_optional: 0, + grove_get_raw_path_query_with_optional: 0, + grove_get_raw_path_query: 0, + grove_get_proved_path_query: 0, + grove_get_proved_path_query_with_conditional: 0, + grove_get_sum_tree_total_value: 0, + grove_has_raw: 0, + }, + batch: DriveGroveBatchMethodVersions { + batch_insert_empty_tree: 0, + batch_insert_empty_tree_if_not_exists: 0, + batch_insert_empty_tree_if_not_exists_check_existing_operations: 0, + batch_insert: 0, + batch_insert_if_not_exists: 0, + batch_insert_if_changed_value: 0, + batch_replace: 0, + batch_delete: 0, + batch_remove_raw: 0, + batch_delete_up_tree_while_empty: 0, + batch_refresh_reference: 0, + }, + apply: DriveGroveApplyMethodVersions { + grove_apply_operation: 0, + grove_apply_batch: 0, + grove_apply_partial_batch: 0, + }, + costs: DriveGroveCostMethodVersions { + grove_batch_operations_costs: 0, + }, + }, + grove_version: GROVE_V1, + }, + platform_architecture: PlatformArchitectureVersion { + data_contract_factory_structure_version: 0, + document_factory_structure_version: 0, + }, + drive_abci: DriveAbciVersion { + structs: DriveAbciStructureVersions { + platform_state_structure: 0, + platform_state_for_saving_structure: 0, + state_transition_execution_context: 0, + commit: 0, + masternode: 0, + signature_verification_quorum_set: 0, + }, + methods: DriveAbciMethodVersions { + engine: DriveAbciEngineMethodVersions { + init_chain: 0, + check_tx: 0, + run_block_proposal: 0, + finalize_block_proposal: 0, + consensus_params_update: 0, + }, + initialization: DriveAbciInitializationMethodVersions { + initial_core_height_and_time: 0, + create_genesis_state: 0, + }, + core_based_updates: DriveAbciCoreBasedUpdatesMethodVersions { + update_core_info: 0, + update_masternode_list: 0, + update_quorum_info: 0, + masternode_updates: DriveAbciMasternodeIdentitiesUpdatesMethodVersions { + get_voter_identity_key: 0, + get_operator_identity_keys: 0, + get_owner_identity_withdrawal_key: 0, + get_voter_identifier_from_masternode_list_item: 0, + get_operator_identifier_from_masternode_list_item: 0, + create_operator_identity: 0, + create_owner_identity: 0, + create_voter_identity: 0, + disable_identity_keys: 0, + update_masternode_identities: 0, + update_operator_identity: 0, + update_owner_withdrawal_address: 0, + update_voter_identity: 0, + }, + }, + protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { + check_for_desired_protocol_upgrade: 1, + upgrade_protocol_version_on_epoch_change: 0, + protocol_version_upgrade_percentage_needed: 67, + }, + block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { + add_process_epoch_change_operations: 0, + process_block_fees: 0, + }, + core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants { + choose_quorum: 0, + verify_chain_lock: 0, + verify_chain_lock_locally: 0, + verify_chain_lock_through_core: 0, + make_sure_core_is_synced_to_chain_lock: 0, + recent_block_count_amount: 2, + }, + core_instant_send_lock: DriveAbciCoreInstantSendLockMethodVersions { + verify_recent_signature_locally: 0, + }, + fee_pool_inwards_distribution: DriveAbciFeePoolInwardsDistributionMethodVersions { + add_distribute_block_fees_into_pools_operations: 0, + add_distribute_storage_fee_to_epochs_operations: 0, + }, + fee_pool_outwards_distribution: DriveAbciFeePoolOutwardsDistributionMethodVersions { + add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations: 0, + add_epoch_pool_to_proposers_payout_operations: 0, + find_oldest_epoch_needing_payment: 0, + fetch_reward_shares_list_for_masternode: 0, + }, + withdrawals: DriveAbciIdentityCreditWithdrawalMethodVersions { + build_untied_withdrawal_transactions_from_documents: 0, + dequeue_and_build_unsigned_withdrawal_transactions: 0, + fetch_transactions_block_inclusion_status: 0, + pool_withdrawals_into_transactions_queue: 0, + update_broadcasted_withdrawal_statuses: 0, + append_signatures_and_broadcast_withdrawal_transactions: 0, + }, + voting: DriveAbciVotingMethodVersions { + keep_record_of_finished_contested_resource_vote_poll: 0, + clean_up_after_vote_poll_end: 0, + clean_up_after_contested_resources_vote_poll_end: 0, + check_for_ended_vote_polls: 0, + tally_votes_for_contested_document_resource_vote_poll: 0, + award_document_to_winner: 0, + delay_vote_poll: 0, + run_dao_platform_events: 0, + remove_votes_for_removed_masternodes: 0, + }, + state_transition_processing: DriveAbciStateTransitionProcessingMethodVersions { + execute_event: 0, + process_raw_state_transitions: 0, + decode_raw_state_transitions: 0, + validate_fees_of_event: 0, + }, + epoch: DriveAbciEpochMethodVersions { + gather_epoch_info: 0, + get_genesis_time: 0, + }, + block_start: DriveAbciBlockStartMethodVersions { + clear_drive_block_cache: 0, + }, + block_end: DriveAbciBlockEndMethodVersions { + update_state_cache: 0, + update_drive_cache: 0, + validator_set_update: 0, + }, + platform_state_storage: DriveAbciPlatformStateStorageMethodVersions { + fetch_platform_state: 0, + store_platform_state: 0, + }, + }, + validation_and_processing: DriveAbciValidationVersions { + state_transitions: DriveAbciStateTransitionValidationVersions { + common_validation_methods: DriveAbciStateTransitionCommonValidationVersions { + asset_locks: DriveAbciAssetLockValidationVersions { + fetch_asset_lock_transaction_output_sync: 0, + verify_asset_lock_is_not_spent_and_has_enough_balance: 0, + }, + validate_identity_public_key_contract_bounds: 0, + validate_identity_public_key_ids_dont_exist_in_state: 0, + validate_identity_public_key_ids_exist_in_state: 0, + validate_state_transition_identity_signed: 0, + validate_unique_identity_public_key_hashes_in_state: 0, + validate_master_key_uniqueness: 0, + validate_simple_pre_check_balance: 0, + }, + max_asset_lock_usage_attempts: 16, + identity_create_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: Some(0), + identity_signatures: Some(0), + advanced_minimum_balance_pre_check: None, + nonce: None, + state: 0, + transform_into_action: 0, + }, + identity_update_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: Some(0), + identity_signatures: Some(0), + advanced_minimum_balance_pre_check: None, + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: None, + nonce: None, + state: 0, + transform_into_action: 0, + }, + identity_credit_withdrawal_state_transition: + DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: Some(0), + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + identity_credit_transfer_state_transition: + DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: Some(0), + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + masternode_vote_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: None, + advanced_structure: Some(0), + identity_signatures: None, + advanced_minimum_balance_pre_check: Some(0), + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + contract_create_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: None, + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + contract_update_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: None, + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: None, + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + documents_batch_state_transition: + DriveAbciDocumentsStateTransitionValidationVersions { + balance_pre_check: 0, + basic_structure: 0, + advanced_structure: 0, + state: 0, + revision: 0, + transform_into_action: 0, + data_triggers: DriveAbciValidationDataTriggerAndBindingVersions { + bindings: 0, + triggers: DriveAbciValidationDataTriggerVersions { + create_contact_request_data_trigger: 0, + create_domain_data_trigger: 0, + create_identity_data_trigger: 0, + create_feature_flag_data_trigger: 0, + create_masternode_reward_shares_data_trigger: 0, + delete_withdrawal_data_trigger: 0, + reject_data_trigger: 0, + }, + }, + is_allowed: 0, + document_create_transition_structure_validation: 0, + document_delete_transition_structure_validation: 0, + document_replace_transition_structure_validation: 0, + document_transfer_transition_structure_validation: 0, + document_purchase_transition_structure_validation: 0, + document_update_price_transition_structure_validation: 0, + document_create_transition_state_validation: 1, + document_delete_transition_state_validation: 0, + document_replace_transition_state_validation: 0, + document_transfer_transition_state_validation: 0, + document_purchase_transition_state_validation: 0, + document_update_price_transition_state_validation: 0, + }, + }, + process_state_transition: 0, + state_transition_to_execution_event_for_check_tx: 0, + penalties: PenaltyAmounts { + identity_id_not_correct: 50000000, + unique_key_already_present: 10000000, + validation_of_added_keys_structure_failure: 10000000, + validation_of_added_keys_proof_of_possession_failure: 50000000, + }, + event_constants: DriveAbciValidationConstants { + maximum_vote_polls_to_process: 2, + maximum_contenders_to_consider: 100, + }, + }, + query: DriveAbciQueryVersions { + max_returned_elements: 100, + response_metadata: 0, + proofs_query: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + document_query: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + prefunded_specialized_balances: DriveAbciQueryPrefundedSpecializedBalancesVersions { + balance: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + identity_based_queries: DriveAbciQueryIdentityVersions { + identity: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + keys: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identities_contract_keys: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_nonce: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_contract_nonce: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + balance: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identities_balances: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + balance_and_revision: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_by_public_key_hash: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + validator_queries: DriveAbciQueryValidatorVersions { + proposed_block_counts_by_evonode_ids: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + proposed_block_counts_by_range: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + data_contract_based_queries: DriveAbciQueryDataContractVersions { + data_contract: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + data_contract_history: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + data_contracts: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + voting_based_queries: DriveAbciQueryVotingVersions { + vote_polls_by_end_date_query: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + contested_resource_vote_state: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + contested_resource_voters_for_identity: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + contested_resource_identity_vote_status: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + contested_resources: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + system: DriveAbciQuerySystemVersions { + version_upgrade_state: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + version_upgrade_vote_status: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + epoch_infos: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + partial_status: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + path_elements: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + total_credits_in_platform: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + }, + }, + dpp: DPPVersion { + costs: CostVersions { + signature_verify: 0, + }, + validation: DPPValidationVersions { + json_schema_validator: JsonSchemaValidatorVersions { + new: 0, + validate: 0, + compile: 0, + compile_and_validate: 0, + }, + data_contract: DataContractValidationVersions { + validate: 0, + validate_config_update: 0, + validate_index_definitions: 0, + validate_index_naming_duplicates: 0, + validate_not_defined_properties: 0, + validate_property_definition: 0, + }, + document_type: DocumentTypeValidationVersions { + validate_update: 0, + contested_index_limit: 1, + unique_index_limit: 10, + }, + voting: VotingValidationVersions { + allow_other_contenders_time_mainnet_ms: 604_800_000, // 1 week in ms + allow_other_contenders_time_testing_ms: 2_700_000, //45 minutes + votes_allowed_per_masternode: 5, + }, + }, + state_transition_serialization_versions: StateTransitionSerializationVersions { + identity_public_key_in_creation: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_create_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_update_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_top_up_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_credit_withdrawal_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_credit_transfer_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + masternode_vote_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + contract_create_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + contract_update_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + documents_batch_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + document_base_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + document_create_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + document_replace_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + document_delete_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + document_transfer_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + document_update_price_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + document_purchase_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + }, + state_transition_conversion_versions: StateTransitionConversionVersions { + identity_to_identity_create_transition: 0, + identity_to_identity_top_up_transition: 0, + identity_to_identity_withdrawal_transition: 0, + identity_to_identity_create_transition_with_signer: 0, + }, + state_transition_method_versions: StateTransitionMethodVersions { + public_key_in_creation_methods: PublicKeyInCreationMethodVersions { + from_public_key_signed_with_private_key: 0, + from_public_key_signed_external: 0, + hash: 0, + duplicated_key_ids_witness: 0, + duplicated_keys_witness: 0, + validate_identity_public_keys_structure: 0, + }, + }, + state_transitions: StateTransitionVersions { + documents: DocumentTransitionVersions { + documents_batch_transition: DocumentsBatchTransitionVersions { + validation: DocumentsBatchTransitionValidationVersions { + find_duplicates_by_id: 0, + validate_base_structure: 0, + }, + }, + }, + identities: IdentityTransitionVersions { + max_public_keys_in_creation: 6, + asset_locks: IdentityTransitionAssetLockVersions { + required_asset_lock_duff_balance_for_processing_start_for_identity_create: + 200000, + required_asset_lock_duff_balance_for_processing_start_for_identity_top_up: + 50000, + validate_asset_lock_transaction_structure: 0, + validate_instant_asset_lock_proof_structure: 0, + }, + }, + }, + contract_versions: ContractVersions { + max_serialized_size: 65000, + contract_serialization_version: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + contract_structure_version: 0, + created_data_contract_structure: 0, + config: 0, + methods: DataContractMethodVersions { + validate_document: 0, + validate_update: 0, + schema: 0, + }, + document_type_versions: DocumentTypeVersions { + index_versions: DocumentTypeIndexVersions { + index_levels_from_indices: 0, + }, + class_method_versions: DocumentTypeClassMethodVersions { + try_from_schema: 0, + create_document_types_from_document_schemas: 0, + }, + structure_version: 0, + schema: DocumentTypeSchemaVersions { + enrich_with_base_schema: 0, + find_identifier_and_binary_paths: 0, + validate_max_depth: 0, + max_depth: 256, + recursive_schema_validator_versions: RecursiveSchemaValidatorVersions { + traversal_validator: 0, + }, + validate_schema_compatibility: 0, + }, + methods: DocumentTypeMethodVersions { + create_document_from_data: 0, + create_document_with_prevalidated_properties: 0, + prefunded_voting_balance_for_document: 0, + contested_vote_poll_for_document: 0, + estimated_size: 0, + index_for_types: 0, + max_size: 0, + serialize_value_for_key: 0, + deserialize_value_for_key: 0, + }, + }, + }, + document_versions: DocumentVersions { + document_structure_version: 0, + document_serialization_version: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + document_cbor_serialization_version: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + extended_document_structure_version: 0, + extended_document_serialization_version: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + document_method_versions: DocumentMethodVersions { + is_equal_ignoring_timestamps: 0, + hash: 0, + get_raw_for_contract: 0, + get_raw_for_document_type: 0, + }, + }, + identity_versions: IdentityVersions { + identity_structure_version: 0, + identity_key_structure_version: 0, + identity_key_type_method_versions: IdentityKeyTypeMethodVersions { + random_public_key_data: 0, + random_public_and_private_key_data: 0, + }, + }, + voting_versions: VotingVersions { + default_vote_poll_time_duration_mainnet_ms: 1_209_600_000, //2 weeks + default_vote_poll_time_duration_test_network_ms: 5_400_000, //90 minutes + contested_document_vote_poll_stored_info_version: 0, + }, + asset_lock_versions: AssetLockVersions { + reduced_asset_lock_value: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + methods: DPPMethodVersions { + epoch_core_reward_credits_for_distribution: 0, + }, + }, + system_data_contracts: SystemDataContractVersions { + withdrawals: 1, + dpns: 1, + dashpay: 1, + masternode_reward_shares: 1, + feature_flags: 1, + }, + fee_version: FEE_VERSION1, + system_limits: SystemLimits { + estimated_contract_max_serialized_size: 16384, + max_field_value_size: 5120, //5 KiB + max_state_transition_size: 20480, //20 KiB + max_transitions_in_documents_batch: 1, + }, + consensus: ConsensusVersions { + tenderdash_consensus_version: 1, + }, +}; From 04360033e8d24a2597ba59b06780ce5589794dfb Mon Sep 17 00:00:00 2001 From: ktechmidas Date: Sun, 22 Sep 2024 14:57:42 +0000 Subject: [PATCH 02/90] fix: build dashmate on macos14 --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3f6f9810a6..09a9d209c9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -214,7 +214,7 @@ jobs: - package_type: deb os: ubuntu-22.04 - package_type: macos - os: macos-12 + os: macos-14 steps: - name: Check out repo uses: actions/checkout@v4 From 210be8eddd346c6407552d0302f63a71e3a6877a Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Wed, 25 Sep 2024 13:08:33 +0700 Subject: [PATCH 03/90] feat(platform)!: do not switch to oldest quorums in validator set update (#2167) --- .../block_end/validator_set_update/mod.rs | 8 +- .../block_end/validator_set_update/v0/mod.rs | 2 +- .../block_end/validator_set_update/v1/mod.rs | 216 ++++++++++++++++++ .../rs-platform-version/src/version/v4.rs | 2 +- 4 files changed, 225 insertions(+), 3 deletions(-) create mode 100644 packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v1/mod.rs diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/mod.rs index ebfe6c3fdf..af0e181b66 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/mod.rs @@ -1,4 +1,5 @@ mod v0; +mod v1; use crate::error::execution::ExecutionError; use crate::error::Error; @@ -52,9 +53,14 @@ where platform_state, block_execution_context, ), + 1 => self.validator_set_update_v1( + proposer_pro_tx_hash, + platform_state, + block_execution_context, + ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "validator_set_update".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, })), } diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v0/mod.rs index efc6251880..b2aa72c735 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v0/mod.rs @@ -92,7 +92,7 @@ where // we also need to perform a rotation if the validator set is being removed tracing::debug!( method = "validator_set_update_v0", - "rotation: new quorums not containing current quorum current {:?}, {}. quorum rotation expected˚", + "rotation: new quorums not containing current quorum current {:?}, {}. quorum rotation expected", block_execution_context .block_platform_state() .validator_sets() diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v1/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v1/mod.rs new file mode 100644 index 0000000000..8c6192e8a5 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v1/mod.rs @@ -0,0 +1,216 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::execution::types::block_execution_context::v0::{ + BlockExecutionContextV0Getters, BlockExecutionContextV0MutableGetters, +}; +use crate::execution::types::block_execution_context::BlockExecutionContext; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::platform_types::platform_state::PlatformState; +use crate::platform_types::validator_set::v0::ValidatorSetV0Getters; +use crate::rpc::core::CoreRPCLike; +use itertools::Itertools; + +use dpp::dashcore::hashes::Hash; +use tenderdash_abci::proto::abci::ValidatorSetUpdate; + +impl Platform +where + C: CoreRPCLike, +{ + /// We need to validate against the platform state for rotation and not the block execution + /// context state + /// We introduced v1 because the end quorums could be rotating out, giving a small advantage + /// to proposers with a smaller pro_tx_hash + /// To understand this imagine we have proposers + /// `a b c d e f g h i j k` in quorum 24 + /// c is the current proposer + /// Quorum 24 no longer is valid + /// We jump to quorum 0. + /// a b and c just got paid, but the rest did not. + #[inline(always)] + pub(super) fn validator_set_update_v1( + &self, + proposer_pro_tx_hash: [u8; 32], + platform_state: &PlatformState, + block_execution_context: &mut BlockExecutionContext, + ) -> Result, Error> { + let mut perform_rotation = false; + + if let Some(validator_set) = block_execution_context + .block_platform_state() + .validator_sets() + .get(&platform_state.current_validator_set_quorum_hash()) + { + if let Some((last_member_pro_tx_hash, _)) = validator_set.members().last_key_value() { + // we should also perform a rotation if the validator set went through all quorum members + // this means we are at the last member of the quorum + if last_member_pro_tx_hash.as_byte_array() == &proposer_pro_tx_hash { + tracing::debug!( + method = "validator_set_update_v1", + "rotation: quorum finished as we hit last member {} of quorum {}. All known quorums are: [{}]. quorum rotation expected", + hex::encode(proposer_pro_tx_hash), + hex::encode(platform_state.current_validator_set_quorum_hash().as_byte_array()), + block_execution_context + .block_platform_state() + .validator_sets() + .keys() + .map(hex::encode).collect::>().join(" | "), + ); + perform_rotation = true; + } + } else { + // the validator set has no members, very weird, but let's just perform a rotation + tracing::debug!( + method = "validator_set_update_v1", + "rotation: validator set has no members", + ); + perform_rotation = true; + } + + // We should also perform a rotation if there are more than one quorum in the system + // and that the new proposer is on the same quorum and the last proposer but is before + // them in the list of proposers. + // This only works if Tenderdash goes through proposers properly + if &platform_state.last_committed_quorum_hash() + == platform_state + .current_validator_set_quorum_hash() + .as_byte_array() + && platform_state.last_committed_block_proposer_pro_tx_hash() > proposer_pro_tx_hash + && platform_state.validator_sets().len() > 1 + { + // 1 - We haven't changed quorums + // 2 - The new proposer is before the old proposer + // 3 - There are more than one quorum in the system + tracing::debug!( + method = "validator_set_update_v1", + "rotation: quorum finished as we hit last an earlier member {} than last block proposer {} for quorum {}. All known quorums are: [{}]. quorum rotation expected", + hex::encode(proposer_pro_tx_hash), + hex::encode(block_execution_context.block_platform_state().last_committed_block_proposer_pro_tx_hash()), + hex::encode(platform_state.current_validator_set_quorum_hash().as_byte_array()), + block_execution_context + .block_platform_state() + .validator_sets() + .keys() + .map(hex::encode).collect::>().join(" | "), + ); + perform_rotation = true; + } + } else { + // we also need to perform a rotation if the validator set is being removed + tracing::debug!( + method = "validator_set_update_v1", + "rotation: new quorums not containing current quorum current {:?}, {}. quorum rotation expected", + block_execution_context + .block_platform_state() + .validator_sets() + .keys() + .map(|quorum_hash| format!("{}", quorum_hash)), + &platform_state.current_validator_set_quorum_hash() + ); + perform_rotation = true; + } + + //todo: (maybe) perform a rotation if quorum health is low + + if perform_rotation { + // get the index of the previous quorum + let mut index = platform_state + .validator_sets() + .get_index_of(&platform_state.current_validator_set_quorum_hash()) + .ok_or(Error::Execution(ExecutionError::CorruptedCachedState( + format!("perform_rotation: current validator set quorum hash {} not in current known validator sets [{}] processing block {}", platform_state.current_validator_set_quorum_hash(), platform_state + .validator_sets().keys().map(|quorum_hash| quorum_hash.to_string()).join(" | "), + platform_state.last_committed_block_height() + 1, + ))))?; + // we should rotate the quorum + let quorum_count = platform_state.validator_sets().len(); + match quorum_count { + 0 => Err(Error::Execution(ExecutionError::CorruptedCachedState( + "no current quorums".to_string(), + ))), + 1 => Ok(None), // no rotation as we are the only quorum + count => { + let start_index = index; + let oldest_quorum_index_we_can_go_to = if count > 10 { + // if we have a lot of quorums (like on testnet and mainnet) + // we shouldn't start using the last ones as they could cycle out + count - 2 + } else { + count + }; + index = (index + 1) % oldest_quorum_index_we_can_go_to; + // We can't just take the next item because it might no longer be in the state + for _i in 0..oldest_quorum_index_we_can_go_to { + let (quorum_hash, _) = platform_state + .validator_sets() + .get_index(index) + .expect("expected next validator set"); + + // We still have it in the state + if let Some(new_validator_set) = block_execution_context + .block_platform_state() + .validator_sets() + .get(quorum_hash) + { + tracing::debug!( + method = "validator_set_update_v1", + "rotation: to new quorum: {} with {} members", + &quorum_hash, + new_validator_set.members().len() + ); + let validator_set_update = new_validator_set.into(); + block_execution_context + .block_platform_state_mut() + .set_next_validator_set_quorum_hash(Some(*quorum_hash)); + return Ok(Some(validator_set_update)); + } + index = (index + 1) % oldest_quorum_index_we_can_go_to; + if index == start_index { + break; + } + } + // All quorums changed + if let Some((quorum_hash, new_validator_set)) = block_execution_context + .block_platform_state() + .validator_sets() + .first() + { + tracing::debug!( + method = "validator_set_update_v1", + "rotation: all quorums changed, rotation to new quorum: {}", + &quorum_hash + ); + let validator_set_update = new_validator_set.into(); + let new_quorum_hash = *quorum_hash; + block_execution_context + .block_platform_state_mut() + .set_next_validator_set_quorum_hash(Some(new_quorum_hash)); + return Ok(Some(validator_set_update)); + } + tracing::debug!("no new quorums to choose from"); + Ok(None) + } + } + } else { + let current_validator_set = block_execution_context + .block_platform_state() + .current_validator_set()?; + if current_validator_set != platform_state.current_validator_set()? { + // Something changed, for example the IP of a validator changed, or someone's ban status + + tracing::debug!( + method = "validator_set_update_v1", + "validator set update without rotation" + ); + Ok(Some(current_validator_set.into())) + } else { + tracing::debug!( + method = "validator_set_update_v1", + "no validator set update", + ); + Ok(None) + } + } + } +} diff --git a/packages/rs-platform-version/src/version/v4.rs b/packages/rs-platform-version/src/version/v4.rs index 683023afc6..ee05ddc657 100644 --- a/packages/rs-platform-version/src/version/v4.rs +++ b/packages/rs-platform-version/src/version/v4.rs @@ -699,7 +699,7 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { block_end: DriveAbciBlockEndMethodVersions { update_state_cache: 0, update_drive_cache: 0, - validator_set_update: 0, + validator_set_update: 1, }, platform_state_storage: DriveAbciPlatformStateStorageMethodVersions { fetch_platform_state: 0, From 67f57c4f71508f88ce5965c5d78f6c65e5d1e5b1 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Wed, 25 Sep 2024 19:43:40 +0300 Subject: [PATCH 04/90] fix(dashmate): colors[updated] is not a function (#2157) --- packages/dashmate/src/update/updateNodeFactory.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dashmate/src/update/updateNodeFactory.js b/packages/dashmate/src/update/updateNodeFactory.js index 13cf1ef83c..0f50d44acb 100644 --- a/packages/dashmate/src/update/updateNodeFactory.js +++ b/packages/dashmate/src/update/updateNodeFactory.js @@ -31,7 +31,7 @@ export default function updateNodeFactory(getServiceList, docker) { name, title, image, updated: 'error', }); } else { - let updated = null; + let updated = 'error'; stream.on('data', (data) => { // parse all stdout and gather Status message From 1b975c5df3043ec972eada2e1f544ebc34afff74 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 26 Sep 2024 00:19:45 +0700 Subject: [PATCH 05/90] feat(platform)!: withdrawals polishing and fixes for mainnet (#2166) --- Cargo.lock | 58 +- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/check-features/Cargo.toml | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- .../platform/v0/nodejs/platform_pbjs.js | 258 +------ .../platform/v0/nodejs/platform_protoc.js | 283 ++------ .../platform/v0/objective-c/Platform.pbobjc.h | 28 +- .../platform/v0/objective-c/Platform.pbobjc.m | 77 +-- .../platform/v0/python/platform_pb2.py | 649 +++++++++--------- .../clients/platform/v0/web/platform_pb.d.ts | 40 +- .../clients/platform/v0/web/platform_pb.js | 283 ++------ packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- .../configs/getConfigFileMigrationsFactory.js | 9 + packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 4 +- packages/rs-dpp/src/errors/consensus/codes.rs | 2 + ...alid_signature_public_key_purpose_error.rs | 13 +- .../wrong_public_key_purpose_error.rs | 15 +- .../identity/missing_transfer_key_error.rs | 36 + .../errors/consensus/state/identity/mod.rs | 2 + ...key_for_core_withdrawal_available_error.rs | 38 + .../src/errors/consensus/state/state_error.rs | 8 + packages/rs-dpp/src/identity/core_script.rs | 8 +- .../identity/identity_public_key/key_type.rs | 11 + .../identity_public_key/security_level.rs | 17 + packages/rs-dpp/src/identity/signer.rs | 3 + packages/rs-dpp/src/lib.rs | 1 + .../errors/wrong_public_key_purpose_error.rs | 13 +- packages/rs-dpp/src/state_transition/mod.rs | 8 +- .../identity_signed.rs | 8 +- .../v0/identity_signed.rs | 4 +- .../v0/v0_methods.rs | 8 +- .../identity_signed.rs | 8 +- .../v0/identity_signed.rs | 4 +- .../identity_signed.rs | 8 +- .../v0/identity_signed.rs | 4 +- .../identity_signed.rs | 6 +- .../v0/identity_signed.rs | 6 +- .../accessors/mod.rs | 32 +- .../accessors/v0/mod.rs | 4 +- .../identity_signed.rs | 16 +- .../json_conversion.rs | 9 + .../methods/mod.rs | 20 +- .../methods/v0/mod.rs | 43 +- .../mod.rs | 22 +- .../state_transition_like.rs | 18 + .../v0/identity_signed.rs | 6 +- .../v0/mod.rs | 11 - .../v0/v0_methods.rs | 76 -- .../v1/identity_signed.rs | 27 + .../v1/json_conversion.rs | 4 + .../v1/mod.rs | 45 ++ .../v1/state_transition_like.rs | 72 ++ .../v1/types.rs | 17 + .../v1/v0_methods.rs | 137 ++++ .../v1/value_conversion.rs | 60 ++ .../v1/version.rs | 9 + .../value_conversion.rs | 32 + .../version.rs | 1 + .../identity_signed.rs | 8 +- .../v0/identity_signed.rs | 4 +- .../identity_signed.rs | 8 +- .../v0/identity_signed.rs | 6 +- .../state_transition_identity_signed.rs | 21 +- .../mod.rs | 25 + .../v0/mod.rs | 45 ++ packages/rs-dpp/src/withdrawal/mod.rs | 9 + packages/rs-drive-abci/Cargo.toml | 2 +- .../src/abci/handler/prepare_proposal.rs | 20 +- packages/rs-drive-abci/src/config.rs | 2 +- .../engine/finalize_block_proposal/v0/mod.rs | 48 +- .../engine/run_block_proposal/v0/mod.rs | 1 + .../mod.rs | 11 +- .../v0/mod.rs | 97 +-- .../mod.rs | 39 +- .../v0/mod.rs | 170 ++--- .../v0/mod.rs | 10 +- .../mod.rs | 2 +- .../v0/mod.rs | 5 +- .../mod.rs | 11 +- .../v0/mod.rs | 70 +- .../v1/mod.rs | 251 +++++++ .../v0/mod.rs | 2 +- .../types/block_execution_context/v0/mod.rs | 29 - .../v0/mod.rs | 22 +- .../identity_credit_withdrawal/mod.rs | 256 ++++++- .../state/v0/mod.rs | 40 +- .../structure/v1/mod.rs | 21 +- .../state_transitions/masternode_vote/mod.rs | 5 +- .../state_transition/state_transitions/mod.rs | 3 +- .../src/platform_types/platform_state/mod.rs | 1 + .../platform_types/platform_state/v0/mod.rs | 20 +- .../unsigned_withdrawal_txs/v0/mod.rs | 67 +- .../tests/strategy_tests/main.rs | 617 +---------------- .../tests/strategy_tests/withdrawal_tests.rs | 643 +++++++++++++++++ packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/src/proof.rs | 34 +- packages/rs-drive/Cargo.toml | 2 +- .../key/fetch/fetch_identity_keys/v0/mod.rs | 8 +- .../src/drive/identity/key/fetch/mod.rs | 25 +- packages/rs-drive/src/drive/identity/mod.rs | 24 +- .../mod.rs | 2 +- .../v0/mod.rs | 4 +- .../src/drive/identity/withdrawals/mod.rs | 5 - .../mod.rs | 2 +- .../v0/mod.rs | 2 +- .../mod.rs | 2 +- .../v0/mod.rs | 2 +- .../mod.rs | 2 +- .../v0/mod.rs | 2 +- .../mod.rs | 2 +- .../v0/mod.rs | 8 +- .../withdrawals/transaction/queue/mod.rs | 4 +- .../identity_credit_withdrawal/transformer.rs | 39 +- .../v0/transformer.rs | 138 +++- .../bump_identity_nonce_action/transformer.rs | 12 +- .../v0/transformer.rs | 32 +- .../util/batch/drive_op_batch/withdrawals.rs | 7 +- .../Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- .../src/version/dpp_versions.rs | 1 + .../rs-platform-version/src/version/limits.rs | 1 + .../src/version/mocks/v2_test.rs | 2 + .../src/version/mocks/v3_test.rs | 94 +-- .../rs-platform-version/src/version/v1.rs | 2 + .../rs-platform-version/src/version/v2.rs | 2 + .../rs-platform-version/src/version/v3.rs | 4 +- .../rs-platform-version/src/version/v4.rs | 6 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/rs-sdk/src/lib.rs | 1 + .../transition/withdraw_from_identity.rs | 55 +- packages/simple-signer/Cargo.toml | 2 +- packages/simple-signer/src/signer.rs | 7 + packages/strategy-tests/Cargo.toml | 2 +- packages/strategy-tests/src/transitions.rs | 176 ++++- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- .../document_batch_transition/mod.rs | 18 +- ...alid_signature_public_key_purpose_error.rs | 8 +- .../basic/wrong_public_key_purpose_error.rs | 8 +- .../src/errors/consensus/consensus_error.rs | 8 + .../to_object.rs | 2 +- .../transition.rs | 45 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 168 files changed, 3485 insertions(+), 2561 deletions(-) create mode 100644 packages/rs-dpp/src/errors/consensus/state/identity/missing_transfer_key_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/identity/no_transfer_key_for_core_withdrawal_available_error.rs delete mode 100644 packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/identity_signed.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/json_conversion.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/state_transition_like.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/types.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/value_conversion.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/version.rs create mode 100644 packages/rs-dpp/src/withdrawal/document_try_into_asset_unlock_base_transaction_info/mod.rs create mode 100644 packages/rs-dpp/src/withdrawal/document_try_into_asset_unlock_base_transaction_info/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v1/mod.rs create mode 100644 packages/rs-drive-abci/tests/strategy_tests/withdrawal_tests.rs diff --git a/Cargo.lock b/Cargo.lock index 4028c50790..ad59187b72 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -781,7 +781,7 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "check-features" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "toml", ] @@ -1147,7 +1147,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1163,7 +1163,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "dapi-grpc", "heck 0.5.0", @@ -1208,7 +1208,7 @@ dependencies = [ [[package]] name = "dash-sdk" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "arc-swap", "async-trait", @@ -1308,7 +1308,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "platform-value", "platform-version", @@ -1318,7 +1318,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1434,7 +1434,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "platform-value", "platform-version", @@ -1444,7 +1444,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "anyhow", "assert_matches", @@ -1496,7 +1496,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "arc-swap", "base64 0.22.1", @@ -1536,7 +1536,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "arc-swap", "assert_matches", @@ -1592,7 +1592,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "bincode", "dapi-grpc", @@ -1806,7 +1806,7 @@ checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "feature-flags-contract" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "platform-value", "platform-version", @@ -2750,7 +2750,7 @@ dependencies = [ [[package]] name = "json-schema-compatibility-validator" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "assert_matches", "json-patch", @@ -2923,7 +2923,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "platform-value", "platform-version", @@ -3497,7 +3497,7 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "platform-serialization" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "bincode", "platform-version", @@ -3505,7 +3505,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "proc-macro2", "quote", @@ -3515,7 +3515,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "base64 0.22.1", "bincode", @@ -3536,7 +3536,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "quote", "syn 2.0.75", @@ -3544,7 +3544,7 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "bincode", "grovedb-version", @@ -3555,7 +3555,7 @@ dependencies = [ [[package]] name = "platform-versioning" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "proc-macro2", "quote", @@ -3665,9 +3665,9 @@ dependencies = [ [[package]] name = "pretty_assertions" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" dependencies = [ "diff", "yansi", @@ -4168,7 +4168,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "backon", "chrono", @@ -4685,7 +4685,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "base64 0.22.1", "bincode", @@ -4776,7 +4776,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "bincode", "dpp", @@ -5820,7 +5820,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "anyhow", "async-trait", @@ -6122,7 +6122,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.3.0" +version = "1.4.0-dev.1" dependencies = [ "num_enum", "platform-value", @@ -6144,9 +6144,9 @@ dependencies = [ [[package]] name = "yansi" -version = "0.5.1" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "zerocopy" diff --git a/package.json b/package.json index 84cecf3a0d..1b58fdb2e1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.3.0", + "version": "1.4.0-dev.1", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index 6ef6bd3cbf..3b274c7309 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.3.0", + "version": "1.4.0-dev.1", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/check-features/Cargo.toml b/packages/check-features/Cargo.toml index 9d1ae45015..32fa620a54 100644 --- a/packages/check-features/Cargo.toml +++ b/packages/check-features/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "check-features" -version = "1.3.0" +version = "1.4.0-dev.1" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index bdd678305b..35a9f633cb 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.3.0" +version = "1.4.0-dev.1" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js index 91ba238650..1c749e8b48 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js @@ -13454,7 +13454,7 @@ $root.org = (function() { * Properties of a GetIdentitiesBalancesRequestV0. * @memberof org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest * @interface IGetIdentitiesBalancesRequestV0 - * @property {org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.IGetIdentitiesBalancesByKnownIdentityIds|null} [identitiesIds] GetIdentitiesBalancesRequestV0 identitiesIds + * @property {Array.|null} [ids] GetIdentitiesBalancesRequestV0 ids * @property {boolean|null} [prove] GetIdentitiesBalancesRequestV0 prove */ @@ -13467,6 +13467,7 @@ $root.org = (function() { * @param {org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.IGetIdentitiesBalancesRequestV0=} [properties] Properties to set */ function GetIdentitiesBalancesRequestV0(properties) { + this.ids = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -13474,12 +13475,12 @@ $root.org = (function() { } /** - * GetIdentitiesBalancesRequestV0 identitiesIds. - * @member {org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.IGetIdentitiesBalancesByKnownIdentityIds|null|undefined} identitiesIds + * GetIdentitiesBalancesRequestV0 ids. + * @member {Array.} ids * @memberof org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0 * @instance */ - GetIdentitiesBalancesRequestV0.prototype.identitiesIds = null; + GetIdentitiesBalancesRequestV0.prototype.ids = $util.emptyArray; /** * GetIdentitiesBalancesRequestV0 prove. @@ -13513,8 +13514,9 @@ $root.org = (function() { GetIdentitiesBalancesRequestV0.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.identitiesIds != null && Object.hasOwnProperty.call(message, "identitiesIds")) - $root.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.encode(message.identitiesIds, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.ids != null && message.ids.length) + for (var i = 0; i < message.ids.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.ids[i]); if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.prove); return writer; @@ -13552,7 +13554,9 @@ $root.org = (function() { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.identitiesIds = $root.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.decode(reader, reader.uint32()); + if (!(message.ids && message.ids.length)) + message.ids = []; + message.ids.push(reader.bytes()); break; case 2: message.prove = reader.bool(); @@ -13592,10 +13596,12 @@ $root.org = (function() { GetIdentitiesBalancesRequestV0.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.identitiesIds != null && message.hasOwnProperty("identitiesIds")) { - var error = $root.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.verify(message.identitiesIds); - if (error) - return "identitiesIds." + error; + if (message.ids != null && message.hasOwnProperty("ids")) { + if (!Array.isArray(message.ids)) + return "ids: array expected"; + for (var i = 0; i < message.ids.length; ++i) + if (!(message.ids[i] && typeof message.ids[i].length === "number" || $util.isString(message.ids[i]))) + return "ids: buffer[] expected"; } if (message.prove != null && message.hasOwnProperty("prove")) if (typeof message.prove !== "boolean") @@ -13615,10 +13621,15 @@ $root.org = (function() { if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0) return object; var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0(); - if (object.identitiesIds != null) { - if (typeof object.identitiesIds !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.identitiesIds: object expected"); - message.identitiesIds = $root.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.fromObject(object.identitiesIds); + if (object.ids) { + if (!Array.isArray(object.ids)) + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.ids: array expected"); + message.ids = []; + for (var i = 0; i < object.ids.length; ++i) + if (typeof object.ids[i] === "string") + $util.base64.decode(object.ids[i], message.ids[i] = $util.newBuffer($util.base64.length(object.ids[i])), 0); + else if (object.ids[i].length >= 0) + message.ids[i] = object.ids[i]; } if (object.prove != null) message.prove = Boolean(object.prove); @@ -13638,12 +13649,15 @@ $root.org = (function() { if (!options) options = {}; var object = {}; - if (options.defaults) { - object.identitiesIds = null; + if (options.arrays || options.defaults) + object.ids = []; + if (options.defaults) object.prove = false; + if (message.ids && message.ids.length) { + object.ids = []; + for (var j = 0; j < message.ids.length; ++j) + object.ids[j] = options.bytes === String ? $util.base64.encode(message.ids[j], 0, message.ids[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.ids[j]) : message.ids[j]; } - if (message.identitiesIds != null && message.hasOwnProperty("identitiesIds")) - object.identitiesIds = $root.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.toObject(message.identitiesIds, options); if (message.prove != null && message.hasOwnProperty("prove")) object.prove = message.prove; return object; @@ -13660,212 +13674,6 @@ $root.org = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds = (function() { - - /** - * Properties of a GetIdentitiesBalancesByKnownIdentityIds. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0 - * @interface IGetIdentitiesBalancesByKnownIdentityIds - * @property {Array.|null} [identitiesIds] GetIdentitiesBalancesByKnownIdentityIds identitiesIds - */ - - /** - * Constructs a new GetIdentitiesBalancesByKnownIdentityIds. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0 - * @classdesc Represents a GetIdentitiesBalancesByKnownIdentityIds. - * @implements IGetIdentitiesBalancesByKnownIdentityIds - * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.IGetIdentitiesBalancesByKnownIdentityIds=} [properties] Properties to set - */ - function GetIdentitiesBalancesByKnownIdentityIds(properties) { - this.identitiesIds = []; - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } - - /** - * GetIdentitiesBalancesByKnownIdentityIds identitiesIds. - * @member {Array.} identitiesIds - * @memberof org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds - * @instance - */ - GetIdentitiesBalancesByKnownIdentityIds.prototype.identitiesIds = $util.emptyArray; - - /** - * Creates a new GetIdentitiesBalancesByKnownIdentityIds instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.IGetIdentitiesBalancesByKnownIdentityIds=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} GetIdentitiesBalancesByKnownIdentityIds instance - */ - GetIdentitiesBalancesByKnownIdentityIds.create = function create(properties) { - return new GetIdentitiesBalancesByKnownIdentityIds(properties); - }; - - /** - * Encodes the specified GetIdentitiesBalancesByKnownIdentityIds message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.IGetIdentitiesBalancesByKnownIdentityIds} message GetIdentitiesBalancesByKnownIdentityIds message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetIdentitiesBalancesByKnownIdentityIds.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.identitiesIds != null && message.identitiesIds.length) - for (var i = 0; i < message.identitiesIds.length; ++i) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.identitiesIds[i]); - return writer; - }; - - /** - * Encodes the specified GetIdentitiesBalancesByKnownIdentityIds message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.IGetIdentitiesBalancesByKnownIdentityIds} message GetIdentitiesBalancesByKnownIdentityIds message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetIdentitiesBalancesByKnownIdentityIds.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a GetIdentitiesBalancesByKnownIdentityIds message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} GetIdentitiesBalancesByKnownIdentityIds - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetIdentitiesBalancesByKnownIdentityIds.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (!(message.identitiesIds && message.identitiesIds.length)) - message.identitiesIds = []; - message.identitiesIds.push(reader.bytes()); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a GetIdentitiesBalancesByKnownIdentityIds message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} GetIdentitiesBalancesByKnownIdentityIds - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetIdentitiesBalancesByKnownIdentityIds.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a GetIdentitiesBalancesByKnownIdentityIds message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - GetIdentitiesBalancesByKnownIdentityIds.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - if (message.identitiesIds != null && message.hasOwnProperty("identitiesIds")) { - if (!Array.isArray(message.identitiesIds)) - return "identitiesIds: array expected"; - for (var i = 0; i < message.identitiesIds.length; ++i) - if (!(message.identitiesIds[i] && typeof message.identitiesIds[i].length === "number" || $util.isString(message.identitiesIds[i]))) - return "identitiesIds: buffer[] expected"; - } - return null; - }; - - /** - * Creates a GetIdentitiesBalancesByKnownIdentityIds message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} GetIdentitiesBalancesByKnownIdentityIds - */ - GetIdentitiesBalancesByKnownIdentityIds.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds(); - if (object.identitiesIds) { - if (!Array.isArray(object.identitiesIds)) - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.identitiesIds: array expected"); - message.identitiesIds = []; - for (var i = 0; i < object.identitiesIds.length; ++i) - if (typeof object.identitiesIds[i] === "string") - $util.base64.decode(object.identitiesIds[i], message.identitiesIds[i] = $util.newBuffer($util.base64.length(object.identitiesIds[i])), 0); - else if (object.identitiesIds[i].length >= 0) - message.identitiesIds[i] = object.identitiesIds[i]; - } - return message; - }; - - /** - * Creates a plain object from a GetIdentitiesBalancesByKnownIdentityIds message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} message GetIdentitiesBalancesByKnownIdentityIds - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - GetIdentitiesBalancesByKnownIdentityIds.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.arrays || options.defaults) - object.identitiesIds = []; - if (message.identitiesIds && message.identitiesIds.length) { - object.identitiesIds = []; - for (var j = 0; j < message.identitiesIds.length; ++j) - object.identitiesIds[j] = options.bytes === String ? $util.base64.encode(message.identitiesIds[j], 0, message.identitiesIds[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.identitiesIds[j]) : message.identitiesIds[j]; - } - return object; - }; - - /** - * Converts this GetIdentitiesBalancesByKnownIdentityIds to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds - * @instance - * @returns {Object.} JSON object - */ - GetIdentitiesBalancesByKnownIdentityIds.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - return GetIdentitiesBalancesByKnownIdentityIds; - })(); - return GetIdentitiesBalancesRequestV0; })(); diff --git a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js index 746f5210fd..5f0abd5da9 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js @@ -133,7 +133,6 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlock goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0', null, { proto }); @@ -1404,7 +1403,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0 = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.repeatedFields_, null); }; goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -1414,27 +1413,6 @@ if (goog.DEBUG && !COMPILED) { */ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0'; } -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.repeatedFields_, null); -}; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds'; -} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -13367,8 +13345,8 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEv */ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getEpoch(); - if (f !== 0) { + f = /** @type {number} */ (jspb.Message.getField(message, 1)); + if (f != null) { writer.writeUint32( 1, f @@ -13405,7 +13383,25 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEv * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this */ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.setEpoch = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); + return jspb.Message.setField(this, 1, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.clearEpoch = function() { + return jspb.Message.setField(this, 1, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.hasEpoch = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -14611,8 +14607,8 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.Get */ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getEpoch(); - if (f !== 0) { + f = /** @type {number} */ (jspb.Message.getField(message, 1)); + if (f != null) { writer.writeUint32( 1, f @@ -14663,7 +14659,25 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.Get * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this */ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.setEpoch = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); + return jspb.Message.setField(this, 1, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.clearEpoch = function() { + return jspb.Message.setField(this, 1, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.hasEpoch = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -15018,6 +15032,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.serializeBinaryToWr +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.repeatedFields_ = [1]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -15049,7 +15070,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalanc */ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - identitiesIds: (f = msg.getIdentitiesIds()) && proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.toObject(includeInstance, f), + idsList: msg.getIdsList_asB64(), prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; @@ -15088,9 +15109,8 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalanc var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.deserializeBinaryFromReader); - msg.setIdentitiesIds(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addIds(value); break; case 2: var value = /** @type {boolean} */ (reader.readBool()); @@ -15125,12 +15145,11 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalanc */ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentitiesIds(); - if (f != null) { - writer.writeMessage( + f = message.getIdsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.serializeBinaryToWriter + f ); } f = message.getProve(); @@ -15143,163 +15162,44 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalanc }; - -/** - * List of repeated fields within this message type. - * @private {!Array} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.repeatedFields_ = [1]; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.toObject = function(includeInstance, msg) { - var f, obj = { - identitiesIdsList: msg.getIdentitiesIdsList_asB64() - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds; - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addIdentitiesIds(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getIdentitiesIdsList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 1, - f - ); - } -}; - - /** - * repeated bytes identities_ids = 1; + * repeated bytes ids = 1; * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.prototype.getIdentitiesIdsList = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getIdsList = function() { return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); }; /** - * repeated bytes identities_ids = 1; - * This is a type-conversion wrapper around `getIdentitiesIdsList()` + * repeated bytes ids = 1; + * This is a type-conversion wrapper around `getIdsList()` * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.prototype.getIdentitiesIdsList_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getIdsList_asB64 = function() { return /** @type {!Array} */ (jspb.Message.bytesListAsB64( - this.getIdentitiesIdsList())); + this.getIdsList())); }; /** - * repeated bytes identities_ids = 1; + * repeated bytes ids = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentitiesIdsList()` + * This is a type-conversion wrapper around `getIdsList()` * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.prototype.getIdentitiesIdsList_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getIdsList_asU8 = function() { return /** @type {!Array} */ (jspb.Message.bytesListAsU8( - this.getIdentitiesIdsList())); + this.getIdsList())); }; /** * @param {!(Array|Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.prototype.setIdentitiesIdsList = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.setIdsList = function(value) { return jspb.Message.setField(this, 1, value || []); }; @@ -15307,56 +15207,19 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalanc /** * @param {!(string|Uint8Array)} value * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.prototype.addIdentitiesIds = function(value, opt_index) { +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.addIds = function(value, opt_index) { return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.prototype.clearIdentitiesIdsList = function() { - return this.setIdentitiesIdsList([]); -}; - - -/** - * optional GetIdentitiesBalancesByKnownIdentityIds identities_ids = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getIdentitiesIds = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.setIdentitiesIds = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.clearIdentitiesIds = function() { - return this.setIdentitiesIds(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.hasIdentitiesIds = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.clearIdsList = function() { + return this.setIdsList([]); }; diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h index d6a635ad22..02c1eb42a8 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h @@ -77,7 +77,6 @@ CF_EXTERN_C_BEGIN @class GetEvonodesProposedEpochBlocksResponse_GetEvonodesProposedEpochBlocksResponseV0_EvonodeProposedBlocks; @class GetEvonodesProposedEpochBlocksResponse_GetEvonodesProposedEpochBlocksResponseV0_EvonodesProposedBlocks; @class GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0; -@class GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_GetIdentitiesBalancesByKnownIdentityIds; @class GetIdentitiesBalancesResponse_GetIdentitiesBalancesResponseV0; @class GetIdentitiesBalancesResponse_GetIdentitiesBalancesResponseV0_IdentitiesBalances; @class GetIdentitiesBalancesResponse_GetIdentitiesBalancesResponseV0_IdentityBalance; @@ -1396,8 +1395,10 @@ typedef GPB_ENUM(GetEvonodesProposedEpochBlocksByIdsRequest_GetEvonodesProposedE GPB_FINAL @interface GetEvonodesProposedEpochBlocksByIdsRequest_GetEvonodesProposedEpochBlocksByIdsRequestV0 : GPBMessage +/** The epoch we are querying for, if none is set, get current epoch */ @property(nonatomic, readwrite) uint32_t epoch; +@property(nonatomic, readwrite) BOOL hasEpoch; /** IDs of the evonodes for which we want to get their proposed blocks */ @property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *idsArray; /** The number of items in @c idsArray without causing the array to be created. */ @@ -1539,9 +1540,10 @@ typedef GPB_ENUM(GetEvonodesProposedEpochBlocksByRangeRequest_GetEvonodesPropose GPB_FINAL @interface GetEvonodesProposedEpochBlocksByRangeRequest_GetEvonodesProposedEpochBlocksByRangeRequestV0 : GPBMessage -/** The epoch we are querying for */ +/** The epoch we are querying for, if none is set, get current epoch */ @property(nonatomic, readwrite) uint32_t epoch; +@property(nonatomic, readwrite) BOOL hasEpoch; /** Maximum number of evonodes proposed epoch blocks to return */ @property(nonatomic, readwrite) uint32_t limit; @@ -1591,34 +1593,20 @@ void GetIdentitiesBalancesRequest_ClearVersionOneOfCase(GetIdentitiesBalancesReq #pragma mark - GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0 typedef GPB_ENUM(GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_FieldNumber) { - GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_FieldNumber_IdentitiesIds = 1, + GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_FieldNumber_IdsArray = 1, GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_FieldNumber_Prove = 2, }; GPB_FINAL @interface GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0 : GPBMessage -@property(nonatomic, readwrite, strong, null_resettable) GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_GetIdentitiesBalancesByKnownIdentityIds *identitiesIds; -/** Test to see if @c identitiesIds has been set. */ -@property(nonatomic, readwrite) BOOL hasIdentitiesIds; +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *idsArray; +/** The number of items in @c idsArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger idsArray_Count; @property(nonatomic, readwrite) BOOL prove; @end -#pragma mark - GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_GetIdentitiesBalancesByKnownIdentityIds - -typedef GPB_ENUM(GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_GetIdentitiesBalancesByKnownIdentityIds_FieldNumber) { - GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_GetIdentitiesBalancesByKnownIdentityIds_FieldNumber_IdentitiesIdsArray = 1, -}; - -GPB_FINAL @interface GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_GetIdentitiesBalancesByKnownIdentityIds : GPBMessage - -@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *identitiesIdsArray; -/** The number of items in @c identitiesIdsArray without causing the array to be created. */ -@property(nonatomic, readonly) NSUInteger identitiesIdsArray_Count; - -@end - #pragma mark - GetIdentitiesBalancesResponse typedef GPB_ENUM(GetIdentitiesBalancesResponse_FieldNumber) { diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m index 7d1ef92f7a..72e1a8f4a2 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m @@ -101,7 +101,6 @@ GPBObjCClassDeclaration(GetEvonodesProposedEpochBlocksResponse_GetEvonodesProposedEpochBlocksResponseV0_EvonodesProposedBlocks); GPBObjCClassDeclaration(GetIdentitiesBalancesRequest); GPBObjCClassDeclaration(GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0); -GPBObjCClassDeclaration(GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_GetIdentitiesBalancesByKnownIdentityIds); GPBObjCClassDeclaration(GetIdentitiesBalancesResponse); GPBObjCClassDeclaration(GetIdentitiesBalancesResponse_GetIdentitiesBalancesResponseV0); GPBObjCClassDeclaration(GetIdentitiesBalancesResponse_GetIdentitiesBalancesResponseV0_IdentitiesBalances); @@ -3065,7 +3064,7 @@ void GetEvonodesProposedEpochBlocksByIdsRequest_ClearVersionOneOfCase(GetEvonode @implementation GetEvonodesProposedEpochBlocksByIdsRequest_GetEvonodesProposedEpochBlocksByIdsRequestV0 -@dynamic epoch; +@dynamic hasEpoch, epoch; @dynamic idsArray, idsArray_Count; @dynamic prove; @@ -3087,7 +3086,7 @@ + (GPBDescriptor *)descriptor { .number = GetEvonodesProposedEpochBlocksByIdsRequest_GetEvonodesProposedEpochBlocksByIdsRequestV0_FieldNumber_Epoch, .hasIndex = 0, .offset = (uint32_t)offsetof(GetEvonodesProposedEpochBlocksByIdsRequest_GetEvonodesProposedEpochBlocksByIdsRequestV0__storage_, epoch), - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .flags = GPBFieldOptional, .dataType = GPBDataTypeUInt32, }, { @@ -3430,7 +3429,7 @@ void GetEvonodesProposedEpochBlocksByRangeRequest_ClearVersionOneOfCase(GetEvono @implementation GetEvonodesProposedEpochBlocksByRangeRequest_GetEvonodesProposedEpochBlocksByRangeRequestV0 @dynamic startOneOfCase; -@dynamic epoch; +@dynamic hasEpoch, epoch; @dynamic hasLimit, limit; @dynamic startAfter; @dynamic startAt; @@ -3456,7 +3455,7 @@ + (GPBDescriptor *)descriptor { .number = GetEvonodesProposedEpochBlocksByRangeRequest_GetEvonodesProposedEpochBlocksByRangeRequestV0_FieldNumber_Epoch, .hasIndex = 0, .offset = (uint32_t)offsetof(GetEvonodesProposedEpochBlocksByRangeRequest_GetEvonodesProposedEpochBlocksByRangeRequestV0__storage_, epoch), - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .flags = GPBFieldOptional, .dataType = GPBDataTypeUInt32, }, { @@ -3587,12 +3586,12 @@ void GetIdentitiesBalancesRequest_ClearVersionOneOfCase(GetIdentitiesBalancesReq @implementation GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0 -@dynamic hasIdentitiesIds, identitiesIds; +@dynamic idsArray, idsArray_Count; @dynamic prove; typedef struct GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0__storage_ { uint32_t _has_storage_[1]; - GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_GetIdentitiesBalancesByKnownIdentityIds *identitiesIds; + NSMutableArray *idsArray; } GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0__storage_; // This method is threadsafe because it is initially called @@ -3602,20 +3601,20 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "identitiesIds", - .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_GetIdentitiesBalancesByKnownIdentityIds), - .number = GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_FieldNumber_IdentitiesIds, - .hasIndex = 0, - .offset = (uint32_t)offsetof(GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0__storage_, identitiesIds), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, + .name = "idsArray", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_FieldNumber_IdsArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0__storage_, idsArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeBytes, }, { .name = "prove", .dataTypeSpecific.clazz = Nil, .number = GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_FieldNumber_Prove, - .hasIndex = 1, - .offset = 2, // Stored in _has_storage_ to save space. + .hasIndex = 0, + .offset = 1, // Stored in _has_storage_ to save space. .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeBool, }, @@ -3639,52 +3638,6 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_GetIdentitiesBalancesByKnownIdentityIds - -@implementation GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_GetIdentitiesBalancesByKnownIdentityIds - -@dynamic identitiesIdsArray, identitiesIdsArray_Count; - -typedef struct GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_GetIdentitiesBalancesByKnownIdentityIds__storage_ { - uint32_t _has_storage_[1]; - NSMutableArray *identitiesIdsArray; -} GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_GetIdentitiesBalancesByKnownIdentityIds__storage_; - -// This method is threadsafe because it is initially called -// in +initialize for each subclass. -+ (GPBDescriptor *)descriptor { - static GPBDescriptor *descriptor = nil; - if (!descriptor) { - static GPBMessageFieldDescription fields[] = { - { - .name = "identitiesIdsArray", - .dataTypeSpecific.clazz = Nil, - .number = GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_GetIdentitiesBalancesByKnownIdentityIds_FieldNumber_IdentitiesIdsArray, - .hasIndex = GPBNoHasBit, - .offset = (uint32_t)offsetof(GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_GetIdentitiesBalancesByKnownIdentityIds__storage_, identitiesIdsArray), - .flags = GPBFieldRepeated, - .dataType = GPBDataTypeBytes, - }, - }; - GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_GetIdentitiesBalancesByKnownIdentityIds class] - rootClass:[PlatformRoot class] - file:PlatformRoot_FileDescriptor() - fields:fields - fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0_GetIdentitiesBalancesByKnownIdentityIds__storage_) - flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0)]; - #if defined(DEBUG) && DEBUG - NSAssert(descriptor == nil, @"Startup recursed!"); - #endif // DEBUG - descriptor = localDescriptor; - } - return descriptor; -} - -@end - #pragma mark - GetIdentitiesBalancesResponse @implementation GetIdentitiesBalancesResponse diff --git a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py index e28c4f3249..1725d43f4a 100644 --- a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py +++ b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py @@ -23,7 +23,7 @@ syntax='proto3', serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x0eplatform.proto\x12\x19org.dash.platform.dapi.v0\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\x81\x01\n\x05Proof\x12\x15\n\rgrovedb_proof\x18\x01 \x01(\x0c\x12\x13\n\x0bquorum_hash\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\x12\r\n\x05round\x18\x04 \x01(\r\x12\x15\n\rblock_id_hash\x18\x05 \x01(\x0c\x12\x13\n\x0bquorum_type\x18\x06 \x01(\r\"\x90\x01\n\x10ResponseMetadata\x12\x0e\n\x06height\x18\x01 \x01(\x04\x12 \n\x18\x63ore_chain_locked_height\x18\x02 \x01(\r\x12\r\n\x05\x65poch\x18\x03 \x01(\r\x12\x0f\n\x07time_ms\x18\x04 \x01(\x04\x12\x18\n\x10protocol_version\x18\x05 \x01(\r\x12\x10\n\x08\x63hain_id\x18\x06 \x01(\t\"L\n\x1dStateTransitionBroadcastError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\";\n\x1f\x42roadcastStateTransitionRequest\x12\x18\n\x10state_transition\x18\x01 \x01(\x0c\"\"\n BroadcastStateTransitionResponse\"\xa4\x01\n\x12GetIdentityRequest\x12P\n\x02v0\x18\x01 \x01(\x0b\x32\x42.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0H\x00\x1a\x31\n\x14GetIdentityRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc1\x01\n\x17GetIdentityNonceRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0H\x00\x1a?\n\x19GetIdentityNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xf6\x01\n\x1fGetIdentityContractNonceRequest\x12j\n\x02v0\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0H\x00\x1a\\\n!GetIdentityContractNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x13\n\x0b\x63ontract_id\x18\x02 \x01(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xc0\x01\n\x19GetIdentityBalanceRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0H\x00\x1a\x38\n\x1bGetIdentityBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xec\x01\n$GetIdentityBalanceAndRevisionRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0H\x00\x1a\x43\n&GetIdentityBalanceAndRevisionRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9e\x02\n\x13GetIdentityResponse\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0H\x00\x1a\xa7\x01\n\x15GetIdentityResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb8\x02\n\x18GetIdentityNonceResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0H\x00\x1a\xb2\x01\n\x1aGetIdentityNonceResponseV0\x12\x18\n\x0eidentity_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xe1\x02\n GetIdentityContractNonceResponse\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0H\x00\x1a\xc3\x01\n\"GetIdentityContractNonceResponseV0\x12!\n\x17identity_contract_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x02\n\x1aGetIdentityBalanceResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0H\x00\x1a\xad\x01\n\x1cGetIdentityBalanceResponseV0\x12\x11\n\x07\x62\x61lance\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xa9\x04\n%GetIdentityBalanceAndRevisionResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0H\x00\x1a\xfc\x02\n\'GetIdentityBalanceAndRevisionResponseV0\x12\x9b\x01\n\x14\x62\x61lance_and_revision\x18\x01 \x01(\x0b\x32{.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevisionH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x12\x42\x61lanceAndRevision\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\x12\x10\n\x08revision\x18\x02 \x01(\x04\x42\x08\n\x06resultB\t\n\x07version\"\xd1\x01\n\x0eKeyRequestType\x12\x36\n\x08\x61ll_keys\x18\x01 \x01(\x0b\x32\".org.dash.platform.dapi.v0.AllKeysH\x00\x12@\n\rspecific_keys\x18\x02 \x01(\x0b\x32\'.org.dash.platform.dapi.v0.SpecificKeysH\x00\x12:\n\nsearch_key\x18\x03 \x01(\x0b\x32$.org.dash.platform.dapi.v0.SearchKeyH\x00\x42\t\n\x07request\"\t\n\x07\x41llKeys\"\x1f\n\x0cSpecificKeys\x12\x0f\n\x07key_ids\x18\x01 \x03(\r\"\xb6\x01\n\tSearchKey\x12I\n\x0bpurpose_map\x18\x01 \x03(\x0b\x32\x34.org.dash.platform.dapi.v0.SearchKey.PurposeMapEntry\x1a^\n\x0fPurposeMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12:\n\x05value\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.SecurityLevelMap:\x02\x38\x01\"\xbf\x02\n\x10SecurityLevelMap\x12]\n\x12security_level_map\x18\x01 \x03(\x0b\x32\x41.org.dash.platform.dapi.v0.SecurityLevelMap.SecurityLevelMapEntry\x1aw\n\x15SecurityLevelMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12M\n\x05value\x18\x02 \x01(\x0e\x32>.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType:\x02\x38\x01\"S\n\x12KeyKindRequestType\x12\x1f\n\x1b\x43URRENT_KEY_OF_KIND_REQUEST\x10\x00\x12\x1c\n\x18\x41LL_KEYS_OF_KIND_REQUEST\x10\x01\"\xda\x02\n\x16GetIdentityKeysRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0H\x00\x1a\xda\x01\n\x18GetIdentityKeysRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12?\n\x0crequest_type\x18\x02 \x01(\x0b\x32).org.dash.platform.dapi.v0.KeyRequestType\x12+\n\x05limit\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\x99\x03\n\x17GetIdentityKeysResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0H\x00\x1a\x96\x02\n\x19GetIdentityKeysResponseV0\x12\x61\n\x04keys\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.KeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1a\n\x04Keys\x12\x12\n\nkeys_bytes\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xef\x02\n GetIdentitiesContractKeysRequest\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0H\x00\x1a\xd1\x01\n\"GetIdentitiesContractKeysRequestV0\x12\x16\n\x0eidentities_ids\x18\x01 \x03(\x0c\x12\x13\n\x0b\x63ontract_id\x18\x02 \x01(\x0c\x12\x1f\n\x12\x64ocument_type_name\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x37\n\x08purposes\x18\x04 \x03(\x0e\x32%.org.dash.platform.dapi.v0.KeyPurpose\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\x15\n\x13_document_type_nameB\t\n\x07version\"\xdf\x06\n!GetIdentitiesContractKeysResponse\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0H\x00\x1a\xbe\x05\n#GetIdentitiesContractKeysResponseV0\x12\x8a\x01\n\x0fidentities_keys\x18\x01 \x01(\x0b\x32o.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1aY\n\x0bPurposeKeys\x12\x36\n\x07purpose\x18\x01 \x01(\x0e\x32%.org.dash.platform.dapi.v0.KeyPurpose\x12\x12\n\nkeys_bytes\x18\x02 \x03(\x0c\x1a\x9f\x01\n\x0cIdentityKeys\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12z\n\x04keys\x18\x02 \x03(\x0b\x32l.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys\x1a\x90\x01\n\x0eIdentitiesKeys\x12~\n\x07\x65ntries\x18\x01 \x03(\x0b\x32m.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeysB\x08\n\x06resultB\t\n\x07version\"\x95\x02\n*GetEvonodesProposedEpochBlocksByIdsRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0H\x00\x1aY\n,GetEvonodesProposedEpochBlocksByIdsRequestV0\x12\r\n\x05\x65poch\x18\x01 \x01(\r\x12\x0b\n\x03ids\x18\x02 \x03(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\x8e\x06\n&GetEvonodesProposedEpochBlocksResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0H\x00\x1a\xde\x04\n(GetEvonodesProposedEpochBlocksResponseV0\x12\xb1\x01\n#evonodes_proposed_block_counts_info\x18\x01 \x01(\x0b\x32\x81\x01.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocksH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a;\n\x15\x45vonodeProposedBlocks\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\x04\x1a\xc4\x01\n\x16\x45vonodesProposedBlocks\x12\xa9\x01\n\x1e\x65vonodes_proposed_block_counts\x18\x01 \x03(\x0b\x32\x80\x01.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocksB\x08\n\x06resultB\t\n\x07version\"\xe3\x02\n,GetEvonodesProposedEpochBlocksByRangeRequest\x12\x84\x01\n\x02v0\x18\x01 \x01(\x0b\x32v.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0H\x00\x1a\xa0\x01\n.GetEvonodesProposedEpochBlocksByRangeRequestV0\x12\r\n\x05\x65poch\x18\x01 \x01(\r\x12\x12\n\x05limit\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x0bstart_after\x18\x03 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x04 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\x07\n\x05startB\x08\n\x06_limitB\t\n\x07version\"\x9d\x03\n\x1cGetIdentitiesBalancesRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0H\x00\x1a\x8b\x02\n\x1eGetIdentitiesBalancesRequestV0\x12\x96\x01\n\x0eidentities_ids\x18\x01 \x01(\x0b\x32~.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds\x12\r\n\x05prove\x18\x02 \x01(\x08\x1a\x41\n\'GetIdentitiesBalancesByKnownIdentityIds\x12\x16\n\x0eidentities_ids\x18\x01 \x03(\x0c\x42\t\n\x07version\"\x9b\x05\n\x1dGetIdentitiesBalancesResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0H\x00\x1a\x86\x04\n\x1fGetIdentitiesBalancesResponseV0\x12\x8a\x01\n\x13identities_balances\x18\x01 \x01(\x0b\x32k.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalancesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1aH\n\x0fIdentityBalance\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x14\n\x07\x62\x61lance\x18\x02 \x01(\x04H\x00\x88\x01\x01\x42\n\n\x08_balance\x1a\x8f\x01\n\x12IdentitiesBalances\x12y\n\x07\x65ntries\x18\x01 \x03(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalanceB\x08\n\x06resultB\t\n\x07version\"\xcb\x0b\n\x10GetProofsRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0H\x00\x1a\xdd\n\n\x12GetProofsRequestV0\x12\x62\n\nidentities\x18\x01 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest\x12\x61\n\tcontracts\x18\x02 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest\x12\x61\n\tdocuments\x18\x03 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest\x12_\n\x05votes\x18\x04 \x03(\x0b\x32P.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest\x1a\xd5\x02\n\x0f\x44ocumentRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12#\n\x1b\x64ocument_type_keeps_history\x18\x03 \x01(\x08\x12\x13\n\x0b\x64ocument_id\x18\x04 \x01(\x0c\x12\x89\x01\n\x19\x64ocument_contested_status\x18\x05 \x01(\x0e\x32\x66.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus\"P\n\x17\x44ocumentContestedStatus\x12\x11\n\rNOT_CONTESTED\x10\x00\x12\x13\n\x0fMAYBE_CONTESTED\x10\x01\x12\r\n\tCONTESTED\x10\x02\x1a\xd1\x01\n\x0fIdentityRequest\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12i\n\x0crequest_type\x18\x02 \x01(\x0e\x32S.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type\">\n\x04Type\x12\x11\n\rFULL_IDENTITY\x10\x00\x12\x0b\n\x07\x42\x41LANCE\x10\x01\x12\x08\n\x04KEYS\x10\x02\x12\x0c\n\x08REVISION\x10\x03\x1a&\n\x0f\x43ontractRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x1a\xe7\x02\n\x11VoteStatusRequest\x12\xa5\x01\n&contested_resource_vote_status_request\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequestH\x00\x1a\x99\x01\n\"ContestedResourceVoteStatusRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x14\n\x0cindex_values\x18\x04 \x03(\x0c\x12\x18\n\x10voter_identifier\x18\x05 \x01(\x0c\x42\x0e\n\x0crequest_typeB\t\n\x07version\"\x82\x02\n\x11GetProofsResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0H\x00\x1a\x91\x01\n\x13GetProofsResponseV0\x12\x31\n\x05proof\x18\x01 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb4\x01\n\x16GetDataContractRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0H\x00\x1a\x35\n\x18GetDataContractRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xb3\x02\n\x17GetDataContractResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0H\x00\x1a\xb0\x01\n\x19GetDataContractResponseV0\x12\x17\n\rdata_contract\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x01\n\x17GetDataContractsRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0H\x00\x1a\x37\n\x19GetDataContractsRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xcf\x04\n\x18GetDataContractsResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0H\x00\x1a[\n\x11\x44\x61taContractEntry\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x32\n\rdata_contract\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1au\n\rDataContracts\x12\x64\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32\x45.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry\x1a\xf5\x01\n\x1aGetDataContractsResponseV0\x12[\n\x0e\x64\x61ta_contracts\x18\x01 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc1\x02\n\x1dGetDataContractHistoryRequest\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0H\x00\x1a\xac\x01\n\x1fGetDataContractHistoryRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x13\n\x0bstart_at_ms\x18\x04 \x01(\x04\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\xae\x05\n\x1eGetDataContractHistoryResponse\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0H\x00\x1a\x96\x04\n GetDataContractHistoryResponseV0\x12\x8f\x01\n\x15\x64\x61ta_contract_history\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x18\x44\x61taContractHistoryEntry\x12\x0c\n\x04\x64\x61te\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\x0c\x1a\xaa\x01\n\x13\x44\x61taContractHistory\x12\x92\x01\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32s.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntryB\x08\n\x06resultB\t\n\x07version\"\xb2\x02\n\x13GetDocumentsRequest\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0H\x00\x1a\xbb\x01\n\x15GetDocumentsRequestV0\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12\r\n\x05where\x18\x03 \x01(\x0c\x12\x10\n\x08order_by\x18\x04 \x01(\x0c\x12\r\n\x05limit\x18\x05 \x01(\r\x12\x15\n\x0bstart_after\x18\x06 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x07 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x08 \x01(\x08\x42\x07\n\x05startB\t\n\x07version\"\x95\x03\n\x14GetDocumentsResponse\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0H\x00\x1a\x9b\x02\n\x16GetDocumentsResponseV0\x12\x65\n\tdocuments\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.DocumentsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1e\n\tDocuments\x12\x11\n\tdocuments\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xed\x01\n!GetIdentityByPublicKeyHashRequest\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0H\x00\x1aM\n#GetIdentityByPublicKeyHashRequestV0\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x02\n\"GetIdentityByPublicKeyHashResponse\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0H\x00\x1a\xb6\x01\n$GetIdentityByPublicKeyHashResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xfb\x01\n#WaitForStateTransitionResultRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0H\x00\x1aU\n%WaitForStateTransitionResultRequestV0\x12\x1d\n\x15state_transition_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x99\x03\n$WaitForStateTransitionResultResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0H\x00\x1a\xef\x01\n&WaitForStateTransitionResultResponseV0\x12I\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x38.org.dash.platform.dapi.v0.StateTransitionBroadcastErrorH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x19GetConsensusParamsRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0H\x00\x1a<\n\x1bGetConsensusParamsRequestV0\x12\x0e\n\x06height\x18\x01 \x01(\x05\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9c\x04\n\x1aGetConsensusParamsResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0H\x00\x1aP\n\x14\x43onsensusParamsBlock\x12\x11\n\tmax_bytes\x18\x01 \x01(\t\x12\x0f\n\x07max_gas\x18\x02 \x01(\t\x12\x14\n\x0ctime_iota_ms\x18\x03 \x01(\t\x1a\x62\n\x17\x43onsensusParamsEvidence\x12\x1a\n\x12max_age_num_blocks\x18\x01 \x01(\t\x12\x18\n\x10max_age_duration\x18\x02 \x01(\t\x12\x11\n\tmax_bytes\x18\x03 \x01(\t\x1a\xda\x01\n\x1cGetConsensusParamsResponseV0\x12Y\n\x05\x62lock\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock\x12_\n\x08\x65vidence\x18\x02 \x01(\x0b\x32M.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidenceB\t\n\x07version\"\xe4\x01\n%GetProtocolVersionUpgradeStateRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0H\x00\x1a\x38\n\'GetProtocolVersionUpgradeStateRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xb5\x05\n&GetProtocolVersionUpgradeStateResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0H\x00\x1a\x85\x04\n(GetProtocolVersionUpgradeStateResponseV0\x12\x87\x01\n\x08versions\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x96\x01\n\x08Versions\x12\x89\x01\n\x08versions\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry\x1a:\n\x0cVersionEntry\x12\x16\n\x0eversion_number\x18\x01 \x01(\r\x12\x12\n\nvote_count\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xa3\x02\n*GetProtocolVersionUpgradeVoteStatusRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0H\x00\x1ag\n,GetProtocolVersionUpgradeVoteStatusRequestV0\x12\x19\n\x11start_pro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xef\x05\n+GetProtocolVersionUpgradeVoteStatusResponse\x12\x82\x01\n\x02v0\x18\x01 \x01(\x0b\x32t.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0H\x00\x1a\xaf\x04\n-GetProtocolVersionUpgradeVoteStatusResponseV0\x12\x98\x01\n\x08versions\x18\x01 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignalsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xaf\x01\n\x0eVersionSignals\x12\x9c\x01\n\x0fversion_signals\x18\x01 \x03(\x0b\x32\x82\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal\x1a\x35\n\rVersionSignal\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07version\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xf5\x01\n\x14GetEpochsInfoRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0H\x00\x1a|\n\x16GetEpochsInfoRequestV0\x12\x31\n\x0bstart_epoch\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x11\n\tascending\x18\x03 \x01(\x08\x12\r\n\x05prove\x18\x04 \x01(\x08\x42\t\n\x07version\"\x91\x05\n\x15GetEpochsInfoResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0H\x00\x1a\x94\x04\n\x17GetEpochsInfoResponseV0\x12\x65\n\x06\x65pochs\x18\x01 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfosH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1au\n\nEpochInfos\x12g\n\x0b\x65poch_infos\x18\x01 \x03(\x0b\x32R.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo\x1a\x9e\x01\n\tEpochInfo\x12\x0e\n\x06number\x18\x01 \x01(\r\x12\x1a\n\x12\x66irst_block_height\x18\x02 \x01(\x04\x12\x1f\n\x17\x66irst_core_block_height\x18\x03 \x01(\r\x12\x12\n\nstart_time\x18\x04 \x01(\x04\x12\x16\n\x0e\x66\x65\x65_multiplier\x18\x05 \x01(\x01\x12\x18\n\x10protocol_version\x18\x06 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xde\x04\n\x1cGetContestedResourcesRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0H\x00\x1a\xcc\x03\n\x1eGetContestedResourcesRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x1a\n\x12start_index_values\x18\x04 \x03(\x0c\x12\x18\n\x10\x65nd_index_values\x18\x05 \x03(\x0c\x12\x89\x01\n\x13start_at_value_info\x18\x06 \x01(\x0b\x32g.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfoH\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x07 \x01(\rH\x01\x88\x01\x01\x12\x17\n\x0forder_ascending\x18\x08 \x01(\x08\x12\r\n\x05prove\x18\t \x01(\x08\x1a\x45\n\x10StartAtValueInfo\x12\x13\n\x0bstart_value\x18\x01 \x01(\x0c\x12\x1c\n\x14start_value_included\x18\x02 \x01(\x08\x42\x16\n\x14_start_at_value_infoB\x08\n\x06_countB\t\n\x07version\"\x88\x04\n\x1dGetContestedResourcesResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0H\x00\x1a\xf3\x02\n\x1fGetContestedResourcesResponseV0\x12\x95\x01\n\x19\x63ontested_resource_values\x18\x01 \x01(\x0b\x32p.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValuesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a<\n\x17\x43ontestedResourceValues\x12!\n\x19\x63ontested_resource_values\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xca\x05\n\x1cGetVotePollsByEndDateRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0H\x00\x1a\xb8\x04\n\x1eGetVotePollsByEndDateRequestV0\x12\x84\x01\n\x0fstart_time_info\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfoH\x00\x88\x01\x01\x12\x80\x01\n\rend_time_info\x18\x02 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfoH\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x03 \x01(\rH\x02\x88\x01\x01\x12\x13\n\x06offset\x18\x04 \x01(\rH\x03\x88\x01\x01\x12\x11\n\tascending\x18\x05 \x01(\x08\x12\r\n\x05prove\x18\x06 \x01(\x08\x1a\x45\n\x0fStartAtTimeInfo\x12\x15\n\rstart_time_ms\x18\x01 \x01(\x04\x12\x1b\n\x13start_time_included\x18\x02 \x01(\x08\x1a?\n\rEndAtTimeInfo\x12\x13\n\x0b\x65nd_time_ms\x18\x01 \x01(\x04\x12\x19\n\x11\x65nd_time_included\x18\x02 \x01(\x08\x42\x12\n\x10_start_time_infoB\x10\n\x0e_end_time_infoB\x08\n\x06_limitB\t\n\x07_offsetB\t\n\x07version\"\xff\x05\n\x1dGetVotePollsByEndDateResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0H\x00\x1a\xea\x04\n\x1fGetVotePollsByEndDateResponseV0\x12\x9c\x01\n\x18vote_polls_by_timestamps\x18\x01 \x01(\x0b\x32x.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestampsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1aR\n\x1eSerializedVotePollsByTimestamp\x12\x11\n\ttimestamp\x18\x01 \x01(\x04\x12\x1d\n\x15serialized_vote_polls\x18\x02 \x03(\x0c\x1a\xd7\x01\n\x1fSerializedVotePollsByTimestamps\x12\x99\x01\n\x18vote_polls_by_timestamps\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp\x12\x18\n\x10\x66inished_results\x18\x02 \x01(\x08\x42\x08\n\x06resultB\t\n\x07version\"\xff\x06\n$GetContestedResourceVoteStateRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0H\x00\x1a\xd5\x05\n&GetContestedResourceVoteStateRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x14\n\x0cindex_values\x18\x04 \x03(\x0c\x12\x86\x01\n\x0bresult_type\x18\x05 \x01(\x0e\x32q.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType\x12\x36\n.allow_include_locked_and_abstaining_vote_tally\x18\x06 \x01(\x08\x12\xa3\x01\n\x18start_at_identifier_info\x18\x07 \x01(\x0b\x32|.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfoH\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x08 \x01(\rH\x01\x88\x01\x01\x12\r\n\x05prove\x18\t \x01(\x08\x1aT\n\x15StartAtIdentifierInfo\x12\x18\n\x10start_identifier\x18\x01 \x01(\x0c\x12!\n\x19start_identifier_included\x18\x02 \x01(\x08\"I\n\nResultType\x12\r\n\tDOCUMENTS\x10\x00\x12\x0e\n\nVOTE_TALLY\x10\x01\x12\x1c\n\x18\x44OCUMENTS_AND_VOTE_TALLY\x10\x02\x42\x1b\n\x19_start_at_identifier_infoB\x08\n\x06_countB\t\n\x07version\"\x8c\x0c\n%GetContestedResourceVoteStateResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0H\x00\x1a\xdf\n\n\'GetContestedResourceVoteStateResponseV0\x12\xae\x01\n\x1d\x63ontested_resource_contenders\x18\x01 \x01(\x0b\x32\x84\x01.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContendersH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xd2\x03\n\x10\x46inishedVoteInfo\x12\xad\x01\n\x15\x66inished_vote_outcome\x18\x01 \x01(\x0e\x32\x8d\x01.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome\x12\x1f\n\x12won_by_identity_id\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12 \n\x18\x66inished_at_block_height\x18\x03 \x01(\x04\x12%\n\x1d\x66inished_at_core_block_height\x18\x04 \x01(\r\x12!\n\x19\x66inished_at_block_time_ms\x18\x05 \x01(\x04\x12\x19\n\x11\x66inished_at_epoch\x18\x06 \x01(\r\"O\n\x13\x46inishedVoteOutcome\x12\x14\n\x10TOWARDS_IDENTITY\x10\x00\x12\n\n\x06LOCKED\x10\x01\x12\x16\n\x12NO_PREVIOUS_WINNER\x10\x02\x42\x15\n\x13_won_by_identity_id\x1a\xc4\x03\n\x1b\x43ontestedResourceContenders\x12\x86\x01\n\ncontenders\x18\x01 \x03(\x0b\x32r.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender\x12\x1f\n\x12\x61\x62stain_vote_tally\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x1c\n\x0flock_vote_tally\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x9a\x01\n\x12\x66inished_vote_info\x18\x04 \x01(\x0b\x32y.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfoH\x02\x88\x01\x01\x42\x15\n\x13_abstain_vote_tallyB\x12\n\x10_lock_vote_tallyB\x15\n\x13_finished_vote_info\x1ak\n\tContender\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x17\n\nvote_count\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08\x64ocument\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x42\r\n\x0b_vote_countB\x0b\n\t_documentB\x08\n\x06resultB\t\n\x07version\"\xd5\x05\n,GetContestedResourceVotersForIdentityRequest\x12\x84\x01\n\x02v0\x18\x01 \x01(\x0b\x32v.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0H\x00\x1a\x92\x04\n.GetContestedResourceVotersForIdentityRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x14\n\x0cindex_values\x18\x04 \x03(\x0c\x12\x15\n\rcontestant_id\x18\x05 \x01(\x0c\x12\xb4\x01\n\x18start_at_identifier_info\x18\x06 \x01(\x0b\x32\x8c\x01.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfoH\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x07 \x01(\rH\x01\x88\x01\x01\x12\x17\n\x0forder_ascending\x18\x08 \x01(\x08\x12\r\n\x05prove\x18\t \x01(\x08\x1aT\n\x15StartAtIdentifierInfo\x12\x18\n\x10start_identifier\x18\x01 \x01(\x0c\x12!\n\x19start_identifier_included\x18\x02 \x01(\x08\x42\x1b\n\x19_start_at_identifier_infoB\x08\n\x06_countB\t\n\x07version\"\xf1\x04\n-GetContestedResourceVotersForIdentityResponse\x12\x86\x01\n\x02v0\x18\x01 \x01(\x0b\x32x.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0H\x00\x1a\xab\x03\n/GetContestedResourceVotersForIdentityResponseV0\x12\xb6\x01\n\x19\x63ontested_resource_voters\x18\x01 \x01(\x0b\x32\x90\x01.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVotersH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x43\n\x17\x43ontestedResourceVoters\x12\x0e\n\x06voters\x18\x01 \x03(\x0c\x12\x18\n\x10\x66inished_results\x18\x02 \x01(\x08\x42\x08\n\x06resultB\t\n\x07version\"\xad\x05\n(GetContestedResourceIdentityVotesRequest\x12|\n\x02v0\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0H\x00\x1a\xf7\x03\n*GetContestedResourceIdentityVotesRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x17\n\x0forder_ascending\x18\x04 \x01(\x08\x12\xae\x01\n\x1astart_at_vote_poll_id_info\x18\x05 \x01(\x0b\x32\x84\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfoH\x00\x88\x01\x01\x12\r\n\x05prove\x18\x06 \x01(\x08\x1a\x61\n\x15StartAtVotePollIdInfo\x12 \n\x18start_at_poll_identifier\x18\x01 \x01(\x0c\x12&\n\x1estart_poll_identifier_included\x18\x02 \x01(\x08\x42\x1d\n\x1b_start_at_vote_poll_id_infoB\t\n\x07version\"\xc8\n\n)GetContestedResourceIdentityVotesResponse\x12~\n\x02v0\x18\x01 \x01(\x0b\x32p.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0H\x00\x1a\x8f\t\n+GetContestedResourceIdentityVotesResponseV0\x12\xa1\x01\n\x05votes\x18\x01 \x01(\x0b\x32\x8f\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xf7\x01\n\x1e\x43ontestedResourceIdentityVotes\x12\xba\x01\n!contested_resource_identity_votes\x18\x01 \x03(\x0b\x32\x8e\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote\x12\x18\n\x10\x66inished_results\x18\x02 \x01(\x08\x1a\xad\x02\n\x12ResourceVoteChoice\x12\xad\x01\n\x10vote_choice_type\x18\x01 \x01(\x0e\x32\x92\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType\x12\x18\n\x0bidentity_id\x18\x02 \x01(\x0cH\x00\x88\x01\x01\"=\n\x0eVoteChoiceType\x12\x14\n\x10TOWARDS_IDENTITY\x10\x00\x12\x0b\n\x07\x41\x42STAIN\x10\x01\x12\x08\n\x04LOCK\x10\x02\x42\x0e\n\x0c_identity_id\x1a\x95\x02\n\x1d\x43ontestedResourceIdentityVote\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\'\n\x1fserialized_index_storage_values\x18\x03 \x03(\x0c\x12\x99\x01\n\x0bvote_choice\x18\x04 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoiceB\x08\n\x06resultB\t\n\x07version\"\xf0\x01\n%GetPrefundedSpecializedBalanceRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0H\x00\x1a\x44\n\'GetPrefundedSpecializedBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xe9\x02\n&GetPrefundedSpecializedBalanceResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0H\x00\x1a\xb9\x01\n(GetPrefundedSpecializedBalanceResponseV0\x12\x11\n\x07\x62\x61lance\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xd0\x01\n GetTotalCreditsInPlatformRequest\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0H\x00\x1a\x33\n\"GetTotalCreditsInPlatformRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xd5\x02\n!GetTotalCreditsInPlatformResponse\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0H\x00\x1a\xb4\x01\n#GetTotalCreditsInPlatformResponseV0\x12\x11\n\x07\x63redits\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x16GetPathElementsRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0H\x00\x1a\x45\n\x18GetPathElementsRequestV0\x12\x0c\n\x04path\x18\x01 \x03(\x0c\x12\x0c\n\x04keys\x18\x02 \x03(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xa3\x03\n\x17GetPathElementsResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0H\x00\x1a\xa0\x02\n\x19GetPathElementsResponseV0\x12i\n\x08\x65lements\x18\x01 \x01(\x0b\x32U.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ElementsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1c\n\x08\x45lements\x12\x10\n\x08\x65lements\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\x81\x01\n\x10GetStatusRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0H\x00\x1a\x14\n\x12GetStatusRequestV0B\t\n\x07version\"\x9c\x10\n\x11GetStatusResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0H\x00\x1a\xab\x0f\n\x13GetStatusResponseV0\x12Y\n\x07version\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version\x12S\n\x04node\x18\x02 \x01(\x0b\x32\x45.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node\x12U\n\x05\x63hain\x18\x03 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain\x12Y\n\x07network\x18\x04 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network\x12^\n\nstate_sync\x18\x05 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync\x12S\n\x04time\x18\x06 \x01(\x0b\x32\x45.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time\x1a\xee\x04\n\x07Version\x12\x63\n\x08software\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software\x12\x63\n\x08protocol\x18\x02 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol\x1a^\n\x08Software\x12\x0c\n\x04\x64\x61pi\x18\x01 \x01(\t\x12\x12\n\x05\x64rive\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x17\n\ntenderdash\x18\x03 \x01(\tH\x01\x88\x01\x01\x42\x08\n\x06_driveB\r\n\x0b_tenderdash\x1a\xb8\x02\n\x08Protocol\x12p\n\ntenderdash\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash\x12\x66\n\x05\x64rive\x18\x02 \x01(\x0b\x32W.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive\x1a(\n\nTenderdash\x12\x0b\n\x03p2p\x18\x01 \x01(\r\x12\r\n\x05\x62lock\x18\x02 \x01(\r\x1a(\n\x05\x44rive\x12\x0e\n\x06latest\x18\x03 \x01(\r\x12\x0f\n\x07\x63urrent\x18\x04 \x01(\r\x1as\n\x04Time\x12\r\n\x05local\x18\x01 \x01(\x04\x12\x12\n\x05\x62lock\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07genesis\x18\x03 \x01(\x04H\x01\x88\x01\x01\x12\x12\n\x05\x65poch\x18\x04 \x01(\rH\x02\x88\x01\x01\x42\x08\n\x06_blockB\n\n\x08_genesisB\x08\n\x06_epoch\x1a<\n\x04Node\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x18\n\x0bpro_tx_hash\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0e\n\x0c_pro_tx_hash\x1a\xa7\x02\n\x05\x43hain\x12\x13\n\x0b\x63\x61tching_up\x18\x01 \x01(\x08\x12\x19\n\x11latest_block_hash\x18\x02 \x01(\x0c\x12\x17\n\x0flatest_app_hash\x18\x03 \x01(\x0c\x12\x1b\n\x13latest_block_height\x18\x04 \x01(\x04\x12\x1b\n\x13\x65\x61rliest_block_hash\x18\x05 \x01(\x0c\x12\x19\n\x11\x65\x61rliest_app_hash\x18\x06 \x01(\x0c\x12\x1d\n\x15\x65\x61rliest_block_height\x18\x07 \x01(\x04\x12\x1d\n\x15max_peer_block_height\x18\t \x01(\x04\x12%\n\x18\x63ore_chain_locked_height\x18\n \x01(\rH\x00\x88\x01\x01\x42\x1b\n\x19_core_chain_locked_height\x1a\x43\n\x07Network\x12\x10\n\x08\x63hain_id\x18\x01 \x01(\t\x12\x13\n\x0bpeers_count\x18\x02 \x01(\r\x12\x11\n\tlistening\x18\x03 \x01(\x08\x1a\xe9\x01\n\tStateSync\x12\x19\n\x11total_synced_time\x18\x01 \x01(\x04\x12\x16\n\x0eremaining_time\x18\x02 \x01(\x04\x12\x17\n\x0ftotal_snapshots\x18\x03 \x01(\r\x12\x1e\n\x16\x63hunk_process_avg_time\x18\x04 \x01(\x04\x12\x17\n\x0fsnapshot_height\x18\x05 \x01(\x04\x12\x1d\n\x15snapshot_chunks_count\x18\x06 \x01(\x04\x12\x19\n\x11\x62\x61\x63kfilled_blocks\x18\x07 \x01(\x04\x12\x1d\n\x15\x62\x61\x63kfill_blocks_total\x18\x08 \x01(\x04\x42\t\n\x07version*Z\n\nKeyPurpose\x12\x12\n\x0e\x41UTHENTICATION\x10\x00\x12\x0e\n\nENCRYPTION\x10\x01\x12\x0e\n\nDECRYPTION\x10\x02\x12\x0c\n\x08TRANSFER\x10\x03\x12\n\n\x06VOTING\x10\x05\x32\x97#\n\x08Platform\x12\x93\x01\n\x18\x62roadcastStateTransition\x12:.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest\x1a;.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse\x12l\n\x0bgetIdentity\x12-.org.dash.platform.dapi.v0.GetIdentityRequest\x1a..org.dash.platform.dapi.v0.GetIdentityResponse\x12x\n\x0fgetIdentityKeys\x12\x31.org.dash.platform.dapi.v0.GetIdentityKeysRequest\x1a\x32.org.dash.platform.dapi.v0.GetIdentityKeysResponse\x12\x96\x01\n\x19getIdentitiesContractKeys\x12;.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest\x1a<.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse\x12{\n\x10getIdentityNonce\x12\x32.org.dash.platform.dapi.v0.GetIdentityNonceRequest\x1a\x33.org.dash.platform.dapi.v0.GetIdentityNonceResponse\x12\x93\x01\n\x18getIdentityContractNonce\x12:.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest\x1a;.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse\x12\x81\x01\n\x12getIdentityBalance\x12\x34.org.dash.platform.dapi.v0.GetIdentityBalanceRequest\x1a\x35.org.dash.platform.dapi.v0.GetIdentityBalanceResponse\x12\x8a\x01\n\x15getIdentitiesBalances\x12\x37.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest\x1a\x38.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse\x12\xa2\x01\n\x1dgetIdentityBalanceAndRevision\x12?.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest\x1a@.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse\x12\xaf\x01\n#getEvonodesProposedEpochBlocksByIds\x12\x45.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest\x1a\x41.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse\x12\xb3\x01\n%getEvonodesProposedEpochBlocksByRange\x12G.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest\x1a\x41.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse\x12\x66\n\tgetProofs\x12+.org.dash.platform.dapi.v0.GetProofsRequest\x1a,.org.dash.platform.dapi.v0.GetProofsResponse\x12x\n\x0fgetDataContract\x12\x31.org.dash.platform.dapi.v0.GetDataContractRequest\x1a\x32.org.dash.platform.dapi.v0.GetDataContractResponse\x12\x8d\x01\n\x16getDataContractHistory\x12\x38.org.dash.platform.dapi.v0.GetDataContractHistoryRequest\x1a\x39.org.dash.platform.dapi.v0.GetDataContractHistoryResponse\x12{\n\x10getDataContracts\x12\x32.org.dash.platform.dapi.v0.GetDataContractsRequest\x1a\x33.org.dash.platform.dapi.v0.GetDataContractsResponse\x12o\n\x0cgetDocuments\x12..org.dash.platform.dapi.v0.GetDocumentsRequest\x1a/.org.dash.platform.dapi.v0.GetDocumentsResponse\x12\x99\x01\n\x1agetIdentityByPublicKeyHash\x12<.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest\x1a=.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse\x12\x9f\x01\n\x1cwaitForStateTransitionResult\x12>.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest\x1a?.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse\x12\x81\x01\n\x12getConsensusParams\x12\x34.org.dash.platform.dapi.v0.GetConsensusParamsRequest\x1a\x35.org.dash.platform.dapi.v0.GetConsensusParamsResponse\x12\xa5\x01\n\x1egetProtocolVersionUpgradeState\x12@.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest\x1a\x41.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse\x12\xb4\x01\n#getProtocolVersionUpgradeVoteStatus\x12\x45.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest\x1a\x46.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse\x12r\n\rgetEpochsInfo\x12/.org.dash.platform.dapi.v0.GetEpochsInfoRequest\x1a\x30.org.dash.platform.dapi.v0.GetEpochsInfoResponse\x12\x8a\x01\n\x15getContestedResources\x12\x37.org.dash.platform.dapi.v0.GetContestedResourcesRequest\x1a\x38.org.dash.platform.dapi.v0.GetContestedResourcesResponse\x12\xa2\x01\n\x1dgetContestedResourceVoteState\x12?.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest\x1a@.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse\x12\xba\x01\n%getContestedResourceVotersForIdentity\x12G.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest\x1aH.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse\x12\xae\x01\n!getContestedResourceIdentityVotes\x12\x43.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest\x1a\x44.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse\x12\x8a\x01\n\x15getVotePollsByEndDate\x12\x37.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest\x1a\x38.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse\x12\xa5\x01\n\x1egetPrefundedSpecializedBalance\x12@.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest\x1a\x41.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse\x12\x96\x01\n\x19getTotalCreditsInPlatform\x12;.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest\x1a<.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse\x12x\n\x0fgetPathElements\x12\x31.org.dash.platform.dapi.v0.GetPathElementsRequest\x1a\x32.org.dash.platform.dapi.v0.GetPathElementsResponse\x12\x66\n\tgetStatus\x12+.org.dash.platform.dapi.v0.GetStatusRequest\x1a,.org.dash.platform.dapi.v0.GetStatusResponseb\x06proto3' + serialized_pb=b'\n\x0eplatform.proto\x12\x19org.dash.platform.dapi.v0\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\x81\x01\n\x05Proof\x12\x15\n\rgrovedb_proof\x18\x01 \x01(\x0c\x12\x13\n\x0bquorum_hash\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\x12\r\n\x05round\x18\x04 \x01(\r\x12\x15\n\rblock_id_hash\x18\x05 \x01(\x0c\x12\x13\n\x0bquorum_type\x18\x06 \x01(\r\"\x90\x01\n\x10ResponseMetadata\x12\x0e\n\x06height\x18\x01 \x01(\x04\x12 \n\x18\x63ore_chain_locked_height\x18\x02 \x01(\r\x12\r\n\x05\x65poch\x18\x03 \x01(\r\x12\x0f\n\x07time_ms\x18\x04 \x01(\x04\x12\x18\n\x10protocol_version\x18\x05 \x01(\r\x12\x10\n\x08\x63hain_id\x18\x06 \x01(\t\"L\n\x1dStateTransitionBroadcastError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\";\n\x1f\x42roadcastStateTransitionRequest\x12\x18\n\x10state_transition\x18\x01 \x01(\x0c\"\"\n BroadcastStateTransitionResponse\"\xa4\x01\n\x12GetIdentityRequest\x12P\n\x02v0\x18\x01 \x01(\x0b\x32\x42.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0H\x00\x1a\x31\n\x14GetIdentityRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc1\x01\n\x17GetIdentityNonceRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0H\x00\x1a?\n\x19GetIdentityNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xf6\x01\n\x1fGetIdentityContractNonceRequest\x12j\n\x02v0\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0H\x00\x1a\\\n!GetIdentityContractNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x13\n\x0b\x63ontract_id\x18\x02 \x01(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xc0\x01\n\x19GetIdentityBalanceRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0H\x00\x1a\x38\n\x1bGetIdentityBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xec\x01\n$GetIdentityBalanceAndRevisionRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0H\x00\x1a\x43\n&GetIdentityBalanceAndRevisionRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9e\x02\n\x13GetIdentityResponse\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0H\x00\x1a\xa7\x01\n\x15GetIdentityResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb8\x02\n\x18GetIdentityNonceResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0H\x00\x1a\xb2\x01\n\x1aGetIdentityNonceResponseV0\x12\x18\n\x0eidentity_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xe1\x02\n GetIdentityContractNonceResponse\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0H\x00\x1a\xc3\x01\n\"GetIdentityContractNonceResponseV0\x12!\n\x17identity_contract_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x02\n\x1aGetIdentityBalanceResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0H\x00\x1a\xad\x01\n\x1cGetIdentityBalanceResponseV0\x12\x11\n\x07\x62\x61lance\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xa9\x04\n%GetIdentityBalanceAndRevisionResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0H\x00\x1a\xfc\x02\n\'GetIdentityBalanceAndRevisionResponseV0\x12\x9b\x01\n\x14\x62\x61lance_and_revision\x18\x01 \x01(\x0b\x32{.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevisionH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x12\x42\x61lanceAndRevision\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\x12\x10\n\x08revision\x18\x02 \x01(\x04\x42\x08\n\x06resultB\t\n\x07version\"\xd1\x01\n\x0eKeyRequestType\x12\x36\n\x08\x61ll_keys\x18\x01 \x01(\x0b\x32\".org.dash.platform.dapi.v0.AllKeysH\x00\x12@\n\rspecific_keys\x18\x02 \x01(\x0b\x32\'.org.dash.platform.dapi.v0.SpecificKeysH\x00\x12:\n\nsearch_key\x18\x03 \x01(\x0b\x32$.org.dash.platform.dapi.v0.SearchKeyH\x00\x42\t\n\x07request\"\t\n\x07\x41llKeys\"\x1f\n\x0cSpecificKeys\x12\x0f\n\x07key_ids\x18\x01 \x03(\r\"\xb6\x01\n\tSearchKey\x12I\n\x0bpurpose_map\x18\x01 \x03(\x0b\x32\x34.org.dash.platform.dapi.v0.SearchKey.PurposeMapEntry\x1a^\n\x0fPurposeMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12:\n\x05value\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.SecurityLevelMap:\x02\x38\x01\"\xbf\x02\n\x10SecurityLevelMap\x12]\n\x12security_level_map\x18\x01 \x03(\x0b\x32\x41.org.dash.platform.dapi.v0.SecurityLevelMap.SecurityLevelMapEntry\x1aw\n\x15SecurityLevelMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12M\n\x05value\x18\x02 \x01(\x0e\x32>.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType:\x02\x38\x01\"S\n\x12KeyKindRequestType\x12\x1f\n\x1b\x43URRENT_KEY_OF_KIND_REQUEST\x10\x00\x12\x1c\n\x18\x41LL_KEYS_OF_KIND_REQUEST\x10\x01\"\xda\x02\n\x16GetIdentityKeysRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0H\x00\x1a\xda\x01\n\x18GetIdentityKeysRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12?\n\x0crequest_type\x18\x02 \x01(\x0b\x32).org.dash.platform.dapi.v0.KeyRequestType\x12+\n\x05limit\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\x99\x03\n\x17GetIdentityKeysResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0H\x00\x1a\x96\x02\n\x19GetIdentityKeysResponseV0\x12\x61\n\x04keys\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.KeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1a\n\x04Keys\x12\x12\n\nkeys_bytes\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xef\x02\n GetIdentitiesContractKeysRequest\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0H\x00\x1a\xd1\x01\n\"GetIdentitiesContractKeysRequestV0\x12\x16\n\x0eidentities_ids\x18\x01 \x03(\x0c\x12\x13\n\x0b\x63ontract_id\x18\x02 \x01(\x0c\x12\x1f\n\x12\x64ocument_type_name\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x37\n\x08purposes\x18\x04 \x03(\x0e\x32%.org.dash.platform.dapi.v0.KeyPurpose\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\x15\n\x13_document_type_nameB\t\n\x07version\"\xdf\x06\n!GetIdentitiesContractKeysResponse\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0H\x00\x1a\xbe\x05\n#GetIdentitiesContractKeysResponseV0\x12\x8a\x01\n\x0fidentities_keys\x18\x01 \x01(\x0b\x32o.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1aY\n\x0bPurposeKeys\x12\x36\n\x07purpose\x18\x01 \x01(\x0e\x32%.org.dash.platform.dapi.v0.KeyPurpose\x12\x12\n\nkeys_bytes\x18\x02 \x03(\x0c\x1a\x9f\x01\n\x0cIdentityKeys\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12z\n\x04keys\x18\x02 \x03(\x0b\x32l.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys\x1a\x90\x01\n\x0eIdentitiesKeys\x12~\n\x07\x65ntries\x18\x01 \x03(\x0b\x32m.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeysB\x08\n\x06resultB\t\n\x07version\"\xa4\x02\n*GetEvonodesProposedEpochBlocksByIdsRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0H\x00\x1ah\n,GetEvonodesProposedEpochBlocksByIdsRequestV0\x12\x12\n\x05\x65poch\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x0b\n\x03ids\x18\x02 \x03(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\x08\n\x06_epochB\t\n\x07version\"\x8e\x06\n&GetEvonodesProposedEpochBlocksResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0H\x00\x1a\xde\x04\n(GetEvonodesProposedEpochBlocksResponseV0\x12\xb1\x01\n#evonodes_proposed_block_counts_info\x18\x01 \x01(\x0b\x32\x81\x01.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocksH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a;\n\x15\x45vonodeProposedBlocks\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\x04\x1a\xc4\x01\n\x16\x45vonodesProposedBlocks\x12\xa9\x01\n\x1e\x65vonodes_proposed_block_counts\x18\x01 \x03(\x0b\x32\x80\x01.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocksB\x08\n\x06resultB\t\n\x07version\"\xf2\x02\n,GetEvonodesProposedEpochBlocksByRangeRequest\x12\x84\x01\n\x02v0\x18\x01 \x01(\x0b\x32v.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0H\x00\x1a\xaf\x01\n.GetEvonodesProposedEpochBlocksByRangeRequestV0\x12\x12\n\x05\x65poch\x18\x01 \x01(\rH\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\rH\x02\x88\x01\x01\x12\x15\n\x0bstart_after\x18\x03 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x04 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\x07\n\x05startB\x08\n\x06_epochB\x08\n\x06_limitB\t\n\x07version\"\xcd\x01\n\x1cGetIdentitiesBalancesRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0H\x00\x1a<\n\x1eGetIdentitiesBalancesRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9b\x05\n\x1dGetIdentitiesBalancesResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0H\x00\x1a\x86\x04\n\x1fGetIdentitiesBalancesResponseV0\x12\x8a\x01\n\x13identities_balances\x18\x01 \x01(\x0b\x32k.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalancesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1aH\n\x0fIdentityBalance\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x14\n\x07\x62\x61lance\x18\x02 \x01(\x04H\x00\x88\x01\x01\x42\n\n\x08_balance\x1a\x8f\x01\n\x12IdentitiesBalances\x12y\n\x07\x65ntries\x18\x01 \x03(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalanceB\x08\n\x06resultB\t\n\x07version\"\xcb\x0b\n\x10GetProofsRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0H\x00\x1a\xdd\n\n\x12GetProofsRequestV0\x12\x62\n\nidentities\x18\x01 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest\x12\x61\n\tcontracts\x18\x02 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest\x12\x61\n\tdocuments\x18\x03 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest\x12_\n\x05votes\x18\x04 \x03(\x0b\x32P.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest\x1a\xd5\x02\n\x0f\x44ocumentRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12#\n\x1b\x64ocument_type_keeps_history\x18\x03 \x01(\x08\x12\x13\n\x0b\x64ocument_id\x18\x04 \x01(\x0c\x12\x89\x01\n\x19\x64ocument_contested_status\x18\x05 \x01(\x0e\x32\x66.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus\"P\n\x17\x44ocumentContestedStatus\x12\x11\n\rNOT_CONTESTED\x10\x00\x12\x13\n\x0fMAYBE_CONTESTED\x10\x01\x12\r\n\tCONTESTED\x10\x02\x1a\xd1\x01\n\x0fIdentityRequest\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12i\n\x0crequest_type\x18\x02 \x01(\x0e\x32S.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type\">\n\x04Type\x12\x11\n\rFULL_IDENTITY\x10\x00\x12\x0b\n\x07\x42\x41LANCE\x10\x01\x12\x08\n\x04KEYS\x10\x02\x12\x0c\n\x08REVISION\x10\x03\x1a&\n\x0f\x43ontractRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x1a\xe7\x02\n\x11VoteStatusRequest\x12\xa5\x01\n&contested_resource_vote_status_request\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequestH\x00\x1a\x99\x01\n\"ContestedResourceVoteStatusRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x14\n\x0cindex_values\x18\x04 \x03(\x0c\x12\x18\n\x10voter_identifier\x18\x05 \x01(\x0c\x42\x0e\n\x0crequest_typeB\t\n\x07version\"\x82\x02\n\x11GetProofsResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0H\x00\x1a\x91\x01\n\x13GetProofsResponseV0\x12\x31\n\x05proof\x18\x01 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb4\x01\n\x16GetDataContractRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0H\x00\x1a\x35\n\x18GetDataContractRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xb3\x02\n\x17GetDataContractResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0H\x00\x1a\xb0\x01\n\x19GetDataContractResponseV0\x12\x17\n\rdata_contract\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x01\n\x17GetDataContractsRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0H\x00\x1a\x37\n\x19GetDataContractsRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xcf\x04\n\x18GetDataContractsResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0H\x00\x1a[\n\x11\x44\x61taContractEntry\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x32\n\rdata_contract\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1au\n\rDataContracts\x12\x64\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32\x45.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry\x1a\xf5\x01\n\x1aGetDataContractsResponseV0\x12[\n\x0e\x64\x61ta_contracts\x18\x01 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc1\x02\n\x1dGetDataContractHistoryRequest\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0H\x00\x1a\xac\x01\n\x1fGetDataContractHistoryRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x13\n\x0bstart_at_ms\x18\x04 \x01(\x04\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\xae\x05\n\x1eGetDataContractHistoryResponse\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0H\x00\x1a\x96\x04\n GetDataContractHistoryResponseV0\x12\x8f\x01\n\x15\x64\x61ta_contract_history\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x18\x44\x61taContractHistoryEntry\x12\x0c\n\x04\x64\x61te\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\x0c\x1a\xaa\x01\n\x13\x44\x61taContractHistory\x12\x92\x01\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32s.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntryB\x08\n\x06resultB\t\n\x07version\"\xb2\x02\n\x13GetDocumentsRequest\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0H\x00\x1a\xbb\x01\n\x15GetDocumentsRequestV0\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12\r\n\x05where\x18\x03 \x01(\x0c\x12\x10\n\x08order_by\x18\x04 \x01(\x0c\x12\r\n\x05limit\x18\x05 \x01(\r\x12\x15\n\x0bstart_after\x18\x06 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x07 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x08 \x01(\x08\x42\x07\n\x05startB\t\n\x07version\"\x95\x03\n\x14GetDocumentsResponse\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0H\x00\x1a\x9b\x02\n\x16GetDocumentsResponseV0\x12\x65\n\tdocuments\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.DocumentsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1e\n\tDocuments\x12\x11\n\tdocuments\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xed\x01\n!GetIdentityByPublicKeyHashRequest\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0H\x00\x1aM\n#GetIdentityByPublicKeyHashRequestV0\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x02\n\"GetIdentityByPublicKeyHashResponse\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0H\x00\x1a\xb6\x01\n$GetIdentityByPublicKeyHashResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xfb\x01\n#WaitForStateTransitionResultRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0H\x00\x1aU\n%WaitForStateTransitionResultRequestV0\x12\x1d\n\x15state_transition_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x99\x03\n$WaitForStateTransitionResultResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0H\x00\x1a\xef\x01\n&WaitForStateTransitionResultResponseV0\x12I\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x38.org.dash.platform.dapi.v0.StateTransitionBroadcastErrorH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x19GetConsensusParamsRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0H\x00\x1a<\n\x1bGetConsensusParamsRequestV0\x12\x0e\n\x06height\x18\x01 \x01(\x05\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9c\x04\n\x1aGetConsensusParamsResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0H\x00\x1aP\n\x14\x43onsensusParamsBlock\x12\x11\n\tmax_bytes\x18\x01 \x01(\t\x12\x0f\n\x07max_gas\x18\x02 \x01(\t\x12\x14\n\x0ctime_iota_ms\x18\x03 \x01(\t\x1a\x62\n\x17\x43onsensusParamsEvidence\x12\x1a\n\x12max_age_num_blocks\x18\x01 \x01(\t\x12\x18\n\x10max_age_duration\x18\x02 \x01(\t\x12\x11\n\tmax_bytes\x18\x03 \x01(\t\x1a\xda\x01\n\x1cGetConsensusParamsResponseV0\x12Y\n\x05\x62lock\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock\x12_\n\x08\x65vidence\x18\x02 \x01(\x0b\x32M.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidenceB\t\n\x07version\"\xe4\x01\n%GetProtocolVersionUpgradeStateRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0H\x00\x1a\x38\n\'GetProtocolVersionUpgradeStateRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xb5\x05\n&GetProtocolVersionUpgradeStateResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0H\x00\x1a\x85\x04\n(GetProtocolVersionUpgradeStateResponseV0\x12\x87\x01\n\x08versions\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x96\x01\n\x08Versions\x12\x89\x01\n\x08versions\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry\x1a:\n\x0cVersionEntry\x12\x16\n\x0eversion_number\x18\x01 \x01(\r\x12\x12\n\nvote_count\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xa3\x02\n*GetProtocolVersionUpgradeVoteStatusRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0H\x00\x1ag\n,GetProtocolVersionUpgradeVoteStatusRequestV0\x12\x19\n\x11start_pro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xef\x05\n+GetProtocolVersionUpgradeVoteStatusResponse\x12\x82\x01\n\x02v0\x18\x01 \x01(\x0b\x32t.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0H\x00\x1a\xaf\x04\n-GetProtocolVersionUpgradeVoteStatusResponseV0\x12\x98\x01\n\x08versions\x18\x01 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignalsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xaf\x01\n\x0eVersionSignals\x12\x9c\x01\n\x0fversion_signals\x18\x01 \x03(\x0b\x32\x82\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal\x1a\x35\n\rVersionSignal\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07version\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xf5\x01\n\x14GetEpochsInfoRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0H\x00\x1a|\n\x16GetEpochsInfoRequestV0\x12\x31\n\x0bstart_epoch\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x11\n\tascending\x18\x03 \x01(\x08\x12\r\n\x05prove\x18\x04 \x01(\x08\x42\t\n\x07version\"\x91\x05\n\x15GetEpochsInfoResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0H\x00\x1a\x94\x04\n\x17GetEpochsInfoResponseV0\x12\x65\n\x06\x65pochs\x18\x01 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfosH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1au\n\nEpochInfos\x12g\n\x0b\x65poch_infos\x18\x01 \x03(\x0b\x32R.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo\x1a\x9e\x01\n\tEpochInfo\x12\x0e\n\x06number\x18\x01 \x01(\r\x12\x1a\n\x12\x66irst_block_height\x18\x02 \x01(\x04\x12\x1f\n\x17\x66irst_core_block_height\x18\x03 \x01(\r\x12\x12\n\nstart_time\x18\x04 \x01(\x04\x12\x16\n\x0e\x66\x65\x65_multiplier\x18\x05 \x01(\x01\x12\x18\n\x10protocol_version\x18\x06 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xde\x04\n\x1cGetContestedResourcesRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0H\x00\x1a\xcc\x03\n\x1eGetContestedResourcesRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x1a\n\x12start_index_values\x18\x04 \x03(\x0c\x12\x18\n\x10\x65nd_index_values\x18\x05 \x03(\x0c\x12\x89\x01\n\x13start_at_value_info\x18\x06 \x01(\x0b\x32g.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfoH\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x07 \x01(\rH\x01\x88\x01\x01\x12\x17\n\x0forder_ascending\x18\x08 \x01(\x08\x12\r\n\x05prove\x18\t \x01(\x08\x1a\x45\n\x10StartAtValueInfo\x12\x13\n\x0bstart_value\x18\x01 \x01(\x0c\x12\x1c\n\x14start_value_included\x18\x02 \x01(\x08\x42\x16\n\x14_start_at_value_infoB\x08\n\x06_countB\t\n\x07version\"\x88\x04\n\x1dGetContestedResourcesResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0H\x00\x1a\xf3\x02\n\x1fGetContestedResourcesResponseV0\x12\x95\x01\n\x19\x63ontested_resource_values\x18\x01 \x01(\x0b\x32p.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValuesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a<\n\x17\x43ontestedResourceValues\x12!\n\x19\x63ontested_resource_values\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xca\x05\n\x1cGetVotePollsByEndDateRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0H\x00\x1a\xb8\x04\n\x1eGetVotePollsByEndDateRequestV0\x12\x84\x01\n\x0fstart_time_info\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfoH\x00\x88\x01\x01\x12\x80\x01\n\rend_time_info\x18\x02 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfoH\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x03 \x01(\rH\x02\x88\x01\x01\x12\x13\n\x06offset\x18\x04 \x01(\rH\x03\x88\x01\x01\x12\x11\n\tascending\x18\x05 \x01(\x08\x12\r\n\x05prove\x18\x06 \x01(\x08\x1a\x45\n\x0fStartAtTimeInfo\x12\x15\n\rstart_time_ms\x18\x01 \x01(\x04\x12\x1b\n\x13start_time_included\x18\x02 \x01(\x08\x1a?\n\rEndAtTimeInfo\x12\x13\n\x0b\x65nd_time_ms\x18\x01 \x01(\x04\x12\x19\n\x11\x65nd_time_included\x18\x02 \x01(\x08\x42\x12\n\x10_start_time_infoB\x10\n\x0e_end_time_infoB\x08\n\x06_limitB\t\n\x07_offsetB\t\n\x07version\"\xff\x05\n\x1dGetVotePollsByEndDateResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0H\x00\x1a\xea\x04\n\x1fGetVotePollsByEndDateResponseV0\x12\x9c\x01\n\x18vote_polls_by_timestamps\x18\x01 \x01(\x0b\x32x.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestampsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1aR\n\x1eSerializedVotePollsByTimestamp\x12\x11\n\ttimestamp\x18\x01 \x01(\x04\x12\x1d\n\x15serialized_vote_polls\x18\x02 \x03(\x0c\x1a\xd7\x01\n\x1fSerializedVotePollsByTimestamps\x12\x99\x01\n\x18vote_polls_by_timestamps\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp\x12\x18\n\x10\x66inished_results\x18\x02 \x01(\x08\x42\x08\n\x06resultB\t\n\x07version\"\xff\x06\n$GetContestedResourceVoteStateRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0H\x00\x1a\xd5\x05\n&GetContestedResourceVoteStateRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x14\n\x0cindex_values\x18\x04 \x03(\x0c\x12\x86\x01\n\x0bresult_type\x18\x05 \x01(\x0e\x32q.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType\x12\x36\n.allow_include_locked_and_abstaining_vote_tally\x18\x06 \x01(\x08\x12\xa3\x01\n\x18start_at_identifier_info\x18\x07 \x01(\x0b\x32|.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfoH\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x08 \x01(\rH\x01\x88\x01\x01\x12\r\n\x05prove\x18\t \x01(\x08\x1aT\n\x15StartAtIdentifierInfo\x12\x18\n\x10start_identifier\x18\x01 \x01(\x0c\x12!\n\x19start_identifier_included\x18\x02 \x01(\x08\"I\n\nResultType\x12\r\n\tDOCUMENTS\x10\x00\x12\x0e\n\nVOTE_TALLY\x10\x01\x12\x1c\n\x18\x44OCUMENTS_AND_VOTE_TALLY\x10\x02\x42\x1b\n\x19_start_at_identifier_infoB\x08\n\x06_countB\t\n\x07version\"\x8c\x0c\n%GetContestedResourceVoteStateResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0H\x00\x1a\xdf\n\n\'GetContestedResourceVoteStateResponseV0\x12\xae\x01\n\x1d\x63ontested_resource_contenders\x18\x01 \x01(\x0b\x32\x84\x01.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContendersH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xd2\x03\n\x10\x46inishedVoteInfo\x12\xad\x01\n\x15\x66inished_vote_outcome\x18\x01 \x01(\x0e\x32\x8d\x01.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome\x12\x1f\n\x12won_by_identity_id\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12 \n\x18\x66inished_at_block_height\x18\x03 \x01(\x04\x12%\n\x1d\x66inished_at_core_block_height\x18\x04 \x01(\r\x12!\n\x19\x66inished_at_block_time_ms\x18\x05 \x01(\x04\x12\x19\n\x11\x66inished_at_epoch\x18\x06 \x01(\r\"O\n\x13\x46inishedVoteOutcome\x12\x14\n\x10TOWARDS_IDENTITY\x10\x00\x12\n\n\x06LOCKED\x10\x01\x12\x16\n\x12NO_PREVIOUS_WINNER\x10\x02\x42\x15\n\x13_won_by_identity_id\x1a\xc4\x03\n\x1b\x43ontestedResourceContenders\x12\x86\x01\n\ncontenders\x18\x01 \x03(\x0b\x32r.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender\x12\x1f\n\x12\x61\x62stain_vote_tally\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x1c\n\x0flock_vote_tally\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x9a\x01\n\x12\x66inished_vote_info\x18\x04 \x01(\x0b\x32y.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfoH\x02\x88\x01\x01\x42\x15\n\x13_abstain_vote_tallyB\x12\n\x10_lock_vote_tallyB\x15\n\x13_finished_vote_info\x1ak\n\tContender\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x17\n\nvote_count\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08\x64ocument\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x42\r\n\x0b_vote_countB\x0b\n\t_documentB\x08\n\x06resultB\t\n\x07version\"\xd5\x05\n,GetContestedResourceVotersForIdentityRequest\x12\x84\x01\n\x02v0\x18\x01 \x01(\x0b\x32v.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0H\x00\x1a\x92\x04\n.GetContestedResourceVotersForIdentityRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x14\n\x0cindex_values\x18\x04 \x03(\x0c\x12\x15\n\rcontestant_id\x18\x05 \x01(\x0c\x12\xb4\x01\n\x18start_at_identifier_info\x18\x06 \x01(\x0b\x32\x8c\x01.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfoH\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x07 \x01(\rH\x01\x88\x01\x01\x12\x17\n\x0forder_ascending\x18\x08 \x01(\x08\x12\r\n\x05prove\x18\t \x01(\x08\x1aT\n\x15StartAtIdentifierInfo\x12\x18\n\x10start_identifier\x18\x01 \x01(\x0c\x12!\n\x19start_identifier_included\x18\x02 \x01(\x08\x42\x1b\n\x19_start_at_identifier_infoB\x08\n\x06_countB\t\n\x07version\"\xf1\x04\n-GetContestedResourceVotersForIdentityResponse\x12\x86\x01\n\x02v0\x18\x01 \x01(\x0b\x32x.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0H\x00\x1a\xab\x03\n/GetContestedResourceVotersForIdentityResponseV0\x12\xb6\x01\n\x19\x63ontested_resource_voters\x18\x01 \x01(\x0b\x32\x90\x01.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVotersH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x43\n\x17\x43ontestedResourceVoters\x12\x0e\n\x06voters\x18\x01 \x03(\x0c\x12\x18\n\x10\x66inished_results\x18\x02 \x01(\x08\x42\x08\n\x06resultB\t\n\x07version\"\xad\x05\n(GetContestedResourceIdentityVotesRequest\x12|\n\x02v0\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0H\x00\x1a\xf7\x03\n*GetContestedResourceIdentityVotesRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x17\n\x0forder_ascending\x18\x04 \x01(\x08\x12\xae\x01\n\x1astart_at_vote_poll_id_info\x18\x05 \x01(\x0b\x32\x84\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfoH\x00\x88\x01\x01\x12\r\n\x05prove\x18\x06 \x01(\x08\x1a\x61\n\x15StartAtVotePollIdInfo\x12 \n\x18start_at_poll_identifier\x18\x01 \x01(\x0c\x12&\n\x1estart_poll_identifier_included\x18\x02 \x01(\x08\x42\x1d\n\x1b_start_at_vote_poll_id_infoB\t\n\x07version\"\xc8\n\n)GetContestedResourceIdentityVotesResponse\x12~\n\x02v0\x18\x01 \x01(\x0b\x32p.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0H\x00\x1a\x8f\t\n+GetContestedResourceIdentityVotesResponseV0\x12\xa1\x01\n\x05votes\x18\x01 \x01(\x0b\x32\x8f\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xf7\x01\n\x1e\x43ontestedResourceIdentityVotes\x12\xba\x01\n!contested_resource_identity_votes\x18\x01 \x03(\x0b\x32\x8e\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote\x12\x18\n\x10\x66inished_results\x18\x02 \x01(\x08\x1a\xad\x02\n\x12ResourceVoteChoice\x12\xad\x01\n\x10vote_choice_type\x18\x01 \x01(\x0e\x32\x92\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType\x12\x18\n\x0bidentity_id\x18\x02 \x01(\x0cH\x00\x88\x01\x01\"=\n\x0eVoteChoiceType\x12\x14\n\x10TOWARDS_IDENTITY\x10\x00\x12\x0b\n\x07\x41\x42STAIN\x10\x01\x12\x08\n\x04LOCK\x10\x02\x42\x0e\n\x0c_identity_id\x1a\x95\x02\n\x1d\x43ontestedResourceIdentityVote\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\'\n\x1fserialized_index_storage_values\x18\x03 \x03(\x0c\x12\x99\x01\n\x0bvote_choice\x18\x04 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoiceB\x08\n\x06resultB\t\n\x07version\"\xf0\x01\n%GetPrefundedSpecializedBalanceRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0H\x00\x1a\x44\n\'GetPrefundedSpecializedBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xe9\x02\n&GetPrefundedSpecializedBalanceResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0H\x00\x1a\xb9\x01\n(GetPrefundedSpecializedBalanceResponseV0\x12\x11\n\x07\x62\x61lance\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xd0\x01\n GetTotalCreditsInPlatformRequest\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0H\x00\x1a\x33\n\"GetTotalCreditsInPlatformRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xd5\x02\n!GetTotalCreditsInPlatformResponse\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0H\x00\x1a\xb4\x01\n#GetTotalCreditsInPlatformResponseV0\x12\x11\n\x07\x63redits\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x16GetPathElementsRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0H\x00\x1a\x45\n\x18GetPathElementsRequestV0\x12\x0c\n\x04path\x18\x01 \x03(\x0c\x12\x0c\n\x04keys\x18\x02 \x03(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xa3\x03\n\x17GetPathElementsResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0H\x00\x1a\xa0\x02\n\x19GetPathElementsResponseV0\x12i\n\x08\x65lements\x18\x01 \x01(\x0b\x32U.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ElementsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1c\n\x08\x45lements\x12\x10\n\x08\x65lements\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\x81\x01\n\x10GetStatusRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0H\x00\x1a\x14\n\x12GetStatusRequestV0B\t\n\x07version\"\x9c\x10\n\x11GetStatusResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0H\x00\x1a\xab\x0f\n\x13GetStatusResponseV0\x12Y\n\x07version\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version\x12S\n\x04node\x18\x02 \x01(\x0b\x32\x45.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node\x12U\n\x05\x63hain\x18\x03 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain\x12Y\n\x07network\x18\x04 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network\x12^\n\nstate_sync\x18\x05 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync\x12S\n\x04time\x18\x06 \x01(\x0b\x32\x45.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time\x1a\xee\x04\n\x07Version\x12\x63\n\x08software\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software\x12\x63\n\x08protocol\x18\x02 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol\x1a^\n\x08Software\x12\x0c\n\x04\x64\x61pi\x18\x01 \x01(\t\x12\x12\n\x05\x64rive\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x17\n\ntenderdash\x18\x03 \x01(\tH\x01\x88\x01\x01\x42\x08\n\x06_driveB\r\n\x0b_tenderdash\x1a\xb8\x02\n\x08Protocol\x12p\n\ntenderdash\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash\x12\x66\n\x05\x64rive\x18\x02 \x01(\x0b\x32W.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive\x1a(\n\nTenderdash\x12\x0b\n\x03p2p\x18\x01 \x01(\r\x12\r\n\x05\x62lock\x18\x02 \x01(\r\x1a(\n\x05\x44rive\x12\x0e\n\x06latest\x18\x03 \x01(\r\x12\x0f\n\x07\x63urrent\x18\x04 \x01(\r\x1as\n\x04Time\x12\r\n\x05local\x18\x01 \x01(\x04\x12\x12\n\x05\x62lock\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07genesis\x18\x03 \x01(\x04H\x01\x88\x01\x01\x12\x12\n\x05\x65poch\x18\x04 \x01(\rH\x02\x88\x01\x01\x42\x08\n\x06_blockB\n\n\x08_genesisB\x08\n\x06_epoch\x1a<\n\x04Node\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x18\n\x0bpro_tx_hash\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0e\n\x0c_pro_tx_hash\x1a\xa7\x02\n\x05\x43hain\x12\x13\n\x0b\x63\x61tching_up\x18\x01 \x01(\x08\x12\x19\n\x11latest_block_hash\x18\x02 \x01(\x0c\x12\x17\n\x0flatest_app_hash\x18\x03 \x01(\x0c\x12\x1b\n\x13latest_block_height\x18\x04 \x01(\x04\x12\x1b\n\x13\x65\x61rliest_block_hash\x18\x05 \x01(\x0c\x12\x19\n\x11\x65\x61rliest_app_hash\x18\x06 \x01(\x0c\x12\x1d\n\x15\x65\x61rliest_block_height\x18\x07 \x01(\x04\x12\x1d\n\x15max_peer_block_height\x18\t \x01(\x04\x12%\n\x18\x63ore_chain_locked_height\x18\n \x01(\rH\x00\x88\x01\x01\x42\x1b\n\x19_core_chain_locked_height\x1a\x43\n\x07Network\x12\x10\n\x08\x63hain_id\x18\x01 \x01(\t\x12\x13\n\x0bpeers_count\x18\x02 \x01(\r\x12\x11\n\tlistening\x18\x03 \x01(\x08\x1a\xe9\x01\n\tStateSync\x12\x19\n\x11total_synced_time\x18\x01 \x01(\x04\x12\x16\n\x0eremaining_time\x18\x02 \x01(\x04\x12\x17\n\x0ftotal_snapshots\x18\x03 \x01(\r\x12\x1e\n\x16\x63hunk_process_avg_time\x18\x04 \x01(\x04\x12\x17\n\x0fsnapshot_height\x18\x05 \x01(\x04\x12\x1d\n\x15snapshot_chunks_count\x18\x06 \x01(\x04\x12\x19\n\x11\x62\x61\x63kfilled_blocks\x18\x07 \x01(\x04\x12\x1d\n\x15\x62\x61\x63kfill_blocks_total\x18\x08 \x01(\x04\x42\t\n\x07version*Z\n\nKeyPurpose\x12\x12\n\x0e\x41UTHENTICATION\x10\x00\x12\x0e\n\nENCRYPTION\x10\x01\x12\x0e\n\nDECRYPTION\x10\x02\x12\x0c\n\x08TRANSFER\x10\x03\x12\n\n\x06VOTING\x10\x05\x32\x97#\n\x08Platform\x12\x93\x01\n\x18\x62roadcastStateTransition\x12:.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest\x1a;.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse\x12l\n\x0bgetIdentity\x12-.org.dash.platform.dapi.v0.GetIdentityRequest\x1a..org.dash.platform.dapi.v0.GetIdentityResponse\x12x\n\x0fgetIdentityKeys\x12\x31.org.dash.platform.dapi.v0.GetIdentityKeysRequest\x1a\x32.org.dash.platform.dapi.v0.GetIdentityKeysResponse\x12\x96\x01\n\x19getIdentitiesContractKeys\x12;.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest\x1a<.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse\x12{\n\x10getIdentityNonce\x12\x32.org.dash.platform.dapi.v0.GetIdentityNonceRequest\x1a\x33.org.dash.platform.dapi.v0.GetIdentityNonceResponse\x12\x93\x01\n\x18getIdentityContractNonce\x12:.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest\x1a;.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse\x12\x81\x01\n\x12getIdentityBalance\x12\x34.org.dash.platform.dapi.v0.GetIdentityBalanceRequest\x1a\x35.org.dash.platform.dapi.v0.GetIdentityBalanceResponse\x12\x8a\x01\n\x15getIdentitiesBalances\x12\x37.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest\x1a\x38.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse\x12\xa2\x01\n\x1dgetIdentityBalanceAndRevision\x12?.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest\x1a@.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse\x12\xaf\x01\n#getEvonodesProposedEpochBlocksByIds\x12\x45.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest\x1a\x41.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse\x12\xb3\x01\n%getEvonodesProposedEpochBlocksByRange\x12G.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest\x1a\x41.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse\x12\x66\n\tgetProofs\x12+.org.dash.platform.dapi.v0.GetProofsRequest\x1a,.org.dash.platform.dapi.v0.GetProofsResponse\x12x\n\x0fgetDataContract\x12\x31.org.dash.platform.dapi.v0.GetDataContractRequest\x1a\x32.org.dash.platform.dapi.v0.GetDataContractResponse\x12\x8d\x01\n\x16getDataContractHistory\x12\x38.org.dash.platform.dapi.v0.GetDataContractHistoryRequest\x1a\x39.org.dash.platform.dapi.v0.GetDataContractHistoryResponse\x12{\n\x10getDataContracts\x12\x32.org.dash.platform.dapi.v0.GetDataContractsRequest\x1a\x33.org.dash.platform.dapi.v0.GetDataContractsResponse\x12o\n\x0cgetDocuments\x12..org.dash.platform.dapi.v0.GetDocumentsRequest\x1a/.org.dash.platform.dapi.v0.GetDocumentsResponse\x12\x99\x01\n\x1agetIdentityByPublicKeyHash\x12<.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest\x1a=.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse\x12\x9f\x01\n\x1cwaitForStateTransitionResult\x12>.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest\x1a?.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse\x12\x81\x01\n\x12getConsensusParams\x12\x34.org.dash.platform.dapi.v0.GetConsensusParamsRequest\x1a\x35.org.dash.platform.dapi.v0.GetConsensusParamsResponse\x12\xa5\x01\n\x1egetProtocolVersionUpgradeState\x12@.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest\x1a\x41.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse\x12\xb4\x01\n#getProtocolVersionUpgradeVoteStatus\x12\x45.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest\x1a\x46.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse\x12r\n\rgetEpochsInfo\x12/.org.dash.platform.dapi.v0.GetEpochsInfoRequest\x1a\x30.org.dash.platform.dapi.v0.GetEpochsInfoResponse\x12\x8a\x01\n\x15getContestedResources\x12\x37.org.dash.platform.dapi.v0.GetContestedResourcesRequest\x1a\x38.org.dash.platform.dapi.v0.GetContestedResourcesResponse\x12\xa2\x01\n\x1dgetContestedResourceVoteState\x12?.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest\x1a@.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse\x12\xba\x01\n%getContestedResourceVotersForIdentity\x12G.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest\x1aH.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse\x12\xae\x01\n!getContestedResourceIdentityVotes\x12\x43.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest\x1a\x44.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse\x12\x8a\x01\n\x15getVotePollsByEndDate\x12\x37.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest\x1a\x38.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse\x12\xa5\x01\n\x1egetPrefundedSpecializedBalance\x12@.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest\x1a\x41.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse\x12\x96\x01\n\x19getTotalCreditsInPlatform\x12;.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest\x1a<.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse\x12x\n\x0fgetPathElements\x12\x31.org.dash.platform.dapi.v0.GetPathElementsRequest\x1a\x32.org.dash.platform.dapi.v0.GetPathElementsResponse\x12\x66\n\tgetStatus\x12+.org.dash.platform.dapi.v0.GetStatusRequest\x1a,.org.dash.platform.dapi.v0.GetStatusResponseb\x06proto3' , dependencies=[google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,]) @@ -62,8 +62,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=30834, - serialized_end=30924, + serialized_start=30656, + serialized_end=30746, ) _sym_db.RegisterEnumDescriptor(_KEYPURPOSE) @@ -125,8 +125,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=9520, - serialized_end=9600, + serialized_start=9342, + serialized_end=9422, ) _sym_db.RegisterEnumDescriptor(_GETPROOFSREQUEST_GETPROOFSREQUESTV0_DOCUMENTREQUEST_DOCUMENTCONTESTEDSTATUS) @@ -160,8 +160,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=9750, - serialized_end=9812, + serialized_start=9572, + serialized_end=9634, ) _sym_db.RegisterEnumDescriptor(_GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYREQUEST_TYPE) @@ -190,8 +190,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=21765, - serialized_end=21838, + serialized_start=21587, + serialized_end=21660, ) _sym_db.RegisterEnumDescriptor(_GETCONTESTEDRESOURCEVOTESTATEREQUEST_GETCONTESTEDRESOURCEVOTESTATEREQUESTV0_RESULTTYPE) @@ -220,8 +220,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=22752, - serialized_end=22831, + serialized_start=22574, + serialized_end=22653, ) _sym_db.RegisterEnumDescriptor(_GETCONTESTEDRESOURCEVOTESTATERESPONSE_GETCONTESTEDRESOURCEVOTESTATERESPONSEV0_FINISHEDVOTEINFO_FINISHEDVOTEOUTCOME) @@ -250,8 +250,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=26460, - serialized_end=26521, + serialized_start=26282, + serialized_end=26343, ) _sym_db.RegisterEnumDescriptor(_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSEV0_RESOURCEVOTECHOICE_VOTECHOICETYPE) @@ -2146,9 +2146,14 @@ syntax='proto3', extension_ranges=[], oneofs=[ + _descriptor.OneofDescriptor( + name='_epoch', full_name='org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0._epoch', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), ], serialized_start=6410, - serialized_end=6499, + serialized_end=6514, ) _GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUEST = _descriptor.Descriptor( @@ -2184,7 +2189,7 @@ fields=[]), ], serialized_start=6233, - serialized_end=6510, + serialized_end=6525, ) @@ -2222,8 +2227,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7016, - serialized_end=7075, + serialized_start=7031, + serialized_end=7090, ) _GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSE_GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSEV0_EVONODESPROPOSEDBLOCKS = _descriptor.Descriptor( @@ -2253,8 +2258,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7078, - serialized_end=7274, + serialized_start=7093, + serialized_end=7289, ) _GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSE_GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSEV0 = _descriptor.Descriptor( @@ -2303,8 +2308,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=6678, - serialized_end=7284, + serialized_start=6693, + serialized_end=7299, ) _GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSE = _descriptor.Descriptor( @@ -2339,8 +2344,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=6513, - serialized_end=7295, + serialized_start=6528, + serialized_end=7310, ) @@ -2404,13 +2409,18 @@ create_key=_descriptor._internal_create_key, fields=[]), _descriptor.OneofDescriptor( - name='_limit', full_name='org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0._limit', + name='_epoch', full_name='org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0._epoch', index=1, containing_type=None, create_key=_descriptor._internal_create_key, fields=[]), + _descriptor.OneofDescriptor( + name='_limit', full_name='org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0._limit', + index=2, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), ], - serialized_start=7482, - serialized_end=7642, + serialized_start=7497, + serialized_end=7672, ) _GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUEST = _descriptor.Descriptor( @@ -2445,42 +2455,11 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=7298, - serialized_end=7653, + serialized_start=7313, + serialized_end=7683, ) -_GETIDENTITIESBALANCESREQUEST_GETIDENTITIESBALANCESREQUESTV0_GETIDENTITIESBALANCESBYKNOWNIDENTITYIDS = _descriptor.Descriptor( - name='GetIdentitiesBalancesByKnownIdentityIds', - full_name='org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='identities_ids', full_name='org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.identities_ids', index=0, - number=1, type=12, cpp_type=9, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=7993, - serialized_end=8058, -) - _GETIDENTITIESBALANCESREQUEST_GETIDENTITIESBALANCESREQUESTV0 = _descriptor.Descriptor( name='GetIdentitiesBalancesRequestV0', full_name='org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0', @@ -2490,9 +2469,9 @@ create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( - name='identities_ids', full_name='org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.identities_ids', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, + name='ids', full_name='org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.ids', index=0, + number=1, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), @@ -2506,7 +2485,7 @@ ], extensions=[ ], - nested_types=[_GETIDENTITIESBALANCESREQUEST_GETIDENTITIESBALANCESREQUESTV0_GETIDENTITIESBALANCESBYKNOWNIDENTITYIDS, ], + nested_types=[], enum_types=[ ], serialized_options=None, @@ -2515,8 +2494,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7791, - serialized_end=8058, + serialized_start=7820, + serialized_end=7880, ) _GETIDENTITIESBALANCESREQUEST = _descriptor.Descriptor( @@ -2551,8 +2530,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=7656, - serialized_end=8069, + serialized_start=7686, + serialized_end=7891, ) @@ -2595,8 +2574,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=8500, - serialized_end=8572, + serialized_start=8322, + serialized_end=8394, ) _GETIDENTITIESBALANCESRESPONSE_GETIDENTITIESBALANCESRESPONSEV0_IDENTITIESBALANCES = _descriptor.Descriptor( @@ -2626,8 +2605,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=8575, - serialized_end=8718, + serialized_start=8397, + serialized_end=8540, ) _GETIDENTITIESBALANCESRESPONSE_GETIDENTITIESBALANCESRESPONSEV0 = _descriptor.Descriptor( @@ -2676,8 +2655,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=8210, - serialized_end=8728, + serialized_start=8032, + serialized_end=8550, ) _GETIDENTITIESBALANCESRESPONSE = _descriptor.Descriptor( @@ -2712,8 +2691,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=8072, - serialized_end=8739, + serialized_start=7894, + serialized_end=8561, ) @@ -2773,8 +2752,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=9259, - serialized_end=9600, + serialized_start=9081, + serialized_end=9422, ) _GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYREQUEST = _descriptor.Descriptor( @@ -2812,8 +2791,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=9603, - serialized_end=9812, + serialized_start=9425, + serialized_end=9634, ) _GETPROOFSREQUEST_GETPROOFSREQUESTV0_CONTRACTREQUEST = _descriptor.Descriptor( @@ -2843,8 +2822,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=9814, - serialized_end=9852, + serialized_start=9636, + serialized_end=9674, ) _GETPROOFSREQUEST_GETPROOFSREQUESTV0_VOTESTATUSREQUEST_CONTESTEDRESOURCEVOTESTATUSREQUEST = _descriptor.Descriptor( @@ -2902,8 +2881,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=10045, - serialized_end=10198, + serialized_start=9867, + serialized_end=10020, ) _GETPROOFSREQUEST_GETPROOFSREQUESTV0_VOTESTATUSREQUEST = _descriptor.Descriptor( @@ -2938,8 +2917,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=9855, - serialized_end=10214, + serialized_start=9677, + serialized_end=10036, ) _GETPROOFSREQUEST_GETPROOFSREQUESTV0 = _descriptor.Descriptor( @@ -2990,8 +2969,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=8841, - serialized_end=10214, + serialized_start=8663, + serialized_end=10036, ) _GETPROOFSREQUEST = _descriptor.Descriptor( @@ -3026,8 +3005,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=8742, - serialized_end=10225, + serialized_start=8564, + serialized_end=10047, ) @@ -3070,8 +3049,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10330, - serialized_end=10475, + serialized_start=10152, + serialized_end=10297, ) _GETPROOFSRESPONSE = _descriptor.Descriptor( @@ -3106,8 +3085,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10228, - serialized_end=10486, + serialized_start=10050, + serialized_end=10308, ) @@ -3145,8 +3124,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=10605, - serialized_end=10658, + serialized_start=10427, + serialized_end=10480, ) _GETDATACONTRACTREQUEST = _descriptor.Descriptor( @@ -3181,8 +3160,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10489, - serialized_end=10669, + serialized_start=10311, + serialized_end=10491, ) @@ -3232,8 +3211,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10792, - serialized_end=10968, + serialized_start=10614, + serialized_end=10790, ) _GETDATACONTRACTRESPONSE = _descriptor.Descriptor( @@ -3268,8 +3247,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10672, - serialized_end=10979, + serialized_start=10494, + serialized_end=10801, ) @@ -3307,8 +3286,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=11101, - serialized_end=11156, + serialized_start=10923, + serialized_end=10978, ) _GETDATACONTRACTSREQUEST = _descriptor.Descriptor( @@ -3343,8 +3322,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10982, - serialized_end=11167, + serialized_start=10804, + serialized_end=10989, ) @@ -3382,8 +3361,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=11292, - serialized_end=11383, + serialized_start=11114, + serialized_end=11205, ) _GETDATACONTRACTSRESPONSE_DATACONTRACTS = _descriptor.Descriptor( @@ -3413,8 +3392,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=11385, - serialized_end=11502, + serialized_start=11207, + serialized_end=11324, ) _GETDATACONTRACTSRESPONSE_GETDATACONTRACTSRESPONSEV0 = _descriptor.Descriptor( @@ -3463,8 +3442,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=11505, - serialized_end=11750, + serialized_start=11327, + serialized_end=11572, ) _GETDATACONTRACTSRESPONSE = _descriptor.Descriptor( @@ -3499,8 +3478,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=11170, - serialized_end=11761, + serialized_start=10992, + serialized_end=11583, ) @@ -3559,8 +3538,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=11902, - serialized_end=12074, + serialized_start=11724, + serialized_end=11896, ) _GETDATACONTRACTHISTORYREQUEST = _descriptor.Descriptor( @@ -3595,8 +3574,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=11764, - serialized_end=12085, + serialized_start=11586, + serialized_end=11907, ) @@ -3634,8 +3613,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=12525, - serialized_end=12580, + serialized_start=12347, + serialized_end=12402, ) _GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0_DATACONTRACTHISTORY = _descriptor.Descriptor( @@ -3665,8 +3644,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=12583, - serialized_end=12753, + serialized_start=12405, + serialized_end=12575, ) _GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0 = _descriptor.Descriptor( @@ -3715,8 +3694,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=12229, - serialized_end=12763, + serialized_start=12051, + serialized_end=12585, ) _GETDATACONTRACTHISTORYRESPONSE = _descriptor.Descriptor( @@ -3751,8 +3730,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=12088, - serialized_end=12774, + serialized_start=11910, + serialized_end=12596, ) @@ -3837,8 +3816,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=12885, - serialized_end=13072, + serialized_start=12707, + serialized_end=12894, ) _GETDOCUMENTSREQUEST = _descriptor.Descriptor( @@ -3873,8 +3852,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=12777, - serialized_end=13083, + serialized_start=12599, + serialized_end=12905, ) @@ -3905,8 +3884,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13440, - serialized_end=13470, + serialized_start=13262, + serialized_end=13292, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV0 = _descriptor.Descriptor( @@ -3955,8 +3934,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=13197, - serialized_end=13480, + serialized_start=13019, + serialized_end=13302, ) _GETDOCUMENTSRESPONSE = _descriptor.Descriptor( @@ -3991,8 +3970,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=13086, - serialized_end=13491, + serialized_start=12908, + serialized_end=13313, ) @@ -4030,8 +4009,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13643, - serialized_end=13720, + serialized_start=13465, + serialized_end=13542, ) _GETIDENTITYBYPUBLICKEYHASHREQUEST = _descriptor.Descriptor( @@ -4066,8 +4045,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=13494, - serialized_end=13731, + serialized_start=13316, + serialized_end=13553, ) @@ -4117,8 +4096,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=13887, - serialized_end=14069, + serialized_start=13709, + serialized_end=13891, ) _GETIDENTITYBYPUBLICKEYHASHRESPONSE = _descriptor.Descriptor( @@ -4153,8 +4132,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=13734, - serialized_end=14080, + serialized_start=13556, + serialized_end=13902, ) @@ -4192,8 +4171,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=14238, - serialized_end=14323, + serialized_start=14060, + serialized_end=14145, ) _WAITFORSTATETRANSITIONRESULTREQUEST = _descriptor.Descriptor( @@ -4228,8 +4207,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=14083, - serialized_end=14334, + serialized_start=13905, + serialized_end=14156, ) @@ -4279,8 +4258,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=14496, - serialized_end=14735, + serialized_start=14318, + serialized_end=14557, ) _WAITFORSTATETRANSITIONRESULTRESPONSE = _descriptor.Descriptor( @@ -4315,8 +4294,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=14337, - serialized_end=14746, + serialized_start=14159, + serialized_end=14568, ) @@ -4354,8 +4333,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=14874, - serialized_end=14934, + serialized_start=14696, + serialized_end=14756, ) _GETCONSENSUSPARAMSREQUEST = _descriptor.Descriptor( @@ -4390,8 +4369,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=14749, - serialized_end=14945, + serialized_start=14571, + serialized_end=14767, ) @@ -4436,8 +4415,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=15076, - serialized_end=15156, + serialized_start=14898, + serialized_end=14978, ) _GETCONSENSUSPARAMSRESPONSE_CONSENSUSPARAMSEVIDENCE = _descriptor.Descriptor( @@ -4481,8 +4460,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=15158, - serialized_end=15256, + serialized_start=14980, + serialized_end=15078, ) _GETCONSENSUSPARAMSRESPONSE_GETCONSENSUSPARAMSRESPONSEV0 = _descriptor.Descriptor( @@ -4519,8 +4498,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=15259, - serialized_end=15477, + serialized_start=15081, + serialized_end=15299, ) _GETCONSENSUSPARAMSRESPONSE = _descriptor.Descriptor( @@ -4555,8 +4534,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=14948, - serialized_end=15488, + serialized_start=14770, + serialized_end=15310, ) @@ -4587,8 +4566,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=15652, - serialized_end=15708, + serialized_start=15474, + serialized_end=15530, ) _GETPROTOCOLVERSIONUPGRADESTATEREQUEST = _descriptor.Descriptor( @@ -4623,8 +4602,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=15491, - serialized_end=15719, + serialized_start=15313, + serialized_end=15541, ) @@ -4655,8 +4634,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=16184, - serialized_end=16334, + serialized_start=16006, + serialized_end=16156, ) _GETPROTOCOLVERSIONUPGRADESTATERESPONSE_GETPROTOCOLVERSIONUPGRADESTATERESPONSEV0_VERSIONENTRY = _descriptor.Descriptor( @@ -4693,8 +4672,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=16336, - serialized_end=16394, + serialized_start=16158, + serialized_end=16216, ) _GETPROTOCOLVERSIONUPGRADESTATERESPONSE_GETPROTOCOLVERSIONUPGRADESTATERESPONSEV0 = _descriptor.Descriptor( @@ -4743,8 +4722,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=15887, - serialized_end=16404, + serialized_start=15709, + serialized_end=16226, ) _GETPROTOCOLVERSIONUPGRADESTATERESPONSE = _descriptor.Descriptor( @@ -4779,8 +4758,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=15722, - serialized_end=16415, + serialized_start=15544, + serialized_end=16237, ) @@ -4825,8 +4804,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=16595, - serialized_end=16698, + serialized_start=16417, + serialized_end=16520, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSREQUEST = _descriptor.Descriptor( @@ -4861,8 +4840,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=16418, - serialized_end=16709, + serialized_start=16240, + serialized_end=16531, ) @@ -4893,8 +4872,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=17212, - serialized_end=17387, + serialized_start=17034, + serialized_end=17209, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE_GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSEV0_VERSIONSIGNAL = _descriptor.Descriptor( @@ -4931,8 +4910,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=17389, - serialized_end=17442, + serialized_start=17211, + serialized_end=17264, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE_GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSEV0 = _descriptor.Descriptor( @@ -4981,8 +4960,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=16893, - serialized_end=17452, + serialized_start=16715, + serialized_end=17274, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE = _descriptor.Descriptor( @@ -5017,8 +4996,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=16712, - serialized_end=17463, + serialized_start=16534, + serialized_end=17285, ) @@ -5070,8 +5049,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=17576, - serialized_end=17700, + serialized_start=17398, + serialized_end=17522, ) _GETEPOCHSINFOREQUEST = _descriptor.Descriptor( @@ -5106,8 +5085,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=17466, - serialized_end=17711, + serialized_start=17288, + serialized_end=17533, ) @@ -5138,8 +5117,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=18072, - serialized_end=18189, + serialized_start=17894, + serialized_end=18011, ) _GETEPOCHSINFORESPONSE_GETEPOCHSINFORESPONSEV0_EPOCHINFO = _descriptor.Descriptor( @@ -5204,8 +5183,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=18192, - serialized_end=18350, + serialized_start=18014, + serialized_end=18172, ) _GETEPOCHSINFORESPONSE_GETEPOCHSINFORESPONSEV0 = _descriptor.Descriptor( @@ -5254,8 +5233,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=17828, - serialized_end=18360, + serialized_start=17650, + serialized_end=18182, ) _GETEPOCHSINFORESPONSE = _descriptor.Descriptor( @@ -5290,8 +5269,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=17714, - serialized_end=18371, + serialized_start=17536, + serialized_end=18193, ) @@ -5329,8 +5308,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=18866, - serialized_end=18935, + serialized_start=18688, + serialized_end=18757, ) _GETCONTESTEDRESOURCESREQUEST_GETCONTESTEDRESOURCESREQUESTV0 = _descriptor.Descriptor( @@ -5426,8 +5405,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=18509, - serialized_end=18969, + serialized_start=18331, + serialized_end=18791, ) _GETCONTESTEDRESOURCESREQUEST = _descriptor.Descriptor( @@ -5462,8 +5441,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=18374, - serialized_end=18980, + serialized_start=18196, + serialized_end=18802, ) @@ -5494,8 +5473,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=19422, - serialized_end=19482, + serialized_start=19244, + serialized_end=19304, ) _GETCONTESTEDRESOURCESRESPONSE_GETCONTESTEDRESOURCESRESPONSEV0 = _descriptor.Descriptor( @@ -5544,8 +5523,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=19121, - serialized_end=19492, + serialized_start=18943, + serialized_end=19314, ) _GETCONTESTEDRESOURCESRESPONSE = _descriptor.Descriptor( @@ -5580,8 +5559,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=18983, - serialized_end=19503, + serialized_start=18805, + serialized_end=19325, ) @@ -5619,8 +5598,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=20016, - serialized_end=20085, + serialized_start=19838, + serialized_end=19907, ) _GETVOTEPOLLSBYENDDATEREQUEST_GETVOTEPOLLSBYENDDATEREQUESTV0_ENDATTIMEINFO = _descriptor.Descriptor( @@ -5657,8 +5636,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=20087, - serialized_end=20150, + serialized_start=19909, + serialized_end=19972, ) _GETVOTEPOLLSBYENDDATEREQUEST_GETVOTEPOLLSBYENDDATEREQUESTV0 = _descriptor.Descriptor( @@ -5743,8 +5722,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=19641, - serialized_end=20209, + serialized_start=19463, + serialized_end=20031, ) _GETVOTEPOLLSBYENDDATEREQUEST = _descriptor.Descriptor( @@ -5779,8 +5758,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=19506, - serialized_end=20220, + serialized_start=19328, + serialized_end=20042, ) @@ -5818,8 +5797,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=20669, - serialized_end=20751, + serialized_start=20491, + serialized_end=20573, ) _GETVOTEPOLLSBYENDDATERESPONSE_GETVOTEPOLLSBYENDDATERESPONSEV0_SERIALIZEDVOTEPOLLSBYTIMESTAMPS = _descriptor.Descriptor( @@ -5856,8 +5835,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=20754, - serialized_end=20969, + serialized_start=20576, + serialized_end=20791, ) _GETVOTEPOLLSBYENDDATERESPONSE_GETVOTEPOLLSBYENDDATERESPONSEV0 = _descriptor.Descriptor( @@ -5906,8 +5885,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=20361, - serialized_end=20979, + serialized_start=20183, + serialized_end=20801, ) _GETVOTEPOLLSBYENDDATERESPONSE = _descriptor.Descriptor( @@ -5942,8 +5921,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=20223, - serialized_end=20990, + serialized_start=20045, + serialized_end=20812, ) @@ -5981,8 +5960,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=21679, - serialized_end=21763, + serialized_start=21501, + serialized_end=21585, ) _GETCONTESTEDRESOURCEVOTESTATEREQUEST_GETCONTESTEDRESOURCEVOTESTATEREQUESTV0 = _descriptor.Descriptor( @@ -6079,8 +6058,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=21152, - serialized_end=21877, + serialized_start=20974, + serialized_end=21699, ) _GETCONTESTEDRESOURCEVOTESTATEREQUEST = _descriptor.Descriptor( @@ -6115,8 +6094,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=20993, - serialized_end=21888, + serialized_start=20815, + serialized_end=21710, ) @@ -6188,8 +6167,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=22388, - serialized_end=22854, + serialized_start=22210, + serialized_end=22676, ) _GETCONTESTEDRESOURCEVOTESTATERESPONSE_GETCONTESTEDRESOURCEVOTESTATERESPONSEV0_CONTESTEDRESOURCECONTENDERS = _descriptor.Descriptor( @@ -6255,8 +6234,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=22857, - serialized_end=23309, + serialized_start=22679, + serialized_end=23131, ) _GETCONTESTEDRESOURCEVOTESTATERESPONSE_GETCONTESTEDRESOURCEVOTESTATERESPONSEV0_CONTENDER = _descriptor.Descriptor( @@ -6310,8 +6289,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=23311, - serialized_end=23418, + serialized_start=23133, + serialized_end=23240, ) _GETCONTESTEDRESOURCEVOTESTATERESPONSE_GETCONTESTEDRESOURCEVOTESTATERESPONSEV0 = _descriptor.Descriptor( @@ -6360,8 +6339,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=22053, - serialized_end=23428, + serialized_start=21875, + serialized_end=23250, ) _GETCONTESTEDRESOURCEVOTESTATERESPONSE = _descriptor.Descriptor( @@ -6396,8 +6375,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=21891, - serialized_end=23439, + serialized_start=21713, + serialized_end=23261, ) @@ -6435,8 +6414,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=21679, - serialized_end=21763, + serialized_start=21501, + serialized_end=21585, ) _GETCONTESTEDRESOURCEVOTERSFORIDENTITYREQUEST_GETCONTESTEDRESOURCEVOTERSFORIDENTITYREQUESTV0 = _descriptor.Descriptor( @@ -6532,8 +6511,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=23626, - serialized_end=24156, + serialized_start=23448, + serialized_end=23978, ) _GETCONTESTEDRESOURCEVOTERSFORIDENTITYREQUEST = _descriptor.Descriptor( @@ -6568,8 +6547,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=23442, - serialized_end=24167, + serialized_start=23264, + serialized_end=23989, ) @@ -6607,8 +6586,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=24707, - serialized_end=24774, + serialized_start=24529, + serialized_end=24596, ) _GETCONTESTEDRESOURCEVOTERSFORIDENTITYRESPONSE_GETCONTESTEDRESOURCEVOTERSFORIDENTITYRESPONSEV0 = _descriptor.Descriptor( @@ -6657,8 +6636,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=24357, - serialized_end=24784, + serialized_start=24179, + serialized_end=24606, ) _GETCONTESTEDRESOURCEVOTERSFORIDENTITYRESPONSE = _descriptor.Descriptor( @@ -6693,8 +6672,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=24170, - serialized_end=24795, + serialized_start=23992, + serialized_end=24617, ) @@ -6732,8 +6711,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=25344, - serialized_end=25441, + serialized_start=25166, + serialized_end=25263, ) _GETCONTESTEDRESOURCEIDENTITYVOTESREQUEST_GETCONTESTEDRESOURCEIDENTITYVOTESREQUESTV0 = _descriptor.Descriptor( @@ -6803,8 +6782,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=24969, - serialized_end=25472, + serialized_start=24791, + serialized_end=25294, ) _GETCONTESTEDRESOURCEIDENTITYVOTESREQUEST = _descriptor.Descriptor( @@ -6839,8 +6818,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=24798, - serialized_end=25483, + serialized_start=24620, + serialized_end=25305, ) @@ -6878,8 +6857,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=25986, - serialized_end=26233, + serialized_start=25808, + serialized_end=26055, ) _GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSEV0_RESOURCEVOTECHOICE = _descriptor.Descriptor( @@ -6922,8 +6901,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=26236, - serialized_end=26537, + serialized_start=26058, + serialized_end=26359, ) _GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSEV0_CONTESTEDRESOURCEIDENTITYVOTE = _descriptor.Descriptor( @@ -6974,8 +6953,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=26540, - serialized_end=26817, + serialized_start=26362, + serialized_end=26639, ) _GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSEV0 = _descriptor.Descriptor( @@ -7024,8 +7003,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=25660, - serialized_end=26827, + serialized_start=25482, + serialized_end=26649, ) _GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE = _descriptor.Descriptor( @@ -7060,8 +7039,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=25486, - serialized_end=26838, + serialized_start=25308, + serialized_end=26660, ) @@ -7099,8 +7078,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=27002, - serialized_end=27070, + serialized_start=26824, + serialized_end=26892, ) _GETPREFUNDEDSPECIALIZEDBALANCEREQUEST = _descriptor.Descriptor( @@ -7135,8 +7114,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=26841, - serialized_end=27081, + serialized_start=26663, + serialized_end=26903, ) @@ -7186,8 +7165,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=27249, - serialized_end=27434, + serialized_start=27071, + serialized_end=27256, ) _GETPREFUNDEDSPECIALIZEDBALANCERESPONSE = _descriptor.Descriptor( @@ -7222,8 +7201,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=27084, - serialized_end=27445, + serialized_start=26906, + serialized_end=27267, ) @@ -7254,8 +7233,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=27594, - serialized_end=27645, + serialized_start=27416, + serialized_end=27467, ) _GETTOTALCREDITSINPLATFORMREQUEST = _descriptor.Descriptor( @@ -7290,8 +7269,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=27448, - serialized_end=27656, + serialized_start=27270, + serialized_end=27478, ) @@ -7341,8 +7320,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=27809, - serialized_end=27989, + serialized_start=27631, + serialized_end=27811, ) _GETTOTALCREDITSINPLATFORMRESPONSE = _descriptor.Descriptor( @@ -7377,8 +7356,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=27659, - serialized_end=28000, + serialized_start=27481, + serialized_end=27822, ) @@ -7423,8 +7402,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=28119, - serialized_end=28188, + serialized_start=27941, + serialized_end=28010, ) _GETPATHELEMENTSREQUEST = _descriptor.Descriptor( @@ -7459,8 +7438,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=28003, - serialized_end=28199, + serialized_start=27825, + serialized_end=28021, ) @@ -7491,8 +7470,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=28572, - serialized_end=28600, + serialized_start=28394, + serialized_end=28422, ) _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0 = _descriptor.Descriptor( @@ -7541,8 +7520,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=28322, - serialized_end=28610, + serialized_start=28144, + serialized_end=28432, ) _GETPATHELEMENTSRESPONSE = _descriptor.Descriptor( @@ -7577,8 +7556,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=28202, - serialized_end=28621, + serialized_start=28024, + serialized_end=28443, ) @@ -7602,8 +7581,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=28722, - serialized_end=28742, + serialized_start=28544, + serialized_end=28564, ) _GETSTATUSREQUEST = _descriptor.Descriptor( @@ -7638,8 +7617,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=28624, - serialized_end=28753, + serialized_start=28446, + serialized_end=28575, ) @@ -7694,8 +7673,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=29630, - serialized_end=29724, + serialized_start=29452, + serialized_end=29546, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_VERSION_PROTOCOL_TENDERDASH = _descriptor.Descriptor( @@ -7732,8 +7711,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=29957, - serialized_end=29997, + serialized_start=29779, + serialized_end=29819, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_VERSION_PROTOCOL_DRIVE = _descriptor.Descriptor( @@ -7770,8 +7749,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=29999, - serialized_end=30039, + serialized_start=29821, + serialized_end=29861, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_VERSION_PROTOCOL = _descriptor.Descriptor( @@ -7808,8 +7787,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=29727, - serialized_end=30039, + serialized_start=29549, + serialized_end=29861, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_VERSION = _descriptor.Descriptor( @@ -7846,8 +7825,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=29417, - serialized_end=30039, + serialized_start=29239, + serialized_end=29861, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_TIME = _descriptor.Descriptor( @@ -7913,8 +7892,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=30041, - serialized_end=30156, + serialized_start=29863, + serialized_end=29978, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_NODE = _descriptor.Descriptor( @@ -7956,8 +7935,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=30158, - serialized_end=30218, + serialized_start=29980, + serialized_end=30040, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_CHAIN = _descriptor.Descriptor( @@ -8048,8 +8027,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=30221, - serialized_end=30516, + serialized_start=30043, + serialized_end=30338, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_NETWORK = _descriptor.Descriptor( @@ -8093,8 +8072,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=30518, - serialized_end=30585, + serialized_start=30340, + serialized_end=30407, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_STATESYNC = _descriptor.Descriptor( @@ -8173,8 +8152,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=30588, - serialized_end=30821, + serialized_start=30410, + serialized_end=30643, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0 = _descriptor.Descriptor( @@ -8239,8 +8218,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=28858, - serialized_end=30821, + serialized_start=28680, + serialized_end=30643, ) _GETSTATUSRESPONSE = _descriptor.Descriptor( @@ -8275,8 +8254,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=28756, - serialized_end=30832, + serialized_start=28578, + serialized_end=30654, ) _GETIDENTITYREQUEST_GETIDENTITYREQUESTV0.containing_type = _GETIDENTITYREQUEST @@ -8443,6 +8422,9 @@ _GETIDENTITIESCONTRACTKEYSRESPONSE.fields_by_name['v0']) _GETIDENTITIESCONTRACTKEYSRESPONSE.fields_by_name['v0'].containing_oneof = _GETIDENTITIESCONTRACTKEYSRESPONSE.oneofs_by_name['version'] _GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUEST_GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUESTV0.containing_type = _GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUEST +_GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUEST_GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUESTV0.oneofs_by_name['_epoch'].fields.append( + _GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUEST_GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUESTV0.fields_by_name['epoch']) +_GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUEST_GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUESTV0.fields_by_name['epoch'].containing_oneof = _GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUEST_GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUESTV0.oneofs_by_name['_epoch'] _GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUEST.fields_by_name['v0'].message_type = _GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUEST_GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUESTV0 _GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUEST.oneofs_by_name['version'].fields.append( _GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUEST.fields_by_name['v0']) @@ -8471,6 +8453,9 @@ _GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUEST_GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUESTV0.oneofs_by_name['start'].fields.append( _GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUEST_GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUESTV0.fields_by_name['start_at']) _GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUEST_GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUESTV0.fields_by_name['start_at'].containing_oneof = _GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUEST_GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUESTV0.oneofs_by_name['start'] +_GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUEST_GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUESTV0.oneofs_by_name['_epoch'].fields.append( + _GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUEST_GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUESTV0.fields_by_name['epoch']) +_GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUEST_GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUESTV0.fields_by_name['epoch'].containing_oneof = _GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUEST_GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUESTV0.oneofs_by_name['_epoch'] _GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUEST_GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUESTV0.oneofs_by_name['_limit'].fields.append( _GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUEST_GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUESTV0.fields_by_name['limit']) _GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUEST_GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUESTV0.fields_by_name['limit'].containing_oneof = _GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUEST_GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUESTV0.oneofs_by_name['_limit'] @@ -8478,8 +8463,6 @@ _GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUEST.oneofs_by_name['version'].fields.append( _GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUEST.fields_by_name['v0']) _GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUEST.fields_by_name['v0'].containing_oneof = _GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUEST.oneofs_by_name['version'] -_GETIDENTITIESBALANCESREQUEST_GETIDENTITIESBALANCESREQUESTV0_GETIDENTITIESBALANCESBYKNOWNIDENTITYIDS.containing_type = _GETIDENTITIESBALANCESREQUEST_GETIDENTITIESBALANCESREQUESTV0 -_GETIDENTITIESBALANCESREQUEST_GETIDENTITIESBALANCESREQUESTV0.fields_by_name['identities_ids'].message_type = _GETIDENTITIESBALANCESREQUEST_GETIDENTITIESBALANCESREQUESTV0_GETIDENTITIESBALANCESBYKNOWNIDENTITYIDS _GETIDENTITIESBALANCESREQUEST_GETIDENTITIESBALANCESREQUESTV0.containing_type = _GETIDENTITIESBALANCESREQUEST _GETIDENTITIESBALANCESREQUEST.fields_by_name['v0'].message_type = _GETIDENTITIESBALANCESREQUEST_GETIDENTITIESBALANCESREQUESTV0 _GETIDENTITIESBALANCESREQUEST.oneofs_by_name['version'].fields.append( @@ -9509,13 +9492,6 @@ GetIdentitiesBalancesRequest = _reflection.GeneratedProtocolMessageType('GetIdentitiesBalancesRequest', (_message.Message,), { 'GetIdentitiesBalancesRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentitiesBalancesRequestV0', (_message.Message,), { - - 'GetIdentitiesBalancesByKnownIdentityIds' : _reflection.GeneratedProtocolMessageType('GetIdentitiesBalancesByKnownIdentityIds', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITIESBALANCESREQUEST_GETIDENTITIESBALANCESREQUESTV0_GETIDENTITIESBALANCESBYKNOWNIDENTITYIDS, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds) - }) - , 'DESCRIPTOR' : _GETIDENTITIESBALANCESREQUEST_GETIDENTITIESBALANCESREQUESTV0, '__module__' : 'platform_pb2' # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0) @@ -9527,7 +9503,6 @@ }) _sym_db.RegisterMessage(GetIdentitiesBalancesRequest) _sym_db.RegisterMessage(GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0) -_sym_db.RegisterMessage(GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds) GetIdentitiesBalancesResponse = _reflection.GeneratedProtocolMessageType('GetIdentitiesBalancesResponse', (_message.Message,), { @@ -10531,8 +10506,8 @@ index=0, serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_start=30927, - serialized_end=35430, + serialized_start=30749, + serialized_end=35252, methods=[ _descriptor.MethodDescriptor( name='broadcastStateTransition', diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts index b017271418..f179705949 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts @@ -1343,6 +1343,8 @@ export namespace GetEvonodesProposedEpochBlocksByIdsRequest { } export class GetEvonodesProposedEpochBlocksByIdsRequestV0 extends jspb.Message { + hasEpoch(): boolean; + clearEpoch(): void; getEpoch(): number; setEpoch(value: number): void; @@ -1520,6 +1522,8 @@ export namespace GetEvonodesProposedEpochBlocksByRangeRequest { } export class GetEvonodesProposedEpochBlocksByRangeRequestV0 extends jspb.Message { + hasEpoch(): boolean; + clearEpoch(): void; getEpoch(): number; setEpoch(value: number): void; @@ -1601,10 +1605,12 @@ export namespace GetIdentitiesBalancesRequest { } export class GetIdentitiesBalancesRequestV0 extends jspb.Message { - hasIdentitiesIds(): boolean; - clearIdentitiesIds(): void; - getIdentitiesIds(): GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds | undefined; - setIdentitiesIds(value?: GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds): void; + clearIdsList(): void; + getIdsList(): Array; + getIdsList_asU8(): Array; + getIdsList_asB64(): Array; + setIdsList(value: Array): void; + addIds(value: Uint8Array | string, index?: number): Uint8Array | string; getProve(): boolean; setProve(value: boolean): void; @@ -1621,33 +1627,9 @@ export namespace GetIdentitiesBalancesRequest { export namespace GetIdentitiesBalancesRequestV0 { export type AsObject = { - identitiesIds?: GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.AsObject, + idsList: Array, prove: boolean, } - - export class GetIdentitiesBalancesByKnownIdentityIds extends jspb.Message { - clearIdentitiesIdsList(): void; - getIdentitiesIdsList(): Array; - getIdentitiesIdsList_asU8(): Array; - getIdentitiesIdsList_asB64(): Array; - setIdentitiesIdsList(value: Array): void; - addIdentitiesIds(value: Uint8Array | string, index?: number): Uint8Array | string; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetIdentitiesBalancesByKnownIdentityIds.AsObject; - static toObject(includeInstance: boolean, msg: GetIdentitiesBalancesByKnownIdentityIds): GetIdentitiesBalancesByKnownIdentityIds.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: GetIdentitiesBalancesByKnownIdentityIds, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetIdentitiesBalancesByKnownIdentityIds; - static deserializeBinaryFromReader(message: GetIdentitiesBalancesByKnownIdentityIds, reader: jspb.BinaryReader): GetIdentitiesBalancesByKnownIdentityIds; - } - - export namespace GetIdentitiesBalancesByKnownIdentityIds { - export type AsObject = { - identitiesIdsList: Array, - } - } } export enum VersionCase { diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js index 746f5210fd..5f0abd5da9 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js @@ -133,7 +133,6 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlock goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0', null, { proto }); @@ -1404,7 +1403,7 @@ if (goog.DEBUG && !COMPILED) { * @constructor */ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0 = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.repeatedFields_, null); }; goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -1414,27 +1413,6 @@ if (goog.DEBUG && !COMPILED) { */ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0'; } -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.repeatedFields_, null); -}; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds'; -} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -13367,8 +13345,8 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEv */ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getEpoch(); - if (f !== 0) { + f = /** @type {number} */ (jspb.Message.getField(message, 1)); + if (f != null) { writer.writeUint32( 1, f @@ -13405,7 +13383,25 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEv * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this */ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.setEpoch = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); + return jspb.Message.setField(this, 1, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.clearEpoch = function() { + return jspb.Message.setField(this, 1, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.hasEpoch = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -14611,8 +14607,8 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.Get */ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getEpoch(); - if (f !== 0) { + f = /** @type {number} */ (jspb.Message.getField(message, 1)); + if (f != null) { writer.writeUint32( 1, f @@ -14663,7 +14659,25 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.Get * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this */ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.setEpoch = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); + return jspb.Message.setField(this, 1, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.clearEpoch = function() { + return jspb.Message.setField(this, 1, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.hasEpoch = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -15018,6 +15032,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.serializeBinaryToWr +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.repeatedFields_ = [1]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -15049,7 +15070,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalanc */ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - identitiesIds: (f = msg.getIdentitiesIds()) && proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.toObject(includeInstance, f), + idsList: msg.getIdsList_asB64(), prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; @@ -15088,9 +15109,8 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalanc var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.deserializeBinaryFromReader); - msg.setIdentitiesIds(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addIds(value); break; case 2: var value = /** @type {boolean} */ (reader.readBool()); @@ -15125,12 +15145,11 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalanc */ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentitiesIds(); - if (f != null) { - writer.writeMessage( + f = message.getIdsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.serializeBinaryToWriter + f ); } f = message.getProve(); @@ -15143,163 +15162,44 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalanc }; - -/** - * List of repeated fields within this message type. - * @private {!Array} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.repeatedFields_ = [1]; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.toObject = function(includeInstance, msg) { - var f, obj = { - identitiesIdsList: msg.getIdentitiesIdsList_asB64() - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds; - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addIdentitiesIds(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getIdentitiesIdsList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 1, - f - ); - } -}; - - /** - * repeated bytes identities_ids = 1; + * repeated bytes ids = 1; * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.prototype.getIdentitiesIdsList = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getIdsList = function() { return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); }; /** - * repeated bytes identities_ids = 1; - * This is a type-conversion wrapper around `getIdentitiesIdsList()` + * repeated bytes ids = 1; + * This is a type-conversion wrapper around `getIdsList()` * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.prototype.getIdentitiesIdsList_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getIdsList_asB64 = function() { return /** @type {!Array} */ (jspb.Message.bytesListAsB64( - this.getIdentitiesIdsList())); + this.getIdsList())); }; /** - * repeated bytes identities_ids = 1; + * repeated bytes ids = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentitiesIdsList()` + * This is a type-conversion wrapper around `getIdsList()` * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.prototype.getIdentitiesIdsList_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getIdsList_asU8 = function() { return /** @type {!Array} */ (jspb.Message.bytesListAsU8( - this.getIdentitiesIdsList())); + this.getIdsList())); }; /** * @param {!(Array|Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.prototype.setIdentitiesIdsList = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.setIdsList = function(value) { return jspb.Message.setField(this, 1, value || []); }; @@ -15307,56 +15207,19 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalanc /** * @param {!(string|Uint8Array)} value * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.prototype.addIdentitiesIds = function(value, opt_index) { +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.addIds = function(value, opt_index) { return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds.prototype.clearIdentitiesIdsList = function() { - return this.setIdentitiesIdsList([]); -}; - - -/** - * optional GetIdentitiesBalancesByKnownIdentityIds identities_ids = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getIdentitiesIds = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.GetIdentitiesBalancesByKnownIdentityIds|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.setIdentitiesIds = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.clearIdentitiesIds = function() { - return this.setIdentitiesIds(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.hasIdentitiesIds = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.clearIdsList = function() { + return this.setIdsList([]); }; diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index b46e45c071..a60b2363ad 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.3.0", + "version": "1.4.0-dev.1", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index 9fb334c4e7..0e6a27e61a 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.3.0", + "version": "1.4.0-dev.1", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index 658852b865..184d91d8ac 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "2.3.0", + "version": "2.4.0-dev.1", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/configs/getConfigFileMigrationsFactory.js b/packages/dashmate/configs/getConfigFileMigrationsFactory.js index 3131f435a0..4b04f1376e 100644 --- a/packages/dashmate/configs/getConfigFileMigrationsFactory.js +++ b/packages/dashmate/configs/getConfigFileMigrationsFactory.js @@ -902,6 +902,15 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) }); return configFile; }, + '1.4.0-dev.1': (configFile) => { + Object.entries(configFile.configs) + .forEach(([, options]) => { + options.platform.drive.tenderdash.docker.image = 'dashpay/tenderdash:1.3'; + options.platform.drive.abci.docker.image = 'dashpay/drive:1-dev'; + options.platform.dapi.api.docker.image = 'dashpay/dapi:1-dev'; + }); + return configFile; + }, }; } diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index 4a04956ccc..0479cce9b8 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.3.0", + "version": "1.4.0-dev.1", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index 6efcb83f63..cdb3ea808e 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.3.0" +version = "1.4.0-dev.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index 96f0356074..a13c5e8590 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.3.0", + "version": "1.4.0-dev.1", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index a49e9512a3..84cf2284a0 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.3.0" +version = "1.4.0-dev.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 248a26eeb6..8b66395d80 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.3.0" +version = "1.4.0-dev.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index cc3187f1c6..440a7beb75 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.3.0", + "version": "1.4.0-dev.1", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index 2044bbbf66..2bfb4c0087 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.3.0" +version = "1.4.0-dev.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index 34bf2c1210..0e7889df7a 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.3.0", + "version": "1.4.0-dev.1", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index 516e8514b1..27fb6d3f51 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.3.0", + "version": "1.4.0-dev.1", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index ab854954b1..02124c466d 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.3.0", + "version": "1.4.0-dev.1", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index 5fbfd27173..49c81c24db 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.3.0" +version = "1.4.0-dev.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index 2d2a3d2988..3610bd1ae6 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.3.0", + "version": "1.4.0-dev.1", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index d50fb65b87..336b45bed5 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.3.0", + "version": "1.4.0-dev.1", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index 7c805d47d0..c95a2a458d 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.3.0" +version = "1.4.0-dev.1" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index b5d58b4be4..5db0e75748 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.3.0" +version = "1.4.0-dev.1" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 9f72b6ea77..1c3d3bf544 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.3.0" +version = "1.4.0-dev.1" edition = "2021" rust-version.workspace = true authors = [ @@ -70,7 +70,7 @@ once_cell = "1.19.0" [dev-dependencies] test-case = { version = "2.0" } tokio = { version = "1.17", features = ["full"] } -pretty_assertions = { version = "1.3.0" } +pretty_assertions = { version = "1.4.1" } dpp = { path = ".", features = ["all_features_without_client"] } assert_matches = "1.5.0" once_cell = "1.7" diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index b425853896..ca00dc1c2b 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -231,6 +231,8 @@ impl ErrorWithCode for StateError { Self::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError(_) => 40211, Self::DocumentTypeUpdateError(_) => 40212, Self::DataContractUpdatePermissionError(_) => 40213, + Self::MissingTransferKeyError(_) => 40214, + Self::NoTransferKeyForCoreWithdrawalAvailableError(_) => 40215, // Voting Errors: 40300-40399 Self::MasternodeNotFoundError(_) => 40300, diff --git a/packages/rs-dpp/src/errors/consensus/signature/invalid_signature_public_key_purpose_error.rs b/packages/rs-dpp/src/errors/consensus/signature/invalid_signature_public_key_purpose_error.rs index 55a0596439..1477f7b1d9 100644 --- a/packages/rs-dpp/src/errors/consensus/signature/invalid_signature_public_key_purpose_error.rs +++ b/packages/rs-dpp/src/errors/consensus/signature/invalid_signature_public_key_purpose_error.rs @@ -8,11 +8,12 @@ use crate::errors::ProtocolError; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; use bincode::{Decode, Encode}; +use itertools::Itertools; #[derive( Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, )] -#[error("Invalid public key purpose {public_key_purpose}. The state transition requires {allowed_key_purpose}")] +#[error("Invalid public key purpose {public_key_purpose}. The state transition requires {}", allowed_key_purposes.iter().map(|s| s.to_string()).join(" | "))] #[platform_serialize(unversioned)] pub struct InvalidSignaturePublicKeyPurposeError { /* @@ -21,22 +22,22 @@ pub struct InvalidSignaturePublicKeyPurposeError { */ public_key_purpose: Purpose, - allowed_key_purpose: Purpose, + allowed_key_purposes: Vec, } impl InvalidSignaturePublicKeyPurposeError { - pub fn new(public_key_purpose: Purpose, allowed_key_purpose: Purpose) -> Self { + pub fn new(public_key_purpose: Purpose, allowed_key_purposes: Vec) -> Self { Self { public_key_purpose, - allowed_key_purpose, + allowed_key_purposes, } } pub fn public_key_purpose(&self) -> Purpose { self.public_key_purpose } - pub fn allowed_key_purpose(&self) -> Purpose { - self.allowed_key_purpose + pub fn allowed_key_purposes(&self) -> &Vec { + &self.allowed_key_purposes } } diff --git a/packages/rs-dpp/src/errors/consensus/signature/wrong_public_key_purpose_error.rs b/packages/rs-dpp/src/errors/consensus/signature/wrong_public_key_purpose_error.rs index 501cf0d64b..4ea2b0c246 100644 --- a/packages/rs-dpp/src/errors/consensus/signature/wrong_public_key_purpose_error.rs +++ b/packages/rs-dpp/src/errors/consensus/signature/wrong_public_key_purpose_error.rs @@ -8,11 +8,12 @@ use crate::errors::ProtocolError; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; use bincode::{Decode, Encode}; +use itertools::Itertools; #[derive( Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, )] -#[error("Invalid identity key purpose {public_key_purpose}. This state transition requires {key_purpose_requirement}")] +#[error("Invalid identity key purpose {public_key_purpose}. This state transition requires {}", allowed_key_purposes.iter().map(|s| s.to_string()).join(" | "))] #[platform_serialize(unversioned)] pub struct WrongPublicKeyPurposeError { /* @@ -21,22 +22,22 @@ pub struct WrongPublicKeyPurposeError { */ public_key_purpose: Purpose, - key_purpose_requirement: Purpose, + allowed_key_purposes: Vec, } impl WrongPublicKeyPurposeError { - pub fn new(public_key_purpose: Purpose, key_purpose_requirement: Purpose) -> Self { + pub fn new(public_key_purpose: Purpose, allowed_key_purposes: Vec) -> Self { Self { public_key_purpose, - key_purpose_requirement, + allowed_key_purposes, } } pub fn public_key_purpose(&self) -> Purpose { self.public_key_purpose } - pub fn key_purpose_requirement(&self) -> Purpose { - self.key_purpose_requirement + pub fn allowed_key_purposes(&self) -> &Vec { + &self.allowed_key_purposes } } @@ -56,7 +57,7 @@ impl From for Conse Self::SignatureError(SignatureError::WrongPublicKeyPurposeError( WrongPublicKeyPurposeError::new( value.public_key_purpose(), - value.key_purpose_requirement(), + value.allowed_key_purposes().clone(), ), )) } diff --git a/packages/rs-dpp/src/errors/consensus/state/identity/missing_transfer_key_error.rs b/packages/rs-dpp/src/errors/consensus/state/identity/missing_transfer_key_error.rs new file mode 100644 index 0000000000..2f14ccacbc --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/identity/missing_transfer_key_error.rs @@ -0,0 +1,36 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::errors::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Identity {identity_id} does not have a key for transferring funds")] +#[platform_serialize(unversioned)] +pub struct MissingTransferKeyError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + identity_id: Identifier, +} + +impl MissingTransferKeyError { + pub fn new(identity_id: Identifier) -> Self { + Self { identity_id } + } + + pub fn identity_id(&self) -> &Identifier { + &self.identity_id + } +} +impl From for ConsensusError { + fn from(err: MissingTransferKeyError) -> Self { + Self::StateError(StateError::MissingTransferKeyError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs b/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs index 53a60d0ed4..35e6f7f79a 100644 --- a/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs @@ -14,3 +14,5 @@ pub mod invalid_identity_revision_error; pub mod master_public_key_update_error; pub mod max_identity_public_key_limit_reached_error; pub mod missing_identity_public_key_ids_error; +pub mod missing_transfer_key_error; +pub mod no_transfer_key_for_core_withdrawal_available_error; diff --git a/packages/rs-dpp/src/errors/consensus/state/identity/no_transfer_key_for_core_withdrawal_available_error.rs b/packages/rs-dpp/src/errors/consensus/state/identity/no_transfer_key_for_core_withdrawal_available_error.rs new file mode 100644 index 0000000000..77f5d52305 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/identity/no_transfer_key_for_core_withdrawal_available_error.rs @@ -0,0 +1,38 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::errors::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("There is no transfer key that can be used for a withdrawal")] +#[platform_serialize(unversioned)] +pub struct NoTransferKeyForCoreWithdrawalAvailableError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + identity_id: Identifier, +} + +impl NoTransferKeyForCoreWithdrawalAvailableError { + pub fn new(identity_id: Identifier) -> Self { + Self { identity_id } + } + + pub fn identity_id(&self) -> &Identifier { + &self.identity_id + } +} +impl From for ConsensusError { + fn from(err: NoTransferKeyForCoreWithdrawalAvailableError) -> Self { + Self::StateError(StateError::NoTransferKeyForCoreWithdrawalAvailableError( + err, + )) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/state_error.rs b/packages/rs-dpp/src/errors/consensus/state/state_error.rs index 4cc4991c6c..ab98b5c6fe 100644 --- a/packages/rs-dpp/src/errors/consensus/state/state_error.rs +++ b/packages/rs-dpp/src/errors/consensus/state/state_error.rs @@ -37,6 +37,8 @@ use crate::consensus::state::document::document_incorrect_purchase_price_error:: use crate::consensus::state::document::document_not_for_sale_error::DocumentNotForSaleError; use crate::consensus::state::identity::identity_public_key_already_exists_for_unique_contract_bounds_error::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError; use crate::consensus::state::identity::invalid_identity_contract_nonce_error::InvalidIdentityNonceError; +use crate::consensus::state::identity::missing_transfer_key_error::MissingTransferKeyError; +use crate::consensus::state::identity::no_transfer_key_for_core_withdrawal_available_error::NoTransferKeyForCoreWithdrawalAvailableError; use crate::consensus::state::prefunded_specialized_balances::prefunded_specialized_balance_insufficient_error::PrefundedSpecializedBalanceInsufficientError; use crate::consensus::state::prefunded_specialized_balances::prefunded_specialized_balance_not_found_error::PrefundedSpecializedBalanceNotFoundError; use crate::consensus::state::voting::masternode_incorrect_voter_identity_id_error::MasternodeIncorrectVoterIdentityIdError; @@ -122,6 +124,12 @@ pub enum StateError { #[error(transparent)] MissingIdentityPublicKeyIdsError(MissingIdentityPublicKeyIdsError), + #[error(transparent)] + MissingTransferKeyError(MissingTransferKeyError), + + #[error(transparent)] + NoTransferKeyForCoreWithdrawalAvailableError(NoTransferKeyForCoreWithdrawalAvailableError), + #[error(transparent)] InvalidIdentityPublicKeyIdError(InvalidIdentityPublicKeyIdError), diff --git a/packages/rs-dpp/src/identity/core_script.rs b/packages/rs-dpp/src/identity/core_script.rs index 96cea532c7..8aa7fd38a4 100644 --- a/packages/rs-dpp/src/identity/core_script.rs +++ b/packages/rs-dpp/src/identity/core_script.rs @@ -39,18 +39,22 @@ impl CoreScript { Self(bytes.into()) } - pub fn random_p2pkh(rng: &mut StdRng) -> Self { + pub fn new_p2pkh(key_hash: [u8; 20]) -> Self { let mut bytes: Vec = vec![ opcodes::all::OP_DUP.to_u8(), opcodes::all::OP_HASH160.to_u8(), opcodes::all::OP_PUSHBYTES_20.to_u8(), ]; - bytes.append(&mut rng.gen::<[u8; 20]>().to_vec()); + bytes.extend_from_slice(&key_hash); bytes.push(opcodes::all::OP_EQUALVERIFY.to_u8()); bytes.push(opcodes::all::OP_CHECKSIG.to_u8()); Self::from_bytes(bytes) } + pub fn random_p2pkh(rng: &mut StdRng) -> Self { + Self::new_p2pkh(rng.gen::<[u8; 20]>()) + } + pub fn random_p2sh(rng: &mut StdRng) -> Self { let mut bytes = vec![ opcodes::all::OP_HASH160.to_u8(), diff --git a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs index 0e469272da..d91bec6626 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs @@ -100,6 +100,17 @@ impl KeyType { } } + /// Can this key type be understood as an address on the Core chain? + pub fn is_core_address_key_type(&self) -> bool { + match self { + KeyType::ECDSA_SECP256K1 => false, + KeyType::BLS12_381 => false, + KeyType::ECDSA_HASH160 => true, + KeyType::BIP13_SCRIPT_HASH => true, + KeyType::EDDSA_25519_HASH160 => false, + } + } + pub fn signature_verify_cost( &self, platform_version: &PlatformVersion, diff --git a/packages/rs-dpp/src/identity/identity_public_key/security_level.rs b/packages/rs-dpp/src/identity/identity_public_key/security_level.rs index 978134016b..4cd9f0d2ed 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/security_level.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/security_level.rs @@ -35,6 +35,23 @@ pub enum SecurityLevel { MEDIUM = 3, } +impl From for [u8; 1] { + fn from(security_level: SecurityLevel) -> Self { + [security_level as u8] + } +} + +impl From for &'static [u8; 1] { + fn from(security_level: SecurityLevel) -> Self { + match security_level { + SecurityLevel::MASTER => &[0], + SecurityLevel::CRITICAL => &[1], + SecurityLevel::HIGH => &[2], + SecurityLevel::MEDIUM => &[3], + } + } +} + #[cfg(feature = "cbor")] impl Into for SecurityLevel { fn into(self) -> CborValue { diff --git a/packages/rs-dpp/src/identity/signer.rs b/packages/rs-dpp/src/identity/signer.rs index 549a55da42..e069e43a11 100644 --- a/packages/rs-dpp/src/identity/signer.rs +++ b/packages/rs-dpp/src/identity/signer.rs @@ -10,4 +10,7 @@ pub trait Signer: Sync + Debug { identity_public_key: &IdentityPublicKey, data: &[u8], ) -> Result; + + /// do we have this identity public key in the signer? + fn can_sign_with(&self, identity_public_key: &IdentityPublicKey) -> bool; } diff --git a/packages/rs-dpp/src/lib.rs b/packages/rs-dpp/src/lib.rs index d2dc8b7f6e..59fd2fb3d6 100644 --- a/packages/rs-dpp/src/lib.rs +++ b/packages/rs-dpp/src/lib.rs @@ -52,6 +52,7 @@ pub mod signing; #[cfg(feature = "system_contracts")] pub mod system_data_contracts; pub mod voting; + pub mod withdrawal; pub use async_trait; diff --git a/packages/rs-dpp/src/state_transition/errors/wrong_public_key_purpose_error.rs b/packages/rs-dpp/src/state_transition/errors/wrong_public_key_purpose_error.rs index 7f1fdb8522..5b469e2fa9 100644 --- a/packages/rs-dpp/src/state_transition/errors/wrong_public_key_purpose_error.rs +++ b/packages/rs-dpp/src/state_transition/errors/wrong_public_key_purpose_error.rs @@ -2,27 +2,28 @@ use thiserror::Error; use crate::identity::Purpose; use crate::ProtocolError; +use itertools::Itertools; #[derive(Error, Debug, Clone, PartialEq, Eq)] -#[error("Invalid identity key purpose {public_key_purpose}. This state transition requires {key_purpose_requirement}")] +#[error("Invalid identity key purpose {public_key_purpose}. This state transition requires {}", allowed_key_purposes.iter().map(|s| s.to_string()).join(" | "))] pub struct WrongPublicKeyPurposeError { public_key_purpose: Purpose, - key_purpose_requirement: Purpose, + allowed_key_purposes: Vec, } impl WrongPublicKeyPurposeError { - pub fn new(public_key_purpose: Purpose, key_purpose_requirement: Purpose) -> Self { + pub fn new(public_key_purpose: Purpose, allowed_key_purposes: Vec) -> Self { Self { public_key_purpose, - key_purpose_requirement, + allowed_key_purposes, } } pub fn public_key_purpose(&self) -> Purpose { self.public_key_purpose } - pub fn key_purpose_requirement(&self) -> Purpose { - self.key_purpose_requirement + pub fn allowed_key_purposes(&self) -> &Vec { + &self.allowed_key_purposes } } diff --git a/packages/rs-dpp/src/state_transition/mod.rs b/packages/rs-dpp/src/state_transition/mod.rs index 879bb6e871..bc20c6ab0a 100644 --- a/packages/rs-dpp/src/state_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/mod.rs @@ -400,12 +400,12 @@ impl StateTransition { } /// returns the key security level requirement for the state transition - pub fn security_level_requirement(&self) -> Option> { - call_getter_method_identity_signed!(self, security_level_requirement) + pub fn security_level_requirement(&self, purpose: Purpose) -> Option> { + call_getter_method_identity_signed!(self, security_level_requirement, purpose) } /// returns the key purpose requirement for the state transition - pub fn purpose_requirement(&self) -> Option { + pub fn purpose_requirement(&self) -> Option> { call_getter_method_identity_signed!(self, purpose_requirement) } @@ -457,7 +457,7 @@ impl StateTransition { return Err(ProtocolError::WrongPublicKeyPurposeError( WrongPublicKeyPurposeError::new( identity_public_key.purpose(), - Purpose::AUTHENTICATION, + vec![Purpose::AUTHENTICATION], ), )); } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/identity_signed.rs index fe0bff68c7..4b2704c07d 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/identity_signed.rs @@ -1,4 +1,4 @@ -use crate::identity::{KeyID, SecurityLevel}; +use crate::identity::{KeyID, Purpose, SecurityLevel}; use crate::state_transition::data_contract_create_transition::DataContractCreateTransition; use crate::state_transition::StateTransitionIdentitySigned; @@ -17,9 +17,11 @@ impl StateTransitionIdentitySigned for DataContractCreateTransition { } } - fn security_level_requirement(&self) -> Vec { + fn security_level_requirement(&self, purpose: Purpose) -> Vec { match self { - DataContractCreateTransition::V0(transition) => transition.security_level_requirement(), + DataContractCreateTransition::V0(transition) => { + transition.security_level_requirement(purpose) + } } } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/identity_signed.rs index c7b4464dec..be2682bc82 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/identity_signed.rs @@ -1,5 +1,5 @@ use crate::identity::SecurityLevel::{CRITICAL, HIGH}; -use crate::identity::{KeyID, SecurityLevel}; +use crate::identity::{KeyID, Purpose, SecurityLevel}; use crate::state_transition::data_contract_create_transition::DataContractCreateTransitionV0; use crate::state_transition::StateTransitionIdentitySigned; @@ -12,7 +12,7 @@ impl StateTransitionIdentitySigned for DataContractCreateTransitionV0 { self.signature_public_key_id = key_id } - fn security_level_requirement(&self) -> Vec { + fn security_level_requirement(&self, _purpose: Purpose) -> Vec { vec![CRITICAL, HIGH] } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs index ca6fe4e148..f1ed8c9b36 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs @@ -65,11 +65,11 @@ impl DataContractCreateTransitionMethodsV0 for DataContractCreateTransitionV0 { )), )?; - let security_level_requirements = state_transition.security_level_requirement().ok_or( - ProtocolError::CorruptedCodeExecution( + let security_level_requirements = state_transition + .security_level_requirement(public_key.purpose()) + .ok_or(ProtocolError::CorruptedCodeExecution( "expected security level requirements".to_string(), - ), - )?; + ))?; if !security_level_requirements.contains(&public_key.security_level()) { return Err(ProtocolError::ConsensusError(Box::new( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/identity_signed.rs index b56e0dd30b..50c8cb9ce4 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/identity_signed.rs @@ -1,4 +1,4 @@ -use crate::identity::{KeyID, SecurityLevel}; +use crate::identity::{KeyID, Purpose, SecurityLevel}; use crate::state_transition::data_contract_update_transition::DataContractUpdateTransition; use crate::state_transition::StateTransitionIdentitySigned; @@ -18,9 +18,11 @@ impl StateTransitionIdentitySigned for DataContractUpdateTransition { } } - fn security_level_requirement(&self) -> Vec { + fn security_level_requirement(&self, purpose: Purpose) -> Vec { match self { - DataContractUpdateTransition::V0(transition) => transition.security_level_requirement(), + DataContractUpdateTransition::V0(transition) => { + transition.security_level_requirement(purpose) + } } } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/identity_signed.rs index 6508a9ab76..3c39e2d90a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/identity_signed.rs @@ -1,5 +1,5 @@ use crate::identity::SecurityLevel::CRITICAL; -use crate::identity::{KeyID, SecurityLevel}; +use crate::identity::{KeyID, Purpose, SecurityLevel}; use crate::state_transition::data_contract_update_transition::DataContractUpdateTransitionV0; use crate::state_transition::StateTransitionIdentitySigned; @@ -12,7 +12,7 @@ impl StateTransitionIdentitySigned for DataContractUpdateTransitionV0 { self.signature_public_key_id = key_id } - fn security_level_requirement(&self) -> Vec { + fn security_level_requirement(&self, _purpose: Purpose) -> Vec { vec![CRITICAL] } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/identity_signed.rs index f5d5f967aa..3d8a2d1486 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/identity_signed.rs @@ -1,4 +1,4 @@ -use crate::identity::{KeyID, SecurityLevel}; +use crate::identity::{KeyID, Purpose, SecurityLevel}; use crate::state_transition::documents_batch_transition::DocumentsBatchTransition; use crate::state_transition::StateTransitionIdentitySigned; @@ -17,9 +17,11 @@ impl StateTransitionIdentitySigned for DocumentsBatchTransition { } } - fn security_level_requirement(&self) -> Vec { + fn security_level_requirement(&self, purpose: Purpose) -> Vec { match self { - DocumentsBatchTransition::V0(transition) => transition.security_level_requirement(), + DocumentsBatchTransition::V0(transition) => { + transition.security_level_requirement(purpose) + } } } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/identity_signed.rs index fd4916864a..bdc0fe583a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/identity_signed.rs @@ -1,5 +1,5 @@ use crate::identity::SecurityLevel::{CRITICAL, HIGH, MEDIUM}; -use crate::identity::{KeyID, SecurityLevel}; +use crate::identity::{KeyID, Purpose, SecurityLevel}; use crate::state_transition::documents_batch_transition::DocumentsBatchTransitionV0; use crate::state_transition::StateTransitionIdentitySigned; @@ -13,7 +13,7 @@ impl StateTransitionIdentitySigned for DocumentsBatchTransitionV0 { self.signature_public_key_id = key_id } - fn security_level_requirement(&self) -> Vec { + fn security_level_requirement(&self, _purpose: Purpose) -> Vec { // These are the available key levels that must sign the state transition // However the fact that it is signed by one of these does not guarantee that it // meets the security level requirement, as that is dictated from within the data diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/identity_signed.rs index 4b3b448eb5..60dd03cf6f 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/identity_signed.rs @@ -19,15 +19,15 @@ impl StateTransitionIdentitySigned for IdentityCreditTransferTransition { } } - fn security_level_requirement(&self) -> Vec { + fn security_level_requirement(&self, purpose: Purpose) -> Vec { match self { IdentityCreditTransferTransition::V0(transition) => { - transition.security_level_requirement() + transition.security_level_requirement(purpose) } } } - fn purpose_requirement(&self) -> Purpose { + fn purpose_requirement(&self) -> Vec { match self { IdentityCreditTransferTransition::V0(transition) => transition.purpose_requirement(), } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/identity_signed.rs index bcab635e22..acc328d274 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/identity_signed.rs @@ -12,11 +12,11 @@ impl StateTransitionIdentitySigned for IdentityCreditTransferTransitionV0 { self.signature_public_key_id = key_id } - fn security_level_requirement(&self) -> Vec { + fn security_level_requirement(&self, _purpose: Purpose) -> Vec { vec![CRITICAL] } - fn purpose_requirement(&self) -> Purpose { - Purpose::TRANSFER + fn purpose_requirement(&self) -> Vec { + vec![Purpose::TRANSFER] } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/mod.rs index dbf33c5a56..eb952d6509 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/mod.rs @@ -13,6 +13,7 @@ impl IdentityCreditWithdrawalTransitionAccessorsV0 for IdentityCreditWithdrawalT fn identity_id(&self) -> Identifier { match self { IdentityCreditWithdrawalTransition::V0(transition) => transition.identity_id, + IdentityCreditWithdrawalTransition::V1(transition) => transition.identity_id, } } @@ -21,12 +22,16 @@ impl IdentityCreditWithdrawalTransitionAccessorsV0 for IdentityCreditWithdrawalT IdentityCreditWithdrawalTransition::V0(transition) => { transition.identity_id = identity_id; } + IdentityCreditWithdrawalTransition::V1(transition) => { + transition.identity_id = identity_id; + } } } fn amount(&self) -> u64 { match self { IdentityCreditWithdrawalTransition::V0(transition) => transition.amount, + IdentityCreditWithdrawalTransition::V1(transition) => transition.amount, } } @@ -35,24 +40,30 @@ impl IdentityCreditWithdrawalTransitionAccessorsV0 for IdentityCreditWithdrawalT IdentityCreditWithdrawalTransition::V0(transition) => { transition.amount = amount; } + IdentityCreditWithdrawalTransition::V1(transition) => { + transition.amount = amount; + } } } fn set_nonce(&mut self, nonce: IdentityNonce) { match self { IdentityCreditWithdrawalTransition::V0(transition) => transition.nonce = nonce, + IdentityCreditWithdrawalTransition::V1(transition) => transition.nonce = nonce, } } fn nonce(&self) -> IdentityNonce { match self { IdentityCreditWithdrawalTransition::V0(transition) => transition.nonce, + IdentityCreditWithdrawalTransition::V1(transition) => transition.nonce, } } fn pooling(&self) -> Pooling { match self { IdentityCreditWithdrawalTransition::V0(transition) => transition.pooling, + IdentityCreditWithdrawalTransition::V1(transition) => transition.pooling, } } @@ -61,12 +72,16 @@ impl IdentityCreditWithdrawalTransitionAccessorsV0 for IdentityCreditWithdrawalT IdentityCreditWithdrawalTransition::V0(transition) => { transition.pooling = pooling; } + IdentityCreditWithdrawalTransition::V1(transition) => { + transition.pooling = pooling; + } } } fn core_fee_per_byte(&self) -> u32 { match self { IdentityCreditWithdrawalTransition::V0(transition) => transition.core_fee_per_byte, + IdentityCreditWithdrawalTransition::V1(transition) => transition.core_fee_per_byte, } } @@ -75,18 +90,29 @@ impl IdentityCreditWithdrawalTransitionAccessorsV0 for IdentityCreditWithdrawalT IdentityCreditWithdrawalTransition::V0(transition) => { transition.core_fee_per_byte = core_fee_per_byte; } + IdentityCreditWithdrawalTransition::V1(transition) => { + transition.core_fee_per_byte = core_fee_per_byte; + } } } - fn output_script(&self) -> CoreScript { + fn output_script(&self) -> Option { match self { - IdentityCreditWithdrawalTransition::V0(transition) => transition.output_script.clone(), + IdentityCreditWithdrawalTransition::V0(transition) => { + Some(transition.output_script.clone()) + } + IdentityCreditWithdrawalTransition::V1(transition) => transition.output_script.clone(), } } - fn set_output_script(&mut self, output_script: CoreScript) { + fn set_output_script(&mut self, output_script: Option) { match self { IdentityCreditWithdrawalTransition::V0(transition) => { + if let Some(output_script) = output_script { + transition.output_script = output_script; + } + } + IdentityCreditWithdrawalTransition::V1(transition) => { transition.output_script = output_script; } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/v0/mod.rs index 1bcd8b2945..2e666ac1c7 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/v0/mod.rs @@ -14,6 +14,6 @@ pub trait IdentityCreditWithdrawalTransitionAccessorsV0 { fn set_pooling(&mut self, pooling: Pooling); fn core_fee_per_byte(&self) -> u32; fn set_core_fee_per_byte(&mut self, amount: u32); - fn output_script(&self) -> CoreScript; - fn set_output_script(&mut self, output_script: CoreScript); + fn output_script(&self) -> Option; + fn set_output_script(&mut self, output_script: Option); } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/identity_signed.rs index 2dd369f3b3..75165fbb7d 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/identity_signed.rs @@ -8,6 +8,9 @@ impl StateTransitionIdentitySigned for IdentityCreditWithdrawalTransition { IdentityCreditWithdrawalTransition::V0(transition) => { transition.signature_public_key_id() } + IdentityCreditWithdrawalTransition::V1(transition) => { + transition.signature_public_key_id() + } } } @@ -16,20 +19,27 @@ impl StateTransitionIdentitySigned for IdentityCreditWithdrawalTransition { IdentityCreditWithdrawalTransition::V0(transition) => { transition.set_signature_public_key_id(key_id) } + IdentityCreditWithdrawalTransition::V1(transition) => { + transition.set_signature_public_key_id(key_id) + } } } - fn security_level_requirement(&self) -> Vec { + fn security_level_requirement(&self, purpose: Purpose) -> Vec { match self { IdentityCreditWithdrawalTransition::V0(transition) => { - transition.security_level_requirement() + transition.security_level_requirement(purpose) + } + IdentityCreditWithdrawalTransition::V1(transition) => { + transition.security_level_requirement(purpose) } } } - fn purpose_requirement(&self) -> Purpose { + fn purpose_requirement(&self) -> Vec { match self { IdentityCreditWithdrawalTransition::V0(transition) => transition.purpose_requirement(), + IdentityCreditWithdrawalTransition::V1(transition) => transition.purpose_requirement(), } } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/json_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/json_conversion.rs index b5a5946e62..ada6044e54 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/json_conversion.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/json_conversion.rs @@ -22,6 +22,15 @@ impl<'a> StateTransitionJsonConvert<'a> for IdentityCreditWithdrawalTransition { ); Ok(value) } + IdentityCreditWithdrawalTransition::V1(transition) => { + let mut value = transition.to_json(options)?; + let map_value = value.as_object_mut().expect("expected an object"); + map_value.insert( + STATE_TRANSITION_PROTOCOL_VERSION.to_string(), + JsonValue::Number(Number::from(1)), + ); + Ok(value) + } } } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/mod.rs index 96b2654046..acab5d8f3c 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/mod.rs @@ -17,7 +17,7 @@ use crate::identity::IdentityPublicKey; #[cfg(feature = "state-transition-signing")] use crate::prelude::{IdentityNonce, UserFeeIncrease}; #[cfg(feature = "state-transition-signing")] -use crate::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; +use crate::state_transition::identity_credit_withdrawal_transition::v1::IdentityCreditWithdrawalTransitionV1; #[cfg(feature = "state-transition-signing")] use crate::state_transition::StateTransition; #[cfg(feature = "state-transition-signing")] @@ -31,13 +31,14 @@ impl IdentityCreditWithdrawalTransitionMethodsV0 for IdentityCreditWithdrawalTra #[cfg(feature = "state-transition-signing")] fn try_from_identity( identity: &Identity, - withdrawal_key_to_use: Option<&IdentityPublicKey>, - output_script: CoreScript, + output_script: Option, amount: u64, pooling: Pooling, core_fee_per_byte: u32, user_fee_increase: UserFeeIncrease, signer: S, + signing_withdrawal_key_to_use: Option<&IdentityPublicKey>, + preferred_key_purpose_for_signing_withdrawal: PreferredKeyPurposeForSigningWithdrawal, nonce: IdentityNonce, platform_version: &PlatformVersion, version: Option, @@ -48,22 +49,25 @@ impl IdentityCreditWithdrawalTransitionMethodsV0 for IdentityCreditWithdrawalTra .state_transition_conversion_versions .identity_to_identity_withdrawal_transition, ) { - 0 => Ok(IdentityCreditWithdrawalTransitionV0::try_from_identity( + 1 => Ok(IdentityCreditWithdrawalTransitionV1::try_from_identity( identity, - withdrawal_key_to_use, output_script, amount, pooling, core_fee_per_byte, user_fee_increase, signer, + signing_withdrawal_key_to_use, + preferred_key_purpose_for_signing_withdrawal, nonce, platform_version, version, )?), - v => Err(ProtocolError::UnknownVersionError(format!( - "Unknown IdentityCreditWithdrawalTransition version for try_from_identity {v}" - ))), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "IdentityCreditWithdrawalTransition::try_from_identity".to_string(), + known_versions: vec![1], + received: version, + }), } } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs index 0341f253f1..d143eaae31 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs @@ -1,34 +1,43 @@ #[cfg(feature = "state-transition-signing")] -use crate::identity::core_script::CoreScript; -#[cfg(feature = "state-transition-signing")] -use crate::identity::signer::Signer; -#[cfg(feature = "state-transition-signing")] -use crate::identity::Identity; -#[cfg(feature = "state-transition-signing")] -use crate::identity::IdentityPublicKey; -#[cfg(feature = "state-transition-signing")] -use crate::prelude::{IdentityNonce, UserFeeIncrease}; -#[cfg(feature = "state-transition-signing")] -use crate::state_transition::StateTransition; +use crate::{ + identity::{core_script::CoreScript, signer::Signer, Identity, IdentityPublicKey}, + prelude::{IdentityNonce, UserFeeIncrease}, + state_transition::StateTransition, + withdrawal::Pooling, + ProtocolError, +}; + use crate::state_transition::StateTransitionType; #[cfg(feature = "state-transition-signing")] -use crate::withdrawal::Pooling; -#[cfg(feature = "state-transition-signing")] -use crate::ProtocolError; -#[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; +/// The key purpose that is preferred for signing the withdrawal +#[cfg(feature = "state-transition-signing")] +pub enum PreferredKeyPurposeForSigningWithdrawal { + /// Use any key + Any, + /// Use the master key, then the transfer key + MasterPreferred, + /// Use the transfer key, then the master key + TransferPreferred, + /// Only use the master key + MasterOnly, + /// Only use the transfer key + TransferOnly, +} + pub trait IdentityCreditWithdrawalTransitionMethodsV0 { #[cfg(feature = "state-transition-signing")] fn try_from_identity( identity: &Identity, - withdrawal_key_to_use: Option<&IdentityPublicKey>, - output_script: CoreScript, + output_script: Option, amount: u64, pooling: Pooling, core_fee_per_byte: u32, user_fee_increase: UserFeeIncrease, signer: S, + signing_withdrawal_key_to_use: Option<&IdentityPublicKey>, + preferred_key_purpose_for_signing_withdrawal: PreferredKeyPurposeForSigningWithdrawal, nonce: IdentityNonce, platform_version: &PlatformVersion, version: Option, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs index f773296936..5b93592a36 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs @@ -8,6 +8,7 @@ mod json_conversion; pub mod methods; mod state_transition_like; pub mod v0; +pub mod v1; #[cfg(feature = "state-transition-value-conversion")] mod value_conversion; mod version; @@ -15,9 +16,14 @@ mod version; use crate::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0Signable; use crate::state_transition::StateTransitionFieldTypes; +use crate::balances::credits::CREDITS_PER_DUFF; use crate::identity::state_transition::OptionallyAssetLockProved; +use crate::state_transition::identity_credit_withdrawal_transition::v1::{ + IdentityCreditWithdrawalTransitionV1, IdentityCreditWithdrawalTransitionV1Signable, +}; use crate::ProtocolError; use bincode::{Decode, Encode}; +use dashcore::transaction::special_transaction::asset_unlock::qualified_asset_unlock::ASSET_UNLOCK_TX_SIZE; use derive_more::From; use fields::*; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize, PlatformSignable}; @@ -26,7 +32,14 @@ use platform_versioning::PlatformVersioned; #[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; -pub type IdentityCreditWithdrawalTransitionLatest = IdentityCreditWithdrawalTransitionV0; +/// Minimal core per byte. Must be a fibonacci number +pub const MIN_CORE_FEE_PER_BYTE: u32 = 1; + +/// Minimal amount in credits (x1000) to avoid "dust" error in Core +pub const MIN_WITHDRAWAL_AMOUNT: u64 = + (ASSET_UNLOCK_TX_SIZE as u64) * (MIN_CORE_FEE_PER_BYTE as u64) * CREDITS_PER_DUFF; + +pub type IdentityCreditWithdrawalTransitionLatest = IdentityCreditWithdrawalTransitionV1; #[derive( Debug, @@ -52,6 +65,8 @@ pub type IdentityCreditWithdrawalTransitionLatest = IdentityCreditWithdrawalTran pub enum IdentityCreditWithdrawalTransition { #[cfg_attr(feature = "state-transition-serde-conversion", serde(rename = "0"))] V0(IdentityCreditWithdrawalTransitionV0), + #[cfg_attr(feature = "state-transition-serde-conversion", serde(rename = "1"))] + V1(IdentityCreditWithdrawalTransitionV1), } impl IdentityCreditWithdrawalTransition { @@ -64,9 +79,12 @@ impl IdentityCreditWithdrawalTransition { 0 => Ok(IdentityCreditWithdrawalTransition::V0( IdentityCreditWithdrawalTransitionV0::default(), )), + 1 => Ok(IdentityCreditWithdrawalTransition::V1( + IdentityCreditWithdrawalTransitionV1::default(), + )), version => Err(ProtocolError::UnknownVersionMismatch { method: "IdentityCreditWithdrawalTransition::default_versioned".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, }), } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/state_transition_like.rs index 022294a3a6..165d071b4b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/state_transition_like.rs @@ -9,12 +9,14 @@ impl StateTransitionLike for IdentityCreditWithdrawalTransition { fn modified_data_ids(&self) -> Vec { match self { IdentityCreditWithdrawalTransition::V0(transition) => transition.modified_data_ids(), + IdentityCreditWithdrawalTransition::V1(transition) => transition.modified_data_ids(), } } fn state_transition_protocol_version(&self) -> FeatureVersion { match self { IdentityCreditWithdrawalTransition::V0(_) => 0, + IdentityCreditWithdrawalTransition::V1(_) => 0, } } /// returns the type of State Transition @@ -23,12 +25,16 @@ impl StateTransitionLike for IdentityCreditWithdrawalTransition { IdentityCreditWithdrawalTransition::V0(transition) => { transition.state_transition_type() } + IdentityCreditWithdrawalTransition::V1(transition) => { + transition.state_transition_type() + } } } /// returns the signature as a byte-array fn signature(&self) -> &BinaryData { match self { IdentityCreditWithdrawalTransition::V0(transition) => transition.signature(), + IdentityCreditWithdrawalTransition::V1(transition) => transition.signature(), } } /// set a new signature @@ -37,6 +43,9 @@ impl StateTransitionLike for IdentityCreditWithdrawalTransition { IdentityCreditWithdrawalTransition::V0(transition) => { transition.set_signature(signature) } + IdentityCreditWithdrawalTransition::V1(transition) => { + transition.set_signature(signature) + } } } @@ -44,6 +53,7 @@ impl StateTransitionLike for IdentityCreditWithdrawalTransition { fn user_fee_increase(&self) -> UserFeeIncrease { match self { IdentityCreditWithdrawalTransition::V0(transition) => transition.user_fee_increase(), + IdentityCreditWithdrawalTransition::V1(transition) => transition.user_fee_increase(), } } /// set a fee multiplier @@ -52,6 +62,9 @@ impl StateTransitionLike for IdentityCreditWithdrawalTransition { IdentityCreditWithdrawalTransition::V0(transition) => { transition.set_user_fee_increase(user_fee_increase) } + IdentityCreditWithdrawalTransition::V1(transition) => { + transition.set_user_fee_increase(user_fee_increase) + } } } @@ -60,18 +73,23 @@ impl StateTransitionLike for IdentityCreditWithdrawalTransition { IdentityCreditWithdrawalTransition::V0(transition) => { transition.set_signature_bytes(signature) } + IdentityCreditWithdrawalTransition::V1(transition) => { + transition.set_signature_bytes(signature) + } } } fn owner_id(&self) -> Identifier { match self { IdentityCreditWithdrawalTransition::V0(transition) => transition.owner_id(), + IdentityCreditWithdrawalTransition::V1(transition) => transition.owner_id(), } } fn unique_identifiers(&self) -> Vec { match self { IdentityCreditWithdrawalTransition::V0(transition) => transition.unique_identifiers(), + IdentityCreditWithdrawalTransition::V1(transition) => transition.unique_identifiers(), } } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/identity_signed.rs index 2c8011f2fd..122a1b4534 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/identity_signed.rs @@ -13,11 +13,11 @@ impl StateTransitionIdentitySigned for IdentityCreditWithdrawalTransitionV0 { self.signature_public_key_id = key_id } - fn security_level_requirement(&self) -> Vec { + fn security_level_requirement(&self, _purpose: Purpose) -> Vec { vec![CRITICAL] } - fn purpose_requirement(&self) -> Purpose { - Purpose::TRANSFER + fn purpose_requirement(&self) -> Vec { + vec![Purpose::TRANSFER] } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs index 2a5246b9ab..2be39083e0 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs @@ -3,19 +3,16 @@ mod identity_signed; mod json_conversion; mod state_transition_like; mod types; -mod v0_methods; #[cfg(feature = "state-transition-value-conversion")] mod value_conversion; mod version; use bincode::{Decode, Encode}; -use dashcore::transaction::special_transaction::asset_unlock::qualified_asset_unlock::ASSET_UNLOCK_TX_SIZE; use platform_serialization_derive::PlatformSignable; use platform_value::BinaryData; #[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; -use crate::balances::credits::CREDITS_PER_DUFF; use crate::prelude::{IdentityNonce, UserFeeIncrease}; use crate::{ identity::{core_script::CoreScript, KeyID}, @@ -24,14 +21,6 @@ use crate::{ ProtocolError, }; -// TODO: unsafe - we must use actual relay fee from core -/// Minimal core per byte. Must be a fibonacci number -pub const MIN_CORE_FEE_PER_BYTE: u32 = 1; - -/// Minimal amount in credits (x1000) to avoid "dust" error in Core -pub const MIN_WITHDRAWAL_AMOUNT: u64 = - (ASSET_UNLOCK_TX_SIZE as u64) * (MIN_CORE_FEE_PER_BYTE as u64) * CREDITS_PER_DUFF; - #[derive(Debug, Clone, Encode, Decode, PlatformSignable, PartialEq)] #[cfg_attr( feature = "state-transition-serde-conversion", diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs deleted file mode 100644 index 8d4f813231..0000000000 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs +++ /dev/null @@ -1,76 +0,0 @@ -#[cfg(feature = "state-transition-signing")] -use crate::identity::accessors::IdentityGettersV0; -#[cfg(feature = "state-transition-signing")] -use crate::identity::core_script::CoreScript; -#[cfg(feature = "state-transition-signing")] -use crate::identity::signer::Signer; -#[cfg(feature = "state-transition-signing")] -use crate::identity::IdentityPublicKey; -#[cfg(feature = "state-transition-signing")] -use crate::identity::{Identity, KeyType, Purpose, SecurityLevel}; -#[cfg(feature = "state-transition-signing")] -use crate::prelude::{IdentityNonce, UserFeeIncrease}; -use crate::state_transition::identity_credit_withdrawal_transition::methods::IdentityCreditWithdrawalTransitionMethodsV0; -use crate::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; -#[cfg(feature = "state-transition-signing")] -use crate::state_transition::{GetDataContractSecurityLevelRequirementFn, StateTransition}; -#[cfg(feature = "state-transition-signing")] -use crate::withdrawal::Pooling; -#[cfg(feature = "state-transition-signing")] -use crate::ProtocolError; -#[cfg(feature = "state-transition-signing")] -use platform_version::version::{FeatureVersion, PlatformVersion}; - -impl IdentityCreditWithdrawalTransitionMethodsV0 for IdentityCreditWithdrawalTransitionV0 { - #[cfg(feature = "state-transition-signing")] - fn try_from_identity( - identity: &Identity, - withdrawal_key_to_use: Option<&IdentityPublicKey>, - output_script: CoreScript, - amount: u64, - pooling: Pooling, - core_fee_per_byte: u32, - user_fee_increase: UserFeeIncrease, - signer: S, - nonce: IdentityNonce, - _platform_version: &PlatformVersion, - _version: Option, - ) -> Result { - let mut transition: StateTransition = IdentityCreditWithdrawalTransitionV0 { - identity_id: identity.id(), - amount, - core_fee_per_byte, - pooling, - output_script, - nonce, - user_fee_increase, - signature_public_key_id: 0, - signature: Default::default(), - } - .into(); - - let identity_public_key = match withdrawal_key_to_use { - Some(key) => key, - None => identity - .get_first_public_key_matching( - Purpose::TRANSFER, - SecurityLevel::full_range().into(), - KeyType::all_key_types().into(), - true, - ) - .ok_or_else(|| { - ProtocolError::DesiredKeyWithTypePurposeSecurityLevelMissing( - "no withdrawal public key".to_string(), - ) - })?, - }; - - transition.sign_external( - identity_public_key, - &signer, - None::, - )?; - - Ok(transition) - } -} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/identity_signed.rs new file mode 100644 index 0000000000..045bab7b27 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/identity_signed.rs @@ -0,0 +1,27 @@ +use crate::identity::SecurityLevel::{CRITICAL, MASTER}; +use crate::identity::{KeyID, Purpose, SecurityLevel}; +use crate::state_transition::identity_credit_withdrawal_transition::v1::IdentityCreditWithdrawalTransitionV1; +use crate::state_transition::StateTransitionIdentitySigned; + +impl StateTransitionIdentitySigned for IdentityCreditWithdrawalTransitionV1 { + fn signature_public_key_id(&self) -> KeyID { + self.signature_public_key_id + } + + fn set_signature_public_key_id(&mut self, key_id: KeyID) { + self.signature_public_key_id = key_id + } + + fn security_level_requirement(&self, purpose: Purpose) -> Vec { + if purpose == Purpose::AUTHENTICATION { + vec![MASTER] + } else { + // for transfer + vec![CRITICAL] + } + } + + fn purpose_requirement(&self) -> Vec { + vec![Purpose::TRANSFER, Purpose::AUTHENTICATION] + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/json_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/json_conversion.rs new file mode 100644 index 0000000000..10b835cfc0 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/json_conversion.rs @@ -0,0 +1,4 @@ +use crate::state_transition::identity_credit_withdrawal_transition::v1::IdentityCreditWithdrawalTransitionV1; +use crate::state_transition::StateTransitionJsonConvert; + +impl<'a> StateTransitionJsonConvert<'a> for IdentityCreditWithdrawalTransitionV1 {} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/mod.rs new file mode 100644 index 0000000000..ef18ac89a3 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/mod.rs @@ -0,0 +1,45 @@ +mod identity_signed; +#[cfg(feature = "state-transition-json-conversion")] +mod json_conversion; +mod state_transition_like; +mod types; +mod v0_methods; +#[cfg(feature = "state-transition-value-conversion")] +mod value_conversion; +mod version; + +use bincode::{Decode, Encode}; +use platform_serialization_derive::PlatformSignable; +use platform_value::BinaryData; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; + +use crate::prelude::{IdentityNonce, UserFeeIncrease}; +use crate::{ + identity::{core_script::CoreScript, KeyID}, + prelude::Identifier, + withdrawal::Pooling, + ProtocolError, +}; + +#[derive(Debug, Clone, Encode, Decode, PlatformSignable, PartialEq)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +#[derive(Default)] +pub struct IdentityCreditWithdrawalTransitionV1 { + pub identity_id: Identifier, + pub amount: u64, + pub core_fee_per_byte: u32, + pub pooling: Pooling, + /// If the send to output script is None, then we send the withdrawal to the address set by core + pub output_script: Option, + pub nonce: IdentityNonce, + pub user_fee_increase: UserFeeIncrease, + #[platform_signable(exclude_from_sig_hash)] + pub signature_public_key_id: KeyID, + #[platform_signable(exclude_from_sig_hash)] + pub signature: BinaryData, +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/state_transition_like.rs new file mode 100644 index 0000000000..14462d0c28 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/state_transition_like.rs @@ -0,0 +1,72 @@ +use base64::prelude::BASE64_STANDARD; +use base64::Engine; +use platform_value::BinaryData; + +use crate::prelude::UserFeeIncrease; +use crate::{ + prelude::Identifier, + state_transition::{StateTransitionLike, StateTransitionType}, +}; + +use crate::state_transition::identity_credit_withdrawal_transition::v1::IdentityCreditWithdrawalTransitionV1; +use crate::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; +use crate::state_transition::StateTransition; +use crate::state_transition::StateTransitionType::IdentityCreditWithdrawal; +use crate::version::FeatureVersion; + +impl From for StateTransition { + fn from(value: IdentityCreditWithdrawalTransitionV1) -> Self { + let identity_credit_withdrawal_transition: IdentityCreditWithdrawalTransition = + value.into(); + identity_credit_withdrawal_transition.into() + } +} + +impl StateTransitionLike for IdentityCreditWithdrawalTransitionV1 { + fn state_transition_protocol_version(&self) -> FeatureVersion { + 0 + } + + /// returns the type of State Transition + fn state_transition_type(&self) -> StateTransitionType { + IdentityCreditWithdrawal + } + /// returns the signature as a byte-array + fn signature(&self) -> &BinaryData { + &self.signature + } + /// set a new signature + fn set_signature(&mut self, signature: BinaryData) { + self.signature = signature + } + /// Returns ID of the created contract + fn modified_data_ids(&self) -> Vec { + vec![self.identity_id] + } + + fn set_signature_bytes(&mut self, signature: Vec) { + self.signature = BinaryData::new(signature) + } + + /// Get owner ID + fn owner_id(&self) -> Identifier { + self.identity_id + } + + /// We want things to be unique based on the nonce, so we don't add the transition type + fn unique_identifiers(&self) -> Vec { + vec![format!( + "{}-{:x}", + BASE64_STANDARD.encode(self.identity_id), + self.nonce + )] + } + + fn user_fee_increase(&self) -> UserFeeIncrease { + self.user_fee_increase + } + + fn set_user_fee_increase(&mut self, user_fee_increase: UserFeeIncrease) { + self.user_fee_increase = user_fee_increase + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/types.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/types.rs new file mode 100644 index 0000000000..3273e62c92 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/types.rs @@ -0,0 +1,17 @@ +use crate::state_transition::identity_credit_withdrawal_transition::fields::*; +use crate::state_transition::identity_credit_withdrawal_transition::v1::IdentityCreditWithdrawalTransitionV1; +use crate::state_transition::StateTransitionFieldTypes; + +impl StateTransitionFieldTypes for IdentityCreditWithdrawalTransitionV1 { + fn signature_property_paths() -> Vec<&'static str> { + vec![SIGNATURE, SIGNATURE_PUBLIC_KEY_ID] + } + + fn identifiers_property_paths() -> Vec<&'static str> { + vec![IDENTITY_ID] + } + + fn binary_property_paths() -> Vec<&'static str> { + vec![SIGNATURE, OUTPUT_SCRIPT] + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/v0_methods.rs new file mode 100644 index 0000000000..de4817bca4 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/v0_methods.rs @@ -0,0 +1,137 @@ +#[cfg(feature = "state-transition-signing")] +use crate::{ + identity::{ + accessors::IdentityGettersV0, core_script::CoreScript, signer::Signer, Identity, + IdentityPublicKey, KeyType, Purpose, SecurityLevel, + }, + prelude::{IdentityNonce, UserFeeIncrease}, + state_transition::{ + identity_credit_withdrawal_transition::methods::PreferredKeyPurposeForSigningWithdrawal, + GetDataContractSecurityLevelRequirementFn, StateTransition, + }, + withdrawal::Pooling, + ProtocolError, +}; + +#[cfg(feature = "state-transition-signing")] +use platform_version::version::{FeatureVersion, PlatformVersion}; + +use crate::state_transition::identity_credit_withdrawal_transition::methods::IdentityCreditWithdrawalTransitionMethodsV0; +use crate::state_transition::identity_credit_withdrawal_transition::v1::IdentityCreditWithdrawalTransitionV1; + +impl IdentityCreditWithdrawalTransitionMethodsV0 for IdentityCreditWithdrawalTransitionV1 { + #[cfg(feature = "state-transition-signing")] + fn try_from_identity( + identity: &Identity, + output_script: Option, + amount: u64, + pooling: Pooling, + core_fee_per_byte: u32, + user_fee_increase: UserFeeIncrease, + signer: S, + signing_withdrawal_key_to_use: Option<&IdentityPublicKey>, + preferred_key_purpose_for_signing_withdrawal: PreferredKeyPurposeForSigningWithdrawal, + nonce: IdentityNonce, + _platform_version: &PlatformVersion, + _version: Option, + ) -> Result { + let mut transition: StateTransition = IdentityCreditWithdrawalTransitionV1 { + identity_id: identity.id(), + amount, + core_fee_per_byte, + pooling, + output_script, + nonce, + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + + let identity_public_key = match signing_withdrawal_key_to_use { + Some(key) => { + if signer.can_sign_with(key) { + key + } else { + return Err( + ProtocolError::DesiredKeyWithTypePurposeSecurityLevelMissing( + "specified withdrawal public key cannot be used for signing" + .to_string(), + ), + ); + } + } + None => { + let mut key: Option<&IdentityPublicKey>; + + match preferred_key_purpose_for_signing_withdrawal { + PreferredKeyPurposeForSigningWithdrawal::MasterPreferred => { + key = identity.get_first_public_key_matching( + Purpose::AUTHENTICATION, + SecurityLevel::full_range().into(), + KeyType::all_key_types().into(), + true, + ); + + if key.is_none() || !signer.can_sign_with(key.unwrap()) { + key = identity.get_first_public_key_matching( + Purpose::TRANSFER, + SecurityLevel::full_range().into(), + KeyType::all_key_types().into(), + true, + ); + } + } + PreferredKeyPurposeForSigningWithdrawal::TransferPreferred + | PreferredKeyPurposeForSigningWithdrawal::Any => { + key = identity.get_first_public_key_matching( + Purpose::TRANSFER, + SecurityLevel::full_range().into(), + KeyType::all_key_types().into(), + true, + ); + + if key.is_none() || !signer.can_sign_with(key.unwrap()) { + key = identity.get_first_public_key_matching( + Purpose::AUTHENTICATION, + SecurityLevel::full_range().into(), + KeyType::all_key_types().into(), + true, + ); + } + } + PreferredKeyPurposeForSigningWithdrawal::MasterOnly => { + key = identity.get_first_public_key_matching( + Purpose::AUTHENTICATION, + SecurityLevel::full_range().into(), + KeyType::all_key_types().into(), + true, + ); + } + PreferredKeyPurposeForSigningWithdrawal::TransferOnly => { + key = identity.get_first_public_key_matching( + Purpose::TRANSFER, + SecurityLevel::full_range().into(), + KeyType::all_key_types().into(), + true, + ); + } + } + + key.ok_or_else(|| { + ProtocolError::DesiredKeyWithTypePurposeSecurityLevelMissing( + "no withdrawal public key".to_string(), + ) + })? + } + }; + + transition.sign_external( + identity_public_key, + &signer, + None::, + )?; + + Ok(transition) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/value_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/value_conversion.rs new file mode 100644 index 0000000000..6ef90c689a --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/value_conversion.rs @@ -0,0 +1,60 @@ +use std::collections::BTreeMap; + +use platform_value::{IntegerReplacementType, ReplacementType, Value}; + +use crate::{state_transition::StateTransitionFieldTypes, ProtocolError}; + +use crate::state_transition::identity_credit_withdrawal_transition::fields::*; +use crate::state_transition::StateTransitionValueConvert; + +use crate::state_transition::identity_credit_withdrawal_transition::v1::IdentityCreditWithdrawalTransitionV1; +use platform_version::version::PlatformVersion; + +impl<'a> StateTransitionValueConvert<'a> for IdentityCreditWithdrawalTransitionV1 { + fn from_object( + raw_object: Value, + _platform_version: &PlatformVersion, + ) -> Result { + platform_value::from_value(raw_object).map_err(ProtocolError::ValueError) + } + + fn clean_value(value: &mut Value) -> Result<(), ProtocolError> { + value.replace_at_paths(IDENTIFIER_FIELDS, ReplacementType::Identifier)?; + value.replace_at_paths(BINARY_FIELDS, ReplacementType::BinaryBytes)?; + value.replace_integer_type_at_paths(U32_FIELDS, IntegerReplacementType::U32)?; + Ok(()) + } + + fn from_value_map( + raw_value_map: BTreeMap, + platform_version: &PlatformVersion, + ) -> Result { + let value: Value = raw_value_map.into(); + Self::from_object(value, platform_version) + } + + fn to_object(&self, skip_signature: bool) -> Result { + let mut value = platform_value::to_value(self)?; + if skip_signature { + value + .remove_values_matching_paths(Self::signature_property_paths()) + .map_err(ProtocolError::ValueError)?; + } + Ok(value) + } + + fn to_cleaned_object(&self, skip_signature: bool) -> Result { + let mut value = platform_value::to_value(self)?; + if skip_signature { + value + .remove_values_matching_paths(Self::signature_property_paths()) + .map_err(ProtocolError::ValueError)?; + } + Ok(value) + } + + // Override to_canonical_cleaned_object to manage add_public_keys individually + fn to_canonical_cleaned_object(&self, skip_signature: bool) -> Result { + self.to_cleaned_object(skip_signature) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/version.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/version.rs new file mode 100644 index 0000000000..cfff287e9d --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/version.rs @@ -0,0 +1,9 @@ +use crate::state_transition::identity_credit_withdrawal_transition::v1::IdentityCreditWithdrawalTransitionV1; +use crate::state_transition::FeatureVersioned; +use crate::version::FeatureVersion; + +impl FeatureVersioned for IdentityCreditWithdrawalTransitionV1 { + fn feature_version(&self) -> FeatureVersion { + 1 + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/value_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/value_conversion.rs index 365d747ea8..a62a4a184f 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/value_conversion.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/value_conversion.rs @@ -9,6 +9,7 @@ use crate::state_transition::identity_credit_withdrawal_transition::IdentityCred use crate::state_transition::state_transitions::identity_credit_withdrawal_transition::fields::*; use crate::state_transition::StateTransitionValueConvert; +use crate::state_transition::identity_credit_withdrawal_transition::v1::IdentityCreditWithdrawalTransitionV1; use platform_value::btreemap_extensions::BTreeValueRemoveFromMapHelper; use platform_version::version::{FeatureVersion, PlatformVersion}; @@ -20,6 +21,11 @@ impl<'a> StateTransitionValueConvert<'a> for IdentityCreditWithdrawalTransition value.insert(STATE_TRANSITION_PROTOCOL_VERSION.to_string(), Value::U16(0))?; Ok(value) } + IdentityCreditWithdrawalTransition::V1(transition) => { + let mut value = transition.to_object(skip_signature)?; + value.insert(STATE_TRANSITION_PROTOCOL_VERSION.to_string(), Value::U16(1))?; + Ok(value) + } } } @@ -30,6 +36,11 @@ impl<'a> StateTransitionValueConvert<'a> for IdentityCreditWithdrawalTransition value.insert(STATE_TRANSITION_PROTOCOL_VERSION.to_string(), Value::U16(0))?; Ok(value) } + IdentityCreditWithdrawalTransition::V1(transition) => { + let mut value = transition.to_canonical_object(skip_signature)?; + value.insert(STATE_TRANSITION_PROTOCOL_VERSION.to_string(), Value::U16(1))?; + Ok(value) + } } } @@ -40,6 +51,11 @@ impl<'a> StateTransitionValueConvert<'a> for IdentityCreditWithdrawalTransition value.insert(STATE_TRANSITION_PROTOCOL_VERSION.to_string(), Value::U16(0))?; Ok(value) } + IdentityCreditWithdrawalTransition::V1(transition) => { + let mut value = transition.to_canonical_cleaned_object(skip_signature)?; + value.insert(STATE_TRANSITION_PROTOCOL_VERSION.to_string(), Value::U16(1))?; + Ok(value) + } } } @@ -50,6 +66,11 @@ impl<'a> StateTransitionValueConvert<'a> for IdentityCreditWithdrawalTransition value.insert(STATE_TRANSITION_PROTOCOL_VERSION.to_string(), Value::U16(0))?; Ok(value) } + IdentityCreditWithdrawalTransition::V1(transition) => { + let mut value = transition.to_cleaned_object(skip_signature)?; + value.insert(STATE_TRANSITION_PROTOCOL_VERSION.to_string(), Value::U16(1))?; + Ok(value) + } } } @@ -74,6 +95,11 @@ impl<'a> StateTransitionValueConvert<'a> for IdentityCreditWithdrawalTransition platform_version, )? .into()), + 1 => Ok(IdentityCreditWithdrawalTransitionV1::from_object( + raw_object, + platform_version, + )? + .into()), n => Err(ProtocolError::UnknownVersionError(format!( "Unknown IdentityCreditWithdrawalTransition version {n}" ))), @@ -101,6 +127,11 @@ impl<'a> StateTransitionValueConvert<'a> for IdentityCreditWithdrawalTransition platform_version, )? .into()), + 1 => Ok(IdentityCreditWithdrawalTransitionV1::from_value_map( + raw_value_map, + platform_version, + )? + .into()), n => Err(ProtocolError::UnknownVersionError(format!( "Unknown IdentityCreditWithdrawalTransition version {n}" ))), @@ -114,6 +145,7 @@ impl<'a> StateTransitionValueConvert<'a> for IdentityCreditWithdrawalTransition match version { 0 => IdentityCreditWithdrawalTransitionV0::clean_value(value), + 1 => IdentityCreditWithdrawalTransitionV1::clean_value(value), n => Err(ProtocolError::UnknownVersionError(format!( "Unknown IdentityCreditWithdrawalTransition version {n}" ))), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/version.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/version.rs index d4afb75657..d0f7ab1687 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/version.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/version.rs @@ -6,6 +6,7 @@ impl FeatureVersioned for IdentityCreditWithdrawalTransition { fn feature_version(&self) -> FeatureVersion { match self { IdentityCreditWithdrawalTransition::V0(v0) => v0.feature_version(), + IdentityCreditWithdrawalTransition::V1(v1) => v1.feature_version(), } } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/identity_signed.rs index 471f0884e2..ce74927344 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/identity_signed.rs @@ -1,4 +1,4 @@ -use crate::identity::{KeyID, SecurityLevel}; +use crate::identity::{KeyID, Purpose, SecurityLevel}; use crate::state_transition::identity_update_transition::IdentityUpdateTransition; use crate::state_transition::StateTransitionIdentitySigned; @@ -17,9 +17,11 @@ impl StateTransitionIdentitySigned for IdentityUpdateTransition { } } - fn security_level_requirement(&self) -> Vec { + fn security_level_requirement(&self, purpose: Purpose) -> Vec { match self { - IdentityUpdateTransition::V0(transition) => transition.security_level_requirement(), + IdentityUpdateTransition::V0(transition) => { + transition.security_level_requirement(purpose) + } } } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/identity_signed.rs index 0b6c85a50a..54d384be93 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/identity_signed.rs @@ -1,5 +1,5 @@ use crate::identity::SecurityLevel::MASTER; -use crate::identity::{KeyID, SecurityLevel}; +use crate::identity::{KeyID, Purpose, SecurityLevel}; use crate::state_transition::identity_update_transition::v0::IdentityUpdateTransitionV0; use crate::state_transition::StateTransitionIdentitySigned; @@ -12,7 +12,7 @@ impl StateTransitionIdentitySigned for IdentityUpdateTransitionV0 { self.signature_public_key_id = key_id } - fn security_level_requirement(&self) -> Vec { + fn security_level_requirement(&self, _purpose: Purpose) -> Vec { vec![MASTER] } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/masternode_vote_transition/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/masternode_vote_transition/identity_signed.rs index cfc6f9d65b..9a02b8ddf2 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/masternode_vote_transition/identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/masternode_vote_transition/identity_signed.rs @@ -17,13 +17,15 @@ impl StateTransitionIdentitySigned for MasternodeVoteTransition { } } - fn security_level_requirement(&self) -> Vec { + fn security_level_requirement(&self, purpose: Purpose) -> Vec { match self { - MasternodeVoteTransition::V0(transition) => transition.security_level_requirement(), + MasternodeVoteTransition::V0(transition) => { + transition.security_level_requirement(purpose) + } } } - fn purpose_requirement(&self) -> Purpose { + fn purpose_requirement(&self) -> Vec { match self { MasternodeVoteTransition::V0(transition) => transition.purpose_requirement(), } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/masternode_vote_transition/v0/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/masternode_vote_transition/v0/identity_signed.rs index 47531db013..7b5d731676 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/masternode_vote_transition/v0/identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/masternode_vote_transition/v0/identity_signed.rs @@ -12,11 +12,11 @@ impl StateTransitionIdentitySigned for MasternodeVoteTransitionV0 { self.signature_public_key_id = key_id } - fn security_level_requirement(&self) -> Vec { + fn security_level_requirement(&self, _purpose: Purpose) -> Vec { vec![CRITICAL, HIGH, MEDIUM] } - fn purpose_requirement(&self) -> Purpose { - Purpose::VOTING + fn purpose_requirement(&self) -> Vec { + vec![Purpose::VOTING] } } diff --git a/packages/rs-dpp/src/state_transition/traits/state_transition_identity_signed.rs b/packages/rs-dpp/src/state_transition/traits/state_transition_identity_signed.rs index c81029a7fe..4da43f68c8 100644 --- a/packages/rs-dpp/src/state_transition/traits/state_transition_identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/traits/state_transition_identity_signed.rs @@ -45,24 +45,25 @@ pub trait StateTransitionIdentitySigned: StateTransitionLike { &self, public_key: &IdentityPublicKey, ) -> Result<(), ProtocolError> { + if !self.purpose_requirement().contains(&public_key.purpose()) { + return Err(ProtocolError::WrongPublicKeyPurposeError( + WrongPublicKeyPurposeError::new(public_key.purpose(), self.purpose_requirement()), + )); + } + // Otherwise, key security level should be less than MASTER but more or equal than required if !self - .security_level_requirement() + .security_level_requirement(public_key.purpose()) .contains(&public_key.security_level()) { return Err(ProtocolError::InvalidSignaturePublicKeySecurityLevelError( InvalidSignaturePublicKeySecurityLevelError::new( public_key.security_level(), - self.security_level_requirement(), + self.security_level_requirement(public_key.purpose()), ), )); } - if public_key.purpose() != self.purpose_requirement() { - return Err(ProtocolError::WrongPublicKeyPurposeError( - WrongPublicKeyPurposeError::new(public_key.purpose(), self.purpose_requirement()), - )); - } Ok(()) } @@ -85,13 +86,13 @@ pub trait StateTransitionIdentitySigned: StateTransitionLike { /// Returns minimal key security level that can be used to sign this ST. /// Override this method if the ST requires a different security level. - fn security_level_requirement(&self) -> Vec; + fn security_level_requirement(&self, purpose: Purpose) -> Vec; /// The purpose requirement for the signing key /// The default is authentication /// However for Withdrawals and Fund Transfers the requirement is TRANSFER - fn purpose_requirement(&self) -> Purpose { - Purpose::AUTHENTICATION + fn purpose_requirement(&self) -> Vec { + vec![Purpose::AUTHENTICATION] } } diff --git a/packages/rs-dpp/src/withdrawal/document_try_into_asset_unlock_base_transaction_info/mod.rs b/packages/rs-dpp/src/withdrawal/document_try_into_asset_unlock_base_transaction_info/mod.rs new file mode 100644 index 0000000000..1ca292303d --- /dev/null +++ b/packages/rs-dpp/src/withdrawal/document_try_into_asset_unlock_base_transaction_info/mod.rs @@ -0,0 +1,25 @@ +use crate::document::Document; +use crate::withdrawal::WithdrawalTransactionIndex; +use crate::ProtocolError; +use dashcore::transaction::special_transaction::asset_unlock::unqualified_asset_unlock::AssetUnlockBaseTransactionInfo; +use platform_version::version::PlatformVersion; +mod v0; +impl Document { + pub fn try_into_asset_unlock_base_transaction_info( + &self, + transaction_index: WithdrawalTransactionIndex, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .dpp + .document_versions + .document_method_versions + .try_into_asset_unlock_base_transaction_info + { + 0 => self.try_into_asset_unlock_base_transaction_info_v0(transaction_index), + v => Err(ProtocolError::UnknownVersionError(format!( + "Unknown IdentityCreateTransition version for try_from_identity_with_signer {v}" + ))), + } + } +} diff --git a/packages/rs-dpp/src/withdrawal/document_try_into_asset_unlock_base_transaction_info/v0/mod.rs b/packages/rs-dpp/src/withdrawal/document_try_into_asset_unlock_base_transaction_info/v0/mod.rs new file mode 100644 index 0000000000..f28b9dcf8b --- /dev/null +++ b/packages/rs-dpp/src/withdrawal/document_try_into_asset_unlock_base_transaction_info/v0/mod.rs @@ -0,0 +1,45 @@ +use crate::document::{Document, DocumentV0Getters}; +use crate::identity::convert_credits_to_duffs; +use crate::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; +use crate::withdrawal::WithdrawalTransactionIndex; +use crate::ProtocolError; +use dashcore::transaction::special_transaction::asset_unlock::qualified_asset_unlock::ASSET_UNLOCK_TX_SIZE; +use dashcore::transaction::special_transaction::asset_unlock::unqualified_asset_unlock::{ + AssetUnlockBasePayload, AssetUnlockBaseTransactionInfo, +}; +use dashcore::{ScriptBuf, TxOut}; +use platform_value::btreemap_extensions::BTreeValueMapHelper; + +impl Document { + pub(super) fn try_into_asset_unlock_base_transaction_info_v0( + &self, + transaction_index: WithdrawalTransactionIndex, + ) -> Result { + let properties = self.properties(); + + let output_script_bytes = properties.get_bytes(withdrawal::properties::OUTPUT_SCRIPT)?; + + let amount = properties.get_integer(withdrawal::properties::AMOUNT)?; + + let core_fee_per_byte: u32 = + properties.get_integer(withdrawal::properties::CORE_FEE_PER_BYTE)?; + + let output_script = ScriptBuf::from_bytes(output_script_bytes); + + let tx_out = TxOut { + value: convert_credits_to_duffs(amount)?, + script_pubkey: output_script, + }; + + Ok(AssetUnlockBaseTransactionInfo { + version: 1, + lock_time: 0, + output: vec![tx_out], + base_payload: AssetUnlockBasePayload { + version: 1, + index: transaction_index, + fee: ASSET_UNLOCK_TX_SIZE as u32 * core_fee_per_byte, + }, + }) + } +} diff --git a/packages/rs-dpp/src/withdrawal/mod.rs b/packages/rs-dpp/src/withdrawal/mod.rs index be31e49559..1aaac3052d 100644 --- a/packages/rs-dpp/src/withdrawal/mod.rs +++ b/packages/rs-dpp/src/withdrawal/mod.rs @@ -1,3 +1,6 @@ +#[cfg(feature = "system_contracts")] +mod document_try_into_asset_unlock_base_transaction_info; + use bincode::{Decode, Encode}; use serde_repr::{Deserialize_repr, Serialize_repr}; @@ -11,3 +14,9 @@ pub enum Pooling { IfAvailable = 1, Standard = 2, } + +/// Transaction index type +pub type WithdrawalTransactionIndex = u64; + +/// Simple type alias for withdrawal transaction with it's index +pub type WithdrawalTransactionIndexAndBytes = (WithdrawalTransactionIndex, Vec); diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 1e6fe7174f..6ca9d43b97 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.3.0" +version = "1.4.0-dev.1" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs b/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs index 9a59463bea..18252d0d45 100644 --- a/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs +++ b/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs @@ -163,10 +163,26 @@ where // Such state transitions must be invalidated by check tx, but they might // still be added to mempool due to inconsistency between check tx and tx processing // (fees calculation) or malicious proposer. - StateTransitionExecutionResult::UnpaidConsensusError(..) => TxAction::Removed, + StateTransitionExecutionResult::UnpaidConsensusError(consensus_error) => { + tracing::trace!( + "UnpaidConsensusError at height {}, round {}: {:?}", + request.height, + request.round, + consensus_error + ); + TxAction::Removed + } // We shouldn't include in the block any state transitions that produced an internal error // during execution - StateTransitionExecutionResult::InternalError(..) => TxAction::Removed, + StateTransitionExecutionResult::InternalError(error_message) => { + tracing::debug!( + "InternalError at height {}, round {}: {}", + request.height, + request.round, + error_message + ); + TxAction::Removed + } // State Transition was not executed as it reached the maximum time limit StateTransitionExecutionResult::NotExecuted(..) => TxAction::Delayed, }; diff --git a/packages/rs-drive-abci/src/config.rs b/packages/rs-drive-abci/src/config.rs index ad0cfdbce5..8e8f449aac 100644 --- a/packages/rs-drive-abci/src/config.rs +++ b/packages/rs-drive-abci/src/config.rs @@ -187,7 +187,7 @@ pub struct PlatformConfig { pub db_path: PathBuf, /// Path to store rejected / invalid items (like transactions). - /// Used mainly for debuggig. + /// Used mainly for debugging. /// /// If not set, rejected and invalid items will not be stored. pub rejections_path: Option, diff --git a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs index c56272b61d..ecfc3d6edf 100644 --- a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs @@ -8,8 +8,6 @@ use dpp::block::block_info::BlockInfo; use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0; use dpp::version::PlatformVersion; -use dpp::dashcore::bls_sig_utils::BLSSignature; - use tenderdash_abci::{ proto::{serializers::timestamp::ToMilis, types::BlockId as ProtoBlockId}, signatures::Hashable, @@ -19,8 +17,7 @@ use crate::abci::AbciError; use crate::error::Error; use crate::execution::types::block_execution_context::v0::{ - BlockExecutionContextV0Getters, BlockExecutionContextV0MutableGetters, - BlockExecutionContextV0OwnedGetters, + BlockExecutionContextV0Getters, BlockExecutionContextV0OwnedGetters, }; use crate::execution::types::block_execution_context::BlockExecutionContext; use crate::execution::types::block_state_info::v0::{ @@ -62,7 +59,7 @@ where pub(super) fn finalize_block_proposal_v0( &self, request_finalize_block: FinalizeBlockCleanedRequest, - mut block_execution_context: BlockExecutionContext, + block_execution_context: BlockExecutionContext, transaction: &Transaction, platform_version: &PlatformVersion, ) -> Result { @@ -74,7 +71,7 @@ where // Let's decompose the request let FinalizeBlockCleanedRequest { - commit: mut commit_info, + commit: commit_info, misbehavior: _, hash, height, @@ -143,16 +140,16 @@ where let expected_withdrawal_transactions = block_execution_context.unsigned_withdrawal_transactions(); - if !expected_withdrawal_transactions - .are_matching_with_vote_extensions(&commit_info.threshold_vote_extensions) - { + let Some(transaction_to_extension_matches) = expected_withdrawal_transactions + .verify_and_match_with_vote_extensions(&commit_info.threshold_vote_extensions) + else { validation_result.add_error(AbciError::VoteExtensionMismatchReceived { got: commit_info.threshold_vote_extensions, - expected: expected_withdrawal_transactions.into(), + expected: (&expected_withdrawal_transactions.clone()).into(), }); return Ok(validation_result.into()); - } + }; // Verify commit @@ -202,34 +199,9 @@ where to_commit_block_info.core_height = block_header.core_chain_locked_height; - // Append signatures and broadcast asset unlock transactions to Core - - // Drain withdrawal transaction instead of cloning - let unsigned_withdrawal_transactions = block_execution_context - .unsigned_withdrawal_transactions_mut() - .drain(); - - if !unsigned_withdrawal_transactions.is_empty() { - // Drain signatures instead of cloning - let signatures = commit_info - .threshold_vote_extensions - .drain(..) - .map(|vote_extension| { - let signature_bytes: [u8; 96] = - vote_extension.signature.try_into().map_err(|e| { - AbciError::BadRequestDataSize(format!( - "invalid votes extension signature size: {}", - hex::encode(e) - )) - })?; - - Ok(BLSSignature::from(signature_bytes)) - }) - .collect::>()?; - + if !transaction_to_extension_matches.is_empty() { self.append_signatures_and_broadcast_withdrawal_transactions( - unsigned_withdrawal_transactions, - signatures, + transaction_to_extension_matches, platform_version, )?; } diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs index 5a5d36780b..63e1437f7f 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs @@ -321,6 +321,7 @@ where // Corresponding withdrawal documents are changed from queued to pooled self.pool_withdrawals_into_transactions_queue( &block_info, + &last_committed_platform_state, Some(transaction), platform_version, )?; diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/mod.rs index de42c73bda..3601bd9640 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/mod.rs @@ -1,10 +1,11 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::withdrawal::unsigned_withdrawal_txs::v0::UnsignedWithdrawalTxs; use crate::rpc::core::CoreRPCLike; -use dpp::dashcore::bls_sig_utils::BLSSignature; +use dpp::dashcore::Transaction; use dpp::version::PlatformVersion; +use std::collections::BTreeMap; +use tenderdash_abci::proto::types::VoteExtension; mod v0; @@ -15,8 +16,7 @@ where /// Appends signatures to unsigned withdrawal transactions and broadcast them to Core pub(in crate::execution) fn append_signatures_and_broadcast_withdrawal_transactions( &self, - unsigned_withdrawal_transactions: UnsignedWithdrawalTxs, - signatures: Vec, + withdrawal_transactions_with_vote_extensions: BTreeMap<&Transaction, &VoteExtension>, platform_version: &PlatformVersion, ) -> Result<(), Error> { match platform_version @@ -26,8 +26,7 @@ where .append_signatures_and_broadcast_withdrawal_transactions { 0 => self.append_signatures_and_broadcast_withdrawal_transactions_v0( - unsigned_withdrawal_transactions, - signatures, + withdrawal_transactions_with_vote_extensions, ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "append_signatures_and_broadcast_withdrawal_transactions".to_string(), diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs index 22a3c4d555..6d1deb5c82 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs @@ -1,7 +1,6 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::withdrawal::unsigned_withdrawal_txs::v0::UnsignedWithdrawalTxs; use crate::rpc::core::{ CoreRPCLike, CORE_RPC_ERROR_ASSET_UNLOCK_EXPIRED, CORE_RPC_ERROR_ASSET_UNLOCK_NO_ACTIVE_QUORUM, CORE_RPC_TX_ALREADY_IN_CHAIN, @@ -10,12 +9,14 @@ use dashcore_rpc::jsonrpc; use dashcore_rpc::Error as CoreRPCError; use dpp::dashcore::bls_sig_utils::BLSSignature; use dpp::dashcore::transaction::special_transaction::TransactionPayload::AssetUnlockPayloadType; -use dpp::dashcore::{consensus, Txid}; +use dpp::dashcore::{consensus, Transaction, Txid}; +use std::collections::{BTreeMap, HashMap}; use std::fs::{self, File}; use std::io::Write; use std::path::Path; use std::time::{SystemTime, UNIX_EPOCH}; +use tenderdash_abci::proto::types::VoteExtension; impl Platform where @@ -23,79 +24,93 @@ where { pub(super) fn append_signatures_and_broadcast_withdrawal_transactions_v0( &self, - unsigned_withdrawal_transactions: UnsignedWithdrawalTxs, - signatures: Vec, + withdrawal_transactions_with_vote_extensions: BTreeMap<&Transaction, &VoteExtension>, ) -> Result<(), Error> { - if unsigned_withdrawal_transactions.is_empty() { + if withdrawal_transactions_with_vote_extensions.is_empty() { return Ok(()); } - if unsigned_withdrawal_transactions.len() != signatures.len() { - return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( - "number of signatures must match number of withdrawal transactions", - ))); - } - tracing::debug!( "Broadcasting {} withdrawal transactions", - unsigned_withdrawal_transactions.len(), + withdrawal_transactions_with_vote_extensions.len(), ); let mut transaction_submission_failures = vec![]; - for (mut transaction, signature) in - unsigned_withdrawal_transactions.into_iter().zip(signatures) - { - let Some(AssetUnlockPayloadType(mut payload)) = transaction.special_transaction_payload - else { - return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( - "withdrawal transaction payload must be AssetUnlockPayloadType", + for (transaction_ref, vote_extension) in withdrawal_transactions_with_vote_extensions { + // Clone the transaction to get an owned, mutable transaction + let mut transaction = transaction_ref.clone(); + + // Extract the signature from the vote extension + let signature_bytes: [u8; 96] = vote_extension + .signature + .as_slice() + .try_into() + .map_err(|_| { + Error::Execution(ExecutionError::CorruptedCodeExecution( + "invalid votes extension signature size", + )) + })?; + + let signature = BLSSignature::from(signature_bytes); + + // Modify the transaction's payload + if let Some(AssetUnlockPayloadType(mut payload)) = + transaction.special_transaction_payload + { + // Assign the quorum signature + payload.quorum_sig = signature; + + // Assign the modified payload back to the transaction + transaction.special_transaction_payload = Some(AssetUnlockPayloadType(payload)); + } else { + return Err(Error::Execution(ExecutionError::CorruptedCachedState( + "withdrawal transaction payload must be AssetUnlockPayloadType".to_string(), ))); - }; - - payload.quorum_sig = signature; - - let index = payload.base.index; - - transaction.special_transaction_payload = Some(AssetUnlockPayloadType(payload)); + } + // Serialize the transaction let tx_bytes = consensus::serialize(&transaction); - // TODO: We need to broadcast all or none of the transactions (in case of error) - // will be fixed in upcoming PR + // Send the transaction match self.core_rpc.send_raw_transaction(&tx_bytes) { Ok(_) => { tracing::debug!( tx_id = transaction.txid().to_hex(), - index, - "Successfully broadcasted withdrawal transaction with index {}", - index + "Successfully broadcasted withdrawal transaction" ); } - // Ignore errors that can happen during blockchain synchronization. - // They will be logged with dashcore_rpc + // Handle specific errors Err(CoreRPCError::JsonRpc(jsonrpc::error::Error::Rpc(e))) - if e.code == CORE_RPC_TX_ALREADY_IN_CHAIN - || e.message == CORE_RPC_ERROR_ASSET_UNLOCK_NO_ACTIVE_QUORUM + if e.code == CORE_RPC_TX_ALREADY_IN_CHAIN => + { + // Transaction already in chain; no action needed + } + Err(CoreRPCError::JsonRpc(jsonrpc::error::Error::Rpc(e))) + if e.message == CORE_RPC_ERROR_ASSET_UNLOCK_NO_ACTIVE_QUORUM || e.message == CORE_RPC_ERROR_ASSET_UNLOCK_EXPIRED => { - // These will never work again + tracing::debug!( + tx_id = transaction.txid().to_string(), + "Asset unlock is expired or has no active quorum: {}", + e.message + ); + transaction_submission_failures.push((transaction.txid(), tx_bytes)); } - // Errors that can happen if we created invalid tx or Core isn't responding + // Handle other errors Err(e) => { tracing::warn!( tx_id = transaction.txid().to_string(), - index, - "Failed to broadcast asset unlock transaction {}: {}", - index, + "Failed to broadcast asset unlock transaction: {}", e ); - // These errors might allow the state transition to be broadcast in the future + // Collect failed transactions for potential future retries transaction_submission_failures.push((transaction.txid(), tx_bytes)); } } } + // Store transaction submission failures if let Some(ref rejections_path) = self.config.rejections_path { store_transaction_failures(transaction_submission_failures, rejections_path) .map_err(|e| Error::Execution(e.into()))?; diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/mod.rs index e4cd110298..0f0ff66a74 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/mod.rs @@ -2,13 +2,10 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; +use dpp::block::block_info::BlockInfo; use dpp::document::Document; -use dpp::identifier::Identifier; use dpp::version::PlatformVersion; -use drive::drive::identity::withdrawals::{ - WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes, -}; -use std::collections::HashMap; +use dpp::withdrawal::{WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes}; mod v0; @@ -16,35 +13,41 @@ impl Platform where C: CoreRPCLike, { - /// Builds a list of Core transactions from withdrawal documents. This function is a version handler that - /// directs to specific version implementations of the `build_withdrawal_transactions_from_documents` function. + /// Builds a list of withdrawal transactions from the provided withdrawal documents. + /// Each withdrawal document is converted into a Core transaction, starting from the specified index. + /// The function encodes the transaction and updates the document with the transaction index, status, + /// updated time, and revision. /// /// # Arguments /// - /// * `documents` - A slice of `Document`. - /// * `drive_operation_types` - A mutable reference to `Vec`. - /// * `transaction` - A `TransactionArg` reference. - /// * `platform_version` - A `PlatformVersion` reference that dictates which version of - /// the method to call. + /// * `documents` - A mutable reference to a vector of `Document` representing the withdrawal requests. + /// * `start_index` - The starting index for the transaction, of type `WithdrawalTransactionIndex`. + /// * `block_info` - A reference to the `BlockInfo`, which provides the current block's timestamp. + /// * `platform_version` - A reference to the `PlatformVersion` that specifies the version of the platform being used. /// /// # Returns /// - /// * `Result, Error>` - Returns a HashMap containing withdrawal transactions if found, otherwise returns an `Error`. + /// * `Result, Error>` - On success, returns a vector of tuples containing the + /// transaction index and the encoded transaction bytes. On failure, returns an `Error`. pub(in crate::execution::platform_events::withdrawals) fn build_untied_withdrawal_transactions_from_documents( &self, - documents: &[Document], + documents: &mut Vec, start_index: WithdrawalTransactionIndex, + block_info: &BlockInfo, platform_version: &PlatformVersion, - ) -> Result, Error> { + ) -> Result, Error> { match platform_version .drive_abci .methods .withdrawals .build_untied_withdrawal_transactions_from_documents { - 0 => { - self.build_untied_withdrawal_transactions_from_documents_v0(documents, start_index) - } + 0 => self.build_untied_withdrawal_transactions_from_documents_v0( + documents, + start_index, + block_info, + platform_version, + ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "build_untied_withdrawal_transactions_from_documents".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/v0/mod.rs index ea63771c63..2a1e5f8a74 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/v0/mod.rs @@ -1,28 +1,17 @@ -use std::collections::HashMap; - -use dashcore_rpc::dashcore::{ - blockdata::transaction::special_transaction::asset_unlock::{ - qualified_asset_unlock::ASSET_UNLOCK_TX_SIZE, - unqualified_asset_unlock::{AssetUnlockBasePayload, AssetUnlockBaseTransactionInfo}, - }, - consensus::Encodable, - ScriptBuf, TxOut, -}; -use dpp::document::{Document, DocumentV0Getters}; -use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; -use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; - -use drive::dpp::identifier::Identifier; -use drive::dpp::identity::convert_credits_to_duffs; -use drive::drive::identity::withdrawals::{ - WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes, -}; +use dashcore_rpc::dashcore::consensus::Encodable; +use dpp::block::block_info::BlockInfo; +use dpp::data_contracts::withdrawals_contract; +use dpp::data_contracts::withdrawals_contract::v1::document_types::withdrawal; +use dpp::document::document_methods::DocumentMethodsV0; +use dpp::document::{Document, DocumentV0Setters}; +use dpp::withdrawal::{WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes}; use crate::{ error::{execution::ExecutionError, Error}, platform_types::platform::Platform, rpc::core::CoreRPCLike, }; +use dpp::version::PlatformVersion; impl Platform where @@ -31,101 +20,72 @@ where /// Build list of Core transactions from withdrawal documents pub(super) fn build_untied_withdrawal_transactions_from_documents_v0( &self, - documents: &[Document], + documents: &mut Vec, start_index: WithdrawalTransactionIndex, - ) -> Result, Error> { - let mut withdrawals: HashMap = - HashMap::new(); - - for (i, document) in documents.iter().enumerate() { - let output_script_bytes = document - .properties() - .get_bytes(withdrawal::properties::OUTPUT_SCRIPT) - .map_err(|_| { - Error::Execution(ExecutionError::CorruptedCodeExecution( - "Can't get outputScript from withdrawal document", - )) - })?; - - let amount = document - .properties() - .get_integer(withdrawal::properties::AMOUNT) - .map_err(|_| { + block_info: &BlockInfo, + platform_version: &PlatformVersion, + ) -> Result, Error> { + documents + .iter_mut() + .enumerate() + .map(|(i, document)| { + let transaction_index = start_index + i as WithdrawalTransactionIndex; + + let withdrawal_transaction = document.try_into_asset_unlock_base_transaction_info( + transaction_index, + platform_version, + )?; + + let mut transaction_buffer: Vec = vec![]; + + withdrawal_transaction + .consensus_encode(&mut transaction_buffer) + .map_err(|_| { + Error::Execution(ExecutionError::CorruptedCodeExecution( + "Can't consensus encode a withdrawal transaction", + )) + })?; + + document.set_u64(withdrawal::properties::TRANSACTION_INDEX, transaction_index); + + document.set_u8( + withdrawal::properties::STATUS, + withdrawals_contract::WithdrawalStatus::POOLED as u8, + ); + + document.set_updated_at(Some(block_info.time_ms)); + + document.increment_revision().map_err(|_| { Error::Execution(ExecutionError::CorruptedCodeExecution( - "Can't get amount from withdrawal document", + "Could not increment document revision", )) })?; - let core_fee_per_byte: u32 = document - .properties() - .get_integer(withdrawal::properties::CORE_FEE_PER_BYTE) - .map_err(|_| { - Error::Execution(ExecutionError::CorruptedCodeExecution( - "Can't get coreFeePerByte from withdrawal document", - )) - })?; - - let output_script = ScriptBuf::from_bytes(output_script_bytes); - - let tx_out = TxOut { - value: convert_credits_to_duffs(amount)?, - script_pubkey: output_script, - }; - - let transaction_index = start_index + i as WithdrawalTransactionIndex; - - let withdrawal_transaction = AssetUnlockBaseTransactionInfo { - version: 1, - lock_time: 0, - output: vec![tx_out], - base_payload: AssetUnlockBasePayload { - version: 1, - index: transaction_index, - fee: ASSET_UNLOCK_TX_SIZE as u32 * core_fee_per_byte, - }, - }; - - let mut transaction_buffer: Vec = vec![]; - - withdrawal_transaction - .consensus_encode(&mut transaction_buffer) - .map_err(|_| { - Error::Execution(ExecutionError::CorruptedCodeExecution( - "Can't consensus encode a withdrawal transaction", - )) - })?; - - withdrawals.insert(document.id(), (transaction_index, transaction_buffer)); - } - - Ok(withdrawals) + Ok((transaction_index, transaction_buffer)) + }) + .collect() } } #[cfg(test)] mod tests { - - use dpp::withdrawal::Pooling; - use dpp::{ - data_contracts::withdrawals_contract, tests::fixtures::get_withdrawal_document_fixture, - }; + use dpp::tests::fixtures::get_withdrawal_document_fixture; use drive::util::test_helpers::setup::setup_document; mod build_withdrawal_transactions_from_documents { + use super::*; + use crate::test::helpers::setup::TestPlatformBuilder; + use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::identity::core_script::CoreScript; use dpp::platform_value::platform_value; use dpp::prelude::Identifier; + use dpp::system_data_contracts::withdrawals_contract::WithdrawalStatus; use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; use dpp::version::PlatformVersion; - use drive::drive::identity::withdrawals::WithdrawalTransactionIndexAndBytes; + use dpp::withdrawal::Pooling; use drive::util::test_helpers::setup::setup_system_data_contract; - use itertools::Itertools; - - use crate::test::helpers::setup::TestPlatformBuilder; - - use super::*; #[test] fn test_build() { @@ -152,7 +112,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never as u8, "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::WithdrawalStatus::POOLED as u8, + "status": WithdrawalStatus::POOLED as u8, "transactionIndex": 1u64, }), None, @@ -180,7 +140,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never as u8, "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::WithdrawalStatus::POOLED as u8, + "status": WithdrawalStatus::POOLED as u8, "transactionIndex": 2u64, }), None, @@ -196,18 +156,21 @@ mod tests { Some(&transaction), ); - let documents = vec![document_1, document_2]; + let mut documents = vec![document_1, document_2]; + + let block_info = BlockInfo::default_with_time(50); let transactions = platform - .build_untied_withdrawal_transactions_from_documents_v0(&documents, 50) + .build_untied_withdrawal_transactions_from_documents_v0( + &mut documents, + 50, + &block_info, + platform_version, + ) .expect("to build transactions from documents"); assert_eq!( - transactions - .values() - .cloned() - .sorted() - .collect::>(), + transactions, vec![ ( 50, @@ -226,9 +189,6 @@ mod tests { ], ), ] - .into_iter() - .sorted() - .collect::>(), ); } } diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs index 33edd09927..c2506d4f7d 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs @@ -13,7 +13,7 @@ use dpp::version::PlatformVersion; use drive::dpp::system_data_contracts::withdrawals_contract; use drive::dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; -use drive::drive::identity::withdrawals::WithdrawalTransactionIndex; +use dpp::withdrawal::WithdrawalTransactionIndex; use drive::query::TransactionArg; use drive::util::batch::DriveOperation; @@ -28,8 +28,6 @@ use dpp::errors::ProtocolError; use drive::config::DEFAULT_QUERY_LIMIT; -const WITHDRAWAL_TRANSACTIONS_QUERY_LIMIT: u16 = 16; - impl Platform where C: CoreRPCLike, @@ -44,9 +42,11 @@ where ) -> Result { let mut drive_operations: Vec = vec![]; - // Get 16 latest withdrawal transactions from the queue + // Get withdrawal_transactions_per_block_limit (normally 16) latest withdrawal transactions from the queue let untied_withdrawal_transactions = self.drive.dequeue_untied_withdrawal_transactions( - WITHDRAWAL_TRANSACTIONS_QUERY_LIMIT, + platform_version + .system_limits + .withdrawal_transactions_per_block_limit, transaction, &mut drive_operations, platform_version, diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/fetch_transactions_block_inclusion_status/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/fetch_transactions_block_inclusion_status/mod.rs index 0a4b17062e..726a86eef0 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/fetch_transactions_block_inclusion_status/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/fetch_transactions_block_inclusion_status/mod.rs @@ -4,7 +4,7 @@ use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; use dashcore_rpc::json::AssetUnlockStatus; use dpp::version::PlatformVersion; -use drive::drive::identity::withdrawals::WithdrawalTransactionIndex; +use dpp::withdrawal::WithdrawalTransactionIndex; use std::collections::BTreeMap; mod v0; diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/fetch_transactions_block_inclusion_status/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/fetch_transactions_block_inclusion_status/v0/mod.rs index 86433d8c03..d284be086d 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/fetch_transactions_block_inclusion_status/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/fetch_transactions_block_inclusion_status/v0/mod.rs @@ -1,9 +1,8 @@ +use crate::{error::Error, platform_types::platform::Platform, rpc::core::CoreRPCLike}; use dashcore_rpc::dashcore_rpc_json::AssetUnlockStatus; -use drive::drive::identity::withdrawals::WithdrawalTransactionIndex; +use dpp::withdrawal::WithdrawalTransactionIndex; use std::collections::BTreeMap; -use crate::{error::Error, platform_types::platform::Platform, rpc::core::CoreRPCLike}; - impl Platform where C: CoreRPCLike, diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/mod.rs index 910445fe32..66be57e5e0 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/mod.rs @@ -2,12 +2,14 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; mod v0; +mod v1; impl Platform where @@ -29,6 +31,7 @@ where pub(in crate::execution) fn pool_withdrawals_into_transactions_queue( &self, block_info: &BlockInfo, + last_committed_platform_state: &PlatformState, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result<(), Error> { @@ -39,13 +42,19 @@ where .pool_withdrawals_into_transactions_queue { 0 => self.pool_withdrawals_into_transactions_queue_v0( + block_info, + last_committed_platform_state, + transaction, + platform_version, + ), + 1 => self.pool_withdrawals_into_transactions_queue_v1( block_info, transaction, platform_version, ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "pool_withdrawals_into_transactions_queue".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, })), } diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs index 9540d42f12..00f1c8a761 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs @@ -1,18 +1,16 @@ use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::document::document_methods::DocumentMethodsV0; -use dpp::document::{DocumentV0Getters, DocumentV0Setters}; use dpp::version::PlatformVersion; - -use drive::drive::identity::withdrawals::WithdrawalTransactionIndexAndBytes; use drive::grovedb::TransactionArg; use dpp::system_data_contracts::withdrawals_contract; use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use drive::config::DEFAULT_QUERY_LIMIT; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::platform_types::platform_state::PlatformState; use crate::{ error::{execution::ExecutionError, Error}, platform_types::platform::Platform, @@ -27,9 +25,25 @@ where pub(super) fn pool_withdrawals_into_transactions_queue_v0( &self, block_info: &BlockInfo, + last_committed_platform_state: &PlatformState, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result<(), Error> { + // Currently Core only supports using the first 2 quorums (out of 24 for mainnet). + // For us, we just use the latest quorum to be extra safe. + let Some(position_of_current_quorum) = + last_committed_platform_state.current_validator_set_position_in_list_by_most_recent() + else { + tracing::warn!("Current quorum not in current validator set, not making withdrawals"); + return Ok(()); + }; + if position_of_current_quorum != 0 { + tracing::debug!( + "Current quorum is not most recent, it is in position {}, not making withdrawals", + position_of_current_quorum + ); + return Ok(()); + } let mut documents = self.drive.fetch_oldest_withdrawal_documents_by_status( withdrawals_contract::WithdrawalStatus::QUEUED.into(), DEFAULT_QUERY_LIMIT, @@ -45,46 +59,16 @@ where .drive .fetch_next_withdrawal_transaction_index(transaction, platform_version)?; - let untied_withdrawal_transactions = self - .build_untied_withdrawal_transactions_from_documents( - &documents, - start_transaction_index, - platform_version, - )?; - - for document in documents.iter_mut() { - let Some((transaction_index, _)) = untied_withdrawal_transactions.get(&document.id()) - else { - return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( - "transactions must contain a transaction", - ))); - }; - - document.set_u64( - withdrawal::properties::TRANSACTION_INDEX, - *transaction_index, - ); - - document.set_u8( - withdrawal::properties::STATUS, - withdrawals_contract::WithdrawalStatus::POOLED as u8, - ); - - document.set_updated_at(Some(block_info.time_ms)); - - document.increment_revision().map_err(|_| { - Error::Execution(ExecutionError::CorruptedCodeExecution( - "Could not increment document revision", - )) - })?; - } - - let withdrawal_transactions: Vec = - untied_withdrawal_transactions.into_values().collect(); + let withdrawal_transactions = self.build_untied_withdrawal_transactions_from_documents( + &mut documents, + start_transaction_index, + block_info, + platform_version, + )?; let withdrawal_transactions_count = withdrawal_transactions.len(); - let mut drive_operations = Vec::new(); + let mut drive_operations = vec![]; self.drive .add_enqueue_untied_withdrawal_transaction_operations( @@ -153,6 +137,7 @@ mod tests { use drive::util::test_helpers::setup::{setup_document, setup_system_data_contract}; use crate::test::helpers::setup::TestPlatformBuilder; + use dpp::document::DocumentV0Getters; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; use dpp::platform_value::platform_value; use dpp::system_data_contracts::load_system_data_contract; @@ -234,9 +219,12 @@ mod tests { Some(&transaction), ); + let platform_state = platform.state.load(); + platform .pool_withdrawals_into_transactions_queue_v0( &block_info, + &platform_state, Some(&transaction), platform_version, ) diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v1/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v1/mod.rs new file mode 100644 index 0000000000..34b3174933 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v1/mod.rs @@ -0,0 +1,251 @@ +use dpp::block::block_info::BlockInfo; + +use dpp::data_contract::accessors::v0::DataContractV0Getters; + +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; + +use dpp::system_data_contracts::withdrawals_contract; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; +use drive::config::DEFAULT_QUERY_LIMIT; + +use crate::{ + error::{execution::ExecutionError, Error}, + platform_types::platform::Platform, + rpc::core::CoreRPCLike, +}; + +impl Platform +where + C: CoreRPCLike, +{ + /// Pool withdrawal documents into transactions + pub(super) fn pool_withdrawals_into_transactions_queue_v1( + &self, + block_info: &BlockInfo, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let mut documents = self.drive.fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::QUEUED.into(), + DEFAULT_QUERY_LIMIT, + transaction, + platform_version, + )?; + + if documents.is_empty() { + return Ok(()); + } + + let start_transaction_index = self + .drive + .fetch_next_withdrawal_transaction_index(transaction, platform_version)?; + + let withdrawal_transactions = self.build_untied_withdrawal_transactions_from_documents( + &mut documents, + start_transaction_index, + block_info, + platform_version, + )?; + + let withdrawal_transactions_count = withdrawal_transactions.len(); + + let mut drive_operations = vec![]; + + self.drive + .add_enqueue_untied_withdrawal_transaction_operations( + withdrawal_transactions, + &mut drive_operations, + platform_version, + )?; + + let end_transaction_index = start_transaction_index + withdrawal_transactions_count as u64; + + self.drive + .add_update_next_withdrawal_transaction_index_operation( + end_transaction_index, + &mut drive_operations, + platform_version, + )?; + + tracing::debug!( + "Pooled {} withdrawal documents into {} transactions with indices from {} to {}", + documents.len(), + withdrawal_transactions_count, + start_transaction_index, + end_transaction_index, + ); + + let withdrawals_contract = self.drive.cache.system_data_contracts.load_withdrawals(); + + self.drive.add_update_multiple_documents_operations( + &documents, + &withdrawals_contract, + withdrawals_contract + .document_type_for_name(withdrawal::NAME) + .map_err(|_| { + Error::Execution(ExecutionError::CorruptedCodeExecution( + "Can't fetch withdrawal data contract", + )) + })?, + &mut drive_operations, + &platform_version.drive, + )?; + + self.drive.apply_drive_operations( + drive_operations, + true, + block_info, + transaction, + platform_version, + None, + )?; + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use dpp::block::epoch::Epoch; + use itertools::Itertools; + + use dpp::data_contracts::SystemDataContract; + use dpp::identifier::Identifier; + use dpp::identity::core_script::CoreScript; + use dpp::tests::fixtures::get_withdrawal_document_fixture; + use dpp::withdrawal::Pooling; + use drive::util::test_helpers::setup::{setup_document, setup_system_data_contract}; + + use crate::test::helpers::setup::TestPlatformBuilder; + use dpp::document::DocumentV0Getters; + use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; + use dpp::platform_value::platform_value; + use dpp::system_data_contracts::load_system_data_contract; + use dpp::version::PlatformVersion; + + #[test] + fn test_pooling() { + let platform_version = PlatformVersion::latest(); + let platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); + + let transaction = platform.drive.grove.start_transaction(); + + let block_info = BlockInfo { + time_ms: 1, + height: 1, + core_height: 96, + epoch: Epoch::default(), + }; + + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, platform_version) + .expect("to load system data contract"); + + setup_system_data_contract(&platform.drive, &data_contract, Some(&transaction)); + + let owner_id = Identifier::new([1u8; 32]); + + let document_1 = get_withdrawal_document_fixture( + &data_contract, + owner_id, + platform_value!({ + "amount": 1000u64, + "coreFeePerByte": 1u32, + "pooling": Pooling::Never as u8, + "outputScript": CoreScript::from_bytes((0..23).collect::>()), + "status": withdrawals_contract::WithdrawalStatus::QUEUED as u8, + "transactionIndex": 1u64, + }), + None, + platform_version.protocol_version, + ) + .expect("expected withdrawal document"); + + let document_type = data_contract + .document_type_for_name(withdrawal::NAME) + .expect("expected to get document type"); + + setup_document( + &platform.drive, + &document_1, + &data_contract, + document_type, + Some(&transaction), + ); + + let document_2 = get_withdrawal_document_fixture( + &data_contract, + owner_id, + platform_value!({ + "amount": 1000u64, + "coreFeePerByte": 1u32, + "pooling": Pooling::Never as u8, + "outputScript": CoreScript::from_bytes((0..23).collect::>()), + "status": withdrawals_contract::WithdrawalStatus::QUEUED as u8, + "transactionIndex": 2u64, + }), + None, + platform_version.protocol_version, + ) + .expect("expected withdrawal document"); + + setup_document( + &platform.drive, + &document_2, + &data_contract, + document_type, + Some(&transaction), + ); + + let platform_state = platform.state.load(); + + platform + .pool_withdrawals_into_transactions_queue_v0( + &block_info, + &platform_state, + Some(&transaction), + platform_version, + ) + .expect("to pool withdrawal documents into transactions"); + + let updated_documents = platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, + Some(&transaction), + platform_version, + ) + .expect("to fetch withdrawal documents"); + + for (i, document) in updated_documents + .into_iter() + // Sort by index because updated_at is the same for all documents within batch + .sorted_by(|a, b| { + let a_index = a + .properties() + .get_u64(withdrawal::properties::TRANSACTION_INDEX) + .expect("to get transactionIndex"); + let b_index = b + .properties() + .get_u64(withdrawal::properties::TRANSACTION_INDEX) + .expect("to get transactionIndex"); + a_index.cmp(&b_index) + }) + .enumerate() + { + assert_eq!(document.revision(), Some(2)); + + let tx_index = document + .properties() + .get_u64(withdrawal::properties::TRANSACTION_INDEX) + .expect("to get transactionIndex"); + + assert_eq!(tx_index, i as u64); + } + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs index 0257f29351..2eba2e228c 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs @@ -11,8 +11,8 @@ use dpp::version::PlatformVersion; use itertools::Itertools; use std::collections::HashSet; +use dpp::withdrawal::WithdrawalTransactionIndex; use drive::config::DEFAULT_QUERY_LIMIT; -use drive::drive::identity::withdrawals::WithdrawalTransactionIndex; use drive::grovedb::Transaction; use drive::util::batch::DriveOperation; diff --git a/packages/rs-drive-abci/src/execution/types/block_execution_context/v0/mod.rs b/packages/rs-drive-abci/src/execution/types/block_execution_context/v0/mod.rs index ec71d6f20d..de6e1ddc33 100644 --- a/packages/rs-drive-abci/src/execution/types/block_execution_context/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/block_execution_context/v0/mod.rs @@ -1,32 +1,3 @@ -// MIT LICENSE -// -// Copyright (c) 2021 Dash Core Group -// -// Permission is hereby granted, free of charge, to any -// person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the -// Software without restriction, including without -// limitation the rights to use, copy, modify, merge, -// publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software -// is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice -// shall be included in all copies or substantial portions -// of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// - use crate::execution::types::block_state_info::BlockStateInfo; use crate::platform_types::epoch_info::EpochInfo; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs index 4e316a7af0..5d411c02a2 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs @@ -74,18 +74,12 @@ impl<'a> ValidateStateTransitionIdentitySignatureV0<'a> for StateTransition { let owner_id = self.owner_id(); - let security_levels = - self.security_level_requirement() + let allowed_purposes = + self.purpose_requirement() .ok_or(ProtocolError::CorruptedCodeExecution( - "state_transition does not have security level".to_string(), + "state_transition does not have a key purpose requirement".to_string(), ))?; - let purpose = self - .purpose_requirement() - .ok_or(ProtocolError::CorruptedCodeExecution( - "state_transition does not have a key purpose requirement".to_string(), - ))?; - let key_request = IdentityKeysRequest::new_specific_key_query(owner_id.as_bytes(), key_id); let maybe_partial_identity = match (request_identity_balance, request_identity_revision) { @@ -169,13 +163,19 @@ impl<'a> ValidateStateTransitionIdentitySignatureV0<'a> for StateTransition { return Ok(validation_result); } - if purpose != public_key.purpose() { + if !allowed_purposes.contains(&public_key.purpose()) { validation_result.add_error(SignatureError::InvalidSignaturePublicKeyPurposeError( - InvalidSignaturePublicKeyPurposeError::new(public_key.purpose(), purpose), + InvalidSignaturePublicKeyPurposeError::new(public_key.purpose(), allowed_purposes), )); return Ok(validation_result); } + let security_levels = self + .security_level_requirement(public_key.purpose()) + .ok_or(ProtocolError::CorruptedCodeExecution( + "state_transition does not have security level".to_string(), + ))?; + if !security_levels.contains(&public_key.security_level()) { validation_result.add_error( SignatureError::InvalidSignaturePublicKeySecurityLevelError( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs index 8e5f5155f2..f74cb36392 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs @@ -31,10 +31,10 @@ impl StateTransitionActionTransformerV0 for IdentityCreditWithdrawalTransition { fn transform_into_action( &self, platform: &PlatformRef, - _block_info: &BlockInfo, + block_info: &BlockInfo, _validation_mode: ValidationMode, _execution_context: &mut StateTransitionExecutionContext, - _tx: TransactionArg, + tx: TransactionArg, ) -> Result, Error> { let platform_version = platform.state.current_platform_version()?; @@ -45,7 +45,7 @@ impl StateTransitionActionTransformerV0 for IdentityCreditWithdrawalTransition { .identity_credit_withdrawal_state_transition .transform_into_action { - 0 => self.transform_into_action_v0(platform), + 0 => self.transform_into_action_v0(platform, block_info, tx, platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity credit withdrawal transition: transform_into_action".to_string(), known_versions: vec![0], @@ -93,7 +93,7 @@ impl StateTransitionStateValidationV0 for IdentityCreditWithdrawalTransition { _action: Option, platform: &PlatformRef, _validation_mode: ValidationMode, - _block_info: &BlockInfo, + block_info: &BlockInfo, _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { @@ -106,7 +106,7 @@ impl StateTransitionStateValidationV0 for IdentityCreditWithdrawalTransition { .identity_credit_withdrawal_state_transition .state { - 0 => self.validate_state_v0(platform, tx), + 0 => self.validate_state_v0(platform, block_info, tx, platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity credit withdrawal transition: validate_state".to_string(), known_versions: vec![0], @@ -129,10 +129,14 @@ mod tests { use dpp::consensus::ConsensusError; use dpp::dash_to_credits; use dpp::identity::core_script::CoreScript; + use dpp::identity::KeyType::{ECDSA_HASH160, ECDSA_SECP256K1}; use dpp::serialization::PlatformSerializable; - use dpp::state_transition::identity_credit_withdrawal_transition::methods::IdentityCreditWithdrawalTransitionMethodsV0; + use dpp::state_transition::identity_credit_withdrawal_transition::methods::{ + IdentityCreditWithdrawalTransitionMethodsV0, PreferredKeyPurposeForSigningWithdrawal, + }; use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use dpp::withdrawal::Pooling; + use platform_version::version::v1::PROTOCOL_VERSION_1; use platform_version::version::PlatformVersion; use rand::prelude::StdRng; use rand::{Rng, SeedableRng}; @@ -152,6 +156,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(platform_config) + .with_initial_protocol_version(PROTOCOL_VERSION_1) .build_with_mock_rpc() .set_initial_state_structure(); @@ -161,6 +166,7 @@ mod tests { setup_identity_with_withdrawal_key_and_system_credits( &mut platform, rng.gen(), + ECDSA_SECP256K1, dash_to_credits!(0.5), ); @@ -170,16 +176,17 @@ mod tests { let credit_withdrawal_transition = IdentityCreditWithdrawalTransition::try_from_identity( &identity, - Some(&withdrawal_key), - CoreScript::random_p2pkh(&mut rng), + Some(CoreScript::random_p2pkh(&mut rng)), withdrawal_amount, Pooling::Never, 1, 0, signer, + Some(&withdrawal_key), + PreferredKeyPurposeForSigningWithdrawal::Any, 2, platform_version, - None, + Some(1), ) .expect("expected a credit withdrawal transition"); @@ -209,4 +216,235 @@ mod tests { )] ); } + + #[test] + fn test_identity_credit_withdrawal_with_withdrawal_address_creates_withdrawal_document() { + let platform_version = PlatformVersion::latest(); + let platform_config = PlatformConfig { + testing_configs: PlatformTestConfig { + disable_instant_lock_signature_verification: true, + ..Default::default() + }, + ..Default::default() + }; + + let mut rng = StdRng::seed_from_u64(567); + + let mut platform = TestPlatformBuilder::new() + .with_config(platform_config) + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + fast_forward_to_block(&platform, 1_200_000_000, 900, 42, 1, false); //next epoch + + let (identity, signer, _, withdrawal_key) = + setup_identity_with_withdrawal_key_and_system_credits( + &mut platform, + rng.gen(), + ECDSA_SECP256K1, + dash_to_credits!(0.5), + ); + + let platform_state = platform.state.load(); + + let withdrawal_amount = dash_to_credits!(0.1); + + let credit_withdrawal_transition = IdentityCreditWithdrawalTransition::try_from_identity( + &identity, + Some(CoreScript::random_p2pkh(&mut rng)), + withdrawal_amount, + Pooling::Never, + 1, + 0, + signer, + Some(&withdrawal_key), + PreferredKeyPurposeForSigningWithdrawal::Any, + 2, + platform_version, + None, + ) + .expect("expected a credit withdrawal transition"); + + let credit_withdrawal_transition_serialized_transition = credit_withdrawal_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![credit_withdrawal_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(1_200_001_000), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(..)] + ); + } + + #[test] + fn test_identity_credit_withdrawal_without_withdrawal_address_creates_withdrawal_document_when_signing_with_withdrawal_key( + ) { + let platform_version = PlatformVersion::latest(); + let platform_config = PlatformConfig { + testing_configs: PlatformTestConfig { + disable_instant_lock_signature_verification: true, + ..Default::default() + }, + ..Default::default() + }; + + let mut rng = StdRng::seed_from_u64(567); + + let mut platform = TestPlatformBuilder::new() + .with_config(platform_config) + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + fast_forward_to_block(&platform, 1_200_000_000, 900, 42, 1, false); //next epoch + + let (identity, signer, _, withdrawal_key) = + setup_identity_with_withdrawal_key_and_system_credits( + &mut platform, + rng.gen(), + ECDSA_HASH160, + dash_to_credits!(0.5), + ); + + let platform_state = platform.state.load(); + + let withdrawal_amount = dash_to_credits!(0.1); + + let credit_withdrawal_transition = IdentityCreditWithdrawalTransition::try_from_identity( + &identity, + None, + withdrawal_amount, + Pooling::Never, + 1, + 0, + signer, + Some(&withdrawal_key), + PreferredKeyPurposeForSigningWithdrawal::TransferOnly, + 2, + platform_version, + None, + ) + .expect("expected a credit withdrawal transition"); + + let credit_withdrawal_transition_serialized_transition = credit_withdrawal_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![credit_withdrawal_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(1_200_001_000), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(..)] + ); + } + + mod errors { + use super::*; + use dpp::consensus::state::state_error::StateError; + #[test] + fn test_credit_withdrawal_without_withdrawal_address_with_a_non_payable_transfer_key() { + let platform_version = PlatformVersion::latest(); + let platform_config = PlatformConfig { + testing_configs: PlatformTestConfig { + disable_instant_lock_signature_verification: true, + ..Default::default() + }, + ..Default::default() + }; + + let mut rng = StdRng::seed_from_u64(567); + + let mut platform = TestPlatformBuilder::new() + .with_config(platform_config) + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + fast_forward_to_block(&platform, 1_200_000_000, 900, 42, 1, false); //next epoch + + let (identity, signer, _, withdrawal_key) = + setup_identity_with_withdrawal_key_and_system_credits( + &mut platform, + rng.gen(), + ECDSA_SECP256K1, + dash_to_credits!(0.5), + ); + + let platform_state = platform.state.load(); + + let withdrawal_amount = dash_to_credits!(0.1); + + let credit_withdrawal_transition = + IdentityCreditWithdrawalTransition::try_from_identity( + &identity, + None, + withdrawal_amount, + Pooling::Never, + 1, + 0, + signer, + Some(&withdrawal_key), + PreferredKeyPurposeForSigningWithdrawal::TransferOnly, + 2, + platform_version, + None, + ) + .expect("expected a credit withdrawal transition"); + + let credit_withdrawal_transition_serialized_transition = credit_withdrawal_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![credit_withdrawal_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(1_200_001_000), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::UnpaidConsensusError( + ConsensusError::StateError( + StateError::NoTransferKeyForCoreWithdrawalAvailableError(_) + ) + )] + ); + } + } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/state/v0/mod.rs index cecf5edb3d..87fe5892fe 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/state/v0/mod.rs @@ -1,15 +1,15 @@ -use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; +use dpp::block::block_info::BlockInfo; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use dpp::consensus::signature::IdentityNotFoundError; use dpp::consensus::state::identity::IdentityInsufficientBalanceError; use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::identity_credit_withdrawal_transition::accessors::IdentityCreditWithdrawalTransitionAccessorsV0; use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; +use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use drive::state_transition_action::identity::identity_credit_withdrawal::IdentityCreditWithdrawalTransitionAction; use drive::state_transition_action::StateTransitionAction; @@ -18,12 +18,17 @@ pub(in crate::execution::validation::state_transition::state_transitions::identi fn validate_state_v0( &self, platform: &PlatformRef, + block_info: &BlockInfo, tx: TransactionArg, + platform_version: &PlatformVersion, ) -> Result, Error>; fn transform_into_action_v0( &self, platform: &PlatformRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, ) -> Result, Error>; } @@ -33,9 +38,10 @@ impl IdentityCreditWithdrawalStateTransitionStateValidationV0 fn validate_state_v0( &self, platform: &PlatformRef, + block_info: &BlockInfo, tx: TransactionArg, + platform_version: &PlatformVersion, ) -> Result, Error> { - let platform_version = platform.state.current_platform_version()?; let maybe_existing_identity_balance = platform.drive.fetch_identity_balance( self.identity_id().to_buffer(), tx, @@ -59,27 +65,27 @@ impl IdentityCreditWithdrawalStateTransitionStateValidationV0 )); } - self.transform_into_action_v0(platform) + self.transform_into_action_v0(platform, block_info, tx, platform_version) } fn transform_into_action_v0( &self, platform: &PlatformRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, ) -> Result, Error> { - let last_block_time = - platform - .state - .last_committed_block_time_ms() - .ok_or(Error::Execution(ExecutionError::StateNotInitialized( - "expected a last platform block during identity update validation", - )))?; - - Ok(ConsensusValidationResult::new_with_data( - IdentityCreditWithdrawalTransitionAction::from_identity_credit_withdrawal( + Ok( + IdentityCreditWithdrawalTransitionAction::try_from_identity_credit_withdrawal( + &platform.drive, + tx, self, - last_block_time, + block_info, + platform_version, ) - .into(), - )) + .map(|consensus_validation_result| { + consensus_validation_result.map(|withdrawal| withdrawal.into()) + })?, + ) } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v1/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v1/mod.rs index b89b35655c..daaf9f7e3d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v1/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v1/mod.rs @@ -8,10 +8,9 @@ use dpp::consensus::ConsensusError; use crate::error::Error; use dpp::state_transition::identity_credit_withdrawal_transition::accessors::IdentityCreditWithdrawalTransitionAccessorsV0; -use dpp::state_transition::identity_credit_withdrawal_transition::v0::{ - MIN_CORE_FEE_PER_BYTE, MIN_WITHDRAWAL_AMOUNT, +use dpp::state_transition::identity_credit_withdrawal_transition::{ + IdentityCreditWithdrawalTransition, MIN_CORE_FEE_PER_BYTE, MIN_WITHDRAWAL_AMOUNT, }; -use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use dpp::util::is_fibonacci_number::is_fibonacci_number; use dpp::validation::SimpleConsensusValidationResult; use dpp::withdrawal::Pooling; @@ -57,13 +56,15 @@ impl IdentityCreditWithdrawalStateTransitionStructureValidationV1 return Ok(result); } - // validate output_script types - if !self.output_script().is_p2pkh() && !self.output_script().is_p2sh() { - result.add_error( - InvalidIdentityCreditWithdrawalTransitionOutputScriptError::new( - self.output_script().clone(), - ), - ); + if let Some(output_script) = self.output_script() { + // validate output_script types + if !output_script.is_p2pkh() && !output_script.is_p2sh() { + result.add_error( + InvalidIdentityCreditWithdrawalTransitionOutputScriptError::new( + output_script.clone(), + ), + ); + } } Ok(result) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/mod.rs index 9ef53ddfb0..fe7d8095b8 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/mod.rs @@ -5777,7 +5777,6 @@ mod tests { use crate::execution::validation::state_transition::tests::{ create_dpns_contract_name_contest, create_dpns_identity_name_contest_skip_creating_identities, - setup_identity_without_adding_it, }; use assert_matches::assert_matches; use dapi_grpc::platform::v0::get_contested_resource_vote_state_request::GetContestedResourceVoteStateRequestV0; @@ -9949,7 +9948,7 @@ mod tests { // The alpha document should not exist at all { - let (contenders, abstaining, locking, finished_vote_info) = get_vote_states( + let (contenders, _abstaining, _locking, finished_vote_info) = get_vote_states( &platform, &platform_state, &dpns_contract, @@ -10730,7 +10729,7 @@ mod tests { // The alpha document should not exist at all { - let (contenders, abstaining, locking, finished_vote_info) = get_vote_states( + let (contenders, _abstaining, _locking, finished_vote_info) = get_vote_states( &platform, &platform_state, &dpns_contract, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs index 4c091f8ad3..51df74cde5 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs @@ -345,6 +345,7 @@ pub(in crate::execution) mod tests { pub(in crate::execution) fn setup_identity_with_withdrawal_key_and_system_credits( platform: &mut TempPlatform, seed: u64, + withdrawal_key_type: KeyType, credits: Credits, ) -> (Identity, SimpleSigner, IdentityPublicKey, IdentityPublicKey) { let platform_version = PlatformVersion::latest(); @@ -382,7 +383,7 @@ pub(in crate::execution) mod tests { &mut rng, Purpose::TRANSFER, SecurityLevel::CRITICAL, - KeyType::ECDSA_SECP256K1, + withdrawal_key_type, None, platform_version, ) diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs index e937924c94..462ce2c327 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs @@ -25,6 +25,7 @@ use indexmap::IndexMap; use crate::config::PlatformConfig; use crate::error::execution::ExecutionError; use crate::platform_types::signature_verification_quorum_set::SignatureVerificationQuorumSet; +use crate::platform_types::validator_set::v0::ValidatorSetV0Getters; use dpp::block::block_info::BlockInfo; use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::util::hash::hash_double; diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs index 61bc6b8d7d..fcbe622a0d 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs @@ -20,10 +20,10 @@ use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0Getters; use dpp::version::{PlatformVersion, TryIntoPlatformVersioned}; use crate::config::PlatformConfig; -use crate::platform_types::platform_state::PlatformState; use crate::platform_types::signature_verification_quorum_set::{ SignatureVerificationQuorumSet, SignatureVerificationQuorumSetForSaving, }; +use crate::platform_types::validator_set::v0::ValidatorSetV0Getters; use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use itertools::Itertools; use std::collections::BTreeMap; @@ -345,6 +345,24 @@ pub trait PlatformStateV0Methods { /// Returns the quorum hash of the current validator set. fn current_validator_set_quorum_hash(&self) -> QuorumHash; + /// Where is the current validator set in the list + fn current_validator_set_position_in_list_by_most_recent(&self) -> Option { + // Get the current quorum hash + let current_quorum_hash = self.current_validator_set_quorum_hash(); + + // Get the validator sets and collect them into a vector for sorting + let mut validator_sets: Vec<&ValidatorSet> = self.validator_sets().values().collect(); + + // Sort the validator sets by core height in descending order + validator_sets.sort_by(|a, b| b.core_height().cmp(&a.core_height())); + + // Find the position of the current validator set in the sorted list + validator_sets + .iter() + .position(|&validator_set| validator_set.quorum_hash() == ¤t_quorum_hash) + .map(|position| position as u16) // Convert position to u16 + } + /// Returns the quorum hash of the next validator set, if it exists. fn next_validator_set_quorum_hash(&self) -> &Option; diff --git a/packages/rs-drive-abci/src/platform_types/withdrawal/unsigned_withdrawal_txs/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/withdrawal/unsigned_withdrawal_txs/v0/mod.rs index 0d61d4e471..1143c0aa09 100644 --- a/packages/rs-drive-abci/src/platform_types/withdrawal/unsigned_withdrawal_txs/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/withdrawal/unsigned_withdrawal_txs/v0/mod.rs @@ -1,8 +1,10 @@ //! Withdrawal transactions definitions and processing + use dpp::dashcore::consensus::Encodable; use dpp::dashcore::hashes::Hash; use dpp::dashcore::transaction::special_transaction::TransactionPayload::AssetUnlockPayloadType; use dpp::dashcore::{Transaction, VarInt}; +use std::collections::{BTreeMap, HashMap}; use std::fmt::Display; use tenderdash_abci::proto::types::VoteExtension; use tenderdash_abci::proto::{abci::ExtendVoteExtension, types::VoteExtensionType}; @@ -48,19 +50,64 @@ impl UnsignedWithdrawalTxs { } /// Verifies that the collection of unsigned withdrawal transactions matches the given votes extensions - /// created based on these transactions - pub fn are_matching_with_vote_extensions(&self, other: &[VoteExtension]) -> bool { + /// created based on these transactions. + /// Returns a mapping from transactions to their corresponding vote extensions if they match, or `None` if they don't. + pub fn verify_and_match_with_vote_extensions<'a>( + &'a self, + other: &'a [VoteExtension], + ) -> Option> { if self.0.len() != other.len() { - return false; - }; + return None; + } - !self.0.iter().zip(other.iter()).any(|(tx, vote_extension)| { + // Build a map from sign_request_id to VoteExtension + let mut vote_extension_map = HashMap::new(); + for vote_extension in other { + // Ensure that each signature is 96 bytes (size of a bls sig) + if vote_extension.signature.len() != 96 { + return None; + } + // Ensure sign_request_id is Some + if let Some(sign_request_id) = &vote_extension.sign_request_id { + vote_extension_map.insert(sign_request_id.clone(), vote_extension); + } else { + // If sign_request_id is None, we cannot match, return None + return None; + } + } + + let mut tx_to_vote_extension_map = BTreeMap::new(); + + // For each transaction, check if a matching vote extension exists + for tx in &self.0 { let extend_vote_extension = tx_to_extend_vote_extension(tx); + let sign_request_id = match &extend_vote_extension.sign_request_id { + Some(id) => id, + None => { + // If sign_request_id is None, we cannot match, return None + return None; + } + }; + + match vote_extension_map.get(sign_request_id) { + Some(vote_extension) => { + if vote_extension.r#type != extend_vote_extension.r#type + || vote_extension.extension != extend_vote_extension.extension + { + return None; + } else { + // All good, insert into map + tx_to_vote_extension_map.insert(tx, *vote_extension); + } + } + None => { + // No matching vote extension found + return None; + } + } + } - vote_extension.r#type != extend_vote_extension.r#type - || vote_extension.sign_request_id != extend_vote_extension.sign_request_id - || vote_extension.extension != extend_vote_extension.extension - }) + Some(tx_to_vote_extension_map) } } @@ -112,7 +159,7 @@ impl From<&UnsignedWithdrawalTxs> for Vec { } } -fn tx_to_extend_vote_extension(tx: &Transaction) -> ExtendVoteExtension { +pub(crate) fn tx_to_extend_vote_extension(tx: &Transaction) -> ExtendVoteExtension { let request_id = make_extend_vote_request_id(tx); let extension = tx.txid().as_byte_array().to_vec(); diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index f42f791ebb..21d269d6be 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -30,6 +30,7 @@ mod strategy; mod upgrade_fork_tests; mod verify_state_transitions; mod voting_tests; +mod withdrawal_tests; pub type BlockHeight = u64; @@ -43,15 +44,13 @@ fn asset_unlock_index(tx: &Transaction) -> u64 { #[cfg(test)] mod tests { use super::*; - use crate::execution::{continue_chain_for_strategy, run_chain_for_strategy, GENESIS_TIME_MS}; + use crate::execution::{continue_chain_for_strategy, run_chain_for_strategy}; use crate::query::QueryStrategy; use crate::strategy::{FailureStrategy, MasternodeListChangesStrategy}; use dashcore_rpc::dashcore::hashes::Hash; use dashcore_rpc::dashcore::BlockHash; - use dashcore_rpc::dashcore_rpc_json::AssetUnlockStatus; - use dashcore_rpc::json::{AssetUnlockStatusResult, QuorumType}; + use dashcore_rpc::json::QuorumType; use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0Getters; - use std::sync::{Arc, Mutex}; use strategy_tests::operations::DocumentAction::{ DocumentActionReplaceRandom, DocumentActionTransferRandom, }; @@ -61,21 +60,15 @@ mod tests { use strategy_tests::{IdentityInsertInfo, StartIdentities}; use crate::strategy::CoreHeightIncrease::RandomCoreHeightIncrease; - use dpp::dashcore::bls_sig_utils::BLSSignature; use dpp::dashcore::ChainLock; - use dpp::dashcore::Txid; use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; use dpp::data_contract::document_type::random_document::{ DocumentFieldFillSize, DocumentFieldFillType, }; use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; - use dpp::system_data_contracts::withdrawals_contract; use dpp::tests::json_document::json_document_to_created_contract; use dpp::util::hash::hash_to_hex_string; - use dpp::version::PlatformVersion; - use drive::config::DEFAULT_QUERY_LIMIT; - use drive::drive::identity::withdrawals::WithdrawalTransactionIndex; use drive_abci::config::{ ChainLockConfig, ExecutionConfig, InstantLockConfig, PlatformTestConfig, ValidatorSetConfig, }; @@ -92,6 +85,7 @@ mod tests { }; use dpp::identity::{Identity, KeyType, Purpose, SecurityLevel}; use dpp::state_transition::StateTransition; + use platform_version::version::PlatformVersion; use simple_signer::signer::SimpleSigner; use strategy_tests::transitions::create_state_transitions_for_identities; use tenderdash_abci::Application; @@ -3224,609 +3218,6 @@ mod tests { })); } - #[test] - #[ignore] - fn run_chain_top_up_and_withdraw_from_identities() { - let platform_version = PlatformVersion::latest(); - let strategy = NetworkStrategy { - strategy: Strategy { - start_contracts: vec![], - operations: vec![ - Operation { - op_type: OperationType::IdentityTopUp, - frequency: Frequency { - times_per_block_range: 1..4, - chance_per_block: None, - }, - }, - Operation { - op_type: OperationType::IdentityWithdrawal, - frequency: Frequency { - times_per_block_range: 1..4, - chance_per_block: None, - }, - }, - ], - start_identities: StartIdentities::default(), - identity_inserts: IdentityInsertInfo { - frequency: Frequency { - times_per_block_range: 1..2, - chance_per_block: None, - }, - start_keys: 3, - extra_keys: [( - Purpose::TRANSFER, - [(SecurityLevel::CRITICAL, vec![KeyType::ECDSA_SECP256K1])].into(), - )] - .into(), - }, - identity_contract_nonce_gaps: None, - signer: None, - }, - total_hpmns: 100, - extra_normal_mns: 0, - validator_quorum_count: 24, - chain_lock_quorum_count: 24, - upgrading_info: None, - - proposer_strategy: Default::default(), - rotate_quorums: false, - failure_testing: None, - query_testing: None, - // because we can add an identity and withdraw from it in the same block - // the result would be different from what would be expected - verify_state_transition_results: false, - ..Default::default() - }; - let config = PlatformConfig { - validator_set: ValidatorSetConfig::default_100_67(), - chain_lock: ChainLockConfig::default_100_67(), - instant_lock: InstantLockConfig::default_100_67(), - execution: ExecutionConfig { - verify_sum_trees: true, - - ..Default::default() - }, - block_spacing_ms: 3000, - testing_configs: PlatformTestConfig::default_minimal_verifications(), - ..Default::default() - }; - - let mut platform = TestPlatformBuilder::new() - .with_config(config.clone()) - .build_with_mock_rpc(); - - platform - .core_rpc - .expect_send_raw_transaction() - .returning(move |_| Ok(Txid::all_zeros())); - - struct CoreState { - asset_unlock_statuses: BTreeMap, - chain_lock: ChainLock, - } - - let mut chain_locked_height = 1; - - // Have to go with a complicated shared object for the core state because we need to change - // rpc response along the way but we can't mutate `platform.core_rpc` later - // because platform reference is moved into the AbciApplication. - let shared_core_state = Arc::new(Mutex::new(CoreState { - asset_unlock_statuses: BTreeMap::new(), - chain_lock: ChainLock { - block_height: chain_locked_height, - block_hash: BlockHash::from_byte_array([1; 32]), - signature: BLSSignature::from([2; 96]), - }, - })); - - // Set up Core RPC responses - { - let core_state = shared_core_state.clone(); - - platform - .core_rpc - .expect_get_asset_unlock_statuses() - .returning(move |indices, _| { - Ok(indices - .iter() - .map(|index| { - core_state - .lock() - .unwrap() - .asset_unlock_statuses - .get(index) - .cloned() - .unwrap() - }) - .collect()) - }); - - let core_state = shared_core_state.clone(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || Ok(core_state.lock().unwrap().chain_lock.clone())); - } - - // Run first two blocks: - // - Block 1: creates identity - // - Block 2: tops up identity and initiates withdrawals - let ( - ChainExecutionOutcome { - abci_app, - proposers, - validator_quorums: quorums, - current_validator_quorum_hash: current_quorum_hash, - current_proposer_versions, - end_time_ms, - identity_nonce_counter, - identity_contract_nonce_counter, - instant_lock_quorums, - .. - }, - last_block_pooled_withdrawals_amount, - ) = { - let outcome = run_chain_for_strategy( - &mut platform, - 2, - strategy.clone(), - config.clone(), - 1, - &mut None, - ); - - // Withdrawal transactions are not populated to block execution context yet - assert_eq!(outcome.withdrawals.len(), 0); - - // Withdrawal documents with pooled status should exist. - let withdrawal_documents_pooled = outcome - .abci_app - .platform - .drive - .fetch_oldest_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::POOLED.into(), - DEFAULT_QUERY_LIMIT, - None, - platform_version, - ) - .unwrap(); - assert!(!withdrawal_documents_pooled.is_empty()); - let pooled_withdrawals = withdrawal_documents_pooled.len(); - - (outcome, pooled_withdrawals) - }; - - // Run block 3 - // Should broadcast previously pooled withdrawals to core - let ChainExecutionOutcome { - abci_app, - proposers, - validator_quorums: quorums, - current_validator_quorum_hash: current_quorum_hash, - current_proposer_versions, - end_time_ms, - withdrawals: last_block_withdrawals, - identity_nonce_counter, - identity_contract_nonce_counter, - instant_lock_quorums, - .. - } = { - let outcome = continue_chain_for_strategy( - abci_app, - ChainExecutionParameters { - block_start: 3, - core_height_start: 1, - block_count: 1, - proposers, - validator_quorums: quorums, - current_validator_quorum_hash: current_quorum_hash, - current_proposer_versions: Some(current_proposer_versions), - current_identity_nonce_counter: identity_nonce_counter, - current_identity_contract_nonce_counter: identity_contract_nonce_counter, - current_votes: BTreeMap::default(), - start_time_ms: GENESIS_TIME_MS, - current_time_ms: end_time_ms, - instant_lock_quorums, - current_identities: Vec::new(), - }, - strategy.clone(), - config.clone(), - StrategyRandomness::SeedEntropy(2), - ); - - // Withdrawal documents with pooled status should exist. - let withdrawal_documents_broadcasted = outcome - .abci_app - .platform - .drive - .fetch_oldest_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), - DEFAULT_QUERY_LIMIT, - None, - platform_version, - ) - .unwrap(); - - // In this block all previously pooled withdrawals should be broadcasted - assert_eq!( - outcome.withdrawals.len(), - last_block_pooled_withdrawals_amount - ); - assert_eq!( - withdrawal_documents_broadcasted.len(), - last_block_pooled_withdrawals_amount - ); - - outcome - }; - - // Update core state before running next block. - // Asset unlocks broadcasted in the last block should have Unknown status - { - let mut core_state = shared_core_state.lock().unwrap(); - last_block_withdrawals.iter().for_each(|tx| { - let index = asset_unlock_index(tx); - - core_state.asset_unlock_statuses.insert( - index, - AssetUnlockStatusResult { - index, - status: AssetUnlockStatus::Unknown, - }, - ); - }); - } - - // Run block 4 - // Should change pooled status to broadcasted - let last_block_broadcasted_withdrawals_amount = last_block_withdrawals.len(); - let ( - ChainExecutionOutcome { - abci_app, - proposers, - validator_quorums: quorums, - current_validator_quorum_hash: current_quorum_hash, - current_proposer_versions, - end_time_ms, - withdrawals: last_block_withdrawals, - identity_nonce_counter, - identity_contract_nonce_counter, - instant_lock_quorums, - .. - }, - last_block_broadcased_withdrawals_amount, - ) = { - let outcome = continue_chain_for_strategy( - abci_app, - ChainExecutionParameters { - block_start: 4, - core_height_start: 1, - block_count: 1, - proposers, - validator_quorums: quorums, - current_validator_quorum_hash: current_quorum_hash, - current_proposer_versions: Some(current_proposer_versions), - current_identity_nonce_counter: identity_nonce_counter, - current_identity_contract_nonce_counter: identity_contract_nonce_counter, - current_votes: BTreeMap::default(), - start_time_ms: GENESIS_TIME_MS, - current_time_ms: end_time_ms + 1000, - instant_lock_quorums, - current_identities: Vec::new(), - }, - strategy.clone(), - config.clone(), - StrategyRandomness::SeedEntropy(3), - ); - - let withdrawal_documents_pooled = outcome - .abci_app - .platform - .drive - .fetch_oldest_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::POOLED.into(), - DEFAULT_QUERY_LIMIT, - None, - platform_version, - ) - .unwrap(); - - let withdrawal_documents_broadcasted = outcome - .abci_app - .platform - .drive - .fetch_oldest_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), - DEFAULT_QUERY_LIMIT, - None, - platform_version, - ) - .unwrap(); - - // In this block we should have new withdrawals pooled - assert!(!withdrawal_documents_pooled.is_empty()); - - // And extra withdrawals broadcasted - let withdrawals_broadcasted_expected = - last_block_broadcasted_withdrawals_amount + outcome.withdrawals.len(); - assert_eq!( - withdrawal_documents_broadcasted.len(), - withdrawals_broadcasted_expected - ); - - (outcome, withdrawal_documents_broadcasted.len()) - }; - - // Update core state for newly broadcasted transactions - { - let mut core_state = shared_core_state.lock().unwrap(); - - // First, set all previously broadcasted transactions to Chainlocked - core_state - .asset_unlock_statuses - .iter_mut() - .for_each(|(index, status_result)| { - // Do not settle yet transactions that were broadcasted in the last block - status_result.index = *index; - status_result.status = AssetUnlockStatus::Chainlocked; - }); - - // Then increase chainlocked height, so that withdrawals for chainlocked transactions - // could be completed in the next block - // TODO: do we need this var? - chain_locked_height += 1; - core_state.chain_lock.block_height = chain_locked_height; - - // Then set all newly broadcasted transactions to Unknown - last_block_withdrawals.iter().for_each(|tx| { - let index = asset_unlock_index(tx); - - core_state.asset_unlock_statuses.insert( - index, - AssetUnlockStatusResult { - index, - status: AssetUnlockStatus::Unknown, - }, - ); - }); - - drop(core_state); - } - - // Run block 5 - // Previously broadcasted transactions should be settled after block 5, - // and their corresponding statuses should be changed to COMPLETED - let ( - ChainExecutionOutcome { - abci_app, - proposers, - validator_quorums: quorums, - current_validator_quorum_hash: current_quorum_hash, - current_proposer_versions, - end_time_ms, - withdrawals: last_block_withdrawals, - identity_nonce_counter, - identity_contract_nonce_counter, - instant_lock_quorums, - .. - }, - last_block_withdrawals_completed_amount, - ) = { - let outcome = continue_chain_for_strategy( - abci_app, - ChainExecutionParameters { - block_start: 5, - core_height_start: 1, - block_count: 1, - proposers, - validator_quorums: quorums, - current_validator_quorum_hash: current_quorum_hash, - current_proposer_versions: Some(current_proposer_versions), - current_identity_nonce_counter: identity_nonce_counter, - current_identity_contract_nonce_counter: identity_contract_nonce_counter, - current_votes: BTreeMap::default(), - start_time_ms: GENESIS_TIME_MS, - current_time_ms: end_time_ms + 1000, - instant_lock_quorums, - current_identities: Vec::new(), - }, - strategy.clone(), - config.clone(), - StrategyRandomness::SeedEntropy(4), - ); - - let withdrawal_documents_pooled = outcome - .abci_app - .platform - .drive - .fetch_oldest_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::POOLED.into(), - DEFAULT_QUERY_LIMIT, - None, - platform_version, - ) - .unwrap(); - - let withdrawal_documents_broadcasted = outcome - .abci_app - .platform - .drive - .fetch_oldest_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), - DEFAULT_QUERY_LIMIT, - None, - platform_version, - ) - .unwrap(); - - let withdrawal_documents_completed = outcome - .abci_app - .platform - .drive - .fetch_oldest_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::COMPLETE.into(), - DEFAULT_QUERY_LIMIT, - None, - platform_version, - ) - .unwrap(); - - // In this block we should have new withdrawals pooled - assert!(!withdrawal_documents_pooled.is_empty()); - - // And some withdrawals completed - let withdrawals_completed_expected = - // Withdrawals issued on {previous_block - 1} considered completed - last_block_broadcased_withdrawals_amount - last_block_withdrawals.len(); - assert_eq!( - withdrawal_documents_completed.len(), - withdrawals_completed_expected - ); - - // And extra withdrawals broadcasted - let withdrawals_broadcasted_expected = - // Withdrawals issued on previous block + withdrawals from this block are still in broadcasted state - last_block_withdrawals.len() + outcome.withdrawals.len(); - - assert_eq!( - withdrawal_documents_broadcasted.len(), - withdrawals_broadcasted_expected - ); - - (outcome, withdrawal_documents_completed.len()) - }; - - // Update state of the core before proceeding to the next block - { - // Simulate transactions being added to the core mempool - let mut core_state = shared_core_state.lock().unwrap(); - - let number_of_blocks_before_expiration: u32 = 48; - chain_locked_height += number_of_blocks_before_expiration; - - core_state.chain_lock.block_height = chain_locked_height; - - last_block_withdrawals.iter().for_each(|tx| { - let index = asset_unlock_index(tx); - - core_state.asset_unlock_statuses.insert( - index, - AssetUnlockStatusResult { - index, - status: AssetUnlockStatus::Unknown, - }, - ); - }); - } - - // Run block 6. - // Tests withdrawal expiration - let ChainExecutionOutcome { .. } = { - let outcome = continue_chain_for_strategy( - abci_app, - ChainExecutionParameters { - block_start: 6, - core_height_start: 1, - block_count: 1, - proposers, - validator_quorums: quorums, - current_validator_quorum_hash: current_quorum_hash, - current_proposer_versions: Some(current_proposer_versions), - current_identity_nonce_counter: identity_nonce_counter, - current_identity_contract_nonce_counter: identity_contract_nonce_counter, - current_votes: BTreeMap::default(), - start_time_ms: GENESIS_TIME_MS, - current_time_ms: end_time_ms + 1000, - instant_lock_quorums, - current_identities: Vec::new(), - }, - strategy.clone(), - config.clone(), - StrategyRandomness::SeedEntropy(5), - ); - - let withdrawal_documents_pooled = outcome - .abci_app - .platform - .drive - .fetch_oldest_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::POOLED.into(), - DEFAULT_QUERY_LIMIT, - None, - platform_version, - ) - .unwrap(); - - let withdrawal_documents_broadcasted = outcome - .abci_app - .platform - .drive - .fetch_oldest_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), - DEFAULT_QUERY_LIMIT, - None, - platform_version, - ) - .unwrap(); - - let withdrawal_documents_completed = outcome - .abci_app - .platform - .drive - .fetch_oldest_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::COMPLETE.into(), - DEFAULT_QUERY_LIMIT, - None, - platform_version, - ) - .unwrap(); - - let withdrawal_documents_expired = outcome - .abci_app - .platform - .drive - .fetch_oldest_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::EXPIRED.into(), - DEFAULT_QUERY_LIMIT, - None, - platform_version, - ) - .unwrap(); - - // In this block we should have new withdrawals pooled - assert!(!withdrawal_documents_pooled.is_empty()); - - // Amount of completed withdrawals stays the same as in the last block - assert_eq!( - withdrawal_documents_completed.len(), - last_block_withdrawals_completed_amount - ); - - // And some withdrawals got expired - let withdrawals_expired_expected = - // Withdrawals issued on {previous_block - 1}, but not chainlocked yet, considered expired - last_block_broadcased_withdrawals_amount - last_block_withdrawals.len(); - - assert_eq!( - withdrawal_documents_expired.len(), - withdrawals_expired_expected - ); - - // And extra withdrawals broadcasted - let withdrawals_broadcasted_expected = - // Withdrawals issued on previous block + withdrawals from this block are still in broadcasted state - last_block_withdrawals.len() + outcome.withdrawals.len(); - - assert_eq!( - withdrawal_documents_broadcasted.len(), - withdrawals_broadcasted_expected - ); - - outcome - }; - } - #[test] fn run_chain_rotation_is_deterministic_1_block() { let strategy = NetworkStrategy { diff --git a/packages/rs-drive-abci/tests/strategy_tests/withdrawal_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/withdrawal_tests.rs new file mode 100644 index 0000000000..6113c15474 --- /dev/null +++ b/packages/rs-drive-abci/tests/strategy_tests/withdrawal_tests.rs @@ -0,0 +1,643 @@ +mod tests { + use crate::asset_unlock_index; + use crate::execution::{continue_chain_for_strategy, run_chain_for_strategy, GENESIS_TIME_MS}; + use crate::strategy::{ + ChainExecutionOutcome, ChainExecutionParameters, NetworkStrategy, StrategyRandomness, + }; + use assert_matches::assert_matches; + use dashcore_rpc::dashcore_rpc_json::{AssetUnlockStatus, AssetUnlockStatusResult}; + use dpp::dashcore::bls_sig_utils::BLSSignature; + use dpp::dashcore::hashes::Hash; + use dpp::dashcore::{BlockHash, ChainLock, Txid}; + use dpp::data_contracts::withdrawals_contract; + use dpp::identity::{KeyType, Purpose, SecurityLevel}; + use dpp::withdrawal::WithdrawalTransactionIndex; + use drive::config::DEFAULT_QUERY_LIMIT; + use drive_abci::config::{ + ChainLockConfig, ExecutionConfig, InstantLockConfig, PlatformConfig, PlatformTestConfig, + ValidatorSetConfig, + }; + use drive_abci::test::helpers::setup::TestPlatformBuilder; + use platform_version::version::mocks::v3_test::TEST_PLATFORM_V3; + use platform_version::version::PlatformVersion; + use std::collections::BTreeMap; + use std::sync::{Arc, Mutex}; + use strategy_tests::frequency::Frequency; + use strategy_tests::operations::{Operation, OperationType}; + use strategy_tests::{IdentityInsertInfo, StartIdentities, Strategy}; + + struct CoreState { + asset_unlock_statuses: BTreeMap, + chain_lock: ChainLock, + } + + #[test] + fn run_chain_top_up_and_withdraw_from_identities() { + // TEST_PLATFORM_V3 is like v4, but without the single quorum can sign withdrawals restriction + let platform_version = PlatformVersion::get(TEST_PLATFORM_V3.protocol_version) + .expect("expected to get platform version"); + let strategy = NetworkStrategy { + strategy: Strategy { + start_contracts: vec![], + operations: vec![ + Operation { + op_type: OperationType::IdentityTopUp, + frequency: Frequency { + times_per_block_range: 1..4, + chance_per_block: None, + }, + }, + Operation { + op_type: OperationType::IdentityWithdrawal, + frequency: Frequency { + times_per_block_range: 1..4, + chance_per_block: None, + }, + }, + ], + start_identities: StartIdentities::default(), + identity_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + start_keys: 3, + extra_keys: [( + Purpose::TRANSFER, + [(SecurityLevel::CRITICAL, vec![KeyType::ECDSA_SECP256K1])].into(), + )] + .into(), + }, + identity_contract_nonce_gaps: None, + signer: None, + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + // because we can add an identity and withdraw from it in the same block + // the result would be different from what would be expected + verify_state_transition_results: false, + ..Default::default() + }; + let config = PlatformConfig { + validator_set: ValidatorSetConfig::default_100_67(), + chain_lock: ChainLockConfig::default_100_67(), + instant_lock: InstantLockConfig::default_100_67(), + execution: ExecutionConfig { + verify_sum_trees: true, + + ..Default::default() + }, + block_spacing_ms: 3000, + initial_protocol_version: TEST_PLATFORM_V3.protocol_version, + testing_configs: PlatformTestConfig::default_minimal_verifications(), + ..Default::default() + }; + + let mut platform = TestPlatformBuilder::new() + .with_config(config.clone()) + .build_with_mock_rpc(); + + platform + .core_rpc + .expect_send_raw_transaction() + .returning(move |_| Ok(Txid::all_zeros())); + + let mut chain_locked_height = 1; + + // Have to go with a complicated shared object for the core state because we need to change + // rpc response along the way but we can't mutate `platform.core_rpc` later + // because platform reference is moved into the AbciApplication. + let shared_core_state = Arc::new(Mutex::new(CoreState { + asset_unlock_statuses: BTreeMap::new(), + chain_lock: ChainLock { + block_height: chain_locked_height, + block_hash: BlockHash::from_byte_array([1; 32]), + signature: BLSSignature::from([2; 96]), + }, + })); + + // Set up Core RPC responses + { + let core_state = shared_core_state.clone(); + + platform + .core_rpc + .expect_get_asset_unlock_statuses() + .returning(move |indices, _| { + Ok(indices + .iter() + .map(|index| { + core_state + .lock() + .unwrap() + .asset_unlock_statuses + .get(index) + .cloned() + .unwrap() + }) + .collect()) + }); + + let core_state = shared_core_state.clone(); + platform + .core_rpc + .expect_get_best_chain_lock() + .returning(move || Ok(core_state.lock().unwrap().chain_lock.clone())); + } + + // Run first two blocks: + // - Block 1: creates identity + // - Block 2: tops up identity and initiates withdrawals + let ( + ChainExecutionOutcome { + abci_app, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions, + end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, + instant_lock_quorums, + .. + }, + last_block_pooled_withdrawals_amount, + ) = { + let outcome = run_chain_for_strategy( + &mut platform, + 2, + strategy.clone(), + config.clone(), + 1, + &mut None, + ); + + for tx_results_per_block in outcome.state_transition_results_per_block.values() { + for (state_transition, result) in tx_results_per_block { + assert_eq!( + result.code, 0, + "state transition got code {} : {:?}", + result.code, state_transition + ); + } + } + + // Withdrawal transactions are not populated to block execution context yet + assert_eq!(outcome.withdrawals.len(), 0); + + // Withdrawal documents with pooled status should exist. + let withdrawal_documents_pooled = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + assert!(!withdrawal_documents_pooled.is_empty()); + let pooled_withdrawals = withdrawal_documents_pooled.len(); + + (outcome, pooled_withdrawals) + }; + + // Run block 3 + // Should broadcast previously pooled withdrawals to core + let ChainExecutionOutcome { + abci_app, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions, + end_time_ms, + withdrawals: last_block_withdrawals, + identity_nonce_counter, + identity_contract_nonce_counter, + instant_lock_quorums, + .. + } = { + let outcome = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start: 3, + core_height_start: 1, + block_count: 1, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, + current_votes: BTreeMap::default(), + start_time_ms: GENESIS_TIME_MS, + current_time_ms: end_time_ms, + instant_lock_quorums, + current_identities: Vec::new(), + }, + strategy.clone(), + config.clone(), + StrategyRandomness::SeedEntropy(2), + ); + + // Withdrawal documents with pooled status should exist. + let withdrawal_documents_broadcasted = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // In this block all previously pooled withdrawals should be broadcasted + assert_eq!( + outcome.withdrawals.len(), + last_block_pooled_withdrawals_amount + ); + assert_eq!( + withdrawal_documents_broadcasted.len(), + last_block_pooled_withdrawals_amount + ); + + outcome + }; + + // Update core state before running next block. + // Asset unlocks broadcasted in the last block should have Unknown status + { + let mut core_state = shared_core_state.lock().unwrap(); + last_block_withdrawals.iter().for_each(|tx| { + let index = asset_unlock_index(tx); + + core_state.asset_unlock_statuses.insert( + index, + AssetUnlockStatusResult { + index, + status: AssetUnlockStatus::Unknown, + }, + ); + }); + } + + // Run block 4 + // Should change pooled status to broadcasted + let last_block_broadcasted_withdrawals_amount = last_block_withdrawals.len(); + let ( + ChainExecutionOutcome { + abci_app, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions, + end_time_ms, + withdrawals: last_block_withdrawals, + identity_nonce_counter, + identity_contract_nonce_counter, + instant_lock_quorums, + .. + }, + last_block_broadcased_withdrawals_amount, + ) = { + let outcome = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start: 4, + core_height_start: 1, + block_count: 1, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, + current_votes: BTreeMap::default(), + start_time_ms: GENESIS_TIME_MS, + current_time_ms: end_time_ms + 1000, + instant_lock_quorums, + current_identities: Vec::new(), + }, + strategy.clone(), + config.clone(), + StrategyRandomness::SeedEntropy(3), + ); + + let withdrawal_documents_pooled = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + let withdrawal_documents_broadcasted = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // In this block we should have new withdrawals pooled + assert!(!withdrawal_documents_pooled.is_empty()); + + // And extra withdrawals broadcasted + let withdrawals_broadcasted_expected = + last_block_broadcasted_withdrawals_amount + outcome.withdrawals.len(); + assert_eq!( + withdrawal_documents_broadcasted.len(), + withdrawals_broadcasted_expected + ); + + (outcome, withdrawal_documents_broadcasted.len()) + }; + + // Update core state for newly broadcasted transactions + { + let mut core_state = shared_core_state.lock().unwrap(); + + // First, set all previously broadcasted transactions to Chainlocked + core_state + .asset_unlock_statuses + .iter_mut() + .for_each(|(index, status_result)| { + // Do not settle yet transactions that were broadcasted in the last block + status_result.index = *index; + status_result.status = AssetUnlockStatus::Chainlocked; + }); + + // Then increase chainlocked height, so that withdrawals for chainlocked transactions + // could be completed in the next block + // TODO: do we need this var? + chain_locked_height += 1; + core_state.chain_lock.block_height = chain_locked_height; + + // Then set all newly broadcasted transactions to Unknown + last_block_withdrawals.iter().for_each(|tx| { + let index = asset_unlock_index(tx); + + core_state.asset_unlock_statuses.insert( + index, + AssetUnlockStatusResult { + index, + status: AssetUnlockStatus::Unknown, + }, + ); + }); + + drop(core_state); + } + + // Run block 5 + // Previously broadcasted transactions should be settled after block 5, + // and their corresponding statuses should be changed to COMPLETED + let ( + ChainExecutionOutcome { + abci_app, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions, + end_time_ms, + withdrawals: last_block_withdrawals, + identity_nonce_counter, + identity_contract_nonce_counter, + instant_lock_quorums, + .. + }, + last_block_withdrawals_completed_amount, + ) = { + let outcome = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start: 5, + core_height_start: 1, + block_count: 1, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, + current_votes: BTreeMap::default(), + start_time_ms: GENESIS_TIME_MS, + current_time_ms: end_time_ms + 1000, + instant_lock_quorums, + current_identities: Vec::new(), + }, + strategy.clone(), + config.clone(), + StrategyRandomness::SeedEntropy(4), + ); + + let withdrawal_documents_pooled = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + let withdrawal_documents_broadcasted = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + let withdrawal_documents_completed = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::COMPLETE.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // In this block we should have new withdrawals pooled + assert!(!withdrawal_documents_pooled.is_empty()); + + // And some withdrawals completed + let withdrawals_completed_expected = + // Withdrawals issued on {previous_block - 1} considered completed + last_block_broadcased_withdrawals_amount - last_block_withdrawals.len(); + assert_eq!( + withdrawal_documents_completed.len(), + withdrawals_completed_expected + ); + + // And extra withdrawals broadcasted + let withdrawals_broadcasted_expected = + // Withdrawals issued on previous block + withdrawals from this block are still in broadcasted state + last_block_withdrawals.len() + outcome.withdrawals.len(); + + assert_eq!( + withdrawal_documents_broadcasted.len(), + withdrawals_broadcasted_expected + ); + + (outcome, withdrawal_documents_completed.len()) + }; + + // Update state of the core before proceeding to the next block + { + // Simulate transactions being added to the core mempool + let mut core_state = shared_core_state.lock().unwrap(); + + let number_of_blocks_before_expiration: u32 = 48; + chain_locked_height += number_of_blocks_before_expiration; + + core_state.chain_lock.block_height = chain_locked_height; + + last_block_withdrawals.iter().for_each(|tx| { + let index = asset_unlock_index(tx); + + core_state.asset_unlock_statuses.insert( + index, + AssetUnlockStatusResult { + index, + status: AssetUnlockStatus::Unknown, + }, + ); + }); + } + + // Run block 6. + // Tests withdrawal expiration + let ChainExecutionOutcome { .. } = { + let outcome = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start: 6, + core_height_start: 1, + block_count: 1, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, + current_votes: BTreeMap::default(), + start_time_ms: GENESIS_TIME_MS, + current_time_ms: end_time_ms + 1000, + instant_lock_quorums, + current_identities: Vec::new(), + }, + strategy.clone(), + config.clone(), + StrategyRandomness::SeedEntropy(5), + ); + + let withdrawal_documents_pooled = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + let withdrawal_documents_broadcasted = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + let withdrawal_documents_completed = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::COMPLETE.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + let withdrawal_documents_expired = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::EXPIRED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // In this block we should have new withdrawals pooled + assert!(!withdrawal_documents_pooled.is_empty()); + + // Amount of completed withdrawals stays the same as in the last block + assert_eq!( + withdrawal_documents_completed.len(), + last_block_withdrawals_completed_amount + ); + + // And some withdrawals got expired + let withdrawals_expired_expected = + // Withdrawals issued on {previous_block - 1}, but not chainlocked yet, considered expired + last_block_broadcased_withdrawals_amount - last_block_withdrawals.len(); + + assert_eq!( + withdrawal_documents_expired.len(), + withdrawals_expired_expected + ); + + // And extra withdrawals broadcasted + let withdrawals_broadcasted_expected = + // Withdrawals issued on previous block + withdrawals from this block are still in broadcasted state + last_block_withdrawals.len() + outcome.withdrawals.len(); + + assert_eq!( + withdrawal_documents_broadcasted.len(), + withdrawals_broadcasted_expected + ); + + outcome + }; + } +} diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 13dee4bfd7..5c3a1fa7c8 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.3.0" +version = "1.4.0-dev.1" edition = "2021" rust-version.workspace = true diff --git a/packages/rs-drive-proof-verifier/src/proof.rs b/packages/rs-drive-proof-verifier/src/proof.rs index f3a256e301..57dec66d31 100644 --- a/packages/rs-drive-proof-verifier/src/proof.rs +++ b/packages/rs-drive-proof-verifier/src/proof.rs @@ -368,33 +368,13 @@ impl FromProof for IdentityPublicKeys { } }; - let key_request = match parse_key_request_type(&request_type)? { - KeyRequestType::SpecificKeys(specific_keys) => { - IdentityKeysRequest::new_specific_keys_query(&identity_id, specific_keys) - } - KeyRequestType::AllKeys => IdentityKeysRequest::new_all_keys_query(&identity_id, None), - KeyRequestType::SearchKey(criteria) => IdentityKeysRequest { - identity_id, - request_type: KeyRequestType::SearchKey(criteria), - limit, - offset, - }, - KeyRequestType::ContractBoundKey(id, purpose, kind) => IdentityKeysRequest { - identity_id, - request_type: KeyRequestType::ContractBoundKey(id, purpose, kind), - limit, - offset, - }, - KeyRequestType::ContractDocumentTypeBoundKey(id, s, purpose, kind) => { - IdentityKeysRequest { - identity_id, - request_type: KeyRequestType::ContractDocumentTypeBoundKey( - id, s, purpose, kind, - ), - limit, - offset, - } - } + let request_type = parse_key_request_type(&request_type)?; + + let key_request = IdentityKeysRequest { + identity_id, + request_type, + limit, + offset, }; tracing::debug!(?identity_id, "checking proof of identity keys"); diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index bc9eb09c3f..15c207cc23 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.3.0" +version = "1.4.0-dev.1" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive/src/drive/identity/key/fetch/fetch_identity_keys/v0/mod.rs b/packages/rs-drive/src/drive/identity/key/fetch/fetch_identity_keys/v0/mod.rs index d9a4edf0fa..877634eec0 100644 --- a/packages/rs-drive/src/drive/identity/key/fetch/fetch_identity_keys/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/fetch/fetch_identity_keys/v0/mod.rs @@ -1,5 +1,6 @@ use crate::drive::identity::key::fetch::KeyRequestType::{ - AllKeys, ContractBoundKey, ContractDocumentTypeBoundKey, SearchKey, SpecificKeys, + AllKeys, ContractBoundKey, ContractDocumentTypeBoundKey, RecentWithdrawalKeys, SearchKey, + SpecificKeys, }; use crate::drive::identity::key::fetch::{ IdentityKeysRequest, IdentityPublicKeyResult, KeyKindRequestType, @@ -79,10 +80,11 @@ impl Drive { T::try_from_path_key_optional(result, platform_version) } ContractBoundKey(_, _, KeyKindRequestType::AllKeysOfKindRequest) - | ContractDocumentTypeBoundKey(_, _, _, KeyKindRequestType::AllKeysOfKindRequest) => { + | ContractDocumentTypeBoundKey(_, _, _, KeyKindRequestType::AllKeysOfKindRequest) + | RecentWithdrawalKeys => { let path_query = key_request.into_path_query(); - let (result, _) = self.grove_get_raw_path_query( + let (result, _) = self.grove_get_path_query( &path_query, transaction, QueryPathKeyElementTrioResultType, diff --git a/packages/rs-drive/src/drive/identity/key/fetch/mod.rs b/packages/rs-drive/src/drive/identity/key/fetch/mod.rs index 4567278c78..248e7cd904 100644 --- a/packages/rs-drive/src/drive/identity/key/fetch/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/fetch/mod.rs @@ -22,6 +22,7 @@ use { }; // Conditional imports for the feature "server" +use crate::drive::identity::identity_transfer_keys_path_vec; #[cfg(feature = "server")] use { crate::error::{drive::DriveError, fee::FeeError, identity::IdentityError, Error}, @@ -74,6 +75,8 @@ pub enum KeyRequestType { SpecificKeys(Vec), /// Search for keys on an identity SearchKey(BTreeMap>), + /// Recent withdrawal keys + RecentWithdrawalKeys, /// Search for contract bound keys ContractBoundKey([u8; 32], Purpose, KeyKindRequestType), /// Search for contract bound keys @@ -655,7 +658,9 @@ impl IdentityKeysRequest { .fee_version .processing .fetch_single_identity_key_processing_cost), - SearchKey(_search) => todo!(), + SearchKey(_) => Err(Error::Fee(FeeError::OperationNotAllowed( + "You can not get costs for requesting search key", + ))), ContractBoundKey(_, _, key_kind) | ContractDocumentTypeBoundKey(_, _, _, key_kind) => { match key_kind { CurrentKeyOfKindRequest => { @@ -670,6 +675,11 @@ impl IdentityKeysRequest { ))), } } + KeyRequestType::RecentWithdrawalKeys => Ok(self.limit.unwrap_or(10) as Credits + * platform_version + .fee_version + .processing + .fetch_single_identity_key_processing_cost), } } @@ -927,6 +937,19 @@ impl IdentityKeysRequest { }, } } + KeyRequestType::RecentWithdrawalKeys => { + let query_keys_path = identity_transfer_keys_path_vec(&identity_id); + let mut query = Query::new_with_direction(false); + query.insert_all(); + PathQuery { + path: query_keys_path, + query: SizedQuery { + query, + limit, + offset, + }, + } + } } } diff --git a/packages/rs-drive/src/drive/identity/mod.rs b/packages/rs-drive/src/drive/identity/mod.rs index 65928b5ecb..1922e74b88 100644 --- a/packages/rs-drive/src/drive/identity/mod.rs +++ b/packages/rs-drive/src/drive/identity/mod.rs @@ -259,7 +259,6 @@ pub(crate) fn identity_query_keys_purpose_tree_path_vec( /// identity query keys security level tree path vec #[cfg(feature = "server")] -/// Identity query keys security level tree path vec pub(crate) fn identity_query_keys_security_level_tree_path_vec( identity_id: &[u8], security_level: SecurityLevel, @@ -288,7 +287,6 @@ pub(crate) fn identity_query_keys_for_direct_searchable_reference_full_tree_path ] } -/// identity query keys full tree path #[cfg(feature = "server")] /// Identity query keys full tree path pub(crate) fn identity_query_keys_for_authentication_full_tree_path<'a>( @@ -304,6 +302,28 @@ pub(crate) fn identity_query_keys_for_authentication_full_tree_path<'a>( ] } +/// Identity query keys for transfer full tree path +#[cfg(feature = "server")] +pub fn identity_transfer_keys_tree_path(identity_id: &[u8]) -> [&[u8]; 5] { + [ + Into::<&[u8; 1]>::into(RootTree::Identities), + identity_id, + Into::<&[u8; 1]>::into(IdentityRootStructure::IdentityTreeKeyReferences), + Into::<&[u8; 1]>::into(Purpose::TRANSFER), + Into::<&[u8; 1]>::into(SecurityLevel::CRITICAL), + ] +} + +/// Identity query keys for transfer full tree path as vec +pub fn identity_transfer_keys_path_vec(identity_id: &[u8]) -> Vec> { + vec![ + vec![RootTree::Identities as u8], + identity_id.to_vec(), + vec![IdentityRootStructure::IdentityTreeKeyReferences as u8], + vec![Purpose::TRANSFER as u8], + ] +} + /// The root structure of identities #[cfg(any(feature = "server", feature = "verify"))] #[repr(u8)] diff --git a/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/mod.rs index a3545ad539..d4214a53e7 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/mod.rs @@ -1,11 +1,11 @@ mod v0; -use crate::drive::identity::withdrawals::WithdrawalTransactionIndex; use crate::drive::Drive; use crate::error::drive::DriveError; use crate::error::Error; use dpp::data_contracts::withdrawals_contract; use dpp::document::Document; +use dpp::withdrawal::WithdrawalTransactionIndex; use grovedb::TransactionArg; use platform_version::version::PlatformVersion; diff --git a/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs index 0d0dda43ed..b04bc85b5b 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs @@ -1,5 +1,4 @@ use crate::drive::document::query::QueryDocumentsOutcomeV0Methods; -use crate::drive::identity::withdrawals::WithdrawalTransactionIndex; use crate::drive::Drive; use crate::error::Error; use crate::query::{DriveDocumentQuery, InternalClauses, OrderClause, WhereClause}; @@ -8,6 +7,7 @@ use dpp::data_contracts::withdrawals_contract; use dpp::data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::document::Document; use dpp::platform_value::Value; +use dpp::withdrawal::WithdrawalTransactionIndex; use grovedb::TransactionArg; use indexmap::IndexMap; use platform_version::version::PlatformVersion; @@ -97,7 +97,6 @@ impl Drive { #[cfg(test)] mod tests { use crate::config::DEFAULT_QUERY_LIMIT; - use crate::drive::identity::withdrawals::WithdrawalTransactionIndex; use crate::util::test_helpers::setup::{ setup_document, setup_drive_with_initial_state_structure, setup_system_data_contract, }; @@ -110,6 +109,7 @@ mod tests { use dpp::tests::fixtures::get_withdrawal_document_fixture; use dpp::version::PlatformVersion; use dpp::withdrawal::Pooling; + use dpp::withdrawal::WithdrawalTransactionIndex; use super::*; diff --git a/packages/rs-drive/src/drive/identity/withdrawals/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/mod.rs index 57f26a5b5e..1571e0e230 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/mod.rs @@ -5,8 +5,3 @@ pub mod document; pub mod paths; /// Functions related to withdrawal transactions pub mod transaction; - -/// Simple type alias for withdrawal transaction with it's index -pub type WithdrawalTransactionIndexAndBytes = (WithdrawalTransactionIndex, Vec); -/// Transaction index type -pub type WithdrawalTransactionIndex = u64; diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/add_update_next_withdrawal_transaction_index_operation/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/add_update_next_withdrawal_transaction_index_operation/mod.rs index 5554f8a4f6..59c820433d 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/add_update_next_withdrawal_transaction_index_operation/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/add_update_next_withdrawal_transaction_index_operation/mod.rs @@ -1,10 +1,10 @@ mod v0; -use crate::drive::identity::withdrawals::WithdrawalTransactionIndex; use crate::drive::Drive; use crate::error::drive::DriveError; use crate::error::Error; use crate::util::batch::DriveOperation; +use dpp::withdrawal::WithdrawalTransactionIndex; use platform_version::version::PlatformVersion; impl Drive { diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/add_update_next_withdrawal_transaction_index_operation/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/add_update_next_withdrawal_transaction_index_operation/v0/mod.rs index 4c162fd5ea..fb4b7f39c0 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/add_update_next_withdrawal_transaction_index_operation/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/add_update_next_withdrawal_transaction_index_operation/v0/mod.rs @@ -1,7 +1,7 @@ -use crate::drive::identity::withdrawals::WithdrawalTransactionIndex; use crate::drive::Drive; use crate::util::batch::drive_op_batch::WithdrawalOperationType; use crate::util::batch::DriveOperation; +use dpp::withdrawal::WithdrawalTransactionIndex; impl Drive { pub(super) fn add_update_next_withdrawal_transaction_index_operation_v0( diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/fetch_next_withdrawal_transaction_index/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/fetch_next_withdrawal_transaction_index/mod.rs index c3ae1dae3c..bc8268b257 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/fetch_next_withdrawal_transaction_index/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/fetch_next_withdrawal_transaction_index/mod.rs @@ -1,7 +1,7 @@ -use crate::drive::identity::withdrawals::WithdrawalTransactionIndex; use crate::drive::Drive; use crate::error::drive::DriveError; use crate::error::Error; +use dpp::withdrawal::WithdrawalTransactionIndex; use grovedb::TransactionArg; use platform_version::version::PlatformVersion; diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/fetch_next_withdrawal_transaction_index/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/fetch_next_withdrawal_transaction_index/v0/mod.rs index bdc01546dd..e0ca52ed8b 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/fetch_next_withdrawal_transaction_index/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/fetch_next_withdrawal_transaction_index/v0/mod.rs @@ -1,8 +1,8 @@ use crate::drive::identity::withdrawals::paths::WITHDRAWAL_TRANSACTIONS_NEXT_INDEX_KEY; -use crate::drive::identity::withdrawals::WithdrawalTransactionIndex; use crate::drive::{Drive, RootTree}; use crate::error::drive::DriveError; use crate::error::Error; +use dpp::withdrawal::WithdrawalTransactionIndex; use grovedb::{Element, TransactionArg}; use platform_version::version::PlatformVersion; diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/mod.rs index d0e8168790..1b6a52728c 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/mod.rs @@ -1,8 +1,8 @@ -use crate::drive::identity::withdrawals::WithdrawalTransactionIndexAndBytes; use crate::drive::Drive; use crate::error::drive::DriveError; use crate::error::Error; use crate::util::batch::DriveOperation; +use dpp::withdrawal::WithdrawalTransactionIndexAndBytes; use platform_version::version::PlatformVersion; mod v0; diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/v0/mod.rs index b14f505218..a9d8a604e2 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/v0/mod.rs @@ -1,7 +1,7 @@ -use crate::drive::identity::withdrawals::WithdrawalTransactionIndexAndBytes; use crate::drive::Drive; use crate::util::batch::drive_op_batch::WithdrawalOperationType; use crate::util::batch::DriveOperation; +use dpp::withdrawal::WithdrawalTransactionIndexAndBytes; impl Drive { pub(super) fn add_enqueue_untied_withdrawal_transaction_operations_v0( diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/mod.rs index 3fadfcc5c8..3423114aaf 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/mod.rs @@ -1,10 +1,10 @@ mod v0; -use crate::drive::identity::withdrawals::WithdrawalTransactionIndexAndBytes; use crate::drive::Drive; use crate::error::drive::DriveError; use crate::error::Error; use crate::util::batch::DriveOperation; +use dpp::withdrawal::WithdrawalTransactionIndexAndBytes; use grovedb::TransactionArg; use platform_version::version::PlatformVersion; diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/v0/mod.rs index a89b788b10..6edeaa9822 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/v0/mod.rs @@ -1,13 +1,11 @@ use crate::drive::identity::withdrawals::paths::get_withdrawal_transactions_queue_path_vec; -use crate::drive::identity::withdrawals::{ - WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes, -}; use crate::drive::Drive; use crate::error::drive::DriveError; use crate::error::Error; use crate::query::{Query, QueryItem}; use crate::util::batch::drive_op_batch::WithdrawalOperationType; use crate::util::batch::DriveOperation; +use dpp::withdrawal::{WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes}; use grovedb::query_result_type::QueryResultType; use grovedb::{Element, PathQuery, SizedQuery, TransactionArg}; use platform_version::version::PlatformVersion; @@ -22,7 +20,7 @@ impl Drive { drive_operation_types: &mut Vec, platform_version: &PlatformVersion, ) -> Result, Error> { - let mut query = Query::new(); + let mut query = Query::new_with_direction(true); query.insert_item(QueryItem::RangeFull(RangeFull)); @@ -39,7 +37,7 @@ impl Drive { .grove .query_raw( &path_query, - transaction.is_some(), + true, true, true, QueryResultType::QueryKeyElementPairResultType, diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/mod.rs index 85621a35e4..e519f56bd5 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/mod.rs @@ -5,15 +5,13 @@ pub mod dequeue_untied_withdrawal_transactions; #[cfg(test)] mod tests { - use crate::drive::identity::withdrawals::{ - WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes, - }; use crate::util::batch::DriveOperation; use dpp::block::block_info::BlockInfo; use dpp::block::epoch::Epoch; use crate::util::test_helpers::setup::setup_drive_with_initial_state_structure; use dpp::version::PlatformVersion; + use dpp::withdrawal::{WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes}; #[test] fn test_enqueue_and_dequeue() { diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/transformer.rs index 6ea2449408..5f619841bb 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/transformer.rs @@ -1,20 +1,43 @@ +use crate::drive::Drive; +use crate::error::Error; use crate::state_transition_action::identity::identity_credit_withdrawal::v0::IdentityCreditWithdrawalTransitionActionV0; use crate::state_transition_action::identity::identity_credit_withdrawal::IdentityCreditWithdrawalTransitionAction; +use dpp::block::block_info::BlockInfo; use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; +use dpp::validation::ConsensusValidationResult; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; impl IdentityCreditWithdrawalTransitionAction { - /// from - pub fn from_identity_credit_withdrawal( + /// try from an identity credit withdrawal + pub fn try_from_identity_credit_withdrawal( + drive: &Drive, + tx: TransactionArg, identity_credit_withdrawal: &IdentityCreditWithdrawalTransition, - creation_time_ms: u64, - ) -> Self { + block_info: &BlockInfo, + platform_version: &PlatformVersion, + ) -> Result, Error> { match identity_credit_withdrawal { IdentityCreditWithdrawalTransition::V0(v0) => { - IdentityCreditWithdrawalTransitionActionV0::from_identity_credit_withdrawal( - v0, - creation_time_ms, + Ok(ConsensusValidationResult::new_with_data( + IdentityCreditWithdrawalTransitionActionV0::from_identity_credit_withdrawal_v0( + v0, + block_info.time_ms, + ) + .into(), + )) + } + IdentityCreditWithdrawalTransition::V1(v1) => { + IdentityCreditWithdrawalTransitionActionV0::try_from_identity_credit_withdrawal_v1( + drive, + tx, + v1, + block_info, + platform_version, ) - .into() + .map(|consensus_validation_result| { + consensus_validation_result.map(|withdrawal| withdrawal.into()) + }) } } } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs index 742476740c..8da24e5759 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs @@ -1,14 +1,33 @@ +use crate::drive::identity::key::fetch::{ + IdentityKeysRequest, KeyIDIdentityPublicKeyPairBTreeMap, KeyRequestType, +}; +use crate::drive::Drive; +use crate::error::Error; use crate::state_transition_action::identity::identity_credit_withdrawal::v0::IdentityCreditWithdrawalTransitionActionV0; +use dpp::block::block_info::BlockInfo; +use dpp::consensus::state::identity::identity_public_key_is_disabled_error::IdentityPublicKeyIsDisabledError; +use dpp::consensus::state::identity::missing_transfer_key_error::MissingTransferKeyError; +use dpp::consensus::state::identity::no_transfer_key_for_core_withdrawal_available_error::NoTransferKeyForCoreWithdrawalAvailableError; +use dpp::consensus::state::state_error::StateError; +use dpp::consensus::ConsensusError; use dpp::data_contracts::withdrawals_contract; use dpp::data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::document::{Document, DocumentV0}; +use dpp::identity::core_script::CoreScript; +use dpp::identity::hash::IdentityPublicKeyHashMethodsV0; +use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; +use dpp::identity::IdentityPublicKey; use dpp::platform_value::platform_value; +use dpp::state_transition::identity_credit_withdrawal_transition::v1::IdentityCreditWithdrawalTransitionV1; use dpp::state_transition::state_transitions::identity::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; +use dpp::validation::ConsensusValidationResult; use dpp::withdrawal::Pooling; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; impl IdentityCreditWithdrawalTransitionActionV0 { /// from identity credit withdrawal - pub fn from_identity_credit_withdrawal( + pub fn from_identity_credit_withdrawal_v0( identity_credit_withdrawal: &IdentityCreditWithdrawalTransitionV0, creation_time_ms: u64, ) -> Self { @@ -57,4 +76,121 @@ impl IdentityCreditWithdrawalTransitionActionV0 { user_fee_increase: identity_credit_withdrawal.user_fee_increase, } } + + /// from identity credit withdrawal v1 + pub fn try_from_identity_credit_withdrawal_v1( + drive: &Drive, + tx: TransactionArg, + identity_credit_withdrawal: &IdentityCreditWithdrawalTransitionV1, + block_info: &BlockInfo, + platform_version: &PlatformVersion, + ) -> Result, Error> { + let output_script_bytes = if let Some(output_script) = + &identity_credit_withdrawal.output_script + { + output_script.to_bytes() + } else { + let key_request = IdentityKeysRequest { + identity_id: identity_credit_withdrawal.identity_id.to_buffer(), + request_type: KeyRequestType::RecentWithdrawalKeys, + limit: None, + offset: None, + }; + let key: Option = + drive.fetch_identity_keys(key_request, tx, platform_version)?; + let Some(mut key) = key else { + return Ok(ConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::MissingTransferKeyError( + MissingTransferKeyError::new(identity_credit_withdrawal.identity_id), + )), + )); + }; + if key.is_disabled() { + // The first key is disabled, let's look at some more withdrawal keys to find one that isn't disabled + let after_first_key_request = IdentityKeysRequest { + identity_id: identity_credit_withdrawal.identity_id.to_buffer(), + request_type: KeyRequestType::RecentWithdrawalKeys, + limit: Some(5), + offset: Some(1), + }; + let other_keys: KeyIDIdentityPublicKeyPairBTreeMap = + drive.fetch_identity_keys(after_first_key_request, tx, platform_version)?; + + if let Some(found_non_disabled_key) = other_keys + .values() + .rev() + .find(|identity_public_key| !identity_public_key.is_disabled()) + .cloned() + { + key = found_non_disabled_key + } else { + return Ok(ConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::IdentityPublicKeyIsDisabledError( + IdentityPublicKeyIsDisabledError::new(key.id()), + )), + )); + } + } + if !key.key_type().is_core_address_key_type() { + return Ok(ConsensusValidationResult::new_with_error( + ConsensusError::StateError( + StateError::NoTransferKeyForCoreWithdrawalAvailableError( + NoTransferKeyForCoreWithdrawalAvailableError::new( + identity_credit_withdrawal.identity_id, + ), + ), + ), + )); + } + // We should get the withdrawal address + CoreScript::new_p2pkh(key.public_key_hash()?).to_bytes() + }; + + let mut entropy = Vec::new(); + entropy.extend_from_slice(&identity_credit_withdrawal.nonce.to_be_bytes()); + entropy.extend_from_slice(output_script_bytes.as_slice()); + + let document_id = Document::generate_document_id_v0( + &withdrawals_contract::ID, + &identity_credit_withdrawal.identity_id, + withdrawal::NAME, + &entropy, + ); + + let document_data = platform_value!({ + withdrawal::properties::AMOUNT: identity_credit_withdrawal.amount, + withdrawal::properties::CORE_FEE_PER_BYTE: identity_credit_withdrawal.core_fee_per_byte, + // TODO(withdrawals): replace with actual value from state transition once pooling is done + withdrawal::properties::POOLING: Pooling::Never, + withdrawal::properties::OUTPUT_SCRIPT: output_script_bytes, + withdrawal::properties::STATUS: withdrawals_contract::WithdrawalStatus::QUEUED, + }); + + let withdrawal_document = DocumentV0 { + id: document_id, + owner_id: identity_credit_withdrawal.identity_id, + properties: document_data.into_btree_string_map().unwrap(), + revision: Some(1), + created_at: Some(block_info.time_ms), + updated_at: Some(block_info.time_ms), + transferred_at: None, + created_at_block_height: None, + updated_at_block_height: None, + transferred_at_block_height: None, + created_at_core_block_height: None, + updated_at_core_block_height: None, + transferred_at_core_block_height: None, + } + .into(); + + Ok(ConsensusValidationResult::new_with_data( + IdentityCreditWithdrawalTransitionActionV0 { + identity_id: identity_credit_withdrawal.identity_id, + nonce: identity_credit_withdrawal.nonce, + prepared_withdrawal_document: withdrawal_document, + amount: identity_credit_withdrawal.amount, + user_fee_increase: identity_credit_withdrawal.user_fee_increase, + }, + )) + } } diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/transformer.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/transformer.rs index 674fb61d3b..ae5afef5ff 100644 --- a/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/transformer.rs @@ -137,22 +137,14 @@ impl BumpIdentityNonceAction { pub fn from_identity_credit_withdrawal_transition( value: IdentityCreditWithdrawalTransition, ) -> Self { - match value { - IdentityCreditWithdrawalTransition::V0(v0) => { - BumpIdentityNonceActionV0::from_identity_credit_withdrawal(v0).into() - } - } + BumpIdentityNonceActionV0::from_identity_credit_withdrawal(value).into() } /// from borrowed identity withdrawal pub fn from_borrowed_identity_credit_withdrawal_transition( value: &IdentityCreditWithdrawalTransition, ) -> Self { - match value { - IdentityCreditWithdrawalTransition::V0(v0) => { - BumpIdentityNonceActionV0::from_borrowed_identity_credit_withdrawal(v0).into() - } - } + BumpIdentityNonceActionV0::from_borrowed_identity_credit_withdrawal(value).into() } /// from identity withdrawal action diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/transformer.rs index 99cb834032..8c5520f7d7 100644 --- a/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/transformer.rs @@ -6,8 +6,10 @@ use crate::state_transition_action::system::bump_identity_nonce_action::BumpIden use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::state_transition::data_contract_create_transition::DataContractCreateTransitionV0; use dpp::state_transition::identity_credit_transfer_transition::v0::IdentityCreditTransferTransitionV0; -use dpp::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; +use dpp::state_transition::identity_credit_withdrawal_transition::accessors::IdentityCreditWithdrawalTransitionAccessorsV0; +use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use dpp::state_transition::identity_update_transition::v0::IdentityUpdateTransitionV0; +use dpp::state_transition::StateTransitionLike; impl BumpIdentityNonceActionV0 { /// from identity update @@ -199,34 +201,22 @@ impl BumpIdentityNonceActionV0 { } /// from identity credit withdrawal - pub fn from_identity_credit_withdrawal(value: IdentityCreditWithdrawalTransitionV0) -> Self { - let IdentityCreditWithdrawalTransitionV0 { - identity_id, - nonce, - user_fee_increase, - .. - } = value; + pub fn from_identity_credit_withdrawal(value: IdentityCreditWithdrawalTransition) -> Self { BumpIdentityNonceActionV0 { - identity_id, - identity_nonce: nonce, - user_fee_increase, + identity_id: value.identity_id(), + identity_nonce: value.nonce(), + user_fee_increase: value.user_fee_increase(), } } /// from borrowed identity credit withdrawal pub fn from_borrowed_identity_credit_withdrawal( - value: &IdentityCreditWithdrawalTransitionV0, + value: &IdentityCreditWithdrawalTransition, ) -> Self { - let IdentityCreditWithdrawalTransitionV0 { - identity_id, - nonce, - user_fee_increase, - .. - } = value; BumpIdentityNonceActionV0 { - identity_id: *identity_id, - identity_nonce: *nonce, - user_fee_increase: *user_fee_increase, + identity_id: value.identity_id(), + identity_nonce: value.nonce(), + user_fee_increase: value.user_fee_increase(), } } diff --git a/packages/rs-drive/src/util/batch/drive_op_batch/withdrawals.rs b/packages/rs-drive/src/util/batch/drive_op_batch/withdrawals.rs index 972f6be00e..7ad820d601 100644 --- a/packages/rs-drive/src/util/batch/drive_op_batch/withdrawals.rs +++ b/packages/rs-drive/src/util/batch/drive_op_batch/withdrawals.rs @@ -4,20 +4,17 @@ use crate::drive::identity::withdrawals::paths::{ get_withdrawal_root_path_vec, get_withdrawal_transactions_queue_path, get_withdrawal_transactions_queue_path_vec, WITHDRAWAL_TRANSACTIONS_NEXT_INDEX_KEY, }; -use crate::drive::identity::withdrawals::{ - WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes, -}; use crate::util::grove_operations::BatchDeleteApplyType; use crate::util::object_size_info::PathKeyElementInfo; use crate::{drive::Drive, error::Error, fees::op::LowLevelDriveOperation}; use dpp::block::block_info::BlockInfo; +use super::DriveLowLevelOperationConverter; use dpp::version::PlatformVersion; +use dpp::withdrawal::{WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes}; use grovedb::Element; use grovedb::{batch::KeyInfoPath, EstimatedLayerInformation, TransactionArg}; -use super::DriveLowLevelOperationConverter; - /// Operations for Withdrawals #[derive(Clone, Debug)] pub enum WithdrawalOperationType { diff --git a/packages/rs-json-schema-compatibility-validator/Cargo.toml b/packages/rs-json-schema-compatibility-validator/Cargo.toml index 0ddeeaa080..d31332bb20 100644 --- a/packages/rs-json-schema-compatibility-validator/Cargo.toml +++ b/packages/rs-json-schema-compatibility-validator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "json-schema-compatibility-validator" -version = "1.3.0" +version = "1.4.0-dev.1" edition = "2021" rust-version.workspace = true authors = ["Ivan Shumkov "] diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index 686826fcba..f18ea08c61 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.3.0" +version = "1.4.0-dev.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index bde609eb8f..89f2c732de 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.3.0" +version = "1.4.0-dev.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index 194bbdba60..245855ba13 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.3.0" +version = "1.4.0-dev.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index c4208cff92..604a4dae4b 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.3.0" +version = "1.4.0-dev.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 6a3c78b897..267c427514 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Versioning library for Platform" -version = "1.3.0" +version = "1.4.0-dev.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-version/src/version/dpp_versions.rs b/packages/rs-platform-version/src/version/dpp_versions.rs index e168d8aa95..b42befd472 100644 --- a/packages/rs-platform-version/src/version/dpp_versions.rs +++ b/packages/rs-platform-version/src/version/dpp_versions.rs @@ -265,6 +265,7 @@ pub struct DocumentMethodVersions { pub hash: FeatureVersion, pub get_raw_for_contract: FeatureVersion, pub get_raw_for_document_type: FeatureVersion, + pub try_into_asset_unlock_base_transaction_info: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/limits.rs b/packages/rs-platform-version/src/version/limits.rs index 7035d6ae7c..207cde0d1e 100644 --- a/packages/rs-platform-version/src/version/limits.rs +++ b/packages/rs-platform-version/src/version/limits.rs @@ -4,4 +4,5 @@ pub struct SystemLimits { pub max_field_value_size: u32, pub max_state_transition_size: u64, pub max_transitions_in_documents_batch: u16, + pub withdrawal_transactions_per_block_limit: u16, } diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index a23140000b..a8ab18bd43 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -1236,6 +1236,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { hash: 0, get_raw_for_contract: 0, get_raw_for_document_type: 0, + try_into_asset_unlock_base_transaction_info: 0, }, }, identity_versions: IdentityVersions { @@ -1273,6 +1274,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { max_field_value_size: 5000, max_state_transition_size: 20000, max_transitions_in_documents_batch: 1, + withdrawal_transactions_per_block_limit: 4, }, consensus: ConsensusVersions { tenderdash_consensus_version: 0, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 919a6add8c..7f3d66171c 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -168,35 +168,6 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { remove_from_system_credits_operations: 0, calculate_total_credits_balance: 0, }, - state_transitions: DriveStateTransitionMethodVersions { - operations: DriveStateTransitionOperationMethodVersions { - finalization_tasks: 0, - contracts: DriveDataContractOperationMethodVersions { - finalization_tasks: 0, - }, - }, - convert_to_high_level_operations: - DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions { - data_contract_create_transition: 0, - data_contract_update_transition: 0, - document_create_transition: 0, - document_delete_transition: 0, - document_purchase_transition: 0, - document_replace_transition: 0, - document_transfer_transition: 0, - document_update_price_transition: 0, - documents_batch_transition: 0, - identity_create_transition: 0, - identity_credit_transfer_transition: 0, - identity_credit_withdrawal_transition: 0, - identity_top_up_transition: 0, - identity_update_transition: 0, - masternode_vote_transition: 0, - bump_identity_data_contract_nonce: 0, - bump_identity_nonce: 0, - partially_use_asset_lock: 0, - }, - }, document: DriveDocumentMethodVersions { query: DriveDocumentQueryMethodVersions { query_documents: 0, query_contested_documents: 0, query_contested_documents_vote_state: 0, query_documents_with_flags: 0 }, delete: DriveDocumentDeleteMethodVersions { @@ -269,10 +240,10 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { cleanup: DriveVoteCleanupMethodVersions { remove_specific_vote_references_given_by_identity: 0, remove_specific_votes_given_by_identity: 0, - remove_contested_resource_vote_poll_end_date_query_operations: 0, + remove_contested_resource_vote_poll_end_date_query_operations: 1, remove_contested_resource_vote_poll_votes_operations: 0, - remove_contested_resource_vote_poll_documents_operations: 0, - remove_contested_resource_vote_poll_contenders_operations: 0, + remove_contested_resource_vote_poll_documents_operations: 1, + remove_contested_resource_vote_poll_contenders_operations: 1, remove_contested_resource_top_level_index_operations: 0, remove_contested_resource_info_operations: 0, }, @@ -522,6 +493,35 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { apply_batch_low_level_drive_operations: 0, apply_batch_grovedb_operations: 0, }, + state_transitions: DriveStateTransitionMethodVersions { + operations: DriveStateTransitionOperationMethodVersions { + finalization_tasks: 0, + contracts: DriveDataContractOperationMethodVersions { + finalization_tasks: 0, + }, + }, + convert_to_high_level_operations: + DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions { + data_contract_create_transition: 0, + data_contract_update_transition: 0, + document_create_transition: 0, + document_delete_transition: 0, + document_purchase_transition: 0, + document_replace_transition: 0, + document_transfer_transition: 0, + document_update_price_transition: 0, + documents_batch_transition: 0, + identity_create_transition: 0, + identity_credit_transfer_transition: 0, + identity_credit_withdrawal_transition: 0, + identity_top_up_transition: 0, + identity_update_transition: 0, + masternode_vote_transition: 0, + bump_identity_data_contract_nonce: 0, + bump_identity_nonce: 0, + partially_use_asset_lock: 0, + }, + }, batch_operations: DriveBatchOperationsMethodVersion { convert_drive_operations_to_grove_operations: 0, apply_drive_operations: 0, @@ -634,9 +634,9 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, }, protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { - check_for_desired_protocol_upgrade: 0, + check_for_desired_protocol_upgrade: 1, upgrade_protocol_version_on_epoch_change: 0, - protocol_version_upgrade_percentage_needed: 75, + protocol_version_upgrade_percentage_needed: 67, }, block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { add_process_epoch_change_operations: 0, @@ -667,7 +667,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { build_untied_withdrawal_transactions_from_documents: 0, dequeue_and_build_unsigned_withdrawal_transactions: 0, fetch_transactions_block_inclusion_status: 0, - pool_withdrawals_into_transactions_queue: 0, + pool_withdrawals_into_transactions_queue: 1, update_broadcasted_withdrawal_statuses: 0, append_signatures_and_broadcast_withdrawal_transactions: 0, }, @@ -750,7 +750,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, identity_credit_withdrawal_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), + basic_structure: Some(1), advanced_structure: None, identity_signatures: None, advanced_minimum_balance_pre_check: Some(0), @@ -822,7 +822,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { document_transfer_transition_structure_validation: 0, document_purchase_transition_structure_validation: 0, document_update_price_transition_structure_validation: 0, - document_create_transition_state_validation: 0, + document_create_transition_state_validation: 1, document_delete_transition_state_validation: 0, document_replace_transition_state_validation: 0, document_transfer_transition_state_validation: 0, @@ -874,6 +874,11 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { max_version: 0, default_current_version: 0, }, + identities_contract_keys: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, identity_nonce: FeatureVersionBounds { min_version: 0, max_version: 0, @@ -904,11 +909,6 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { max_version: 0, default_current_version: 0, }, - identities_contract_keys: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, }, validator_queries: DriveAbciQueryValidatorVersions { proposed_block_counts_by_evonode_ids: FeatureVersionBounds { @@ -1132,7 +1132,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { state_transition_conversion_versions: StateTransitionConversionVersions { identity_to_identity_create_transition: 0, identity_to_identity_top_up_transition: 0, - identity_to_identity_withdrawal_transition: 0, + identity_to_identity_withdrawal_transition: 1, identity_to_identity_create_transition_with_signer: 0, }, state_transition_method_versions: StateTransitionMethodVersions { @@ -1236,6 +1236,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { hash: 0, get_raw_for_contract: 0, get_raw_for_document_type: 0, + try_into_asset_unlock_base_transaction_info: 0, }, }, identity_versions: IdentityVersions { @@ -1272,11 +1273,12 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { fee_version: FEE_VERSION1, system_limits: SystemLimits { estimated_contract_max_serialized_size: 16384, - max_field_value_size: 5000, - max_state_transition_size: 20000, + max_field_value_size: 5120, //5 KiB + max_state_transition_size: 20480, //20 KiB max_transitions_in_documents_batch: 1, + withdrawal_transactions_per_block_limit: 4, }, consensus: ConsensusVersions { - tenderdash_consensus_version: 0, + tenderdash_consensus_version: 1, }, }; diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 325336c52f..215ff1f28d 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -1235,6 +1235,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { hash: 0, get_raw_for_contract: 0, get_raw_for_document_type: 0, + try_into_asset_unlock_base_transaction_info: 0, }, }, identity_versions: IdentityVersions { @@ -1274,6 +1275,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { max_field_value_size: 5120, //5 KiB max_state_transition_size: 20480, //20 KiB max_transitions_in_documents_batch: 1, + withdrawal_transactions_per_block_limit: 4, }, consensus: ConsensusVersions { tenderdash_consensus_version: 0, diff --git a/packages/rs-platform-version/src/version/v2.rs b/packages/rs-platform-version/src/version/v2.rs index 5ed8d2d3e3..88e5d4edbe 100644 --- a/packages/rs-platform-version/src/version/v2.rs +++ b/packages/rs-platform-version/src/version/v2.rs @@ -1235,6 +1235,7 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion { hash: 0, get_raw_for_contract: 0, get_raw_for_document_type: 0, + try_into_asset_unlock_base_transaction_info: 0, }, }, identity_versions: IdentityVersions { @@ -1274,6 +1275,7 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion { max_field_value_size: 5120, //5 KiB max_state_transition_size: 20480, //20 KiB max_transitions_in_documents_batch: 1, + withdrawal_transactions_per_block_limit: 4, }, consensus: ConsensusVersions { tenderdash_consensus_version: 0, diff --git a/packages/rs-platform-version/src/version/v3.rs b/packages/rs-platform-version/src/version/v3.rs index cb608a3b3c..48a4054dc4 100644 --- a/packages/rs-platform-version/src/version/v3.rs +++ b/packages/rs-platform-version/src/version/v3.rs @@ -1138,7 +1138,7 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { state_transition_conversion_versions: StateTransitionConversionVersions { identity_to_identity_create_transition: 0, identity_to_identity_top_up_transition: 0, - identity_to_identity_withdrawal_transition: 0, + identity_to_identity_withdrawal_transition: 1, identity_to_identity_create_transition_with_signer: 0, }, state_transition_method_versions: StateTransitionMethodVersions { @@ -1242,6 +1242,7 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { hash: 0, get_raw_for_contract: 0, get_raw_for_document_type: 0, + try_into_asset_unlock_base_transaction_info: 0, }, }, identity_versions: IdentityVersions { @@ -1281,6 +1282,7 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { max_field_value_size: 5120, //5 KiB max_state_transition_size: 20480, //20 KiB max_transitions_in_documents_batch: 1, + withdrawal_transactions_per_block_limit: 4, }, consensus: ConsensusVersions { tenderdash_consensus_version: 1, diff --git a/packages/rs-platform-version/src/version/v4.rs b/packages/rs-platform-version/src/version/v4.rs index ee05ddc657..772686d3d4 100644 --- a/packages/rs-platform-version/src/version/v4.rs +++ b/packages/rs-platform-version/src/version/v4.rs @@ -751,7 +751,7 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { }, identity_credit_withdrawal_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), + basic_structure: Some(1), advanced_structure: None, identity_signatures: None, advanced_minimum_balance_pre_check: Some(0), @@ -1133,7 +1133,7 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { state_transition_conversion_versions: StateTransitionConversionVersions { identity_to_identity_create_transition: 0, identity_to_identity_top_up_transition: 0, - identity_to_identity_withdrawal_transition: 0, + identity_to_identity_withdrawal_transition: 1, identity_to_identity_create_transition_with_signer: 0, }, state_transition_method_versions: StateTransitionMethodVersions { @@ -1237,6 +1237,7 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { hash: 0, get_raw_for_contract: 0, get_raw_for_document_type: 0, + try_into_asset_unlock_base_transaction_info: 0, }, }, identity_versions: IdentityVersions { @@ -1276,6 +1277,7 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { max_field_value_size: 5120, //5 KiB max_state_transition_size: 20480, //20 KiB max_transitions_in_documents_batch: 1, + withdrawal_transactions_per_block_limit: 4, }, consensus: ConsensusVersions { tenderdash_consensus_version: 1, diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index 79efc913f0..5e7d26322d 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.3.0" +version = "1.4.0-dev.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 6ce80dd127..8934df17dc 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dash-sdk" -version = "1.3.0" +version = "1.4.0-dev.1" edition = "2021" [dependencies] diff --git a/packages/rs-sdk/src/lib.rs b/packages/rs-sdk/src/lib.rs index 14b65a58c2..e09eb4d3bb 100644 --- a/packages/rs-sdk/src/lib.rs +++ b/packages/rs-sdk/src/lib.rs @@ -73,6 +73,7 @@ pub mod sdk; pub use error::Error; pub use sdk::{RequestSettings, Sdk, SdkBuilder}; +pub use dashcore_rpc; pub use dpp; pub use rs_dapi_client as dapi_client; diff --git a/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs b/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs index 1dbff8c3ea..db06f29a2a 100644 --- a/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs +++ b/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs @@ -1,4 +1,3 @@ -use dapi_grpc::platform::VersionedGrpcResponse; use dpp::dashcore::Address; use dpp::identity::accessors::IdentityGettersV0; @@ -7,19 +6,15 @@ use dpp::identity::signer::Signer; use dpp::identity::Identity; use dpp::prelude::UserFeeIncrease; -use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; -use drive_proof_verifier::error::ContextProviderError; -use drive_proof_verifier::DataContractProvider; - -use crate::platform::block_info_from_metadata::block_info_from_metadata; -use crate::platform::transition::broadcast_request::BroadcastRequestForStateTransition; +use crate::platform::transition::broadcast::BroadcastStateTransition; use crate::platform::transition::put_settings::PutSettings; use crate::{Error, Sdk}; -use dpp::state_transition::identity_credit_withdrawal_transition::methods::IdentityCreditWithdrawalTransitionMethodsV0; +use dpp::state_transition::identity_credit_withdrawal_transition::methods::{ + IdentityCreditWithdrawalTransitionMethodsV0, PreferredKeyPurposeForSigningWithdrawal, +}; +use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use dpp::state_transition::proof_result::StateTransitionProofResult; use dpp::withdrawal::Pooling; -use drive::drive::Drive; -use rs_dapi_client::{DapiRequest, RequestSettings}; #[async_trait::async_trait] pub trait WithdrawFromIdentity { @@ -27,7 +22,7 @@ pub trait WithdrawFromIdentity { async fn withdraw( &self, sdk: &Sdk, - address: Address, + address: Option
, amount: u64, core_fee_per_byte: Option, user_fee_increase: Option, @@ -41,7 +36,7 @@ impl WithdrawFromIdentity for Identity { async fn withdraw( &self, sdk: &Sdk, - address: Address, + address: Option
, amount: u64, core_fee_per_byte: Option, user_fee_increase: Option, @@ -49,52 +44,28 @@ impl WithdrawFromIdentity for Identity { settings: Option, ) -> Result { let new_identity_nonce = sdk.get_identity_nonce(self.id(), true, settings).await?; + let script = address.map(|address| CoreScript::new(address.script_pubkey())); let state_transition = IdentityCreditWithdrawalTransition::try_from_identity( self, - None, - CoreScript::new(address.script_pubkey()), + script, amount, Pooling::Never, core_fee_per_byte.unwrap_or(1), user_fee_increase.unwrap_or_default(), signer, + None, + PreferredKeyPurposeForSigningWithdrawal::TransferPreferred, new_identity_nonce, sdk.version(), None, )?; - let request = state_transition.broadcast_request_for_state_transition()?; - - request - .clone() - .execute(sdk, settings.unwrap_or_default().request_settings) - .await?; - - let request = state_transition.wait_for_state_transition_result_request()?; - - let response = request.execute(sdk, RequestSettings::default()).await?; - - let block_info = block_info_from_metadata(response.metadata()?)?; - - let proof = response.proof_owned()?; - let context_provider = - sdk.context_provider() - .ok_or(Error::from(ContextProviderError::Config( - "Context provider not initialized".to_string(), - )))?; - - let (_, result) = Drive::verify_state_transition_was_executed_with_proof( - &state_transition, - &block_info, - proof.grovedb_proof.as_slice(), - &context_provider.as_contract_lookup_fn(), - sdk.version(), - )?; + let result = state_transition.broadcast_and_wait(sdk, None).await?; match result { StateTransitionProofResult::VerifiedPartialIdentity(identity) => { identity.balance.ok_or(Error::DapiClientError( - "expected an identity balance".to_string(), + "expected an identity balance after withdrawal".to_string(), )) } _ => Err(Error::DapiClientError("proved a non identity".to_string())), diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index ae119ef3a2..95a68d598a 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.3.0" +version = "1.4.0-dev.1" edition = "2021" rust-version.workspace = true diff --git a/packages/simple-signer/src/signer.rs b/packages/simple-signer/src/signer.rs index f8f8f92f3b..448e1a5c9c 100644 --- a/packages/simple-signer/src/signer.rs +++ b/packages/simple-signer/src/signer.rs @@ -106,4 +106,11 @@ impl Signer for SimpleSigner { )), } } + + fn can_sign_with(&self, identity_public_key: &IdentityPublicKey) -> bool { + self.private_keys + .get(identity_public_key) + .or_else(|| self.private_keys_in_creation.get(identity_public_key)) + .is_some() + } } diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index bd389a0c35..e353ddf2b5 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.3.0" +version = "1.4.0-dev.1" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/strategy-tests/src/transitions.rs b/packages/strategy-tests/src/transitions.rs index 5a456afa3a..7b0f3d92c4 100644 --- a/packages/strategy-tests/src/transitions.rs +++ b/packages/strategy-tests/src/transitions.rs @@ -22,10 +22,6 @@ use dpp::state_transition::identity_create_transition::IdentityCreateTransition; use dpp::state_transition::identity_credit_transfer_transition::v0::IdentityCreditTransferTransitionV0; use dpp::ProtocolError; -use dpp::state_transition::identity_credit_withdrawal_transition::v0::{ - IdentityCreditWithdrawalTransitionV0, MIN_CORE_FEE_PER_BYTE, -}; - use dpp::native_bls::NativeBlsModule; use dpp::state_transition::identity_topup_transition::methods::IdentityTopUpTransitionMethodsV0; use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; @@ -40,6 +36,9 @@ use simple_signer::signer::SimpleSigner; use crate::KeyMaps; use dpp::dashcore::transaction::special_transaction::asset_lock::AssetLockPayload; use dpp::dashcore::transaction::special_transaction::TransactionPayload; +use dpp::state_transition::identity_credit_withdrawal_transition::v1::IdentityCreditWithdrawalTransitionV1; +use dpp::state_transition::identity_credit_withdrawal_transition::MIN_CORE_FEE_PER_BYTE; +use rand::Rng; use std::collections::{BTreeMap, HashSet}; use std::str::FromStr; @@ -448,26 +447,32 @@ pub fn create_identity_update_transition_disable_keys( Some(state_transition) } -/// Creates a state transition for an identity's credit withdrawal. +/// Creates a state transition for an identity's credit withdrawal, with a potential +/// output address based on the identity's capabilities. /// -/// This function generates a state transition representing the withdrawal of credits from an identity. -/// The withdrawal amount is set to 0.001 Dash. The function first bumps the revision -/// of the identity and then constructs the withdrawal transition. Subsequently, it's signed using the -/// identity's authentication key for validity and authenticity. +/// This function generates a state transition representing the withdrawal of credits from +/// an identity. It first checks if the identity has a suitable withdrawal address. If so, +/// there is a 50% chance that the withdrawal will be sent to the identity's transfer key. +/// Otherwise, it will create a withdrawal transition with a random output address. /// /// # Parameters /// - `identity`: A mutable reference to the identity making the withdrawal. +/// - `identity_nonce_counter`: A mutable reference to a BTreeMap that tracks the nonce for +/// each identity, ensuring unique transaction identifiers. /// - `signer`: A mutable reference to the signer used to create the cryptographic signature for /// the state transition. -/// - `rng`: A mutable reference to a random number generator, used for generating the random Pay-To-Script-Hash (P2SH). +/// - `rng`: A mutable reference to a random number generator, used for generating the random +/// Pay-To-Script-Hash (P2SH) when creating a withdrawal with an output address. /// /// # Returns -/// - `StateTransition`: The constructed and signed state transition representing the identity's credit withdrawal. +/// - `StateTransition`: The constructed state transition representing the identity's credit +/// withdrawal. /// /// # Examples /// ```ignore /// let withdrawal_transition = create_identity_withdrawal_transition( /// &mut identity, +/// &mut identity_nonce_counter, /// &mut signer, /// &mut rng, /// ); @@ -475,9 +480,152 @@ pub fn create_identity_update_transition_disable_keys( /// /// # Panics /// This function may panic under the following conditions: +/// - If the identity does not have a suitable withdrawal address or key for signing. +pub fn create_identity_withdrawal_transition( + identity: &mut Identity, + identity_nonce_counter: &mut BTreeMap, + signer: &mut SimpleSigner, + rng: &mut StdRng, +) -> StateTransition { + let has_withdrawal_address = identity + .get_first_public_key_matching( + Purpose::TRANSFER, + HashSet::from([SecurityLevel::CRITICAL]), + HashSet::from([KeyType::ECDSA_HASH160, KeyType::BIP13_SCRIPT_HASH]), + false, + ) + .is_some(); + if has_withdrawal_address && rng.gen_bool(0.5) { + // We can send it to the withdrawal address + create_identity_withdrawal_transition_sent_to_identity_transfer_key( + identity, + identity_nonce_counter, + signer, + ) + } else { + create_identity_withdrawal_transition_with_output_address( + identity, + identity_nonce_counter, + signer, + rng, + ) + } +} + +/// Creates a state transition for an identity's credit withdrawal directed to its +/// transfer key. +/// +/// This function generates a state transition representing the withdrawal of credits from +/// an identity. The withdrawal amount is set to 0.001 Dash. It increments the identity's +/// nonce and constructs the withdrawal transition. The transition is then signed using the +/// identity's authentication key for validity and authenticity. +/// +/// # Parameters +/// - `identity`: A mutable reference to the identity making the withdrawal. +/// - `identity_nonce_counter`: A mutable reference to a BTreeMap that tracks the nonce for +/// each identity, ensuring unique transaction identifiers. +/// - `signer`: A mutable reference to the signer used to create the cryptographic signature for +/// the state transition. +/// +/// # Returns +/// - `StateTransition`: The constructed and signed state transition representing the identity's +/// credit withdrawal directed to its transfer key. +/// +/// # Examples +/// ```ignore +/// let withdrawal_transition = create_identity_withdrawal_transition_sent_to_identity_transfer_key( +/// &mut identity, +/// &mut identity_nonce_counter, +/// &mut signer, +/// ); +/// ``` +/// +/// # Panics +/// This function may panic under the following conditions: /// - If the identity does not have a suitable authentication key for signing. /// - If there's an error during the signing process. -pub fn create_identity_withdrawal_transition( +pub fn create_identity_withdrawal_transition_sent_to_identity_transfer_key( + identity: &mut Identity, + identity_nonce_counter: &mut BTreeMap, + signer: &mut SimpleSigner, +) -> StateTransition { + let nonce = identity_nonce_counter.entry(identity.id()).or_default(); + *nonce += 1; + let mut withdrawal: StateTransition = IdentityCreditWithdrawalTransitionV1 { + identity_id: identity.id(), + amount: 1000000, // 1 duff + core_fee_per_byte: MIN_CORE_FEE_PER_BYTE, + pooling: Pooling::Never, + output_script: None, + nonce: *nonce, + user_fee_increase: 0, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + + let identity_public_key = identity + .get_first_public_key_matching( + Purpose::AUTHENTICATION, + HashSet::from([SecurityLevel::MASTER]), + HashSet::from([ + KeyType::ECDSA_SECP256K1, + KeyType::BLS12_381, + KeyType::ECDSA_HASH160, + KeyType::BIP13_SCRIPT_HASH, + KeyType::EDDSA_25519_HASH160, + ]), + false, + ) + .expect("expected to get a signing key"); + + withdrawal + .sign_external( + identity_public_key, + signer, + None::, + ) + .expect("expected to sign withdrawal"); + + withdrawal +} + +/// Creates a state transition for an identity's credit withdrawal directed to a specified +/// output address. +/// +/// This function generates a state transition representing the withdrawal of credits from +/// an identity. The withdrawal amount is set to 0.001 Dash. It increments the identity's +/// nonce and constructs the withdrawal transition, which includes a random P2SH output address. +/// The transition is then signed using the identity's transfer key for validity and authenticity. +/// +/// # Parameters +/// - `identity`: A mutable reference to the identity making the withdrawal. +/// - `identity_nonce_counter`: A mutable reference to a BTreeMap that tracks the nonce for +/// each identity, ensuring unique transaction identifiers. +/// - `signer`: A mutable reference to the signer used to create the cryptographic signature for +/// the state transition. +/// - `rng`: A mutable reference to a random number generator, used for generating the random +/// Pay-To-Script-Hash (P2SH). +/// +/// # Returns +/// - `StateTransition`: The constructed and signed state transition representing the identity's +/// credit withdrawal directed to the specified output address. +/// +/// # Examples +/// ```ignore +/// let withdrawal_transition = create_identity_withdrawal_transition_with_output_address( +/// &mut identity, +/// &mut identity_nonce_counter, +/// &mut signer, +/// &mut rng, +/// ); +/// ``` +/// +/// # Panics +/// This function may panic under the following conditions: +/// - If the identity does not have a suitable transfer key for signing. +/// - If there's an error during the signing process. +pub fn create_identity_withdrawal_transition_with_output_address( identity: &mut Identity, identity_nonce_counter: &mut BTreeMap, signer: &mut SimpleSigner, @@ -485,12 +633,12 @@ pub fn create_identity_withdrawal_transition( ) -> StateTransition { let nonce = identity_nonce_counter.entry(identity.id()).or_default(); *nonce += 1; - let mut withdrawal: StateTransition = IdentityCreditWithdrawalTransitionV0 { + let mut withdrawal: StateTransition = IdentityCreditWithdrawalTransitionV1 { identity_id: identity.id(), amount: 1000000, // 1 duff core_fee_per_byte: MIN_CORE_FEE_PER_BYTE, pooling: Pooling::Never, - output_script: CoreScript::random_p2sh(rng), + output_script: Some(CoreScript::random_p2sh(rng)), nonce: *nonce, user_fee_increase: 0, signature_public_key_id: 0, diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 8a06a6a1f7..c4caf8e961 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.3.0", + "version": "8.4.0-dev.1", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index dc0588bdd7..194e64f1a6 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.3.0" +version = "1.4.0-dev.1" edition = "2021" rust-version.workspace = true authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index c5f3d58d87..2b9d361397 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.3.0", + "version": "1.4.0-dev.1", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs index 8904162c21..d0ebb9ae56 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs +++ b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs @@ -1,4 +1,4 @@ -use dpp::identity::KeyID; +use dpp::identity::{KeyID, Purpose}; use dpp::{ prelude::Identifier, @@ -346,12 +346,22 @@ impl DocumentsBatchTransitionWasm { } #[wasm_bindgen(js_name=getKeySecurityLevelRequirement)] - pub fn get_security_level_requirement(&self) -> js_sys::Array { + pub fn get_security_level_requirement(&self, purpose: u8) -> Result { + // Convert the integer to a Purpose enum + let purpose_enum = match Purpose::try_from(purpose) { + Ok(purpose) => purpose, + Err(_) => { + return Err(JsValue::from_str( + "Invalid purpose value, expected a number between 0 and 5.", + )) + } + }; + let array = js_sys::Array::new(); - for security_level in self.0.security_level_requirement() { + for security_level in self.0.security_level_requirement(purpose_enum) { array.push(&JsValue::from(security_level as u32)); } - array + Ok(array) } // AbstractStateTransition methods diff --git a/packages/wasm-dpp/src/errors/consensus/basic/invalid_signature_public_key_purpose_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/invalid_signature_public_key_purpose_error.rs index 835d9559a8..f81b0a4e87 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/invalid_signature_public_key_purpose_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/invalid_signature_public_key_purpose_error.rs @@ -23,8 +23,12 @@ impl InvalidSignaturePublicKeyPurposeErrorWasm { } #[wasm_bindgen(js_name=getKeyPurposeRequirement)] - pub fn get_allowed_key_purpose(&self) -> u8 { - self.inner.allowed_key_purpose() as u8 + pub fn get_allowed_key_purposes(&self) -> js_sys::Array { + let array = js_sys::Array::new(); + for purpose in self.inner.allowed_key_purposes() { + array.push(&JsValue::from(*purpose as u8)); + } + array } #[wasm_bindgen(js_name=getCode)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/wrong_public_key_purpose_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/wrong_public_key_purpose_error.rs index ff07e99701..4f9e9205af 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/wrong_public_key_purpose_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/wrong_public_key_purpose_error.rs @@ -23,8 +23,12 @@ impl WrongPublicKeyPurposeErrorWasm { } #[wasm_bindgen(js_name=getKeyPurposeRequirement)] - pub fn get_key_purpose_requirement(&self) -> u8 { - self.inner.key_purpose_requirement() as u8 + pub fn get_allowed_key_purposes(&self) -> js_sys::Array { + let array = js_sys::Array::new(); + for purpose in self.inner.allowed_key_purposes() { + array.push(&JsValue::from(*purpose as u8)); + } + array } #[wasm_bindgen(js_name=getCode)] diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index 0d4019fc7c..642dce93fc 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -74,6 +74,8 @@ use dpp::consensus::state::document::document_incorrect_purchase_price_error::Do use dpp::consensus::state::document::document_not_for_sale_error::DocumentNotForSaleError; use dpp::consensus::state::identity::identity_public_key_already_exists_for_unique_contract_bounds_error::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError; use dpp::consensus::state::identity::master_public_key_update_error::MasterPublicKeyUpdateError; +use dpp::consensus::state::identity::missing_transfer_key_error::MissingTransferKeyError; +use dpp::consensus::state::identity::no_transfer_key_for_core_withdrawal_available_error::NoTransferKeyForCoreWithdrawalAvailableError; use dpp::consensus::state::prefunded_specialized_balances::prefunded_specialized_balance_insufficient_error::PrefundedSpecializedBalanceInsufficientError; use dpp::consensus::state::prefunded_specialized_balances::prefunded_specialized_balance_not_found_error::PrefundedSpecializedBalanceNotFoundError; use dpp::consensus::state::voting::masternode_incorrect_voter_identity_id_error::MasternodeIncorrectVoterIdentityIdError; @@ -296,6 +298,12 @@ pub fn from_state_error(state_error: &StateError) -> JsValue { StateError::DocumentContestDocumentWithSameIdAlreadyPresentError(e) => { generic_consensus_error!(DocumentContestDocumentWithSameIdAlreadyPresentError, e).into() } + StateError::MissingTransferKeyError(e) => { + generic_consensus_error!(MissingTransferKeyError, e).into() + } + StateError::NoTransferKeyForCoreWithdrawalAvailableError(e) => { + generic_consensus_error!(NoTransferKeyForCoreWithdrawalAvailableError, e).into() + } } } diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/to_object.rs b/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/to_object.rs index b0dc0002c8..d805f7f018 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/to_object.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/to_object.rs @@ -23,7 +23,7 @@ pub struct ToObject { pub amount: u64, pub core_fee_per_byte: u32, pub pooling: Pooling, - pub output_script: CoreScript, + pub output_script: Option, pub nonce: IdentityNonce, pub signature: Option>, pub signature_public_key_id: Option, diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs index 9d75149519..3de33cb834 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs @@ -114,14 +114,16 @@ impl IdentityCreditWithdrawalTransitionWasm { } #[wasm_bindgen(js_name=getOutputScript)] - pub fn get_output_script(&self) -> Buffer { - Buffer::from_bytes(self.0.output_script().as_bytes()) + pub fn get_output_script(&self) -> Option { + self.0 + .output_script() + .map(|core_script| Buffer::from_bytes(core_script.as_bytes())) } #[wasm_bindgen(js_name=setOutputScript)] - pub fn set_output_script(&mut self, output_script: Vec) { + pub fn set_output_script(&mut self, output_script: Option>) { self.0 - .set_output_script(CoreScript::from_bytes(output_script)); + .set_output_script(output_script.map(CoreScript::from_bytes)); } #[wasm_bindgen(js_name=getNonce)] @@ -153,6 +155,7 @@ impl IdentityCreditWithdrawalTransitionWasm { let version = match self.0 { IdentityCreditWithdrawalTransition::V0(_) => "0", + IdentityCreditWithdrawalTransition::V1(_) => "1", }; js_sys::Reflect::set(&js_object, &"$version".to_owned().into(), &version.into())?; @@ -205,12 +208,15 @@ impl IdentityCreditWithdrawalTransitionWasm { &JsValue::from_f64((object.pooling as u8) as f64), )?; - let output_script = Buffer::from_bytes(object.output_script.as_bytes()); - js_sys::Reflect::set( - &js_object, - &"outputScript".to_owned().into(), - &output_script.into(), - )?; + if let Some(output_script) = object.output_script { + let output_script = Buffer::from_bytes(output_script.as_bytes()); + + js_sys::Reflect::set( + &js_object, + &"outputScript".to_owned().into(), + &output_script.into(), + )?; + } js_sys::Reflect::set( &js_object, @@ -243,6 +249,7 @@ impl IdentityCreditWithdrawalTransitionWasm { let version = match self.0 { IdentityCreditWithdrawalTransition::V0(_) => "0", + IdentityCreditWithdrawalTransition::V1(_) => "1", }; js_sys::Reflect::set(&js_object, &"$version".to_owned().into(), &version.into())?; @@ -297,16 +304,16 @@ impl IdentityCreditWithdrawalTransitionWasm { &JsValue::from_f64((object.pooling as u8) as f64), )?; - let output_script = platform_value::string_encoding::encode( - object.output_script.as_bytes(), - Encoding::Base64, - ); + if let Some(output_script) = object.output_script { + let output_script = + platform_value::string_encoding::encode(output_script.as_bytes(), Encoding::Base64); - js_sys::Reflect::set( - &js_object, - &"outputScript".to_owned().into(), - &output_script.into(), - )?; + js_sys::Reflect::set( + &js_object, + &"outputScript".to_owned().into(), + &output_script.into(), + )?; + } js_sys::Reflect::set( &js_object, diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index 2408bb012f..357bc6d42f 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.3.0" +version = "1.4.0-dev.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index c34500ef87..749f7e7070 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.3.0", + "version": "1.4.0-dev.1", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From fdbff39ba25376c4895a4d6d0f225ef843e2946c Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 26 Sep 2024 16:06:07 +0700 Subject: [PATCH 06/90] feat(platform): get current quorum info (#2168) --- .../dash/platform/dapi/v0/PlatformGrpc.java | 74 + .../platform/v0/nodejs/platform_pbjs.js | 1491 +++++++++++++++++ .../platform/v0/nodejs/platform_protoc.js | 1491 +++++++++++++++++ .../platform/v0/objective-c/Platform.pbobjc.h | 129 ++ .../platform/v0/objective-c/Platform.pbobjc.m | 389 +++++ .../platform/v0/objective-c/Platform.pbrpc.h | 13 + .../platform/v0/objective-c/Platform.pbrpc.m | 20 + .../platform/v0/python/platform_pb2.py | 337 +++- .../platform/v0/python/platform_pb2_grpc.py | 33 + .../clients/platform/v0/web/platform_pb.d.ts | 188 +++ .../clients/platform/v0/web/platform_pb.js | 1491 +++++++++++++++++ .../platform/v0/web/platform_pb_service.d.ts | 19 + .../platform/v0/web/platform_pb_service.js | 40 + .../protos/platform/v0/platform.proto | 31 + packages/rs-dapi-client/src/transport/grpc.rs | 9 + packages/rs-dpp/Cargo.toml | 15 + packages/rs-dpp/src/core_types/mod.rs | 2 + .../rs-dpp/src/core_types/validator/mod.rs | 119 ++ .../rs-dpp/src/core_types/validator/v0/mod.rs | 252 +++ .../src/core_types/validator_set/mod.rs | 111 ++ .../src/core_types/validator_set/v0/mod.rs | 249 +++ packages/rs-dpp/src/lib.rs | 2 + .../initialization/init_chain/v0/mod.rs | 6 +- .../block_end/validator_set_update/v0/mod.rs | 7 +- .../block_end/validator_set_update/v1/mod.rs | 7 +- .../update_quorum_info/v0/mod.rs | 4 +- .../platform_types/platform_state/v0/mod.rs | 18 +- .../src/platform_types/validator/mod.rs | 113 +- .../src/platform_types/validator/v0/mod.rs | 163 +- .../src/platform_types/validator_set/mod.rs | 113 +- .../platform_types/validator_set/v0/mod.rs | 204 +-- packages/rs-drive-abci/src/query/service.rs | 25 +- .../query/system/current_quorums_info/mod.rs | 59 + .../system/current_quorums_info/v0/mod.rs | 68 + .../rs-drive-abci/src/query/system/mod.rs | 1 + .../src/query/system/path_elements/mod.rs | 2 +- .../system/total_credits_in_platform/mod.rs | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 1 + packages/rs-drive-proof-verifier/src/lib.rs | 3 + packages/rs-drive-proof-verifier/src/types.rs | 70 + .../rs-drive-proof-verifier/src/unproved.rs | 275 +++ .../src/version/drive_abci_versions.rs | 1 + .../src/version/mocks/v2_test.rs | 5 + .../src/version/mocks/v3_test.rs | 5 + .../rs-platform-version/src/version/v1.rs | 5 + .../rs-platform-version/src/version/v2.rs | 5 + .../rs-platform-version/src/version/v3.rs | 5 + .../rs-platform-version/src/version/v4.rs | 5 + packages/rs-sdk/src/platform.rs | 1 + .../rs-sdk/src/platform/fetch_unproved.rs | 75 + 50 files changed, 7196 insertions(+), 557 deletions(-) create mode 100644 packages/rs-dpp/src/core_types/mod.rs create mode 100644 packages/rs-dpp/src/core_types/validator/mod.rs create mode 100644 packages/rs-dpp/src/core_types/validator/v0/mod.rs create mode 100644 packages/rs-dpp/src/core_types/validator_set/mod.rs create mode 100644 packages/rs-dpp/src/core_types/validator_set/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/query/system/current_quorums_info/mod.rs create mode 100644 packages/rs-drive-abci/src/query/system/current_quorums_info/v0/mod.rs create mode 100644 packages/rs-drive-proof-verifier/src/unproved.rs create mode 100644 packages/rs-sdk/src/platform/fetch_unproved.rs diff --git a/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java b/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java index 035bb98138..26cf1818f9 100644 --- a/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java +++ b/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java @@ -976,6 +976,37 @@ org.dash.platform.dapi.v0.PlatformOuterClass.GetStatusResponse> getGetStatusMeth return getGetStatusMethod; } + private static volatile io.grpc.MethodDescriptor getGetCurrentQuorumsInfoMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "getCurrentQuorumsInfo", + requestType = org.dash.platform.dapi.v0.PlatformOuterClass.GetCurrentQuorumsInfoRequest.class, + responseType = org.dash.platform.dapi.v0.PlatformOuterClass.GetCurrentQuorumsInfoResponse.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getGetCurrentQuorumsInfoMethod() { + io.grpc.MethodDescriptor getGetCurrentQuorumsInfoMethod; + if ((getGetCurrentQuorumsInfoMethod = PlatformGrpc.getGetCurrentQuorumsInfoMethod) == null) { + synchronized (PlatformGrpc.class) { + if ((getGetCurrentQuorumsInfoMethod = PlatformGrpc.getGetCurrentQuorumsInfoMethod) == null) { + PlatformGrpc.getGetCurrentQuorumsInfoMethod = getGetCurrentQuorumsInfoMethod = + io.grpc.MethodDescriptor.newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getCurrentQuorumsInfo")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetCurrentQuorumsInfoRequest.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetCurrentQuorumsInfoResponse.getDefaultInstance())) + .setSchemaDescriptor(new PlatformMethodDescriptorSupplier("getCurrentQuorumsInfo")) + .build(); + } + } + } + return getGetCurrentQuorumsInfoMethod; + } + /** * Creates a new async stub that supports all call types for the service */ @@ -1256,6 +1287,13 @@ public void getStatus(org.dash.platform.dapi.v0.PlatformOuterClass.GetStatusRequ io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetStatusMethod(), responseObserver); } + /** + */ + public void getCurrentQuorumsInfo(org.dash.platform.dapi.v0.PlatformOuterClass.GetCurrentQuorumsInfoRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetCurrentQuorumsInfoMethod(), responseObserver); + } + @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() { return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()) .addMethod( @@ -1475,6 +1513,13 @@ public void getStatus(org.dash.platform.dapi.v0.PlatformOuterClass.GetStatusRequ org.dash.platform.dapi.v0.PlatformOuterClass.GetStatusRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetStatusResponse>( this, METHODID_GET_STATUS))) + .addMethod( + getGetCurrentQuorumsInfoMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + org.dash.platform.dapi.v0.PlatformOuterClass.GetCurrentQuorumsInfoRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetCurrentQuorumsInfoResponse>( + this, METHODID_GET_CURRENT_QUORUMS_INFO))) .build(); } } @@ -1755,6 +1800,14 @@ public void getStatus(org.dash.platform.dapi.v0.PlatformOuterClass.GetStatusRequ io.grpc.stub.ClientCalls.asyncUnaryCall( getChannel().newCall(getGetStatusMethod(), getCallOptions()), request, responseObserver); } + + /** + */ + public void getCurrentQuorumsInfo(org.dash.platform.dapi.v0.PlatformOuterClass.GetCurrentQuorumsInfoRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getGetCurrentQuorumsInfoMethod(), getCallOptions()), request, responseObserver); + } } /** @@ -2002,6 +2055,13 @@ public org.dash.platform.dapi.v0.PlatformOuterClass.GetStatusResponse getStatus( return io.grpc.stub.ClientCalls.blockingUnaryCall( getChannel(), getGetStatusMethod(), getCallOptions(), request); } + + /** + */ + public org.dash.platform.dapi.v0.PlatformOuterClass.GetCurrentQuorumsInfoResponse getCurrentQuorumsInfo(org.dash.platform.dapi.v0.PlatformOuterClass.GetCurrentQuorumsInfoRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getGetCurrentQuorumsInfoMethod(), getCallOptions(), request); + } } /** @@ -2280,6 +2340,14 @@ public com.google.common.util.concurrent.ListenableFuture getCurrentQuorumsInfo( + org.dash.platform.dapi.v0.PlatformOuterClass.GetCurrentQuorumsInfoRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getGetCurrentQuorumsInfoMethod(), getCallOptions()), request); + } } private static final int METHODID_BROADCAST_STATE_TRANSITION = 0; @@ -2313,6 +2381,7 @@ public com.google.common.util.concurrent.ListenableFuture implements io.grpc.stub.ServerCalls.UnaryMethod, @@ -2455,6 +2524,10 @@ public void invoke(Req request, io.grpc.stub.StreamObserver responseObserv serviceImpl.getStatus((org.dash.platform.dapi.v0.PlatformOuterClass.GetStatusRequest) request, (io.grpc.stub.StreamObserver) responseObserver); break; + case METHODID_GET_CURRENT_QUORUMS_INFO: + serviceImpl.getCurrentQuorumsInfo((org.dash.platform.dapi.v0.PlatformOuterClass.GetCurrentQuorumsInfoRequest) request, + (io.grpc.stub.StreamObserver) responseObserver); + break; default: throw new AssertionError(); } @@ -2547,6 +2620,7 @@ public static io.grpc.ServiceDescriptor getServiceDescriptor() { .addMethod(getGetTotalCreditsInPlatformMethod()) .addMethod(getGetPathElementsMethod()) .addMethod(getGetStatusMethod()) + .addMethod(getGetCurrentQuorumsInfoMethod()) .build(); } } diff --git a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js index 1c749e8b48..1818a68889 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js @@ -1109,6 +1109,39 @@ $root.org = (function() { * @variation 2 */ + /** + * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getCurrentQuorumsInfo}. + * @memberof org.dash.platform.dapi.v0.Platform + * @typedef getCurrentQuorumsInfoCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} [response] GetCurrentQuorumsInfoResponse + */ + + /** + * Calls getCurrentQuorumsInfo. + * @function getCurrentQuorumsInfo + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetCurrentQuorumsInfoRequest} request GetCurrentQuorumsInfoRequest message or plain object + * @param {org.dash.platform.dapi.v0.Platform.getCurrentQuorumsInfoCallback} callback Node-style callback called with the error, if any, and GetCurrentQuorumsInfoResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(Platform.prototype.getCurrentQuorumsInfo = function getCurrentQuorumsInfo(request, callback) { + return this.rpcCall(getCurrentQuorumsInfo, $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest, $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse, request, callback); + }, "name", { value: "getCurrentQuorumsInfo" }); + + /** + * Calls getCurrentQuorumsInfo. + * @function getCurrentQuorumsInfo + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetCurrentQuorumsInfoRequest} request GetCurrentQuorumsInfoRequest message or plain object + * @returns {Promise} Promise + * @variation 2 + */ + return Platform; })(); @@ -45101,6 +45134,1464 @@ $root.org = (function() { return GetStatusResponse; })(); + v0.GetCurrentQuorumsInfoRequest = (function() { + + /** + * Properties of a GetCurrentQuorumsInfoRequest. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetCurrentQuorumsInfoRequest + * @property {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.IGetCurrentQuorumsInfoRequestV0|null} [v0] GetCurrentQuorumsInfoRequest v0 + */ + + /** + * Constructs a new GetCurrentQuorumsInfoRequest. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetCurrentQuorumsInfoRequest. + * @implements IGetCurrentQuorumsInfoRequest + * @constructor + * @param {org.dash.platform.dapi.v0.IGetCurrentQuorumsInfoRequest=} [properties] Properties to set + */ + function GetCurrentQuorumsInfoRequest(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetCurrentQuorumsInfoRequest v0. + * @member {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.IGetCurrentQuorumsInfoRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest + * @instance + */ + GetCurrentQuorumsInfoRequest.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetCurrentQuorumsInfoRequest version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest + * @instance + */ + Object.defineProperty(GetCurrentQuorumsInfoRequest.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetCurrentQuorumsInfoRequest instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetCurrentQuorumsInfoRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} GetCurrentQuorumsInfoRequest instance + */ + GetCurrentQuorumsInfoRequest.create = function create(properties) { + return new GetCurrentQuorumsInfoRequest(properties); + }; + + /** + * Encodes the specified GetCurrentQuorumsInfoRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetCurrentQuorumsInfoRequest} message GetCurrentQuorumsInfoRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetCurrentQuorumsInfoRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetCurrentQuorumsInfoRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetCurrentQuorumsInfoRequest} message GetCurrentQuorumsInfoRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetCurrentQuorumsInfoRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetCurrentQuorumsInfoRequest message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} GetCurrentQuorumsInfoRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetCurrentQuorumsInfoRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetCurrentQuorumsInfoRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} GetCurrentQuorumsInfoRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetCurrentQuorumsInfoRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetCurrentQuorumsInfoRequest message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetCurrentQuorumsInfoRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetCurrentQuorumsInfoRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} GetCurrentQuorumsInfoRequest + */ + GetCurrentQuorumsInfoRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetCurrentQuorumsInfoRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest + * @static + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} message GetCurrentQuorumsInfoRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetCurrentQuorumsInfoRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetCurrentQuorumsInfoRequest to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest + * @instance + * @returns {Object.} JSON object + */ + GetCurrentQuorumsInfoRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0 = (function() { + + /** + * Properties of a GetCurrentQuorumsInfoRequestV0. + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest + * @interface IGetCurrentQuorumsInfoRequestV0 + */ + + /** + * Constructs a new GetCurrentQuorumsInfoRequestV0. + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest + * @classdesc Represents a GetCurrentQuorumsInfoRequestV0. + * @implements IGetCurrentQuorumsInfoRequestV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.IGetCurrentQuorumsInfoRequestV0=} [properties] Properties to set + */ + function GetCurrentQuorumsInfoRequestV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Creates a new GetCurrentQuorumsInfoRequestV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.IGetCurrentQuorumsInfoRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} GetCurrentQuorumsInfoRequestV0 instance + */ + GetCurrentQuorumsInfoRequestV0.create = function create(properties) { + return new GetCurrentQuorumsInfoRequestV0(properties); + }; + + /** + * Encodes the specified GetCurrentQuorumsInfoRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.IGetCurrentQuorumsInfoRequestV0} message GetCurrentQuorumsInfoRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetCurrentQuorumsInfoRequestV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + return writer; + }; + + /** + * Encodes the specified GetCurrentQuorumsInfoRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.IGetCurrentQuorumsInfoRequestV0} message GetCurrentQuorumsInfoRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetCurrentQuorumsInfoRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetCurrentQuorumsInfoRequestV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} GetCurrentQuorumsInfoRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetCurrentQuorumsInfoRequestV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetCurrentQuorumsInfoRequestV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} GetCurrentQuorumsInfoRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetCurrentQuorumsInfoRequestV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetCurrentQuorumsInfoRequestV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0 + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetCurrentQuorumsInfoRequestV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + return null; + }; + + /** + * Creates a GetCurrentQuorumsInfoRequestV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0 + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} GetCurrentQuorumsInfoRequestV0 + */ + GetCurrentQuorumsInfoRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0) + return object; + return new $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0(); + }; + + /** + * Creates a plain object from a GetCurrentQuorumsInfoRequestV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} message GetCurrentQuorumsInfoRequestV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetCurrentQuorumsInfoRequestV0.toObject = function toObject() { + return {}; + }; + + /** + * Converts this GetCurrentQuorumsInfoRequestV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0 + * @instance + * @returns {Object.} JSON object + */ + GetCurrentQuorumsInfoRequestV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GetCurrentQuorumsInfoRequestV0; + })(); + + return GetCurrentQuorumsInfoRequest; + })(); + + v0.GetCurrentQuorumsInfoResponse = (function() { + + /** + * Properties of a GetCurrentQuorumsInfoResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetCurrentQuorumsInfoResponse + * @property {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.IGetCurrentQuorumsInfoResponseV0|null} [v0] GetCurrentQuorumsInfoResponse v0 + */ + + /** + * Constructs a new GetCurrentQuorumsInfoResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetCurrentQuorumsInfoResponse. + * @implements IGetCurrentQuorumsInfoResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetCurrentQuorumsInfoResponse=} [properties] Properties to set + */ + function GetCurrentQuorumsInfoResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetCurrentQuorumsInfoResponse v0. + * @member {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.IGetCurrentQuorumsInfoResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse + * @instance + */ + GetCurrentQuorumsInfoResponse.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetCurrentQuorumsInfoResponse version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse + * @instance + */ + Object.defineProperty(GetCurrentQuorumsInfoResponse.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetCurrentQuorumsInfoResponse instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetCurrentQuorumsInfoResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} GetCurrentQuorumsInfoResponse instance + */ + GetCurrentQuorumsInfoResponse.create = function create(properties) { + return new GetCurrentQuorumsInfoResponse(properties); + }; + + /** + * Encodes the specified GetCurrentQuorumsInfoResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetCurrentQuorumsInfoResponse} message GetCurrentQuorumsInfoResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetCurrentQuorumsInfoResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetCurrentQuorumsInfoResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetCurrentQuorumsInfoResponse} message GetCurrentQuorumsInfoResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetCurrentQuorumsInfoResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetCurrentQuorumsInfoResponse message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} GetCurrentQuorumsInfoResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetCurrentQuorumsInfoResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetCurrentQuorumsInfoResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} GetCurrentQuorumsInfoResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetCurrentQuorumsInfoResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetCurrentQuorumsInfoResponse message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetCurrentQuorumsInfoResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetCurrentQuorumsInfoResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} GetCurrentQuorumsInfoResponse + */ + GetCurrentQuorumsInfoResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetCurrentQuorumsInfoResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse + * @static + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} message GetCurrentQuorumsInfoResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetCurrentQuorumsInfoResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetCurrentQuorumsInfoResponse to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse + * @instance + * @returns {Object.} JSON object + */ + GetCurrentQuorumsInfoResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetCurrentQuorumsInfoResponse.ValidatorV0 = (function() { + + /** + * Properties of a ValidatorV0. + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse + * @interface IValidatorV0 + * @property {Uint8Array|null} [proTxHash] ValidatorV0 proTxHash + * @property {string|null} [nodeIp] ValidatorV0 nodeIp + * @property {boolean|null} [isBanned] ValidatorV0 isBanned + */ + + /** + * Constructs a new ValidatorV0. + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse + * @classdesc Represents a ValidatorV0. + * @implements IValidatorV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.IValidatorV0=} [properties] Properties to set + */ + function ValidatorV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ValidatorV0 proTxHash. + * @member {Uint8Array} proTxHash + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0 + * @instance + */ + ValidatorV0.prototype.proTxHash = $util.newBuffer([]); + + /** + * ValidatorV0 nodeIp. + * @member {string} nodeIp + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0 + * @instance + */ + ValidatorV0.prototype.nodeIp = ""; + + /** + * ValidatorV0 isBanned. + * @member {boolean} isBanned + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0 + * @instance + */ + ValidatorV0.prototype.isBanned = false; + + /** + * Creates a new ValidatorV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0 + * @static + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.IValidatorV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} ValidatorV0 instance + */ + ValidatorV0.create = function create(properties) { + return new ValidatorV0(properties); + }; + + /** + * Encodes the specified ValidatorV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0 + * @static + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.IValidatorV0} message ValidatorV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ValidatorV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.proTxHash != null && Object.hasOwnProperty.call(message, "proTxHash")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.proTxHash); + if (message.nodeIp != null && Object.hasOwnProperty.call(message, "nodeIp")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.nodeIp); + if (message.isBanned != null && Object.hasOwnProperty.call(message, "isBanned")) + writer.uint32(/* id 3, wireType 0 =*/24).bool(message.isBanned); + return writer; + }; + + /** + * Encodes the specified ValidatorV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0 + * @static + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.IValidatorV0} message ValidatorV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ValidatorV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ValidatorV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} ValidatorV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ValidatorV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.proTxHash = reader.bytes(); + break; + case 2: + message.nodeIp = reader.string(); + break; + case 3: + message.isBanned = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ValidatorV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} ValidatorV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ValidatorV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ValidatorV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0 + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ValidatorV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.proTxHash != null && message.hasOwnProperty("proTxHash")) + if (!(message.proTxHash && typeof message.proTxHash.length === "number" || $util.isString(message.proTxHash))) + return "proTxHash: buffer expected"; + if (message.nodeIp != null && message.hasOwnProperty("nodeIp")) + if (!$util.isString(message.nodeIp)) + return "nodeIp: string expected"; + if (message.isBanned != null && message.hasOwnProperty("isBanned")) + if (typeof message.isBanned !== "boolean") + return "isBanned: boolean expected"; + return null; + }; + + /** + * Creates a ValidatorV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0 + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} ValidatorV0 + */ + ValidatorV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0(); + if (object.proTxHash != null) + if (typeof object.proTxHash === "string") + $util.base64.decode(object.proTxHash, message.proTxHash = $util.newBuffer($util.base64.length(object.proTxHash)), 0); + else if (object.proTxHash.length >= 0) + message.proTxHash = object.proTxHash; + if (object.nodeIp != null) + message.nodeIp = String(object.nodeIp); + if (object.isBanned != null) + message.isBanned = Boolean(object.isBanned); + return message; + }; + + /** + * Creates a plain object from a ValidatorV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0 + * @static + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} message ValidatorV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ValidatorV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.proTxHash = ""; + else { + object.proTxHash = []; + if (options.bytes !== Array) + object.proTxHash = $util.newBuffer(object.proTxHash); + } + object.nodeIp = ""; + object.isBanned = false; + } + if (message.proTxHash != null && message.hasOwnProperty("proTxHash")) + object.proTxHash = options.bytes === String ? $util.base64.encode(message.proTxHash, 0, message.proTxHash.length) : options.bytes === Array ? Array.prototype.slice.call(message.proTxHash) : message.proTxHash; + if (message.nodeIp != null && message.hasOwnProperty("nodeIp")) + object.nodeIp = message.nodeIp; + if (message.isBanned != null && message.hasOwnProperty("isBanned")) + object.isBanned = message.isBanned; + return object; + }; + + /** + * Converts this ValidatorV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0 + * @instance + * @returns {Object.} JSON object + */ + ValidatorV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ValidatorV0; + })(); + + GetCurrentQuorumsInfoResponse.ValidatorSetV0 = (function() { + + /** + * Properties of a ValidatorSetV0. + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse + * @interface IValidatorSetV0 + * @property {Uint8Array|null} [quorumHash] ValidatorSetV0 quorumHash + * @property {number|null} [coreHeight] ValidatorSetV0 coreHeight + * @property {Array.|null} [members] ValidatorSetV0 members + * @property {Uint8Array|null} [thresholdPublicKey] ValidatorSetV0 thresholdPublicKey + */ + + /** + * Constructs a new ValidatorSetV0. + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse + * @classdesc Represents a ValidatorSetV0. + * @implements IValidatorSetV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.IValidatorSetV0=} [properties] Properties to set + */ + function ValidatorSetV0(properties) { + this.members = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ValidatorSetV0 quorumHash. + * @member {Uint8Array} quorumHash + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0 + * @instance + */ + ValidatorSetV0.prototype.quorumHash = $util.newBuffer([]); + + /** + * ValidatorSetV0 coreHeight. + * @member {number} coreHeight + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0 + * @instance + */ + ValidatorSetV0.prototype.coreHeight = 0; + + /** + * ValidatorSetV0 members. + * @member {Array.} members + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0 + * @instance + */ + ValidatorSetV0.prototype.members = $util.emptyArray; + + /** + * ValidatorSetV0 thresholdPublicKey. + * @member {Uint8Array} thresholdPublicKey + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0 + * @instance + */ + ValidatorSetV0.prototype.thresholdPublicKey = $util.newBuffer([]); + + /** + * Creates a new ValidatorSetV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0 + * @static + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.IValidatorSetV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} ValidatorSetV0 instance + */ + ValidatorSetV0.create = function create(properties) { + return new ValidatorSetV0(properties); + }; + + /** + * Encodes the specified ValidatorSetV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0 + * @static + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.IValidatorSetV0} message ValidatorSetV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ValidatorSetV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.quorumHash != null && Object.hasOwnProperty.call(message, "quorumHash")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.quorumHash); + if (message.coreHeight != null && Object.hasOwnProperty.call(message, "coreHeight")) + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.coreHeight); + if (message.members != null && message.members.length) + for (var i = 0; i < message.members.length; ++i) + $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.encode(message.members[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.thresholdPublicKey != null && Object.hasOwnProperty.call(message, "thresholdPublicKey")) + writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.thresholdPublicKey); + return writer; + }; + + /** + * Encodes the specified ValidatorSetV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0 + * @static + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.IValidatorSetV0} message ValidatorSetV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ValidatorSetV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ValidatorSetV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} ValidatorSetV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ValidatorSetV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.quorumHash = reader.bytes(); + break; + case 2: + message.coreHeight = reader.uint32(); + break; + case 3: + if (!(message.members && message.members.length)) + message.members = []; + message.members.push($root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.decode(reader, reader.uint32())); + break; + case 4: + message.thresholdPublicKey = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ValidatorSetV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} ValidatorSetV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ValidatorSetV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ValidatorSetV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0 + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ValidatorSetV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.quorumHash != null && message.hasOwnProperty("quorumHash")) + if (!(message.quorumHash && typeof message.quorumHash.length === "number" || $util.isString(message.quorumHash))) + return "quorumHash: buffer expected"; + if (message.coreHeight != null && message.hasOwnProperty("coreHeight")) + if (!$util.isInteger(message.coreHeight)) + return "coreHeight: integer expected"; + if (message.members != null && message.hasOwnProperty("members")) { + if (!Array.isArray(message.members)) + return "members: array expected"; + for (var i = 0; i < message.members.length; ++i) { + var error = $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.verify(message.members[i]); + if (error) + return "members." + error; + } + } + if (message.thresholdPublicKey != null && message.hasOwnProperty("thresholdPublicKey")) + if (!(message.thresholdPublicKey && typeof message.thresholdPublicKey.length === "number" || $util.isString(message.thresholdPublicKey))) + return "thresholdPublicKey: buffer expected"; + return null; + }; + + /** + * Creates a ValidatorSetV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0 + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} ValidatorSetV0 + */ + ValidatorSetV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0(); + if (object.quorumHash != null) + if (typeof object.quorumHash === "string") + $util.base64.decode(object.quorumHash, message.quorumHash = $util.newBuffer($util.base64.length(object.quorumHash)), 0); + else if (object.quorumHash.length >= 0) + message.quorumHash = object.quorumHash; + if (object.coreHeight != null) + message.coreHeight = object.coreHeight >>> 0; + if (object.members) { + if (!Array.isArray(object.members)) + throw TypeError(".org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.members: array expected"); + message.members = []; + for (var i = 0; i < object.members.length; ++i) { + if (typeof object.members[i] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.members: object expected"); + message.members[i] = $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.fromObject(object.members[i]); + } + } + if (object.thresholdPublicKey != null) + if (typeof object.thresholdPublicKey === "string") + $util.base64.decode(object.thresholdPublicKey, message.thresholdPublicKey = $util.newBuffer($util.base64.length(object.thresholdPublicKey)), 0); + else if (object.thresholdPublicKey.length >= 0) + message.thresholdPublicKey = object.thresholdPublicKey; + return message; + }; + + /** + * Creates a plain object from a ValidatorSetV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0 + * @static + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} message ValidatorSetV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ValidatorSetV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.members = []; + if (options.defaults) { + if (options.bytes === String) + object.quorumHash = ""; + else { + object.quorumHash = []; + if (options.bytes !== Array) + object.quorumHash = $util.newBuffer(object.quorumHash); + } + object.coreHeight = 0; + if (options.bytes === String) + object.thresholdPublicKey = ""; + else { + object.thresholdPublicKey = []; + if (options.bytes !== Array) + object.thresholdPublicKey = $util.newBuffer(object.thresholdPublicKey); + } + } + if (message.quorumHash != null && message.hasOwnProperty("quorumHash")) + object.quorumHash = options.bytes === String ? $util.base64.encode(message.quorumHash, 0, message.quorumHash.length) : options.bytes === Array ? Array.prototype.slice.call(message.quorumHash) : message.quorumHash; + if (message.coreHeight != null && message.hasOwnProperty("coreHeight")) + object.coreHeight = message.coreHeight; + if (message.members && message.members.length) { + object.members = []; + for (var j = 0; j < message.members.length; ++j) + object.members[j] = $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.toObject(message.members[j], options); + } + if (message.thresholdPublicKey != null && message.hasOwnProperty("thresholdPublicKey")) + object.thresholdPublicKey = options.bytes === String ? $util.base64.encode(message.thresholdPublicKey, 0, message.thresholdPublicKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.thresholdPublicKey) : message.thresholdPublicKey; + return object; + }; + + /** + * Converts this ValidatorSetV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0 + * @instance + * @returns {Object.} JSON object + */ + ValidatorSetV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ValidatorSetV0; + })(); + + GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0 = (function() { + + /** + * Properties of a GetCurrentQuorumsInfoResponseV0. + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse + * @interface IGetCurrentQuorumsInfoResponseV0 + * @property {Array.|null} [quorumHashes] GetCurrentQuorumsInfoResponseV0 quorumHashes + * @property {Uint8Array|null} [currentQuorumHash] GetCurrentQuorumsInfoResponseV0 currentQuorumHash + * @property {Array.|null} [validatorSets] GetCurrentQuorumsInfoResponseV0 validatorSets + * @property {Uint8Array|null} [lastBlockProposer] GetCurrentQuorumsInfoResponseV0 lastBlockProposer + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetCurrentQuorumsInfoResponseV0 metadata + */ + + /** + * Constructs a new GetCurrentQuorumsInfoResponseV0. + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse + * @classdesc Represents a GetCurrentQuorumsInfoResponseV0. + * @implements IGetCurrentQuorumsInfoResponseV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.IGetCurrentQuorumsInfoResponseV0=} [properties] Properties to set + */ + function GetCurrentQuorumsInfoResponseV0(properties) { + this.quorumHashes = []; + this.validatorSets = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetCurrentQuorumsInfoResponseV0 quorumHashes. + * @member {Array.} quorumHashes + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0 + * @instance + */ + GetCurrentQuorumsInfoResponseV0.prototype.quorumHashes = $util.emptyArray; + + /** + * GetCurrentQuorumsInfoResponseV0 currentQuorumHash. + * @member {Uint8Array} currentQuorumHash + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0 + * @instance + */ + GetCurrentQuorumsInfoResponseV0.prototype.currentQuorumHash = $util.newBuffer([]); + + /** + * GetCurrentQuorumsInfoResponseV0 validatorSets. + * @member {Array.} validatorSets + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0 + * @instance + */ + GetCurrentQuorumsInfoResponseV0.prototype.validatorSets = $util.emptyArray; + + /** + * GetCurrentQuorumsInfoResponseV0 lastBlockProposer. + * @member {Uint8Array} lastBlockProposer + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0 + * @instance + */ + GetCurrentQuorumsInfoResponseV0.prototype.lastBlockProposer = $util.newBuffer([]); + + /** + * GetCurrentQuorumsInfoResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0 + * @instance + */ + GetCurrentQuorumsInfoResponseV0.prototype.metadata = null; + + /** + * Creates a new GetCurrentQuorumsInfoResponseV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.IGetCurrentQuorumsInfoResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} GetCurrentQuorumsInfoResponseV0 instance + */ + GetCurrentQuorumsInfoResponseV0.create = function create(properties) { + return new GetCurrentQuorumsInfoResponseV0(properties); + }; + + /** + * Encodes the specified GetCurrentQuorumsInfoResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.IGetCurrentQuorumsInfoResponseV0} message GetCurrentQuorumsInfoResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetCurrentQuorumsInfoResponseV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.quorumHashes != null && message.quorumHashes.length) + for (var i = 0; i < message.quorumHashes.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.quorumHashes[i]); + if (message.currentQuorumHash != null && Object.hasOwnProperty.call(message, "currentQuorumHash")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.currentQuorumHash); + if (message.validatorSets != null && message.validatorSets.length) + for (var i = 0; i < message.validatorSets.length; ++i) + $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.encode(message.validatorSets[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.lastBlockProposer != null && Object.hasOwnProperty.call(message, "lastBlockProposer")) + writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.lastBlockProposer); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetCurrentQuorumsInfoResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.IGetCurrentQuorumsInfoResponseV0} message GetCurrentQuorumsInfoResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetCurrentQuorumsInfoResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetCurrentQuorumsInfoResponseV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} GetCurrentQuorumsInfoResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetCurrentQuorumsInfoResponseV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.quorumHashes && message.quorumHashes.length)) + message.quorumHashes = []; + message.quorumHashes.push(reader.bytes()); + break; + case 2: + message.currentQuorumHash = reader.bytes(); + break; + case 3: + if (!(message.validatorSets && message.validatorSets.length)) + message.validatorSets = []; + message.validatorSets.push($root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.decode(reader, reader.uint32())); + break; + case 4: + message.lastBlockProposer = reader.bytes(); + break; + case 5: + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetCurrentQuorumsInfoResponseV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} GetCurrentQuorumsInfoResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetCurrentQuorumsInfoResponseV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetCurrentQuorumsInfoResponseV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0 + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetCurrentQuorumsInfoResponseV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.quorumHashes != null && message.hasOwnProperty("quorumHashes")) { + if (!Array.isArray(message.quorumHashes)) + return "quorumHashes: array expected"; + for (var i = 0; i < message.quorumHashes.length; ++i) + if (!(message.quorumHashes[i] && typeof message.quorumHashes[i].length === "number" || $util.isString(message.quorumHashes[i]))) + return "quorumHashes: buffer[] expected"; + } + if (message.currentQuorumHash != null && message.hasOwnProperty("currentQuorumHash")) + if (!(message.currentQuorumHash && typeof message.currentQuorumHash.length === "number" || $util.isString(message.currentQuorumHash))) + return "currentQuorumHash: buffer expected"; + if (message.validatorSets != null && message.hasOwnProperty("validatorSets")) { + if (!Array.isArray(message.validatorSets)) + return "validatorSets: array expected"; + for (var i = 0; i < message.validatorSets.length; ++i) { + var error = $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.verify(message.validatorSets[i]); + if (error) + return "validatorSets." + error; + } + } + if (message.lastBlockProposer != null && message.hasOwnProperty("lastBlockProposer")) + if (!(message.lastBlockProposer && typeof message.lastBlockProposer.length === "number" || $util.isString(message.lastBlockProposer))) + return "lastBlockProposer: buffer expected"; + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (error) + return "metadata." + error; + } + return null; + }; + + /** + * Creates a GetCurrentQuorumsInfoResponseV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0 + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} GetCurrentQuorumsInfoResponseV0 + */ + GetCurrentQuorumsInfoResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0(); + if (object.quorumHashes) { + if (!Array.isArray(object.quorumHashes)) + throw TypeError(".org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.quorumHashes: array expected"); + message.quorumHashes = []; + for (var i = 0; i < object.quorumHashes.length; ++i) + if (typeof object.quorumHashes[i] === "string") + $util.base64.decode(object.quorumHashes[i], message.quorumHashes[i] = $util.newBuffer($util.base64.length(object.quorumHashes[i])), 0); + else if (object.quorumHashes[i].length >= 0) + message.quorumHashes[i] = object.quorumHashes[i]; + } + if (object.currentQuorumHash != null) + if (typeof object.currentQuorumHash === "string") + $util.base64.decode(object.currentQuorumHash, message.currentQuorumHash = $util.newBuffer($util.base64.length(object.currentQuorumHash)), 0); + else if (object.currentQuorumHash.length >= 0) + message.currentQuorumHash = object.currentQuorumHash; + if (object.validatorSets) { + if (!Array.isArray(object.validatorSets)) + throw TypeError(".org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.validatorSets: array expected"); + message.validatorSets = []; + for (var i = 0; i < object.validatorSets.length; ++i) { + if (typeof object.validatorSets[i] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.validatorSets: object expected"); + message.validatorSets[i] = $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.fromObject(object.validatorSets[i]); + } + } + if (object.lastBlockProposer != null) + if (typeof object.lastBlockProposer === "string") + $util.base64.decode(object.lastBlockProposer, message.lastBlockProposer = $util.newBuffer($util.base64.length(object.lastBlockProposer)), 0); + else if (object.lastBlockProposer.length >= 0) + message.lastBlockProposer = object.lastBlockProposer; + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + } + return message; + }; + + /** + * Creates a plain object from a GetCurrentQuorumsInfoResponseV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} message GetCurrentQuorumsInfoResponseV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetCurrentQuorumsInfoResponseV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) { + object.quorumHashes = []; + object.validatorSets = []; + } + if (options.defaults) { + if (options.bytes === String) + object.currentQuorumHash = ""; + else { + object.currentQuorumHash = []; + if (options.bytes !== Array) + object.currentQuorumHash = $util.newBuffer(object.currentQuorumHash); + } + if (options.bytes === String) + object.lastBlockProposer = ""; + else { + object.lastBlockProposer = []; + if (options.bytes !== Array) + object.lastBlockProposer = $util.newBuffer(object.lastBlockProposer); + } + object.metadata = null; + } + if (message.quorumHashes && message.quorumHashes.length) { + object.quorumHashes = []; + for (var j = 0; j < message.quorumHashes.length; ++j) + object.quorumHashes[j] = options.bytes === String ? $util.base64.encode(message.quorumHashes[j], 0, message.quorumHashes[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.quorumHashes[j]) : message.quorumHashes[j]; + } + if (message.currentQuorumHash != null && message.hasOwnProperty("currentQuorumHash")) + object.currentQuorumHash = options.bytes === String ? $util.base64.encode(message.currentQuorumHash, 0, message.currentQuorumHash.length) : options.bytes === Array ? Array.prototype.slice.call(message.currentQuorumHash) : message.currentQuorumHash; + if (message.validatorSets && message.validatorSets.length) { + object.validatorSets = []; + for (var j = 0; j < message.validatorSets.length; ++j) + object.validatorSets[j] = $root.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.toObject(message.validatorSets[j], options); + } + if (message.lastBlockProposer != null && message.hasOwnProperty("lastBlockProposer")) + object.lastBlockProposer = options.bytes === String ? $util.base64.encode(message.lastBlockProposer, 0, message.lastBlockProposer.length) : options.bytes === Array ? Array.prototype.slice.call(message.lastBlockProposer) : message.lastBlockProposer; + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + return object; + }; + + /** + * Converts this GetCurrentQuorumsInfoResponseV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0 + * @instance + * @returns {Object.} JSON object + */ + GetCurrentQuorumsInfoResponseV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GetCurrentQuorumsInfoResponseV0; + })(); + + return GetCurrentQuorumsInfoResponse; + })(); + return v0; })(); diff --git a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js index 5f0abd5da9..ca80ce2ad7 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js @@ -75,6 +75,14 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ResultCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.VersionCase', null, { proto }); @@ -4122,6 +4130,132 @@ if (goog.DEBUG && !COMPILED) { */ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.displayName = 'proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.displayName = 'proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.displayName = 'proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0'; +} @@ -44031,6 +44165,1363 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.hasV0 = function() { }; + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + +/** + * optional GetCurrentQuorumsInfoRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.toObject = function(includeInstance, msg) { + var f, obj = { + proTxHash: msg.getProTxHash_asB64(), + nodeIp: jspb.Message.getFieldWithDefault(msg, 2, ""), + isBanned: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setProTxHash(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setNodeIp(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setIsBanned(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getProTxHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getNodeIp(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getIsBanned(); + if (f) { + writer.writeBool( + 3, + f + ); + } +}; + + +/** + * optional bytes pro_tx_hash = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getProTxHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes pro_tx_hash = 1; + * This is a type-conversion wrapper around `getProTxHash()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getProTxHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getProTxHash())); +}; + + +/** + * optional bytes pro_tx_hash = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getProTxHash()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getProTxHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getProTxHash())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.setProTxHash = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional string node_ip = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getNodeIp = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.setNodeIp = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional bool is_banned = 3; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getIsBanned = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.setIsBanned = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.repeatedFields_ = [3]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.toObject = function(includeInstance, msg) { + var f, obj = { + quorumHash: msg.getQuorumHash_asB64(), + coreHeight: jspb.Message.getFieldWithDefault(msg, 2, 0), + membersList: jspb.Message.toObjectList(msg.getMembersList(), + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.toObject, includeInstance), + thresholdPublicKey: msg.getThresholdPublicKey_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setQuorumHash(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCoreHeight(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinaryFromReader); + msg.addMembers(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setThresholdPublicKey(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getQuorumHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getCoreHeight(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } + f = message.getMembersList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.serializeBinaryToWriter + ); + } + f = message.getThresholdPublicKey_asU8(); + if (f.length > 0) { + writer.writeBytes( + 4, + f + ); + } +}; + + +/** + * optional bytes quorum_hash = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getQuorumHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes quorum_hash = 1; + * This is a type-conversion wrapper around `getQuorumHash()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getQuorumHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getQuorumHash())); +}; + + +/** + * optional bytes quorum_hash = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getQuorumHash()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getQuorumHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getQuorumHash())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setQuorumHash = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional uint32 core_height = 2; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getCoreHeight = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setCoreHeight = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + +/** + * repeated ValidatorV0 members = 3; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getMembersList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0, 3)); +}; + + +/** + * @param {!Array} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setMembersList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 3, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.addMembers = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.clearMembersList = function() { + return this.setMembersList([]); +}; + + +/** + * optional bytes threshold_public_key = 4; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getThresholdPublicKey = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * optional bytes threshold_public_key = 4; + * This is a type-conversion wrapper around `getThresholdPublicKey()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getThresholdPublicKey_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getThresholdPublicKey())); +}; + + +/** + * optional bytes threshold_public_key = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getThresholdPublicKey()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getThresholdPublicKey_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getThresholdPublicKey())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setThresholdPublicKey = function(value) { + return jspb.Message.setProto3BytesField(this, 4, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.repeatedFields_ = [1,3]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + quorumHashesList: msg.getQuorumHashesList_asB64(), + currentQuorumHash: msg.getCurrentQuorumHash_asB64(), + validatorSetsList: jspb.Message.toObjectList(msg.getValidatorSetsList(), + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.toObject, includeInstance), + lastBlockProposer: msg.getLastBlockProposer_asB64(), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addQuorumHashes(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setCurrentQuorumHash(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinaryFromReader); + msg.addValidatorSets(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setLastBlockProposer(value); + break; + case 5: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getQuorumHashesList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } + f = message.getCurrentQuorumHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } + f = message.getValidatorSetsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.serializeBinaryToWriter + ); + } + f = message.getLastBlockProposer_asU8(); + if (f.length > 0) { + writer.writeBytes( + 4, + f + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 5, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated bytes quorum_hashes = 1; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getQuorumHashesList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes quorum_hashes = 1; + * This is a type-conversion wrapper around `getQuorumHashesList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getQuorumHashesList_asB64 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsB64( + this.getQuorumHashesList())); +}; + + +/** + * repeated bytes quorum_hashes = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getQuorumHashesList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getQuorumHashesList_asU8 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsU8( + this.getQuorumHashesList())); +}; + + +/** + * @param {!(Array|Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setQuorumHashesList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.addQuorumHashes = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.clearQuorumHashesList = function() { + return this.setQuorumHashesList([]); +}; + + +/** + * optional bytes current_quorum_hash = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getCurrentQuorumHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes current_quorum_hash = 2; + * This is a type-conversion wrapper around `getCurrentQuorumHash()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getCurrentQuorumHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getCurrentQuorumHash())); +}; + + +/** + * optional bytes current_quorum_hash = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getCurrentQuorumHash()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getCurrentQuorumHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getCurrentQuorumHash())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setCurrentQuorumHash = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +/** + * repeated ValidatorSetV0 validator_sets = 3; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getValidatorSetsList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0, 3)); +}; + + +/** + * @param {!Array} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setValidatorSetsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 3, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.addValidatorSets = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.clearValidatorSetsList = function() { + return this.setValidatorSetsList([]); +}; + + +/** + * optional bytes last_block_proposer = 4; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getLastBlockProposer = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * optional bytes last_block_proposer = 4; + * This is a type-conversion wrapper around `getLastBlockProposer()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getLastBlockProposer_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getLastBlockProposer())); +}; + + +/** + * optional bytes last_block_proposer = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getLastBlockProposer()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getLastBlockProposer_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getLastBlockProposer())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setLastBlockProposer = function(value) { + return jspb.Message.setProto3BytesField(this, 4, value); +}; + + +/** + * optional ResponseMetadata metadata = 5; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 5)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 5, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 5) != null; +}; + + +/** + * optional GetCurrentQuorumsInfoResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + /** * @enum {number} */ diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h index 02c1eb42a8..bafa69fcb7 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h @@ -54,6 +54,10 @@ CF_EXTERN_C_BEGIN @class GetContestedResourcesRequest_GetContestedResourcesRequestV0_StartAtValueInfo; @class GetContestedResourcesResponse_GetContestedResourcesResponseV0; @class GetContestedResourcesResponse_GetContestedResourcesResponseV0_ContestedResourceValues; +@class GetCurrentQuorumsInfoRequest_GetCurrentQuorumsInfoRequestV0; +@class GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0; +@class GetCurrentQuorumsInfoResponse_ValidatorSetV0; +@class GetCurrentQuorumsInfoResponse_ValidatorV0; @class GetDataContractHistoryRequest_GetDataContractHistoryRequestV0; @class GetDataContractHistoryResponse_GetDataContractHistoryResponseV0; @class GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistory; @@ -4833,6 +4837,131 @@ GPB_FINAL @interface GetStatusResponse_GetStatusResponseV0_StateSync : GPBMessag @end +#pragma mark - GetCurrentQuorumsInfoRequest + +typedef GPB_ENUM(GetCurrentQuorumsInfoRequest_FieldNumber) { + GetCurrentQuorumsInfoRequest_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetCurrentQuorumsInfoRequest_Version_OneOfCase) { + GetCurrentQuorumsInfoRequest_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetCurrentQuorumsInfoRequest_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetCurrentQuorumsInfoRequest : GPBMessage + +@property(nonatomic, readonly) GetCurrentQuorumsInfoRequest_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetCurrentQuorumsInfoRequest_GetCurrentQuorumsInfoRequestV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetCurrentQuorumsInfoRequest_ClearVersionOneOfCase(GetCurrentQuorumsInfoRequest *message); + +#pragma mark - GetCurrentQuorumsInfoRequest_GetCurrentQuorumsInfoRequestV0 + +GPB_FINAL @interface GetCurrentQuorumsInfoRequest_GetCurrentQuorumsInfoRequestV0 : GPBMessage + +@end + +#pragma mark - GetCurrentQuorumsInfoResponse + +typedef GPB_ENUM(GetCurrentQuorumsInfoResponse_FieldNumber) { + GetCurrentQuorumsInfoResponse_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetCurrentQuorumsInfoResponse_Version_OneOfCase) { + GetCurrentQuorumsInfoResponse_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetCurrentQuorumsInfoResponse_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetCurrentQuorumsInfoResponse : GPBMessage + +@property(nonatomic, readonly) GetCurrentQuorumsInfoResponse_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetCurrentQuorumsInfoResponse_ClearVersionOneOfCase(GetCurrentQuorumsInfoResponse *message); + +#pragma mark - GetCurrentQuorumsInfoResponse_ValidatorV0 + +typedef GPB_ENUM(GetCurrentQuorumsInfoResponse_ValidatorV0_FieldNumber) { + GetCurrentQuorumsInfoResponse_ValidatorV0_FieldNumber_ProTxHash = 1, + GetCurrentQuorumsInfoResponse_ValidatorV0_FieldNumber_NodeIp = 2, + GetCurrentQuorumsInfoResponse_ValidatorV0_FieldNumber_IsBanned = 3, +}; + +GPB_FINAL @interface GetCurrentQuorumsInfoResponse_ValidatorV0 : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *proTxHash; + +@property(nonatomic, readwrite, copy, null_resettable) NSString *nodeIp; + +@property(nonatomic, readwrite) BOOL isBanned; + +@end + +#pragma mark - GetCurrentQuorumsInfoResponse_ValidatorSetV0 + +typedef GPB_ENUM(GetCurrentQuorumsInfoResponse_ValidatorSetV0_FieldNumber) { + GetCurrentQuorumsInfoResponse_ValidatorSetV0_FieldNumber_QuorumHash = 1, + GetCurrentQuorumsInfoResponse_ValidatorSetV0_FieldNumber_CoreHeight = 2, + GetCurrentQuorumsInfoResponse_ValidatorSetV0_FieldNumber_MembersArray = 3, + GetCurrentQuorumsInfoResponse_ValidatorSetV0_FieldNumber_ThresholdPublicKey = 4, +}; + +GPB_FINAL @interface GetCurrentQuorumsInfoResponse_ValidatorSetV0 : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *quorumHash; + +@property(nonatomic, readwrite) uint32_t coreHeight; + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *membersArray; +/** The number of items in @c membersArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger membersArray_Count; + +@property(nonatomic, readwrite, copy, null_resettable) NSData *thresholdPublicKey; + +@end + +#pragma mark - GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0 + +typedef GPB_ENUM(GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0_FieldNumber) { + GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0_FieldNumber_QuorumHashesArray = 1, + GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0_FieldNumber_CurrentQuorumHash = 2, + GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0_FieldNumber_ValidatorSetsArray = 3, + GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0_FieldNumber_LastBlockProposer = 4, + GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0_FieldNumber_Metadata = 5, +}; + +GPB_FINAL @interface GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0 : GPBMessage + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *quorumHashesArray; +/** The number of items in @c quorumHashesArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger quorumHashesArray_Count; + +@property(nonatomic, readwrite, copy, null_resettable) NSData *currentQuorumHash; + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *validatorSetsArray; +/** The number of items in @c validatorSetsArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger validatorSetsArray_Count; + +@property(nonatomic, readwrite, copy, null_resettable) NSData *lastBlockProposer; + +@property(nonatomic, readwrite, strong, null_resettable) ResponseMetadata *metadata; +/** Test to see if @c metadata has been set. */ +@property(nonatomic, readwrite) BOOL hasMetadata; + +@end + NS_ASSUME_NONNULL_END CF_EXTERN_C_END diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m index 72e1a8f4a2..e0bff0f273 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m @@ -64,6 +64,12 @@ GPBObjCClassDeclaration(GetContestedResourcesResponse); GPBObjCClassDeclaration(GetContestedResourcesResponse_GetContestedResourcesResponseV0); GPBObjCClassDeclaration(GetContestedResourcesResponse_GetContestedResourcesResponseV0_ContestedResourceValues); +GPBObjCClassDeclaration(GetCurrentQuorumsInfoRequest); +GPBObjCClassDeclaration(GetCurrentQuorumsInfoRequest_GetCurrentQuorumsInfoRequestV0); +GPBObjCClassDeclaration(GetCurrentQuorumsInfoResponse); +GPBObjCClassDeclaration(GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0); +GPBObjCClassDeclaration(GetCurrentQuorumsInfoResponse_ValidatorSetV0); +GPBObjCClassDeclaration(GetCurrentQuorumsInfoResponse_ValidatorV0); GPBObjCClassDeclaration(GetDataContractHistoryRequest); GPBObjCClassDeclaration(GetDataContractHistoryRequest_GetDataContractHistoryRequestV0); GPBObjCClassDeclaration(GetDataContractHistoryResponse); @@ -12437,6 +12443,389 @@ + (GPBDescriptor *)descriptor { @end +#pragma mark - GetCurrentQuorumsInfoRequest + +@implementation GetCurrentQuorumsInfoRequest + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetCurrentQuorumsInfoRequest__storage_ { + uint32_t _has_storage_[2]; + GetCurrentQuorumsInfoRequest_GetCurrentQuorumsInfoRequestV0 *v0; +} GetCurrentQuorumsInfoRequest__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetCurrentQuorumsInfoRequest_GetCurrentQuorumsInfoRequestV0), + .number = GetCurrentQuorumsInfoRequest_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetCurrentQuorumsInfoRequest__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetCurrentQuorumsInfoRequest class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetCurrentQuorumsInfoRequest__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetCurrentQuorumsInfoRequest_ClearVersionOneOfCase(GetCurrentQuorumsInfoRequest *message) { + GPBDescriptor *descriptor = [GetCurrentQuorumsInfoRequest descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetCurrentQuorumsInfoRequest_GetCurrentQuorumsInfoRequestV0 + +@implementation GetCurrentQuorumsInfoRequest_GetCurrentQuorumsInfoRequestV0 + + +typedef struct GetCurrentQuorumsInfoRequest_GetCurrentQuorumsInfoRequestV0__storage_ { + uint32_t _has_storage_[1]; +} GetCurrentQuorumsInfoRequest_GetCurrentQuorumsInfoRequestV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetCurrentQuorumsInfoRequest_GetCurrentQuorumsInfoRequestV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:NULL + fieldCount:0 + storageSize:sizeof(GetCurrentQuorumsInfoRequest_GetCurrentQuorumsInfoRequestV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetCurrentQuorumsInfoRequest)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetCurrentQuorumsInfoResponse + +@implementation GetCurrentQuorumsInfoResponse + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetCurrentQuorumsInfoResponse__storage_ { + uint32_t _has_storage_[2]; + GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0 *v0; +} GetCurrentQuorumsInfoResponse__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0), + .number = GetCurrentQuorumsInfoResponse_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetCurrentQuorumsInfoResponse__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetCurrentQuorumsInfoResponse class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetCurrentQuorumsInfoResponse__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetCurrentQuorumsInfoResponse_ClearVersionOneOfCase(GetCurrentQuorumsInfoResponse *message) { + GPBDescriptor *descriptor = [GetCurrentQuorumsInfoResponse descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetCurrentQuorumsInfoResponse_ValidatorV0 + +@implementation GetCurrentQuorumsInfoResponse_ValidatorV0 + +@dynamic proTxHash; +@dynamic nodeIp; +@dynamic isBanned; + +typedef struct GetCurrentQuorumsInfoResponse_ValidatorV0__storage_ { + uint32_t _has_storage_[1]; + NSData *proTxHash; + NSString *nodeIp; +} GetCurrentQuorumsInfoResponse_ValidatorV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "proTxHash", + .dataTypeSpecific.clazz = Nil, + .number = GetCurrentQuorumsInfoResponse_ValidatorV0_FieldNumber_ProTxHash, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetCurrentQuorumsInfoResponse_ValidatorV0__storage_, proTxHash), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "nodeIp", + .dataTypeSpecific.clazz = Nil, + .number = GetCurrentQuorumsInfoResponse_ValidatorV0_FieldNumber_NodeIp, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetCurrentQuorumsInfoResponse_ValidatorV0__storage_, nodeIp), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeString, + }, + { + .name = "isBanned", + .dataTypeSpecific.clazz = Nil, + .number = GetCurrentQuorumsInfoResponse_ValidatorV0_FieldNumber_IsBanned, + .hasIndex = 2, + .offset = 3, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetCurrentQuorumsInfoResponse_ValidatorV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetCurrentQuorumsInfoResponse_ValidatorV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetCurrentQuorumsInfoResponse)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetCurrentQuorumsInfoResponse_ValidatorSetV0 + +@implementation GetCurrentQuorumsInfoResponse_ValidatorSetV0 + +@dynamic quorumHash; +@dynamic coreHeight; +@dynamic membersArray, membersArray_Count; +@dynamic thresholdPublicKey; + +typedef struct GetCurrentQuorumsInfoResponse_ValidatorSetV0__storage_ { + uint32_t _has_storage_[1]; + uint32_t coreHeight; + NSData *quorumHash; + NSMutableArray *membersArray; + NSData *thresholdPublicKey; +} GetCurrentQuorumsInfoResponse_ValidatorSetV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "quorumHash", + .dataTypeSpecific.clazz = Nil, + .number = GetCurrentQuorumsInfoResponse_ValidatorSetV0_FieldNumber_QuorumHash, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetCurrentQuorumsInfoResponse_ValidatorSetV0__storage_, quorumHash), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "coreHeight", + .dataTypeSpecific.clazz = Nil, + .number = GetCurrentQuorumsInfoResponse_ValidatorSetV0_FieldNumber_CoreHeight, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetCurrentQuorumsInfoResponse_ValidatorSetV0__storage_, coreHeight), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt32, + }, + { + .name = "membersArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetCurrentQuorumsInfoResponse_ValidatorV0), + .number = GetCurrentQuorumsInfoResponse_ValidatorSetV0_FieldNumber_MembersArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetCurrentQuorumsInfoResponse_ValidatorSetV0__storage_, membersArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeMessage, + }, + { + .name = "thresholdPublicKey", + .dataTypeSpecific.clazz = Nil, + .number = GetCurrentQuorumsInfoResponse_ValidatorSetV0_FieldNumber_ThresholdPublicKey, + .hasIndex = 2, + .offset = (uint32_t)offsetof(GetCurrentQuorumsInfoResponse_ValidatorSetV0__storage_, thresholdPublicKey), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetCurrentQuorumsInfoResponse_ValidatorSetV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetCurrentQuorumsInfoResponse_ValidatorSetV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetCurrentQuorumsInfoResponse)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0 + +@implementation GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0 + +@dynamic quorumHashesArray, quorumHashesArray_Count; +@dynamic currentQuorumHash; +@dynamic validatorSetsArray, validatorSetsArray_Count; +@dynamic lastBlockProposer; +@dynamic hasMetadata, metadata; + +typedef struct GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0__storage_ { + uint32_t _has_storage_[1]; + NSMutableArray *quorumHashesArray; + NSData *currentQuorumHash; + NSMutableArray *validatorSetsArray; + NSData *lastBlockProposer; + ResponseMetadata *metadata; +} GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "quorumHashesArray", + .dataTypeSpecific.clazz = Nil, + .number = GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0_FieldNumber_QuorumHashesArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0__storage_, quorumHashesArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeBytes, + }, + { + .name = "currentQuorumHash", + .dataTypeSpecific.clazz = Nil, + .number = GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0_FieldNumber_CurrentQuorumHash, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0__storage_, currentQuorumHash), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "validatorSetsArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetCurrentQuorumsInfoResponse_ValidatorSetV0), + .number = GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0_FieldNumber_ValidatorSetsArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0__storage_, validatorSetsArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeMessage, + }, + { + .name = "lastBlockProposer", + .dataTypeSpecific.clazz = Nil, + .number = GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0_FieldNumber_LastBlockProposer, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0__storage_, lastBlockProposer), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "metadata", + .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), + .number = GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0_FieldNumber_Metadata, + .hasIndex = 2, + .offset = (uint32_t)offsetof(GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0__storage_, metadata), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponseV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetCurrentQuorumsInfoResponse)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + #pragma clang diagnostic pop diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h index fb69ec2af8..9bfcd4ba16 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h @@ -26,6 +26,8 @@ @class GetContestedResourceVotersForIdentityResponse; @class GetContestedResourcesRequest; @class GetContestedResourcesResponse; +@class GetCurrentQuorumsInfoRequest; +@class GetCurrentQuorumsInfoResponse; @class GetDataContractHistoryRequest; @class GetDataContractHistoryResponse; @class GetDataContractRequest; @@ -244,6 +246,10 @@ NS_ASSUME_NONNULL_BEGIN - (GRPCUnaryProtoCall *)getStatusWithMessage:(GetStatusRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; +#pragma mark getCurrentQuorumsInfo(GetCurrentQuorumsInfoRequest) returns (GetCurrentQuorumsInfoResponse) + +- (GRPCUnaryProtoCall *)getCurrentQuorumsInfoWithMessage:(GetCurrentQuorumsInfoRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; + @end /** @@ -519,6 +525,13 @@ NS_ASSUME_NONNULL_BEGIN - (GRPCProtoCall *)RPCTogetStatusWithRequest:(GetStatusRequest *)request handler:(void(^)(GetStatusResponse *_Nullable response, NSError *_Nullable error))handler; +#pragma mark getCurrentQuorumsInfo(GetCurrentQuorumsInfoRequest) returns (GetCurrentQuorumsInfoResponse) + +- (void)getCurrentQuorumsInfoWithRequest:(GetCurrentQuorumsInfoRequest *)request handler:(void(^)(GetCurrentQuorumsInfoResponse *_Nullable response, NSError *_Nullable error))handler; + +- (GRPCProtoCall *)RPCTogetCurrentQuorumsInfoWithRequest:(GetCurrentQuorumsInfoRequest *)request handler:(void(^)(GetCurrentQuorumsInfoResponse *_Nullable response, NSError *_Nullable error))handler; + + @end diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m index df7dcb06e0..b8e6852fe6 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m @@ -755,5 +755,25 @@ - (GRPCUnaryProtoCall *)getStatusWithMessage:(GetStatusRequest *)message respons responseClass:[GetStatusResponse class]]; } +#pragma mark getCurrentQuorumsInfo(GetCurrentQuorumsInfoRequest) returns (GetCurrentQuorumsInfoResponse) + +- (void)getCurrentQuorumsInfoWithRequest:(GetCurrentQuorumsInfoRequest *)request handler:(void(^)(GetCurrentQuorumsInfoResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCTogetCurrentQuorumsInfoWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +- (GRPCProtoCall *)RPCTogetCurrentQuorumsInfoWithRequest:(GetCurrentQuorumsInfoRequest *)request handler:(void(^)(GetCurrentQuorumsInfoResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"getCurrentQuorumsInfo" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GetCurrentQuorumsInfoResponse class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +- (GRPCUnaryProtoCall *)getCurrentQuorumsInfoWithMessage:(GetCurrentQuorumsInfoRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { + return [self RPCToMethod:@"getCurrentQuorumsInfo" + message:message + responseHandler:handler + callOptions:callOptions + responseClass:[GetCurrentQuorumsInfoResponse class]]; +} + @end #endif diff --git a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py index 1725d43f4a..be8a64f309 100644 --- a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py +++ b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py @@ -23,7 +23,7 @@ syntax='proto3', serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x0eplatform.proto\x12\x19org.dash.platform.dapi.v0\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\x81\x01\n\x05Proof\x12\x15\n\rgrovedb_proof\x18\x01 \x01(\x0c\x12\x13\n\x0bquorum_hash\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\x12\r\n\x05round\x18\x04 \x01(\r\x12\x15\n\rblock_id_hash\x18\x05 \x01(\x0c\x12\x13\n\x0bquorum_type\x18\x06 \x01(\r\"\x90\x01\n\x10ResponseMetadata\x12\x0e\n\x06height\x18\x01 \x01(\x04\x12 \n\x18\x63ore_chain_locked_height\x18\x02 \x01(\r\x12\r\n\x05\x65poch\x18\x03 \x01(\r\x12\x0f\n\x07time_ms\x18\x04 \x01(\x04\x12\x18\n\x10protocol_version\x18\x05 \x01(\r\x12\x10\n\x08\x63hain_id\x18\x06 \x01(\t\"L\n\x1dStateTransitionBroadcastError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\";\n\x1f\x42roadcastStateTransitionRequest\x12\x18\n\x10state_transition\x18\x01 \x01(\x0c\"\"\n BroadcastStateTransitionResponse\"\xa4\x01\n\x12GetIdentityRequest\x12P\n\x02v0\x18\x01 \x01(\x0b\x32\x42.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0H\x00\x1a\x31\n\x14GetIdentityRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc1\x01\n\x17GetIdentityNonceRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0H\x00\x1a?\n\x19GetIdentityNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xf6\x01\n\x1fGetIdentityContractNonceRequest\x12j\n\x02v0\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0H\x00\x1a\\\n!GetIdentityContractNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x13\n\x0b\x63ontract_id\x18\x02 \x01(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xc0\x01\n\x19GetIdentityBalanceRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0H\x00\x1a\x38\n\x1bGetIdentityBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xec\x01\n$GetIdentityBalanceAndRevisionRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0H\x00\x1a\x43\n&GetIdentityBalanceAndRevisionRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9e\x02\n\x13GetIdentityResponse\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0H\x00\x1a\xa7\x01\n\x15GetIdentityResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb8\x02\n\x18GetIdentityNonceResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0H\x00\x1a\xb2\x01\n\x1aGetIdentityNonceResponseV0\x12\x18\n\x0eidentity_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xe1\x02\n GetIdentityContractNonceResponse\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0H\x00\x1a\xc3\x01\n\"GetIdentityContractNonceResponseV0\x12!\n\x17identity_contract_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x02\n\x1aGetIdentityBalanceResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0H\x00\x1a\xad\x01\n\x1cGetIdentityBalanceResponseV0\x12\x11\n\x07\x62\x61lance\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xa9\x04\n%GetIdentityBalanceAndRevisionResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0H\x00\x1a\xfc\x02\n\'GetIdentityBalanceAndRevisionResponseV0\x12\x9b\x01\n\x14\x62\x61lance_and_revision\x18\x01 \x01(\x0b\x32{.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevisionH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x12\x42\x61lanceAndRevision\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\x12\x10\n\x08revision\x18\x02 \x01(\x04\x42\x08\n\x06resultB\t\n\x07version\"\xd1\x01\n\x0eKeyRequestType\x12\x36\n\x08\x61ll_keys\x18\x01 \x01(\x0b\x32\".org.dash.platform.dapi.v0.AllKeysH\x00\x12@\n\rspecific_keys\x18\x02 \x01(\x0b\x32\'.org.dash.platform.dapi.v0.SpecificKeysH\x00\x12:\n\nsearch_key\x18\x03 \x01(\x0b\x32$.org.dash.platform.dapi.v0.SearchKeyH\x00\x42\t\n\x07request\"\t\n\x07\x41llKeys\"\x1f\n\x0cSpecificKeys\x12\x0f\n\x07key_ids\x18\x01 \x03(\r\"\xb6\x01\n\tSearchKey\x12I\n\x0bpurpose_map\x18\x01 \x03(\x0b\x32\x34.org.dash.platform.dapi.v0.SearchKey.PurposeMapEntry\x1a^\n\x0fPurposeMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12:\n\x05value\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.SecurityLevelMap:\x02\x38\x01\"\xbf\x02\n\x10SecurityLevelMap\x12]\n\x12security_level_map\x18\x01 \x03(\x0b\x32\x41.org.dash.platform.dapi.v0.SecurityLevelMap.SecurityLevelMapEntry\x1aw\n\x15SecurityLevelMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12M\n\x05value\x18\x02 \x01(\x0e\x32>.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType:\x02\x38\x01\"S\n\x12KeyKindRequestType\x12\x1f\n\x1b\x43URRENT_KEY_OF_KIND_REQUEST\x10\x00\x12\x1c\n\x18\x41LL_KEYS_OF_KIND_REQUEST\x10\x01\"\xda\x02\n\x16GetIdentityKeysRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0H\x00\x1a\xda\x01\n\x18GetIdentityKeysRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12?\n\x0crequest_type\x18\x02 \x01(\x0b\x32).org.dash.platform.dapi.v0.KeyRequestType\x12+\n\x05limit\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\x99\x03\n\x17GetIdentityKeysResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0H\x00\x1a\x96\x02\n\x19GetIdentityKeysResponseV0\x12\x61\n\x04keys\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.KeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1a\n\x04Keys\x12\x12\n\nkeys_bytes\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xef\x02\n GetIdentitiesContractKeysRequest\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0H\x00\x1a\xd1\x01\n\"GetIdentitiesContractKeysRequestV0\x12\x16\n\x0eidentities_ids\x18\x01 \x03(\x0c\x12\x13\n\x0b\x63ontract_id\x18\x02 \x01(\x0c\x12\x1f\n\x12\x64ocument_type_name\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x37\n\x08purposes\x18\x04 \x03(\x0e\x32%.org.dash.platform.dapi.v0.KeyPurpose\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\x15\n\x13_document_type_nameB\t\n\x07version\"\xdf\x06\n!GetIdentitiesContractKeysResponse\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0H\x00\x1a\xbe\x05\n#GetIdentitiesContractKeysResponseV0\x12\x8a\x01\n\x0fidentities_keys\x18\x01 \x01(\x0b\x32o.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1aY\n\x0bPurposeKeys\x12\x36\n\x07purpose\x18\x01 \x01(\x0e\x32%.org.dash.platform.dapi.v0.KeyPurpose\x12\x12\n\nkeys_bytes\x18\x02 \x03(\x0c\x1a\x9f\x01\n\x0cIdentityKeys\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12z\n\x04keys\x18\x02 \x03(\x0b\x32l.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys\x1a\x90\x01\n\x0eIdentitiesKeys\x12~\n\x07\x65ntries\x18\x01 \x03(\x0b\x32m.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeysB\x08\n\x06resultB\t\n\x07version\"\xa4\x02\n*GetEvonodesProposedEpochBlocksByIdsRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0H\x00\x1ah\n,GetEvonodesProposedEpochBlocksByIdsRequestV0\x12\x12\n\x05\x65poch\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x0b\n\x03ids\x18\x02 \x03(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\x08\n\x06_epochB\t\n\x07version\"\x8e\x06\n&GetEvonodesProposedEpochBlocksResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0H\x00\x1a\xde\x04\n(GetEvonodesProposedEpochBlocksResponseV0\x12\xb1\x01\n#evonodes_proposed_block_counts_info\x18\x01 \x01(\x0b\x32\x81\x01.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocksH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a;\n\x15\x45vonodeProposedBlocks\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\x04\x1a\xc4\x01\n\x16\x45vonodesProposedBlocks\x12\xa9\x01\n\x1e\x65vonodes_proposed_block_counts\x18\x01 \x03(\x0b\x32\x80\x01.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocksB\x08\n\x06resultB\t\n\x07version\"\xf2\x02\n,GetEvonodesProposedEpochBlocksByRangeRequest\x12\x84\x01\n\x02v0\x18\x01 \x01(\x0b\x32v.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0H\x00\x1a\xaf\x01\n.GetEvonodesProposedEpochBlocksByRangeRequestV0\x12\x12\n\x05\x65poch\x18\x01 \x01(\rH\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\rH\x02\x88\x01\x01\x12\x15\n\x0bstart_after\x18\x03 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x04 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\x07\n\x05startB\x08\n\x06_epochB\x08\n\x06_limitB\t\n\x07version\"\xcd\x01\n\x1cGetIdentitiesBalancesRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0H\x00\x1a<\n\x1eGetIdentitiesBalancesRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9b\x05\n\x1dGetIdentitiesBalancesResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0H\x00\x1a\x86\x04\n\x1fGetIdentitiesBalancesResponseV0\x12\x8a\x01\n\x13identities_balances\x18\x01 \x01(\x0b\x32k.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalancesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1aH\n\x0fIdentityBalance\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x14\n\x07\x62\x61lance\x18\x02 \x01(\x04H\x00\x88\x01\x01\x42\n\n\x08_balance\x1a\x8f\x01\n\x12IdentitiesBalances\x12y\n\x07\x65ntries\x18\x01 \x03(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalanceB\x08\n\x06resultB\t\n\x07version\"\xcb\x0b\n\x10GetProofsRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0H\x00\x1a\xdd\n\n\x12GetProofsRequestV0\x12\x62\n\nidentities\x18\x01 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest\x12\x61\n\tcontracts\x18\x02 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest\x12\x61\n\tdocuments\x18\x03 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest\x12_\n\x05votes\x18\x04 \x03(\x0b\x32P.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest\x1a\xd5\x02\n\x0f\x44ocumentRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12#\n\x1b\x64ocument_type_keeps_history\x18\x03 \x01(\x08\x12\x13\n\x0b\x64ocument_id\x18\x04 \x01(\x0c\x12\x89\x01\n\x19\x64ocument_contested_status\x18\x05 \x01(\x0e\x32\x66.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus\"P\n\x17\x44ocumentContestedStatus\x12\x11\n\rNOT_CONTESTED\x10\x00\x12\x13\n\x0fMAYBE_CONTESTED\x10\x01\x12\r\n\tCONTESTED\x10\x02\x1a\xd1\x01\n\x0fIdentityRequest\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12i\n\x0crequest_type\x18\x02 \x01(\x0e\x32S.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type\">\n\x04Type\x12\x11\n\rFULL_IDENTITY\x10\x00\x12\x0b\n\x07\x42\x41LANCE\x10\x01\x12\x08\n\x04KEYS\x10\x02\x12\x0c\n\x08REVISION\x10\x03\x1a&\n\x0f\x43ontractRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x1a\xe7\x02\n\x11VoteStatusRequest\x12\xa5\x01\n&contested_resource_vote_status_request\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequestH\x00\x1a\x99\x01\n\"ContestedResourceVoteStatusRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x14\n\x0cindex_values\x18\x04 \x03(\x0c\x12\x18\n\x10voter_identifier\x18\x05 \x01(\x0c\x42\x0e\n\x0crequest_typeB\t\n\x07version\"\x82\x02\n\x11GetProofsResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0H\x00\x1a\x91\x01\n\x13GetProofsResponseV0\x12\x31\n\x05proof\x18\x01 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb4\x01\n\x16GetDataContractRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0H\x00\x1a\x35\n\x18GetDataContractRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xb3\x02\n\x17GetDataContractResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0H\x00\x1a\xb0\x01\n\x19GetDataContractResponseV0\x12\x17\n\rdata_contract\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x01\n\x17GetDataContractsRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0H\x00\x1a\x37\n\x19GetDataContractsRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xcf\x04\n\x18GetDataContractsResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0H\x00\x1a[\n\x11\x44\x61taContractEntry\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x32\n\rdata_contract\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1au\n\rDataContracts\x12\x64\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32\x45.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry\x1a\xf5\x01\n\x1aGetDataContractsResponseV0\x12[\n\x0e\x64\x61ta_contracts\x18\x01 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc1\x02\n\x1dGetDataContractHistoryRequest\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0H\x00\x1a\xac\x01\n\x1fGetDataContractHistoryRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x13\n\x0bstart_at_ms\x18\x04 \x01(\x04\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\xae\x05\n\x1eGetDataContractHistoryResponse\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0H\x00\x1a\x96\x04\n GetDataContractHistoryResponseV0\x12\x8f\x01\n\x15\x64\x61ta_contract_history\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x18\x44\x61taContractHistoryEntry\x12\x0c\n\x04\x64\x61te\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\x0c\x1a\xaa\x01\n\x13\x44\x61taContractHistory\x12\x92\x01\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32s.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntryB\x08\n\x06resultB\t\n\x07version\"\xb2\x02\n\x13GetDocumentsRequest\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0H\x00\x1a\xbb\x01\n\x15GetDocumentsRequestV0\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12\r\n\x05where\x18\x03 \x01(\x0c\x12\x10\n\x08order_by\x18\x04 \x01(\x0c\x12\r\n\x05limit\x18\x05 \x01(\r\x12\x15\n\x0bstart_after\x18\x06 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x07 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x08 \x01(\x08\x42\x07\n\x05startB\t\n\x07version\"\x95\x03\n\x14GetDocumentsResponse\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0H\x00\x1a\x9b\x02\n\x16GetDocumentsResponseV0\x12\x65\n\tdocuments\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.DocumentsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1e\n\tDocuments\x12\x11\n\tdocuments\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xed\x01\n!GetIdentityByPublicKeyHashRequest\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0H\x00\x1aM\n#GetIdentityByPublicKeyHashRequestV0\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x02\n\"GetIdentityByPublicKeyHashResponse\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0H\x00\x1a\xb6\x01\n$GetIdentityByPublicKeyHashResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xfb\x01\n#WaitForStateTransitionResultRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0H\x00\x1aU\n%WaitForStateTransitionResultRequestV0\x12\x1d\n\x15state_transition_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x99\x03\n$WaitForStateTransitionResultResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0H\x00\x1a\xef\x01\n&WaitForStateTransitionResultResponseV0\x12I\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x38.org.dash.platform.dapi.v0.StateTransitionBroadcastErrorH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x19GetConsensusParamsRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0H\x00\x1a<\n\x1bGetConsensusParamsRequestV0\x12\x0e\n\x06height\x18\x01 \x01(\x05\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9c\x04\n\x1aGetConsensusParamsResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0H\x00\x1aP\n\x14\x43onsensusParamsBlock\x12\x11\n\tmax_bytes\x18\x01 \x01(\t\x12\x0f\n\x07max_gas\x18\x02 \x01(\t\x12\x14\n\x0ctime_iota_ms\x18\x03 \x01(\t\x1a\x62\n\x17\x43onsensusParamsEvidence\x12\x1a\n\x12max_age_num_blocks\x18\x01 \x01(\t\x12\x18\n\x10max_age_duration\x18\x02 \x01(\t\x12\x11\n\tmax_bytes\x18\x03 \x01(\t\x1a\xda\x01\n\x1cGetConsensusParamsResponseV0\x12Y\n\x05\x62lock\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock\x12_\n\x08\x65vidence\x18\x02 \x01(\x0b\x32M.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidenceB\t\n\x07version\"\xe4\x01\n%GetProtocolVersionUpgradeStateRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0H\x00\x1a\x38\n\'GetProtocolVersionUpgradeStateRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xb5\x05\n&GetProtocolVersionUpgradeStateResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0H\x00\x1a\x85\x04\n(GetProtocolVersionUpgradeStateResponseV0\x12\x87\x01\n\x08versions\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x96\x01\n\x08Versions\x12\x89\x01\n\x08versions\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry\x1a:\n\x0cVersionEntry\x12\x16\n\x0eversion_number\x18\x01 \x01(\r\x12\x12\n\nvote_count\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xa3\x02\n*GetProtocolVersionUpgradeVoteStatusRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0H\x00\x1ag\n,GetProtocolVersionUpgradeVoteStatusRequestV0\x12\x19\n\x11start_pro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xef\x05\n+GetProtocolVersionUpgradeVoteStatusResponse\x12\x82\x01\n\x02v0\x18\x01 \x01(\x0b\x32t.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0H\x00\x1a\xaf\x04\n-GetProtocolVersionUpgradeVoteStatusResponseV0\x12\x98\x01\n\x08versions\x18\x01 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignalsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xaf\x01\n\x0eVersionSignals\x12\x9c\x01\n\x0fversion_signals\x18\x01 \x03(\x0b\x32\x82\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal\x1a\x35\n\rVersionSignal\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07version\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xf5\x01\n\x14GetEpochsInfoRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0H\x00\x1a|\n\x16GetEpochsInfoRequestV0\x12\x31\n\x0bstart_epoch\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x11\n\tascending\x18\x03 \x01(\x08\x12\r\n\x05prove\x18\x04 \x01(\x08\x42\t\n\x07version\"\x91\x05\n\x15GetEpochsInfoResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0H\x00\x1a\x94\x04\n\x17GetEpochsInfoResponseV0\x12\x65\n\x06\x65pochs\x18\x01 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfosH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1au\n\nEpochInfos\x12g\n\x0b\x65poch_infos\x18\x01 \x03(\x0b\x32R.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo\x1a\x9e\x01\n\tEpochInfo\x12\x0e\n\x06number\x18\x01 \x01(\r\x12\x1a\n\x12\x66irst_block_height\x18\x02 \x01(\x04\x12\x1f\n\x17\x66irst_core_block_height\x18\x03 \x01(\r\x12\x12\n\nstart_time\x18\x04 \x01(\x04\x12\x16\n\x0e\x66\x65\x65_multiplier\x18\x05 \x01(\x01\x12\x18\n\x10protocol_version\x18\x06 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xde\x04\n\x1cGetContestedResourcesRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0H\x00\x1a\xcc\x03\n\x1eGetContestedResourcesRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x1a\n\x12start_index_values\x18\x04 \x03(\x0c\x12\x18\n\x10\x65nd_index_values\x18\x05 \x03(\x0c\x12\x89\x01\n\x13start_at_value_info\x18\x06 \x01(\x0b\x32g.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfoH\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x07 \x01(\rH\x01\x88\x01\x01\x12\x17\n\x0forder_ascending\x18\x08 \x01(\x08\x12\r\n\x05prove\x18\t \x01(\x08\x1a\x45\n\x10StartAtValueInfo\x12\x13\n\x0bstart_value\x18\x01 \x01(\x0c\x12\x1c\n\x14start_value_included\x18\x02 \x01(\x08\x42\x16\n\x14_start_at_value_infoB\x08\n\x06_countB\t\n\x07version\"\x88\x04\n\x1dGetContestedResourcesResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0H\x00\x1a\xf3\x02\n\x1fGetContestedResourcesResponseV0\x12\x95\x01\n\x19\x63ontested_resource_values\x18\x01 \x01(\x0b\x32p.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValuesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a<\n\x17\x43ontestedResourceValues\x12!\n\x19\x63ontested_resource_values\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xca\x05\n\x1cGetVotePollsByEndDateRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0H\x00\x1a\xb8\x04\n\x1eGetVotePollsByEndDateRequestV0\x12\x84\x01\n\x0fstart_time_info\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfoH\x00\x88\x01\x01\x12\x80\x01\n\rend_time_info\x18\x02 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfoH\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x03 \x01(\rH\x02\x88\x01\x01\x12\x13\n\x06offset\x18\x04 \x01(\rH\x03\x88\x01\x01\x12\x11\n\tascending\x18\x05 \x01(\x08\x12\r\n\x05prove\x18\x06 \x01(\x08\x1a\x45\n\x0fStartAtTimeInfo\x12\x15\n\rstart_time_ms\x18\x01 \x01(\x04\x12\x1b\n\x13start_time_included\x18\x02 \x01(\x08\x1a?\n\rEndAtTimeInfo\x12\x13\n\x0b\x65nd_time_ms\x18\x01 \x01(\x04\x12\x19\n\x11\x65nd_time_included\x18\x02 \x01(\x08\x42\x12\n\x10_start_time_infoB\x10\n\x0e_end_time_infoB\x08\n\x06_limitB\t\n\x07_offsetB\t\n\x07version\"\xff\x05\n\x1dGetVotePollsByEndDateResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0H\x00\x1a\xea\x04\n\x1fGetVotePollsByEndDateResponseV0\x12\x9c\x01\n\x18vote_polls_by_timestamps\x18\x01 \x01(\x0b\x32x.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestampsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1aR\n\x1eSerializedVotePollsByTimestamp\x12\x11\n\ttimestamp\x18\x01 \x01(\x04\x12\x1d\n\x15serialized_vote_polls\x18\x02 \x03(\x0c\x1a\xd7\x01\n\x1fSerializedVotePollsByTimestamps\x12\x99\x01\n\x18vote_polls_by_timestamps\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp\x12\x18\n\x10\x66inished_results\x18\x02 \x01(\x08\x42\x08\n\x06resultB\t\n\x07version\"\xff\x06\n$GetContestedResourceVoteStateRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0H\x00\x1a\xd5\x05\n&GetContestedResourceVoteStateRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x14\n\x0cindex_values\x18\x04 \x03(\x0c\x12\x86\x01\n\x0bresult_type\x18\x05 \x01(\x0e\x32q.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType\x12\x36\n.allow_include_locked_and_abstaining_vote_tally\x18\x06 \x01(\x08\x12\xa3\x01\n\x18start_at_identifier_info\x18\x07 \x01(\x0b\x32|.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfoH\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x08 \x01(\rH\x01\x88\x01\x01\x12\r\n\x05prove\x18\t \x01(\x08\x1aT\n\x15StartAtIdentifierInfo\x12\x18\n\x10start_identifier\x18\x01 \x01(\x0c\x12!\n\x19start_identifier_included\x18\x02 \x01(\x08\"I\n\nResultType\x12\r\n\tDOCUMENTS\x10\x00\x12\x0e\n\nVOTE_TALLY\x10\x01\x12\x1c\n\x18\x44OCUMENTS_AND_VOTE_TALLY\x10\x02\x42\x1b\n\x19_start_at_identifier_infoB\x08\n\x06_countB\t\n\x07version\"\x8c\x0c\n%GetContestedResourceVoteStateResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0H\x00\x1a\xdf\n\n\'GetContestedResourceVoteStateResponseV0\x12\xae\x01\n\x1d\x63ontested_resource_contenders\x18\x01 \x01(\x0b\x32\x84\x01.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContendersH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xd2\x03\n\x10\x46inishedVoteInfo\x12\xad\x01\n\x15\x66inished_vote_outcome\x18\x01 \x01(\x0e\x32\x8d\x01.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome\x12\x1f\n\x12won_by_identity_id\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12 \n\x18\x66inished_at_block_height\x18\x03 \x01(\x04\x12%\n\x1d\x66inished_at_core_block_height\x18\x04 \x01(\r\x12!\n\x19\x66inished_at_block_time_ms\x18\x05 \x01(\x04\x12\x19\n\x11\x66inished_at_epoch\x18\x06 \x01(\r\"O\n\x13\x46inishedVoteOutcome\x12\x14\n\x10TOWARDS_IDENTITY\x10\x00\x12\n\n\x06LOCKED\x10\x01\x12\x16\n\x12NO_PREVIOUS_WINNER\x10\x02\x42\x15\n\x13_won_by_identity_id\x1a\xc4\x03\n\x1b\x43ontestedResourceContenders\x12\x86\x01\n\ncontenders\x18\x01 \x03(\x0b\x32r.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender\x12\x1f\n\x12\x61\x62stain_vote_tally\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x1c\n\x0flock_vote_tally\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x9a\x01\n\x12\x66inished_vote_info\x18\x04 \x01(\x0b\x32y.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfoH\x02\x88\x01\x01\x42\x15\n\x13_abstain_vote_tallyB\x12\n\x10_lock_vote_tallyB\x15\n\x13_finished_vote_info\x1ak\n\tContender\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x17\n\nvote_count\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08\x64ocument\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x42\r\n\x0b_vote_countB\x0b\n\t_documentB\x08\n\x06resultB\t\n\x07version\"\xd5\x05\n,GetContestedResourceVotersForIdentityRequest\x12\x84\x01\n\x02v0\x18\x01 \x01(\x0b\x32v.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0H\x00\x1a\x92\x04\n.GetContestedResourceVotersForIdentityRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x14\n\x0cindex_values\x18\x04 \x03(\x0c\x12\x15\n\rcontestant_id\x18\x05 \x01(\x0c\x12\xb4\x01\n\x18start_at_identifier_info\x18\x06 \x01(\x0b\x32\x8c\x01.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfoH\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x07 \x01(\rH\x01\x88\x01\x01\x12\x17\n\x0forder_ascending\x18\x08 \x01(\x08\x12\r\n\x05prove\x18\t \x01(\x08\x1aT\n\x15StartAtIdentifierInfo\x12\x18\n\x10start_identifier\x18\x01 \x01(\x0c\x12!\n\x19start_identifier_included\x18\x02 \x01(\x08\x42\x1b\n\x19_start_at_identifier_infoB\x08\n\x06_countB\t\n\x07version\"\xf1\x04\n-GetContestedResourceVotersForIdentityResponse\x12\x86\x01\n\x02v0\x18\x01 \x01(\x0b\x32x.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0H\x00\x1a\xab\x03\n/GetContestedResourceVotersForIdentityResponseV0\x12\xb6\x01\n\x19\x63ontested_resource_voters\x18\x01 \x01(\x0b\x32\x90\x01.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVotersH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x43\n\x17\x43ontestedResourceVoters\x12\x0e\n\x06voters\x18\x01 \x03(\x0c\x12\x18\n\x10\x66inished_results\x18\x02 \x01(\x08\x42\x08\n\x06resultB\t\n\x07version\"\xad\x05\n(GetContestedResourceIdentityVotesRequest\x12|\n\x02v0\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0H\x00\x1a\xf7\x03\n*GetContestedResourceIdentityVotesRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x17\n\x0forder_ascending\x18\x04 \x01(\x08\x12\xae\x01\n\x1astart_at_vote_poll_id_info\x18\x05 \x01(\x0b\x32\x84\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfoH\x00\x88\x01\x01\x12\r\n\x05prove\x18\x06 \x01(\x08\x1a\x61\n\x15StartAtVotePollIdInfo\x12 \n\x18start_at_poll_identifier\x18\x01 \x01(\x0c\x12&\n\x1estart_poll_identifier_included\x18\x02 \x01(\x08\x42\x1d\n\x1b_start_at_vote_poll_id_infoB\t\n\x07version\"\xc8\n\n)GetContestedResourceIdentityVotesResponse\x12~\n\x02v0\x18\x01 \x01(\x0b\x32p.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0H\x00\x1a\x8f\t\n+GetContestedResourceIdentityVotesResponseV0\x12\xa1\x01\n\x05votes\x18\x01 \x01(\x0b\x32\x8f\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xf7\x01\n\x1e\x43ontestedResourceIdentityVotes\x12\xba\x01\n!contested_resource_identity_votes\x18\x01 \x03(\x0b\x32\x8e\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote\x12\x18\n\x10\x66inished_results\x18\x02 \x01(\x08\x1a\xad\x02\n\x12ResourceVoteChoice\x12\xad\x01\n\x10vote_choice_type\x18\x01 \x01(\x0e\x32\x92\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType\x12\x18\n\x0bidentity_id\x18\x02 \x01(\x0cH\x00\x88\x01\x01\"=\n\x0eVoteChoiceType\x12\x14\n\x10TOWARDS_IDENTITY\x10\x00\x12\x0b\n\x07\x41\x42STAIN\x10\x01\x12\x08\n\x04LOCK\x10\x02\x42\x0e\n\x0c_identity_id\x1a\x95\x02\n\x1d\x43ontestedResourceIdentityVote\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\'\n\x1fserialized_index_storage_values\x18\x03 \x03(\x0c\x12\x99\x01\n\x0bvote_choice\x18\x04 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoiceB\x08\n\x06resultB\t\n\x07version\"\xf0\x01\n%GetPrefundedSpecializedBalanceRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0H\x00\x1a\x44\n\'GetPrefundedSpecializedBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xe9\x02\n&GetPrefundedSpecializedBalanceResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0H\x00\x1a\xb9\x01\n(GetPrefundedSpecializedBalanceResponseV0\x12\x11\n\x07\x62\x61lance\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xd0\x01\n GetTotalCreditsInPlatformRequest\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0H\x00\x1a\x33\n\"GetTotalCreditsInPlatformRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xd5\x02\n!GetTotalCreditsInPlatformResponse\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0H\x00\x1a\xb4\x01\n#GetTotalCreditsInPlatformResponseV0\x12\x11\n\x07\x63redits\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x16GetPathElementsRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0H\x00\x1a\x45\n\x18GetPathElementsRequestV0\x12\x0c\n\x04path\x18\x01 \x03(\x0c\x12\x0c\n\x04keys\x18\x02 \x03(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xa3\x03\n\x17GetPathElementsResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0H\x00\x1a\xa0\x02\n\x19GetPathElementsResponseV0\x12i\n\x08\x65lements\x18\x01 \x01(\x0b\x32U.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ElementsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1c\n\x08\x45lements\x12\x10\n\x08\x65lements\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\x81\x01\n\x10GetStatusRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0H\x00\x1a\x14\n\x12GetStatusRequestV0B\t\n\x07version\"\x9c\x10\n\x11GetStatusResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0H\x00\x1a\xab\x0f\n\x13GetStatusResponseV0\x12Y\n\x07version\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version\x12S\n\x04node\x18\x02 \x01(\x0b\x32\x45.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node\x12U\n\x05\x63hain\x18\x03 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain\x12Y\n\x07network\x18\x04 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network\x12^\n\nstate_sync\x18\x05 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync\x12S\n\x04time\x18\x06 \x01(\x0b\x32\x45.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time\x1a\xee\x04\n\x07Version\x12\x63\n\x08software\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software\x12\x63\n\x08protocol\x18\x02 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol\x1a^\n\x08Software\x12\x0c\n\x04\x64\x61pi\x18\x01 \x01(\t\x12\x12\n\x05\x64rive\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x17\n\ntenderdash\x18\x03 \x01(\tH\x01\x88\x01\x01\x42\x08\n\x06_driveB\r\n\x0b_tenderdash\x1a\xb8\x02\n\x08Protocol\x12p\n\ntenderdash\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash\x12\x66\n\x05\x64rive\x18\x02 \x01(\x0b\x32W.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive\x1a(\n\nTenderdash\x12\x0b\n\x03p2p\x18\x01 \x01(\r\x12\r\n\x05\x62lock\x18\x02 \x01(\r\x1a(\n\x05\x44rive\x12\x0e\n\x06latest\x18\x03 \x01(\r\x12\x0f\n\x07\x63urrent\x18\x04 \x01(\r\x1as\n\x04Time\x12\r\n\x05local\x18\x01 \x01(\x04\x12\x12\n\x05\x62lock\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07genesis\x18\x03 \x01(\x04H\x01\x88\x01\x01\x12\x12\n\x05\x65poch\x18\x04 \x01(\rH\x02\x88\x01\x01\x42\x08\n\x06_blockB\n\n\x08_genesisB\x08\n\x06_epoch\x1a<\n\x04Node\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x18\n\x0bpro_tx_hash\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0e\n\x0c_pro_tx_hash\x1a\xa7\x02\n\x05\x43hain\x12\x13\n\x0b\x63\x61tching_up\x18\x01 \x01(\x08\x12\x19\n\x11latest_block_hash\x18\x02 \x01(\x0c\x12\x17\n\x0flatest_app_hash\x18\x03 \x01(\x0c\x12\x1b\n\x13latest_block_height\x18\x04 \x01(\x04\x12\x1b\n\x13\x65\x61rliest_block_hash\x18\x05 \x01(\x0c\x12\x19\n\x11\x65\x61rliest_app_hash\x18\x06 \x01(\x0c\x12\x1d\n\x15\x65\x61rliest_block_height\x18\x07 \x01(\x04\x12\x1d\n\x15max_peer_block_height\x18\t \x01(\x04\x12%\n\x18\x63ore_chain_locked_height\x18\n \x01(\rH\x00\x88\x01\x01\x42\x1b\n\x19_core_chain_locked_height\x1a\x43\n\x07Network\x12\x10\n\x08\x63hain_id\x18\x01 \x01(\t\x12\x13\n\x0bpeers_count\x18\x02 \x01(\r\x12\x11\n\tlistening\x18\x03 \x01(\x08\x1a\xe9\x01\n\tStateSync\x12\x19\n\x11total_synced_time\x18\x01 \x01(\x04\x12\x16\n\x0eremaining_time\x18\x02 \x01(\x04\x12\x17\n\x0ftotal_snapshots\x18\x03 \x01(\r\x12\x1e\n\x16\x63hunk_process_avg_time\x18\x04 \x01(\x04\x12\x17\n\x0fsnapshot_height\x18\x05 \x01(\x04\x12\x1d\n\x15snapshot_chunks_count\x18\x06 \x01(\x04\x12\x19\n\x11\x62\x61\x63kfilled_blocks\x18\x07 \x01(\x04\x12\x1d\n\x15\x62\x61\x63kfill_blocks_total\x18\x08 \x01(\x04\x42\t\n\x07version*Z\n\nKeyPurpose\x12\x12\n\x0e\x41UTHENTICATION\x10\x00\x12\x0e\n\nENCRYPTION\x10\x01\x12\x0e\n\nDECRYPTION\x10\x02\x12\x0c\n\x08TRANSFER\x10\x03\x12\n\n\x06VOTING\x10\x05\x32\x97#\n\x08Platform\x12\x93\x01\n\x18\x62roadcastStateTransition\x12:.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest\x1a;.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse\x12l\n\x0bgetIdentity\x12-.org.dash.platform.dapi.v0.GetIdentityRequest\x1a..org.dash.platform.dapi.v0.GetIdentityResponse\x12x\n\x0fgetIdentityKeys\x12\x31.org.dash.platform.dapi.v0.GetIdentityKeysRequest\x1a\x32.org.dash.platform.dapi.v0.GetIdentityKeysResponse\x12\x96\x01\n\x19getIdentitiesContractKeys\x12;.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest\x1a<.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse\x12{\n\x10getIdentityNonce\x12\x32.org.dash.platform.dapi.v0.GetIdentityNonceRequest\x1a\x33.org.dash.platform.dapi.v0.GetIdentityNonceResponse\x12\x93\x01\n\x18getIdentityContractNonce\x12:.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest\x1a;.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse\x12\x81\x01\n\x12getIdentityBalance\x12\x34.org.dash.platform.dapi.v0.GetIdentityBalanceRequest\x1a\x35.org.dash.platform.dapi.v0.GetIdentityBalanceResponse\x12\x8a\x01\n\x15getIdentitiesBalances\x12\x37.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest\x1a\x38.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse\x12\xa2\x01\n\x1dgetIdentityBalanceAndRevision\x12?.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest\x1a@.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse\x12\xaf\x01\n#getEvonodesProposedEpochBlocksByIds\x12\x45.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest\x1a\x41.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse\x12\xb3\x01\n%getEvonodesProposedEpochBlocksByRange\x12G.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest\x1a\x41.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse\x12\x66\n\tgetProofs\x12+.org.dash.platform.dapi.v0.GetProofsRequest\x1a,.org.dash.platform.dapi.v0.GetProofsResponse\x12x\n\x0fgetDataContract\x12\x31.org.dash.platform.dapi.v0.GetDataContractRequest\x1a\x32.org.dash.platform.dapi.v0.GetDataContractResponse\x12\x8d\x01\n\x16getDataContractHistory\x12\x38.org.dash.platform.dapi.v0.GetDataContractHistoryRequest\x1a\x39.org.dash.platform.dapi.v0.GetDataContractHistoryResponse\x12{\n\x10getDataContracts\x12\x32.org.dash.platform.dapi.v0.GetDataContractsRequest\x1a\x33.org.dash.platform.dapi.v0.GetDataContractsResponse\x12o\n\x0cgetDocuments\x12..org.dash.platform.dapi.v0.GetDocumentsRequest\x1a/.org.dash.platform.dapi.v0.GetDocumentsResponse\x12\x99\x01\n\x1agetIdentityByPublicKeyHash\x12<.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest\x1a=.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse\x12\x9f\x01\n\x1cwaitForStateTransitionResult\x12>.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest\x1a?.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse\x12\x81\x01\n\x12getConsensusParams\x12\x34.org.dash.platform.dapi.v0.GetConsensusParamsRequest\x1a\x35.org.dash.platform.dapi.v0.GetConsensusParamsResponse\x12\xa5\x01\n\x1egetProtocolVersionUpgradeState\x12@.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest\x1a\x41.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse\x12\xb4\x01\n#getProtocolVersionUpgradeVoteStatus\x12\x45.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest\x1a\x46.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse\x12r\n\rgetEpochsInfo\x12/.org.dash.platform.dapi.v0.GetEpochsInfoRequest\x1a\x30.org.dash.platform.dapi.v0.GetEpochsInfoResponse\x12\x8a\x01\n\x15getContestedResources\x12\x37.org.dash.platform.dapi.v0.GetContestedResourcesRequest\x1a\x38.org.dash.platform.dapi.v0.GetContestedResourcesResponse\x12\xa2\x01\n\x1dgetContestedResourceVoteState\x12?.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest\x1a@.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse\x12\xba\x01\n%getContestedResourceVotersForIdentity\x12G.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest\x1aH.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse\x12\xae\x01\n!getContestedResourceIdentityVotes\x12\x43.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest\x1a\x44.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse\x12\x8a\x01\n\x15getVotePollsByEndDate\x12\x37.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest\x1a\x38.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse\x12\xa5\x01\n\x1egetPrefundedSpecializedBalance\x12@.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest\x1a\x41.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse\x12\x96\x01\n\x19getTotalCreditsInPlatform\x12;.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest\x1a<.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse\x12x\n\x0fgetPathElements\x12\x31.org.dash.platform.dapi.v0.GetPathElementsRequest\x1a\x32.org.dash.platform.dapi.v0.GetPathElementsResponse\x12\x66\n\tgetStatus\x12+.org.dash.platform.dapi.v0.GetStatusRequest\x1a,.org.dash.platform.dapi.v0.GetStatusResponseb\x06proto3' + serialized_pb=b'\n\x0eplatform.proto\x12\x19org.dash.platform.dapi.v0\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\x81\x01\n\x05Proof\x12\x15\n\rgrovedb_proof\x18\x01 \x01(\x0c\x12\x13\n\x0bquorum_hash\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\x12\r\n\x05round\x18\x04 \x01(\r\x12\x15\n\rblock_id_hash\x18\x05 \x01(\x0c\x12\x13\n\x0bquorum_type\x18\x06 \x01(\r\"\x90\x01\n\x10ResponseMetadata\x12\x0e\n\x06height\x18\x01 \x01(\x04\x12 \n\x18\x63ore_chain_locked_height\x18\x02 \x01(\r\x12\r\n\x05\x65poch\x18\x03 \x01(\r\x12\x0f\n\x07time_ms\x18\x04 \x01(\x04\x12\x18\n\x10protocol_version\x18\x05 \x01(\r\x12\x10\n\x08\x63hain_id\x18\x06 \x01(\t\"L\n\x1dStateTransitionBroadcastError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\";\n\x1f\x42roadcastStateTransitionRequest\x12\x18\n\x10state_transition\x18\x01 \x01(\x0c\"\"\n BroadcastStateTransitionResponse\"\xa4\x01\n\x12GetIdentityRequest\x12P\n\x02v0\x18\x01 \x01(\x0b\x32\x42.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0H\x00\x1a\x31\n\x14GetIdentityRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc1\x01\n\x17GetIdentityNonceRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0H\x00\x1a?\n\x19GetIdentityNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xf6\x01\n\x1fGetIdentityContractNonceRequest\x12j\n\x02v0\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0H\x00\x1a\\\n!GetIdentityContractNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x13\n\x0b\x63ontract_id\x18\x02 \x01(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xc0\x01\n\x19GetIdentityBalanceRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0H\x00\x1a\x38\n\x1bGetIdentityBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xec\x01\n$GetIdentityBalanceAndRevisionRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0H\x00\x1a\x43\n&GetIdentityBalanceAndRevisionRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9e\x02\n\x13GetIdentityResponse\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0H\x00\x1a\xa7\x01\n\x15GetIdentityResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb8\x02\n\x18GetIdentityNonceResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0H\x00\x1a\xb2\x01\n\x1aGetIdentityNonceResponseV0\x12\x18\n\x0eidentity_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xe1\x02\n GetIdentityContractNonceResponse\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0H\x00\x1a\xc3\x01\n\"GetIdentityContractNonceResponseV0\x12!\n\x17identity_contract_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x02\n\x1aGetIdentityBalanceResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0H\x00\x1a\xad\x01\n\x1cGetIdentityBalanceResponseV0\x12\x11\n\x07\x62\x61lance\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xa9\x04\n%GetIdentityBalanceAndRevisionResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0H\x00\x1a\xfc\x02\n\'GetIdentityBalanceAndRevisionResponseV0\x12\x9b\x01\n\x14\x62\x61lance_and_revision\x18\x01 \x01(\x0b\x32{.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevisionH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x12\x42\x61lanceAndRevision\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\x12\x10\n\x08revision\x18\x02 \x01(\x04\x42\x08\n\x06resultB\t\n\x07version\"\xd1\x01\n\x0eKeyRequestType\x12\x36\n\x08\x61ll_keys\x18\x01 \x01(\x0b\x32\".org.dash.platform.dapi.v0.AllKeysH\x00\x12@\n\rspecific_keys\x18\x02 \x01(\x0b\x32\'.org.dash.platform.dapi.v0.SpecificKeysH\x00\x12:\n\nsearch_key\x18\x03 \x01(\x0b\x32$.org.dash.platform.dapi.v0.SearchKeyH\x00\x42\t\n\x07request\"\t\n\x07\x41llKeys\"\x1f\n\x0cSpecificKeys\x12\x0f\n\x07key_ids\x18\x01 \x03(\r\"\xb6\x01\n\tSearchKey\x12I\n\x0bpurpose_map\x18\x01 \x03(\x0b\x32\x34.org.dash.platform.dapi.v0.SearchKey.PurposeMapEntry\x1a^\n\x0fPurposeMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12:\n\x05value\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.SecurityLevelMap:\x02\x38\x01\"\xbf\x02\n\x10SecurityLevelMap\x12]\n\x12security_level_map\x18\x01 \x03(\x0b\x32\x41.org.dash.platform.dapi.v0.SecurityLevelMap.SecurityLevelMapEntry\x1aw\n\x15SecurityLevelMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12M\n\x05value\x18\x02 \x01(\x0e\x32>.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType:\x02\x38\x01\"S\n\x12KeyKindRequestType\x12\x1f\n\x1b\x43URRENT_KEY_OF_KIND_REQUEST\x10\x00\x12\x1c\n\x18\x41LL_KEYS_OF_KIND_REQUEST\x10\x01\"\xda\x02\n\x16GetIdentityKeysRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0H\x00\x1a\xda\x01\n\x18GetIdentityKeysRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12?\n\x0crequest_type\x18\x02 \x01(\x0b\x32).org.dash.platform.dapi.v0.KeyRequestType\x12+\n\x05limit\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\x99\x03\n\x17GetIdentityKeysResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0H\x00\x1a\x96\x02\n\x19GetIdentityKeysResponseV0\x12\x61\n\x04keys\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.KeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1a\n\x04Keys\x12\x12\n\nkeys_bytes\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xef\x02\n GetIdentitiesContractKeysRequest\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0H\x00\x1a\xd1\x01\n\"GetIdentitiesContractKeysRequestV0\x12\x16\n\x0eidentities_ids\x18\x01 \x03(\x0c\x12\x13\n\x0b\x63ontract_id\x18\x02 \x01(\x0c\x12\x1f\n\x12\x64ocument_type_name\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x37\n\x08purposes\x18\x04 \x03(\x0e\x32%.org.dash.platform.dapi.v0.KeyPurpose\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\x15\n\x13_document_type_nameB\t\n\x07version\"\xdf\x06\n!GetIdentitiesContractKeysResponse\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0H\x00\x1a\xbe\x05\n#GetIdentitiesContractKeysResponseV0\x12\x8a\x01\n\x0fidentities_keys\x18\x01 \x01(\x0b\x32o.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1aY\n\x0bPurposeKeys\x12\x36\n\x07purpose\x18\x01 \x01(\x0e\x32%.org.dash.platform.dapi.v0.KeyPurpose\x12\x12\n\nkeys_bytes\x18\x02 \x03(\x0c\x1a\x9f\x01\n\x0cIdentityKeys\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12z\n\x04keys\x18\x02 \x03(\x0b\x32l.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys\x1a\x90\x01\n\x0eIdentitiesKeys\x12~\n\x07\x65ntries\x18\x01 \x03(\x0b\x32m.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeysB\x08\n\x06resultB\t\n\x07version\"\xa4\x02\n*GetEvonodesProposedEpochBlocksByIdsRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0H\x00\x1ah\n,GetEvonodesProposedEpochBlocksByIdsRequestV0\x12\x12\n\x05\x65poch\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x0b\n\x03ids\x18\x02 \x03(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\x08\n\x06_epochB\t\n\x07version\"\x8e\x06\n&GetEvonodesProposedEpochBlocksResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0H\x00\x1a\xde\x04\n(GetEvonodesProposedEpochBlocksResponseV0\x12\xb1\x01\n#evonodes_proposed_block_counts_info\x18\x01 \x01(\x0b\x32\x81\x01.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocksH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a;\n\x15\x45vonodeProposedBlocks\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\x04\x1a\xc4\x01\n\x16\x45vonodesProposedBlocks\x12\xa9\x01\n\x1e\x65vonodes_proposed_block_counts\x18\x01 \x03(\x0b\x32\x80\x01.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocksB\x08\n\x06resultB\t\n\x07version\"\xf2\x02\n,GetEvonodesProposedEpochBlocksByRangeRequest\x12\x84\x01\n\x02v0\x18\x01 \x01(\x0b\x32v.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0H\x00\x1a\xaf\x01\n.GetEvonodesProposedEpochBlocksByRangeRequestV0\x12\x12\n\x05\x65poch\x18\x01 \x01(\rH\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\rH\x02\x88\x01\x01\x12\x15\n\x0bstart_after\x18\x03 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x04 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\x07\n\x05startB\x08\n\x06_epochB\x08\n\x06_limitB\t\n\x07version\"\xcd\x01\n\x1cGetIdentitiesBalancesRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0H\x00\x1a<\n\x1eGetIdentitiesBalancesRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9b\x05\n\x1dGetIdentitiesBalancesResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0H\x00\x1a\x86\x04\n\x1fGetIdentitiesBalancesResponseV0\x12\x8a\x01\n\x13identities_balances\x18\x01 \x01(\x0b\x32k.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalancesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1aH\n\x0fIdentityBalance\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x14\n\x07\x62\x61lance\x18\x02 \x01(\x04H\x00\x88\x01\x01\x42\n\n\x08_balance\x1a\x8f\x01\n\x12IdentitiesBalances\x12y\n\x07\x65ntries\x18\x01 \x03(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalanceB\x08\n\x06resultB\t\n\x07version\"\xcb\x0b\n\x10GetProofsRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0H\x00\x1a\xdd\n\n\x12GetProofsRequestV0\x12\x62\n\nidentities\x18\x01 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest\x12\x61\n\tcontracts\x18\x02 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest\x12\x61\n\tdocuments\x18\x03 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest\x12_\n\x05votes\x18\x04 \x03(\x0b\x32P.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest\x1a\xd5\x02\n\x0f\x44ocumentRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12#\n\x1b\x64ocument_type_keeps_history\x18\x03 \x01(\x08\x12\x13\n\x0b\x64ocument_id\x18\x04 \x01(\x0c\x12\x89\x01\n\x19\x64ocument_contested_status\x18\x05 \x01(\x0e\x32\x66.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus\"P\n\x17\x44ocumentContestedStatus\x12\x11\n\rNOT_CONTESTED\x10\x00\x12\x13\n\x0fMAYBE_CONTESTED\x10\x01\x12\r\n\tCONTESTED\x10\x02\x1a\xd1\x01\n\x0fIdentityRequest\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12i\n\x0crequest_type\x18\x02 \x01(\x0e\x32S.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type\">\n\x04Type\x12\x11\n\rFULL_IDENTITY\x10\x00\x12\x0b\n\x07\x42\x41LANCE\x10\x01\x12\x08\n\x04KEYS\x10\x02\x12\x0c\n\x08REVISION\x10\x03\x1a&\n\x0f\x43ontractRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x1a\xe7\x02\n\x11VoteStatusRequest\x12\xa5\x01\n&contested_resource_vote_status_request\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequestH\x00\x1a\x99\x01\n\"ContestedResourceVoteStatusRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x14\n\x0cindex_values\x18\x04 \x03(\x0c\x12\x18\n\x10voter_identifier\x18\x05 \x01(\x0c\x42\x0e\n\x0crequest_typeB\t\n\x07version\"\x82\x02\n\x11GetProofsResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0H\x00\x1a\x91\x01\n\x13GetProofsResponseV0\x12\x31\n\x05proof\x18\x01 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb4\x01\n\x16GetDataContractRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0H\x00\x1a\x35\n\x18GetDataContractRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xb3\x02\n\x17GetDataContractResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0H\x00\x1a\xb0\x01\n\x19GetDataContractResponseV0\x12\x17\n\rdata_contract\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x01\n\x17GetDataContractsRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0H\x00\x1a\x37\n\x19GetDataContractsRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xcf\x04\n\x18GetDataContractsResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0H\x00\x1a[\n\x11\x44\x61taContractEntry\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x32\n\rdata_contract\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1au\n\rDataContracts\x12\x64\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32\x45.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry\x1a\xf5\x01\n\x1aGetDataContractsResponseV0\x12[\n\x0e\x64\x61ta_contracts\x18\x01 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc1\x02\n\x1dGetDataContractHistoryRequest\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0H\x00\x1a\xac\x01\n\x1fGetDataContractHistoryRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x13\n\x0bstart_at_ms\x18\x04 \x01(\x04\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\xae\x05\n\x1eGetDataContractHistoryResponse\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0H\x00\x1a\x96\x04\n GetDataContractHistoryResponseV0\x12\x8f\x01\n\x15\x64\x61ta_contract_history\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x18\x44\x61taContractHistoryEntry\x12\x0c\n\x04\x64\x61te\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\x0c\x1a\xaa\x01\n\x13\x44\x61taContractHistory\x12\x92\x01\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32s.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntryB\x08\n\x06resultB\t\n\x07version\"\xb2\x02\n\x13GetDocumentsRequest\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0H\x00\x1a\xbb\x01\n\x15GetDocumentsRequestV0\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12\r\n\x05where\x18\x03 \x01(\x0c\x12\x10\n\x08order_by\x18\x04 \x01(\x0c\x12\r\n\x05limit\x18\x05 \x01(\r\x12\x15\n\x0bstart_after\x18\x06 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x07 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x08 \x01(\x08\x42\x07\n\x05startB\t\n\x07version\"\x95\x03\n\x14GetDocumentsResponse\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0H\x00\x1a\x9b\x02\n\x16GetDocumentsResponseV0\x12\x65\n\tdocuments\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.DocumentsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1e\n\tDocuments\x12\x11\n\tdocuments\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xed\x01\n!GetIdentityByPublicKeyHashRequest\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0H\x00\x1aM\n#GetIdentityByPublicKeyHashRequestV0\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x02\n\"GetIdentityByPublicKeyHashResponse\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0H\x00\x1a\xb6\x01\n$GetIdentityByPublicKeyHashResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xfb\x01\n#WaitForStateTransitionResultRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0H\x00\x1aU\n%WaitForStateTransitionResultRequestV0\x12\x1d\n\x15state_transition_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x99\x03\n$WaitForStateTransitionResultResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0H\x00\x1a\xef\x01\n&WaitForStateTransitionResultResponseV0\x12I\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x38.org.dash.platform.dapi.v0.StateTransitionBroadcastErrorH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x19GetConsensusParamsRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0H\x00\x1a<\n\x1bGetConsensusParamsRequestV0\x12\x0e\n\x06height\x18\x01 \x01(\x05\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9c\x04\n\x1aGetConsensusParamsResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0H\x00\x1aP\n\x14\x43onsensusParamsBlock\x12\x11\n\tmax_bytes\x18\x01 \x01(\t\x12\x0f\n\x07max_gas\x18\x02 \x01(\t\x12\x14\n\x0ctime_iota_ms\x18\x03 \x01(\t\x1a\x62\n\x17\x43onsensusParamsEvidence\x12\x1a\n\x12max_age_num_blocks\x18\x01 \x01(\t\x12\x18\n\x10max_age_duration\x18\x02 \x01(\t\x12\x11\n\tmax_bytes\x18\x03 \x01(\t\x1a\xda\x01\n\x1cGetConsensusParamsResponseV0\x12Y\n\x05\x62lock\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock\x12_\n\x08\x65vidence\x18\x02 \x01(\x0b\x32M.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidenceB\t\n\x07version\"\xe4\x01\n%GetProtocolVersionUpgradeStateRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0H\x00\x1a\x38\n\'GetProtocolVersionUpgradeStateRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xb5\x05\n&GetProtocolVersionUpgradeStateResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0H\x00\x1a\x85\x04\n(GetProtocolVersionUpgradeStateResponseV0\x12\x87\x01\n\x08versions\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x96\x01\n\x08Versions\x12\x89\x01\n\x08versions\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry\x1a:\n\x0cVersionEntry\x12\x16\n\x0eversion_number\x18\x01 \x01(\r\x12\x12\n\nvote_count\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xa3\x02\n*GetProtocolVersionUpgradeVoteStatusRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0H\x00\x1ag\n,GetProtocolVersionUpgradeVoteStatusRequestV0\x12\x19\n\x11start_pro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xef\x05\n+GetProtocolVersionUpgradeVoteStatusResponse\x12\x82\x01\n\x02v0\x18\x01 \x01(\x0b\x32t.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0H\x00\x1a\xaf\x04\n-GetProtocolVersionUpgradeVoteStatusResponseV0\x12\x98\x01\n\x08versions\x18\x01 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignalsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xaf\x01\n\x0eVersionSignals\x12\x9c\x01\n\x0fversion_signals\x18\x01 \x03(\x0b\x32\x82\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal\x1a\x35\n\rVersionSignal\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07version\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xf5\x01\n\x14GetEpochsInfoRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0H\x00\x1a|\n\x16GetEpochsInfoRequestV0\x12\x31\n\x0bstart_epoch\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x11\n\tascending\x18\x03 \x01(\x08\x12\r\n\x05prove\x18\x04 \x01(\x08\x42\t\n\x07version\"\x91\x05\n\x15GetEpochsInfoResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0H\x00\x1a\x94\x04\n\x17GetEpochsInfoResponseV0\x12\x65\n\x06\x65pochs\x18\x01 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfosH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1au\n\nEpochInfos\x12g\n\x0b\x65poch_infos\x18\x01 \x03(\x0b\x32R.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo\x1a\x9e\x01\n\tEpochInfo\x12\x0e\n\x06number\x18\x01 \x01(\r\x12\x1a\n\x12\x66irst_block_height\x18\x02 \x01(\x04\x12\x1f\n\x17\x66irst_core_block_height\x18\x03 \x01(\r\x12\x12\n\nstart_time\x18\x04 \x01(\x04\x12\x16\n\x0e\x66\x65\x65_multiplier\x18\x05 \x01(\x01\x12\x18\n\x10protocol_version\x18\x06 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xde\x04\n\x1cGetContestedResourcesRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0H\x00\x1a\xcc\x03\n\x1eGetContestedResourcesRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x1a\n\x12start_index_values\x18\x04 \x03(\x0c\x12\x18\n\x10\x65nd_index_values\x18\x05 \x03(\x0c\x12\x89\x01\n\x13start_at_value_info\x18\x06 \x01(\x0b\x32g.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfoH\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x07 \x01(\rH\x01\x88\x01\x01\x12\x17\n\x0forder_ascending\x18\x08 \x01(\x08\x12\r\n\x05prove\x18\t \x01(\x08\x1a\x45\n\x10StartAtValueInfo\x12\x13\n\x0bstart_value\x18\x01 \x01(\x0c\x12\x1c\n\x14start_value_included\x18\x02 \x01(\x08\x42\x16\n\x14_start_at_value_infoB\x08\n\x06_countB\t\n\x07version\"\x88\x04\n\x1dGetContestedResourcesResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0H\x00\x1a\xf3\x02\n\x1fGetContestedResourcesResponseV0\x12\x95\x01\n\x19\x63ontested_resource_values\x18\x01 \x01(\x0b\x32p.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValuesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a<\n\x17\x43ontestedResourceValues\x12!\n\x19\x63ontested_resource_values\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xca\x05\n\x1cGetVotePollsByEndDateRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0H\x00\x1a\xb8\x04\n\x1eGetVotePollsByEndDateRequestV0\x12\x84\x01\n\x0fstart_time_info\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfoH\x00\x88\x01\x01\x12\x80\x01\n\rend_time_info\x18\x02 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfoH\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x03 \x01(\rH\x02\x88\x01\x01\x12\x13\n\x06offset\x18\x04 \x01(\rH\x03\x88\x01\x01\x12\x11\n\tascending\x18\x05 \x01(\x08\x12\r\n\x05prove\x18\x06 \x01(\x08\x1a\x45\n\x0fStartAtTimeInfo\x12\x15\n\rstart_time_ms\x18\x01 \x01(\x04\x12\x1b\n\x13start_time_included\x18\x02 \x01(\x08\x1a?\n\rEndAtTimeInfo\x12\x13\n\x0b\x65nd_time_ms\x18\x01 \x01(\x04\x12\x19\n\x11\x65nd_time_included\x18\x02 \x01(\x08\x42\x12\n\x10_start_time_infoB\x10\n\x0e_end_time_infoB\x08\n\x06_limitB\t\n\x07_offsetB\t\n\x07version\"\xff\x05\n\x1dGetVotePollsByEndDateResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0H\x00\x1a\xea\x04\n\x1fGetVotePollsByEndDateResponseV0\x12\x9c\x01\n\x18vote_polls_by_timestamps\x18\x01 \x01(\x0b\x32x.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestampsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1aR\n\x1eSerializedVotePollsByTimestamp\x12\x11\n\ttimestamp\x18\x01 \x01(\x04\x12\x1d\n\x15serialized_vote_polls\x18\x02 \x03(\x0c\x1a\xd7\x01\n\x1fSerializedVotePollsByTimestamps\x12\x99\x01\n\x18vote_polls_by_timestamps\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp\x12\x18\n\x10\x66inished_results\x18\x02 \x01(\x08\x42\x08\n\x06resultB\t\n\x07version\"\xff\x06\n$GetContestedResourceVoteStateRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0H\x00\x1a\xd5\x05\n&GetContestedResourceVoteStateRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x14\n\x0cindex_values\x18\x04 \x03(\x0c\x12\x86\x01\n\x0bresult_type\x18\x05 \x01(\x0e\x32q.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType\x12\x36\n.allow_include_locked_and_abstaining_vote_tally\x18\x06 \x01(\x08\x12\xa3\x01\n\x18start_at_identifier_info\x18\x07 \x01(\x0b\x32|.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfoH\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x08 \x01(\rH\x01\x88\x01\x01\x12\r\n\x05prove\x18\t \x01(\x08\x1aT\n\x15StartAtIdentifierInfo\x12\x18\n\x10start_identifier\x18\x01 \x01(\x0c\x12!\n\x19start_identifier_included\x18\x02 \x01(\x08\"I\n\nResultType\x12\r\n\tDOCUMENTS\x10\x00\x12\x0e\n\nVOTE_TALLY\x10\x01\x12\x1c\n\x18\x44OCUMENTS_AND_VOTE_TALLY\x10\x02\x42\x1b\n\x19_start_at_identifier_infoB\x08\n\x06_countB\t\n\x07version\"\x8c\x0c\n%GetContestedResourceVoteStateResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0H\x00\x1a\xdf\n\n\'GetContestedResourceVoteStateResponseV0\x12\xae\x01\n\x1d\x63ontested_resource_contenders\x18\x01 \x01(\x0b\x32\x84\x01.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContendersH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xd2\x03\n\x10\x46inishedVoteInfo\x12\xad\x01\n\x15\x66inished_vote_outcome\x18\x01 \x01(\x0e\x32\x8d\x01.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome\x12\x1f\n\x12won_by_identity_id\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12 \n\x18\x66inished_at_block_height\x18\x03 \x01(\x04\x12%\n\x1d\x66inished_at_core_block_height\x18\x04 \x01(\r\x12!\n\x19\x66inished_at_block_time_ms\x18\x05 \x01(\x04\x12\x19\n\x11\x66inished_at_epoch\x18\x06 \x01(\r\"O\n\x13\x46inishedVoteOutcome\x12\x14\n\x10TOWARDS_IDENTITY\x10\x00\x12\n\n\x06LOCKED\x10\x01\x12\x16\n\x12NO_PREVIOUS_WINNER\x10\x02\x42\x15\n\x13_won_by_identity_id\x1a\xc4\x03\n\x1b\x43ontestedResourceContenders\x12\x86\x01\n\ncontenders\x18\x01 \x03(\x0b\x32r.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender\x12\x1f\n\x12\x61\x62stain_vote_tally\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x1c\n\x0flock_vote_tally\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x9a\x01\n\x12\x66inished_vote_info\x18\x04 \x01(\x0b\x32y.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfoH\x02\x88\x01\x01\x42\x15\n\x13_abstain_vote_tallyB\x12\n\x10_lock_vote_tallyB\x15\n\x13_finished_vote_info\x1ak\n\tContender\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x17\n\nvote_count\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08\x64ocument\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x42\r\n\x0b_vote_countB\x0b\n\t_documentB\x08\n\x06resultB\t\n\x07version\"\xd5\x05\n,GetContestedResourceVotersForIdentityRequest\x12\x84\x01\n\x02v0\x18\x01 \x01(\x0b\x32v.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0H\x00\x1a\x92\x04\n.GetContestedResourceVotersForIdentityRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x14\n\x0cindex_values\x18\x04 \x03(\x0c\x12\x15\n\rcontestant_id\x18\x05 \x01(\x0c\x12\xb4\x01\n\x18start_at_identifier_info\x18\x06 \x01(\x0b\x32\x8c\x01.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfoH\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x07 \x01(\rH\x01\x88\x01\x01\x12\x17\n\x0forder_ascending\x18\x08 \x01(\x08\x12\r\n\x05prove\x18\t \x01(\x08\x1aT\n\x15StartAtIdentifierInfo\x12\x18\n\x10start_identifier\x18\x01 \x01(\x0c\x12!\n\x19start_identifier_included\x18\x02 \x01(\x08\x42\x1b\n\x19_start_at_identifier_infoB\x08\n\x06_countB\t\n\x07version\"\xf1\x04\n-GetContestedResourceVotersForIdentityResponse\x12\x86\x01\n\x02v0\x18\x01 \x01(\x0b\x32x.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0H\x00\x1a\xab\x03\n/GetContestedResourceVotersForIdentityResponseV0\x12\xb6\x01\n\x19\x63ontested_resource_voters\x18\x01 \x01(\x0b\x32\x90\x01.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVotersH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x43\n\x17\x43ontestedResourceVoters\x12\x0e\n\x06voters\x18\x01 \x03(\x0c\x12\x18\n\x10\x66inished_results\x18\x02 \x01(\x08\x42\x08\n\x06resultB\t\n\x07version\"\xad\x05\n(GetContestedResourceIdentityVotesRequest\x12|\n\x02v0\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0H\x00\x1a\xf7\x03\n*GetContestedResourceIdentityVotesRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x17\n\x0forder_ascending\x18\x04 \x01(\x08\x12\xae\x01\n\x1astart_at_vote_poll_id_info\x18\x05 \x01(\x0b\x32\x84\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfoH\x00\x88\x01\x01\x12\r\n\x05prove\x18\x06 \x01(\x08\x1a\x61\n\x15StartAtVotePollIdInfo\x12 \n\x18start_at_poll_identifier\x18\x01 \x01(\x0c\x12&\n\x1estart_poll_identifier_included\x18\x02 \x01(\x08\x42\x1d\n\x1b_start_at_vote_poll_id_infoB\t\n\x07version\"\xc8\n\n)GetContestedResourceIdentityVotesResponse\x12~\n\x02v0\x18\x01 \x01(\x0b\x32p.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0H\x00\x1a\x8f\t\n+GetContestedResourceIdentityVotesResponseV0\x12\xa1\x01\n\x05votes\x18\x01 \x01(\x0b\x32\x8f\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xf7\x01\n\x1e\x43ontestedResourceIdentityVotes\x12\xba\x01\n!contested_resource_identity_votes\x18\x01 \x03(\x0b\x32\x8e\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote\x12\x18\n\x10\x66inished_results\x18\x02 \x01(\x08\x1a\xad\x02\n\x12ResourceVoteChoice\x12\xad\x01\n\x10vote_choice_type\x18\x01 \x01(\x0e\x32\x92\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType\x12\x18\n\x0bidentity_id\x18\x02 \x01(\x0cH\x00\x88\x01\x01\"=\n\x0eVoteChoiceType\x12\x14\n\x10TOWARDS_IDENTITY\x10\x00\x12\x0b\n\x07\x41\x42STAIN\x10\x01\x12\x08\n\x04LOCK\x10\x02\x42\x0e\n\x0c_identity_id\x1a\x95\x02\n\x1d\x43ontestedResourceIdentityVote\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\'\n\x1fserialized_index_storage_values\x18\x03 \x03(\x0c\x12\x99\x01\n\x0bvote_choice\x18\x04 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoiceB\x08\n\x06resultB\t\n\x07version\"\xf0\x01\n%GetPrefundedSpecializedBalanceRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0H\x00\x1a\x44\n\'GetPrefundedSpecializedBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xe9\x02\n&GetPrefundedSpecializedBalanceResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0H\x00\x1a\xb9\x01\n(GetPrefundedSpecializedBalanceResponseV0\x12\x11\n\x07\x62\x61lance\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xd0\x01\n GetTotalCreditsInPlatformRequest\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0H\x00\x1a\x33\n\"GetTotalCreditsInPlatformRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xd5\x02\n!GetTotalCreditsInPlatformResponse\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0H\x00\x1a\xb4\x01\n#GetTotalCreditsInPlatformResponseV0\x12\x11\n\x07\x63redits\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x16GetPathElementsRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0H\x00\x1a\x45\n\x18GetPathElementsRequestV0\x12\x0c\n\x04path\x18\x01 \x03(\x0c\x12\x0c\n\x04keys\x18\x02 \x03(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xa3\x03\n\x17GetPathElementsResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0H\x00\x1a\xa0\x02\n\x19GetPathElementsResponseV0\x12i\n\x08\x65lements\x18\x01 \x01(\x0b\x32U.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ElementsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1c\n\x08\x45lements\x12\x10\n\x08\x65lements\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\x81\x01\n\x10GetStatusRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0H\x00\x1a\x14\n\x12GetStatusRequestV0B\t\n\x07version\"\x9c\x10\n\x11GetStatusResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0H\x00\x1a\xab\x0f\n\x13GetStatusResponseV0\x12Y\n\x07version\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version\x12S\n\x04node\x18\x02 \x01(\x0b\x32\x45.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node\x12U\n\x05\x63hain\x18\x03 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain\x12Y\n\x07network\x18\x04 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network\x12^\n\nstate_sync\x18\x05 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync\x12S\n\x04time\x18\x06 \x01(\x0b\x32\x45.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time\x1a\xee\x04\n\x07Version\x12\x63\n\x08software\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software\x12\x63\n\x08protocol\x18\x02 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol\x1a^\n\x08Software\x12\x0c\n\x04\x64\x61pi\x18\x01 \x01(\t\x12\x12\n\x05\x64rive\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x17\n\ntenderdash\x18\x03 \x01(\tH\x01\x88\x01\x01\x42\x08\n\x06_driveB\r\n\x0b_tenderdash\x1a\xb8\x02\n\x08Protocol\x12p\n\ntenderdash\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash\x12\x66\n\x05\x64rive\x18\x02 \x01(\x0b\x32W.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive\x1a(\n\nTenderdash\x12\x0b\n\x03p2p\x18\x01 \x01(\r\x12\r\n\x05\x62lock\x18\x02 \x01(\r\x1a(\n\x05\x44rive\x12\x0e\n\x06latest\x18\x03 \x01(\r\x12\x0f\n\x07\x63urrent\x18\x04 \x01(\r\x1as\n\x04Time\x12\r\n\x05local\x18\x01 \x01(\x04\x12\x12\n\x05\x62lock\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07genesis\x18\x03 \x01(\x04H\x01\x88\x01\x01\x12\x12\n\x05\x65poch\x18\x04 \x01(\rH\x02\x88\x01\x01\x42\x08\n\x06_blockB\n\n\x08_genesisB\x08\n\x06_epoch\x1a<\n\x04Node\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x18\n\x0bpro_tx_hash\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0e\n\x0c_pro_tx_hash\x1a\xa7\x02\n\x05\x43hain\x12\x13\n\x0b\x63\x61tching_up\x18\x01 \x01(\x08\x12\x19\n\x11latest_block_hash\x18\x02 \x01(\x0c\x12\x17\n\x0flatest_app_hash\x18\x03 \x01(\x0c\x12\x1b\n\x13latest_block_height\x18\x04 \x01(\x04\x12\x1b\n\x13\x65\x61rliest_block_hash\x18\x05 \x01(\x0c\x12\x19\n\x11\x65\x61rliest_app_hash\x18\x06 \x01(\x0c\x12\x1d\n\x15\x65\x61rliest_block_height\x18\x07 \x01(\x04\x12\x1d\n\x15max_peer_block_height\x18\t \x01(\x04\x12%\n\x18\x63ore_chain_locked_height\x18\n \x01(\rH\x00\x88\x01\x01\x42\x1b\n\x19_core_chain_locked_height\x1a\x43\n\x07Network\x12\x10\n\x08\x63hain_id\x18\x01 \x01(\t\x12\x13\n\x0bpeers_count\x18\x02 \x01(\r\x12\x11\n\tlistening\x18\x03 \x01(\x08\x1a\xe9\x01\n\tStateSync\x12\x19\n\x11total_synced_time\x18\x01 \x01(\x04\x12\x16\n\x0eremaining_time\x18\x02 \x01(\x04\x12\x17\n\x0ftotal_snapshots\x18\x03 \x01(\r\x12\x1e\n\x16\x63hunk_process_avg_time\x18\x04 \x01(\x04\x12\x17\n\x0fsnapshot_height\x18\x05 \x01(\x04\x12\x1d\n\x15snapshot_chunks_count\x18\x06 \x01(\x04\x12\x19\n\x11\x62\x61\x63kfilled_blocks\x18\x07 \x01(\x04\x12\x1d\n\x15\x62\x61\x63kfill_blocks_total\x18\x08 \x01(\x04\x42\t\n\x07version\"\xb1\x01\n\x1cGetCurrentQuorumsInfoRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0H\x00\x1a \n\x1eGetCurrentQuorumsInfoRequestV0B\t\n\x07version\"\xa1\x05\n\x1dGetCurrentQuorumsInfoResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0H\x00\x1a\x46\n\x0bValidatorV0\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07node_ip\x18\x02 \x01(\t\x12\x11\n\tis_banned\x18\x03 \x01(\x08\x1a\xaf\x01\n\x0eValidatorSetV0\x12\x13\n\x0bquorum_hash\x18\x01 \x01(\x0c\x12\x13\n\x0b\x63ore_height\x18\x02 \x01(\r\x12U\n\x07members\x18\x03 \x03(\x0b\x32\x44.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0\x12\x1c\n\x14threshold_public_key\x18\x04 \x01(\x0c\x1a\x92\x02\n\x1fGetCurrentQuorumsInfoResponseV0\x12\x15\n\rquorum_hashes\x18\x01 \x03(\x0c\x12\x1b\n\x13\x63urrent_quorum_hash\x18\x02 \x01(\x0c\x12_\n\x0evalidator_sets\x18\x03 \x03(\x0b\x32G.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0\x12\x1b\n\x13last_block_proposer\x18\x04 \x01(\x0c\x12=\n\x08metadata\x18\x05 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\t\n\x07version*Z\n\nKeyPurpose\x12\x12\n\x0e\x41UTHENTICATION\x10\x00\x12\x0e\n\nENCRYPTION\x10\x01\x12\x0e\n\nDECRYPTION\x10\x02\x12\x0c\n\x08TRANSFER\x10\x03\x12\n\n\x06VOTING\x10\x05\x32\xa4$\n\x08Platform\x12\x93\x01\n\x18\x62roadcastStateTransition\x12:.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest\x1a;.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse\x12l\n\x0bgetIdentity\x12-.org.dash.platform.dapi.v0.GetIdentityRequest\x1a..org.dash.platform.dapi.v0.GetIdentityResponse\x12x\n\x0fgetIdentityKeys\x12\x31.org.dash.platform.dapi.v0.GetIdentityKeysRequest\x1a\x32.org.dash.platform.dapi.v0.GetIdentityKeysResponse\x12\x96\x01\n\x19getIdentitiesContractKeys\x12;.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest\x1a<.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse\x12{\n\x10getIdentityNonce\x12\x32.org.dash.platform.dapi.v0.GetIdentityNonceRequest\x1a\x33.org.dash.platform.dapi.v0.GetIdentityNonceResponse\x12\x93\x01\n\x18getIdentityContractNonce\x12:.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest\x1a;.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse\x12\x81\x01\n\x12getIdentityBalance\x12\x34.org.dash.platform.dapi.v0.GetIdentityBalanceRequest\x1a\x35.org.dash.platform.dapi.v0.GetIdentityBalanceResponse\x12\x8a\x01\n\x15getIdentitiesBalances\x12\x37.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest\x1a\x38.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse\x12\xa2\x01\n\x1dgetIdentityBalanceAndRevision\x12?.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest\x1a@.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse\x12\xaf\x01\n#getEvonodesProposedEpochBlocksByIds\x12\x45.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest\x1a\x41.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse\x12\xb3\x01\n%getEvonodesProposedEpochBlocksByRange\x12G.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest\x1a\x41.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse\x12\x66\n\tgetProofs\x12+.org.dash.platform.dapi.v0.GetProofsRequest\x1a,.org.dash.platform.dapi.v0.GetProofsResponse\x12x\n\x0fgetDataContract\x12\x31.org.dash.platform.dapi.v0.GetDataContractRequest\x1a\x32.org.dash.platform.dapi.v0.GetDataContractResponse\x12\x8d\x01\n\x16getDataContractHistory\x12\x38.org.dash.platform.dapi.v0.GetDataContractHistoryRequest\x1a\x39.org.dash.platform.dapi.v0.GetDataContractHistoryResponse\x12{\n\x10getDataContracts\x12\x32.org.dash.platform.dapi.v0.GetDataContractsRequest\x1a\x33.org.dash.platform.dapi.v0.GetDataContractsResponse\x12o\n\x0cgetDocuments\x12..org.dash.platform.dapi.v0.GetDocumentsRequest\x1a/.org.dash.platform.dapi.v0.GetDocumentsResponse\x12\x99\x01\n\x1agetIdentityByPublicKeyHash\x12<.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest\x1a=.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse\x12\x9f\x01\n\x1cwaitForStateTransitionResult\x12>.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest\x1a?.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse\x12\x81\x01\n\x12getConsensusParams\x12\x34.org.dash.platform.dapi.v0.GetConsensusParamsRequest\x1a\x35.org.dash.platform.dapi.v0.GetConsensusParamsResponse\x12\xa5\x01\n\x1egetProtocolVersionUpgradeState\x12@.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest\x1a\x41.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse\x12\xb4\x01\n#getProtocolVersionUpgradeVoteStatus\x12\x45.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest\x1a\x46.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse\x12r\n\rgetEpochsInfo\x12/.org.dash.platform.dapi.v0.GetEpochsInfoRequest\x1a\x30.org.dash.platform.dapi.v0.GetEpochsInfoResponse\x12\x8a\x01\n\x15getContestedResources\x12\x37.org.dash.platform.dapi.v0.GetContestedResourcesRequest\x1a\x38.org.dash.platform.dapi.v0.GetContestedResourcesResponse\x12\xa2\x01\n\x1dgetContestedResourceVoteState\x12?.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest\x1a@.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse\x12\xba\x01\n%getContestedResourceVotersForIdentity\x12G.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest\x1aH.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse\x12\xae\x01\n!getContestedResourceIdentityVotes\x12\x43.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest\x1a\x44.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse\x12\x8a\x01\n\x15getVotePollsByEndDate\x12\x37.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest\x1a\x38.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse\x12\xa5\x01\n\x1egetPrefundedSpecializedBalance\x12@.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest\x1a\x41.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse\x12\x96\x01\n\x19getTotalCreditsInPlatform\x12;.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest\x1a<.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse\x12x\n\x0fgetPathElements\x12\x31.org.dash.platform.dapi.v0.GetPathElementsRequest\x1a\x32.org.dash.platform.dapi.v0.GetPathElementsResponse\x12\x66\n\tgetStatus\x12+.org.dash.platform.dapi.v0.GetStatusRequest\x1a,.org.dash.platform.dapi.v0.GetStatusResponse\x12\x8a\x01\n\x15getCurrentQuorumsInfo\x12\x37.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest\x1a\x38.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponseb\x06proto3' , dependencies=[google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,]) @@ -62,8 +62,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=30656, - serialized_end=30746, + serialized_start=31512, + serialized_end=31602, ) _sym_db.RegisterEnumDescriptor(_KEYPURPOSE) @@ -8258,6 +8258,260 @@ serialized_end=30654, ) + +_GETCURRENTQUORUMSINFOREQUEST_GETCURRENTQUORUMSINFOREQUESTV0 = _descriptor.Descriptor( + name='GetCurrentQuorumsInfoRequestV0', + full_name='org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=30791, + serialized_end=30823, +) + +_GETCURRENTQUORUMSINFOREQUEST = _descriptor.Descriptor( + name='GetCurrentQuorumsInfoRequest', + full_name='org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETCURRENTQUORUMSINFOREQUEST_GETCURRENTQUORUMSINFOREQUESTV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=30657, + serialized_end=30834, +) + + +_GETCURRENTQUORUMSINFORESPONSE_VALIDATORV0 = _descriptor.Descriptor( + name='ValidatorV0', + full_name='org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='pro_tx_hash', full_name='org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.pro_tx_hash', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='node_ip', full_name='org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.node_ip', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='is_banned', full_name='org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.is_banned', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=30974, + serialized_end=31044, +) + +_GETCURRENTQUORUMSINFORESPONSE_VALIDATORSETV0 = _descriptor.Descriptor( + name='ValidatorSetV0', + full_name='org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='quorum_hash', full_name='org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.quorum_hash', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='core_height', full_name='org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.core_height', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='members', full_name='org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.members', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='threshold_public_key', full_name='org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.threshold_public_key', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=31047, + serialized_end=31222, +) + +_GETCURRENTQUORUMSINFORESPONSE_GETCURRENTQUORUMSINFORESPONSEV0 = _descriptor.Descriptor( + name='GetCurrentQuorumsInfoResponseV0', + full_name='org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='quorum_hashes', full_name='org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.quorum_hashes', index=0, + number=1, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='current_quorum_hash', full_name='org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.current_quorum_hash', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='validator_sets', full_name='org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.validator_sets', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='last_block_proposer', full_name='org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.last_block_proposer', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='metadata', full_name='org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.metadata', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=31225, + serialized_end=31499, +) + +_GETCURRENTQUORUMSINFORESPONSE = _descriptor.Descriptor( + name='GetCurrentQuorumsInfoResponse', + full_name='org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETCURRENTQUORUMSINFORESPONSE_VALIDATORV0, _GETCURRENTQUORUMSINFORESPONSE_VALIDATORSETV0, _GETCURRENTQUORUMSINFORESPONSE_GETCURRENTQUORUMSINFORESPONSEV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=30837, + serialized_end=31510, +) + _GETIDENTITYREQUEST_GETIDENTITYREQUESTV0.containing_type = _GETIDENTITYREQUEST _GETIDENTITYREQUEST.fields_by_name['v0'].message_type = _GETIDENTITYREQUEST_GETIDENTITYREQUESTV0 _GETIDENTITYREQUEST.oneofs_by_name['version'].fields.append( @@ -9020,6 +9274,21 @@ _GETSTATUSRESPONSE.oneofs_by_name['version'].fields.append( _GETSTATUSRESPONSE.fields_by_name['v0']) _GETSTATUSRESPONSE.fields_by_name['v0'].containing_oneof = _GETSTATUSRESPONSE.oneofs_by_name['version'] +_GETCURRENTQUORUMSINFOREQUEST_GETCURRENTQUORUMSINFOREQUESTV0.containing_type = _GETCURRENTQUORUMSINFOREQUEST +_GETCURRENTQUORUMSINFOREQUEST.fields_by_name['v0'].message_type = _GETCURRENTQUORUMSINFOREQUEST_GETCURRENTQUORUMSINFOREQUESTV0 +_GETCURRENTQUORUMSINFOREQUEST.oneofs_by_name['version'].fields.append( + _GETCURRENTQUORUMSINFOREQUEST.fields_by_name['v0']) +_GETCURRENTQUORUMSINFOREQUEST.fields_by_name['v0'].containing_oneof = _GETCURRENTQUORUMSINFOREQUEST.oneofs_by_name['version'] +_GETCURRENTQUORUMSINFORESPONSE_VALIDATORV0.containing_type = _GETCURRENTQUORUMSINFORESPONSE +_GETCURRENTQUORUMSINFORESPONSE_VALIDATORSETV0.fields_by_name['members'].message_type = _GETCURRENTQUORUMSINFORESPONSE_VALIDATORV0 +_GETCURRENTQUORUMSINFORESPONSE_VALIDATORSETV0.containing_type = _GETCURRENTQUORUMSINFORESPONSE +_GETCURRENTQUORUMSINFORESPONSE_GETCURRENTQUORUMSINFORESPONSEV0.fields_by_name['validator_sets'].message_type = _GETCURRENTQUORUMSINFORESPONSE_VALIDATORSETV0 +_GETCURRENTQUORUMSINFORESPONSE_GETCURRENTQUORUMSINFORESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA +_GETCURRENTQUORUMSINFORESPONSE_GETCURRENTQUORUMSINFORESPONSEV0.containing_type = _GETCURRENTQUORUMSINFORESPONSE +_GETCURRENTQUORUMSINFORESPONSE.fields_by_name['v0'].message_type = _GETCURRENTQUORUMSINFORESPONSE_GETCURRENTQUORUMSINFORESPONSEV0 +_GETCURRENTQUORUMSINFORESPONSE.oneofs_by_name['version'].fields.append( + _GETCURRENTQUORUMSINFORESPONSE.fields_by_name['v0']) +_GETCURRENTQUORUMSINFORESPONSE.fields_by_name['v0'].containing_oneof = _GETCURRENTQUORUMSINFORESPONSE.oneofs_by_name['version'] DESCRIPTOR.message_types_by_name['Proof'] = _PROOF DESCRIPTOR.message_types_by_name['ResponseMetadata'] = _RESPONSEMETADATA DESCRIPTOR.message_types_by_name['StateTransitionBroadcastError'] = _STATETRANSITIONBROADCASTERROR @@ -9089,6 +9358,8 @@ DESCRIPTOR.message_types_by_name['GetPathElementsResponse'] = _GETPATHELEMENTSRESPONSE DESCRIPTOR.message_types_by_name['GetStatusRequest'] = _GETSTATUSREQUEST DESCRIPTOR.message_types_by_name['GetStatusResponse'] = _GETSTATUSRESPONSE +DESCRIPTOR.message_types_by_name['GetCurrentQuorumsInfoRequest'] = _GETCURRENTQUORUMSINFOREQUEST +DESCRIPTOR.message_types_by_name['GetCurrentQuorumsInfoResponse'] = _GETCURRENTQUORUMSINFORESPONSE DESCRIPTOR.enum_types_by_name['KeyPurpose'] = _KEYPURPOSE _sym_db.RegisterFileDescriptor(DESCRIPTOR) @@ -10495,6 +10766,52 @@ _sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0.Network) _sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0.StateSync) +GetCurrentQuorumsInfoRequest = _reflection.GeneratedProtocolMessageType('GetCurrentQuorumsInfoRequest', (_message.Message,), { + + 'GetCurrentQuorumsInfoRequestV0' : _reflection.GeneratedProtocolMessageType('GetCurrentQuorumsInfoRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETCURRENTQUORUMSINFOREQUEST_GETCURRENTQUORUMSINFOREQUESTV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0) + }) + , + 'DESCRIPTOR' : _GETCURRENTQUORUMSINFOREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest) + }) +_sym_db.RegisterMessage(GetCurrentQuorumsInfoRequest) +_sym_db.RegisterMessage(GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0) + +GetCurrentQuorumsInfoResponse = _reflection.GeneratedProtocolMessageType('GetCurrentQuorumsInfoResponse', (_message.Message,), { + + 'ValidatorV0' : _reflection.GeneratedProtocolMessageType('ValidatorV0', (_message.Message,), { + 'DESCRIPTOR' : _GETCURRENTQUORUMSINFORESPONSE_VALIDATORV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0) + }) + , + + 'ValidatorSetV0' : _reflection.GeneratedProtocolMessageType('ValidatorSetV0', (_message.Message,), { + 'DESCRIPTOR' : _GETCURRENTQUORUMSINFORESPONSE_VALIDATORSETV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0) + }) + , + + 'GetCurrentQuorumsInfoResponseV0' : _reflection.GeneratedProtocolMessageType('GetCurrentQuorumsInfoResponseV0', (_message.Message,), { + 'DESCRIPTOR' : _GETCURRENTQUORUMSINFORESPONSE_GETCURRENTQUORUMSINFORESPONSEV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0) + }) + , + 'DESCRIPTOR' : _GETCURRENTQUORUMSINFORESPONSE, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse) + }) +_sym_db.RegisterMessage(GetCurrentQuorumsInfoResponse) +_sym_db.RegisterMessage(GetCurrentQuorumsInfoResponse.ValidatorV0) +_sym_db.RegisterMessage(GetCurrentQuorumsInfoResponse.ValidatorSetV0) +_sym_db.RegisterMessage(GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0) + _SEARCHKEY_PURPOSEMAPENTRY._options = None _SECURITYLEVELMAP_SECURITYLEVELMAPENTRY._options = None @@ -10506,8 +10823,8 @@ index=0, serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_start=30749, - serialized_end=35252, + serialized_start=31605, + serialized_end=36249, methods=[ _descriptor.MethodDescriptor( name='broadcastStateTransition', @@ -10819,6 +11136,16 @@ serialized_options=None, create_key=_descriptor._internal_create_key, ), + _descriptor.MethodDescriptor( + name='getCurrentQuorumsInfo', + full_name='org.dash.platform.dapi.v0.Platform.getCurrentQuorumsInfo', + index=31, + containing_service=None, + input_type=_GETCURRENTQUORUMSINFOREQUEST, + output_type=_GETCURRENTQUORUMSINFORESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), ]) _sym_db.RegisterServiceDescriptor(_PLATFORM) diff --git a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py index 4c1c93e835..b8c3847869 100644 --- a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py +++ b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py @@ -169,6 +169,11 @@ def __init__(self, channel): request_serializer=platform__pb2.GetStatusRequest.SerializeToString, response_deserializer=platform__pb2.GetStatusResponse.FromString, ) + self.getCurrentQuorumsInfo = channel.unary_unary( + '/org.dash.platform.dapi.v0.Platform/getCurrentQuorumsInfo', + request_serializer=platform__pb2.GetCurrentQuorumsInfoRequest.SerializeToString, + response_deserializer=platform__pb2.GetCurrentQuorumsInfoResponse.FromString, + ) class PlatformServicer(object): @@ -365,6 +370,12 @@ def getStatus(self, request, context): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') + def getCurrentQuorumsInfo(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + def add_PlatformServicer_to_server(servicer, server): rpc_method_handlers = { @@ -523,6 +534,11 @@ def add_PlatformServicer_to_server(servicer, server): request_deserializer=platform__pb2.GetStatusRequest.FromString, response_serializer=platform__pb2.GetStatusResponse.SerializeToString, ), + 'getCurrentQuorumsInfo': grpc.unary_unary_rpc_method_handler( + servicer.getCurrentQuorumsInfo, + request_deserializer=platform__pb2.GetCurrentQuorumsInfoRequest.FromString, + response_serializer=platform__pb2.GetCurrentQuorumsInfoResponse.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( 'org.dash.platform.dapi.v0.Platform', rpc_method_handlers) @@ -1059,3 +1075,20 @@ def getStatus(request, platform__pb2.GetStatusResponse.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def getCurrentQuorumsInfo(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Platform/getCurrentQuorumsInfo', + platform__pb2.GetCurrentQuorumsInfoRequest.SerializeToString, + platform__pb2.GetCurrentQuorumsInfoResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts index f179705949..e9028523b9 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts @@ -5816,6 +5816,194 @@ export namespace GetStatusResponse { } } +export class GetCurrentQuorumsInfoRequest extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0 | undefined; + setV0(value?: GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0): void; + + getVersionCase(): GetCurrentQuorumsInfoRequest.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetCurrentQuorumsInfoRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetCurrentQuorumsInfoRequest): GetCurrentQuorumsInfoRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetCurrentQuorumsInfoRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetCurrentQuorumsInfoRequest; + static deserializeBinaryFromReader(message: GetCurrentQuorumsInfoRequest, reader: jspb.BinaryReader): GetCurrentQuorumsInfoRequest; +} + +export namespace GetCurrentQuorumsInfoRequest { + export type AsObject = { + v0?: GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.AsObject, + } + + export class GetCurrentQuorumsInfoRequestV0 extends jspb.Message { + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetCurrentQuorumsInfoRequestV0.AsObject; + static toObject(includeInstance: boolean, msg: GetCurrentQuorumsInfoRequestV0): GetCurrentQuorumsInfoRequestV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetCurrentQuorumsInfoRequestV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetCurrentQuorumsInfoRequestV0; + static deserializeBinaryFromReader(message: GetCurrentQuorumsInfoRequestV0, reader: jspb.BinaryReader): GetCurrentQuorumsInfoRequestV0; + } + + export namespace GetCurrentQuorumsInfoRequestV0 { + export type AsObject = { + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetCurrentQuorumsInfoResponse extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0 | undefined; + setV0(value?: GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0): void; + + getVersionCase(): GetCurrentQuorumsInfoResponse.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetCurrentQuorumsInfoResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetCurrentQuorumsInfoResponse): GetCurrentQuorumsInfoResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetCurrentQuorumsInfoResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetCurrentQuorumsInfoResponse; + static deserializeBinaryFromReader(message: GetCurrentQuorumsInfoResponse, reader: jspb.BinaryReader): GetCurrentQuorumsInfoResponse; +} + +export namespace GetCurrentQuorumsInfoResponse { + export type AsObject = { + v0?: GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.AsObject, + } + + export class ValidatorV0 extends jspb.Message { + getProTxHash(): Uint8Array | string; + getProTxHash_asU8(): Uint8Array; + getProTxHash_asB64(): string; + setProTxHash(value: Uint8Array | string): void; + + getNodeIp(): string; + setNodeIp(value: string): void; + + getIsBanned(): boolean; + setIsBanned(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): ValidatorV0.AsObject; + static toObject(includeInstance: boolean, msg: ValidatorV0): ValidatorV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: ValidatorV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): ValidatorV0; + static deserializeBinaryFromReader(message: ValidatorV0, reader: jspb.BinaryReader): ValidatorV0; + } + + export namespace ValidatorV0 { + export type AsObject = { + proTxHash: Uint8Array | string, + nodeIp: string, + isBanned: boolean, + } + } + + export class ValidatorSetV0 extends jspb.Message { + getQuorumHash(): Uint8Array | string; + getQuorumHash_asU8(): Uint8Array; + getQuorumHash_asB64(): string; + setQuorumHash(value: Uint8Array | string): void; + + getCoreHeight(): number; + setCoreHeight(value: number): void; + + clearMembersList(): void; + getMembersList(): Array; + setMembersList(value: Array): void; + addMembers(value?: GetCurrentQuorumsInfoResponse.ValidatorV0, index?: number): GetCurrentQuorumsInfoResponse.ValidatorV0; + + getThresholdPublicKey(): Uint8Array | string; + getThresholdPublicKey_asU8(): Uint8Array; + getThresholdPublicKey_asB64(): string; + setThresholdPublicKey(value: Uint8Array | string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): ValidatorSetV0.AsObject; + static toObject(includeInstance: boolean, msg: ValidatorSetV0): ValidatorSetV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: ValidatorSetV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): ValidatorSetV0; + static deserializeBinaryFromReader(message: ValidatorSetV0, reader: jspb.BinaryReader): ValidatorSetV0; + } + + export namespace ValidatorSetV0 { + export type AsObject = { + quorumHash: Uint8Array | string, + coreHeight: number, + membersList: Array, + thresholdPublicKey: Uint8Array | string, + } + } + + export class GetCurrentQuorumsInfoResponseV0 extends jspb.Message { + clearQuorumHashesList(): void; + getQuorumHashesList(): Array; + getQuorumHashesList_asU8(): Array; + getQuorumHashesList_asB64(): Array; + setQuorumHashesList(value: Array): void; + addQuorumHashes(value: Uint8Array | string, index?: number): Uint8Array | string; + + getCurrentQuorumHash(): Uint8Array | string; + getCurrentQuorumHash_asU8(): Uint8Array; + getCurrentQuorumHash_asB64(): string; + setCurrentQuorumHash(value: Uint8Array | string): void; + + clearValidatorSetsList(): void; + getValidatorSetsList(): Array; + setValidatorSetsList(value: Array): void; + addValidatorSets(value?: GetCurrentQuorumsInfoResponse.ValidatorSetV0, index?: number): GetCurrentQuorumsInfoResponse.ValidatorSetV0; + + getLastBlockProposer(): Uint8Array | string; + getLastBlockProposer_asU8(): Uint8Array; + getLastBlockProposer_asB64(): string; + setLastBlockProposer(value: Uint8Array | string): void; + + hasMetadata(): boolean; + clearMetadata(): void; + getMetadata(): ResponseMetadata | undefined; + setMetadata(value?: ResponseMetadata): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetCurrentQuorumsInfoResponseV0.AsObject; + static toObject(includeInstance: boolean, msg: GetCurrentQuorumsInfoResponseV0): GetCurrentQuorumsInfoResponseV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetCurrentQuorumsInfoResponseV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetCurrentQuorumsInfoResponseV0; + static deserializeBinaryFromReader(message: GetCurrentQuorumsInfoResponseV0, reader: jspb.BinaryReader): GetCurrentQuorumsInfoResponseV0; + } + + export namespace GetCurrentQuorumsInfoResponseV0 { + export type AsObject = { + quorumHashesList: Array, + currentQuorumHash: Uint8Array | string, + validatorSetsList: Array, + lastBlockProposer: Uint8Array | string, + metadata?: ResponseMetadata.AsObject, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + export interface KeyPurposeMap { AUTHENTICATION: 0; ENCRYPTION: 1; diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js index 5f0abd5da9..ca80ce2ad7 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js @@ -75,6 +75,14 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ResultCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.VersionCase', null, { proto }); @@ -4122,6 +4130,132 @@ if (goog.DEBUG && !COMPILED) { */ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.displayName = 'proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.displayName = 'proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.displayName = 'proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0'; +} @@ -44031,6 +44165,1363 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.hasV0 = function() { }; + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + +/** + * optional GetCurrentQuorumsInfoRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.toObject = function(includeInstance, msg) { + var f, obj = { + proTxHash: msg.getProTxHash_asB64(), + nodeIp: jspb.Message.getFieldWithDefault(msg, 2, ""), + isBanned: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setProTxHash(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setNodeIp(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setIsBanned(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getProTxHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getNodeIp(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getIsBanned(); + if (f) { + writer.writeBool( + 3, + f + ); + } +}; + + +/** + * optional bytes pro_tx_hash = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getProTxHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes pro_tx_hash = 1; + * This is a type-conversion wrapper around `getProTxHash()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getProTxHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getProTxHash())); +}; + + +/** + * optional bytes pro_tx_hash = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getProTxHash()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getProTxHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getProTxHash())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.setProTxHash = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional string node_ip = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getNodeIp = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.setNodeIp = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional bool is_banned = 3; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getIsBanned = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.setIsBanned = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.repeatedFields_ = [3]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.toObject = function(includeInstance, msg) { + var f, obj = { + quorumHash: msg.getQuorumHash_asB64(), + coreHeight: jspb.Message.getFieldWithDefault(msg, 2, 0), + membersList: jspb.Message.toObjectList(msg.getMembersList(), + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.toObject, includeInstance), + thresholdPublicKey: msg.getThresholdPublicKey_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setQuorumHash(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCoreHeight(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinaryFromReader); + msg.addMembers(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setThresholdPublicKey(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getQuorumHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getCoreHeight(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } + f = message.getMembersList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.serializeBinaryToWriter + ); + } + f = message.getThresholdPublicKey_asU8(); + if (f.length > 0) { + writer.writeBytes( + 4, + f + ); + } +}; + + +/** + * optional bytes quorum_hash = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getQuorumHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes quorum_hash = 1; + * This is a type-conversion wrapper around `getQuorumHash()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getQuorumHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getQuorumHash())); +}; + + +/** + * optional bytes quorum_hash = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getQuorumHash()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getQuorumHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getQuorumHash())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setQuorumHash = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional uint32 core_height = 2; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getCoreHeight = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setCoreHeight = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + +/** + * repeated ValidatorV0 members = 3; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getMembersList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0, 3)); +}; + + +/** + * @param {!Array} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setMembersList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 3, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.addMembers = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.clearMembersList = function() { + return this.setMembersList([]); +}; + + +/** + * optional bytes threshold_public_key = 4; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getThresholdPublicKey = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * optional bytes threshold_public_key = 4; + * This is a type-conversion wrapper around `getThresholdPublicKey()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getThresholdPublicKey_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getThresholdPublicKey())); +}; + + +/** + * optional bytes threshold_public_key = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getThresholdPublicKey()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getThresholdPublicKey_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getThresholdPublicKey())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setThresholdPublicKey = function(value) { + return jspb.Message.setProto3BytesField(this, 4, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.repeatedFields_ = [1,3]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + quorumHashesList: msg.getQuorumHashesList_asB64(), + currentQuorumHash: msg.getCurrentQuorumHash_asB64(), + validatorSetsList: jspb.Message.toObjectList(msg.getValidatorSetsList(), + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.toObject, includeInstance), + lastBlockProposer: msg.getLastBlockProposer_asB64(), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addQuorumHashes(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setCurrentQuorumHash(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinaryFromReader); + msg.addValidatorSets(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setLastBlockProposer(value); + break; + case 5: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getQuorumHashesList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } + f = message.getCurrentQuorumHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } + f = message.getValidatorSetsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.serializeBinaryToWriter + ); + } + f = message.getLastBlockProposer_asU8(); + if (f.length > 0) { + writer.writeBytes( + 4, + f + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 5, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated bytes quorum_hashes = 1; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getQuorumHashesList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes quorum_hashes = 1; + * This is a type-conversion wrapper around `getQuorumHashesList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getQuorumHashesList_asB64 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsB64( + this.getQuorumHashesList())); +}; + + +/** + * repeated bytes quorum_hashes = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getQuorumHashesList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getQuorumHashesList_asU8 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsU8( + this.getQuorumHashesList())); +}; + + +/** + * @param {!(Array|Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setQuorumHashesList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.addQuorumHashes = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.clearQuorumHashesList = function() { + return this.setQuorumHashesList([]); +}; + + +/** + * optional bytes current_quorum_hash = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getCurrentQuorumHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes current_quorum_hash = 2; + * This is a type-conversion wrapper around `getCurrentQuorumHash()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getCurrentQuorumHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getCurrentQuorumHash())); +}; + + +/** + * optional bytes current_quorum_hash = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getCurrentQuorumHash()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getCurrentQuorumHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getCurrentQuorumHash())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setCurrentQuorumHash = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +/** + * repeated ValidatorSetV0 validator_sets = 3; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getValidatorSetsList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0, 3)); +}; + + +/** + * @param {!Array} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setValidatorSetsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 3, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.addValidatorSets = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.clearValidatorSetsList = function() { + return this.setValidatorSetsList([]); +}; + + +/** + * optional bytes last_block_proposer = 4; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getLastBlockProposer = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * optional bytes last_block_proposer = 4; + * This is a type-conversion wrapper around `getLastBlockProposer()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getLastBlockProposer_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getLastBlockProposer())); +}; + + +/** + * optional bytes last_block_proposer = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getLastBlockProposer()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getLastBlockProposer_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getLastBlockProposer())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setLastBlockProposer = function(value) { + return jspb.Message.setProto3BytesField(this, 4, value); +}; + + +/** + * optional ResponseMetadata metadata = 5; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 5)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 5, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 5) != null; +}; + + +/** + * optional GetCurrentQuorumsInfoResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + /** * @enum {number} */ diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts index 6488351eb1..11bc954b2d 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts @@ -283,6 +283,15 @@ type PlatformgetStatus = { readonly responseType: typeof platform_pb.GetStatusResponse; }; +type PlatformgetCurrentQuorumsInfo = { + readonly methodName: string; + readonly service: typeof Platform; + readonly requestStream: false; + readonly responseStream: false; + readonly requestType: typeof platform_pb.GetCurrentQuorumsInfoRequest; + readonly responseType: typeof platform_pb.GetCurrentQuorumsInfoResponse; +}; + export class Platform { static readonly serviceName: string; static readonly broadcastStateTransition: PlatformbroadcastStateTransition; @@ -316,6 +325,7 @@ export class Platform { static readonly getTotalCreditsInPlatform: PlatformgetTotalCreditsInPlatform; static readonly getPathElements: PlatformgetPathElements; static readonly getStatus: PlatformgetStatus; + static readonly getCurrentQuorumsInfo: PlatformgetCurrentQuorumsInfo; } export type ServiceError = { message: string, code: number; metadata: grpc.Metadata } @@ -629,5 +639,14 @@ export class PlatformClient { requestMessage: platform_pb.GetStatusRequest, callback: (error: ServiceError|null, responseMessage: platform_pb.GetStatusResponse|null) => void ): UnaryResponse; + getCurrentQuorumsInfo( + requestMessage: platform_pb.GetCurrentQuorumsInfoRequest, + metadata: grpc.Metadata, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetCurrentQuorumsInfoResponse|null) => void + ): UnaryResponse; + getCurrentQuorumsInfo( + requestMessage: platform_pb.GetCurrentQuorumsInfoRequest, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetCurrentQuorumsInfoResponse|null) => void + ): UnaryResponse; } diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js index 103a394fea..5ba77dbcd4 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js @@ -289,6 +289,15 @@ Platform.getStatus = { responseType: platform_pb.GetStatusResponse }; +Platform.getCurrentQuorumsInfo = { + methodName: "getCurrentQuorumsInfo", + service: Platform, + requestStream: false, + responseStream: false, + requestType: platform_pb.GetCurrentQuorumsInfoRequest, + responseType: platform_pb.GetCurrentQuorumsInfoResponse +}; + exports.Platform = Platform; function PlatformClient(serviceHost, options) { @@ -1257,5 +1266,36 @@ PlatformClient.prototype.getStatus = function getStatus(requestMessage, metadata }; }; +PlatformClient.prototype.getCurrentQuorumsInfo = function getCurrentQuorumsInfo(requestMessage, metadata, callback) { + if (arguments.length === 2) { + callback = arguments[1]; + } + var client = grpc.unary(Platform.getCurrentQuorumsInfo, { + request: requestMessage, + host: this.serviceHost, + metadata: metadata, + transport: this.options.transport, + debug: this.options.debug, + onEnd: function (response) { + if (callback) { + if (response.status !== grpc.Code.OK) { + var err = new Error(response.statusMessage); + err.code = response.status; + err.metadata = response.trailers; + callback(err, null); + } else { + callback(null, response.message); + } + } + } + }); + return { + cancel: function () { + callback = null; + client.close(); + } + }; +}; + exports.PlatformClient = PlatformClient; diff --git a/packages/dapi-grpc/protos/platform/v0/platform.proto b/packages/dapi-grpc/protos/platform/v0/platform.proto index b690d3f7cc..b46d784ceb 100644 --- a/packages/dapi-grpc/protos/platform/v0/platform.proto +++ b/packages/dapi-grpc/protos/platform/v0/platform.proto @@ -54,6 +54,7 @@ service Platform { rpc getTotalCreditsInPlatform(GetTotalCreditsInPlatformRequest) returns (GetTotalCreditsInPlatformResponse); rpc getPathElements(GetPathElementsRequest) returns (GetPathElementsResponse); rpc getStatus(GetStatusRequest) returns (GetStatusResponse); + rpc getCurrentQuorumsInfo(GetCurrentQuorumsInfoRequest) returns (GetCurrentQuorumsInfoResponse); } // Proof message includes cryptographic proofs for validating responses @@ -1184,3 +1185,33 @@ message GetStatusResponse { oneof version { GetStatusResponseV0 v0 = 1; } } + +message GetCurrentQuorumsInfoRequest { + message GetCurrentQuorumsInfoRequestV0 { + } + + oneof version { GetCurrentQuorumsInfoRequestV0 v0 = 1; } +} + +message GetCurrentQuorumsInfoResponse { + message ValidatorV0 { + bytes pro_tx_hash = 1; + string node_ip = 2; + bool is_banned = 3; + } + message ValidatorSetV0 { + bytes quorum_hash = 1; + uint32 core_height = 2; + repeated ValidatorV0 members = 3; + bytes threshold_public_key = 4; + } + + message GetCurrentQuorumsInfoResponseV0 { + repeated bytes quorum_hashes = 1; + bytes current_quorum_hash = 2; + repeated ValidatorSetV0 validator_sets = 3; + bytes last_block_proposer = 4; + ResponseMetadata metadata = 5; + } + oneof version { GetCurrentQuorumsInfoResponseV0 v0 = 1; } +} diff --git a/packages/rs-dapi-client/src/transport/grpc.rs b/packages/rs-dapi-client/src/transport/grpc.rs index 9350696e75..4cfa0c2649 100644 --- a/packages/rs-dapi-client/src/transport/grpc.rs +++ b/packages/rs-dapi-client/src/transport/grpc.rs @@ -376,6 +376,15 @@ impl_transport_request_grpc!( get_total_credits_in_platform ); +// rpc getCurrentQuorumsInfo(GetCurrentQuorumsInfoRequest) returns (GetCurrentQuorumsInfoResponse); +impl_transport_request_grpc!( + platform_proto::GetCurrentQuorumsInfoRequest, + platform_proto::GetCurrentQuorumsInfoResponse, + PlatformGrpcClient, + RequestSettings::default(), + get_current_quorums_info +); + // Link to each core gRPC request what client and method to use: impl_transport_request_grpc!( diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 1c3d3bf544..122a75930e 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -89,6 +89,9 @@ all_features = [ "identity-hashing", "identity-serialization", "ciborium", + "core-types", + "core-types-serialization", + "core-types-serde-conversion", "document-serde-conversion", "document-value-conversion", "document-json-conversion", @@ -131,6 +134,9 @@ dash-sdk-features = [ "document-value-conversion", "data-contract-value-conversion", "identity-value-conversion", + "core-types", + "core-types-serialization", + "core-types-serde-conversion", "state-transition-serde-conversion", "state-transition-value-conversion", "state-transition-json-conversion", @@ -152,6 +158,9 @@ all_features_without_client = [ "identity-hashing", "identity-serialization", "ciborium", + "core-types", + "core-types-serialization", + "core-types-serde-conversion", "document-serde-conversion", "document-value-conversion", "document-json-conversion", @@ -189,6 +198,9 @@ abci = [ "identity-serialization", "vote-serialization", "platform-value-cbor", + "core-types", + "core-types-serialization", + "core-types-serde-conversion", ] cbor = ["ciborium"] validation = [ @@ -261,6 +273,9 @@ state-transition-signing = [ ] vote-serialization = [] vote-serde-conversion = [] +core-types = ["bls-signatures"] +core-types-serialization = ["core-types"] +core-types-serde-conversion = ["core-types"] state-transitions = [] system_contracts = ["factories", "data-contracts", "platform-value-json"] fixtures-and-mocks = ["system_contracts", "platform-value/json"] diff --git a/packages/rs-dpp/src/core_types/mod.rs b/packages/rs-dpp/src/core_types/mod.rs new file mode 100644 index 0000000000..10572cdf0f --- /dev/null +++ b/packages/rs-dpp/src/core_types/mod.rs @@ -0,0 +1,2 @@ +pub mod validator; +pub mod validator_set; diff --git a/packages/rs-dpp/src/core_types/validator/mod.rs b/packages/rs-dpp/src/core_types/validator/mod.rs new file mode 100644 index 0000000000..2261bac56f --- /dev/null +++ b/packages/rs-dpp/src/core_types/validator/mod.rs @@ -0,0 +1,119 @@ +use crate::bls_signatures::PublicKey as BlsPublicKey; +use crate::core_types::validator::v0::{ValidatorV0, ValidatorV0Getters, ValidatorV0Setters}; +use dashcore::{ProTxHash, PubkeyHash}; +#[cfg(feature = "core-types-serde-conversion")] +use serde::{Deserialize, Serialize}; + +/// Version 0 +pub mod v0; + +/// A validator in the context of a quorum +#[derive(Clone, Debug, Eq, PartialEq)] +#[cfg_attr( + feature = "core-types-serde-conversion", + derive(Serialize, Deserialize) +)] +pub enum Validator { + /// Version 0 + V0(ValidatorV0), +} + +impl ValidatorV0Getters for Validator { + fn pro_tx_hash(&self) -> &ProTxHash { + match self { + Validator::V0(v0) => v0.pro_tx_hash(), + } + } + + fn public_key(&self) -> &Option { + match self { + Validator::V0(v0) => v0.public_key(), + } + } + + fn node_ip(&self) -> &String { + match self { + Validator::V0(v0) => v0.node_ip(), + } + } + + fn node_id(&self) -> &PubkeyHash { + match self { + Validator::V0(v0) => v0.node_id(), + } + } + + fn core_port(&self) -> u16 { + match self { + Validator::V0(v0) => v0.core_port(), + } + } + + fn platform_http_port(&self) -> u16 { + match self { + Validator::V0(v0) => v0.platform_http_port(), + } + } + + fn platform_p2p_port(&self) -> u16 { + match self { + Validator::V0(v0) => v0.platform_p2p_port(), + } + } + + fn is_banned(&self) -> bool { + match self { + Validator::V0(v0) => v0.is_banned(), + } + } +} + +impl ValidatorV0Setters for Validator { + fn set_pro_tx_hash(&mut self, pro_tx_hash: ProTxHash) { + match self { + Validator::V0(v0) => v0.set_pro_tx_hash(pro_tx_hash), + } + } + + fn set_public_key(&mut self, public_key: Option) { + match self { + Validator::V0(v0) => v0.set_public_key(public_key), + } + } + + fn set_node_ip(&mut self, node_ip: String) { + match self { + Validator::V0(v0) => v0.set_node_ip(node_ip), + } + } + + fn set_node_id(&mut self, node_id: PubkeyHash) { + match self { + Validator::V0(v0) => v0.set_node_id(node_id), + } + } + + fn set_core_port(&mut self, core_port: u16) { + match self { + Validator::V0(v0) => v0.set_core_port(core_port), + } + } + + fn set_platform_http_port(&mut self, platform_http_port: u16) { + match self { + Validator::V0(v0) => v0.set_platform_http_port(platform_http_port), + } + } + + fn set_platform_p2p_port(&mut self, platform_p2p_port: u16) { + match self { + Validator::V0(v0) => v0.set_platform_p2p_port(platform_p2p_port), + } + } + + fn set_is_banned(&mut self, is_banned: bool) { + match self { + Validator::V0(v0) => v0.set_is_banned(is_banned), + } + } +} diff --git a/packages/rs-dpp/src/core_types/validator/v0/mod.rs b/packages/rs-dpp/src/core_types/validator/v0/mod.rs new file mode 100644 index 0000000000..daadc197fe --- /dev/null +++ b/packages/rs-dpp/src/core_types/validator/v0/mod.rs @@ -0,0 +1,252 @@ +use dashcore::{ProTxHash, PubkeyHash}; +use std::fmt::{Debug, Formatter}; + +use crate::bls_signatures::PublicKey as BlsPublicKey; +#[cfg(feature = "core-types-serde-conversion")] +use serde::{Deserialize, Serialize}; + +#[cfg(feature = "core-types-serialization")] +use bincode::de::Decoder; +#[cfg(feature = "core-types-serialization")] +use bincode::enc::Encoder; +#[cfg(feature = "core-types-serialization")] +use bincode::error::{DecodeError, EncodeError}; +#[cfg(feature = "core-types-serialization")] +use bincode::{Decode, Encode}; +#[cfg(feature = "core-types-serialization")] +use dashcore::hashes::Hash; + +/// A validator in the context of a quorum +#[derive(Clone, Eq, PartialEq)] +#[cfg_attr( + feature = "core-types-serde-conversion", + derive(Serialize, Deserialize) +)] +pub struct ValidatorV0 { + /// The proTxHash + pub pro_tx_hash: ProTxHash, + /// The public key share of this validator for this quorum + pub public_key: Option, + /// The node address + pub node_ip: String, + /// The node id + pub node_id: PubkeyHash, + /// Core port + pub core_port: u16, + /// Http port + pub platform_http_port: u16, + /// Tenderdash port + pub platform_p2p_port: u16, + /// Is the validator banned + pub is_banned: bool, +} + +#[cfg(feature = "core-types-serialization")] +impl Encode for ValidatorV0 { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + // Encode each field in the order they appear in the struct + + // Encode ProTxHash + self.pro_tx_hash.to_byte_array().to_vec().encode(encoder)?; + + // Encode Option + match &self.public_key { + Some(public_key) => { + true.encode(encoder)?; // Indicate that public_key is present + public_key.to_bytes().encode(encoder)?; + } + None => { + false.encode(encoder)?; // Indicate that public_key is not present + } + } + + // Encode node_ip as a string + self.node_ip.encode(encoder)?; + + // Encode node_id + self.node_id.to_byte_array().to_vec().encode(encoder)?; + + // Encode core_port, platform_http_port, and platform_p2p_port as u16 + self.core_port.encode(encoder)?; + self.platform_http_port.encode(encoder)?; + self.platform_p2p_port.encode(encoder)?; + + // Encode is_banned as a boolean + self.is_banned.encode(encoder)?; + + Ok(()) + } +} + +#[cfg(feature = "core-types-serialization")] +impl Decode for ValidatorV0 { + fn decode(decoder: &mut D) -> Result { + // Decode each field in the same order as they were encoded + + // Decode ProTxHash + let pro_tx_hash_bytes = Vec::::decode(decoder)?; + let pro_tx_hash = ProTxHash::from_slice(&pro_tx_hash_bytes) + .map_err(|_| DecodeError::OtherString("Failed to decode ProTxHash".to_string()))?; + + // Decode Option + let has_public_key = bool::decode(decoder)?; + let public_key = if has_public_key { + let public_key_bytes = Vec::::decode(decoder)?; + Some(BlsPublicKey::from_bytes(&public_key_bytes).map_err(|_| { + DecodeError::OtherString("Failed to decode BlsPublicKey".to_string()) + })?) + } else { + None + }; + + // Decode node_ip as a string + let node_ip = String::decode(decoder)?; + + // Decode node_id + let node_id_bytes = Vec::::decode(decoder)?; + let node_id = PubkeyHash::from_slice(&node_id_bytes) + .map_err(|_| DecodeError::OtherString("Failed to decode NodeId".to_string()))?; + + // Decode core_port, platform_http_port, and platform_p2p_port as u16 + let core_port = u16::decode(decoder)?; + let platform_http_port = u16::decode(decoder)?; + let platform_p2p_port = u16::decode(decoder)?; + + // Decode is_banned as a boolean + let is_banned = bool::decode(decoder)?; + + Ok(ValidatorV0 { + pro_tx_hash, + public_key, + node_ip, + node_id, + core_port, + platform_http_port, + platform_p2p_port, + is_banned, + }) + } +} + +impl Debug for ValidatorV0 { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("ValidatorV0") + .field("pro_tx_hash", &self.pro_tx_hash.to_string()) + .field("public_key", &self.public_key) + .field("node_ip", &self.node_ip) + .field("node_id", &self.node_id) + .field("core_port", &self.core_port) + .field("platform_http_port", &self.platform_http_port) + .field("platform_p2p_port", &self.platform_p2p_port) + .field("is_banned", &self.is_banned) + .finish() + } +} + +/// Traits to get properties of a validator. +pub trait ValidatorV0Getters { + /// Returns the proTxHash of the validator. + fn pro_tx_hash(&self) -> &ProTxHash; + /// Returns the public key share of this validator for this quorum. + fn public_key(&self) -> &Option; + /// Returns the node address of the validator. + fn node_ip(&self) -> &String; + /// Returns the node id of the validator. + fn node_id(&self) -> &PubkeyHash; + /// Returns the core port of the validator. + fn core_port(&self) -> u16; + /// Returns the Http port of the validator. + fn platform_http_port(&self) -> u16; + /// Returns the Tenderdash port of the validator. + fn platform_p2p_port(&self) -> u16; + /// Returns the status of the validator whether it's banned or not. + fn is_banned(&self) -> bool; +} + +/// Traits to set properties of a validator. +pub trait ValidatorV0Setters { + /// Sets the proTxHash of the validator. + fn set_pro_tx_hash(&mut self, pro_tx_hash: ProTxHash); + /// Sets the public key share of this validator for this quorum. + fn set_public_key(&mut self, public_key: Option); + /// Sets the node address of the validator. + fn set_node_ip(&mut self, node_ip: String); + /// Sets the node id of the validator. + fn set_node_id(&mut self, node_id: PubkeyHash); + /// Sets the core port of the validator. + fn set_core_port(&mut self, core_port: u16); + /// Sets the Http port of the validator. + fn set_platform_http_port(&mut self, platform_http_port: u16); + /// Sets the Tenderdash port of the validator. + fn set_platform_p2p_port(&mut self, platform_p2p_port: u16); + /// Sets the status of the validator whether it's banned or not. + fn set_is_banned(&mut self, is_banned: bool); +} + +impl ValidatorV0Getters for ValidatorV0 { + fn pro_tx_hash(&self) -> &ProTxHash { + &self.pro_tx_hash + } + + fn public_key(&self) -> &Option { + &self.public_key + } + + fn node_ip(&self) -> &String { + &self.node_ip + } + + fn node_id(&self) -> &PubkeyHash { + &self.node_id + } + + fn core_port(&self) -> u16 { + self.core_port + } + + fn platform_http_port(&self) -> u16 { + self.platform_http_port + } + + fn platform_p2p_port(&self) -> u16 { + self.platform_p2p_port + } + + fn is_banned(&self) -> bool { + self.is_banned + } +} + +impl ValidatorV0Setters for ValidatorV0 { + fn set_pro_tx_hash(&mut self, pro_tx_hash: ProTxHash) { + self.pro_tx_hash = pro_tx_hash; + } + + fn set_public_key(&mut self, public_key: Option) { + self.public_key = public_key; + } + + fn set_node_ip(&mut self, node_ip: String) { + self.node_ip = node_ip; + } + + fn set_node_id(&mut self, node_id: PubkeyHash) { + self.node_id = node_id; + } + + fn set_core_port(&mut self, core_port: u16) { + self.core_port = core_port; + } + + fn set_platform_http_port(&mut self, platform_http_port: u16) { + self.platform_http_port = platform_http_port; + } + + fn set_platform_p2p_port(&mut self, platform_p2p_port: u16) { + self.platform_p2p_port = platform_p2p_port; + } + + fn set_is_banned(&mut self, is_banned: bool) { + self.is_banned = is_banned; + } +} diff --git a/packages/rs-dpp/src/core_types/validator_set/mod.rs b/packages/rs-dpp/src/core_types/validator_set/mod.rs new file mode 100644 index 0000000000..7238bc0b1b --- /dev/null +++ b/packages/rs-dpp/src/core_types/validator_set/mod.rs @@ -0,0 +1,111 @@ +use crate::bls_signatures::PublicKey as BlsPublicKey; +use crate::core_types::validator::v0::ValidatorV0; +use crate::core_types::validator_set::v0::{ + ValidatorSetV0, ValidatorSetV0Getters, ValidatorSetV0Setters, +}; +#[cfg(feature = "core-types-serialization")] +use crate::ProtocolError; +#[cfg(feature = "core-types-serialization")] +use bincode::{Decode, Encode}; +use dashcore::{ProTxHash, QuorumHash}; +#[cfg(feature = "core-types-serialization")] +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +#[cfg(feature = "core-types-serde-conversion")] +use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; + +/// Version 0 +pub mod v0; + +/// The validator set is only slightly different from a quorum as it does not contain non valid +/// members +#[derive(Clone, Debug, Eq, PartialEq)] +#[cfg_attr( + feature = "core-types-serde-conversion", + derive(Serialize, Deserialize) +)] +#[cfg_attr( + feature = "core-types-serialization", + derive(Encode, Decode, PlatformDeserialize, PlatformSerialize), + platform_serialize(limit = 15000, unversioned) +)] +pub enum ValidatorSet { + /// Version 0 + V0(ValidatorSetV0), +} + +impl ValidatorSetV0Getters for ValidatorSet { + fn quorum_hash(&self) -> &QuorumHash { + match self { + ValidatorSet::V0(v0) => v0.quorum_hash(), + } + } + + fn quorum_index(&self) -> Option { + match self { + ValidatorSet::V0(v0) => v0.quorum_index(), + } + } + + fn core_height(&self) -> u32 { + match self { + ValidatorSet::V0(v0) => v0.core_height(), + } + } + + fn members(&self) -> &BTreeMap { + match self { + ValidatorSet::V0(v0) => v0.members(), + } + } + + fn members_mut(&mut self) -> &mut BTreeMap { + match self { + ValidatorSet::V0(v0) => v0.members_mut(), + } + } + + fn members_owned(self) -> BTreeMap { + match self { + ValidatorSet::V0(v0) => v0.members_owned(), + } + } + + fn threshold_public_key(&self) -> &BlsPublicKey { + match self { + ValidatorSet::V0(v0) => v0.threshold_public_key(), + } + } +} + +impl ValidatorSetV0Setters for ValidatorSet { + fn set_quorum_hash(&mut self, quorum_hash: QuorumHash) { + match self { + ValidatorSet::V0(v0) => v0.set_quorum_hash(quorum_hash), + } + } + + fn set_quorum_index(&mut self, index: Option) { + match self { + ValidatorSet::V0(v0) => v0.set_quorum_index(index), + } + } + + fn set_core_height(&mut self, core_height: u32) { + match self { + ValidatorSet::V0(v0) => v0.set_core_height(core_height), + } + } + + fn set_members(&mut self, members: BTreeMap) { + match self { + ValidatorSet::V0(v0) => v0.set_members(members), + } + } + + fn set_threshold_public_key(&mut self, threshold_public_key: BlsPublicKey) { + match self { + ValidatorSet::V0(v0) => v0.set_threshold_public_key(threshold_public_key), + } + } +} diff --git a/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs b/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs new file mode 100644 index 0000000000..886489ee3b --- /dev/null +++ b/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs @@ -0,0 +1,249 @@ +use crate::bls_signatures::PublicKey as BlsPublicKey; +use crate::core_types::validator::v0::ValidatorV0; +#[cfg(feature = "core-types-serialization")] +use bincode::de::Decoder; +#[cfg(feature = "core-types-serialization")] +use bincode::enc::Encoder; +#[cfg(feature = "core-types-serialization")] +use bincode::error::EncodeError; +#[cfg(feature = "core-types-serialization")] +use bincode::{BorrowDecode, Decode, Encode}; +use dashcore::hashes::Hash; +use dashcore::{ProTxHash, QuorumHash}; +#[cfg(feature = "core-types-serde-conversion")] +use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; +use std::fmt::{Debug, Formatter}; + +/// The validator set is only slightly different from a quorum as it does not contain non valid +/// members +#[derive(Clone, Eq, PartialEq)] +#[cfg_attr( + feature = "core-types-serde-conversion", + derive(Serialize, Deserialize) +)] +pub struct ValidatorSetV0 { + /// The quorum hash + pub quorum_hash: QuorumHash, + /// Rotation quorum index is available only for DIP24 quorums + pub quorum_index: Option, + /// Active height + pub core_height: u32, + /// The list of masternodes + pub members: BTreeMap, + /// The threshold quorum public key + pub threshold_public_key: BlsPublicKey, +} + +#[cfg(feature = "core-types-serialization")] +impl Encode for ValidatorSetV0 { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + // Encode each field in the order they appear in the struct + let quorum_hash_bytes = self.quorum_hash.as_byte_array().to_vec(); + quorum_hash_bytes.encode(encoder)?; + self.quorum_index.encode(encoder)?; + self.core_height.encode(encoder)?; + + // Convert BTreeMap to Vec<(Vec, ValidatorV0)> and encode it + let members_as_vec: Vec<(Vec, ValidatorV0)> = self + .members + .iter() + .map(|(key, value)| (key.as_byte_array().to_vec(), value.clone())) + .collect(); + members_as_vec.encode(encoder)?; + + // Custom encoding for BlsPublicKey if needed + // Assuming BlsPublicKey can be serialized to a byte slice + let public_key_bytes = self.threshold_public_key.to_bytes(); + public_key_bytes.encode(encoder)?; + + Ok(()) + } +} + +#[cfg(feature = "core-types-serialization")] +impl Decode for ValidatorSetV0 { + fn decode(decoder: &mut D) -> Result { + // Decode each field in the same order as they were encoded + let quorum_hash = Vec::::decode(decoder)?; + let quorum_index = Option::::decode(decoder)?; + let core_height = u32::decode(decoder)?; + + // Decode Vec<(Vec, ValidatorV0)> and convert it back to BTreeMap + let members_as_vec = Vec::<(Vec, ValidatorV0)>::decode(decoder)?; + let members: BTreeMap = members_as_vec + .into_iter() + .map(|(key_bytes, value)| { + let key = ProTxHash::from_slice(&key_bytes).map_err(|_| { + bincode::error::DecodeError::OtherString( + "Failed to decode ProTxHash".to_string(), + ) + })?; + Ok((key, value)) + }) + .collect::>()?; + + // Custom decoding for BlsPublicKey if needed + // Assuming BlsPublicKey can be deserialized from a byte slice + let public_key_bytes = Vec::::decode(decoder)?; + let threshold_public_key = BlsPublicKey::from_bytes(&public_key_bytes).map_err(|_| { + bincode::error::DecodeError::OtherString("Failed to decode BlsPublicKey".to_string()) + })?; + + Ok(ValidatorSetV0 { + quorum_hash: QuorumHash::from_slice(&quorum_hash).map_err(|_| { + bincode::error::DecodeError::OtherString("Failed to decode QuorumHash".to_string()) + })?, + quorum_index, + core_height, + members, + threshold_public_key, + }) + } +} + +#[cfg(feature = "core-types-serialization")] +impl<'de> BorrowDecode<'de> for ValidatorSetV0 { + fn borrow_decode(decoder: &mut D) -> Result { + // Decode each field in the same order as they were encoded + + // Decode quorum_hash as Vec + let quorum_hash = Vec::::decode(decoder)?; + // Decode quorum_index as Option + let quorum_index = Option::::decode(decoder)?; + // Decode core_height as u32 + let core_height = u32::decode(decoder)?; + + // Decode Vec<(Vec, ValidatorV0)> and convert it back to BTreeMap + let members_as_vec = Vec::<(Vec, ValidatorV0)>::decode(decoder)?; + let members: BTreeMap = members_as_vec + .into_iter() + .map(|(key_bytes, value)| { + let key = ProTxHash::from_slice(&key_bytes).map_err(|_| { + bincode::error::DecodeError::OtherString( + "Failed to decode ProTxHash".to_string(), + ) + })?; + Ok((key, value)) + }) + .collect::>()?; + + // Custom decoding for BlsPublicKey if needed + let public_key_bytes = Vec::::decode(decoder)?; + let threshold_public_key = BlsPublicKey::from_bytes(&public_key_bytes).map_err(|_| { + bincode::error::DecodeError::OtherString("Failed to decode BlsPublicKey".to_string()) + })?; + + Ok(ValidatorSetV0 { + quorum_hash: QuorumHash::from_slice(&quorum_hash).map_err(|_| { + bincode::error::DecodeError::OtherString("Failed to decode QuorumHash".to_string()) + })?, + quorum_index, + core_height, + members, + threshold_public_key, + }) + } +} + +impl Debug for ValidatorSetV0 { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("ValidatorSetV0") + .field("quorum_hash", &self.quorum_hash.to_string()) + .field("core_height", &self.core_height) + .field( + "members", + &self + .members + .iter() + .map(|(k, v)| (k.to_string(), v)) + .collect::>(), + ) + .field("threshold_public_key", &self.threshold_public_key) + .finish() + } +} + +/// Trait providing getter methods for `ValidatorSetV0` struct +pub trait ValidatorSetV0Getters { + /// Returns the quorum hash of the validator set. + fn quorum_hash(&self) -> &QuorumHash; + /// Returns rotation quorum index. It's available only for DIP24 quorums + fn quorum_index(&self) -> Option; + /// Returns the active height of the validator set. + fn core_height(&self) -> u32; + /// Returns the members of the validator set. + fn members(&self) -> &BTreeMap; + /// Returns the members of the validator set. + fn members_mut(&mut self) -> &mut BTreeMap; + /// Returns the members of the validator set. + fn members_owned(self) -> BTreeMap; + /// Returns the threshold public key of the validator set. + fn threshold_public_key(&self) -> &BlsPublicKey; +} + +/// Trait providing setter methods for `ValidatorSetV0` struct +pub trait ValidatorSetV0Setters { + /// Sets the quorum hash of the validator set. + fn set_quorum_hash(&mut self, quorum_hash: QuorumHash); + /// Sets the quorum index of the validator set. + fn set_quorum_index(&mut self, index: Option); + /// Sets the active height of the validator set. + fn set_core_height(&mut self, core_height: u32); + /// Sets the members of the validator set. + fn set_members(&mut self, members: BTreeMap); + /// Sets the threshold public key of the validator set. + fn set_threshold_public_key(&mut self, threshold_public_key: BlsPublicKey); +} + +impl ValidatorSetV0Getters for ValidatorSetV0 { + fn quorum_hash(&self) -> &QuorumHash { + &self.quorum_hash + } + + fn quorum_index(&self) -> Option { + self.quorum_index + } + + fn core_height(&self) -> u32 { + self.core_height + } + + fn members(&self) -> &BTreeMap { + &self.members + } + + fn members_mut(&mut self) -> &mut BTreeMap { + &mut self.members + } + + fn members_owned(self) -> BTreeMap { + self.members + } + + fn threshold_public_key(&self) -> &BlsPublicKey { + &self.threshold_public_key + } +} + +impl ValidatorSetV0Setters for ValidatorSetV0 { + fn set_quorum_hash(&mut self, quorum_hash: QuorumHash) { + self.quorum_hash = quorum_hash; + } + + fn set_quorum_index(&mut self, index: Option) { + self.quorum_index = index; + } + + fn set_core_height(&mut self, core_height: u32) { + self.core_height = core_height; + } + + fn set_members(&mut self, members: BTreeMap) { + self.members = members; + } + + fn set_threshold_public_key(&mut self, threshold_public_key: BlsPublicKey) { + self.threshold_public_key = threshold_public_key; + } +} diff --git a/packages/rs-dpp/src/lib.rs b/packages/rs-dpp/src/lib.rs index 59fd2fb3d6..6dd0312fc2 100644 --- a/packages/rs-dpp/src/lib.rs +++ b/packages/rs-dpp/src/lib.rs @@ -53,6 +53,8 @@ pub mod signing; pub mod system_data_contracts; pub mod voting; +#[cfg(feature = "core-types")] +pub mod core_types; pub mod withdrawal; pub use async_trait; diff --git a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs index 398d4c111f..d190c5c055 100644 --- a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs @@ -10,6 +10,7 @@ use drive::grovedb::Transaction; use crate::platform_types::cleaned_abci_messages::request_init_chain_cleaned_params; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; +use crate::platform_types::validator_set::ValidatorSetExt; use dpp::version::PlatformVersion; use std::sync::Arc; use tenderdash_abci::proto::abci::{RequestInitChain, ResponseInitChain, ValidatorSetUpdate}; @@ -105,10 +106,7 @@ where ExecutionError::InitializationError("we should have at least one quorum"), )?; - ( - *validator_set_inner.0, - ValidatorSetUpdate::from(validator_set_inner.1), - ) + (*validator_set_inner.0, validator_set_inner.1.to_update()) }; initial_platform_state.set_current_validator_set_quorum_hash(quorum_hash); diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v0/mod.rs index b2aa72c735..9d713e04cd 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v0/mod.rs @@ -11,6 +11,7 @@ use crate::platform_types::validator_set::v0::ValidatorSetV0Getters; use crate::rpc::core::CoreRPCLike; use itertools::Itertools; +use crate::platform_types::validator_set::ValidatorSetExt; use dpp::dashcore::hashes::Hash; use tenderdash_abci::proto::abci::ValidatorSetUpdate; @@ -144,7 +145,7 @@ where &quorum_hash, new_validator_set.members().len() ); - let validator_set_update = new_validator_set.into(); + let validator_set_update = new_validator_set.to_update(); block_execution_context .block_platform_state_mut() .set_next_validator_set_quorum_hash(Some(*quorum_hash)); @@ -163,7 +164,7 @@ where "rotation: all quorums changed, rotation to new quorum: {}", &quorum_hash ); - let validator_set_update = new_validator_set.into(); + let validator_set_update = new_validator_set.to_update(); let new_quorum_hash = *quorum_hash; block_execution_context .block_platform_state_mut() @@ -185,7 +186,7 @@ where method = "validator_set_update_v0", "validator set update without rotation" ); - Ok(Some(current_validator_set.into())) + Ok(Some(current_validator_set.to_update())) } else { tracing::debug!( method = "validator_set_update_v0", diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v1/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v1/mod.rs index 8c6192e8a5..b7b8f1372f 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v1/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v1/mod.rs @@ -11,6 +11,7 @@ use crate::platform_types::validator_set::v0::ValidatorSetV0Getters; use crate::rpc::core::CoreRPCLike; use itertools::Itertools; +use crate::platform_types::validator_set::ValidatorSetExt; use dpp::dashcore::hashes::Hash; use tenderdash_abci::proto::abci::ValidatorSetUpdate; @@ -159,7 +160,7 @@ where &quorum_hash, new_validator_set.members().len() ); - let validator_set_update = new_validator_set.into(); + let validator_set_update = new_validator_set.to_update(); block_execution_context .block_platform_state_mut() .set_next_validator_set_quorum_hash(Some(*quorum_hash)); @@ -181,7 +182,7 @@ where "rotation: all quorums changed, rotation to new quorum: {}", &quorum_hash ); - let validator_set_update = new_validator_set.into(); + let validator_set_update = new_validator_set.to_update(); let new_quorum_hash = *quorum_hash; block_execution_context .block_platform_state_mut() @@ -203,7 +204,7 @@ where method = "validator_set_update_v1", "validator set update without rotation" ); - Ok(Some(current_validator_set.into())) + Ok(Some(current_validator_set.to_update())) } else { tracing::debug!( method = "validator_set_update_v1", diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/v0/mod.rs index bcc65582d7..5ca6ce4070 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/v0/mod.rs @@ -7,7 +7,9 @@ use dashcore_rpc::json::{ExtendedQuorumListResult, QuorumType}; use std::collections::BTreeMap; use std::fmt::Display; -use crate::platform_types::validator_set::v0::{ValidatorSetV0, ValidatorSetV0Getters}; +use crate::platform_types::validator_set::v0::{ + ValidatorSetMethodsV0, ValidatorSetV0, ValidatorSetV0Getters, +}; use crate::platform_types::validator_set::ValidatorSet; use crate::rpc::core::CoreRPCLike; diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs index fcbe622a0d..f9fa9d6deb 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs @@ -345,17 +345,25 @@ pub trait PlatformStateV0Methods { /// Returns the quorum hash of the current validator set. fn current_validator_set_quorum_hash(&self) -> QuorumHash; - /// Where is the current validator set in the list - fn current_validator_set_position_in_list_by_most_recent(&self) -> Option { - // Get the current quorum hash - let current_quorum_hash = self.current_validator_set_quorum_hash(); - + /// Get validator sets sorted by their core height by most recent order coming first + fn validator_sets_sorted_by_core_height_by_most_recent(&self) -> Vec<&ValidatorSet> { // Get the validator sets and collect them into a vector for sorting let mut validator_sets: Vec<&ValidatorSet> = self.validator_sets().values().collect(); // Sort the validator sets by core height in descending order validator_sets.sort_by(|a, b| b.core_height().cmp(&a.core_height())); + validator_sets + } + + /// Where is the current validator set in the list + fn current_validator_set_position_in_list_by_most_recent(&self) -> Option { + // Get the current quorum hash + let current_quorum_hash = self.current_validator_set_quorum_hash(); + + // Get the validator sets by post recent + let validator_sets = self.validator_sets_sorted_by_core_height_by_most_recent(); + // Find the position of the current validator set in the sorted list validator_sets .iter() diff --git a/packages/rs-drive-abci/src/platform_types/validator/mod.rs b/packages/rs-drive-abci/src/platform_types/validator/mod.rs index 3ad5264d5d..10144bf53f 100644 --- a/packages/rs-drive-abci/src/platform_types/validator/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/validator/mod.rs @@ -1,114 +1,3 @@ -use crate::platform_types::validator::v0::{ValidatorV0, ValidatorV0Getters, ValidatorV0Setters}; -use dashcore_rpc::dashcore::{ProTxHash, PubkeyHash}; -use dpp::bls_signatures::PublicKey as BlsPublicKey; -use serde::{Deserialize, Serialize}; - /// Version 0 pub mod v0; - -/// A validator in the context of a quorum -#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)] -pub enum Validator { - /// Version 0 - V0(ValidatorV0), -} - -impl ValidatorV0Getters for Validator { - fn pro_tx_hash(&self) -> &ProTxHash { - match self { - Validator::V0(v0) => v0.pro_tx_hash(), - } - } - - fn public_key(&self) -> &Option { - match self { - Validator::V0(v0) => v0.public_key(), - } - } - - fn node_ip(&self) -> &String { - match self { - Validator::V0(v0) => v0.node_ip(), - } - } - - fn node_id(&self) -> &PubkeyHash { - match self { - Validator::V0(v0) => v0.node_id(), - } - } - - fn core_port(&self) -> u16 { - match self { - Validator::V0(v0) => v0.core_port(), - } - } - - fn platform_http_port(&self) -> u16 { - match self { - Validator::V0(v0) => v0.platform_http_port(), - } - } - - fn platform_p2p_port(&self) -> u16 { - match self { - Validator::V0(v0) => v0.platform_p2p_port(), - } - } - - fn is_banned(&self) -> bool { - match self { - Validator::V0(v0) => v0.is_banned(), - } - } -} - -impl ValidatorV0Setters for Validator { - fn set_pro_tx_hash(&mut self, pro_tx_hash: ProTxHash) { - match self { - Validator::V0(v0) => v0.set_pro_tx_hash(pro_tx_hash), - } - } - - fn set_public_key(&mut self, public_key: Option) { - match self { - Validator::V0(v0) => v0.set_public_key(public_key), - } - } - - fn set_node_ip(&mut self, node_ip: String) { - match self { - Validator::V0(v0) => v0.set_node_ip(node_ip), - } - } - - fn set_node_id(&mut self, node_id: PubkeyHash) { - match self { - Validator::V0(v0) => v0.set_node_id(node_id), - } - } - - fn set_core_port(&mut self, core_port: u16) { - match self { - Validator::V0(v0) => v0.set_core_port(core_port), - } - } - - fn set_platform_http_port(&mut self, platform_http_port: u16) { - match self { - Validator::V0(v0) => v0.set_platform_http_port(platform_http_port), - } - } - - fn set_platform_p2p_port(&mut self, platform_p2p_port: u16) { - match self { - Validator::V0(v0) => v0.set_platform_p2p_port(platform_p2p_port), - } - } - - fn set_is_banned(&mut self, is_banned: bool) { - match self { - Validator::V0(v0) => v0.set_is_banned(is_banned), - } - } -} +pub use dpp::core_types::validator::*; diff --git a/packages/rs-drive-abci/src/platform_types/validator/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/validator/v0/mod.rs index 665c48c3dc..433fe506bf 100644 --- a/packages/rs-drive-abci/src/platform_types/validator/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/validator/v0/mod.rs @@ -1,52 +1,21 @@ use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use dashcore_rpc::dashcore::hashes::Hash; -use dashcore_rpc::dashcore::{ProTxHash, PubkeyHash}; -use dashcore_rpc::dashcore_rpc_json::{DMNState, MasternodeListItem}; -use std::fmt::{Debug, Formatter}; - use crate::platform_types::platform_state::PlatformState; +use dashcore_rpc::json::{DMNState, MasternodeListItem}; use dpp::bls_signatures::PublicKey as BlsPublicKey; -use serde::{Deserialize, Serialize}; - -/// A validator in the context of a quorum -#[derive(Clone, Serialize, Deserialize, Eq, PartialEq)] -pub struct ValidatorV0 { - /// The proTxHash - pub pro_tx_hash: ProTxHash, - /// The public key share of this validator for this quorum - pub public_key: Option, - /// The node address - pub node_ip: String, - /// The node id - pub node_id: PubkeyHash, - /// Core port - pub core_port: u16, - /// Http port - pub platform_http_port: u16, - /// Tenderdash port - pub platform_p2p_port: u16, - /// Is the validator banned - pub is_banned: bool, -} - -impl Debug for ValidatorV0 { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - f.debug_struct("ValidatorV0") - .field("pro_tx_hash", &self.pro_tx_hash.to_string()) - .field("public_key", &self.public_key) - .field("node_ip", &self.node_ip) - .field("node_id", &self.node_id) - .field("core_port", &self.core_port) - .field("platform_http_port", &self.platform_http_port) - .field("platform_p2p_port", &self.platform_p2p_port) - .field("is_banned", &self.is_banned) - .finish() - } +pub use dpp::core_types::validator::v0::*; +use dpp::dashcore::hashes::Hash; +use dpp::dashcore::{ProTxHash, PubkeyHash}; +pub(crate) trait NewValidatorIfMasternodeInState { + fn new_validator_if_masternode_in_state( + pro_tx_hash: ProTxHash, + public_key: Option, + state: &PlatformState, + ) -> Option; } -impl ValidatorV0 { +impl NewValidatorIfMasternodeInState for ValidatorV0 { /// Makes a validator if the masternode is in the list and is valid - pub fn new_validator_if_masternode_in_state( + fn new_validator_if_masternode_in_state( pro_tx_hash: ProTxHash, public_key: Option, state: &PlatformState, @@ -80,111 +49,3 @@ impl ValidatorV0 { }) } } - -/// Traits to get properties of a validator. -pub trait ValidatorV0Getters { - /// Returns the proTxHash of the validator. - fn pro_tx_hash(&self) -> &ProTxHash; - /// Returns the public key share of this validator for this quorum. - fn public_key(&self) -> &Option; - /// Returns the node address of the validator. - fn node_ip(&self) -> &String; - /// Returns the node id of the validator. - fn node_id(&self) -> &PubkeyHash; - /// Returns the core port of the validator. - fn core_port(&self) -> u16; - /// Returns the Http port of the validator. - fn platform_http_port(&self) -> u16; - /// Returns the Tenderdash port of the validator. - fn platform_p2p_port(&self) -> u16; - /// Returns the status of the validator whether it's banned or not. - fn is_banned(&self) -> bool; -} - -/// Traits to set properties of a validator. -pub trait ValidatorV0Setters { - /// Sets the proTxHash of the validator. - fn set_pro_tx_hash(&mut self, pro_tx_hash: ProTxHash); - /// Sets the public key share of this validator for this quorum. - fn set_public_key(&mut self, public_key: Option); - /// Sets the node address of the validator. - fn set_node_ip(&mut self, node_ip: String); - /// Sets the node id of the validator. - fn set_node_id(&mut self, node_id: PubkeyHash); - /// Sets the core port of the validator. - fn set_core_port(&mut self, core_port: u16); - /// Sets the Http port of the validator. - fn set_platform_http_port(&mut self, platform_http_port: u16); - /// Sets the Tenderdash port of the validator. - fn set_platform_p2p_port(&mut self, platform_p2p_port: u16); - /// Sets the status of the validator whether it's banned or not. - fn set_is_banned(&mut self, is_banned: bool); -} - -impl ValidatorV0Getters for ValidatorV0 { - fn pro_tx_hash(&self) -> &ProTxHash { - &self.pro_tx_hash - } - - fn public_key(&self) -> &Option { - &self.public_key - } - - fn node_ip(&self) -> &String { - &self.node_ip - } - - fn node_id(&self) -> &PubkeyHash { - &self.node_id - } - - fn core_port(&self) -> u16 { - self.core_port - } - - fn platform_http_port(&self) -> u16 { - self.platform_http_port - } - - fn platform_p2p_port(&self) -> u16 { - self.platform_p2p_port - } - - fn is_banned(&self) -> bool { - self.is_banned - } -} - -impl ValidatorV0Setters for ValidatorV0 { - fn set_pro_tx_hash(&mut self, pro_tx_hash: ProTxHash) { - self.pro_tx_hash = pro_tx_hash; - } - - fn set_public_key(&mut self, public_key: Option) { - self.public_key = public_key; - } - - fn set_node_ip(&mut self, node_ip: String) { - self.node_ip = node_ip; - } - - fn set_node_id(&mut self, node_id: PubkeyHash) { - self.node_id = node_id; - } - - fn set_core_port(&mut self, core_port: u16) { - self.core_port = core_port; - } - - fn set_platform_http_port(&mut self, platform_http_port: u16) { - self.platform_http_port = platform_http_port; - } - - fn set_platform_p2p_port(&mut self, platform_p2p_port: u16) { - self.platform_p2p_port = platform_p2p_port; - } - - fn set_is_banned(&mut self, is_banned: bool) { - self.is_banned = is_banned; - } -} diff --git a/packages/rs-drive-abci/src/platform_types/validator_set/mod.rs b/packages/rs-drive-abci/src/platform_types/validator_set/mod.rs index 5dd9adb1f8..414fbe0c8f 100644 --- a/packages/rs-drive-abci/src/platform_types/validator_set/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/validator_set/mod.rs @@ -1,114 +1,27 @@ -use crate::platform_types::validator::v0::ValidatorV0; -use crate::platform_types::validator_set::v0::{ - ValidatorSetV0, ValidatorSetV0Getters, ValidatorSetV0Setters, -}; -use dashcore_rpc::dashcore::{ProTxHash, QuorumHash}; -use dpp::bls_signatures::PublicKey as BlsPublicKey; -use serde::{Deserialize, Serialize}; -use std::collections::BTreeMap; +use crate::platform_types::validator_set::v0::ValidatorSetMethodsV0; use tenderdash_abci::proto::abci::ValidatorSetUpdate; -/// Version 0 -pub mod v0; - -/// The validator set is only slightly different from a quorum as it does not contain non valid -/// members -#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)] -pub enum ValidatorSet { - /// Version 0 - V0(ValidatorSetV0), -} - -impl ValidatorSetV0Getters for ValidatorSet { - fn quorum_hash(&self) -> &QuorumHash { - match self { - ValidatorSet::V0(v0) => v0.quorum_hash(), - } - } +pub use dpp::core_types::validator_set::*; - fn quorum_index(&self) -> Option { - match self { - ValidatorSet::V0(v0) => v0.quorum_index(), - } - } - - fn core_height(&self) -> u32 { - match self { - ValidatorSet::V0(v0) => v0.core_height(), - } - } - - fn members(&self) -> &BTreeMap { - match self { - ValidatorSet::V0(v0) => v0.members(), - } - } - - fn members_mut(&mut self) -> &mut BTreeMap { - match self { - ValidatorSet::V0(v0) => v0.members_mut(), - } - } - - fn members_owned(self) -> BTreeMap { - match self { - ValidatorSet::V0(v0) => v0.members_owned(), - } - } +/// v0 +pub mod v0; - fn threshold_public_key(&self) -> &BlsPublicKey { - match self { - ValidatorSet::V0(v0) => v0.threshold_public_key(), - } - } +pub(crate) trait ValidatorSetExt { + fn to_update(&self) -> ValidatorSetUpdate; + #[allow(unused)] + fn to_update_owned(self) -> ValidatorSetUpdate; } -impl ValidatorSetV0Setters for ValidatorSet { - fn set_quorum_hash(&mut self, quorum_hash: QuorumHash) { - match self { - ValidatorSet::V0(v0) => v0.set_quorum_hash(quorum_hash), - } - } - - fn set_quorum_index(&mut self, index: Option) { - match self { - ValidatorSet::V0(v0) => v0.set_quorum_index(index), - } - } - - fn set_core_height(&mut self, core_height: u32) { +impl ValidatorSetExt for ValidatorSet { + fn to_update(&self) -> ValidatorSetUpdate { match self { - ValidatorSet::V0(v0) => v0.set_core_height(core_height), + ValidatorSet::V0(v0) => v0.to_update(), } } - fn set_members(&mut self, members: BTreeMap) { + fn to_update_owned(self) -> ValidatorSetUpdate { match self { - ValidatorSet::V0(v0) => v0.set_members(members), - } - } - - fn set_threshold_public_key(&mut self, threshold_public_key: BlsPublicKey) { - match self { - ValidatorSet::V0(v0) => v0.set_threshold_public_key(threshold_public_key), - } - } -} - -/// In this case we are changing to this validator set from another validator set and there are no -/// changes -impl From for ValidatorSetUpdate { - fn from(value: ValidatorSet) -> Self { - match value { - ValidatorSet::V0(v0) => v0.into(), - } - } -} - -impl From<&ValidatorSet> for ValidatorSetUpdate { - fn from(value: &ValidatorSet) -> Self { - match value { - ValidatorSet::V0(v0) => v0.into(), + ValidatorSet::V0(v0) => v0.to_update_owned(), } } } diff --git a/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs index 7574a5d31d..f7141d1ff4 100644 --- a/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs @@ -1,62 +1,38 @@ use crate::error::execution::ExecutionError; use crate::error::Error; -use crate::platform_types::validator::v0::ValidatorV0; use dashcore_rpc::dashcore::hashes::Hash; -use dashcore_rpc::dashcore::{ProTxHash, QuorumHash}; +use dashcore_rpc::dashcore::ProTxHash; use crate::platform_types::platform_state::PlatformState; +use crate::platform_types::validator::v0::NewValidatorIfMasternodeInState; use dashcore_rpc::json::QuorumInfoResult; use dpp::bls_signatures::PublicKey as BlsPublicKey; -use serde::{Deserialize, Serialize}; +use dpp::core_types::validator::v0::ValidatorV0; +pub use dpp::core_types::validator_set::v0::*; use std::collections::BTreeMap; -use std::fmt::{Debug, Formatter}; use tenderdash_abci::proto::abci::ValidatorSetUpdate; use tenderdash_abci::proto::crypto::public_key::Sum::Bls12381; use tenderdash_abci::proto::{abci, crypto}; -/// The validator set is only slightly different from a quorum as it does not contain non valid -/// members -#[derive(Clone, Serialize, Deserialize, Eq, PartialEq)] -pub struct ValidatorSetV0 { - /// The quorum hash - pub quorum_hash: QuorumHash, - /// Rotation quorum index is available only for DIP24 quorums - pub quorum_index: Option, - /// Active height - pub core_height: u32, - /// The list of masternodes - pub members: BTreeMap, - /// The threshold quorum public key - pub threshold_public_key: BlsPublicKey, -} +pub(crate) trait ValidatorSetMethodsV0 { + #[allow(unused)] + fn update_difference(&self, rhs: &ValidatorSetV0) -> Result; -impl Debug for ValidatorSetV0 { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - f.debug_struct("ValidatorSetV0") - .field("quorum_hash", &self.quorum_hash.to_string()) - .field("core_height", &self.core_height) - .field( - "members", - &self - .members - .iter() - .map(|(k, v)| (k.to_string(), v)) - .collect::>(), - ) - .field("threshold_public_key", &self.threshold_public_key) - .finish() - } + fn to_update(&self) -> ValidatorSetUpdate; + fn to_update_owned(self) -> ValidatorSetUpdate; + /// Try to create a quorum from info from the Masternode list (given with state), + /// and for information return for quorum members + fn try_from_quorum_info_result( + value: QuorumInfoResult, + state: &PlatformState, + ) -> Result; } -impl ValidatorSetV0 { +impl ValidatorSetMethodsV0 for ValidatorSetV0 { /// For changes between two validator sets, we take the new (rhs) element if is different /// for every validator - #[allow(dead_code)] - pub(crate) fn update_difference( - &self, - rhs: &ValidatorSetV0, - ) -> Result { + fn update_difference(&self, rhs: &ValidatorSetV0) -> Result { if self.quorum_hash != rhs.quorum_hash { return Err(Error::Execution(ExecutionError::CorruptedCachedState( format!( @@ -127,7 +103,7 @@ impl ValidatorSetV0 { } }), power: 100, - pro_tx_hash: reverse(pro_tx_hash.as_byte_array()), + pro_tx_hash: pro_tx_hash.as_byte_array().to_vec(), node_address, })) } @@ -159,7 +135,7 @@ impl ValidatorSetV0 { } }), power: 100, - pro_tx_hash: reverse(&pro_tx_hash.to_byte_array()), + pro_tx_hash: pro_tx_hash.to_byte_array().to_vec(), node_address, })) } @@ -174,35 +150,21 @@ impl ValidatorSetV0 { threshold_public_key: Some(crypto::PublicKey { sum: Some(Bls12381(self.threshold_public_key.to_bytes().to_vec())), }), - quorum_hash: reverse(&self.quorum_hash.to_byte_array()), + quorum_hash: self.quorum_hash.to_byte_array().to_vec(), }) } -} - -/// Reverse bytes -/// -/// TODO: This is a workaround for reversed data returned by dashcore_rpc (little endian / big endian handling issue). -/// We need to decide on a consistent approach to endianness and follow it. -fn reverse(data: &[u8]) -> Vec { - // data.reverse(); - data.to_vec() -} - -/// In this case we are changing to this validator set from another validator set and there are no -/// changes -impl From for ValidatorSetUpdate { - fn from(value: ValidatorSetV0) -> Self { + fn to_update(&self) -> ValidatorSetUpdate { let ValidatorSetV0 { quorum_hash, members: validator_set, threshold_public_key, .. - } = value; + } = self; ValidatorSetUpdate { validator_updates: validator_set - .into_values() - .filter_map(|validator| { + .iter() + .filter_map(|(_, validator)| { let ValidatorV0 { pro_tx_hash, public_key, @@ -212,7 +174,8 @@ impl From for ValidatorSetUpdate { is_banned, .. } = validator; - if is_banned { + + if *is_banned { return None; } let node_address = format!( @@ -221,13 +184,12 @@ impl From for ValidatorSetUpdate { node_ip, platform_p2p_port ); - Some(abci::ValidatorUpdate { - pub_key: public_key.map(|public_key| crypto::PublicKey { + pub_key: public_key.as_ref().map(|public_key| crypto::PublicKey { sum: Some(Bls12381(public_key.to_bytes().to_vec())), }), power: 100, - pro_tx_hash: reverse(&pro_tx_hash.to_byte_array()), + pro_tx_hash: pro_tx_hash.to_byte_array().to_vec(), node_address, }) }) @@ -235,23 +197,21 @@ impl From for ValidatorSetUpdate { threshold_public_key: Some(crypto::PublicKey { sum: Some(Bls12381(threshold_public_key.to_bytes().to_vec())), }), - quorum_hash: reverse(&quorum_hash.to_byte_array()), + quorum_hash: quorum_hash.to_byte_array().to_vec(), } } -} -impl From<&ValidatorSetV0> for ValidatorSetUpdate { - fn from(value: &ValidatorSetV0) -> Self { + fn to_update_owned(self) -> ValidatorSetUpdate { let ValidatorSetV0 { quorum_hash, members: validator_set, threshold_public_key, .. - } = value; + } = self; ValidatorSetUpdate { validator_updates: validator_set - .iter() - .filter_map(|(_, validator)| { + .into_values() + .filter_map(|validator| { let ValidatorV0 { pro_tx_hash, public_key, @@ -261,8 +221,7 @@ impl From<&ValidatorSetV0> for ValidatorSetUpdate { is_banned, .. } = validator; - - if *is_banned { + if is_banned { return None; } let node_address = format!( @@ -271,12 +230,13 @@ impl From<&ValidatorSetV0> for ValidatorSetUpdate { node_ip, platform_p2p_port ); + Some(abci::ValidatorUpdate { - pub_key: public_key.as_ref().map(|public_key| crypto::PublicKey { + pub_key: public_key.map(|public_key| crypto::PublicKey { sum: Some(Bls12381(public_key.to_bytes().to_vec())), }), power: 100, - pro_tx_hash: reverse(&pro_tx_hash.to_byte_array()), + pro_tx_hash: pro_tx_hash.to_byte_array().to_vec(), node_address, }) }) @@ -284,15 +244,13 @@ impl From<&ValidatorSetV0> for ValidatorSetUpdate { threshold_public_key: Some(crypto::PublicKey { sum: Some(Bls12381(threshold_public_key.to_bytes().to_vec())), }), - quorum_hash: reverse(&quorum_hash.to_byte_array()), + quorum_hash: quorum_hash.to_byte_array().to_vec(), } } -} -impl ValidatorSetV0 { /// Try to create a quorum from info from the Masternode list (given with state), /// and for information return for quorum members - pub fn try_from_quorum_info_result( + fn try_from_quorum_info_result( value: QuorumInfoResult, state: &PlatformState, ) -> Result { @@ -350,87 +308,3 @@ impl ValidatorSetV0 { }) } } - -/// Trait providing getter methods for `ValidatorSetV0` struct -pub trait ValidatorSetV0Getters { - /// Returns the quorum hash of the validator set. - fn quorum_hash(&self) -> &QuorumHash; - /// Returns rotation quorum index. It's available only for DIP24 quorums - fn quorum_index(&self) -> Option; - /// Returns the active height of the validator set. - fn core_height(&self) -> u32; - /// Returns the members of the validator set. - fn members(&self) -> &BTreeMap; - /// Returns the members of the validator set. - fn members_mut(&mut self) -> &mut BTreeMap; - /// Returns the members of the validator set. - fn members_owned(self) -> BTreeMap; - /// Returns the threshold public key of the validator set. - fn threshold_public_key(&self) -> &BlsPublicKey; -} - -/// Trait providing setter methods for `ValidatorSetV0` struct -pub trait ValidatorSetV0Setters { - /// Sets the quorum hash of the validator set. - fn set_quorum_hash(&mut self, quorum_hash: QuorumHash); - /// Sets the quorum index of the validator set. - fn set_quorum_index(&mut self, index: Option); - /// Sets the active height of the validator set. - fn set_core_height(&mut self, core_height: u32); - /// Sets the members of the validator set. - fn set_members(&mut self, members: BTreeMap); - /// Sets the threshold public key of the validator set. - fn set_threshold_public_key(&mut self, threshold_public_key: BlsPublicKey); -} - -impl ValidatorSetV0Getters for ValidatorSetV0 { - fn quorum_hash(&self) -> &QuorumHash { - &self.quorum_hash - } - - fn quorum_index(&self) -> Option { - self.quorum_index - } - - fn core_height(&self) -> u32 { - self.core_height - } - - fn members(&self) -> &BTreeMap { - &self.members - } - - fn members_mut(&mut self) -> &mut BTreeMap { - &mut self.members - } - - fn members_owned(self) -> BTreeMap { - self.members - } - - fn threshold_public_key(&self) -> &BlsPublicKey { - &self.threshold_public_key - } -} - -impl ValidatorSetV0Setters for ValidatorSetV0 { - fn set_quorum_hash(&mut self, quorum_hash: QuorumHash) { - self.quorum_hash = quorum_hash; - } - - fn set_quorum_index(&mut self, index: Option) { - self.quorum_index = index; - } - - fn set_core_height(&mut self, core_height: u32) { - self.core_height = core_height; - } - - fn set_members(&mut self, members: BTreeMap) { - self.members = members; - } - - fn set_threshold_public_key(&mut self, threshold_public_key: BlsPublicKey) { - self.threshold_public_key = threshold_public_key; - } -} diff --git a/packages/rs-drive-abci/src/query/service.rs b/packages/rs-drive-abci/src/query/service.rs index 218b1f6f69..54e51348c0 100644 --- a/packages/rs-drive-abci/src/query/service.rs +++ b/packages/rs-drive-abci/src/query/service.rs @@ -15,12 +15,13 @@ use dapi_grpc::platform::v0::{ GetContestedResourceIdentityVotesResponse, GetContestedResourceVoteStateRequest, GetContestedResourceVoteStateResponse, GetContestedResourceVotersForIdentityRequest, GetContestedResourceVotersForIdentityResponse, GetContestedResourcesRequest, - GetContestedResourcesResponse, GetDataContractHistoryRequest, GetDataContractHistoryResponse, - GetDataContractRequest, GetDataContractResponse, GetDataContractsRequest, - GetDataContractsResponse, GetDocumentsRequest, GetDocumentsResponse, GetEpochsInfoRequest, - GetEpochsInfoResponse, GetEvonodesProposedEpochBlocksByIdsRequest, - GetEvonodesProposedEpochBlocksByRangeRequest, GetEvonodesProposedEpochBlocksResponse, - GetIdentitiesBalancesRequest, GetIdentitiesBalancesResponse, GetIdentitiesContractKeysRequest, + GetContestedResourcesResponse, GetCurrentQuorumsInfoRequest, GetCurrentQuorumsInfoResponse, + GetDataContractHistoryRequest, GetDataContractHistoryResponse, GetDataContractRequest, + GetDataContractResponse, GetDataContractsRequest, GetDataContractsResponse, + GetDocumentsRequest, GetDocumentsResponse, GetEpochsInfoRequest, GetEpochsInfoResponse, + GetEvonodesProposedEpochBlocksByIdsRequest, GetEvonodesProposedEpochBlocksByRangeRequest, + GetEvonodesProposedEpochBlocksResponse, GetIdentitiesBalancesRequest, + GetIdentitiesBalancesResponse, GetIdentitiesContractKeysRequest, GetIdentitiesContractKeysResponse, GetIdentityBalanceAndRevisionRequest, GetIdentityBalanceAndRevisionResponse, GetIdentityBalanceRequest, GetIdentityBalanceResponse, GetIdentityByPublicKeyHashRequest, GetIdentityByPublicKeyHashResponse, @@ -596,6 +597,18 @@ impl PlatformService for QueryService { ) .await } + + async fn get_current_quorums_info( + &self, + request: Request, + ) -> Result, Status> { + self.handle_blocking_query( + request, + Platform::::query_current_quorums_info, + "query_current_quorums_info", + ) + .await + } } fn query_error_into_status(error: QueryError) -> Status { diff --git a/packages/rs-drive-abci/src/query/system/current_quorums_info/mod.rs b/packages/rs-drive-abci/src/query/system/current_quorums_info/mod.rs new file mode 100644 index 0000000000..85ac929687 --- /dev/null +++ b/packages/rs-drive-abci/src/query/system/current_quorums_info/mod.rs @@ -0,0 +1,59 @@ +mod v0; + +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_current_quorums_info_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_current_quorums_info_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetCurrentQuorumsInfoRequest, GetCurrentQuorumsInfoResponse}; +use dpp::version::PlatformVersion; + +impl Platform { + /// Querying of current quorums info + pub fn query_current_quorums_info( + &self, + GetCurrentQuorumsInfoRequest { version }: GetCurrentQuorumsInfoRequest, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result, Error> { + let Some(version) = version else { + return Ok(QueryValidationResult::new_with_error( + QueryError::DecodingError( + "could not decode current quorums info request".to_string(), + ), + )); + }; + + let feature_version_bounds = &platform_version + .drive_abci + .query + .system + .current_quorums_info; + + let feature_version = match &version { + RequestVersion::V0(_) => 0, + }; + if !feature_version_bounds.check_version(feature_version) { + return Ok(QueryValidationResult::new_with_error( + QueryError::UnsupportedQueryVersion( + "current_quorums_info".to_string(), + feature_version_bounds.min_version, + feature_version_bounds.max_version, + platform_version.protocol_version, + feature_version, + ), + )); + } + match version { + RequestVersion::V0(request_v0) => { + let result = self.query_current_quorums_info_v0(request_v0, platform_state)?; + + Ok(result.map(|response_v0| GetCurrentQuorumsInfoResponse { + version: Some(ResponseVersion::V0(response_v0)), + })) + } + } + } +} diff --git a/packages/rs-drive-abci/src/query/system/current_quorums_info/v0/mod.rs b/packages/rs-drive-abci/src/query/system/current_quorums_info/v0/mod.rs new file mode 100644 index 0000000000..f512f4b8f0 --- /dev/null +++ b/packages/rs-drive-abci/src/query/system/current_quorums_info/v0/mod.rs @@ -0,0 +1,68 @@ +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::platform_types::platform_state::PlatformState; +use crate::platform_types::validator_set::v0::ValidatorSetV0Getters; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_current_quorums_info_request::GetCurrentQuorumsInfoRequestV0; +use dapi_grpc::platform::v0::get_current_quorums_info_response::{ + GetCurrentQuorumsInfoResponseV0, ValidatorSetV0, ValidatorV0, +}; +use dpp::dashcore::hashes::Hash; + +impl Platform { + pub(super) fn query_current_quorums_info_v0( + &self, + GetCurrentQuorumsInfoRequestV0 {}: GetCurrentQuorumsInfoRequestV0, + platform_state: &PlatformState, + ) -> Result, Error> { + // Get all validator sets sorted by core height + let validator_sets_sorted = + platform_state.validator_sets_sorted_by_core_height_by_most_recent(); + + // Collect the validator sets in the desired format + let validator_sets: Vec = validator_sets_sorted + .iter() + .map(|validator_set| { + // Map each ProTxHash to a ValidatorV0 object + let members: Vec = validator_set + .members() + .iter() + .map(|(pro_tx_hash, validator)| ValidatorV0 { + pro_tx_hash: pro_tx_hash.as_byte_array().to_vec(), + node_ip: validator.node_ip.clone(), + is_banned: validator.is_banned, + }) + .collect(); + + // Construct a ValidatorSetV0 object + ValidatorSetV0 { + quorum_hash: validator_set.quorum_hash().as_byte_array().to_vec(), + core_height: validator_set.core_height(), + members, + threshold_public_key: validator_set.threshold_public_key().to_bytes().to_vec(), + } + }) + .collect(); + + // Get the current proposer index and current quorum index, if applicable + let current_quorum_index = platform_state.current_validator_set_quorum_hash(); + let last_committed_block_proposer_pro_tx_hash = + platform_state.last_committed_block_proposer_pro_tx_hash(); + + // Construct the response + let response = GetCurrentQuorumsInfoResponseV0 { + quorum_hashes: validator_sets_sorted + .iter() + .map(|validator_set| validator_set.quorum_hash().as_byte_array().to_vec()) + .collect(), + validator_sets, + last_block_proposer: last_committed_block_proposer_pro_tx_hash.to_vec(), + current_quorum_hash: current_quorum_index.as_byte_array().to_vec(), + metadata: Some(self.response_metadata_v0(platform_state)), + }; + + // Return the response wrapped in a QueryValidationResult + Ok(QueryValidationResult::new_with_data(response)) + } +} diff --git a/packages/rs-drive-abci/src/query/system/mod.rs b/packages/rs-drive-abci/src/query/system/mod.rs index 8eb018a513..6eecfed910 100644 --- a/packages/rs-drive-abci/src/query/system/mod.rs +++ b/packages/rs-drive-abci/src/query/system/mod.rs @@ -1,3 +1,4 @@ +mod current_quorums_info; mod epoch_infos; mod path_elements; mod status; diff --git a/packages/rs-drive-abci/src/query/system/path_elements/mod.rs b/packages/rs-drive-abci/src/query/system/path_elements/mod.rs index 1a91523602..cf056e84b2 100644 --- a/packages/rs-drive-abci/src/query/system/path_elements/mod.rs +++ b/packages/rs-drive-abci/src/query/system/path_elements/mod.rs @@ -20,7 +20,7 @@ impl Platform { ) -> Result, Error> { let Some(version) = version else { return Ok(QueryValidationResult::new_with_error( - QueryError::DecodingError("could not decode epoch info request".to_string()), + QueryError::DecodingError("could not decode path elements".to_string()), )); }; diff --git a/packages/rs-drive-abci/src/query/system/total_credits_in_platform/mod.rs b/packages/rs-drive-abci/src/query/system/total_credits_in_platform/mod.rs index 1bb352103f..f0d126b0d0 100644 --- a/packages/rs-drive-abci/src/query/system/total_credits_in_platform/mod.rs +++ b/packages/rs-drive-abci/src/query/system/total_credits_in_platform/mod.rs @@ -22,7 +22,7 @@ impl Platform { ) -> Result, Error> { let Some(version) = version else { return Ok(QueryValidationResult::new_with_error( - QueryError::DecodingError("could not decode epoch info request".to_string()), + QueryError::DecodingError("could not decode total credits in platform".to_string()), )); }; diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 5c3a1fa7c8..325ed65235 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -28,6 +28,7 @@ dpp = { path = "../rs-dpp", features = [ "bls-signatures", "document-value-conversion", "extended-document", + "core-types-serialization", ], default-features = false } bincode = { version = "2.0.0-rc.3", features = ["serde"], optional = true } platform-serialization-derive = { path = "../rs-platform-serialization-derive", optional = true } diff --git a/packages/rs-drive-proof-verifier/src/lib.rs b/packages/rs-drive-proof-verifier/src/lib.rs index 7e28b6691f..dfa6e41443 100644 --- a/packages/rs-drive-proof-verifier/src/lib.rs +++ b/packages/rs-drive-proof-verifier/src/lib.rs @@ -13,7 +13,10 @@ pub use proof::{FromProof, Length}; #[cfg(feature = "mocks")] pub use provider::MockContextProvider; pub use provider::{ContextProvider, DataContractProvider}; +/// From Request pub mod from_request; +/// Implementation of unproved verification +pub mod unproved; // Needed for #[derive(PlatformSerialize, PlatformDeserialize)] #[cfg(feature = "mocks")] diff --git a/packages/rs-drive-proof-verifier/src/types.rs b/packages/rs-drive-proof-verifier/src/types.rs index 1a6fe75d88..d28ba69302 100644 --- a/packages/rs-drive-proof-verifier/src/types.rs +++ b/packages/rs-drive-proof-verifier/src/types.rs @@ -28,6 +28,8 @@ use drive::grovedb::Element; use std::collections::{BTreeMap, BTreeSet}; use dpp::block::block_info::BlockInfo; +use dpp::core_types::validator_set::ValidatorSet; +use dpp::dashcore::QuorumHash; use dpp::voting::vote_info_storage::contested_document_vote_poll_winner_info::ContestedDocumentVotePollWinnerInfo; use drive::grovedb::query_result_type::Path; #[cfg(feature = "mocks")] @@ -325,6 +327,74 @@ pub struct ContestedVote(ContestedDocumentResourceVotePoll, ResourceVoteChoice); /// Votes casted by some identity. pub type ResourceVotesByIdentity = RetrievedObjects; +/// Represents the current state of quorums in the platform. +/// +/// This struct holds various information related to the current quorums, +/// including the list of quorum hashes, the current active quorum hash, +/// and details about the validators and their statuses. +/// +/// # Fields +/// +/// - `quorum_hashes`: A list of 32-byte hashes representing the active quorums. +/// - `current_quorum_hash`: A 32-byte hash identifying the currently active quorum. +/// This is the quorum that is currently responsible for platform operations. +/// - `validator_sets`: A collection of [`ValidatorSet`] structs, each representing +/// a set of validators for different quorums. This provides detailed information +/// about the members of each quorum. +/// - `last_block_proposer`: A vector of bytes representing the identity of the last +/// block proposer. This is typically the ProTxHash of the masternode that proposed +/// the most recent platform block. +/// - `last_platform_block_height`: The height of the most recent platform block. +/// This indicates the latest block height at the platform level, which may differ +/// from the core blockchain height. +/// - `last_core_block_height`: The height of the most recent core blockchain block +/// associated with the platform. This is the height of the blockchain where the +/// platform block was anchored. +/// +/// # Derives +/// +/// - `Debug`: Provides a debug representation of the `CurrentQuorumsInfo` struct, useful +/// for logging and debugging purposes. +/// - `Clone`: Allows the `CurrentQuorumsInfo` struct to be cloned, creating a deep copy +/// of its contents. +/// +/// # Conditional Derives +/// +/// When the `mocks` feature is enabled, the following derives and attributes are applied: +/// +/// - `Encode`: Allows the struct to be serialized into a binary format using the `bincode` crate. +/// - `Decode`: Allows the struct to be deserialized from a binary format using the `bincode` crate. +/// - `PlatformSerialize`: Enables serialization of the struct using the platform-specific +/// serialization format. +/// - `PlatformDeserialize`: Enables deserialization of the struct using the platform-specific +/// deserialization format. +/// - `platform_serialize(unversioned)`: Specifies that the struct should be serialized +/// without including a version field in the serialized data. +/// +/// This structure is typically used in scenarios where the state of the current quorums +/// needs to be accessed, for example, when validating or proposing new blocks, or when +/// determining the active set of validators. +#[derive(Debug, Clone)] +#[cfg_attr( + feature = "mocks", + derive(Encode, Decode, PlatformSerialize, PlatformDeserialize), + platform_serialize(unversioned) +)] +pub struct CurrentQuorumsInfo { + /// A list of 32-byte hashes representing the active quorums. + pub quorum_hashes: Vec<[u8; 32]>, + /// A 32-byte hash identifying the currently active quorum. + pub current_quorum_hash: [u8; 32], + /// A collection of [`ValidatorSet`] structs, each representing a set of validators for different quorums. + pub validator_sets: Vec, + /// A vector of bytes representing the identity of the last block proposer. + pub last_block_proposer: [u8; 32], + /// The height of the most recent platform block. + pub last_platform_block_height: u64, + /// The height of the most recent core blockchain block associated with the platform. + pub last_core_block_height: u32, +} + /// Prefunded specialized balance. #[derive(Debug, derive_more::From, Copy, Clone)] #[cfg_attr( diff --git a/packages/rs-drive-proof-verifier/src/unproved.rs b/packages/rs-drive-proof-verifier/src/unproved.rs new file mode 100644 index 0000000000..c2f30c6452 --- /dev/null +++ b/packages/rs-drive-proof-verifier/src/unproved.rs @@ -0,0 +1,275 @@ +use crate::types::CurrentQuorumsInfo; +use crate::Error; +use dapi_grpc::platform::v0::ResponseMetadata; +use dapi_grpc::platform::v0::{self as platform}; +use dpp::bls_signatures::PublicKey as BlsPublicKey; +use dpp::core_types::validator::v0::ValidatorV0; +use dpp::core_types::validator_set::v0::ValidatorSetV0; +use dpp::core_types::validator_set::ValidatorSet; +use dpp::dashcore::hashes::Hash; +use dpp::dashcore::{Network, ProTxHash, PubkeyHash, QuorumHash}; +use dpp::version::PlatformVersion; +use std::collections::BTreeMap; + +/// Trait for parsing unproved responses from the Platform. +/// +/// This trait defines methods for extracting data from responses received from the Platform +/// without the need for cryptographic proof validation. It is primarily used for scenarios where +/// the proof data is not available or not required, and only the data itself is needed. +/// +/// ## Associated Types +/// +/// - `Request`: The type of the request sent to the server. This represents the format of the +/// data that the platform expects when making a query. +/// - `Response`: The type of the response received from the server. This represents the format of +/// the data returned by the platform after executing the query. +/// +/// ## Methods +/// +/// - `maybe_from_unproved`: Parses the response to retrieve the requested object, if any. +/// - `maybe_from_unproved_with_metadata`: Parses the response to retrieve the requested object +/// along with response metadata, if any. +/// - `from_unproved`: Retrieves the requested object from the response, returning an error if the +/// object is not found. +/// - `from_unproved_with_metadata`: Retrieves the requested object from the response along with +/// metadata, returning an error if the object is not found. +/// +/// ``` +pub trait FromUnproved { + /// Request type for which this trait is implemented. + type Request; + /// Response type for which this trait is implemented. + type Response; + + /// Parse the received response and retrieve the requested object, if any. + /// + /// # Arguments + /// + /// * `request`: The request sent to the server. + /// * `response`: The response received from the server. + /// * `network`: The network we are using (Mainnet/Testnet/Devnet/Regtest). + /// * `platform_version`: The platform version that should be used. + /// + /// # Returns + /// + /// * `Ok(Some(object))` when the requested object was found in the response. + /// * `Ok(None)` when the requested object was not found. + /// * `Err(Error)` when parsing fails or data is invalid. + fn maybe_from_unproved, O: Into>( + request: I, + response: O, + network: Network, + platform_version: &PlatformVersion, + ) -> Result, Error> + where + Self: Sized, + { + Self::maybe_from_unproved_with_metadata(request, response, network, platform_version) + .map(|maybe_result| maybe_result.0) + } + + /// Parse the received response and retrieve the requested object along with metadata, if any. + /// + /// # Arguments + /// + /// * `request`: The request sent to the server. + /// * `response`: The response received from the server. + /// * `network`: The network we are using (Mainnet/Testnet/Devnet/Regtest). + /// * `platform_version`: The platform version that should be used. + /// + /// # Returns + /// + /// * `Ok((Some(object), metadata))` when the requested object was found. + /// * `Ok((None, metadata))` when the requested object was not found. + /// * `Err(Error)` when parsing fails or data is invalid. + fn maybe_from_unproved_with_metadata, O: Into>( + request: I, + response: O, + network: Network, + platform_version: &PlatformVersion, + ) -> Result<(Option, ResponseMetadata), Error> + where + Self: Sized; + + /// Retrieve the requested object from the response. + /// + /// # Arguments + /// + /// * `request`: The request sent to the server. + /// * `response`: The response received from the server. + /// * `network`: The network we are using. + /// * `platform_version`: The platform version that should be used. + /// + /// # Returns + /// + /// * `Ok(object)` when the requested object was found. + /// * `Err(Error::NotFound)` when the requested object was not found. + /// * `Err(Error)` when parsing fails or data is invalid. + fn from_unproved, O: Into>( + request: I, + response: O, + network: Network, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized, + { + Self::maybe_from_unproved(request, response, network, platform_version)? + .ok_or(Error::NotFound) + } + + /// Retrieve the requested object from the response along with metadata. + /// + /// # Arguments + /// + /// * `request`: The request sent to the server. + /// * `response`: The response received from the server. + /// * `network`: The network we are using. + /// * `platform_version`: The platform version that should be used. + /// + /// # Returns + /// + /// * `Ok((object, metadata))` when the requested object was found. + /// * `Err(Error::NotFound)` when the requested object was not found. + /// * `Err(Error)` when parsing fails or data is invalid. + fn from_unproved_with_metadata, O: Into>( + request: I, + response: O, + network: Network, + platform_version: &PlatformVersion, + ) -> Result<(Self, ResponseMetadata), Error> + where + Self: Sized, + { + let (main_item, response_metadata) = + Self::maybe_from_unproved_with_metadata(request, response, network, platform_version)?; + Ok((main_item.ok_or(Error::NotFound)?, response_metadata)) + } +} + +impl FromUnproved for CurrentQuorumsInfo { + type Request = platform::GetCurrentQuorumsInfoRequest; + type Response = platform::GetCurrentQuorumsInfoResponse; + + fn maybe_from_unproved_with_metadata, O: Into>( + _request: I, + response: O, + _network: Network, + _platform_version: &PlatformVersion, + ) -> Result<(Option, ResponseMetadata), Error> + where + Self: Sized, + { + // Convert the response into a GetCurrentQuorumsInfoResponse + let response: platform::GetCurrentQuorumsInfoResponse = response.into(); + + // Extract metadata from the response + let metadata = match &response.version { + Some(platform::get_current_quorums_info_response::Version::V0(ref v0)) => { + v0.metadata.clone() + } + None => None, + } + .ok_or(Error::EmptyResponseMetadata)?; + + // Parse response based on the version field + let info = match response.version.ok_or(Error::EmptyVersion)? { + platform::get_current_quorums_info_response::Version::V0(v0) => { + // Extract quorum hashes + let quorum_hashes = v0 + .quorum_hashes + .into_iter() + .map(|q_hash| { + let mut q_hash_array = [0u8; 32]; + if q_hash.len() != 32 { + return Err(Error::ProtocolError { + error: "Invalid quorum_hash length".to_string(), + }); + } + q_hash_array.copy_from_slice(&q_hash); + Ok(q_hash_array) + }) + .collect::, Error>>()?; + + // Extract current quorum hash + let mut current_quorum_hash = [0u8; 32]; + if v0.current_quorum_hash.len() != 32 { + return Err(Error::ProtocolError { + error: "Invalid current_quorum_hash length".to_string(), + }); + } + current_quorum_hash.copy_from_slice(&v0.current_quorum_hash); + + let mut last_block_proposer = [0u8; 32]; + if v0.last_block_proposer.len() != 32 { + return Err(Error::ProtocolError { + error: "Invalid last_block_proposer length".to_string(), + }); + } + last_block_proposer.copy_from_slice(&v0.last_block_proposer); + + // Extract validator sets + let validator_sets = + v0.validator_sets + .into_iter() + .map(|vs| { + // Parse the ValidatorSetV0 + let mut quorum_hash = [0u8; 32]; + quorum_hash.copy_from_slice(&vs.quorum_hash); + + // Parse ValidatorV0 members into a BTreeMap + let members = vs + .members + .into_iter() + .map(|member| { + let pro_tx_hash = ProTxHash::from_slice(&member.pro_tx_hash) + .map_err(|_| Error::ProtocolError { + error: "Invalid ProTxHash format".to_string(), + })?; + let validator = ValidatorV0 { + pro_tx_hash, + public_key: None, // Assuming it's not provided here + node_ip: member.node_ip, + node_id: PubkeyHash::from_slice(&[0; 32]).unwrap(), // Placeholder, since not provided + core_port: 0, // Placeholder, since not provided + platform_http_port: 0, // Placeholder, since not provided + platform_p2p_port: 0, // Placeholder, since not provided + is_banned: member.is_banned, + }; + Ok((pro_tx_hash, validator)) + }) + .collect::, Error>>()?; + + Ok(ValidatorSet::V0(ValidatorSetV0 { + quorum_hash: QuorumHash::from_slice(quorum_hash.as_slice()) + .map_err(|_| Error::ProtocolError { + error: "Invalid Quorum Hash format".to_string(), + })?, + quorum_index: None, // Assuming it's not provided here + core_height: vs.core_height, + members, + threshold_public_key: BlsPublicKey::from_bytes( + &vs.threshold_public_key, + ) + .map_err(|_| Error::ProtocolError { + error: "Invalid BlsPublicKey format".to_string(), + })?, + })) + }) + .collect::, Error>>()?; + + // Create the CurrentQuorumsInfo struct + Ok::(CurrentQuorumsInfo { + quorum_hashes, + current_quorum_hash, + validator_sets, + last_block_proposer, + last_platform_block_height: metadata.height, + last_core_block_height: metadata.core_chain_locked_height, + }) + } + }?; + + Ok((Some(info), metadata)) + } +} diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index bf80179c09..3d60df5736 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -67,6 +67,7 @@ pub struct DriveAbciQuerySystemVersions { pub version_upgrade_state: FeatureVersionBounds, pub version_upgrade_vote_status: FeatureVersionBounds, pub epoch_infos: FeatureVersionBounds, + pub current_quorums_info: FeatureVersionBounds, pub partial_status: FeatureVersionBounds, pub path_elements: FeatureVersionBounds, pub total_credits_in_platform: FeatureVersionBounds, diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index a8ab18bd43..bb83ecba96 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -982,6 +982,11 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { max_version: 0, default_current_version: 0, }, + current_quorums_info: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, partial_status: FeatureVersionBounds { min_version: 0, max_version: 0, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 7f3d66171c..d136677129 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -982,6 +982,11 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { max_version: 0, default_current_version: 0, }, + current_quorums_info: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, partial_status: FeatureVersionBounds { min_version: 0, max_version: 0, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 215ff1f28d..b9d9eda464 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -981,6 +981,11 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { max_version: 0, default_current_version: 0, }, + current_quorums_info: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, partial_status: FeatureVersionBounds { min_version: 0, max_version: 0, diff --git a/packages/rs-platform-version/src/version/v2.rs b/packages/rs-platform-version/src/version/v2.rs index 88e5d4edbe..2f80cedf64 100644 --- a/packages/rs-platform-version/src/version/v2.rs +++ b/packages/rs-platform-version/src/version/v2.rs @@ -981,6 +981,11 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion { max_version: 0, default_current_version: 0, }, + current_quorums_info: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, partial_status: FeatureVersionBounds { min_version: 0, max_version: 0, diff --git a/packages/rs-platform-version/src/version/v3.rs b/packages/rs-platform-version/src/version/v3.rs index 48a4054dc4..314e17aa19 100644 --- a/packages/rs-platform-version/src/version/v3.rs +++ b/packages/rs-platform-version/src/version/v3.rs @@ -988,6 +988,11 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { max_version: 0, default_current_version: 0, }, + current_quorums_info: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, partial_status: FeatureVersionBounds { min_version: 0, max_version: 0, diff --git a/packages/rs-platform-version/src/version/v4.rs b/packages/rs-platform-version/src/version/v4.rs index 772686d3d4..86c62b8e8f 100644 --- a/packages/rs-platform-version/src/version/v4.rs +++ b/packages/rs-platform-version/src/version/v4.rs @@ -983,6 +983,11 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { max_version: 0, default_current_version: 0, }, + current_quorums_info: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, partial_status: FeatureVersionBounds { min_version: 0, max_version: 0, diff --git a/packages/rs-sdk/src/platform.rs b/packages/rs-sdk/src/platform.rs index 4766201620..aab3d2153a 100644 --- a/packages/rs-sdk/src/platform.rs +++ b/packages/rs-sdk/src/platform.rs @@ -11,6 +11,7 @@ mod document_query; mod fetch; pub mod fetch_current_no_parameters; mod fetch_many; +mod fetch_unproved; mod identities_contract_keys_query; mod query; pub mod transition; diff --git a/packages/rs-sdk/src/platform/fetch_unproved.rs b/packages/rs-sdk/src/platform/fetch_unproved.rs new file mode 100644 index 0000000000..d25fc86b50 --- /dev/null +++ b/packages/rs-sdk/src/platform/fetch_unproved.rs @@ -0,0 +1,75 @@ +use crate::error::Error; +use crate::platform::proto; +use crate::Sdk; +use dapi_grpc::platform::v0::get_current_quorums_info_request::GetCurrentQuorumsInfoRequestV0; +use dapi_grpc::platform::v0::{self as platform_proto}; +use drive_proof_verifier::unproved::FromUnproved; +use rs_dapi_client::{transport::TransportRequest, DapiRequest, RequestSettings}; +use std::fmt::Debug; + +#[async_trait::async_trait] +pub trait FetchUnproved +where + Self: Sized + Debug, +{ + /// Type of request used to fetch data from Platform. + type Request: TransportRequest; + + /// Fetch unproved data from the Platform. + /// + /// ## Parameters + /// - `sdk`: An instance of [Sdk]. + /// + /// ## Returns + /// Returns: + /// * `Ok(Some(Self))` when object is found. + /// * `Ok(None)` when object is not found. + /// * [`Err(Error)`](Error) when an error occurs. + async fn fetch_unproved(sdk: &Sdk) -> Result, Error> { + Self::fetch_unproved_with_settings(sdk, RequestSettings::default()).await + } + + /// Fetch unproved data from the Platform with custom settings. + /// + /// ## Parameters + /// - `sdk`: An instance of [Sdk]. + /// - `settings`: Request settings for the connection to Platform. + /// + /// ## Returns + /// Returns: + /// * `Ok(Some(Self))` when object is found. + /// * `Ok(None)` when object is not found. + /// * [`Err(Error)`](Error) when an error occurs. + async fn fetch_unproved_with_settings( + sdk: &Sdk, + settings: RequestSettings, + ) -> Result, Error>; +} + +#[async_trait::async_trait] +impl FetchUnproved for drive_proof_verifier::types::CurrentQuorumsInfo { + type Request = platform_proto::GetCurrentQuorumsInfoRequest; + + async fn fetch_unproved_with_settings( + sdk: &Sdk, + settings: RequestSettings, + ) -> Result, Error> { + // Create the request from the query + let request = Self::Request { + version: Some(proto::get_current_quorums_info_request::Version::V0( + GetCurrentQuorumsInfoRequestV0 {}, + )), + }; + + // Execute the request using the Sdk instance + let response = request.clone().execute(sdk, settings).await?; + + // Parse the response into a CurrentQuorumsInfo object along with metadata + match Self::maybe_from_unproved_with_metadata(request, response, sdk.network, sdk.version()) + { + Ok((Some(info), _metadata)) => Ok(Some(info)), + Ok((None, _metadata)) => Ok(None), + Err(err) => Err(err.into()), + } + } +} From 5aab08d99e2c45336e2c1c9360a1de426b965a63 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 26 Sep 2024 12:14:14 +0300 Subject: [PATCH 07/90] fix(dashmate): doctor fails collecting to big logs (#2158) --- packages/dashmate/src/docker/DockerCompose.js | 16 +++++++++++++--- .../tasks/doctor/collectSamplesTaskFactory.js | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/dashmate/src/docker/DockerCompose.js b/packages/dashmate/src/docker/DockerCompose.js index c9231128be..8a50800805 100644 --- a/packages/dashmate/src/docker/DockerCompose.js +++ b/packages/dashmate/src/docker/DockerCompose.js @@ -487,13 +487,23 @@ export default class DockerCompose { * Logs * * @param {Config} config - * @return {Promise} + * @param {string[]} services + * @param {Object} options + * @param {number} options.tail + * @return {Promise<{exitCode: number | null, out: string, err: string}>} */ - async logs(config, services = []) { + async logs(config, services = [], options = {}) { await this.throwErrorIfNotInstalled(); + const args = [...services]; + if (options.tail) { + args.unshift('--tail', options.tail.toString()); + } + + const commandOptions = this.#createOptions(config); + try { - return dockerCompose.logs(services, this.#createOptions(config)); + return await dockerCompose.logs(args, commandOptions); } catch (e) { throw new DockerComposeError(e); } diff --git a/packages/dashmate/src/listr/tasks/doctor/collectSamplesTaskFactory.js b/packages/dashmate/src/listr/tasks/doctor/collectSamplesTaskFactory.js index 1c4d7540be..8e4ae5794a 100644 --- a/packages/dashmate/src/listr/tasks/doctor/collectSamplesTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/doctor/collectSamplesTaskFactory.js @@ -323,7 +323,7 @@ export default function collectSamplesTaskFactory( services.map(async (service) => { const [inspect, logs] = (await Promise.allSettled([ dockerCompose.inspectService(config, service.name), - dockerCompose.logs(config, [service.name]), + dockerCompose.logs(config, [service.name], { tail: 300000 }), ])).map((e) => e.value || e.reason); if (logs?.out) { From 0609fe82fa4e2bb2c8c9aec4412c8f3e45d7b721 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 26 Sep 2024 12:17:58 +0300 Subject: [PATCH 08/90] feat(dashmate)!: confirm a node reset (#2160) --- packages/dashmate/src/commands/reset.js | 43 +++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/packages/dashmate/src/commands/reset.js b/packages/dashmate/src/commands/reset.js index 99b640cdfc..8ce7bd65c8 100644 --- a/packages/dashmate/src/commands/reset.js +++ b/packages/dashmate/src/commands/reset.js @@ -38,6 +38,49 @@ export default class ResetCommand extends ConfigBaseCommand { ) { const tasks = new Listr( [ + { + enabled: (ctx) => !ctx.isForce, + task: async (ctx, task) => { + let message; + if (ctx.isHardReset) { + if (ctx.keepData) { + message = 'Are you sure you want to reset your node configuration? Data will be' + + ' kept.'; + if (ctx.isPlatformOnlyReset) { + message = 'Are you sure you want to reset platform related configuration? Data' + + ' will be kept'; + } + } else { + message = 'Are you sure you want to reset your node data and configuration?'; + if (ctx.isPlatformOnlyReset) { + message = 'Are you sure you want to reset platform related data and configuration?'; + } + } + } else if (ctx.keepData) { + message = 'Are you sure you want to reset docker containers?'; + if (ctx.isPlatformOnlyReset) { + message = 'Are you sure you want to reset platform related docker containers?'; + } + } else { + message = 'Are you sure you want to reset your node data?'; + if (ctx.isPlatformOnlyReset) { + message = 'Are you sure you want to reset platform related data?'; + } + } + + const agreement = await task.prompt({ + type: 'toggle', + name: 'confirm', + message, + enabled: 'Yes', + disabled: 'No', + }); + + if (!agreement) { + throw new Error('Reset operation was declined'); + } + }, + }, { title: `Reset ${config.getName()} node`, task: () => resetNodeTask(config), From 1890a4c22cccb9b4054ba680b05956c083c56d9a Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 26 Sep 2024 13:01:36 +0300 Subject: [PATCH 09/90] fix(dashmate): remove confusing short flag name (#2165) --- packages/dashmate/src/commands/reset.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dashmate/src/commands/reset.js b/packages/dashmate/src/commands/reset.js index 8ce7bd65c8..571b3b2ff3 100644 --- a/packages/dashmate/src/commands/reset.js +++ b/packages/dashmate/src/commands/reset.js @@ -9,7 +9,7 @@ export default class ResetCommand extends ConfigBaseCommand { static flags = { ...ConfigBaseCommand.flags, - hard: Flags.boolean({ char: 'h', description: 'reset config as well as services and data', default: false }), + hard: Flags.boolean({ description: 'reset config as well as services and data', default: false }), force: Flags.boolean({ char: 'f', description: 'skip running services check', default: false }), platform: Flags.boolean({ char: 'p', description: 'reset platform services and data only', default: false }), verbose: Flags.boolean({ char: 'v', description: 'use verbose mode for output', default: false }), From b00142293616cbbf7150180db1ea66466a8de53f Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 26 Sep 2024 13:38:33 +0300 Subject: [PATCH 10/90] docs(dashmate): document logging configuration (#2156) Co-authored-by: thephez --- .../dashmate/src/config/configJsonSchema.js | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/packages/dashmate/src/config/configJsonSchema.js b/packages/dashmate/src/config/configJsonSchema.js index 8da6b4ce48..ed77019f29 100644 --- a/packages/dashmate/src/config/configJsonSchema.js +++ b/packages/dashmate/src/config/configJsonSchema.js @@ -404,28 +404,40 @@ export default { filePath: { type: ['null', 'string'], minLength: 1, + description: 'Write logs only to stdout if null. Provide an absolute file path on' + + ' the host machine to also write to a log file there. Use a log file if logs must be' + + ' retained since stdout logs are stored inside the docker container' + + ' and removed if the container is removed.', }, debug: { type: 'object', properties: { enabled: { type: 'boolean', + description: 'Enable debug logging. Equivalent to setting "debug=1" in the Core configuration file)', }, ips: { type: 'boolean', + description: 'Include IP addresses in debug output', }, sourceLocations: { type: 'boolean', + description: 'Prepend debug output with name of the originating source' + + ' location (source file, line number and function name)', }, threadNames: { type: 'boolean', + description: 'Prepend debug output with name of the originating thread (only' + + ' available on platforms supporting thread_local)', }, timeMicros: { type: 'boolean', + description: 'Add microsecond precision to debug timestamps', }, includeOnly: { type: 'array', uniqueItems: true, + description: 'Log all categories if empty. Otherwise, log only the specified categories.', items: { type: 'string', enum: ['net', 'tor', 'mempool', 'http', 'bench', 'zmq', 'walletdb', 'rpc', 'estimatefee', @@ -437,6 +449,7 @@ export default { }, exclude: { type: 'array', + description: 'Exclude debugging information for one or more categories.', uniqueItems: true, items: { type: 'string', @@ -654,10 +667,12 @@ export default { properties: { level: { type: 'string', + description: 'Log level for gateway container logs', enum: ['trace', 'debug', 'info', 'warn', 'error', 'critical', 'off'], }, accessLogs: { type: 'array', + description: 'Envoy access logs', items: { oneOf: [ { @@ -667,7 +682,8 @@ export default { type: 'string', minLength: 1, enum: ['stdout', 'stderr'], - description: 'Access log type: stdout, stderr or file', + description: 'stdout, stderr or file (absolute file path on host' + + ' machine)', }, format: { type: 'string', @@ -693,7 +709,9 @@ export default { additionalProperties: { type: 'string', }, - description: 'JSON fields and values. If null, default template is used.', + description: 'JSON fields and values. If null, default template is' + + ' used. More info:' + + ' https://www.envoyproxy.io/docs/envoy/latest/configuration/observability/access_log/usage#format-dictionaries', }, }, required: ['template'], @@ -703,7 +721,9 @@ export default { properties: { template: { type: ['null', 'string'], - description: 'Template string. If null, default template is used.', + description: 'Template string. If null, default template is used.' + + ' More info:' + + ' https://www.envoyproxy.io/docs/envoy/latest/configuration/observability/access_log/usage#format-strings', }, }, required: ['template'], @@ -827,6 +847,7 @@ export default { }, logs: { type: 'object', + description: 'Define Drive logs', propertyNames: { type: 'string', minLength: 1, @@ -847,10 +868,13 @@ export default { }, format: { type: 'string', + description: 'Log format:' + + ' https://docs.rs/tracing-subscriber/latest/tracing_subscriber/fmt/format/index.html', enum: ['full', 'compact', 'pretty', 'json'], }, color: { type: ['boolean', 'null'], + description: 'Whether or not to use colorful output; defaults to autodetect', }, }, required: ['destination', 'level', 'format', 'color'], @@ -1115,17 +1139,21 @@ export default { level: { type: 'string', enum: ['trace', 'debug', 'info', 'warn', 'error'], + description: 'Log verbosity level', }, format: { type: 'string', enum: ['plain', 'json'], + description: 'Log format: text or json', }, path: { type: ['string', 'null'], minLength: 1, + description: 'Write to stdout only if null or to stdout and specified log' + + ' file (absolute file path on host machine)', }, }, - required: ['level', 'format'], + required: ['level', 'format', 'path'], additionalProperties: false, }, rpc: { From e4632f6c7618ace68249ccdfb9134c96375c983f Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 26 Sep 2024 16:11:42 +0300 Subject: [PATCH 11/90] Update e2e tests to include `--force` flag for skipping DKG interval check * **localNetwork.spec.js** - Add `isForce: true` to `restart` and `stop` tests * **testnetEvonode.spec.js** - Replace `isSafe: true` with `isForce: true` in `restart` and `stop` tests * **testnetFullnode.spec.js** - Add `isForce: true` to `restart` and `stop` tests --- packages/dashmate/test/e2e/localNetwork.spec.js | 2 ++ packages/dashmate/test/e2e/testnetEvonode.spec.js | 4 ++-- packages/dashmate/test/e2e/testnetFullnode.spec.js | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/dashmate/test/e2e/localNetwork.spec.js b/packages/dashmate/test/e2e/localNetwork.spec.js index d1f8c7bb7b..ab44a55991 100644 --- a/packages/dashmate/test/e2e/localNetwork.spec.js +++ b/packages/dashmate/test/e2e/localNetwork.spec.js @@ -129,6 +129,7 @@ describe('Local Network', function main() { const task = restartNodeTask(config); await task.run({ isVerbose: true, + isForce: true, }); } @@ -146,6 +147,7 @@ describe('Local Network', function main() { const task = stopNodeTask(config); await task.run({ isVerbose: true, + isForce: true, }); } diff --git a/packages/dashmate/test/e2e/testnetEvonode.spec.js b/packages/dashmate/test/e2e/testnetEvonode.spec.js index 1e8f90d5ab..5ffd9e3f94 100644 --- a/packages/dashmate/test/e2e/testnetEvonode.spec.js +++ b/packages/dashmate/test/e2e/testnetEvonode.spec.js @@ -148,7 +148,7 @@ describe('Testnet Evonode', function main() { await task.run({ isVerbose: true, - isSafe: true, + isForce: true, }); // TODO: Assert all services are running @@ -232,7 +232,7 @@ describe('Testnet Evonode', function main() { await task.run({ isVerbose: true, - isSafe: true, + isForce: true, }); // TODO: Assert all services are running diff --git a/packages/dashmate/test/e2e/testnetFullnode.spec.js b/packages/dashmate/test/e2e/testnetFullnode.spec.js index 12329f3407..7d8ccc43d0 100644 --- a/packages/dashmate/test/e2e/testnetFullnode.spec.js +++ b/packages/dashmate/test/e2e/testnetFullnode.spec.js @@ -141,6 +141,7 @@ describe('Testnet Fullnode', function main() { await task.run({ isVerbose: true, + isForce: true, }); await assertServiceRunning(config, 'core'); @@ -160,6 +161,7 @@ describe('Testnet Fullnode', function main() { await task.run({ isVerbose: true, + isForce: true, }); await assertServiceRunning(config, 'core', false); From ba772ef4d05a58dd5d3f427579a75b9be1c4b3d3 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 26 Sep 2024 18:32:38 +0300 Subject: [PATCH 12/90] test(dashmate): e2e tests failing due to DKG interval check (#2171) --- packages/dashmate/test/e2e/testnetFullnode.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/dashmate/test/e2e/testnetFullnode.spec.js b/packages/dashmate/test/e2e/testnetFullnode.spec.js index 7d8ccc43d0..01d36b61db 100644 --- a/packages/dashmate/test/e2e/testnetFullnode.spec.js +++ b/packages/dashmate/test/e2e/testnetFullnode.spec.js @@ -141,7 +141,7 @@ describe('Testnet Fullnode', function main() { await task.run({ isVerbose: true, - isForce: true, + isSafe: true, }); await assertServiceRunning(config, 'core'); @@ -161,7 +161,7 @@ describe('Testnet Fullnode', function main() { await task.run({ isVerbose: true, - isForce: true, + isSafe: true, }); await assertServiceRunning(config, 'core', false); From 7832021605cf05f16104f3ab0449f6fc6d20c7f8 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 26 Sep 2024 20:04:22 +0300 Subject: [PATCH 13/90] fix(dapi): getStatus cache invalidation (#2155) --- .../tenderdash/BlockchainListener.js | 36 +++++++++++++------ .../platform/getStatusHandlerFactory.js | 27 ++++++++++++-- .../tenderdash/BlockchainListener.spec.js | 24 ++++++++----- 3 files changed, 64 insertions(+), 23 deletions(-) diff --git a/packages/dapi/lib/externalApis/tenderdash/BlockchainListener.js b/packages/dapi/lib/externalApis/tenderdash/BlockchainListener.js index 6a0e1f5dc5..f6e3e7549f 100644 --- a/packages/dapi/lib/externalApis/tenderdash/BlockchainListener.js +++ b/packages/dapi/lib/externalApis/tenderdash/BlockchainListener.js @@ -13,7 +13,12 @@ class BlockchainListener extends EventEmitter { */ constructor(tenderdashWsClient) { super(); + this.wsClient = tenderdashWsClient; + + this.processLogger = logger.child({ + process: 'BlockchainListener', + }); } /** @@ -30,14 +35,7 @@ class BlockchainListener extends EventEmitter { * Subscribe to blocks and transaction results */ start() { - const processLogger = logger.child({ - process: 'BlockchainListener', - }); - - processLogger.info('Subscribed to state transition results'); - // Emit transaction results - this.wsClient.subscribe(TX_QUERY); this.wsClient.on(TX_QUERY, (message) => { const [hashString] = (message.events || []).map((event) => { const hashAttribute = event.attributes.find((attribute) => attribute.key === 'hash'); @@ -53,15 +51,31 @@ class BlockchainListener extends EventEmitter { return; } - processLogger.trace(`received transaction result for ${hashString}`); + this.processLogger.trace(`Received transaction result for ${hashString}`); this.emit(BlockchainListener.getTransactionEventName(hashString), message); }); - // TODO: It's not using // Emit blocks and contained transactions - // this.wsClient.subscribe(NEW_BLOCK_QUERY); - // this.wsClient.on(NEW_BLOCK_QUERY, (message) => this.emit(EVENTS.NEW_BLOCK, message)); + this.wsClient.on(NEW_BLOCK_QUERY, (message) => { + this.processLogger.trace('Received new platform block'); + + this.emit(EVENTS.NEW_BLOCK, message); + }); + + this.wsClient.on('connect', () => { + this.#subscribe(); + }); + + if (this.wsClient.isConnected) { + this.#subscribe(); + } + } + + #subscribe() { + this.wsClient.subscribe(TX_QUERY); + this.wsClient.subscribe(NEW_BLOCK_QUERY); + this.processLogger.debug('Subscribed to platform blockchain events'); } } diff --git a/packages/dapi/lib/grpcServer/handlers/platform/getStatusHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/getStatusHandlerFactory.js index 24249b044e..af86ebb312 100644 --- a/packages/dapi/lib/grpcServer/handlers/platform/getStatusHandlerFactory.js +++ b/packages/dapi/lib/grpcServer/handlers/platform/getStatusHandlerFactory.js @@ -9,6 +9,7 @@ const { } = require('@dashevo/dapi-grpc'); const BlockchainListener = require('../../../externalApis/tenderdash/BlockchainListener'); +const logger = require('../../../logger'); /** * @param {BlockchainListener} blockchainListener @@ -17,12 +18,23 @@ const BlockchainListener = require('../../../externalApis/tenderdash/BlockchainL * @return {getStatusHandler} */ function getStatusHandlerFactory(blockchainListener, driveClient, tenderdashRpcClient) { - // Clean cache when new platform block committed let cachedResponse = null; + let cleanCacheTimeout = null; - blockchainListener.on(BlockchainListener.EVENTS.NEW_BLOCK, () => { + function cleanCache() { cachedResponse = null; - }); + + // cancel scheduled cache cleanup + if (cleanCacheTimeout !== null) { + clearTimeout(cleanCacheTimeout); + cleanCacheTimeout = null; + } + + logger.trace({ endpoint: 'getStatus' }, 'cleanup cache'); + } + + // Clean cache when new platform block committed + blockchainListener.on(BlockchainListener.EVENTS.NEW_BLOCK, cleanCache); // DAPI Software version const packageJsonPath = path.resolve(__dirname, '..', '..', '..', '..', 'package.json'); @@ -210,6 +222,15 @@ function getStatusHandlerFactory(blockchainListener, driveClient, tenderdashRpcC cachedResponse = new GetStatusResponse(); cachedResponse.setV0(v0); + // Cancel any existing scheduled cache cleanup + if (cleanCacheTimeout !== null) { + clearTimeout(cleanCacheTimeout); + cleanCacheTimeout = null; + } + + // Clean cache in 3 minutes + cleanCacheTimeout = setTimeout(cleanCache, 3 * 60 * 1000); + return cachedResponse; } diff --git a/packages/dapi/test/integration/externalApis/tenderdash/BlockchainListener.spec.js b/packages/dapi/test/integration/externalApis/tenderdash/BlockchainListener.spec.js index cc2c5fdd7c..b31b79e32b 100644 --- a/packages/dapi/test/integration/externalApis/tenderdash/BlockchainListener.spec.js +++ b/packages/dapi/test/integration/externalApis/tenderdash/BlockchainListener.spec.js @@ -15,8 +15,8 @@ describe('BlockchainListener', () => { ({ sinon } = this); wsClientMock = new EventEmitter(); wsClientMock.subscribe = sinon.stub(); + blockchainListener = new BlockchainListener(wsClientMock); - blockchainListener.start(); sinon.spy(blockchainListener, 'on'); sinon.spy(blockchainListener, 'off'); @@ -84,19 +84,23 @@ describe('BlockchainListener', () => { }); describe('#start', () => { - it('should subscribe to transaction events from WS client', () => { - // TODO: We don't use it for now - // expect(wsClientMock.subscribe).to.be.calledTwice(); - expect(wsClientMock.subscribe).to.be.calledOnce(); + it('should subscribe to transaction events from WS client if it is connected', () => { + wsClientMock.isConnected = true; + + blockchainListener.start(); + + expect(wsClientMock.subscribe).to.be.calledTwice(); expect(wsClientMock.subscribe.firstCall).to.be.calledWithExactly( BlockchainListener.TX_QUERY, ); - // expect(wsClientMock.subscribe.secondCall).to.be.calledWithExactly( - // BlockchainListener.NEW_BLOCK_QUERY, - // ); + expect(wsClientMock.subscribe.secondCall).to.be.calledWithExactly( + BlockchainListener.NEW_BLOCK_QUERY, + ); }); - it.skip('should emit block when new block is arrived', (done) => { + it('should emit block when new block is arrived', (done) => { + blockchainListener.start(); + blockchainListener.on(BlockchainListener.EVENTS.NEW_BLOCK, (message) => { expect(message).to.be.deep.equal(blockMessageMock); @@ -107,6 +111,8 @@ describe('BlockchainListener', () => { }); it('should emit transaction when transaction is arrived', (done) => { + blockchainListener.start(); + const topic = BlockchainListener.getTransactionEventName(transactionHash); blockchainListener.on(topic, (message) => { From 2ea168a7869c56b6495a006ad071078620bec0f5 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 26 Sep 2024 20:05:46 +0300 Subject: [PATCH 14/90] fix(dashmate): port marks as closed if ipv6 is not disabled (#2162) --- packages/dashmate/src/status/providers.js | 83 +++++++++++++++++++---- 1 file changed, 68 insertions(+), 15 deletions(-) diff --git a/packages/dashmate/src/status/providers.js b/packages/dashmate/src/status/providers.js index a3a08b94b6..2eee8a72f5 100644 --- a/packages/dashmate/src/status/providers.js +++ b/packages/dashmate/src/status/providers.js @@ -1,6 +1,8 @@ +import https from 'https'; import { PortStateEnum } from './enums/portState.js'; const MAX_REQUEST_TIMEOUT = 5000; +const MAX_RESPONSE_SIZE = 1 * 1024 * 1024; // 1 MB const request = async (url) => { try { @@ -29,12 +31,6 @@ const requestJSON = async (url) => { return response; }; -const requestText = async (url) => { - const response = await request(url); - - return response.text(); -}; - const insightURLs = { testnet: 'https://testnet-insight.dashevo.org/insight-api', mainnet: 'https://insight.dash.org/insight-api', @@ -68,15 +64,72 @@ export default { }, mnowatch: { checkPortStatus: async (port) => { - try { - return requestText(`https://mnowatch.org/${port}/`); - } catch (e) { - if (process.env.DEBUG) { - // eslint-disable-next-line no-console - console.warn(e); - } - return PortStateEnum.ERROR; - } + // We use http request instead fetch function to force + // using IPv4 otherwise mnwatch could try to connect to IPv6 node address + // and fail (Core listens for IPv4 only) + // https://github.com/dashpay/platform/issues/2100 + + const options = { + hostname: 'mnowatch.org', + port: 443, + path: `/${port}/`, + method: 'GET', + family: 4, // Force IPv4 + timeout: MAX_REQUEST_TIMEOUT, + }; + + return new Promise((resolve) => { + const req = https.request(options, (res) => { + let data = ''; + + // Check if the status code is 200 + if (res.statusCode !== 200) { + if (process.env.DEBUG) { + // eslint-disable-next-line no-console + console.warn(`Port check request failed with status code ${res.statusCode}`); + } + // Consume response data to free up memory + res.resume(); + resolve(PortStateEnum.ERROR); + return; + } + + // Optionally set the encoding to receive strings directly + res.setEncoding('utf8'); + + // Collect data chunks + res.on('data', (chunk) => { + data += chunk; + + if (data.length > MAX_RESPONSE_SIZE) { + resolve(PortStateEnum.ERROR); + + if (process.env.DEBUG) { + // eslint-disable-next-line no-console + console.warn('Port check response size exceeded'); + } + + req.destroy(); + } + }); + + // Handle the end of the response + res.on('end', () => { + resolve(data); + }); + }); + + req.on('error', (e) => { + if (process.env.DEBUG) { + // eslint-disable-next-line no-console + console.warn(`Port check request failed: ${e}`); + } + + resolve(PortStateEnum.ERROR); + }); + + req.end(); + }); }, }, }; From 83f2e20718515f9d8107a0071538b66f90b6b19b Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 26 Sep 2024 20:06:18 +0300 Subject: [PATCH 15/90] fix(dashmate): cannot read properties of undefined (reading 'expires') (#2164) --- .../doctor/analyse/analyseConfigFactory.js | 4 +++ .../obtainZeroSSLCertificateTaskFactory.js | 11 ++++++++ .../validateZeroSslCertificateFactory.js | 27 +++++++++++++------ 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/packages/dashmate/src/doctor/analyse/analyseConfigFactory.js b/packages/dashmate/src/doctor/analyse/analyseConfigFactory.js index 7396668d43..4bb65d0ffb 100644 --- a/packages/dashmate/src/doctor/analyse/analyseConfigFactory.js +++ b/packages/dashmate/src/doctor/analyse/analyseConfigFactory.js @@ -134,6 +134,10 @@ and revoke the previous certificate in the ZeroSSL dashboard`, description: chalk`ZeroSSL certificate is not valid.`, solution: chalk`Please run {bold.cyanBright dashmate ssl zerossl obtain} to get a new one.`, }, + [ERRORS.ZERO_SSL_API_ERROR]: { + description: ssl?.data?.error?.message, + solution: chalk`Please contact ZeroSSL support if needed.`, + }, }[ssl.error] ?? {}; if (description) { diff --git a/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js index 86bb3db5ca..ca679233d0 100644 --- a/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js @@ -64,6 +64,9 @@ export default function obtainZeroSSLCertificateTaskFactory( case ERRORS.CERTIFICATE_ID_IS_NOT_SET: // eslint-disable-next-line no-param-reassign task.output = 'Certificate is not configured yet, creating a new one'; + + // We need to create a new certificate + ctx.certificate = null; break; case ERRORS.PRIVATE_KEY_IS_NOT_PRESENT: // If certificate exists but private key does not, then we can't set up TLS connection @@ -85,6 +88,9 @@ export default function obtainZeroSSLCertificateTaskFactory( case ERRORS.CERTIFICATE_EXPIRES_SOON: // eslint-disable-next-line no-param-reassign task.output = `Certificate exists but expires in less than ${ctx.expirationDays} days at ${ctx.certificate.expires}. Obtain a new one`; + + // We need to create a new certificate + ctx.certificate = null; break; case ERRORS.CERTIFICATE_IS_NOT_VALIDATED: // eslint-disable-next-line no-param-reassign @@ -93,7 +99,12 @@ export default function obtainZeroSSLCertificateTaskFactory( case ERRORS.CERTIFICATE_IS_NOT_VALID: // eslint-disable-next-line no-param-reassign task.output = 'Certificate is not valid. Create a new one'; + + // We need to create a new certificate + ctx.certificate = null; break; + case ERRORS.ZERO_SSL_API_ERROR: + throw ctx.error; default: throw new Error(`Unknown error: ${error}`); } diff --git a/packages/dashmate/src/ssl/zerossl/validateZeroSslCertificateFactory.js b/packages/dashmate/src/ssl/zerossl/validateZeroSslCertificateFactory.js index f4d9956a9d..20b221216c 100644 --- a/packages/dashmate/src/ssl/zerossl/validateZeroSslCertificateFactory.js +++ b/packages/dashmate/src/ssl/zerossl/validateZeroSslCertificateFactory.js @@ -11,6 +11,7 @@ export const ERRORS = { CERTIFICATE_EXPIRES_SOON: 'CERTIFICATE_EXPIRES_SOON', CERTIFICATE_IS_NOT_VALIDATED: 'CERTIFICATE_IS_NOT_VALIDATED', CERTIFICATE_IS_NOT_VALID: 'CERTIFICATE_IS_NOT_VALID', + ZERO_SSL_API_ERROR: 'ZERO_SSL_API_ERROR', }; /** @@ -68,9 +69,22 @@ export default function validateZeroSslCertificateFactory(homeDir, getCertificat data.isBundleFilePresent = fs.existsSync(data.bundleFilePath); // This function will throw an error if certificate with specified ID is not present - const certificate = await getCertificate(data.apiKey, certificateId); + try { + data.certificate = await getCertificate(data.apiKey, certificateId); + } catch (e) { + if (e.code) { + data.error = e; - data.isExpiresSoon = certificate.isExpiredInDays(expirationDays); + return { + error: ERRORS.ZERO_SSL_API_ERROR, + data, + }; + } + + throw e; + } + + data.isExpiresSoon = data.certificate.isExpiredInDays(expirationDays); // If certificate exists but private key does not, then we can't setup TLS connection // In this case we need to regenerate a certificate or put back this private key @@ -82,17 +96,16 @@ export default function validateZeroSslCertificateFactory(homeDir, getCertificat } // We need to make sure that external IP and certificate IP match - if (certificate.common_name !== data.externalIp) { + if (data.certificate.common_name !== data.externalIp) { return { error: ERRORS.EXTERNAL_IP_MISMATCH, data, }; } - if (['pending_validation', 'draft'].includes(certificate.status)) { + if (['pending_validation', 'draft'].includes(data.certificate.status)) { // Certificate is already created, so we just need to pass validation // and download certificate file - data.certificate = certificate; // We need to download new certificate bundle data.isBundleFilePresent = false; @@ -103,7 +116,7 @@ export default function validateZeroSslCertificateFactory(homeDir, getCertificat }; } - if (certificate.status !== 'issued' || data.isExpiresSoon) { + if (data.certificate.status !== 'issued' || data.isExpiresSoon) { // Certificate is going to expire soon, or current certificate is not valid // we need to obtain a new one @@ -128,8 +141,6 @@ export default function validateZeroSslCertificateFactory(homeDir, getCertificat } // Certificate is valid, so we might need only to download certificate bundle - data.certificate = certificate; - return { data, }; From 8b01e207ae1c8767d94dc0540eee4f705d360b1e Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 26 Sep 2024 20:06:44 +0300 Subject: [PATCH 16/90] chore(dashmate): do not call mint on masternodes (#2172) --- packages/dashmate/src/commands/wallet/mint.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/dashmate/src/commands/wallet/mint.js b/packages/dashmate/src/commands/wallet/mint.js index 2eeacabd35..0f06ad0ecd 100644 --- a/packages/dashmate/src/commands/wallet/mint.js +++ b/packages/dashmate/src/commands/wallet/mint.js @@ -51,6 +51,10 @@ Mint given amount of tDash to a new or specified address throw new Error('Only local network supports generation of dash'); } + if (config.get('core.masternode.enable')) { + throw new Error('A masternode doesn\'t support generation of dash'); + } + const tasks = new Listr( [ { From 4a61d30412a37cc8127fe57e537db070482b3b4b Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 26 Sep 2024 22:26:31 +0300 Subject: [PATCH 17/90] feat(sdk)!: change default network to mainnet (#2161) --- packages/js-dash-sdk/src/SDK/Client/Client.spec.ts | 5 +++-- packages/js-dash-sdk/src/SDK/Client/Client.ts | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/js-dash-sdk/src/SDK/Client/Client.spec.ts b/packages/js-dash-sdk/src/SDK/Client/Client.spec.ts index b44f7cd02f..bc6fa96bd4 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Client.spec.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Client.spec.ts @@ -37,6 +37,7 @@ describe('Dash - Client', function suite() { testHDKey = 'tprv8ZgxMBicQKsPeGi4CikhacVPz6UmErenu1PoD3S4XcEDSPP8auRaS8hG3DQtsQ2i9HACgohHwF5sgMVJNksoKqYoZbis8o75Pp1koCme2Yo'; client = new Client({ + network: 'testnet', wallet: { HDPrivateKey: testHDKey, }, @@ -77,7 +78,7 @@ describe('Dash - Client', function suite() { it('should be instantiable', () => { client = new Client(); expect(client).to.exist; - expect(client.network).to.be.equal('testnet'); + expect(client.network).to.be.equal('mainnet'); expect(client.getDAPIClient().constructor.name).to.be.equal('DAPIClient'); }); @@ -111,7 +112,7 @@ describe('Dash - Client', function suite() { wallet: { mnemonic: testMnemonic, offlineMode: true, - network: 'evonet', + network: 'mainnet', }, }); diff --git a/packages/js-dash-sdk/src/SDK/Client/Client.ts b/packages/js-dash-sdk/src/SDK/Client/Client.ts index 7f185677ea..ee641901df 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Client.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Client.ts @@ -48,7 +48,7 @@ export interface ClientOpts { * and the Dash Platform (layer 2). */ export class Client extends EventEmitter { - public network: string = 'testnet'; + public network: string = 'mainnet'; public wallet: Wallet | undefined; @@ -74,7 +74,7 @@ export class Client extends EventEmitter { this.options = options; - this.network = this.options.network ? this.options.network.toString() : 'testnet'; + this.network = this.options.network ? this.options.network.toString() : 'mainnet'; // Initialize DAPI Client const dapiClientOptions = { From 4b1f64059dbae5b9c787454feae805a11da0cfa0 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 26 Sep 2024 22:56:17 +0300 Subject: [PATCH 18/90] fix(dapi): invalid mainnet seed ports (#2173) --- packages/js-dapi-client/lib/networkConfigs.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/js-dapi-client/lib/networkConfigs.js b/packages/js-dapi-client/lib/networkConfigs.js index 7308016ee5..4bc7c83213 100644 --- a/packages/js-dapi-client/lib/networkConfigs.js +++ b/packages/js-dapi-client/lib/networkConfigs.js @@ -53,10 +53,10 @@ module.exports = { }, mainnet: { seeds: [ - 'seed-1.mainnet.networks.dash.org:1443', - 'seed-2.mainnet.networks.dash.org:1443', - 'seed-3.mainnet.networks.dash.org:1443', - 'seed-4.mainnet.networks.dash.org:1443', + 'seed-1.mainnet.networks.dash.org', + 'seed-2.mainnet.networks.dash.org', + 'seed-3.mainnet.networks.dash.org', + 'seed-4.mainnet.networks.dash.org', ], network: 'mainnet', }, From 94128bdd70e8e4949e124eb27924671768ca0465 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 27 Sep 2024 11:50:35 +0300 Subject: [PATCH 19/90] chore(release): update changelog and bump version to 1.4.0-dev.1 (#2175) --- CHANGELOG.md | 51 +++++++++++++++++++++++++++++++ packages/js-dash-sdk/package.json | 2 +- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 76bedf74c9..3dd4e6d893 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,54 @@ +## [1.4.0-dev.1](https://github.com/dashpay/platform/compare/v1.3.0...v1.4.0-dev.1) (2024-09-27) + + +### ⚠ BREAKING CHANGES + +* **sdk:** change default network to mainnet (#2161) +* **dashmate:** confirm a node reset (#2160) +* **platform:** withdrawals polishing and fixes for mainnet (#2166) +* **platform:** do not switch to oldest quorums in validator set update (#2167) + +### Features + +* **dashmate:** confirm a node reset ([#2160](https://github.com/dashpay/platform/issues/2160)) +* **platform:** do not switch to oldest quorums in validator set update ([#2167](https://github.com/dashpay/platform/issues/2167)) +* **platform:** get current quorum info ([#2168](https://github.com/dashpay/platform/issues/2168)) +* **platform:** withdrawals polishing and fixes for mainnet ([#2166](https://github.com/dashpay/platform/issues/2166)) +* **sdk:** change default network to mainnet ([#2161](https://github.com/dashpay/platform/issues/2161)) + + +### Bug Fixes + +* **dapi:** getStatus cache invalidation ([#2155](https://github.com/dashpay/platform/issues/2155)) +* **dapi:** invalid mainnet seed ports ([#2173](https://github.com/dashpay/platform/issues/2173)) +* **dashmate:** cannot read properties of undefined (reading 'expires') ([#2164](https://github.com/dashpay/platform/issues/2164)) +* **dashmate:** colors[updated] is not a function ([#2157](https://github.com/dashpay/platform/issues/2157)) +* **dashmate:** doctor fails collecting to big logs ([#2158](https://github.com/dashpay/platform/issues/2158)) +* **dashmate:** port marks as closed if ipv6 is not disabled ([#2162](https://github.com/dashpay/platform/issues/2162)) +* **dashmate:** remove confusing short flag name ([#2165](https://github.com/dashpay/platform/issues/2165)) + + +### Continuous integration + +* build dashmate package on macos14 + + +### Documentation + +* **dashmate:** document logging configuration ([#2156](https://github.com/dashpay/platform/issues/2156)) + + +### Tests + +* **dashmate:** e2e tests failing due to DKG interval check ([#2171](https://github.com/dashpay/platform/issues/2171)) + + +### Miscellaneous Chores + +* **dashmate:** do not call mint on masternodes ([#2172](https://github.com/dashpay/platform/issues/2172)) +* **platform:** protocol version 4 creation ([#2153](https://github.com/dashpay/platform/issues/2153)) + + ## [1.3.0](https://github.com/dashpay/platform/compare/v1.2.0...v1.3.0) (2024-09-19) ### Features diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index f3f231678e..457ce7b4dc 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.3.0", + "version": "4.4.0-dev.1", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", From 05b040f22e68d8d43be565e936a09c44d51aebcf Mon Sep 17 00:00:00 2001 From: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> Date: Fri, 27 Sep 2024 18:10:06 +0300 Subject: [PATCH 20/90] feat(sdk): get node status (#2139) Co-authored-by: lklimek <842586+lklimek@users.noreply.github.com> --- packages/dapi-grpc/build.rs | 9 +- packages/rs-dapi-client/src/address_list.rs | 11 +- packages/rs-dapi-client/src/dapi_client.rs | 5 + packages/rs-dapi-client/src/dump.rs | 1 - packages/rs-dapi-client/src/lib.rs | 1 + packages/rs-dapi-client/src/transport/grpc.rs | 9 + packages/rs-drive-proof-verifier/src/proof.rs | 13 +- packages/rs-drive-proof-verifier/src/types.rs | 13 +- .../src/types/evonode_status.rs | 382 ++++++++++++++++++ .../rs-drive-proof-verifier/src/unproved.rs | 23 +- packages/rs-sdk/Cargo.toml | 2 +- packages/rs-sdk/README.md | 8 +- packages/rs-sdk/src/lib.rs | 4 +- packages/rs-sdk/src/mock.rs | 1 - packages/rs-sdk/src/mock/requests.rs | 9 +- packages/rs-sdk/src/mock/sdk.rs | 8 +- packages/rs-sdk/src/platform.rs | 1 + .../rs-sdk/src/platform/fetch_unproved.rs | 99 +++-- packages/rs-sdk/src/platform/query.rs | 20 +- packages/rs-sdk/src/platform/types.rs | 1 + packages/rs-sdk/src/platform/types/evonode.rs | 108 +++++ packages/rs-sdk/src/sdk.rs | 20 +- packages/rs-sdk/tests/fetch/evonode.rs | 71 ++++ packages/rs-sdk/tests/fetch/mod.rs | 1 + .../vectors/test_evonode_status/.gitkeep | 0 ...a1c40d35547373d23f3ba329df2b6d993b374.json | Bin 0 -> 12549 bytes .../test_evonode_status_refused/.gitkeep | 0 ...64123671ed14d3f0c537aa8e878d24e529de5.json | Bin 0 -> 155 bytes 28 files changed, 757 insertions(+), 63 deletions(-) create mode 100644 packages/rs-drive-proof-verifier/src/types/evonode_status.rs create mode 100644 packages/rs-sdk/src/platform/types/evonode.rs create mode 100644 packages/rs-sdk/tests/fetch/evonode.rs create mode 100644 packages/rs-sdk/tests/vectors/test_evonode_status/.gitkeep create mode 100644 packages/rs-sdk/tests/vectors/test_evonode_status/msg_EvoNode_244e3005966550cd3cb2837d3bca1c40d35547373d23f3ba329df2b6d993b374.json create mode 100644 packages/rs-sdk/tests/vectors/test_evonode_status_refused/.gitkeep create mode 100644 packages/rs-sdk/tests/vectors/test_evonode_status_refused/msg_EvoNode_6db392ff1869b56ecc7de9ace5864123671ed14d3f0c537aa8e878d24e529de5.json diff --git a/packages/dapi-grpc/build.rs b/packages/dapi-grpc/build.rs index 4bd36542e8..f70b685fbd 100644 --- a/packages/dapi-grpc/build.rs +++ b/packages/dapi-grpc/build.rs @@ -47,7 +47,7 @@ fn configure_platform(mut platform: MappingConfig) -> MappingConfig { // Derive features for versioned messages // // "GetConsensusParamsRequest" is excluded as this message does not support proofs - const VERSIONED_REQUESTS: [&str; 29] = [ + const VERSIONED_REQUESTS: [&str; 30] = [ "GetDataContractHistoryRequest", "GetDataContractRequest", "GetDataContractsRequest", @@ -77,9 +77,13 @@ fn configure_platform(mut platform: MappingConfig) -> MappingConfig { "GetTotalCreditsInPlatformRequest", "GetEvonodesProposedEpochBlocksByIdsRequest", "GetEvonodesProposedEpochBlocksByRangeRequest", + "GetStatusRequest", ]; - // "GetConsensusParamsResponse" is excluded as this message does not support proofs + // The following responses are excluded as they don't support proofs: + // - "GetConsensusParamsResponse" + // - "GetStatusResponse" + // // "GetEvonodesProposedEpochBlocksResponse" is used for 2 Requests const VERSIONED_RESPONSES: [&str; 29] = [ "GetDataContractHistoryResponse", @@ -213,6 +217,7 @@ impl MappingConfig { /// /// * `protobuf_file` - Path to the protobuf file to use as input. /// * `out_dir` - Output directory where subdirectories for generated files will be created. + /// /// Depending on the features, either `client`, `server` or `client_server` subdirectory /// will be created inside `out_dir`. fn new(protobuf_file: PathBuf, out_dir: PathBuf) -> Self { diff --git a/packages/rs-dapi-client/src/address_list.rs b/packages/rs-dapi-client/src/address_list.rs index ab4e2ba0eb..bf09b1af8c 100644 --- a/packages/rs-dapi-client/src/address_list.rs +++ b/packages/rs-dapi-client/src/address_list.rs @@ -85,7 +85,7 @@ pub enum AddressListError { /// A structure to manage DAPI addresses to select from /// for [DapiRequest](crate::DapiRequest) execution. -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct AddressList { addresses: HashSet
, base_ban_period: Duration, @@ -221,3 +221,12 @@ impl FromIterator for AddressList { address_list } } + +impl IntoIterator for AddressList { + type Item = Address; + type IntoIter = std::collections::hash_set::IntoIter
; + + fn into_iter(self) -> Self::IntoIter { + self.addresses.into_iter() + } +} diff --git a/packages/rs-dapi-client/src/dapi_client.rs b/packages/rs-dapi-client/src/dapi_client.rs index 8e5a3d660b..17748ab2b0 100644 --- a/packages/rs-dapi-client/src/dapi_client.rs +++ b/packages/rs-dapi-client/src/dapi_client.rs @@ -112,6 +112,11 @@ impl DapiClient { dump_dir: None, } } + + /// Return the [DapiClient] address list. + pub fn address_list(&self) -> &Arc> { + &self.address_list + } } #[async_trait] diff --git a/packages/rs-dapi-client/src/dump.rs b/packages/rs-dapi-client/src/dump.rs index c81399395b..a1e23d1ff2 100644 --- a/packages/rs-dapi-client/src/dump.rs +++ b/packages/rs-dapi-client/src/dump.rs @@ -189,7 +189,6 @@ impl DapiClient { response: &MockResult, dump_dir: Option, ) where - R: Mockable, ::Response: Mockable, { let path = match dump_dir { diff --git a/packages/rs-dapi-client/src/lib.rs b/packages/rs-dapi-client/src/lib.rs index e4f5836e29..976537097e 100644 --- a/packages/rs-dapi-client/src/lib.rs +++ b/packages/rs-dapi-client/src/lib.rs @@ -14,6 +14,7 @@ pub mod transport; pub use address_list::Address; pub use address_list::AddressList; +pub use connection_pool::ConnectionPool; pub use dapi_client::DapiRequestExecutor; pub use dapi_client::{DapiClient, DapiClientError}; use dapi_grpc::mock::Mockable; diff --git a/packages/rs-dapi-client/src/transport/grpc.rs b/packages/rs-dapi-client/src/transport/grpc.rs index 4cfa0c2649..98976ed08e 100644 --- a/packages/rs-dapi-client/src/transport/grpc.rs +++ b/packages/rs-dapi-client/src/transport/grpc.rs @@ -421,3 +421,12 @@ impl_transport_request_grpc!( }, subscribe_to_transactions_with_proofs ); + +// rpc getStatus(GetStatusRequest) returns (GetStatusResponse); +impl_transport_request_grpc!( + platform_proto::GetStatusRequest, + platform_proto::GetStatusResponse, + PlatformGrpcClient, + RequestSettings::default(), + get_status +); diff --git a/packages/rs-drive-proof-verifier/src/proof.rs b/packages/rs-drive-proof-verifier/src/proof.rs index 57dec66d31..89fef81360 100644 --- a/packages/rs-drive-proof-verifier/src/proof.rs +++ b/packages/rs-drive-proof-verifier/src/proof.rs @@ -2,13 +2,16 @@ use crate::from_request::TryFromRequest; use crate::provider::DataContractProvider; use crate::verify::verify_tenderdash_proof; use crate::{types, types::*, ContextProvider, Error}; +use dapi_grpc::platform::v0::get_evonodes_proposed_epoch_blocks_by_range_request::get_evonodes_proposed_epoch_blocks_by_range_request_v0::Start; use dapi_grpc::platform::v0::get_identities_contract_keys_request::GetIdentitiesContractKeysRequestV0; use dapi_grpc::platform::v0::get_path_elements_request::GetPathElementsRequestV0; use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_request::{ self, GetProtocolVersionUpgradeVoteStatusRequestV0, }; use dapi_grpc::platform::v0::security_level_map::KeyKindRequestType as GrpcKeyKind; -use dapi_grpc::platform::v0::{get_contested_resource_identity_votes_request, get_data_contract_history_request, get_data_contract_request, get_data_contracts_request, get_epochs_info_request, get_evonodes_proposed_epoch_blocks_by_ids_request, get_evonodes_proposed_epoch_blocks_by_range_request, get_identities_balances_request, get_identities_contract_keys_request, get_identity_balance_and_revision_request, get_identity_balance_request, get_identity_by_public_key_hash_request, get_identity_contract_nonce_request, get_identity_keys_request, get_identity_nonce_request, get_identity_request, get_path_elements_request, get_prefunded_specialized_balance_request, GetContestedResourceVotersForIdentityRequest, GetContestedResourceVotersForIdentityResponse, GetPathElementsRequest, GetPathElementsResponse, GetProtocolVersionUpgradeStateRequest, GetProtocolVersionUpgradeStateResponse, GetProtocolVersionUpgradeVoteStatusRequest, GetProtocolVersionUpgradeVoteStatusResponse, Proof, ResponseMetadata}; +use dapi_grpc::platform::v0::{ + get_contested_resource_identity_votes_request, get_data_contract_history_request, get_data_contract_request, get_data_contracts_request, get_epochs_info_request, get_evonodes_proposed_epoch_blocks_by_ids_request, get_evonodes_proposed_epoch_blocks_by_range_request, get_identities_balances_request, get_identities_contract_keys_request, get_identity_balance_and_revision_request, get_identity_balance_request, get_identity_by_public_key_hash_request, get_identity_contract_nonce_request, get_identity_keys_request, get_identity_nonce_request, get_identity_request, get_path_elements_request, get_prefunded_specialized_balance_request, GetContestedResourceVotersForIdentityRequest, GetContestedResourceVotersForIdentityResponse, GetPathElementsRequest, GetPathElementsResponse, GetProtocolVersionUpgradeStateRequest, GetProtocolVersionUpgradeStateResponse, GetProtocolVersionUpgradeVoteStatusRequest, GetProtocolVersionUpgradeVoteStatusResponse, Proof, ResponseMetadata +}; use dapi_grpc::platform::{ v0::{self as platform, key_request_type, KeyRequestType as GrpcKeyType}, VersionedGrpcResponse, @@ -35,6 +38,7 @@ use drive::drive::identity::key::fetch::{ use drive::drive::Drive; use drive::error::proof::ProofError; use drive::query::contested_resource_votes_given_by_identity_query::ContestedResourceVotesGivenByIdentityQuery; +use drive::query::proposer_block_count_query::ProposerQueryType; use drive::query::vote_poll_contestant_votes_query::ContestedDocumentVotePollVotesDriveQuery; use drive::query::vote_poll_vote_state_query::ContestedDocumentVotePollDriveQuery; use drive::query::vote_polls_by_document_type_query::VotePollsByDocumentTypeQuery; @@ -42,8 +46,6 @@ use drive::query::{DriveDocumentQuery, VotePollsByEndDateDriveQuery}; use std::array::TryFromSliceError; use std::collections::BTreeMap; use std::num::TryFromIntError; -use dapi_grpc::platform::v0::get_evonodes_proposed_epoch_blocks_by_range_request::get_evonodes_proposed_epoch_blocks_by_range_request_v0::Start; -use drive::query::proposer_block_count_query::ProposerQueryType; /// Parse and verify the received proof and retrieve the requested object, if any. /// @@ -78,7 +80,7 @@ pub trait FromProof { /// /// * `Ok(Some(object, metadata))` when the requested object was found in the proof. /// * `Ok(None)` when the requested object was not found in the proof; this can be interpreted as proof of non-existence. - /// For collections, returns Ok(None) if none of the requested objects were found. + /// For collections, returns Ok(None) if none of the requested objects were found. /// * `Err(Error)` when either the provided data is invalid or proof validation failed. fn maybe_from_proof<'a, I: Into, O: Into>( request: I, @@ -108,7 +110,7 @@ pub trait FromProof { /// /// * `Ok(Some((object, metadata)))` when the requested object was found in the proof. /// * `Ok(None)` when the requested object was not found in the proof; this can be interpreted as proof of non-existence. - /// For collections, returns Ok(None) if none of the requested objects were found. + /// For collections, returns Ok(None) if none of the requested objects were found. /// * `Err(Error)` when either the provided data is invalid or proof validation failed. fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( request: I, @@ -1714,7 +1716,6 @@ impl FromProof for TotalCreditsInPla )) } } - impl FromProof for ProposerBlockCounts { type Request = platform::GetEvonodesProposedEpochBlocksByIdsRequest; type Response = platform::GetEvonodesProposedEpochBlocksResponse; diff --git a/packages/rs-drive-proof-verifier/src/types.rs b/packages/rs-drive-proof-verifier/src/types.rs index d28ba69302..d49301720b 100644 --- a/packages/rs-drive-proof-verifier/src/types.rs +++ b/packages/rs-drive-proof-verifier/src/types.rs @@ -5,6 +5,10 @@ //! In this case, the [FromProof](crate::FromProof) trait is implemented for dedicated object type //! defined in this module. +mod evonode_status; + +use dpp::block::block_info::BlockInfo; +use dpp::core_types::validator_set::ValidatorSet; use dpp::data_contract::document_type::DocumentType; use dpp::fee::Credits; use dpp::platform_value::Value; @@ -13,6 +17,7 @@ use dpp::version::PlatformVersion; pub use dpp::version::ProtocolVersionVoteCount; use dpp::voting::contender_structs::{Contender, ContenderWithSerializedDocument}; use dpp::voting::vote_choices::resource_vote_choice::ResourceVoteChoice; +use dpp::voting::vote_info_storage::contested_document_vote_poll_winner_info::ContestedDocumentVotePollWinnerInfo; use dpp::voting::vote_polls::contested_document_resource_vote_poll::ContestedDocumentResourceVotePoll; use dpp::voting::vote_polls::VotePoll; use dpp::voting::votes::resource_vote::ResourceVote; @@ -24,14 +29,10 @@ use dpp::{ prelude::{DataContract, Identifier, IdentityPublicKey, Revision}, util::deserializer::ProtocolVersion, }; +use drive::grovedb::query_result_type::Path; use drive::grovedb::Element; use std::collections::{BTreeMap, BTreeSet}; -use dpp::block::block_info::BlockInfo; -use dpp::core_types::validator_set::ValidatorSet; -use dpp::dashcore::QuorumHash; -use dpp::voting::vote_info_storage::contested_document_vote_poll_winner_info::ContestedDocumentVotePollWinnerInfo; -use drive::grovedb::query_result_type::Path; #[cfg(feature = "mocks")] use { bincode::{Decode, Encode}, @@ -40,6 +41,8 @@ use { platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}, }; +pub use evonode_status::*; + /// A data structure that holds a set of objects of a generic type `O`, indexed by a key of type `K`. /// /// This type is typically returned by functions that operate on multiple objects, such as fetching multiple objects diff --git a/packages/rs-drive-proof-verifier/src/types/evonode_status.rs b/packages/rs-drive-proof-verifier/src/types/evonode_status.rs new file mode 100644 index 0000000000..87831de0f6 --- /dev/null +++ b/packages/rs-drive-proof-verifier/src/types/evonode_status.rs @@ -0,0 +1,382 @@ +//! Status details of EvoNode, like version, current height, etc. + +use crate::Error; +use dapi_grpc::platform::v0::{ + get_status_response::{self}, + GetStatusResponse, +}; + +#[cfg(feature = "mocks")] +use { + bincode::{Decode, Encode}, + dpp::{version as platform_version, ProtocolError}, + platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}, +}; + +#[derive(Debug, Clone, Default)] +#[cfg_attr( + feature = "mocks", + derive(Encode, Decode, PlatformSerialize, PlatformDeserialize), + platform_serialize(unversioned) +)] +/// The status of an EvoNode. +pub struct EvoNodeStatus { + /// Information about protocol and software components versions. + pub version: Version, + /// Information about the node. + pub node: Node, + /// Layer 2 blockchain information + pub chain: Chain, + /// Node networking information. + pub network: Network, + /// Information about state synchronization progress. + pub state_sync: StateSync, + /// Information about current time used by the node. + pub time: Time, +} +#[derive(Debug, Clone, Default)] +#[cfg_attr( + feature = "mocks", + derive(Encode, Decode, PlatformSerialize, PlatformDeserialize), + platform_serialize(unversioned) +)] + +/// Information about protocol and software components versions. +pub struct Version { + /// Information about software components versions. + pub software: Option, + /// Information about protocol version. + pub protocol: Option, +} +#[derive(Debug, Clone, Default)] +#[cfg_attr( + feature = "mocks", + derive(Encode, Decode, PlatformSerialize, PlatformDeserialize), + platform_serialize(unversioned) +)] +/// Information about software components versions. +pub struct Software { + /// DAPI version, semver-compatible string. + pub dapi: String, + /// Drive version, semver-compatible string. + pub drive: Option, + /// Tenderdash version, semver-compatible string. + pub tenderdash: Option, +} +#[derive(Debug, Clone, Default)] +#[cfg_attr( + feature = "mocks", + derive(Encode, Decode, PlatformSerialize, PlatformDeserialize), + platform_serialize(unversioned) +)] +/// Information about protocol-level versions used by the node +pub struct Protocol { + /// Tenderdash protocols version. + pub tenderdash: Option, + /// Drive protocols version. + pub drive: Option, +} +#[derive(Debug, Clone, Default)] +#[cfg_attr( + feature = "mocks", + derive(Encode, Decode, PlatformSerialize, PlatformDeserialize), + platform_serialize(unversioned) +)] +/// Tenderdash protocol versions. +pub struct TenderdashProtocol { + /// Tenderdash P2P protocol version. + pub p2p: u32, + /// Tenderdash block protocol version. + pub block: u32, +} + +#[derive(Debug, Clone, Default)] +#[cfg_attr( + feature = "mocks", + derive(Encode, Decode, PlatformSerialize, PlatformDeserialize), + platform_serialize(unversioned) +)] + +/// Drive protocol versions. +pub struct DriveProtocol { + /// Latest version supported by the node. + pub latest: u32, + /// Current version used by the node. + pub current: u32, +} +#[derive(Debug, Clone, Default)] +#[cfg_attr( + feature = "mocks", + derive(Encode, Decode, PlatformSerialize, PlatformDeserialize), + platform_serialize(unversioned) +)] + +/// Information about current time used by the node. +pub struct Time { + /// Local time of the node. Unix timestamp since epoch. + pub local: u64, + /// Time of the last block. Unix timestamp since epoch. + pub block: Option, + /// Genesis time. Unix timestamp since epoch. + pub genesis: Option, + /// Epoch number + pub epoch: Option, +} + +#[derive(Debug, Clone, Default)] +#[cfg_attr( + feature = "mocks", + derive(Encode, Decode, PlatformSerialize, PlatformDeserialize), + platform_serialize(unversioned) +)] + +/// Evo node identification information. +pub struct Node { + /// Node ID + pub id: Vec, + /// ProTxHash of masternode; None for full nodes + pub pro_tx_hash: Option>, +} +#[derive(Debug, Clone, Default)] +#[cfg_attr( + feature = "mocks", + derive(Encode, Decode, PlatformSerialize, PlatformDeserialize), + platform_serialize(unversioned) +)] + +/// Layer 2 blockchain information +pub struct Chain { + /// Whether the node is catching up with the network. + pub catching_up: bool, + /// Block hash of the latest block on the node. + pub latest_block_hash: Vec, + /// Latest app hash of the node, as visible in the latest block. + pub latest_app_hash: Vec, + /// Block hash of the earliest block available on the node. + pub earliest_block_hash: Vec, + /// Earliest app hash of the node, as visible in the earliest block. + pub earliest_app_hash: Vec, + /// Height of the latest block available on the node. + pub latest_block_height: u64, + /// Height of the earliest block available on the node. + pub earliest_block_height: u64, + /// Maximum block height of the peers connected to the node. + pub max_peer_block_height: u64, + /// Current core chain locked height. + pub core_chain_locked_height: Option, +} +#[derive(Debug, Clone, Default)] +#[cfg_attr( + feature = "mocks", + derive(Encode, Decode, PlatformSerialize, PlatformDeserialize), + platform_serialize(unversioned) +)] +/// Node networking information. +pub struct Network { + /// Identifier of chain the node is member of. + pub chain_id: String, + /// Number of peers in the address book. + pub peers_count: u32, + /// Whether the node is listening for incoming connections. + pub listening: bool, +} + +#[derive(Debug, Clone, Default)] +#[cfg_attr( + feature = "mocks", + derive(Encode, Decode, PlatformSerialize, PlatformDeserialize), + platform_serialize(unversioned) +)] +/// Information about state synchronization progress. +pub struct StateSync { + /// Total time spent on state synchronization. + pub total_synced_time: u64, + /// Estimated remaining time to finish state synchronization. + pub remaining_time: u64, + /// Total number of snapshots available. + pub total_snapshots: u32, + /// Average time spent on processing a chunk of snapshot data. + pub chunk_process_avg_time: u64, + /// Height of the latest snapshot. + pub snapshot_height: u64, + /// Number of chunks in the latest snapshot. + pub snapshot_chunks_count: u64, + /// Number of backfilled blocks. + pub backfilled_blocks: u64, + /// Total number of blocks to backfill. + pub backfill_blocks_total: u64, +} + +impl TryFrom for EvoNodeStatus { + type Error = Error; + + fn try_from(response: GetStatusResponse) -> Result { + Ok(Self { + version: Version::try_from(&response)?, + node: Node::try_from(&response)?, + chain: Chain::try_from(&response)?, + network: Network::try_from(&response)?, + state_sync: StateSync::try_from(&response)?, + time: Time::try_from(&response)?, + }) + } +} + +impl TryFrom<&GetStatusResponse> for Version { + type Error = Error; + + fn try_from(response: &GetStatusResponse) -> Result { + match &response.version { + Some(get_status_response::Version::V0(v0)) => { + let software = v0 + .version + .as_ref() + .and_then(|v| v.software.clone()) + .map(|s| Software { + dapi: s.dapi, + drive: s.drive, + tenderdash: s.tenderdash, + }); + + let protocol = v0 + .version + .as_ref() + .and_then(|v| v.protocol.clone()) + .map(|p| Protocol { + tenderdash: p.tenderdash.map(|t| TenderdashProtocol { + p2p: t.p2p, + block: t.block, + }), + drive: p.drive.map(|d| DriveProtocol { + latest: d.latest, + current: d.current, + }), + }); + + Ok(Self { software, protocol }) + } + _ => Err(Error::EmptyVersion), + } + } +} + +impl TryFrom<&GetStatusResponse> for Node { + type Error = Error; + + fn try_from(response: &GetStatusResponse) -> Result { + match &response.version { + Some(get_status_response::Version::V0(v0)) => { + let node = v0 + .node + .as_ref() + .map(|n| Self { + id: n.id.clone(), + pro_tx_hash: n.pro_tx_hash.clone(), + }) + .unwrap_or_default(); + Ok(node) + } + _ => Err(Error::EmptyVersion), + } + } +} + +impl TryFrom<&GetStatusResponse> for Chain { + type Error = Error; + + fn try_from(response: &GetStatusResponse) -> Result { + match &response.version { + Some(get_status_response::Version::V0(v0)) => { + let chain = v0 + .chain + .as_ref() + .map(|c| Self { + catching_up: c.catching_up, + latest_block_hash: c.latest_block_hash.clone(), + latest_app_hash: c.latest_app_hash.clone(), + earliest_block_hash: c.earliest_block_hash.clone(), + earliest_app_hash: c.earliest_app_hash.clone(), + latest_block_height: c.latest_block_height, + earliest_block_height: c.earliest_block_height, + max_peer_block_height: c.max_peer_block_height, + core_chain_locked_height: c.core_chain_locked_height, + }) + .unwrap_or_default(); + Ok(chain) + } + _ => Err(Error::EmptyVersion), + } + } +} + +impl TryFrom<&GetStatusResponse> for Network { + type Error = Error; + + fn try_from(response: &GetStatusResponse) -> Result { + match &response.version { + Some(get_status_response::Version::V0(v0)) => { + let network = v0 + .network + .as_ref() + .map(|n| Self { + chain_id: n.chain_id.clone(), + peers_count: n.peers_count, + listening: n.listening, + }) + .unwrap_or_default(); + Ok(network) + } + _ => Err(Error::EmptyVersion), + } + } +} + +impl TryFrom<&GetStatusResponse> for StateSync { + type Error = Error; + + fn try_from(response: &GetStatusResponse) -> Result { + match &response.version { + Some(get_status_response::Version::V0(v0)) => { + let state_sync = v0 + .state_sync + .as_ref() + .map(|s| Self { + total_synced_time: s.total_synced_time, + remaining_time: s.remaining_time, + total_snapshots: s.total_snapshots, + chunk_process_avg_time: s.chunk_process_avg_time, + snapshot_height: s.snapshot_height, + snapshot_chunks_count: s.snapshot_chunks_count, + backfilled_blocks: s.backfilled_blocks, + backfill_blocks_total: s.backfill_blocks_total, + }) + .unwrap_or_default(); + Ok(state_sync) + } + _ => Err(Error::EmptyVersion), + } + } +} + +impl TryFrom<&GetStatusResponse> for Time { + type Error = Error; + + fn try_from(response: &GetStatusResponse) -> Result { + match &response.version { + Some(get_status_response::Version::V0(v0)) => { + let time = v0 + .time + .as_ref() + .map(|t| Self { + local: t.local, + block: t.block, + genesis: t.genesis, + epoch: t.epoch, + }) + .unwrap_or_default(); + Ok(time) + } + _ => Err(Error::EmptyVersion), + } + } +} diff --git a/packages/rs-drive-proof-verifier/src/unproved.rs b/packages/rs-drive-proof-verifier/src/unproved.rs index c2f30c6452..d9fd37009c 100644 --- a/packages/rs-drive-proof-verifier/src/unproved.rs +++ b/packages/rs-drive-proof-verifier/src/unproved.rs @@ -1,7 +1,8 @@ -use crate::types::CurrentQuorumsInfo; +use crate::types::{CurrentQuorumsInfo, EvoNodeStatus}; use crate::Error; use dapi_grpc::platform::v0::ResponseMetadata; use dapi_grpc::platform::v0::{self as platform}; +use dapi_grpc::tonic::async_trait; use dpp::bls_signatures::PublicKey as BlsPublicKey; use dpp::core_types::validator::v0::ValidatorV0; use dpp::core_types::validator_set::v0::ValidatorSetV0; @@ -273,3 +274,23 @@ impl FromUnproved for CurrentQuorumsInfo Ok((Some(info), metadata)) } } + +#[async_trait] +impl FromUnproved for EvoNodeStatus { + type Request = platform::GetStatusRequest; + type Response = platform::GetStatusResponse; + + fn maybe_from_unproved_with_metadata, O: Into>( + _request: I, + response: O, + _network: Network, + _platform_version: &PlatformVersion, + ) -> Result<(Option, ResponseMetadata), Error> + where + Self: Sized, + { + let status = Self::try_from(response.into())?; + // we use default response metadata, as this request does not return any metadata + Ok((Some(status), Default::default())) + } +} diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 8934df17dc..b2efa71805 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -26,7 +26,7 @@ serde = { version = "1.0.197", default-features = false, features = [ ], optional = true } serde_json = { version = "1.0", features = ["preserve_order"], optional = true } tracing = { version = "0.1.40" } -hex = { version = "0.4.3"} +hex = { version = "0.4.3" } dotenvy = { version = "0.15.7", optional = true } envy = { version = "0.4.2", optional = true } futures = { version = "0.3.30" } diff --git a/packages/rs-sdk/README.md b/packages/rs-sdk/README.md index 4d543c5857..c14b9bbd59 100644 --- a/packages/rs-sdk/README.md +++ b/packages/rs-sdk/README.md @@ -97,9 +97,9 @@ Run the offline test using the following command: cargo test -p dash-platform-sdk ``` -## Implementing Fetch and FetchAny on new objects +## Implementing Fetch and FetchMany on new objects -How to implement `Fetch` and `FetchAny` trait on new object types (`Object`). +How to implement `Fetch` and `FetchMany` trait on new object types (`Object`). It's basically copy-paste and tweaking of existing implementation for another object type. @@ -114,7 +114,7 @@ Definitions: Checklist: 1. [ ] Ensure protobuf messages are defined in `packages/dapi-grpc/protos/platform/v0/platform.proto` and generated - correctly in `packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs`. + correctly in `packages/dapi-grpc/src/platform/client/org.dash.platform.dapi.v0.rs`. 2. [ ] In `packages/dapi-grpc/build.rs`, add `Request` to `VERSIONED_REQUESTS` and response `Response` to `VERSIONED_RESPONSES`. This should add derive of `VersionedGrpcMessage` (and some more) in `org.dash.platform.dapi.v0.rs`. 3. [ ] Link request and response type to dapi-client by adding appropriate invocation of `impl_transport_request_grpc!` macro @@ -123,7 +123,7 @@ in `packages/rs-dapi-client/src/transport/grpc.rs`. used internally. If you intend to implement `FetchMany`, you should define type returned by `fetch_many()` using `RetrievedObjects` - that will store collection of returned objects, indexd by some key. + that will store collection of returned objects, indexed by some key. 5. [ ] Implement `FromProof` trait for the `Object` (or type defined in `types.rs`) in `packages/rs-drive-proof-verifier/src/proof.rs`. 6. [ ] Implement `Query` trait for the `Request` in `packages/rs-sdk/src/platform/query.rs`. 7. [ ] Implement `Fetch` trait for the `Object` (or type defined in `types.rs`), with inner type Request = `Request`, diff --git a/packages/rs-sdk/src/lib.rs b/packages/rs-sdk/src/lib.rs index e09eb4d3bb..d165a211a5 100644 --- a/packages/rs-sdk/src/lib.rs +++ b/packages/rs-sdk/src/lib.rs @@ -32,8 +32,8 @@ //! //! 1. [`Identifier`](crate::platform::Identifier) - fetches an object by its identifier //! 2. [`DocumentQuery`](crate::platform::DocumentQuery) - fetches documents based on search conditions; see -//! [query syntax documentation](https://docs.dash.org/projects/platform/en/stable/docs/reference/query-syntax.html) -//! for more details. +//! [query syntax documentation](https://docs.dash.org/projects/platform/en/stable/docs/reference/query-syntax.html) +//! for more details. //! 3. [`DriveQuery`](crate::platform::DriveDocumentQuery) - can be used to build more complex queries //! //! ## Testability diff --git a/packages/rs-sdk/src/mock.rs b/packages/rs-sdk/src/mock.rs index b3f1b69c63..7ad4dc7ccd 100644 --- a/packages/rs-sdk/src/mock.rs +++ b/packages/rs-sdk/src/mock.rs @@ -32,7 +32,6 @@ pub mod sdk; // Otherwise dapi_grpc_macros::Mockable fails. // TODO: move Mockable to some crate that can be shared between dapi-grpc, rs-dapi-client, and dash-sdk pub use dapi_grpc::mock::Mockable; - // MockResponse is needed even if mocks feature is disabled - it just does nothing. #[cfg(not(feature = "mocks"))] pub use noop::MockResponse; diff --git a/packages/rs-sdk/src/mock/requests.rs b/packages/rs-sdk/src/mock/requests.rs index 879fe88bb4..d29e48d410 100644 --- a/packages/rs-sdk/src/mock/requests.rs +++ b/packages/rs-sdk/src/mock/requests.rs @@ -15,9 +15,10 @@ use dpp::{ voting::votes::{resource_vote::ResourceVote, Vote}, }; use drive_proof_verifier::types::{ - Contenders, ContestedResources, ElementFetchRequestItem, IdentityBalanceAndRevision, - MasternodeProtocolVote, PrefundedSpecializedBalance, ProposerBlockCounts, - RetrievedIntegerValue, TotalCreditsInPlatform, VotePollsGroupedByTimestamp, Voters, + Contenders, ContestedResources, CurrentQuorumsInfo, ElementFetchRequestItem, EvoNodeStatus, + IdentityBalanceAndRevision, MasternodeProtocolVote, PrefundedSpecializedBalance, + ProposerBlockCounts, RetrievedIntegerValue, TotalCreditsInPlatform, + VotePollsGroupedByTimestamp, Voters, }; use std::collections::BTreeMap; @@ -243,3 +244,5 @@ impl_mock_response!(VotePollsGroupedByTimestamp); impl_mock_response!(PrefundedSpecializedBalance); impl_mock_response!(TotalCreditsInPlatform); impl_mock_response!(ElementFetchRequestItem); +impl_mock_response!(EvoNodeStatus); +impl_mock_response!(CurrentQuorumsInfo); diff --git a/packages/rs-sdk/src/mock/sdk.rs b/packages/rs-sdk/src/mock/sdk.rs index 0f37c7dd36..02258c0cd1 100644 --- a/packages/rs-sdk/src/mock/sdk.rs +++ b/packages/rs-sdk/src/mock/sdk.rs @@ -2,7 +2,10 @@ //! //! See [MockDashPlatformSdk] for more details. use crate::{ - platform::{types::identity::IdentityRequest, DocumentQuery, Fetch, FetchMany, Query}, + platform::{ + types::{evonode::EvoNode, identity::IdentityRequest}, + DocumentQuery, Fetch, FetchMany, Query, + }, Error, Sdk, }; use arc_swap::ArcSwapOption; @@ -201,9 +204,10 @@ impl MockDashPlatformSdk { self.load_expectation::(filename) .await? } + "EvoNode" => self.load_expectation::(filename).await?, _ => { return Err(Error::Config(format!( - "unknown request type {} in {}", + "unknown request type {} in {}, missing match arm in load_expectations?", request_type, filename.display() ))) diff --git a/packages/rs-sdk/src/platform.rs b/packages/rs-sdk/src/platform.rs index aab3d2153a..a4c0fb83f4 100644 --- a/packages/rs-sdk/src/platform.rs +++ b/packages/rs-sdk/src/platform.rs @@ -32,5 +32,6 @@ pub use { document_query::DocumentQuery, fetch::Fetch, fetch_many::FetchMany, + fetch_unproved::FetchUnproved, query::{LimitQuery, Query, QueryStartInfo, DEFAULT_EPOCH_QUERY_LIMIT}, }; diff --git a/packages/rs-sdk/src/platform/fetch_unproved.rs b/packages/rs-sdk/src/platform/fetch_unproved.rs index d25fc86b50..9e89ad163a 100644 --- a/packages/rs-sdk/src/platform/fetch_unproved.rs +++ b/packages/rs-sdk/src/platform/fetch_unproved.rs @@ -1,8 +1,12 @@ +use super::{types::evonode::EvoNode, Query}; use crate::error::Error; -use crate::platform::proto; +use crate::mock::MockResponse; use crate::Sdk; -use dapi_grpc::platform::v0::get_current_quorums_info_request::GetCurrentQuorumsInfoRequestV0; -use dapi_grpc::platform::v0::{self as platform_proto}; +use dapi_grpc::platform::v0::{ + self as platform_proto, GetStatusRequest, GetStatusResponse, ResponseMetadata, +}; +use dpp::{dashcore::Network, version::PlatformVersion}; +use drive_proof_verifier::types::EvoNodeStatus; use drive_proof_verifier::unproved::FromUnproved; use rs_dapi_client::{transport::TransportRequest, DapiRequest, RequestSettings}; use std::fmt::Debug; @@ -10,7 +14,7 @@ use std::fmt::Debug; #[async_trait::async_trait] pub trait FetchUnproved where - Self: Sized + Debug, + Self: Sized + Debug + MockResponse, { /// Type of request used to fetch data from Platform. type Request: TransportRequest; @@ -19,20 +23,34 @@ where /// /// ## Parameters /// - `sdk`: An instance of [Sdk]. + /// - `query`: Query used to fetch data from the Platform. /// /// ## Returns /// Returns: /// * `Ok(Some(Self))` when object is found. /// * `Ok(None)` when object is not found. /// * [`Err(Error)`](Error) when an error occurs. - async fn fetch_unproved(sdk: &Sdk) -> Result, Error> { - Self::fetch_unproved_with_settings(sdk, RequestSettings::default()).await + async fn fetch_unproved::Request>>( + sdk: &Sdk, + query: Q, + ) -> Result, Error> + where + Self: FromUnproved< + ::Request, + Request = ::Request, + Response = <::Request as TransportRequest>::Response, + >, + { + let (obj, _mtd) = + Self::fetch_unproved_with_settings(sdk, query, RequestSettings::default()).await?; + Ok(obj) } /// Fetch unproved data from the Platform with custom settings. /// /// ## Parameters /// - `sdk`: An instance of [Sdk]. + /// - `query`: Query used to fetch data from the Platform. /// - `settings`: Request settings for the connection to Platform. /// /// ## Returns @@ -40,36 +58,61 @@ where /// * `Ok(Some(Self))` when object is found. /// * `Ok(None)` when object is not found. /// * [`Err(Error)`](Error) when an error occurs. - async fn fetch_unproved_with_settings( + async fn fetch_unproved_with_settings::Request>>( sdk: &Sdk, + query: Q, settings: RequestSettings, - ) -> Result, Error>; + ) -> Result<(Option, ResponseMetadata), Error> + where + Self: FromUnproved< + ::Request, + Request = ::Request, + Response = <::Request as TransportRequest>::Response, + >, + { + // Default implementation + let request: ::Request = query.query(false)?; + + // Execute the request using the Sdk instance + let response = request.clone().execute(sdk, settings).await?; + + // Parse the response into the appropriate type along with metadata + let (object, mtd): (Option, platform_proto::ResponseMetadata) = + Self::maybe_from_unproved_with_metadata(request, response, sdk.network, sdk.version())?; + + Ok((object, mtd)) + } } -#[async_trait::async_trait] impl FetchUnproved for drive_proof_verifier::types::CurrentQuorumsInfo { type Request = platform_proto::GetCurrentQuorumsInfoRequest; +} - async fn fetch_unproved_with_settings( - sdk: &Sdk, - settings: RequestSettings, - ) -> Result, Error> { - // Create the request from the query - let request = Self::Request { - version: Some(proto::get_current_quorums_info_request::Version::V0( - GetCurrentQuorumsInfoRequestV0 {}, - )), - }; +impl FetchUnproved for EvoNodeStatus { + type Request = EvoNode; +} - // Execute the request using the Sdk instance - let response = request.clone().execute(sdk, settings).await?; +// We need to delegate FromUnproved for the impl FetchUnproved for EvonodeStatus. +#[async_trait::async_trait] +impl FromUnproved for EvoNodeStatus { + type Request = EvoNode; + type Response = GetStatusResponse; - // Parse the response into a CurrentQuorumsInfo object along with metadata - match Self::maybe_from_unproved_with_metadata(request, response, sdk.network, sdk.version()) - { - Ok((Some(info), _metadata)) => Ok(Some(info)), - Ok((None, _metadata)) => Ok(None), - Err(err) => Err(err.into()), - } + fn maybe_from_unproved_with_metadata, O: Into>( + request: I, + response: O, + network: Network, + platform_version: &PlatformVersion, + ) -> Result<(Option, ResponseMetadata), drive_proof_verifier::Error> + where + Self: Sized, + { + // delegate to the FromUnproved + >::maybe_from_unproved_with_metadata( + request.into(), + response, + network, + platform_version, + ) } } diff --git a/packages/rs-sdk/src/platform/query.rs b/packages/rs-sdk/src/platform/query.rs index e55f0e3e6a..287f8b6951 100644 --- a/packages/rs-sdk/src/platform/query.rs +++ b/packages/rs-sdk/src/platform/query.rs @@ -2,6 +2,7 @@ //! //! [Query] trait is used to specify individual objects as well as search criteria for fetching multiple objects from Platform. use super::types::epoch::EpochQuery; +use super::types::evonode::EvoNode; use crate::{error::Error, platform::document_query::DocumentQuery}; use dapi_grpc::mock::Mockable; use dapi_grpc::platform::v0::get_contested_resource_identity_votes_request::GetContestedResourceIdentityVotesRequestV0; @@ -9,6 +10,7 @@ use dapi_grpc::platform::v0::get_contested_resource_voters_for_identity_request: use dapi_grpc::platform::v0::get_contested_resources_request::GetContestedResourcesRequestV0; use dapi_grpc::platform::v0::get_evonodes_proposed_epoch_blocks_by_range_request::GetEvonodesProposedEpochBlocksByRangeRequestV0; use dapi_grpc::platform::v0::get_path_elements_request::GetPathElementsRequestV0; +use dapi_grpc::platform::v0::get_status_request::GetStatusRequestV0; use dapi_grpc::platform::v0::get_total_credits_in_platform_request::GetTotalCreditsInPlatformRequestV0; use dapi_grpc::platform::v0::{ self as proto, get_identity_keys_request, get_identity_keys_request::GetIdentityKeysRequestV0, @@ -20,8 +22,8 @@ use dapi_grpc::platform::v0::{ GetTotalCreditsInPlatformRequest, KeyRequestType, }; use dapi_grpc::platform::v0::{ - GetContestedResourceIdentityVotesRequest, GetPrefundedSpecializedBalanceRequest, - GetVotePollsByEndDateRequest, + get_status_request, GetContestedResourceIdentityVotesRequest, + GetPrefundedSpecializedBalanceRequest, GetStatusRequest, GetVotePollsByEndDateRequest, }; use dashcore_rpc::dashcore::{hashes::Hash, ProTxHash}; use dpp::version::PlatformVersionError; @@ -98,7 +100,7 @@ where { fn query(self, prove: bool) -> Result { if !prove { - unimplemented!("queries without proofs are not supported yet"); + tracing::warn!(request= ?self, "sending query without proof, ensure data is trusted"); } Ok(self) } @@ -645,3 +647,15 @@ impl Query for LimitQuery for EvoNode { + fn query(self, _prove: bool) -> Result { + // ignore proof + + let request: GetStatusRequest = GetStatusRequest { + version: Some(get_status_request::Version::V0(GetStatusRequestV0 {})), + }; + + Ok(request) + } +} diff --git a/packages/rs-sdk/src/platform/types.rs b/packages/rs-sdk/src/platform/types.rs index 97a12c40b5..e4fbab2d47 100644 --- a/packages/rs-sdk/src/platform/types.rs +++ b/packages/rs-sdk/src/platform/types.rs @@ -1,5 +1,6 @@ //! Type-specific implementation for various dpp object types to make queries more convenient and intuitive. pub mod epoch; +pub mod evonode; pub mod identity; pub mod proposed_blocks; mod total_credits_in_platform; diff --git a/packages/rs-sdk/src/platform/types/evonode.rs b/packages/rs-sdk/src/platform/types/evonode.rs new file mode 100644 index 0000000000..01c0630b49 --- /dev/null +++ b/packages/rs-sdk/src/platform/types/evonode.rs @@ -0,0 +1,108 @@ +//! Evo Node represents a network node (server). + +use dapi_grpc::mock::Mockable; +use dapi_grpc::platform::v0::get_status_request::GetStatusRequestV0; +use dapi_grpc::platform::v0::{self as proto, get_status_request, GetStatusRequest}; +use dapi_grpc::tonic::IntoRequest; +pub use drive_proof_verifier::types::EvoNodeStatus; +use futures::future::BoxFuture; +use futures::{FutureExt, TryFutureExt}; +use rs_dapi_client::transport::{ + AppliedRequestSettings, PlatformGrpcClient, TransportClient, TransportRequest, +}; +use rs_dapi_client::{Address, ConnectionPool, RequestSettings}; +#[cfg(feature = "mocks")] +use serde::{Deserialize, Serialize}; +use std::fmt::Debug; + +/// EvoNode allows querying the status of a single node using DAPI. +/// +/// ## Example +/// +/// ```rust,no_run +/// use dash_sdk::{platform::types::evonode::EvoNode,platform::FetchUnproved, Sdk}; +/// use drive_proof_verifier::types::EvoNodeStatus; +/// use futures::executor::block_on; +/// +/// let sdk = Sdk::new_mock(); +/// let uri: http::Uri = "http://127.0.0.1:1".parse().unwrap(); +/// let node = EvoNode::new(uri.into()); +/// let status = block_on(EvoNodeStatus::fetch_unproved(&sdk, node)).unwrap(); +/// ``` + +#[derive(Debug, Clone)] +#[cfg_attr(feature = "mocks", derive(Serialize, Deserialize))] +pub struct EvoNode(Address); + +impl EvoNode { + /// Creates a new `EvoNode` with the given address. + pub fn new(address: Address) -> Self { + Self(address) + } +} + +impl Mockable for EvoNode { + #[cfg(feature = "mocks")] + fn mock_deserialize(data: &[u8]) -> Option { + serde_json::de::from_slice(data).ok() + } + + #[cfg(feature = "mocks")] + fn mock_serialize(&self) -> Option> { + serde_json::ser::to_vec(self).ok() + } +} +impl TransportRequest for EvoNode { + type Client = PlatformGrpcClient; + type Response = proto::GetStatusResponse; + + const SETTINGS_OVERRIDES: rs_dapi_client::RequestSettings = RequestSettings::default(); + + fn method_name(&self) -> &'static str { + "get_status" + } + + fn execute_transport<'c>( + self, + _client: &'c mut Self::Client, + settings: &AppliedRequestSettings, + ) -> BoxFuture<'c, Result::Error>> { + let uri = self.0.uri(); + // As this is single node connection case, we create a new connection pool with space for a single connection + // and we drop it after use. + // + // We also create a new client to use with this request, so that the user does not need to + // reconfigure SDK to use a single node. + let pool = ConnectionPool::new(1); + let mut client = Self::Client::with_uri_and_settings(uri.clone(), settings, &pool); + let mut grpc_request = GetStatusRequest { + version: Some(get_status_request::Version::V0(GetStatusRequestV0 {})), + } + .into_request(); + + // we need to establish connection only with provided node, so we override client + + if !settings.timeout.is_zero() { + grpc_request.set_timeout(settings.timeout); + } + + async move { + let response = client + .get_status(grpc_request) + .map_ok(|response| response.into_inner()) + .await; + + drop(client); + drop(pool); + response + } + .boxed() + } +} + +impl From for GetStatusRequest { + fn from(_node: EvoNode) -> Self { + // we don't need to send any data to the node, and address is handled in impl TrasportRequest + GetStatusRequestV0 {}.into() + } +} diff --git a/packages/rs-sdk/src/sdk.rs b/packages/rs-sdk/src/sdk.rs index fb8bd7fed8..abd02e184c 100644 --- a/packages/rs-sdk/src/sdk.rs +++ b/packages/rs-sdk/src/sdk.rs @@ -507,6 +507,23 @@ impl Sdk { pub fn shutdown(&self) { self.cancel_token.cancel(); } + + /// Return the [DapiClient] address list + pub fn address_list(&self) -> Result { + match &self.inner { + SdkInstance::Dapi { dapi, version: _ } => { + let address_list_arc = dapi.address_list(); + let address_list_lock = address_list_arc + .read() + .map_err(|e| format!("Failed to read address list: {e}"))?; + Ok(address_list_lock.clone()) + } + #[cfg(feature = "mocks")] + SdkInstance::Mock { .. } => { + unimplemented!("mock Sdk does not have address list") + } + } + } } #[async_trait::async_trait] @@ -765,9 +782,6 @@ impl SdkBuilder { if sdk.context_provider.is_none() { #[cfg(feature = "mocks")] if !self.core_ip.is_empty() { - tracing::warn!("ContextProvider not set; mocking with Dash Core. \ - Please provide your own ContextProvider with SdkBuilder::with_context_provider()."); - let mut context_provider = GrpcContextProvider::new(None, &self.core_ip, self.core_port, &self.core_user, &self.core_password, self.data_contract_cache_size, self.quorum_public_keys_cache_size)?; diff --git a/packages/rs-sdk/tests/fetch/evonode.rs b/packages/rs-sdk/tests/fetch/evonode.rs new file mode 100644 index 0000000000..0d35d5be9f --- /dev/null +++ b/packages/rs-sdk/tests/fetch/evonode.rs @@ -0,0 +1,71 @@ +//! Test evo node status and other node-related functionality. + +use super::{common::setup_logs, config::Config}; +use dash_sdk::platform::{types::evonode::EvoNode, FetchUnproved}; +use dpp::dashcore::{hashes::Hash, ProTxHash}; +use drive_proof_verifier::types::EvoNodeStatus; +use http::Uri; +use std::time::Duration; +/// Given some existing evonode URIs, WHEN we connect to them, THEN we get status. +use tokio::time::timeout; + +#[tokio::test(flavor = "multi_thread", worker_threads = 1)] +async fn test_evonode_status() { + setup_logs(); + + let cfg = Config::new(); + let sdk = cfg.setup_api("test_evonode_status").await; + + let addresses = cfg.address_list(); + + for address in addresses { + let node = EvoNode::new(address.clone()); + match timeout( + Duration::from_secs(3), + EvoNodeStatus::fetch_unproved(&sdk, node), + ) + .await + { + Ok(Ok(Some(status))) => { + tracing::debug!(?status, ?address, "evonode status"); + // Add assertions here to verify the status contents + assert!( + status.chain.latest_block_height > 0, + "latest block height must be positive" + ); + assert!( + status.node.pro_tx_hash.unwrap_or_default().len() == ProTxHash::LEN, + "latest block hash must be non-empty" + ); + // Add more specific assertions based on expected status properties + } + Ok(Ok(None)) => { + tracing::warn!(?address, "No status found for evonode"); + panic!("No status found for evonode"); + } + Ok(Err(e)) => { + tracing::error!(?address, error = ?e, "Error fetching evonode status"); + } + Err(_) => { + tracing::error!(?address, "Timeout while fetching evonode status"); + } + } + } +} + +/// Given invalid evonode URI, when we request status, we get error. +#[tokio::test(flavor = "multi_thread", worker_threads = 1)] +async fn test_evonode_status_refused() { + setup_logs(); + + let cfg = Config::new(); + let sdk = cfg.setup_api("test_evonode_status_refused").await; + + let uri: Uri = "http://127.0.0.1:1".parse().unwrap(); + + let node = EvoNode::new(uri.clone().into()); + let result = EvoNodeStatus::fetch_unproved(&sdk, node).await; + tracing::debug!(?result, ?uri, "evonode status"); + + assert!(result.is_err()); +} diff --git a/packages/rs-sdk/tests/fetch/mod.rs b/packages/rs-sdk/tests/fetch/mod.rs index 76e6c84c69..363e35f069 100644 --- a/packages/rs-sdk/tests/fetch/mod.rs +++ b/packages/rs-sdk/tests/fetch/mod.rs @@ -17,6 +17,7 @@ mod contested_resource_voters; mod data_contract; mod document; mod epoch; +mod evonode; mod identity; mod identity_contract_nonce; mod mock_fetch; diff --git a/packages/rs-sdk/tests/vectors/test_evonode_status/.gitkeep b/packages/rs-sdk/tests/vectors/test_evonode_status/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/rs-sdk/tests/vectors/test_evonode_status/msg_EvoNode_244e3005966550cd3cb2837d3bca1c40d35547373d23f3ba329df2b6d993b374.json b/packages/rs-sdk/tests/vectors/test_evonode_status/msg_EvoNode_244e3005966550cd3cb2837d3bca1c40d35547373d23f3ba329df2b6d993b374.json new file mode 100644 index 0000000000000000000000000000000000000000..6eafe3314ea97f2673a8c9d30b73ea1b912ded8f GIT binary patch literal 12549 zcmcJV+iv4V5JdC5pP^^M7A4X)^%MDkAXwxEWD&y&68mYf|DHPCBZ<0BjpYUC6}1}n zbXQkjhBIFmzy9*_`M1B{US1cQWyiOdKYstLuV0=Qo0qre=Wg-#@0Z19@#pL7KmTp+ z@7Lp9|1jQ-%e#K{u<3_keZTnj>4#5W7eD^B*!}JA>^1EaajxOO=LXJFfEVC*QG_DM~`14g1 z@iw}MmnArMF0Y{m252-(c@ttPxQJQuy)FmD@v$3~RSdXAP)2$jWw6v(T9VP$b2(zY zkxVUB6;y_43}EYAJavmo|y*h+3~q4QwT@_GruaNJh;e$Rayo6fYc*?`m15EsenyF6j1b= z2nbcrUxfaX?Js4NY6}^_qODIY5ys4ak*M6k($<8_r&hq_2A4WgQvn5nqQHyUW-9vD z+2zH_>u1}mN{2@ST5@`AMXlGPb`j**Sx`yp#?M~doD(erecwK)#$8?fnHu^u%g3sv=la55t|as zZbq?OTunc_+A38|qgp~3xO`w6J5m>iV1mfwEVEG9jyMJjVJghUb-%S7xm*FVzEERs zP5laBKRYzVuHufVRzdXkn2=O75n!-t zv>y&?75w-WTpn}GFvkVDY;Apb(bH5lX+W~Raj{WN{U5gIz{@JBo`DQDIT@{mpY%w) zem>VoFN(2CI@`IIF4|VZP5yR|m)bU%*3z6~mkpZLqwETIQzx&%UJF;q=ILy@81{-1 zp3EF+YU?v6b?{RqICyD|1Q>DWFte!Phlb}hbnsB+kDkKE1Lvp~;*tk_vQJ}8#*>$EB>+O3KK z7@KyepPP649lJP@D3MIaz;oSI)hmfh*(*d0cryJ8Q-t9(+ao+UPaAcv9GA;`bjeea ze3sqBQ+cUu@{jScgon4YL#_41!(`xz;TeoOkoI83O)u-d_3K^Zg=LjsW7EXI?KmtK zUwB`jMLp5Z&H%#;LA6&VIxlK|wD5Evv6!Gc&PzX4*Zn%Jc7nwDDYTWLWl+4V(p=oc za-`mFKw8L}nJhnXyZ%~3G#@4)l_8U+2g>TLgf7rNv&1C{AN_FfU*(HFe*X49^`u&g literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_evonode_status_refused/.gitkeep b/packages/rs-sdk/tests/vectors/test_evonode_status_refused/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/rs-sdk/tests/vectors/test_evonode_status_refused/msg_EvoNode_6db392ff1869b56ecc7de9ace5864123671ed14d3f0c537aa8e878d24e529de5.json b/packages/rs-sdk/tests/vectors/test_evonode_status_refused/msg_EvoNode_6db392ff1869b56ecc7de9ace5864123671ed14d3f0c537aa8e878d24e529de5.json new file mode 100644 index 0000000000000000000000000000000000000000..c80da24adbea4698e7b9af024c6761ca9cb3c143 GIT binary patch literal 155 zcmXAgOA5m<3`D!mF|-!7rg7^;`<|kd&>u7q++yri$lWWu2r+Loqm}NrI6XckW>Vqm z;_Eq?ofpzrmW8RLnUvl+f7Ll0!d`5kaI|&1Zl!Zdq?g`v7#IMbjwS<-fgy&{aJ0+_ U^3O#KZQ Date: Sat, 28 Sep 2024 10:28:12 +0300 Subject: [PATCH 21/90] build: devcontainer support (#2179) --- .devcontainer/Dockerfile | 59 ++++++++++++++++++++++++++ .devcontainer/devcontainer.json | 74 +++++++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000000..f64e6c0580 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,59 @@ +# Use the official VS Code base image for dev containers +FROM mcr.microsoft.com/devcontainers/base:ubuntu + +# Install dependencies +RUN apt-get update && apt-get install -y \ + build-essential \ + libssl-dev \ + pkg-config \ + clang \ + cmake \ + llvm \ + curl \ + gnupg \ + lsb-release \ + software-properties-common \ + unzip + +# Switch to clang +RUN rm /usr/bin/cc && ln -s /usr/bin/clang /usr/bin/cc + +# Install protoc - protobuf compiler +# The one shipped with Alpine does not work +ARG TARGETARCH +ARG PROTOC_VERSION=25.2 +RUN if [[ "$TARGETARCH" == "arm64" ]] ; then export PROTOC_ARCH=aarch_64; else export PROTOC_ARCH=x86_64; fi; \ + curl -Ls https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-linux-${PROTOC_ARCH}.zip \ + -o /tmp/protoc.zip && \ + unzip -qd /opt/protoc /tmp/protoc.zip && \ + rm /tmp/protoc.zip && \ + ln -s /opt/protoc/bin/protoc /usr/bin/ + +# Install protoc v25.2+ +RUN curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v25.2/protoc-25.2-linux-x86_64.zip \ + && unzip protoc-25.2-linux-x86_64.zip -d /usr/local \ + && rm protoc-25.2-linux-x86_64.zip + +# Switch to vscode user +USER vscode + +ENV CARGO_HOME=/home/vscode/.cargo +ENV PATH=$CARGO_HOME/bin:$PATH + +# TODO: It doesn't sharing PATH between stages, so we need "source $HOME/.cargo/env" everywhere +COPY rust-toolchain.toml . +RUN TOOLCHAIN_VERSION="$(grep channel rust-toolchain.toml | awk '{print $3}' | tr -d '"')" && \ + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- \ + --profile minimal \ + -y \ + --default-toolchain "${TOOLCHAIN_VERSION}" \ + --target wasm32-unknown-unknown + +# Install wasm-bindgen-cli in the same profile as other components, to sacrifice some performance & disk space to gain +# better build caching +RUN if [[ -z "${SCCACHE_MEMCACHED}" ]] ; then unset SCCACHE_MEMCACHED ; fi ; \ + RUSTFLAGS="-C target-feature=-crt-static" \ + # Meanwhile if you want to update wasm-bindgen you also need to update version in: + # - packages/wasm-dpp/Cargo.toml + # - packages/wasm-dpp/scripts/build-wasm.sh + cargo install wasm-bindgen-cli@0.2.86 --locked diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000000..2d0d18ee90 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,74 @@ +{ + "name": "Dash Platform Dev Container", + "build": { + "dockerfile": "Dockerfile", + "context": ".." + }, + "customizations": { + "vscode": { + "settings": {}, + "extensions": [ + "arcanis.vscode-zipfs", + "chrmarti.regex", + "davidanson.vscode-markdownlint", + "arcanis.vscode-zipfs", + "ms-vscode.cmake-tools", + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "vadimcn.vscode-lldb", + "rust-lang.rust-analyzer", + "tamasfe.even-better-toml", + "zhangyue.rust-mod-generator", + "ms-azuretools.vscode-docker" + ] + } + }, + "remoteUser": "vscode", + "mounts": [ + { + "source": "devcontainer-platform-cargo-registry-index-${devcontainerId}", + "target": "/home/vscode/.cargo/registry", + "type": "volume" + }, + { + "source": "devcontainer-platform-cargo-registry-cache-${devcontainerId}", + "target": "/home/vscode/.cargo/registry/cache", + "type": "volume" + }, + { + "source": "devcontainer-platform-cargo-git-db-${devcontainerId}", + "target": "/home/vscode/.cargo/git/db", + "type": "volume" + }, + { + "source": "devcontainer-platform-target-${devcontainerId}", + "target": "${containerWorkspaceFolder}/target", + "type": "volume" + } + ], + "features": { + "ghcr.io/devcontainers/features/common-utils:2": { + "installZsh": "true", + "username": "vscode", + "userUid": "1000", + "userGid": "1000", + "upgradePackages": "true" + }, + "ghcr.io/devcontainers/features/git:1": { + "version": "latest", + "ppa": "false" + }, + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers/features/node:1": { + "version": 20, + "installYarnUsingApt": false, + }, + "ghcr.io/eitsupi/devcontainer-features/jq-likes:2": {}, + "ghcr.io/devcontainers/features/docker-in-docker:2": {}, + "ghcr.io/schlich/devcontainer-features/starship:0": {}, + }, + "postCreateCommand": { + "git-safe": "git config --global --add safe.directory ${containerWorkspaceFolder}", + "cargo-permissions": "sudo chown -R vscode:vscode /home/vscode/.cargo ${containerWorkspaceFolder}/target" + } +} From bc55acd6bbf42918ad23ee37c1d10e6218407f5a Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sun, 29 Sep 2024 10:42:41 +0300 Subject: [PATCH 22/90] feat(dashmate): validate external IP (#2183) --- .../doctor/analyse/analyseConfigFactory.js | 60 +++++++++++++++---- .../tasks/doctor/collectSamplesTaskFactory.js | 6 +- packages/dashmate/src/status/providers.js | 11 +++- packages/dashmate/src/status/scopes/core.js | 2 +- .../dashmate/src/status/scopes/platform.js | 4 +- 5 files changed, 63 insertions(+), 20 deletions(-) diff --git a/packages/dashmate/src/doctor/analyse/analyseConfigFactory.js b/packages/dashmate/src/doctor/analyse/analyseConfigFactory.js index 4bb65d0ffb..32c4355bde 100644 --- a/packages/dashmate/src/doctor/analyse/analyseConfigFactory.js +++ b/packages/dashmate/src/doctor/analyse/analyseConfigFactory.js @@ -160,13 +160,25 @@ and revoke the previous certificate in the ZeroSSL dashboard`, if (coreP2pPort && coreP2pPort !== 'OPEN') { const port = config.get('core.p2p.port'); const externalIp = config.get('externalIp'); - const problem = new Problem( - 'Core P2P port is unavailable for incoming connections.', - chalk`Please ensure that port ${port} on your public IP address ${externalIp} is open + + let solution = chalk`Please ensure that port ${port} on your public IP address ${externalIp} is open +for incoming connections. You may need to configure your firewall to +ensure this port is accessible from the public internet. If you are using +Network Address Translation (NAT), please enable port forwarding for port 80 +and all Dash service ports listed above.`; + if (externalIp) { + solution = chalk`Please ensure your configured IP address ${externalIp} is your public IP. +You can change it using {bold.cyanBright dashmate config set externalIp [IP]}. +Also, ensure that port ${port} on your public IP address is open for incoming connections. You may need to configure your firewall to ensure this port is accessible from the public internet. If you are using Network Address Translation (NAT), please enable port forwarding for port 80 -and all Dash service ports listed above.`, +and all Dash service ports listed above.`; + } + + const problem = new Problem( + 'Core P2P port is unavailable for incoming connections.', + solution, SEVERITY.HIGH, ); @@ -178,13 +190,25 @@ and all Dash service ports listed above.`, if (gatewayHttpPort && gatewayHttpPort !== 'OPEN') { const port = config.get('platform.gateway.listeners.dapiAndDrive.port'); const externalIp = config.get('externalIp'); - const problem = new Problem( - 'Gateway HTTP port is unavailable for incoming connections.', - chalk`Please ensure that port ${port} on your public IP address ${externalIp} is open + + let solution = chalk`Please ensure that port ${port} on your public IP address ${externalIp} is open +for incoming connections. You may need to configure your firewall to +ensure this port is accessible from the public internet. If you are using +Network Address Translation (NAT), please enable port forwarding for port 80 +and all Dash service ports listed above.`; + if (externalIp) { + solution = chalk`Please ensure your configured IP address ${externalIp} is your public IP. +You can change it using {bold.cyanBright dashmate config set externalIp [IP]}. +Also, ensure that port ${port} on your public IP address is open for incoming connections. You may need to configure your firewall to ensure this port is accessible from the public internet. If you are using Network Address Translation (NAT), please enable port forwarding for port 80 -and all Dash service ports listed above.`, +and all Dash service ports listed above.`; + } + + const problem = new Problem( + 'Gateway HTTP port is unavailable for incoming connections.', + solution, SEVERITY.HIGH, ); @@ -196,13 +220,25 @@ and all Dash service ports listed above.`, if (tenderdashP2pPort && tenderdashP2pPort !== 'OPEN') { const port = config.get('platform.drive.tenderdash.p2p.port'); const externalIp = config.get('externalIp'); - const problem = new Problem( - 'Tenderdash P2P port is unavailable for incoming connections.', - chalk`Please ensure that port ${port} on your public IP address ${externalIp} is open + + let solution = chalk`Please ensure that port ${port} on your public IP address ${externalIp} is open for incoming connections. You may need to configure your firewall to ensure this port is accessible from the public internet. If you are using Network Address Translation (NAT), please enable port forwarding for port 80 -and all Dash service ports listed above.`, +and all Dash service ports listed above.`; + if (externalIp) { + solution = chalk`Please ensure your configured IP address ${externalIp} is your public IP. +You can change it using {bold.cyanBright dashmate config set externalIp [IP]}. +Also, ensure that port ${port} on your public IP address is open +for incoming connections. You may need to configure your firewall to +ensure this port is accessible from the public internet. If you are using +Network Address Translation (NAT), please enable port forwarding for port 80 +and all Dash service ports listed above.`; + } + + const problem = new Problem( + 'Tenderdash P2P port is unavailable for incoming connections.', + solution, SEVERITY.HIGH, ); diff --git a/packages/dashmate/src/listr/tasks/doctor/collectSamplesTaskFactory.js b/packages/dashmate/src/listr/tasks/doctor/collectSamplesTaskFactory.js index 8e4ae5794a..c766b316ad 100644 --- a/packages/dashmate/src/listr/tasks/doctor/collectSamplesTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/doctor/collectSamplesTaskFactory.js @@ -166,7 +166,7 @@ export default function collectSamplesTaskFactory( title: 'Core P2P port', task: async () => { const port = config.get('core.p2p.port'); - const response = await providers.mnowatch.checkPortStatus(port); + const response = await providers.mnowatch.checkPortStatus(port, config.get('externalIp')); ctx.samples.setServiceInfo('core', 'p2pPort', response); }, @@ -176,7 +176,7 @@ export default function collectSamplesTaskFactory( enabled: () => config.get('platform.enable'), task: async () => { const port = config.get('platform.gateway.listeners.dapiAndDrive.port'); - const response = await providers.mnowatch.checkPortStatus(port); + const response = await providers.mnowatch.checkPortStatus(port, config.get('externalIp')); ctx.samples.setServiceInfo('gateway', 'httpPort', response); }, @@ -185,7 +185,7 @@ export default function collectSamplesTaskFactory( title: 'Tenderdash P2P port', task: async () => { const port = config.get('platform.drive.tenderdash.p2p.port'); - const response = await providers.mnowatch.checkPortStatus(port); + const response = await providers.mnowatch.checkPortStatus(port, config.get('externalIp')); ctx.samples.setServiceInfo('drive_tenderdash', 'p2pPort', response); }, diff --git a/packages/dashmate/src/status/providers.js b/packages/dashmate/src/status/providers.js index 2eee8a72f5..46c491c920 100644 --- a/packages/dashmate/src/status/providers.js +++ b/packages/dashmate/src/status/providers.js @@ -63,7 +63,14 @@ export default { }, }, mnowatch: { - checkPortStatus: async (port) => { + /** + * Check the status of a port and optionally validate an IP address. + * + * @param {number} port - The port number to check. + * @param {string} [ip] - Optional. The IP address to validate. + * @returns {Promise} A promise that resolves to the port status. + */ + checkPortStatus: async (port, ip = undefined) => { // We use http request instead fetch function to force // using IPv4 otherwise mnwatch could try to connect to IPv6 node address // and fail (Core listens for IPv4 only) @@ -72,7 +79,7 @@ export default { const options = { hostname: 'mnowatch.org', port: 443, - path: `/${port}/`, + path: ip ? `/${port}/?validateIp=${ip}` : `/${port}/`, method: 'GET', family: 4, // Force IPv4 timeout: MAX_REQUEST_TIMEOUT, diff --git a/packages/dashmate/src/status/scopes/core.js b/packages/dashmate/src/status/scopes/core.js index d983bcd67c..c460f305de 100644 --- a/packages/dashmate/src/status/scopes/core.js +++ b/packages/dashmate/src/status/scopes/core.js @@ -116,7 +116,7 @@ export default function getCoreScopeFactory( const providersResult = await Promise.allSettled([ providers.github.release('dashpay/dash'), - providers.mnowatch.checkPortStatus(config.get('core.p2p.port')), + providers.mnowatch.checkPortStatus(config.get('core.p2p.port'), config.get('externalIp')), providers.insight(config.get('network')).status(), ]); diff --git a/packages/dashmate/src/status/scopes/platform.js b/packages/dashmate/src/status/scopes/platform.js index f18b291549..7605104ecb 100644 --- a/packages/dashmate/src/status/scopes/platform.js +++ b/packages/dashmate/src/status/scopes/platform.js @@ -89,8 +89,8 @@ export default function getPlatformScopeFactory( // Collecting platform data fails if Tenderdash is waiting for core to sync if (info.serviceStatus === ServiceStatusEnum.up) { const portStatusResult = await Promise.allSettled([ - providers.mnowatch.checkPortStatus(config.get('platform.gateway.listeners.dapiAndDrive.port')), - providers.mnowatch.checkPortStatus(config.get('platform.drive.tenderdash.p2p.port')), + providers.mnowatch.checkPortStatus(config.get('platform.gateway.listeners.dapiAndDrive.port'), config.get('externalIp')), + providers.mnowatch.checkPortStatus(config.get('platform.drive.tenderdash.p2p.port'), config.get('externalIp')), ]); const [httpPortState, p2pPortState] = portStatusResult.map((result) => (result.status === 'fulfilled' ? result.value : null)); From 54b12acc2816d85666cd8c11c9b88c868d67b94a Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sun, 29 Sep 2024 10:43:35 +0300 Subject: [PATCH 23/90] ci: prebuild dev containers (#2184) --- .devcontainer/devcontainer-build.json | 73 ++++++++++++++++++++ .devcontainer/devcontainer.json | 72 +------------------ .github/workflows/prebuild-devcontainers.yml | 58 ++++++++++++++++ 3 files changed, 132 insertions(+), 71 deletions(-) create mode 100644 .devcontainer/devcontainer-build.json create mode 100644 .github/workflows/prebuild-devcontainers.yml diff --git a/.devcontainer/devcontainer-build.json b/.devcontainer/devcontainer-build.json new file mode 100644 index 0000000000..df88d65934 --- /dev/null +++ b/.devcontainer/devcontainer-build.json @@ -0,0 +1,73 @@ +{ + "name": "Dash Platform Dev Container", + "build": { + "dockerfile": "Dockerfile", + "context": ".." + }, + "customizations": { + "vscode": { + "settings": {}, + "extensions": [ + "arcanis.vscode-zipfs", + "chrmarti.regex", + "davidanson.vscode-markdownlint", + "ms-vscode.cmake-tools", + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "vadimcn.vscode-lldb", + "rust-lang.rust-analyzer", + "tamasfe.even-better-toml", + "zhangyue.rust-mod-generator", + "ms-azuretools.vscode-docker" + ] + } + }, + "remoteUser": "vscode", + "mounts": [ + { + "source": "devcontainer-platform-cargo-registry-index-${devcontainerId}", + "target": "/home/vscode/.cargo/registry", + "type": "volume" + }, + { + "source": "devcontainer-platform-cargo-registry-cache-${devcontainerId}", + "target": "/home/vscode/.cargo/registry/cache", + "type": "volume" + }, + { + "source": "devcontainer-platform-cargo-git-db-${devcontainerId}", + "target": "/home/vscode/.cargo/git/db", + "type": "volume" + }, + { + "source": "devcontainer-platform-target-${devcontainerId}", + "target": "${containerWorkspaceFolder}/target", + "type": "volume" + } + ], + "features": { + "ghcr.io/devcontainers/features/common-utils:2": { + "installZsh": "true", + "username": "vscode", + "userUid": "1000", + "userGid": "1000", + "upgradePackages": "true" + }, + "ghcr.io/devcontainers/features/git:1": { + "version": "latest", + "ppa": "false" + }, + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers/features/node:1": { + "version": 20, + "installYarnUsingApt": false + }, + "ghcr.io/eitsupi/devcontainer-features/jq-likes:2": {}, + "ghcr.io/devcontainers/features/docker-in-docker:2": {}, + "ghcr.io/schlich/devcontainer-features/starship:0": {}, + }, + "postCreateCommand": { + "git-safe": "git config --global --add safe.directory ${containerWorkspaceFolder}", + "cargo-permissions": "sudo chown -R vscode:vscode /home/vscode/.cargo ${containerWorkspaceFolder}/target" + } +} diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 2d0d18ee90..586571ba2b 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,74 +1,4 @@ { "name": "Dash Platform Dev Container", - "build": { - "dockerfile": "Dockerfile", - "context": ".." - }, - "customizations": { - "vscode": { - "settings": {}, - "extensions": [ - "arcanis.vscode-zipfs", - "chrmarti.regex", - "davidanson.vscode-markdownlint", - "arcanis.vscode-zipfs", - "ms-vscode.cmake-tools", - "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode", - "vadimcn.vscode-lldb", - "rust-lang.rust-analyzer", - "tamasfe.even-better-toml", - "zhangyue.rust-mod-generator", - "ms-azuretools.vscode-docker" - ] - } - }, - "remoteUser": "vscode", - "mounts": [ - { - "source": "devcontainer-platform-cargo-registry-index-${devcontainerId}", - "target": "/home/vscode/.cargo/registry", - "type": "volume" - }, - { - "source": "devcontainer-platform-cargo-registry-cache-${devcontainerId}", - "target": "/home/vscode/.cargo/registry/cache", - "type": "volume" - }, - { - "source": "devcontainer-platform-cargo-git-db-${devcontainerId}", - "target": "/home/vscode/.cargo/git/db", - "type": "volume" - }, - { - "source": "devcontainer-platform-target-${devcontainerId}", - "target": "${containerWorkspaceFolder}/target", - "type": "volume" - } - ], - "features": { - "ghcr.io/devcontainers/features/common-utils:2": { - "installZsh": "true", - "username": "vscode", - "userUid": "1000", - "userGid": "1000", - "upgradePackages": "true" - }, - "ghcr.io/devcontainers/features/git:1": { - "version": "latest", - "ppa": "false" - }, - "ghcr.io/devcontainers/features/github-cli:1": {}, - "ghcr.io/devcontainers/features/node:1": { - "version": 20, - "installYarnUsingApt": false, - }, - "ghcr.io/eitsupi/devcontainer-features/jq-likes:2": {}, - "ghcr.io/devcontainers/features/docker-in-docker:2": {}, - "ghcr.io/schlich/devcontainer-features/starship:0": {}, - }, - "postCreateCommand": { - "git-safe": "git config --global --add safe.directory ${containerWorkspaceFolder}", - "cargo-permissions": "sudo chown -R vscode:vscode /home/vscode/.cargo ${containerWorkspaceFolder}/target" - } + "image": "ghcr.io/dashpay/platform/devcontainer:0.1.0" } diff --git a/.github/workflows/prebuild-devcontainers.yml b/.github/workflows/prebuild-devcontainers.yml new file mode 100644 index 0000000000..794fa3d4a5 --- /dev/null +++ b/.github/workflows/prebuild-devcontainers.yml @@ -0,0 +1,58 @@ +name: Prebuild Dev Containers + +on: + push: + paths: + - '.devcontainer/**' + - '.github/workflows/prebuild-devcontainers.yml' + - rust-toolchain.toml + - Dockerfile + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + name: Build and push devcontainer + runs-on: ["self-hosted", "linux", "x64", "ubuntu-platform"] + timeout-minutes: 60 + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Setup Node.JS + uses: actions/setup-node@v4 + with: + node-version: "20" + + - name: Install skopeo + run: | + sudo apt-get update + sudo apt-get install -y skopeo + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Setup Docker buildx + uses: docker/setup-buildx-action@v3 + with: + use: true + + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: dashpay + password: ${{ secrets.GHCR_TOKEN }} + + - name: Build and push Platform devcontainer + uses: devcontainers/ci@v0.3 + with: + imageName: ghcr.io/dashpay/platform/devcontainer + imageTag: 0.1.0 + platform: linux/amd64,linux/arm64 + configFile: .devcontainer/devcontainer-build.json + push: always + cacheFrom: ghcr.io/dashpay/platform/devcontainer From 8b847ea1fd22f82a86a03e7abd4cd0b158b573dc Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sun, 29 Sep 2024 12:02:23 +0300 Subject: [PATCH 24/90] feat(dashmate): collect docker stats in the doctor command (#2180) --- .yarn/cache/fsevents-patch-19706e7e35-10.zip | Bin 23750 -> 0 bytes .../analyseServiceContainersFactory.js | 59 ++++++++++++++++++ .../tasks/doctor/collectSamplesTaskFactory.js | 15 +++-- 3 files changed, 69 insertions(+), 5 deletions(-) delete mode 100644 .yarn/cache/fsevents-patch-19706e7e35-10.zip diff --git a/.yarn/cache/fsevents-patch-19706e7e35-10.zip b/.yarn/cache/fsevents-patch-19706e7e35-10.zip deleted file mode 100644 index aff1ab12ce57f312cc3bc58c78597020f7980e62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23750 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 diff --git a/packages/dashmate/src/doctor/analyse/analyseServiceContainersFactory.js b/packages/dashmate/src/doctor/analyse/analyseServiceContainersFactory.js index 7cf6b6c696..4edd993b62 100644 --- a/packages/dashmate/src/doctor/analyse/analyseServiceContainersFactory.js +++ b/packages/dashmate/src/doctor/analyse/analyseServiceContainersFactory.js @@ -20,9 +20,12 @@ export default function analyseServiceContainersFactory( const servicesNotStarted = []; const servicesFailed = []; const servicesOOMKilled = []; + const servicesHighCpuUsage = []; + const servicesHighMemoryUsage = []; for (const service of services) { const dockerInspect = samples.getServiceInfo(service.name, 'dockerInspect'); + const dockerStats = samples.getServiceInfo(service.name, 'dockerStats'); if (!dockerInspect) { continue; @@ -47,6 +50,34 @@ export default function analyseServiceContainersFactory( service, }); } + + const cpuSystemUsage = dockerStats?.cpuStats?.system_cpu_usage ?? 0; + const cpuServiceUsage = dockerStats?.cpuStats?.cpu_usage?.total_usage ?? 0; + + if (cpuSystemUsage > 0) { + const cpuUsage = cpuServiceUsage / cpuSystemUsage; + + if (cpuUsage > 0.8) { + servicesHighCpuUsage.push({ + service, + cpuUsage, + }); + } + } + + const memoryLimit = dockerStats?.memoryStats?.limit ?? 0; + const memoryServiceUsage = dockerStats?.memoryStats?.usage ?? 0; + + if (memoryLimit > 0) { + const memoryUsage = memoryServiceUsage / memoryLimit; + + if (memoryUsage > 0.8) { + servicesHighMemoryUsage.push({ + service, + memoryUsage, + }); + } + } } const problems = []; @@ -103,6 +134,34 @@ export default function analyseServiceContainersFactory( problems.push(problem); } + if (servicesHighCpuUsage.length > 0) { + for (const highCpuService of servicesHighCpuUsage) { + const description = `Service ${highCpuService.service.title} is consuming ${(highCpuService.cpuUsage * 100).toFixed(2)}% CPU.`; + + const problem = new Problem( + description, + 'Consider upgrading CPU or report in case of misbehaviour.', + SEVERITY.MEDIUM, + ); + + problems.push(problem); + } + } + + if (servicesHighMemoryUsage.length > 0) { + for (const highMemoryService of servicesHighMemoryUsage) { + const description = `Service ${highMemoryService.service.title} is consuming ${(highMemoryService.memoryUsage * 100).toFixed(2)}% RAM.`; + + const problem = new Problem( + description, + 'Consider upgrading RAM or report in case of misbehaviour.', + SEVERITY.MEDIUM, + ); + + problems.push(problem); + } + } + return problems; } diff --git a/packages/dashmate/src/listr/tasks/doctor/collectSamplesTaskFactory.js b/packages/dashmate/src/listr/tasks/doctor/collectSamplesTaskFactory.js index c766b316ad..a3be754509 100644 --- a/packages/dashmate/src/listr/tasks/doctor/collectSamplesTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/doctor/collectSamplesTaskFactory.js @@ -2,6 +2,7 @@ import fs from 'fs'; import { Listr } from 'listr2'; import path from 'path'; import process from 'process'; +import si from 'systeminformation'; import obfuscateConfig from '../../../config/obfuscateConfig.js'; import { DASHMATE_VERSION } from '../../../constants.js'; import Certificate from '../../../ssl/zerossl/Certificate.js'; @@ -312,13 +313,10 @@ export default function collectSamplesTaskFactory( }, }, { - title: 'Logs', - task: async (ctx, task) => { + title: 'Docker containers info', + task: async (ctx) => { const services = await getServiceList(config); - // eslint-disable-next-line no-param-reassign - task.output = `Pulling logs from ${services.map((e) => e.name)}`; - await Promise.all( services.map(async (service) => { const [inspect, logs] = (await Promise.allSettled([ @@ -326,6 +324,12 @@ export default function collectSamplesTaskFactory( dockerCompose.logs(config, [service.name], { tail: 300000 }), ])).map((e) => e.value || e.reason); + const containerId = inspect?.Id; + let dockerStats; + if (containerId) { + dockerStats = await si.dockerContainerStats(containerId); + } + if (logs?.out) { // Hide username & external ip from logs logs.out = logs.out.replaceAll( @@ -354,6 +358,7 @@ export default function collectSamplesTaskFactory( ctx.samples.setServiceInfo(service.name, 'stdOut', logs?.out); ctx.samples.setServiceInfo(service.name, 'stdErr', logs?.err); ctx.samples.setServiceInfo(service.name, 'dockerInspect', inspect); + ctx.samples.setServiceInfo(service.name, 'dockerStats', dockerStats); }), ); }, From c8317da7a60dae74c40d0da9984276f4066e8ffa Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 30 Sep 2024 02:22:30 +0700 Subject: [PATCH 25/90] feat(platform)!: withdrawal limits (#2182) --- Cargo.lock | 21 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- ...edit_withdrawal_transition_amount_error.rs | 15 +- packages/rs-dpp/src/identity/core_script.rs | 16 +- packages/rs-dpp/src/util/units.rs | 30 + .../withdrawal/daily_withdrawal_limit/mod.rs | 18 + .../daily_withdrawal_limit/v0/mod.rs | 54 + packages/rs-dpp/src/withdrawal/mod.rs | 2 + packages/rs-drive-abci/Cargo.toml | 2 +- .../initialization/init_chain/v0/mod.rs | 2 +- .../engine/run_block_proposal/mod.rs | 15 +- .../engine/run_block_proposal/v0/mod.rs | 11 + .../platform_events/protocol_upgrade/mod.rs | 1 + .../mod.rs | 66 + .../v0/mod.rs | 73 + .../v0/mod.rs | 2 +- .../mod.rs | 3 +- .../v0/mod.rs | 51 +- .../mod.rs | 58 + .../v0/mod.rs | 69 + .../v0/mod.rs | 6 +- .../platform_events/withdrawals/mod.rs | 1 + .../v0/mod.rs | 68 +- .../v1/mod.rs | 70 +- .../v0/mod.rs | 9 +- .../identity_credit_withdrawal/mod.rs | 2 +- .../structure/v1/mod.rs | 14 +- .../src/platform_types/platform_state/mod.rs | 1 - .../tests/strategy_tests/execution.rs | 1 + .../tests/strategy_tests/main.rs | 24 +- .../tests/strategy_tests/strategy.rs | 38 +- .../tests/strategy_tests/voting_tests.rs | 6 + .../tests/strategy_tests/withdrawal_tests.rs | 2194 +++++++++++++++-- packages/rs-drive/Cargo.toml | 1 + .../calculate_current_withdrawal_limit/mod.rs | 53 + .../v0/mod.rs | 86 + .../mod.rs | 5 +- .../v0/mod.rs | 1 + .../identity/withdrawals/document/mod.rs | 4 +- .../src/drive/identity/withdrawals/mod.rs | 1 + .../src/drive/identity/withdrawals/paths.rs | 34 +- .../mod.rs | 3 + .../v0/mod.rs | 11 + .../withdrawals/transaction/queue/mod.rs | 1 + .../src/drive/initialization/v0/mod.rs | 2 +- .../v0/transformer.rs | 30 +- .../util/batch/drive_op_batch/withdrawals.rs | 42 +- .../batch_delete_items_in_path_query/mod.rs | 56 + .../v0/mod.rs | 588 +++++ .../batch_insert_if_not_exists/mod.rs | 2 +- .../batch_insert_if_not_exists/v0/mod.rs | 2 +- .../mod.rs | 69 + .../v0/mod.rs | 165 ++ .../mod.rs | 58 + .../v0/mod.rs | 220 ++ .../grove_get_sum_tree_total_value/v0/mod.rs | 2 +- .../mod.rs | 54 + .../v0/mod.rs | 30 + .../rs-drive/src/util/grove_operations/mod.rs | 16 +- .../Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- .../src/version/dpp_versions.rs | 1 + .../src/version/drive_abci_versions.rs | 9 + .../src/version/drive_versions.rs | 6 +- .../rs-platform-version/src/version/limits.rs | 1 + .../src/version/mocks/v2_test.rs | 17 +- .../src/version/mocks/v3_test.rs | 16 +- .../rs-platform-version/src/version/v1.rs | 16 +- .../rs-platform-version/src/version/v2.rs | 16 +- .../rs-platform-version/src/version/v3.rs | 16 +- .../rs-platform-version/src/version/v4.rs | 16 +- packages/rs-sdk/Cargo.toml | 10 +- packages/strategy-tests/src/lib.rs | 18 +- packages/strategy-tests/src/operations.rs | 29 +- packages/strategy-tests/src/transitions.rs | 111 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/src/lib.rs | 5 + 82 files changed, 4460 insertions(+), 324 deletions(-) create mode 100644 packages/rs-dpp/src/withdrawal/daily_withdrawal_limit/mod.rs create mode 100644 packages/rs-dpp/src/withdrawal/daily_withdrawal_limit/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/withdrawals/cleanup_expired_locks_of_withdrawal_amounts/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/withdrawals/cleanup_expired_locks_of_withdrawal_amounts/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/withdrawals/calculate_current_withdrawal_limit/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/withdrawals/calculate_current_withdrawal_limit/v0/mod.rs create mode 100644 packages/rs-drive/src/util/grove_operations/batch_delete_items_in_path_query/mod.rs create mode 100644 packages/rs-drive/src/util/grove_operations/batch_delete_items_in_path_query/v0/mod.rs create mode 100644 packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists_return_existing_element/mod.rs create mode 100644 packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists_return_existing_element/v0/mod.rs create mode 100644 packages/rs-drive/src/util/grove_operations/batch_insert_sum_item_or_add_to_if_already_exists/mod.rs create mode 100644 packages/rs-drive/src/util/grove_operations/batch_insert_sum_item_or_add_to_if_already_exists/v0/mod.rs create mode 100644 packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists_return_existing_element/mod.rs create mode 100644 packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists_return_existing_element/v0/mod.rs diff --git a/Cargo.lock b/Cargo.lock index ad59187b72..2d882e0c93 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -230,9 +230,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.81" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", @@ -1499,6 +1499,7 @@ name = "drive" version = "1.4.0-dev.1" dependencies = [ "arc-swap", + "assert_matches", "base64 0.22.1", "bincode", "bs58 0.5.1", @@ -5102,18 +5103,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", @@ -5188,9 +5189,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.39.3" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes", @@ -5284,9 +5285,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index cdb3ea808e..c425b0738a 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -8,6 +8,6 @@ license = "MIT" [dependencies] platform-version = { path = "../rs-platform-version" } -thiserror = "1.0.58" +thiserror = "1.0.64" serde_json = { version = "1.0" } platform-value = { path = "../rs-platform-value" } diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index 84cf2284a0..fb0fe7d640 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -7,7 +7,7 @@ rust-version.workspace = true license = "MIT" [dependencies] -thiserror = "1.0.58" +thiserror = "1.0.64" platform-version = { path = "../rs-platform-version" } serde_json = { version = "1.0" } withdrawals-contract = { path = "../withdrawals-contract" } diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 8b66395d80..328a6fa2fa 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -7,7 +7,7 @@ rust-version.workspace = true license = "MIT" [dependencies] -thiserror = "1.0.58" +thiserror = "1.0.64" platform-version = { path = "../rs-platform-version" } serde_json = { version = "1.0" } platform-value = { path = "../rs-platform-value" } diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index 2bfb4c0087..04abaeacfa 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -7,7 +7,7 @@ rust-version.workspace = true license = "MIT" [dependencies] -thiserror = "1.0.58" +thiserror = "1.0.64" platform-version = { path = "../rs-platform-version" } serde_json = { version = "1.0" } platform-value = { path = "../rs-platform-value" } diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index 49c81c24db..8eb1807287 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -7,7 +7,7 @@ rust-version.workspace = true license = "MIT" [dependencies] -thiserror = "1.0.58" +thiserror = "1.0.64" platform-version = { path = "../rs-platform-version" } serde_json = { version = "1.0" } platform-value = { path = "../rs-platform-value" } diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index c95a2a458d..79beb87fd8 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -25,7 +25,7 @@ dapi-grpc = { path = "../dapi-grpc" } futures = "0.3.28" http-serde = { version = "1.1.3", optional = true } rand = { version = "0.8.5", features = ["small_rng"] } -thiserror = "1.0.58" +thiserror = "1.0.64" tracing = "0.1.40" tokio = { version = "1.32.0", default-features = false } sha2 = { version = "0.10", optional = true } diff --git a/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_amount_error.rs b/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_amount_error.rs index 666c8ff299..11b91aba7e 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_amount_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_amount_error.rs @@ -10,7 +10,7 @@ use bincode::{Decode, Encode}; #[derive( Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, )] -#[error("Credit withdrawal amount {amount} must be greater or equal to {min_amount}")] +#[error("Credit withdrawal amount {amount} must be greater or equal to {min_amount} and less than {max_amount}")] #[platform_serialize(unversioned)] pub struct InvalidIdentityCreditWithdrawalTransitionAmountError { /* @@ -20,11 +20,16 @@ pub struct InvalidIdentityCreditWithdrawalTransitionAmountError { */ pub amount: u64, pub min_amount: u64, + pub max_amount: u64, } impl InvalidIdentityCreditWithdrawalTransitionAmountError { - pub fn new(amount: u64, min_amount: u64) -> Self { - Self { amount, min_amount } + pub fn new(amount: u64, min_amount: u64, max_amount: u64) -> Self { + Self { + amount, + min_amount, + max_amount, + } } pub fn amount(&self) -> u64 { @@ -34,6 +39,10 @@ impl InvalidIdentityCreditWithdrawalTransitionAmountError { pub fn min_amount(&self) -> u64 { self.min_amount } + + pub fn max_amount(&self) -> u64 { + self.max_amount + } } impl From for ConsensusError { diff --git a/packages/rs-dpp/src/identity/core_script.rs b/packages/rs-dpp/src/identity/core_script.rs index 8aa7fd38a4..ff43e44571 100644 --- a/packages/rs-dpp/src/identity/core_script.rs +++ b/packages/rs-dpp/src/identity/core_script.rs @@ -51,19 +51,23 @@ impl CoreScript { Self::from_bytes(bytes) } - pub fn random_p2pkh(rng: &mut StdRng) -> Self { - Self::new_p2pkh(rng.gen::<[u8; 20]>()) - } - - pub fn random_p2sh(rng: &mut StdRng) -> Self { + pub fn new_p2sh(script_hash: [u8; 20]) -> Self { let mut bytes = vec![ opcodes::all::OP_HASH160.to_u8(), opcodes::all::OP_PUSHBYTES_20.to_u8(), ]; - bytes.append(&mut rng.gen::<[u8; 20]>().to_vec()); + bytes.extend_from_slice(&script_hash); bytes.push(opcodes::all::OP_EQUAL.to_u8()); Self::from_bytes(bytes) } + + pub fn random_p2sh(rng: &mut StdRng) -> Self { + Self::new_p2sh(rng.gen()) + } + + pub fn random_p2pkh(rng: &mut StdRng) -> Self { + Self::new_p2pkh(rng.gen()) + } } impl From> for CoreScript { diff --git a/packages/rs-dpp/src/util/units.rs b/packages/rs-dpp/src/util/units.rs index ca00561cf0..83af5e8976 100644 --- a/packages/rs-dpp/src/util/units.rs +++ b/packages/rs-dpp/src/util/units.rs @@ -27,3 +27,33 @@ macro_rules! dash_to_credits { credits as u64 }}; } + +#[macro_export] +macro_rules! dash_to_duffs { + // The macro takes a string literal representing the Dash amount. + ($dash:expr) => {{ + let dash_str = stringify!($dash); + + // Parsing the input string to separate the whole and fractional parts. + let parts: Vec<&str> = dash_str.split('.').collect(); + let mut credits: u128 = 0; + + // Process the whole number part if it exists. + if let Some(whole) = parts.get(0) { + if let Ok(whole_number) = whole.parse::() { + credits += whole_number * 100_000_000; // Whole Dash amount to credits + } + } + + // Process the fractional part if it exists. + if let Some(fraction) = parts.get(1) { + let fraction_length = fraction.len(); + let fraction_number = fraction.parse::().unwrap_or(0); + // Calculate the multiplier based on the number of digits in the fraction. + let multiplier = 10u128.pow(8 - fraction_length as u32); + credits += fraction_number * multiplier; // Fractional Dash to credits + } + + credits as u64 + }}; +} diff --git a/packages/rs-dpp/src/withdrawal/daily_withdrawal_limit/mod.rs b/packages/rs-dpp/src/withdrawal/daily_withdrawal_limit/mod.rs new file mode 100644 index 0000000000..b1cd0a477d --- /dev/null +++ b/packages/rs-dpp/src/withdrawal/daily_withdrawal_limit/mod.rs @@ -0,0 +1,18 @@ +use crate::fee::Credits; +use crate::withdrawal::daily_withdrawal_limit::v0::daily_withdrawal_limit_v0; +use crate::ProtocolError; +use platform_version::version::PlatformVersion; + +mod v0; + +pub fn daily_withdrawal_limit( + total_credits_in_platform: Credits, + platform_version: &PlatformVersion, +) -> Result { + match platform_version.dpp.methods.daily_withdrawal_limit { + 0 => Ok(daily_withdrawal_limit_v0(total_credits_in_platform)), + v => Err(ProtocolError::UnknownVersionError(format!( + "Unknown daily_withdrawal_limit version {v}" + ))), + } +} diff --git a/packages/rs-dpp/src/withdrawal/daily_withdrawal_limit/v0/mod.rs b/packages/rs-dpp/src/withdrawal/daily_withdrawal_limit/v0/mod.rs new file mode 100644 index 0000000000..c50b89e152 --- /dev/null +++ b/packages/rs-dpp/src/withdrawal/daily_withdrawal_limit/v0/mod.rs @@ -0,0 +1,54 @@ +use crate::fee::Credits; + +/// Calculates the daily withdrawal limit based on the total credits available in the platform. +/// +/// The function enforces the following rules: +/// +/// 1. If the total credits are 1000 Dash in Credits or more: +/// - The withdrawal limit is set to 10% of the total credits. +/// 2. If the total credits are between 100 and 999 Dash in Credits: +/// - The withdrawal limit is capped at 100 credits. +/// 3. If the total credits are less than 100 Dash in Credits: +/// - The withdrawal limit is the total available credits, as no more than the available amount can be withdrawn. +/// +/// # Parameters +/// +/// * `total_credits_in_platform`: The total amount of credits available in the platform. +/// +/// # Returns +/// +/// * `Credits`: The calculated daily withdrawal limit based on the available credits. +/// +pub fn daily_withdrawal_limit_v0(total_credits_in_platform: Credits) -> Credits { + if total_credits_in_platform >= 100_000_000_000_000 { + // 1000 Dash + total_credits_in_platform / 10 + } else if total_credits_in_platform >= 10_000_000_000_000 { + // 100 Dash + 10_000_000_000_000 + } else { + total_credits_in_platform + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::dash_to_credits; + + #[test] + fn test_daily_withdrawal_limit() { + assert_eq!( + daily_withdrawal_limit_v0(dash_to_credits!(2000)), + dash_to_credits!(200) + ); + assert_eq!( + daily_withdrawal_limit_v0(dash_to_credits!(500)), + dash_to_credits!(100) + ); + assert_eq!( + daily_withdrawal_limit_v0(dash_to_credits!(50)), + dash_to_credits!(50) + ); + } +} diff --git a/packages/rs-dpp/src/withdrawal/mod.rs b/packages/rs-dpp/src/withdrawal/mod.rs index 1aaac3052d..6ce0f25811 100644 --- a/packages/rs-dpp/src/withdrawal/mod.rs +++ b/packages/rs-dpp/src/withdrawal/mod.rs @@ -1,3 +1,4 @@ +pub mod daily_withdrawal_limit; #[cfg(feature = "system_contracts")] mod document_try_into_asset_unlock_base_transaction_info; @@ -19,4 +20,5 @@ pub enum Pooling { pub type WithdrawalTransactionIndex = u64; /// Simple type alias for withdrawal transaction with it's index + pub type WithdrawalTransactionIndexAndBytes = (WithdrawalTransactionIndex, Vec); diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 6ca9d43b97..4e57a1c9f1 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -23,7 +23,7 @@ drive = { path = "../rs-drive", default-features = false, features = [ "server", "grovedb_operations_logging", ] } -thiserror = "1.0.58" +thiserror = "1.0.64" rand = "0.8.5" tempfile = "3.3.0" hex = "0.4.3" diff --git a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs index d190c5c055..3d0bc673a1 100644 --- a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs @@ -13,7 +13,7 @@ use crate::platform_types::platform_state::PlatformState; use crate::platform_types::validator_set::ValidatorSetExt; use dpp::version::PlatformVersion; use std::sync::Arc; -use tenderdash_abci::proto::abci::{RequestInitChain, ResponseInitChain, ValidatorSetUpdate}; +use tenderdash_abci::proto::abci::{RequestInitChain, ResponseInitChain}; use tenderdash_abci::proto::google::protobuf::Timestamp; use tenderdash_abci::proto::serializers::timestamp::FromMilis; diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs index a8420b34b0..e2149678b3 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs @@ -91,8 +91,19 @@ Your software version: {}, latest supported protocol version: {}."#, ); }; - // Set current protocol version to the block platform state - block_platform_state.set_current_protocol_version_in_consensus(next_protocol_version); + let old_protocol_version = block_platform_state.current_protocol_version_in_consensus(); + + if old_protocol_version != next_protocol_version { + // Set current protocol version to the block platform state + block_platform_state + .set_current_protocol_version_in_consensus(next_protocol_version); + // This is for events like adding stuff to the root tree, or making structural changes/fixes + self.perform_events_on_first_block_of_protocol_change( + transaction, + old_protocol_version, + next_platform_version, + )?; + } next_platform_version } else { diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs index 63e1437f7f..0b20f41d88 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs @@ -326,6 +326,17 @@ where platform_version, )?; + // Cleans up the expired locks for withdrawal amounts + // This is for example when we make a withdrawal for 30 Dash + // But we can only withdraw 1000 Dash a day + // after the withdrawal we should only be able to withdraw 970 Dash + // But 24 hours later that locked 30 comes back + self.clean_up_expired_locks_of_withdrawal_amounts( + &block_info, + transaction, + platform_version, + )?; + // Create a new block execution context let mut block_execution_context: BlockExecutionContext = diff --git a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/mod.rs index b2e1e826d4..588f34d169 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/mod.rs @@ -1,2 +1,3 @@ mod check_for_desired_protocol_upgrade; +mod perform_events_on_first_block_of_protocol_change; mod upgrade_protocol_version; diff --git a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/mod.rs new file mode 100644 index 0000000000..659a7e94aa --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/mod.rs @@ -0,0 +1,66 @@ +mod v0; + +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use dpp::version::PlatformVersion; +use dpp::version::ProtocolVersion; +use drive::grovedb::Transaction; + +impl Platform { + /// Executes protocol-specific events on the first block after a protocol version change. + /// + /// This function is triggered when there is a protocol version upgrade detected in the network. + /// It checks if the current protocol version has transitioned from an earlier version to version 4, + /// and if so, performs the necessary setup or migration tasks associated with version 4. + /// + /// Currently, the function handles the transition to version 4 by initializing new structures + /// or states required for the new protocol version. + /// + /// # Parameters + /// + /// * `transaction`: A reference to the transaction context in which the changes should be applied. + /// * `previous_protocol_version`: The protocol version prior to the upgrade. + /// * `platform_version`: The current platform version containing the updated protocol version and relevant configuration details. + /// + /// # Returns + /// + /// * `Ok(())`: If all events related to the protocol change were successfully executed. + /// * `Err(Error)`: If there was an issue executing the protocol-specific events. + /// + /// # Versioning + /// + /// This function uses the `platform_version` parameter to determine which version-specific implementation + /// of the protocol change events should be executed: + /// + /// - If the version is `0`, it calls the `perform_events_on_first_block_of_protocol_change_v0` function, + /// which contains the logic for version `0`. + /// - If no version is specified (`None`), the function does nothing and returns `Ok(())`. + /// - If a different version is specified, it returns an error indicating an unknown version mismatch. + /// + pub fn perform_events_on_first_block_of_protocol_change( + &self, + transaction: &Transaction, + previous_protocol_version: ProtocolVersion, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version + .drive_abci + .methods + .protocol_upgrade + .perform_events_on_first_block_of_protocol_change + { + Some(0) => self.perform_events_on_first_block_of_protocol_change_v0( + transaction, + previous_protocol_version, + platform_version, + ), + None => return Ok(()), + Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "perform_events_on_first_block_of_protocol_change".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/v0/mod.rs new file mode 100644 index 0000000000..d732893b80 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/v0/mod.rs @@ -0,0 +1,73 @@ +use crate::error::Error; +use crate::platform_types::platform::Platform; +use dpp::version::PlatformVersion; +use dpp::version::ProtocolVersion; +use drive::drive::identity::withdrawals::paths::{ + get_withdrawal_root_path, WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, +}; +use drive::grovedb::{Element, Transaction}; + +impl Platform { + /// Executes protocol-specific events on the first block after a protocol version change. + /// + /// This function is triggered when there is a protocol version upgrade detected in the network. + /// It checks if the current protocol version has transitioned from an earlier version to version 4, + /// and if so, performs the necessary setup or migration tasks associated with version 4. + /// + /// Currently, the function handles the transition to version 4 by initializing new structures + /// or states required for the new protocol version. + /// + /// # Parameters + /// + /// * `transaction`: A reference to the transaction context in which the changes should be applied. + /// * `previous_protocol_version`: The protocol version prior to the upgrade. + /// * `platform_version`: The current platform version containing the updated protocol version and relevant configuration details. + /// + /// # Returns + /// + /// * `Ok(())`: If all events related to the protocol change were successfully executed. + /// * `Err(Error)`: If there was an issue executing the protocol-specific events. + pub(super) fn perform_events_on_first_block_of_protocol_change_v0( + &self, + transaction: &Transaction, + previous_protocol_version: ProtocolVersion, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + if previous_protocol_version < 4 && platform_version.protocol_version >= 4 { + self.transition_to_version_4(transaction, platform_version); + } + + Ok(()) + } + + /// Initializes an empty sum tree for withdrawal transactions required for protocol version 4. + /// + /// This function is called during the transition to protocol version 4 to set up + /// an empty sum tree at the specified path if it does not already exist. + /// + /// # Parameters + /// + /// * `transaction`: A reference to the transaction context in which the changes should be applied. + /// * `platform_version`: The current platform version containing the updated protocol version and relevant configuration details. + /// + /// # Returns + /// + /// * `Ok(())`: If the transition to version 4 was successful. + /// * `Err(Error)`: If there was an issue creating or updating the necessary data structures. + fn transition_to_version_4( + &self, + transaction: &Transaction, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let path = get_withdrawal_root_path(); + self.drive.grove_insert_if_not_exists( + (&path).into(), + &WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, + Element::empty_sum_tree(), + Some(transaction), + None, + &platform_version.drive, + )?; + Ok(()) + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs index 6d1deb5c82..d84db00848 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs @@ -10,7 +10,7 @@ use dashcore_rpc::Error as CoreRPCError; use dpp::dashcore::bls_sig_utils::BLSSignature; use dpp::dashcore::transaction::special_transaction::TransactionPayload::AssetUnlockPayloadType; use dpp::dashcore::{consensus, Transaction, Txid}; -use std::collections::{BTreeMap, HashMap}; +use std::collections::BTreeMap; use std::fs::{self, File}; use std::io::Write; diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/mod.rs index 0f0ff66a74..fb6717b7b8 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/mod.rs @@ -4,6 +4,7 @@ use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; use dpp::document::Document; +use dpp::fee::Credits; use dpp::version::PlatformVersion; use dpp::withdrawal::{WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes}; @@ -35,7 +36,7 @@ where start_index: WithdrawalTransactionIndex, block_info: &BlockInfo, platform_version: &PlatformVersion, - ) -> Result, Error> { + ) -> Result<(Vec, Credits), Error> { match platform_version .drive_abci .methods diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/v0/mod.rs index 2a1e5f8a74..13da6e72f1 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/v0/mod.rs @@ -3,7 +3,9 @@ use dpp::block::block_info::BlockInfo; use dpp::data_contracts::withdrawals_contract; use dpp::data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::document::document_methods::DocumentMethodsV0; -use dpp::document::{Document, DocumentV0Setters}; +use dpp::document::{Document, DocumentV0Getters, DocumentV0Setters}; +use dpp::fee::Credits; +use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; use dpp::withdrawal::{WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes}; use crate::{ @@ -24,20 +26,35 @@ where start_index: WithdrawalTransactionIndex, block_info: &BlockInfo, platform_version: &PlatformVersion, - ) -> Result, Error> { - documents - .iter_mut() - .enumerate() - .map(|(i, document)| { + ) -> Result<(Vec, Credits), Error> { + documents.iter_mut().enumerate().try_fold( + (Vec::new(), 0u64), // Start with an empty vector for transactions and 0 for total amount. + |(mut transactions, mut total_amount), (i, document)| { + // Calculate the transaction index. let transaction_index = start_index + i as WithdrawalTransactionIndex; + // Convert the document into the withdrawal transaction information. let withdrawal_transaction = document.try_into_asset_unlock_base_transaction_info( transaction_index, platform_version, )?; + // Create a buffer to hold the encoded transaction. let mut transaction_buffer: Vec = vec![]; + // Get the withdrawal amount from the document properties. + let amount: u64 = document + .properties() + .get_integer(withdrawal::properties::AMOUNT)?; + + // Add the amount to the total, checking for overflow. + total_amount = total_amount.checked_add(amount).ok_or_else(|| { + Error::Execution(ExecutionError::Overflow( + "Overflow while calculating total amount", + )) + })?; + + // Consensus encode the withdrawal transaction into the buffer. withdrawal_transaction .consensus_encode(&mut transaction_buffer) .map_err(|_| { @@ -46,24 +63,28 @@ where )) })?; + // Update the document properties. document.set_u64(withdrawal::properties::TRANSACTION_INDEX, transaction_index); - document.set_u8( withdrawal::properties::STATUS, withdrawals_contract::WithdrawalStatus::POOLED as u8, ); - document.set_updated_at(Some(block_info.time_ms)); + // Increment the document revision, handle error if it fails. document.increment_revision().map_err(|_| { - Error::Execution(ExecutionError::CorruptedCodeExecution( - "Could not increment document revision", + Error::Execution(ExecutionError::Overflow( + "Overflow when adding to document revision for withdrawals", )) })?; - Ok((transaction_index, transaction_buffer)) - }) - .collect() + // Add the transaction index and encoded transaction to the result. + transactions.push((transaction_index, transaction_buffer)); + + // Return the updated accumulator. + Ok((transactions, total_amount)) + }, + ) } } @@ -160,7 +181,7 @@ mod tests { let block_info = BlockInfo::default_with_time(50); - let transactions = platform + let (transactions, credits) = platform .build_untied_withdrawal_transactions_from_documents_v0( &mut documents, 50, @@ -190,6 +211,8 @@ mod tests { ), ] ); + + assert_eq!(credits, 2000); } } } diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/cleanup_expired_locks_of_withdrawal_amounts/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/cleanup_expired_locks_of_withdrawal_amounts/mod.rs new file mode 100644 index 0000000000..837ffd1bf9 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/cleanup_expired_locks_of_withdrawal_amounts/mod.rs @@ -0,0 +1,58 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::platform_types::platform::Platform; + +use crate::rpc::core::CoreRPCLike; +use dpp::block::block_info::BlockInfo; + +use dpp::version::PlatformVersion; +use drive::grovedb::Transaction; + +mod v0; + +impl Platform +where + C: CoreRPCLike, +{ + /// Cleans up expired locks of withdrawal amounts based on the protocol version. + /// + /// This function determines the appropriate versioned function to call for cleaning up expired + /// withdrawal locks according to the provided platform version. It deletes expired withdrawal locks + /// that have surpassed their allowed time limit, ensuring that only valid withdrawal entries remain. + /// + /// # Parameters + /// * `block_info`: Information about the current block, including the timestamp used to identify expired locks. + /// * `transaction`: The transaction under which this operation should be performed. + /// * `platform_version`: The version of the platform to ensure compatibility with the appropriate cleanup method. + /// + /// # Returns + /// * `Ok(())`: If the cleanup was performed successfully. + /// * `Err(Error::Execution(ExecutionError::UnknownVersionMismatch))`: If the platform version does not match known versions. + /// + /// # Errors + /// Returns an error if the platform version is unknown or if the cleanup process encounters an issue. + pub fn clean_up_expired_locks_of_withdrawal_amounts( + &self, + block_info: &BlockInfo, + transaction: &Transaction, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version + .drive_abci + .methods + .withdrawals + .cleanup_expired_locks_of_withdrawal_amounts + { + 0 => self.cleanup_expired_locks_of_withdrawal_amounts_v0( + block_info, + transaction, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "cleanup_expired_locks_of_withdrawal_amounts".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/cleanup_expired_locks_of_withdrawal_amounts/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/cleanup_expired_locks_of_withdrawal_amounts/v0/mod.rs new file mode 100644 index 0000000000..74315a1d6c --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/cleanup_expired_locks_of_withdrawal_amounts/v0/mod.rs @@ -0,0 +1,69 @@ +use crate::error::Error; +use crate::platform_types::platform::Platform; + +use crate::rpc::core::CoreRPCLike; +use dpp::block::block_info::BlockInfo; + +use dpp::version::PlatformVersion; +use drive::drive::identity::withdrawals::paths::get_withdrawal_transactions_sum_tree_path_vec; +use drive::grovedb::{PathQuery, QueryItem, Transaction}; +use drive::util::grove_operations::BatchDeleteApplyType; + +impl Platform +where + C: CoreRPCLike, +{ + pub(super) fn cleanup_expired_locks_of_withdrawal_amounts_v0( + &self, + block_info: &BlockInfo, + transaction: &Transaction, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + if platform_version + .drive_abci + .withdrawal_constants + .cleanup_expired_locks_of_withdrawal_amounts_limit + == 0 + { + // No clean up + return Ok(()); + } + let mut batch_operations = vec![]; + + let sum_path = get_withdrawal_transactions_sum_tree_path_vec(); + + let mut path_query = PathQuery::new_single_query_item( + sum_path, + QueryItem::RangeTo(..block_info.time_ms.to_be_bytes().to_vec()), + ); + + path_query.query.limit = Some( + platform_version + .drive_abci + .withdrawal_constants + .cleanup_expired_locks_of_withdrawal_amounts_limit, + ); + + self.drive.batch_delete_items_in_path_query( + &path_query, + true, + // we know that we are not deleting a subtree + BatchDeleteApplyType::StatefulBatchDelete { + is_known_to_be_subtree_with_sum: Some((false, false)), + }, + Some(transaction), + &mut batch_operations, + &platform_version.drive, + )?; + + self.drive.apply_batch_low_level_drive_operations( + None, + Some(transaction), + batch_operations, + &mut vec![], + &platform_version.drive, + )?; + + Ok(()) + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs index c2506d4f7d..7a37525de6 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs @@ -42,7 +42,7 @@ where ) -> Result { let mut drive_operations: Vec = vec![]; - // Get withdrawal_transactions_per_block_limit (normally 16) latest withdrawal transactions from the queue + // Get withdrawal_transactions_per_block_limit (normally 4) latest withdrawal transactions from the queue let untied_withdrawal_transactions = self.drive.dequeue_untied_withdrawal_transactions( platform_version .system_limits @@ -150,8 +150,8 @@ where document.set_updated_at(Some(block_info.time_ms)); document.increment_revision().map_err(|_| { - Error::Execution(ExecutionError::CorruptedCodeExecution( - "Could not increment document revision", + Error::Execution(ExecutionError::Overflow( + "Overflow when adding to document revision for withdrawals", )) })?; diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/mod.rs index 7541211056..0de6cbfcef 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/mod.rs @@ -1,5 +1,6 @@ pub(in crate::execution) mod append_signatures_and_broadcast_withdrawal_transactions; pub(in crate::execution) mod build_untied_withdrawal_transactions_from_documents; +pub(in crate::execution) mod cleanup_expired_locks_of_withdrawal_amounts; pub(in crate::execution) mod dequeue_and_build_unsigned_withdrawal_transactions; pub(in crate::execution) mod fetch_transactions_block_inclusion_status; pub(in crate::execution) mod pool_withdrawals_into_transactions_queue; diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs index 00f1c8a761..2f353c8225 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs @@ -1,13 +1,13 @@ use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; - +use dpp::document::DocumentV0Getters; +use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use dpp::system_data_contracts::withdrawals_contract; use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; -use drive::config::DEFAULT_QUERY_LIMIT; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; @@ -44,9 +44,11 @@ where ); return Ok(()); } - let mut documents = self.drive.fetch_oldest_withdrawal_documents_by_status( + let documents = self.drive.fetch_oldest_withdrawal_documents_by_status( withdrawals_contract::WithdrawalStatus::QUEUED.into(), - DEFAULT_QUERY_LIMIT, + platform_version + .system_limits + .withdrawal_transactions_per_block_limit, transaction, platform_version, )?; @@ -55,16 +57,56 @@ where return Ok(()); } + // Only take documents up to the withdrawal amount + let current_withdrawal_limit = self + .drive + .calculate_current_withdrawal_limit(transaction, platform_version)?; + + // Only process documents up to the current withdrawal limit. + let mut total_withdrawal_amount = 0u64; + + // Iterate over the documents and accumulate their withdrawal amounts. + let mut documents_to_process = vec![]; + for document in documents { + // Get the withdrawal amount from the document properties. + let amount: u64 = document + .properties() + .get_integer(withdrawal::properties::AMOUNT)?; + + // Check if adding this amount would exceed the current withdrawal limit. + let potential_total_withdrawal_amount = + total_withdrawal_amount.checked_add(amount).ok_or_else(|| { + Error::Execution(ExecutionError::Overflow( + "overflow in total withdrawal amount", + )) + })?; + + if potential_total_withdrawal_amount > current_withdrawal_limit { + // If adding this withdrawal would exceed the limit, stop processing further. + break; + } + + total_withdrawal_amount = potential_total_withdrawal_amount; + + // Add this document to the list of documents to be processed. + documents_to_process.push(document); + } + + if documents_to_process.is_empty() { + return Ok(()); + } + let start_transaction_index = self .drive .fetch_next_withdrawal_transaction_index(transaction, platform_version)?; - let withdrawal_transactions = self.build_untied_withdrawal_transactions_from_documents( - &mut documents, - start_transaction_index, - block_info, - platform_version, - )?; + let (withdrawal_transactions, total_amount) = self + .build_untied_withdrawal_transactions_from_documents( + &mut documents_to_process, + start_transaction_index, + block_info, + platform_version, + )?; let withdrawal_transactions_count = withdrawal_transactions.len(); @@ -73,6 +115,7 @@ where self.drive .add_enqueue_untied_withdrawal_transaction_operations( withdrawal_transactions, + total_amount, &mut drive_operations, platform_version, )?; @@ -88,7 +131,7 @@ where tracing::debug!( "Pooled {} withdrawal documents into {} transactions with indices from {} to {}", - documents.len(), + documents_to_process.len(), withdrawal_transactions_count, start_transaction_index, end_transaction_index, @@ -97,7 +140,7 @@ where let withdrawals_contract = self.drive.cache.system_data_contracts.load_withdrawals(); self.drive.add_update_multiple_documents_operations( - &documents, + &documents_to_process, &withdrawals_contract, withdrawals_contract .document_type_for_name(withdrawal::NAME) @@ -142,6 +185,7 @@ mod tests { use dpp::platform_value::platform_value; use dpp::system_data_contracts::load_system_data_contract; use dpp::version::PlatformVersion; + use drive::config::DEFAULT_QUERY_LIMIT; #[test] fn test_pooling() { diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v1/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v1/mod.rs index 34b3174933..cf7c3cec29 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v1/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v1/mod.rs @@ -1,13 +1,13 @@ use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; - +use dpp::document::DocumentV0Getters; +use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use dpp::system_data_contracts::withdrawals_contract; use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; -use drive::config::DEFAULT_QUERY_LIMIT; use crate::{ error::{execution::ExecutionError, Error}, @@ -20,15 +20,19 @@ where C: CoreRPCLike, { /// Pool withdrawal documents into transactions + /// Version 1 changes on Version 0, by not having the Core 2 Quorum limit. + /// We should switch to Version 1 once Core has fixed the issue pub(super) fn pool_withdrawals_into_transactions_queue_v1( &self, block_info: &BlockInfo, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result<(), Error> { - let mut documents = self.drive.fetch_oldest_withdrawal_documents_by_status( + let documents = self.drive.fetch_oldest_withdrawal_documents_by_status( withdrawals_contract::WithdrawalStatus::QUEUED.into(), - DEFAULT_QUERY_LIMIT, + platform_version + .system_limits + .withdrawal_transactions_per_block_limit, transaction, platform_version, )?; @@ -37,16 +41,56 @@ where return Ok(()); } + // Only take documents up to the withdrawal amount + let current_withdrawal_limit = self + .drive + .calculate_current_withdrawal_limit(transaction, platform_version)?; + + // Only process documents up to the current withdrawal limit. + let mut total_withdrawal_amount = 0u64; + + // Iterate over the documents and accumulate their withdrawal amounts. + let mut documents_to_process = vec![]; + for document in documents { + // Get the withdrawal amount from the document properties. + let amount: u64 = document + .properties() + .get_integer(withdrawal::properties::AMOUNT)?; + + // Check if adding this amount would exceed the current withdrawal limit. + let potential_total_withdrawal_amount = + total_withdrawal_amount.checked_add(amount).ok_or_else(|| { + Error::Execution(ExecutionError::Overflow( + "overflow in total withdrawal amount", + )) + })?; + + if potential_total_withdrawal_amount > current_withdrawal_limit { + // If adding this withdrawal would exceed the limit, stop processing further. + break; + } + + total_withdrawal_amount = potential_total_withdrawal_amount; + + // Add this document to the list of documents to be processed. + documents_to_process.push(document); + } + + if documents_to_process.is_empty() { + return Ok(()); + } + let start_transaction_index = self .drive .fetch_next_withdrawal_transaction_index(transaction, platform_version)?; - let withdrawal_transactions = self.build_untied_withdrawal_transactions_from_documents( - &mut documents, - start_transaction_index, - block_info, - platform_version, - )?; + let (withdrawal_transactions, total_amount) = self + .build_untied_withdrawal_transactions_from_documents( + &mut documents_to_process, + start_transaction_index, + block_info, + platform_version, + )?; let withdrawal_transactions_count = withdrawal_transactions.len(); @@ -55,6 +99,7 @@ where self.drive .add_enqueue_untied_withdrawal_transaction_operations( withdrawal_transactions, + total_amount, &mut drive_operations, platform_version, )?; @@ -70,7 +115,7 @@ where tracing::debug!( "Pooled {} withdrawal documents into {} transactions with indices from {} to {}", - documents.len(), + documents_to_process.len(), withdrawal_transactions_count, start_transaction_index, end_transaction_index, @@ -79,7 +124,7 @@ where let withdrawals_contract = self.drive.cache.system_data_contracts.load_withdrawals(); self.drive.add_update_multiple_documents_operations( - &documents, + &documents_to_process, &withdrawals_contract, withdrawals_contract .document_type_for_name(withdrawal::NAME) @@ -124,6 +169,7 @@ mod tests { use dpp::platform_value::platform_value; use dpp::system_data_contracts::load_system_data_contract; use dpp::version::PlatformVersion; + use drive::config::DEFAULT_QUERY_LIMIT; #[test] fn test_pooling() { diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs index 2eba2e228c..81210da62e 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs @@ -22,8 +22,6 @@ use crate::{ rpc::core::CoreRPCLike, }; -const NUMBER_OF_BLOCKS_BEFORE_EXPIRED: u32 = 48; - impl Platform where C: CoreRPCLike, @@ -109,7 +107,12 @@ where ); WithdrawalStatus::COMPLETE - } else if block_height_difference > NUMBER_OF_BLOCKS_BEFORE_EXPIRED { + } else if block_height_difference + > platform_version + .drive_abci + .withdrawal_constants + .core_expiration_blocks + { tracing::debug!( transaction_sign_height, "Withdrawal with transaction index {} is marked as expired", diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs index f74cb36392..a1ed43702c 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs @@ -71,7 +71,7 @@ impl StateTransitionBasicStructureValidationV0 for IdentityCreditWithdrawalTrans // Returns not supported self.validate_basic_structure_v0(platform_version) } - Some(1) => self.validate_basic_structure_v1(), + Some(1) => self.validate_basic_structure_v1(platform_version), Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity credit withdrawal transition: validate_basic_structure" .to_string(), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v1/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v1/mod.rs index daaf9f7e3d..7f018630a8 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v1/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v1/mod.rs @@ -13,23 +13,31 @@ use dpp::state_transition::identity_credit_withdrawal_transition::{ }; use dpp::util::is_fibonacci_number::is_fibonacci_number; use dpp::validation::SimpleConsensusValidationResult; +use dpp::version::PlatformVersion; use dpp::withdrawal::Pooling; pub(in crate::execution::validation::state_transition::state_transitions::identity_credit_withdrawal) trait IdentityCreditWithdrawalStateTransitionStructureValidationV1 { - fn validate_basic_structure_v1(&self) -> Result; + fn validate_basic_structure_v1(&self, platform_version: &PlatformVersion) -> Result; } impl IdentityCreditWithdrawalStateTransitionStructureValidationV1 for IdentityCreditWithdrawalTransition { - fn validate_basic_structure_v1(&self) -> Result { + fn validate_basic_structure_v1( + &self, + platform_version: &PlatformVersion, + ) -> Result { let mut result = SimpleConsensusValidationResult::default(); - if self.amount() < MIN_WITHDRAWAL_AMOUNT { + let amount = self.amount(); + if amount < MIN_WITHDRAWAL_AMOUNT + || amount > platform_version.system_limits.max_withdrawal_amount + { result.add_error(ConsensusError::from( InvalidIdentityCreditWithdrawalTransitionAmountError::new( self.amount(), MIN_WITHDRAWAL_AMOUNT, + platform_version.system_limits.max_withdrawal_amount, ), )); } diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs index 462ce2c327..e937924c94 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs @@ -25,7 +25,6 @@ use indexmap::IndexMap; use crate::config::PlatformConfig; use crate::error::execution::ExecutionError; use crate::platform_types::signature_verification_quorum_set::SignatureVerificationQuorumSet; -use crate::platform_types::validator_set::v0::ValidatorSetV0Getters; use dpp::block::block_info::BlockInfo; use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::util::hash::hash_double; diff --git a/packages/rs-drive-abci/tests/strategy_tests/execution.rs b/packages/rs-drive-abci/tests/strategy_tests/execution.rs index 133b281446..8b6b5767ec 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/execution.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/execution.rs @@ -1209,5 +1209,6 @@ pub(crate) fn continue_chain_for_strategy( validator_set_updates, state_transition_results_per_block, instant_lock_quorums, + signer, } } diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 21d269d6be..98e2b518a2 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -47,6 +47,7 @@ mod tests { use crate::execution::{continue_chain_for_strategy, run_chain_for_strategy}; use crate::query::QueryStrategy; use crate::strategy::{FailureStrategy, MasternodeListChangesStrategy}; + use assert_matches::assert_matches; use dashcore_rpc::dashcore::hashes::Hash; use dashcore_rpc::dashcore::BlockHash; use dashcore_rpc::json::QuorumType; @@ -80,6 +81,7 @@ mod tests { use rand::SeedableRng; use tenderdash_abci::proto::abci::{RequestInfo, ResponseInfo}; + use dpp::dash_to_duffs; use dpp::data_contract::document_type::v0::random_document_type::{ FieldMinMaxBounds, FieldTypeWeights, RandomDocumentTypeParameters, }; @@ -1247,6 +1249,16 @@ mod tests { let outcome = run_chain_for_strategy(&mut platform, 1, strategy, config, 15, &mut None); + for tx_results_per_block in outcome.state_transition_results_per_block.values() { + for (state_transition, result) in tx_results_per_block { + assert_eq!( + result.code, 0, + "state transition got code {} : {:?}", + result.code, state_transition + ); + } + } + outcome .abci_app .platform @@ -2325,6 +2337,7 @@ mod tests { }, start_keys: 5, extra_keys: Default::default(), + start_balance_range: dash_to_duffs!(1)..=dash_to_duffs!(1), }, identity_contract_nonce_gaps: None, @@ -2458,6 +2471,7 @@ mod tests { }, start_keys: 5, extra_keys: Default::default(), + start_balance_range: dash_to_duffs!(1)..=dash_to_duffs!(1), }, identity_contract_nonce_gaps: None, @@ -2581,6 +2595,7 @@ mod tests { let start_identities = create_state_transitions_for_identities( vec![identity1, identity2], + &(dash_to_duffs!(1)..=dash_to_duffs!(1)), &simple_signer, &mut rng, platform_version, @@ -2750,6 +2765,7 @@ mod tests { }, start_keys: 5, extra_keys: Default::default(), + start_balance_range: dash_to_duffs!(1)..=dash_to_duffs!(1), }, identity_contract_nonce_gaps: None, @@ -2915,6 +2931,7 @@ mod tests { }, start_keys: 5, extra_keys: Default::default(), + start_balance_range: dash_to_duffs!(1)..=dash_to_duffs!(1), }, identity_contract_nonce_gaps: None, @@ -2976,7 +2993,7 @@ mod tests { strategy: Strategy { start_contracts: vec![], operations: vec![Operation { - op_type: OperationType::IdentityTopUp, + op_type: OperationType::IdentityTopUp(dash_to_duffs!(1)..=dash_to_duffs!(1)), frequency: Frequency { times_per_block_range: 1..3, chance_per_block: None, @@ -3233,6 +3250,7 @@ mod tests { }, start_keys: 5, extra_keys: Default::default(), + start_balance_range: dash_to_duffs!(1)..=dash_to_duffs!(1), }, identity_contract_nonce_gaps: None, @@ -3419,6 +3437,7 @@ mod tests { }, start_keys: 5, extra_keys: Default::default(), + start_balance_range: dash_to_duffs!(1)..=dash_to_duffs!(1), }, identity_contract_nonce_gaps: None, @@ -3581,6 +3600,7 @@ mod tests { }, start_keys: 5, extra_keys: Default::default(), + start_balance_range: dash_to_duffs!(1)..=dash_to_duffs!(1), }, identity_contract_nonce_gaps: None, @@ -3906,6 +3926,7 @@ mod tests { [(SecurityLevel::CRITICAL, vec![KeyType::ECDSA_SECP256K1])].into(), )] .into(), + start_balance_range: dash_to_duffs!(1)..=dash_to_duffs!(1), }, identity_contract_nonce_gaps: None, @@ -3975,6 +3996,7 @@ mod tests { }, start_keys: 5, extra_keys: Default::default(), + start_balance_range: dash_to_duffs!(1)..=dash_to_duffs!(1), }, ..Default::default() diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index 13f22b16f8..667b846868 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -14,7 +14,8 @@ use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; use strategy_tests::frequency::Frequency; use strategy_tests::operations::FinalizeBlockOperation::IdentityAddKeys; use strategy_tests::operations::{ - DocumentAction, DocumentOp, FinalizeBlockOperation, IdentityUpdateOp, OperationType, + AmountRange, DocumentAction, DocumentOp, FinalizeBlockOperation, IdentityUpdateOp, + OperationType, }; use dpp::document::DocumentV0Getters; @@ -40,9 +41,10 @@ use drive_abci::rpc::core::MockCoreRPCLike; use rand::prelude::{IteratorRandom, SliceRandom, StdRng}; use rand::Rng; use strategy_tests::Strategy; -use strategy_tests::transitions::{create_state_transitions_for_identities, create_state_transitions_for_identities_and_proofs, instant_asset_lock_proof_fixture}; +use strategy_tests::transitions::{create_state_transitions_for_identities, create_state_transitions_for_identities_and_proofs, instant_asset_lock_proof_fixture, instant_asset_lock_proof_fixture_with_dynamic_range}; use std::borrow::Cow; use std::collections::{BTreeMap, HashMap, HashSet}; +use std::ops::RangeInclusive; use std::str::FromStr; use tenderdash_abci::proto::abci::{ExecTxResult, ValidatorSetUpdate}; use dpp::dashcore::hashes::Hash; @@ -1118,7 +1120,7 @@ impl NetworkStrategy { operations.push(document_batch_transition); } } - OperationType::IdentityTopUp if !current_identities.is_empty() => { + OperationType::IdentityTopUp(amount) if !current_identities.is_empty() => { let indices: Vec = (0..current_identities.len()).choose_multiple(rng, count as usize); let random_identities: Vec<&Identity> = indices @@ -1130,6 +1132,7 @@ impl NetworkStrategy { operations.push(self.create_identity_top_up_transition( rng, random_identity, + amount, instant_lock_quorums, &platform.config, platform_version, @@ -1177,7 +1180,7 @@ impl NetworkStrategy { } } } - OperationType::IdentityWithdrawal if !current_identities.is_empty() => { + OperationType::IdentityWithdrawal(amount) if !current_identities.is_empty() => { let indices: Vec = (0..current_identities.len()).choose_multiple(rng, count as usize); for index in indices { @@ -1185,6 +1188,7 @@ impl NetworkStrategy { let state_transition = strategy_tests::transitions::create_identity_withdrawal_transition( random_identity, + amount.clone(), identity_nonce_counter, signer, rng, @@ -1491,6 +1495,7 @@ impl NetworkStrategy { ) -> Vec<(Identity, StateTransition)> { let key_count = self.strategy.identity_inserts.start_keys as KeyID; let extra_keys = &self.strategy.identity_inserts.extra_keys; + let balance_range = &self.strategy.identity_inserts.start_balance_range; let (mut identities, mut keys) = Identity::random_identities_with_private_keys_with_rng::< Vec<_>, @@ -1524,6 +1529,7 @@ impl NetworkStrategy { if self.sign_instant_locks { let identities_with_proofs = create_signed_instant_asset_lock_proofs_for_identities( identities, + balance_range, rng, instant_lock_quorums, platform_config, @@ -1536,7 +1542,13 @@ impl NetworkStrategy { platform_version, ) } else { - create_state_transitions_for_identities(identities, signer, rng, platform_version) + create_state_transitions_for_identities( + identities, + balance_range, + signer, + rng, + platform_version, + ) } } @@ -1545,6 +1557,7 @@ impl NetworkStrategy { &self, rng: &mut StdRng, identity: &Identity, + amount_range: &AmountRange, instant_lock_quorums: &Quorums, platform_config: &PlatformConfig, platform_version: &PlatformVersion, @@ -1554,8 +1567,11 @@ impl NetworkStrategy { .unwrap(); let sk: [u8; 32] = pk.try_into().unwrap(); let secret_key = SecretKey::from_str(hex::encode(sk).as_str()).unwrap(); - let mut asset_lock_proof = - instant_asset_lock_proof_fixture(PrivateKey::new(secret_key, Network::Dash)); + let mut asset_lock_proof = instant_asset_lock_proof_fixture_with_dynamic_range( + PrivateKey::new(secret_key, Network::Dash), + amount_range, + rng, + ); // Sign transaction and update signature in instant lock proof if self.sign_instant_locks { @@ -1636,6 +1652,7 @@ pub struct ChainExecutionOutcome<'a> { /// height to the validator set update at that height pub validator_set_updates: BTreeMap, pub state_transition_results_per_block: BTreeMap>, + pub signer: SimpleSigner, } impl<'a> ChainExecutionOutcome<'a> { @@ -1667,6 +1684,7 @@ pub struct ChainExecutionParameters { fn create_signed_instant_asset_lock_proofs_for_identities( identities: Vec, + balance_range: &RangeInclusive, rng: &mut StdRng, instant_lock_quorums: &Quorums, platform_config: &PlatformConfig, @@ -1691,7 +1709,11 @@ fn create_signed_instant_asset_lock_proofs_for_identities( let secret_key = SecretKey::from_str(hex::encode(pk_fixed).as_str()).unwrap(); let private_key = PrivateKey::new(secret_key, Network::Dash); - let mut asset_lock_proof = instant_asset_lock_proof_fixture(private_key); + let mut asset_lock_proof = instant_asset_lock_proof_fixture_with_dynamic_range( + private_key, + balance_range, + rng, + ); // Sign transaction and update instant lock let AssetLockProof::Instant(InstantAssetLockProof { instant_lock, .. }) = diff --git a/packages/rs-drive-abci/tests/strategy_tests/voting_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/voting_tests.rs index c27e5e16f5..e14f8d7b1b 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/voting_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/voting_tests.rs @@ -24,6 +24,7 @@ mod tests { use dapi_grpc::platform::v0::get_contested_resource_vote_state_response::get_contested_resource_vote_state_response_v0::FinishedVoteInfo; use dapi_grpc::platform::v0::get_contested_resource_vote_state_response::get_contested_resource_vote_state_response_v0::finished_vote_info::FinishedVoteOutcome; use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0Getters; + use dpp::dash_to_duffs; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::state_transition::StateTransition; use dpp::voting::vote_choices::resource_vote_choice::ResourceVoteChoice; @@ -80,6 +81,7 @@ mod tests { let start_identities = create_state_transitions_for_identities( vec![identity1], + &(dash_to_duffs!(1)..=dash_to_duffs!(1)), &simple_signer, &mut rng, platform_version, @@ -363,6 +365,7 @@ mod tests { let start_identities = create_state_transitions_for_identities( vec![identity1, identity2], + &(dash_to_duffs!(1)..=dash_to_duffs!(1)), &simple_signer, &mut rng, platform_version, @@ -634,6 +637,7 @@ mod tests { let start_identities = create_state_transitions_for_identities( vec![identity1, identity2], + &(dash_to_duffs!(1)..=dash_to_duffs!(1)), &simple_signer, &mut rng, platform_version, @@ -986,6 +990,7 @@ mod tests { let start_identities = create_state_transitions_for_identities( vec![identity1, identity2], + &(dash_to_duffs!(1)..=dash_to_duffs!(1)), &simple_signer, &mut rng, platform_version, @@ -1350,6 +1355,7 @@ mod tests { let start_identities = create_state_transitions_for_identities( vec![identity1, identity2], + &(dash_to_duffs!(1)..=dash_to_duffs!(1)), &simple_signer, &mut rng, platform_version, diff --git a/packages/rs-drive-abci/tests/strategy_tests/withdrawal_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/withdrawal_tests.rs index 6113c15474..e0c3398417 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/withdrawal_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/withdrawal_tests.rs @@ -12,7 +12,14 @@ mod tests { use dpp::data_contracts::withdrawals_contract; use dpp::identity::{KeyType, Purpose, SecurityLevel}; use dpp::withdrawal::WithdrawalTransactionIndex; + use dpp::{dash_to_credits, dash_to_duffs}; use drive::config::DEFAULT_QUERY_LIMIT; + use drive::drive::balances::TOTAL_SYSTEM_CREDITS_STORAGE_KEY; + use drive::drive::identity::withdrawals::paths::{ + get_withdrawal_root_path, WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, + }; + use drive::drive::system::misc_path; + use drive::util::grove_operations::DirectQueryType; use drive_abci::config::{ ChainLockConfig, ExecutionConfig, InstantLockConfig, PlatformConfig, PlatformTestConfig, ValidatorSetConfig, @@ -32,29 +39,20 @@ mod tests { } #[test] - fn run_chain_top_up_and_withdraw_from_identities() { + fn run_chain_withdraw_from_identities() { // TEST_PLATFORM_V3 is like v4, but without the single quorum can sign withdrawals restriction let platform_version = PlatformVersion::get(TEST_PLATFORM_V3.protocol_version) .expect("expected to get platform version"); - let strategy = NetworkStrategy { + let start_strategy = NetworkStrategy { strategy: Strategy { start_contracts: vec![], - operations: vec![ - Operation { - op_type: OperationType::IdentityTopUp, - frequency: Frequency { - times_per_block_range: 1..4, - chance_per_block: None, - }, - }, - Operation { - op_type: OperationType::IdentityWithdrawal, - frequency: Frequency { - times_per_block_range: 1..4, - chance_per_block: None, - }, + operations: vec![Operation { + op_type: OperationType::IdentityTopUp(dash_to_duffs!(10)..=dash_to_duffs!(10)), + frequency: Frequency { + times_per_block_range: 1..4, + chance_per_block: None, }, - ], + }], start_identities: StartIdentities::default(), identity_inserts: IdentityInsertInfo { frequency: Frequency { @@ -67,6 +65,7 @@ mod tests { [(SecurityLevel::CRITICAL, vec![KeyType::ECDSA_SECP256K1])].into(), )] .into(), + start_balance_range: dash_to_duffs!(1)..=dash_to_duffs!(1), }, identity_contract_nonce_gaps: None, signer: None, @@ -81,11 +80,11 @@ mod tests { rotate_quorums: false, failure_testing: None, query_testing: None, - // because we can add an identity and withdraw from it in the same block - // the result would be different from what would be expected - verify_state_transition_results: false, + verify_state_transition_results: true, ..Default::default() }; + + let hour_in_ms = 1000 * 60 * 60; let config = PlatformConfig { validator_set: ValidatorSetConfig::default_100_67(), chain_lock: ChainLockConfig::default_100_67(), @@ -95,7 +94,7 @@ mod tests { ..Default::default() }, - block_spacing_ms: 3000, + block_spacing_ms: hour_in_ms, initial_protocol_version: TEST_PLATFORM_V3.protocol_version, testing_configs: PlatformTestConfig::default_minimal_verifications(), ..Default::default() @@ -155,7 +154,135 @@ mod tests { // Run first two blocks: // - Block 1: creates identity - // - Block 2: tops up identity and initiates withdrawals + // - Block 2: tops up identity + let ChainExecutionOutcome { + abci_app, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions, + end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, + instant_lock_quorums, + identities, + signer, + .. + } = { + let outcome = run_chain_for_strategy( + &mut platform, + 2, + start_strategy, + config.clone(), + 1, + &mut None, + ); + + for tx_results_per_block in outcome.state_transition_results_per_block.values() { + for (state_transition, result) in tx_results_per_block { + assert_eq!( + result.code, 0, + "state transition got code {} : {:?}", + result.code, state_transition + ); + } + } + + // Withdrawal transactions are not populated to block execution context yet + assert_eq!(outcome.withdrawals.len(), 0); + + // Withdrawal documents with pooled status should exist. + let withdrawal_documents_pooled = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + assert!(withdrawal_documents_pooled.is_empty()); + + let locked_amount = outcome + .abci_app + .platform + .drive + .grove_get_sum_tree_total_value( + (&get_withdrawal_root_path()).into(), + &WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, + DirectQueryType::StatefulDirectQuery, + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to get locked amount"); + + assert_eq!(locked_amount, 0); + + let pooled_withdrawals = withdrawal_documents_pooled.len(); + + assert_eq!(pooled_withdrawals, 0); + + outcome + }; + + let continue_strategy_only_withdrawal = NetworkStrategy { + strategy: Strategy { + start_contracts: vec![], + operations: vec![Operation { + op_type: OperationType::IdentityWithdrawal( + dash_to_credits!(0.1)..=dash_to_credits!(0.1), + ), + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + }], + start_identities: StartIdentities::default(), + identity_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, + signer: Some(signer.clone()), + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }; + + let continue_strategy_no_operations = NetworkStrategy { + strategy: Strategy { + start_contracts: vec![], + operations: vec![], + start_identities: StartIdentities::default(), + identity_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, + signer: Some(signer), + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }; + + // Run Block 3: initiates a withdrawal let ( ChainExecutionOutcome { abci_app, @@ -167,20 +294,36 @@ mod tests { identity_nonce_counter, identity_contract_nonce_counter, instant_lock_quorums, + identities, .. }, last_block_pooled_withdrawals_amount, ) = { - let outcome = run_chain_for_strategy( - &mut platform, - 2, - strategy.clone(), + let outcome = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start: 3, + core_height_start: 1, + block_count: 1, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, + current_votes: BTreeMap::default(), + start_time_ms: GENESIS_TIME_MS, + current_time_ms: end_time_ms, + instant_lock_quorums, + current_identities: identities, + }, + continue_strategy_only_withdrawal.clone(), config.clone(), - 1, - &mut None, + StrategyRandomness::SeedEntropy(2), ); for tx_results_per_block in outcome.state_transition_results_per_block.values() { + assert_eq!(tx_results_per_block.len(), 1); for (state_transition, result) in tx_results_per_block { assert_eq!( result.code, 0, @@ -206,12 +349,29 @@ mod tests { ) .unwrap(); assert!(!withdrawal_documents_pooled.is_empty()); + + let locked_amount = outcome + .abci_app + .platform + .drive + .grove_get_sum_tree_total_value( + (&get_withdrawal_root_path()).into(), + &WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, + DirectQueryType::StatefulDirectQuery, + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to get locked amount"); + + assert_eq!(locked_amount, dash_to_credits!(0.1) as i64); + let pooled_withdrawals = withdrawal_documents_pooled.len(); (outcome, pooled_withdrawals) }; - // Run block 3 + // Run block 4 // Should broadcast previously pooled withdrawals to core let ChainExecutionOutcome { abci_app, @@ -224,12 +384,13 @@ mod tests { identity_nonce_counter, identity_contract_nonce_counter, instant_lock_quorums, + identities, .. } = { let outcome = continue_chain_for_strategy( abci_app, ChainExecutionParameters { - block_start: 3, + block_start: 4, core_height_start: 1, block_count: 1, proposers, @@ -242,11 +403,11 @@ mod tests { start_time_ms: GENESIS_TIME_MS, current_time_ms: end_time_ms, instant_lock_quorums, - current_identities: Vec::new(), + current_identities: identities, }, - strategy.clone(), + continue_strategy_no_operations.clone(), config.clone(), - StrategyRandomness::SeedEntropy(2), + StrategyRandomness::SeedEntropy(3), ); // Withdrawal documents with pooled status should exist. @@ -272,6 +433,22 @@ mod tests { last_block_pooled_withdrawals_amount ); + let locked_amount = outcome + .abci_app + .platform + .drive + .grove_get_sum_tree_total_value( + (&get_withdrawal_root_path()).into(), + &WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, + DirectQueryType::StatefulDirectQuery, + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to get locked amount"); + + assert_eq!(locked_amount, dash_to_credits!(0.1) as i64); + outcome }; @@ -292,29 +469,26 @@ mod tests { }); } - // Run block 4 - // Should change pooled status to broadcasted - let last_block_broadcasted_withdrawals_amount = last_block_withdrawals.len(); - let ( - ChainExecutionOutcome { - abci_app, - proposers, - validator_quorums: quorums, - current_validator_quorum_hash: current_quorum_hash, - current_proposer_versions, - end_time_ms, - withdrawals: last_block_withdrawals, - identity_nonce_counter, - identity_contract_nonce_counter, - instant_lock_quorums, - .. - }, - last_block_broadcased_withdrawals_amount, - ) = { + // Run block 5 + // Should change do nothing, because core doesn't report any change + let ChainExecutionOutcome { + abci_app, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions, + end_time_ms, + withdrawals: last_block_withdrawals, + identity_nonce_counter, + identity_contract_nonce_counter, + instant_lock_quorums, + identities, + .. + } = { let outcome = continue_chain_for_strategy( abci_app, ChainExecutionParameters { - block_start: 4, + block_start: 5, core_height_start: 1, block_count: 1, proposers, @@ -327,49 +501,45 @@ mod tests { start_time_ms: GENESIS_TIME_MS, current_time_ms: end_time_ms + 1000, instant_lock_quorums, - current_identities: Vec::new(), + current_identities: identities, }, - strategy.clone(), + continue_strategy_no_operations.clone(), config.clone(), - StrategyRandomness::SeedEntropy(3), + StrategyRandomness::SeedEntropy(4), ); - let withdrawal_documents_pooled = outcome + let withdrawal_documents_completed = outcome .abci_app .platform .drive .fetch_oldest_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::POOLED.into(), + withdrawals_contract::WithdrawalStatus::COMPLETE.into(), DEFAULT_QUERY_LIMIT, None, platform_version, ) .unwrap(); - let withdrawal_documents_broadcasted = outcome + // things have not changed + assert!(withdrawal_documents_completed.is_empty()); + + let locked_amount = outcome .abci_app .platform .drive - .fetch_oldest_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), - DEFAULT_QUERY_LIMIT, + .grove_get_sum_tree_total_value( + (&get_withdrawal_root_path()).into(), + &WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, + DirectQueryType::StatefulDirectQuery, None, - platform_version, + &mut vec![], + &platform_version.drive, ) - .unwrap(); - - // In this block we should have new withdrawals pooled - assert!(!withdrawal_documents_pooled.is_empty()); + .expect("expected to get locked amount"); - // And extra withdrawals broadcasted - let withdrawals_broadcasted_expected = - last_block_broadcasted_withdrawals_amount + outcome.withdrawals.len(); - assert_eq!( - withdrawal_documents_broadcasted.len(), - withdrawals_broadcasted_expected - ); + assert_eq!(locked_amount, dash_to_credits!(0.1) as i64); - (outcome, withdrawal_documents_broadcasted.len()) + outcome }; // Update core state for newly broadcasted transactions @@ -408,29 +578,26 @@ mod tests { drop(core_state); } - // Run block 5 + // Run block 6 // Previously broadcasted transactions should be settled after block 5, // and their corresponding statuses should be changed to COMPLETED - let ( - ChainExecutionOutcome { - abci_app, - proposers, - validator_quorums: quorums, - current_validator_quorum_hash: current_quorum_hash, - current_proposer_versions, - end_time_ms, - withdrawals: last_block_withdrawals, - identity_nonce_counter, - identity_contract_nonce_counter, - instant_lock_quorums, - .. - }, - last_block_withdrawals_completed_amount, - ) = { + let ChainExecutionOutcome { + abci_app, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions, + end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, + instant_lock_quorums, + identities, + .. + } = { let outcome = continue_chain_for_strategy( abci_app, ChainExecutionParameters { - block_start: 5, + block_start: 6, core_height_start: 1, block_count: 1, proposers, @@ -443,11 +610,11 @@ mod tests { start_time_ms: GENESIS_TIME_MS, current_time_ms: end_time_ms + 1000, instant_lock_quorums, - current_identities: Vec::new(), + current_identities: identities, }, - strategy.clone(), + continue_strategy_no_operations.clone(), config.clone(), - StrategyRandomness::SeedEntropy(4), + StrategyRandomness::SeedEntropy(5), ); let withdrawal_documents_pooled = outcome @@ -487,62 +654,1592 @@ mod tests { .unwrap(); // In this block we should have new withdrawals pooled - assert!(!withdrawal_documents_pooled.is_empty()); + assert!(withdrawal_documents_pooled.is_empty()); + assert!(withdrawal_documents_broadcasted.is_empty()); - // And some withdrawals completed - let withdrawals_completed_expected = - // Withdrawals issued on {previous_block - 1} considered completed - last_block_broadcased_withdrawals_amount - last_block_withdrawals.len(); - assert_eq!( - withdrawal_documents_completed.len(), - withdrawals_completed_expected - ); + assert_eq!(withdrawal_documents_completed.len(), 1); - // And extra withdrawals broadcasted - let withdrawals_broadcasted_expected = - // Withdrawals issued on previous block + withdrawals from this block are still in broadcasted state - last_block_withdrawals.len() + outcome.withdrawals.len(); + let locked_amount = outcome + .abci_app + .platform + .drive + .grove_get_sum_tree_total_value( + (&get_withdrawal_root_path()).into(), + &WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, + DirectQueryType::StatefulDirectQuery, + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to get locked amount"); - assert_eq!( - withdrawal_documents_broadcasted.len(), - withdrawals_broadcasted_expected - ); + assert_eq!(locked_amount, dash_to_credits!(0.1) as i64); - (outcome, withdrawal_documents_completed.len()) + outcome }; - // Update state of the core before proceeding to the next block - { - // Simulate transactions being added to the core mempool - let mut core_state = shared_core_state.lock().unwrap(); + let outcome = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start: 7, + core_height_start: 1, + block_count: 24, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, + current_votes: BTreeMap::default(), + start_time_ms: GENESIS_TIME_MS, + current_time_ms: end_time_ms + 1000, + instant_lock_quorums, + current_identities: identities, + }, + continue_strategy_no_operations.clone(), + config.clone(), + StrategyRandomness::SeedEntropy(6), + ); - let number_of_blocks_before_expiration: u32 = 48; - chain_locked_height += number_of_blocks_before_expiration; + // We should have unlocked the amounts by now + let locked_amount = outcome + .abci_app + .platform + .drive + .grove_get_sum_tree_total_value( + (&get_withdrawal_root_path()).into(), + &WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, + DirectQueryType::StatefulDirectQuery, + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to get locked amount"); - core_state.chain_lock.block_height = chain_locked_height; + assert_eq!(locked_amount, 0); + } - last_block_withdrawals.iter().for_each(|tx| { + #[test] + fn run_chain_withdrawal_expired() { + // TEST_PLATFORM_V3 is like v4, but without the single quorum can sign withdrawals restriction + let platform_version = PlatformVersion::get(TEST_PLATFORM_V3.protocol_version) + .expect("expected to get platform version"); + let start_strategy = NetworkStrategy { + strategy: Strategy { + start_contracts: vec![], + operations: vec![Operation { + op_type: OperationType::IdentityTopUp(dash_to_duffs!(10)..=dash_to_duffs!(10)), + frequency: Frequency { + times_per_block_range: 1..4, + chance_per_block: None, + }, + }], + start_identities: StartIdentities::default(), + identity_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + start_keys: 3, + extra_keys: [( + Purpose::TRANSFER, + [(SecurityLevel::CRITICAL, vec![KeyType::ECDSA_SECP256K1])].into(), + )] + .into(), + start_balance_range: dash_to_duffs!(1)..=dash_to_duffs!(1), + }, + identity_contract_nonce_gaps: None, + signer: None, + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }; + + let hour_in_ms = 1000 * 60 * 60; + let config = PlatformConfig { + validator_set: ValidatorSetConfig::default_100_67(), + chain_lock: ChainLockConfig::default_100_67(), + instant_lock: InstantLockConfig::default_100_67(), + execution: ExecutionConfig { + verify_sum_trees: true, + + ..Default::default() + }, + block_spacing_ms: hour_in_ms, + initial_protocol_version: TEST_PLATFORM_V3.protocol_version, + testing_configs: PlatformTestConfig::default_minimal_verifications(), + ..Default::default() + }; + + let mut platform = TestPlatformBuilder::new() + .with_config(config.clone()) + .build_with_mock_rpc(); + + platform + .core_rpc + .expect_send_raw_transaction() + .returning(move |_| Ok(Txid::all_zeros())); + + let mut chain_locked_height = 1; + + // Have to go with a complicated shared object for the core state because we need to change + // rpc response along the way but we can't mutate `platform.core_rpc` later + // because platform reference is moved into the AbciApplication. + let shared_core_state = Arc::new(Mutex::new(CoreState { + asset_unlock_statuses: BTreeMap::new(), + chain_lock: ChainLock { + block_height: chain_locked_height, + block_hash: BlockHash::from_byte_array([1; 32]), + signature: BLSSignature::from([2; 96]), + }, + })); + + // Set up Core RPC responses + { + let core_state = shared_core_state.clone(); + + platform + .core_rpc + .expect_get_asset_unlock_statuses() + .returning(move |indices, _| { + Ok(indices + .iter() + .map(|index| { + core_state + .lock() + .unwrap() + .asset_unlock_statuses + .get(index) + .cloned() + .unwrap() + }) + .collect()) + }); + + let core_state = shared_core_state.clone(); + platform + .core_rpc + .expect_get_best_chain_lock() + .returning(move || Ok(core_state.lock().unwrap().chain_lock.clone())); + } + + // Run first two blocks: + // - Block 1: creates identity + // - Block 2: tops up identity + let ChainExecutionOutcome { + abci_app, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions, + end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, + instant_lock_quorums, + identities, + signer, + .. + } = { + let outcome = run_chain_for_strategy( + &mut platform, + 2, + start_strategy, + config.clone(), + 1, + &mut None, + ); + + for tx_results_per_block in outcome.state_transition_results_per_block.values() { + for (state_transition, result) in tx_results_per_block { + assert_eq!( + result.code, 0, + "state transition got code {} : {:?}", + result.code, state_transition + ); + } + } + + // Withdrawal transactions are not populated to block execution context yet + assert_eq!(outcome.withdrawals.len(), 0); + + // Withdrawal documents with pooled status should exist. + let withdrawal_documents_pooled = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + assert!(withdrawal_documents_pooled.is_empty()); + + let locked_amount = outcome + .abci_app + .platform + .drive + .grove_get_sum_tree_total_value( + (&get_withdrawal_root_path()).into(), + &WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, + DirectQueryType::StatefulDirectQuery, + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to get locked amount"); + + assert_eq!(locked_amount, 0); + + let pooled_withdrawals = withdrawal_documents_pooled.len(); + + assert_eq!(pooled_withdrawals, 0); + + outcome + }; + + let continue_strategy_only_withdrawal = NetworkStrategy { + strategy: Strategy { + start_contracts: vec![], + operations: vec![Operation { + op_type: OperationType::IdentityWithdrawal( + dash_to_credits!(0.1)..=dash_to_credits!(0.1), + ), + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + }], + start_identities: StartIdentities::default(), + identity_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, + signer: Some(signer.clone()), + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }; + + let continue_strategy_no_operations = NetworkStrategy { + strategy: Strategy { + start_contracts: vec![], + operations: vec![], + start_identities: StartIdentities::default(), + identity_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, + signer: Some(signer), + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }; + + // Run Block 3: initiates a withdrawal + let ( + ChainExecutionOutcome { + abci_app, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions, + end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, + instant_lock_quorums, + identities, + .. + }, + last_block_pooled_withdrawals_amount, + ) = { + let outcome = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start: 3, + core_height_start: 1, + block_count: 1, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, + current_votes: BTreeMap::default(), + start_time_ms: GENESIS_TIME_MS, + current_time_ms: end_time_ms, + instant_lock_quorums, + current_identities: identities, + }, + continue_strategy_only_withdrawal.clone(), + config.clone(), + StrategyRandomness::SeedEntropy(2), + ); + + for tx_results_per_block in outcome.state_transition_results_per_block.values() { + assert_eq!(tx_results_per_block.len(), 1); + for (state_transition, result) in tx_results_per_block { + assert_eq!( + result.code, 0, + "state transition got code {} : {:?}", + result.code, state_transition + ); + } + } + + // Withdrawal transactions are not populated to block execution context yet + assert_eq!(outcome.withdrawals.len(), 0); + + // Withdrawal documents with pooled status should exist. + let withdrawal_documents_pooled = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + assert!(!withdrawal_documents_pooled.is_empty()); + + let locked_amount = outcome + .abci_app + .platform + .drive + .grove_get_sum_tree_total_value( + (&get_withdrawal_root_path()).into(), + &WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, + DirectQueryType::StatefulDirectQuery, + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to get locked amount"); + + assert_eq!(locked_amount, dash_to_credits!(0.1) as i64); + + let pooled_withdrawals = withdrawal_documents_pooled.len(); + + (outcome, pooled_withdrawals) + }; + + // Run block 4 + // Should broadcast previously pooled withdrawals to core + let ChainExecutionOutcome { + abci_app, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions, + end_time_ms, + withdrawals: last_block_withdrawals, + identity_nonce_counter, + identity_contract_nonce_counter, + instant_lock_quorums, + identities, + .. + } = { + let outcome = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start: 4, + core_height_start: 1, + block_count: 1, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, + current_votes: BTreeMap::default(), + start_time_ms: GENESIS_TIME_MS, + current_time_ms: end_time_ms, + instant_lock_quorums, + current_identities: identities, + }, + continue_strategy_no_operations.clone(), + config.clone(), + StrategyRandomness::SeedEntropy(2), + ); + + // Withdrawal documents with pooled status should exist. + let withdrawal_documents_broadcasted = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // In this block all previously pooled withdrawals should be broadcasted + assert_eq!( + outcome.withdrawals.len(), + last_block_pooled_withdrawals_amount + ); + assert_eq!( + withdrawal_documents_broadcasted.len(), + last_block_pooled_withdrawals_amount + ); + + outcome + }; + + // Update state of the core before proceeding to the next block + { + // Simulate transactions being added to the core mempool + let mut core_state = shared_core_state.lock().unwrap(); + + let number_of_blocks_before_expiration: u32 = 48; + chain_locked_height += number_of_blocks_before_expiration; + + core_state.chain_lock.block_height = chain_locked_height; + + last_block_withdrawals.iter().for_each(|tx| { let index = asset_unlock_index(tx); - core_state.asset_unlock_statuses.insert( - index, - AssetUnlockStatusResult { - index, - status: AssetUnlockStatus::Unknown, - }, - ); - }); + core_state.asset_unlock_statuses.insert( + index, + AssetUnlockStatusResult { + index, + status: AssetUnlockStatus::Unknown, + }, + ); + }); + } + + // Run block 5 + // Tests withdrawal expiration + let ChainExecutionOutcome { .. } = { + let outcome = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start: 5, + core_height_start: 2, + block_count: 1, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, + current_votes: BTreeMap::default(), + start_time_ms: GENESIS_TIME_MS, + current_time_ms: end_time_ms + 1000, + instant_lock_quorums, + current_identities: identities, + }, + continue_strategy_no_operations.clone(), + config.clone(), + StrategyRandomness::SeedEntropy(5), + ); + + let withdrawal_documents_pooled = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + let withdrawal_documents_broadcasted = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + let withdrawal_documents_completed = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::COMPLETE.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + let withdrawal_documents_expired = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::EXPIRED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + assert!(withdrawal_documents_pooled.is_empty()); + assert!(withdrawal_documents_completed.is_empty()); + + assert_eq!(withdrawal_documents_expired.len(), 1); + + assert!(withdrawal_documents_broadcasted.is_empty()); + + outcome + }; + } + + #[test] + fn run_chain_withdraw_from_identities_too_many_withdrawals_within_a_day_hitting_limit() { + // TEST_PLATFORM_V3 is like v4, but without the single quorum can sign withdrawals restriction + let platform_version = PlatformVersion::get(TEST_PLATFORM_V3.protocol_version) + .expect("expected to get platform version"); + let start_strategy = NetworkStrategy { + strategy: Strategy { + start_contracts: vec![], + operations: vec![Operation { + op_type: OperationType::IdentityTopUp(dash_to_duffs!(10)..=dash_to_duffs!(10)), + frequency: Frequency { + times_per_block_range: 10..11, + chance_per_block: None, + }, + }], + start_identities: StartIdentities::default(), + identity_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 10..11, + chance_per_block: None, + }, + start_keys: 3, + extra_keys: [( + Purpose::TRANSFER, + [(SecurityLevel::CRITICAL, vec![KeyType::ECDSA_SECP256K1])].into(), + )] + .into(), + start_balance_range: dash_to_duffs!(200)..=dash_to_duffs!(200), + }, + identity_contract_nonce_gaps: None, + signer: None, + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }; + + let minute_in_ms = 1000 * 60; + let config = PlatformConfig { + validator_set: ValidatorSetConfig::default_100_67(), + chain_lock: ChainLockConfig::default_100_67(), + instant_lock: InstantLockConfig::default_100_67(), + execution: ExecutionConfig { + verify_sum_trees: true, + + ..Default::default() + }, + block_spacing_ms: minute_in_ms, + initial_protocol_version: TEST_PLATFORM_V3.protocol_version, + testing_configs: PlatformTestConfig::default_minimal_verifications(), + ..Default::default() + }; + + let mut platform = TestPlatformBuilder::new() + .with_config(config.clone()) + .build_with_mock_rpc(); + + platform + .core_rpc + .expect_send_raw_transaction() + .returning(move |_| Ok(Txid::all_zeros())); + + let chain_locked_height = 1; + + // Have to go with a complicated shared object for the core state because we need to change + // rpc response along the way but we can't mutate `platform.core_rpc` later + // because platform reference is moved into the AbciApplication. + let shared_core_state = Arc::new(Mutex::new(CoreState { + asset_unlock_statuses: BTreeMap::new(), + chain_lock: ChainLock { + block_height: chain_locked_height, + block_hash: BlockHash::from_byte_array([1; 32]), + signature: BLSSignature::from([2; 96]), + }, + })); + + // Set up Core RPC responses + { + let core_state = shared_core_state.clone(); + + platform + .core_rpc + .expect_get_asset_unlock_statuses() + .returning(move |indices, _| { + Ok(indices + .iter() + .map(|index| { + core_state + .lock() + .unwrap() + .asset_unlock_statuses + .get(index) + .cloned() + .unwrap() + }) + .collect()) + }); + + let core_state = shared_core_state.clone(); + platform + .core_rpc + .expect_get_best_chain_lock() + .returning(move || Ok(core_state.lock().unwrap().chain_lock.clone())); + } + + // Run first two blocks: + // - Block 1: creates identity + // - Block 2: tops up identity + let ChainExecutionOutcome { + abci_app, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions, + end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, + instant_lock_quorums, + identities, + signer, + .. + } = { + let outcome = run_chain_for_strategy( + &mut platform, + 2, + start_strategy, + config.clone(), + 1, + &mut None, + ); + + for tx_results_per_block in outcome.state_transition_results_per_block.values() { + for (state_transition, result) in tx_results_per_block { + assert_eq!( + result.code, 0, + "state transition got code {} : {:?}", + result.code, state_transition + ); + } + } + + // Withdrawal transactions are not populated to block execution context yet + assert_eq!(outcome.withdrawals.len(), 0); + + // Withdrawal documents with pooled status should exist. + let withdrawal_documents_pooled = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + assert!(withdrawal_documents_pooled.is_empty()); + + let locked_amount = outcome + .abci_app + .platform + .drive + .grove_get_sum_tree_total_value( + (&get_withdrawal_root_path()).into(), + &WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, + DirectQueryType::StatefulDirectQuery, + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to get locked amount"); + + assert_eq!(locked_amount, 0); + + let pooled_withdrawals = withdrawal_documents_pooled.len(); + + assert_eq!(pooled_withdrawals, 0); + + let total_credits_balance = outcome + .abci_app + .platform + .drive + .calculate_total_credits_balance(None, &platform_version.drive) + .expect("expected to get total credits balance"); + + assert_eq!( + total_credits_balance.total_identity_balances, + 409997575280380 + ); // Around 4100 Dash. + + assert_eq!( + total_credits_balance.total_in_trees().unwrap(), + 410000000000000 + ); // Around 4100 Dash. + + let total_credits_in_platform = outcome + .abci_app + .platform + .drive + .grove_get_raw_value_u64_from_encoded_var_vec( + (&misc_path()).into(), + TOTAL_SYSTEM_CREDITS_STORAGE_KEY, + DirectQueryType::StatefulDirectQuery, + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to get total credits in platform"); + + assert_eq!(total_credits_in_platform, Some(410000000000000)); + + outcome + }; + + let continue_strategy_only_withdrawal = NetworkStrategy { + strategy: Strategy { + start_contracts: vec![], + operations: vec![Operation { + op_type: OperationType::IdentityWithdrawal( + dash_to_credits!(25)..=dash_to_credits!(25), + ), + frequency: Frequency { + times_per_block_range: 4..5, // 25 Dash x 4 Withdrawals = 100 Dash + chance_per_block: None, + }, + }], + start_identities: StartIdentities::default(), + identity_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, + signer: Some(signer.clone()), + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }; + + let continue_strategy_no_operations = NetworkStrategy { + strategy: Strategy { + start_contracts: vec![], + operations: vec![], + start_identities: StartIdentities::default(), + identity_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, + signer: Some(signer), + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }; + + // Run Block 3 onwards: initiates withdrawals + let ChainExecutionOutcome { + abci_app, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions, + end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, + instant_lock_quorums, + identities, + .. + } = { + let outcome = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start: 3, + core_height_start: 1, + block_count: 20, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, + current_votes: BTreeMap::default(), + start_time_ms: GENESIS_TIME_MS, + current_time_ms: end_time_ms, + instant_lock_quorums, + current_identities: identities, + }, + continue_strategy_only_withdrawal.clone(), + config.clone(), + StrategyRandomness::SeedEntropy(2), + ); + + for tx_results_per_block in outcome.state_transition_results_per_block.values() { + assert_eq!(tx_results_per_block.len(), 4); + for (state_transition, result) in tx_results_per_block { + assert_eq!( + result.code, 0, + "state transition got code {} : {:?}", + result.code, state_transition + ); + } + } + + // Withdrawal documents with pooled status should not exist. + let withdrawal_documents_pooled = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // None are currently pooled since we have no more room + assert!(withdrawal_documents_pooled.is_empty()); + + // Withdrawal documents with queued status should exist. + let withdrawal_documents_queued = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::QUEUED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // We have 66 out of 100 queued + assert_eq!(withdrawal_documents_queued.len(), 66); + + // Withdrawal documents with queued status should exist. + let withdrawal_documents_completed = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::COMPLETE.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // None have completed because core didn't acknowledge them + assert_eq!(withdrawal_documents_completed.len(), 0); + + // Withdrawal documents with EXPIRED status should not exist yet. + let withdrawal_documents_expired = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::EXPIRED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // We have none expired yet + assert_eq!(withdrawal_documents_expired.len(), 0); + + // Withdrawal documents with broadcasted status should exist. + let withdrawal_documents_broadcasted = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // We have 14 broadcasted (66 queued + 14 broadcasted = 80 total) + // 14 broadcasted = 14 * 25 Dash = 350 Dash + // This is explained by + // withdrawal block 1 : 4 withdrawals taking us to 4000 Dash and 100 Dash Taken + // limit is 100, 4 broadcasted + // withdrawal block 2 : 4 withdrawals taking us to 3900 Dash and 100 Dash Taken + // limit is 390 - 100 = 290, 4 broadcasted + // withdrawal block 3 : 4 withdrawals taking us to 3800 Dash and 100 Dash Taken + // limit is 380 - 200 = 180, 4 broadcasted + // withdrawal block 4 : 4 withdrawals taking us to 3700 Dash and 100 Dash Taken + // limit is 370 - 300 = 70, 2 broadcasted + assert_eq!(withdrawal_documents_broadcasted.len(), 14); + + let locked_amount = outcome + .abci_app + .platform + .drive + .grove_get_sum_tree_total_value( + (&get_withdrawal_root_path()).into(), + &WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, + DirectQueryType::StatefulDirectQuery, + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to get locked amount"); + + assert_eq!(locked_amount, dash_to_credits!(350) as i64); + + outcome + }; + + let hour_in_ms = 1000 * 60 * 60; + + let ChainExecutionOutcome { + abci_app, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions, + end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, + instant_lock_quorums, + identities, + .. + } = { + let outcome = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start: 23, + core_height_start: 1, + block_count: 48, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, + current_votes: BTreeMap::default(), + start_time_ms: GENESIS_TIME_MS, + current_time_ms: end_time_ms + 1000, + instant_lock_quorums, + current_identities: identities, + }, + continue_strategy_no_operations.clone(), + PlatformConfig { + validator_set: ValidatorSetConfig::default_100_67(), + chain_lock: ChainLockConfig::default_100_67(), + instant_lock: InstantLockConfig::default_100_67(), + execution: ExecutionConfig { + verify_sum_trees: true, + + ..Default::default() + }, + block_spacing_ms: hour_in_ms, + initial_protocol_version: TEST_PLATFORM_V3.protocol_version, + testing_configs: PlatformTestConfig::default_minimal_verifications(), + ..Default::default() + }, + StrategyRandomness::SeedEntropy(9), + ); + + // We should have unlocked the amounts by now + let locked_amount = outcome + .abci_app + .platform + .drive + .grove_get_sum_tree_total_value( + (&get_withdrawal_root_path()).into(), + &WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, + DirectQueryType::StatefulDirectQuery, + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to get locked amount"); + + // There's about 2000 Dash left in platform, it's normal we are locking 1/10th of it + assert_eq!(locked_amount, 20000000000000); + + // Withdrawal documents with pooled status should not exist. + let withdrawal_documents_pooled = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // None are currently pooled since we have no more room + assert!(withdrawal_documents_pooled.is_empty()); + + // Withdrawal documents with queued status should exist. + let withdrawal_documents_queued = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::QUEUED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // We have 58 out of 100 queued + assert_eq!(withdrawal_documents_queued.len(), 58); + + // Withdrawal documents with queued status should exist. + let withdrawal_documents_completed = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::COMPLETE.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // None have completed because core didn't acknowledge them + assert_eq!(withdrawal_documents_completed.len(), 0); + + // Withdrawal documents with EXPIRED status should not exist yet. + let withdrawal_documents_expired = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::EXPIRED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // We have none expired yet, because the core height never went up + assert_eq!(withdrawal_documents_expired.len(), 0); + + // Withdrawal documents with broadcasted status should exist. + let withdrawal_documents_broadcasted = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + assert_eq!(withdrawal_documents_broadcasted.len(), 22); + outcome + }; + + let outcome = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start: 71, + core_height_start: 1, + block_count: 250, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, + current_votes: BTreeMap::default(), + start_time_ms: GENESIS_TIME_MS, + current_time_ms: end_time_ms + 1000, + instant_lock_quorums, + current_identities: identities, + }, + continue_strategy_no_operations.clone(), + PlatformConfig { + validator_set: ValidatorSetConfig::default_100_67(), + chain_lock: ChainLockConfig::default_100_67(), + instant_lock: InstantLockConfig::default_100_67(), + execution: ExecutionConfig { + verify_sum_trees: true, + + ..Default::default() + }, + block_spacing_ms: hour_in_ms, + initial_protocol_version: TEST_PLATFORM_V3.protocol_version, + testing_configs: PlatformTestConfig::default_minimal_verifications(), + ..Default::default() + }, + StrategyRandomness::SeedEntropy(9), + ); + + // We should have unlocked the amounts by now + let locked_amount = outcome + .abci_app + .platform + .drive + .grove_get_sum_tree_total_value( + (&get_withdrawal_root_path()).into(), + &WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, + DirectQueryType::StatefulDirectQuery, + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to get locked amount"); + + // We have nothing locked left + assert_eq!(locked_amount, 0); + + // Withdrawal documents with pooled status should not exist. + let withdrawal_documents_pooled = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // None are currently pooled since we have no more room + assert!(withdrawal_documents_pooled.is_empty()); + + // Withdrawal documents with queued status should exist. + let withdrawal_documents_queued = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::QUEUED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // Nothing is left in the queue + assert_eq!(withdrawal_documents_queued.len(), 0); + + // Withdrawal documents with queued status should exist. + let withdrawal_documents_completed = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::COMPLETE.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // None have completed because core didn't acknowledge them + assert_eq!(withdrawal_documents_completed.len(), 0); + + // Withdrawal documents with EXPIRED status should not exist yet. + let withdrawal_documents_expired = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::EXPIRED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // We have none expired yet, because the core height never went up + assert_eq!(withdrawal_documents_expired.len(), 0); + + // Withdrawal documents with broadcasted status should exist. + let withdrawal_documents_broadcasted = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + assert_eq!(withdrawal_documents_broadcasted.len(), 80); + } + + #[test] + fn run_chain_withdraw_from_identities_many_small_withdrawals() { + // TEST_PLATFORM_V3 is like v4, but without the single quorum can sign withdrawals restriction + let platform_version = PlatformVersion::get(TEST_PLATFORM_V3.protocol_version) + .expect("expected to get platform version"); + let start_strategy = NetworkStrategy { + strategy: Strategy { + start_contracts: vec![], + operations: vec![Operation { + op_type: OperationType::IdentityTopUp(dash_to_duffs!(10)..=dash_to_duffs!(10)), + frequency: Frequency { + times_per_block_range: 10..11, + chance_per_block: None, + }, + }], + start_identities: StartIdentities::default(), + identity_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 10..11, + chance_per_block: None, + }, + start_keys: 3, + extra_keys: [( + Purpose::TRANSFER, + [(SecurityLevel::CRITICAL, vec![KeyType::ECDSA_SECP256K1])].into(), + )] + .into(), + start_balance_range: dash_to_duffs!(200)..=dash_to_duffs!(200), + }, + identity_contract_nonce_gaps: None, + signer: None, + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }; + + let minute_in_ms = 1000 * 60; + let config = PlatformConfig { + validator_set: ValidatorSetConfig::default_100_67(), + chain_lock: ChainLockConfig::default_100_67(), + instant_lock: InstantLockConfig::default_100_67(), + execution: ExecutionConfig { + verify_sum_trees: true, + + ..Default::default() + }, + block_spacing_ms: minute_in_ms, + initial_protocol_version: TEST_PLATFORM_V3.protocol_version, + testing_configs: PlatformTestConfig::default_minimal_verifications(), + ..Default::default() + }; + + let mut platform = TestPlatformBuilder::new() + .with_config(config.clone()) + .build_with_mock_rpc(); + + platform + .core_rpc + .expect_send_raw_transaction() + .returning(move |_| Ok(Txid::all_zeros())); + + let chain_locked_height = 1; + + // Have to go with a complicated shared object for the core state because we need to change + // rpc response along the way but we can't mutate `platform.core_rpc` later + // because platform reference is moved into the AbciApplication. + let shared_core_state = Arc::new(Mutex::new(CoreState { + asset_unlock_statuses: BTreeMap::new(), + chain_lock: ChainLock { + block_height: chain_locked_height, + block_hash: BlockHash::from_byte_array([1; 32]), + signature: BLSSignature::from([2; 96]), + }, + })); + + // Set up Core RPC responses + { + let core_state = shared_core_state.clone(); + + platform + .core_rpc + .expect_get_asset_unlock_statuses() + .returning(move |indices, _| { + Ok(indices + .iter() + .map(|index| { + core_state + .lock() + .unwrap() + .asset_unlock_statuses + .get(index) + .cloned() + .unwrap() + }) + .collect()) + }); + + let core_state = shared_core_state.clone(); + platform + .core_rpc + .expect_get_best_chain_lock() + .returning(move || Ok(core_state.lock().unwrap().chain_lock.clone())); } - // Run block 6. - // Tests withdrawal expiration - let ChainExecutionOutcome { .. } = { + // Run first two blocks: + // - Block 1: creates identity + // - Block 2: tops up identity + let ChainExecutionOutcome { + abci_app, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions, + end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, + instant_lock_quorums, + identities, + signer, + .. + } = { + let outcome = run_chain_for_strategy( + &mut platform, + 2, + start_strategy, + config.clone(), + 1, + &mut None, + ); + + for tx_results_per_block in outcome.state_transition_results_per_block.values() { + for (state_transition, result) in tx_results_per_block { + assert_eq!( + result.code, 0, + "state transition got code {} : {:?}", + result.code, state_transition + ); + } + } + + // Withdrawal transactions are not populated to block execution context yet + assert_eq!(outcome.withdrawals.len(), 0); + + // Withdrawal documents with pooled status should exist. + let withdrawal_documents_pooled = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + assert!(withdrawal_documents_pooled.is_empty()); + + let locked_amount = outcome + .abci_app + .platform + .drive + .grove_get_sum_tree_total_value( + (&get_withdrawal_root_path()).into(), + &WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, + DirectQueryType::StatefulDirectQuery, + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to get locked amount"); + + assert_eq!(locked_amount, 0); + + let pooled_withdrawals = withdrawal_documents_pooled.len(); + + assert_eq!(pooled_withdrawals, 0); + + let total_credits_balance = outcome + .abci_app + .platform + .drive + .calculate_total_credits_balance(None, &platform_version.drive) + .expect("expected to get total credits balance"); + + assert_eq!( + total_credits_balance.total_identity_balances, + 409997575280380 + ); // Around 4100 Dash. + + assert_eq!( + total_credits_balance.total_in_trees().unwrap(), + 410000000000000 + ); // Around 4100 Dash. + + let total_credits_in_platform = outcome + .abci_app + .platform + .drive + .grove_get_raw_value_u64_from_encoded_var_vec( + (&misc_path()).into(), + TOTAL_SYSTEM_CREDITS_STORAGE_KEY, + DirectQueryType::StatefulDirectQuery, + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to get total credits in platform"); + + assert_eq!(total_credits_in_platform, Some(410000000000000)); + + outcome + }; + + let continue_strategy_only_withdrawal = NetworkStrategy { + strategy: Strategy { + start_contracts: vec![], + operations: vec![Operation { + op_type: OperationType::IdentityWithdrawal( + dash_to_credits!(0.0025)..=dash_to_credits!(0.0025), + ), + frequency: Frequency { + times_per_block_range: 40..41, // 0.0025 Dash x 40 Withdrawals = 0.1 Dash + chance_per_block: None, + }, + }], + start_identities: StartIdentities::default(), + identity_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, + signer: Some(signer.clone()), + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }; + + let continue_strategy_no_operations = NetworkStrategy { + strategy: Strategy { + start_contracts: vec![], + operations: vec![], + start_identities: StartIdentities::default(), + identity_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, + signer: Some(signer), + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }; + + // Run Block 3-23 onwards: initiates withdrawals + let ChainExecutionOutcome { + abci_app, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions, + end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, + instant_lock_quorums, + identities, + .. + } = { let outcome = continue_chain_for_strategy( abci_app, ChainExecutionParameters { - block_start: 6, + block_start: 3, core_height_start: 1, - block_count: 1, + block_count: 20, proposers, validator_quorums: quorums, current_validator_quorum_hash: current_quorum_hash, @@ -551,15 +2248,27 @@ mod tests { current_identity_contract_nonce_counter: identity_contract_nonce_counter, current_votes: BTreeMap::default(), start_time_ms: GENESIS_TIME_MS, - current_time_ms: end_time_ms + 1000, + current_time_ms: end_time_ms, instant_lock_quorums, - current_identities: Vec::new(), + current_identities: identities, }, - strategy.clone(), + continue_strategy_only_withdrawal.clone(), config.clone(), - StrategyRandomness::SeedEntropy(5), + StrategyRandomness::SeedEntropy(2), ); + for tx_results_per_block in outcome.state_transition_results_per_block.values() { + assert_eq!(tx_results_per_block.len(), 20); + for (state_transition, result) in tx_results_per_block { + assert_eq!( + result.code, 0, + "state transition got code {} : {:?}", + result.code, state_transition + ); + } + } + + // Withdrawal documents with pooled status should not exist. let withdrawal_documents_pooled = outcome .abci_app .platform @@ -572,18 +2281,26 @@ mod tests { ) .unwrap(); - let withdrawal_documents_broadcasted = outcome + // We should have 4 pooled, which is the limit per block + assert_eq!(withdrawal_documents_pooled.len(), 4); + + // Withdrawal documents with queued status should exist. + let withdrawal_documents_queued = outcome .abci_app .platform .drive .fetch_oldest_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), - DEFAULT_QUERY_LIMIT, + withdrawals_contract::WithdrawalStatus::QUEUED.into(), + 10000, None, platform_version, ) .unwrap(); + // We have 320 queued + assert_eq!(withdrawal_documents_queued.len(), 320); + + // Withdrawal documents with queued status should exist. let withdrawal_documents_completed = outcome .abci_app .platform @@ -596,6 +2313,10 @@ mod tests { ) .unwrap(); + // None have completed because core didn't acknowledge them + assert_eq!(withdrawal_documents_completed.len(), 0); + + // Withdrawal documents with EXPIRED status should not exist yet. let withdrawal_documents_expired = outcome .abci_app .platform @@ -608,36 +2329,177 @@ mod tests { ) .unwrap(); - // In this block we should have new withdrawals pooled - assert!(!withdrawal_documents_pooled.is_empty()); - - // Amount of completed withdrawals stays the same as in the last block - assert_eq!( - withdrawal_documents_completed.len(), - last_block_withdrawals_completed_amount - ); + // We have none expired yet + assert_eq!(withdrawal_documents_expired.len(), 0); - // And some withdrawals got expired - let withdrawals_expired_expected = - // Withdrawals issued on {previous_block - 1}, but not chainlocked yet, considered expired - last_block_broadcased_withdrawals_amount - last_block_withdrawals.len(); + // Withdrawal documents with broadcasted status should exist. + let withdrawal_documents_broadcasted = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); - assert_eq!( - withdrawal_documents_expired.len(), - withdrawals_expired_expected - ); + // We have 76 broadcasted (4 pooled + 76 broadcasted = 80 total for 4 per block in 20 blocks) + assert_eq!(withdrawal_documents_broadcasted.len(), 76); - // And extra withdrawals broadcasted - let withdrawals_broadcasted_expected = - // Withdrawals issued on previous block + withdrawals from this block are still in broadcasted state - last_block_withdrawals.len() + outcome.withdrawals.len(); + let locked_amount = outcome + .abci_app + .platform + .drive + .grove_get_sum_tree_total_value( + (&get_withdrawal_root_path()).into(), + &WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, + DirectQueryType::StatefulDirectQuery, + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to get locked amount"); - assert_eq!( - withdrawal_documents_broadcasted.len(), - withdrawals_broadcasted_expected - ); + // 0.2 is 0.0025 amount * 80 withdrawals + assert_eq!(locked_amount, dash_to_credits!(0.2) as i64); outcome }; + + let hour_in_ms = 1000 * 60 * 60; + + let outcome = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start: 23, + core_height_start: 1, + block_count: 88, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, + current_votes: BTreeMap::default(), + start_time_ms: GENESIS_TIME_MS, + current_time_ms: end_time_ms + 1000, + instant_lock_quorums, + current_identities: identities, + }, + continue_strategy_no_operations.clone(), + PlatformConfig { + validator_set: ValidatorSetConfig::default_100_67(), + chain_lock: ChainLockConfig::default_100_67(), + instant_lock: InstantLockConfig::default_100_67(), + execution: ExecutionConfig { + verify_sum_trees: true, + + ..Default::default() + }, + block_spacing_ms: hour_in_ms, + initial_protocol_version: TEST_PLATFORM_V3.protocol_version, + testing_configs: PlatformTestConfig::default_minimal_verifications(), + ..Default::default() + }, + StrategyRandomness::SeedEntropy(9), + ); + + // We should have unlocked the amounts by now + let locked_amount = outcome + .abci_app + .platform + .drive + .grove_get_sum_tree_total_value( + (&get_withdrawal_root_path()).into(), + &WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, + DirectQueryType::StatefulDirectQuery, + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to get locked amount"); + + assert_eq!(locked_amount, 18000000000); + + // Withdrawal documents with pooled status should not exist. + let withdrawal_documents_pooled = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // None are currently pooled since we finished the queue + assert!(withdrawal_documents_pooled.is_empty()); + + // Withdrawal documents with queued status should exist. + let withdrawal_documents_queued = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::QUEUED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // Queue has been finished + assert_eq!(withdrawal_documents_queued.len(), 0); + + // Withdrawal documents with queued status should exist. + let withdrawal_documents_completed = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::COMPLETE.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // None have completed because core didn't acknowledge them + assert_eq!(withdrawal_documents_completed.len(), 0); + + // Withdrawal documents with EXPIRED status should not exist yet. + let withdrawal_documents_expired = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::EXPIRED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // We have none expired yet, because the core height never went up + assert_eq!(withdrawal_documents_expired.len(), 0); + + // Withdrawal documents with broadcasted status should exist. + let withdrawal_documents_broadcasted = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), + 1000, + None, + platform_version, + ) + .unwrap(); + + assert_eq!(withdrawal_documents_broadcasted.len(), 400); } } diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 15c207cc23..7c37d1ad6c 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -77,6 +77,7 @@ dpp = { path = "../rs-dpp", features = [ ], default-features = false } once_cell = "1.7" serde_json = { version = "1.0", features = ["preserve_order"] } +assert_matches = "1.5.0" [[bench]] name = "benchmarks" diff --git a/packages/rs-drive/src/drive/identity/withdrawals/calculate_current_withdrawal_limit/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/calculate_current_withdrawal_limit/mod.rs new file mode 100644 index 0000000000..172eda82c9 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/withdrawals/calculate_current_withdrawal_limit/mod.rs @@ -0,0 +1,53 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use dpp::fee::Credits; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; + +mod v0; + +impl Drive { + /// Calculates the current withdrawal limit based on the total credits available in the platform + /// and the amount already withdrawn in the last 24 hours, using the appropriate version-specific logic. + /// + /// This function selects the version-specific implementation based on the provided `platform_version`. + /// It currently supports only version 0 (`calculate_current_withdrawal_limit_v0`). + /// + /// # Parameters + /// + /// * `transaction`: The transaction context used for querying data. + /// * `platform_version`: The version of the platform being used, which contains configuration details and version-specific methods. + /// + /// # Returns + /// + /// * `Ok(Credits)`: The calculated current withdrawal limit, representing the maximum amount that can still be withdrawn in the current 24-hour window. + /// * `Err(Error)`: Returns an error if the version specified in `platform_version` is not supported or if there is an issue in the version-specific calculation. + /// + /// # Errors + /// + /// * `Error::Drive(DriveError::UnknownVersionMismatch)`: + /// - If the platform version provided does not match any known versions supported by this function. + /// + /// * `Error`: Any error propagated from the version-specific implementation, such as issues in retrieving data or calculating the withdrawal limit. + pub fn calculate_current_withdrawal_limit( + &self, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive + .methods + .identity + .withdrawals + .calculate_current_withdrawal_limit + { + 0 => self.calculate_current_withdrawal_limit_v0(transaction, platform_version), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "calculate_current_withdrawal_limit".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/calculate_current_withdrawal_limit/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/calculate_current_withdrawal_limit/v0/mod.rs new file mode 100644 index 0000000000..f7610ec941 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/withdrawals/calculate_current_withdrawal_limit/v0/mod.rs @@ -0,0 +1,86 @@ +use crate::drive::balances::TOTAL_SYSTEM_CREDITS_STORAGE_KEY; +use crate::drive::identity::withdrawals::paths::{ + get_withdrawal_root_path, WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, +}; +use crate::drive::system::misc_path; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::util::grove_operations::DirectQueryType; +use dpp::fee::Credits; +use dpp::withdrawal::daily_withdrawal_limit::daily_withdrawal_limit; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; + +impl Drive { + /// Calculates the current withdrawal limit based on the available credits in the platform + /// and the amount already withdrawn in the last 24 hours. + /// + /// This function considers two main components to calculate the current withdrawal limit: + /// 1. The total maximum withdrawal allowed in a 24-hour period (`daily_maximum`). + /// 2. The amount already withdrawn in the last 24 hours (`withdrawal_amount_in_last_day`). + /// + /// The formula used is: `daily_maximum - withdrawal_amount_in_last_day`. + /// If the withdrawal amount in the last 24 hours exceeds the daily maximum, the result will be 0. + /// + /// # Parameters + /// + /// * `transaction`: The transaction context to use for querying data. + /// * `platform_version`: The version of the platform being used, containing relevant configuration details. + /// + /// # Returns + /// + /// * `Ok(Credits)`: The calculated current withdrawal limit, which is the maximum amount that can still be withdrawn in the current 24-hour window. + /// * `Err(Error)`: Returns an error if there was an issue retrieving the total credits, the daily maximum, or the already withdrawn amount. + /// + /// # Errors + /// + /// * `Error::Drive(DriveError::CriticalCorruptedState)`: + /// - If the total credits in the platform cannot be found, indicating a critical state corruption. + /// - If the withdrawal amount in the last 24 hours is negative, which should not happen. + pub(super) fn calculate_current_withdrawal_limit_v0( + &self, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + // The current withdrawal limit has two components + // 1. The total maximum that we are allowed to do in 24 hours + // 2. The amount that we have already withdrawn in the last 24 hours + let mut drive_operations = vec![]; + + let path_holding_total_credits = misc_path(); + let total_credits_in_platform = self + .grove_get_raw_value_u64_from_encoded_var_vec( + (&path_holding_total_credits).into(), + TOTAL_SYSTEM_CREDITS_STORAGE_KEY, + DirectQueryType::StatefulDirectQuery, + transaction, + &mut drive_operations, + &platform_version.drive, + )? + .ok_or(Error::Drive(DriveError::CriticalCorruptedState( + "Credits not found in Platform", + )))?; + + // Let's get the amount that we are allowed to get in the last 24 hours. + let daily_maximum = daily_withdrawal_limit(total_credits_in_platform, platform_version)?; + + let withdrawal_amount_in_last_day: u64 = self + .grove_get_sum_tree_total_value( + (&get_withdrawal_root_path()).into(), + &WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, + DirectQueryType::StatefulDirectQuery, + transaction, + &mut drive_operations, + &platform_version.drive, + )? + .try_into() + .map_err(|_| { + Error::Drive(DriveError::CriticalCorruptedState( + "Withdrawal amount in last day is negative", + )) + })?; + + Ok(daily_maximum.saturating_sub(withdrawal_amount_in_last_day)) + } +} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/mod.rs index d4214a53e7..ca67af28bc 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/mod.rs @@ -25,7 +25,7 @@ impl Drive { .identity .withdrawals .document - .find_up_to_100_withdrawal_documents_by_status_and_transaction_indices + .find_withdrawal_documents_by_status_and_transaction_indices { 0 => self.find_withdrawal_documents_by_status_and_transaction_indices_v0( status, @@ -35,8 +35,7 @@ impl Drive { platform_version, ), version => Err(Error::Drive(DriveError::UnknownVersionMismatch { - method: "find_up_to_100_withdrawal_documents_by_status_and_transaction_indices" - .to_string(), + method: "find_withdrawal_documents_by_status_and_transaction_indices".to_string(), known_versions: vec![0], received: version, })), diff --git a/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs index b04bc85b5b..e6b4a8e640 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs @@ -16,6 +16,7 @@ use std::collections::BTreeMap; impl Drive { // TODO(withdrawals): Currently it queries only up to 100 documents. // It works while we don't have pooling + // This should be a pathquery directly instead of a drive query for efficiency pub(super) fn find_withdrawal_documents_by_status_and_transaction_indices_v0( &self, diff --git a/packages/rs-drive/src/drive/identity/withdrawals/document/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/document/mod.rs index 0f3e6aec29..e047ea5a45 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/document/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/document/mod.rs @@ -1,4 +1,4 @@ -/// This module dedicated for a versioned fetch_up_to_100_oldest_withdrawal_documents_by_status +/// This module dedicated for a versioned fetch_oldest_withdrawal_documents_by_status pub mod fetch_oldest_withdrawal_documents_by_status; -/// This module dedicated for a versioned find_up_to_100_withdrawal_documents_by_status_and_transaction_indices +/// This module dedicated for a versioned find_withdrawal_documents_by_status_and_transaction_indices pub mod find_withdrawal_documents_by_status_and_transaction_indices; diff --git a/packages/rs-drive/src/drive/identity/withdrawals/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/mod.rs index 1571e0e230..25296ff37a 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/mod.rs @@ -1,6 +1,7 @@ /// Functions related to withdrawal documents pub mod document; +mod calculate_current_withdrawal_limit; /// Functions and constants related to GroveDB paths pub mod paths; /// Functions related to withdrawal transactions diff --git a/packages/rs-drive/src/drive/identity/withdrawals/paths.rs b/packages/rs-drive/src/drive/identity/withdrawals/paths.rs index 0dfcb3c4c9..fd1e3d0405 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/paths.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/paths.rs @@ -1,17 +1,22 @@ -use grovedb::Element; - use crate::drive::{Drive, RootTree}; use crate::util::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; use crate::util::batch::GroveDbOpBatch; +use grovedb::Element; +use platform_version::version::PlatformVersion; /// constant key for transaction counter pub const WITHDRAWAL_TRANSACTIONS_NEXT_INDEX_KEY: [u8; 1] = [0]; /// constant id for subtree containing transactions queue pub const WITHDRAWAL_TRANSACTIONS_QUEUE_KEY: [u8; 1] = [1]; +/// constant id for subtree containing the sum of withdrawals +pub const WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY: [u8; 1] = [2]; impl Drive { /// Add operations for creating initial withdrawal state structure - pub fn add_initial_withdrawal_state_structure_operations(batch: &mut GroveDbOpBatch) { + pub fn add_initial_withdrawal_state_structure_operations( + batch: &mut GroveDbOpBatch, + platform_version: &PlatformVersion, + ) { batch.add_insert( vec![vec![RootTree::WithdrawalTransactions as u8]], WITHDRAWAL_TRANSACTIONS_NEXT_INDEX_KEY.to_vec(), @@ -22,6 +27,13 @@ impl Drive { vec![vec![RootTree::WithdrawalTransactions as u8]], WITHDRAWAL_TRANSACTIONS_QUEUE_KEY.to_vec(), ); + + if platform_version.protocol_version >= 4 { + batch.add_insert_empty_sum_tree( + vec![vec![RootTree::WithdrawalTransactions as u8]], + WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY.to_vec(), + ); + } } } @@ -50,3 +62,19 @@ pub fn get_withdrawal_transactions_queue_path() -> [&'static [u8]; 2] { &WITHDRAWAL_TRANSACTIONS_QUEUE_KEY, ] } + +/// Helper function to get the withdrawal transactions sum tree path as Vec +pub fn get_withdrawal_transactions_sum_tree_path_vec() -> Vec> { + vec![ + vec![RootTree::WithdrawalTransactions as u8], + WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY.to_vec(), + ] +} + +/// Helper function to get the withdrawal transactions sum tree path as [u8] +pub fn get_withdrawal_transactions_sum_tree_path() -> [&'static [u8]; 2] { + [ + Into::<&[u8; 1]>::into(RootTree::WithdrawalTransactions), + &WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, + ] +} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/mod.rs index 1b6a52728c..f23c60bba4 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/mod.rs @@ -2,6 +2,7 @@ use crate::drive::Drive; use crate::error::drive::DriveError; use crate::error::Error; use crate::util::batch::DriveOperation; +use dpp::fee::Credits; use dpp::withdrawal::WithdrawalTransactionIndexAndBytes; use platform_version::version::PlatformVersion; @@ -12,6 +13,7 @@ impl Drive { pub fn add_enqueue_untied_withdrawal_transaction_operations( &self, withdrawal_transactions: Vec, + total_sum: Credits, drive_operation_types: &mut Vec, platform_version: &PlatformVersion, ) -> Result<(), Error> { @@ -27,6 +29,7 @@ impl Drive { 0 => { self.add_enqueue_untied_withdrawal_transaction_operations_v0( withdrawal_transactions, + total_sum, drive_operation_types, ); diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/v0/mod.rs index a9d8a604e2..1df5e12da9 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/v0/mod.rs @@ -1,12 +1,16 @@ use crate::drive::Drive; use crate::util::batch::drive_op_batch::WithdrawalOperationType; use crate::util::batch::DriveOperation; +use dpp::fee::Credits; +use dpp::prelude::TimestampMillis; use dpp::withdrawal::WithdrawalTransactionIndexAndBytes; +const DAY_AND_A_HOUR_IN_MS: TimestampMillis = 90_000_000; //25 hours impl Drive { pub(super) fn add_enqueue_untied_withdrawal_transaction_operations_v0( &self, withdrawal_transactions: Vec, + total_sum: Credits, drive_operation_types: &mut Vec, ) { if !withdrawal_transactions.is_empty() { @@ -15,6 +19,13 @@ impl Drive { withdrawal_transactions, }, )); + drive_operation_types.push(DriveOperation::WithdrawalOperation( + WithdrawalOperationType::ReserveWithdrawalAmount { + amount: total_sum, + // Best to use a constant here and not a versioned item as this most likely will not change + expiration_after: DAY_AND_A_HOUR_IN_MS, + }, + )); } } } diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/mod.rs index e519f56bd5..8926ea5c0c 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/mod.rs @@ -37,6 +37,7 @@ mod tests { drive .add_enqueue_untied_withdrawal_transaction_operations( withdrawals, + 100, &mut drive_operations, platform_version, ) diff --git a/packages/rs-drive/src/drive/initialization/v0/mod.rs b/packages/rs-drive/src/drive/initialization/v0/mod.rs index e1c4ee377d..39387184e5 100644 --- a/packages/rs-drive/src/drive/initialization/v0/mod.rs +++ b/packages/rs-drive/src/drive/initialization/v0/mod.rs @@ -170,7 +170,7 @@ impl Drive { )?; // In Withdrawals - Drive::add_initial_withdrawal_state_structure_operations(&mut batch); + Drive::add_initial_withdrawal_state_structure_operations(&mut batch, platform_version); // For Versioning via forks Drive::add_initial_fork_update_structure_operations(&mut batch); diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs index 8da24e5759..e2c443d9ab 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs @@ -16,7 +16,7 @@ use dpp::document::{Document, DocumentV0}; use dpp::identity::core_script::CoreScript; use dpp::identity::hash::IdentityPublicKeyHashMethodsV0; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; -use dpp::identity::IdentityPublicKey; +use dpp::identity::{IdentityPublicKey, KeyType}; use dpp::platform_value::platform_value; use dpp::state_transition::identity_credit_withdrawal_transition::v1::IdentityCreditWithdrawalTransitionV1; use dpp::state_transition::state_transitions::identity::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; @@ -131,19 +131,27 @@ impl IdentityCreditWithdrawalTransitionActionV0 { )); } } - if !key.key_type().is_core_address_key_type() { - return Ok(ConsensusValidationResult::new_with_error( - ConsensusError::StateError( - StateError::NoTransferKeyForCoreWithdrawalAvailableError( - NoTransferKeyForCoreWithdrawalAvailableError::new( - identity_credit_withdrawal.identity_id, + match key.key_type() { + KeyType::ECDSA_HASH160 => { + // We should get the withdrawal address + CoreScript::new_p2pkh(key.public_key_hash()?).to_bytes() + } + KeyType::BIP13_SCRIPT_HASH => { + // We should get the withdrawal address + CoreScript::new_p2sh(key.public_key_hash()?).to_bytes() + } + _ => { + return Ok(ConsensusValidationResult::new_with_error( + ConsensusError::StateError( + StateError::NoTransferKeyForCoreWithdrawalAvailableError( + NoTransferKeyForCoreWithdrawalAvailableError::new( + identity_credit_withdrawal.identity_id, + ), ), ), - ), - )); + )); + } } - // We should get the withdrawal address - CoreScript::new_p2pkh(key.public_key_hash()?).to_bytes() }; let mut entropy = Vec::new(); diff --git a/packages/rs-drive/src/util/batch/drive_op_batch/withdrawals.rs b/packages/rs-drive/src/util/batch/drive_op_batch/withdrawals.rs index 7ad820d601..a24c5b8efe 100644 --- a/packages/rs-drive/src/util/batch/drive_op_batch/withdrawals.rs +++ b/packages/rs-drive/src/util/batch/drive_op_batch/withdrawals.rs @@ -2,14 +2,17 @@ use std::collections::HashMap; use crate::drive::identity::withdrawals::paths::{ get_withdrawal_root_path_vec, get_withdrawal_transactions_queue_path, - get_withdrawal_transactions_queue_path_vec, WITHDRAWAL_TRANSACTIONS_NEXT_INDEX_KEY, + get_withdrawal_transactions_queue_path_vec, get_withdrawal_transactions_sum_tree_path_vec, + WITHDRAWAL_TRANSACTIONS_NEXT_INDEX_KEY, }; -use crate::util::grove_operations::BatchDeleteApplyType; +use crate::util::grove_operations::{BatchDeleteApplyType, BatchInsertApplyType}; use crate::util::object_size_info::PathKeyElementInfo; use crate::{drive::Drive, error::Error, fees::op::LowLevelDriveOperation}; use dpp::block::block_info::BlockInfo; use super::DriveLowLevelOperationConverter; +use dpp::fee::{Credits, SignedCredits}; +use dpp::prelude::TimestampMillis; use dpp::version::PlatformVersion; use dpp::withdrawal::{WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes}; use grovedb::Element; @@ -33,6 +36,13 @@ pub enum WithdrawalOperationType { /// withdrawal transaction tuple with id and bytes index: WithdrawalTransactionIndex, }, + /// Reserve an amount in the system for withdrawals, the reservation will expire at the date given + ReserveWithdrawalAmount { + /// amount to reserve + amount: Credits, + /// expiration date + expiration_after: TimestampMillis, + }, } impl DriveLowLevelOperationConverter for WithdrawalOperationType { @@ -42,7 +52,7 @@ impl DriveLowLevelOperationConverter for WithdrawalOperationType { _estimated_costs_only_with_layer_info: &mut Option< HashMap, >, - _block_info: &BlockInfo, + block_info: &BlockInfo, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { @@ -73,7 +83,7 @@ impl DriveLowLevelOperationConverter for WithdrawalOperationType { for (index, bytes) in withdrawal_transactions { drive.batch_insert( - PathKeyElementInfo::PathKeyElement::<'_, 1>(( + PathKeyElementInfo::PathKeyElement::<'_, 0>(( path.clone(), index.to_be_bytes().to_vec(), Element::Item(bytes, None), @@ -85,6 +95,30 @@ impl DriveLowLevelOperationConverter for WithdrawalOperationType { Ok(drive_operations) } + WithdrawalOperationType::ReserveWithdrawalAmount { + amount, + expiration_after, + } => { + let mut drive_operations = vec![]; + + let expiration_date = block_info.time_ms + expiration_after; + + let sum_path = get_withdrawal_transactions_sum_tree_path_vec(); + + drive.batch_insert_sum_item_or_add_to_if_already_exists( + PathKeyElementInfo::PathKeyElement::<'_, 0>(( + sum_path.clone(), + expiration_date.to_be_bytes().to_vec(), + Element::SumItem(amount as SignedCredits, None), + )), + BatchInsertApplyType::StatefulBatchInsert, + transaction, + &mut drive_operations, + &platform_version.drive, + )?; + + Ok(drive_operations) + } WithdrawalOperationType::DeleteWithdrawalTransaction { index } => { let mut drive_operations = vec![]; diff --git a/packages/rs-drive/src/util/grove_operations/batch_delete_items_in_path_query/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_delete_items_in_path_query/mod.rs new file mode 100644 index 0000000000..24b03094ef --- /dev/null +++ b/packages/rs-drive/src/util/grove_operations/batch_delete_items_in_path_query/mod.rs @@ -0,0 +1,56 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::BatchDeleteApplyType; + +use dpp::version::drive_versions::DriveVersion; + +use grovedb::{PathQuery, TransactionArg}; + +impl Drive { + /// Pushes multiple "delete element" operations for items in a given path based on a `PathQuery` to `drive_operations`. + /// + /// # Parameters + /// * `path_query`: The path query specifying the items to delete within the path. + /// * `error_if_intermediate_path_tree_not_present`: Tells the function to either error or do nothing if an intermediate tree is not present. + /// * `apply_type`: The apply type for the delete operations. + /// * `transaction`: The transaction argument. + /// * `drive_operations`: The vector containing low-level drive operations. + /// * `drive_version`: The drive version to select the correct function version to run. + /// + /// # Returns + /// * `Ok(())` if the operation was successful. + /// * `Err(DriveError::UnknownVersionMismatch)` if the drive version does not match known versions. + pub fn batch_delete_items_in_path_query( + &self, + path_query: &PathQuery, + error_if_intermediate_path_tree_not_present: bool, + apply_type: BatchDeleteApplyType, + transaction: TransactionArg, + drive_operations: &mut Vec, + drive_version: &DriveVersion, + ) -> Result<(), Error> { + match drive_version + .grove_methods + .batch + .batch_delete_items_in_path_query + { + 0 => self.batch_delete_items_in_path_query_v0( + path_query, + error_if_intermediate_path_tree_not_present, + apply_type, + transaction, + drive_operations, + drive_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "batch_delete_items_in_path_query".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/util/grove_operations/batch_delete_items_in_path_query/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_delete_items_in_path_query/v0/mod.rs new file mode 100644 index 0000000000..a530776986 --- /dev/null +++ b/packages/rs-drive/src/util/grove_operations/batch_delete_items_in_path_query/v0/mod.rs @@ -0,0 +1,588 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::fees::op::LowLevelDriveOperation::GroveOperation; +use crate::util::grove_operations::{push_drive_operation_result, BatchDeleteApplyType}; +use grovedb::batch::key_info::KeyInfo; +use grovedb::batch::KeyInfoPath; +use grovedb::operations::delete::DeleteOptions; +use grovedb::query_result_type::QueryResultType; +use grovedb::{GroveDb, PathQuery, TransactionArg}; +use grovedb_storage::rocksdb_storage::RocksDbStorage; +use platform_version::version::drive_versions::DriveVersion; + +impl Drive { + /// Version 0 implementation of the "delete multiple elements" operation based on a `PathQuery`. + /// Deletes items in the specified path that match the given query. + /// + /// # Parameters + /// * `path_query`: The path query specifying the items to delete within the path. + /// * `error_if_intermediate_path_tree_not_present`: Tells the function to either error or do nothing if an intermediate tree is not present. + /// * `apply_type`: The apply type for the delete operations. + /// * `transaction`: The transaction argument. + /// * `drive_operations`: The vector containing low-level drive operations. + /// * `drive_version`: The drive version to select the correct function version to run. + /// + /// # Returns + /// * `Ok(())` if the operation was successful. + /// * `Err(DriveError::CorruptedCodeExecution)` if the operation is not supported. + pub(super) fn batch_delete_items_in_path_query_v0( + &self, + path_query: &PathQuery, + error_if_intermediate_path_tree_not_present: bool, + apply_type: BatchDeleteApplyType, + transaction: TransactionArg, + drive_operations: &mut Vec, + drive_version: &DriveVersion, + ) -> Result<(), Error> { + if path_query.query.limit == None { + Error::Drive(DriveError::NotSupported( + "Limits are required for path_query", + )); + } + let query_result = if path_query + .query + .query + .items + .iter() + .all(|query_item| query_item.is_key()) + { + // Fetch the elements that match the path query + let query_result = self.grove_get_raw_path_query_with_optional( + path_query, + error_if_intermediate_path_tree_not_present, + transaction, + drive_operations, + drive_version, + )?; + + query_result + .into_iter() + .filter_map(|(path, key, maybe_element)| { + maybe_element.map(|element| (path, key, element)) + }) + .collect() + } else { + self.grove_get_raw_path_query( + path_query, + transaction, + QueryResultType::QueryPathKeyElementTrioResultType, + drive_operations, + drive_version, + )? + .0 + .to_path_key_elements() + }; + + // Iterate over each element and add a delete operation for it + for (path, key, _) in query_result { + let current_batch_operations = + LowLevelDriveOperation::grovedb_operations_batch(drive_operations); + let options = DeleteOptions { + allow_deleting_non_empty_trees: false, + deleting_non_empty_trees_returns_error: true, + base_root_storage_is_free: true, + validate_tree_at_path_exists: false, + }; + let delete_operation = match apply_type { + BatchDeleteApplyType::StatelessBatchDelete { + is_sum_tree, + estimated_key_size, + estimated_value_size, + } => GroveDb::average_case_delete_operation_for_delete::( + &KeyInfoPath::from_known_owned_path(path.to_vec()), + &KeyInfo::KnownKey(key.to_vec()), + is_sum_tree, + false, + true, + 0, + (estimated_key_size, estimated_value_size), + &drive_version.grove_version, + ) + .map(|r| r.map(Some)), + BatchDeleteApplyType::StatefulBatchDelete { + is_known_to_be_subtree_with_sum, + } => self.grove.delete_operation_for_delete_internal( + (path.as_slice()).into(), + key.as_slice(), + &options, + is_known_to_be_subtree_with_sum, + ¤t_batch_operations.operations, + transaction, + &drive_version.grove_version, + ), + }; + + if let Some(delete_operation) = + push_drive_operation_result(delete_operation, drive_operations)? + { + // Add the delete operation to the batch of drive operations + drive_operations.push(GroveOperation(delete_operation)); + } + } + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use crate::util::grove_operations::QueryType; + use crate::util::test_helpers::setup::setup_drive; + use crate::{ + error::Error, + grovedb::{Element, PathQuery, Query}, + util::grove_operations::BatchDeleteApplyType, + }; + use assert_matches::assert_matches; + use grovedb::SizedQuery; + use grovedb_path::SubtreePath; + use platform_version::version::PlatformVersion; + + #[test] + fn test_batch_delete_items_in_path_query_success() { + // Set up a test drive instance and transaction + let drive = setup_drive(None); + let platform_version = PlatformVersion::latest(); + let transaction = drive.grove.start_transaction(); + + // Insert some elements that will be matched and deleted + let path = vec![b"root".to_vec()]; + let key = b"key".to_vec(); + let element = Element::new_item(b"value".to_vec()); + + drive + .grove_insert_empty_tree( + SubtreePath::empty(), + b"root", + Some(&transaction), + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected insert root tree"); + + drive + .grove + .insert( + path.as_slice(), + &key, + element.clone(), + None, + Some(&transaction), + &platform_version.drive.grove_version, + ) + .unwrap() + .expect("expected insert"); + + // Create a path query that matches the inserted elements + let mut query = Query::new(); + query.insert_key(key.clone()); + let path_query = PathQuery::new(path.clone(), SizedQuery::new(query, Some(1), None)); + + // Set up the apply type and drive operations vector + let apply_type = BatchDeleteApplyType::StatefulBatchDelete { + is_known_to_be_subtree_with_sum: None, + }; + let mut drive_operations = Vec::new(); + + // Call the function + drive + .batch_delete_items_in_path_query_v0( + &path_query, + true, + apply_type, + Some(&transaction), + &mut drive_operations, + &platform_version.drive, + ) + .expect("expected to batch delete items"); + + drive + .apply_batch_low_level_drive_operations( + None, + Some(&transaction), + drive_operations, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to apply operations"); + + // Commit the transaction + drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + // Verify the element has been deleted + let get_result = drive.grove_get( + path.as_slice().into(), + &key, + QueryType::StatefulQuery, + None, + &mut vec![], + &platform_version.drive, + ); + assert_matches!( + get_result, + Err(Error::GroveDB(grovedb::Error::PathKeyNotFound(_))) + ); + } + + #[test] + fn test_batch_delete_items_in_path_query_range_query() { + // Set up a test drive instance and transaction + let drive = setup_drive(None); + let platform_version = PlatformVersion::latest(); + let transaction = drive.grove.start_transaction(); + + // Insert the root tree + drive + .grove_insert_empty_tree( + SubtreePath::empty(), + b"root", + Some(&transaction), + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to insert root tree"); + + // Insert three elements with keys 1, 2, and 3 + let path = vec![b"root".to_vec()]; + let key1 = b"1".to_vec(); + let key2 = b"2".to_vec(); + let key3 = b"3".to_vec(); + let element = Element::new_item(b"value".to_vec()); + + drive + .grove + .insert( + path.as_slice(), + &key1, + element.clone(), + None, + Some(&transaction), + &platform_version.drive.grove_version, + ) + .unwrap() + .expect("expected insert for key 1"); + + drive + .grove + .insert( + path.as_slice(), + &key2, + element.clone(), + None, + Some(&transaction), + &platform_version.drive.grove_version, + ) + .unwrap() + .expect("expected insert for key 2"); + + drive + .grove + .insert( + path.as_slice(), + &key3, + element.clone(), + None, + Some(&transaction), + &platform_version.drive.grove_version, + ) + .unwrap() + .expect("expected insert for key 3"); + + // Create a range path query that matches keys less than 3 + let mut query = Query::new(); + query.insert_range_to(..b"3".to_vec()); + let path_query = PathQuery::new(path.clone(), SizedQuery::new(query, Some(100), None)); + + // Set up the apply type and drive operations vector + let apply_type = BatchDeleteApplyType::StatefulBatchDelete { + is_known_to_be_subtree_with_sum: None, + }; + let mut drive_operations = Vec::new(); + + // Call the function + drive + .batch_delete_items_in_path_query_v0( + &path_query, + true, + apply_type, + Some(&transaction), + &mut drive_operations, + &platform_version.drive, + ) + .expect("expected to batch delete items"); + + // Apply batch operations + drive + .apply_batch_low_level_drive_operations( + None, + Some(&transaction), + drive_operations, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to apply operations"); + + // Commit the transaction + drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + // Verify that keys 1 and 2 have been deleted + let get_result_1 = drive.grove_get( + path.as_slice().into(), + &key1, + QueryType::StatefulQuery, + None, + &mut vec![], + &platform_version.drive, + ); + assert_matches!( + get_result_1, + Err(Error::GroveDB(grovedb::Error::PathKeyNotFound(_))) + ); + + let get_result_2 = drive.grove_get( + path.as_slice().into(), + &key2, + QueryType::StatefulQuery, + None, + &mut vec![], + &platform_version.drive, + ); + assert_matches!( + get_result_2, + Err(Error::GroveDB(grovedb::Error::PathKeyNotFound(_))) + ); + + // Verify that key 3 is still there + let get_result_3 = drive.grove_get( + path.as_slice().into(), + &key3, + QueryType::StatefulQuery, + None, + &mut vec![], + &platform_version.drive, + ); + assert_matches!(get_result_3, Ok(Some(Element::Item(..)))); + } + + #[test] + fn test_batch_delete_items_in_path_query_no_elements() { + // Set up a test drive instance and transaction + let drive = setup_drive(None); + let platform_version = PlatformVersion::latest(); + let transaction = drive.grove.start_transaction(); + + // Create the root tree to allow querying it + drive + .grove_insert_empty_tree( + SubtreePath::empty(), + b"root", + Some(&transaction), + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to insert root tree"); + + // Create a path query that does not match any elements + let path = vec![b"root".to_vec()]; + let mut query = Query::new(); + query.insert_key(b"non_existent_key".to_vec()); + let path_query = PathQuery::new(path.clone(), SizedQuery::new(query, Some(1), None)); + + // Set up the apply type and drive operations vector + let apply_type = BatchDeleteApplyType::StatefulBatchDelete { + is_known_to_be_subtree_with_sum: None, + }; + let mut drive_operations = Vec::new(); + + // Call the function + drive + .batch_delete_items_in_path_query_v0( + &path_query, + true, + apply_type, + Some(&transaction), + &mut drive_operations, + &platform_version.drive, + ) + .expect("expected batch delete to succeed"); + + // Apply batch operations + drive + .apply_batch_low_level_drive_operations( + None, + Some(&transaction), + drive_operations, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to apply operations"); + + // Commit the transaction + drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + // Verify that no elements were deleted as no matching elements existed + let get_result = drive.grove_get( + path.as_slice().into(), + b"non_existent_key", + QueryType::StatefulQuery, + None, + &mut vec![], + &platform_version.drive, + ); + assert_matches!( + get_result, + Err(Error::GroveDB(grovedb::Error::PathKeyNotFound(_))) + ); + } + + #[test] + fn test_batch_delete_items_in_path_query_intermediate_path_missing() { + // Set up a test drive instance and transaction + let drive = setup_drive(None); + let platform_version = PlatformVersion::latest(); + let transaction = drive.grove.start_transaction(); + + // Create a path query with a missing intermediate path + let path = vec![b"missing_root".to_vec()]; + let mut query = Query::new(); + query.insert_key(b"key".to_vec()); + let path_query = PathQuery::new(path.clone(), SizedQuery::new(query, Some(1), None)); + + // Set up the apply type and drive operations vector + let apply_type = BatchDeleteApplyType::StatefulBatchDelete { + is_known_to_be_subtree_with_sum: None, + }; + let mut drive_operations = Vec::new(); + + // Call the function with error_if_intermediate_path_tree_not_present set to true + let result = drive.batch_delete_items_in_path_query_v0( + &path_query, + true, + apply_type, + Some(&transaction), + &mut drive_operations, + &platform_version.drive, + ); + + // Assert failure due to missing intermediate path + assert_matches!( + result, + Err(Error::GroveDB(grovedb::Error::PathParentLayerNotFound(_))) + ); + } + + #[test] + fn test_batch_delete_items_in_path_query_stateless_delete() { + // Set up a test drive instance and transaction + let drive = setup_drive(None); + let platform_version = PlatformVersion::latest(); + let transaction = drive.grove.start_transaction(); + + // Insert some elements that will be matched and deleted + let path = vec![b"root".to_vec()]; + let key = b"key".to_vec(); + let element = Element::new_item(b"value".to_vec()); + + // Insert the root tree + drive + .grove_insert_empty_tree( + SubtreePath::empty(), + b"root", + Some(&transaction), + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to insert root tree"); + + // Insert an item in the tree + drive + .grove + .insert( + path.as_slice(), + &key, + element.clone(), + None, + Some(&transaction), + &platform_version.drive.grove_version, + ) + .unwrap() + .expect("expected insert"); + + // Create a path query that matches the inserted elements + let mut query = Query::new(); + query.insert_key(key.clone()); + let path_query = PathQuery::new(path.clone(), SizedQuery::new(query, Some(1), None)); + + // Set up the stateless apply type with estimated sizes + let apply_type = BatchDeleteApplyType::StatelessBatchDelete { + is_sum_tree: false, + estimated_key_size: key.len() as u32, + estimated_value_size: element + .serialized_size(&platform_version.drive.grove_version) + .unwrap() as u32, + }; + let mut drive_operations = Vec::new(); + + // Call the function + drive + .batch_delete_items_in_path_query_v0( + &path_query, + true, + apply_type, + Some(&transaction), + &mut drive_operations, + &platform_version.drive, + ) + .expect("expected to batch delete items"); + + // Apply batch operations + drive + .apply_batch_low_level_drive_operations( + None, + Some(&transaction), + drive_operations, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to apply operations"); + + // Commit the transaction + drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + // Verify the element has been deleted + let get_result = drive.grove_get( + path.as_slice().into(), + &key, + QueryType::StatefulQuery, + None, + &mut vec![], + &platform_version.drive, + ); + assert_matches!( + get_result, + Err(Error::GroveDB(grovedb::Error::PathKeyNotFound(_))) + ); + } +} diff --git a/packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists/mod.rs index d14f1e2773..c08390ba86 100644 --- a/packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists/mod.rs @@ -23,7 +23,7 @@ impl Drive { /// * `drive_version`: The drive version to select the correct function version to run. /// /// # Returns - /// * `Ok(bool)` if the operation was successful. Returns true if the path key already exists without references. + /// * `Ok(bool)` if the operation was successful. Returns true if we were able to insert. /// * `Err(DriveError::UnknownVersionMismatch)` if the drive version does not match known versions. /// * `Err(DriveError::CorruptedCodeExecution)` if the operation is not supported. pub fn batch_insert_if_not_exists( diff --git a/packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists/v0/mod.rs index 8bacd80606..8fc5c16c5b 100644 --- a/packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists/v0/mod.rs @@ -15,7 +15,7 @@ use grovedb::{GroveDb, TransactionArg}; impl Drive { /// Pushes an "insert element if the path key does not yet exist" operation to `drive_operations`. - /// Returns true if the path key already exists without references. + /// Returns true if we inserted. pub(crate) fn batch_insert_if_not_exists_v0( &self, path_key_element_info: PathKeyElementInfo, diff --git a/packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists_return_existing_element/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists_return_existing_element/mod.rs new file mode 100644 index 0000000000..df437be5b2 --- /dev/null +++ b/packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists_return_existing_element/mod.rs @@ -0,0 +1,69 @@ +mod v0; + +use crate::util::grove_operations::BatchInsertApplyType; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::object_size_info::PathKeyElementInfo; + +use dpp::version::drive_versions::DriveVersion; +use grovedb::{Element, TransactionArg}; + +impl Drive { + /// Pushes an "insert element if the path key does not yet exist" operation to `drive_operations` + /// and returns the existing element if it already exists. + /// + /// This function attempts to insert a new element into the database at a specified path and key. + /// If an element already exists at the given path and key, it returns the existing element without inserting the new one. + /// If the element does not exist, it inserts the new element and returns `Ok(None)`. + /// + /// The function dynamically selects the appropriate implementation version based on the provided `drive_version`. + /// + /// # Parameters + /// + /// * `path_key_element_info`: Information about the path, key, and element to be inserted. + /// - Supports various configurations including direct references, owned elements, fixed-size keys, and estimated sizes. + /// * `apply_type`: Defines whether the operation is stateless or stateful, influencing how the insertion is handled. + /// * `transaction`: The transaction context in which the operation will be executed. + /// * `drive_operations`: A mutable reference to the list of drive operations where this operation will be appended. + /// * `drive_version`: The version of the drive being used, determining which function version to execute. + /// + /// # Returns + /// + /// * `Ok(Some(Element))`: If an element already exists at the specified path and key, it returns the existing element. + /// * `Ok(None)`: If the element was successfully inserted because it did not exist before. + /// * `Err(Error)`: Returns an error if: + /// - The drive version provided is not supported (`Error::Drive(DriveError::UnknownVersionMismatch)`). + /// - The operation is not supported in the current state due to invalid configurations or unsupported features (`Error::Drive(DriveError::NotSupportedPrivate)`). + /// + /// # Errors + /// + /// * `Error::Drive(DriveError::UnknownVersionMismatch)`: If the provided drive version is not supported by this function. + /// * `Error::Drive(DriveError::NotSupportedPrivate)`: If the function encounters unsupported configurations such as unknown element sizes for batch operations. + /// + pub fn batch_insert_if_not_exists_return_existing_element( + &self, + path_key_element_info: PathKeyElementInfo, + apply_type: BatchInsertApplyType, + transaction: TransactionArg, + drive_operations: &mut Vec, + drive_version: &DriveVersion, + ) -> Result, Error> { + match drive_version.grove_methods.batch.batch_insert_if_not_exists { + 0 => self.batch_insert_if_not_exists_return_existing_element_v0( + path_key_element_info, + apply_type, + transaction, + drive_operations, + drive_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "batch_insert_if_not_exists_return_existing_element".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists_return_existing_element/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists_return_existing_element/v0/mod.rs new file mode 100644 index 0000000000..55f411caeb --- /dev/null +++ b/packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists_return_existing_element/v0/mod.rs @@ -0,0 +1,165 @@ +use crate::util::grove_operations::BatchInsertApplyType; +use crate::util::object_size_info::PathKeyElementInfo::{ + PathFixedSizeKeyRefElement, PathKeyElement, PathKeyElementSize, PathKeyRefElement, + PathKeyUnknownElementSize, +}; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::fees::op::LowLevelDriveOperation::CalculatedCostOperation; +use crate::util::object_size_info::PathKeyElementInfo; +use dpp::version::drive_versions::DriveVersion; +use grovedb::{Element, GroveDb, TransactionArg}; + +impl Drive { + /// Version 0 implementation of the "insert element if the path key does not yet exist" operation. + /// If the element already exists, it returns the existing element. + /// + /// This function checks whether an element exists at a specified path and key. + /// If the element exists, it returns the existing element. If not, it inserts the new element + /// into the database and returns `None`. This operation supports different types of path, key, and element configurations + /// and can be applied in either stateless or stateful contexts. + /// + /// # Parameters + /// + /// * `path_key_element_info`: Information about the path, key, and element to insert. + /// - Supports multiple configurations: direct references, owned elements, fixed size keys, or estimated sizes. + /// * `apply_type`: The application type of the operation, defining whether the operation is stateless or stateful. + /// * `transaction`: The transaction context for the operation, allowing it to be atomic within a batch. + /// * `drive_operations`: A mutable reference to the list of drive operations to which this operation will be appended. + /// * `drive_version`: The version of the drive being used, ensuring compatibility with the function version. + /// + /// # Returns + /// + /// * `Ok(Some(Element))`: If the element already exists at the specified path and key, returning the existing element. + /// * `Ok(None)`: If the element was successfully inserted because it did not exist before. + /// * `Err(Error)`: Returns an error if: + /// - The insertion operation is not supported in the current state. + /// - The operation encounters any unexpected issues related to invalid configurations or unsupported features. + /// + /// # Errors + /// + /// * `Error::Drive(DriveError::NotSupportedPrivate)`: If the function encounters unsupported configurations, such as document sizes for stateful inserts. + /// * `Error::Drive(DriveError::UnknownVersionMismatch)`: If the drive version is not supported for the operation. + /// + /// # PathKeyElementInfo Variants + /// + /// The function supports various `PathKeyElementInfo` variants: + /// * `PathKeyRefElement`: Reference to the path, key, and element. + /// * `PathKeyElement`: Owned path, key, and element. + /// * `PathFixedSizeKeyRefElement`: Reference to the path with a fixed-size key and element. + /// * `PathKeyElementSize`: Path and key with known element size, used for estimation. + /// * `PathKeyUnknownElementSize`: Unsupported in this version and returns an error. + pub(super) fn batch_insert_if_not_exists_return_existing_element_v0( + &self, + path_key_element_info: PathKeyElementInfo, + apply_type: BatchInsertApplyType, + transaction: TransactionArg, + drive_operations: &mut Vec, + drive_version: &DriveVersion, + ) -> Result, Error> { + match path_key_element_info { + PathKeyRefElement((path, key, element)) => { + // Check if the element already exists + let existing_element = self.grove_get_raw_optional( + path.as_slice().into(), + key, + apply_type.to_direct_query_type(), + transaction, + drive_operations, + drive_version, + )?; + if let Some(existing_element) = existing_element { + return Ok(Some(existing_element)); + } + + // Element does not exist, proceed with insertion + drive_operations.push(LowLevelDriveOperation::insert_for_known_path_key_element( + path, + key.to_vec(), + element, + )); + Ok(None) + } + PathKeyElement((path, key, element)) => { + // Check if the element already exists + let existing_element = self.grove_get_raw_optional( + path.as_slice().into(), + key.as_slice(), + apply_type.to_direct_query_type(), + transaction, + drive_operations, + drive_version, + )?; + if let Some(existing_element) = existing_element { + return Ok(Some(existing_element)); + } + + // Element does not exist, proceed with insertion + drive_operations.push(LowLevelDriveOperation::insert_for_known_path_key_element( + path, key, element, + )); + Ok(None) + } + PathFixedSizeKeyRefElement((path, key, element)) => { + // Check if the element already exists + let existing_element = self.grove_get_raw_optional( + path.as_slice().into(), + key, + apply_type.to_direct_query_type(), + transaction, + drive_operations, + drive_version, + )?; + if let Some(existing_element) = existing_element { + return Ok(Some(existing_element)); + } + + // Element does not exist, proceed with insertion + let path_items: Vec> = path.into_iter().map(Vec::from).collect(); + drive_operations.push(LowLevelDriveOperation::insert_for_known_path_key_element( + path_items, + key.to_vec(), + element, + )); + Ok(None) + } + PathKeyElementSize((key_info_path, key_info, element)) => { + match apply_type { + BatchInsertApplyType::StatelessBatchInsert { + in_tree_using_sums, .. + } => { + // Estimate if the element with the given size already exists + drive_operations.push(CalculatedCostOperation( + GroveDb::average_case_for_has_raw( + &key_info_path, + &key_info, + element.serialized_size(&drive_version.grove_version)? as u32, + in_tree_using_sums, + &drive_version.grove_version, + )?, + )); + drive_operations.push( + LowLevelDriveOperation::insert_for_estimated_path_key_element( + key_info_path, + key_info, + element, + ), + ); + Ok(None) + } + BatchInsertApplyType::StatefulBatchInsert => { + Err(Error::Drive(DriveError::NotSupportedPrivate( + "document sizes for stateful insert in batch operations not supported", + ))) + } + } + } + PathKeyUnknownElementSize(_) => Err(Error::Drive(DriveError::NotSupportedPrivate( + "document sizes in batch operations not supported", + ))), + } + } +} diff --git a/packages/rs-drive/src/util/grove_operations/batch_insert_sum_item_or_add_to_if_already_exists/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_insert_sum_item_or_add_to_if_already_exists/mod.rs new file mode 100644 index 0000000000..87331adad0 --- /dev/null +++ b/packages/rs-drive/src/util/grove_operations/batch_insert_sum_item_or_add_to_if_already_exists/mod.rs @@ -0,0 +1,58 @@ +mod v0; + +use crate::util::grove_operations::BatchInsertApplyType; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::object_size_info::PathKeyElementInfo; + +use dpp::version::drive_versions::DriveVersion; +use grovedb::TransactionArg; + +impl Drive { + /// Pushes an "insert sum item or add to it if the item already exists" operation to `drive_operations`. + /// This operation either inserts a new sum item at the given path and key or adds the value to the existing sum item. + /// + /// # Parameters + /// * `path_key_element_info`: Information about the path, key, and element. + /// * `apply_type`: The apply type for the operation. + /// * `transaction`: The transaction argument for the operation. + /// * `drive_operations`: The list of drive operations to append to. + /// * `drive_version`: The drive version to select the correct function version to run. + /// + /// # Returns + /// * `Ok(())` if the operation was successful. + /// * `Err(DriveError::UnknownVersionMismatch)` if the drive version does not match known versions. + /// * `Err(DriveError::CorruptedCodeExecution)` (rare) if the operation is not supported. + /// * `Err(DriveError::CorruptedElementType)` (rare) if drive is in a corrupted state and + /// gives back an incorrect element type. + pub fn batch_insert_sum_item_or_add_to_if_already_exists( + &self, + path_key_element_info: PathKeyElementInfo, + apply_type: BatchInsertApplyType, + transaction: TransactionArg, + drive_operations: &mut Vec, + drive_version: &DriveVersion, + ) -> Result<(), Error> { + match drive_version + .grove_methods + .batch + .batch_insert_sum_item_or_add_to_if_already_exists + { + 0 => self.batch_insert_sum_item_or_add_to_if_already_exists_v0( + path_key_element_info, + apply_type, + transaction, + drive_operations, + drive_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "batch_insert_sum_item_or_add_to_if_already_exists".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/util/grove_operations/batch_insert_sum_item_or_add_to_if_already_exists/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_insert_sum_item_or_add_to_if_already_exists/v0/mod.rs new file mode 100644 index 0000000000..8294a6786b --- /dev/null +++ b/packages/rs-drive/src/util/grove_operations/batch_insert_sum_item_or_add_to_if_already_exists/v0/mod.rs @@ -0,0 +1,220 @@ +use crate::util::grove_operations::BatchInsertApplyType; +use crate::util::object_size_info::PathKeyElementInfo::{ + PathFixedSizeKeyRefElement, PathKeyElement, PathKeyElementSize, PathKeyRefElement, + PathKeyUnknownElementSize, +}; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::fees::op::LowLevelDriveOperation::CalculatedCostOperation; +use crate::util::object_size_info::PathKeyElementInfo; +use dpp::version::drive_versions::DriveVersion; +use dpp::ProtocolError; +use grovedb::{Element, GroveDb, TransactionArg}; + +impl Drive { + /// Version 0 implementation of the "insert sum item or add to it if the item already exists" operation. + /// This operation either inserts a new sum item at the given path and key or adds the value to the existing sum item. + /// + /// # Parameters + /// * `path_key_element_info`: Information about the path, key, and element. + /// * `apply_type`: The apply type for the operation. + /// * `transaction`: The transaction argument for the operation. + /// * `drive_operations`: The list of drive operations to append to. + /// * `drive_version`: The drive version to select the correct function version to run. + /// + /// # Returns + /// * `Ok(())` if the operation was successful. + /// * `Err(DriveError::CorruptedCodeExecution)` if the operation is not supported. + pub(crate) fn batch_insert_sum_item_or_add_to_if_already_exists_v0( + &self, + path_key_element_info: PathKeyElementInfo, + apply_type: BatchInsertApplyType, + transaction: TransactionArg, + drive_operations: &mut Vec, + drive_version: &DriveVersion, + ) -> Result<(), Error> { + match path_key_element_info { + PathKeyRefElement((path, key, element)) => { + if let Element::SumItem(new_value, _) = element { + // Check if the sum item already exists + let existing_element = self.grove_get_raw_optional( + path.as_slice().into(), + key, + apply_type.to_direct_query_type(), + transaction, + drive_operations, + drive_version, + )?; + + if let Some(Element::SumItem(existing_value, _)) = existing_element { + // Add to the existing sum item + let updated_value = existing_value + .checked_add(new_value) + .ok_or(ProtocolError::Overflow("overflow when adding to sum item"))?; + drive_operations.push( + LowLevelDriveOperation::insert_for_known_path_key_element( + path, + key.to_vec(), + Element::new_sum_item(updated_value), + ), + ); + } else if existing_element.is_some() { + return Err(Error::Drive(DriveError::CorruptedElementType( + "expected sum item element type", + ))); + } else { + // Insert as a new sum item + drive_operations.push( + LowLevelDriveOperation::insert_for_known_path_key_element( + path, + key.to_vec(), + Element::new_sum_item(new_value), + ), + ); + } + } else { + return Err(Error::Drive(DriveError::CorruptedCodeExecution( + "expected sum item element type", + ))); + } + Ok(()) + } + PathKeyElement((path, key, element)) => { + if let Element::SumItem(new_value, _) = element { + // Check if the sum item already exists + let existing_element = self.grove_get_raw_optional( + path.as_slice().into(), + key.as_slice(), + apply_type.to_direct_query_type(), + transaction, + drive_operations, + drive_version, + )?; + + if let Some(Element::SumItem(existing_value, _)) = existing_element { + // Add to the existing sum item + let updated_value = existing_value + .checked_add(new_value) + .ok_or(ProtocolError::Overflow("overflow when adding to sum item"))?; + drive_operations.push( + LowLevelDriveOperation::insert_for_known_path_key_element( + path, + key, + Element::new_sum_item(updated_value), + ), + ); + } else if existing_element.is_some() { + return Err(Error::Drive(DriveError::CorruptedElementType( + "expected sum item element type", + ))); + } else { + // Insert as a new sum item + drive_operations.push( + LowLevelDriveOperation::insert_for_known_path_key_element( + path, + key, + Element::new_sum_item(new_value), + ), + ); + } + } else { + return Err(Error::Drive(DriveError::CorruptedCodeExecution( + "expected sum item element type", + ))); + } + Ok(()) + } + PathFixedSizeKeyRefElement((path, key, element)) => { + if let Element::SumItem(new_value, _) = element { + // Check if the sum item already exists + let existing_element = self.grove_get_raw_optional( + path.as_slice().into(), + key, + apply_type.to_direct_query_type(), + transaction, + drive_operations, + drive_version, + )?; + + if let Some(Element::SumItem(existing_value, _)) = existing_element { + // Add to the existing sum item + let updated_value = existing_value + .checked_add(new_value) + .ok_or(ProtocolError::Overflow("overflow when adding to sum item"))?; + let path_items: Vec> = path.into_iter().map(Vec::from).collect(); + drive_operations.push( + LowLevelDriveOperation::insert_for_known_path_key_element( + path_items, + key.to_vec(), + Element::new_sum_item(updated_value), + ), + ); + } else if existing_element.is_some() { + return Err(Error::Drive(DriveError::CorruptedElementType( + "expected sum item element type", + ))); + } else { + // Insert as a new sum item + let path_items: Vec> = path.into_iter().map(Vec::from).collect(); + drive_operations.push( + LowLevelDriveOperation::insert_for_known_path_key_element( + path_items, + key.to_vec(), + Element::new_sum_item(new_value), + ), + ); + } + } else { + return Err(Error::Drive(DriveError::CorruptedCodeExecution( + "expected sum item element type", + ))); + } + Ok(()) + } + PathKeyElementSize((key_info_path, key_info, element)) => { + if let Element::SumItem(new_value, _) = element { + match apply_type { + BatchInsertApplyType::StatelessBatchInsert { + in_tree_using_sums, .. + } => { + // Estimate if the sum item with the given size already exists + drive_operations.push(CalculatedCostOperation( + GroveDb::average_case_for_has_raw( + &key_info_path, + &key_info, + element.serialized_size(&drive_version.grove_version)? as u32, + in_tree_using_sums, + &drive_version.grove_version, + )?, + )); + + drive_operations.push( + LowLevelDriveOperation::insert_for_estimated_path_key_element( + key_info_path, + key_info, + Element::new_sum_item(new_value), + ), + ); + Ok(()) + } + BatchInsertApplyType::StatefulBatchInsert => { + Err(Error::Drive(DriveError::NotSupportedPrivate( + "document sizes for stateful insert in batch operations not supported", + ))) + } + } + } else { + Err(Error::Drive(DriveError::CorruptedCodeExecution( + "expected sum item element type", + ))) + } + } + PathKeyUnknownElementSize(_) => Err(Error::Drive(DriveError::NotSupportedPrivate( + "document sizes in batch operations not supported", + ))), + } + } +} diff --git a/packages/rs-drive/src/util/grove_operations/grove_get_sum_tree_total_value/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_get_sum_tree_total_value/v0/mod.rs index a2a27c7c64..65bd03f3e3 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_get_sum_tree_total_value/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_get_sum_tree_total_value/v0/mod.rs @@ -14,7 +14,7 @@ use platform_version::version::drive_versions::DriveVersion; impl Drive { /// Gets the element at the given path from groveDB. /// Pushes the `OperationCost` of getting the element to `drive_operations`. - pub(crate) fn grove_get_sum_tree_total_value_v0>( + pub(super) fn grove_get_sum_tree_total_value_v0>( &self, path: SubtreePath<'_, B>, key: &[u8], diff --git a/packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists_return_existing_element/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists_return_existing_element/mod.rs new file mode 100644 index 0000000000..8c5455a038 --- /dev/null +++ b/packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists_return_existing_element/mod.rs @@ -0,0 +1,54 @@ +//todo: uncomment once version 2.1 of GroveDB is released. +// mod v0; +// +// use crate::drive::Drive; +// use crate::error::drive::DriveError; +// use crate::error::Error; +// use crate::fees::op::LowLevelDriveOperation; +// use dpp::version::drive_versions::DriveVersion; +// use grovedb::{Element, TransactionArg}; +// use grovedb_path::SubtreePath; +// +// impl Drive { +// /// Inserts an element into groveDB only if the specified path and key do not exist. +// /// This operation costs are then stored in `drive_operations`. +// /// +// /// # Parameters +// /// * `path`: The groveDB hierarchical authenticated structure path where the new element is to be inserted. +// /// * `key`: The key where the new element should be inserted in the subtree. +// /// * `element`: The element to be inserted. +// /// * `transaction`: The groveDB transaction associated with this operation. +// /// * `drive_operations`: A vector to collect the costs of operations for later computation. In this case, +// /// it collects the cost of this insert operation if the path and key did not exist. +// /// * `platform_version`: The platform version to select the correct function version to run. +// /// +// /// # Returns +// /// * `Ok(true)` if the insertion was successful. +// /// * `Ok(false)` if the path and key already existed. +// /// * `Err(DriveError::UnknownVersionMismatch)` if the platform version does not match known versions. +// pub fn grove_insert_if_not_exists_return_existing_element>( +// &self, +// path: SubtreePath<'_, B>, +// key: &[u8], +// element: Element, +// transaction: TransactionArg, +// drive_operations: Option<&mut Vec>, +// drive_version: &DriveVersion, +// ) -> Result, Error> { +// match drive_version.grove_methods.basic.grove_insert_if_not_exists { +// 0 => self.grove_insert_if_not_exists_return_existing_element_v0( +// path, +// key, +// element, +// transaction, +// drive_operations, +// drive_version, +// ), +// version => Err(Error::Drive(DriveError::UnknownVersionMismatch { +// method: "grove_insert_if_not_exists_return_existing_element".to_string(), +// known_versions: vec![0], +// received: version, +// })), +// } +// } +// } diff --git a/packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists_return_existing_element/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists_return_existing_element/v0/mod.rs new file mode 100644 index 0000000000..5030cd6cc5 --- /dev/null +++ b/packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists_return_existing_element/v0/mod.rs @@ -0,0 +1,30 @@ +// use crate::drive::Drive; +// use crate::error::Error; +// use crate::fees::op::LowLevelDriveOperation; +// use crate::util::grove_operations::push_drive_operation_result_optional; +// use grovedb::{Element, TransactionArg}; +// use grovedb_path::SubtreePath; +// use platform_version::version::drive_versions::DriveVersion; +// +// impl Drive { +// /// Pushes the `OperationCost` of inserting an element in groveDB where the path key does not yet exist +// /// to `drive_operations`. +// pub(crate) fn grove_insert_if_not_exists_return_existing_element_v0>( +// &self, +// path: SubtreePath<'_, B>, +// key: &[u8], +// element: Element, +// transaction: TransactionArg, +// drive_operations: Option<&mut Vec>, +// drive_version: &DriveVersion, +// ) -> Result { +// let cost_context = self.grove.insert_if_not_exists_return_existing_element( +// path, +// key, +// element, +// transaction, +// &drive_version.grove_version, +// ); +// push_drive_operation_result_optional(cost_context, drive_operations) +// } +// } diff --git a/packages/rs-drive/src/util/grove_operations/mod.rs b/packages/rs-drive/src/util/grove_operations/mod.rs index a328aa8efb..9861e14648 100644 --- a/packages/rs-drive/src/util/grove_operations/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/mod.rs @@ -108,10 +108,24 @@ pub mod grove_batch_operations_costs; /// Clear a subtree in grovedb pub mod grove_clear; +/// Provides functionality to delete items in a path based on a query. +pub mod batch_delete_items_in_path_query; + +/// Inserts an element if it does not exist and returns the existing element if it does. +pub mod batch_insert_if_not_exists_return_existing_element; + +/// Inserts a sum item or adds to it if it already exists. +pub mod batch_insert_sum_item_or_add_to_if_already_exists; + +/// Retrieves serialized or sum results from a path query in GroveDB. mod grove_get_path_query_serialized_or_sum_results; -/// Proved path query in grovedb with a conditional query + +/// Executes a proved path query in GroveDB with an optional conditional query. pub mod grove_get_proved_path_query_with_conditional; +/// Inserts an element if it does not exist and returns the existing element if it does in GroveDB. +pub mod grove_insert_if_not_exists_return_existing_element; + use grovedb_costs::CostContext; use grovedb::EstimatedLayerInformation; diff --git a/packages/rs-json-schema-compatibility-validator/Cargo.toml b/packages/rs-json-schema-compatibility-validator/Cargo.toml index d31332bb20..bc90fffebe 100644 --- a/packages/rs-json-schema-compatibility-validator/Cargo.toml +++ b/packages/rs-json-schema-compatibility-validator/Cargo.toml @@ -8,7 +8,7 @@ authors = ["Ivan Shumkov "] [dependencies] json-patch = "1.2.0" serde_json = "1.0.115" -thiserror = "1.0.58" +thiserror = "1.0.64" once_cell = "1.19.0" [dev-dependencies] diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index 604a4dae4b..f60a9a15a0 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -10,7 +10,7 @@ license = "MIT" [dependencies] bincode = { version = "2.0.0-rc.3", features = ["serde"] } ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined", optional = true } -thiserror = "1.0.58" +thiserror = "1.0.64" bs58 = "0.5.1" base64 = "0.22.1" hex = "0.4.3" diff --git a/packages/rs-platform-version/src/version/dpp_versions.rs b/packages/rs-platform-version/src/version/dpp_versions.rs index b42befd472..7c84e660a4 100644 --- a/packages/rs-platform-version/src/version/dpp_versions.rs +++ b/packages/rs-platform-version/src/version/dpp_versions.rs @@ -271,4 +271,5 @@ pub struct DocumentMethodVersions { #[derive(Clone, Debug, Default)] pub struct DPPMethodVersions { pub epoch_core_reward_credits_for_distribution: FeatureVersion, + pub daily_withdrawal_limit: FeatureVersion, } diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index 3d60df5736..22905e5ce5 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -5,6 +5,7 @@ pub struct DriveAbciVersion { pub structs: DriveAbciStructureVersions, pub methods: DriveAbciMethodVersions, pub validation_and_processing: DriveAbciValidationVersions, + pub withdrawal_constants: DriveAbciWithdrawalConstants, pub query: DriveAbciQueryVersions, } @@ -112,6 +113,12 @@ pub struct DriveAbciValidationVersions { pub event_constants: DriveAbciValidationConstants, } +#[derive(Clone, Debug, Default)] +pub struct DriveAbciWithdrawalConstants { + pub core_expiration_blocks: u32, + pub cleanup_expired_locks_of_withdrawal_amounts_limit: u16, +} + #[derive(Clone, Debug, Default)] pub struct DriveAbciValidationConstants { pub maximum_vote_polls_to_process: u16, @@ -332,12 +339,14 @@ pub struct DriveAbciIdentityCreditWithdrawalMethodVersions { pub pool_withdrawals_into_transactions_queue: FeatureVersion, pub update_broadcasted_withdrawal_statuses: FeatureVersion, pub append_signatures_and_broadcast_withdrawal_transactions: FeatureVersion, + pub cleanup_expired_locks_of_withdrawal_amounts: FeatureVersion, } #[derive(Clone, Debug, Default)] pub struct DriveAbciProtocolUpgradeMethodVersions { pub check_for_desired_protocol_upgrade: FeatureVersion, pub upgrade_protocol_version_on_epoch_change: FeatureVersion, + pub perform_events_on_first_block_of_protocol_change: OptionalFeatureVersion, pub protocol_version_upgrade_percentage_needed: u64, } diff --git a/packages/rs-platform-version/src/version/drive_versions.rs b/packages/rs-platform-version/src/version/drive_versions.rs index 5e67347b44..c4bb57124c 100644 --- a/packages/rs-platform-version/src/version/drive_versions.rs +++ b/packages/rs-platform-version/src/version/drive_versions.rs @@ -431,6 +431,7 @@ pub struct DriveGroveBasicMethodVersions { pub grove_insert_empty_tree: FeatureVersion, pub grove_insert_empty_sum_tree: FeatureVersion, pub grove_insert_if_not_exists: FeatureVersion, + pub grove_insert_if_not_exists_return_existing_element: FeatureVersion, pub grove_clear: FeatureVersion, pub grove_delete: FeatureVersion, pub grove_get_raw: FeatureVersion, @@ -454,11 +455,13 @@ pub struct DriveGroveBatchMethodVersions { pub batch_insert_empty_tree: FeatureVersion, pub batch_insert_empty_tree_if_not_exists: FeatureVersion, pub batch_insert_empty_tree_if_not_exists_check_existing_operations: FeatureVersion, + pub batch_insert_sum_item_or_add_to_if_already_exists: FeatureVersion, pub batch_insert: FeatureVersion, pub batch_insert_if_not_exists: FeatureVersion, pub batch_insert_if_changed_value: FeatureVersion, pub batch_replace: FeatureVersion, pub batch_delete: FeatureVersion, + pub batch_delete_items_in_path_query: FeatureVersion, pub batch_remove_raw: FeatureVersion, pub batch_delete_up_tree_while_empty: FeatureVersion, pub batch_refresh_reference: FeatureVersion, @@ -562,12 +565,13 @@ pub struct DriveIdentityMethodVersions { pub struct DriveIdentityWithdrawalMethodVersions { pub document: DriveIdentityWithdrawalDocumentMethodVersions, pub transaction: DriveIdentityWithdrawalTransactionMethodVersions, + pub calculate_current_withdrawal_limit: FeatureVersion, } #[derive(Clone, Debug, Default)] pub struct DriveIdentityWithdrawalDocumentMethodVersions { pub fetch_oldest_withdrawal_documents_by_status: FeatureVersion, - pub find_up_to_100_withdrawal_documents_by_status_and_transaction_indices: FeatureVersion, + pub find_withdrawal_documents_by_status_and_transaction_indices: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/limits.rs b/packages/rs-platform-version/src/version/limits.rs index 207cde0d1e..ef15539565 100644 --- a/packages/rs-platform-version/src/version/limits.rs +++ b/packages/rs-platform-version/src/version/limits.rs @@ -5,4 +5,5 @@ pub struct SystemLimits { pub max_state_transition_size: u64, pub max_transitions_in_documents_batch: u16, pub withdrawal_transactions_per_block_limit: u16, + pub max_withdrawal_amount: u64, } diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index bb83ecba96..813ac270df 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -32,7 +32,7 @@ use crate::version::drive_abci_versions::{ DriveAbciStateTransitionValidationVersions, DriveAbciStructureVersions, DriveAbciValidationConstants, DriveAbciValidationDataTriggerAndBindingVersions, DriveAbciValidationDataTriggerVersions, DriveAbciValidationVersions, DriveAbciVersion, - DriveAbciVotingMethodVersions, PenaltyAmounts, + DriveAbciVotingMethodVersions, DriveAbciWithdrawalConstants, PenaltyAmounts, }; use crate::version::drive_versions::{ DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, @@ -465,7 +465,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { withdrawals: DriveIdentityWithdrawalMethodVersions { document: DriveIdentityWithdrawalDocumentMethodVersions { fetch_oldest_withdrawal_documents_by_status: 0, - find_up_to_100_withdrawal_documents_by_status_and_transaction_indices: 0, + find_withdrawal_documents_by_status_and_transaction_indices: 0, }, transaction: DriveIdentityWithdrawalTransactionMethodVersions { index: DriveIdentityWithdrawalTransactionIndexMethodVersions { @@ -477,6 +477,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { dequeue_untied_withdrawal_transactions: 0, }, }, + calculate_current_withdrawal_limit: 0, }, }, platform_system: DrivePlatformSystemMethodVersions { @@ -547,6 +548,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { grove_insert_empty_tree: 0, grove_insert_empty_sum_tree: 0, grove_insert_if_not_exists: 0, + grove_insert_if_not_exists_return_existing_element: 0, grove_clear: 0, grove_delete: 0, grove_get_raw: 0, @@ -568,11 +570,13 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { batch_insert_empty_tree: 0, batch_insert_empty_tree_if_not_exists: 0, batch_insert_empty_tree_if_not_exists_check_existing_operations: 0, + batch_insert_sum_item_or_add_to_if_already_exists: 0, batch_insert: 0, batch_insert_if_not_exists: 0, batch_insert_if_changed_value: 0, batch_replace: 0, batch_delete: 0, + batch_delete_items_in_path_query: 0, batch_remove_raw: 0, batch_delete_up_tree_while_empty: 0, batch_refresh_reference: 0, @@ -636,6 +640,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { check_for_desired_protocol_upgrade: 0, upgrade_protocol_version_on_epoch_change: 0, + perform_events_on_first_block_of_protocol_change: None, protocol_version_upgrade_percentage_needed: 75, }, block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { @@ -670,6 +675,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { pool_withdrawals_into_transactions_queue: 0, update_broadcasted_withdrawal_statuses: 0, append_signatures_and_broadcast_withdrawal_transactions: 0, + cleanup_expired_locks_of_withdrawal_amounts: 0, }, voting: DriveAbciVotingMethodVersions { keep_record_of_finished_contested_resource_vote_poll: 0, @@ -843,6 +849,10 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { maximum_contenders_to_consider: 100, }, }, + withdrawal_constants: DriveAbciWithdrawalConstants { + core_expiration_blocks: 24, + cleanup_expired_locks_of_withdrawal_amounts_limit: 0, + }, query: DriveAbciQueryVersions { max_returned_elements: 100, response_metadata: 0, @@ -1264,7 +1274,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { default_current_version: 0, }, }, - methods: DPPMethodVersions { epoch_core_reward_credits_for_distribution: 0 }, + methods: DPPMethodVersions { epoch_core_reward_credits_for_distribution: 0, daily_withdrawal_limit: 0 }, }, system_data_contracts: SystemDataContractVersions { withdrawals: 1, @@ -1280,6 +1290,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { max_state_transition_size: 20000, max_transitions_in_documents_batch: 1, withdrawal_transactions_per_block_limit: 4, + max_withdrawal_amount: 50_000_000_000_000, }, consensus: ConsensusVersions { tenderdash_consensus_version: 0, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index d136677129..a81949c490 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -32,7 +32,7 @@ use crate::version::drive_abci_versions::{ DriveAbciStateTransitionValidationVersions, DriveAbciStructureVersions, DriveAbciValidationConstants, DriveAbciValidationDataTriggerAndBindingVersions, DriveAbciValidationDataTriggerVersions, DriveAbciValidationVersions, DriveAbciVersion, - DriveAbciVotingMethodVersions, PenaltyAmounts, + DriveAbciVotingMethodVersions, DriveAbciWithdrawalConstants, PenaltyAmounts, }; use crate::version::drive_versions::{ DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, @@ -465,7 +465,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { withdrawals: DriveIdentityWithdrawalMethodVersions { document: DriveIdentityWithdrawalDocumentMethodVersions { fetch_oldest_withdrawal_documents_by_status: 0, - find_up_to_100_withdrawal_documents_by_status_and_transaction_indices: 0, + find_withdrawal_documents_by_status_and_transaction_indices: 0, }, transaction: DriveIdentityWithdrawalTransactionMethodVersions { index: DriveIdentityWithdrawalTransactionIndexMethodVersions { @@ -477,6 +477,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { dequeue_untied_withdrawal_transactions: 0, }, }, + calculate_current_withdrawal_limit: 0, }, }, platform_system: DrivePlatformSystemMethodVersions { @@ -547,6 +548,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { grove_insert_empty_tree: 0, grove_insert_empty_sum_tree: 0, grove_insert_if_not_exists: 0, + grove_insert_if_not_exists_return_existing_element: 0, grove_clear: 0, grove_delete: 0, grove_get_raw: 0, @@ -568,11 +570,13 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { batch_insert_empty_tree: 0, batch_insert_empty_tree_if_not_exists: 0, batch_insert_empty_tree_if_not_exists_check_existing_operations: 0, + batch_insert_sum_item_or_add_to_if_already_exists: 0, batch_insert: 0, batch_insert_if_not_exists: 0, batch_insert_if_changed_value: 0, batch_replace: 0, batch_delete: 0, + batch_delete_items_in_path_query: 0, batch_remove_raw: 0, batch_delete_up_tree_while_empty: 0, batch_refresh_reference: 0, @@ -636,6 +640,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { check_for_desired_protocol_upgrade: 1, upgrade_protocol_version_on_epoch_change: 0, + perform_events_on_first_block_of_protocol_change: None, protocol_version_upgrade_percentage_needed: 67, }, block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { @@ -670,6 +675,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { pool_withdrawals_into_transactions_queue: 1, update_broadcasted_withdrawal_statuses: 0, append_signatures_and_broadcast_withdrawal_transactions: 0, + cleanup_expired_locks_of_withdrawal_amounts: 0, }, voting: DriveAbciVotingMethodVersions { keep_record_of_finished_contested_resource_vote_poll: 0, @@ -843,6 +849,10 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { maximum_contenders_to_consider: 100, }, }, + withdrawal_constants: DriveAbciWithdrawalConstants { + core_expiration_blocks: 24, + cleanup_expired_locks_of_withdrawal_amounts_limit: 64, + }, query: DriveAbciQueryVersions { max_returned_elements: 100, response_metadata: 0, @@ -1266,6 +1276,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, methods: DPPMethodVersions { epoch_core_reward_credits_for_distribution: 0, + daily_withdrawal_limit: 0, }, }, system_data_contracts: SystemDataContractVersions { @@ -1282,6 +1293,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { max_state_transition_size: 20480, //20 KiB max_transitions_in_documents_batch: 1, withdrawal_transactions_per_block_limit: 4, + max_withdrawal_amount: 50_000_000_000_000, }, consensus: ConsensusVersions { tenderdash_consensus_version: 1, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index b9d9eda464..9ea4fad720 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -32,7 +32,7 @@ use crate::version::drive_abci_versions::{ DriveAbciStateTransitionValidationVersions, DriveAbciStructureVersions, DriveAbciValidationConstants, DriveAbciValidationDataTriggerAndBindingVersions, DriveAbciValidationDataTriggerVersions, DriveAbciValidationVersions, DriveAbciVersion, - DriveAbciVotingMethodVersions, PenaltyAmounts, + DriveAbciVotingMethodVersions, DriveAbciWithdrawalConstants, PenaltyAmounts, }; use crate::version::drive_versions::{ DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, @@ -464,7 +464,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { withdrawals: DriveIdentityWithdrawalMethodVersions { document: DriveIdentityWithdrawalDocumentMethodVersions { fetch_oldest_withdrawal_documents_by_status: 0, - find_up_to_100_withdrawal_documents_by_status_and_transaction_indices: 0, + find_withdrawal_documents_by_status_and_transaction_indices: 0, }, transaction: DriveIdentityWithdrawalTransactionMethodVersions { index: DriveIdentityWithdrawalTransactionIndexMethodVersions { @@ -476,6 +476,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { dequeue_untied_withdrawal_transactions: 0, }, }, + calculate_current_withdrawal_limit: 0, }, }, platform_system: DrivePlatformSystemMethodVersions { @@ -546,6 +547,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { grove_insert_empty_tree: 0, grove_insert_empty_sum_tree: 0, grove_insert_if_not_exists: 0, + grove_insert_if_not_exists_return_existing_element: 0, grove_clear: 0, grove_delete: 0, grove_get_raw: 0, @@ -567,11 +569,13 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { batch_insert_empty_tree: 0, batch_insert_empty_tree_if_not_exists: 0, batch_insert_empty_tree_if_not_exists_check_existing_operations: 0, + batch_insert_sum_item_or_add_to_if_already_exists: 0, batch_insert: 0, batch_insert_if_not_exists: 0, batch_insert_if_changed_value: 0, batch_replace: 0, batch_delete: 0, + batch_delete_items_in_path_query: 0, batch_remove_raw: 0, batch_delete_up_tree_while_empty: 0, batch_refresh_reference: 0, @@ -635,6 +639,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { check_for_desired_protocol_upgrade: 0, upgrade_protocol_version_on_epoch_change: 0, + perform_events_on_first_block_of_protocol_change: None, protocol_version_upgrade_percentage_needed: 75, }, block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { @@ -669,6 +674,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { pool_withdrawals_into_transactions_queue: 0, update_broadcasted_withdrawal_statuses: 0, append_signatures_and_broadcast_withdrawal_transactions: 0, + cleanup_expired_locks_of_withdrawal_amounts: 0, }, voting: DriveAbciVotingMethodVersions { keep_record_of_finished_contested_resource_vote_poll: 0, @@ -842,6 +848,10 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { maximum_contenders_to_consider: 100, }, }, + withdrawal_constants: DriveAbciWithdrawalConstants { + core_expiration_blocks: 24, + cleanup_expired_locks_of_withdrawal_amounts_limit: 0, + }, query: DriveAbciQueryVersions { max_returned_elements: 100, response_metadata: 0, @@ -1265,6 +1275,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { }, methods: DPPMethodVersions { epoch_core_reward_credits_for_distribution: 0, + daily_withdrawal_limit: 0, }, }, system_data_contracts: SystemDataContractVersions { @@ -1281,6 +1292,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { max_state_transition_size: 20480, //20 KiB max_transitions_in_documents_batch: 1, withdrawal_transactions_per_block_limit: 4, + max_withdrawal_amount: 50_000_000_000_000, }, consensus: ConsensusVersions { tenderdash_consensus_version: 0, diff --git a/packages/rs-platform-version/src/version/v2.rs b/packages/rs-platform-version/src/version/v2.rs index 2f80cedf64..dc7b10212d 100644 --- a/packages/rs-platform-version/src/version/v2.rs +++ b/packages/rs-platform-version/src/version/v2.rs @@ -32,7 +32,7 @@ use crate::version::drive_abci_versions::{ DriveAbciStateTransitionValidationVersions, DriveAbciStructureVersions, DriveAbciValidationConstants, DriveAbciValidationDataTriggerAndBindingVersions, DriveAbciValidationDataTriggerVersions, DriveAbciValidationVersions, DriveAbciVersion, - DriveAbciVotingMethodVersions, PenaltyAmounts, + DriveAbciVotingMethodVersions, DriveAbciWithdrawalConstants, PenaltyAmounts, }; use crate::version::drive_versions::{ DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, @@ -464,7 +464,7 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion { withdrawals: DriveIdentityWithdrawalMethodVersions { document: DriveIdentityWithdrawalDocumentMethodVersions { fetch_oldest_withdrawal_documents_by_status: 0, - find_up_to_100_withdrawal_documents_by_status_and_transaction_indices: 0, + find_withdrawal_documents_by_status_and_transaction_indices: 0, }, transaction: DriveIdentityWithdrawalTransactionMethodVersions { index: DriveIdentityWithdrawalTransactionIndexMethodVersions { @@ -476,6 +476,7 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion { dequeue_untied_withdrawal_transactions: 0, }, }, + calculate_current_withdrawal_limit: 0, }, }, platform_system: DrivePlatformSystemMethodVersions { @@ -546,6 +547,7 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion { grove_insert_empty_tree: 0, grove_insert_empty_sum_tree: 0, grove_insert_if_not_exists: 0, + grove_insert_if_not_exists_return_existing_element: 0, grove_clear: 0, grove_delete: 0, grove_get_raw: 0, @@ -567,11 +569,13 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion { batch_insert_empty_tree: 0, batch_insert_empty_tree_if_not_exists: 0, batch_insert_empty_tree_if_not_exists_check_existing_operations: 0, + batch_insert_sum_item_or_add_to_if_already_exists: 0, batch_insert: 0, batch_insert_if_not_exists: 0, batch_insert_if_changed_value: 0, batch_replace: 0, batch_delete: 0, + batch_delete_items_in_path_query: 0, batch_remove_raw: 0, batch_delete_up_tree_while_empty: 0, batch_refresh_reference: 0, @@ -635,6 +639,7 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion { protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { check_for_desired_protocol_upgrade: 0, upgrade_protocol_version_on_epoch_change: 0, + perform_events_on_first_block_of_protocol_change: None, protocol_version_upgrade_percentage_needed: 75, }, block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { @@ -669,6 +674,7 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion { pool_withdrawals_into_transactions_queue: 0, update_broadcasted_withdrawal_statuses: 0, append_signatures_and_broadcast_withdrawal_transactions: 0, + cleanup_expired_locks_of_withdrawal_amounts: 0, }, voting: DriveAbciVotingMethodVersions { keep_record_of_finished_contested_resource_vote_poll: 0, @@ -842,6 +848,10 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion { maximum_contenders_to_consider: 100, }, }, + withdrawal_constants: DriveAbciWithdrawalConstants { + core_expiration_blocks: 24, + cleanup_expired_locks_of_withdrawal_amounts_limit: 0, + }, query: DriveAbciQueryVersions { max_returned_elements: 100, response_metadata: 0, @@ -1265,6 +1275,7 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion { }, methods: DPPMethodVersions { epoch_core_reward_credits_for_distribution: 0, + daily_withdrawal_limit: 0, }, }, system_data_contracts: SystemDataContractVersions { @@ -1281,6 +1292,7 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion { max_state_transition_size: 20480, //20 KiB max_transitions_in_documents_batch: 1, withdrawal_transactions_per_block_limit: 4, + max_withdrawal_amount: 50_000_000_000_000, }, consensus: ConsensusVersions { tenderdash_consensus_version: 0, diff --git a/packages/rs-platform-version/src/version/v3.rs b/packages/rs-platform-version/src/version/v3.rs index 314e17aa19..ba527c98f6 100644 --- a/packages/rs-platform-version/src/version/v3.rs +++ b/packages/rs-platform-version/src/version/v3.rs @@ -32,7 +32,7 @@ use crate::version::drive_abci_versions::{ DriveAbciStateTransitionValidationVersions, DriveAbciStructureVersions, DriveAbciValidationConstants, DriveAbciValidationDataTriggerAndBindingVersions, DriveAbciValidationDataTriggerVersions, DriveAbciValidationVersions, DriveAbciVersion, - DriveAbciVotingMethodVersions, PenaltyAmounts, + DriveAbciVotingMethodVersions, DriveAbciWithdrawalConstants, PenaltyAmounts, }; use crate::version::drive_versions::{ DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, @@ -471,7 +471,7 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { withdrawals: DriveIdentityWithdrawalMethodVersions { document: DriveIdentityWithdrawalDocumentMethodVersions { fetch_oldest_withdrawal_documents_by_status: 0, - find_up_to_100_withdrawal_documents_by_status_and_transaction_indices: 0, + find_withdrawal_documents_by_status_and_transaction_indices: 0, }, transaction: DriveIdentityWithdrawalTransactionMethodVersions { index: DriveIdentityWithdrawalTransactionIndexMethodVersions { @@ -483,6 +483,7 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { dequeue_untied_withdrawal_transactions: 0, }, }, + calculate_current_withdrawal_limit: 0, }, }, platform_system: DrivePlatformSystemMethodVersions { @@ -553,6 +554,7 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { grove_insert_empty_tree: 0, grove_insert_empty_sum_tree: 0, grove_insert_if_not_exists: 0, + grove_insert_if_not_exists_return_existing_element: 0, grove_clear: 0, grove_delete: 0, grove_get_raw: 0, @@ -574,11 +576,13 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { batch_insert_empty_tree: 0, batch_insert_empty_tree_if_not_exists: 0, batch_insert_empty_tree_if_not_exists_check_existing_operations: 0, + batch_insert_sum_item_or_add_to_if_already_exists: 0, batch_insert: 0, batch_insert_if_not_exists: 0, batch_insert_if_changed_value: 0, batch_replace: 0, batch_delete: 0, + batch_delete_items_in_path_query: 0, batch_remove_raw: 0, batch_delete_up_tree_while_empty: 0, batch_refresh_reference: 0, @@ -642,6 +646,7 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { check_for_desired_protocol_upgrade: 1, upgrade_protocol_version_on_epoch_change: 0, + perform_events_on_first_block_of_protocol_change: None, protocol_version_upgrade_percentage_needed: 67, }, block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { @@ -676,6 +681,7 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { pool_withdrawals_into_transactions_queue: 0, update_broadcasted_withdrawal_statuses: 0, append_signatures_and_broadcast_withdrawal_transactions: 0, + cleanup_expired_locks_of_withdrawal_amounts: 0, }, voting: DriveAbciVotingMethodVersions { keep_record_of_finished_contested_resource_vote_poll: 0, @@ -849,6 +855,10 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { maximum_contenders_to_consider: 100, }, }, + withdrawal_constants: DriveAbciWithdrawalConstants { + core_expiration_blocks: 24, + cleanup_expired_locks_of_withdrawal_amounts_limit: 0, + }, query: DriveAbciQueryVersions { max_returned_elements: 100, response_metadata: 0, @@ -1272,6 +1282,7 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { }, methods: DPPMethodVersions { epoch_core_reward_credits_for_distribution: 0, + daily_withdrawal_limit: 0, }, }, system_data_contracts: SystemDataContractVersions { @@ -1288,6 +1299,7 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { max_state_transition_size: 20480, //20 KiB max_transitions_in_documents_batch: 1, withdrawal_transactions_per_block_limit: 4, + max_withdrawal_amount: 50_000_000_000_000, }, consensus: ConsensusVersions { tenderdash_consensus_version: 1, diff --git a/packages/rs-platform-version/src/version/v4.rs b/packages/rs-platform-version/src/version/v4.rs index 86c62b8e8f..4d05a510c9 100644 --- a/packages/rs-platform-version/src/version/v4.rs +++ b/packages/rs-platform-version/src/version/v4.rs @@ -32,7 +32,7 @@ use crate::version::drive_abci_versions::{ DriveAbciStateTransitionValidationVersions, DriveAbciStructureVersions, DriveAbciValidationConstants, DriveAbciValidationDataTriggerAndBindingVersions, DriveAbciValidationDataTriggerVersions, DriveAbciValidationVersions, DriveAbciVersion, - DriveAbciVotingMethodVersions, PenaltyAmounts, + DriveAbciVotingMethodVersions, DriveAbciWithdrawalConstants, PenaltyAmounts, }; use crate::version::drive_versions::{ DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, @@ -466,7 +466,7 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { withdrawals: DriveIdentityWithdrawalMethodVersions { document: DriveIdentityWithdrawalDocumentMethodVersions { fetch_oldest_withdrawal_documents_by_status: 0, - find_up_to_100_withdrawal_documents_by_status_and_transaction_indices: 0, + find_withdrawal_documents_by_status_and_transaction_indices: 0, }, transaction: DriveIdentityWithdrawalTransactionMethodVersions { index: DriveIdentityWithdrawalTransactionIndexMethodVersions { @@ -478,6 +478,7 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { dequeue_untied_withdrawal_transactions: 0, }, }, + calculate_current_withdrawal_limit: 0, }, }, platform_system: DrivePlatformSystemMethodVersions { @@ -548,6 +549,7 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { grove_insert_empty_tree: 0, grove_insert_empty_sum_tree: 0, grove_insert_if_not_exists: 0, + grove_insert_if_not_exists_return_existing_element: 0, grove_clear: 0, grove_delete: 0, grove_get_raw: 0, @@ -569,11 +571,13 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { batch_insert_empty_tree: 0, batch_insert_empty_tree_if_not_exists: 0, batch_insert_empty_tree_if_not_exists_check_existing_operations: 0, + batch_insert_sum_item_or_add_to_if_already_exists: 0, batch_insert: 0, batch_insert_if_not_exists: 0, batch_insert_if_changed_value: 0, batch_replace: 0, batch_delete: 0, + batch_delete_items_in_path_query: 0, batch_remove_raw: 0, batch_delete_up_tree_while_empty: 0, batch_refresh_reference: 0, @@ -637,6 +641,7 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { check_for_desired_protocol_upgrade: 1, upgrade_protocol_version_on_epoch_change: 0, + perform_events_on_first_block_of_protocol_change: Some(4), protocol_version_upgrade_percentage_needed: 67, }, block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { @@ -671,6 +676,7 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { pool_withdrawals_into_transactions_queue: 0, update_broadcasted_withdrawal_statuses: 0, append_signatures_and_broadcast_withdrawal_transactions: 0, + cleanup_expired_locks_of_withdrawal_amounts: 0, }, voting: DriveAbciVotingMethodVersions { keep_record_of_finished_contested_resource_vote_poll: 0, @@ -844,6 +850,10 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { maximum_contenders_to_consider: 100, }, }, + withdrawal_constants: DriveAbciWithdrawalConstants { + core_expiration_blocks: 24, + cleanup_expired_locks_of_withdrawal_amounts_limit: 64, + }, query: DriveAbciQueryVersions { max_returned_elements: 100, response_metadata: 0, @@ -1267,6 +1277,7 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { }, methods: DPPMethodVersions { epoch_core_reward_credits_for_distribution: 0, + daily_withdrawal_limit: 0, }, }, system_data_contracts: SystemDataContractVersions { @@ -1283,6 +1294,7 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { max_state_transition_size: 20480, //20 KiB max_transitions_in_documents_batch: 1, withdrawal_transactions_per_block_limit: 4, + max_withdrawal_amount: 50_000_000_000_000, //500 Dash }, consensus: ConsensusVersions { tenderdash_consensus_version: 1, diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index b2efa71805..b53cbdca56 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -15,10 +15,10 @@ drive = { path = "../rs-drive", default-features = false, features = [ ] } drive-proof-verifier = { path = "../rs-drive-proof-verifier" } dapi-grpc-macros = { path = "../rs-dapi-grpc-macros" } -thiserror = "1.0.58" -tokio = { version = "1.36.0", features = ["macros"] } -tokio-util = { version = "0.7.10" } -async-trait = { version = "0.1.79" } +thiserror = "1.0.64" +tokio = { version = "1.40.0", features = ["macros"] } +tokio-util = { version = "0.7.12" } +async-trait = { version = "0.1.83" } http = { version = "0.2.12" } ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined" } serde = { version = "1.0.197", default-features = false, features = [ @@ -38,7 +38,7 @@ bip37-bloom-filter = { git = "https://github.com/dashpay/rs-bip37-bloom-filter", pollster = { version = "0.3.0" } [dev-dependencies] -tokio = { version = "1.36.0", features = ["macros", "rt-multi-thread"] } +tokio = { version = "1.40.0", features = ["macros", "rt-multi-thread"] } rs-dapi-client = { path = "../rs-dapi-client", features = ["mocks"] } base64 = { version = "0.22.1" } tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index 126538a64a..61395d99f2 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -45,13 +45,15 @@ use rand::prelude::StdRng; use rand::seq::{IteratorRandom, SliceRandom}; use rand::Rng; use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; +use std::ops::RangeInclusive; use bincode::{Decode, Encode}; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::identifier::Identifier; use dpp::data_contract::document_type::DocumentType; +use dpp::fee::Credits; use dpp::identity::accessors::IdentityGettersV0; use dpp::platform_value::{BinaryData, Bytes32, Value}; -use dpp::ProtocolError; +use dpp::{dash_to_duffs, ProtocolError}; use dpp::ProtocolError::{PlatformDeserializationError, PlatformSerializationError}; use dpp::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; use dpp::state_transition::documents_batch_transition::document_create_transition::{DocumentCreateTransition, DocumentCreateTransitionV0}; @@ -153,6 +155,7 @@ pub struct IdentityInsertInfo { pub frequency: Frequency, pub start_keys: u8, pub extra_keys: KeyMaps, + pub start_balance_range: RangeInclusive, } impl Default for IdentityInsertInfo { @@ -161,6 +164,7 @@ impl Default for IdentityInsertInfo { frequency: Default::default(), start_keys: 5, extra_keys: Default::default(), + start_balance_range: dash_to_duffs!(1)..=dash_to_duffs!(1), } } } @@ -1167,7 +1171,10 @@ impl Strategy { } // Generate state transition for identity top-up operation - OperationType::IdentityTopUp if !current_identities.is_empty() => { + OperationType::IdentityTopUp(_amount_range) + if !current_identities.is_empty() => + { + // todo: use amount ranges // Use a cyclic iterator over the identities to ensure we can create 'count' transitions let cyclic_identities = current_identities.iter().cycle(); @@ -1261,13 +1268,16 @@ impl Strategy { } // Generate state transition for identity withdrawal operation - OperationType::IdentityWithdrawal if !current_identities.is_empty() => { + OperationType::IdentityWithdrawal(amount_range) + if !current_identities.is_empty() => + { for i in 0..count { let index = (i as usize) % current_identities.len(); let random_identity = &mut current_identities[index]; let state_transition = crate::transitions::create_identity_withdrawal_transition( random_identity, + amount_range.clone(), identity_nonce_counter, signer, rng, @@ -1853,6 +1863,7 @@ mod tests { use crate::operations::{DocumentAction, DocumentOp, Operation, OperationType}; use crate::transitions::create_state_transitions_for_identities; use crate::{StartIdentities, Strategy}; + use dpp::dash_to_duffs; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::random_document::{ DocumentFieldFillSize, DocumentFieldFillType, @@ -1902,6 +1913,7 @@ mod tests { let start_identities = create_state_transitions_for_identities( vec![identity1, identity2], + &(dash_to_duffs!(1)..=dash_to_duffs!(1)), &mut simple_signer, &mut rng, platform_version, diff --git a/packages/strategy-tests/src/operations.rs b/packages/strategy-tests/src/operations.rs index c3e52414cd..675e996843 100644 --- a/packages/strategy-tests/src/operations.rs +++ b/packages/strategy-tests/src/operations.rs @@ -9,6 +9,7 @@ use dpp::data_contract::document_type::v0::random_document_type::RandomDocumentT use dpp::data_contract::document_type::DocumentType; use dpp::data_contract::serialized_version::DataContractInSerializationFormat; use dpp::data_contract::{DataContract as Contract, DataContract}; +use dpp::fee::Credits; use dpp::identifier::Identifier; use dpp::identity::IdentityPublicKey; use dpp::platform_value::Value; @@ -26,7 +27,7 @@ use platform_version::{TryFromPlatformVersioned, TryIntoPlatformVersioned}; use rand::distributions::{Distribution, WeightedIndex}; use rand::prelude::StdRng; use std::collections::BTreeMap; -use std::ops::Range; +use std::ops::{Range, RangeInclusive}; #[derive(Clone, Debug, PartialEq, Encode, Decode)] pub enum DocumentAction { @@ -494,12 +495,14 @@ impl VoteAction { } } +pub type AmountRange = RangeInclusive; + #[derive(Clone, Debug, PartialEq)] pub enum OperationType { Document(DocumentOp), - IdentityTopUp, + IdentityTopUp(AmountRange), IdentityUpdate(IdentityUpdateOp), - IdentityWithdrawal, + IdentityWithdrawal(AmountRange), ContractCreate(RandomDocumentTypeParameters, DocumentTypeCount), ContractUpdate(DataContractUpdateOp), IdentityTransfer, @@ -509,9 +512,9 @@ pub enum OperationType { #[derive(Clone, Debug, Encode, Decode)] enum OperationTypeInSerializationFormat { Document(Vec), - IdentityTopUp, + IdentityTopUp(AmountRange), IdentityUpdate(IdentityUpdateOp), - IdentityWithdrawal, + IdentityWithdrawal(AmountRange), ContractCreate(RandomDocumentTypeParameters, DocumentTypeCount), ContractUpdate(Vec), IdentityTransfer, @@ -540,12 +543,14 @@ impl PlatformSerializableWithPlatformVersion for OperationType { .serialize_consume_to_bytes_with_platform_version(platform_version)?; OperationTypeInSerializationFormat::Document(document_op_in_serialization_format) } - OperationType::IdentityTopUp => OperationTypeInSerializationFormat::IdentityTopUp, + OperationType::IdentityTopUp(amount_range) => { + OperationTypeInSerializationFormat::IdentityTopUp(amount_range) + } OperationType::IdentityUpdate(identity_update_op) => { OperationTypeInSerializationFormat::IdentityUpdate(identity_update_op) } - OperationType::IdentityWithdrawal => { - OperationTypeInSerializationFormat::IdentityWithdrawal + OperationType::IdentityWithdrawal(amount_range) => { + OperationTypeInSerializationFormat::IdentityWithdrawal(amount_range) } OperationType::ContractCreate(p, c) => { OperationTypeInSerializationFormat::ContractCreate(p, c) @@ -601,12 +606,14 @@ impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for Ope )?; OperationType::Document(document_op) } - OperationTypeInSerializationFormat::IdentityTopUp => OperationType::IdentityTopUp, + OperationTypeInSerializationFormat::IdentityTopUp(amount_range) => { + OperationType::IdentityTopUp(amount_range) + } OperationTypeInSerializationFormat::IdentityUpdate(identity_update_op) => { OperationType::IdentityUpdate(identity_update_op) } - OperationTypeInSerializationFormat::IdentityWithdrawal => { - OperationType::IdentityWithdrawal + OperationTypeInSerializationFormat::IdentityWithdrawal(amount_range) => { + OperationType::IdentityWithdrawal(amount_range) } OperationTypeInSerializationFormat::ContractCreate(p, c) => { OperationType::ContractCreate(p, c) diff --git a/packages/strategy-tests/src/transitions.rs b/packages/strategy-tests/src/transitions.rs index 7b0f3d92c4..85d03eb333 100644 --- a/packages/strategy-tests/src/transitions.rs +++ b/packages/strategy-tests/src/transitions.rs @@ -33,6 +33,7 @@ use dpp::withdrawal::Pooling; use rand::prelude::{IteratorRandom, StdRng}; use simple_signer::signer::SimpleSigner; +use crate::operations::AmountRange; use crate::KeyMaps; use dpp::dashcore::transaction::special_transaction::asset_lock::AssetLockPayload; use dpp::dashcore::transaction::special_transaction::TransactionPayload; @@ -76,6 +77,24 @@ pub fn instant_asset_lock_proof_fixture(one_time_private_key: PrivateKey) -> Ass AssetLockProof::Instant(is_lock_proof) } +pub fn instant_asset_lock_proof_fixture_with_dynamic_range( + one_time_private_key: PrivateKey, + amount_range: &AmountRange, + rng: &mut StdRng, +) -> AssetLockProof { + let transaction = instant_asset_lock_proof_transaction_fixture_with_dynamic_amount( + one_time_private_key, + amount_range, + rng, + ); + + let instant_lock = instant_asset_lock_is_lock_fixture(transaction.txid()); + + let is_lock_proof = InstantAssetLockProof::new(instant_lock, transaction, 0); + + AssetLockProof::Instant(is_lock_proof) +} + /// Constructs a fixture of a `Transaction` representing an instant asset lock proof. /// /// The `Transaction` structure is a basic unit of data in a blockchain, recording the transfer of assets between parties. @@ -160,6 +179,73 @@ pub fn instant_asset_lock_proof_transaction_fixture( } } +pub fn instant_asset_lock_proof_transaction_fixture_with_dynamic_amount( + one_time_private_key: PrivateKey, + amount_range: &AmountRange, + rng: &mut StdRng, +) -> Transaction { + let secp = Secp256k1::new(); + + let private_key_hex = "cSBnVM4xvxarwGQuAfQFwqDg9k5tErHUHzgWsEfD4zdwUasvqRVY"; + let private_key = PrivateKey::from_str(private_key_hex).unwrap(); + let public_key = private_key.public_key(&secp); + let public_key_hash = public_key.pubkey_hash(); + //let from_address = Address::p2pkh(&public_key, Network::Testnet); + let one_time_public_key = one_time_private_key.public_key(&secp); + + // We are going to fund 1 Dash and + // assume that input has 100005000 + // 5000 will be returned back + + let input_txid = + Txid::from_str("a477af6b2667c29670467e4e0728b685ee07b240235771862318e29ddbe58458").unwrap(); + + let input_outpoint = OutPoint::new(input_txid, 0); + + let input = TxIn { + previous_output: input_outpoint, + script_sig: ScriptBuf::new_p2pkh(&public_key_hash), + sequence: 0, + witness: Default::default(), + }; + + let one_time_key_hash = one_time_public_key.pubkey_hash(); + + let value_amount = if amount_range.start() == amount_range.end() { + *amount_range.start() //avoid using rng if possible + } else { + rng.gen_range(amount_range.clone()) + }; + + let funding_output = TxOut { + value: value_amount, + script_pubkey: ScriptBuf::new_p2pkh(&one_time_key_hash), + }; + + let burn_output = TxOut { + value: value_amount, + script_pubkey: ScriptBuf::new_op_return(&[]), + }; + + let change_output = TxOut { + value: 5000, + script_pubkey: ScriptBuf::new_p2pkh(&public_key_hash), + }; + + let payload = TransactionPayload::AssetLockPayloadType(AssetLockPayload { + version: 0, + credit_outputs: vec![funding_output], + }); + + Transaction { + version: 0, + lock_time: 0, + input: vec![input], + output: vec![burn_output, change_output], + special_transaction_payload: Some(payload), + } +} + /// Constructs a fixture of `InstantLock` representing an instant asset lock. /// /// The `InstantLock` structure is often used in blockchain systems to represent a condition where funds (or assets) are locked instantly, making them non-spendable until a specified condition is met or the lock duration expires. @@ -483,6 +569,7 @@ pub fn create_identity_update_transition_disable_keys( /// - If the identity does not have a suitable withdrawal address or key for signing. pub fn create_identity_withdrawal_transition( identity: &mut Identity, + amount_range: AmountRange, identity_nonce_counter: &mut BTreeMap, signer: &mut SimpleSigner, rng: &mut StdRng, @@ -499,12 +586,15 @@ pub fn create_identity_withdrawal_transition( // We can send it to the withdrawal address create_identity_withdrawal_transition_sent_to_identity_transfer_key( identity, + amount_range, identity_nonce_counter, signer, + rng, ) } else { create_identity_withdrawal_transition_with_output_address( identity, + amount_range, identity_nonce_counter, signer, rng, @@ -546,14 +636,16 @@ pub fn create_identity_withdrawal_transition( /// - If there's an error during the signing process. pub fn create_identity_withdrawal_transition_sent_to_identity_transfer_key( identity: &mut Identity, + amount_range: AmountRange, identity_nonce_counter: &mut BTreeMap, signer: &mut SimpleSigner, + rng: &mut StdRng, ) -> StateTransition { let nonce = identity_nonce_counter.entry(identity.id()).or_default(); *nonce += 1; let mut withdrawal: StateTransition = IdentityCreditWithdrawalTransitionV1 { identity_id: identity.id(), - amount: 1000000, // 1 duff + amount: rng.gen_range(amount_range), core_fee_per_byte: MIN_CORE_FEE_PER_BYTE, pooling: Pooling::Never, output_script: None, @@ -627,6 +719,7 @@ pub fn create_identity_withdrawal_transition_sent_to_identity_transfer_key( /// - If there's an error during the signing process. pub fn create_identity_withdrawal_transition_with_output_address( identity: &mut Identity, + amount_range: AmountRange, identity_nonce_counter: &mut BTreeMap, signer: &mut SimpleSigner, rng: &mut StdRng, @@ -635,10 +728,14 @@ pub fn create_identity_withdrawal_transition_with_output_address( *nonce += 1; let mut withdrawal: StateTransition = IdentityCreditWithdrawalTransitionV1 { identity_id: identity.id(), - amount: 1000000, // 1 duff + amount: rng.gen_range(amount_range), core_fee_per_byte: MIN_CORE_FEE_PER_BYTE, pooling: Pooling::Never, - output_script: Some(CoreScript::random_p2sh(rng)), + output_script: if rng.gen_bool(0.5) { + Some(CoreScript::random_p2pkh(rng)) + } else { + Some(CoreScript::random_p2sh(rng)) + }, nonce: *nonce, user_fee_increase: 0, signature_public_key_id: 0, @@ -923,6 +1020,7 @@ pub fn create_identities_state_transitions( /// - Conversion and encoding errors related to the cryptographic data. pub fn create_state_transitions_for_identities( identities: Vec, + amount_range: &AmountRange, signer: &SimpleSigner, rng: &mut StdRng, platform_version: &PlatformVersion, @@ -935,8 +1033,11 @@ pub fn create_state_transitions_for_identities( .unwrap(); let sk: [u8; 32] = pk.try_into().unwrap(); let secret_key = SecretKey::from_str(hex::encode(sk).as_str()).unwrap(); - let asset_lock_proof = - instant_asset_lock_proof_fixture(PrivateKey::new(secret_key, Network::Dash)); + let asset_lock_proof = instant_asset_lock_proof_fixture_with_dynamic_range( + PrivateKey::new(secret_key, Network::Dash), + amount_range, + rng, + ); let identity_create_transition = IdentityCreateTransition::try_from_identity_with_signer( &identity.clone(), diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index 357bc6d42f..2523ed3202 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -7,7 +7,7 @@ rust-version.workspace = true license = "MIT" [dependencies] -thiserror = "1.0.58" +thiserror = "1.0.64" platform-version = { path = "../rs-platform-version" } platform-value = { path = "../rs-platform-value" } num_enum = "0.5.7" diff --git a/packages/withdrawals-contract/src/lib.rs b/packages/withdrawals-contract/src/lib.rs index 0eece0b61b..baa5887f8e 100644 --- a/packages/withdrawals-contract/src/lib.rs +++ b/packages/withdrawals-contract/src/lib.rs @@ -32,10 +32,15 @@ pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); IntoPrimitive, )] pub enum WithdrawalStatus { + /// The documents are in the state and waiting to be processed. QUEUED = 0, + /// Pooled happens when we are waiting for signing. POOLED = 1, + /// We have broadcasted the transaction to core. BROADCASTED = 2, + /// The transaction is now complete. COMPLETE = 3, + /// We broadcasted the transaction but core never saw it or rejected it. EXPIRED = 4, } From 404d6d71e1d0d857e8a5c6ad1442d7a2e695f2c9 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 30 Sep 2024 16:47:02 +0700 Subject: [PATCH 26/90] feat(platform)!: withdrawal automatic retries after core rejection (#2185) --- .../engine/run_block_proposal/v0/mod.rs | 8 + .../v0/mod.rs | 11 +- .../platform_events/withdrawals/mod.rs | 1 + .../v0/mod.rs | 121 +--- .../mod.rs | 64 +++ .../v0/mod.rs | 39 ++ .../v1/mod.rs | 119 ++++ .../v0/mod.rs | 61 +- .../tests/strategy_tests/withdrawal_tests.rs | 217 ++++++- packages/rs-drive/src/drive/balances/mod.rs | 2 +- .../fetch_contract_with_history/mod.rs | 2 +- .../get_contract_with_fetch_info/mod.rs | 4 +- packages/rs-drive/src/drive/contract/mod.rs | 16 +- .../get_epoch_fee_multiplier/v0/mod.rs | 6 +- .../v0/mod.rs | 2 +- .../v0/mod.rs | 4 +- .../v0/mod.rs | 2 +- .../epochs/has_epoch_tree_exists.rs | 4 +- .../credit_pools/epochs/operations_factory.rs | 30 +- .../proposers/fetch_epoch_proposers/v0/mod.rs | 2 +- .../get_epochs_proposer_block_count/v0/mod.rs | 4 +- .../is_epochs_proposers_tree_empty/mod.rs | 2 +- .../proposers/prove_epoch_proposers/v0/mod.rs | 2 +- .../credit_pools/epochs/start_block/mod.rs | 20 +- .../start_time/get_epoch_start_time/v0/mod.rs | 8 +- .../rs-drive/src/drive/credit_pools/mod.rs | 6 +- .../src/drive/credit_pools/operations.rs | 6 +- .../v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../v0/mod.rs | 4 +- .../get_unpaid_epoch_index/v0/mod.rs | 4 +- .../rs-drive/src/drive/document/delete/mod.rs | 10 +- .../rs-drive/src/drive/document/insert/mod.rs | 14 +- packages/rs-drive/src/drive/document/mod.rs | 2 +- .../rs-drive/src/drive/document/update/mod.rs | 8 +- .../src/drive/identity/balance/prove.rs | 4 +- .../src/drive/identity/balance/update.rs | 30 +- .../drive/identity/fetch/full_identity/mod.rs | 6 +- .../prove/prove_full_identities/v0/mod.rs | 4 +- .../v0/mod.rs | 2 +- .../fetch/prove/prove_full_identity/v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../insert/add_new_identity/v0/mod.rs | 2 +- .../rs-drive/src/drive/identity/update/mod.rs | 16 +- .../v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../src/drive/identity/withdrawals/paths.rs | 22 + .../withdrawals/transaction/index/mod.rs | 4 +- .../v0/mod.rs | 14 +- .../withdrawals/transaction/queue/mod.rs | 15 +- .../mod.rs | 43 ++ .../v0/mod.rs | 25 + .../mod.rs | 40 ++ .../v0/mod.rs | 15 + .../initialization/genesis_core_height/mod.rs | 2 +- .../src/drive/initialization/v0/mod.rs | 4 +- .../src/drive/system/genesis_time/mod.rs | 2 +- packages/rs-drive/src/query/mod.rs | 2 +- .../src/util/batch/drive_op_batch/mod.rs | 12 +- .../util/batch/drive_op_batch/withdrawals.rs | 140 ++++- .../batch_move_items_in_path_query/mod.rs | 58 ++ .../batch_move_items_in_path_query/v0/mod.rs | 530 ++++++++++++++++++ .../rs-drive/src/util/grove_operations/mod.rs | 28 +- .../rs-drive/src/util/test_helpers/setup.rs | 6 +- packages/rs-drive/tests/dashpay.rs | 10 +- packages/rs-drive/tests/masternode_rewards.rs | 4 +- packages/rs-drive/tests/query_tests.rs | 4 +- .../src/version/drive_abci_versions.rs | 1 + .../src/version/drive_versions.rs | 3 + .../rs-platform-version/src/version/limits.rs | 1 + .../src/version/mocks/v2_test.rs | 7 +- .../src/version/mocks/v3_test.rs | 7 +- .../rs-platform-version/src/version/v1.rs | 7 +- .../rs-platform-version/src/version/v2.rs | 7 +- .../rs-platform-version/src/version/v3.rs | 7 +- .../rs-platform-version/src/version/v4.rs | 7 +- 78 files changed, 1585 insertions(+), 327 deletions(-) create mode 100644 packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/v1/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/move_broadcasted_withdrawal_transactions_back_to_queue_operations/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/move_broadcasted_withdrawal_transactions_back_to_queue_operations/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/remove_broadcasted_withdrawal_transactions_after_completion/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/remove_broadcasted_withdrawal_transactions_after_completion/v0/mod.rs create mode 100644 packages/rs-drive/src/util/grove_operations/batch_move_items_in_path_query/mod.rs create mode 100644 packages/rs-drive/src/util/grove_operations/batch_move_items_in_path_query/v0/mod.rs diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs index 0b20f41d88..1ae4a1e639 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs @@ -269,6 +269,14 @@ where Error::Execution(ExecutionError::UpdateValidatorProposedAppVersionError(e)) })?; // This is a system error + // Rebroadcast expired withdrawals if they exist + self.rebroadcast_expired_withdrawal_documents( + &block_info, + &last_committed_platform_state, + transaction, + platform_version, + )?; + // Mark all previously broadcasted and chainlocked withdrawals as complete // only when we are on a new core height if block_state_info.core_chain_locked_height() != last_block_core_height { diff --git a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/v0/mod.rs index d732893b80..1c50e27e7a 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/v0/mod.rs @@ -3,7 +3,8 @@ use crate::platform_types::platform::Platform; use dpp::version::PlatformVersion; use dpp::version::ProtocolVersion; use drive::drive::identity::withdrawals::paths::{ - get_withdrawal_root_path, WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, + get_withdrawal_root_path, WITHDRAWAL_TRANSACTIONS_BROADCASTED_KEY, + WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, }; use drive::grovedb::{Element, Transaction}; @@ -68,6 +69,14 @@ impl Platform { None, &platform_version.drive, )?; + self.drive.grove_insert_if_not_exists( + (&path).into(), + &WITHDRAWAL_TRANSACTIONS_BROADCASTED_KEY, + Element::empty_tree(), + Some(transaction), + None, + &platform_version.drive, + )?; Ok(()) } } diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/mod.rs index 0de6cbfcef..d7779c47b0 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/mod.rs @@ -4,4 +4,5 @@ pub(in crate::execution) mod cleanup_expired_locks_of_withdrawal_amounts; pub(in crate::execution) mod dequeue_and_build_unsigned_withdrawal_transactions; pub(in crate::execution) mod fetch_transactions_block_inclusion_status; pub(in crate::execution) mod pool_withdrawals_into_transactions_queue; +pub(in crate::execution) mod rebroadcast_expired_withdrawal_documents; pub(in crate::execution) mod update_broadcasted_withdrawal_statuses; diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs index 2f353c8225..86ebeb6fbb 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs @@ -44,125 +44,8 @@ where ); return Ok(()); } - let documents = self.drive.fetch_oldest_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::QUEUED.into(), - platform_version - .system_limits - .withdrawal_transactions_per_block_limit, - transaction, - platform_version, - )?; - - if documents.is_empty() { - return Ok(()); - } - - // Only take documents up to the withdrawal amount - let current_withdrawal_limit = self - .drive - .calculate_current_withdrawal_limit(transaction, platform_version)?; - - // Only process documents up to the current withdrawal limit. - let mut total_withdrawal_amount = 0u64; - - // Iterate over the documents and accumulate their withdrawal amounts. - let mut documents_to_process = vec![]; - for document in documents { - // Get the withdrawal amount from the document properties. - let amount: u64 = document - .properties() - .get_integer(withdrawal::properties::AMOUNT)?; - - // Check if adding this amount would exceed the current withdrawal limit. - let potential_total_withdrawal_amount = - total_withdrawal_amount.checked_add(amount).ok_or_else(|| { - Error::Execution(ExecutionError::Overflow( - "overflow in total withdrawal amount", - )) - })?; - - if potential_total_withdrawal_amount > current_withdrawal_limit { - // If adding this withdrawal would exceed the limit, stop processing further. - break; - } - - total_withdrawal_amount = potential_total_withdrawal_amount; - - // Add this document to the list of documents to be processed. - documents_to_process.push(document); - } - - if documents_to_process.is_empty() { - return Ok(()); - } - - let start_transaction_index = self - .drive - .fetch_next_withdrawal_transaction_index(transaction, platform_version)?; - - let (withdrawal_transactions, total_amount) = self - .build_untied_withdrawal_transactions_from_documents( - &mut documents_to_process, - start_transaction_index, - block_info, - platform_version, - )?; - - let withdrawal_transactions_count = withdrawal_transactions.len(); - - let mut drive_operations = vec![]; - - self.drive - .add_enqueue_untied_withdrawal_transaction_operations( - withdrawal_transactions, - total_amount, - &mut drive_operations, - platform_version, - )?; - - let end_transaction_index = start_transaction_index + withdrawal_transactions_count as u64; - - self.drive - .add_update_next_withdrawal_transaction_index_operation( - end_transaction_index, - &mut drive_operations, - platform_version, - )?; - - tracing::debug!( - "Pooled {} withdrawal documents into {} transactions with indices from {} to {}", - documents_to_process.len(), - withdrawal_transactions_count, - start_transaction_index, - end_transaction_index, - ); - - let withdrawals_contract = self.drive.cache.system_data_contracts.load_withdrawals(); - - self.drive.add_update_multiple_documents_operations( - &documents_to_process, - &withdrawals_contract, - withdrawals_contract - .document_type_for_name(withdrawal::NAME) - .map_err(|_| { - Error::Execution(ExecutionError::CorruptedCodeExecution( - "Can't fetch withdrawal data contract", - )) - })?, - &mut drive_operations, - &platform_version.drive, - )?; - - self.drive.apply_drive_operations( - drive_operations, - true, - block_info, - transaction, - platform_version, - None, - )?; - - Ok(()) + // Just use the v1 as to not duplicate code + self.pool_withdrawals_into_transactions_queue_v1(block_info, transaction, platform_version) } } diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/mod.rs new file mode 100644 index 0000000000..f4e9daab97 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/mod.rs @@ -0,0 +1,64 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::platform_types::platform::Platform; + +use crate::rpc::core::CoreRPCLike; +use dpp::block::block_info::BlockInfo; + +use crate::platform_types::platform_state::PlatformState; +use dpp::version::PlatformVersion; +use drive::grovedb::Transaction; + +mod v0; +mod v1; + +impl Platform +where + C: CoreRPCLike, +{ + /// Rebroadcasts expired withdrawal documents if any exist. + /// + /// This function attempts to rebroadcast expired withdrawal documents by checking if there are + /// any documents with the status `EXPIRED`. It updates the status of such documents to + /// `BROADCASTED`, increments their revision, and reschedules them for broadcasting. + /// + /// # Parameters + /// - `block_info`: Information about the current block (e.g., timestamp). + /// - `transaction`: The transaction within which the rebroadcast should be executed. + /// - `platform_version`: The version of the platform, used to determine the correct method implementation. + /// + /// # Returns + /// - `Ok(())` if the rebroadcast process succeeds without issues. + /// - `Err(ExecutionError::UnknownVersionMismatch)` if the platform version is unsupported. + pub fn rebroadcast_expired_withdrawal_documents( + &self, + block_info: &BlockInfo, + last_committed_platform_state: &PlatformState, + transaction: &Transaction, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version + .drive_abci + .methods + .withdrawals + .rebroadcast_expired_withdrawal_documents + { + 0 => self.rebroadcast_expired_withdrawal_documents_v0( + block_info, + last_committed_platform_state, + transaction, + platform_version, + ), + 1 => self.rebroadcast_expired_withdrawal_documents_v1( + block_info, + transaction, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "rebroadcast_expired_withdrawal_documents".to_string(), + known_versions: vec![0, 1], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/v0/mod.rs new file mode 100644 index 0000000000..011867a872 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/v0/mod.rs @@ -0,0 +1,39 @@ +use crate::error::Error; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::platform_types::platform_state::PlatformState; +use crate::{platform_types::platform::Platform, rpc::core::CoreRPCLike}; +use dpp::block::block_info::BlockInfo; +use dpp::version::PlatformVersion; +use drive::grovedb::Transaction; + +impl Platform +where + C: CoreRPCLike, +{ + pub(super) fn rebroadcast_expired_withdrawal_documents_v0( + &self, + block_info: &BlockInfo, + last_committed_platform_state: &PlatformState, + transaction: &Transaction, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + // Currently Core only supports using the first 2 quorums (out of 24 for mainnet). + // For us, we just use the latest quorum to be extra safe. + let Some(position_of_current_quorum) = + last_committed_platform_state.current_validator_set_position_in_list_by_most_recent() + else { + tracing::warn!("Current quorum not in current validator set, not making withdrawals"); + return Ok(()); + }; + if position_of_current_quorum != 0 { + tracing::debug!( + "Current quorum is not most recent, it is in position {}, not making withdrawals", + position_of_current_quorum + ); + return Ok(()); + } + // Version 1 changes on Version 0, by not having the Core 2 Quorum limit. + // Hence we can just use the v1 here after the extra logic of v0 + self.rebroadcast_expired_withdrawal_documents_v1(block_info, transaction, platform_version) + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/v1/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/v1/mod.rs new file mode 100644 index 0000000000..7e90dc51cb --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/v1/mod.rs @@ -0,0 +1,119 @@ +use dpp::block::block_info::BlockInfo; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contracts::withdrawals_contract::WithdrawalStatus; +use dpp::document::document_methods::DocumentMethodsV0; +use dpp::document::{DocumentV0Getters, DocumentV0Setters}; +use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; + +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; +use dpp::version::PlatformVersion; +use std::collections::BTreeSet; + +use crate::{ + error::{execution::ExecutionError, Error}, + platform_types::platform::Platform, + rpc::core::CoreRPCLike, +}; +use dpp::withdrawal::WithdrawalTransactionIndex; +use drive::grovedb::Transaction; +use drive::util::batch::DriveOperation; + +impl Platform +where + C: CoreRPCLike, +{ + /// Version 1 changes on Version 0, by not having the Core 2 Quorum limit. + /// We should switch to Version 1 once Core has fixed the issue + pub(super) fn rebroadcast_expired_withdrawal_documents_v1( + &self, + block_info: &BlockInfo, + transaction: &Transaction, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let expired_withdrawal_documents_to_retry_signing = + self.drive.fetch_oldest_withdrawal_documents_by_status( + WithdrawalStatus::EXPIRED.into(), + platform_version + .system_limits + .retry_signing_expired_withdrawal_documents_per_block_limit, + transaction.into(), + platform_version, + )?; + + if expired_withdrawal_documents_to_retry_signing.is_empty() { + return Ok(()); + } + + // Collecting unique withdrawal indices of expired documents + let expired_withdrawal_indices: Vec = + expired_withdrawal_documents_to_retry_signing + .iter() + .map(|document| { + document + .properties() + .get_optional_u64(withdrawal::properties::TRANSACTION_INDEX)? + .ok_or(Error::Execution(ExecutionError::CorruptedDriveResponse( + "Can't get transaction index from withdrawal document".to_string(), + ))) + }) + .collect::, Error>>()? + .into_iter() + .collect(); + + let mut drive_operations: Vec = vec![]; + + // Collecting only documents that have been updated + let mut documents_to_update = Vec::new(); + + for mut document in expired_withdrawal_documents_to_retry_signing { + document.set_u8( + withdrawal::properties::STATUS, + WithdrawalStatus::BROADCASTED as u8, + ); + + document.set_updated_at(Some(block_info.time_ms)); + + document.increment_revision().map_err(Error::Protocol)?; + + documents_to_update.push(document); + } + + if documents_to_update.is_empty() { + return Ok(()); + } + + self.drive + .move_broadcasted_withdrawal_transactions_back_to_queue_operations( + expired_withdrawal_indices, + &mut drive_operations, + platform_version, + )?; + + let withdrawals_contract = self.drive.cache.system_data_contracts.load_withdrawals(); + + self.drive.add_update_multiple_documents_operations( + &documents_to_update, + &withdrawals_contract, + withdrawals_contract + .document_type_for_name(withdrawal::NAME) + .map_err(|_| { + Error::Execution(ExecutionError::CorruptedCodeExecution( + "Can't fetch withdrawal data contract", + )) + })?, + &mut drive_operations, + &platform_version.drive, + )?; + + self.drive.apply_drive_operations( + drive_operations, + true, + block_info, + transaction.into(), + platform_version, + None, + )?; + + Ok(()) + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs index 81210da62e..470d234939 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs @@ -8,19 +8,17 @@ use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::version::PlatformVersion; -use itertools::Itertools; -use std::collections::HashSet; - -use dpp::withdrawal::WithdrawalTransactionIndex; -use drive::config::DEFAULT_QUERY_LIMIT; -use drive::grovedb::Transaction; -use drive::util::batch::DriveOperation; +use std::collections::BTreeSet; use crate::{ error::{execution::ExecutionError, Error}, platform_types::platform::Platform, rpc::core::CoreRPCLike, }; +use dpp::withdrawal::WithdrawalTransactionIndex; +use drive::config::DEFAULT_QUERY_LIMIT; +use drive::grovedb::Transaction; +use drive::util::batch::DriveOperation; impl Platform where @@ -45,20 +43,21 @@ where return Ok(()); } - // Collecting unique withdrawal indices - let broadcasted_withdrawal_indices = broadcasted_withdrawal_documents - .iter() - .map(|document| { - document - .properties() - .get_optional_u64(withdrawal::properties::TRANSACTION_INDEX)? - .ok_or(Error::Execution(ExecutionError::CorruptedDriveResponse( - "Can't get transaction index from withdrawal document".to_string(), - ))) - }) - .collect::, Error>>()? - .into_iter() - .collect_vec(); + // Collecting unique withdrawal indices of broadcasted documents + let broadcasted_withdrawal_indices: Vec = + broadcasted_withdrawal_documents + .iter() + .map(|document| { + document + .properties() + .get_optional_u64(withdrawal::properties::TRANSACTION_INDEX)? + .ok_or(Error::Execution(ExecutionError::CorruptedDriveResponse( + "Can't get transaction index from withdrawal document".to_string(), + ))) + }) + .collect::, Error>>()? + .into_iter() + .collect(); let withdrawal_transaction_statuses = self.fetch_transactions_block_inclusion_status( block_info.core_height, @@ -68,6 +67,18 @@ where let mut drive_operations: Vec = vec![]; + // Let's remove broadcasted withdrawal transactions that are now chainlocked + let chainlocked_indexes = withdrawal_transaction_statuses + .iter() + .filter_map(|(index, status)| { + if *status == AssetUnlockStatus::Chainlocked { + Some(*index) + } else { + None + } + }) + .collect::>(); + // Collecting only documents that have been updated let mut documents_to_update = Vec::new(); @@ -118,7 +129,6 @@ where "Withdrawal with transaction index {} is marked as expired", withdrawal_index ); - WithdrawalStatus::EXPIRED } else { continue; @@ -137,6 +147,13 @@ where return Ok(()); } + self.drive + .remove_broadcasted_withdrawal_transactions_after_completion_operations( + chainlocked_indexes, + &mut drive_operations, + platform_version, + )?; + let withdrawals_contract = self.drive.cache.system_data_contracts.load_withdrawals(); self.drive.add_update_multiple_documents_operations( diff --git a/packages/rs-drive-abci/tests/strategy_tests/withdrawal_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/withdrawal_tests.rs index e0c3398417..ccbcae5d73 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/withdrawal_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/withdrawal_tests.rs @@ -790,15 +790,13 @@ mod tests { .expect_send_raw_transaction() .returning(move |_| Ok(Txid::all_zeros())); - let mut chain_locked_height = 1; - // Have to go with a complicated shared object for the core state because we need to change // rpc response along the way but we can't mutate `platform.core_rpc` later // because platform reference is moved into the AbciApplication. let shared_core_state = Arc::new(Mutex::new(CoreState { asset_unlock_statuses: BTreeMap::new(), chain_lock: ChainLock { - block_height: chain_locked_height, + block_height: 1, block_hash: BlockHash::from_byte_array([1; 32]), signature: BLSSignature::from([2; 96]), }, @@ -1122,10 +1120,7 @@ mod tests { // Simulate transactions being added to the core mempool let mut core_state = shared_core_state.lock().unwrap(); - let number_of_blocks_before_expiration: u32 = 48; - chain_locked_height += number_of_blocks_before_expiration; - - core_state.chain_lock.block_height = chain_locked_height; + core_state.chain_lock.block_height = 50; last_block_withdrawals.iter().for_each(|tx| { let index = asset_unlock_index(tx); @@ -1142,12 +1137,25 @@ mod tests { // Run block 5 // Tests withdrawal expiration - let ChainExecutionOutcome { .. } = { + let ChainExecutionOutcome { + abci_app, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions, + end_time_ms, + withdrawals: last_block_withdrawals, + identity_nonce_counter, + identity_contract_nonce_counter, + instant_lock_quorums, + identities, + .. + } = { let outcome = continue_chain_for_strategy( abci_app, ChainExecutionParameters { block_start: 5, - core_height_start: 2, + core_height_start: 50, block_count: 1, proposers, validator_quorums: quorums, @@ -1223,6 +1231,197 @@ mod tests { outcome }; + + // Run block 6 + // Should broadcast previously expired transaction + let ChainExecutionOutcome { + abci_app, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions, + end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, + instant_lock_quorums, + identities, + .. + } = { + let outcome = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start: 6, + core_height_start: 50, + block_count: 1, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, + current_votes: BTreeMap::default(), + start_time_ms: GENESIS_TIME_MS, + current_time_ms: end_time_ms, + instant_lock_quorums, + current_identities: identities, + }, + continue_strategy_no_operations.clone(), + config.clone(), + StrategyRandomness::SeedEntropy(2), + ); + + let withdrawal_documents_pooled = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + let withdrawal_documents_broadcasted = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + let withdrawal_documents_completed = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::COMPLETE.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + let withdrawal_documents_expired = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::EXPIRED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + assert!(withdrawal_documents_pooled.is_empty()); + assert!(withdrawal_documents_completed.is_empty()); + + assert_eq!(withdrawal_documents_broadcasted.len(), 1); + + assert!(withdrawal_documents_expired.is_empty()); + + outcome + }; + + // Update core state saying transaction is chainlocked + { + let mut core_state = shared_core_state.lock().unwrap(); + + // First, set all previously broadcasted transactions to Chainlocked + core_state + .asset_unlock_statuses + .iter_mut() + .for_each(|(index, status_result)| { + // Do not settle yet transactions that were broadcasted in the last block + status_result.index = *index; + status_result.status = AssetUnlockStatus::Chainlocked; + }); + + core_state.chain_lock.block_height = 51; + + drop(core_state); + } + + let outcome = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start: 7, + core_height_start: 51, + block_count: 1, + proposers, + validator_quorums: quorums, + current_validator_quorum_hash: current_quorum_hash, + current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, + current_votes: BTreeMap::default(), + start_time_ms: GENESIS_TIME_MS, + current_time_ms: end_time_ms, + instant_lock_quorums, + current_identities: identities, + }, + continue_strategy_no_operations.clone(), + config.clone(), + StrategyRandomness::SeedEntropy(2), + ); + + let withdrawal_documents_pooled = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + let withdrawal_documents_broadcasted = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + let withdrawal_documents_completed = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::COMPLETE.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + let withdrawal_documents_expired = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::EXPIRED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + assert_eq!(withdrawal_documents_completed.len(), 1); + assert!(withdrawal_documents_pooled.is_empty()); + assert!(withdrawal_documents_broadcasted.is_empty()); + assert!(withdrawal_documents_expired.is_empty()); } #[test] diff --git a/packages/rs-drive/src/drive/balances/mod.rs b/packages/rs-drive/src/drive/balances/mod.rs index 0af170831e..39f15f4298 100644 --- a/packages/rs-drive/src/drive/balances/mod.rs +++ b/packages/rs-drive/src/drive/balances/mod.rs @@ -79,7 +79,7 @@ mod tests { #[test] fn verify_total_credits_structure() { - let drive: Drive = setup_drive_with_initial_state_structure(); + let drive: Drive = setup_drive_with_initial_state_structure(None); let db_transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract_with_history/mod.rs b/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract_with_history/mod.rs index ee60215b7f..fdcb837850 100644 --- a/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract_with_history/mod.rs +++ b/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract_with_history/mod.rs @@ -256,7 +256,7 @@ mod tests { TestData { data_contract, - drive: setup_drive_with_initial_state_structure(), + drive: setup_drive_with_initial_state_structure(None), } } diff --git a/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/mod.rs b/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/mod.rs index e49ee0b1f8..5bee42052d 100644 --- a/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/mod.rs +++ b/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/mod.rs @@ -248,7 +248,7 @@ mod tests { #[test] fn should_return_none_if_contract_not_exist() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let result = drive @@ -261,7 +261,7 @@ mod tests { #[test] fn should_return_fees_for_non_existing_contract_if_epoch_is_passed() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let result = drive diff --git a/packages/rs-drive/src/drive/contract/mod.rs b/packages/rs-drive/src/drive/contract/mod.rs index 6ccfda8292..c48343d6c4 100644 --- a/packages/rs-drive/src/drive/contract/mod.rs +++ b/packages/rs-drive/src/drive/contract/mod.rs @@ -68,7 +68,7 @@ mod tests { #[deprecated(note = "This function is marked as unused.")] #[allow(deprecated)] fn setup_deep_nested_50_contract() -> (Drive, DataContract) { - let drive: Drive = setup_drive_with_initial_state_structure(); + let drive: Drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let contract_path = "tests/supporting_files/contract/deepNested/deep-nested50.json"; @@ -93,7 +93,7 @@ mod tests { #[deprecated(note = "This function is marked as unused.")] #[allow(deprecated)] fn setup_deep_nested_10_contract() -> (Drive, DataContract) { - let drive: Drive = setup_drive_with_initial_state_structure(); + let drive: Drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let contract_path = "tests/supporting_files/contract/deepNested/deep-nested10.json"; @@ -115,7 +115,7 @@ mod tests { } pub(in crate::drive::contract) fn setup_reference_contract() -> (Drive, DataContract) { - let drive: Drive = setup_drive_with_initial_state_structure(); + let drive: Drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let contract_path = "tests/supporting_files/contract/references/references.json"; @@ -138,7 +138,7 @@ mod tests { } pub(in crate::drive::contract) fn setup_dashpay() -> (Drive, DataContract) { - let drive: Drive = setup_drive_with_initial_state_structure(); + let drive: Drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); // let's construct the grovedb structure for the dashpay data contract @@ -159,7 +159,7 @@ mod tests { pub(in crate::drive::contract) fn setup_dashpay_with_generalized_encryption_contract( ) -> (Drive, DataContract) { - let drive: Drive = setup_drive_with_initial_state_structure(); + let drive: Drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); // let's construct the grovedb structure for the dashpay data contract @@ -419,7 +419,7 @@ mod tests { #[test] fn test_create_reference_contract_without_apply() { - let drive: Drive = setup_drive_with_initial_state_structure(); + let drive: Drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let contract_path = "tests/supporting_files/contract/references/references.json"; @@ -441,7 +441,7 @@ mod tests { #[test] fn test_create_reference_contract_with_history_without_apply() { - let drive: Drive = setup_drive_with_initial_state_structure(); + let drive: Drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let contract_path = @@ -464,7 +464,7 @@ mod tests { #[test] fn test_update_reference_contract_without_apply() { - let drive: Drive = setup_drive_with_initial_state_structure(); + let drive: Drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let contract_path = "tests/supporting_files/contract/references/references.json"; diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_fee_multiplier/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_fee_multiplier/v0/mod.rs index d89596e693..46984456fa 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_fee_multiplier/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_fee_multiplier/v0/mod.rs @@ -61,7 +61,7 @@ mod tests { #[test] fn test_error_if_epoch_tree_is_not_initiated_v0() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let transaction = drive.grove.start_transaction(); @@ -77,7 +77,7 @@ mod tests { #[test] fn test_error_if_value_has_invalid_length_v0() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let transaction = drive.grove.start_transaction(); @@ -106,7 +106,7 @@ mod tests { #[test] fn test_value_is_set_v0() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let transaction = drive.grove.start_transaction(); diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_processing_credits_for_distribution/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_processing_credits_for_distribution/v0/mod.rs index ad944b1d36..05782b23b2 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_processing_credits_for_distribution/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_processing_credits_for_distribution/v0/mod.rs @@ -54,7 +54,7 @@ mod tests { #[test] fn test_error_if_value_has_wrong_element_type() { let platform_version = PlatformVersion::latest(); - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let epoch = Epoch::new(0).unwrap(); diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_storage_credits_for_distribution/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_storage_credits_for_distribution/v0/mod.rs index f52962d3be..c12720a8b6 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_storage_credits_for_distribution/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_storage_credits_for_distribution/v0/mod.rs @@ -53,7 +53,7 @@ mod tests { #[test] fn test_error_if_epoch_tree_is_not_initiated_v0() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::latest(); @@ -75,7 +75,7 @@ mod tests { #[test] fn test_error_if_value_has_invalid_length_v0() { let platform_version = PlatformVersion::latest(); - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let epoch = Epoch::new(0).unwrap(); diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_total_credits_for_distribution/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_total_credits_for_distribution/v0/mod.rs index 9e6cf57e43..ea9fce1ef1 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_total_credits_for_distribution/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_total_credits_for_distribution/v0/mod.rs @@ -48,7 +48,7 @@ mod tests { #[test] fn test_get_epoch_total_credits_for_distribution_v0() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/has_epoch_tree_exists.rs b/packages/rs-drive/src/drive/credit_pools/epochs/has_epoch_tree_exists.rs index 7fca44958e..7106d15a79 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/has_epoch_tree_exists.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/has_epoch_tree_exists.rs @@ -41,7 +41,7 @@ mod tests { #[test] fn test_return_true_if_tree_exists() { let platform_version = PlatformVersion::latest(); - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let epoch_tree = Epoch::new(GENESIS_EPOCH_INDEX).unwrap(); @@ -59,7 +59,7 @@ mod tests { // default will be 40 epochs per era // 50 eras // = 2000 - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let epoch_tree = Epoch::new(2000 + 1).unwrap(); diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/operations_factory.rs b/packages/rs-drive/src/drive/credit_pools/epochs/operations_factory.rs index 8274656c2b..81248a8e5a 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/operations_factory.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/operations_factory.rs @@ -315,7 +315,7 @@ mod tests { #[test] fn test_increment_block_count_to_1_if_proposers_tree_is_not_committed() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::first(); @@ -358,7 +358,7 @@ mod tests { #[test] fn test_existing_block_count_is_incremented() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::first(); @@ -445,7 +445,7 @@ mod tests { #[test] fn test_values_are_set() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::first(); @@ -480,7 +480,7 @@ mod tests { #[test] fn test_values_are_set() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::first(); @@ -561,7 +561,7 @@ mod tests { #[test] fn test_values_are_deleted() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::first(); @@ -633,7 +633,7 @@ mod tests { #[test] fn test_value_is_set() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::first(); @@ -668,7 +668,7 @@ mod tests { #[test] fn test_update_start_time() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::first(); @@ -694,7 +694,7 @@ mod tests { #[test] fn test_update_epoch_start_block_height() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::first(); @@ -718,7 +718,7 @@ mod tests { #[test] fn test_update_epoch_start_block_core_height() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::first(); @@ -745,7 +745,7 @@ mod tests { #[test] fn test_error_if_epoch_tree_is_not_initiated() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::first(); @@ -767,7 +767,7 @@ mod tests { #[test] fn test_value_is_set() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::first(); @@ -801,7 +801,7 @@ mod tests { #[test] fn test_error_if_epoch_tree_is_not_initiated() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::first(); @@ -823,7 +823,7 @@ mod tests { #[test] fn test_value_is_set() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::first(); @@ -857,7 +857,7 @@ mod tests { #[test] fn test_values_has_been_deleted() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::first(); @@ -905,7 +905,7 @@ mod tests { #[test] fn test_values_are_being_deleted() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let epoch = Epoch::new(0).unwrap(); diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/proposers/fetch_epoch_proposers/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/proposers/fetch_epoch_proposers/v0/mod.rs index e86547c225..992cb31dd9 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/proposers/fetch_epoch_proposers/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/proposers/fetch_epoch_proposers/v0/mod.rs @@ -135,7 +135,7 @@ mod tests { #[test] fn test_value() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let transaction = drive.grove.start_transaction(); diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/proposers/get_epochs_proposer_block_count/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/proposers/get_epochs_proposer_block_count/v0/mod.rs index 9ebe6efdc3..8475308ffd 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/proposers/get_epochs_proposer_block_count/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/proposers/get_epochs_proposer_block_count/v0/mod.rs @@ -63,7 +63,7 @@ mod tests { #[test] fn test_error_if_value_has_invalid_length_v0() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let transaction = drive.grove.start_transaction(); @@ -100,7 +100,7 @@ mod tests { #[test] fn test_error_if_epoch_tree_is_not_initiated_v0() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let transaction = drive.grove.start_transaction(); diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/proposers/is_epochs_proposers_tree_empty/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/proposers/is_epochs_proposers_tree_empty/mod.rs index dad59b749e..a1266856f0 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/proposers/is_epochs_proposers_tree_empty/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/proposers/is_epochs_proposers_tree_empty/mod.rs @@ -51,7 +51,7 @@ mod tests { #[test] fn test_check_if_empty() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let drive_version = DriveVersion::default(); let transaction = drive.grove.start_transaction(); diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/proposers/prove_epoch_proposers/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/proposers/prove_epoch_proposers/v0/mod.rs index 396591cea5..8deba51b9b 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/proposers/prove_epoch_proposers/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/proposers/prove_epoch_proposers/v0/mod.rs @@ -63,7 +63,7 @@ mod tests { #[test] fn test_value() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let transaction = drive.grove.start_transaction(); diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/start_block/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/start_block/mod.rs index bea94b346e..2788fd9ff2 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/start_block/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/start_block/mod.rs @@ -43,7 +43,7 @@ mod tests { #[test] fn test_error_if_epoch_tree_is_not_initiated() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::latest(); @@ -64,7 +64,7 @@ mod tests { #[test] fn test_error_if_value_is_not_set() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::latest(); @@ -79,7 +79,7 @@ mod tests { #[test] fn test_error_if_value_has_invalid_length() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::latest(); @@ -110,7 +110,7 @@ mod tests { #[test] fn test_error_if_value_has_invalid_length_core_height() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::latest(); @@ -144,7 +144,7 @@ mod tests { #[test] fn test_error_if_element_has_invalid_type() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::latest(); @@ -175,7 +175,7 @@ mod tests { #[test] fn test_error_if_element_has_invalid_type_core_height() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let transaction = drive.grove.start_transaction(); @@ -218,7 +218,7 @@ mod tests { #[test] fn test_next_block_height() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::latest(); @@ -258,7 +258,7 @@ mod tests { #[test] fn test_none_if_there_are_no_start_block_heights() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::latest(); @@ -277,7 +277,7 @@ mod tests { #[test] fn test_none_if_start_block_height_is_outside_of_specified_epoch_range() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -309,7 +309,7 @@ mod tests { #[test] fn test_start_block_height_in_two_epoch_in_case_of_gaps() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/start_time/get_epoch_start_time/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/start_time/get_epoch_start_time/v0/mod.rs index 65414461dd..390a878b74 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/start_time/get_epoch_start_time/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/start_time/get_epoch_start_time/v0/mod.rs @@ -56,7 +56,7 @@ mod tests { #[test] fn test_error_if_epoch_tree_is_not_initiated() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::latest(); @@ -77,7 +77,7 @@ mod tests { #[test] fn test_error_if_value_is_not_set() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::latest(); @@ -92,7 +92,7 @@ mod tests { #[test] fn test_error_if_element_has_invalid_type() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::latest(); @@ -122,7 +122,7 @@ mod tests { #[test] fn test_error_if_value_has_invalid_length() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/src/drive/credit_pools/mod.rs b/packages/rs-drive/src/drive/credit_pools/mod.rs index 398980bc91..9696cce681 100644 --- a/packages/rs-drive/src/drive/credit_pools/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/mod.rs @@ -195,7 +195,7 @@ mod tests { #[test] fn should_do_nothing_if_credits_per_epoch_are_empty() { let platform_version = PlatformVersion::latest(); - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let credits_per_epoch = SignedCreditsPerEpoch::default(); @@ -216,7 +216,7 @@ mod tests { #[test] fn should_update_epoch_storage_fee_pools() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); const TO_EPOCH_INDEX: EpochIndex = 10; @@ -281,7 +281,7 @@ mod tests { #[test] fn should_subtract_negative_credits_from_future_epochs() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/src/drive/credit_pools/operations.rs b/packages/rs-drive/src/drive/credit_pools/operations.rs index 7dd78802b5..9aad69bf5b 100644 --- a/packages/rs-drive/src/drive/credit_pools/operations.rs +++ b/packages/rs-drive/src/drive/credit_pools/operations.rs @@ -52,7 +52,7 @@ mod tests { #[test] fn test_values_are_set() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::latest(); @@ -65,7 +65,7 @@ mod tests { #[test] fn test_epoch_trees_are_created() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let transaction = drive.grove.start_transaction(); @@ -106,7 +106,7 @@ mod tests { #[test] fn test_update_and_get_value() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/methods/add_delete_pending_epoch_refunds_except_specified/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/methods/add_delete_pending_epoch_refunds_except_specified/v0/mod.rs index 49cf61635e..21b200ade4 100644 --- a/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/methods/add_delete_pending_epoch_refunds_except_specified/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/methods/add_delete_pending_epoch_refunds_except_specified/v0/mod.rs @@ -74,7 +74,7 @@ mod tests { #[test] fn should_add_delete_operations_v0() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let transaction = drive.grove.start_transaction(); diff --git a/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/methods/fetch_and_add_pending_epoch_refunds_to_collection/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/methods/fetch_and_add_pending_epoch_refunds_to_collection/v0/mod.rs index c593f5d49f..737cadc748 100644 --- a/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/methods/fetch_and_add_pending_epoch_refunds_to_collection/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/methods/fetch_and_add_pending_epoch_refunds_to_collection/v0/mod.rs @@ -87,7 +87,7 @@ mod tests { #[test] fn should_fetch_and_merge_pending_updates_v0() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let transaction = drive.grove.start_transaction(); diff --git a/packages/rs-drive/src/drive/credit_pools/storage_fee_distribution_pool/get_storage_fees_from_distribution_pool/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/storage_fee_distribution_pool/get_storage_fees_from_distribution_pool/v0/mod.rs index 98e8dac0f1..ee90eec06c 100644 --- a/packages/rs-drive/src/drive/credit_pools/storage_fee_distribution_pool/get_storage_fees_from_distribution_pool/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/storage_fee_distribution_pool/get_storage_fees_from_distribution_pool/v0/mod.rs @@ -68,7 +68,7 @@ mod tests { #[test] fn test_error_if_wrong_value_encoded() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::first(); @@ -96,7 +96,7 @@ mod tests { #[test] fn test_error_if_storage_pool_is_not_initiated() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::first(); diff --git a/packages/rs-drive/src/drive/credit_pools/unpaid_epoch/get_unpaid_epoch_index/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/unpaid_epoch/get_unpaid_epoch_index/v0/mod.rs index a9c1e14a2d..bcfdaf59b1 100644 --- a/packages/rs-drive/src/drive/credit_pools/unpaid_epoch/get_unpaid_epoch_index/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/unpaid_epoch/get_unpaid_epoch_index/v0/mod.rs @@ -71,7 +71,7 @@ mod tests { #[test] fn test_error_if_element_has_invalid_type() { let platform_version = PlatformVersion::latest(); - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); // We need to first delete the item, because you can not replace an item with a tree @@ -111,7 +111,7 @@ mod tests { #[test] fn test_error_if_value_has_invalid_length() { let platform_version = PlatformVersion::latest(); - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); drive diff --git a/packages/rs-drive/src/drive/document/delete/mod.rs b/packages/rs-drive/src/drive/document/delete/mod.rs index 07d7326135..3f64724bfd 100644 --- a/packages/rs-drive/src/drive/document/delete/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/mod.rs @@ -181,7 +181,7 @@ mod tests { #[test] fn test_add_and_remove_family_one_document() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let db_transaction = drive.grove.start_transaction(); @@ -322,7 +322,7 @@ mod tests { #[test] fn test_add_and_remove_family_documents() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let db_transaction = drive.grove.start_transaction(); @@ -506,7 +506,7 @@ mod tests { #[test] fn test_add_and_remove_family_documents_with_empty_fields() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let db_transaction = drive.grove.start_transaction(); @@ -781,7 +781,7 @@ mod tests { #[test] fn test_delete_dashpay_documents() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let db_transaction = drive.grove.start_transaction(); @@ -881,7 +881,7 @@ mod tests { #[test] fn test_delete_dashpay_documents_without_apply() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let db_transaction = drive.grove.start_transaction(); diff --git a/packages/rs-drive/src/drive/document/insert/mod.rs b/packages/rs-drive/src/drive/document/insert/mod.rs index 6b88440bf2..ae327e8c30 100644 --- a/packages/rs-drive/src/drive/document/insert/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/mod.rs @@ -154,7 +154,7 @@ mod tests { #[test] fn test_add_dashpay_documents() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let db_transaction = drive.grove.start_transaction(); @@ -250,7 +250,7 @@ mod tests { #[test] fn test_add_dashpay_contact_request_with_fee() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let db_transaction = drive.grove.start_transaction(); @@ -315,7 +315,7 @@ mod tests { #[test] fn test_add_dashpay_profile_with_fee() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let db_transaction = drive.grove.start_transaction(); @@ -380,7 +380,7 @@ mod tests { #[test] fn test_add_dashpay_profile_average_case_cost_fee() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let db_transaction = drive.grove.start_transaction(); @@ -445,7 +445,7 @@ mod tests { #[test] fn test_unknown_state_cost_dashpay_fee_for_add_documents() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let db_transaction = drive.grove.start_transaction(); @@ -521,7 +521,7 @@ mod tests { #[test] fn test_add_dashpay_fee_for_documents_detail() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let db_transaction = drive.grove.start_transaction(); @@ -614,7 +614,7 @@ mod tests { #[test] fn test_add_dpns_document_with_fee() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let db_transaction = drive.grove.start_transaction(); diff --git a/packages/rs-drive/src/drive/document/mod.rs b/packages/rs-drive/src/drive/document/mod.rs index 08a8a4be48..fb0cd21529 100644 --- a/packages/rs-drive/src/drive/document/mod.rs +++ b/packages/rs-drive/src/drive/document/mod.rs @@ -155,7 +155,7 @@ pub(crate) mod tests { /// Setup Dashpay pub fn setup_dashpay(_prefix: &str, mutable_contact_requests: bool) -> (Drive, DataContract) { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/src/drive/document/update/mod.rs b/packages/rs-drive/src/drive/document/update/mod.rs index 313af57de8..e7dc236f43 100644 --- a/packages/rs-drive/src/drive/document/update/mod.rs +++ b/packages/rs-drive/src/drive/document/update/mod.rs @@ -514,7 +514,7 @@ mod tests { #[test] fn test_create_update_and_delete_document() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -673,7 +673,7 @@ mod tests { #[test] fn test_modify_dashpay_contact_request() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let db_transaction = drive.grove.start_transaction(); @@ -762,7 +762,7 @@ mod tests { #[test] fn test_update_dashpay_profile_with_history() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let db_transaction = drive.grove.start_transaction(); @@ -1815,7 +1815,7 @@ mod tests { #[test] fn test_update_document_without_apply_should_calculate_storage_fees() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/src/drive/identity/balance/prove.rs b/packages/rs-drive/src/drive/identity/balance/prove.rs index 81542d575a..0fcdd61cb5 100644 --- a/packages/rs-drive/src/drive/identity/balance/prove.rs +++ b/packages/rs-drive/src/drive/identity/balance/prove.rs @@ -70,7 +70,7 @@ mod tests { #[test] fn should_prove_a_single_identity_balance() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::first(); @@ -113,7 +113,7 @@ mod tests { #[test] fn should_prove_multiple_identity_balances() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let identities: BTreeMap<[u8; 32], Identity> = Identity::random_identities(10, 3, Some(14), platform_version) diff --git a/packages/rs-drive/src/drive/identity/balance/update.rs b/packages/rs-drive/src/drive/identity/balance/update.rs index df5644b546..dc7c94e3e7 100644 --- a/packages/rs-drive/src/drive/identity/balance/update.rs +++ b/packages/rs-drive/src/drive/identity/balance/update.rs @@ -22,7 +22,7 @@ mod tests { #[test] fn should_add_to_balance() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -89,7 +89,7 @@ mod tests { #[test] fn should_fail_if_balance_is_not_persisted() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -111,7 +111,7 @@ mod tests { #[test] fn should_deduct_from_debt_if_balance_is_nil() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let identity = create_test_identity(&drive, [0; 32], Some(1), None, platform_version) @@ -194,7 +194,7 @@ mod tests { #[test] fn should_keep_nil_balance_and_reduce_debt_if_added_balance_is_lower() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let identity = create_test_identity(&drive, [0; 32], Some(1), None, platform_version) .expect("expected an identity"); @@ -273,7 +273,7 @@ mod tests { #[test] fn should_estimate_costs_without_state() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -337,7 +337,7 @@ mod tests { #[test] fn should_remove_from_balance() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -405,7 +405,7 @@ mod tests { #[test] fn should_estimated_costs_without_state() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -481,7 +481,7 @@ mod tests { #[test] fn should_do_nothing_if_there_is_no_balance_change() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -505,7 +505,7 @@ mod tests { #[test] fn should_add_to_balance() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -570,7 +570,7 @@ mod tests { #[test] fn should_fail_if_balance_is_not_persisted() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -590,7 +590,7 @@ mod tests { #[test] fn should_deduct_from_debt_if_balance_is_nil() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -665,7 +665,7 @@ mod tests { #[test] fn should_keep_nil_balance_and_reduce_debt_if_added_balance_is_lower() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -734,7 +734,7 @@ mod tests { #[test] fn should_remove_from_balance_less_amount() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -788,7 +788,7 @@ mod tests { #[test] fn should_remove_from_balance_bigger_amount_and_get_into_debt() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -861,7 +861,7 @@ mod tests { #[test] fn should_return_error_if_required_amount_bigger_than_balance() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/src/drive/identity/fetch/full_identity/mod.rs b/packages/rs-drive/src/drive/identity/fetch/full_identity/mod.rs index 95dc07e00d..ebfe8128a9 100644 --- a/packages/rs-drive/src/drive/identity/fetch/full_identity/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/full_identity/mod.rs @@ -17,7 +17,7 @@ mod tests { #[test] fn should_get_full_identities() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let identities: BTreeMap<[u8; 32], Option> = @@ -60,7 +60,7 @@ mod tests { #[test] fn should_return_none_if_identity_is_not_present() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -80,7 +80,7 @@ mod tests { #[test] fn should_get_a_full_identity() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let identity = Identity::random_identity(3, Some(14), platform_version) diff --git a/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identities/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identities/v0/mod.rs index 66e2899199..1bac303eee 100644 --- a/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identities/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identities/v0/mod.rs @@ -38,7 +38,7 @@ mod tests { #[test] fn should_prove_two_full_identities_query_no_tx() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let identities: BTreeMap<[u8; 32], Option> = @@ -111,7 +111,7 @@ mod tests { #[test] fn should_prove_ten_full_identities_query_no_tx() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let identities: BTreeMap<[u8; 32], Option> = diff --git a/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identities_by_unique_public_key_hashes/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identities_by_unique_public_key_hashes/v0/mod.rs index b7be9365d3..44f7965678 100644 --- a/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identities_by_unique_public_key_hashes/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identities_by_unique_public_key_hashes/v0/mod.rs @@ -63,7 +63,7 @@ mod tests { #[test] fn should_prove_multiple_identities() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identity/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identity/v0/mod.rs index 4d3676d9b1..1f8cc5580c 100644 --- a/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identity/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identity/v0/mod.rs @@ -37,7 +37,7 @@ mod tests { #[test] fn should_prove_full_identity_query_no_tx() { let platform_version = PlatformVersion::latest(); - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let identity = Identity::random_identity(5, Some(14), platform_version) .expect("expected a random identity"); diff --git a/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identity_by_unique_public_key_hash/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identity_by_unique_public_key_hash/v0/mod.rs index 3df63086c2..f474fa5231 100644 --- a/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identity_by_unique_public_key_hash/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identity_by_unique_public_key_hash/v0/mod.rs @@ -57,7 +57,7 @@ mod tests { #[test] fn should_prove_a_single_identity() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::first(); diff --git a/packages/rs-drive/src/drive/identity/fetch/prove/prove_identity_id_by_unique_public_key_hash/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/prove/prove_identity_id_by_unique_public_key_hash/v0/mod.rs index cd41d83e24..8900c2e2dc 100644 --- a/packages/rs-drive/src/drive/identity/fetch/prove/prove_identity_id_by_unique_public_key_hash/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/prove/prove_identity_id_by_unique_public_key_hash/v0/mod.rs @@ -32,7 +32,7 @@ mod tests { #[test] fn should_prove_a_single_identity_id() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let identity = Identity::random_identity(3, Some(14), platform_version) .expect("expected a random identity"); diff --git a/packages/rs-drive/src/drive/identity/fetch/prove/prove_identity_ids_by_unique_public_key_hashes/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/prove/prove_identity_ids_by_unique_public_key_hashes/v0/mod.rs index 28a7cfa35c..1b4636e6b5 100644 --- a/packages/rs-drive/src/drive/identity/fetch/prove/prove_identity_ids_by_unique_public_key_hashes/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/prove/prove_identity_ids_by_unique_public_key_hashes/v0/mod.rs @@ -38,7 +38,7 @@ mod tests { #[test] fn should_prove_multiple_identity_ids() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let identities: BTreeMap<[u8; 32], Identity> = diff --git a/packages/rs-drive/src/drive/identity/insert/add_new_identity/v0/mod.rs b/packages/rs-drive/src/drive/identity/insert/add_new_identity/v0/mod.rs index 6b6dfbf6d0..f756234431 100644 --- a/packages/rs-drive/src/drive/identity/insert/add_new_identity/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/insert/add_new_identity/v0/mod.rs @@ -320,7 +320,7 @@ mod tests { #[test] fn test_insert_identity_v0() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let db_transaction = drive.grove.start_transaction(); diff --git a/packages/rs-drive/src/drive/identity/update/mod.rs b/packages/rs-drive/src/drive/identity/update/mod.rs index b28d7f3134..c846d8d43d 100644 --- a/packages/rs-drive/src/drive/identity/update/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/mod.rs @@ -21,7 +21,7 @@ mod tests { #[test] fn should_add_one_new_key_to_identity() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::first(); @@ -81,7 +81,7 @@ mod tests { #[test] fn should_add_two_dozen_new_keys_to_identity() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::first(); @@ -141,7 +141,7 @@ mod tests { #[test] fn should_estimated_costs_without_state() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::first(); @@ -200,7 +200,7 @@ mod tests { #[test] fn should_disable_a_few_keys() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::first(); @@ -279,7 +279,7 @@ mod tests { #[test] fn should_estimated_costs_without_state() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::first(); @@ -328,7 +328,7 @@ mod tests { #[test] fn estimated_costs_should_have_same_storage_cost() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::first(); @@ -387,7 +387,7 @@ mod tests { #[test] fn should_update_revision() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::first(); @@ -447,7 +447,7 @@ mod tests { #[test] fn should_estimated_costs_without_state() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::first(); diff --git a/packages/rs-drive/src/drive/identity/withdrawals/document/fetch_oldest_withdrawal_documents_by_status/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/document/fetch_oldest_withdrawal_documents_by_status/v0/mod.rs index b60e41be44..4e611e39fb 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/document/fetch_oldest_withdrawal_documents_by_status/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/document/fetch_oldest_withdrawal_documents_by_status/v0/mod.rs @@ -113,7 +113,7 @@ mod tests { #[test] fn test_return_list_of_documents() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); diff --git a/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs index e6b4a8e640..ea92ef5a67 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs @@ -116,7 +116,7 @@ mod tests { #[test] fn test_find_pooled_withdrawal_documents_by_transaction_index() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); diff --git a/packages/rs-drive/src/drive/identity/withdrawals/paths.rs b/packages/rs-drive/src/drive/identity/withdrawals/paths.rs index fd1e3d0405..3d85be63b3 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/paths.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/paths.rs @@ -10,6 +10,8 @@ pub const WITHDRAWAL_TRANSACTIONS_NEXT_INDEX_KEY: [u8; 1] = [0]; pub const WITHDRAWAL_TRANSACTIONS_QUEUE_KEY: [u8; 1] = [1]; /// constant id for subtree containing the sum of withdrawals pub const WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY: [u8; 1] = [2]; +/// constant id for subtree containing the untied withdrawal transactions after they were broadcasted +pub const WITHDRAWAL_TRANSACTIONS_BROADCASTED_KEY: [u8; 1] = [3]; impl Drive { /// Add operations for creating initial withdrawal state structure @@ -33,6 +35,10 @@ impl Drive { vec![vec![RootTree::WithdrawalTransactions as u8]], WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY.to_vec(), ); + batch.add_insert_empty_sum_tree( + vec![vec![RootTree::WithdrawalTransactions as u8]], + WITHDRAWAL_TRANSACTIONS_BROADCASTED_KEY.to_vec(), + ); } } } @@ -78,3 +84,19 @@ pub fn get_withdrawal_transactions_sum_tree_path() -> [&'static [u8]; 2] { &WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, ] } + +/// Helper function to get the withdrawal transactions broadcasted path as Vec +pub fn get_withdrawal_transactions_broadcasted_path_vec() -> Vec> { + vec![ + vec![RootTree::WithdrawalTransactions as u8], + WITHDRAWAL_TRANSACTIONS_BROADCASTED_KEY.to_vec(), + ] +} + +/// Helper function to get the withdrawal transactions broadcasted path as [u8] +pub fn get_withdrawal_transactions_broadcasted_path() -> [&'static [u8]; 2] { + [ + Into::<&[u8; 1]>::into(RootTree::WithdrawalTransactions), + &WITHDRAWAL_TRANSACTIONS_BROADCASTED_KEY, + ] +} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/mod.rs index 9928d324da..a2dafcb7cb 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/mod.rs @@ -14,7 +14,7 @@ mod tests { #[test] fn test_next_withdrawal_transaction_index() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -59,7 +59,7 @@ mod tests { #[test] fn test_initial_withdrawal_transaction_index() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/v0/mod.rs index 6edeaa9822..5911ed5cda 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/v0/mod.rs @@ -69,12 +69,14 @@ impl Drive { }) .collect::, Error>>()?; - if !withdrawal_transactions.is_empty() { - for (index, _) in withdrawal_transactions.iter() { - drive_operation_types.push(DriveOperation::WithdrawalOperation( - WithdrawalOperationType::DeleteWithdrawalTransaction { index: *index }, - )); - } + let indexes: Vec = withdrawal_transactions + .iter() + .map(|(index, _)| *index) + .collect(); + if !indexes.is_empty() { + drive_operation_types.push(DriveOperation::WithdrawalOperation( + WithdrawalOperationType::MoveWithdrawalTransactionsToBroadcasted { indexes }, + )); } Ok(withdrawal_transactions) diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/mod.rs index 8926ea5c0c..b7817dd338 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/mod.rs @@ -1,8 +1,14 @@ -/// This module dedicated for a versioned add_enqueue_untied_withdrawal_transaction_operations +/// This module is dedicated for a versioned add_enqueue_untied_withdrawal_transaction_operations pub mod add_enqueue_untied_withdrawal_transaction_operations; -/// This module dedicated for a versioned dequeue_untied_withdrawal_transactions +/// This module is dedicated for a versioned dequeue_untied_withdrawal_transactions pub mod dequeue_untied_withdrawal_transactions; +/// This module is dedicated to removing broadcasted withdrawal transactions after core says they were completed +pub mod remove_broadcasted_withdrawal_transactions_after_completion; + +/// This module is dedicated to moving broadcasted withdrawal transactions back to the main queue +pub mod move_broadcasted_withdrawal_transactions_back_to_queue_operations; + #[cfg(test)] mod tests { use crate::util::batch::DriveOperation; @@ -10,14 +16,13 @@ mod tests { use dpp::block::epoch::Epoch; use crate::util::test_helpers::setup::setup_drive_with_initial_state_structure; - use dpp::version::PlatformVersion; use dpp::withdrawal::{WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes}; + use platform_version::version::PlatformVersion; #[test] fn test_enqueue_and_dequeue() { - let drive = setup_drive_with_initial_state_structure(); - let platform_version = PlatformVersion::latest(); + let drive = setup_drive_with_initial_state_structure(None); let transaction = drive.grove.start_transaction(); diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/move_broadcasted_withdrawal_transactions_back_to_queue_operations/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/move_broadcasted_withdrawal_transactions_back_to_queue_operations/mod.rs new file mode 100644 index 0000000000..d7ca0deb45 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/move_broadcasted_withdrawal_transactions_back_to_queue_operations/mod.rs @@ -0,0 +1,43 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::util::batch::DriveOperation; +use dpp::withdrawal::WithdrawalTransactionIndex; +use platform_version::version::PlatformVersion; + +mod v0; + +impl Drive { + /// Moves broadcasted withdrawal transactions back to the queue + pub fn move_broadcasted_withdrawal_transactions_back_to_queue_operations( + &self, + indexes: Vec, + drive_operation_types: &mut Vec, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version + .drive + .methods + .identity + .withdrawals + .transaction + .queue + .move_broadcasted_withdrawal_transactions_back_to_queue_operations + { + 0 => { + self.move_broadcasted_withdrawal_transactions_back_to_queue_operations_v0( + indexes, + drive_operation_types, + ); + + Ok(()) + } + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "move_broadcasted_withdrawal_transactions_back_to_queue_operations" + .to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/move_broadcasted_withdrawal_transactions_back_to_queue_operations/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/move_broadcasted_withdrawal_transactions_back_to_queue_operations/v0/mod.rs new file mode 100644 index 0000000000..7fc17d4d8a --- /dev/null +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/move_broadcasted_withdrawal_transactions_back_to_queue_operations/v0/mod.rs @@ -0,0 +1,25 @@ +use crate::drive::Drive; +use crate::util::batch::drive_op_batch::WithdrawalOperationType; +use crate::util::batch::DriveOperation; +use dpp::withdrawal::WithdrawalTransactionIndex; + +impl Drive { + pub(super) fn move_broadcasted_withdrawal_transactions_back_to_queue_operations_v0( + &self, + indexes: Vec, + drive_operation_types: &mut Vec, + ) { + if !indexes.is_empty() { + tracing::trace!( + "Moving {} broadcasted withdrawal transactions back to the queue for resigning: {:?}", + indexes.len(), + indexes + ); + drive_operation_types.push(DriveOperation::WithdrawalOperation( + WithdrawalOperationType::MoveBroadcastedWithdrawalTransactionsBackToQueueForResigning { + indexes, + }, + )); + } + } +} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/remove_broadcasted_withdrawal_transactions_after_completion/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/remove_broadcasted_withdrawal_transactions_after_completion/mod.rs new file mode 100644 index 0000000000..a3f0c50dbc --- /dev/null +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/remove_broadcasted_withdrawal_transactions_after_completion/mod.rs @@ -0,0 +1,40 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::util::batch::DriveOperation; +use dpp::withdrawal::WithdrawalTransactionIndex; +use platform_version::version::PlatformVersion; + +impl Drive { + /// Get specified amount of withdrawal transactions from the DB + pub fn remove_broadcasted_withdrawal_transactions_after_completion_operations( + &self, + indexes: Vec, + drive_operation_types: &mut Vec, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version + .drive + .methods + .identity + .withdrawals + .transaction + .queue + .remove_broadcasted_withdrawal_transactions_after_completion_operations + { + 0 => Ok(self + .remove_broadcasted_withdrawal_transactions_after_completion_operations_v0( + indexes, + drive_operation_types, + )), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "remove_broadcasted_withdrawal_transactions_after_completion_operations" + .to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/remove_broadcasted_withdrawal_transactions_after_completion/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/remove_broadcasted_withdrawal_transactions_after_completion/v0/mod.rs new file mode 100644 index 0000000000..70cf03bad1 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/remove_broadcasted_withdrawal_transactions_after_completion/v0/mod.rs @@ -0,0 +1,15 @@ +use crate::drive::Drive; +use crate::util::batch::drive_op_batch::WithdrawalOperationType; +use crate::util::batch::DriveOperation; +use dpp::withdrawal::WithdrawalTransactionIndex; +impl Drive { + pub(super) fn remove_broadcasted_withdrawal_transactions_after_completion_operations_v0( + &self, + indexes: Vec, + drive_operation_types: &mut Vec, + ) { + drive_operation_types.push(DriveOperation::WithdrawalOperation( + WithdrawalOperationType::DeleteCompletedBroadcastedWithdrawalTransactions { indexes }, + )); + } +} diff --git a/packages/rs-drive/src/drive/initialization/genesis_core_height/mod.rs b/packages/rs-drive/src/drive/initialization/genesis_core_height/mod.rs index 5e8f21d95e..189bbac47a 100644 --- a/packages/rs-drive/src/drive/initialization/genesis_core_height/mod.rs +++ b/packages/rs-drive/src/drive/initialization/genesis_core_height/mod.rs @@ -81,7 +81,7 @@ mod tests { #[test] fn test_initial_state_structure_proper_heights() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let db_transaction = drive.grove.start_transaction(); diff --git a/packages/rs-drive/src/drive/initialization/v0/mod.rs b/packages/rs-drive/src/drive/initialization/v0/mod.rs index 39387184e5..ff30075d68 100644 --- a/packages/rs-drive/src/drive/initialization/v0/mod.rs +++ b/packages/rs-drive/src/drive/initialization/v0/mod.rs @@ -199,7 +199,7 @@ mod tests { #[test] fn test_create_initial_state_structure() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -228,7 +228,7 @@ mod tests { #[test] fn test_initial_state_structure_proper_heights() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let _db_transaction = drive.grove.start_transaction(); diff --git a/packages/rs-drive/src/drive/system/genesis_time/mod.rs b/packages/rs-drive/src/drive/system/genesis_time/mod.rs index cd888ccd31..9eee51529b 100644 --- a/packages/rs-drive/src/drive/system/genesis_time/mod.rs +++ b/packages/rs-drive/src/drive/system/genesis_time/mod.rs @@ -94,7 +94,7 @@ mod tests { #[test] fn should_return_some_if_genesis_time_is_persisted() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let genesis_time_ms = 100; diff --git a/packages/rs-drive/src/query/mod.rs b/packages/rs-drive/src/query/mod.rs index 456b4fc411..1d7cf24371 100644 --- a/packages/rs-drive/src/query/mod.rs +++ b/packages/rs-drive/src/query/mod.rs @@ -2038,7 +2038,7 @@ mod tests { } fn setup_family_birthday_contract() -> (Drive, DataContract) { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/src/util/batch/drive_op_batch/mod.rs b/packages/rs-drive/src/util/batch/drive_op_batch/mod.rs index 144bcda787..abdd9f4cc6 100644 --- a/packages/rs-drive/src/util/batch/drive_op_batch/mod.rs +++ b/packages/rs-drive/src/util/batch/drive_op_batch/mod.rs @@ -229,7 +229,7 @@ mod tests { #[test] fn test_add_dashpay_documents() { - let drive: Drive = setup_drive_with_initial_state_structure(); + let drive: Drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); let mut drive_operations = vec![]; @@ -336,7 +336,7 @@ mod tests { #[test] fn test_add_multiple_dashpay_documents_individually_should_succeed() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -435,7 +435,7 @@ mod tests { #[test] fn test_add_multiple_dashpay_documents() { - let drive: Drive = setup_drive_with_initial_state_structure(); + let drive: Drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -568,7 +568,7 @@ mod tests { #[test] fn test_add_multiple_family_documents() { - let drive: Drive = setup_drive_with_initial_state_structure(); + let drive: Drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -679,7 +679,7 @@ mod tests { #[test] fn test_update_multiple_family_documents() { - let drive: Drive = setup_drive_with_initial_state_structure(); + let drive: Drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -897,7 +897,7 @@ mod tests { #[test] fn test_update_multiple_family_documents_with_index_being_removed_and_added() { - let drive: Drive = setup_drive_with_initial_state_structure(); + let drive: Drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/src/util/batch/drive_op_batch/withdrawals.rs b/packages/rs-drive/src/util/batch/drive_op_batch/withdrawals.rs index a24c5b8efe..2a95fc39a7 100644 --- a/packages/rs-drive/src/util/batch/drive_op_batch/withdrawals.rs +++ b/packages/rs-drive/src/util/batch/drive_op_batch/withdrawals.rs @@ -1,22 +1,26 @@ use std::collections::HashMap; use crate::drive::identity::withdrawals::paths::{ - get_withdrawal_root_path_vec, get_withdrawal_transactions_queue_path, + get_withdrawal_root_path_vec, get_withdrawal_transactions_broadcasted_path, + get_withdrawal_transactions_broadcasted_path_vec, get_withdrawal_transactions_queue_path, get_withdrawal_transactions_queue_path_vec, get_withdrawal_transactions_sum_tree_path_vec, WITHDRAWAL_TRANSACTIONS_NEXT_INDEX_KEY, }; -use crate::util::grove_operations::{BatchDeleteApplyType, BatchInsertApplyType}; +use crate::util::grove_operations::{ + BatchDeleteApplyType, BatchInsertApplyType, BatchMoveApplyType, +}; use crate::util::object_size_info::PathKeyElementInfo; use crate::{drive::Drive, error::Error, fees::op::LowLevelDriveOperation}; use dpp::block::block_info::BlockInfo; use super::DriveLowLevelOperationConverter; +use crate::query::Query; use dpp::fee::{Credits, SignedCredits}; use dpp::prelude::TimestampMillis; use dpp::version::PlatformVersion; use dpp::withdrawal::{WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes}; -use grovedb::Element; use grovedb::{batch::KeyInfoPath, EstimatedLayerInformation, TransactionArg}; +use grovedb::{Element, PathQuery, SizedQuery}; /// Operations for Withdrawals #[derive(Clone, Debug)] @@ -31,10 +35,20 @@ pub enum WithdrawalOperationType { /// transaction id bytes withdrawal_transactions: Vec, }, - /// Delete withdrawal - DeleteWithdrawalTransaction { - /// withdrawal transaction tuple with id and bytes - index: WithdrawalTransactionIndex, + /// Deletes the withdrawal transactions from the main queue and adds them to the broadcasted queue + MoveWithdrawalTransactionsToBroadcasted { + /// A vector of the indexes to be moved + indexes: Vec, + }, + /// Deletes the withdrawal transactions from the main queue and adds them to the broadcasted queue + MoveBroadcastedWithdrawalTransactionsBackToQueueForResigning { + /// A vector of the indexes to be moved + indexes: Vec, + }, + /// Deletes the withdrawal transactions from the broadcasted queue + DeleteCompletedBroadcastedWithdrawalTransactions { + /// A vector of the indexes to be deleted + indexes: Vec, }, /// Reserve an amount in the system for withdrawals, the reservation will expire at the date given ReserveWithdrawalAmount { @@ -119,14 +133,116 @@ impl DriveLowLevelOperationConverter for WithdrawalOperationType { Ok(drive_operations) } - WithdrawalOperationType::DeleteWithdrawalTransaction { index } => { + WithdrawalOperationType::MoveWithdrawalTransactionsToBroadcasted { indexes } => { + let mut drive_operations = vec![]; + + if indexes.is_empty() { + return Ok(drive_operations); + } + + let original_path = get_withdrawal_transactions_queue_path_vec(); + let new_path = get_withdrawal_transactions_broadcasted_path_vec(); + + let mut query = Query::new(); + + let len = indexes.len(); + + query.insert_keys( + indexes + .into_iter() + .map(|index| index.to_be_bytes().to_vec()) + .collect(), + ); + + let path_query = PathQuery::new( + original_path, + SizedQuery::new(query, Some(len as u16), None), + ); + + drive.batch_move_items_in_path_query( + &path_query, + new_path, + true, + // we know that we are not deleting a subtree + BatchMoveApplyType::StatefulBatchMove { + is_known_to_be_subtree_with_sum: Some((false, false)), + }, + transaction, + &mut drive_operations, + &platform_version.drive, + )?; + + Ok(drive_operations) + } + WithdrawalOperationType::MoveBroadcastedWithdrawalTransactionsBackToQueueForResigning { indexes } => { + let mut drive_operations = vec![]; + + if indexes.is_empty() { + return Ok(drive_operations); + } + + let original_path = get_withdrawal_transactions_broadcasted_path_vec(); + let new_path = get_withdrawal_transactions_queue_path_vec(); + + let mut query = Query::new(); + + let len = indexes.len(); + + query.insert_keys( + indexes + .into_iter() + .map(|index| index.to_be_bytes().to_vec()) + .collect(), + ); + + let path_query = PathQuery::new( + original_path, + SizedQuery::new(query, Some(len as u16), None), + ); + + drive.batch_move_items_in_path_query( + &path_query, + new_path, + true, + // we know that we are not deleting a subtree + BatchMoveApplyType::StatefulBatchMove { + is_known_to_be_subtree_with_sum: Some((false, false)), + }, + transaction, + &mut drive_operations, + &platform_version.drive, + )?; + + Ok(drive_operations) + } + WithdrawalOperationType::DeleteCompletedBroadcastedWithdrawalTransactions { indexes } => { let mut drive_operations = vec![]; - let path = get_withdrawal_transactions_queue_path(); + if indexes.is_empty() { + return Ok(drive_operations); + } + + let path = get_withdrawal_transactions_broadcasted_path_vec(); + + let mut query = Query::new(); + + let len = indexes.len(); + + query.insert_keys( + indexes + .into_iter() + .map(|index| index.to_be_bytes().to_vec()) + .collect(), + ); + + let path_query = PathQuery::new( + path, + SizedQuery::new(query, Some(len as u16), None), + ); - drive.batch_delete( - (&path).into(), - &index.to_be_bytes(), + drive.batch_delete_items_in_path_query( + &path_query, + true, // we know that we are not deleting a subtree BatchDeleteApplyType::StatefulBatchDelete { is_known_to_be_subtree_with_sum: Some((false, false)), diff --git a/packages/rs-drive/src/util/grove_operations/batch_move_items_in_path_query/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_move_items_in_path_query/mod.rs new file mode 100644 index 0000000000..ae886e0f54 --- /dev/null +++ b/packages/rs-drive/src/util/grove_operations/batch_move_items_in_path_query/mod.rs @@ -0,0 +1,58 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::BatchMoveApplyType; + +use dpp::version::drive_versions::DriveVersion; + +use grovedb::{PathQuery, TransactionArg}; + +impl Drive { + /// Pushes multiple "delete element" and "insert element operations for items in a given path based on a `PathQuery` to `drive_operations`. + /// + /// # Parameters + /// * `path_query`: The path query specifying the items to delete within the path. + /// * `error_if_intermediate_path_tree_not_present`: Tells the function to either error or do nothing if an intermediate tree is not present. + /// * `apply_type`: The apply type for the move operations. + /// * `transaction`: The transaction argument. + /// * `drive_operations`: The vector containing low-level drive operations. + /// * `drive_version`: The drive version to select the correct function version to run. + /// + /// # Returns + /// * `Ok(())` if the operation was successful. + /// * `Err(DriveError::UnknownVersionMismatch)` if the drive version does not match known versions. + pub fn batch_move_items_in_path_query( + &self, + path_query: &PathQuery, + new_path: Vec>, + error_if_intermediate_path_tree_not_present: bool, + apply_type: BatchMoveApplyType, + transaction: TransactionArg, + drive_operations: &mut Vec, + drive_version: &DriveVersion, + ) -> Result<(), Error> { + match drive_version + .grove_methods + .batch + .batch_move_items_in_path_query + { + 0 => self.batch_move_items_in_path_query_v0( + path_query, + new_path, + error_if_intermediate_path_tree_not_present, + apply_type, + transaction, + drive_operations, + drive_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "batch_move_items_in_path_query".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/util/grove_operations/batch_move_items_in_path_query/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_move_items_in_path_query/v0/mod.rs new file mode 100644 index 0000000000..f8b2b904cc --- /dev/null +++ b/packages/rs-drive/src/util/grove_operations/batch_move_items_in_path_query/v0/mod.rs @@ -0,0 +1,530 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::fees::op::LowLevelDriveOperation::GroveOperation; +use crate::util::grove_operations::{push_drive_operation_result, BatchMoveApplyType}; +use grovedb::batch::key_info::KeyInfo; +use grovedb::batch::{KeyInfoPath, QualifiedGroveDbOp}; +use grovedb::operations::delete::DeleteOptions; +use grovedb::query_result_type::QueryResultType; +use grovedb::{GroveDb, PathQuery, TransactionArg}; +use grovedb_storage::rocksdb_storage::RocksDbStorage; +use platform_version::version::drive_versions::DriveVersion; + +impl Drive { + /// Version 0 implementation of the "delete multiple elements" and "insert multiple elements" operation based on a `PathQuery`. + /// Deletes items in the specified path that match the given query. + /// Then inserts those items at the given path. + /// + /// # Parameters + /// * `path_query`: The path query specifying the items to delete within the path. + /// * `error_if_intermediate_path_tree_not_present`: Tells the function to either error or do nothing if an intermediate tree is not present. + /// * `apply_type`: The apply type for the move operations. + /// * `transaction`: The transaction argument. + /// * `drive_operations`: The vector containing low-level drive operations. + /// * `drive_version`: The drive version to select the correct function version to run. + /// + /// # Returns + /// * `Ok(())` if the operation was successful. + /// * `Err(DriveError::CorruptedCodeExecution)` if the operation is not supported. + pub(super) fn batch_move_items_in_path_query_v0( + &self, + path_query: &PathQuery, + new_path: Vec>, + error_if_intermediate_path_tree_not_present: bool, + apply_type: BatchMoveApplyType, + transaction: TransactionArg, + drive_operations: &mut Vec, + drive_version: &DriveVersion, + ) -> Result<(), Error> { + if path_query.query.limit == None { + return Err(Error::Drive(DriveError::NotSupported( + "Limits are required for path_query", + ))); + } + let query_result = if path_query + .query + .query + .items + .iter() + .all(|query_item| query_item.is_key()) + { + // Fetch the elements that match the path query + let query_result = self.grove_get_raw_path_query_with_optional( + path_query, + error_if_intermediate_path_tree_not_present, + transaction, + drive_operations, + drive_version, + )?; + + query_result + .into_iter() + .filter_map(|(path, key, maybe_element)| { + maybe_element.map(|element| (path, key, element)) + }) + .collect() + } else { + self.grove_get_raw_path_query( + path_query, + transaction, + QueryResultType::QueryPathKeyElementTrioResultType, + drive_operations, + drive_version, + )? + .0 + .to_path_key_elements() + }; + + // Iterate over each element and add a delete operation for it + for (path, key, element) in query_result { + let current_batch_operations = + LowLevelDriveOperation::grovedb_operations_batch(drive_operations); + let options = DeleteOptions { + allow_deleting_non_empty_trees: false, + deleting_non_empty_trees_returns_error: true, + base_root_storage_is_free: true, + validate_tree_at_path_exists: false, + }; + let delete_operation = match apply_type { + BatchMoveApplyType::StatelessBatchMove { + is_sum_tree, + estimated_key_size, + estimated_value_size, + .. + } => GroveDb::average_case_delete_operation_for_delete::( + &KeyInfoPath::from_known_owned_path(path.to_vec()), + &KeyInfo::KnownKey(key.to_vec()), + is_sum_tree, + false, + true, + 0, + (estimated_key_size, estimated_value_size), + &drive_version.grove_version, + ) + .map(|r| r.map(Some)), + BatchMoveApplyType::StatefulBatchMove { + is_known_to_be_subtree_with_sum, + } => self.grove.delete_operation_for_delete_internal( + (path.as_slice()).into(), + key.as_slice(), + &options, + is_known_to_be_subtree_with_sum, + ¤t_batch_operations.operations, + transaction, + &drive_version.grove_version, + ), + }; + + if let Some(delete_operation) = + push_drive_operation_result(delete_operation, drive_operations)? + { + // Add the delete operation to the batch of drive operations + drive_operations.push(GroveOperation(delete_operation)); + // Adds the insert operation to the batch of drive operations + drive_operations.push(GroveOperation(QualifiedGroveDbOp::insert_or_replace_op( + new_path.clone(), + key, + element, + ))); + } + } + + Ok(()) + } +} +#[cfg(test)] +mod tests { + use crate::util::grove_operations::QueryType; + use crate::{ + error::Error, util::grove_operations::BatchMoveApplyType, + util::test_helpers::setup::setup_drive, + }; + use assert_matches::assert_matches; + use grovedb::{Element, PathQuery, Query, SizedQuery}; + use grovedb_path::SubtreePath; + use platform_version::version::PlatformVersion; + + #[test] + fn test_batch_move_items_in_path_query_success() { + // Set up a test drive instance and transaction + let drive = setup_drive(None); + let platform_version = PlatformVersion::latest(); + let transaction = drive.grove.start_transaction(); + + // Insert elements that will be moved + let path = vec![b"root".to_vec()]; + let new_path = vec![b"new_root".to_vec()]; + let key1 = b"key1".to_vec(); + let key2 = b"key2".to_vec(); + let element1 = Element::new_item(b"value1".to_vec()); + let element2 = Element::new_item(b"value2".to_vec()); + + // Insert the root tree and new root tree + drive + .grove_insert_empty_tree( + SubtreePath::empty(), + b"root", + Some(&transaction), + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to insert root tree"); + + drive + .grove_insert_empty_tree( + SubtreePath::empty(), + b"new_root", + Some(&transaction), + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to insert new root tree"); + + drive + .grove + .insert( + path.as_slice(), + &key1, + element1.clone(), + None, + Some(&transaction), + &platform_version.drive.grove_version, + ) + .unwrap() + .expect("expected to insert element1"); + + drive + .grove + .insert( + path.as_slice(), + &key2, + element2.clone(), + None, + Some(&transaction), + &platform_version.drive.grove_version, + ) + .unwrap() + .expect("expected to insert element2"); + + // Create a path query that matches the inserted elements + let mut query = Query::new(); + query.insert_key(key1.clone()); + query.insert_key(key2.clone()); + let path_query = PathQuery::new(path.clone(), SizedQuery::new(query, Some(100), None)); + + // Set up the apply type and drive operations vector + let apply_type = BatchMoveApplyType::StatefulBatchMove { + is_known_to_be_subtree_with_sum: Some((false, false)), + }; + let mut drive_operations = Vec::new(); + + // Call the function + drive + .batch_move_items_in_path_query_v0( + &path_query, + new_path.clone(), + true, + apply_type, + Some(&transaction), + &mut drive_operations, + &platform_version.drive, + ) + .expect("expected to move items"); + + // Apply batch operations + drive + .apply_batch_low_level_drive_operations( + None, + Some(&transaction), + drive_operations, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to apply operations"); + + // Commit the transaction + drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + // Verify that keys have been moved to the new path + let get_result_1 = drive.grove_get( + new_path.as_slice().into(), + &key1, + QueryType::StatefulQuery, + None, + &mut vec![], + &platform_version.drive, + ); + assert_matches!(get_result_1, Ok(Some(Element::Item(value, _))) if value == b"value1".to_vec()); + + let get_result_2 = drive.grove_get( + new_path.as_slice().into(), + &key2, + QueryType::StatefulQuery, + None, + &mut vec![], + &platform_version.drive, + ); + assert_matches!(get_result_2, Ok(Some(Element::Item(value, _))) if value == b"value2".to_vec()); + + // Verify that keys are no longer in the original path + let get_result_1_old = drive.grove_get( + path.as_slice().into(), + &key1, + QueryType::StatefulQuery, + None, + &mut vec![], + &platform_version.drive, + ); + assert_matches!( + get_result_1_old, + Err(Error::GroveDB(grovedb::Error::PathKeyNotFound(_))) + ); + + let get_result_2_old = drive.grove_get( + path.as_slice().into(), + &key2, + QueryType::StatefulQuery, + None, + &mut vec![], + &platform_version.drive, + ); + assert_matches!( + get_result_2_old, + Err(Error::GroveDB(grovedb::Error::PathKeyNotFound(_))) + ); + } + + #[test] + fn test_batch_move_items_in_path_query_no_elements() { + // Set up a test drive instance and transaction + let drive = setup_drive(None); + let platform_version = PlatformVersion::latest(); + let transaction = drive.grove.start_transaction(); + + // Create the root tree to allow querying it + drive + .grove_insert_empty_tree( + SubtreePath::empty(), + b"root", + Some(&transaction), + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to insert root tree"); + + // Create a path query that does not match any elements + let path = vec![b"root".to_vec()]; + let new_path = vec![b"new_root".to_vec()]; + let mut query = Query::new(); + query.insert_key(b"non_existent_key".to_vec()); + let path_query = PathQuery::new(path.clone(), SizedQuery::new(query, Some(1), None)); + + // Set up the apply type and drive operations vector + let apply_type = BatchMoveApplyType::StatefulBatchMove { + is_known_to_be_subtree_with_sum: Some((false, false)), + }; + let mut drive_operations = Vec::new(); + + // Call the function + let result = drive.batch_move_items_in_path_query_v0( + &path_query, + new_path.clone(), + true, + apply_type, + Some(&transaction), + &mut drive_operations, + &platform_version.drive, + ); + + assert!(result.is_ok()); + } + + #[test] + fn test_batch_move_items_in_path_query_range_query() { + // Set up a test drive instance and transaction + let drive = setup_drive(None); + let platform_version = PlatformVersion::latest(); + let transaction = drive.grove.start_transaction(); + + // Insert the root tree + drive + .grove_insert_empty_tree( + SubtreePath::empty(), + b"root", + Some(&transaction), + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to insert root tree"); + + // Insert three elements with keys 1, 2, and 3 + let path = vec![b"root".to_vec()]; + let new_path = vec![b"new_root".to_vec()]; + let key1 = b"1".to_vec(); + let key2 = b"2".to_vec(); + let key3 = b"3".to_vec(); + let element = Element::new_item(b"value".to_vec()); + + // Insert the new root tree + drive + .grove_insert_empty_tree( + SubtreePath::empty(), + b"new_root", + Some(&transaction), + None, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to insert new root tree"); + + drive + .grove + .insert( + path.as_slice(), + &key1, + element.clone(), + None, + Some(&transaction), + &platform_version.drive.grove_version, + ) + .unwrap() + .expect("expected insert for key 1"); + + drive + .grove + .insert( + path.as_slice(), + &key2, + element.clone(), + None, + Some(&transaction), + &platform_version.drive.grove_version, + ) + .unwrap() + .expect("expected insert for key 2"); + + drive + .grove + .insert( + path.as_slice(), + &key3, + element.clone(), + None, + Some(&transaction), + &platform_version.drive.grove_version, + ) + .unwrap() + .expect("expected insert for key 3"); + + // Create a range path query that matches keys less than 3 + let mut query = Query::new(); + query.insert_range_to(..b"3".to_vec()); + let path_query = PathQuery::new(path.clone(), SizedQuery::new(query, Some(100), None)); + + // Set up the apply type and drive operations vector + let apply_type = BatchMoveApplyType::StatefulBatchMove { + is_known_to_be_subtree_with_sum: Some((false, false)), + }; + let mut drive_operations = Vec::new(); + + // Call the function + drive + .batch_move_items_in_path_query_v0( + &path_query, + new_path.clone(), + true, + apply_type, + Some(&transaction), + &mut drive_operations, + &platform_version.drive, + ) + .expect("expected to batch move items"); + + // Apply batch operations + drive + .apply_batch_low_level_drive_operations( + None, + Some(&transaction), + drive_operations, + &mut vec![], + &platform_version.drive, + ) + .expect("expected to apply operations"); + + // Commit the transaction + drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + // Verify that keys 1 and 2 have been moved to the new path + let get_result_1 = drive.grove_get( + new_path.as_slice().into(), + &key1, + QueryType::StatefulQuery, + None, + &mut vec![], + &platform_version.drive, + ); + assert_matches!(get_result_1, Ok(Some(Element::Item(value, _))) if value == b"value".to_vec()); + + let get_result_2 = drive.grove_get( + new_path.as_slice().into(), + &key2, + QueryType::StatefulQuery, + None, + &mut vec![], + &platform_version.drive, + ); + assert_matches!(get_result_2, Ok(Some(Element::Item(value, _))) if value == b"value".to_vec()); + + // Verify that keys 1 and 2 are no longer in the original path + let get_result_1_old = drive.grove_get( + path.as_slice().into(), + &key1, + QueryType::StatefulQuery, + None, + &mut vec![], + &platform_version.drive, + ); + assert_matches!( + get_result_1_old, + Err(Error::GroveDB(grovedb::Error::PathKeyNotFound(_))) + ); + + let get_result_2_old = drive.grove_get( + path.as_slice().into(), + &key2, + QueryType::StatefulQuery, + None, + &mut vec![], + &platform_version.drive, + ); + assert_matches!( + get_result_2_old, + Err(Error::GroveDB(grovedb::Error::PathKeyNotFound(_))) + ); + + // Verify that key 3 is still in the original path + let get_result_3 = drive.grove_get( + path.as_slice().into(), + &key3, + QueryType::StatefulQuery, + None, + &mut vec![], + &platform_version.drive, + ); + assert_matches!(get_result_3, Ok(Some(Element::Item(..)))); + } +} diff --git a/packages/rs-drive/src/util/grove_operations/mod.rs b/packages/rs-drive/src/util/grove_operations/mod.rs index 9861e14648..41736ed442 100644 --- a/packages/rs-drive/src/util/grove_operations/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/mod.rs @@ -126,6 +126,9 @@ pub mod grove_get_proved_path_query_with_conditional; /// Inserts an element if it does not exist and returns the existing element if it does in GroveDB. pub mod grove_insert_if_not_exists_return_existing_element; +/// Moved items that are found in a path query to a new path. +pub mod batch_move_items_in_path_query; + use grovedb_costs::CostContext; use grovedb::EstimatedLayerInformation; @@ -177,7 +180,7 @@ pub enum BatchDeleteApplyType { StatelessBatchDelete { /// Are we deleting in a sum tree is_sum_tree: bool, - /// What is the estimated value size + /// What is the estimated key size estimated_key_size: u32, /// What is the estimated value size estimated_value_size: u32, @@ -189,6 +192,29 @@ pub enum BatchDeleteApplyType { }, } +/// Batch move apply type +#[derive(Debug, Copy, Clone)] +pub enum BatchMoveApplyType { + /// Stateless batch move + StatelessBatchMove { + /// Are we moving from inside a sum tree + in_tree_using_sums: bool, + /// Are we moving a sum tree + is_sum_tree: bool, + /// What is the estimated key size + estimated_key_size: u32, + /// What is the estimated value size + estimated_value_size: u32, + /// The flags length + flags_len: FlagsLen, + }, + /// Stateful batch move + StatefulBatchMove { + /// Are we known to be in a subtree and does this subtree have sums + is_known_to_be_subtree_with_sum: Option<(IsSubTree, IsSumSubTree)>, + }, +} + #[derive(Clone)] /// Batch delete up tree apply type pub enum BatchDeleteUpTreeApplyType { diff --git a/packages/rs-drive/src/util/test_helpers/setup.rs b/packages/rs-drive/src/util/test_helpers/setup.rs index a9e4cb6aad..d80f600def 100644 --- a/packages/rs-drive/src/util/test_helpers/setup.rs +++ b/packages/rs-drive/src/util/test_helpers/setup.rs @@ -46,13 +46,15 @@ pub fn setup_drive(drive_config: Option) -> Drive { #[cfg(feature = "full")] /// Sets up Drive using a temporary directory and the default initial state structure. -pub fn setup_drive_with_initial_state_structure() -> Drive { +pub fn setup_drive_with_initial_state_structure( + specific_platform_version: Option<&PlatformVersion>, +) -> Drive { let drive = setup_drive(Some(DriveConfig { batching_consistency_verification: true, ..Default::default() })); - let platform_version = PlatformVersion::latest(); + let platform_version = specific_platform_version.unwrap_or(PlatformVersion::latest()); drive .create_initial_state_structure(None, platform_version) .expect("should create root tree successfully"); diff --git a/packages/rs-drive/tests/dashpay.rs b/packages/rs-drive/tests/dashpay.rs index f00008712c..1dbc23e8aa 100644 --- a/packages/rs-drive/tests/dashpay.rs +++ b/packages/rs-drive/tests/dashpay.rs @@ -11,7 +11,7 @@ mod contact_request { #[test] fn test_user_id_query() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -47,7 +47,7 @@ mod contact_request { #[test] fn test_user_id_by_created_at_query() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -83,7 +83,7 @@ mod contact_request { #[test] fn test_owner_id_query() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -119,7 +119,7 @@ mod contact_request { #[test] fn test_owner_id_by_created_at_query() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -155,7 +155,7 @@ mod contact_request { #[test] fn test_owner_id_and_to_user_id_query() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/tests/masternode_rewards.rs b/packages/rs-drive/tests/masternode_rewards.rs index 56464bbae5..0c7fc4bbc8 100644 --- a/packages/rs-drive/tests/masternode_rewards.rs +++ b/packages/rs-drive/tests/masternode_rewards.rs @@ -11,7 +11,7 @@ mod reward_share { #[test] fn test_owner_id_query() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -47,7 +47,7 @@ mod reward_share { #[test] fn test_owner_id_and_pay_to_id_query() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/tests/query_tests.rs b/packages/rs-drive/tests/query_tests.rs index 0850fc8d62..e7a880a02c 100644 --- a/packages/rs-drive/tests/query_tests.rs +++ b/packages/rs-drive/tests/query_tests.rs @@ -4804,7 +4804,7 @@ fn test_dpns_query_start_after_with_null_id_desc() { #[cfg(feature = "server")] #[test] fn test_query_a_b_c_d_e_contract() { - let drive: Drive = setup_drive_with_initial_state_structure(); + let drive: Drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); @@ -4919,7 +4919,7 @@ fn test_query_a_b_c_d_e_contract() { #[cfg(feature = "server")] #[test] fn test_query_documents_by_created_at() { - let drive = setup_drive_with_initial_state_structure(); + let drive = setup_drive_with_initial_state_structure(None); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index 22905e5ce5..f7d5dda710 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -338,6 +338,7 @@ pub struct DriveAbciIdentityCreditWithdrawalMethodVersions { pub fetch_transactions_block_inclusion_status: FeatureVersion, pub pool_withdrawals_into_transactions_queue: FeatureVersion, pub update_broadcasted_withdrawal_statuses: FeatureVersion, + pub rebroadcast_expired_withdrawal_documents: FeatureVersion, pub append_signatures_and_broadcast_withdrawal_transactions: FeatureVersion, pub cleanup_expired_locks_of_withdrawal_amounts: FeatureVersion, } diff --git a/packages/rs-platform-version/src/version/drive_versions.rs b/packages/rs-platform-version/src/version/drive_versions.rs index c4bb57124c..2deecab9de 100644 --- a/packages/rs-platform-version/src/version/drive_versions.rs +++ b/packages/rs-platform-version/src/version/drive_versions.rs @@ -462,6 +462,7 @@ pub struct DriveGroveBatchMethodVersions { pub batch_replace: FeatureVersion, pub batch_delete: FeatureVersion, pub batch_delete_items_in_path_query: FeatureVersion, + pub batch_move_items_in_path_query: FeatureVersion, pub batch_remove_raw: FeatureVersion, pub batch_delete_up_tree_while_empty: FeatureVersion, pub batch_refresh_reference: FeatureVersion, @@ -590,6 +591,8 @@ pub struct DriveIdentityWithdrawalTransactionIndexMethodVersions { pub struct DriveIdentityWithdrawalTransactionQueueMethodVersions { pub add_enqueue_untied_withdrawal_transaction_operations: FeatureVersion, pub dequeue_untied_withdrawal_transactions: FeatureVersion, + pub remove_broadcasted_withdrawal_transactions_after_completion_operations: FeatureVersion, + pub move_broadcasted_withdrawal_transactions_back_to_queue_operations: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/limits.rs b/packages/rs-platform-version/src/version/limits.rs index ef15539565..4d10e3810d 100644 --- a/packages/rs-platform-version/src/version/limits.rs +++ b/packages/rs-platform-version/src/version/limits.rs @@ -5,5 +5,6 @@ pub struct SystemLimits { pub max_state_transition_size: u64, pub max_transitions_in_documents_batch: u16, pub withdrawal_transactions_per_block_limit: u16, + pub retry_signing_expired_withdrawal_documents_per_block_limit: u16, pub max_withdrawal_amount: u64, } diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 813ac270df..1869831859 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -475,6 +475,8 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { queue: DriveIdentityWithdrawalTransactionQueueMethodVersions { add_enqueue_untied_withdrawal_transaction_operations: 0, dequeue_untied_withdrawal_transactions: 0, + remove_broadcasted_withdrawal_transactions_after_completion_operations: 0, + move_broadcasted_withdrawal_transactions_back_to_queue_operations: 0, }, }, calculate_current_withdrawal_limit: 0, @@ -577,6 +579,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { batch_replace: 0, batch_delete: 0, batch_delete_items_in_path_query: 0, + batch_move_items_in_path_query: 0, batch_remove_raw: 0, batch_delete_up_tree_while_empty: 0, batch_refresh_reference: 0, @@ -674,6 +677,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { fetch_transactions_block_inclusion_status: 0, pool_withdrawals_into_transactions_queue: 0, update_broadcasted_withdrawal_statuses: 0, + rebroadcast_expired_withdrawal_documents: 0, append_signatures_and_broadcast_withdrawal_transactions: 0, cleanup_expired_locks_of_withdrawal_amounts: 0, }, @@ -850,7 +854,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, }, withdrawal_constants: DriveAbciWithdrawalConstants { - core_expiration_blocks: 24, + core_expiration_blocks: 48, cleanup_expired_locks_of_withdrawal_amounts_limit: 0, }, query: DriveAbciQueryVersions { @@ -1290,6 +1294,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { max_state_transition_size: 20000, max_transitions_in_documents_batch: 1, withdrawal_transactions_per_block_limit: 4, + retry_signing_expired_withdrawal_documents_per_block_limit: 1, max_withdrawal_amount: 50_000_000_000_000, }, consensus: ConsensusVersions { diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index a81949c490..9fef855e85 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -475,6 +475,8 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { queue: DriveIdentityWithdrawalTransactionQueueMethodVersions { add_enqueue_untied_withdrawal_transaction_operations: 0, dequeue_untied_withdrawal_transactions: 0, + remove_broadcasted_withdrawal_transactions_after_completion_operations: 0, + move_broadcasted_withdrawal_transactions_back_to_queue_operations: 0, }, }, calculate_current_withdrawal_limit: 0, @@ -577,6 +579,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { batch_replace: 0, batch_delete: 0, batch_delete_items_in_path_query: 0, + batch_move_items_in_path_query: 0, batch_remove_raw: 0, batch_delete_up_tree_while_empty: 0, batch_refresh_reference: 0, @@ -674,6 +677,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { fetch_transactions_block_inclusion_status: 0, pool_withdrawals_into_transactions_queue: 1, update_broadcasted_withdrawal_statuses: 0, + rebroadcast_expired_withdrawal_documents: 1, append_signatures_and_broadcast_withdrawal_transactions: 0, cleanup_expired_locks_of_withdrawal_amounts: 0, }, @@ -850,7 +854,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, }, withdrawal_constants: DriveAbciWithdrawalConstants { - core_expiration_blocks: 24, + core_expiration_blocks: 48, cleanup_expired_locks_of_withdrawal_amounts_limit: 64, }, query: DriveAbciQueryVersions { @@ -1293,6 +1297,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { max_state_transition_size: 20480, //20 KiB max_transitions_in_documents_batch: 1, withdrawal_transactions_per_block_limit: 4, + retry_signing_expired_withdrawal_documents_per_block_limit: 1, max_withdrawal_amount: 50_000_000_000_000, }, consensus: ConsensusVersions { diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 9ea4fad720..38200b9a61 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -474,6 +474,8 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { queue: DriveIdentityWithdrawalTransactionQueueMethodVersions { add_enqueue_untied_withdrawal_transaction_operations: 0, dequeue_untied_withdrawal_transactions: 0, + remove_broadcasted_withdrawal_transactions_after_completion_operations: 0, + move_broadcasted_withdrawal_transactions_back_to_queue_operations: 0, }, }, calculate_current_withdrawal_limit: 0, @@ -576,6 +578,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { batch_replace: 0, batch_delete: 0, batch_delete_items_in_path_query: 0, + batch_move_items_in_path_query: 0, batch_remove_raw: 0, batch_delete_up_tree_while_empty: 0, batch_refresh_reference: 0, @@ -673,6 +676,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { fetch_transactions_block_inclusion_status: 0, pool_withdrawals_into_transactions_queue: 0, update_broadcasted_withdrawal_statuses: 0, + rebroadcast_expired_withdrawal_documents: 0, append_signatures_and_broadcast_withdrawal_transactions: 0, cleanup_expired_locks_of_withdrawal_amounts: 0, }, @@ -849,7 +853,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { }, }, withdrawal_constants: DriveAbciWithdrawalConstants { - core_expiration_blocks: 24, + core_expiration_blocks: 48, cleanup_expired_locks_of_withdrawal_amounts_limit: 0, }, query: DriveAbciQueryVersions { @@ -1292,6 +1296,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { max_state_transition_size: 20480, //20 KiB max_transitions_in_documents_batch: 1, withdrawal_transactions_per_block_limit: 4, + retry_signing_expired_withdrawal_documents_per_block_limit: 1, max_withdrawal_amount: 50_000_000_000_000, }, consensus: ConsensusVersions { diff --git a/packages/rs-platform-version/src/version/v2.rs b/packages/rs-platform-version/src/version/v2.rs index dc7b10212d..591e17d0c4 100644 --- a/packages/rs-platform-version/src/version/v2.rs +++ b/packages/rs-platform-version/src/version/v2.rs @@ -474,6 +474,8 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion { queue: DriveIdentityWithdrawalTransactionQueueMethodVersions { add_enqueue_untied_withdrawal_transaction_operations: 0, dequeue_untied_withdrawal_transactions: 0, + remove_broadcasted_withdrawal_transactions_after_completion_operations: 0, + move_broadcasted_withdrawal_transactions_back_to_queue_operations: 0, }, }, calculate_current_withdrawal_limit: 0, @@ -576,6 +578,7 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion { batch_replace: 0, batch_delete: 0, batch_delete_items_in_path_query: 0, + batch_move_items_in_path_query: 0, batch_remove_raw: 0, batch_delete_up_tree_while_empty: 0, batch_refresh_reference: 0, @@ -673,6 +676,7 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion { fetch_transactions_block_inclusion_status: 0, pool_withdrawals_into_transactions_queue: 0, update_broadcasted_withdrawal_statuses: 0, + rebroadcast_expired_withdrawal_documents: 0, append_signatures_and_broadcast_withdrawal_transactions: 0, cleanup_expired_locks_of_withdrawal_amounts: 0, }, @@ -849,7 +853,7 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion { }, }, withdrawal_constants: DriveAbciWithdrawalConstants { - core_expiration_blocks: 24, + core_expiration_blocks: 48, cleanup_expired_locks_of_withdrawal_amounts_limit: 0, }, query: DriveAbciQueryVersions { @@ -1292,6 +1296,7 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion { max_state_transition_size: 20480, //20 KiB max_transitions_in_documents_batch: 1, withdrawal_transactions_per_block_limit: 4, + retry_signing_expired_withdrawal_documents_per_block_limit: 1, max_withdrawal_amount: 50_000_000_000_000, }, consensus: ConsensusVersions { diff --git a/packages/rs-platform-version/src/version/v3.rs b/packages/rs-platform-version/src/version/v3.rs index ba527c98f6..543c759df7 100644 --- a/packages/rs-platform-version/src/version/v3.rs +++ b/packages/rs-platform-version/src/version/v3.rs @@ -481,6 +481,8 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { queue: DriveIdentityWithdrawalTransactionQueueMethodVersions { add_enqueue_untied_withdrawal_transaction_operations: 0, dequeue_untied_withdrawal_transactions: 0, + remove_broadcasted_withdrawal_transactions_after_completion_operations: 0, + move_broadcasted_withdrawal_transactions_back_to_queue_operations: 0, }, }, calculate_current_withdrawal_limit: 0, @@ -583,6 +585,7 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { batch_replace: 0, batch_delete: 0, batch_delete_items_in_path_query: 0, + batch_move_items_in_path_query: 0, batch_remove_raw: 0, batch_delete_up_tree_while_empty: 0, batch_refresh_reference: 0, @@ -680,6 +683,7 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { fetch_transactions_block_inclusion_status: 0, pool_withdrawals_into_transactions_queue: 0, update_broadcasted_withdrawal_statuses: 0, + rebroadcast_expired_withdrawal_documents: 0, append_signatures_and_broadcast_withdrawal_transactions: 0, cleanup_expired_locks_of_withdrawal_amounts: 0, }, @@ -856,7 +860,7 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { }, }, withdrawal_constants: DriveAbciWithdrawalConstants { - core_expiration_blocks: 24, + core_expiration_blocks: 48, cleanup_expired_locks_of_withdrawal_amounts_limit: 0, }, query: DriveAbciQueryVersions { @@ -1299,6 +1303,7 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { max_state_transition_size: 20480, //20 KiB max_transitions_in_documents_batch: 1, withdrawal_transactions_per_block_limit: 4, + retry_signing_expired_withdrawal_documents_per_block_limit: 1, max_withdrawal_amount: 50_000_000_000_000, }, consensus: ConsensusVersions { diff --git a/packages/rs-platform-version/src/version/v4.rs b/packages/rs-platform-version/src/version/v4.rs index 4d05a510c9..8e4d150310 100644 --- a/packages/rs-platform-version/src/version/v4.rs +++ b/packages/rs-platform-version/src/version/v4.rs @@ -476,6 +476,8 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { queue: DriveIdentityWithdrawalTransactionQueueMethodVersions { add_enqueue_untied_withdrawal_transaction_operations: 0, dequeue_untied_withdrawal_transactions: 0, + remove_broadcasted_withdrawal_transactions_after_completion_operations: 0, + move_broadcasted_withdrawal_transactions_back_to_queue_operations: 0, }, }, calculate_current_withdrawal_limit: 0, @@ -578,6 +580,7 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { batch_replace: 0, batch_delete: 0, batch_delete_items_in_path_query: 0, + batch_move_items_in_path_query: 0, batch_remove_raw: 0, batch_delete_up_tree_while_empty: 0, batch_refresh_reference: 0, @@ -675,6 +678,7 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { fetch_transactions_block_inclusion_status: 0, pool_withdrawals_into_transactions_queue: 0, update_broadcasted_withdrawal_statuses: 0, + rebroadcast_expired_withdrawal_documents: 0, append_signatures_and_broadcast_withdrawal_transactions: 0, cleanup_expired_locks_of_withdrawal_amounts: 0, }, @@ -851,7 +855,7 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { }, }, withdrawal_constants: DriveAbciWithdrawalConstants { - core_expiration_blocks: 24, + core_expiration_blocks: 48, cleanup_expired_locks_of_withdrawal_amounts_limit: 64, }, query: DriveAbciQueryVersions { @@ -1294,6 +1298,7 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { max_state_transition_size: 20480, //20 KiB max_transitions_in_documents_batch: 1, withdrawal_transactions_per_block_limit: 4, + retry_signing_expired_withdrawal_documents_per_block_limit: 1, max_withdrawal_amount: 50_000_000_000_000, //500 Dash }, consensus: ConsensusVersions { From d805fc7e76ee019c5f7c2687c13170a4e2a3d775 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 30 Sep 2024 19:47:18 +0700 Subject: [PATCH 27/90] feat(platform)!: matched withdrawal fees to actual processing cost (#2186) --- .../v0/mod.rs | 20 ++++---------- .../mod.rs | 1 + .../types/execution_operation/mod.rs | 14 ++++++++++ .../balance/v0/mod.rs | 4 +++ .../identity_credit_withdrawal/mod.rs | 20 +++++++++++--- .../state/v0/mod.rs | 26 ++++++++++++++++--- .../src/version/fee/mod.rs | 10 ++++--- .../src/version/fee/processing/mod.rs | 11 +++++--- .../src/version/fee/processing/v1.rs | 1 + .../fee/state_transition_min_fees/v1.rs | 2 +- 10 files changed, 77 insertions(+), 32 deletions(-) diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs index 86ebeb6fbb..01c84035f6 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs @@ -1,21 +1,10 @@ use dpp::block::block_info::BlockInfo; - -use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::document::DocumentV0Getters; -use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; -use dpp::system_data_contracts::withdrawals_contract; -use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; - use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; -use crate::{ - error::{execution::ExecutionError, Error}, - platform_types::platform::Platform, - rpc::core::CoreRPCLike, -}; +use crate::{error::Error, platform_types::platform::Platform, rpc::core::CoreRPCLike}; impl Platform where @@ -53,20 +42,21 @@ where mod tests { use super::*; use dpp::block::epoch::Epoch; - use itertools::Itertools; - + use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contracts::SystemDataContract; use dpp::identifier::Identifier; use dpp::identity::core_script::CoreScript; use dpp::tests::fixtures::get_withdrawal_document_fixture; use dpp::withdrawal::Pooling; use drive::util::test_helpers::setup::{setup_document, setup_system_data_contract}; + use itertools::Itertools; use crate::test::helpers::setup::TestPlatformBuilder; use dpp::document::DocumentV0Getters; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; use dpp::platform_value::platform_value; - use dpp::system_data_contracts::load_system_data_contract; + use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; + use dpp::system_data_contracts::{load_system_data_contract, withdrawals_contract}; use dpp::version::PlatformVersion; use drive::config::DEFAULT_QUERY_LIMIT; diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/mod.rs index f4e9daab97..cb01272fdc 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/mod.rs @@ -24,6 +24,7 @@ where /// /// # Parameters /// - `block_info`: Information about the current block (e.g., timestamp). + /// - `last_committed_platform_state`: The last committed platform state needed to check active validator set. /// - `transaction`: The transaction within which the rebroadcast should be executed. /// - `platform_version`: The version of the platform, used to determine the correct method implementation. /// diff --git a/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs b/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs index 4024224e2e..d44b854495 100644 --- a/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs @@ -67,6 +67,7 @@ pub enum ValidationOperation { Protocol(ProtocolValidationOperation), RetrieveIdentity(RetrieveIdentityInfo), RetrievePrefundedSpecializedBalance, + PerformNetworkThresholdSigning, SingleSha256(HashBlockCount), DoubleSha256(HashBlockCount), ValidateKeyStructure(KeyCount), // This is extremely cheap @@ -210,6 +211,19 @@ impl ValidationOperation { "execution processing fee overflow error", ))?; } + ValidationOperation::PerformNetworkThresholdSigning => { + let operation_cost = platform_version + .fee_version + .processing + .perform_network_threshold_signing; + + fee_result.processing_fee = fee_result + .processing_fee + .checked_add(operation_cost) + .ok_or(ExecutionError::Overflow( + "execution processing fee overflow error", + ))?; + } } } Ok(()) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs index 0c1b879b0f..9dc60ba353 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs @@ -5,6 +5,10 @@ use dpp::state_transition::identity_credit_withdrawal_transition::accessors::Ide use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use crate::error::execution::ExecutionError; +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::{ + StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, +}; use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs index a1ed43702c..c2eaee7f71 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs @@ -33,7 +33,7 @@ impl StateTransitionActionTransformerV0 for IdentityCreditWithdrawalTransition { platform: &PlatformRef, block_info: &BlockInfo, _validation_mode: ValidationMode, - _execution_context: &mut StateTransitionExecutionContext, + execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { let platform_version = platform.state.current_platform_version()?; @@ -45,7 +45,13 @@ impl StateTransitionActionTransformerV0 for IdentityCreditWithdrawalTransition { .identity_credit_withdrawal_state_transition .transform_into_action { - 0 => self.transform_into_action_v0(platform, block_info, tx, platform_version), + 0 => self.transform_into_action_v0( + platform, + block_info, + execution_context, + tx, + platform_version, + ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity credit withdrawal transition: transform_into_action".to_string(), known_versions: vec![0], @@ -94,7 +100,7 @@ impl StateTransitionStateValidationV0 for IdentityCreditWithdrawalTransition { platform: &PlatformRef, _validation_mode: ValidationMode, block_info: &BlockInfo, - _execution_context: &mut StateTransitionExecutionContext, + execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { let platform_version = platform.state.current_platform_version()?; @@ -106,7 +112,13 @@ impl StateTransitionStateValidationV0 for IdentityCreditWithdrawalTransition { .identity_credit_withdrawal_state_transition .state { - 0 => self.validate_state_v0(platform, block_info, tx, platform_version), + 0 => self.validate_state_v0( + platform, + block_info, + execution_context, + tx, + platform_version, + ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity credit withdrawal transition: validate_state".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/state/v0/mod.rs index 87fe5892fe..fefadaa8c7 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/state/v0/mod.rs @@ -9,6 +9,10 @@ use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::identity_credit_withdrawal_transition::accessors::IdentityCreditWithdrawalTransitionAccessorsV0; use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::{ + StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, +}; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use drive::state_transition_action::identity::identity_credit_withdrawal::IdentityCreditWithdrawalTransitionAction; @@ -19,6 +23,7 @@ pub(in crate::execution::validation::state_transition::state_transitions::identi &self, platform: &PlatformRef, block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error>; @@ -27,6 +32,7 @@ pub(in crate::execution::validation::state_transition::state_transitions::identi &self, platform: &PlatformRef, block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error>; @@ -39,6 +45,7 @@ impl IdentityCreditWithdrawalStateTransitionStateValidationV0 &self, platform: &PlatformRef, block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { @@ -65,17 +72,24 @@ impl IdentityCreditWithdrawalStateTransitionStateValidationV0 )); } - self.transform_into_action_v0(platform, block_info, tx, platform_version) + self.transform_into_action_v0( + platform, + block_info, + execution_context, + tx, + platform_version, + ) } fn transform_into_action_v0( &self, platform: &PlatformRef, block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { - Ok( + let consensus_validation_result = IdentityCreditWithdrawalTransitionAction::try_from_identity_credit_withdrawal( &platform.drive, tx, @@ -85,7 +99,11 @@ impl IdentityCreditWithdrawalStateTransitionStateValidationV0 ) .map(|consensus_validation_result| { consensus_validation_result.map(|withdrawal| withdrawal.into()) - })?, - ) + })?; + if consensus_validation_result.is_valid() { + // If this is valid then we will apply the action and eventually perform network threshold signing + execution_context.add_operation(ValidationOperation::PerformNetworkThresholdSigning); + } + Ok(consensus_validation_result) } } diff --git a/packages/rs-platform-version/src/version/fee/mod.rs b/packages/rs-platform-version/src/version/fee/mod.rs index c868a3028d..6022a89a1f 100644 --- a/packages/rs-platform-version/src/version/fee/mod.rs +++ b/packages/rs-platform-version/src/version/fee/mod.rs @@ -72,8 +72,9 @@ mod tests { fetch_identity_balance_and_revision_processing_cost: 3, fetch_identity_cost_per_look_up_key_by_id: 4, fetch_single_identity_key_processing_cost: 5, - validate_key_structure: 6, - fetch_prefunded_specialized_balance_processing_cost: 7, + perform_network_threshold_signing: 6, + validate_key_structure: 7, + fetch_prefunded_specialized_balance_processing_cost: 8, }, data_contract: FeeDataContractValidationVersion { document_type_base_fee: 1, @@ -129,8 +130,9 @@ mod tests { fetch_identity_balance_and_revision_processing_cost: 3, fetch_identity_cost_per_look_up_key_by_id: 4, fetch_single_identity_key_processing_cost: 5, - validate_key_structure: 6, - fetch_prefunded_specialized_balance_processing_cost: 7, + perform_network_threshold_signing: 6, + validate_key_structure: 7, + fetch_prefunded_specialized_balance_processing_cost: 8, }, data_contract: FeeDataContractValidationVersion { document_type_base_fee: 1, diff --git a/packages/rs-platform-version/src/version/fee/processing/mod.rs b/packages/rs-platform-version/src/version/fee/processing/mod.rs index 0427cd0916..df88c9c0dc 100644 --- a/packages/rs-platform-version/src/version/fee/processing/mod.rs +++ b/packages/rs-platform-version/src/version/fee/processing/mod.rs @@ -10,6 +10,7 @@ pub struct FeeProcessingVersion { pub fetch_identity_cost_per_look_up_key_by_id: u64, pub fetch_prefunded_specialized_balance_processing_cost: u64, pub fetch_single_identity_key_processing_cost: u64, + pub perform_network_threshold_signing: u64, pub validate_key_structure: u64, } @@ -26,8 +27,9 @@ mod tests { fetch_identity_balance_and_revision_processing_cost: 3, fetch_identity_cost_per_look_up_key_by_id: 4, fetch_single_identity_key_processing_cost: 5, - validate_key_structure: 6, - fetch_prefunded_specialized_balance_processing_cost: 7, + perform_network_threshold_signing: 6, + validate_key_structure: 7, + fetch_prefunded_specialized_balance_processing_cost: 8, }; let version2 = FeeProcessingVersion { @@ -36,8 +38,9 @@ mod tests { fetch_identity_balance_and_revision_processing_cost: 3, fetch_identity_cost_per_look_up_key_by_id: 4, fetch_single_identity_key_processing_cost: 5, - validate_key_structure: 6, - fetch_prefunded_specialized_balance_processing_cost: 7, + perform_network_threshold_signing: 6, + validate_key_structure: 7, + fetch_prefunded_specialized_balance_processing_cost: 8, }; // This assertion will check if all fields are considered in the equality comparison diff --git a/packages/rs-platform-version/src/version/fee/processing/v1.rs b/packages/rs-platform-version/src/version/fee/processing/v1.rs index dbedd153d9..b6ba5ca998 100644 --- a/packages/rs-platform-version/src/version/fee/processing/v1.rs +++ b/packages/rs-platform-version/src/version/fee/processing/v1.rs @@ -7,5 +7,6 @@ pub const FEE_PROCESSING_VERSION1: FeeProcessingVersion = FeeProcessingVersion { fetch_identity_cost_per_look_up_key_by_id: 9000, fetch_prefunded_specialized_balance_processing_cost: 10000, fetch_single_identity_key_processing_cost: 10000, + perform_network_threshold_signing: 100000000, // 1mDash (2.5 cents at 25$/Dash) validate_key_structure: 50, }; diff --git a/packages/rs-platform-version/src/version/fee/state_transition_min_fees/v1.rs b/packages/rs-platform-version/src/version/fee/state_transition_min_fees/v1.rs index 5f759e50fc..5fbfdbbfe6 100644 --- a/packages/rs-platform-version/src/version/fee/state_transition_min_fees/v1.rs +++ b/packages/rs-platform-version/src/version/fee/state_transition_min_fees/v1.rs @@ -2,7 +2,7 @@ use crate::version::fee::state_transition_min_fees::StateTransitionMinFees; pub const STATE_TRANSITION_MIN_FEES_VERSION1: StateTransitionMinFees = StateTransitionMinFees { credit_transfer: 100000, - credit_withdrawal: 100000, + credit_withdrawal: 400000000, //credit withdrawals are more expensive that the rest identity_update: 100000, document_batch_sub_transition: 100000, contract_create: 100000, From 9065a0aa61d15c3da2cc902b9459a7ddef766427 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Mon, 30 Sep 2024 15:56:06 +0300 Subject: [PATCH 28/90] chore(release): update changelog and bump version to 1.4.0-dev.2 (#2187) --- CHANGELOG.md | 28 +++++++++++ Cargo.lock | 50 +++++++++---------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/check-features/Cargo.toml | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 44 files changed, 95 insertions(+), 67 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3dd4e6d893..42467f4388 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,31 @@ +## [1.4.0-dev.2](https://github.com/dashpay/platform/compare/v1.4.0-dev.1...v1.4.0-dev.2) (2024-09-30) + + +### ⚠ BREAKING CHANGES + +* **platform:** matched withdrawal fees to actual processing cost (#2186) +* **platform:** withdrawal automatic retries after core rejection (#2185) +* **platform:** withdrawal limits (#2182) + +### Features + +* **dashmate:** collect docker stats in the doctor command ([#2180](https://github.com/dashpay/platform/issues/2180)) +* **dashmate:** validate external IP ([#2183](https://github.com/dashpay/platform/issues/2183)) +* **platform:** matched withdrawal fees to actual processing cost ([#2186](https://github.com/dashpay/platform/issues/2186)) +* **platform:** withdrawal automatic retries after core rejection ([#2185](https://github.com/dashpay/platform/issues/2185)) +* **platform:** withdrawal limits ([#2182](https://github.com/dashpay/platform/issues/2182)) +* **sdk:** get node status ([#2139](https://github.com/dashpay/platform/issues/2139)) + + +### Build System + +* devcontainer support ([#2179](https://github.com/dashpay/platform/issues/2179)) + + +### Continuous Integration + +* prebuild dev containers ([#2184](https://github.com/dashpay/platform/issues/2184)) + ## [1.4.0-dev.1](https://github.com/dashpay/platform/compare/v1.3.0...v1.4.0-dev.1) (2024-09-27) diff --git a/Cargo.lock b/Cargo.lock index 2d882e0c93..1b798aeafd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -781,7 +781,7 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "check-features" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "toml", ] @@ -1147,7 +1147,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1163,7 +1163,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "dapi-grpc", "heck 0.5.0", @@ -1208,7 +1208,7 @@ dependencies = [ [[package]] name = "dash-sdk" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "arc-swap", "async-trait", @@ -1308,7 +1308,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "platform-value", "platform-version", @@ -1318,7 +1318,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1434,7 +1434,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "platform-value", "platform-version", @@ -1444,7 +1444,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "anyhow", "assert_matches", @@ -1496,7 +1496,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "arc-swap", "assert_matches", @@ -1537,7 +1537,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "arc-swap", "assert_matches", @@ -1593,7 +1593,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "bincode", "dapi-grpc", @@ -1807,7 +1807,7 @@ checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "feature-flags-contract" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "platform-value", "platform-version", @@ -2751,7 +2751,7 @@ dependencies = [ [[package]] name = "json-schema-compatibility-validator" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "assert_matches", "json-patch", @@ -2924,7 +2924,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "platform-value", "platform-version", @@ -3498,7 +3498,7 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "platform-serialization" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "bincode", "platform-version", @@ -3506,7 +3506,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "proc-macro2", "quote", @@ -3516,7 +3516,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "base64 0.22.1", "bincode", @@ -3537,7 +3537,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "quote", "syn 2.0.75", @@ -3545,7 +3545,7 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "bincode", "grovedb-version", @@ -3556,7 +3556,7 @@ dependencies = [ [[package]] name = "platform-versioning" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "proc-macro2", "quote", @@ -4169,7 +4169,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "backon", "chrono", @@ -4686,7 +4686,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "base64 0.22.1", "bincode", @@ -4777,7 +4777,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "bincode", "dpp", @@ -5821,7 +5821,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "anyhow", "async-trait", @@ -6123,7 +6123,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" dependencies = [ "num_enum", "platform-value", diff --git a/package.json b/package.json index 1b58fdb2e1..debc4a5496 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.4.0-dev.1", + "version": "1.4.0-dev.2", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index 3b274c7309..f5db03e0e2 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.4.0-dev.1", + "version": "1.4.0-dev.2", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/check-features/Cargo.toml b/packages/check-features/Cargo.toml index 32fa620a54..851307fc75 100644 --- a/packages/check-features/Cargo.toml +++ b/packages/check-features/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "check-features" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index 35a9f633cb..0a2786a78f 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index a60b2363ad..4f17f298ba 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.4.0-dev.1", + "version": "1.4.0-dev.2", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index 0e6a27e61a..e35bdd9e8b 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.4.0-dev.1", + "version": "1.4.0-dev.2", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index 184d91d8ac..2b4eb99ed2 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "2.4.0-dev.1", + "version": "2.4.0-dev.2", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index 0479cce9b8..fdc1131645 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.4.0-dev.1", + "version": "1.4.0-dev.2", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index c425b0738a..4f18907f14 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index a13c5e8590..a9ac17ed5a 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.4.0-dev.1", + "version": "1.4.0-dev.2", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index fb0fe7d640..52410e63df 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 328a6fa2fa..80c0dbfb09 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index 440a7beb75..b38cfa725c 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.4.0-dev.1", + "version": "1.4.0-dev.2", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index 04abaeacfa..e170501c4c 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index 0e7889df7a..34117020cb 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.4.0-dev.1", + "version": "1.4.0-dev.2", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index 27fb6d3f51..cddea88065 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.4.0-dev.1", + "version": "1.4.0-dev.2", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index 457ce7b4dc..073b2bba47 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.4.0-dev.1", + "version": "4.4.0-dev.2", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index 02124c466d..fae5482544 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.4.0-dev.1", + "version": "1.4.0-dev.2", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index 8eb1807287..a5ef72cdc1 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index 3610bd1ae6..c6d09fe6c5 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.4.0-dev.1", + "version": "1.4.0-dev.2", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index 336b45bed5..9f3ef94c01 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.4.0-dev.1", + "version": "1.4.0-dev.2", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index 79beb87fd8..a1200fb49f 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index 5db0e75748..bd8039000c 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 122a75930e..f2af22fd5f 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" edition = "2021" rust-version.workspace = true authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 4e57a1c9f1..58a81bcbc9 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 325ed65235..1ce2e9a86b 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" edition = "2021" rust-version.workspace = true diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 7c37d1ad6c..8c52eb3eff 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-json-schema-compatibility-validator/Cargo.toml b/packages/rs-json-schema-compatibility-validator/Cargo.toml index bc90fffebe..68bb093688 100644 --- a/packages/rs-json-schema-compatibility-validator/Cargo.toml +++ b/packages/rs-json-schema-compatibility-validator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "json-schema-compatibility-validator" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" edition = "2021" rust-version.workspace = true authors = ["Ivan Shumkov "] diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index f18ea08c61..bf24a0e28f 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index 89f2c732de..a34ddde71c 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index 245855ba13..490c76bfd7 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index f60a9a15a0..8fb7b497c6 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 267c427514..dc95f5d53e 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Versioning library for Platform" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index 5e7d26322d..fc64416f1a 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index b53cbdca56..fdd8325d4f 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dash-sdk" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index 95a68d598a..ddfbb7c1cb 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" edition = "2021" rust-version.workspace = true diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index e353ddf2b5..3945e5bd57 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index c4caf8e961..219e114c3d 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.4.0-dev.1", + "version": "8.4.0-dev.2", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index 194e64f1a6..8ce55bf99c 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" edition = "2021" rust-version.workspace = true authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index 2b9d361397..24fa949097 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.4.0-dev.1", + "version": "1.4.0-dev.2", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index 2523ed3202..a89f8d1cc8 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.4.0-dev.1" +version = "1.4.0-dev.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index 749f7e7070..f81c52d4cb 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.4.0-dev.1", + "version": "1.4.0-dev.2", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From e8781024cea289d1c5ab7d715c396ad9547e4589 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Tue, 1 Oct 2024 07:19:42 +0700 Subject: [PATCH 29/90] fix(drive-abci): fix network upgrade to version 4 (#2189) --- .../perform_events_on_first_block_of_protocol_change/v0/mod.rs | 2 +- packages/rs-platform-version/src/version/v4.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/v0/mod.rs index 1c50e27e7a..62a0d5a46f 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/v0/mod.rs @@ -35,7 +35,7 @@ impl Platform { platform_version: &PlatformVersion, ) -> Result<(), Error> { if previous_protocol_version < 4 && platform_version.protocol_version >= 4 { - self.transition_to_version_4(transaction, platform_version); + self.transition_to_version_4(transaction, platform_version)?; } Ok(()) diff --git a/packages/rs-platform-version/src/version/v4.rs b/packages/rs-platform-version/src/version/v4.rs index 8e4d150310..7c2752f29a 100644 --- a/packages/rs-platform-version/src/version/v4.rs +++ b/packages/rs-platform-version/src/version/v4.rs @@ -644,7 +644,7 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { check_for_desired_protocol_upgrade: 1, upgrade_protocol_version_on_epoch_change: 0, - perform_events_on_first_block_of_protocol_change: Some(4), + perform_events_on_first_block_of_protocol_change: Some(0), protocol_version_upgrade_percentage_needed: 67, }, block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { From 023ff85e1c642d1281d18af9eae095bc4df73633 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Tue, 1 Oct 2024 07:26:11 +0700 Subject: [PATCH 30/90] release: updated to 1.4.0-dev.3 (#2190) --- Cargo.lock | 50 +++++++++---------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/check-features/Cargo.toml | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 43 files changed, 67 insertions(+), 67 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1b798aeafd..6a05f5b530 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -781,7 +781,7 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "check-features" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "toml", ] @@ -1147,7 +1147,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1163,7 +1163,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "dapi-grpc", "heck 0.5.0", @@ -1208,7 +1208,7 @@ dependencies = [ [[package]] name = "dash-sdk" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "arc-swap", "async-trait", @@ -1308,7 +1308,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "platform-value", "platform-version", @@ -1318,7 +1318,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1434,7 +1434,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "platform-value", "platform-version", @@ -1444,7 +1444,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "anyhow", "assert_matches", @@ -1496,7 +1496,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "arc-swap", "assert_matches", @@ -1537,7 +1537,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "arc-swap", "assert_matches", @@ -1593,7 +1593,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "bincode", "dapi-grpc", @@ -1807,7 +1807,7 @@ checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "feature-flags-contract" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "platform-value", "platform-version", @@ -2751,7 +2751,7 @@ dependencies = [ [[package]] name = "json-schema-compatibility-validator" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "assert_matches", "json-patch", @@ -2924,7 +2924,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "platform-value", "platform-version", @@ -3498,7 +3498,7 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "platform-serialization" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "bincode", "platform-version", @@ -3506,7 +3506,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "proc-macro2", "quote", @@ -3516,7 +3516,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "base64 0.22.1", "bincode", @@ -3537,7 +3537,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "quote", "syn 2.0.75", @@ -3545,7 +3545,7 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "bincode", "grovedb-version", @@ -3556,7 +3556,7 @@ dependencies = [ [[package]] name = "platform-versioning" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "proc-macro2", "quote", @@ -4169,7 +4169,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "backon", "chrono", @@ -4686,7 +4686,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "base64 0.22.1", "bincode", @@ -4777,7 +4777,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "bincode", "dpp", @@ -5821,7 +5821,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "anyhow", "async-trait", @@ -6123,7 +6123,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" dependencies = [ "num_enum", "platform-value", diff --git a/package.json b/package.json index debc4a5496..dffdebc4c6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.4.0-dev.2", + "version": "1.4.0-dev.3", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index f5db03e0e2..3ff32b6958 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.4.0-dev.2", + "version": "1.4.0-dev.3", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/check-features/Cargo.toml b/packages/check-features/Cargo.toml index 851307fc75..faeb5ec05f 100644 --- a/packages/check-features/Cargo.toml +++ b/packages/check-features/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "check-features" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index 0a2786a78f..1511089d11 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index 4f17f298ba..225c6f125e 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.4.0-dev.2", + "version": "1.4.0-dev.3", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index e35bdd9e8b..1ecfc82b46 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.4.0-dev.2", + "version": "1.4.0-dev.3", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index 2b4eb99ed2..c7892682c2 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "2.4.0-dev.2", + "version": "2.4.0-dev.3", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index fdc1131645..fcb1fcbcdf 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.4.0-dev.2", + "version": "1.4.0-dev.3", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index 4f18907f14..a1aec28ce4 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index a9ac17ed5a..144a37446f 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.4.0-dev.2", + "version": "1.4.0-dev.3", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index 52410e63df..fb604b07ad 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 80c0dbfb09..f9254361eb 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index b38cfa725c..875be96f51 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.4.0-dev.2", + "version": "1.4.0-dev.3", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index e170501c4c..279ee40006 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index 34117020cb..1bf9d4db4c 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.4.0-dev.2", + "version": "1.4.0-dev.3", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index cddea88065..ca913054b6 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.4.0-dev.2", + "version": "1.4.0-dev.3", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index 073b2bba47..e398d330b9 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.4.0-dev.2", + "version": "4.4.0-dev.3", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index fae5482544..bd5df0bf4b 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.4.0-dev.2", + "version": "1.4.0-dev.3", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index a5ef72cdc1..e132fdd28c 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index c6d09fe6c5..c94ad2ae59 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.4.0-dev.2", + "version": "1.4.0-dev.3", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index 9f3ef94c01..bec32455d1 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.4.0-dev.2", + "version": "1.4.0-dev.3", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index a1200fb49f..0f78a7b792 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index bd8039000c..de3afc354d 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index f2af22fd5f..47d8258550 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" edition = "2021" rust-version.workspace = true authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 58a81bcbc9..4e14f953f7 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 1ce2e9a86b..cef01f45d8 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" edition = "2021" rust-version.workspace = true diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 8c52eb3eff..50915b06e2 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-json-schema-compatibility-validator/Cargo.toml b/packages/rs-json-schema-compatibility-validator/Cargo.toml index 68bb093688..80e372925d 100644 --- a/packages/rs-json-schema-compatibility-validator/Cargo.toml +++ b/packages/rs-json-schema-compatibility-validator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "json-schema-compatibility-validator" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" edition = "2021" rust-version.workspace = true authors = ["Ivan Shumkov "] diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index bf24a0e28f..bd7b111c68 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index a34ddde71c..b451c8d500 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index 490c76bfd7..74023ae583 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index 8fb7b497c6..59ccf1c175 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index dc95f5d53e..01b8e5380a 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Versioning library for Platform" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index fc64416f1a..58f6935c0c 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index fdd8325d4f..44f37a8d89 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dash-sdk" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index ddfbb7c1cb..7e5994c015 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" edition = "2021" rust-version.workspace = true diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index 3945e5bd57..ecb274b11f 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 219e114c3d..6584ecdded 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.4.0-dev.2", + "version": "8.4.0-dev.3", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index 8ce55bf99c..59a1163850 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" edition = "2021" rust-version.workspace = true authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index 24fa949097..f1a4f2dd11 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.4.0-dev.2", + "version": "1.4.0-dev.3", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index a89f8d1cc8..f0f0c0c478 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.4.0-dev.2" +version = "1.4.0-dev.3" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index f81c52d4cb..9bc7d9ec6d 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.4.0-dev.2", + "version": "1.4.0-dev.3", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From 5eacc13bdff282fa75f0901b88c3135818db6321 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Wed, 2 Oct 2024 13:12:29 +0300 Subject: [PATCH 31/90] chore(drive): logs and metrics for withdrawal daily limit (#2192) --- .../engine/run_block_proposal/v0/mod.rs | 7 +++++-- .../v0/mod.rs | 9 ++++++--- .../v1/mod.rs | 18 ++++++++++++++++-- packages/rs-drive-abci/src/metrics.rs | 18 ++++++++++++++++-- .../calculate_current_withdrawal_limit/mod.rs | 18 +++++++++++++++++- .../v0/mod.rs | 9 ++++++--- .../mod.rs | 3 ++- 7 files changed, 68 insertions(+), 14 deletions(-) diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs index 1ae4a1e639..9c45694f6c 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs @@ -293,6 +293,8 @@ where // required for signature verification (core height and quorum hash) // Then we save unsigned transaction bytes to block execution context // to be signed (on extend_vote), verified (on verify_vote) and broadcasted (on finalize_block) + // Also, the dequeued untiled transaction added to the broadcasted transaction queue to for further + // resigning in case of failures. let unsigned_withdrawal_transaction_bytes = self .dequeue_and_build_unsigned_withdrawal_transactions( validator_set_quorum_hash, @@ -329,12 +331,13 @@ where // Corresponding withdrawal documents are changed from queued to pooled self.pool_withdrawals_into_transactions_queue( &block_info, - &last_committed_platform_state, + last_committed_platform_state, Some(transaction), platform_version, )?; // Cleans up the expired locks for withdrawal amounts + // to update daily withdrawal limit // This is for example when we make a withdrawal for 30 Dash // But we can only withdraw 1000 Dash a day // after the withdrawal we should only be able to withdraw 970 Dash @@ -350,7 +353,7 @@ where let mut block_execution_context: BlockExecutionContext = block_execution_context::v0::BlockExecutionContextV0 { block_state_info: block_state_info.into(), - epoch_info: epoch_info.clone(), + epoch_info, unsigned_withdrawal_transactions: unsigned_withdrawal_transaction_bytes, block_platform_state, proposer_results: None, diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs index 01c84035f6..610d8e3fcc 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs @@ -19,18 +19,21 @@ where platform_version: &PlatformVersion, ) -> Result<(), Error> { // Currently Core only supports using the first 2 quorums (out of 24 for mainnet). - // For us, we just use the latest quorum to be extra safe. + // For extra safety, we use only the first quorum because our quorum info based + // on core chain locked height which is always late comparing with Core. let Some(position_of_current_quorum) = last_committed_platform_state.current_validator_set_position_in_list_by_most_recent() else { - tracing::warn!("Current quorum not in current validator set, not making withdrawals"); + tracing::warn!("Current quorum not in current validator set, do not pool withdrawals"); + return Ok(()); }; if position_of_current_quorum != 0 { tracing::debug!( - "Current quorum is not most recent, it is in position {}, not making withdrawals", + "Current quorum is not most recent, it is in position {}, do not pool withdrawals", position_of_current_quorum ); + return Ok(()); } // Just use the v1 as to not duplicate code diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v1/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v1/mod.rs index cf7c3cec29..b0b0f99e65 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v1/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v1/mod.rs @@ -1,4 +1,5 @@ use dpp::block::block_info::BlockInfo; +use metrics::gauge; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::document::DocumentV0Getters; @@ -9,6 +10,9 @@ use drive::grovedb::TransactionArg; use dpp::system_data_contracts::withdrawals_contract; use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; +use crate::metrics::{ + GAUGE_CREDIT_WITHDRAWAL_LIMIT_AVAILABLE, GAUGE_CREDIT_WITHDRAWAL_LIMIT_TOTAL, +}; use crate::{ error::{execution::ExecutionError, Error}, platform_types::platform::Platform, @@ -42,10 +46,16 @@ where } // Only take documents up to the withdrawal amount - let current_withdrawal_limit = self + let withdrawals_info = self .drive .calculate_current_withdrawal_limit(transaction, platform_version)?; + let current_withdrawal_limit = withdrawals_info.available(); + + // Store prometheus metrics + gauge!(GAUGE_CREDIT_WITHDRAWAL_LIMIT_AVAILABLE).set(current_withdrawal_limit as f64); + gauge!(GAUGE_CREDIT_WITHDRAWAL_LIMIT_TOTAL).set(withdrawals_info.daily_maximum as f64); + // Only process documents up to the current withdrawal limit. let mut total_withdrawal_amount = 0u64; @@ -65,8 +75,12 @@ where )) })?; + // If adding this withdrawal would exceed the limit, stop processing further. if potential_total_withdrawal_amount > current_withdrawal_limit { - // If adding this withdrawal would exceed the limit, stop processing further. + tracing::debug!( + "Pooling is limited due to daily withdrawals limit. {} credits left", + current_withdrawal_limit + ); break; } diff --git a/packages/rs-drive-abci/src/metrics.rs b/packages/rs-drive-abci/src/metrics.rs index 5c90ec2501..943f0d5aae 100644 --- a/packages/rs-drive-abci/src/metrics.rs +++ b/packages/rs-drive-abci/src/metrics.rs @@ -6,7 +6,7 @@ use std::time::Duration; use std::{sync::Once, time::Instant}; use dapi_grpc::tonic::Code; -use metrics::{counter, describe_counter, describe_histogram, histogram, Label}; +use metrics::{counter, describe_counter, describe_gauge, describe_histogram, histogram, Label}; use metrics_exporter_prometheus::PrometheusBuilder; /// Default Prometheus port (29090) @@ -29,6 +29,10 @@ pub const LABEL_STATE_TRANSITION_NAME: &str = "st_name"; const LABEL_STATE_TRANSITION_EXECUTION_CODE: &str = "st_exec_code"; /// Metrics label to specify check tx mode: 0 - first time check, 1 - recheck pub const LABEL_CHECK_TX_MODE: &str = "check_tx_mode"; +/// Withdrawal daily limit available credits +pub const GAUGE_CREDIT_WITHDRAWAL_LIMIT_AVAILABLE: &str = "credit_withdrawal_limit_available"; +/// Total withdrawal daily limit in credits +pub const GAUGE_CREDIT_WITHDRAWAL_LIMIT_TOTAL: &str = "credit_withdrawal_limit_total"; /// Error returned by metrics subsystem #[derive(thiserror::Error, Debug)] @@ -210,7 +214,17 @@ impl Prometheus { HISTOGRAM_QUERY_DURATION, metrics::Unit::Seconds, "Duration of query request execution inside Drive per endpoint, in seconds" - ) + ); + + describe_gauge!( + GAUGE_CREDIT_WITHDRAWAL_LIMIT_AVAILABLE, + "Available withdrawal limit for last 24 hours in credits" + ); + + describe_gauge!( + GAUGE_CREDIT_WITHDRAWAL_LIMIT_TOTAL, + "Total withdrawal limit for last 24 hours in credits" + ); }); } } diff --git a/packages/rs-drive/src/drive/identity/withdrawals/calculate_current_withdrawal_limit/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/calculate_current_withdrawal_limit/mod.rs index 172eda82c9..1d31584f69 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/calculate_current_withdrawal_limit/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/calculate_current_withdrawal_limit/mod.rs @@ -7,6 +7,22 @@ use platform_version::version::PlatformVersion; mod v0; +/// Daily withdrawal limit information +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct WithdrawalLimitInfo { + /// The total maximum withdrawal amount allowed in a 24-hour period. + pub daily_maximum: Credits, + /// The amount already withdrawn in the last 24 hours. + pub withdrawals_amount: Credits, +} + +impl WithdrawalLimitInfo { + /// Calculates the available credits to withdraw + pub fn available(&self) -> Credits { + self.daily_maximum.saturating_sub(self.withdrawals_amount) + } +} + impl Drive { /// Calculates the current withdrawal limit based on the total credits available in the platform /// and the amount already withdrawn in the last 24 hours, using the appropriate version-specific logic. @@ -34,7 +50,7 @@ impl Drive { &self, transaction: TransactionArg, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result { match platform_version .drive .methods diff --git a/packages/rs-drive/src/drive/identity/withdrawals/calculate_current_withdrawal_limit/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/calculate_current_withdrawal_limit/v0/mod.rs index f7610ec941..c4f2316d3f 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/calculate_current_withdrawal_limit/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/calculate_current_withdrawal_limit/v0/mod.rs @@ -1,4 +1,5 @@ use crate::drive::balances::TOTAL_SYSTEM_CREDITS_STORAGE_KEY; +use crate::drive::identity::withdrawals::calculate_current_withdrawal_limit::WithdrawalLimitInfo; use crate::drive::identity::withdrawals::paths::{ get_withdrawal_root_path, WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, }; @@ -7,7 +8,6 @@ use crate::drive::Drive; use crate::error::drive::DriveError; use crate::error::Error; use crate::util::grove_operations::DirectQueryType; -use dpp::fee::Credits; use dpp::withdrawal::daily_withdrawal_limit::daily_withdrawal_limit; use grovedb::TransactionArg; use platform_version::version::PlatformVersion; @@ -42,7 +42,7 @@ impl Drive { &self, transaction: TransactionArg, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result { // The current withdrawal limit has two components // 1. The total maximum that we are allowed to do in 24 hours // 2. The amount that we have already withdrawn in the last 24 hours @@ -81,6 +81,9 @@ impl Drive { )) })?; - Ok(daily_maximum.saturating_sub(withdrawal_amount_in_last_day)) + Ok(WithdrawalLimitInfo { + daily_maximum, + withdrawals_amount: withdrawal_amount_in_last_day, + }) } } diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/mod.rs index 3423114aaf..cdc4672759 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/mod.rs @@ -9,7 +9,8 @@ use grovedb::TransactionArg; use platform_version::version::PlatformVersion; impl Drive { - /// Get specified amount of withdrawal transactions from the DB + /// Deque specified amount of untiled withdrawal transactions + /// and move them to broadcasted queue pub fn dequeue_untied_withdrawal_transactions( &self, limit: u16, From 09d89f86d07077246755dc722ba9fb8cfe403585 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 3 Oct 2024 13:40:16 +0700 Subject: [PATCH 32/90] fix(sdk): small sdk improvements and fixes for v1.4 (#2200) --- .../rs-dpp/src/core_types/validator/v0/mod.rs | 3 +- .../src/core_types/validator_set/mod.rs | 9 +++++ .../src/core_types/validator_set/v0/mod.rs | 33 ++++++++++++++++++- .../rs-drive-proof-verifier/src/unproved.rs | 2 +- packages/rs-sdk/src/mock/requests.rs | 25 ++++++++++++++ packages/rs-sdk/src/platform/fetch_many.rs | 26 +++++++++++---- packages/rs-sdk/src/platform/query.rs | 28 +++++++++++++--- packages/withdrawals-contract/src/lib.rs | 14 ++++++++ 8 files changed, 127 insertions(+), 13 deletions(-) diff --git a/packages/rs-dpp/src/core_types/validator/v0/mod.rs b/packages/rs-dpp/src/core_types/validator/v0/mod.rs index daadc197fe..d472b4a145 100644 --- a/packages/rs-dpp/src/core_types/validator/v0/mod.rs +++ b/packages/rs-dpp/src/core_types/validator/v0/mod.rs @@ -1,5 +1,6 @@ use dashcore::{ProTxHash, PubkeyHash}; -use std::fmt::{Debug, Formatter}; +use std::fmt; +use std::fmt::{Debug, Display, Formatter}; use crate::bls_signatures::PublicKey as BlsPublicKey; #[cfg(feature = "core-types-serde-conversion")] diff --git a/packages/rs-dpp/src/core_types/validator_set/mod.rs b/packages/rs-dpp/src/core_types/validator_set/mod.rs index 7238bc0b1b..74b78fca05 100644 --- a/packages/rs-dpp/src/core_types/validator_set/mod.rs +++ b/packages/rs-dpp/src/core_types/validator_set/mod.rs @@ -13,6 +13,7 @@ use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; #[cfg(feature = "core-types-serde-conversion")] use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; +use std::fmt::{Display, Formatter}; /// Version 0 pub mod v0; @@ -34,6 +35,14 @@ pub enum ValidatorSet { V0(ValidatorSetV0), } +impl Display for ValidatorSet { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + ValidatorSet::V0(v0) => write!(f, "{}", v0), + } + } +} + impl ValidatorSetV0Getters for ValidatorSet { fn quorum_hash(&self) -> &QuorumHash { match self { diff --git a/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs b/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs index 886489ee3b..2cf167277b 100644 --- a/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs +++ b/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs @@ -10,10 +10,12 @@ use bincode::error::EncodeError; use bincode::{BorrowDecode, Decode, Encode}; use dashcore::hashes::Hash; use dashcore::{ProTxHash, QuorumHash}; +use itertools::Itertools; #[cfg(feature = "core-types-serde-conversion")] use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; -use std::fmt::{Debug, Formatter}; +use std::fmt; +use std::fmt::{Debug, Display, Formatter}; /// The validator set is only slightly different from a quorum as it does not contain non valid /// members @@ -35,6 +37,35 @@ pub struct ValidatorSetV0 { pub threshold_public_key: BlsPublicKey, } +impl Display for ValidatorSetV0 { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + write!( + f, + "ValidatorSet {{ + quorum_hash: {}, + quorum_index: {}, + core_height: {}, + members: [{}], + threshold_public_key: {} +}}", + hex::encode(self.quorum_hash), // Assuming QuorumHash is a byte array and should be in hex format + match self.quorum_index { + Some(index) => index.to_string(), + None => "None".to_string(), + }, + self.core_height, + self.members + .iter() + .map(|(pro_tx_hash, validator)| format!( + "{{{}: {}}}", + pro_tx_hash, validator.node_ip + )) + .join(", "), + hex::encode(self.threshold_public_key.to_bytes().as_slice()) // Assuming BlsPublicKey is a byte array + ) + } +} + #[cfg(feature = "core-types-serialization")] impl Encode for ValidatorSetV0 { fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { diff --git a/packages/rs-drive-proof-verifier/src/unproved.rs b/packages/rs-drive-proof-verifier/src/unproved.rs index d9fd37009c..bc2f2e9e51 100644 --- a/packages/rs-drive-proof-verifier/src/unproved.rs +++ b/packages/rs-drive-proof-verifier/src/unproved.rs @@ -231,7 +231,7 @@ impl FromUnproved for CurrentQuorumsInfo pro_tx_hash, public_key: None, // Assuming it's not provided here node_ip: member.node_ip, - node_id: PubkeyHash::from_slice(&[0; 32]).unwrap(), // Placeholder, since not provided + node_id: PubkeyHash::from_slice(&[0; 20]).expect("expected to make pub key hash from 20 byte empty array"), // Placeholder, since not provided core_port: 0, // Placeholder, since not provided platform_http_port: 0, // Placeholder, since not provided platform_p2p_port: 0, // Placeholder, since not provided diff --git a/packages/rs-sdk/src/mock/requests.rs b/packages/rs-sdk/src/mock/requests.rs index d29e48d410..0b2e43692f 100644 --- a/packages/rs-sdk/src/mock/requests.rs +++ b/packages/rs-sdk/src/mock/requests.rs @@ -1,4 +1,5 @@ use super::MockDashPlatformSdk; +use dpp::bincode::config::standard; use dpp::{ bincode, block::extended_epoch_info::ExtendedEpochInfo, @@ -14,6 +15,7 @@ use dpp::{ }, voting::votes::{resource_vote::ResourceVote, Vote}, }; +use drive::grovedb::Element; use drive_proof_verifier::types::{ Contenders, ContestedResources, CurrentQuorumsInfo, ElementFetchRequestItem, EvoNodeStatus, IdentityBalanceAndRevision, MasternodeProtocolVote, PrefundedSpecializedBalance, @@ -165,6 +167,29 @@ impl MockResponse for Document { } } +impl MockResponse for Element { + fn mock_serialize(&self, _sdk: &MockDashPlatformSdk) -> Vec { + // Create a bincode configuration + let config = standard(); + + // Serialize using the specified configuration + bincode::encode_to_vec(self, config).expect("Failed to serialize Element") + } + + fn mock_deserialize(_sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self + where + Self: Sized, + { + // Create a bincode configuration + let config = standard(); + + // Deserialize using the specified configuration + bincode::decode_from_slice(buf, config) + .expect("Failed to deserialize Element") + .0 + } +} + impl MockResponse for drive_proof_verifier::types::IdentityNonceFetcher { fn mock_serialize(&self, _sdk: &MockDashPlatformSdk) -> Vec { (self.0).to_be_bytes().to_vec() diff --git a/packages/rs-sdk/src/platform/fetch_many.rs b/packages/rs-sdk/src/platform/fetch_many.rs index feba82fd65..897be764ae 100644 --- a/packages/rs-sdk/src/platform/fetch_many.rs +++ b/packages/rs-sdk/src/platform/fetch_many.rs @@ -16,8 +16,9 @@ use dapi_grpc::platform::v0::{ GetContestedResourceVotersForIdentityRequest, GetContestedResourcesRequest, GetDataContractsRequest, GetDocumentsResponse, GetEpochsInfoRequest, GetEvonodesProposedEpochBlocksByIdsRequest, GetEvonodesProposedEpochBlocksByRangeRequest, - GetIdentitiesBalancesRequest, GetIdentityKeysRequest, GetProtocolVersionUpgradeStateRequest, - GetProtocolVersionUpgradeVoteStatusRequest, GetVotePollsByEndDateRequest, + GetIdentitiesBalancesRequest, GetIdentityKeysRequest, GetPathElementsRequest, + GetProtocolVersionUpgradeStateRequest, GetProtocolVersionUpgradeVoteStatusRequest, + GetVotePollsByEndDateRequest, }; use dashcore_rpc::dashcore::ProTxHash; use dpp::data_contract::DataContract; @@ -30,11 +31,14 @@ use dpp::{ block::extended_epoch_info::ExtendedEpochInfo, voting::votes::resource_vote::ResourceVote, }; use dpp::{document::Document, voting::contender_structs::ContenderWithSerializedDocument}; +use drive::grovedb::query_result_type::{Key, Path}; +use drive::grovedb::Element; use drive_proof_verifier::types::{ - Contenders, ContestedResource, ContestedResources, DataContracts, ExtendedEpochInfos, - IdentityBalances, IdentityPublicKeys, MasternodeProtocolVote, MasternodeProtocolVotes, - ProposerBlockCountById, ProposerBlockCountByRange, ProposerBlockCounts, - ProtocolVersionUpgrades, ResourceVotesByIdentity, VotePollsGroupedByTimestamp, Voter, Voters, + Contenders, ContestedResource, ContestedResources, DataContracts, Elements, ExtendedEpochInfos, + IdentityBalances, IdentityPublicKeys, KeysInPath, MasternodeProtocolVote, + MasternodeProtocolVotes, ProposerBlockCountById, ProposerBlockCountByRange, + ProposerBlockCounts, ProtocolVersionUpgrades, ResourceVotesByIdentity, + VotePollsGroupedByTimestamp, Voter, Voters, }; use drive_proof_verifier::{types::Documents, FromProof}; use rs_dapi_client::{transport::TransportRequest, DapiRequest, RequestSettings}; @@ -415,3 +419,13 @@ impl FetchMany for VotePoll { impl FetchMany for drive_proof_verifier::types::IdentityBalance { type Request = GetIdentitiesBalancesRequest; } + +// +/// Fetch multiple elements. +/// +/// ## Supported query types +/// +/// * [KeysInPath] +impl FetchMany for Element { + type Request = GetPathElementsRequest; +} diff --git a/packages/rs-sdk/src/platform/query.rs b/packages/rs-sdk/src/platform/query.rs index 287f8b6951..a145d89058 100644 --- a/packages/rs-sdk/src/platform/query.rs +++ b/packages/rs-sdk/src/platform/query.rs @@ -8,15 +8,17 @@ use dapi_grpc::mock::Mockable; use dapi_grpc::platform::v0::get_contested_resource_identity_votes_request::GetContestedResourceIdentityVotesRequestV0; use dapi_grpc::platform::v0::get_contested_resource_voters_for_identity_request::GetContestedResourceVotersForIdentityRequestV0; use dapi_grpc::platform::v0::get_contested_resources_request::GetContestedResourcesRequestV0; +use dapi_grpc::platform::v0::get_current_quorums_info_request::GetCurrentQuorumsInfoRequestV0; use dapi_grpc::platform::v0::get_evonodes_proposed_epoch_blocks_by_range_request::GetEvonodesProposedEpochBlocksByRangeRequestV0; use dapi_grpc::platform::v0::get_path_elements_request::GetPathElementsRequestV0; use dapi_grpc::platform::v0::get_status_request::GetStatusRequestV0; use dapi_grpc::platform::v0::get_total_credits_in_platform_request::GetTotalCreditsInPlatformRequestV0; use dapi_grpc::platform::v0::{ - self as proto, get_identity_keys_request, get_identity_keys_request::GetIdentityKeysRequestV0, - get_path_elements_request, get_total_credits_in_platform_request, AllKeys, - GetContestedResourceVoteStateRequest, GetContestedResourceVotersForIdentityRequest, - GetContestedResourcesRequest, GetEpochsInfoRequest, + self as proto, get_current_quorums_info_request, get_identity_keys_request, + get_identity_keys_request::GetIdentityKeysRequestV0, get_path_elements_request, + get_total_credits_in_platform_request, AllKeys, GetContestedResourceVoteStateRequest, + GetContestedResourceVotersForIdentityRequest, GetContestedResourcesRequest, + GetCurrentQuorumsInfoRequest, GetEpochsInfoRequest, GetEvonodesProposedEpochBlocksByRangeRequest, GetIdentityKeysRequest, GetPathElementsRequest, GetProtocolVersionUpgradeStateRequest, GetProtocolVersionUpgradeVoteStatusRequest, GetTotalCreditsInPlatformRequest, KeyRequestType, @@ -621,6 +623,24 @@ impl Query for NoParamQuery { } } +impl Query for NoParamQuery { + fn query(self, prove: bool) -> Result { + if prove { + unimplemented!( + "query with proof are not supported yet for GetCurrentQuorumsInfoRequest" + ); + } + + let request: GetCurrentQuorumsInfoRequest = GetCurrentQuorumsInfoRequest { + version: Some(get_current_quorums_info_request::Version::V0( + GetCurrentQuorumsInfoRequestV0 {}, + )), + }; + + Ok(request) + } +} + impl Query for LimitQuery> { fn query(self, prove: bool) -> Result { if !prove { diff --git a/packages/withdrawals-contract/src/lib.rs b/packages/withdrawals-contract/src/lib.rs index baa5887f8e..47e735b938 100644 --- a/packages/withdrawals-contract/src/lib.rs +++ b/packages/withdrawals-contract/src/lib.rs @@ -4,6 +4,7 @@ use platform_value::{Identifier, IdentifierBytes32}; use platform_version::version::PlatformVersion; use serde_json::Value; use serde_repr::{Deserialize_repr, Serialize_repr}; +use std::fmt; mod error; pub mod v1; @@ -44,6 +45,19 @@ pub enum WithdrawalStatus { EXPIRED = 4, } +impl fmt::Display for WithdrawalStatus { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let status_str = match self { + WithdrawalStatus::QUEUED => "Queued", + WithdrawalStatus::POOLED => "Pooled", + WithdrawalStatus::BROADCASTED => "Broadcasted", + WithdrawalStatus::COMPLETE => "Complete", + WithdrawalStatus::EXPIRED => "Expired", + }; + write!(f, "{}", status_str) + } +} + pub fn load_definitions(platform_version: &PlatformVersion) -> Result, Error> { match platform_version.system_data_contracts.withdrawals { 1 => Ok(None), From 75296d56191670f9c962512c4a3ff2dd69112eb2 Mon Sep 17 00:00:00 2001 From: Vivek Sharma <52695196+vivekgsharma@users.noreply.github.com> Date: Thu, 3 Oct 2024 16:07:40 +0530 Subject: [PATCH 33/90] chore(release): replace colima with native docker in macOS builds (#2188) --- .github/workflows/release.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 09a9d209c9..dba5d592f5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -242,9 +242,11 @@ jobs: - name: Install macOS build deps if: runner.os == 'macOS' run: | - brew install llvm docker colima coreutils - colima start - echo "/usr/local/opt/llvm/bin" >> $GITHUB_PATH + brew install llvm coreutils + + - name: Set up Docker for macOS + if: runner.os == 'macOS' + uses: docker-practice/actions-setup-docker@master - name: Install the Apple certificate if: runner.os == 'macOS' @@ -278,7 +280,7 @@ jobs: - name: Create package env: - OSX_KEYCHAIN: $RUNNER_TEMP/app-signing.keychain-db + OSX_KEYCHAIN: ${{ runner.temp }}/app-signing.keychain-db run: "${GITHUB_WORKSPACE}/scripts/pack_dashmate.sh ${{ matrix.package_type }}" - name: Upload artifacts to action summary From 3404f5958ccfb4e9f9098b9ea1024e745a25d8ea Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 3 Oct 2024 13:53:43 +0300 Subject: [PATCH 34/90] refactor(drive): remove duplicated withdrawal amount validation (#2191) --- ...thdrawal_transition_output_script_error.rs | 1 + .../balance/v0/mod.rs | 103 ++++++- .../state/v0/mod.rs | 28 +- .../structure/v1/mod.rs | 257 ++++++++++++++++++ 4 files changed, 357 insertions(+), 32 deletions(-) diff --git a/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_output_script_error.rs b/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_output_script_error.rs index 337cc1908c..9af57eb8be 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_output_script_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_output_script_error.rs @@ -29,6 +29,7 @@ impl InvalidIdentityCreditWithdrawalTransitionOutputScriptError { } pub fn output_script(&self) -> CoreScript { + // TODO: We shouldn't clone in getter 🤦 self.output_script.clone() } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs index 9dc60ba353..0843ed7ec1 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs @@ -5,10 +5,6 @@ use dpp::state_transition::identity_credit_withdrawal_transition::accessors::Ide use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use crate::error::execution::ExecutionError; -use crate::execution::types::execution_operation::ValidationOperation; -use crate::execution::types::state_transition_execution_context::{ - StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, -}; use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; @@ -34,7 +30,11 @@ impl IdentityCreditTransferTransitionBalanceValidationV0 for IdentityCreditWithd "expected to have a balance on identity for credit withdrawal transition", )))?; - if balance < self.amount().checked_add(platform_version.fee_version.state_transition_min_fees.credit_withdrawal).ok_or(Error::Execution(ExecutionError::Overflow("overflow when adding amount and min_leftover_credits_before_processing in identity credit withdrawal")))? { + let amount_and_fees = self.amount() + .checked_add(platform_version.fee_version.state_transition_min_fees.credit_withdrawal) + .ok_or_else(|| Error::Execution(ExecutionError::Overflow("overflow when adding amount and min_leftover_credits_before_processing in identity credit withdrawal")))?; + + if balance < amount_and_fees { return Ok(SimpleConsensusValidationResult::new_with_error( IdentityInsufficientBalanceError::new(self.identity_id(), balance, self.amount()) .into(), @@ -44,3 +44,96 @@ impl IdentityCreditTransferTransitionBalanceValidationV0 for IdentityCreditWithd Ok(SimpleConsensusValidationResult::new()) } } + +#[cfg(test)] +mod tests { + use super::*; + + use assert_matches::assert_matches; + use dpp::consensus::state::state_error::StateError; + use dpp::consensus::ConsensusError; + use dpp::prelude::Identifier; + use dpp::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; + use platform_version::version::v1::PLATFORM_V1; + + mod validate_advanced_minimum_balance_pre_check_v0 { + use super::*; + + #[test] + fn should_return_invalid_result_if_balance_is_less_than_amount_and_fees() { + let balance = 100; + + let amount = 200; + + let identity = PartialIdentity { + id: Identifier::random(), + loaded_public_keys: Default::default(), + balance: Some(balance), + revision: None, + not_found_public_keys: Default::default(), + }; + + let transaction = + IdentityCreditWithdrawalTransition::V0(IdentityCreditWithdrawalTransitionV0 { + identity_id: identity.id, + amount, + core_fee_per_byte: 0, + pooling: Default::default(), + output_script: Default::default(), + nonce: 0, + user_fee_increase: 0, + signature_public_key_id: 0, + signature: Default::default(), + }); + + let platform_version = &PLATFORM_V1; + + let result = transaction + .validate_advanced_minimum_balance_pre_check_v0(&identity, platform_version) + .expect("failed to validate minimum balance"); + + assert_matches!( + result.errors.as_slice(), + [ConsensusError::StateError( + StateError::IdentityInsufficientBalanceError(err) + )] if err.balance() == balance && err.required_balance() == amount && err.identity_id() == &identity.id + ); + } + + #[test] + fn should_return_valid_result() { + let balance = 200000000000; + + let amount = 100; + + let identity = PartialIdentity { + id: Identifier::random(), + loaded_public_keys: Default::default(), + balance: Some(balance), + revision: None, + not_found_public_keys: Default::default(), + }; + + let transaction = + IdentityCreditWithdrawalTransition::V0(IdentityCreditWithdrawalTransitionV0 { + identity_id: Default::default(), + amount, + core_fee_per_byte: 0, + pooling: Default::default(), + output_script: Default::default(), + nonce: 0, + user_fee_increase: 0, + signature_public_key_id: 0, + signature: Default::default(), + }); + + let platform_version = &PLATFORM_V1; + + let result = transaction + .validate_advanced_minimum_balance_pre_check_v0(&identity, platform_version) + .expect("failed to validate minimum balance"); + + assert_matches!(result.errors.as_slice(), []); + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/state/v0/mod.rs index fefadaa8c7..87eff3dbaa 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/state/v0/mod.rs @@ -3,10 +3,7 @@ use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; -use dpp::consensus::signature::IdentityNotFoundError; -use dpp::consensus::state::identity::IdentityInsufficientBalanceError; use dpp::prelude::ConsensusValidationResult; -use dpp::state_transition::identity_credit_withdrawal_transition::accessors::IdentityCreditWithdrawalTransitionAccessorsV0; use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use crate::execution::types::execution_operation::ValidationOperation; @@ -49,29 +46,6 @@ impl IdentityCreditWithdrawalStateTransitionStateValidationV0 tx: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { - let maybe_existing_identity_balance = platform.drive.fetch_identity_balance( - self.identity_id().to_buffer(), - tx, - platform_version, - )?; - - let Some(existing_identity_balance) = maybe_existing_identity_balance else { - return Ok(ConsensusValidationResult::new_with_error( - IdentityNotFoundError::new(self.identity_id()).into(), - )); - }; - - if existing_identity_balance < self.amount() { - return Ok(ConsensusValidationResult::new_with_error( - IdentityInsufficientBalanceError::new( - self.identity_id(), - existing_identity_balance, - self.amount(), - ) - .into(), - )); - } - self.transform_into_action_v0( platform, block_info, @@ -91,7 +65,7 @@ impl IdentityCreditWithdrawalStateTransitionStateValidationV0 ) -> Result, Error> { let consensus_validation_result = IdentityCreditWithdrawalTransitionAction::try_from_identity_credit_withdrawal( - &platform.drive, + platform.drive, tx, self, block_info, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v1/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v1/mod.rs index 7f018630a8..f3898d0b0d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v1/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v1/mod.rs @@ -78,3 +78,260 @@ impl IdentityCreditWithdrawalStateTransitionStructureValidationV1 Ok(result) } } + +#[cfg(test)] +mod tests { + use super::*; + + use assert_matches::assert_matches; + use dpp::consensus::basic::BasicError; + use dpp::dashcore::ScriptBuf; + use dpp::identity::core_script::CoreScript; + use dpp::state_transition::identity_credit_withdrawal_transition::v1::IdentityCreditWithdrawalTransitionV1; + use platform_version::version::v1::PLATFORM_V1; + use rand::SeedableRng; + + mod validate_basic_structure_v1 { + use super::*; + use rand::prelude::StdRng; + + #[test] + fn should_return_invalid_result_if_amount_too_low() { + let amount = 18000; + + let transition = + IdentityCreditWithdrawalTransition::V1(IdentityCreditWithdrawalTransitionV1 { + identity_id: Default::default(), + amount, + core_fee_per_byte: 1, + pooling: Default::default(), + output_script: None, + nonce: 0, + user_fee_increase: 0, + signature_public_key_id: 0, + signature: Default::default(), + }); + + let platform_version = &PLATFORM_V1; + + let result = transition + .validate_basic_structure_v1(platform_version) + .expect("failed to validate basic structure"); + + assert_matches!( + result.errors.as_slice(), + [ConsensusError::BasicError( + BasicError::InvalidIdentityCreditWithdrawalTransitionAmountError( + InvalidIdentityCreditWithdrawalTransitionAmountError { + amount: a, + min_amount: 190000, + max_amount: 50000000000000, + }, + ), + )] if *a == amount + ); + } + + #[test] + fn should_return_invalid_result_if_amount_too_high() { + let amount = 60000000000000; + + let transition = + IdentityCreditWithdrawalTransition::V1(IdentityCreditWithdrawalTransitionV1 { + identity_id: Default::default(), + amount, + core_fee_per_byte: 1, + pooling: Default::default(), + output_script: None, + nonce: 0, + user_fee_increase: 0, + signature_public_key_id: 0, + signature: Default::default(), + }); + + let platform_version = &PLATFORM_V1; + + let result = transition + .validate_basic_structure_v1(platform_version) + .expect("failed to validate basic structure"); + + assert_matches!( + result.errors.as_slice(), + [ConsensusError::BasicError( + BasicError::InvalidIdentityCreditWithdrawalTransitionAmountError( + InvalidIdentityCreditWithdrawalTransitionAmountError { + amount: a, + min_amount: 190000, + max_amount: 50000000000000, + }, + ), + )] if *a == amount + ); + } + + #[test] + fn should_return_invalid_result_if_pooling_not_never() { + let transition = + IdentityCreditWithdrawalTransition::V1(IdentityCreditWithdrawalTransitionV1 { + identity_id: Default::default(), + amount: 200000, + core_fee_per_byte: 1, + pooling: Pooling::Standard, + output_script: None, + nonce: 0, + user_fee_increase: 0, + signature_public_key_id: 0, + signature: Default::default(), + }); + + let platform_version = &PLATFORM_V1; + + let result = transition + .validate_basic_structure_v1(platform_version) + .expect("failed to validate basic structure"); + + assert_matches!( + result.errors.as_slice(), + [ConsensusError::BasicError( + BasicError::NotImplementedIdentityCreditWithdrawalTransitionPoolingError(err), + )] if err.pooling() == Pooling::Standard as u8 + ); + } + + #[test] + fn should_return_invalid_result_if_core_fee_not_fibonacci() { + let transition = + IdentityCreditWithdrawalTransition::V1(IdentityCreditWithdrawalTransitionV1 { + identity_id: Default::default(), + amount: 200000, + core_fee_per_byte: 0, + pooling: Pooling::Never, + output_script: None, + nonce: 0, + user_fee_increase: 0, + signature_public_key_id: 0, + signature: Default::default(), + }); + + let platform_version = &PLATFORM_V1; + + let result = transition + .validate_basic_structure_v1(platform_version) + .expect("failed to validate basic structure"); + + assert_matches!( + result.errors.as_slice(), + [ConsensusError::BasicError( + BasicError::InvalidIdentityCreditWithdrawalTransitionCoreFeeError(err) + )] if err.min_core_fee_per_byte() == 1 && err.core_fee_per_byte() == 0 + ); + } + + #[test] + fn should_return_invalid_result_if_output_script_is_not_p2pkh_or_p2sh() { + let output_script = CoreScript::new(ScriptBuf::new()); + + let transition = + IdentityCreditWithdrawalTransition::V1(IdentityCreditWithdrawalTransitionV1 { + identity_id: Default::default(), + amount: 200000, + core_fee_per_byte: 1, + pooling: Pooling::Never, + output_script: Some(output_script.clone()), + nonce: 0, + user_fee_increase: 0, + signature_public_key_id: 0, + signature: Default::default(), + }); + + let platform_version = &PLATFORM_V1; + + let result = transition + .validate_basic_structure_v1(platform_version) + .expect("failed to validate basic structure"); + + assert_matches!( + result.errors.as_slice(), + [ConsensusError::BasicError( + BasicError::InvalidIdentityCreditWithdrawalTransitionOutputScriptError(err) + )] if err.output_script() == output_script + ); + } + + #[test] + fn should_return_valid_result_if_output_script_is_p2pkh() { + let rng = &mut StdRng::from_entropy(); + + let transition = + IdentityCreditWithdrawalTransition::V1(IdentityCreditWithdrawalTransitionV1 { + identity_id: Default::default(), + amount: 200000, + core_fee_per_byte: 1, + pooling: Pooling::Never, + output_script: Some(CoreScript::random_p2pkh(rng)), + nonce: 0, + user_fee_increase: 0, + signature_public_key_id: 0, + signature: Default::default(), + }); + + let platform_version = &PLATFORM_V1; + + let result = transition + .validate_basic_structure_v1(platform_version) + .expect("failed to validate basic structure"); + + assert!(result.is_valid()); + } + + #[test] + fn should_return_valid_result_if_output_script_is_p2sh() { + let rng = &mut StdRng::from_entropy(); + + let transition = + IdentityCreditWithdrawalTransition::V1(IdentityCreditWithdrawalTransitionV1 { + identity_id: Default::default(), + amount: 200000, + core_fee_per_byte: 1, + pooling: Pooling::Never, + output_script: Some(CoreScript::random_p2sh(rng)), + nonce: 0, + user_fee_increase: 0, + signature_public_key_id: 0, + signature: Default::default(), + }); + + let platform_version = &PLATFORM_V1; + + let result = transition + .validate_basic_structure_v1(platform_version) + .expect("failed to validate basic structure"); + + assert!(result.is_valid()); + } + + #[test] + fn should_return_valid_result_without_output_script() { + let transition = + IdentityCreditWithdrawalTransition::V1(IdentityCreditWithdrawalTransitionV1 { + identity_id: Default::default(), + amount: 200000, + core_fee_per_byte: 1, + pooling: Pooling::Never, + output_script: None, + nonce: 0, + user_fee_increase: 0, + signature_public_key_id: 0, + signature: Default::default(), + }); + + let platform_version = &PLATFORM_V1; + + let result = transition + .validate_basic_structure_v1(platform_version) + .expect("failed to validate basic structure"); + + assert!(result.is_valid()); + } + } +} From 6230b53d33575792d80eb3c7dfc4cc39c76b51ba Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 3 Oct 2024 16:02:38 +0300 Subject: [PATCH 35/90] chore(drive): improve withdrawal logging (#2203) --- .../v0/mod.rs | 33 +++++++++++-------- .../v0/mod.rs | 4 +-- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs index d84db00848..1f6cacbc2b 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs @@ -31,7 +31,7 @@ where } tracing::debug!( - "Broadcasting {} withdrawal transactions", + "Broadcasting {} asset unlock transactions", withdrawal_transactions_with_vote_extensions.len(), ); @@ -55,19 +55,20 @@ where let signature = BLSSignature::from(signature_bytes); // Modify the transaction's payload - if let Some(AssetUnlockPayloadType(mut payload)) = - transaction.special_transaction_payload - { - // Assign the quorum signature - payload.quorum_sig = signature; - - // Assign the modified payload back to the transaction - transaction.special_transaction_payload = Some(AssetUnlockPayloadType(payload)); - } else { + let Some(AssetUnlockPayloadType(mut payload)) = transaction.special_transaction_payload + else { return Err(Error::Execution(ExecutionError::CorruptedCachedState( "withdrawal transaction payload must be AssetUnlockPayloadType".to_string(), ))); - } + }; + + // Assign the quorum signature + payload.quorum_sig = signature; + + let tx_index = payload.base.index; + + // Assign the modified payload back to the transaction + transaction.special_transaction_payload = Some(AssetUnlockPayloadType(payload)); // Serialize the transaction let tx_bytes = consensus::serialize(&transaction); @@ -77,7 +78,8 @@ where Ok(_) => { tracing::debug!( tx_id = transaction.txid().to_hex(), - "Successfully broadcasted withdrawal transaction" + tx_index, + "Successfully broadcasted asset unlock transaction with index {tx_index}", ); } // Handle specific errors @@ -92,7 +94,9 @@ where { tracing::debug!( tx_id = transaction.txid().to_string(), - "Asset unlock is expired or has no active quorum: {}", + tx_index, + error = ?e, + "Asset unlock transaction with index {tx_index} is expired or has no active quorum: {}", e.message ); transaction_submission_failures.push((transaction.txid(), tx_bytes)); @@ -101,7 +105,8 @@ where Err(e) => { tracing::warn!( tx_id = transaction.txid().to_string(), - "Failed to broadcast asset unlock transaction: {}", + tx_index, + "Failed to broadcast asset unlock transaction with index {tx_index}: {}", e ); // Collect failed transactions for potential future retries diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/v0/mod.rs index 011867a872..d8949a06a0 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/v0/mod.rs @@ -22,12 +22,12 @@ where let Some(position_of_current_quorum) = last_committed_platform_state.current_validator_set_position_in_list_by_most_recent() else { - tracing::warn!("Current quorum not in current validator set, not making withdrawals"); + tracing::warn!("Current quorum not in current validator set, do not re-broadcast expired withdrawals"); return Ok(()); }; if position_of_current_quorum != 0 { tracing::debug!( - "Current quorum is not most recent, it is in position {}, not making withdrawals", + "Current quorum is not most recent, it is in position {}, do not re-broadcast expired withdrawals", position_of_current_quorum ); return Ok(()); From 37b5ea497ce5e775cbebb037c04005febf2532f2 Mon Sep 17 00:00:00 2001 From: fominok Date: Fri, 4 Oct 2024 13:16:49 +0200 Subject: [PATCH 36/90] chore: bump GroveDB dependency (#2196) Co-authored-by: Quantum Explorer --- Cargo.lock | 37 +++--- packages/rs-drive/Cargo.toml | 12 +- .../mod.rs | 107 +++++++++--------- .../v0/mod.rs | 60 +++++----- packages/rs-platform-version/Cargo.toml | 2 +- 5 files changed, 109 insertions(+), 109 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6a05f5b530..819f2b9922 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2064,9 +2064,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "grovedb" -version = "2.0.3" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77097f0a4cc70c4a69fa400f633c5f18739e446eaed05269a3d76e17fa4d33d2" +checksum = "7d91e8f87926c834c7338d0c69a48816c043e0cddf0062a8a567483db2fb1e24" dependencies = [ "axum 0.7.5", "bincode", @@ -2092,15 +2092,16 @@ dependencies = [ "tempfile", "thiserror", "tokio", + "tokio-util", "tower-http", "zip-extensions", ] [[package]] name = "grovedb-costs" -version = "2.0.3" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0487d63a68621b910567a911b3708a8246501ae1912fa2f1920474dcb28a207" +checksum = "360f7c8d3b20beafcbf3cde8754bbcfd201ae2a30ec7594a4b9678fd2fa3c7a8" dependencies = [ "integer-encoding", "intmap", @@ -2109,9 +2110,9 @@ dependencies = [ [[package]] name = "grovedb-epoch-based-storage-flags" -version = "2.0.3" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53eb4b99b056e34bcceef2d604c883aee40daa688ceb7ec558456e10bef27c64" +checksum = "acec1b6962d99d7b079c0fd1532cd3a2c83a3d659ffd9fcf02edda4599334bb4" dependencies = [ "grovedb-costs", "hex", @@ -2122,9 +2123,9 @@ dependencies = [ [[package]] name = "grovedb-merk" -version = "2.0.3" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daedc296cac3093d244cbda0a11a5ef378bd4f747fcbe45b6cbed040c78cfb36" +checksum = "72057865f239fdd24f92eaa8668acc0d618da168f330546577a62eda1701210e" dependencies = [ "bincode", "blake3", @@ -2148,15 +2149,15 @@ dependencies = [ [[package]] name = "grovedb-path" -version = "2.0.3" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3552accddbfe6e586853f50a102d665efc0449a63504e5e2113389be924f98c" +checksum = "5d96cc6106e5ca88e548d66f130b877b664da78be226dfdba555fc210f8508f4" [[package]] name = "grovedb-storage" -version = "2.0.3" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868d74460c6205563e7bc72549f3fa057ed8bd0f83d96e04b2286ca0a216149" +checksum = "e1c9b59bc9fa7123b8485f87f88a886dd109e7aff5f34a29a3812cb64eb897ff" dependencies = [ "blake3", "grovedb-costs", @@ -2174,9 +2175,9 @@ dependencies = [ [[package]] name = "grovedb-version" -version = "2.0.3" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d62bd20c621681dfd8aa6ca128702de775c67560c1fe412f380c5278d5c48ba" +checksum = "f4be0c1a1ef97068fe93212e7b6f349e0b44a9fc90063c8c28e110cfb8c2fcb2" dependencies = [ "thiserror", "versioned-feature-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2184,9 +2185,9 @@ dependencies = [ [[package]] name = "grovedb-visualize" -version = "2.0.3" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6cd92c3a11055b1d841d071f801517b98575f9704f5a757a016fe83d35a37b8" +checksum = "5865f4335eb99644512a7d80d6b1698ba1099a8268fdfd3ffb1a3a32dcb4af28" dependencies = [ "hex", "itertools 0.12.1", @@ -2194,9 +2195,9 @@ dependencies = [ [[package]] name = "grovedbg-types" -version = "2.0.3" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "003e5066965932dbb617e5966df5f73a066eb721579840b30ddd46bf04311fc8" +checksum = "921b9a29facf9d3f0de667cd1da083a34695ede9e7bfacd74bb5bd29f8f7c178" dependencies = [ "serde", "serde_with 3.9.0", diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 50915b06e2..94938455c5 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -51,12 +51,12 @@ enum-map = { version = "2.0.3", optional = true } intmap = { version = "2.0.0", features = ["serde"], optional = true } chrono = { version = "0.4.35", optional = true } itertools = { version = "0.11.0", optional = true } -grovedb = { version = "2.0.3", optional = true, default-features = false } -grovedb-costs = { version = "2.0.3", optional = true } -grovedb-path = { version = "2.0.3" } -grovedb-storage = { version = "2.0.3", optional = true } -grovedb-version = { version = "2.0.3"} -grovedb-epoch-based-storage-flags = { version = "2.0.3"} +grovedb = { version = "2.1.0", optional = true, default-features = false } +grovedb-costs = { version = "2.1.0", optional = true } +grovedb-path = { version = "2.1.0" } +grovedb-storage = { version = "2.1.0", optional = true } +grovedb-version = { version = "2.1.0"} +grovedb-epoch-based-storage-flags = { version = "2.1.0"} [dev-dependencies] criterion = "0.3.5" diff --git a/packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists_return_existing_element/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists_return_existing_element/mod.rs index 8c5455a038..6727b72014 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists_return_existing_element/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists_return_existing_element/mod.rs @@ -1,54 +1,53 @@ -//todo: uncomment once version 2.1 of GroveDB is released. -// mod v0; -// -// use crate::drive::Drive; -// use crate::error::drive::DriveError; -// use crate::error::Error; -// use crate::fees::op::LowLevelDriveOperation; -// use dpp::version::drive_versions::DriveVersion; -// use grovedb::{Element, TransactionArg}; -// use grovedb_path::SubtreePath; -// -// impl Drive { -// /// Inserts an element into groveDB only if the specified path and key do not exist. -// /// This operation costs are then stored in `drive_operations`. -// /// -// /// # Parameters -// /// * `path`: The groveDB hierarchical authenticated structure path where the new element is to be inserted. -// /// * `key`: The key where the new element should be inserted in the subtree. -// /// * `element`: The element to be inserted. -// /// * `transaction`: The groveDB transaction associated with this operation. -// /// * `drive_operations`: A vector to collect the costs of operations for later computation. In this case, -// /// it collects the cost of this insert operation if the path and key did not exist. -// /// * `platform_version`: The platform version to select the correct function version to run. -// /// -// /// # Returns -// /// * `Ok(true)` if the insertion was successful. -// /// * `Ok(false)` if the path and key already existed. -// /// * `Err(DriveError::UnknownVersionMismatch)` if the platform version does not match known versions. -// pub fn grove_insert_if_not_exists_return_existing_element>( -// &self, -// path: SubtreePath<'_, B>, -// key: &[u8], -// element: Element, -// transaction: TransactionArg, -// drive_operations: Option<&mut Vec>, -// drive_version: &DriveVersion, -// ) -> Result, Error> { -// match drive_version.grove_methods.basic.grove_insert_if_not_exists { -// 0 => self.grove_insert_if_not_exists_return_existing_element_v0( -// path, -// key, -// element, -// transaction, -// drive_operations, -// drive_version, -// ), -// version => Err(Error::Drive(DriveError::UnknownVersionMismatch { -// method: "grove_insert_if_not_exists_return_existing_element".to_string(), -// known_versions: vec![0], -// received: version, -// })), -// } -// } -// } +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::version::drive_versions::DriveVersion; +use grovedb::{Element, TransactionArg}; +use grovedb_path::SubtreePath; + +impl Drive { + /// Inserts an element into groveDB only if the specified path and key do not exist. + /// This operation costs are then stored in `drive_operations`. + /// + /// # Parameters + /// * `path`: The groveDB hierarchical authenticated structure path where the new element is to be inserted. + /// * `key`: The key where the new element should be inserted in the subtree. + /// * `element`: The element to be inserted. + /// * `transaction`: The groveDB transaction associated with this operation. + /// * `drive_operations`: A vector to collect the costs of operations for later computation. In this case, + /// it collects the cost of this insert operation if the path and key did not exist. + /// * `platform_version`: The platform version to select the correct function version to run. + /// + /// # Returns + /// * `Ok(true)` if the insertion was successful. + /// * `Ok(false)` if the path and key already existed. + /// * `Err(DriveError::UnknownVersionMismatch)` if the platform version does not match known versions. + pub fn grove_insert_if_not_exists_return_existing_element>( + &self, + path: SubtreePath<'_, B>, + key: &[u8], + element: Element, + transaction: TransactionArg, + drive_operations: Option<&mut Vec>, + drive_version: &DriveVersion, + ) -> Result, Error> { + match drive_version.grove_methods.basic.grove_insert_if_not_exists { + 0 => self.grove_insert_if_not_exists_return_existing_element_v0( + path, + key, + element, + transaction, + drive_operations, + drive_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "grove_insert_if_not_exists_return_existing_element".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists_return_existing_element/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists_return_existing_element/v0/mod.rs index 5030cd6cc5..69b55ba2d7 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists_return_existing_element/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists_return_existing_element/v0/mod.rs @@ -1,30 +1,30 @@ -// use crate::drive::Drive; -// use crate::error::Error; -// use crate::fees::op::LowLevelDriveOperation; -// use crate::util::grove_operations::push_drive_operation_result_optional; -// use grovedb::{Element, TransactionArg}; -// use grovedb_path::SubtreePath; -// use platform_version::version::drive_versions::DriveVersion; -// -// impl Drive { -// /// Pushes the `OperationCost` of inserting an element in groveDB where the path key does not yet exist -// /// to `drive_operations`. -// pub(crate) fn grove_insert_if_not_exists_return_existing_element_v0>( -// &self, -// path: SubtreePath<'_, B>, -// key: &[u8], -// element: Element, -// transaction: TransactionArg, -// drive_operations: Option<&mut Vec>, -// drive_version: &DriveVersion, -// ) -> Result { -// let cost_context = self.grove.insert_if_not_exists_return_existing_element( -// path, -// key, -// element, -// transaction, -// &drive_version.grove_version, -// ); -// push_drive_operation_result_optional(cost_context, drive_operations) -// } -// } +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::push_drive_operation_result_optional; +use grovedb::{Element, TransactionArg}; +use grovedb_path::SubtreePath; +use platform_version::version::drive_versions::DriveVersion; + +impl Drive { + /// Pushes the `OperationCost` of inserting an element in groveDB where the path key does not yet exist + /// to `drive_operations`. + pub(crate) fn grove_insert_if_not_exists_return_existing_element_v0>( + &self, + path: SubtreePath<'_, B>, + key: &[u8], + element: Element, + transaction: TransactionArg, + drive_operations: Option<&mut Vec>, + drive_version: &DriveVersion, + ) -> Result, Error> { + let cost_context = self.grove.insert_if_not_exists_return_existing_element( + path, + key, + element, + transaction, + &drive_version.grove_version, + ); + push_drive_operation_result_optional(cost_context, drive_operations) + } +} diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 01b8e5380a..546704554d 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -11,7 +11,7 @@ license = "MIT" thiserror = { version = "1.0.63" } bincode = { version = "2.0.0-rc.3"} versioned-feature-core = { git = "https://github.com/dashpay/versioned-feature-core", version = "1.0.0" } -grovedb-version = { version = "2.0.3"} +grovedb-version = { version = "2.1.0"} once_cell = "1.19.0" [features] From 8773afae09052cc7c2cc316081874f342cc12947 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 4 Oct 2024 14:21:03 +0300 Subject: [PATCH 37/90] feat(sdk): enable withdrawals v1 in JS SDK (#2201) --- .yarn/cache/fsevents-patch-19706e7e35-10.zip | Bin 0 -> 23750 bytes .../methods/identities/creditWithdrawal.ts | 44 +++++++----- .../rs-dpp/src/identity/identity_facade.rs | 2 +- .../rs-dpp/src/identity/identity_factory.rs | 65 ++++++++++++++---- .../mod.rs | 6 +- .../src/version/dpp_versions.rs | 6 ++ .../src/version/mocks/v2_test.rs | 8 ++- .../src/version/mocks/v3_test.rs | 8 ++- .../rs-platform-version/src/version/v1.rs | 8 ++- .../rs-platform-version/src/version/v2.rs | 8 ++- .../rs-platform-version/src/version/v3.rs | 8 ++- .../rs-platform-version/src/version/v4.rs | 8 ++- ...entityCreditWithdrawalTransitionFixture.js | 2 +- .../wasm-dpp/src/identity/identity_facade.rs | 4 +- .../wasm-dpp/src/identity/identity_factory.rs | 4 +- .../identity/IdentityFacade.spec.js | 2 +- .../unit/identity/IdentityFactory.spec.js | 2 +- ...IdentityCreditWithdrawalTransition.spec.js | 6 +- 18 files changed, 138 insertions(+), 53 deletions(-) create mode 100644 .yarn/cache/fsevents-patch-19706e7e35-10.zip diff --git a/.yarn/cache/fsevents-patch-19706e7e35-10.zip b/.yarn/cache/fsevents-patch-19706e7e35-10.zip new file mode 100644 index 0000000000000000000000000000000000000000..aff1ab12ce57f312cc3bc58c78597020f7980e62 GIT binary patch literal 23750 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 literal 0 HcmV?d00001 diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts index a2bd513397..4be23a4a67 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts @@ -28,37 +28,50 @@ const MIN_ASSET_UNLOCK_CORE_FEE_PER_BYTE = 1; const MINIMAL_WITHDRAWAL_AMOUNT = ASSET_UNLOCK_TX_SIZE * MIN_ASSET_UNLOCK_CORE_FEE_PER_BYTE * 1000; type WithdrawalOptions = { - signingKeyIndex: number + signingKeyIndex?: number + toAddress?: string }; /** Creates platform credits withdrawal request * @param identity - identity to withdraw from * @param amount - amount of credits to withdraw - * @param to - Dash L1 address * @param options - withdrawal options + * @param [options] - withdrawal options + * @param [options.toAddress] - withdrawal destination address */ export async function creditWithdrawal( this: Platform, identity: Identity, amount: number, - to: string, - options: WithdrawalOptions = { - signingKeyIndex: 3, - }, + options: WithdrawalOptions = { }, ): Promise { await this.initialize(); + // eslint-disable-next-line no-param-reassign + options = { + ...options, + signingKeyIndex: 3, + }; + const { dpp } = this; - let toAddress: Address; - try { - toAddress = new Address(to, this.client.network); - } catch (e) { - throw new Error(`Invalid core recipient "${to}" for network ${this.client.network}`); + let outputScriptBytes: Buffer | undefined; + if (options.toAddress) { + let toAddress: Address; + try { + toAddress = new Address(options.toAddress, this.client.network); + } catch (e) { + throw new Error(`Invalid core recipient "${options.toAddress}" for network ${this.client.network}`); + } + + const outputScript = Script.buildPublicKeyHashOut(toAddress); + // @ts-ignore + outputScriptBytes = outputScript.toBuffer(); + + this.logger.debug(`[Identity#creditWithdrawal] credits withdrawal from ${identity.getId().toString()} to ${toAddress.toString()} with amount ${amount}`); + } else { + this.logger.debug(`[Identity#creditWithdrawal] credits withdrawal from ${identity.getId().toString()} to recent withdrawal address with amount ${amount}`); } - this.logger.debug(`[Identity#creditWithdrawal] credits withdrawal from ${identity.getId().toString()} to ${toAddress.toString()} with amount ${amount}`); - - const outputScript = Script.buildPublicKeyHashOut(toAddress); const balance = identity.getBalance(); if (amount > balance) { @@ -88,8 +101,7 @@ export async function creditWithdrawal( BigInt(amount), coreFeePerByte, DEFAULT_POOLING, - // @ts-ignore - outputScript.toBuffer(), + outputScriptBytes, BigInt(identityNonce), ); diff --git a/packages/rs-dpp/src/identity/identity_facade.rs b/packages/rs-dpp/src/identity/identity_facade.rs index 919c68c624..eecdf45e6e 100644 --- a/packages/rs-dpp/src/identity/identity_facade.rs +++ b/packages/rs-dpp/src/identity/identity_facade.rs @@ -123,7 +123,7 @@ impl IdentityFacade { amount: u64, core_fee_per_byte: u32, pooling: Pooling, - output_script: CoreScript, + output_script: Option, identity_nonce: u64, ) -> Result { self.factory.create_identity_credit_withdrawal_transition( diff --git a/packages/rs-dpp/src/identity/identity_factory.rs b/packages/rs-dpp/src/identity/identity_factory.rs index c6aface591..48f7369818 100644 --- a/packages/rs-dpp/src/identity/identity_factory.rs +++ b/packages/rs-dpp/src/identity/identity_factory.rs @@ -43,6 +43,8 @@ use crate::state_transition::identity_credit_transfer_transition::IdentityCredit #[cfg(all(feature = "state-transitions", feature = "client"))] use crate::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; #[cfg(all(feature = "state-transitions", feature = "client"))] +use crate::state_transition::identity_credit_withdrawal_transition::v1::IdentityCreditWithdrawalTransitionV1; +#[cfg(all(feature = "state-transitions", feature = "client"))] use crate::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; #[cfg(all(feature = "state-transitions", feature = "client"))] use crate::state_transition::identity_topup_transition::accessors::IdentityTopUpTransitionAccessorsV0; @@ -233,22 +235,61 @@ impl IdentityFactory { amount: u64, core_fee_per_byte: u32, pooling: Pooling, - output_script: CoreScript, + output_script: Option, identity_nonce: IdentityNonce, ) -> Result { - let identity_credit_withdrawal_transition = IdentityCreditWithdrawalTransitionV0 { - identity_id, - amount, - core_fee_per_byte, - pooling, - output_script, - nonce: identity_nonce, - ..Default::default() + let platform_version = PlatformVersion::get(self.protocol_version)?; + + let identity_credit_withdrawal_transition = match platform_version + .dpp + .state_transitions + .identities + .credit_withdrawal + .default_constructor + { + 0 => { + let output_script = output_script.ok_or_else(|| { + ProtocolError::Generic( + "Output script is required for IdentityCreditWithdrawalTransitionV0" + .to_string(), + ) + })?; + + let transition = IdentityCreditWithdrawalTransitionV0 { + identity_id, + amount, + core_fee_per_byte, + pooling, + output_script, + nonce: identity_nonce, + ..Default::default() + }; + + IdentityCreditWithdrawalTransition::from(transition) + } + 1 => { + let transition = IdentityCreditWithdrawalTransitionV1 { + identity_id, + amount, + core_fee_per_byte, + pooling, + output_script, + nonce: identity_nonce, + ..Default::default() + }; + + IdentityCreditWithdrawalTransition::from(transition) + } + version => { + return Err(ProtocolError::UnknownVersionMismatch { + method: "create_identity_credit_withdrawal_transition".to_string(), + known_versions: vec![0, 1], + received: version, + }); + } }; - Ok(IdentityCreditWithdrawalTransition::from( - identity_credit_withdrawal_transition, - )) + Ok(identity_credit_withdrawal_transition) } #[cfg(all(feature = "state-transitions", feature = "client"))] diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs index 5b93592a36..0badee88b9 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs @@ -73,8 +73,10 @@ impl IdentityCreditWithdrawalTransition { pub fn default_versioned(platform_version: &PlatformVersion) -> Result { match platform_version .dpp - .identity_versions - .identity_structure_version + .state_transitions + .identities + .credit_withdrawal + .default_constructor { 0 => Ok(IdentityCreditWithdrawalTransition::V0( IdentityCreditWithdrawalTransitionV0::default(), diff --git a/packages/rs-platform-version/src/version/dpp_versions.rs b/packages/rs-platform-version/src/version/dpp_versions.rs index 7c84e660a4..713f9dc54a 100644 --- a/packages/rs-platform-version/src/version/dpp_versions.rs +++ b/packages/rs-platform-version/src/version/dpp_versions.rs @@ -27,6 +27,12 @@ pub struct StateTransitionVersions { pub struct IdentityTransitionVersions { pub max_public_keys_in_creation: u16, pub asset_locks: IdentityTransitionAssetLockVersions, + pub credit_withdrawal: IdentityCreditWithdrawalTransitionVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct IdentityCreditWithdrawalTransitionVersions { + pub default_constructor: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 1869831859..28db2e2a7b 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -7,8 +7,9 @@ use crate::version::dpp_versions::{ DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, DocumentTypeMethodVersions, DocumentTypeSchemaVersions, DocumentTypeValidationVersions, DocumentTypeVersions, DocumentVersions, DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions, - IdentityKeyTypeMethodVersions, IdentityTransitionAssetLockVersions, IdentityTransitionVersions, - IdentityVersions, JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, + IdentityCreditWithdrawalTransitionVersions, IdentityKeyTypeMethodVersions, + IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions, + JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, RecursiveSchemaValidatorVersions, StateTransitionConversionVersions, StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions, VotingValidationVersions, VotingVersions, @@ -1183,6 +1184,9 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { validate_asset_lock_transaction_structure: 0, validate_instant_asset_lock_proof_structure: 0, }, + credit_withdrawal: IdentityCreditWithdrawalTransitionVersions { + default_constructor: 0, + }, }, }, contract_versions: ContractVersions { diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 9fef855e85..aab569b63e 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -7,8 +7,9 @@ use crate::version::dpp_versions::{ DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, DocumentTypeMethodVersions, DocumentTypeSchemaVersions, DocumentTypeValidationVersions, DocumentTypeVersions, DocumentVersions, DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions, - IdentityKeyTypeMethodVersions, IdentityTransitionAssetLockVersions, IdentityTransitionVersions, - IdentityVersions, JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, + IdentityCreditWithdrawalTransitionVersions, IdentityKeyTypeMethodVersions, + IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions, + JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, RecursiveSchemaValidatorVersions, StateTransitionConversionVersions, StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions, VotingValidationVersions, VotingVersions, @@ -1183,6 +1184,9 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { validate_asset_lock_transaction_structure: 0, validate_instant_asset_lock_proof_structure: 0, }, + credit_withdrawal: IdentityCreditWithdrawalTransitionVersions { + default_constructor: 0, + }, }, }, contract_versions: ContractVersions { diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 38200b9a61..8104775a5e 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -7,8 +7,9 @@ use crate::version::dpp_versions::{ DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, DocumentTypeMethodVersions, DocumentTypeSchemaVersions, DocumentTypeValidationVersions, DocumentTypeVersions, DocumentVersions, DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions, - IdentityKeyTypeMethodVersions, IdentityTransitionAssetLockVersions, IdentityTransitionVersions, - IdentityVersions, JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, + IdentityCreditWithdrawalTransitionVersions, IdentityKeyTypeMethodVersions, + IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions, + JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, RecursiveSchemaValidatorVersions, StateTransitionConversionVersions, StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions, VotingValidationVersions, VotingVersions, @@ -1182,6 +1183,9 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { validate_asset_lock_transaction_structure: 0, validate_instant_asset_lock_proof_structure: 0, }, + credit_withdrawal: IdentityCreditWithdrawalTransitionVersions { + default_constructor: 0, + }, }, }, contract_versions: ContractVersions { diff --git a/packages/rs-platform-version/src/version/v2.rs b/packages/rs-platform-version/src/version/v2.rs index 591e17d0c4..3f9931df8a 100644 --- a/packages/rs-platform-version/src/version/v2.rs +++ b/packages/rs-platform-version/src/version/v2.rs @@ -7,8 +7,9 @@ use crate::version::dpp_versions::{ DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, DocumentTypeMethodVersions, DocumentTypeSchemaVersions, DocumentTypeValidationVersions, DocumentTypeVersions, DocumentVersions, DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions, - IdentityKeyTypeMethodVersions, IdentityTransitionAssetLockVersions, IdentityTransitionVersions, - IdentityVersions, JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, + IdentityCreditWithdrawalTransitionVersions, IdentityKeyTypeMethodVersions, + IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions, + JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, RecursiveSchemaValidatorVersions, StateTransitionConversionVersions, StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions, VotingValidationVersions, VotingVersions, @@ -1182,6 +1183,9 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion { validate_asset_lock_transaction_structure: 0, validate_instant_asset_lock_proof_structure: 0, }, + credit_withdrawal: IdentityCreditWithdrawalTransitionVersions { + default_constructor: 0, + }, }, }, contract_versions: ContractVersions { diff --git a/packages/rs-platform-version/src/version/v3.rs b/packages/rs-platform-version/src/version/v3.rs index 543c759df7..8a57cb65a6 100644 --- a/packages/rs-platform-version/src/version/v3.rs +++ b/packages/rs-platform-version/src/version/v3.rs @@ -7,8 +7,9 @@ use crate::version::dpp_versions::{ DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, DocumentTypeMethodVersions, DocumentTypeSchemaVersions, DocumentTypeValidationVersions, DocumentTypeVersions, DocumentVersions, DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions, - IdentityKeyTypeMethodVersions, IdentityTransitionAssetLockVersions, IdentityTransitionVersions, - IdentityVersions, JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, + IdentityCreditWithdrawalTransitionVersions, IdentityKeyTypeMethodVersions, + IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions, + JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, RecursiveSchemaValidatorVersions, StateTransitionConversionVersions, StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions, VotingValidationVersions, VotingVersions, @@ -1189,6 +1190,9 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { validate_asset_lock_transaction_structure: 0, validate_instant_asset_lock_proof_structure: 0, }, + credit_withdrawal: IdentityCreditWithdrawalTransitionVersions { + default_constructor: 1, + }, }, }, contract_versions: ContractVersions { diff --git a/packages/rs-platform-version/src/version/v4.rs b/packages/rs-platform-version/src/version/v4.rs index 7c2752f29a..0082ec2743 100644 --- a/packages/rs-platform-version/src/version/v4.rs +++ b/packages/rs-platform-version/src/version/v4.rs @@ -7,8 +7,9 @@ use crate::version::dpp_versions::{ DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, DocumentTypeMethodVersions, DocumentTypeSchemaVersions, DocumentTypeValidationVersions, DocumentTypeVersions, DocumentVersions, DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions, - IdentityKeyTypeMethodVersions, IdentityTransitionAssetLockVersions, IdentityTransitionVersions, - IdentityVersions, JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, + IdentityCreditWithdrawalTransitionVersions, IdentityKeyTypeMethodVersions, + IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions, + JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, RecursiveSchemaValidatorVersions, StateTransitionConversionVersions, StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions, VotingValidationVersions, VotingVersions, @@ -1184,6 +1185,9 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { validate_asset_lock_transaction_structure: 0, validate_instant_asset_lock_proof_structure: 0, }, + credit_withdrawal: IdentityCreditWithdrawalTransitionVersions { + default_constructor: 1, + }, }, }, contract_versions: ContractVersions { diff --git a/packages/wasm-dpp/lib/test/fixtures/getIdentityCreditWithdrawalTransitionFixture.js b/packages/wasm-dpp/lib/test/fixtures/getIdentityCreditWithdrawalTransitionFixture.js index 892acc55c1..2bc8478f3b 100644 --- a/packages/wasm-dpp/lib/test/fixtures/getIdentityCreditWithdrawalTransitionFixture.js +++ b/packages/wasm-dpp/lib/test/fixtures/getIdentityCreditWithdrawalTransitionFixture.js @@ -6,7 +6,7 @@ module.exports = function getIdentityCreditWithdrawalTransitionFixture() { const privateKey = new PrivateKey('cSBnVM4xvxarwGQuAfQFwqDg9k5tErHUHzgWsEfD4zdwUasvqRVY'); const address = privateKey.toAddress(); - const stateTransition = new IdentityCreditWithdrawalTransition(1); + const stateTransition = new IdentityCreditWithdrawalTransition(3); stateTransition.setIdentityId(generateRandomIdentifier()); // eslint-disable-next-line stateTransition.setAmount(BigInt(1000)); diff --git a/packages/wasm-dpp/src/identity/identity_facade.rs b/packages/wasm-dpp/src/identity/identity_facade.rs index d14892d4f9..bd4db7d491 100644 --- a/packages/wasm-dpp/src/identity/identity_facade.rs +++ b/packages/wasm-dpp/src/identity/identity_facade.rs @@ -206,7 +206,7 @@ impl IdentityFacadeWasm { amount: u64, core_fee_per_byte: u32, pooling: u8, - output_script: Vec, + output_script: Option>, identity_nonce: u64, ) -> Result { let pooling = match pooling { @@ -222,7 +222,7 @@ impl IdentityFacadeWasm { amount, core_fee_per_byte, pooling, - CoreScript::from_bytes(output_script), + output_script.map(CoreScript::from_bytes), identity_nonce as IdentityNonce, ) .map(Into::into) diff --git a/packages/wasm-dpp/src/identity/identity_factory.rs b/packages/wasm-dpp/src/identity/identity_factory.rs index b4fcf35d55..799598b456 100644 --- a/packages/wasm-dpp/src/identity/identity_factory.rs +++ b/packages/wasm-dpp/src/identity/identity_factory.rs @@ -210,7 +210,7 @@ impl IdentityFactoryWasm { amount: u64, core_fee_per_byte: u32, pooling: u8, - output_script: Vec, + output_script: Option>, identity_nonce: u64, ) -> Result { let pooling = match pooling { @@ -226,7 +226,7 @@ impl IdentityFactoryWasm { amount, core_fee_per_byte, pooling, - CoreScript::from_bytes(output_script), + output_script.map(CoreScript::from_bytes), identity_nonce as IdentityNonce, ) .map(Into::into) diff --git a/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js b/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js index 90778aa72e..2ed05d3bcb 100644 --- a/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js +++ b/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js @@ -24,7 +24,7 @@ describe('IdentityFacade', () => { beforeEach(async () => { dpp = new DashPlatformProtocol( { generate: () => crypto.randomBytes(32) }, - 1, + 3, ); const chainAssetLockProofJS = getChainAssetLockProofFixture(); diff --git a/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js b/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js index 25c23be0c9..1cd8fc8469 100644 --- a/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js +++ b/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js @@ -26,7 +26,7 @@ describe('IdentityFactory', () => { // const identityValidator = new IdentityValidator(blsAdapter); - factory = new IdentityFactory(1); + factory = new IdentityFactory(3); identity = await getIdentityFixture(instantAssetLockProof.createIdentifier()); identity.setBalance(0); diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreditWithdrawalTransition/IdentityCreditWithdrawalTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreditWithdrawalTransition/IdentityCreditWithdrawalTransition.spec.js index b80c611116..503ecf4bef 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreditWithdrawalTransition/IdentityCreditWithdrawalTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreditWithdrawalTransition/IdentityCreditWithdrawalTransition.spec.js @@ -75,7 +75,7 @@ describe('IdentityCreditWithdrawalTransition', () => { rawStateTransition = stateTransition.toObject(); expect(rawStateTransition).to.deep.equal({ - $version: '0', + $version: '1', type: StateTransitionTypes.IdentityCreditWithdrawal, identityId: stateTransition.getIdentityId().toBuffer(), amount: stateTransition.getAmount(), @@ -92,7 +92,7 @@ describe('IdentityCreditWithdrawalTransition', () => { rawStateTransition = stateTransition.toObject({ skipSignature: true }); expect(rawStateTransition).to.deep.equal({ - $version: '0', + $version: '1', type: StateTransitionTypes.IdentityCreditWithdrawal, identityId: stateTransition.getIdentityId().toBuffer(), amount: stateTransition.getAmount(), @@ -109,7 +109,7 @@ describe('IdentityCreditWithdrawalTransition', () => { const jsonStateTransition = stateTransition.toJSON(); expect(jsonStateTransition).to.deep.equal({ - $version: '0', + $version: '1', type: StateTransitionTypes.IdentityCreditWithdrawal, identityId: stateTransition.getIdentityId().toString(), amount: stateTransition.getAmount().toString(), From 14309e6179d15de5c05b86ec70247b2343b55ca0 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 5 Oct 2024 18:21:23 +0300 Subject: [PATCH 38/90] fix: cookie accepts cookie name, path, and domain with out of bounds characters (#2211) --- .pnp.cjs | 8 ++++---- .../cookie-npm-0.4.1-cc5e2ebb42-0f2defd60a.zip | Bin 7631 -> 0 bytes .../cookie-npm-0.7.1-f01524ff99-aec6a6aa07.zip | Bin 0 -> 9288 bytes package.json | 3 ++- yarn.lock | 8 ++++---- 5 files changed, 10 insertions(+), 9 deletions(-) delete mode 100644 .yarn/cache/cookie-npm-0.4.1-cc5e2ebb42-0f2defd60a.zip create mode 100644 .yarn/cache/cookie-npm-0.7.1-f01524ff99-aec6a6aa07.zip diff --git a/.pnp.cjs b/.pnp.cjs index 7b11ce621c..fe35a836e4 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -8269,10 +8269,10 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["cookie", [\ - ["npm:0.4.1", {\ - "packageLocation": "./.yarn/cache/cookie-npm-0.4.1-cc5e2ebb42-0f2defd60a.zip/node_modules/cookie/",\ + ["npm:0.7.1", {\ + "packageLocation": "./.yarn/cache/cookie-npm-0.7.1-f01524ff99-aec6a6aa07.zip/node_modules/cookie/",\ "packageDependencies": [\ - ["cookie", "npm:0.4.1"]\ + ["cookie", "npm:0.7.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -9365,7 +9365,7 @@ const RAW_RUNTIME_STATE = ["@types/node", "npm:18.16.1"],\ ["accepts", "npm:1.3.7"],\ ["base64id", "npm:2.0.0"],\ - ["cookie", "npm:0.4.1"],\ + ["cookie", "npm:0.7.1"],\ ["cors", "npm:2.8.5"],\ ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ ["engine.io-parser", "npm:5.0.4"],\ diff --git a/.yarn/cache/cookie-npm-0.4.1-cc5e2ebb42-0f2defd60a.zip b/.yarn/cache/cookie-npm-0.4.1-cc5e2ebb42-0f2defd60a.zip deleted file mode 100644 index 2796ed2bc9fc74a9157bef2e2a8adfdecda17aec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7631 zcmaKxbyQr-vWEu(!QBZ?a8K|+2<{Tx8DwyW;O_1c+y>WRgA*(`BsdK2?rwQG_uli) zJ6ZR<-fQjNe^h6$A4aEzh+xI6Oe(8oyjL_kQ1BI zKbrml_?xM*ot>2h=szB?0K|X6LvdvszQ6(isc-ApQZKDzg2-}qp)sv|TMgPeSM?Fa{PQsYHZWvlb^R(X57x6pO+@pi*r=hMmq5%ycs z)*+F_m<4_(%V|WNC9ObAv}|ukkw(>Y&yVUVcCeChb>*}sm<1TQV6e)o9;hM@7y6Nb z9iaqjDNu%(>2KNeRXUn%`cSVBp_dwOs-$0ossr8%{a7~|Ir3FW1y@5ACI+#JVmqri)=6<%60Bxc^5!a{Z0pA1vJ>jEpY!D@69s5%qfa!rVZKfN^NhBn@xb$k`w z1qqF-K*(a|Kjo+1l`p_}E)A%htUsx@p`I|uXwMq zkFKgmqjq?0x}E-Ayh$F(s|fZUS^Gx=jd+$TOpa)%?i|be(OEwxbwUGYKR*pd`JWhM zIBgnm&|efTDtGy%Duq3U(=q!Ku{a1u0*AL4SERlo3%_j+^g`lORbbPZuU z!g%R{Gik6+nH6}D#>ou*y|rR|k@|h%g+b`qr!V`6u2}}t!`*^qTUHrTTM<)qP05_X zb8(RwU&rz=;3-*)#iyd~;RKDkHR29*&oC!Cb-!JFaUFz0ufZw*0&gkT1M9NS{R_^c z1C3#FF;dScyeP;yzLrU?k=jA#jz1u%YL6O4k1sz=$wdXC_oXJ-3%6SHT;L+D*PRxg zm72EB}+b_yoq?S(HkS+2Q>IrMgQKiI=xK}PPQ#leo(*RbyQK9+Wj_U zBLn9g;orIOXQYRy`}?H80|18@007B9M7o8o3CNAr(y35G$7w+V*JnqA#B4!^5OdCg z&H~X!7hCa7B9yS$+kR<`ipAV2Pt8Sxdupxo=1?9R2FG+LFwUjZY0R}s`zkh8+a8r; zhbL;km4i(^U{nR~n+-2%X6E(jIkoO7{Gee%nOX=>tDjJptp3Duvs)0AST9s51mal>lF4hzG=aSp!ltK#v0`4QDiHE6n_*> z5c*49+Q+JUtxjk2|sxK2}s02WCHeidJ83mcGO%vvMRR5F3Nnd#Neuw>QQvT9lnHWEmsEn$OGD;y|as?5(y zcCT1#)E1qZhcC`WyI}!v2P#z}51B1ckVH#hYQFS`2i#NLl5Sq2vtr%KAhLG*g}FC> z56&&bFH~ipro74*P11#&=GTR6vdiCC{nXq&cVJ!}CRikDVbN<-=840OpAskWQ5&;~ z?R~D1p_+YD(!Y$>Fi%8)X-OhF1q|~YuRNzOxYI3cn%HwgXa`MBg*6+^_E-k`JZI3z zLh!x_ZG5SBsE5ptwyN4E<<{z5}JH$cD2W!-5IPrfYO zSs+jn1}ML}KfT&gWLde&m7r?pGh&Sa`th;Wg$<7hTdM z)7Ui>Z8Z?ak*Uy6uQ%eZt5R?P^=Ub>_`T_wY1u!M=8D0|53`zEA~g{GG>iTH$)X2X zZlp3J572s3h|pZcS@~M6%-#b8XVzS9hnmRd%tLA-Y#idme1+G4sj6nIA{zBB%_JNm9!+p%LsKlTG>SNH7d0s?4YFO~J z3q(R)Bh|Xbw9s{zR3#p@M@6x-rtaH5^52n7@kIB;S@9$PHXi^9=nTA+4dl$UV$#t? zaozzIz4RhfL=z0!lI&F@Y50yWDuDV{7?cRMn)qf5zAYX;>mB>C6#WoA)8K)g_c$cN zH1m!=2r9lNSyHTW;CbW{z(ORzoEl&&D>rhFE^xgF2hE*V@R9Gl*{_){kM2oBnXG<= z=zPG^Szsi0S}_}9_9~-_VT*LK`1#c8!R?Xael_wW+053k2MvK-{?RqDUk;vzr>7`} zf_fNOod7|cEAR5oda|SC^C3E#J=dou`|cl#t87}9vZ9f!mhO_gwXFqj!8y*DY6Kdu zYN322B9^frFDG50`C&+oO4i}Bvwnmzwhz)HuN^@M=!15DWznFB@l=MfSpnwC3#tWA zU4CqBw|)BUJoj@y`S}0?03iRmxlsJWd2VlLY-MN$`gNk)*#@iVSwY!xy~nFD-FH2klAkIeAgWnhBuh>*n=%ZL@^0jXJ`l4 zy#%QZR7S22S(*;;V>CoW#&+l}9dRZ`IF{SJLW0opHdh9GA`2G65_PsM&oath+)=m( z4wE1}uqH#yX=+?{DnsHn{2XTI^3FACRTBcw_C{idf;G9g?uM5iHy36b35a<{2y^y3&P=7$>5%#Ps6%Me`F9&nfFexEOe)tAPh z@)8&NzK1y`qjm%y%vYYjt1pCNEZ!0def6eLqj-7r;8jpa zxR|MGobmfa=%8V*Fg)5ib9^@A*?prU=b; zVqJ^O7em8XWb-iU&|aGsZf^+`<#ow@kMj46fEjd*sObd&uz?H!ko`m8NJ*=xDk^KS z+L$b<%R522G20I`4x3emC_qdurd|W!(W%fzB4{%XY$~=9_E$hI&DE^ynQ)o|;|$-Y zqW1$N32qO|Jy7`hb4RUic-0Cc_*UjJM~8={6(g8a9Ipg~5>KDonm*$CGi9bzVrC!l zHQ_R|<-wP`t{)(p?69U-O>GQwY9IBp;Ge&9DhZvEk%Rl8LiJQ$JcI?67`)|jHM$6y zmV%1kL76wJM;|`)+E*Xp92Tw!8@nGwx>E3m553cdSNf2(tm=V*uC_sILe`etJqsRl z-$dKJ-ZIP@_yUQKq>^+j@J;(Fm>z=y?yjsK^WB~y|Eap<;B{oCbQ^_lV#j|N&c|KD z*Zpn3UG#wJSPI6sCA>s)=d?;I;Zq^9*`W=Idp->0< zSWn112B74;n2xhpYv5eyV|{yGn-DRn^;41bWJoKx&?_UQpA>|C$@Ch5Qn)rxGr|3; zi5xePS)$pWQ%vyEcQ^mKEe9M#H+Bl$*x0F{$-rv;~V;pxe2J{32NrW|wb>HRsG&L5x8W=H+%OduTZLbD0A-=aCYlra8f zp;AzqRqXenn4m`Wn_M}?v2Z%#KBNYLJazGgbhP;p^s-%#p*c=9Lk|yDytL81mXkXR zwf7Di?>k5?oR`1wa}3xtAuH56cA&kIqZFB#uRz z^rSwt#J=okH=BBe?-tMQQqlPc#FgUh61GT@Gfi<$StZF0^VB9jf99>E&78Zd z2{uI3N_b0O()Z!8X)EA^-e*US`?R^I;#j2i^!%TvsfM?}(=R&(kw~=y!V^3_SJn~t zH7nVs`qw$_HhWnK?|19wK02+h+xUHl%L3eN*SqO0sH@%FIF-g5`6|{#=3{+mMpe|EobLP= zs@N)-b%H&4>_P$6>yMhtwx&{|YraZoXoQ*?KS-FhatPia&r3P!eMla=YpD3t1WmXW zp&uPn4$JLN^>2>IPwyb(U|x2rGWn{nuiNI-0VEnv9w1T_3F%CbJl9xMm|Rpgj6%H> zwDZhpmq`j?uQIIO(Hki=x*gZzTPnZSJ&+UJyD~Q=Ps-V@%a-zZ$E?spg&k$!M0AE! zbt#}2IZxsnESYWG{8_s2LY!q|d;42IP8iZe6J&#}l&;S(9Z{V=ZKUEe$6$PldDLAW zhpE~y%H#(wxUrxa;8B3UEY%^O1aZEUslY8Fd6{j}OG5oafwQ(Vw~Fm$15HuIG-Wpv z-OHs`jgaHO^D1|J{yW0S2h{=HdL0*V!$rNxyo*>zxY(=ryEU8zd}XBLo|1uKG11>{ zN8)1Ubx$!3VL3*#15#1+HpAPE_cj9&Ic1A0xZ`OABpT03a&u)P_WE>dI8365#?8c; zvE^-p*<`z#2ORU*Z8xh*A>C3Bb6Nu2NbzphDUyXW!s+I$mF|Z0OQPuV6;5`yxe66q8B?@lgMZ4c^;_n!fiM z9V@0n+Dl4HQ!irS{0HjKUc$z0S@5{J4C$bjQ9h&?6Xy69=Fb0Ik zCH(-XXgCSR9$dp$O)9E|AHl#zrFZbjojY;@3ER;6>iP0{T8r3>{y;4D-JvOKVDpv6 z9@wPI$Kz)U=b#EAYn8kz5aabwraZp(RNCDN}FGyn^${s^`K5j!efq;&>Jq7Kro@)r$FXi@E=PV>KsQ;E)AYq4sT{F$oZnQ_xeQv%olm!JgY$^lLL;r< zES1ffm+v@t$xtz_TOXdkue6`fUx;gQCwXR1iyQ}GRP=A)ij#?9+p0Gztg6#6z@)7A zxTT1rv`FFH%Z^6~6z^)5PODlQ3c__T_h+46bq2DU@f*CP50xonU!W)UYG*wOR8oIj zLR7mmM8g&|9#SM&agAl>o-WxMqP6f#@8aFqW2juR$YaRe?2?dj${rCTt%ssk25ZZI zJwvIAH>z3%c8gidjW`YajE|7$-Yq+tYCoxIxO5(JdT-zhTS`1tPb5XTxajmA@y*4; zkZbK`m>i^<1p!Aa@;lPXopL4^xJIUuk^N$>(m`73 zN5^I{g2nJXnD-AS@*o1$QU#5tO#QV<43t_d+KC+GJoon_!C*| z0jszP)VGcTez8U3LF+-3LoRpR8>@L7%s3^wewf@a1Gw20uS-$HJvKsGlWO$~%0`jt z)3*>c$&6hMXWp&EL^Bmb1vH)9m3wjg$68qirG~5RGjE{eB8r}4r}sWzxgRr$GnezMhU!45ZN|NKaP ziq3h1y0JX%!9s|qtft9mz4578jTI|>sdr3CNong zdk78z|7q!%?2zz2)C9>`Pa}+*VK}6gvcAfRaRJK~R*-u?xw-M9Qf}W+vj2G z9Ltm&d&1sry-QK=wbQxb+TrSKX!P5Q45_dA8txhCjbg-Ck`=ct++tC$E1FrG+D}?WgHkRzOF4+b~sQJM74UuD&K5f^?X%P z5(nnjlu1{i@XK9}hi$=}qJ)L>yD&HRr<5MJz?Ape^}y)Joq3ZMUhA5JKbMKLlC4cC z1TY(LftR_|p<%?#$fV))hUTm8qh$Jv;p4FL)iZ;!DO6^YKghBich<(BJ_-5*eK%UP zBW~-;_a&ZxE~H0{y3Ofw((wXcK++-vLAvO8ly8=jz4bmLTPoG6r9>KqC2T)es5Fluul&p6>k zVfX9FMwMtYIdz%M@Z~5^3X~3_Wg|h33|l4NE5Db7bCcOUycsrt>G0!>V_opK>moD2th1I|{s# zsDZp@oj=F41(8965sX$E5N9&+*_`%irIh~iQkLe$mn-mBF?F*=J_N+dE46i@x8#e& zCJ6$cu0Eh7G96kzgL?&-x#)2)sm(yoX1w(ItdBfFa|$1{ZZD z53Y-F@Y1H{`a-4I{2&_@tccd(UX58|BK||;M}wFPof(grj7+bqiqtI4Sszo)@!Hu8#twl_OpP>kB5EYdDK+K=X8=wNWEIfs5syD( zqqBYEHmsY&-k-OYx51(&XJ1#nBuA{KR*bwexHs(9cf_t zFn2~>Cunza{qS_(0AJv$81zEcPMnkGqx2cc(yhSuouudn{ds@~oWN-t4#DGON9O^? zp?MlLU6elMJO{S_?AyF1c#1^H!3Ezr0*zwPp93exQ3Hw?k6qb9V7Pbug&nSLoTmtZ zFfStxRCL$*s(hn2H}PD>%y1DDa3(Vzw5rUYw+$@%Q+2I-R-!)XG9<0-g?X z*d1=UtT1B85;5?&>{bz7zaA>|Gi^Tu=iDFNs=F3%$jOPf1G%=T?o@$U)oBukJH;_(y6P+8QT-Ibe zRuvXYYzxhSa!D=CZ?5-UkSb=^oU;^4^ptopTu!wK(trkBj!22r>h|+n-gsf zhTyvP=AETUQyU%vDWcP4qn0~ilw@IGg`@N_07flJ}ztjHe@chpDy;l5-CH6}?`fq#u-^x)*7XIZQ<_N!@ Ot6#mz-ajN&!2bYuh!52O diff --git a/.yarn/cache/cookie-npm-0.7.1-f01524ff99-aec6a6aa07.zip b/.yarn/cache/cookie-npm-0.7.1-f01524ff99-aec6a6aa07.zip new file mode 100644 index 0000000000000000000000000000000000000000..26c6c93fd83f12085d1ae88ca3b7c31c75dff703 GIT binary patch literal 9288 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 MI2f1!`9I$NAMNW1%K!iX literal 0 HcmV?d00001 diff --git a/package.json b/package.json index dffdebc4c6..d4c9869157 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,8 @@ "socks": "^2.8.1", "ws": "^8.17.1", "body-parser": "^1.20.3", - "path-to-regexp": "^1.9.0" + "path-to-regexp": "^1.9.0", + "cookie": "^0.7.0" }, "dependencies": { "node-gyp": "^10.0.1" diff --git a/yarn.lock b/yarn.lock index f5f5c44e2c..471b7df263 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6161,10 +6161,10 @@ __metadata: languageName: node linkType: hard -"cookie@npm:~0.4.1": - version: 0.4.1 - resolution: "cookie@npm:0.4.1" - checksum: 0f2defd60ac93645ee31e82d11da695080435eb4fe5bed9b14d2fc4e0621a66f4c5c60f3eb05761df08a9d6279366e8646edfd1654f359d0b5afc25304fc4ddc +"cookie@npm:^0.7.0": + version: 0.7.1 + resolution: "cookie@npm:0.7.1" + checksum: aec6a6aa0781761bf55d60447d6be08861d381136a0fe94aa084fddd4f0300faa2b064df490c6798adfa1ebaef9e0af9b08a189c823e0811b8b313b3d9a03380 languageName: node linkType: hard From 00fb663aeee6f0d82eef676a40386f5a7609336a Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 5 Oct 2024 20:24:23 +0300 Subject: [PATCH 39/90] feat: start network with latest version if genesis version not set (#2206) --- .yarnrc.yml | 1 + .../configs/defaults/getBaseConfigFactory.js | 4 - .../defaults/getMainnetConfigFactory.js | 5 + .../defaults/getTestnetConfigFactory.js | 5 + .../configs/getConfigFileMigrationsFactory.js | 110 +++++++++++++++++- packages/rs-drive-abci/src/config.rs | 8 -- .../engine/consensus_params_update/mod.rs | 10 +- .../engine/consensus_params_update/v1/mod.rs | 74 ++++++++++++ .../engine/initialization/init_chain/mod.rs | 29 ++++- .../initialization/init_chain/v0/mod.rs | 28 ++++- .../rs-drive-abci/src/test/fixture/abci.rs | 12 +- .../tests/strategy_tests/execution.rs | 9 +- .../tests/strategy_tests/main.rs | 5 +- .../strategy_tests/patch_platform_tests.rs | 2 + .../strategy_tests/upgrade_fork_tests.rs | 3 +- .../tests/strategy_tests/withdrawal_tests.rs | 13 +-- .../src/version/mocks/v3_test.rs | 2 +- .../src/version/protocol_version.rs | 4 + .../rs-platform-version/src/version/v3.rs | 3 +- .../rs-platform-version/src/version/v4.rs | 2 +- 20 files changed, 283 insertions(+), 46 deletions(-) create mode 100644 packages/rs-drive-abci/src/execution/engine/consensus_params_update/v1/mod.rs diff --git a/.yarnrc.yml b/.yarnrc.yml index 34231a77e3..dd002648b0 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -15,6 +15,7 @@ npmAuditExcludePackages: - "@humanwhocodes/config-array" # TODO: Update eslint - "@humanwhocodes/object-schema" # TODO: Update eslint - micromatch # TODO: remove when new micromatch will be released https://github.com/advisories/GHSA-952p-6rrq-rcjv + - eslint # TODO: Update eslint https://github.com/dashpay/platform/issues/2212 packageExtensions: "@dashevo/protobufjs@*": diff --git a/packages/dashmate/configs/defaults/getBaseConfigFactory.js b/packages/dashmate/configs/defaults/getBaseConfigFactory.js index f1e9237ba9..e26e67ca50 100644 --- a/packages/dashmate/configs/defaults/getBaseConfigFactory.js +++ b/packages/dashmate/configs/defaults/getBaseConfigFactory.js @@ -11,7 +11,6 @@ import { const { version } = JSON.parse(fs.readFileSync(path.join(PACKAGE_ROOT_DIR, 'package.json'), 'utf8')); /** - * @param {HomeDir} homeDir * @returns {getBaseConfig} */ export default function getBaseConfigFactory() { @@ -398,9 +397,6 @@ export default function getBaseConfigFactory() { validator: { pub_key_types: ['bls12381'], }, - version: { - app_version: '1', - }, timeout: { propose: '50000000000', propose_delta: '5000000000', diff --git a/packages/dashmate/configs/defaults/getMainnetConfigFactory.js b/packages/dashmate/configs/defaults/getMainnetConfigFactory.js index 0f83c4a7a1..0159941d2f 100644 --- a/packages/dashmate/configs/defaults/getMainnetConfigFactory.js +++ b/packages/dashmate/configs/defaults/getMainnetConfigFactory.js @@ -66,6 +66,11 @@ export default function getMainnetConfigFactory(homeDir, getBaseConfig) { genesis: { chain_id: 'evo1', validator_quorum_type: 4, + consensus_params: { + version: { + app_version: '1', + }, + }, }, }, abci: { diff --git a/packages/dashmate/configs/defaults/getTestnetConfigFactory.js b/packages/dashmate/configs/defaults/getTestnetConfigFactory.js index a8aec0152b..3558c1daa4 100644 --- a/packages/dashmate/configs/defaults/getTestnetConfigFactory.js +++ b/packages/dashmate/configs/defaults/getTestnetConfigFactory.js @@ -110,6 +110,11 @@ export default function getTestnetConfigFactory(homeDir, getBaseConfig) { genesis: { chain_id: 'dash-testnet-51', validator_quorum_type: 6, + consensus_params: { + version: { + app_version: '1', + }, + }, }, }, }, diff --git a/packages/dashmate/configs/getConfigFileMigrationsFactory.js b/packages/dashmate/configs/getConfigFileMigrationsFactory.js index 4b04f1376e..5fa706c7c4 100644 --- a/packages/dashmate/configs/getConfigFileMigrationsFactory.js +++ b/packages/dashmate/configs/getConfigFileMigrationsFactory.js @@ -448,12 +448,63 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) return configFile; }, '1.0.0-dev.2': (configFile) => { + const consensusParams = { + block: { + max_bytes: '2097152', + max_gas: '57631392000', + time_iota_ms: '5000', + }, + evidence: { + max_age: '100000', + max_age_num_blocks: '100000', + max_age_duration: '172800000000000', + }, + validator: { + pub_key_types: ['bls12381'], + }, + timeout: { + propose: '50000000000', + propose_delta: '5000000000', + vote: '10000000000', + vote_delta: '1000000000', + }, + synchrony: { + message_delay: '70000000000', + precision: '1000000000', + }, + abci: { + recheck_tx: true, + }, + version: { + app_version: '1', + }, + }; + + const genesis = { + base: { + consensus_params: lodash.cloneDeep(consensusParams), + }, + local: { + consensus_params: lodash.cloneDeep(consensusParams), + }, + testnet: { + chain_id: 'dash-testnet-51', + validator_quorum_type: 6, + consensus_params: lodash.cloneDeep(consensusParams), + }, + mainnet: { + chain_id: 'evo1', + validator_quorum_type: 4, + consensus_params: lodash.cloneDeep(consensusParams), + }, + }; + Object.entries(configFile.configs) .forEach(([name, options]) => { - if (defaultConfigs.has(name)) { - options.platform.drive.tenderdash.genesis = defaultConfigs.get(name) - .get('platform.drive.tenderdash.genesis'); + if (genesis[name]) { + options.platform.drive.tenderdash.genesis = genesis[name]; } + options.platform.dapi.api.docker.deploy = base.get('platform.dapi.api.docker.deploy'); let baseConfigName = name; @@ -774,6 +825,38 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) return configFile; }, '1.1.0-dev.1': (configFile) => { + const consensusParams = { + block: { + max_bytes: '2097152', + max_gas: '57631392000', + time_iota_ms: '5000', + }, + evidence: { + max_age: '100000', + max_age_num_blocks: '100000', + max_age_duration: '172800000000000', + }, + validator: { + pub_key_types: ['bls12381'], + }, + timeout: { + propose: '50000000000', + propose_delta: '5000000000', + vote: '10000000000', + vote_delta: '1000000000', + }, + synchrony: { + message_delay: '70000000000', + precision: '1000000000', + }, + abci: { + recheck_tx: true, + }, + version: { + app_version: '1', + }, + }; + Object.entries(configFile.configs) .forEach(([name, options]) => { if (name === 'local') { @@ -792,8 +875,12 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) options.platform.drive.tenderdash.p2p.maxConnections = 64; options.platform.drive.tenderdash.p2p.maxOutgoingConnections = 30; - options.platform.drive.tenderdash.genesis - .consensus_params = base.get('platform.drive.tenderdash.genesis.consensus_params'); + + if (defaultConfigs.has(name)) { + options.platform.drive.tenderdash.genesis + .consensus_params = lodash.cloneDeep(consensusParams); + } + options.platform.drive.tenderdash.docker.image = base.get('platform.drive.tenderdash.docker.image'); }); return configFile; @@ -911,6 +998,19 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) }); return configFile; }, + '1.4.0-dev.4': (configFile) => { + Object.entries(configFile.configs) + .forEach(([name, options]) => { + if (name === 'base' || name === 'local') { + delete options.platform.drive.tenderdash.genesis.consensus_params.version; + } else if (options.network === NETWORK_TESTNET) { + options.platform.drive.tenderdash.genesis.consensus_params.version = { + app_version: '1', + }; + } + }); + return configFile; + }, }; } diff --git a/packages/rs-drive-abci/src/config.rs b/packages/rs-drive-abci/src/config.rs index 8e8f449aac..1e8f5f3c26 100644 --- a/packages/rs-drive-abci/src/config.rs +++ b/packages/rs-drive-abci/src/config.rs @@ -180,9 +180,6 @@ pub struct PlatformConfig { /// Approximately how often are blocks produced pub block_spacing_ms: u64, - /// Initial protocol version - pub initial_protocol_version: ProtocolVersion, - /// Path to data storage pub db_path: PathBuf, @@ -276,7 +273,6 @@ impl<'de> Deserialize<'de> for PlatformConfig { chain_lock: config.chain_lock, instant_lock: config.instant_lock, block_spacing_ms: config.block_spacing_ms, - initial_protocol_version: config.initial_protocol_version, db_path: config.db_path, rejections_path: config.rejections_path, #[cfg(feature = "testing-config")] @@ -734,7 +730,6 @@ impl PlatformConfig { tokio_console_enabled: false, tokio_console_address: PlatformConfig::default_tokio_console_address(), tokio_console_retention_secs: PlatformConfig::default_tokio_console_retention_secs(), - initial_protocol_version: Self::default_initial_protocol_version(), prometheus_bind_address: None, grpc_bind_address: "127.0.0.1:26670".to_string(), } @@ -777,7 +772,6 @@ impl PlatformConfig { tokio_console_enabled: false, tokio_console_address: PlatformConfig::default_tokio_console_address(), tokio_console_retention_secs: PlatformConfig::default_tokio_console_retention_secs(), - initial_protocol_version: Self::default_initial_protocol_version(), prometheus_bind_address: None, grpc_bind_address: "127.0.0.1:26670".to_string(), } @@ -817,7 +811,6 @@ impl PlatformConfig { rejections_path: Some(PathBuf::from("/var/log/dash/rejected")), #[cfg(feature = "testing-config")] testing_configs: PlatformTestConfig::default(), - initial_protocol_version: Self::default_initial_protocol_version(), prometheus_bind_address: None, grpc_bind_address: "127.0.0.1:26670".to_string(), tokio_console_enabled: false, @@ -860,7 +853,6 @@ impl PlatformConfig { rejections_path: Some(PathBuf::from("/var/log/dash/rejected")), #[cfg(feature = "testing-config")] testing_configs: PlatformTestConfig::default(), - initial_protocol_version: Self::default_initial_protocol_version(), prometheus_bind_address: None, grpc_bind_address: "127.0.0.1:26670".to_string(), tokio_console_enabled: false, diff --git a/packages/rs-drive-abci/src/execution/engine/consensus_params_update/mod.rs b/packages/rs-drive-abci/src/execution/engine/consensus_params_update/mod.rs index 16319d7746..e3163039f1 100644 --- a/packages/rs-drive-abci/src/execution/engine/consensus_params_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/consensus_params_update/mod.rs @@ -7,6 +7,8 @@ use dpp::version::PlatformVersion; use tenderdash_abci::proto::types::ConsensusParams; mod v0; +mod v1; + pub(crate) fn consensus_params_update( network: Network, original_platform_version: &PlatformVersion, @@ -25,9 +27,15 @@ pub(crate) fn consensus_params_update( new_platform_version, epoch_info, )), + 1 => Ok(v1::consensus_params_update_v1( + network, + original_platform_version, + new_platform_version, + epoch_info, + )), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "consensus_params_update".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, })), } diff --git a/packages/rs-drive-abci/src/execution/engine/consensus_params_update/v1/mod.rs b/packages/rs-drive-abci/src/execution/engine/consensus_params_update/v1/mod.rs new file mode 100644 index 0000000000..85e9d40180 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/engine/consensus_params_update/v1/mod.rs @@ -0,0 +1,74 @@ +use crate::platform_types::epoch_info::v0::EpochInfoV0Methods; +use crate::platform_types::epoch_info::EpochInfo; +use dpp::dashcore::Network; +use dpp::version::PlatformVersion; +use tenderdash_abci::proto::types::{ConsensusParams, VersionParams}; + +#[inline(always)] +pub(super) fn consensus_params_update_v1( + network: Network, + original_platform_version: &PlatformVersion, + new_platform_version: &PlatformVersion, + epoch_info: &EpochInfo, +) -> Option { + // These are emergency consensus updates + match network { + Network::Dash => { + if epoch_info.is_first_block_of_epoch(3) { + return Some(ConsensusParams { + block: None, + evidence: None, + validator: None, + version: Some(VersionParams { + app_version: new_platform_version.protocol_version as u64, + consensus_version: 1, + }), + synchrony: None, + timeout: None, + abci: None, + }); + } + } + Network::Testnet => { + if epoch_info.is_first_block_of_epoch(1480) { + return Some(ConsensusParams { + block: None, + evidence: None, + validator: None, + version: Some(VersionParams { + app_version: new_platform_version.protocol_version as u64, + consensus_version: 1, + }), + synchrony: None, + timeout: None, + abci: None, + }); + } + } + _ => {} + } + + // Update versions if any of them changed + if original_platform_version + .consensus + .tenderdash_consensus_version + == new_platform_version.consensus.tenderdash_consensus_version + && original_platform_version.protocol_version == new_platform_version.protocol_version + { + None + } else { + Some(ConsensusParams { + block: None, + evidence: None, + validator: None, + version: Some(VersionParams { + app_version: new_platform_version.protocol_version as u64, + consensus_version: new_platform_version.consensus.tenderdash_consensus_version + as i32, + }), + synchrony: None, + timeout: None, + abci: None, + }) + } +} diff --git a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/mod.rs b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/mod.rs index 57ec814c04..1b580ba38d 100644 --- a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/mod.rs @@ -5,8 +5,10 @@ use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; +use crate::abci::AbciError; use crate::error::execution::ExecutionError; use dpp::version::PlatformVersion; +use dpp::version::ProtocolVersion; use drive::grovedb::Transaction; use tenderdash_abci::proto::abci::{RequestInitChain, ResponseInitChain}; @@ -22,8 +24,31 @@ where ) -> Result { // We don't have platform state at this point, so we should // use initial protocol version from genesis - let protocol_version = self.config.initial_protocol_version; - let platform_version = PlatformVersion::get(protocol_version)?; + let consensus_params = request + .consensus_params + .as_ref() + .ok_or(AbciError::BadRequest( + "consensus params are required in init chain".to_string(), + ))?; + + let tenderdash_abci::proto::types::VersionParams { + app_version: protocol_version, + .. + } = consensus_params + .version + .as_ref() + .ok_or(AbciError::BadRequest( + "consensus params version is required in init chain".to_string(), + ))?; + + let platform_version = if *protocol_version == 0 { + // Protocol version is not set. + // We are starting the chain with the desired version + PlatformVersion::desired() + } else { + // Use the version from the genesis + PlatformVersion::get(*protocol_version as ProtocolVersion)? + }; match platform_version.drive_abci.methods.engine.init_chain { 0 => self.init_chain_v0(request, transaction, platform_version), diff --git a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs index 3d0bc673a1..b67cd01253 100644 --- a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs @@ -7,7 +7,10 @@ use dpp::block::block_info::BlockInfo; use drive::error::Error::GroveDB; use drive::grovedb::Transaction; +use crate::execution::engine::consensus_params_update::consensus_params_update; use crate::platform_types::cleaned_abci_messages::request_init_chain_cleaned_params; +use crate::platform_types::epoch_info::v0::EpochInfoV0; +use crate::platform_types::epoch_info::EpochInfo; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; use crate::platform_types::validator_set::ValidatorSetExt; @@ -68,8 +71,8 @@ where // Create platform execution state let mut initial_platform_state = PlatformState::default_with_protocol_versions( - request.initial_protocol_version, - request.initial_protocol_version, + platform_version.protocol_version, + platform_version.protocol_version, &self.config, )?; @@ -113,9 +116,6 @@ where initial_platform_state.set_genesis_block_info(Some(genesis_block_info)); - initial_platform_state - .set_current_protocol_version_in_consensus(request.initial_protocol_version); - if tracing::enabled!(tracing::Level::TRACE) { tracing::trace!( platform_state_fingerprint = hex::encode(initial_platform_state.fingerprint()?), @@ -132,8 +132,24 @@ where .unwrap() .map_err(GroveDB)?; + // We use first platform version because Tenderdash starts genesis with first versions + // by default + let first_platform_version = PlatformVersion::first(); + + let epoch_info = EpochInfo::V0(EpochInfoV0::calculate( + genesis_time, + genesis_time, + None, + self.config.execution.epoch_time_length_s, + )?); + Ok(ResponseInitChain { - consensus_params: None, + consensus_params: consensus_params_update( + self.config.network, + first_platform_version, + platform_version, + &epoch_info, + )?, app_hash: app_hash.to_vec(), validator_set_update: Some(validator_set), next_core_chain_lock_update: None, diff --git a/packages/rs-drive-abci/src/test/fixture/abci.rs b/packages/rs-drive-abci/src/test/fixture/abci.rs index 26a7803a6e..45abd250ca 100644 --- a/packages/rs-drive-abci/src/test/fixture/abci.rs +++ b/packages/rs-drive-abci/src/test/fixture/abci.rs @@ -3,14 +3,18 @@ use crate::config::PlatformConfig; use dpp::version::PlatformVersion; +use dpp::version::ProtocolVersion; use tenderdash_abci::proto::abci::RequestInitChain; use tenderdash_abci::proto::google::protobuf::Timestamp; use tenderdash_abci::proto::types::{ConsensusParams, VersionParams}; /// Creates static init chain request fixture -pub fn static_init_chain_request(config: &PlatformConfig) -> RequestInitChain { - let platform_version = PlatformVersion::get(config.initial_protocol_version) - .expect("expected to get platform version"); +pub fn static_init_chain_request( + config: &PlatformConfig, + protocol_version: ProtocolVersion, +) -> RequestInitChain { + let platform_version = + PlatformVersion::get(protocol_version).expect("expected to get platform version"); RequestInitChain { time: Some(Timestamp { seconds: 0, @@ -19,7 +23,7 @@ pub fn static_init_chain_request(config: &PlatformConfig) -> RequestInitChain { chain_id: "strategy_tests".to_string(), consensus_params: Some(ConsensusParams { version: Some(VersionParams { - app_version: config.initial_protocol_version as u64, + app_version: protocol_version as u64, consensus_version: platform_version.consensus.tenderdash_consensus_version as i32, }), ..Default::default() diff --git a/packages/rs-drive-abci/tests/strategy_tests/execution.rs b/packages/rs-drive-abci/tests/strategy_tests/execution.rs index 8b6b5767ec..777dc361a2 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/execution.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/execution.rs @@ -829,8 +829,15 @@ pub(crate) fn start_chain_for_strategy( .get::(¤t_validator_quorum_hash) .expect("expected a quorum to be found"); + let platform_state = abci_application.platform.state.load(); + let protocol_version = platform_state + .current_platform_version() + .unwrap() + .protocol_version; + drop(platform_state); + // init chain - let mut init_chain_request = static_init_chain_request(&config); + let mut init_chain_request = static_init_chain_request(&config, protocol_version); init_chain_request.initial_core_height = config.abci.genesis_core_height; init_chain_request.validator_set = Some(ValidatorSetUpdate { diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 98e2b518a2..2312241cc6 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -47,7 +47,6 @@ mod tests { use crate::execution::{continue_chain_for_strategy, run_chain_for_strategy}; use crate::query::QueryStrategy; use crate::strategy::{FailureStrategy, MasternodeListChangesStrategy}; - use assert_matches::assert_matches; use dashcore_rpc::dashcore::hashes::Hash; use dashcore_rpc::dashcore::BlockHash; use dashcore_rpc::json::QuorumType; @@ -87,6 +86,7 @@ mod tests { }; use dpp::identity::{Identity, KeyType, Purpose, SecurityLevel}; use dpp::state_transition::StateTransition; + use platform_version::version::v1::PROTOCOL_VERSION_1; use platform_version::version::PlatformVersion; use simple_signer::signer::SimpleSigner; use strategy_tests::transitions::create_state_transitions_for_identities; @@ -1159,6 +1159,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) + .with_initial_protocol_version(PROTOCOL_VERSION_1) .build_with_mock_rpc(); let outcome = run_chain_for_strategy(&mut platform, 150, strategy, config, 15, &mut None); @@ -1885,6 +1886,7 @@ mod tests { let block_count = 120; let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) + .with_initial_protocol_version(PROTOCOL_VERSION_1) .build_with_mock_rpc(); let outcome = @@ -2015,6 +2017,7 @@ mod tests { let block_count = 120; let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) + .with_initial_protocol_version(PROTOCOL_VERSION_1) .build_with_mock_rpc(); let outcome = diff --git a/packages/rs-drive-abci/tests/strategy_tests/patch_platform_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/patch_platform_tests.rs index 2e5fd9fe26..6a68330cae 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/patch_platform_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/patch_platform_tests.rs @@ -18,6 +18,7 @@ mod tests { use platform_version::version; use platform_version::version::mocks::v2_test::TEST_PROTOCOL_VERSION_2; use platform_version::version::patches::PatchFn; + use platform_version::version::v1::PROTOCOL_VERSION_1; use platform_version::version::PlatformVersion; #[test] @@ -105,6 +106,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) + .with_initial_protocol_version(PROTOCOL_VERSION_1) .build_with_mock_rpc(); // Run chain before the first patch diff --git a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs index 928fc0a6a7..554394956b 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs @@ -621,7 +621,6 @@ mod tests { epoch_time_length_s, ..Default::default() }, - initial_protocol_version: PROTOCOL_VERSION_1, block_spacing_ms: epoch_time_length_s * 1000, testing_configs: PlatformTestConfig::default_minimal_verifications(), ..Default::default() @@ -629,7 +628,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) - .with_initial_protocol_version(INITIAL_PROTOCOL_VERSION) + .with_initial_protocol_version(PROTOCOL_VERSION_1) .build_with_mock_rpc(); let ChainExecutionOutcome { diff --git a/packages/rs-drive-abci/tests/strategy_tests/withdrawal_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/withdrawal_tests.rs index ccbcae5d73..1748498709 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/withdrawal_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/withdrawal_tests.rs @@ -4,7 +4,6 @@ mod tests { use crate::strategy::{ ChainExecutionOutcome, ChainExecutionParameters, NetworkStrategy, StrategyRandomness, }; - use assert_matches::assert_matches; use dashcore_rpc::dashcore_rpc_json::{AssetUnlockStatus, AssetUnlockStatusResult}; use dpp::dashcore::bls_sig_utils::BLSSignature; use dpp::dashcore::hashes::Hash; @@ -95,13 +94,13 @@ mod tests { ..Default::default() }, block_spacing_ms: hour_in_ms, - initial_protocol_version: TEST_PLATFORM_V3.protocol_version, testing_configs: PlatformTestConfig::default_minimal_verifications(), ..Default::default() }; let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) + .with_initial_protocol_version(TEST_PLATFORM_V3.protocol_version) .build_with_mock_rpc(); platform @@ -776,13 +775,13 @@ mod tests { ..Default::default() }, block_spacing_ms: hour_in_ms, - initial_protocol_version: TEST_PLATFORM_V3.protocol_version, testing_configs: PlatformTestConfig::default_minimal_verifications(), ..Default::default() }; let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) + .with_initial_protocol_version(TEST_PLATFORM_V3.protocol_version) .build_with_mock_rpc(); platform @@ -1144,7 +1143,6 @@ mod tests { current_validator_quorum_hash: current_quorum_hash, current_proposer_versions, end_time_ms, - withdrawals: last_block_withdrawals, identity_nonce_counter, identity_contract_nonce_counter, instant_lock_quorums, @@ -1481,12 +1479,12 @@ mod tests { ..Default::default() }, block_spacing_ms: minute_in_ms, - initial_protocol_version: TEST_PLATFORM_V3.protocol_version, testing_configs: PlatformTestConfig::default_minimal_verifications(), ..Default::default() }; let mut platform = TestPlatformBuilder::new() + .with_initial_protocol_version(TEST_PLATFORM_V3.protocol_version) .with_config(config.clone()) .build_with_mock_rpc(); @@ -1902,7 +1900,6 @@ mod tests { ..Default::default() }, block_spacing_ms: hour_in_ms, - initial_protocol_version: TEST_PLATFORM_V3.protocol_version, testing_configs: PlatformTestConfig::default_minimal_verifications(), ..Default::default() }, @@ -2037,7 +2034,6 @@ mod tests { ..Default::default() }, block_spacing_ms: hour_in_ms, - initial_protocol_version: TEST_PLATFORM_V3.protocol_version, testing_configs: PlatformTestConfig::default_minimal_verifications(), ..Default::default() }, @@ -2199,13 +2195,13 @@ mod tests { ..Default::default() }, block_spacing_ms: minute_in_ms, - initial_protocol_version: TEST_PLATFORM_V3.protocol_version, testing_configs: PlatformTestConfig::default_minimal_verifications(), ..Default::default() }; let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) + .with_initial_protocol_version(TEST_PLATFORM_V3.protocol_version) .build_with_mock_rpc(); platform @@ -2598,7 +2594,6 @@ mod tests { ..Default::default() }, block_spacing_ms: hour_in_ms, - initial_protocol_version: TEST_PLATFORM_V3.protocol_version, testing_configs: PlatformTestConfig::default_minimal_verifications(), ..Default::default() }, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index aab569b63e..1f9c5eb579 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -615,7 +615,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { check_tx: 0, run_block_proposal: 0, finalize_block_proposal: 0, - consensus_params_update: 0, + consensus_params_update: 1, }, initialization: DriveAbciInitializationMethodVersions { initial_core_height_and_time: 0, diff --git a/packages/rs-platform-version/src/version/protocol_version.rs b/packages/rs-platform-version/src/version/protocol_version.rs index c6af2ec88c..f3d4a1871d 100644 --- a/packages/rs-platform-version/src/version/protocol_version.rs +++ b/packages/rs-platform-version/src/version/protocol_version.rs @@ -152,6 +152,10 @@ impl PlatformVersion { .expect("expected to have a platform version") } + pub fn desired<'a>() -> &'a Self { + DESIRED_PLATFORM_VERSION + } + #[cfg(feature = "mock-versions")] /// Set mock versions for testing pub fn replace_test_versions(versions: Vec) { diff --git a/packages/rs-platform-version/src/version/v3.rs b/packages/rs-platform-version/src/version/v3.rs index 8a57cb65a6..b3c7cf3cc4 100644 --- a/packages/rs-platform-version/src/version/v3.rs +++ b/packages/rs-platform-version/src/version/v3.rs @@ -621,7 +621,8 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { check_tx: 0, run_block_proposal: 0, finalize_block_proposal: 0, - consensus_params_update: 0, + // Update app version if changed as well + consensus_params_update: 1, }, initialization: DriveAbciInitializationMethodVersions { initial_core_height_and_time: 0, diff --git a/packages/rs-platform-version/src/version/v4.rs b/packages/rs-platform-version/src/version/v4.rs index 0082ec2743..c607170dec 100644 --- a/packages/rs-platform-version/src/version/v4.rs +++ b/packages/rs-platform-version/src/version/v4.rs @@ -616,7 +616,7 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { check_tx: 0, run_block_proposal: 0, finalize_block_proposal: 0, - consensus_params_update: 0, + consensus_params_update: 1, }, initialization: DriveAbciInitializationMethodVersions { initial_core_height_and_time: 0, From 1c8a83f9df97bfc0ab5e4e9b003b55bd601a3573 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Sun, 6 Oct 2024 02:38:08 +0700 Subject: [PATCH 40/90] fix(drive): set sign height when rebroadcasting (#2210) --- .../rebroadcast_expired_withdrawal_documents/v1/mod.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/v1/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/v1/mod.rs index 7e90dc51cb..e2e50b3e5b 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/v1/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/rebroadcast_expired_withdrawal_documents/v1/mod.rs @@ -71,6 +71,11 @@ where WithdrawalStatus::BROADCASTED as u8, ); + document.set_u64( + withdrawal::properties::TRANSACTION_SIGN_HEIGHT, + block_info.core_height as u64, + ); + document.set_updated_at(Some(block_info.time_ms)); document.increment_revision().map_err(Error::Protocol)?; From 59aadb01d75fd9fcfbed9490175faeec98b30ae3 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 5 Oct 2024 22:39:00 +0300 Subject: [PATCH 41/90] test(test-suite): enable withdrawal tests (#2202) --- .../methods/identities/creditWithdrawal.ts | 2 +- .../test/e2e/withdrawals.spec.js | 24 ++++++++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts index 4be23a4a67..359c569b4b 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts @@ -49,8 +49,8 @@ export async function creditWithdrawal( // eslint-disable-next-line no-param-reassign options = { - ...options, signingKeyIndex: 3, + ...options, }; const { dpp } = this; diff --git a/packages/platform-test-suite/test/e2e/withdrawals.spec.js b/packages/platform-test-suite/test/e2e/withdrawals.spec.js index ecbac9b8de..9c5dbee62b 100644 --- a/packages/platform-test-suite/test/e2e/withdrawals.spec.js +++ b/packages/platform-test-suite/test/e2e/withdrawals.spec.js @@ -8,7 +8,7 @@ const waitForSTPropagated = require('../../lib/waitForSTPropagated'); // TODO: temporary disabled due to flakiness. These tests aren't important for now, since we are // going to release v1.0.0 with withdrawals disabled. -describe.skip('Withdrawals', function withdrawalsTest() { +describe('Withdrawals', function withdrawalsTest() { this.bail(true); let client; @@ -38,7 +38,7 @@ describe.skip('Withdrawals', function withdrawalsTest() { }); describe('Any Identity', () => { - const INITIAL_BALANCE = 1000000; + const INITIAL_BALANCE = 2000000; before(async () => { identity = await client.platform.identities.register(INITIAL_BALANCE); @@ -57,7 +57,9 @@ describe.skip('Withdrawals', function withdrawalsTest() { await client.platform.identities.withdrawCredits( identity, BigInt(amountToWithdraw), - withdrawTo.address, + { + toAddress: withdrawTo.address, + }, ); // Re-fetch identity to obtain latest core chain lock height @@ -125,7 +127,9 @@ describe.skip('Withdrawals', function withdrawalsTest() { const { height: withdrawalHeight } = await client.platform.identities.withdrawCredits( identity, BigInt(amountToWithdraw), - withdrawTo.address, + { + toAddress: withdrawTo.address, + }, ); let withdrawalBroadcasted = false; @@ -173,7 +177,9 @@ describe.skip('Withdrawals', function withdrawalsTest() { await expect(client.platform.identities.withdrawCredits( identity, BigInt(amountToWithdraw), - withdrawTo.address, + { + toAddress: withdrawTo.address, + }, )).to.be.rejectedWith(`Withdrawal amount "${amountToWithdraw}" is bigger that identity balance "${identityBalanceBefore}"`); }); @@ -186,11 +192,11 @@ describe.skip('Withdrawals', function withdrawalsTest() { await expect(client.platform.identities.withdrawCredits( identity, BigInt(amountToWithdraw), - withdrawTo.address, { + toAddress: withdrawTo.address, signingKeyIndex: 1, }, - )).to.be.rejectedWith('Error conversion not implemented: Invalid public key security level HIGH. The state transition requires one of CRITICAL'); + )).to.be.rejectedWith('Error conversion not implemented: Invalid public key security level HIGH. The state transition requires one of MASTER'); }); // TODO: Figure out how to overcome client-side validation and implement @@ -227,7 +233,9 @@ describe.skip('Withdrawals', function withdrawalsTest() { await client.platform.identities.withdrawCredits( identity, BigInt(1000000), - withdrawTo.address, + { + toAddress: withdrawTo.address, + }, ); await waitForSTPropagated(); From 240f6ce8fa0dc000a82cee1fdafffc68c893ad52 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 5 Oct 2024 22:40:49 +0300 Subject: [PATCH 42/90] chore(release): update changelog and bump version to 1.4.0-dev.4 (#2213) --- CHANGELOG.md | 33 ++++++++++++ Cargo.lock | 50 +++++++++---------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/check-features/Cargo.toml | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 44 files changed, 100 insertions(+), 67 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42467f4388..60f65566f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,36 @@ +## [1.4.0-dev.4](https://github.com/dashpay/platform/compare/v1.4.0-dev.3...v1.4.0-dev.4) (2024-10-05) + + +### Features + +* **sdk:** enable withdrawals v1 in JS SDK ([#2201](https://github.com/dashpay/platform/issues/2201)) +* start network with latest version if genesis version not set ([#2206](https://github.com/dashpay/platform/issues/2206)) + + +### Bug Fixes + +* cookie accepts cookie name, path, and domain with out of bounds characters ([#2211](https://github.com/dashpay/platform/issues/2211)) +* **drive:** set sign height when rebroadcasting ([#2210](https://github.com/dashpay/platform/issues/2210)) +* **sdk:** small sdk improvements and fixes for v1.4 ([#2200](https://github.com/dashpay/platform/issues/2200)) + + +### Code Refactoring + +* **drive:** remove duplicated withdrawal amount validation ([#2191](https://github.com/dashpay/platform/issues/2191)) + + +### Miscellaneous Chores + +* bump GroveDB dependency ([#2196](https://github.com/dashpay/platform/issues/2196)) +* **drive:** improve withdrawal logging ([#2203](https://github.com/dashpay/platform/issues/2203)) +* **drive:** logs and metrics for withdrawal daily limit ([#2192](https://github.com/dashpay/platform/issues/2192)) +* **release:** replace colima with native docker in macOS builds ([#2188](https://github.com/dashpay/platform/issues/2188)) + + +### Tests + +* **test-suite:** enable withdrawal tests ([#2202](https://github.com/dashpay/platform/issues/2202)) + ## [1.4.0-dev.2](https://github.com/dashpay/platform/compare/v1.4.0-dev.1...v1.4.0-dev.2) (2024-09-30) diff --git a/Cargo.lock b/Cargo.lock index 819f2b9922..619f089d7c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -781,7 +781,7 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "check-features" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "toml", ] @@ -1147,7 +1147,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1163,7 +1163,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "dapi-grpc", "heck 0.5.0", @@ -1208,7 +1208,7 @@ dependencies = [ [[package]] name = "dash-sdk" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "arc-swap", "async-trait", @@ -1308,7 +1308,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "platform-value", "platform-version", @@ -1318,7 +1318,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1434,7 +1434,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "platform-value", "platform-version", @@ -1444,7 +1444,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "anyhow", "assert_matches", @@ -1496,7 +1496,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "arc-swap", "assert_matches", @@ -1537,7 +1537,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "arc-swap", "assert_matches", @@ -1593,7 +1593,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "bincode", "dapi-grpc", @@ -1807,7 +1807,7 @@ checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "feature-flags-contract" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "platform-value", "platform-version", @@ -2752,7 +2752,7 @@ dependencies = [ [[package]] name = "json-schema-compatibility-validator" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "assert_matches", "json-patch", @@ -2925,7 +2925,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "platform-value", "platform-version", @@ -3499,7 +3499,7 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "platform-serialization" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "bincode", "platform-version", @@ -3507,7 +3507,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "proc-macro2", "quote", @@ -3517,7 +3517,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "base64 0.22.1", "bincode", @@ -3538,7 +3538,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "quote", "syn 2.0.75", @@ -3546,7 +3546,7 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "bincode", "grovedb-version", @@ -3557,7 +3557,7 @@ dependencies = [ [[package]] name = "platform-versioning" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "proc-macro2", "quote", @@ -4170,7 +4170,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "backon", "chrono", @@ -4687,7 +4687,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "base64 0.22.1", "bincode", @@ -4778,7 +4778,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "bincode", "dpp", @@ -5822,7 +5822,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "anyhow", "async-trait", @@ -6124,7 +6124,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" dependencies = [ "num_enum", "platform-value", diff --git a/package.json b/package.json index d4c9869157..32d2c194d5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.4.0-dev.3", + "version": "1.4.0-dev.4", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index 3ff32b6958..f2514b912f 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.4.0-dev.3", + "version": "1.4.0-dev.4", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/check-features/Cargo.toml b/packages/check-features/Cargo.toml index faeb5ec05f..1c8c3c74f0 100644 --- a/packages/check-features/Cargo.toml +++ b/packages/check-features/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "check-features" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index 1511089d11..aee73d40aa 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index 225c6f125e..c4b331b92f 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.4.0-dev.3", + "version": "1.4.0-dev.4", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index 1ecfc82b46..c7eeb54f5b 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.4.0-dev.3", + "version": "1.4.0-dev.4", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index c7892682c2..2bbeafc826 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "2.4.0-dev.3", + "version": "2.4.0-dev.4", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index fcb1fcbcdf..5ca8c5baaa 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.4.0-dev.3", + "version": "1.4.0-dev.4", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index a1aec28ce4..98607a348b 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index 144a37446f..4e9ee2dbff 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.4.0-dev.3", + "version": "1.4.0-dev.4", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index fb604b07ad..8d7f49065e 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index f9254361eb..41cd2fca5a 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index 875be96f51..85d7b1577c 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.4.0-dev.3", + "version": "1.4.0-dev.4", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index 279ee40006..24c768daec 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index 1bf9d4db4c..13ab78cf6b 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.4.0-dev.3", + "version": "1.4.0-dev.4", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index ca913054b6..0b1445877d 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.4.0-dev.3", + "version": "1.4.0-dev.4", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index e398d330b9..a4c2392746 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.4.0-dev.3", + "version": "4.4.0-dev.4", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index bd5df0bf4b..6c1650111c 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.4.0-dev.3", + "version": "1.4.0-dev.4", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index e132fdd28c..421d6089ff 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index c94ad2ae59..cdb2081fda 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.4.0-dev.3", + "version": "1.4.0-dev.4", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index bec32455d1..f7b9797dcd 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.4.0-dev.3", + "version": "1.4.0-dev.4", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index 0f78a7b792..90b104038b 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index de3afc354d..a773e97a8c 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 47d8258550..4465cee8ea 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" edition = "2021" rust-version.workspace = true authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 4e14f953f7..c8417113cd 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index cef01f45d8..ef0cb3b799 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" edition = "2021" rust-version.workspace = true diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 94938455c5..1c03bce340 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-json-schema-compatibility-validator/Cargo.toml b/packages/rs-json-schema-compatibility-validator/Cargo.toml index 80e372925d..b03bceedc6 100644 --- a/packages/rs-json-schema-compatibility-validator/Cargo.toml +++ b/packages/rs-json-schema-compatibility-validator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "json-schema-compatibility-validator" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" edition = "2021" rust-version.workspace = true authors = ["Ivan Shumkov "] diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index bd7b111c68..4e06638edd 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index b451c8d500..2f4fbc2b99 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index 74023ae583..69ffa5e564 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index 59ccf1c175..975e9044bf 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 546704554d..807fd9ee9c 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Versioning library for Platform" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index 58f6935c0c..772c4882d5 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 44f37a8d89..c021f6df51 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dash-sdk" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index 7e5994c015..646682423a 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" edition = "2021" rust-version.workspace = true diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index ecb274b11f..504106caa0 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 6584ecdded..0bdc37176f 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.4.0-dev.3", + "version": "8.4.0-dev.4", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index 59a1163850..9cc5a34324 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" edition = "2021" rust-version.workspace = true authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index f1a4f2dd11..b620d68e4b 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.4.0-dev.3", + "version": "1.4.0-dev.4", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index f0f0c0c478..ddedf2d869 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.4.0-dev.3" +version = "1.4.0-dev.4" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index 9bc7d9ec6d..1a10bbb938 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.4.0-dev.3", + "version": "1.4.0-dev.4", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From b584227f76332ccdd80aa0a078eba68a6c113af0 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Sun, 6 Oct 2024 15:48:23 +0700 Subject: [PATCH 43/90] feat(dpp): add a convenience method to get the public key data for a private key depending on the key type (#2214) --- .../identity/identity_public_key/key_type.rs | 72 +++++++++++++++++-- 1 file changed, 68 insertions(+), 4 deletions(-) diff --git a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs index d91bec6626..908f913969 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs @@ -1,4 +1,3 @@ -#[cfg(feature = "random-public-keys")] use crate::util::hash::ripemd160_sha256; use anyhow::bail; use bincode::{Decode, Encode}; @@ -8,16 +7,14 @@ use ciborium::value::Value as CborValue; use dashcore::secp256k1::rand::rngs::StdRng as EcdsaRng; #[cfg(feature = "random-public-keys")] use dashcore::secp256k1::rand::SeedableRng; -#[cfg(feature = "random-public-keys")] use dashcore::secp256k1::Secp256k1; -#[cfg(feature = "random-public-keys")] use dashcore::Network; use itertools::Itertools; use lazy_static::lazy_static; use crate::fee::Credits; use crate::version::PlatformVersion; -use crate::ProtocolError; +use crate::{InvalidVectorSizeError, ProtocolError}; #[cfg(feature = "random-public-keys")] use rand::rngs::StdRng; #[cfg(feature = "random-public-keys")] @@ -204,6 +201,73 @@ impl KeyType { } } + /// Gets the public key data for a private key depending on the key type + pub fn public_key_data_from_private_key_data( + &self, + private_key_bytes: &[u8], + network: Network, + ) -> Result, ProtocolError> { + match self { + KeyType::ECDSA_SECP256K1 => { + let secp = Secp256k1::new(); + let secret_key = dashcore::secp256k1::SecretKey::from_slice(private_key_bytes) + .map_err(|e| ProtocolError::Generic(e.to_string()))?; + let private_key = dashcore::PrivateKey::new(secret_key, network); + + Ok(private_key.public_key(&secp).to_bytes()) + } + KeyType::BLS12_381 => { + #[cfg(feature = "bls-signatures")] + { + let private_key = + bls_signatures::PrivateKey::from_bytes(private_key_bytes, false) + .map_err(|e| ProtocolError::Generic(e.to_string()))?; + let public_key_bytes = private_key + .g1_element() + .expect("expected to get a public key from a bls private key") + .to_bytes() + .to_vec(); + Ok(public_key_bytes) + } + #[cfg(not(feature = "bls-signatures"))] + return Err(ProtocolError::NotSupported( + "Converting a private key to a bls public key is not supported without the bls-signatures feature".to_string(), + )); + } + KeyType::ECDSA_HASH160 => { + let secp = Secp256k1::new(); + let secret_key = dashcore::secp256k1::SecretKey::from_slice(private_key_bytes) + .map_err(|e| ProtocolError::Generic(e.to_string()))?; + let private_key = dashcore::PrivateKey::new(secret_key, network); + + Ok(ripemd160_sha256(private_key.public_key(&secp).to_bytes().as_slice()).to_vec()) + } + KeyType::EDDSA_25519_HASH160 => { + #[cfg(feature = "ed25519-dalek")] + { + let key_pair = ed25519_dalek::SigningKey::from_bytes( + &private_key_bytes.try_into().map_err(|_| { + ProtocolError::InvalidVectorSizeError(InvalidVectorSizeError::new( + 32, + private_key_bytes.len(), + )) + })?, + ); + Ok(ripemd160_sha256(key_pair.verifying_key().to_bytes().as_slice()).to_vec()) + } + #[cfg(not(feature = "ed25519-dalek"))] + return Err(ProtocolError::NotSupported( + "Converting a private key to a eddsa hash 160 is not supported without the ed25519-dalek feature".to_string(), + )); + } + KeyType::BIP13_SCRIPT_HASH => { + return Err(ProtocolError::NotSupported( + "Converting a private key to a script hash is not supported".to_string(), + )); + } + } + } + #[cfg(feature = "random-public-keys")] /// Gets the default size of the public key pub fn random_public_and_private_key_data_v0(&self, rng: &mut StdRng) -> (Vec, Vec) { From 75fbac864d31786219686a43a6e9f305912a670f Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 7 Oct 2024 12:31:42 +0700 Subject: [PATCH 44/90] feat(platform)!: add owner keys to identities, fixed verification of use of owner keys (#2215) --- .../test/e2e/withdrawals.spec.js | 4 +- .../rs-dpp/src/core_types/validator/v0/mod.rs | 3 +- .../src/errors/consensus/basic/basic_error.rs | 7 +- .../errors/consensus/basic/identity/mod.rs | 2 + ...not_allowed_when_signing_with_owner_key.rs | 50 ++++ packages/rs-dpp/src/errors/consensus/codes.rs | 1 + .../identity/identity_public_key/purpose.rs | 24 +- .../identity/identity_public_key/random.rs | 143 +++++++++ .../identity/identity_public_key/v0/random.rs | 54 +++- packages/rs-dpp/src/state_transition/mod.rs | 8 +- .../methods/v0/mod.rs | 10 +- .../v1/identity_signed.rs | 14 +- .../v1/v0_methods.rs | 10 +- .../v0/mod.rs | 6 +- .../engine/run_block_proposal/mod.rs | 21 +- .../create_owner_identity/mod.rs | 4 +- .../create_owner_identity/v0/mod.rs | 4 +- .../create_owner_identity/v1/mod.rs | 33 +++ .../get_owner_identity_owner_key/mod.rs | 45 +++ .../get_owner_identity_owner_key/v0/mod.rs | 24 ++ .../mod.rs | 0 .../v0/mod.rs | 0 .../update_masternode_identities/mod.rs | 4 +- .../update_owner_withdrawal_address/mod.rs | 278 +++++++++++++++++- .../update_owner_withdrawal_address/v0/mod.rs | 267 ----------------- .../update_owner_withdrawal_address/v1/mod.rs | 136 +++++++++ .../mod.rs | 6 + .../v0/mod.rs | 71 ++++- .../state_transition/processor/v0/mod.rs | 25 +- .../identity_credit_withdrawal/mod.rs | 232 ++++++++++++++- .../mod.rs | 45 +++ .../v0/mod.rs | 53 ++++ .../state_transitions/identity_update/mod.rs | 112 +++++++ .../state_transition/state_transitions/mod.rs | 105 +++++++ .../v0/mod.rs | 2 + .../src/drive/identity/key/fetch/mod.rs | 4 +- .../util/batch/drive_op_batch/withdrawals.rs | 3 +- .../src/version/drive_abci_versions.rs | 2 + .../src/version/mocks/v2_test.rs | 2 + .../src/version/mocks/v3_test.rs | 2 + .../rs-platform-version/src/version/v1.rs | 2 + .../rs-platform-version/src/version/v2.rs | 2 + .../rs-platform-version/src/version/v3.rs | 2 + .../rs-platform-version/src/version/v4.rs | 6 +- packages/rs-sdk/src/platform/fetch_many.rs | 9 +- .../src/errors/consensus/consensus_error.rs | 9 +- .../identity/identity_public_key/purpose.rs | 3 + 47 files changed, 1522 insertions(+), 327 deletions(-) create mode 100644 packages/rs-dpp/src/errors/consensus/basic/identity/withdrawal_output_script_not_allowed_when_signing_with_owner_key.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/create_owner_identity/v1/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_owner_identity_owner_key/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_owner_identity_owner_key/v0/mod.rs rename packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/{get_owner_identity_key => get_owner_identity_withdrawal_key}/mod.rs (100%) rename packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/{get_owner_identity_key => get_owner_identity_withdrawal_key}/v0/mod.rs (100%) create mode 100644 packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_owner_withdrawal_address/v1/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/signature_purpose_matches_requirements/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/signature_purpose_matches_requirements/v0/mod.rs diff --git a/packages/platform-test-suite/test/e2e/withdrawals.spec.js b/packages/platform-test-suite/test/e2e/withdrawals.spec.js index 9c5dbee62b..f2a80ee433 100644 --- a/packages/platform-test-suite/test/e2e/withdrawals.spec.js +++ b/packages/platform-test-suite/test/e2e/withdrawals.spec.js @@ -183,7 +183,7 @@ describe('Withdrawals', function withdrawalsTest() { )).to.be.rejectedWith(`Withdrawal amount "${amountToWithdraw}" is bigger that identity balance "${identityBalanceBefore}"`); }); - it('should not allow to create withdrawal with wrong security key type', async () => { + it('should not allow to create withdrawal with authentication key purpose', async () => { const account = await client.getWalletAccount(); const identityBalanceBefore = identity.getBalance(); const withdrawTo = await account.getUnusedAddress(); @@ -196,7 +196,7 @@ describe('Withdrawals', function withdrawalsTest() { toAddress: withdrawTo.address, signingKeyIndex: 1, }, - )).to.be.rejectedWith('Error conversion not implemented: Invalid public key security level HIGH. The state transition requires one of MASTER'); + )).to.be.rejectedWith('Error conversion not implemented: Invalid identity key purpose AUTHENTICATION. This state transition requires TRANSFER | OWNER'); }); // TODO: Figure out how to overcome client-side validation and implement diff --git a/packages/rs-dpp/src/core_types/validator/v0/mod.rs b/packages/rs-dpp/src/core_types/validator/v0/mod.rs index d472b4a145..daadc197fe 100644 --- a/packages/rs-dpp/src/core_types/validator/v0/mod.rs +++ b/packages/rs-dpp/src/core_types/validator/v0/mod.rs @@ -1,6 +1,5 @@ use dashcore::{ProTxHash, PubkeyHash}; -use std::fmt; -use std::fmt::{Debug, Display, Formatter}; +use std::fmt::{Debug, Formatter}; use crate::bls_signatures::PublicKey as BlsPublicKey; #[cfg(feature = "core-types-serde-conversion")] diff --git a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs index ea33077b76..2b24a1e280 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs @@ -52,7 +52,7 @@ use crate::consensus::basic::identity::{ InvalidIdentityUpdateTransitionDisableKeysError, InvalidIdentityUpdateTransitionEmptyError, InvalidInstantAssetLockProofError, InvalidInstantAssetLockProofSignatureError, MissingMasterPublicKeyError, NotImplementedIdentityCreditWithdrawalTransitionPoolingError, - TooManyMasterPublicKeyError, + TooManyMasterPublicKeyError, WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError, }; use crate::consensus::basic::invalid_identifier_error::InvalidIdentifierError; use crate::consensus::basic::state_transition::{ @@ -335,6 +335,11 @@ pub enum BasicError { InvalidIdentityCreditWithdrawalTransitionOutputScriptError, ), + #[error(transparent)] + WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError( + WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError, + ), + #[error(transparent)] InvalidIdentityCreditWithdrawalTransitionCoreFeeError( InvalidIdentityCreditWithdrawalTransitionCoreFeeError, diff --git a/packages/rs-dpp/src/errors/consensus/basic/identity/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/identity/mod.rs index aafc111b85..3b411457fa 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/identity/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/identity/mod.rs @@ -29,6 +29,7 @@ pub use invalid_instant_asset_lock_proof_signature_error::*; pub use missing_master_public_key_error::*; pub use not_implemented_identity_credit_withdrawal_transition_pooling_error::*; pub use too_many_master_public_key_error::*; +pub use withdrawal_output_script_not_allowed_when_signing_with_owner_key::*; mod data_contract_bounds_not_present_error; mod disabling_key_id_also_being_added_in_same_transition_error; @@ -62,3 +63,4 @@ mod invalid_instant_asset_lock_proof_signature_error; mod missing_master_public_key_error; mod not_implemented_identity_credit_withdrawal_transition_pooling_error; mod too_many_master_public_key_error; +mod withdrawal_output_script_not_allowed_when_signing_with_owner_key; diff --git a/packages/rs-dpp/src/errors/consensus/basic/identity/withdrawal_output_script_not_allowed_when_signing_with_owner_key.rs b/packages/rs-dpp/src/errors/consensus/basic/identity/withdrawal_output_script_not_allowed_when_signing_with_owner_key.rs new file mode 100644 index 0000000000..70f4c68b5d --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/identity/withdrawal_output_script_not_allowed_when_signing_with_owner_key.rs @@ -0,0 +1,50 @@ +use crate::errors::ProtocolError; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::identity::core_script::CoreScript; + +use crate::identity::KeyID; +use bincode::{Decode, Encode}; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Withdrawal output script not allowed when signing with owner key {key_id}")] +#[platform_serialize(unversioned)] +pub struct WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError { + output_script: CoreScript, + key_id: KeyID, +} + +/* + +DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + +*/ + +impl WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError { + pub fn new(output_script: CoreScript, key_id: KeyID) -> Self { + Self { + output_script, + key_id, + } + } + + pub fn output_script(&self) -> &CoreScript { + &self.output_script + } + + pub fn key_id(&self) -> KeyID { + self.key_id + } +} +impl From for ConsensusError { + fn from(err: WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError) -> Self { + Self::BasicError( + BasicError::WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError(err), + ) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index ca00dc1c2b..aa05a541bf 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -153,6 +153,7 @@ impl ErrorWithCode for BasicError { Self::MasterPublicKeyUpdateError(_) => 10529, Self::IdentityAssetLockTransactionOutPointNotEnoughBalanceError(_) => 10530, Self::IdentityAssetLockStateTransitionReplayError(_) => 10531, + Self::WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError(_) => 10532, // State Transition Errors: 10600-10699 Self::InvalidStateTransitionTypeError { .. } => 10600, diff --git a/packages/rs-dpp/src/identity/identity_public_key/purpose.rs b/packages/rs-dpp/src/identity/identity_public_key/purpose.rs index dbadfa5748..36255fdc45 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/purpose.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/purpose.rs @@ -1,4 +1,6 @@ -use crate::identity::Purpose::{AUTHENTICATION, DECRYPTION, ENCRYPTION, SYSTEM, TRANSFER, VOTING}; +use crate::identity::Purpose::{ + AUTHENTICATION, DECRYPTION, ENCRYPTION, OWNER, SYSTEM, TRANSFER, VOTING, +}; use anyhow::bail; use bincode::{Decode, Encode}; #[cfg(feature = "cbor")] @@ -37,6 +39,8 @@ pub enum Purpose { SYSTEM = 4, /// this key cannot be used for signing documents VOTING = 5, + /// this key is used to prove ownership of a masternode or evonode + OWNER = 6, } impl From for [u8; 1] { @@ -54,6 +58,7 @@ impl From for &'static [u8; 1] { TRANSFER => &[3], SYSTEM => &[4], VOTING => &[5], + OWNER => &[6], } } } @@ -68,6 +73,7 @@ impl TryFrom for Purpose { 3 => Ok(TRANSFER), 4 => Ok(SYSTEM), 5 => Ok(VOTING), + 6 => Ok(OWNER), value => bail!("unrecognized purpose: {}", value), } } @@ -83,6 +89,7 @@ impl TryFrom for Purpose { 3 => Ok(TRANSFER), 4 => Ok(SYSTEM), 5 => Ok(VOTING), + 6 => Ok(OWNER), value => bail!("unrecognized purpose: {}", value), } } @@ -102,8 +109,15 @@ impl std::fmt::Display for Purpose { impl Purpose { /// The full range of purposes - pub fn full_range() -> [Purpose; 5] { - [AUTHENTICATION, ENCRYPTION, DECRYPTION, TRANSFER, VOTING] + pub fn full_range() -> [Purpose; 6] { + [ + AUTHENTICATION, + ENCRYPTION, + DECRYPTION, + TRANSFER, + VOTING, + OWNER, + ] } /// Just the authentication and withdraw purposes pub fn searchable_purposes() -> [Purpose; 3] { @@ -113,8 +127,4 @@ impl Purpose { pub fn encryption_decryption() -> [Purpose; 2] { [ENCRYPTION, DECRYPTION] } - /// The last purpose - pub fn last() -> Purpose { - Self::TRANSFER - } } diff --git a/packages/rs-dpp/src/identity/identity_public_key/random.rs b/packages/rs-dpp/src/identity/identity_public_key/random.rs index 0dea7a5dee..dec286b927 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/random.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/random.rs @@ -467,6 +467,149 @@ impl IdentityPublicKey { } } + /// Generates a random ECDSA critical-level authentication key for a masternode owner. + /// + /// This function generates a random key that can be used for owner authentication in a masternode context. + /// The function accepts an optional seed for deterministic key generation, or uses entropy-based randomness if no seed is provided. + /// + /// # Parameters + /// + /// * `id`: The identifier (`KeyID`) for the masternode owner key. + /// * `seed`: An optional `u64` value used to seed the random number generator. If `None`, the RNG will be seeded from entropy. + /// * `platform_version`: A reference to the `PlatformVersion` struct, which is used to determine the correct key structure version. + /// + /// # Returns + /// + /// Returns a tuple containing the generated `IdentityPublicKey` for the masternode owner and the corresponding private key as a byte vector. + /// + /// # Errors + /// + /// Returns a `ProtocolError` if the platform version is not supported. + pub fn random_masternode_owner_key( + id: KeyID, + seed: Option, + platform_version: &PlatformVersion, + ) -> Result<(Self, Vec), ProtocolError> { + let mut rng = match seed { + None => StdRng::from_entropy(), + Some(seed_value) => StdRng::seed_from_u64(seed_value), + }; + Self::random_masternode_owner_key_with_rng(id, &mut rng, platform_version) + } + + /// Generates a random ECDSA critical-level authentication key for a masternode owner using a custom RNG. + /// + /// This function generates a random key using a given random number generator (RNG). This is useful when specific control over the randomness is needed. + /// + /// # Parameters + /// + /// * `id`: The identifier (`KeyID`) for the masternode owner key. + /// * `rng`: A mutable reference to a `StdRng` instance used to generate randomness. + /// * `platform_version`: A reference to the `PlatformVersion` struct, which is used to determine the correct key structure version. + /// + /// # Returns + /// + /// Returns a tuple containing the generated `IdentityPublicKey` for the masternode owner and the corresponding private key as a byte vector. + /// + /// # Errors + /// + /// Returns a `ProtocolError` if the platform version is not supported. + pub fn random_masternode_owner_key_with_rng( + id: KeyID, + rng: &mut StdRng, + platform_version: &PlatformVersion, + ) -> Result<(Self, Vec), ProtocolError> { + match platform_version + .dpp + .identity_versions + .identity_key_structure_version + { + 0 => { + let (key, private_key) = + IdentityPublicKeyV0::random_owner_key_with_rng(id, rng, platform_version)?; + Ok((key.into(), private_key)) + } + version => Err(ProtocolError::UnknownVersionMismatch { + method: "IdentityPublicKey::random_masternode_owner_key_with_rng".to_string(), + known_versions: vec![0], + received: version, + }), + } + } + + /// Generates a random ECDSA critical-level transfer key for a masternode. + /// + /// This function generates a random key for use in transferring ownership of a masternode. An optional seed can be provided for deterministic key generation, or entropy-based randomness is used if no seed is given. + /// + /// # Parameters + /// + /// * `id`: The identifier (`KeyID`) for the masternode transfer key. + /// * `seed`: An optional `u64` value used to seed the random number generator. If `None`, the RNG will be seeded from entropy. + /// * `platform_version`: A reference to the `PlatformVersion` struct, which is used to determine the correct key structure version. + /// + /// # Returns + /// + /// Returns a tuple containing the generated `IdentityPublicKey` for the masternode transfer key and the corresponding private key as a byte vector. + /// + /// # Errors + /// + /// Returns a `ProtocolError` if the platform version is not supported. + pub fn random_masternode_transfer_key( + id: KeyID, + seed: Option, + platform_version: &PlatformVersion, + ) -> Result<(Self, Vec), ProtocolError> { + let mut rng = match seed { + None => StdRng::from_entropy(), + Some(seed_value) => StdRng::seed_from_u64(seed_value), + }; + Self::random_masternode_transfer_key_with_rng(id, &mut rng, platform_version) + } + + /// Generates a random ECDSA critical-level transfer key for a masternode using a custom RNG. + /// + /// This function generates a random key for masternode transfers using a given random number generator (RNG). + /// + /// # Parameters + /// + /// * `id`: The identifier (`KeyID`) for the masternode transfer key. + /// * `rng`: A mutable reference to a `StdRng` instance used to generate randomness. + /// * `platform_version`: A reference to the `PlatformVersion` struct, which is used to determine the correct key structure version. + /// + /// # Returns + /// + /// Returns a tuple containing the generated `IdentityPublicKey` for the masternode transfer key and the corresponding private key as a byte vector. + /// + /// # Errors + /// + /// Returns a `ProtocolError` if the platform version is not supported. + pub fn random_masternode_transfer_key_with_rng( + id: KeyID, + rng: &mut StdRng, + platform_version: &PlatformVersion, + ) -> Result<(Self, Vec), ProtocolError> { + match platform_version + .dpp + .identity_versions + .identity_key_structure_version + { + 0 => { + let (key, private_key) = + IdentityPublicKeyV0::random_masternode_transfer_key_with_rng( + id, + rng, + platform_version, + )?; + Ok((key.into(), private_key)) + } + version => Err(ProtocolError::UnknownVersionMismatch { + method: "IdentityPublicKey::random_masternode_transfer_key_with_rng".to_string(), + known_versions: vec![0], + received: version, + }), + } + } + /// Generates a random ECDSA high-level authentication public key along with its corresponding private key. /// /// This method constructs a random ECDSA (using the secp256k1 curve) high-level authentication public key diff --git a/packages/rs-dpp/src/identity/identity_public_key/v0/random.rs b/packages/rs-dpp/src/identity/identity_public_key/v0/random.rs index 13afdd673f..162e836e1b 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/v0/random.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/v0/random.rs @@ -1,7 +1,7 @@ use crate::identity::contract_bounds::ContractBounds; use crate::identity::identity_public_key::v0::IdentityPublicKeyV0; use crate::identity::KeyType::{ECDSA_HASH160, ECDSA_SECP256K1}; -use crate::identity::Purpose::{AUTHENTICATION, VOTING}; +use crate::identity::Purpose::{AUTHENTICATION, OWNER, TRANSFER, VOTING}; use crate::identity::SecurityLevel::{CRITICAL, HIGH, MASTER, MEDIUM}; use crate::identity::{KeyCount, KeyID, KeyType, Purpose, SecurityLevel}; use crate::version::PlatformVersion; @@ -245,6 +245,58 @@ impl IdentityPublicKeyV0 { )) } + pub fn random_owner_key_with_rng( + id: KeyID, + rng: &mut StdRng, + platform_version: &PlatformVersion, + ) -> Result<(Self, Vec), ProtocolError> { + let key_type = ECDSA_HASH160; + let purpose = OWNER; + let security_level = CRITICAL; + let read_only = true; + let (data, private_data) = + key_type.random_public_and_private_key_data(rng, platform_version)?; + Ok(( + IdentityPublicKeyV0 { + id, + key_type, + purpose, + security_level, + read_only, + disabled_at: None, + data: data.into(), + contract_bounds: None, + }, + private_data, + )) + } + + pub fn random_masternode_transfer_key_with_rng( + id: KeyID, + rng: &mut StdRng, + platform_version: &PlatformVersion, + ) -> Result<(Self, Vec), ProtocolError> { + let key_type = ECDSA_HASH160; + let purpose = TRANSFER; + let security_level = CRITICAL; + let read_only = true; + let (data, private_data) = + key_type.random_public_and_private_key_data(rng, platform_version)?; + Ok(( + IdentityPublicKeyV0 { + id, + key_type, + purpose, + security_level, + read_only, + disabled_at: None, + data: data.into(), + contract_bounds: None, + }, + private_data, + )) + } + pub fn random_ecdsa_critical_level_authentication_key_with_rng( id: KeyID, rng: &mut StdRng, diff --git a/packages/rs-dpp/src/state_transition/mod.rs b/packages/rs-dpp/src/state_transition/mod.rs index bc20c6ab0a..cd97cae4ae 100644 --- a/packages/rs-dpp/src/state_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/mod.rs @@ -152,8 +152,8 @@ macro_rules! call_getter_method_identity_signed { StateTransition::DataContractCreate(st) => Some(st.$method($args)), StateTransition::DataContractUpdate(st) => Some(st.$method($args)), StateTransition::DocumentsBatch(st) => Some(st.$method($args)), - StateTransition::IdentityCreate(st) => None, - StateTransition::IdentityTopUp(st) => None, + StateTransition::IdentityCreate(_) => None, + StateTransition::IdentityTopUp(_) => None, StateTransition::IdentityCreditWithdrawal(st) => Some(st.$method($args)), StateTransition::IdentityUpdate(st) => Some(st.$method($args)), StateTransition::IdentityCreditTransfer(st) => Some(st.$method($args)), @@ -165,8 +165,8 @@ macro_rules! call_getter_method_identity_signed { StateTransition::DataContractCreate(st) => Some(st.$method()), StateTransition::DataContractUpdate(st) => Some(st.$method()), StateTransition::DocumentsBatch(st) => Some(st.$method()), - StateTransition::IdentityCreate(_st) => None, - StateTransition::IdentityTopUp(_st) => None, + StateTransition::IdentityCreate(_) => None, + StateTransition::IdentityTopUp(_) => None, StateTransition::IdentityCreditWithdrawal(st) => Some(st.$method()), StateTransition::IdentityUpdate(st) => Some(st.$method()), StateTransition::IdentityCreditTransfer(st) => Some(st.$method()), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs index d143eaae31..2836b96cc6 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs @@ -16,12 +16,12 @@ use platform_version::version::{FeatureVersion, PlatformVersion}; pub enum PreferredKeyPurposeForSigningWithdrawal { /// Use any key Any, - /// Use the master key, then the transfer key - MasterPreferred, - /// Use the transfer key, then the master key + /// Use the owner key, then the transfer key + OwnerPreferred, + /// Use the transfer key, then the owner key TransferPreferred, - /// Only use the master key - MasterOnly, + /// Only use the owner key + OwnerOnly, /// Only use the transfer key TransferOnly, } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/identity_signed.rs index 045bab7b27..bc541c4b3c 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/identity_signed.rs @@ -1,4 +1,4 @@ -use crate::identity::SecurityLevel::{CRITICAL, MASTER}; +use crate::identity::SecurityLevel::CRITICAL; use crate::identity::{KeyID, Purpose, SecurityLevel}; use crate::state_transition::identity_credit_withdrawal_transition::v1::IdentityCreditWithdrawalTransitionV1; use crate::state_transition::StateTransitionIdentitySigned; @@ -12,16 +12,12 @@ impl StateTransitionIdentitySigned for IdentityCreditWithdrawalTransitionV1 { self.signature_public_key_id = key_id } - fn security_level_requirement(&self, purpose: Purpose) -> Vec { - if purpose == Purpose::AUTHENTICATION { - vec![MASTER] - } else { - // for transfer - vec![CRITICAL] - } + fn security_level_requirement(&self, _purpose: Purpose) -> Vec { + // critical is used for both transfer and owner + vec![CRITICAL] } fn purpose_requirement(&self) -> Vec { - vec![Purpose::TRANSFER, Purpose::AUTHENTICATION] + vec![Purpose::TRANSFER, Purpose::OWNER] } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/v0_methods.rs index de4817bca4..8f20f27494 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v1/v0_methods.rs @@ -65,9 +65,9 @@ impl IdentityCreditWithdrawalTransitionMethodsV0 for IdentityCreditWithdrawalTra let mut key: Option<&IdentityPublicKey>; match preferred_key_purpose_for_signing_withdrawal { - PreferredKeyPurposeForSigningWithdrawal::MasterPreferred => { + PreferredKeyPurposeForSigningWithdrawal::OwnerPreferred => { key = identity.get_first_public_key_matching( - Purpose::AUTHENTICATION, + Purpose::OWNER, SecurityLevel::full_range().into(), KeyType::all_key_types().into(), true, @@ -93,16 +93,16 @@ impl IdentityCreditWithdrawalTransitionMethodsV0 for IdentityCreditWithdrawalTra if key.is_none() || !signer.can_sign_with(key.unwrap()) { key = identity.get_first_public_key_matching( - Purpose::AUTHENTICATION, + Purpose::OWNER, SecurityLevel::full_range().into(), KeyType::all_key_types().into(), true, ); } } - PreferredKeyPurposeForSigningWithdrawal::MasterOnly => { + PreferredKeyPurposeForSigningWithdrawal::OwnerOnly => { key = identity.get_first_public_key_matching( - Purpose::AUTHENTICATION, + Purpose::OWNER, SecurityLevel::full_range().into(), KeyType::all_key_types().into(), true, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/v0/mod.rs index 81b489092b..6b02b2e645 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/v0/mod.rs @@ -19,7 +19,7 @@ use crate::ProtocolError; use platform_version::version::PlatformVersion; lazy_static! { - static ref ALLOWED_SECURITY_LEVELS: HashMap> = { + static ref ALLOWED_SECURITY_LEVELS_FOR_EXTERNALLY_ADDED_KEYS: HashMap> = { let mut m = HashMap::new(); m.insert( Purpose::AUTHENTICATION, @@ -119,8 +119,8 @@ impl IdentityPublicKeyInCreation { let validation_errors = identity_public_keys_with_witness .iter() .filter_map(|identity_public_key| { - let allowed_security_levels = - ALLOWED_SECURITY_LEVELS.get(&identity_public_key.purpose()); + let allowed_security_levels = ALLOWED_SECURITY_LEVELS_FOR_EXTERNALLY_ADDED_KEYS + .get(&identity_public_key.purpose()); if let Some(levels) = allowed_security_levels { if !levels.contains(&identity_public_key.security_level()) { Some( diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs index e2149678b3..43712c7feb 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs @@ -1,12 +1,15 @@ use crate::error::execution::ExecutionError; use crate::error::Error; +use crate::execution::types::block_state_info; +use crate::execution::types::block_state_info::v0::BlockStateInfoV0Methods; use crate::metrics::HistogramTiming; -use crate::platform_types::epoch_info::v0::EpochInfoV0Methods; +use crate::platform_types::epoch_info::v0::{EpochInfoV0Getters, EpochInfoV0Methods}; use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; use crate::platform_types::{block_execution_outcome, block_proposal}; use crate::rpc::core::CoreRPCLike; +use dpp::block::epoch::Epoch; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; use drive::grovedb::Transaction; @@ -97,8 +100,24 @@ Your software version: {}, latest supported protocol version: {}."#, // Set current protocol version to the block platform state block_platform_state .set_current_protocol_version_in_consensus(next_protocol_version); + + let last_block_time_ms = platform_state.last_committed_block_time_ms(); + + // Init block execution context + let block_state_info = block_state_info::v0::BlockStateInfoV0::from_block_proposal( + &block_proposal, + last_block_time_ms, + ); + + let block_info = block_state_info.to_block_info( + Epoch::new(epoch_info.current_epoch_index()) + .expect("current epoch index should be in range"), + ); + // This is for events like adding stuff to the root tree, or making structural changes/fixes self.perform_events_on_first_block_of_protocol_change( + platform_state, + &block_info, transaction, old_protocol_version, next_platform_version, diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/create_owner_identity/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/create_owner_identity/mod.rs index 042b35c5ca..048ea1266a 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/create_owner_identity/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/create_owner_identity/mod.rs @@ -1,4 +1,5 @@ mod v0; +mod v1; use crate::error::execution::ExecutionError; use crate::error::Error; @@ -38,9 +39,10 @@ where .create_owner_identity { 0 => Self::create_owner_identity_v0(masternode, platform_version), + 1 => Self::create_owner_identity_v1(masternode, platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "create_owner_identity".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, })), } diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/create_owner_identity/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/create_owner_identity/v0/mod.rs index 18028f7a31..176b6d90db 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/create_owner_identity/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/create_owner_identity/v0/mod.rs @@ -25,7 +25,9 @@ where Ok(identity) } - fn get_owner_identifier(masternode: &MasternodeListItem) -> Result { + pub(crate) fn get_owner_identifier( + masternode: &MasternodeListItem, + ) -> Result { let masternode_identifier: [u8; 32] = masternode.pro_tx_hash.into(); Ok(masternode_identifier.into()) } diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/create_owner_identity/v1/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/create_owner_identity/v1/mod.rs new file mode 100644 index 0000000000..da89aaafc7 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/create_owner_identity/v1/mod.rs @@ -0,0 +1,33 @@ +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::rpc::core::CoreRPCLike; +use dashcore_rpc::dashcore_rpc_json::MasternodeListItem; +use dpp::identity::accessors::IdentityGettersV0; +use dpp::identity::Identity; +use dpp::version::PlatformVersion; + +impl Platform +where + C: CoreRPCLike, +{ + pub(super) fn create_owner_identity_v1( + masternode: &MasternodeListItem, + platform_version: &PlatformVersion, + ) -> Result { + let owner_identifier = Self::get_owner_identifier(masternode)?; + let mut identity = Identity::create_basic_identity(owner_identifier, platform_version)?; + identity.add_public_keys([ + Self::get_owner_identity_withdrawal_key( + masternode.state.payout_address, + 0, + platform_version, + )?, + Self::get_owner_identity_owner_key( + masternode.state.owner_address, + 1, + platform_version, + )?, + ]); + Ok(identity) + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_owner_identity_owner_key/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_owner_identity_owner_key/mod.rs new file mode 100644 index 0000000000..8b76f02566 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_owner_identity_owner_key/mod.rs @@ -0,0 +1,45 @@ +mod v0; + +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::platform_types::platform::Platform; + +use dpp::identity::{IdentityPublicKey, KeyID}; + +use dpp::version::PlatformVersion; + +impl Platform { + /// Retrieves an identity public key using the provided owner key and key ID. + /// + /// This function derives the identity public key and delegates to a version-specific method depending on the platform version. + /// + /// # Arguments + /// + /// * owner_public_key_address - The public key address of the owner. + /// * key_id - The KeyID for the identity public key. + /// * platform_version - The version of the platform to determine which method to delegate to. + /// + /// # Returns + /// + /// * Result - Returns the derived identity public key if successful. Otherwise, returns an error. + pub(crate) fn get_owner_identity_owner_key( + owner_public_key_address: [u8; 20], + key_id: KeyID, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .methods + .core_based_updates + .masternode_updates + .get_owner_identity_owner_key + { + 0 => Self::get_owner_identity_owner_key_v0(owner_public_key_address, key_id), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "get_owner_identity_owner_key".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_owner_identity_owner_key/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_owner_identity_owner_key/v0/mod.rs new file mode 100644 index 0000000000..ba099e99ed --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_owner_identity_owner_key/v0/mod.rs @@ -0,0 +1,24 @@ +use crate::error::Error; +use crate::platform_types::platform::Platform; +use dpp::identity::identity_public_key::v0::IdentityPublicKeyV0; +use dpp::identity::{IdentityPublicKey, KeyID, KeyType, Purpose, SecurityLevel}; +use dpp::platform_value::BinaryData; + +impl Platform { + pub(super) fn get_owner_identity_owner_key_v0( + owner_public_key_address: [u8; 20], + key_id: KeyID, + ) -> Result { + Ok(IdentityPublicKeyV0 { + id: key_id, + key_type: KeyType::ECDSA_HASH160, + purpose: Purpose::OWNER, + security_level: SecurityLevel::CRITICAL, + read_only: true, + data: BinaryData::new(owner_public_key_address.to_vec()), + disabled_at: None, + contract_bounds: None, + } + .into()) + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_owner_identity_key/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_owner_identity_withdrawal_key/mod.rs similarity index 100% rename from packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_owner_identity_key/mod.rs rename to packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_owner_identity_withdrawal_key/mod.rs diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_owner_identity_key/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_owner_identity_withdrawal_key/v0/mod.rs similarity index 100% rename from packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_owner_identity_key/v0/mod.rs rename to packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_owner_identity_withdrawal_key/v0/mod.rs diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/mod.rs index e3168a64e7..e2a9176d3c 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/mod.rs @@ -4,14 +4,14 @@ mod create_voter_identity; mod disable_identity_keys; mod get_operator_identifier; mod get_operator_identity_keys; -mod get_owner_identity_key; +mod get_owner_identity_owner_key; +mod get_owner_identity_withdrawal_key; mod get_voter_identifier; mod get_voter_identity_key; mod update_masternode_identities; mod update_operator_identity; mod update_owner_withdrawal_address; mod update_voter_identity; - // // // #[cfg(test)] diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_owner_withdrawal_address/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_owner_withdrawal_address/mod.rs index f2f5b5c708..1f81d17c0b 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_owner_withdrawal_address/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_owner_withdrawal_address/mod.rs @@ -11,6 +11,7 @@ use drive::util::batch::DriveOperation; use drive::grovedb::Transaction; mod v0; +mod v1; impl Platform where @@ -61,11 +62,286 @@ where drive_operations, platform_version, ), + 1 => self.update_owner_withdrawal_address_v1( + owner_identifier, + new_withdrawal_address, + block_info, + transaction, + drive_operations, + platform_version, + ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "update_owner_withdrawal_address".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, })), } } } + +#[cfg(test)] +mod tests { + use crate::test::helpers::setup::TestPlatformBuilder; + use dpp::block::block_info::BlockInfo; + use dpp::identity::accessors::IdentityGettersV0; + use dpp::identity::identity_public_key::v0::IdentityPublicKeyV0; + use dpp::identity::{Identity, IdentityV0, KeyType, Purpose, SecurityLevel}; + use dpp::platform_value::BinaryData; + use dpp::prelude::{Identifier, IdentityPublicKey}; + use platform_version::version::PlatformVersion; + use rand::prelude::StdRng; + use rand::Rng; + use rand::SeedableRng; + use std::collections::BTreeMap; + + #[test] + fn test_update_withdrawal_address() { + let platform_version = PlatformVersion::latest(); + let platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let block_info = BlockInfo::default(); + + let mut rng = StdRng::seed_from_u64(5); + + let payout_address: [u8; 20] = rng.gen(); + + let withdrawal_key: IdentityPublicKey = IdentityPublicKeyV0 { + id: 0, + key_type: KeyType::ECDSA_HASH160, + purpose: Purpose::TRANSFER, + security_level: SecurityLevel::CRITICAL, + read_only: true, + data: BinaryData::new(payout_address.to_vec()), + disabled_at: None, + contract_bounds: None, + } + .into(); + + let identity: Identity = IdentityV0 { + id: Identifier::random_with_rng(&mut rng), + public_keys: BTreeMap::from([(0, withdrawal_key.clone())]), + balance: 0, + revision: 0, + } + .into(); + + // We just add this identity to the system first + + platform + .drive + .add_new_identity( + identity.clone(), + true, + &block_info, + true, + None, + platform_version, + ) + .expect("expected to add a new identity"); + + let transaction = platform.drive.grove.start_transaction(); + + let mut drive_operations = vec![]; + + platform + .update_owner_withdrawal_address( + identity.id().to_buffer(), + [0; 20], + &block_info, + &transaction, + &mut drive_operations, + platform_version, + ) + .expect("expected to update owner withdrawal address"); + + platform + .drive + .apply_drive_operations( + drive_operations, + true, + &block_info, + Some(&transaction), + platform_version, + None, + ) + .expect("expected to apply drive operations"); + } + + #[test] + fn test_update_to_same_withdrawal_address() { + let platform_version = PlatformVersion::latest(); + let platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let block_info = BlockInfo::default(); + + let mut rng = StdRng::seed_from_u64(5); + + let payout_address: [u8; 20] = rng.gen(); + + let withdrawal_key: IdentityPublicKey = IdentityPublicKeyV0 { + id: 0, + key_type: KeyType::ECDSA_HASH160, + purpose: Purpose::TRANSFER, + security_level: SecurityLevel::CRITICAL, + read_only: true, + data: BinaryData::new(payout_address.to_vec()), + disabled_at: None, + contract_bounds: None, + } + .into(); + + let identity: Identity = IdentityV0 { + id: Identifier::random_with_rng(&mut rng), + public_keys: BTreeMap::from([(0, withdrawal_key.clone())]), + balance: 0, + revision: 0, + } + .into(); + + // We just add this identity to the system first + + platform + .drive + .add_new_identity( + identity.clone(), + true, + &block_info, + true, + None, + platform_version, + ) + .expect("expected to add a new identity"); + + let transaction = platform.drive.grove.start_transaction(); + + let mut drive_operations = vec![]; + + platform + .update_owner_withdrawal_address( + identity.id().to_buffer(), + payout_address, + &block_info, + &transaction, + &mut drive_operations, + platform_version, + ) + .expect("expected to update owner withdrawal address"); + + platform + .drive + .apply_drive_operations( + drive_operations, + true, + &block_info, + Some(&transaction), + platform_version, + None, + ) + .expect("expected to apply drive operations"); + } + #[test] + fn test_update_to_previously_disabled_withdrawal_address() { + let platform_version = PlatformVersion::latest(); + let platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let block_info = BlockInfo::default(); + + let mut rng = StdRng::seed_from_u64(5); + + let payout_address: [u8; 20] = rng.gen(); + + let withdrawal_key: IdentityPublicKey = IdentityPublicKeyV0 { + id: 0, + key_type: KeyType::ECDSA_HASH160, + purpose: Purpose::TRANSFER, + security_level: SecurityLevel::CRITICAL, + read_only: true, + data: BinaryData::new(payout_address.to_vec()), + disabled_at: None, + contract_bounds: None, + } + .into(); + + let identity: Identity = IdentityV0 { + id: Identifier::random_with_rng(&mut rng), + public_keys: BTreeMap::from([(0, withdrawal_key.clone())]), + balance: 0, + revision: 0, + } + .into(); + + // We just add this identity to the system first + + platform + .drive + .add_new_identity( + identity.clone(), + true, + &block_info, + true, + None, + platform_version, + ) + .expect("expected to add a new identity"); + + let transaction = platform.drive.grove.start_transaction(); + + let mut drive_operations = vec![]; + + platform + .update_owner_withdrawal_address( + identity.id().to_buffer(), + [0; 20], + &block_info, + &transaction, + &mut drive_operations, + platform_version, + ) + .expect("expected to update owner withdrawal address"); + + platform + .drive + .apply_drive_operations( + drive_operations, + true, + &block_info, + Some(&transaction), + platform_version, + None, + ) + .expect("expected to apply drive operations"); + + let transaction = platform.drive.grove.start_transaction(); + + let mut drive_operations = vec![]; + + platform + .update_owner_withdrawal_address( + identity.id().to_buffer(), + payout_address, + &block_info, + &transaction, + &mut drive_operations, + platform_version, + ) + .expect("expected to update owner withdrawal address"); + + platform + .drive + .apply_drive_operations( + drive_operations, + true, + &block_info, + Some(&transaction), + platform_version, + None, + ) + .expect("expected to apply drive operations"); + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_owner_withdrawal_address/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_owner_withdrawal_address/v0/mod.rs index 8484f4436d..640a038160 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_owner_withdrawal_address/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_owner_withdrawal_address/v0/mod.rs @@ -124,270 +124,3 @@ where Ok(()) } } - -#[cfg(test)] -mod tests { - use crate::test::helpers::setup::TestPlatformBuilder; - use dpp::block::block_info::BlockInfo; - use dpp::identity::accessors::IdentityGettersV0; - use dpp::identity::identity_public_key::v0::IdentityPublicKeyV0; - use dpp::identity::{Identity, IdentityV0, KeyType, Purpose, SecurityLevel}; - use dpp::platform_value::BinaryData; - use dpp::prelude::{Identifier, IdentityPublicKey}; - use platform_version::version::PlatformVersion; - use rand::prelude::StdRng; - use rand::Rng; - use rand::SeedableRng; - use std::collections::BTreeMap; - - #[test] - fn test_update_withdrawal_address() { - let platform_version = PlatformVersion::latest(); - let platform = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_genesis_state(); - - let block_info = BlockInfo::default(); - - let mut rng = StdRng::seed_from_u64(5); - - let payout_address: [u8; 20] = rng.gen(); - - let withdrawal_key: IdentityPublicKey = IdentityPublicKeyV0 { - id: 0, - key_type: KeyType::ECDSA_HASH160, - purpose: Purpose::TRANSFER, - security_level: SecurityLevel::CRITICAL, - read_only: true, - data: BinaryData::new(payout_address.to_vec()), - disabled_at: None, - contract_bounds: None, - } - .into(); - - let identity: Identity = IdentityV0 { - id: Identifier::random_with_rng(&mut rng), - public_keys: BTreeMap::from([(0, withdrawal_key.clone())]), - balance: 0, - revision: 0, - } - .into(); - - // We just add this identity to the system first - - platform - .drive - .add_new_identity( - identity.clone(), - true, - &block_info, - true, - None, - platform_version, - ) - .expect("expected to add a new identity"); - - let transaction = platform.drive.grove.start_transaction(); - - let mut drive_operations = vec![]; - - platform - .update_owner_withdrawal_address( - identity.id().to_buffer(), - [0; 20], - &block_info, - &transaction, - &mut drive_operations, - platform_version, - ) - .expect("expected to update owner withdrawal address"); - - platform - .drive - .apply_drive_operations( - drive_operations, - true, - &block_info, - Some(&transaction), - platform_version, - None, - ) - .expect("expected to apply drive operations"); - } - - #[test] - fn test_update_to_same_withdrawal_address() { - let platform_version = PlatformVersion::latest(); - let platform = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_genesis_state(); - - let block_info = BlockInfo::default(); - - let mut rng = StdRng::seed_from_u64(5); - - let payout_address: [u8; 20] = rng.gen(); - - let withdrawal_key: IdentityPublicKey = IdentityPublicKeyV0 { - id: 0, - key_type: KeyType::ECDSA_HASH160, - purpose: Purpose::TRANSFER, - security_level: SecurityLevel::CRITICAL, - read_only: true, - data: BinaryData::new(payout_address.to_vec()), - disabled_at: None, - contract_bounds: None, - } - .into(); - - let identity: Identity = IdentityV0 { - id: Identifier::random_with_rng(&mut rng), - public_keys: BTreeMap::from([(0, withdrawal_key.clone())]), - balance: 0, - revision: 0, - } - .into(); - - // We just add this identity to the system first - - platform - .drive - .add_new_identity( - identity.clone(), - true, - &block_info, - true, - None, - platform_version, - ) - .expect("expected to add a new identity"); - - let transaction = platform.drive.grove.start_transaction(); - - let mut drive_operations = vec![]; - - platform - .update_owner_withdrawal_address( - identity.id().to_buffer(), - payout_address, - &block_info, - &transaction, - &mut drive_operations, - platform_version, - ) - .expect("expected to update owner withdrawal address"); - - platform - .drive - .apply_drive_operations( - drive_operations, - true, - &block_info, - Some(&transaction), - platform_version, - None, - ) - .expect("expected to apply drive operations"); - } - #[test] - fn test_update_to_previously_disabled_withdrawal_address() { - let platform_version = PlatformVersion::latest(); - let platform = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_genesis_state(); - - let block_info = BlockInfo::default(); - - let mut rng = StdRng::seed_from_u64(5); - - let payout_address: [u8; 20] = rng.gen(); - - let withdrawal_key: IdentityPublicKey = IdentityPublicKeyV0 { - id: 0, - key_type: KeyType::ECDSA_HASH160, - purpose: Purpose::TRANSFER, - security_level: SecurityLevel::CRITICAL, - read_only: true, - data: BinaryData::new(payout_address.to_vec()), - disabled_at: None, - contract_bounds: None, - } - .into(); - - let identity: Identity = IdentityV0 { - id: Identifier::random_with_rng(&mut rng), - public_keys: BTreeMap::from([(0, withdrawal_key.clone())]), - balance: 0, - revision: 0, - } - .into(); - - // We just add this identity to the system first - - platform - .drive - .add_new_identity( - identity.clone(), - true, - &block_info, - true, - None, - platform_version, - ) - .expect("expected to add a new identity"); - - let transaction = platform.drive.grove.start_transaction(); - - let mut drive_operations = vec![]; - - platform - .update_owner_withdrawal_address( - identity.id().to_buffer(), - [0; 20], - &block_info, - &transaction, - &mut drive_operations, - platform_version, - ) - .expect("expected to update owner withdrawal address"); - - platform - .drive - .apply_drive_operations( - drive_operations, - true, - &block_info, - Some(&transaction), - platform_version, - None, - ) - .expect("expected to apply drive operations"); - - let transaction = platform.drive.grove.start_transaction(); - - let mut drive_operations = vec![]; - - platform - .update_owner_withdrawal_address( - identity.id().to_buffer(), - payout_address, - &block_info, - &transaction, - &mut drive_operations, - platform_version, - ) - .expect("expected to update owner withdrawal address"); - - platform - .drive - .apply_drive_operations( - drive_operations, - true, - &block_info, - Some(&transaction), - platform_version, - None, - ) - .expect("expected to apply drive operations"); - } -} diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_owner_withdrawal_address/v1/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_owner_withdrawal_address/v1/mod.rs new file mode 100644 index 0000000000..40e074193a --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_owner_withdrawal_address/v1/mod.rs @@ -0,0 +1,136 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::platform_types::platform::Platform; + +use crate::rpc::core::CoreRPCLike; +use dpp::block::block_info::BlockInfo; + +use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; +use dpp::identity::{KeyID, Purpose}; + +use dpp::version::PlatformVersion; +use drive::drive::identity::key::fetch::{ + IdentityKeysRequest, KeyIDIdentityPublicKeyPairBTreeMap, KeyRequestType, +}; +use drive::grovedb::Transaction; +use drive::util::batch::DriveOperation; +use drive::util::batch::DriveOperation::IdentityOperation; +use drive::util::batch::IdentityOperationType::{ + AddNewKeysToIdentity, DisableIdentityKeys, ReEnableIdentityKeys, +}; +impl Platform +where + C: CoreRPCLike, +{ + /// In this version we change how the new key_id is found, as there might also be an owner key + pub(super) fn update_owner_withdrawal_address_v1( + &self, + owner_identifier: [u8; 32], + new_withdrawal_address: [u8; 20], + block_info: &BlockInfo, + transaction: &Transaction, + drive_operations: &mut Vec, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let key_request = IdentityKeysRequest { + identity_id: owner_identifier, + request_type: KeyRequestType::AllKeys, + limit: None, + offset: None, + }; + + let old_withdrawal_identity_keys = self + .drive + .fetch_identity_keys::( + key_request, + Some(transaction), + platform_version, + )?; + + if old_withdrawal_identity_keys.is_empty() { + return Err(Error::Execution(ExecutionError::DriveMissingData( + "expected masternode owner identity to be in state".to_string(), + ))); + } + + let key_ids_to_disable: Vec = old_withdrawal_identity_keys + .iter() + .filter_map(|(key_id, key)| { + if key.disabled_at().is_some() + || key.data().as_slice() == &new_withdrawal_address + || key.purpose() == Purpose::OWNER + { + // We should not disable the owner key + // Also no need to disable withdrawal keys again + // Or if we are adding the same key we already had + None + } else { + Some(*key_id) + } + }) + .collect(); + + if !key_ids_to_disable.is_empty() { + tracing::trace!( + identity_id = ?owner_identifier, + keys_ids = ?key_ids_to_disable, + disable_at = ?block_info.time_ms, + method = "update_owner_withdrawal_address_v1", + "disable old withdrawal keys in owner identity" + ); + + drive_operations.push(IdentityOperation(DisableIdentityKeys { + identity_id: owner_identifier, + keys_ids: key_ids_to_disable, + })); + } + + if let Some((key_id, previously_disabled_old_key)) = old_withdrawal_identity_keys + .iter() + .find(|(_, key)| key.data().as_slice() == new_withdrawal_address) + { + // there might be a situation where we should do nothing as well + if previously_disabled_old_key.is_disabled() { + // We need to re-enable the withdrawal key + tracing::trace!( + identity_id = ?owner_identifier, + withdrawal_key = ?previously_disabled_old_key, + method = "update_owner_withdrawal_address_v0", + "re-enabled withdrawal key to owner identity" + ); + + drive_operations.push(IdentityOperation(ReEnableIdentityKeys { + identity_id: owner_identifier, + keys_ids: vec![*key_id], + })); + } + } else { + let last_key_id = *old_withdrawal_identity_keys + .keys() + .max() + .expect("there must be keys, we already checked"); + + // add the new key + let new_owner_withdrawal_key = Self::get_owner_identity_withdrawal_key( + new_withdrawal_address, + last_key_id + 1, + platform_version, + )?; + + tracing::trace!( + identity_id = ?owner_identifier, + withdrawal_key = ?new_owner_withdrawal_key, + method = "update_owner_withdrawal_address_v1", + "add new withdrawal key to owner identity" + ); + + drive_operations.push(IdentityOperation(AddNewKeysToIdentity { + identity_id: owner_identifier, + unique_keys_to_add: vec![], + non_unique_keys_to_add: vec![new_owner_withdrawal_key], + })); + } + + Ok(()) + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/mod.rs index 659a7e94aa..56c1e17c6a 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/mod.rs @@ -3,6 +3,8 @@ mod v0; use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use dpp::block::block_info::BlockInfo; use dpp::version::PlatformVersion; use dpp::version::ProtocolVersion; use drive::grovedb::Transaction; @@ -40,6 +42,8 @@ impl Platform { /// pub fn perform_events_on_first_block_of_protocol_change( &self, + platform_state: &PlatformState, + block_info: &BlockInfo, transaction: &Transaction, previous_protocol_version: ProtocolVersion, platform_version: &PlatformVersion, @@ -51,6 +55,8 @@ impl Platform { .perform_events_on_first_block_of_protocol_change { Some(0) => self.perform_events_on_first_block_of_protocol_change_v0( + platform_state, + block_info, transaction, previous_protocol_version, platform_version, diff --git a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/v0/mod.rs index 62a0d5a46f..f5cf202665 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/v0/mod.rs @@ -1,7 +1,14 @@ use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::platform_types::platform_state::PlatformState; +use dpp::block::block_info::BlockInfo; +use dpp::dashcore::hashes::Hash; use dpp::version::PlatformVersion; use dpp::version::ProtocolVersion; +use drive::drive::identity::key::fetch::{ + IdentityKeysRequest, KeyIDIdentityPublicKeyPairBTreeMap, KeyRequestType, +}; use drive::drive::identity::withdrawals::paths::{ get_withdrawal_root_path, WITHDRAWAL_TRANSACTIONS_BROADCASTED_KEY, WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, @@ -30,12 +37,19 @@ impl Platform { /// * `Err(Error)`: If there was an issue executing the protocol-specific events. pub(super) fn perform_events_on_first_block_of_protocol_change_v0( &self, + platform_state: &PlatformState, + block_info: &BlockInfo, transaction: &Transaction, previous_protocol_version: ProtocolVersion, platform_version: &PlatformVersion, ) -> Result<(), Error> { if previous_protocol_version < 4 && platform_version.protocol_version >= 4 { - self.transition_to_version_4(transaction, platform_version)?; + self.transition_to_version_4( + platform_state, + block_info, + transaction, + platform_version, + )?; } Ok(()) @@ -57,9 +71,12 @@ impl Platform { /// * `Err(Error)`: If there was an issue creating or updating the necessary data structures. fn transition_to_version_4( &self, + platform_state: &PlatformState, + block_info: &BlockInfo, transaction: &Transaction, platform_version: &PlatformVersion, ) -> Result<(), Error> { + // We are adding the withdrawal transactions sum amount tree let path = get_withdrawal_root_path(); self.drive.grove_insert_if_not_exists( (&path).into(), @@ -69,6 +86,7 @@ impl Platform { None, &platform_version.drive, )?; + // We are adding a tree to store broadcasted transactions that might expire self.drive.grove_insert_if_not_exists( (&path).into(), &WITHDRAWAL_TRANSACTIONS_BROADCASTED_KEY, @@ -77,6 +95,57 @@ impl Platform { None, &platform_version.drive, )?; + // We need to add all masternode owner keys + // This is because owner identities only had a withdrawal key + // But no owner key + for masternode in platform_state.full_masternode_list().values() { + let masternode_id = masternode.pro_tx_hash.to_byte_array(); + let key_request = IdentityKeysRequest { + identity_id: masternode_id, + request_type: KeyRequestType::AllKeys, + limit: None, + offset: None, + }; + + let old_owner_identity_keys = self + .drive + .fetch_identity_keys::( + key_request, + Some(transaction), + platform_version, + )?; + + if old_owner_identity_keys.is_empty() { + continue; + } + + let last_key_id = *old_owner_identity_keys + .keys() + .max() + .expect("there must be keys, we already checked"); + + let new_owner_key = Self::get_owner_identity_owner_key( + masternode.state.owner_address, + last_key_id + 1, + platform_version, + )?; + + tracing::trace!( + identity_id = ?masternode_id, + withdrawal_key = ?new_owner_key, + method = "transition_to_version_4", + "add new owner key to owner identity" + ); + + self.drive.add_new_non_unique_keys_to_identity( + masternode_id, + vec![new_owner_key], + block_info, + true, + Some(transaction), + platform_version, + )?; + } Ok(()) } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs index 46ab19c2fd..bea2dcdccf 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs @@ -29,6 +29,7 @@ use crate::execution::validation::state_transition::identity_top_up::StateTransi use crate::execution::validation::state_transition::state_transitions::identity_update::advanced_structure::v0::IdentityUpdateStateTransitionIdentityAndSignaturesValidationV0; use crate::execution::validation::state_transition::state_transitions::identity_top_up::identity_retrieval::v0::IdentityTopUpStateTransitionIdentityRetrievalV0; use crate::execution::validation::state_transition::ValidationMode; +use crate::execution::validation::state_transition::state_transitions::identity_credit_withdrawal::signature_purpose_matches_requirements::IdentityCreditWithdrawalStateTransitionSignaturePurposeMatchesRequirementsValidation; pub(super) fn process_state_transition_v0<'a, C: CoreRPCLike>( platform: &'a PlatformRef, block_info: &BlockInfo, @@ -810,7 +811,6 @@ impl StateTransitionIdentityBasedSignatureValidationV0 for StateTransition { match self { StateTransition::DataContractCreate(_) | StateTransition::DataContractUpdate(_) - | StateTransition::IdentityCreditWithdrawal(_) | StateTransition::IdentityCreditTransfer(_) | StateTransition::DocumentsBatch(_) => { //Basic signature verification @@ -823,6 +823,29 @@ impl StateTransitionIdentityBasedSignatureValidationV0 for StateTransition { platform_version, )?) } + StateTransition::IdentityCreditWithdrawal(credit_withdrawal) => { + let mut consensus_validation_result = self + .validate_state_transition_identity_signed( + drive, + true, + false, + tx, + execution_context, + platform_version, + )?; + + if consensus_validation_result.is_valid_with_data() { + let validation_result = credit_withdrawal + .validate_signature_purpose_matches_requirements( + consensus_validation_result.data.as_ref().unwrap(), + platform_version, + )?; + if !validation_result.is_valid() { + consensus_validation_result.add_errors(validation_result.errors); + } + } + Ok(consensus_validation_result) + } StateTransition::IdentityUpdate(_) => { //Basic signature verification Ok(self.validate_state_transition_identity_signed( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs index c2eaee7f71..3b42e8e744 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs @@ -1,5 +1,6 @@ mod balance; mod nonce; +pub(crate) mod signature_purpose_matches_requirements; mod state; mod structure; @@ -131,7 +132,9 @@ impl StateTransitionStateValidationV0 for IdentityCreditWithdrawalTransition { #[cfg(test)] mod tests { use crate::config::{PlatformConfig, PlatformTestConfig}; - use crate::execution::validation::state_transition::tests::setup_identity_with_withdrawal_key_and_system_credits; + use crate::execution::validation::state_transition::tests::{ + setup_identity_with_withdrawal_key_and_system_credits, setup_masternode_owner_identity, + }; use crate::platform_types::state_transitions_processing_result::StateTransitionExecutionResult; use crate::test::helpers::fast_forward_to_block::fast_forward_to_block; use crate::test::helpers::setup::TestPlatformBuilder; @@ -378,6 +381,154 @@ mod tests { ); } + #[test] + fn test_masternode_credit_withdrawal_without_withdrawal_address_creates_withdrawal_document_when_signing_with_withdrawal_key( + ) { + let platform_version = PlatformVersion::latest(); + let platform_config = PlatformConfig { + testing_configs: PlatformTestConfig { + disable_instant_lock_signature_verification: true, + ..Default::default() + }, + ..Default::default() + }; + + let mut rng = StdRng::seed_from_u64(529); + + let mut platform = TestPlatformBuilder::new() + .with_config(platform_config) + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + fast_forward_to_block(&platform, 1_200_000_000, 900, 42, 1, false); //next epoch + + let (identity, signer, _, _) = setup_masternode_owner_identity( + &mut platform, + rng.gen(), + dash_to_credits!(0.5), + platform_version, + ); + + let platform_state = platform.state.load(); + + let withdrawal_amount = dash_to_credits!(0.1); + + let credit_withdrawal_transition = IdentityCreditWithdrawalTransition::try_from_identity( + &identity, + None, + withdrawal_amount, + Pooling::Never, + 1, + 0, + signer, + None, + PreferredKeyPurposeForSigningWithdrawal::TransferOnly, + 2, + platform_version, + None, + ) + .expect("expected a credit withdrawal transition"); + + let credit_withdrawal_transition_serialized_transition = credit_withdrawal_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![credit_withdrawal_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(1_200_001_000), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(..)] + ); + } + + #[test] + fn test_masternode_credit_withdrawal_without_withdrawal_address_creates_withdrawal_document_when_signing_with_owner_key( + ) { + let platform_version = PlatformVersion::latest(); + let platform_config = PlatformConfig { + testing_configs: PlatformTestConfig { + disable_instant_lock_signature_verification: true, + ..Default::default() + }, + ..Default::default() + }; + + let mut rng = StdRng::seed_from_u64(529); + + let mut platform = TestPlatformBuilder::new() + .with_config(platform_config) + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + fast_forward_to_block(&platform, 1_200_000_000, 900, 42, 1, false); //next epoch + + let (identity, signer, _, _) = setup_masternode_owner_identity( + &mut platform, + rng.gen(), + dash_to_credits!(0.5), + platform_version, + ); + + let platform_state = platform.state.load(); + + let withdrawal_amount = dash_to_credits!(0.1); + + let credit_withdrawal_transition = IdentityCreditWithdrawalTransition::try_from_identity( + &identity, + None, + withdrawal_amount, + Pooling::Never, + 1, + 0, + signer, + None, + PreferredKeyPurposeForSigningWithdrawal::OwnerOnly, + 2, + platform_version, + None, + ) + .expect("expected a credit withdrawal transition"); + + let credit_withdrawal_transition_serialized_transition = credit_withdrawal_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![credit_withdrawal_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(1_200_001_000), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(..)] + ); + } + mod errors { use super::*; use dpp::consensus::state::state_error::StateError; @@ -458,5 +609,84 @@ mod tests { )] ); } + + #[test] + fn test_masternode_credit_withdrawal_with_withdrawal_address_creates_when_signing_with_owner_key_should_fail( + ) { + let platform_version = PlatformVersion::latest(); + let platform_config = PlatformConfig { + testing_configs: PlatformTestConfig { + disable_instant_lock_signature_verification: true, + ..Default::default() + }, + ..Default::default() + }; + + let mut rng = StdRng::seed_from_u64(529); + + let mut platform = TestPlatformBuilder::new() + .with_config(platform_config) + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + fast_forward_to_block(&platform, 1_200_000_000, 900, 42, 1, false); //next epoch + + let (identity, signer, _, _) = setup_masternode_owner_identity( + &mut platform, + rng.gen(), + dash_to_credits!(0.5), + platform_version, + ); + + let platform_state = platform.state.load(); + + let withdrawal_amount = dash_to_credits!(0.1); + + let credit_withdrawal_transition = + IdentityCreditWithdrawalTransition::try_from_identity( + &identity, + Some(CoreScript::random_p2pkh(&mut rng)), + withdrawal_amount, + Pooling::Never, + 1, + 0, + signer, + None, + PreferredKeyPurposeForSigningWithdrawal::OwnerOnly, + 2, + platform_version, + None, + ) + .expect("expected a credit withdrawal transition"); + + let credit_withdrawal_transition_serialized_transition = credit_withdrawal_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![credit_withdrawal_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(1_200_001_000), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::UnpaidConsensusError( + ConsensusError::BasicError( + BasicError::WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError(_) + ) + )] + ); + } } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/signature_purpose_matches_requirements/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/signature_purpose_matches_requirements/mod.rs new file mode 100644 index 0000000000..d82846f84e --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/signature_purpose_matches_requirements/mod.rs @@ -0,0 +1,45 @@ +pub(crate) mod v0; + +use crate::error::Error; +use dpp::identity::PartialIdentity; +use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; +use dpp::validation::SimpleConsensusValidationResult; +use dpp::version::PlatformVersion; +use crate::error::execution::ExecutionError; +use crate::execution::validation::state_transition::identity_credit_withdrawal::signature_purpose_matches_requirements::v0::IdentityCreditWithdrawalStateTransitionSignaturePurposeMatchesRequirementsValidationV0; + +pub(in crate::execution::validation::state_transition) trait IdentityCreditWithdrawalStateTransitionSignaturePurposeMatchesRequirementsValidation +{ + fn validate_signature_purpose_matches_requirements( + &self, + identity: &PartialIdentity, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl IdentityCreditWithdrawalStateTransitionSignaturePurposeMatchesRequirementsValidation + for IdentityCreditWithdrawalTransition +{ + fn validate_signature_purpose_matches_requirements( + &self, + identity: &PartialIdentity, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .identity_credit_withdrawal_state_transition_purpose_matches_requirements + { + 0 => self.validate_signature_purpose_matches_requirements_v0( + identity, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "identity credit withdrawal transition: validate_signature_purpose_matches_requirements".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/signature_purpose_matches_requirements/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/signature_purpose_matches_requirements/v0/mod.rs new file mode 100644 index 0000000000..4bdd1ff1a2 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/signature_purpose_matches_requirements/v0/mod.rs @@ -0,0 +1,53 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use dpp::consensus::basic::identity::WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError; +use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; +use dpp::identity::{PartialIdentity, Purpose}; +use dpp::state_transition::identity_credit_withdrawal_transition::accessors::IdentityCreditWithdrawalTransitionAccessorsV0; +use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; +use dpp::state_transition::StateTransitionIdentitySigned; +use dpp::validation::SimpleConsensusValidationResult; +use dpp::version::PlatformVersion; + +pub(super) trait IdentityCreditWithdrawalStateTransitionSignaturePurposeMatchesRequirementsValidationV0 +{ + fn validate_signature_purpose_matches_requirements_v0( + &self, + identity: &PartialIdentity, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl IdentityCreditWithdrawalStateTransitionSignaturePurposeMatchesRequirementsValidationV0 + for IdentityCreditWithdrawalTransition +{ + fn validate_signature_purpose_matches_requirements_v0( + &self, + identity: &PartialIdentity, + _platform_version: &PlatformVersion, + ) -> Result { + let mut result = SimpleConsensusValidationResult::default(); + + if let Some(output_script) = self.output_script() { + let Some(signing_key) = identity + .loaded_public_keys + .get(&self.signature_public_key_id()) + else { + return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( + "we should have a loaded key at this point", + ))); + }; + + if signing_key.purpose() == Purpose::OWNER { + result.add_error( + WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError::new( + output_script.clone(), + signing_key.id(), + ), + ); + } + } + + Ok(result) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs index 0b6adcdf0d..629240407a 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs @@ -116,9 +116,13 @@ mod tests { use crate::execution::validation::state_transition::tests::{ setup_add_key_to_identity, setup_identity_return_master_key, }; + use crate::platform_types::state_transitions_processing_result::StateTransitionExecutionResult; use crate::test::helpers::setup::TestPlatformBuilder; + use assert_matches::assert_matches; use dpp::block::block_info::BlockInfo; + use dpp::consensus::ConsensusError; use dpp::dash_to_credits; + use dpp::dashcore::key::{KeyPair, Secp256k1}; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::contract_bounds::ContractBounds; @@ -128,8 +132,11 @@ mod tests { use dpp::serialization::{PlatformSerializable, Signable}; use dpp::state_transition::identity_update_transition::v0::IdentityUpdateTransitionV0; use dpp::state_transition::identity_update_transition::IdentityUpdateTransition; + use dpp::state_transition::public_key_in_creation::v0::IdentityPublicKeyInCreationV0; use dpp::state_transition::StateTransition; use platform_version::version::PlatformVersion; + use rand::rngs::StdRng; + use rand::SeedableRng; #[test] fn test_identity_update_that_disables_an_authentication_key() { @@ -337,4 +344,109 @@ mod tests { .join(" | ") ); } + + #[test] + fn test_identity_update_adding_owner_key_not_allowed() { + let platform_config = PlatformConfig { + testing_configs: PlatformTestConfig { + disable_instant_lock_signature_verification: true, + ..Default::default() + }, + ..Default::default() + }; + + let platform_version = PlatformVersion::latest(); + + let mut platform = TestPlatformBuilder::new() + .with_config(platform_config) + .build_with_mock_rpc() + .set_genesis_state(); + + let (identity, signer, key) = + setup_identity_return_master_key(&mut platform, 958, dash_to_credits!(0.1)); + + let platform_state = platform.state.load(); + + let secp = Secp256k1::new(); + + let mut rng = StdRng::seed_from_u64(1292); + + let new_key_pair = KeyPair::new(&secp, &mut rng); + + let new_key = IdentityPublicKeyInCreationV0 { + id: 2, + purpose: Purpose::OWNER, + security_level: SecurityLevel::HIGH, + key_type: KeyType::ECDSA_SECP256K1, + read_only: false, + data: new_key_pair.public_key().serialize().to_vec().into(), + signature: Default::default(), + contract_bounds: None, + }; + + let update_transition: IdentityUpdateTransition = IdentityUpdateTransitionV0 { + identity_id: identity.id(), + revision: 1, + nonce: 1, + add_public_keys: vec![new_key.into()], + disable_public_keys: vec![], + user_fee_increase: 0, + signature_public_key_id: key.id(), + signature: Default::default(), + } + .into(); + + let mut update_transition: StateTransition = update_transition.into(); + + let data = update_transition + .signable_bytes() + .expect("expected signable bytes"); + update_transition.set_signature( + signer + .sign(&key, data.as_slice()) + .expect("expected to sign"), + ); + + let update_transition_bytes = update_transition + .serialize_to_bytes() + .expect("expected to serialize"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![update_transition_bytes.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + true, + None, + ) + .expect("expected to process state transition"); + + // We expect there to be an error because you should not be able to add owner keys + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::UnpaidConsensusError( + ConsensusError::BasicError(_) + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + let issues = platform + .drive + .grove + .visualize_verify_grovedb(None, true, false, &platform_version.drive.grove_version) + .expect("expected to have no issues"); + + assert_eq!(issues.len(), 0); + } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs index 51df74cde5..b0986e026d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs @@ -512,6 +512,111 @@ pub(in crate::execution) mod tests { ); } + pub(in crate::execution) fn setup_masternode_owner_identity( + platform: &mut TempPlatform, + seed: u64, + credits: Credits, + platform_version: &PlatformVersion, + ) -> (Identity, SimpleSigner, IdentityPublicKey, IdentityPublicKey) { + let mut signer = SimpleSigner::default(); + + platform + .drive + .add_to_system_credits(credits, None, platform_version) + .expect("expected to add to system credits"); + + let mut rng = StdRng::seed_from_u64(seed); + + let (transfer_key, transfer_private_key) = + IdentityPublicKey::random_masternode_transfer_key_with_rng( + 0, + &mut rng, + platform_version, + ) + .expect("expected to get key pair"); + + let (owner_key, owner_private_key) = + IdentityPublicKey::random_masternode_owner_key_with_rng(1, &mut rng, platform_version) + .expect("expected to get key pair"); + + let owner_address = owner_key + .public_key_hash() + .expect("expected a public key hash"); + + let payout_address = transfer_key + .public_key_hash() + .expect("expected a public key hash"); + + signer.add_key(transfer_key.clone(), transfer_private_key.clone()); + signer.add_key(owner_key.clone(), owner_private_key.clone()); + + let pro_tx_hash_bytes: [u8; 32] = rng.gen(); + + let identity: Identity = IdentityV0 { + id: pro_tx_hash_bytes.into(), + public_keys: BTreeMap::from([(0, transfer_key.clone()), (1, owner_key.clone())]), + balance: credits, + revision: 0, + } + .into(); + + // We just add this identity to the system first + + platform + .drive + .add_new_identity( + identity.clone(), + true, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add a new identity"); + + let mut platform_state = platform.state.load().clone().deref().clone(); + + let pro_tx_hash = ProTxHash::from_byte_array(pro_tx_hash_bytes); + + let random_ip = Ipv4Addr::new( + rng.gen_range(0..255), + rng.gen_range(0..255), + rng.gen_range(0..255), + rng.gen_range(0..255), + ); + + platform_state.full_masternode_list_mut().insert( + pro_tx_hash, + MasternodeListItem { + node_type: MasternodeType::Regular, + pro_tx_hash, + collateral_hash: Txid::from_byte_array(rng.gen()), + collateral_index: 0, + collateral_address: rng.gen(), + operator_reward: 0.0, + state: DMNState { + service: SocketAddr::new(IpAddr::V4(random_ip), 19999), + registered_height: 0, + pose_revived_height: None, + pose_ban_height: None, + revocation_reason: 0, + owner_address, + voting_address: rng.gen(), + payout_address, + pub_key_operator: vec![], + operator_payout_address: None, + platform_node_id: None, + platform_p2p_port: None, + platform_http_port: None, + }, + }, + ); + + platform.state.store(Arc::new(platform_state)); + + (identity, signer, owner_key, transfer_key) + } + pub(in crate::execution) fn setup_masternode_voting_identity( platform: &mut TempPlatform, seed: u64, diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_purpose_in_key_reference_tree/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_purpose_in_key_reference_tree/v0/mod.rs index f7a49a2bd7..68d4852ad3 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/for_purpose_in_key_reference_tree/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_purpose_in_key_reference_tree/v0/mod.rs @@ -45,6 +45,7 @@ impl Drive { Purpose::TRANSFER => ApproximateElements(1), Purpose::SYSTEM => ApproximateElements(1), Purpose::VOTING => ApproximateElements(1), + Purpose::OWNER => ApproximateElements(1), }; let estimated_layer_sizes = match purpose { @@ -58,6 +59,7 @@ impl Drive { Purpose::TRANSFER => AllReference(1, KEY_REFERENCE_SIZE, None), Purpose::SYSTEM => AllReference(1, KEY_REFERENCE_SIZE, None), Purpose::VOTING => AllReference(1, KEY_REFERENCE_SIZE, None), + Purpose::OWNER => AllReference(1, KEY_REFERENCE_SIZE, None), }; // we then need to insert the identity keys layer estimated_costs_only_with_layer_info.insert( diff --git a/packages/rs-drive/src/drive/identity/key/fetch/mod.rs b/packages/rs-drive/src/drive/identity/key/fetch/mod.rs index 248e7cd904..75466736bd 100644 --- a/packages/rs-drive/src/drive/identity/key/fetch/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/fetch/mod.rs @@ -691,8 +691,8 @@ impl IdentityKeysRequest { sec_btree_map.insert(security_level, CurrentKeyOfKindRequest); } let mut purpose_btree_map = BTreeMap::new(); - for purpose in 0..=Purpose::last() as u8 { - purpose_btree_map.insert(purpose, sec_btree_map.clone()); + for purpose in Purpose::searchable_purposes() { + purpose_btree_map.insert(purpose as u8, sec_btree_map.clone()); } IdentityKeysRequest { identity_id, diff --git a/packages/rs-drive/src/util/batch/drive_op_batch/withdrawals.rs b/packages/rs-drive/src/util/batch/drive_op_batch/withdrawals.rs index 2a95fc39a7..26bf6617a7 100644 --- a/packages/rs-drive/src/util/batch/drive_op_batch/withdrawals.rs +++ b/packages/rs-drive/src/util/batch/drive_op_batch/withdrawals.rs @@ -1,8 +1,7 @@ use std::collections::HashMap; use crate::drive::identity::withdrawals::paths::{ - get_withdrawal_root_path_vec, get_withdrawal_transactions_broadcasted_path, - get_withdrawal_transactions_broadcasted_path_vec, get_withdrawal_transactions_queue_path, + get_withdrawal_root_path_vec, get_withdrawal_transactions_broadcasted_path_vec, get_withdrawal_transactions_queue_path_vec, get_withdrawal_transactions_sum_tree_path_vec, WITHDRAWAL_TRANSACTIONS_NEXT_INDEX_KEY, }; diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index f7d5dda710..bb74c9d433 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -200,6 +200,7 @@ pub struct DriveAbciStateTransitionValidationVersions { pub identity_update_state_transition: DriveAbciStateTransitionValidationVersion, pub identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion, pub identity_credit_withdrawal_state_transition: DriveAbciStateTransitionValidationVersion, + pub identity_credit_withdrawal_state_transition_purpose_matches_requirements: FeatureVersion, pub identity_credit_transfer_state_transition: DriveAbciStateTransitionValidationVersion, pub masternode_vote_state_transition: DriveAbciStateTransitionValidationVersion, pub contract_create_state_transition: DriveAbciStateTransitionValidationVersion, @@ -247,6 +248,7 @@ pub struct DriveAbciMasternodeIdentitiesUpdatesMethodVersions { pub get_voter_identity_key: FeatureVersion, pub get_operator_identity_keys: FeatureVersion, pub get_owner_identity_withdrawal_key: FeatureVersion, + pub get_owner_identity_owner_key: FeatureVersion, pub get_voter_identifier_from_masternode_list_item: FeatureVersion, pub get_operator_identifier_from_masternode_list_item: FeatureVersion, pub create_operator_identity: FeatureVersion, diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 28db2e2a7b..380e9ae88e 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -629,6 +629,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { get_voter_identity_key: 0, get_operator_identity_keys: 0, get_owner_identity_withdrawal_key: 0, + get_owner_identity_owner_key: 0, get_voter_identifier_from_masternode_list_item: 0, get_operator_identifier_from_masternode_list_item: 0, create_operator_identity: 0, @@ -769,6 +770,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { state: 0, transform_into_action: 0, }, + identity_credit_withdrawal_state_transition_purpose_matches_requirements: 0, identity_credit_transfer_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 1f9c5eb579..436b1d9b89 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -629,6 +629,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { get_voter_identity_key: 0, get_operator_identity_keys: 0, get_owner_identity_withdrawal_key: 0, + get_owner_identity_owner_key: 0, get_voter_identifier_from_masternode_list_item: 0, get_operator_identifier_from_masternode_list_item: 0, create_operator_identity: 0, @@ -769,6 +770,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { state: 0, transform_into_action: 0, }, + identity_credit_withdrawal_state_transition_purpose_matches_requirements: 0, identity_credit_transfer_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 8104775a5e..c762c864b2 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -628,6 +628,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { get_voter_identity_key: 0, get_operator_identity_keys: 0, get_owner_identity_withdrawal_key: 0, + get_owner_identity_owner_key: 0, get_voter_identifier_from_masternode_list_item: 0, get_operator_identifier_from_masternode_list_item: 0, create_operator_identity: 0, @@ -768,6 +769,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { state: 0, transform_into_action: 0, }, + identity_credit_withdrawal_state_transition_purpose_matches_requirements: 0, identity_credit_transfer_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), diff --git a/packages/rs-platform-version/src/version/v2.rs b/packages/rs-platform-version/src/version/v2.rs index 3f9931df8a..7df825fb32 100644 --- a/packages/rs-platform-version/src/version/v2.rs +++ b/packages/rs-platform-version/src/version/v2.rs @@ -628,6 +628,7 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion { get_voter_identity_key: 0, get_operator_identity_keys: 0, get_owner_identity_withdrawal_key: 0, + get_owner_identity_owner_key: 0, get_voter_identifier_from_masternode_list_item: 0, get_operator_identifier_from_masternode_list_item: 0, create_operator_identity: 0, @@ -768,6 +769,7 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion { state: 0, transform_into_action: 0, }, + identity_credit_withdrawal_state_transition_purpose_matches_requirements: 0, identity_credit_transfer_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), diff --git a/packages/rs-platform-version/src/version/v3.rs b/packages/rs-platform-version/src/version/v3.rs index b3c7cf3cc4..609a9a9015 100644 --- a/packages/rs-platform-version/src/version/v3.rs +++ b/packages/rs-platform-version/src/version/v3.rs @@ -636,6 +636,7 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { get_voter_identity_key: 0, get_operator_identity_keys: 0, get_owner_identity_withdrawal_key: 0, + get_owner_identity_owner_key: 0, get_voter_identifier_from_masternode_list_item: 0, get_operator_identifier_from_masternode_list_item: 0, create_operator_identity: 0, @@ -776,6 +777,7 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { state: 0, transform_into_action: 0, }, + identity_credit_withdrawal_state_transition_purpose_matches_requirements: 0, identity_credit_transfer_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), diff --git a/packages/rs-platform-version/src/version/v4.rs b/packages/rs-platform-version/src/version/v4.rs index c607170dec..dd693aa2f8 100644 --- a/packages/rs-platform-version/src/version/v4.rs +++ b/packages/rs-platform-version/src/version/v4.rs @@ -630,15 +630,16 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { get_voter_identity_key: 0, get_operator_identity_keys: 0, get_owner_identity_withdrawal_key: 0, + get_owner_identity_owner_key: 0, get_voter_identifier_from_masternode_list_item: 0, get_operator_identifier_from_masternode_list_item: 0, create_operator_identity: 0, - create_owner_identity: 0, + create_owner_identity: 1, create_voter_identity: 0, disable_identity_keys: 0, update_masternode_identities: 0, update_operator_identity: 0, - update_owner_withdrawal_address: 0, + update_owner_withdrawal_address: 1, update_voter_identity: 0, }, }, @@ -770,6 +771,7 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { state: 0, transform_into_action: 0, }, + identity_credit_withdrawal_state_transition_purpose_matches_requirements: 0, identity_credit_transfer_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), diff --git a/packages/rs-sdk/src/platform/fetch_many.rs b/packages/rs-sdk/src/platform/fetch_many.rs index 897be764ae..eede165d26 100644 --- a/packages/rs-sdk/src/platform/fetch_many.rs +++ b/packages/rs-sdk/src/platform/fetch_many.rs @@ -31,14 +31,13 @@ use dpp::{ block::extended_epoch_info::ExtendedEpochInfo, voting::votes::resource_vote::ResourceVote, }; use dpp::{document::Document, voting::contender_structs::ContenderWithSerializedDocument}; -use drive::grovedb::query_result_type::{Key, Path}; +use drive::grovedb::query_result_type::Key; use drive::grovedb::Element; use drive_proof_verifier::types::{ Contenders, ContestedResource, ContestedResources, DataContracts, Elements, ExtendedEpochInfos, - IdentityBalances, IdentityPublicKeys, KeysInPath, MasternodeProtocolVote, - MasternodeProtocolVotes, ProposerBlockCountById, ProposerBlockCountByRange, - ProposerBlockCounts, ProtocolVersionUpgrades, ResourceVotesByIdentity, - VotePollsGroupedByTimestamp, Voter, Voters, + IdentityBalances, IdentityPublicKeys, MasternodeProtocolVote, MasternodeProtocolVotes, + ProposerBlockCountById, ProposerBlockCountByRange, ProposerBlockCounts, + ProtocolVersionUpgrades, ResourceVotesByIdentity, VotePollsGroupedByTimestamp, Voter, Voters, }; use drive_proof_verifier::{types::Documents, FromProof}; use rs_dapi_client::{transport::TransportRequest, DapiRequest, RequestSettings}; diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index 642dce93fc..ba828e674e 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -63,7 +63,7 @@ use dpp::consensus::state::data_trigger::DataTriggerError::{ use wasm_bindgen::{JsError, JsValue}; use dpp::consensus::basic::data_contract::{ContestedUniqueIndexOnMutableDocumentTypeError, ContestedUniqueIndexWithUniqueIndexError, InvalidDocumentTypeRequiredSecurityLevelError, UnknownDocumentCreationRestrictionModeError, UnknownSecurityLevelError, UnknownStorageKeyRequirementsError, UnknownTradeModeError, UnknownTransferableTypeError}; use dpp::consensus::basic::document::{ContestedDocumentsTemporarilyNotAllowedError, DocumentCreationNotAllowedError, DocumentFieldMaxSizeExceededError, MaxDocumentsTransitionsExceededError, MissingPositionsInDocumentTypePropertiesError}; -use dpp::consensus::basic::identity::{DataContractBoundsNotPresentError, DisablingKeyIdAlsoBeingAddedInSameTransitionError, InvalidIdentityCreditWithdrawalTransitionAmountError, InvalidIdentityUpdateTransitionDisableKeysError, InvalidIdentityUpdateTransitionEmptyError, TooManyMasterPublicKeyError}; +use dpp::consensus::basic::identity::{DataContractBoundsNotPresentError, DisablingKeyIdAlsoBeingAddedInSameTransitionError, InvalidIdentityCreditWithdrawalTransitionAmountError, InvalidIdentityUpdateTransitionDisableKeysError, InvalidIdentityUpdateTransitionEmptyError, TooManyMasterPublicKeyError, WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError}; use dpp::consensus::basic::overflow_error::OverflowError; use dpp::consensus::state::data_contract::document_type_update_error::DocumentTypeUpdateError; use dpp::consensus::state::document::document_contest_currently_locked_error::DocumentContestCurrentlyLockedError; @@ -560,6 +560,13 @@ fn from_basic_error(basic_error: &BasicError) -> JsValue { BasicError::ContestedDocumentsTemporarilyNotAllowedError(e) => { generic_consensus_error!(ContestedDocumentsTemporarilyNotAllowedError, e).into() } + BasicError::WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError(e) => { + generic_consensus_error!( + WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError, + e + ) + .into() + } } } diff --git a/packages/wasm-dpp/src/identity/identity_public_key/purpose.rs b/packages/wasm-dpp/src/identity/identity_public_key/purpose.rs index 5e598ffa52..33503d6179 100644 --- a/packages/wasm-dpp/src/identity/identity_public_key/purpose.rs +++ b/packages/wasm-dpp/src/identity/identity_public_key/purpose.rs @@ -15,6 +15,8 @@ pub enum PurposeWasm { SYSTEM = 4, /// this key cannot be used for signing documents VOTING = 5, + /// this key is only for masternode owners + OWNER = 6, } impl From for PurposeWasm { @@ -26,6 +28,7 @@ impl From for PurposeWasm { Purpose::TRANSFER => PurposeWasm::TRANSFER, Purpose::SYSTEM => PurposeWasm::SYSTEM, Purpose::VOTING => PurposeWasm::VOTING, + Purpose::OWNER => PurposeWasm::OWNER, } } } From 9a8068b3ea67cd0722ec1278d84f6d6dfa2ea875 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Mon, 7 Oct 2024 09:42:43 +0300 Subject: [PATCH 45/90] chore(release): update changelog and bump version to 1.4.0-dev.5 (#2216) --- CHANGELOG.md | 12 +++++ Cargo.lock | 50 +++++++++---------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/check-features/Cargo.toml | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 44 files changed, 79 insertions(+), 67 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 60f65566f0..4972a7f5a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +## [1.4.0-dev.5](https://github.com/dashpay/platform/compare/v1.4.0-dev.4...v1.4.0-dev.5) (2024-10-07) + + +### ⚠ BREAKING CHANGES + +* **platform:** add owner keys to identities, fixed verification of use of owner keys (#2215) + +### Features + +* **dpp:** add a convenience method to get the public key data for a private key depending on the key type ([#2214](https://github.com/dashpay/platform/issues/2214)) +* **platform:** add owner keys to identities, fixed verification of use of owner keys ([#2215](https://github.com/dashpay/platform/issues/2215)) + ## [1.4.0-dev.4](https://github.com/dashpay/platform/compare/v1.4.0-dev.3...v1.4.0-dev.4) (2024-10-05) diff --git a/Cargo.lock b/Cargo.lock index 619f089d7c..bc510e7764 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -781,7 +781,7 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "check-features" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "toml", ] @@ -1147,7 +1147,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1163,7 +1163,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "dapi-grpc", "heck 0.5.0", @@ -1208,7 +1208,7 @@ dependencies = [ [[package]] name = "dash-sdk" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "arc-swap", "async-trait", @@ -1308,7 +1308,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "platform-value", "platform-version", @@ -1318,7 +1318,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1434,7 +1434,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "platform-value", "platform-version", @@ -1444,7 +1444,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "anyhow", "assert_matches", @@ -1496,7 +1496,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "arc-swap", "assert_matches", @@ -1537,7 +1537,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "arc-swap", "assert_matches", @@ -1593,7 +1593,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "bincode", "dapi-grpc", @@ -1807,7 +1807,7 @@ checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "feature-flags-contract" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "platform-value", "platform-version", @@ -2752,7 +2752,7 @@ dependencies = [ [[package]] name = "json-schema-compatibility-validator" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "assert_matches", "json-patch", @@ -2925,7 +2925,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "platform-value", "platform-version", @@ -3499,7 +3499,7 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "platform-serialization" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "bincode", "platform-version", @@ -3507,7 +3507,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "proc-macro2", "quote", @@ -3517,7 +3517,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "base64 0.22.1", "bincode", @@ -3538,7 +3538,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "quote", "syn 2.0.75", @@ -3546,7 +3546,7 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "bincode", "grovedb-version", @@ -3557,7 +3557,7 @@ dependencies = [ [[package]] name = "platform-versioning" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "proc-macro2", "quote", @@ -4170,7 +4170,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "backon", "chrono", @@ -4687,7 +4687,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "base64 0.22.1", "bincode", @@ -4778,7 +4778,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "bincode", "dpp", @@ -5822,7 +5822,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "anyhow", "async-trait", @@ -6124,7 +6124,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" dependencies = [ "num_enum", "platform-value", diff --git a/package.json b/package.json index 32d2c194d5..71948e1ad3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.4.0-dev.4", + "version": "1.4.0-dev.5", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index f2514b912f..3a823e438c 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.4.0-dev.4", + "version": "1.4.0-dev.5", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/check-features/Cargo.toml b/packages/check-features/Cargo.toml index 1c8c3c74f0..7ca97f3972 100644 --- a/packages/check-features/Cargo.toml +++ b/packages/check-features/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "check-features" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index aee73d40aa..9e3e1bb031 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index c4b331b92f..31f70b10bd 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.4.0-dev.4", + "version": "1.4.0-dev.5", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index c7eeb54f5b..a8e9884221 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.4.0-dev.4", + "version": "1.4.0-dev.5", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index 2bbeafc826..5745553e4a 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "2.4.0-dev.4", + "version": "2.4.0-dev.5", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index 5ca8c5baaa..22bf5a8fcb 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.4.0-dev.4", + "version": "1.4.0-dev.5", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index 98607a348b..9a957ebed1 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index 4e9ee2dbff..4c877bd614 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.4.0-dev.4", + "version": "1.4.0-dev.5", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index 8d7f49065e..0f6bd43bb7 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 41cd2fca5a..1bfb6601c0 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index 85d7b1577c..fb9fb715f1 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.4.0-dev.4", + "version": "1.4.0-dev.5", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index 24c768daec..a036c5b3e8 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index 13ab78cf6b..2236ecfea8 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.4.0-dev.4", + "version": "1.4.0-dev.5", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index 0b1445877d..c95923b963 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.4.0-dev.4", + "version": "1.4.0-dev.5", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index a4c2392746..80bd7b603f 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.4.0-dev.4", + "version": "4.4.0-dev.5", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index 6c1650111c..a020b17265 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.4.0-dev.4", + "version": "1.4.0-dev.5", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index 421d6089ff..dfe5ebfee8 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index cdb2081fda..5c48af39e5 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.4.0-dev.4", + "version": "1.4.0-dev.5", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index f7b9797dcd..dee2e4eec6 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.4.0-dev.4", + "version": "1.4.0-dev.5", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index 90b104038b..bb70c75025 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index a773e97a8c..42d01e1774 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 4465cee8ea..0403a23c8d 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" edition = "2021" rust-version.workspace = true authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index c8417113cd..f3e3ab341c 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index ef0cb3b799..66892cd7fe 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" edition = "2021" rust-version.workspace = true diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 1c03bce340..f375298dea 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-json-schema-compatibility-validator/Cargo.toml b/packages/rs-json-schema-compatibility-validator/Cargo.toml index b03bceedc6..99b3b3e1cb 100644 --- a/packages/rs-json-schema-compatibility-validator/Cargo.toml +++ b/packages/rs-json-schema-compatibility-validator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "json-schema-compatibility-validator" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" edition = "2021" rust-version.workspace = true authors = ["Ivan Shumkov "] diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index 4e06638edd..66c56b6516 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index 2f4fbc2b99..cdfc3151ae 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index 69ffa5e564..db3a876e5d 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index 975e9044bf..15b0852906 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 807fd9ee9c..b09c7ae36c 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Versioning library for Platform" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index 772c4882d5..ad8520f530 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index c021f6df51..7ddcf9eb0a 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dash-sdk" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index 646682423a..c7cca2b3f2 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" edition = "2021" rust-version.workspace = true diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index 504106caa0..c4c32d92a0 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 0bdc37176f..0c50db6105 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.4.0-dev.4", + "version": "8.4.0-dev.5", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index 9cc5a34324..f2a048627b 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" edition = "2021" rust-version.workspace = true authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index b620d68e4b..f43dfda3e7 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.4.0-dev.4", + "version": "1.4.0-dev.5", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index ddedf2d869..59ec5928f4 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.4.0-dev.4" +version = "1.4.0-dev.5" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index 1a10bbb938..750d87c499 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.4.0-dev.4", + "version": "1.4.0-dev.5", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From d73139f3b1726a871409229da9c8448530afe2e8 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 7 Oct 2024 17:27:10 +0700 Subject: [PATCH 46/90] chore(sdk): expose drive module in public API for rs-sdk (#2217) --- packages/rs-sdk/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/rs-sdk/src/lib.rs b/packages/rs-sdk/src/lib.rs index d165a211a5..62bd9fea4c 100644 --- a/packages/rs-sdk/src/lib.rs +++ b/packages/rs-sdk/src/lib.rs @@ -75,6 +75,7 @@ pub use sdk::{RequestSettings, Sdk, SdkBuilder}; pub use dashcore_rpc; pub use dpp; +pub use drive; pub use rs_dapi_client as dapi_client; /// Version of the SDK From 3f7a3b992efe45f2dc01ae301e1da6880fd24076 Mon Sep 17 00:00:00 2001 From: lklimek <842586+lklimek@users.noreply.github.com> Date: Mon, 7 Oct 2024 13:34:24 +0200 Subject: [PATCH 47/90] chore: update dependences (#2072) --- .devcontainer/Dockerfile | 10 +- .github/actions/rust/action.yaml | 2 +- Cargo.lock | 1149 +++++------------ Dockerfile | 2 +- README.md | 2 +- packages/dapi-grpc/Cargo.toml | 8 +- packages/rs-dapi-client/Cargo.toml | 9 +- packages/rs-dapi-grpc-macros/Cargo.toml | 4 +- packages/rs-dpp/Cargo.toml | 22 +- .../document_base_transition/mod.rs | 2 +- .../document_base_transition/v0/mod.rs | 2 +- .../document_create_transition/mod.rs | 2 +- .../document_create_transition/v0/mod.rs | 2 +- .../document_delete_transition/mod.rs | 2 +- .../document_delete_transition/v0/mod.rs | 2 +- .../document_purchase_transition/mod.rs | 2 +- .../document_purchase_transition/v0/mod.rs | 2 +- .../document_replace_transition/mod.rs | 2 +- .../document_replace_transition/v0/mod.rs | 2 +- .../document_transfer_transition/mod.rs | 2 +- .../document_transfer_transition/v0/mod.rs | 2 +- .../document_update_price_transition/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../document_transition/mod.rs | 12 +- packages/rs-drive-abci/Cargo.toml | 25 +- packages/rs-drive-abci/src/logging/logger.rs | 8 +- packages/rs-drive-proof-verifier/Cargo.toml | 4 +- packages/rs-drive/Cargo.toml | 15 +- .../Cargo.toml | 2 +- .../Cargo.toml | 6 +- .../rs-platform-value-convertible/Cargo.toml | 4 +- packages/rs-platform-version/Cargo.toml | 4 +- packages/rs-platform-versioning/Cargo.toml | 4 +- packages/rs-sdk/Cargo.toml | 9 +- packages/wasm-dpp/Cargo.toml | 4 +- 35 files changed, 406 insertions(+), 927 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index f64e6c0580..e0a517ab06 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -21,7 +21,7 @@ RUN rm /usr/bin/cc && ln -s /usr/bin/clang /usr/bin/cc # Install protoc - protobuf compiler # The one shipped with Alpine does not work ARG TARGETARCH -ARG PROTOC_VERSION=25.2 +ARG PROTOC_VERSION=27.3 RUN if [[ "$TARGETARCH" == "arm64" ]] ; then export PROTOC_ARCH=aarch_64; else export PROTOC_ARCH=x86_64; fi; \ curl -Ls https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-linux-${PROTOC_ARCH}.zip \ -o /tmp/protoc.zip && \ @@ -29,10 +29,10 @@ RUN if [[ "$TARGETARCH" == "arm64" ]] ; then export PROTOC_ARCH=aarch_64; else e rm /tmp/protoc.zip && \ ln -s /opt/protoc/bin/protoc /usr/bin/ -# Install protoc v25.2+ -RUN curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v25.2/protoc-25.2-linux-x86_64.zip \ - && unzip protoc-25.2-linux-x86_64.zip -d /usr/local \ - && rm protoc-25.2-linux-x86_64.zip +# Install protoc +RUN curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-linux-x86_64.zip \ + && unzip protoc-${PROTOC_VERSION}-linux-x86_64.zip -d /usr/local \ + && rm protoc-${PROTOC_VERSION}-linux-x86_64.zip # Switch to vscode user USER vscode diff --git a/.github/actions/rust/action.yaml b/.github/actions/rust/action.yaml index cdfc7e11e6..8854007013 100644 --- a/.github/actions/rust/action.yaml +++ b/.github/actions/rust/action.yaml @@ -79,7 +79,7 @@ runs: shell: bash run: | curl -Lo /tmp/protoc.zip \ - "https://github.com/protocolbuffers/protobuf/releases/download/v25.2/protoc-25.2-linux-${{ steps.protoc_arch.outputs.arch }}.zip" + "https://github.com/protocolbuffers/protobuf/releases/download/v27.3/protoc-27.3-linux-${{ steps.protoc_arch.outputs.arch }}.zip" unzip -o /tmp/protoc.zip -d ${HOME}/.local echo "PROTOC=${HOME}/.local/bin/protoc" >> $GITHUB_ENV export PATH="${PATH}:${HOME}/.local/bin" diff --git a/Cargo.lock b/Cargo.lock index bc510e7764..242a8e7df2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -89,6 +89,12 @@ dependencies = [ "libc", ] +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + [[package]] name = "anstream" version = "0.6.15" @@ -177,33 +183,15 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" -[[package]] -name = "async-io" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" -dependencies = [ - "async-lock", - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-lite", - "log", - "parking", - "polling", - "rustix 0.37.27", - "slab", - "socket2 0.4.10", - "waker-fn", -] - [[package]] name = "async-lock" -version = "2.8.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ "event-listener", + "event-listener-strategy", + "pin-project-lite", ] [[package]] @@ -245,51 +233,12 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - [[package]] name = "autocfg" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" -[[package]] -name = "axum" -version = "0.6.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" -dependencies = [ - "async-trait", - "axum-core 0.3.4", - "bitflags 1.3.2", - "bytes", - "futures-util", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.30", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "sync_wrapper 0.1.2", - "tower", - "tower-layer", - "tower-service", -] - [[package]] name = "axum" version = "0.7.5" @@ -297,14 +246,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" dependencies = [ "async-trait", - "axum-core 0.4.3", + "axum-core", "axum-macros", "bytes", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", - "hyper 1.4.1", + "hyper", "hyper-util", "itoa", "matchit", @@ -325,23 +274,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "axum-core" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http 0.2.12", - "http-body 0.4.6", - "mime", - "rustversion", - "tower-layer", - "tower-service", -] - [[package]] name = "axum-core" version = "0.4.3" @@ -351,8 +283,8 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", "mime", "pin-project-lite", @@ -377,14 +309,11 @@ dependencies = [ [[package]] name = "backon" -version = "0.4.4" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d67782c3f868daa71d3533538e98a8e13713231969def7536e8039606fc46bf0" +checksum = "33e5b65cc81d81fbb8488f36458ab4771be35a722967bbc959df28b47397e3ff" dependencies = [ - "fastrand 2.1.0", - "futures-core", - "pin-project", - "tokio", + "fastrand", ] [[package]] @@ -464,7 +393,7 @@ dependencies = [ "lazycell", "log", "peeking_take_while", - "prettyplease 0.2.20", + "prettyplease", "proc-macro2", "quote", "regex", @@ -625,12 +554,6 @@ dependencies = [ "syn_derive", ] -[[package]] -name = "bs58" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" - [[package]] name = "bs58" version = "0.5.1" @@ -710,37 +633,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "camino" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" -dependencies = [ - "camino", - "cargo-platform", - "semver", - "serde", - "serde_json", -] - [[package]] name = "cast" version = "0.3.0" @@ -806,8 +698,19 @@ name = "ciborium" version = "0.2.0" source = "git+https://github.com/qrayven/ciborium?branch=feat-ser-null-as-undefined#5fbba76d132caf04cd1f271336d9daafdc747f10" dependencies = [ - "ciborium-io", - "ciborium-ll", + "ciborium-io 0.2.0", + "ciborium-ll 0.2.0", + "serde", +] + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io 0.2.2", + "ciborium-ll 0.2.2", "serde", ] @@ -816,13 +719,29 @@ name = "ciborium-io" version = "0.2.0" source = "git+https://github.com/qrayven/ciborium?branch=feat-ser-null-as-undefined#5fbba76d132caf04cd1f271336d9daafdc747f10" +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + [[package]] name = "ciborium-ll" version = "0.2.0" source = "git+https://github.com/qrayven/ciborium?branch=feat-ser-null-as-undefined#5fbba76d132caf04cd1f271336d9daafdc747f10" dependencies = [ - "ciborium-io", - "half", + "ciborium-io 0.2.0", + "half 1.8.3", +] + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io 0.2.2", + "half 2.4.1", ] [[package]] @@ -846,17 +765,6 @@ dependencies = [ "libloading", ] -[[package]] -name = "clap" -version = "2.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" -dependencies = [ - "bitflags 1.3.2", - "textwrap", - "unicode-width", -] - [[package]] name = "clap" version = "4.5.16" @@ -924,22 +832,22 @@ dependencies = [ [[package]] name = "console-api" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd326812b3fd01da5bb1af7d340d0d555fd3d4b641e7f1dfcf5962a902952787" +checksum = "86ed14aa9c9f927213c6e4f3ef75faaad3406134efe84ba2cb7983431d5f0931" dependencies = [ "futures-core", - "prost 0.12.6", - "prost-types 0.12.6", - "tonic 0.10.2", + "prost", + "prost-types", + "tonic", "tracing-core", ] [[package]] name = "console-subscriber" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7481d4c57092cd1c19dd541b92bdce883de840df30aa5d03fd48a3935c01842e" +checksum = "e2e3a111a37f3333946ebf9da370ba5c5577b18eb342ec683eb488dd21980302" dependencies = [ "console-api", "crossbeam-channel", @@ -947,13 +855,15 @@ dependencies = [ "futures-task", "hdrhistogram", "humantime", - "prost-types 0.12.6", + "hyper-util", + "prost", + "prost-types", "serde", "serde_json", "thread_local", "tokio", "tokio-stream", - "tonic 0.10.2", + "tonic", "tracing", "tracing-core", "tracing-subscriber", @@ -1019,24 +929,24 @@ dependencies = [ [[package]] name = "criterion" -version = "0.3.6" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b01d6de93b2b6c65e17c634a26653a29d107b3c98c607c765bf38d041531cd8f" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" dependencies = [ - "atty", + "anes", "cast", - "clap 2.34.0", + "ciborium 0.2.2", + "clap", "criterion-plot", - "csv", + "is-terminal", "itertools 0.10.5", - "lazy_static", "num-traits", + "once_cell", "oorandom", "plotters", "rayon", "regex", "serde", - "serde_cbor", "serde_derive", "serde_json", "tinytemplate", @@ -1045,9 +955,9 @@ dependencies = [ [[package]] name = "criterion-plot" -version = "0.4.5" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2673cc8207403546f45f5fd319a974b1e6983ad1a3ee7e6041650013be041876" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" dependencies = [ "cast", "itertools 0.10.5", @@ -1087,6 +997,12 @@ version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + [[package]] name = "crypto-common" version = "0.1.6" @@ -1097,27 +1013,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "csv" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" -dependencies = [ - "csv-core", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "csv-core" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" -dependencies = [ - "memchr", -] - [[package]] name = "curve25519-dalek" version = "4.1.3" @@ -1152,13 +1047,13 @@ dependencies = [ "dapi-grpc-macros", "futures-core", "platform-version", - "prost 0.12.6", + "prost", "serde", "serde_bytes", "serde_json", "tenderdash-proto", - "tonic 0.11.0", - "tonic-build 0.9.2", + "tonic", + "tonic-build", ] [[package]] @@ -1215,13 +1110,13 @@ dependencies = [ "base64 0.22.1", "bip37-bloom-filter", "chrono", - "ciborium", - "clap 4.5.16", + "ciborium 0.2.0", + "clap", "dapi-grpc", "dapi-grpc-macros", "dashcore-rpc", "data-contracts", - "derive_more", + "derive_more 1.0.0", "dotenvy", "dpp", "drive", @@ -1229,14 +1124,14 @@ dependencies = [ "envy", "futures", "hex", - "http 0.2.12", + "http", "lru", "pollster", "rs-dapi-client", "sanitize-filename", "serde", "serde_json", - "test-case 3.3.1", + "test-case", "thiserror", "tokio", "tokio-test", @@ -1333,13 +1228,13 @@ dependencies = [ [[package]] name = "delegate" -version = "0.9.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d358e0ec5c59a5e1603b933def447096886121660fc680dc1e64a0753981fe3c" +checksum = "5060bb0febb73fa907273f8a7ed17ab4bf831d585eac835b28ec24a1e2460956" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.75", ] [[package]] @@ -1387,16 +1282,31 @@ dependencies = [ ] [[package]] -name = "diff" -version = "0.1.13" +name = "derive_more" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl", +] [[package]] -name = "difflib" -version = "0.4.0" +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.75", + "unicode-xid", +] + +[[package]] +name = "diff" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] name = "digest" @@ -1452,27 +1362,27 @@ dependencies = [ "base64 0.22.1", "bincode", "bls-signatures", - "bs58 0.4.0", + "bs58", "byteorder", "chrono", - "ciborium", + "ciborium 0.2.0", "dashcore", "data-contracts", - "derive_more", + "derive_more 1.0.0", "dpp", "ed25519-dalek", - "env_logger 0.9.3", + "env_logger 0.11.5", "getrandom", "hex", "indexmap 2.4.0", "integer-encoding", - "itertools 0.12.1", + "itertools 0.13.0", "json-schema-compatibility-validator", "jsonschema", "lazy_static", "log", "nohash-hasher", - "num_enum", + "num_enum 0.7.3", "once_cell", "platform-serialization", "platform-serialization-derive", @@ -1488,8 +1398,8 @@ dependencies = [ "serde_json", "serde_repr", "sha2", - "strum 0.25.0", - "test-case 2.2.2", + "strum", + "test-case", "thiserror", "tokio", ] @@ -1502,12 +1412,12 @@ dependencies = [ "assert_matches", "base64 0.22.1", "bincode", - "bs58 0.5.1", + "bs58", "byteorder", "chrono", - "ciborium", + "ciborium 0.2.0", "criterion", - "derive_more", + "derive_more 1.0.0", "dpp", "enum-map", "grovedb", @@ -1520,7 +1430,7 @@ dependencies = [ "indexmap 2.4.0", "integer-encoding", "intmap", - "itertools 0.11.0", + "itertools 0.13.0", "moka", "nohash-hasher", "once_cell", @@ -1542,18 +1452,17 @@ dependencies = [ "arc-swap", "assert_matches", "async-trait", - "atty", "base64 0.22.1", "bincode", - "bs58 0.5.1", + "bs58", "chrono", - "ciborium", - "clap 4.5.16", + "ciborium 0.2.0", + "clap", "console-subscriber", "dapi-grpc", "dashcore-rpc", "delegate", - "derive_more", + "derive_more 1.0.0", "dotenvy", "dpp", "drive", @@ -1563,13 +1472,13 @@ dependencies = [ "hex", "indexmap 2.4.0", "integer-encoding", - "itertools 0.10.5", + "itertools 0.13.0", "lazy_static", "metrics", "metrics-exporter-prometheus", "mockall", "platform-version", - "prost 0.12.6", + "prost", "rand", "regex", "reopen", @@ -1597,7 +1506,7 @@ version = "1.4.0-dev.5" dependencies = [ "bincode", "dapi-grpc", - "derive_more", + "derive_more 1.0.0", "dpp", "drive", "hex", @@ -1692,16 +1601,13 @@ dependencies = [ ] [[package]] -name = "env_logger" -version = "0.9.3" +name = "env_filter" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" +checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" dependencies = [ - "atty", - "humantime", "log", "regex", - "termcolor", ] [[package]] @@ -1717,6 +1623,19 @@ dependencies = [ "termcolor", ] +[[package]] +name = "env_logger" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "humantime", + "log", +] + [[package]] name = "envy" version = "0.4.2" @@ -1743,19 +1662,25 @@ dependencies = [ ] [[package]] -name = "error-chain" -version = "0.12.4" +name = "event-listener" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" dependencies = [ - "version_check", + "concurrent-queue", + "parking", + "pin-project-lite", ] [[package]] -name = "event-listener" -version = "2.5.3" +name = "event-listener-strategy" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +dependencies = [ + "event-listener", + "pin-project-lite", +] [[package]] name = "failure" @@ -1790,15 +1715,6 @@ dependencies = [ "regex-syntax 0.8.4", ] -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - [[package]] name = "fastrand" version = "2.1.0" @@ -1856,15 +1772,6 @@ dependencies = [ "paste", ] -[[package]] -name = "float-cmp" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" -dependencies = [ - "num-traits", -] - [[package]] name = "fnv" version = "1.0.7" @@ -1971,21 +1878,6 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" -[[package]] -name = "futures-lite" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - [[package]] name = "futures-macro" version = "0.3.30" @@ -2068,11 +1960,11 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d91e8f87926c834c7338d0c69a48816c043e0cddf0062a8a567483db2fb1e24" dependencies = [ - "axum 0.7.5", + "axum", "bincode", "bitvec", "blake3", - "derive_more", + "derive_more 0.99.18", "grovedb-costs", "grovedb-merk", "grovedb-path", @@ -2168,7 +2060,7 @@ dependencies = [ "lazy_static", "num_cpus", "rocksdb", - "strum 0.26.3", + "strum", "tempfile", "thiserror", ] @@ -2203,25 +2095,6 @@ dependencies = [ "serde_with 3.9.0", ] -[[package]] -name = "h2" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap 2.4.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "h2" version = "0.4.6" @@ -2233,7 +2106,7 @@ dependencies = [ "fnv", "futures-core", "futures-sink", - "http 1.1.0", + "http", "indexmap 2.4.0", "slab", "tokio", @@ -2247,6 +2120,16 @@ version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -2293,18 +2176,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.1.19" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hermit-abi" @@ -2351,17 +2225,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http" version = "1.1.0" @@ -2373,17 +2236,6 @@ dependencies = [ "itoa", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.0.1" @@ -2391,7 +2243,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.1.0", + "http", ] [[package]] @@ -2402,8 +2254,8 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "http", + "http-body", "pin-project-lite", ] @@ -2415,11 +2267,11 @@ checksum = "08a397c49fec283e3d6211adbe480be95aae5f304cfb923e9970e08956d5168a" [[package]] name = "http-serde" -version = "1.1.3" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f560b665ad9f1572cfcaf034f7fb84338a7ce945216d64a90fd81f046a3caee" +checksum = "0f056c8559e3757392c8d091e796416e4649d8e49e88b8d76df6c002f05027fd" dependencies = [ - "http 0.2.12", + "http", "serde", ] @@ -2441,30 +2293,6 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" -[[package]] -name = "hyper" -version = "0.14.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2 0.5.7", - "tokio", - "tower-service", - "tracing", - "want", -] - [[package]] name = "hyper" version = "1.4.1" @@ -2474,9 +2302,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.6", - "http 1.1.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "httparse", "httpdate", "itoa", @@ -2493,26 +2321,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" dependencies = [ "futures-util", - "http 1.1.0", - "hyper 1.4.1", + "http", + "hyper", "hyper-util", - "rustls 0.23.12", + "rustls", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls", "tower-service", ] [[package]] name = "hyper-timeout" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +checksum = "3203a961e5c83b6f5498933e78b6b263e208c197b63e9c6c53cc82ffd3f63793" dependencies = [ - "hyper 0.14.30", + "hyper", + "hyper-util", "pin-project-lite", "tokio", - "tokio-io-timeout", + "tower-service", ] [[package]] @@ -2523,7 +2352,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.4.1", + "hyper", "hyper-util", "native-tls", "tokio", @@ -2540,11 +2369,11 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "hyper 1.4.1", + "http", + "http-body", + "hyper", "pin-project-lite", - "socket2 0.5.7", + "socket2", "tokio", "tower", "tower-service", @@ -2621,15 +2450,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - [[package]] name = "integer-encoding" version = "4.0.2" @@ -2645,17 +2465,6 @@ dependencies = [ "serde", ] -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi 0.3.9", - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "ipnet" version = "2.9.0" @@ -2699,18 +2508,18 @@ dependencies = [ [[package]] name = "itertools" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] [[package]] name = "itertools" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ "either", ] @@ -2861,12 +2670,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "linux-raw-sys" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" - [[package]] name = "linux-raw-sys" version = "0.4.14" @@ -2914,15 +2717,6 @@ dependencies = [ "libc", ] -[[package]] -name = "mach2" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" -dependencies = [ - "libc", -] - [[package]] name = "masternode-reward-shares-contract" version = "1.4.0-dev.5" @@ -2956,9 +2750,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "metrics" -version = "0.22.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2be3cbd384d4e955b231c895ce10685e3d8260c5ccffae898c96c723b0772835" +checksum = "884adb57038347dfbaf2d5065887b6cf4312330dc8e94bc30a1a839bd79d3261" dependencies = [ "ahash 0.8.11", "portable-atomic", @@ -2966,20 +2760,19 @@ dependencies = [ [[package]] name = "metrics-exporter-prometheus" -version = "0.14.0" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d58e362dc7206e9456ddbcdbd53c71ba441020e62104703075a69151e38d85f" +checksum = "b4f0c8427b39666bf970460908b213ec09b3b350f20c0c2eabcbba51704a08e6" dependencies = [ "base64 0.22.1", "http-body-util", - "hyper 1.4.1", - "hyper-tls", + "hyper", "hyper-util", "indexmap 2.4.0", "ipnet", "metrics", "metrics-util", - "quanta 0.12.3", + "quanta", "thiserror", "tokio", "tracing", @@ -2987,16 +2780,16 @@ dependencies = [ [[package]] name = "metrics-util" -version = "0.16.3" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b07a5eb561b8cbc16be2d216faf7757f9baf3bfb94dbb0fae3df8387a5bb47f" +checksum = "4259040465c955f9f2f1a4a8a16dc46726169bca0f88e8fb2dbeced487c3e828" dependencies = [ "crossbeam-epoch", "crossbeam-utils", "hashbrown 0.14.5", "metrics", "num_cpus", - "quanta 0.12.3", + "quanta", "sketches-ddsketch", ] @@ -3054,14 +2847,13 @@ dependencies = [ [[package]] name = "mockall" -version = "0.11.4" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96" +checksum = "d4c28b3fb6d753d28c20e826cd46ee611fda1cf3cde03a443a974043247c065a" dependencies = [ "cfg-if", "downcast", "fragile", - "lazy_static", "mockall_derive", "predicates", "predicates-tree", @@ -3069,34 +2861,33 @@ dependencies = [ [[package]] name = "mockall_derive" -version = "0.11.4" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" +checksum = "341014e7f530314e9a1fdbc7400b244efea7122662c96bfa248c31da5bfb2020" dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.75", ] [[package]] name = "moka" -version = "0.11.3" +version = "0.12.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa6e72583bf6830c956235bff0d5afec8cf2952f579ebad18ae7821a917d950f" +checksum = "32cf62eb4dd975d2dde76432fb1075c49e3ee2331cf36f1f8fd4b66550d32b6f" dependencies = [ - "async-io", "async-lock", + "async-trait", "crossbeam-channel", "crossbeam-epoch", "crossbeam-utils", + "event-listener", "futures-util", "once_cell", "parking_lot", - "quanta 0.11.1", + "quanta", "rustc_version", - "scheduled-thread-pool", - "skeptic", "smallvec", "tagptr", "thiserror", @@ -3104,12 +2895,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "multimap" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" - [[package]] name = "multimap" version = "0.10.0" @@ -3155,12 +2940,6 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "normalize-line-endings" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" - [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -3283,7 +3062,16 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" dependencies = [ - "num_enum_derive", + "num_enum_derive 0.5.11", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive 0.7.3", ] [[package]] @@ -3298,6 +3086,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.75", +] + [[package]] name = "object" version = "0.36.3" @@ -3512,7 +3312,7 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.75", - "virtue 0.0.14", + "virtue 0.0.17", ] [[package]] @@ -3521,8 +3321,8 @@ version = "1.4.0-dev.5" dependencies = [ "base64 0.22.1", "bincode", - "bs58 0.5.1", - "ciborium", + "bs58", + "ciborium 0.2.0", "hex", "indexmap 2.4.0", "lazy_static", @@ -3592,22 +3392,6 @@ dependencies = [ "plotters-backend", ] -[[package]] -name = "polling" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" -dependencies = [ - "autocfg", - "bitflags 1.3.2", - "cfg-if", - "concurrent-queue", - "libc", - "log", - "pin-project-lite", - "windows-sys 0.48.0", -] - [[package]] name = "pollster" version = "0.3.0" @@ -3637,16 +3421,12 @@ dependencies = [ [[package]] name = "predicates" -version = "2.1.5" +version = "3.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd" +checksum = "7e9086cc7640c29a356d1a29fd134380bee9d8f79a17410aa76e7ad295f42c97" dependencies = [ - "difflib", - "float-cmp", - "itertools 0.10.5", - "normalize-line-endings", + "anstyle", "predicates-core", - "regex", ] [[package]] @@ -3675,16 +3455,6 @@ dependencies = [ "yansi", ] -[[package]] -name = "prettyplease" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" -dependencies = [ - "proc-macro2", - "syn 1.0.109", -] - [[package]] name = "prettyplease" version = "0.2.20" @@ -3723,7 +3493,6 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn 1.0.109", "version_check", ] @@ -3749,62 +3518,30 @@ dependencies = [ [[package]] name = "prost" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" -dependencies = [ - "bytes", - "prost-derive 0.11.9", -] - -[[package]] -name = "prost" -version = "0.12.6" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +checksum = "e13db3d3fde688c61e2446b4d843bc27a7e8af269a69440c0308021dc92333cc" dependencies = [ "bytes", - "prost-derive 0.12.6", + "prost-derive", ] [[package]] name = "prost-build" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" -dependencies = [ - "bytes", - "heck 0.4.1", - "itertools 0.10.5", - "lazy_static", - "log", - "multimap 0.8.3", - "petgraph", - "prettyplease 0.1.25", - "prost 0.11.9", - "prost-types 0.11.9", - "regex", - "syn 1.0.109", - "tempfile", - "which", -] - -[[package]] -name = "prost-build" -version = "0.12.6" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" +checksum = "5bb182580f71dd070f88d01ce3de9f4da5021db7115d2e1c3605a754153b77c1" dependencies = [ "bytes", "heck 0.5.0", - "itertools 0.12.1", + "itertools 0.13.0", "log", - "multimap 0.10.0", + "multimap", "once_cell", "petgraph", - "prettyplease 0.2.20", - "prost 0.12.6", - "prost-types 0.12.6", + "prettyplease", + "prost", + "prost-types", "regex", "syn 2.0.75", "tempfile", @@ -3812,25 +3549,12 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" -dependencies = [ - "anyhow", - "itertools 0.10.5", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "prost-derive" -version = "0.12.6" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" +checksum = "18bec9b0adc4eba778b33684b7ba3e7137789434769ee3ce3930463ef904cfca" dependencies = [ "anyhow", - "itertools 0.12.1", + "itertools 0.13.0", "proc-macro2", "quote", "syn 2.0.75", @@ -3838,20 +3562,11 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" -dependencies = [ - "prost 0.11.9", -] - -[[package]] -name = "prost-types" -version = "0.12.6" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" +checksum = "cee5168b05f49d4b0ca581206eb14a7b22fafd963efe729ac48eb03266e25cc2" dependencies = [ - "prost 0.12.6", + "prost", ] [[package]] @@ -3874,33 +3589,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "pulldown-cmark" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" -dependencies = [ - "bitflags 2.6.0", - "memchr", - "unicase", -] - -[[package]] -name = "quanta" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab" -dependencies = [ - "crossbeam-utils", - "libc", - "mach2", - "once_cell", - "raw-cpuid 10.7.0", - "wasi", - "web-sys", - "winapi", -] - [[package]] name = "quanta" version = "0.12.3" @@ -3910,7 +3598,7 @@ dependencies = [ "crossbeam-utils", "libc", "once_cell", - "raw-cpuid 11.1.0", + "raw-cpuid", "wasi", "web-sys", "winapi", @@ -3961,15 +3649,6 @@ dependencies = [ "getrandom", ] -[[package]] -name = "raw-cpuid" -version = "10.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "raw-cpuid" version = "11.1.0" @@ -4082,11 +3761,11 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.4.6", - "http 1.1.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "http-body-util", - "hyper 1.4.1", + "hyper", "hyper-rustls", "hyper-tls", "hyper-util", @@ -4246,20 +3925,6 @@ dependencies = [ "semver", ] -[[package]] -name = "rustix" -version = "0.37.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys 0.48.0", -] - [[package]] name = "rustix" version = "0.38.34" @@ -4269,24 +3934,10 @@ dependencies = [ "bitflags 2.6.0", "errno", "libc", - "linux-raw-sys 0.4.14", + "linux-raw-sys", "windows-sys 0.52.0", ] -[[package]] -name = "rustls" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" -dependencies = [ - "log", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - [[package]] name = "rustls" version = "0.23.12" @@ -4382,15 +4033,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "scheduled-thread-pool" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19" -dependencies = [ - "parking_lot", -] - [[package]] name = "scopeguard" version = "1.2.0" @@ -4452,9 +4094,6 @@ name = "semver" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" -dependencies = [ - "serde", -] [[package]] name = "serde" @@ -4484,16 +4123,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_cbor" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" -dependencies = [ - "half", - "serde", -] - [[package]] name = "serde_derive" version = "1.0.208" @@ -4695,21 +4324,6 @@ dependencies = [ "dpp", ] -[[package]] -name = "skeptic" -version = "0.13.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d23b015676c90a0f01c197bfdc786c20342c73a0afdda9025adb0bc42940a8" -dependencies = [ - "bytecount", - "cargo_metadata", - "error-chain", - "glob", - "pulldown-cmark", - "tempfile", - "walkdir", -] - [[package]] name = "sketches-ddsketch" version = "0.2.2" @@ -4731,16 +4345,6 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" -[[package]] -name = "socket2" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "socket2" version = "0.5.7" @@ -4801,35 +4405,13 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" -[[package]] -name = "strum" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" -dependencies = [ - "strum_macros 0.25.3", -] - [[package]] name = "strum" version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" dependencies = [ - "strum_macros 0.26.4", -] - -[[package]] -name = "strum_macros" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.75", + "strum_macros", ] [[package]] @@ -4961,22 +4543,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" dependencies = [ "cfg-if", - "fastrand 2.1.0", + "fastrand", "once_cell", - "rustix 0.38.34", + "rustix", "windows-sys 0.59.0", ] [[package]] name = "tenderdash-abci" -version = "1.2.0+1.3.0" -source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v1.2.0+1.3.0#79b1bcc141f8285fe9b5022f8288b4c49ddfbb0c" +version = "1.2.1+1.3.0" +source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v1.2.1+1.3.0#aad72f4d25816bdf0f584ee4ba3cd383addf8a33" dependencies = [ "bytes", "futures", "hex", "lhash", - "prost 0.12.6", "semver", "serde_json", "tenderdash-proto", @@ -4991,33 +4572,33 @@ dependencies = [ [[package]] name = "tenderdash-proto" -version = "1.2.0+1.3.0" -source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v1.2.0+1.3.0#79b1bcc141f8285fe9b5022f8288b4c49ddfbb0c" +version = "1.2.1+1.3.0" +source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v1.2.1+1.3.0#aad72f4d25816bdf0f584ee4ba3cd383addf8a33" dependencies = [ "bytes", "chrono", - "derive_more", + "derive_more 1.0.0", "flex-error", "num-derive", "num-traits", - "prost 0.12.6", + "prost", "serde", "subtle-encoding", "tenderdash-proto-compiler", "time", - "tonic 0.11.0", + "tonic", ] [[package]] name = "tenderdash-proto-compiler" -version = "1.2.0+1.3.0" -source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v1.2.0+1.3.0#79b1bcc141f8285fe9b5022f8288b4c49ddfbb0c" +version = "1.2.1+1.3.0" +source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v1.2.1+1.3.0#aad72f4d25816bdf0f584ee4ba3cd383addf8a33" dependencies = [ "fs_extra", - "prost-build 0.12.6", + "prost-build", "regex", "tempfile", - "tonic-build 0.11.0", + "tonic-build", "ureq", "walkdir", "zip 2.2.0", @@ -5038,22 +4619,13 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" -[[package]] -name = "test-case" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21d6cf5a7dffb3f9dceec8e6b8ca528d9bd71d36c9f074defb548ce161f598c0" -dependencies = [ - "test-case-macros 2.2.2", -] - [[package]] name = "test-case" version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb2550dd13afcd286853192af8601920d959b14c401fcece38071d53bf0768a8" dependencies = [ - "test-case-macros 3.3.1", + "test-case-macros", ] [[package]] @@ -5068,19 +4640,6 @@ dependencies = [ "syn 2.0.75", ] -[[package]] -name = "test-case-macros" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e45b7bf6e19353ddd832745c8fcf77a17a93171df7151187f26623f2b75b5b26" -dependencies = [ - "cfg-if", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "test-case-macros" version = "3.3.1" @@ -5093,15 +4652,6 @@ dependencies = [ "test-case-core", ] -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - [[package]] name = "thiserror" version = "1.0.64" @@ -5201,22 +4751,12 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.7", + "socket2", "tokio-macros", "tracing", "windows-sys 0.52.0", ] -[[package]] -name = "tokio-io-timeout" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" -dependencies = [ - "pin-project-lite", - "tokio", -] - [[package]] name = "tokio-macros" version = "2.4.0" @@ -5238,24 +4778,13 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-rustls" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" -dependencies = [ - "rustls 0.22.4", - "rustls-pki-types", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.12", + "rustls", "rustls-pki-types", "tokio", ] @@ -5355,55 +4884,30 @@ dependencies = [ [[package]] name = "tonic" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" -dependencies = [ - "async-stream", - "async-trait", - "axum 0.6.20", - "base64 0.21.7", - "bytes", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.30", - "hyper-timeout", - "percent-encoding", - "pin-project", - "prost 0.12.6", - "tokio", - "tokio-stream", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tonic" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76c4eb7a4e9ef9d4763600161f12f5070b92a578e1b634db88a6887844c91a13" +checksum = "38659f4a91aba8598d27821589f5db7dddd94601e7a01b1e485a50e5484c7401" dependencies = [ "async-stream", "async-trait", - "axum 0.6.20", - "base64 0.21.7", + "axum", + "base64 0.22.1", "bytes", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.30", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", "hyper-timeout", + "hyper-util", "percent-encoding", "pin-project", - "prost 0.12.6", + "prost", "rustls-native-certs", "rustls-pemfile", - "rustls-pki-types", + "socket2", "tokio", - "tokio-rustls 0.25.0", + "tokio-rustls", "tokio-stream", "tower", "tower-layer", @@ -5414,26 +4918,13 @@ dependencies = [ [[package]] name = "tonic-build" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6fdaae4c2c638bb70fe42803a26fbd6fc6ac8c72f5c59f67ecc2a2dcabf4b07" -dependencies = [ - "prettyplease 0.1.25", - "proc-macro2", - "prost-build 0.11.9", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "tonic-build" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4ef6dd70a610078cb4e338a0f79d06bc759ff1b22d2120c2ff02ae264ba9c2" +checksum = "568392c5a2bd0020723e3f387891176aabafe36fd9fcd074ad309dfa0c8eb964" dependencies = [ - "prettyplease 0.2.20", + "prettyplease", "proc-macro2", - "prost-build 0.12.6", + "prost-build", "quote", "syn 2.0.75", ] @@ -5466,8 +4957,8 @@ dependencies = [ "bitflags 2.6.0", "bytes", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", "http-range-header", "httpdate", @@ -5575,9 +5066,9 @@ checksum = "e2ce481b2b7c2534fe7b5242cccebf37f9084392665c6a3783c414a1bada5432" [[package]] name = "triomphe" -version = "0.1.13" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6631e42e10b40c0690bf92f404ebcfe6e1fdb480391d15f17cc8e96eeed5369" +checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3" [[package]] name = "try-lock" @@ -5621,12 +5112,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-width" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" - [[package]] name = "unicode-xid" version = "0.2.5" @@ -5649,7 +5134,7 @@ dependencies = [ "flate2", "log", "once_cell", - "rustls 0.23.12", + "rustls", "rustls-pki-types", "url", "webpki-roots", @@ -5719,15 +5204,9 @@ checksum = "9dcc60c0624df774c82a0ef104151231d37da4962957d691c011c852b2473314" [[package]] name = "virtue" -version = "0.0.14" +version = "0.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b522f715ead3537dc57c9907899a08e461a8f1e87fc8414a4a89bbd9854289ff" - -[[package]] -name = "waker-fn" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" +checksum = "7302ac74a033bf17b6e609ceec0f891ca9200d502d31f02dc7908d3d98767c9d" [[package]] name = "walkdir" @@ -5829,10 +5308,10 @@ dependencies = [ "bincode", "dpp", "hex", - "itertools 0.10.5", + "itertools 0.13.0", "js-sys", "log", - "num_enum", + "num_enum 0.7.3", "paste", "serde", "serde-wasm-bindgen", @@ -5883,7 +5362,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.34", + "rustix", ] [[package]] @@ -6126,7 +5605,7 @@ dependencies = [ name = "withdrawals-contract" version = "1.4.0-dev.5" dependencies = [ - "num_enum", + "num_enum 0.5.11", "platform-value", "platform-version", "serde", diff --git a/Dockerfile b/Dockerfile index a96488115b..5039a062b6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,7 +30,7 @@ # SCCACHE_SERVER_PORT port to avoid conflicts in case of parallel compilation ARG ALPINE_VERSION=3.18 -ARG PROTOC_VERSION=25.2 +ARG PROTOC_VERSION=27.3 ARG RUSTC_WRAPPER # diff --git a/README.md b/README.md index fd688fbc88..46e02e1db7 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ this repository may be used on the following networks: - [node.js](https://nodejs.org/) v20 - [docker](https://docs.docker.com/get-docker/) v20.10+ - [rust](https://www.rust-lang.org/tools/install) v1.80+, with wasm32 target (`rustup target add wasm32-unknown-unknown`) - - [protoc - protobuf compiler](https://github.com/protocolbuffers/protobuf/releases) v25.2+ + - [protoc - protobuf compiler](https://github.com/protocolbuffers/protobuf/releases) v27.3+ - if needed, set PROTOC environment variable to location of `protoc` binary - [wasm-bingen toolchain](https://rustwasm.github.io/wasm-bindgen/): - **IMPORTANT (OSX only)**: built-in `llvm` on OSX does not work, needs to be installed from brew: diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index 9e3e1bb031..cce2d64890 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -33,23 +33,23 @@ serde = ["dep:serde", "dep:serde_bytes"] mocks = ["serde", "dep:serde_json"] [dependencies] -prost = { version = "0.12.3" } +prost = { version = "0.13" } futures-core = "0.3.30" -tonic = { version = "0.11", features = [ +tonic = { version = "0.12", features = [ "codegen", "prost", ], default-features = false } serde = { version = "1.0.197", optional = true, features = ["derive"] } serde_bytes = { version = "0.11.12", optional = true } serde_json = { version = "1.0", optional = true } -tenderdash-proto = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "1.2.0+1.3.0", tag = "v1.2.0+1.3.0", default-features = false, features = [ +tenderdash-proto = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "1.2.1", tag = "v1.2.1+1.3.0", default-features = false, features = [ "grpc", ] } dapi-grpc-macros = { path = "../rs-dapi-grpc-macros" } platform-version = { path = "../rs-platform-version" } [build-dependencies] -tonic-build = { version = "0.9.2" } +tonic-build = { version = "0.12" } [lib] diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index bb70c75025..d28af7e02b 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -18,16 +18,15 @@ dump = ["mocks"] # skip tests that require connection to the platform; enabled by default offline-testing = [] - [dependencies] -backon = "0.4.1" +backon = "0.5" dapi-grpc = { path = "../dapi-grpc" } futures = "0.3.28" -http-serde = { version = "1.1.3", optional = true } +http-serde = { version = "2.1", optional = true } rand = { version = "0.8.5", features = ["small_rng"] } thiserror = "1.0.64" tracing = "0.1.40" -tokio = { version = "1.32.0", default-features = false } +tokio = { version = "1.40", default-features = false } sha2 = { version = "0.10", optional = true } hex = { version = "0.4.3", optional = true } lru = { version = "0.12.3" } @@ -35,4 +34,4 @@ serde = { version = "1.0.197", optional = true, features = ["derive"] } serde_json = { version = "1.0.120", optional = true } chrono = { version = "0.4.38", features = ["serde"] } [dev-dependencies] -tokio = { version = "1.32.0", features = ["macros"] } +tokio = { version = "1.40", features = ["macros"] } diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index 42d01e1774..7d6a4c9eb6 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -9,8 +9,8 @@ description = "Macros used by dapi-grpc. Internal use only." proc-macro = true [dependencies] -quote = "1.0.33" -syn = "2.0.38" +quote = "1.0.37" +syn = "2.0.75" heck = "0.5.0" [dev-dependencies] diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 0403a23c8d..cbfa3c1ff4 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -16,7 +16,7 @@ anyhow = { version = "1.0.81" } async-trait = { version = "0.1.79" } base64 = "0.22.1" bls-signatures = { git = "https://github.com/dashpay/bls-signatures", tag = "v1.3.1", optional = true } -bs58 = "0.4.0" +bs58 = "0.5" byteorder = { version = "1.4" } chrono = { version = "0.4.35", default-features = false, features = [ "wasmbind", @@ -30,19 +30,19 @@ dashcore = { git = "https://github.com/dashpay/rust-dashcore", features = [ "signer", "serde", ], default-features = false, branch = "master" } -env_logger = { version = "0.9" } +env_logger = { version = "0.11" } getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4" } integer-encoding = { version = "4.0.0" } -itertools = { version = "0.12.1" } +itertools = { version = "0.13" } jsonschema = { git = "https://github.com/dashpay/jsonschema-rs", branch = "configure_regexp", default-features = false, features = [ "draft202012", ], optional = true } lazy_static = { version = "1.4" } log = { version = "0.4.6" } -num_enum = "0.5.7" +num_enum = "0.7" bincode = { version = "2.0.0-rc.3", features = ["serde"] } -rand = { version = "0.8.4", features = ["small_rng"] } +rand = { version = "0.8.5", features = ["small_rng"] } regex = { version = "1.10.4" } serde = { version = "1.0.197", features = ["derive"] } serde_json = { version = "1.0", features = ["preserve_order"] } @@ -55,21 +55,19 @@ platform-version = { path = "../rs-platform-version" } platform-versioning = { path = "../rs-platform-versioning" } platform-serialization = { path = "../rs-platform-serialization" } platform-serialization-derive = { path = "../rs-platform-serialization-derive" } -derive_more = "0.99.17" -ed25519-dalek = { version = "2.0.0-rc.2", features = [ - "rand_core", -], optional = true } +derive_more = { version = "1.0", features = ["from", "display"] } +ed25519-dalek = { version = "2.1", features = ["rand_core"], optional = true } nohash-hasher = "0.2.0" rust_decimal = "1.29.1" rust_decimal_macros = "1.29.1" indexmap = { version = "2.0.2", features = ["serde"] } -strum = { version = "0.25.0", features = ["derive"] } +strum = { version = "0.26", features = ["derive"] } json-schema-compatibility-validator = { path = '../rs-json-schema-compatibility-validator' } once_cell = "1.19.0" [dev-dependencies] -test-case = { version = "2.0" } -tokio = { version = "1.17", features = ["full"] } +test-case = { version = "3.3" } +tokio = { version = "1.40", features = ["full"] } pretty_assertions = { version = "1.4.1" } dpp = { path = ".", features = ["all_features_without_client"] } assert_matches = "1.5.0" diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/mod.rs index 25dd569fb3..6d80cc2d87 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/mod.rs @@ -37,7 +37,7 @@ use std::collections::BTreeMap; derive(Serialize, Deserialize) )] pub enum DocumentBaseTransition { - #[display(fmt = "V0({})", "_0")] + #[display("V0({})", "_0")] V0(DocumentBaseTransitionV0), } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs index 8392b81223..f5b245bece 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs @@ -35,7 +35,7 @@ use crate::{data_contract::DataContract, errors::ProtocolError}; serde(rename_all = "camelCase") )] #[display( - fmt = "ID: {}, Type: {}, Contract ID: {}", + "ID: {}, Type: {}, Contract ID: {}", "id", "document_type_name", "data_contract_id" diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs index 2af4a2174f..cde6d5ae29 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs @@ -22,7 +22,7 @@ pub use v0::DocumentCreateTransitionV0; derive(Serialize, Deserialize) )] pub enum DocumentCreateTransition { - #[display(fmt = "V0({})", "_0")] + #[display("V0({})", "_0")] V0(DocumentCreateTransitionV0), } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs index b15cdf0e59..27c968b20b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs @@ -52,7 +52,7 @@ pub use super::super::document_base_transition::IDENTIFIER_FIELDS; derive(Serialize, Deserialize), serde(rename_all = "camelCase") )] -#[display(fmt = "Base: {}, Entropy: {:?}, Data: {:?}", "base", "entropy", "data")] +#[display("Base: {}, Entropy: {:?}, Data: {:?}", "base", "entropy", "data")] pub struct DocumentCreateTransitionV0 { /// Document Base Transition #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/mod.rs index 7a0f8fb2a6..0ca94ce886 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/mod.rs @@ -14,6 +14,6 @@ pub use v0::*; derive(Serialize, Deserialize) )] pub enum DocumentDeleteTransition { - #[display(fmt = "V0({})", "_0")] + #[display("V0({})", "_0")] V0(DocumentDeleteTransitionV0), } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/mod.rs index 813ea0b2dd..34d4ac9855 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/mod.rs @@ -17,7 +17,7 @@ pub use super::super::document_base_transition::IDENTIFIER_FIELDS; derive(Serialize, Deserialize), serde(rename_all = "camelCase") )] -#[display(fmt = "Base: {}", "base")] +#[display("Base: {}", "base")] pub struct DocumentDeleteTransitionV0 { #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] pub base: DocumentBaseTransition, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/mod.rs index 9a5664cfaa..97ee83ec73 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/mod.rs @@ -14,6 +14,6 @@ pub use v0::*; derive(Serialize, Deserialize) )] pub enum DocumentPurchaseTransition { - #[display(fmt = "V0({})", "_0")] + #[display("V0({})", "_0")] V0(DocumentPurchaseTransitionV0), } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/mod.rs index 255310c394..5a4ca1e8ba 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/mod.rs @@ -19,7 +19,7 @@ pub use super::super::document_base_transition::IDENTIFIER_FIELDS; derive(Serialize, Deserialize), serde(rename_all = "camelCase") )] -#[display(fmt = "Base: {}", "base")] +#[display("Base: {}", "base")] pub struct DocumentPurchaseTransitionV0 { #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] pub base: DocumentBaseTransition, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs index 8e805318b5..e5dd1e7715 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs @@ -21,7 +21,7 @@ pub use v0::*; derive(Serialize, Deserialize) )] pub enum DocumentReplaceTransition { - #[display(fmt = "V0({})", "_0")] + #[display("V0({})", "_0")] V0(DocumentReplaceTransitionV0), } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs index 2c7f96e8e4..13833cabaf 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs @@ -31,7 +31,7 @@ mod property_names { derive(Serialize, Deserialize), serde(rename_all = "camelCase") )] -#[display(fmt = "Base: {}, Revision: {}, Data: {:?}", "base", "revision", "data")] +#[display("Base: {}, Revision: {}, Data: {:?}", "base", "revision", "data")] pub struct DocumentReplaceTransitionV0 { #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] pub base: DocumentBaseTransition, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/mod.rs index e2185f76b0..d784dca011 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/mod.rs @@ -14,6 +14,6 @@ pub use v0::*; derive(Serialize, Deserialize) )] pub enum DocumentTransferTransition { - #[display(fmt = "V0({})", "_0")] + #[display("V0({})", "_0")] V0(DocumentTransferTransitionV0), } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/mod.rs index c51f80cdb7..3708794cf7 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/mod.rs @@ -25,7 +25,7 @@ mod property_names { serde(rename_all = "camelCase") )] #[display( - fmt = "Base: {}, Revision: {}, Recipient: {:?}", + "Base: {}, Revision: {}, Recipient: {:?}", "base", "revision", "recipient_owner_id" diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/mod.rs index 25a16a09ae..e85c1513db 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/mod.rs @@ -14,6 +14,6 @@ pub use v0::*; derive(Serialize, Deserialize) )] pub enum DocumentUpdatePriceTransition { - #[display(fmt = "V0({})", "_0")] + #[display("V0({})", "_0")] V0(DocumentUpdatePriceTransitionV0), } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs index fe1e11cae1..8e264bba97 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs @@ -23,7 +23,7 @@ mod property_names { derive(Serialize, Deserialize), serde(rename_all = "camelCase") )] -#[display(fmt = "Base: {}, Revision: {}, Price: {}", "base", "revision", "price")] +#[display("Base: {}, Revision: {}, Price: {}", "base", "revision", "price")] pub struct DocumentUpdatePriceTransitionV0 { #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] pub base: DocumentBaseTransition, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs index 00e566b2a8..448dffcfea 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs @@ -76,22 +76,22 @@ pub trait DocumentTransitionV0Methods { derive(Serialize, Deserialize) )] pub enum DocumentTransition { - #[display(fmt = "CreateDocumentTransition({})", "_0")] + #[display("CreateDocumentTransition({})", "_0")] Create(DocumentCreateTransition), - #[display(fmt = "ReplaceDocumentTransition({})", "_0")] + #[display("ReplaceDocumentTransition({})", "_0")] Replace(DocumentReplaceTransition), - #[display(fmt = "DeleteDocumentTransition({})", "_0")] + #[display("DeleteDocumentTransition({})", "_0")] Delete(DocumentDeleteTransition), - #[display(fmt = "TransferDocumentTransition({})", "_0")] + #[display("TransferDocumentTransition({})", "_0")] Transfer(DocumentTransferTransition), - #[display(fmt = "UpdatePriceDocumentTransition({})", "_0")] + #[display("UpdatePriceDocumentTransition({})", "_0")] UpdatePrice(DocumentUpdatePriceTransition), - #[display(fmt = "PurchaseDocumentTransition({})", "_0")] + #[display("PurchaseDocumentTransition({})", "_0")] Purchase(DocumentPurchaseTransition), } diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index f3e3ab341c..e9b6ac225f 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -33,8 +33,8 @@ dpp = { path = "../rs-dpp", features = ["abci"] } simple-signer = { path = "../simple-signer" } rust_decimal = "1.2.5" rust_decimal_macros = "1.25.0" -mockall = { version = "0.11", optional = true } -prost = { version = "0.12", default-features = false } +mockall = { version = "0.13", optional = true } +prost = { version = "0.13", default-features = false } tracing = { version = "0.1.37", default-features = false, features = [] } clap = { version = "4.4.10", features = ["derive"] } envy = { version = "0.4.2" } @@ -49,30 +49,31 @@ tracing-subscriber = { version = "0.3.16", default-features = false, features = "registry", "tracing-log", ], optional = false } -atty = { version = "0.2.14", optional = false } -tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "1.2.0+1.3.0", tag = "v1.2.0+1.3.0", features = [ +tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "1.2.1", tag = "v1.2.1+1.3.0", features = [ "grpc", ] } lazy_static = "1.4.0" -itertools = { version = "0.10.5" } +itertools = { version = "0.13" } file-rotate = { version = "0.7.3" } reopen = { version = "1.0.3" } -delegate = { version = "0.9.0" } +delegate = { version = "0.13" } regex = { version = "1.8.1" } -metrics = { version = "0.22.3" } -metrics-exporter-prometheus = { version = "0.14.0" } +metrics = { version = "0.23" } +metrics-exporter-prometheus = { version = "0.15", default-features = false, features = [ + "http-listener", +] } url = { version = "2.3.1" } ureq = { "version" = "2.6.2" } -tokio = { version = "1.36", features = [ +tokio = { version = "1.40", features = [ "macros", "signal", "rt-multi-thread", "time", ] } -tokio-util = { version = "0.7.8" } -derive_more = "0.99.17" +tokio-util = { version = "0.7" } +derive_more = { version = "1.0", features = ["from", "deref", "deref_mut"] } async-trait = "0.1.77" -console-subscriber = { version = "0.2.0", optional = true } +console-subscriber = { version = "0.4", optional = true } [dev-dependencies] bs58 = { version = "0.5.0" } diff --git a/packages/rs-drive-abci/src/logging/logger.rs b/packages/rs-drive-abci/src/logging/logger.rs index 121ce76b93..6646a783c8 100644 --- a/packages/rs-drive-abci/src/logging/logger.rs +++ b/packages/rs-drive-abci/src/logging/logger.rs @@ -5,7 +5,7 @@ use crate::logging::{LogConfigs, LogFormat, LogLevel}; use lazy_static::__Deref; use std::collections::HashMap; use std::fmt::Debug; -use std::io::Write; +use std::io::{IsTerminal, Write}; use std::sync::Arc; use std::sync::Mutex; use tracing_subscriber::fmt; @@ -305,9 +305,9 @@ impl Logger { fn layer(&self) -> Result, Error> { let ansi = self .color - .unwrap_or(match self.destination.lock().unwrap().deref() { - LogDestinationWriter::StdOut => atty::is(atty::Stream::Stdout), - LogDestinationWriter::StdErr => atty::is(atty::Stream::Stderr), + .unwrap_or_else(|| match self.destination.lock().unwrap().deref() { + LogDestinationWriter::StdOut => std::io::stdout().is_terminal(), + LogDestinationWriter::StdErr => std::io::stderr().is_terminal(), _ => false, }); diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 66892cd7fe..73a8df061e 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -33,7 +33,7 @@ dpp = { path = "../rs-dpp", features = [ bincode = { version = "2.0.0-rc.3", features = ["serde"], optional = true } platform-serialization-derive = { path = "../rs-platform-serialization-derive", optional = true } platform-serialization = { path = "../rs-platform-serialization", optional = true } -tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "1.2.0+1.3.0", tag = "v1.2.0+1.3.0", features = [ +tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "1.2.1", tag = "v1.2.1+1.3.0", features = [ "crypto", ], default-features = false } tracing = { version = "0.1.37" } @@ -42,4 +42,4 @@ serde_json = { version = "1.0.103", features = [ "preserve_order", ], optional = true } hex = { version = "0.4.3" } -derive_more = { version = "0.99.11" } +derive_more = { version = "1.0", features = ["from"] } diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index f375298dea..b23408aa9b 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -31,7 +31,7 @@ dpp = { path = "../rs-dpp", features = [ ], default-features = false, optional = true } thiserror = { version = "1.0.63" } tracing = { version = "0.1.37", default-features = false, features = [] } -derive_more = { version = "0.99.17" } +derive_more = { version = "1.0", features = ["from"] } hex = { version = "0.4.3" } # optional dependencies @@ -40,9 +40,10 @@ ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-nul arc-swap = { version = "1.7.0", optional = true } serde = { version = "1.0.197", features = ["derive"], optional = true } rand = { version = "0.8.4", features = ["small_rng"], optional = true } -moka = { version = "0.11.1", features = [ +moka = { version = "0.12", features = [ "future", "futures-util", + "sync", ], optional = true } bs58 = { version = "0.5.0", optional = true } base64 = { version = "0.22.1", optional = true } @@ -50,16 +51,16 @@ tempfile = { version = "3", optional = true } enum-map = { version = "2.0.3", optional = true } intmap = { version = "2.0.0", features = ["serde"], optional = true } chrono = { version = "0.4.35", optional = true } -itertools = { version = "0.11.0", optional = true } +itertools = { version = "0.13", optional = true } grovedb = { version = "2.1.0", optional = true, default-features = false } -grovedb-costs = { version = "2.1.0", optional = true } +grovedb-costs = { version = "2.1.0", optional = true } grovedb-path = { version = "2.1.0" } grovedb-storage = { version = "2.1.0", optional = true } -grovedb-version = { version = "2.1.0"} -grovedb-epoch-based-storage-flags = { version = "2.1.0"} +grovedb-version = { version = "2.1.0" } +grovedb-epoch-based-storage-flags = { version = "2.1.0" } [dev-dependencies] -criterion = "0.3.5" +criterion = "0.5" platform-version = { path = "../rs-platform-version", features = [ "mock-versions", ] } diff --git a/packages/rs-json-schema-compatibility-validator/Cargo.toml b/packages/rs-json-schema-compatibility-validator/Cargo.toml index 99b3b3e1cb..af8e0a8034 100644 --- a/packages/rs-json-schema-compatibility-validator/Cargo.toml +++ b/packages/rs-json-schema-compatibility-validator/Cargo.toml @@ -6,7 +6,7 @@ rust-version.workspace = true authors = ["Ivan Shumkov "] [dependencies] -json-patch = "1.2.0" +json-patch = "1.4" serde_json = "1.0.115" thiserror = "1.0.64" once_cell = "1.19.0" diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index 66c56b6516..6cacd6e794 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -12,6 +12,6 @@ proc-macro = true [dependencies] proc-macro2 = "1.0.56" -virtue = "0.0.14" -quote = "1.0.26" -syn = "2.0.15" +virtue = "0.0.17" +quote = "1.0.37" +syn = "2.0.75" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index db3a876e5d..bae257b3d7 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -11,5 +11,5 @@ license = "MIT" proc-macro = true [dependencies] -quote = "1.0.26" -syn = "2.0.15" +quote = "1.0.37" +syn = "2.0.75" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index b09c7ae36c..696e36ae73 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -9,9 +9,9 @@ license = "MIT" [dependencies] thiserror = { version = "1.0.63" } -bincode = { version = "2.0.0-rc.3"} +bincode = { version = "2.0.0-rc.3" } versioned-feature-core = { git = "https://github.com/dashpay/versioned-feature-core", version = "1.0.0" } -grovedb-version = { version = "2.1.0"} +grovedb-version = { version = "2.1.0" } once_cell = "1.19.0" [features] diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index ad8520f530..89b1f001bb 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -12,5 +12,5 @@ proc-macro = true [dependencies] proc-macro2 = "1.0.56" -quote = "1.0.26" -syn = "2.0.15" +quote = "1.0.37" +syn = "2.0.75" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 7ddcf9eb0a..54a0b909ab 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -4,6 +4,7 @@ version = "1.4.0-dev.5" edition = "2021" [dependencies] + arc-swap = { version = "1.7.1" } dpp = { path = "../rs-dpp", default-features = false, features = [ "dash-sdk-features", @@ -15,11 +16,11 @@ drive = { path = "../rs-drive", default-features = false, features = [ ] } drive-proof-verifier = { path = "../rs-drive-proof-verifier" } dapi-grpc-macros = { path = "../rs-dapi-grpc-macros" } +http = { version = "1.1" } thiserror = "1.0.64" -tokio = { version = "1.40.0", features = ["macros"] } +tokio = { version = "1.40", features = ["macros"] } tokio-util = { version = "0.7.12" } async-trait = { version = "0.1.83" } -http = { version = "0.2.12" } ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined" } serde = { version = "1.0.197", default-features = false, features = [ "rc", @@ -30,7 +31,7 @@ hex = { version = "0.4.3" } dotenvy = { version = "0.15.7", optional = true } envy = { version = "0.4.2", optional = true } futures = { version = "0.3.30" } -derive_more = { version = "0.99.17" } +derive_more = { version = "1.0", features = ["from"] } # dashcore-rpc is only needed for core rpc; TODO remove once we have correct core rpc impl dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.4" } lru = { version = "0.12.3", optional = true } @@ -38,7 +39,7 @@ bip37-bloom-filter = { git = "https://github.com/dashpay/rs-bip37-bloom-filter", pollster = { version = "0.3.0" } [dev-dependencies] -tokio = { version = "1.40.0", features = ["macros", "rt-multi-thread"] } +tokio = { version = "1.40", features = ["macros", "rt-multi-thread"] } rs-dapi-client = { path = "../rs-dapi-client", features = ["mocks"] } base64 = { version = "0.22.1" } tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index f2a048627b..04d917d483 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -41,10 +41,10 @@ dpp = { path = "../rs-dpp", default-features = false, features = [ "document-value-conversion", "document-json-conversion", ] } -itertools = { version = "0.10.5" } +itertools = { version = "0.13" } log = { version = "0.4.6" } wasm-logger = { version = "0.2.0" } -num_enum = "0.5.7" +num_enum = "0.7" hex = { version = "0.4" } paste = "1.0.14" anyhow = { version = "1.0.75" } From 1e396698c83d00abef64f73bd181174bf59bfa12 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Mon, 7 Oct 2024 14:58:03 +0300 Subject: [PATCH 48/90] chore(release): update changelog and bump version to 1.4.0-dev.6 (#2218) --- CHANGELOG.md | 8 +++ Cargo.lock | 50 +++++++++---------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/check-features/Cargo.toml | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 44 files changed, 75 insertions(+), 67 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4972a7f5a9..77bd24bbd2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [1.4.0-dev.6](https://github.com/dashpay/platform/compare/v1.4.0-dev.5...v1.4.0-dev.6) (2024-10-07) + + +### Miscellaneous Chores + +* **sdk:** expose drive module in public API for rs-sdk ([#2217](https://github.com/dashpay/platform/issues/2217)) +* update dependences ([#2072](https://github.com/dashpay/platform/issues/2072)) + ## [1.4.0-dev.5](https://github.com/dashpay/platform/compare/v1.4.0-dev.4...v1.4.0-dev.5) (2024-10-07) diff --git a/Cargo.lock b/Cargo.lock index 242a8e7df2..3fc716539f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -673,7 +673,7 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "check-features" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "toml", ] @@ -1042,7 +1042,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1058,7 +1058,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "dapi-grpc", "heck 0.5.0", @@ -1103,7 +1103,7 @@ dependencies = [ [[package]] name = "dash-sdk" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "arc-swap", "async-trait", @@ -1203,7 +1203,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "platform-value", "platform-version", @@ -1213,7 +1213,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1344,7 +1344,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "platform-value", "platform-version", @@ -1354,7 +1354,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "anyhow", "assert_matches", @@ -1406,7 +1406,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "arc-swap", "assert_matches", @@ -1447,7 +1447,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "arc-swap", "assert_matches", @@ -1502,7 +1502,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "bincode", "dapi-grpc", @@ -1723,7 +1723,7 @@ checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "feature-flags-contract" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "platform-value", "platform-version", @@ -2561,7 +2561,7 @@ dependencies = [ [[package]] name = "json-schema-compatibility-validator" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "assert_matches", "json-patch", @@ -2719,7 +2719,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "platform-value", "platform-version", @@ -3299,7 +3299,7 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "platform-serialization" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "bincode", "platform-version", @@ -3307,7 +3307,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "proc-macro2", "quote", @@ -3317,7 +3317,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "base64 0.22.1", "bincode", @@ -3338,7 +3338,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "quote", "syn 2.0.75", @@ -3346,7 +3346,7 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "bincode", "grovedb-version", @@ -3357,7 +3357,7 @@ dependencies = [ [[package]] name = "platform-versioning" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "proc-macro2", "quote", @@ -3849,7 +3849,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "backon", "chrono", @@ -4316,7 +4316,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "base64 0.22.1", "bincode", @@ -4382,7 +4382,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "bincode", "dpp", @@ -5301,7 +5301,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "anyhow", "async-trait", @@ -5603,7 +5603,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" dependencies = [ "num_enum 0.5.11", "platform-value", diff --git a/package.json b/package.json index 71948e1ad3..8bd83932cc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.4.0-dev.5", + "version": "1.4.0-dev.6", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index 3a823e438c..aab27b9a75 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.4.0-dev.5", + "version": "1.4.0-dev.6", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/check-features/Cargo.toml b/packages/check-features/Cargo.toml index 7ca97f3972..7140cdc9f6 100644 --- a/packages/check-features/Cargo.toml +++ b/packages/check-features/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "check-features" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index cce2d64890..c487569ab2 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index 31f70b10bd..5e0458d6f0 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.4.0-dev.5", + "version": "1.4.0-dev.6", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index a8e9884221..fc39f2b7a2 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.4.0-dev.5", + "version": "1.4.0-dev.6", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index 5745553e4a..7c864ad320 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "2.4.0-dev.5", + "version": "2.4.0-dev.6", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index 22bf5a8fcb..78ceccc610 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.4.0-dev.5", + "version": "1.4.0-dev.6", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index 9a957ebed1..c9cce559b0 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index 4c877bd614..48472808ff 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.4.0-dev.5", + "version": "1.4.0-dev.6", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index 0f6bd43bb7..7fe6683b5e 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 1bfb6601c0..30bff16530 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index fb9fb715f1..d52e8cb905 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.4.0-dev.5", + "version": "1.4.0-dev.6", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index a036c5b3e8..99fbe6bd07 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index 2236ecfea8..8bdf9bef48 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.4.0-dev.5", + "version": "1.4.0-dev.6", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index c95923b963..a46be3f4e0 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.4.0-dev.5", + "version": "1.4.0-dev.6", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index 80bd7b603f..c994dbf84e 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.4.0-dev.5", + "version": "4.4.0-dev.6", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index a020b17265..e6b740d9d8 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.4.0-dev.5", + "version": "1.4.0-dev.6", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index dfe5ebfee8..8a63885d54 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index 5c48af39e5..334c1342bd 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.4.0-dev.5", + "version": "1.4.0-dev.6", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index dee2e4eec6..a03c1c8559 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.4.0-dev.5", + "version": "1.4.0-dev.6", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index d28af7e02b..817ef6889b 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index 7d6a4c9eb6..e35f8024b1 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index cbfa3c1ff4..4070f9a7e2 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" edition = "2021" rust-version.workspace = true authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index e9b6ac225f..075aed3f39 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 73a8df061e..2a5fce6242 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" edition = "2021" rust-version.workspace = true diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index b23408aa9b..873ae06b0d 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-json-schema-compatibility-validator/Cargo.toml b/packages/rs-json-schema-compatibility-validator/Cargo.toml index af8e0a8034..1b1f5624d1 100644 --- a/packages/rs-json-schema-compatibility-validator/Cargo.toml +++ b/packages/rs-json-schema-compatibility-validator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "json-schema-compatibility-validator" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" edition = "2021" rust-version.workspace = true authors = ["Ivan Shumkov "] diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index 6cacd6e794..98b6fa10fa 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index cdfc3151ae..e5f6f2ad03 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index bae257b3d7..2bbfb16f80 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index 15b0852906..1fb6a023f1 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 696e36ae73..3a66c92026 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Versioning library for Platform" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index 89b1f001bb..cccfebf94a 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 54a0b909ab..d039e15e8d 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dash-sdk" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index c7cca2b3f2..32910fdf36 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" edition = "2021" rust-version.workspace = true diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index c4c32d92a0..22e93611f4 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 0c50db6105..01d482878b 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.4.0-dev.5", + "version": "8.4.0-dev.6", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index 04d917d483..dd8309b128 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" edition = "2021" rust-version.workspace = true authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index f43dfda3e7..e46c3999d6 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.4.0-dev.5", + "version": "1.4.0-dev.6", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index 59ec5928f4..dccf38033c 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.4.0-dev.5" +version = "1.4.0-dev.6" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index 750d87c499..1c3acee5b5 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.4.0-dev.5", + "version": "1.4.0-dev.6", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From bd7ed805b49e30c64cc59d96fa37fa90c2f8a878 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Mon, 7 Oct 2024 18:23:44 +0300 Subject: [PATCH 49/90] chore(drive): log invalid state on deserialisation (#2220) --- .../storage/fetch_platform_state/v0/mod.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/rs-drive-abci/src/execution/storage/fetch_platform_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/storage/fetch_platform_state/v0/mod.rs index 25960bf5b3..a815e0266a 100644 --- a/packages/rs-drive-abci/src/execution/storage/fetch_platform_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/storage/fetch_platform_state/v0/mod.rs @@ -16,8 +16,18 @@ impl Platform { .fetch_platform_state_bytes(transaction, platform_version) .map_err(Error::Drive)? .map(|bytes| { - PlatformState::versioned_deserialize(&bytes, platform_version) - .map_err(Error::Protocol) + let result = PlatformState::versioned_deserialize(&bytes, platform_version) + .map_err(Error::Protocol); + + if result.is_err() { + tracing::error!( + bytes = hex::encode(&bytes), + "Unable deserialize platform state for version {}", + platform_version.protocol_version + ); + } + + result }) .transpose() } From 5e996edd879222d51b9843a4625a04db4c1b2daf Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Mon, 7 Oct 2024 18:25:41 +0300 Subject: [PATCH 50/90] chore(release): update changelog and bump version to 1.4.0-dev.7 (#2221) --- CHANGELOG.md | 7 +++ Cargo.lock | 50 +++++++++---------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/check-features/Cargo.toml | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 44 files changed, 74 insertions(+), 67 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 77bd24bbd2..6929775650 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.4.0-dev.7](https://github.com/dashpay/platform/compare/v1.4.0-dev.6...v1.4.0-dev.7) (2024-10-07) + + +### Miscellaneous Chores + +* **drive:** log invalid state on deserialisation ([#2220](https://github.com/dashpay/platform/issues/2220)) + ## [1.4.0-dev.6](https://github.com/dashpay/platform/compare/v1.4.0-dev.5...v1.4.0-dev.6) (2024-10-07) diff --git a/Cargo.lock b/Cargo.lock index 3fc716539f..4af5a74799 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -673,7 +673,7 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "check-features" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "toml", ] @@ -1042,7 +1042,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1058,7 +1058,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "dapi-grpc", "heck 0.5.0", @@ -1103,7 +1103,7 @@ dependencies = [ [[package]] name = "dash-sdk" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "arc-swap", "async-trait", @@ -1203,7 +1203,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "platform-value", "platform-version", @@ -1213,7 +1213,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1344,7 +1344,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "platform-value", "platform-version", @@ -1354,7 +1354,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "anyhow", "assert_matches", @@ -1406,7 +1406,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "arc-swap", "assert_matches", @@ -1447,7 +1447,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "arc-swap", "assert_matches", @@ -1502,7 +1502,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "bincode", "dapi-grpc", @@ -1723,7 +1723,7 @@ checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "feature-flags-contract" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "platform-value", "platform-version", @@ -2561,7 +2561,7 @@ dependencies = [ [[package]] name = "json-schema-compatibility-validator" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "assert_matches", "json-patch", @@ -2719,7 +2719,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "platform-value", "platform-version", @@ -3299,7 +3299,7 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "platform-serialization" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "bincode", "platform-version", @@ -3307,7 +3307,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "proc-macro2", "quote", @@ -3317,7 +3317,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "base64 0.22.1", "bincode", @@ -3338,7 +3338,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "quote", "syn 2.0.75", @@ -3346,7 +3346,7 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "bincode", "grovedb-version", @@ -3357,7 +3357,7 @@ dependencies = [ [[package]] name = "platform-versioning" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "proc-macro2", "quote", @@ -3849,7 +3849,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "backon", "chrono", @@ -4316,7 +4316,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "base64 0.22.1", "bincode", @@ -4382,7 +4382,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "bincode", "dpp", @@ -5301,7 +5301,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "anyhow", "async-trait", @@ -5603,7 +5603,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" dependencies = [ "num_enum 0.5.11", "platform-value", diff --git a/package.json b/package.json index 8bd83932cc..135b7d3084 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.4.0-dev.6", + "version": "1.4.0-dev.7", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index aab27b9a75..b3e2fac245 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.4.0-dev.6", + "version": "1.4.0-dev.7", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/check-features/Cargo.toml b/packages/check-features/Cargo.toml index 7140cdc9f6..7d11a7421f 100644 --- a/packages/check-features/Cargo.toml +++ b/packages/check-features/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "check-features" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index c487569ab2..be9ba8e05b 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index 5e0458d6f0..558ad26654 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.4.0-dev.6", + "version": "1.4.0-dev.7", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index fc39f2b7a2..eff603e912 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.4.0-dev.6", + "version": "1.4.0-dev.7", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index 7c864ad320..e8f982f0ea 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "2.4.0-dev.6", + "version": "2.4.0-dev.7", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index 78ceccc610..397c430574 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.4.0-dev.6", + "version": "1.4.0-dev.7", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index c9cce559b0..dd94bf77f0 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index 48472808ff..9d8bc10a8c 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.4.0-dev.6", + "version": "1.4.0-dev.7", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index 7fe6683b5e..5c7c908471 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 30bff16530..e26c6b3f92 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index d52e8cb905..c653837569 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.4.0-dev.6", + "version": "1.4.0-dev.7", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index 99fbe6bd07..c96643b8cd 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index 8bdf9bef48..70f1e9a538 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.4.0-dev.6", + "version": "1.4.0-dev.7", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index a46be3f4e0..4339db52be 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.4.0-dev.6", + "version": "1.4.0-dev.7", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index c994dbf84e..6355ee3c35 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.4.0-dev.6", + "version": "4.4.0-dev.7", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index e6b740d9d8..c57a55fbe7 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.4.0-dev.6", + "version": "1.4.0-dev.7", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index 8a63885d54..0ba5f04dfe 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index 334c1342bd..20a60d9fa3 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.4.0-dev.6", + "version": "1.4.0-dev.7", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index a03c1c8559..3ed5cf8d91 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.4.0-dev.6", + "version": "1.4.0-dev.7", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index 817ef6889b..e5dc961574 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index e35f8024b1..5b4b883c56 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 4070f9a7e2..f096f1f747 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" edition = "2021" rust-version.workspace = true authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 075aed3f39..2c88cf0e16 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 2a5fce6242..f6ebac3824 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" edition = "2021" rust-version.workspace = true diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 873ae06b0d..394bd20eb1 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-json-schema-compatibility-validator/Cargo.toml b/packages/rs-json-schema-compatibility-validator/Cargo.toml index 1b1f5624d1..e7598b319c 100644 --- a/packages/rs-json-schema-compatibility-validator/Cargo.toml +++ b/packages/rs-json-schema-compatibility-validator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "json-schema-compatibility-validator" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" edition = "2021" rust-version.workspace = true authors = ["Ivan Shumkov "] diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index 98b6fa10fa..790f2b2c1b 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index e5f6f2ad03..ddb9000e9b 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index 2bbfb16f80..1b570a4325 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index 1fb6a023f1..1f5ac10e8f 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 3a66c92026..7497dd8786 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Versioning library for Platform" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index cccfebf94a..0941cffbe5 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index d039e15e8d..aa41ed04ae 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dash-sdk" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index 32910fdf36..aa28658d71 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" edition = "2021" rust-version.workspace = true diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index 22e93611f4..20f191c0a5 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 01d482878b..8c23365ab4 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.4.0-dev.6", + "version": "8.4.0-dev.7", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index dd8309b128..ec72884429 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" edition = "2021" rust-version.workspace = true authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index e46c3999d6..3e7d34045d 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.4.0-dev.6", + "version": "1.4.0-dev.7", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index dccf38033c..bab39adb8c 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.4.0-dev.6" +version = "1.4.0-dev.7" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index 1c3acee5b5..f4270b3bc7 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.4.0-dev.6", + "version": "1.4.0-dev.7", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From 5aed75a4cdd788574e6abc949a2af9379939f3d7 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Tue, 8 Oct 2024 16:17:00 +0700 Subject: [PATCH 51/90] feat(sdk): fix client tls connections (#2223) Co-authored-by: Lukasz Klimek <842586+lklimek@users.noreply.github.com> --- Cargo.lock | 17 ++-- packages/rs-dapi-client/Cargo.toml | 10 ++- .../rs-dapi-client/src/connection_pool.rs | 12 +-- packages/rs-dapi-client/src/dapi_client.rs | 10 ++- packages/rs-dapi-client/src/transport.rs | 4 +- packages/rs-dapi-client/src/transport/grpc.rs | 90 ++++++++++++++----- packages/rs-sdk/src/platform/types/evonode.rs | 13 ++- 7 files changed, 111 insertions(+), 45 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4af5a74799..92ff215c4b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -309,11 +309,12 @@ dependencies = [ [[package]] name = "backon" -version = "0.5.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e5b65cc81d81fbb8488f36458ab4771be35a722967bbc959df28b47397e3ff" +checksum = "e4fa97bb310c33c811334143cf64c5bb2b7b3c06e453db6b095d7061eff8f113" dependencies = [ "fastrand", + "tokio", ] [[package]] @@ -3955,9 +3956,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.7.2" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04182dffc9091a404e0fc069ea5cd60e5b866c3adf881eff99a32d048242dffa" +checksum = "fcaf18a4f2be7326cd874a5fa579fae794320a0f388d365dca7e480e55f83f8a" dependencies = [ "openssl-probe", "rustls-pemfile", @@ -4791,9 +4792,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" dependencies = [ "futures-core", "pin-project-lite", @@ -4884,9 +4885,9 @@ dependencies = [ [[package]] name = "tonic" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38659f4a91aba8598d27821589f5db7dddd94601e7a01b1e485a50e5484c7401" +checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" dependencies = [ "async-stream", "async-trait", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index e5dc961574..fb06b6abdc 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -19,8 +19,14 @@ dump = ["mocks"] offline-testing = [] [dependencies] -backon = "0.5" -dapi-grpc = { path = "../dapi-grpc" } +backon = { version = "1.2", default-features = false, features = [ + "tokio-sleep", +] } +dapi-grpc = { path = "../dapi-grpc", features = [ + "core", + "platform", + "client", +], default-features = false } futures = "0.3.28" http-serde = { version = "2.1", optional = true } rand = { version = "0.8.5", features = ["small_rng"] } diff --git a/packages/rs-dapi-client/src/connection_pool.rs b/packages/rs-dapi-client/src/connection_pool.rs index 16d8cf030d..97dd991d50 100644 --- a/packages/rs-dapi-client/src/connection_pool.rs +++ b/packages/rs-dapi-client/src/connection_pool.rs @@ -67,19 +67,21 @@ impl ConnectionPool { /// * `prefix` - Prefix for the item in the pool. Used to distinguish between Core and Platform clients. /// * `uri` - URI of the node. /// * `settings` - Applied request settings. - pub fn get_or_create( + pub fn get_or_create( &self, prefix: PoolPrefix, uri: &Uri, settings: Option<&AppliedRequestSettings>, - create: impl FnOnce() -> PoolItem, - ) -> PoolItem { + create: impl FnOnce() -> Result, + ) -> Result { if let Some(cli) = self.get(prefix, uri, settings) { - return cli; + return Ok(cli); } let cli = create(); - self.put(uri, settings, cli.clone()); + if let Ok(cli) = &cli { + self.put(uri, settings, cli.clone()); + } cli } diff --git a/packages/rs-dapi-client/src/dapi_client.rs b/packages/rs-dapi-client/src/dapi_client.rs index 17748ab2b0..372b28bc3f 100644 --- a/packages/rs-dapi-client/src/dapi_client.rs +++ b/packages/rs-dapi-client/src/dapi_client.rs @@ -199,7 +199,13 @@ impl DapiRequestExecutor for DapiClient { address.uri().clone(), &applied_settings, &pool, - ); + ) + .map_err(|e| { + DapiClientError::<::Error>::Transport( + e, + address.clone(), + ) + })?; let response = transport_request .execute_transport(&mut transport_client, &applied_settings) @@ -250,7 +256,7 @@ impl DapiRequestExecutor for DapiClient { // Start the routine with retry policy applied: // We allow let_and_return because `result` is used later if dump feature is enabled let result = routine - .retry(&retry_settings) + .retry(retry_settings) .notify(|error, duration| { tracing::warn!( ?error, diff --git a/packages/rs-dapi-client/src/transport.rs b/packages/rs-dapi-client/src/transport.rs index a5459834e1..600189fc2f 100644 --- a/packages/rs-dapi-client/src/transport.rs +++ b/packages/rs-dapi-client/src/transport.rs @@ -51,12 +51,12 @@ pub trait TransportClient: Send + Sized { type Error: CanRetry + Send + Debug + Mockable; /// Build client using node's url. - fn with_uri(uri: Uri, pool: &ConnectionPool) -> Self; + fn with_uri(uri: Uri, pool: &ConnectionPool) -> Result; /// Build client using node's url and [AppliedRequestSettings]. fn with_uri_and_settings( uri: Uri, settings: &AppliedRequestSettings, pool: &ConnectionPool, - ) -> Self; + ) -> Result; } diff --git a/packages/rs-dapi-client/src/transport/grpc.rs b/packages/rs-dapi-client/src/transport/grpc.rs index 98976ed08e..d5180099d0 100644 --- a/packages/rs-dapi-client/src/transport/grpc.rs +++ b/packages/rs-dapi-client/src/transport/grpc.rs @@ -8,7 +8,7 @@ use crate::{request_settings::AppliedRequestSettings, RequestSettings}; use dapi_grpc::core::v0::core_client::CoreClient; use dapi_grpc::core::v0::{self as core_proto}; use dapi_grpc::platform::v0::{self as platform_proto, platform_client::PlatformClient}; -use dapi_grpc::tonic::transport::Uri; +use dapi_grpc::tonic::transport::{ClientTlsConfig, Uri}; use dapi_grpc::tonic::Streaming; use dapi_grpc::tonic::{transport::Channel, IntoRequest}; use futures::{future::BoxFuture, FutureExt, TryFutureExt}; @@ -18,8 +18,16 @@ pub type PlatformGrpcClient = PlatformClient; /// Core Client using gRPC transport. pub type CoreGrpcClient = CoreClient; -fn create_channel(uri: Uri, settings: Option<&AppliedRequestSettings>) -> Channel { - let mut builder = Channel::builder(uri); +fn create_channel( + uri: Uri, + settings: Option<&AppliedRequestSettings>, +) -> Result { + let mut builder = Channel::builder(uri).tls_config( + ClientTlsConfig::new() + .with_native_roots() + .with_webpki_roots() + .assume_http2(true), + )?; if let Some(settings) = settings { if let Some(timeout) = settings.connect_timeout { @@ -27,50 +35,84 @@ fn create_channel(uri: Uri, settings: Option<&AppliedRequestSettings>) -> Channe } } - builder.connect_lazy() + Ok(builder.connect_lazy()) } impl TransportClient for PlatformGrpcClient { type Error = dapi_grpc::tonic::Status; - fn with_uri(uri: Uri, pool: &ConnectionPool) -> Self { - pool.get_or_create(PoolPrefix::Platform, &uri, None, || { - Self::new(create_channel(uri.clone(), None)).into() - }) - .into() + fn with_uri(uri: Uri, pool: &ConnectionPool) -> Result { + Ok(pool + .get_or_create(PoolPrefix::Platform, &uri, None, || { + match create_channel(uri.clone(), None) { + Ok(channel) => Ok(Self::new(channel).into()), + Err(e) => Err(dapi_grpc::tonic::Status::failed_precondition(format!( + "Channel creation failed: {}", + e + ))), + } + })? + .into()) } fn with_uri_and_settings( uri: Uri, settings: &AppliedRequestSettings, pool: &ConnectionPool, - ) -> Self { - pool.get_or_create(PoolPrefix::Platform, &uri, Some(settings), || { - Self::new(create_channel(uri.clone(), Some(settings))).into() - }) - .into() + ) -> Result { + Ok(pool + .get_or_create( + PoolPrefix::Platform, + &uri, + Some(settings), + || match create_channel(uri.clone(), Some(settings)) { + Ok(channel) => Ok(Self::new(channel).into()), + Err(e) => Err(dapi_grpc::tonic::Status::failed_precondition(format!( + "Channel creation failed: {}", + e + ))), + }, + )? + .into()) } } impl TransportClient for CoreGrpcClient { type Error = dapi_grpc::tonic::Status; - fn with_uri(uri: Uri, pool: &ConnectionPool) -> Self { - pool.get_or_create(PoolPrefix::Core, &uri, None, || { - Self::new(create_channel(uri.clone(), None)).into() - }) - .into() + fn with_uri(uri: Uri, pool: &ConnectionPool) -> Result { + Ok(pool + .get_or_create(PoolPrefix::Core, &uri, None, || { + match create_channel(uri.clone(), None) { + Ok(channel) => Ok(Self::new(channel).into()), + Err(e) => Err(dapi_grpc::tonic::Status::failed_precondition(format!( + "Channel creation failed: {}", + e + ))), + } + })? + .into()) } fn with_uri_and_settings( uri: Uri, settings: &AppliedRequestSettings, pool: &ConnectionPool, - ) -> Self { - pool.get_or_create(PoolPrefix::Core, &uri, Some(settings), || { - Self::new(create_channel(uri.clone(), Some(settings))).into() - }) - .into() + ) -> Result { + Ok(pool + .get_or_create( + PoolPrefix::Core, + &uri, + Some(settings), + || match create_channel(uri.clone(), Some(settings)) { + Ok(channel) => Ok(Self::new(channel).into()), + Err(e) => Err(dapi_grpc::tonic::Status::failed_precondition(format!( + "Channel creation failed: {}", + e + ))), + }, + )? + .into()) } } diff --git a/packages/rs-sdk/src/platform/types/evonode.rs b/packages/rs-sdk/src/platform/types/evonode.rs index 01c0630b49..77e893dfd5 100644 --- a/packages/rs-sdk/src/platform/types/evonode.rs +++ b/packages/rs-sdk/src/platform/types/evonode.rs @@ -10,7 +10,7 @@ use futures::{FutureExt, TryFutureExt}; use rs_dapi_client::transport::{ AppliedRequestSettings, PlatformGrpcClient, TransportClient, TransportRequest, }; -use rs_dapi_client::{Address, ConnectionPool, RequestSettings}; +use rs_dapi_client::{Address, ConnectionPool, DapiClientError, RequestSettings}; #[cfg(feature = "mocks")] use serde::{Deserialize, Serialize}; use std::fmt::Debug; @@ -74,7 +74,16 @@ impl TransportRequest for EvoNode { // We also create a new client to use with this request, so that the user does not need to // reconfigure SDK to use a single node. let pool = ConnectionPool::new(1); - let mut client = Self::Client::with_uri_and_settings(uri.clone(), settings, &pool); + // We create a new client with the given URI and settings + let client_result = Self::Client::with_uri_and_settings(uri.clone(), settings, &pool); + + // Handle the result manually to create a proper error response + let mut client = match client_result { + Ok(client) => client, + Err(e) => { + return async { Err(e) }.boxed(); + } + }; let mut grpc_request = GetStatusRequest { version: Some(get_status_request::Version::V0(GetStatusRequestV0 {})), } From eaf8c1286d1b9b857671a2644ebaf7b17731a377 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Tue, 8 Oct 2024 20:53:47 +0700 Subject: [PATCH 52/90] fix(platform): fixed Platform State deserialization issue (#2227) Co-authored-by: Ivan Shumkov --- .../rs-dpp/src/core_types/validator/v0/mod.rs | 54 ++++- .../src/core_types/validator_set/v0/mod.rs | 94 ++++++-- packages/rs-dpp/src/fee/default_costs/mod.rs | 61 ++---- packages/rs-dpp/src/fee/fee_result/refunds.rs | 4 +- .../block_fee_processing/tests.rs | 2 +- .../upgrade_protocol_version/v0/mod.rs | 8 +- .../src/platform_types/platform_state/mod.rs | 68 ++++-- .../platform_types/platform_state/v0/mod.rs | 106 ++++++++- .../rs-drive-abci/src/test/fixture/mod.rs | 1 + .../src/test/fixture/platform_state.rs | 9 + .../rs-drive/src/drive/document/delete/mod.rs | 3 +- .../rs-drive/src/drive/document/insert/mod.rs | 3 +- .../rs-drive/src/drive/document/update/mod.rs | 3 +- packages/rs-drive/tests/query_tests.rs | 5 +- .../rs-drive/tests/query_tests_history.rs | 5 +- .../src/version/drive_abci_versions.rs | 2 +- .../src/version/fee/mod.rs | 202 +++++++----------- .../src/version/fee/processing/mod.rs | 65 +++--- .../rs-platform-version/src/version/fee/v1.rs | 1 + .../src/version/mocks/v2_test.rs | 2 +- .../src/version/mocks/v3_test.rs | 2 +- .../rs-platform-version/src/version/v1.rs | 2 +- .../rs-platform-version/src/version/v2.rs | 2 +- .../rs-platform-version/src/version/v3.rs | 2 +- .../rs-platform-version/src/version/v4.rs | 2 +- 25 files changed, 438 insertions(+), 270 deletions(-) create mode 100644 packages/rs-drive-abci/src/test/fixture/platform_state.rs diff --git a/packages/rs-dpp/src/core_types/validator/v0/mod.rs b/packages/rs-dpp/src/core_types/validator/v0/mod.rs index daadc197fe..b427431a04 100644 --- a/packages/rs-dpp/src/core_types/validator/v0/mod.rs +++ b/packages/rs-dpp/src/core_types/validator/v0/mod.rs @@ -47,7 +47,8 @@ impl Encode for ValidatorV0 { // Encode each field in the order they appear in the struct // Encode ProTxHash - self.pro_tx_hash.to_byte_array().to_vec().encode(encoder)?; + let pro_tx_hash_bytes = self.pro_tx_hash.as_byte_array(); + pro_tx_hash_bytes.encode(encoder)?; // Encode Option match &self.public_key { @@ -64,7 +65,8 @@ impl Encode for ValidatorV0 { self.node_ip.encode(encoder)?; // Encode node_id - self.node_id.to_byte_array().to_vec().encode(encoder)?; + let node_id_bytes = self.node_id.as_byte_array(); + node_id_bytes.encode(encoder)?; // Encode core_port, platform_http_port, and platform_p2p_port as u16 self.core_port.encode(encoder)?; @@ -84,14 +86,14 @@ impl Decode for ValidatorV0 { // Decode each field in the same order as they were encoded // Decode ProTxHash - let pro_tx_hash_bytes = Vec::::decode(decoder)?; + let pro_tx_hash_bytes = <[u8; 32]>::decode(decoder)?; let pro_tx_hash = ProTxHash::from_slice(&pro_tx_hash_bytes) .map_err(|_| DecodeError::OtherString("Failed to decode ProTxHash".to_string()))?; // Decode Option let has_public_key = bool::decode(decoder)?; let public_key = if has_public_key { - let public_key_bytes = Vec::::decode(decoder)?; + let public_key_bytes = <[u8; 48]>::decode(decoder)?; Some(BlsPublicKey::from_bytes(&public_key_bytes).map_err(|_| { DecodeError::OtherString("Failed to decode BlsPublicKey".to_string()) })?) @@ -103,7 +105,7 @@ impl Decode for ValidatorV0 { let node_ip = String::decode(decoder)?; // Decode node_id - let node_id_bytes = Vec::::decode(decoder)?; + let node_id_bytes = <[u8; 20]>::decode(decoder)?; let node_id = PubkeyHash::from_slice(&node_id_bytes) .map_err(|_| DecodeError::OtherString("Failed to decode NodeId".to_string()))?; @@ -250,3 +252,45 @@ impl ValidatorV0Setters for ValidatorV0 { self.is_banned = is_banned; } } + +#[cfg(test)] +mod tests { + use super::*; + use bincode::config; + + #[test] + fn test_serialize_deserialize_validator_v0() { + // Sample data for testing + let pro_tx_hash = ProTxHash::from_slice(&[1; 32]).unwrap(); + let public_key = Some(BlsPublicKey::generate()); + let node_ip = "127.0.0.1".to_string(); + let node_id = PubkeyHash::from_slice(&[3; 20]).unwrap(); + let core_port = 9999; + let platform_http_port = 8888; + let platform_p2p_port = 7777; + let is_banned = false; + + // Create a ValidatorV0 instance + let validator = ValidatorV0 { + pro_tx_hash, + public_key, + node_ip, + node_id, + core_port, + platform_http_port, + platform_p2p_port, + is_banned, + }; + + // Serialize the ValidatorV0 instance + let encoded = bincode::encode_to_vec(&validator, config::standard()).unwrap(); + + // Deserialize the data back into a ValidatorV0 instance + let decoded: ValidatorV0 = bincode::decode_from_slice(&encoded, config::standard()) + .unwrap() + .0; + + // Verify that the deserialized instance matches the original instance + assert_eq!(validator, decoded); + } +} diff --git a/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs b/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs index 2cf167277b..dba9180e24 100644 --- a/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs +++ b/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs @@ -70,7 +70,7 @@ impl Display for ValidatorSetV0 { impl Encode for ValidatorSetV0 { fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { // Encode each field in the order they appear in the struct - let quorum_hash_bytes = self.quorum_hash.as_byte_array().to_vec(); + let quorum_hash_bytes = self.quorum_hash.as_byte_array(); quorum_hash_bytes.encode(encoder)?; self.quorum_index.encode(encoder)?; self.core_height.encode(encoder)?; @@ -85,7 +85,7 @@ impl Encode for ValidatorSetV0 { // Custom encoding for BlsPublicKey if needed // Assuming BlsPublicKey can be serialized to a byte slice - let public_key_bytes = self.threshold_public_key.to_bytes(); + let public_key_bytes = *self.threshold_public_key.to_bytes(); public_key_bytes.encode(encoder)?; Ok(()) @@ -95,8 +95,8 @@ impl Encode for ValidatorSetV0 { #[cfg(feature = "core-types-serialization")] impl Decode for ValidatorSetV0 { fn decode(decoder: &mut D) -> Result { - // Decode each field in the same order as they were encoded - let quorum_hash = Vec::::decode(decoder)?; + // Decode the quorum hash directly as a [u8; 32] array + let quorum_hash = <[u8; 32]>::decode(decoder)?; let quorum_index = Option::::decode(decoder)?; let core_height = u32::decode(decoder)?; @@ -114,17 +114,16 @@ impl Decode for ValidatorSetV0 { }) .collect::>()?; - // Custom decoding for BlsPublicKey if needed - // Assuming BlsPublicKey can be deserialized from a byte slice - let public_key_bytes = Vec::::decode(decoder)?; + // Decode the [u8; 48] directly + let mut public_key_bytes = [0u8; 48]; + let bytes = <[u8; 48]>::decode(decoder)?; + public_key_bytes.copy_from_slice(&bytes); let threshold_public_key = BlsPublicKey::from_bytes(&public_key_bytes).map_err(|_| { bincode::error::DecodeError::OtherString("Failed to decode BlsPublicKey".to_string()) })?; Ok(ValidatorSetV0 { - quorum_hash: QuorumHash::from_slice(&quorum_hash).map_err(|_| { - bincode::error::DecodeError::OtherString("Failed to decode QuorumHash".to_string()) - })?, + quorum_hash: QuorumHash::from_byte_array(quorum_hash), quorum_index, core_height, members, @@ -138,8 +137,8 @@ impl<'de> BorrowDecode<'de> for ValidatorSetV0 { fn borrow_decode(decoder: &mut D) -> Result { // Decode each field in the same order as they were encoded - // Decode quorum_hash as Vec - let quorum_hash = Vec::::decode(decoder)?; + // Decode the quorum hash directly as a [u8; 32] array + let quorum_hash = <[u8; 32]>::decode(decoder)?; // Decode quorum_index as Option let quorum_index = Option::::decode(decoder)?; // Decode core_height as u32 @@ -160,15 +159,17 @@ impl<'de> BorrowDecode<'de> for ValidatorSetV0 { .collect::>()?; // Custom decoding for BlsPublicKey if needed - let public_key_bytes = Vec::::decode(decoder)?; + let mut public_key_bytes = [0u8; 48]; + let bytes = <[u8; 48]>::decode(decoder)?; + public_key_bytes.copy_from_slice(&bytes); let threshold_public_key = BlsPublicKey::from_bytes(&public_key_bytes).map_err(|_| { - bincode::error::DecodeError::OtherString("Failed to decode BlsPublicKey".to_string()) + bincode::error::DecodeError::OtherString( + "Failed to decode BlsPublicKey in borrow decode".to_string(), + ) })?; Ok(ValidatorSetV0 { - quorum_hash: QuorumHash::from_slice(&quorum_hash).map_err(|_| { - bincode::error::DecodeError::OtherString("Failed to decode QuorumHash".to_string()) - })?, + quorum_hash: QuorumHash::from_byte_array(quorum_hash), quorum_index, core_height, members, @@ -278,3 +279,62 @@ impl ValidatorSetV0Setters for ValidatorSetV0 { self.threshold_public_key = threshold_public_key; } } + +#[cfg(test)] +mod tests { + use super::*; + use bincode::config; + use dashcore::PubkeyHash; + use std::collections::BTreeMap; + + #[test] + fn test_serialize_deserialize_validator_set_v0() { + // Sample data for testing + let quorum_hash = QuorumHash::from_slice(&[1; 32]).unwrap(); + let quorum_index = Some(42); + let core_height = 1000; + + // Create a sample ProTxHash and ValidatorV0 instance + let pro_tx_hash = ProTxHash::from_slice(&[2; 32]).unwrap(); + let public_key = Some(BlsPublicKey::generate()); + let node_ip = "192.168.1.1".to_string(); + let node_id = PubkeyHash::from_slice(&[4; 20]).unwrap(); + let validator = ValidatorV0 { + pro_tx_hash: pro_tx_hash.clone(), + public_key, + node_ip, + node_id, + core_port: 8080, + platform_http_port: 9090, + platform_p2p_port: 10010, + is_banned: false, + }; + + // Create a BTreeMap with one entry for the ValidatorSetV0 + let mut members = BTreeMap::new(); + members.insert(pro_tx_hash, validator); + + // Create a sample threshold public key + let threshold_public_key = BlsPublicKey::generate(); + + // Create the ValidatorSetV0 instance + let validator_set = ValidatorSetV0 { + quorum_hash, + quorum_index, + core_height, + members, + threshold_public_key, + }; + + // Serialize the ValidatorSetV0 instance + let encoded = bincode::encode_to_vec(&validator_set, config::standard()).unwrap(); + + // Deserialize the data back into a ValidatorSetV0 instance + let decoded: ValidatorSetV0 = bincode::decode_from_slice(&encoded, config::standard()) + .unwrap() + .0; + + // Verify that the deserialized instance matches the original instance + assert_eq!(validator_set, decoded); + } +} diff --git a/packages/rs-dpp/src/fee/default_costs/mod.rs b/packages/rs-dpp/src/fee/default_costs/mod.rs index 9af68bb143..b1ad372c07 100644 --- a/packages/rs-dpp/src/fee/default_costs/mod.rs +++ b/packages/rs-dpp/src/fee/default_costs/mod.rs @@ -1,32 +1,3 @@ -// MIT LICENSE -// -// Copyright (c) 2021 Dash Core Group -// -// Permission is hereby granted, free of charge, to any -// person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the -// Software without restriction, including without -// limitation the rights to use, copy, modify, merge, -// publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software -// is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice -// shall be included in all copies or substantial portions -// of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// - //! Fee costs //! //! Fee costs for Known Platform operations @@ -34,13 +5,22 @@ use crate::block::epoch::{Epoch, EpochIndex}; use crate::fee::Credits; -use platform_version::version::fee::FeeVersion; -use platform_version::version::PlatformVersion; +use platform_version::version::fee::{ + FeeVersion, FeeVersionFieldsBeforeVersion4, FeeVersionNumber, +}; use std::collections::BTreeMap; pub mod constants; -pub type CachedEpochIndexFeeVersions = BTreeMap; +pub type CachedEpochIndexFeeVersions = BTreeMap; +pub type EpochIndexFeeVersionsForStorage = BTreeMap; + +// This is type only meant for deserialization because of an issue +// The issue was that the platform state was stored with FeeVersions in it before version 1.4 +// When we would add new fields we would be unable to deserialize +// This FeeProcessingVersionFieldsBeforeVersion4 is how things were before version 1.4 was released +pub type CachedEpochIndexFeeVersionsFieldsBeforeVersion4 = + BTreeMap; /// A Known Cost Item is an item that changes costs depending on the Epoch #[derive(Eq, PartialEq, Copy, Clone, Hash)] @@ -143,7 +123,10 @@ impl KnownCostItem { pub trait EpochCosts { /// Get the closest epoch in the past that has a cost table /// This is where the base costs last changed - fn active_fee_version(&self, cached_fee_version: &CachedEpochIndexFeeVersions) -> FeeVersion; + fn active_fee_version( + &self, + cached_fee_version: &CachedEpochIndexFeeVersions, + ) -> &'static FeeVersion; /// Get the cost for the known cost item fn cost_for_known_cost_item( &self, @@ -154,18 +137,20 @@ pub trait EpochCosts { impl EpochCosts for Epoch { /// Get the active fee version for an epoch - fn active_fee_version(&self, cached_fee_version: &CachedEpochIndexFeeVersions) -> FeeVersion { + fn active_fee_version( + &self, + cached_fee_version: &CachedEpochIndexFeeVersions, + ) -> &'static FeeVersion { // If the exact EpochIndex is matching to a FeeVersion update if let Some(fee_version) = cached_fee_version.get(&self.index) { - return fee_version.clone(); + return fee_version; } // else return the FeeVersion at lower adjacent EpochIndex (if available, else the FeeVersion of first PlatformVersion) cached_fee_version .range(..=self.index) .next_back() - .map(|(_, fee_version)| fee_version) - .unwrap_or_else(|| &PlatformVersion::first().fee_version) - .clone() + .map(|(_, fee_version)| *fee_version) + .unwrap_or_else(|| FeeVersion::first()) } /// Get the cost for the known cost item diff --git a/packages/rs-dpp/src/fee/fee_result/refunds.rs b/packages/rs-dpp/src/fee/fee_result/refunds.rs index f95fd379d2..90b93159a4 100644 --- a/packages/rs-dpp/src/fee/fee_result/refunds.rs +++ b/packages/rs-dpp/src/fee/fee_result/refunds.rs @@ -182,10 +182,10 @@ impl IntoIterator for FeeRefunds { mod tests { use super::*; use once_cell::sync::Lazy; - use platform_version::version::PlatformVersion; + use platform_version::version::fee::FeeVersion; static EPOCH_CHANGE_FEE_VERSION_TEST: Lazy = - Lazy::new(|| BTreeMap::from([(0, PlatformVersion::first().fee_version.clone())])); + Lazy::new(|| BTreeMap::from([(0, FeeVersion::first())])); mod from_storage_removal { use super::*; diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/tests.rs b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/tests.rs index fcbf1e8314..1cbac74c74 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/tests.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/tests.rs @@ -795,7 +795,7 @@ mod refund_tests { platform_state .previous_fee_versions_mut() - .insert(5, platform_version_with_higher_fees.fee_version.clone()); + .insert(5, platform_version_with_higher_fees.fee_version.as_static()); let (mut fee_results, _) = process_state_transitions( &platform, diff --git a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/upgrade_protocol_version/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/upgrade_protocol_version/v0/mod.rs index 79b6ce27cd..d8dd13e441 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/upgrade_protocol_version/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/upgrade_protocol_version/v0/mod.rs @@ -99,17 +99,19 @@ impl Platform { // If cached_fee_version is non-empty if let Some((_, last_fee_version)) = previous_fee_versions_map.iter().last() { // Insert the new (epoch_index, fee_version) only if the new fee_version is different from the last_fee_version. - if *last_fee_version != platform_version.fee_version { + if last_fee_version.fee_version_number + != platform_version.fee_version.fee_version_number + { previous_fee_versions_map.insert( epoch_info.current_epoch_index(), - platform_version.fee_version.clone(), + &platform_version.fee_version, ); } // In case of empty cached_fee_version, insert the new (epoch_index, fee_version) } else { previous_fee_versions_map.insert( epoch_info.current_epoch_index(), - platform_version.fee_version.clone(), + &platform_version.fee_version, ); } diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs index e937924c94..d2236ef84c 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs @@ -4,8 +4,8 @@ pub mod v0; use crate::error::Error; use crate::platform_types::platform_state::v0::{ - MasternodeListChanges, PlatformStateForSavingV0, PlatformStateV0, PlatformStateV0Methods, - PlatformStateV0PrivateMethods, + MasternodeListChanges, PlatformStateForSavingV0, PlatformStateForSavingV1, PlatformStateV0, + PlatformStateV0Methods, PlatformStateV0PrivateMethods, }; use crate::platform_types::validator_set::ValidatorSet; @@ -42,23 +42,8 @@ pub enum PlatformState { pub enum PlatformStateForSaving { /// Version 0 V0(PlatformStateForSavingV0), -} - -impl PlatformStateForSaving { - /// Retrieves the current protocol version used in consensus. - /// - /// Matches against `PlatformStateForSaving` variants to extract the protocol version. - /// - /// # Returns - /// A `ProtocolVersion` indicating the current consensus protocol version. - #[allow(dead_code)] - #[deprecated(note = "This function is marked as unused.")] - #[allow(deprecated)] - pub fn current_protocol_version_in_consensus(&self) -> ProtocolVersion { - match self { - PlatformStateForSaving::V0(v0) => v0.current_protocol_version_in_consensus, - } - } + /// Version 1 + V1(PlatformStateForSavingV1), } impl PlatformSerializable for PlatformState { @@ -153,11 +138,11 @@ impl TryFromPlatformVersioned for PlatformStateForSaving { match platform_version .drive_abci .structs - .platform_state_for_saving_structure + .platform_state_for_saving_structure_default { 0 => { - let saving_v0: PlatformStateForSavingV0 = v0.try_into()?; - Ok(saving_v0.into()) + let saving_v1: PlatformStateForSavingV1 = v0.try_into()?; + Ok(saving_v1.into()) } version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: @@ -189,7 +174,23 @@ impl TryFromPlatformVersioned for PlatformState { } version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: - "PlatformState::try_from_platform_versioned(PlatformStateForSaving)" + "PlatformState::try_from_platform_versioned(PlatformStateForSavingV0)" + .to_string(), + known_versions: vec![0], + received: version, + })), + } + } + PlatformStateForSaving::V1(v1) => { + match platform_version.drive_abci.structs.platform_state_structure { + 0 => { + let platform_state_v0 = PlatformStateV0::from(v1); + + Ok(platform_state_v0.into()) + } + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: + "PlatformState::try_from_platform_versioned(PlatformStateForSavingV1)" .to_string(), known_versions: vec![0], received: version, @@ -547,3 +548,24 @@ impl PlatformStateV0Methods for PlatformState { } } } + +#[cfg(test)] +mod tests { + use super::*; + + mod versioned_deserialize { + use super::*; + use crate::test::fixture::platform_state::PLATFORM_STATE_V3_TESTNET; + use platform_version::version::v3::PLATFORM_V3; + use std::ops::Deref; + + #[test] + fn should_deserialize_state_stored_in_version_0_from_testnet() { + let serialized_state = + hex::decode(PLATFORM_STATE_V3_TESTNET.deref()).expect("failed to decode hex"); + + PlatformState::versioned_deserialize(&serialized_state, &PLATFORM_V3) + .expect("failed to deserialize state"); + } + } +} diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs index f9fa9d6deb..d1c2ccd464 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs @@ -24,7 +24,11 @@ use crate::platform_types::signature_verification_quorum_set::{ SignatureVerificationQuorumSet, SignatureVerificationQuorumSetForSaving, }; use crate::platform_types::validator_set::v0::ValidatorSetV0Getters; -use dpp::fee::default_costs::CachedEpochIndexFeeVersions; +use dpp::fee::default_costs::{ + CachedEpochIndexFeeVersions, CachedEpochIndexFeeVersionsFieldsBeforeVersion4, + EpochIndexFeeVersionsForStorage, +}; +use dpp::version::fee::FeeVersion; use itertools::Itertools; use std::collections::BTreeMap; use std::fmt::{Debug, Formatter}; @@ -154,15 +158,51 @@ pub struct PlatformStateForSavingV0 { pub hpmn_masternode_list: BTreeMap, /// previous FeeVersions - pub previous_fee_versions: CachedEpochIndexFeeVersions, + pub previous_fee_versions: CachedEpochIndexFeeVersionsFieldsBeforeVersion4, +} + +/// Platform state +#[derive(Clone, Debug, Encode, Decode)] +pub struct PlatformStateForSavingV1 { + /// Information about the genesis block + pub genesis_block_info: Option, + /// Information about the last block + pub last_committed_block_info: Option, + /// Current Version + pub current_protocol_version_in_consensus: ProtocolVersion, + /// upcoming protocol version + pub next_epoch_protocol_version: ProtocolVersion, + /// current quorum + pub current_validator_set_quorum_hash: Bytes32, + /// next quorum + pub next_validator_set_quorum_hash: Option, + /// current validator set quorums + /// The validator set quorums are a subset of the quorums, but they also contain the list of + /// all members + pub validator_sets: Vec<(Bytes32, ValidatorSet)>, + + /// The quorums used for validating chain locks + pub chain_lock_validating_quorums: SignatureVerificationQuorumSetForSaving, + + /// The quorums used for validating instant locks + pub instant_lock_validating_quorums: SignatureVerificationQuorumSetForSaving, + + /// current full masternode list + pub full_masternode_list: BTreeMap, + + /// current HPMN masternode list + pub hpmn_masternode_list: BTreeMap, + + /// previous FeeVersions + pub previous_fee_versions: EpochIndexFeeVersionsForStorage, } -impl TryFrom for PlatformStateForSavingV0 { +impl TryFrom for PlatformStateForSavingV1 { type Error = Error; fn try_from(value: PlatformStateV0) -> Result { let platform_version = value.current_platform_version()?; - Ok(PlatformStateForSavingV0 { + Ok(PlatformStateForSavingV1 { genesis_block_info: value.genesis_block_info, last_committed_block_info: value.last_committed_block_info, current_protocol_version_in_consensus: value.current_protocol_version_in_consensus, @@ -201,7 +241,11 @@ impl TryFrom for PlatformStateForSavingV0 { )) }) .collect::, Error>>()?, - previous_fee_versions: value.previous_fee_versions, + previous_fee_versions: value + .previous_fee_versions + .into_iter() + .map(|(epoch_index, fee_version)| (epoch_index, fee_version.fee_version_number)) + .collect(), }) } } @@ -237,7 +281,57 @@ impl From for PlatformStateV0 { .into_iter() .map(|(k, v)| (ProTxHash::from_byte_array(k.to_buffer()), v.into())) .collect(), - previous_fee_versions: value.previous_fee_versions, + previous_fee_versions: value + .previous_fee_versions + .into_iter() + .map(|(epoch_index, _)| (epoch_index, FeeVersion::first())) + .collect(), + } + } +} + +impl From for PlatformStateV0 { + fn from(value: PlatformStateForSavingV1) -> Self { + PlatformStateV0 { + genesis_block_info: value.genesis_block_info, + last_committed_block_info: value.last_committed_block_info, + current_protocol_version_in_consensus: value.current_protocol_version_in_consensus, + next_epoch_protocol_version: value.next_epoch_protocol_version, + current_validator_set_quorum_hash: QuorumHash::from_byte_array( + value.current_validator_set_quorum_hash.to_buffer(), + ), + next_validator_set_quorum_hash: value + .next_validator_set_quorum_hash + .map(|bytes| QuorumHash::from_byte_array(bytes.to_buffer())), + patched_platform_version: None, + validator_sets: value + .validator_sets + .into_iter() + .map(|(k, v)| (QuorumHash::from_byte_array(k.to_buffer()), v)) + .collect(), + chain_lock_validating_quorums: value.chain_lock_validating_quorums.into(), + instant_lock_validating_quorums: value.instant_lock_validating_quorums.into(), + full_masternode_list: value + .full_masternode_list + .into_iter() + .map(|(k, v)| (ProTxHash::from_byte_array(k.to_buffer()), v.into())) + .collect(), + hpmn_masternode_list: value + .hpmn_masternode_list + .into_iter() + .map(|(k, v)| (ProTxHash::from_byte_array(k.to_buffer()), v.into())) + .collect(), + previous_fee_versions: value + .previous_fee_versions + .into_iter() + .map(|(epoch_index, fee_version_number)| { + ( + epoch_index, + FeeVersion::get(fee_version_number) + .expect("expected fee version number to exist"), + ) + }) + .collect(), } } } diff --git a/packages/rs-drive-abci/src/test/fixture/mod.rs b/packages/rs-drive-abci/src/test/fixture/mod.rs index c52eb0a4c2..4df7078f8c 100644 --- a/packages/rs-drive-abci/src/test/fixture/mod.rs +++ b/packages/rs-drive-abci/src/test/fixture/mod.rs @@ -1 +1,2 @@ pub mod abci; +pub mod platform_state; diff --git a/packages/rs-drive-abci/src/test/fixture/platform_state.rs b/packages/rs-drive-abci/src/test/fixture/platform_state.rs new file mode 100644 index 0000000000..7c8ae424fd --- /dev/null +++ b/packages/rs-drive-abci/src/test/fixture/platform_state.rs @@ -0,0 +1,9 @@ +//! Platform execution state fiixtures +//! + +use std::cell::LazyCell; + +/// Platform execution state v3 from testnet +pub const PLATFORM_STATE_V3_TESTNET: LazyCell<&str> = LazyCell::new(|| { + "00000100fd00000192670b9514fb78b1fc00110ab7fb078b34bbc2a6b045158657746dc5db1105bdd6cb6b28a3adcd8735e91dc2e78d8253000000b91e2a2fe9ab4c3899dc7d2d85c9e00e068603afe59058d5415a84773de28aaaab739907a87bba3ff79428d1c8ef5c2a1f8ae5e8f95dfb32a3e07a767440784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d8a7a96ca935bbc898e4a56cd3865874a44134f0cccff168f01a38d25c03aa3bbfe4234869a8f0e57fbe611139cd6d7ac0a310f08ab1583ed6e70afd63ac3649faff1682184939d0a32f5abf1fbc8eeb487c29332191033d1c156f863c09d34b0000303000000b91e2a2fe9ab4c3899dc7d2d85c9e00e068603afe59058d5415a84773d001820000000f1187cb12e35cb2a20fa7ebaad86a10a07f37a26d91068fcbde0ee462d0020000000f1187cb12e35cb2a20fa7ebaad86a10a07f37a26d91068fcbde0ee462d00fc00110aa8192005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea82005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea80130b15b76938c54f51b8386980eb3b8631b34ccd35c6884830a43ae3e52ff5a273aa5026d4adf2ebb33cf7c678b72eab8bb0d35322e32342e3132342e313632148feb00404d6f765856c95e587b2523a365bc7258fb4e1ffb05a3fb8f30002012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a22012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a201308897e2f392f0e1f2aad3ab24051db60ec4863b99d031c8c8c97b55156547d55cced5bfe08996a05ee652418ea98151870e3231322e32342e3130332e31343914c1161c96de3dae28cd7f20ff8c2aa7b94b866d76fb4e1ffb05a3fb8f300020143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11320143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11301308dd61f6d77efbc7a1f689fed01dbab0566c71a2acf19a0d26b19a4c3daa582ca5d21c5e137df714d513bef879f0bdb040d33352e3136342e32332e32343514b5f25f8f70cf8d05c2d2970bdf186c994431d84efb4e1ffb05a3fb8f30002020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c2020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c0130b661002db656ba258788a2f9af91710a2e91c0d138b2edddde50d651a5173b3f8e248c4c7e22beee609072fc81ac89f30c33352e38352e32312e3137391435d9eb76397d05b43b5cd8da7ccfa8408bc89ab3fb4e1ffb05a3fb8f3000202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb0130a3ad85022b69916fa555be50d6b8d77d5b91f8ca72cc91f106b7f4b9fb806478362d5976a34a5e2b9361262e32defff50d35342e3134392e33332e313637141ffbf1d32541dcb8f5555305295704a9ff9adc24fb4e1ffb05a3fb8f3000203971dab9691efac06e4ce7a5483131373e84726458924fe48b7d541791693be1203971dab9691efac06e4ce7a5483131373e84726458924fe48b7d541791693be10130b0a6419f2650de0abe6cefbe8305b31e5cac7cb80f23472036009076904bb40a7282aae4b3fb6025d437813c3619691b0d39322e36332e3137362e3230321461c274080f47a95be5372ef8c69bb60ab1d4ca82fb4e1ffb05a3fb8f30002040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d2040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d0130b309f7e2254b0d55fd6e75be528f7b05ed8623dcaf0addf51ff50b13cec0312ec15d00b6394981ef2a9c7fcea3549a9b0c35322e31302e3232392e3131143e8b10646ee9d6c28d75c280b357dd3a9ae9f962fb4e1ffb05a3fb8f3000205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a23205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a230130b6f7f4e44b06e8f588473c21d6aa2645b6638eeecdb5f0290889ef7cb3d94b138bd46a4d91b5b56cf9bf96777a13579d0d33352e3136352e35302e31323614f460a07a2b0dc932e1d8ff2dee2b984ac415dcebfb4e1ffb05a3fb8f3000205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef4360130a743d1bf6e3165cb7450b97a907b4b524de83538c85b2110f59bfde026cdce7104c91715e254b77b25175b9c28d8ec9c0d34342e3233392e33392e31353314972a33056d57359de8acfa4fb8b29dc1c14f76b8fb4e1ffb05a3fb8f30002061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb2061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb0130b5286eded79114127ddc14075e3cc71e179f5247c88059e574416224da0e8c2b0cd65f2d1941dc9dfeaa22873e8339880c35322e31322e3137362e3930147ada3e486409b39c94a0833c8d782f35bc24e96afb4e1ffb05a3fb8f3000206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e5286332096601308261037fde2ea2c99bc904ae23c6cb827177aa9dbc70119e1cffa0716681f0e92da1639df91d91c6fd194c128a8add900e34342e3232382e3234322e31383114c374f016ea61e76aab79b8bb95a1ba0e6e3eee6ffb4e1ffb05a3fb8f3000207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf7019207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf7019013099d894f15fd6a36a44f56a48502b6da8315ce203e8b7908105eab9fcf1e8fca01ee40bbf1a67a2828541a0da9e3d21fb0d35342e3138392e3136342e333914f9956e70daffa263e8cf29fa6557b7b630a595a8fb4e1ffb05a3fb8f300020754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e20754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e0130a8a91ee2617de812f7f1cc2c4fbbf2cea408edaf225a8da74761f6ca6cbed60b2054ff1730f54298e82af67d888042470c34342e3233332e34342e39351446d938862af6d9a291e26c0048177db2892a710bfb4e1ffb05a3fb8f3000207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be42900130b2631ef598d8bebfbcb40b6653250d25d07e42be82709160b1d01e4d3e59af5c3be2262d88ee86c91385ba3b35ce15b10d34342e3232372e3133372e3737140498ade3c80045c2a7520e921180ae1c39da5c57fb4e1ffb05a3fb8f30002085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8242085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8240130b84771f8c123270fcee41986222050294edde00dbbc2abdb2e24dfdcbed36383ea34261eecdf4684e9be3339c235a44c0d35342e3230312e33322e3133311468c506d43816d1a8389c860c1d162be44d1e777cfb4e1ffb05a3fb8f3000208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc40130961e707780b035e2bf7d82ad6a98a82b81615d31129f9be4a43b7ac0e91a7a4f408836b1a067605bc4cb8bb1699c8d190c35322e34332e38362e32333114337b7fb5d2c531825c3e0123ac3354018085b302fb4e1ffb05a3fb8f3000208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f0130ae4d8adbece1973d8625d725a644a1dbeb36dcda498040abc45392caa46f515be917ea83400be5342cad96304dc321460d35342e36382e3233352e32303114c075993a8336f93a13bb7bbb7e0e89928be4aafbfb4e1ffb05a3fb8f3000209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df540130ab0a7879ee8ad513c0633490d3e86ab2645ff07701f24cd887b9f3bcf1c38baef517a76b2641d0fa47f0be61d368b5d20d33352e38322e3139372e31393714ed1131823bcea23ac78af8c01e4d24683d6ecf88fb4e1ffb05a3fb8f30002098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920962098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba09209601308bd3c1a90462ec65d5df7e3e8f93b67f57e174c1c272d7a33bf6faabc28daccd899f88e208379378be95ac500d7713570c34342e3233322e3139362e3614d6ece912cbf02627a4efc3dd37e6833cf3671551fb4e1ffb05a3fb8f3000209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c01308b10630f61ec66b84180ad865634e62a22448b595d8f1876da42c87dcc63c5601f393fccfed6bfb17cbe0c0db125c86a0c33342e3231342e34382e36381462e960a3f6b650feed98a266b3ccdf6e363562cffb4e1ffb05a3fb8f300020ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e25421620ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e2542160130a668ab57cd5700686114d03df153295640e5939144d84fb386ee9811ac459cc48876013df04ad44cca5d27461492e95b0d35322e34322e3230322e3132381462e0104ce0aafc1f06bde37c73702fe84b307f05fb4e1ffb05a3fb8f300020c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba820c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba8013094ea96483a36db9fb9647a2fbaf2bf3df39a9e375ae7a8a8b81c71d4ef5e33f704e69ad50d20ca9a1164484ffd5289a00d35342e3231332e3230342e383514fdae7cdf38811659ce9481975b326a5d07236bc5fb4e1ffb05a3fb8f300020d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8920d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8901308ceddd73271ab74091fe496bea3786f10d49b68eeb5357300fd5e71c295b726666da80631ad29a5d7cee5ff9eba6b1e10d34342e3234302e39382e313032147034f0d3853c5351fb8e0ffd3c1daf12c51c2d89fb4e1ffb05a3fb8f300020f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba786399038120f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba78639903810130adef1c638134ebeb1fe996643698f056c4f0c90c2f122d70dbdccc83abc04f9c558d9dd95084443f3c238c0ecff2977b0d35322e31332e3235302e31383214fe2d4798df3e9b41a6823bc0b3f020478e87925dfb4e1ffb05a3fb8f300020ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac920ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac90130a9b37ba5ebf8695acb31339b2200e7b34881d809654003fb2845e48e24819cfaae2833da5fec3547d51869acaef931290d35342e3138372e31342e3233321467e05b1b52c7c896adf20035036fe1d30dcefc9cfb4e1ffb05a3fb8f300030a6cbd47ba3201352f0e23d2434f83e1e2029b2514e7273280f9c0a746ce81624e99290d62ddd96097068ef7999d326e4200000004689a842c049d460ee314df1bbfa36530ff86632142fe3b6eee824003400200000004689a842c049d460ee314df1bbfa36530ff86632142fe3b6eee824003400fc00110a90192005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea82005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea8013084d7ad239563f639a16a9cdb055a81e683f2a0c654f882c9a54d38c2bc10c110da7829f313e9f4b2c70651207cb273110d35322e32342e3132342e313632148feb00404d6f765856c95e587b2523a365bc7258fb4e1ffb05a3fb8f30002012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a22012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a201308942b5fe5ab5b6636bc0ebfff21dc7a21f0397cc2ea9362e9b476b10b5668aae608dbf5f1ece54a479747634d74041ea0e3231322e32342e3130332e31343914c1161c96de3dae28cd7f20ff8c2aa7b94b866d76fb4e1ffb05a3fb8f300020143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11320143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f113013084cd7e8744a28e4036feedf3b6f3d691c8ea21e8e69f0c862215e51a15a51205799f0fa0516c7b7cf02b691dca89d2f50d33352e3136342e32332e32343514b5f25f8f70cf8d05c2d2970bdf186c994431d84efb4e1ffb05a3fb8f30002020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c2020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c01308de99ca88d7256389dd5c27ac00b98b95bbead6c7b3008fd8dc6bdaec9f4fe1110f7ffe0fc7ad40aefa37919df04968d0c33352e38352e32312e3137391435d9eb76397d05b43b5cd8da7ccfa8408bc89ab3fb4e1ffb05a3fb8f3000202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb0130aaf815d4d59789b72527426251177acf276c39c3113810b9e6614fc866ae21a3f65cbde04edccd8bf791940b73fa84ea0d35342e3134392e33332e313637141ffbf1d32541dcb8f5555305295704a9ff9adc24fb4e1ffb05a3fb8f30002040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d2040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d0130a4cad187d6efd489b5bac71f56ec6b91e8ed6965bbdd4bebe898678716ddc8a6b7d4e6a0a6fa17bc91a4c1c16d1e64930c35322e31302e3232392e3131143e8b10646ee9d6c28d75c280b357dd3a9ae9f962fb4e1ffb05a3fb8f3000205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a23205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a230130b222d9014e083f3b542bae5c3daaa94ab024b602e39e045a279d101c128214d1a7d9742e8afa7a6140de6ad61eaf421a0d33352e3136352e35302e31323614f460a07a2b0dc932e1d8ff2dee2b984ac415dcebfb4e1ffb05a3fb8f30002061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb2061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb0130aa2538b75155fe0304fde0c908be3deacc9abae62bcc0e0336f9cc0c24583d55ff3959963affeb7afcf2a6a0bd6d61410c35322e31322e3137362e3930147ada3e486409b39c94a0833c8d782f35bc24e96afb4e1ffb05a3fb8f3000206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966013099f0aa551bd2df9baf3eb6adf0261df8a749a9413f62dd8473fd6ab03b3a6917157a1b5d3b01307d4b32d65fd495be8f0e34342e3232382e3234322e31383114c374f016ea61e76aab79b8bb95a1ba0e6e3eee6ffb4e1ffb05a3fb8f3000207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be429001308a81e53c43f6ecb09730e937d44984c697938ad776c58424eb626580507642977097ce8daee7ca61e0e8e052fcc44a820d34342e3232372e3133372e3737140498ade3c80045c2a7520e921180ae1c39da5c57fb4e1ffb05a3fb8f30002087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789182087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789180130b361d2179cadf86c3d4788078a5380afe844c3b354a4336a35ef6fb774a565f3c1319e597841f87182d6dbce0527ec180e33352e3136372e3134352e313439149b9cdbfe3568cc0b37f136b00a634c75653f05e3fb4e1ffb05a3fb8f3000208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f2340130aa71b13016a1a1fee60d1db3d6987aafcbb813e7cb4ade9766f0b9ea92a89eaefbf540af24d4b7fd021565041edd1ade0d35322e31332e3133322e313436145bdbf34a0dad860c6ec71523ae39373325225cc1fb4e1ffb05a3fb8f3000208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e08150130b886ecda081643bc5e24dfe7d0403bd2639afebf056cbde277b5558e2d497837f26c0acc02d3742e298c5e8ad3f83a650c35322e33342e3134342e353014a0a0e17bfe82a484fefe348b7569a6d77d29d2c2fb4e1ffb05a3fb8f3000208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4013091b43a2470e00f9aa20ca5f759bfc2181a9822830f057c299ed9f5324f5266c7f3fbc934a4a20baa9a01563a12632fc60c35322e34332e38362e32333114337b7fb5d2c531825c3e0123ac3354018085b302fb4e1ffb05a3fb8f3000208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f0130b35c64527fbc2578fd2723311fe76a4ef602f9314596f9133a2626aa2bd818a828d067946799b3150e25324e0e77e4790d35342e36382e3233352e32303114c075993a8336f93a13bb7bbb7e0e89928be4aafbfb4e1ffb05a3fb8f30002091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d2091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d01308b8a33b1554491346591a0147b376489af1adac664b6a0b2b4c542627553429c6dfde43048681ae55cd12ea84806fa880c35322e34302e3231392e34311402aa69f8ef6666e7cad6d9323755a0ef3c1b6bd9fb4e1ffb05a3fb8f3000209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54013099cc490e6796af6a93c03be74e46603ee8d597a40c53fee0ef58cde0dd5c70526c6da8b633d2f231d4a1b6ab12329e330d33352e38322e3139372e31393714ed1131823bcea23ac78af8c01e4d24683d6ecf88fb4e1ffb05a3fb8f30002098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920962098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba092096013097309058064a4efd3dac7d1f83e0c9acaf820cc26be3844e38260203eb9de1ab343b85663df57db01030231a58fe51300c34342e3233322e3139362e3614d6ece912cbf02627a4efc3dd37e6833cf3671551fb4e1ffb05a3fb8f3000209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c013091408bdb75e94dcd5f529e04d40e1338cdd59105e20f644f30035345bd8a1abb4f26a30ed33a5f718fc0651d5e3ea17e0c33342e3231342e34382e36381462e960a3f6b650feed98a266b3ccdf6e363562cffb4e1ffb05a3fb8f300020b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f20b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f0130804761ed1300c056087c87255d97a6163b5583f9db147b4c13a302783e03ccb91b9c41bd85b5749e6ac1cd66618ee2c80b35322e34332e31332e39321441b308f737ca9e39f67b553158903198a88c516efb4e1ffb05a3fb8f300020ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e25421620ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e2542160130b18bb95e55a3159681810e3bba2d820554605bbe094863d2175a58a729ccb5d5c4005668ad5e1568a5a4e6fc9e44868a0d35322e34322e3230322e3132381462e0104ce0aafc1f06bde37c73702fe84b307f05fb4e1ffb05a3fb8f300020c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba820c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba80130ac27a016518e3768ba8fdcb01af7a6c3668e2594d90f2d199491cd82b4bd1b8f46f869aa9ca3b82c592360222cded8690d35342e3231332e3230342e383514fdae7cdf38811659ce9481975b326a5d07236bc5fb4e1ffb05a3fb8f300020d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8920d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f890130aaab1fef4dd9ec25e263524b62b04151d74a51f94bd0bd1d96a69ec372827c0c4e5a3f157e6bcbc5bc9c8f52119e670b0d34342e3234302e39382e313032147034f0d3853c5351fb8e0ffd3c1daf12c51c2d89fb4e1ffb05a3fb8f300020f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba786399038120f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba78639903810130a3eb4ba1d46723c1321ae975611049a27cffa5de8a9d86348c8f8e00432f515b71e6846a26c466d559db3d0fb24bc70a0d35322e31332e3235302e31383214fe2d4798df3e9b41a6823bc0b3f020478e87925dfb4e1ffb05a3fb8f300020ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac920ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac9013093fecca26bf5ad7a125463e41ec77a3e3fc962672fd71ae5982bfb3c0b0dda2276c9a8df4b42795034bf6642c9043b140d35342e3138372e31342e3233321467e05b1b52c7c896adf20035036fe1d30dcefc9cfb4e1ffb05a3fb8f300030b3c85502f9c7789d7ce97199d4b411ee93a771c0209bc6a6b61e3b637eb8f2de1778f8a9c2bbd18ef27a07ac2b7f2121200000010832789d4cdff3cc8a63fad668ccac708af7433c42e189ada6c6e5e66e00200000010832789d4cdff3cc8a63fad668ccac708af7433c42e189ada6c6e5e66e00fc00110a78192005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea82005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea80130a9f8fc1cbb8413542a88a12c2bd8ed37d164176e3ec69ef1da36b17732e9edfe26d5a4637b714871c0969e85c5ed49340d35322e32342e3132342e313632148feb00404d6f765856c95e587b2523a365bc7258fb4e1ffb05a3fb8f300020143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11320143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f1130130b77c254aa8967f93938cccda412ff4cc2ae33c1632fdf22d6d6e01e350bee7cda4293fcf7bdd08421a89d89d31f3d3700d33352e3136342e32332e32343514b5f25f8f70cf8d05c2d2970bdf186c994431d84efb4e1ffb05a3fb8f30002020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c2020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c0130a95cfa0fb3e2b7405577f766f10f8a527b4f0ea8da4fd9e308eaef910c82b6bfe395ebac71d7344db812de815e0b7a6e0c33352e38352e32312e3137391435d9eb76397d05b43b5cd8da7ccfa8408bc89ab3fb4e1ffb05a3fb8f3000203971dab9691efac06e4ce7a5483131373e84726458924fe48b7d541791693be1203971dab9691efac06e4ce7a5483131373e84726458924fe48b7d541791693be10130972fa1195e580291865db0045df4ca36e3775c91bc14107259ecde0fbbabaa90c965949a00cd11e9a7c288d9b325edb00d39322e36332e3137362e3230321461c274080f47a95be5372ef8c69bb60ab1d4ca82fb4e1ffb05a3fb8f30002039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a2039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a01308ce9094c3230172b326a5ee57a2f76413371a66bda5c34c6ef0f0f62cef8fab9fa44b9423c182ca2e8779d17b77bb14a0e33352e3136332e3134342e32333014ec7bf3b9bc72eda38c80bb7cf16e294e763e56b4fb4e1ffb05a3fb8f30002040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d2040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d0130b5b6cda330445e2e8ae0289b476aab0b925f0f6f62975c2af939512ab2ecb00a669a099c9d1a9f3b1c322eed82a0a6430c35322e31302e3232392e3131143e8b10646ee9d6c28d75c280b357dd3a9ae9f962fb4e1ffb05a3fb8f3000205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a23205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a230130a99d91eda26d9a436188ecfce2df4f7afc9954764a421234713f1083fd445abd9733e0b8bbf0e6fe43db02cfa07fb11f0d33352e3136352e35302e31323614f460a07a2b0dc932e1d8ff2dee2b984ac415dcebfb4e1ffb05a3fb8f3000205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef43601308c2bf1a5c7782b57c78edc0c9a780bb03fd12b563b43cdf7f0b1e1e96081f8d11d3e131988f37ebe2799eaaedbd065c40d34342e3233392e33392e31353314972a33056d57359de8acfa4fb8b29dc1c14f76b8fb4e1ffb05a3fb8f3000206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e528633209660130a2a5775aec8818a7914b1a610d095343e5e54e3834a51fe0c2c8b0d85e5e347bbc205a2cc19d665da624996f5c797a520e34342e3232382e3234322e31383114c374f016ea61e76aab79b8bb95a1ba0e6e3eee6ffb4e1ffb05a3fb8f3000207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf7019207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf70190130b2613f4f71b8cb2d6d5d40312bb676bf0272fcb4d141e2aa23dfe8698655a4c1c93150b244488a13f5cf60dc3301c1830d35342e3138392e3136342e333914f9956e70daffa263e8cf29fa6557b7b630a595a8fb4e1ffb05a3fb8f300020754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e20754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e0130ae815e003eeb65606f18a624ca248f83c1a70c168b15a75d935127fa479ba75a30d734d40b008c4f26e6b384957837fc0c34342e3233332e34342e39351446d938862af6d9a291e26c0048177db2892a710bfb4e1ffb05a3fb8f3000207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be42900130b0b9f5db3633b48d5359d5b8d9e99f2eaf5e6603fae01746602f538e8d9e923ff1f47a5f84ff0be24d24d6e80d2710df0d34342e3232372e3133372e3737140498ade3c80045c2a7520e921180ae1c39da5c57fb4e1ffb05a3fb8f30002087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789182087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789180130a36373377b1befa6f35aec8f2c56b95433324e2526748116338d7cda1274090cca1c69959b02e3f9c97a1787798e05ac0e33352e3136372e3134352e313439149b9cdbfe3568cc0b37f136b00a634c75653f05e3fb4e1ffb05a3fb8f3000208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f2340130ab3ac53a601829b7d999c55095069f25b6df87616d2276386b3eb28c68a861ce46352a008ce967f2a9b68c06a41cab1a0d35322e31332e3133322e313436145bdbf34a0dad860c6ec71523ae39373325225cc1fb4e1ffb05a3fb8f3000208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e08150130a42e3e2fdf2fe5c7f368e695f0649831a6817d8670f895c9b1475836a284ae985703ef520b369adff6a4fc00edc4cfff0c35322e33342e3134342e353014a0a0e17bfe82a484fefe348b7569a6d77d29d2c2fb4e1ffb05a3fb8f3000208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc40130a1172e43ca64a94af9ebc84191b9a8d071c4ef72f2d20a1d4982753e6a875821784dfd5b81f9670fd3c88ba79bfd74800c35322e34332e38362e32333114337b7fb5d2c531825c3e0123ac3354018085b302fb4e1ffb05a3fb8f3000208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c00130b9f7bdfe0077e3a924a4d881683a3a51aa4204329451ce160c83c78a908eae5614e965220e26daff6894bcad781c06250c35322e38392e3135342e3438146d57707c196e06487d326094c964f258f5b77c35fb4e1ffb05a3fb8f3000209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df5401309362f6b7585fe368cd6e82e0ac831ebfb04d65663a3f997db0c55b6397e73565f691f4968ba9e60418b94f6e1b8466430d33352e38322e3139372e31393714ed1131823bcea23ac78af8c01e4d24683d6ecf88fb4e1ffb05a3fb8f30002098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920962098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920960130a8f426b9e58b4448cb7fcc01f05196567b7cca3ae0b601dbe096853916cab1c4c3e6e77fb59d0e944d5546fb3e74099e0c34342e3233322e3139362e3614d6ece912cbf02627a4efc3dd37e6833cf3671551fb4e1ffb05a3fb8f3000209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c013088e2df5210ce24801f4fd9fed061152862ac4bf8209ce7a9635581d9e204ad2aca8dac837a392f2e692fffd2bd18d8890c33342e3231342e34382e36381462e960a3f6b650feed98a266b3ccdf6e363562cffb4e1ffb05a3fb8f300020b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f20b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f0130a3079ebff53a2eaa226c29515eb1f2f83c32a9f8730c1cfd22af38823153046ec09afdd6439b21de4c0ec7943e3ff5640b35322e34332e31332e39321441b308f737ca9e39f67b553158903198a88c516efb4e1ffb05a3fb8f300020bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb820bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb80130b6083baad99daa8ef067cbaa396436591c52f338cb89ecdf76ab9804c4b02ee9934df13205c483167edaaf446609e6420c33352e38322e34392e31393614dbbebbc52a5bae21b818e0487311041c91b2683bfb4e1ffb05a3fb8f300020c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba820c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba80130a87180e5349d3e6f9472bf19021fb38c8363b36d53feae8f57754e68676b2ba1ceb7680879981cb63fbf51c8f96323790d35342e3231332e3230342e383514fdae7cdf38811659ce9481975b326a5d07236bc5fb4e1ffb05a3fb8f300020d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8920d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f890130a5b8be704d75fba99633db0e207603eacf3fc51a77b15d3f73ce6b75de19dcce4b5a3ca86b247b1414cb13bfd21d67c80d34342e3234302e39382e313032147034f0d3853c5351fb8e0ffd3c1daf12c51c2d89fb4e1ffb05a3fb8f300020f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba786399038120f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba786399038101308ed36f99ba583e180b66367374229462d8f7826abbff8c3422107d5c17a2c624bd3a154c0eae0e44f3f56d06b4da4d0e0d35322e31332e3235302e31383214fe2d4798df3e9b41a6823bc0b3f020478e87925dfb4e1ffb05a3fb8f300030b10b6159372531cd813094527b17eef8a077d4300503c6fc147e07abb40ed05a32fcfdd166e91d1c54a388d0d0f5df4f2000000072da33f586cdd86a566cb30268f411dad855dc3fd18c5669410c7cdaea002000000072da33f586cdd86a566cb30268f411dad855dc3fd18c5669410c7cdaea00fc00110a60192012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a22012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a2000e3231322e32342e3130332e31343914c1161c96de3dae28cd7f20ff8c2aa7b94b866d76fb4e1ffb05a3fb8f300020143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11320143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f113000d33352e3136342e32332e32343514b5f25f8f70cf8d05c2d2970bdf186c994431d84efb4e1ffb05a3fb8f30002020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c2020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c000c33352e38352e32312e3137391435d9eb76397d05b43b5cd8da7ccfa8408bc89ab3fb4e1ffb05a3fb8f3000202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb000d35342e3134392e33332e313637141ffbf1d32541dcb8f5555305295704a9ff9adc24fb4e1ffb05a3fb8f3000203971dab9691efac06e4ce7a5483131373e84726458924fe48b7d541791693be1203971dab9691efac06e4ce7a5483131373e84726458924fe48b7d541791693be1000d39322e36332e3137362e3230321461c274080f47a95be5372ef8c69bb60ab1d4ca82fb4e1ffb05a3fb8f30002039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a2039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a000e33352e3136332e3134342e32333014ec7bf3b9bc72eda38c80bb7cf16e294e763e56b4fb4e1ffb05a3fb8f3000205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436000d34342e3233392e33392e31353314972a33056d57359de8acfa4fb8b29dc1c14f76b8fb4e1ffb05a3fb8f30002061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb2061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb000c35322e31322e3137362e3930147ada3e486409b39c94a0833c8d782f35bc24e96afb4e1ffb05a3fb8f3000206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966000e34342e3232382e3234322e31383114c374f016ea61e76aab79b8bb95a1ba0e6e3eee6ffb4e1ffb05a3fb8f3000207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf7019207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf7019000d35342e3138392e3136342e333914f9956e70daffa263e8cf29fa6557b7b630a595a8fb4e1ffb05a3fb8f300020754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e20754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e000c34342e3233332e34342e39351446d938862af6d9a291e26c0048177db2892a710bfb4e1ffb05a3fb8f30002085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8242085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be824000d35342e3230312e33322e3133311468c506d43816d1a8389c860c1d162be44d1e777cfb4e1ffb05a3fb8f30002087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789182087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d678918000e33352e3136372e3134352e313439149b9cdbfe3568cc0b37f136b00a634c75653f05e3fb4e1ffb05a3fb8f30002088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f2088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f000b35322e33332e32382e343714711fd9548ae19b2e91c7a9b4067000467ccdd2b5fb4e1ffb05a3fb8f3000208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234000d35322e31332e3133322e313436145bdbf34a0dad860c6ec71523ae39373325225cc1fb4e1ffb05a3fb8f3000208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815000c35322e33342e3134342e353014a0a0e17bfe82a484fefe348b7569a6d77d29d2c2fb4e1ffb05a3fb8f3000208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4000c35322e34332e38362e32333114337b7fb5d2c531825c3e0123ac3354018085b302fb4e1ffb05a3fb8f3000208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0000c35322e38392e3135342e3438146d57707c196e06487d326094c964f258f5b77c35fb4e1ffb05a3fb8f3000209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54000d33352e38322e3139372e31393714ed1131823bcea23ac78af8c01e4d24683d6ecf88fb4e1ffb05a3fb8f30002098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920962098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba092096000c34342e3233322e3139362e3614d6ece912cbf02627a4efc3dd37e6833cf3671551fb4e1ffb05a3fb8f300020b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f20b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f000b35322e34332e31332e39321441b308f737ca9e39f67b553158903198a88c516efb4e1ffb05a3fb8f300020bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb820bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb8000c33352e38322e34392e31393614dbbebbc52a5bae21b818e0487311041c91b2683bfb4e1ffb05a3fb8f300020c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba820c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba8000d35342e3231332e3230342e383514fdae7cdf38811659ce9481975b326a5d07236bc5fb4e1ffb05a3fb8f300020f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba786399038120f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba7863990381000d35322e31332e3235302e31383214fe2d4798df3e9b41a6823bc0b3f020478e87925dfb4e1ffb05a3fb8f300020ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac920ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac9000d35342e3138372e31342e3233321467e05b1b52c7c896adf20035036fe1d30dcefc9cfb4e1ffb05a3fb8f3000308363bb90232bac7a56c8a751b0e92029974d09eb0d894ddfa56e2cead1d7204e820692844e3ddbe248f477633e0c903b20000000e5d8948d2c695de557f1327a8f323fe00ea463ab53d415589456cae5430020000000e5d8948d2c695de557f1327a8f323fe00ea463ab53d415589456cae54300fc00110a48192005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea82005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea80130969e860529b2ff3468eb673067a839e89cb70cd1d945192b91965bd36d5d3fa4fe504619892c15f98225e79a3a7d47090d35322e32342e3132342e313632148feb00404d6f765856c95e587b2523a365bc7258fb4e1ffb05a3fb8f300020143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11320143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f113013084cd37a5e9a78f8b1dd5642869b38051aeb448e0fd7f1d3848e33d649fc4631d4d49ff0931a050d59790bd0531f397200d33352e3136342e32332e32343514b5f25f8f70cf8d05c2d2970bdf186c994431d84efb4e1ffb05a3fb8f3000202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb01308deb2b0dff4093f71fbafc7bae4b29b17ea30485ece48b32470952f9126356b873514122831c2951e7a3abb6f9a81bbe0d35342e3134392e33332e313637141ffbf1d32541dcb8f5555305295704a9ff9adc24fb4e1ffb05a3fb8f3000203971dab9691efac06e4ce7a5483131373e84726458924fe48b7d541791693be1203971dab9691efac06e4ce7a5483131373e84726458924fe48b7d541791693be10130a5f030ce39676a17427193f0ca4cc9ee43a4f902e107773cfa1e540b26cad7f267e8c3079b8cdf4c0add74a2e84dcea30d39322e36332e3137362e3230321461c274080f47a95be5372ef8c69bb60ab1d4ca82fb4e1ffb05a3fb8f30002039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a2039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a01308ebbe8af7fc4642314003a46929b4099c64842f64f9e69e6da327632aba34d40b35aea294ee5cb61d3d9acdaae8cd38b0e33352e3136332e3134342e32333014ec7bf3b9bc72eda38c80bb7cf16e294e763e56b4fb4e1ffb05a3fb8f3000205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a23205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a230130a63effa991db7f60139f66d7ce6d9b009b50415bea8a473e308d23b984e95c16e65dd19080c9dd203f0ff7a73a5946540d33352e3136352e35302e31323614f460a07a2b0dc932e1d8ff2dee2b984ac415dcebfb4e1ffb05a3fb8f3000207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf7019207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf701901308227fa4a5a3770831ee93c7f52edb284567beaf78c37ae47c6731589cafe50efd98478cb2b078310199b36b08a8c3e670d35342e3138392e3136342e333914f9956e70daffa263e8cf29fa6557b7b630a595a8fb4e1ffb05a3fb8f300020754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e20754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e0130aefc5fd6504acb6801a3531e8ca8c42a57c9891f61a505114dec9f0607aaa15ac5f1ab94f5b46c3bff9b12a31ee82b7b0c34342e3233332e34342e39351446d938862af6d9a291e26c0048177db2892a710bfb4e1ffb05a3fb8f3000207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290013085d05de36a1b5ed656048a64569cf42a5807ce65c29a91c2b3a00f8bf9bdabe99715d3d62b8aab75b7173fcb36862abd0d34342e3232372e3133372e3737140498ade3c80045c2a7520e921180ae1c39da5c57fb4e1ffb05a3fb8f30002085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8242085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8240130a7c71dc1a14889412cd99e7c2714560d81fc63ec74ce9e6aff290503d28e4283fa41c09f7f33a0fa039cfdfeac4e71d70d35342e3230312e33322e3133311468c506d43816d1a8389c860c1d162be44d1e777cfb4e1ffb05a3fb8f30002087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789182087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789180130a858472dffbc0aabf6e25b30037d38a71a563359fce61c7f8636e15c16ed7373fef2ce7e476761c6c8f5c8d945fd976b0e33352e3136372e3134352e313439149b9cdbfe3568cc0b37f136b00a634c75653f05e3fb4e1ffb05a3fb8f30002088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f2088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f01308b0b6b19ffd7b384cc664de9d04e0bc65d75374df2ae888489812b122294904372b8df973d58795578e2f960692b46650b35322e33332e32382e343714711fd9548ae19b2e91c7a9b4067000467ccdd2b5fb4e1ffb05a3fb8f3000208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f2340130844d1bba28048dd41472b1c2b663cc37dbbe7633ce65d6d514a99b13234760ed0df5644596438d4ac52570742bcb564d0d35322e31332e3133322e313436145bdbf34a0dad860c6ec71523ae39373325225cc1fb4e1ffb05a3fb8f3000208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e08150130a04e60f14500bec7d0a9dd2800de360694d7557767791090c96a271e854f74ec3cb9b6f77bf73a8ac6a8385b14f684850c35322e33342e3134342e353014a0a0e17bfe82a484fefe348b7569a6d77d29d2c2fb4e1ffb05a3fb8f3000208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc40130b122c5d8c54ed1f6697988003e6cf37ab70b25bd700e3c5217d85f56af1454b9e03a3ebf8882af455650e1ec1cf6e02f0c35322e34332e38362e32333114337b7fb5d2c531825c3e0123ac3354018085b302fb4e1ffb05a3fb8f3000208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c00130b5a22609f0513b65e2157a13109628f1b5a58802347518e7b16edc63d7f555e9218c437b67cef2f5c2e0852fa39f2ead0c35322e38392e3135342e3438146d57707c196e06487d326094c964f258f5b77c35fb4e1ffb05a3fb8f3000208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f0130b52c68fe953aa91acadea41238e533cf63e0fe775d9bfad8cf300d746517e9141e1e09ed9470f50f599fc3726108a3a80d35342e36382e3233352e32303114c075993a8336f93a13bb7bbb7e0e89928be4aafbfb4e1ffb05a3fb8f30002091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d2091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d013090d6d5f5e92a3cf42953447fc2993da64507785ab28e8d800f24a203759ec184ecb4581bf4bc797265d159db56ad21130c35322e34302e3231392e34311402aa69f8ef6666e7cad6d9323755a0ef3c1b6bd9fb4e1ffb05a3fb8f30002098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920962098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba09209601308ce455a85113cbb3f226996c42cffe8ec3c18879e7f3351844b36bd6f455d092f26e1593c67847077b794e9b9338df500c34342e3233322e3139362e3614d6ece912cbf02627a4efc3dd37e6833cf3671551fb4e1ffb05a3fb8f3000209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c01308bde4bc57ed1376b3c1ea5cbfa427aa4e7f5458d3bb7bbcdd3edf5ff1316d636082ecf6adf8d91a6b1f294743e09e0e40c33342e3231342e34382e36381462e960a3f6b650feed98a266b3ccdf6e363562cffb4e1ffb05a3fb8f300020ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e25421620ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e2542160130b5c487a28336e7e237dc06a260855ccadac81c0befca82d851f59a62dd037dbf4245a9c8d3851993c39b831a4ae41e800d35322e34322e3230322e3132381462e0104ce0aafc1f06bde37c73702fe84b307f05fb4e1ffb05a3fb8f300020bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb820bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb80130b1538d4316211a05c7e88931ab8c9ac68bf59f3a157be38c7c59db2e0edd27ab4acf632546aaaf74da4c3c52da02c3a90c33352e38322e34392e31393614dbbebbc52a5bae21b818e0487311041c91b2683bfb4e1ffb05a3fb8f300020c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba820c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba80130a042172d66535219d6616449610f3257ea2a1661ab700ad8e242f56e708fdd4328005f7a256e90c48b58660d73c895e20d35342e3231332e3230342e383514fdae7cdf38811659ce9481975b326a5d07236bc5fb4e1ffb05a3fb8f300020f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba786399038120f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba78639903810130b1897a9037794f448cb3d65fcfe458a68af52b1193075b21f5c54ceb480b50aacafc12c705ecbeab07655a5db52344920d35322e31332e3235302e31383214fe2d4798df3e9b41a6823bc0b3f020478e87925dfb4e1ffb05a3fb8f300020ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac920ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac90130ac6b9425d33076bd863a8331058733b29ec6da69d70936e7af23576e747971d7e1f54ecbcbe92e70cc9a4ea725d9bffa0d35342e3138372e31342e3233321467e05b1b52c7c896adf20035036fe1d30dcefc9cfb4e1ffb05a3fb8f300030b9b745e239b0131f2ae8386bf2512c0548e499cbcb27d722b29982c464f3f4854dffd934fc633ca893a8b20b76b4b5cd200000000b8cd4ead1ee12d25126921d918020cd77745d9cce5b59f7287a2a296e00200000000b8cd4ead1ee12d25126921d918020cd77745d9cce5b59f7287a2a296e00fc00110a301920143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11320143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f1130130804fb84c41e4ef70fa136be9e1b4a1de7509d51d4f4f48ad0be8b6689cfb888b3376611201c88f8d2ff4b8bbc8859ab10d33352e3136342e32332e32343514b5f25f8f70cf8d05c2d2970bdf186c994431d84efb4e1ffb05a3fb8f30002020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c2020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c0130966937f030398b1e57153a449a48f5a8cc4b17782b4553075050498ed6acae479e1b8f053ba7fea2dcdb8511b01cc8330c33352e38352e32312e3137391435d9eb76397d05b43b5cd8da7ccfa8408bc89ab3fb4e1ffb05a3fb8f3000202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb0130a0e490268a9ac6f614abda6d2c9773f78027df23205e51319d26e4a59e6226dbd2d44dadf21a7fc2af9bfa4491436e0e0d35342e3134392e33332e313637141ffbf1d32541dcb8f5555305295704a9ff9adc24fb4e1ffb05a3fb8f30002039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a2039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a013088e19fb0f79180331d93d2e1a9bd84a2b35505cc72aefef50d427196df3025478cf19f15478dc4f8e36379a2c762946d0e33352e3136332e3134342e32333014ec7bf3b9bc72eda38c80bb7cf16e294e763e56b4fb4e1ffb05a3fb8f3000205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a23205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a230130995b7089c977df3b5855d481b20dddfc3a203a0b28c0d899929948e3c634138d0d6e4166b95a62bf2aeb7bfb77b33b430d33352e3136352e35302e31323614f460a07a2b0dc932e1d8ff2dee2b984ac415dcebfb4e1ffb05a3fb8f3000205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef4360130a8cddde49c1a90c2977def8b0cb06bf1f1545163c01accb8d5b489c6a57b86da38fe13ad211315efb16065d049edb6d90d34342e3233392e33392e31353314972a33056d57359de8acfa4fb8b29dc1c14f76b8fb4e1ffb05a3fb8f30002061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb2061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb0130a979e9907653676d99ad236d9d7ad7f1caa7b8c145a631e86e9a3c7f217bf1af6c96f591860661775bd0703bad1be8c50c35322e31322e3137362e3930147ada3e486409b39c94a0833c8d782f35bc24e96afb4e1ffb05a3fb8f3000206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e528633209660130b2af25880010cc44b694bfd03af48b1d67d1c8f7799aba3803537d66bad445b5a9ade42f1a169d82e29ec29d5b509e670e34342e3232382e3234322e31383114c374f016ea61e76aab79b8bb95a1ba0e6e3eee6ffb4e1ffb05a3fb8f3000207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf7019207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf7019013097d6313c96e3d4a72866547f8b6946b0b16027404c3941645533649fab02ce8c68c1b1fe153ebfc450ac4f0c197de8220d35342e3138392e3136342e333914f9956e70daffa263e8cf29fa6557b7b630a595a8fb4e1ffb05a3fb8f300020754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e20754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e0130985bda42120b76d3118d53f76ff49f8f1056a6d9044c165498acd2449afcf0f04928090aacce43f95bb1130f1774c2a10c34342e3233332e34342e39351446d938862af6d9a291e26c0048177db2892a710bfb4e1ffb05a3fb8f3000207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be429001308c99f0600654d103f2cc2e8afd413f92ce0b1703e4b2695e441ea6ca41c04aa02b17a417f537c3738fc2d55c9d7c465c0d34342e3232372e3133372e3737140498ade3c80045c2a7520e921180ae1c39da5c57fb4e1ffb05a3fb8f30002085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8242085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8240130b3ebfc2a01c5e5f81e5b751db91cbbb2dd28a8125221d91c7cabe348abea7140ba157311cb0706e8b2a021ca4b9df7980d35342e3230312e33322e3133311468c506d43816d1a8389c860c1d162be44d1e777cfb4e1ffb05a3fb8f30002088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f2088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f0130a9a7425ddeee5373c8dc48863d1c7a9abd856a95d26f4146dd818c0b8d8e7669d4a35837b83e1fc1c32ed951dcd179350b35322e33332e32382e343714711fd9548ae19b2e91c7a9b4067000467ccdd2b5fb4e1ffb05a3fb8f3000208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f2340130b98ebc6724479085f5da42cb91861d1449a3ca648d955751f5c3b91b096a840f092676c348f2f00b5039481dca12b9630d35322e31332e3133322e313436145bdbf34a0dad860c6ec71523ae39373325225cc1fb4e1ffb05a3fb8f3000208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e08150130a61f28db421160121dfc7c0fb707c0a28d7ee8bbf0f3ae522029783af248144b8ff12015083e6cc7f7dcf42c0f7455710c35322e33342e3134342e353014a0a0e17bfe82a484fefe348b7569a6d77d29d2c2fb4e1ffb05a3fb8f3000208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc40130b2cad9ab34e5a8d11dc038e34918476731a014a4d250e087c0231690acce6eb1dc5aee354356f83eb0171f5269c9b8820c35322e34332e38362e32333114337b7fb5d2c531825c3e0123ac3354018085b302fb4e1ffb05a3fb8f3000208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0013083bdc72d5ba2383a5fcd5b3f69df233b38363c98a191de6ab39375b6a88b529a150a314d448714ea7908433c9bf2cfd90c35322e38392e3135342e3438146d57707c196e06487d326094c964f258f5b77c35fb4e1ffb05a3fb8f3000209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df540130a13129fdef659fc1d53aeebb283e3dfaf398ded529cd03046faa4452c09f0dd3b9507c128a8fff1379f41f6dc3f3dca40d33352e38322e3139372e31393714ed1131823bcea23ac78af8c01e4d24683d6ecf88fb4e1ffb05a3fb8f30002098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920962098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920960130a02732ceeb00cbc22c6a3513e33364fbbe668f9b18d6d179a0ae8a624e54d6e70313ee5d114f4a90934c558046d7778b0c34342e3233322e3139362e3614d6ece912cbf02627a4efc3dd37e6833cf3671551fb4e1ffb05a3fb8f3000209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c0130b8b9bde8dd4ada170f591c79c7799b3a3110da70e66a5d9bd958c0ee09aa9318b66a51b6e848f9d89ebdc95aa03f98890c33342e3231342e34382e36381462e960a3f6b650feed98a266b3ccdf6e363562cffb4e1ffb05a3fb8f300020b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f20b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f0130b066eb4def83361ffc67185aa1e0d731674c29b63f6094195e51fcd538ea20d92dd4a8d565fa5a4952d7003a6dc6ae860b35322e34332e31332e39321441b308f737ca9e39f67b553158903198a88c516efb4e1ffb05a3fb8f300020ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e25421620ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e2542160130a6e8c59c8ca50f24d6ba38e9c2170eb7e7ecb218025bf5b872e7757127dff5e358f8996cedeffb73183d75e0da1ce2a80d35322e34322e3230322e3132381462e0104ce0aafc1f06bde37c73702fe84b307f05fb4e1ffb05a3fb8f300020bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb820bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb80130b02657330749afaba1d7f537a8d7a2f7f5d769dfeb35c611997de1fde5aeee25a2b36cd5b29658a99bfa26ac11295ef10c33352e38322e34392e31393614dbbebbc52a5bae21b818e0487311041c91b2683bfb4e1ffb05a3fb8f300020c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba820c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba8013096b913b9291edf58bd3dcaa9d4ca9a22cbcfdb8aa5ca6e3f0be4b9c84f251ab1a4dedc2eb735aab46559e71d81d34d580d35342e3231332e3230342e383514fdae7cdf38811659ce9481975b326a5d07236bc5fb4e1ffb05a3fb8f300020d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8920d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f89013085fc1d0b5171e799df05263801d116cb5091e8b61a6dedaeb7d555acc70faebf8888c32892877db163f92fb3d37697510d34342e3234302e39382e313032147034f0d3853c5351fb8e0ffd3c1daf12c51c2d89fb4e1ffb05a3fb8f30003098dbb9b35974480142186275c072950c403c009244f48be412f76d3fdbbb079126b9a3e2d9902d74fb3fcf571179c8ba200000013b5860da205d4132c60deedcd2f06f18c77718fc9f96a5473d05e596fa00200000013b5860da205d4132c60deedcd2f06f18c77718fc9f96a5473d05e596fa00fc00110a18192005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea82005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea80130aefbe4d19c74f3038be0d800cecadf43701500341a07b66c54780eff1d919af02df5981f40298d42d71a21203f5861830d35322e32342e3132342e313632148feb00404d6f765856c95e587b2523a365bc7258fb4e1ffb05a3fb8f30002020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c2020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c0130a6318708e3cf020d9a4d6acc99290e20852673b3fd56111a41f768d62c774cf7634621e292811aadacba01405ee0dd4c0c33352e38352e32312e3137391435d9eb76397d05b43b5cd8da7ccfa8408bc89ab3fb4e1ffb05a3fb8f3000203971dab9691efac06e4ce7a5483131373e84726458924fe48b7d541791693be1203971dab9691efac06e4ce7a5483131373e84726458924fe48b7d541791693be10130932daaeb7b3d00c345c7928cf668dd5b93f00c8ae932c3b02ec60a32f3bc70a06d54de27ebcd7d754ba8ab457d4220fe0d39322e36332e3137362e3230321461c274080f47a95be5372ef8c69bb60ab1d4ca82fb4e1ffb05a3fb8f30002039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a2039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a0130b6dc1e01c3c5adf1c45d2ffdc8b3e2bb191ddc96155093c44d2ea4dbf825a1b58c2a9b2f352ea9bfb82069224dfc12a20e33352e3136332e3134342e32333014ec7bf3b9bc72eda38c80bb7cf16e294e763e56b4fb4e1ffb05a3fb8f30002040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d2040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d0130aacc0b07512ca510f795d08610bb19b86765fab3ebe38247bc66894bb487873517751be72d6623aa4c6f0de8b9fb86300c35322e31302e3232392e3131143e8b10646ee9d6c28d75c280b357dd3a9ae9f962fb4e1ffb05a3fb8f3000205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a23205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a230130b2386d3b8287a94917087b2214107fb7604a296aaa68ad405c267cfe0ac50254edc13916213526c93ae969da3e2e19dd0d33352e3136352e35302e31323614f460a07a2b0dc932e1d8ff2dee2b984ac415dcebfb4e1ffb05a3fb8f3000205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436013089a560690e28c68c6503d32257037db0901e0e7e58e2a49502f27ef146faf9785c3a6d0d7a83f51f54e8a416b8fc5d5a0d34342e3233392e33392e31353314972a33056d57359de8acfa4fb8b29dc1c14f76b8fb4e1ffb05a3fb8f30002061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb2061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb01308123b9c30ea0afee794b67b78633b351d4e8a6861f9089db1eddaea2063052b4b8e6fe6d7aa8adaa8d14daee571921190c35322e31322e3137362e3930147ada3e486409b39c94a0833c8d782f35bc24e96afb4e1ffb05a3fb8f3000206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e5286332096601308784b66c8bacc5e407ba4388af1ce9634c0c65fae5ccb415d99622e2568fddd81860551836c6857651b7e68bf777051e0e34342e3232382e3234322e31383114c374f016ea61e76aab79b8bb95a1ba0e6e3eee6ffb4e1ffb05a3fb8f3000207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf7019207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf7019013088ca8aaf57cc7e2af48b2036bc3ce08b729115792ddd891d748809feb5131a78834a444d4bf5d682372030bdef0aeef60d35342e3138392e3136342e333914f9956e70daffa263e8cf29fa6557b7b630a595a8fb4e1ffb05a3fb8f3000207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be429001308a1844847acbbd40ed0102cf8978803b46626cf1ff053d3962dc017bcf9274ac64016269ed9c4cbaaea230cd582ce7c10d34342e3232372e3133372e3737140498ade3c80045c2a7520e921180ae1c39da5c57fb4e1ffb05a3fb8f30002087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789182087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789180130b2bb87347b1d029ee08969d8b183be7cb5bb7030333e7b1ebc590ef95bbdea0060106943d82fe1287e66b0a6ea9fbda70e33352e3136372e3134352e313439149b9cdbfe3568cc0b37f136b00a634c75653f05e3fb4e1ffb05a3fb8f30002088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f2088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f0130902b68a0d6aaaa88f5448e7847aa844ca290312883ccc45d513b6f55c186a66b430d9be46a39b36d65968f35e21672c50b35322e33332e32382e343714711fd9548ae19b2e91c7a9b4067000467ccdd2b5fb4e1ffb05a3fb8f3000208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f2340130b02ec92b3976b32d0fe09a82c478f9ad352a176b4af5c95c14021a39068e8e0f0ee3a9665a7347dadcc5495a6c54be830d35322e31332e3133322e313436145bdbf34a0dad860c6ec71523ae39373325225cc1fb4e1ffb05a3fb8f3000208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc40130a8b4baf7a0ad0776ad239d4795d86e25d77a4f59d054ed7c4dcc31f97ded0485e6a0b1475d744f20b491438d2e53937f0c35322e34332e38362e32333114337b7fb5d2c531825c3e0123ac3354018085b302fb4e1ffb05a3fb8f3000208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c00130a220d7da059c4f6129c623b728dd3f59f9e12f4d6cb81a7291ed72323f48906c411cf04b926906323e4fcf9c64a7afa20c35322e38392e3135342e3438146d57707c196e06487d326094c964f258f5b77c35fb4e1ffb05a3fb8f30002091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d2091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d013090dc1560bf0fee4e480e85565e796ba90608bcdc82c5be50a17a0276126b3011c0b05c53d5b57971677ee6dc4065e2620c35322e34302e3231392e34311402aa69f8ef6666e7cad6d9323755a0ef3c1b6bd9fb4e1ffb05a3fb8f3000209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df540130a280d0efc97a9f5877d4d5d26842c2b1eb5a972f6721ad04f59379ceeee8eea2279b41c55b2d91f326d1a081e2308b2c0d33352e38322e3139372e31393714ed1131823bcea23ac78af8c01e4d24683d6ecf88fb4e1ffb05a3fb8f30002098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920962098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920960130ae50333bb9c084b8235209009bc79e95ac93ea7e720f645f40210985cacb95d938359f1c2054c54f8ffecc46b46c72520c34342e3233322e3139362e3614d6ece912cbf02627a4efc3dd37e6833cf3671551fb4e1ffb05a3fb8f3000209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c0130902df93b14e13fa8c2bc56f8dd885933e7664a040742e9db1944c022a362f1f59bf392c8f2b619b6aa902751a0d97eb60c33342e3231342e34382e36381462e960a3f6b650feed98a266b3ccdf6e363562cffb4e1ffb05a3fb8f300020b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f20b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f0130b846359de05b4e141f1bf41c6f11a74858fead3a20c0b197f25eb081056520000a8e5f665d2504b0c3722d07fe9d48390b35322e34332e31332e39321441b308f737ca9e39f67b553158903198a88c516efb4e1ffb05a3fb8f300020bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb820bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb80130b64ffd3afa423be6e3c703eba0a16b25c86ec60e391d005bf47a73d33c66bcf7d0b2172d0f55041ee8d7869f7c6f352c0c33352e38322e34392e31393614dbbebbc52a5bae21b818e0487311041c91b2683bfb4e1ffb05a3fb8f300020d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8920d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f890130a6314c087034d4edfdb09dee1471a52b7906905da4510346d1a4c932c40174a753d2658cdbc734b83430d9a19fde876b0d34342e3234302e39382e313032147034f0d3853c5351fb8e0ffd3c1daf12c51c2d89fb4e1ffb05a3fb8f300020f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba786399038120f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba78639903810130a3c22f17c427c3f66373ab1eada7d9288fcb81114eaed49edd48647aada20c6d439f2d603cc9f4d00e92cbe844f432910d35322e31332e3235302e31383214fe2d4798df3e9b41a6823bc0b3f020478e87925dfb4e1ffb05a3fb8f300020ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac920ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac90130b5ea66b9c53fbbe4159192277264bfec6873a97e5c585a7adf5a62cbae4481aceface1dff0868ea001ed514810a75fe60d35342e3138372e31342e3233321467e05b1b52c7c896adf20035036fe1d30dcefc9cfb4e1ffb05a3fb8f30003082d71ec73b651ee1603038edce0b1b453e6cdf03a7c5dae542ecfa36e8e646ad5f8b2c6fd2947ebf3504a1e9aa36a3112000000050b5530a426cc3a37ae64b7e37879c0905cd90391226fd7395a19cad2b002000000050b5530a426cc3a37ae64b7e37879c0905cd90391226fd7395a19cad2b00fc00110a00192005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea82005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea8000d35322e32342e3132342e313632148feb00404d6f765856c95e587b2523a365bc7258fb4e1ffb05a3fb8f30002012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a22012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a2000e3231322e32342e3130332e31343914c1161c96de3dae28cd7f20ff8c2aa7b94b866d76fb4e1ffb05a3fb8f300020143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11320143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f113000d33352e3136342e32332e32343514b5f25f8f70cf8d05c2d2970bdf186c994431d84efb4e1ffb05a3fb8f30002020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c2020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c000c33352e38352e32312e3137391435d9eb76397d05b43b5cd8da7ccfa8408bc89ab3fb4e1ffb05a3fb8f3000202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb000d35342e3134392e33332e313637141ffbf1d32541dcb8f5555305295704a9ff9adc24fb4e1ffb05a3fb8f30002040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d2040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d000c35322e31302e3232392e3131143e8b10646ee9d6c28d75c280b357dd3a9ae9f962fb4e1ffb05a3fb8f3000205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436000d34342e3233392e33392e31353314972a33056d57359de8acfa4fb8b29dc1c14f76b8fb4e1ffb05a3fb8f30002061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb2061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb000c35322e31322e3137362e3930147ada3e486409b39c94a0833c8d782f35bc24e96afb4e1ffb05a3fb8f3000206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966000e34342e3232382e3234322e31383114c374f016ea61e76aab79b8bb95a1ba0e6e3eee6ffb4e1ffb05a3fb8f300020754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e20754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e000c34342e3233332e34342e39351446d938862af6d9a291e26c0048177db2892a710bfb4e1ffb05a3fb8f3000207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290000d34342e3232372e3133372e3737140498ade3c80045c2a7520e921180ae1c39da5c57fb4e1ffb05a3fb8f30002085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8242085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be824000d35342e3230312e33322e3133311468c506d43816d1a8389c860c1d162be44d1e777cfb4e1ffb05a3fb8f30002087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789182087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d678918000e33352e3136372e3134352e313439149b9cdbfe3568cc0b37f136b00a634c75653f05e3fb4e1ffb05a3fb8f30002088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f2088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f000b35322e33332e32382e343714711fd9548ae19b2e91c7a9b4067000467ccdd2b5fb4e1ffb05a3fb8f3000208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234000d35322e31332e3133322e313436145bdbf34a0dad860c6ec71523ae39373325225cc1fb4e1ffb05a3fb8f3000208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815000c35322e33342e3134342e353014a0a0e17bfe82a484fefe348b7569a6d77d29d2c2fb4e1ffb05a3fb8f3000208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4000c35322e34332e38362e32333114337b7fb5d2c531825c3e0123ac3354018085b302fb4e1ffb05a3fb8f3000208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f000d35342e36382e3233352e32303114c075993a8336f93a13bb7bbb7e0e89928be4aafbfb4e1ffb05a3fb8f3000209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54000d33352e38322e3139372e31393714ed1131823bcea23ac78af8c01e4d24683d6ecf88fb4e1ffb05a3fb8f30002098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920962098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba092096000c34342e3233322e3139362e3614d6ece912cbf02627a4efc3dd37e6833cf3671551fb4e1ffb05a3fb8f3000209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c000c33342e3231342e34382e36381462e960a3f6b650feed98a266b3ccdf6e363562cffb4e1ffb05a3fb8f300020bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb820bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb8000c33352e38322e34392e31393614dbbebbc52a5bae21b818e0487311041c91b2683bfb4e1ffb05a3fb8f300020c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba820c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba8000d35342e3231332e3230342e383514fdae7cdf38811659ce9481975b326a5d07236bc5fb4e1ffb05a3fb8f300020d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8920d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f89000d34342e3234302e39382e313032147034f0d3853c5351fb8e0ffd3c1daf12c51c2d89fb4e1ffb05a3fb8f300020f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba786399038120f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba7863990381000d35322e31332e3235302e31383214fe2d4798df3e9b41a6823bc0b3f020478e87925dfb4e1ffb05a3fb8f3000309115ebe490480078d6ed0b6cbb6b14a67e8c87a481a9b899ad9b69df05b58319a845f03c8b12333714e40cd371e867842000000029787a10cbbd05260d3c7a8114746b568d0a5fbd2fdb9f080ac12c5acd002000000029787a10cbbd05260d3c7a8114746b568d0a5fbd2fdb9f080ac12c5acd00fc001109e8192005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea82005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea80130970d7b81b480412fc43ea1f788843b1d09f0dc907586b3e260b050c7644f6d41fb27b1a42c480e34004c32c09977e93f0d35322e32342e3132342e313632148feb00404d6f765856c95e587b2523a365bc7258fb4e1ffb05a3fb8f30002012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a22012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a20130a820e13b8769adac09e564cd1cb18bc063cfcf3924f15636b0760c4f5b0fe84cf2fb570335b9f5a480e175a1d3bf271c0e3231322e32342e3130332e31343914c1161c96de3dae28cd7f20ff8c2aa7b94b866d76fb4e1ffb05a3fb8f300020143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11320143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f113013098a0e5d3895c330ff366206535e6868f2b68d9a187883d14a20d439471981e61b208ab0e8a3550b3a9b896864e2e97630d33352e3136342e32332e32343514b5f25f8f70cf8d05c2d2970bdf186c994431d84efb4e1ffb05a3fb8f30002020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c2020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c0130a5873d03f1d4625d480393ef389ef41c6c64d996285ffa796cc08208824d35dccf69f861d6adc1692fb714c09031a02b0c33352e38352e32312e3137391435d9eb76397d05b43b5cd8da7ccfa8408bc89ab3fb4e1ffb05a3fb8f3000202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb0130b202608dae582e081fddaf3e2a6a79cb3f843fb9af4edcc5c5ca173c3802851be056b863ca2e7f754d6ebd7273dce89c0d35342e3134392e33332e313637141ffbf1d32541dcb8f5555305295704a9ff9adc24fb4e1ffb05a3fb8f3000203971dab9691efac06e4ce7a5483131373e84726458924fe48b7d541791693be1203971dab9691efac06e4ce7a5483131373e84726458924fe48b7d541791693be101308292b344b60fc7e2a7039a8d36fad7680caa319305f1a48bf517c70d669145757311e299990b96f2a1725d8d15122c210d39322e36332e3137362e3230321461c274080f47a95be5372ef8c69bb60ab1d4ca82fb4e1ffb05a3fb8f30002040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d2040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d01308022bb20ab0892ac7fceddccffafed851a6b99462fe1fbc8ed302eb13dcd34104e8b640d6863e22b3c0334c65bb1353d0c35322e31302e3232392e3131143e8b10646ee9d6c28d75c280b357dd3a9ae9f962fb4e1ffb05a3fb8f3000205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a23205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a230130a8d80210f5a8421b7d0e7aefb73de90996043824f763ba7ba2f2bccf65fe2692a843be92a6c948e3ec379cc4873ab8620d33352e3136352e35302e31323614f460a07a2b0dc932e1d8ff2dee2b984ac415dcebfb4e1ffb05a3fb8f3000205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef43601308b71e75c86b6dbe16c8d77b58c54c3046b879c9b2870ad5978bd66822a5495c088be770cbaa7b07606e4bea48f1d57520d34342e3233392e33392e31353314972a33056d57359de8acfa4fb8b29dc1c14f76b8fb4e1ffb05a3fb8f3000207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf7019207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf70190130a5db974fcc27c6e6659be41f6e60cda5595e476219e92f1a42891a2129efa57e7168cb1ed7e910567b28b50f49ec89580d35342e3138392e3136342e333914f9956e70daffa263e8cf29fa6557b7b630a595a8fb4e1ffb05a3fb8f300020754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e20754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e01308a0faa9aa37cb733914dcb2f0238e7ecd1cc6e1bca84ea82f40f56ac676cfbfdddfebb17145fd119724acbac6526925d0c34342e3233332e34342e39351446d938862af6d9a291e26c0048177db2892a710bfb4e1ffb05a3fb8f3000207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be42900130a43cce1d88a28cce331807a9d82ebb836e179712045ecb44f4d9e30e3dadd1fd56eb794e1ff4b77f6389cf070ab4335e0d34342e3232372e3133372e3737140498ade3c80045c2a7520e921180ae1c39da5c57fb4e1ffb05a3fb8f30002085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8242085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8240130ac38307fb06ab201fad2e7d995746ca822aa65b3efacdb2944840dc49cae820ef8cda959b3022fa5825aa6c185b2d2e80d35342e3230312e33322e3133311468c506d43816d1a8389c860c1d162be44d1e777cfb4e1ffb05a3fb8f30002088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f2088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f0130b0a830cc01b28f5268aae63f37e8edee59c0cf638e56add0f8fc6a63fa67754d550acb8c1844fe49dd969384b3e47d4d0b35322e33332e32382e343714711fd9548ae19b2e91c7a9b4067000467ccdd2b5fb4e1ffb05a3fb8f3000208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f2340130897c23a6f47c9459e7c374ab0fa826f27a035794b8aeb965fd6ee02bac15546e4c74b4dc878f9aeca6811ee30376479a0d35322e31332e3133322e313436145bdbf34a0dad860c6ec71523ae39373325225cc1fb4e1ffb05a3fb8f3000208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e08150130923d83d963dcad047de4b636c1002972099365c6ca34d86b2b0c4d9d5f1e3c76a82a4775b6973933f08b4efca67c39140c35322e33342e3134342e353014a0a0e17bfe82a484fefe348b7569a6d77d29d2c2fb4e1ffb05a3fb8f3000208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc40130acf9fca5575dd9432d04bf48208d4d6233327efd892d7dc8a19c221875b19150e386e59c596a26f805c51b782266ed2d0c35322e34332e38362e32333114337b7fb5d2c531825c3e0123ac3354018085b302fb4e1ffb05a3fb8f3000208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c001309656eb5ec24456fafd42a36eaaa7777a1a07126cdba616f306f5922962edb86c84eb63eb1c4fe73b77c2c125c03e0e8a0c35322e38392e3135342e3438146d57707c196e06487d326094c964f258f5b77c35fb4e1ffb05a3fb8f3000208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f01308458cd94f39953a2cbe980f26296dbc935f5bfa0c51840267d34529a14c40a62dbbcde39372748c0c555169d692852dd0d35342e36382e3233352e32303114c075993a8336f93a13bb7bbb7e0e89928be4aafbfb4e1ffb05a3fb8f3000209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df540130b8986d8ccb4735db954e68d32a0d544778f631523e347b673ec19f522241a4a78e842d21e3dbafaf7c1dde9b7a87af610d33352e38322e3139372e31393714ed1131823bcea23ac78af8c01e4d24683d6ecf88fb4e1ffb05a3fb8f3000209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c0130a4922f49f620b1db38fa2ee28facca3aa818e29858e47d8afa467f1f6e78512f7f81b09ec5debc0d6ba820c5afcf730a0c33342e3231342e34382e36381462e960a3f6b650feed98a266b3ccdf6e363562cffb4e1ffb05a3fb8f300020b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f20b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f0130b0bd0eaedab09436d694b6fbfd5d7ff130d10a5b0793363383556d4d4e203892d50c6d7ff5fd418c113e46dd03e680f90b35322e34332e31332e39321441b308f737ca9e39f67b553158903198a88c516efb4e1ffb05a3fb8f300020ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e25421620ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e254216013096b15178f4a27b4e2c957fba6321c9e0c6a52cc181b78bdff133af13378578429140857bcd7bef984123d4a0c1bb0a0f0d35322e34322e3230322e3132381462e0104ce0aafc1f06bde37c73702fe84b307f05fb4e1ffb05a3fb8f300020d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8920d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f890130a92fbcf877ae8f1126dd2000c14f94e984b0b8417ef08a5d41e8e4f25b1c4345d604ea4d5628cb3b465c0f133c1680ea0d34342e3234302e39382e313032147034f0d3853c5351fb8e0ffd3c1daf12c51c2d89fb4e1ffb05a3fb8f300020f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba786399038120f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba7863990381013080cf4159f981ea771039b37a355c87b1b63d08f5ca1fe187b43dab3d69aba34c296486fbe95169d4e86aff8e5b7d4ec10d35322e31332e3235302e31383214fe2d4798df3e9b41a6823bc0b3f020478e87925dfb4e1ffb05a3fb8f300030b9cbddb5cb09af2419de553627792b168d70fec7f4b86455fad63931bd68cef1eb7aee5d8b52e592167c2b5e2b7778b420000000ca47540e3e2bbbfc91ad3581df6b5f730ea457841a3544e2ab3c54c2450020000000ca47540e3e2bbbfc91ad3581df6b5f730ea457841a3544e2ab3c54c24500fc001109d0192005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea82005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea80130b8b06499c583a0fd22b6891f1b2fbc982c65889f34a41303a4e6add3335e6f03de51013907906849ae0606f4642546e90d35322e32342e3132342e313632148feb00404d6f765856c95e587b2523a365bc7258fb4e1ffb05a3fb8f30002012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a22012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a20130a74f5ce985df2786c2aff01e9030ac94d60a087d9bb7e67f6ed82fd2bfdec5ffa365fa0234cc36cffe48ed7a891566f40e3231322e32342e3130332e31343914c1161c96de3dae28cd7f20ff8c2aa7b94b866d76fb4e1ffb05a3fb8f300020143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11320143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f113013089c4a5d69af324ffe22e0c8d9b8b0dd4ebcc23a8947dbefa423dd21d6bca38d83903018bd19233fdf82db3cf58b121120d33352e3136342e32332e32343514b5f25f8f70cf8d05c2d2970bdf186c994431d84efb4e1ffb05a3fb8f30002020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c2020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c0130a97a7c20f8e962e0f42eb82a8574a40d592a6c045e2d0dd022d30ae7580f63121f1b127de8c8fdbc0a09be310be140630c33352e38352e32312e3137391435d9eb76397d05b43b5cd8da7ccfa8408bc89ab3fb4e1ffb05a3fb8f3000202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb013095b29cd5c1260dad12e00db7df6264adf1e129db92db275c512024ef882d525bc76aae7b91e98cc50f02b467b729a4230d35342e3134392e33332e313637141ffbf1d32541dcb8f5555305295704a9ff9adc24fb4e1ffb05a3fb8f3000203971dab9691efac06e4ce7a5483131373e84726458924fe48b7d541791693be1203971dab9691efac06e4ce7a5483131373e84726458924fe48b7d541791693be10130b36395d295eb39ab7a37a6dbae201d69783252554528616a2cd694ece2bcfa1c228bfbe9f11189e58464f1f818222cb80d39322e36332e3137362e3230321461c274080f47a95be5372ef8c69bb60ab1d4ca82fb4e1ffb05a3fb8f30002039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a2039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a0130a5c5eb179bcfa04fff58a455c31a4434d2956ee64992ad90fa984e22bb0271349b34ed391adb5d14e92fe4e909e66fed0e33352e3136332e3134342e32333014ec7bf3b9bc72eda38c80bb7cf16e294e763e56b4fb4e1ffb05a3fb8f30002040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d2040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d0130990581eeaa1de281b5b427562103f13d36926683d2fd547c9594ef7814b4eae5d1873a8935db2014270fbf6a8324a0650c35322e31302e3232392e3131143e8b10646ee9d6c28d75c280b357dd3a9ae9f962fb4e1ffb05a3fb8f3000205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a23205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a23013092859d855e078b0d51bb59700c2f97084b7b9cb756877df99999a141599e2398a1d801ba447e87243666bfccda43b3a80d33352e3136352e35302e31323614f460a07a2b0dc932e1d8ff2dee2b984ac415dcebfb4e1ffb05a3fb8f3000205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef4360130a517a483d86831f719bea10f0fd570a991d4d31f842eacdb7bcedd2b4574832c8c9f8faffdf3dd5855b958fab30f28ea0d34342e3233392e33392e31353314972a33056d57359de8acfa4fb8b29dc1c14f76b8fb4e1ffb05a3fb8f30002061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb2061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb01308d6b47b552e835caf543b4e12228069e2b017e9697e9a53769477a17f911ebb6d60902335c80dbc5f8a3f1fddb901a2d0c35322e31322e3137362e3930147ada3e486409b39c94a0833c8d782f35bc24e96afb4e1ffb05a3fb8f30002085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8242085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8240130959e4b96408015ba5f09b91b6075879d793c8e23ac87c8c7bfb488570359603a5555912d439396eff96196a8a48509350d35342e3230312e33322e3133311468c506d43816d1a8389c860c1d162be44d1e777cfb4e1ffb05a3fb8f30002087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789182087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789180130b48413f0072f49e797ac6d1e24416a891a045f9381882ee222801da1872c6edc1f96b10d5fc1e35ac986dabbe1a6bebb0e33352e3136372e3134352e313439149b9cdbfe3568cc0b37f136b00a634c75653f05e3fb4e1ffb05a3fb8f30002088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f2088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f013080b9a527a7102ef8fa92958d687466a5e660408c19aa20631b5ba92e6ad6c05ce0756df6fb5ddef9f3541096b1a507c60b35322e33332e32382e343714711fd9548ae19b2e91c7a9b4067000467ccdd2b5fb4e1ffb05a3fb8f3000208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234013096224eff9b71fa242635fc530e66dc5a352d930491a7f6835420101c3f5f9ded42b8b81342d46430e7cc2a7d2c6118640d35322e31332e3133322e313436145bdbf34a0dad860c6ec71523ae39373325225cc1fb4e1ffb05a3fb8f3000208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c001308b083dafad8abb0439badd1bee47c8c40ff94d9b0cb3a170e80b79d7291eff897897984cb854f731777298d9a4c53ff70c35322e38392e3135342e3438146d57707c196e06487d326094c964f258f5b77c35fb4e1ffb05a3fb8f3000208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f013099ec50553765cb873f210513dc1f50cf370711af9283042cfa0047b50de960c54343213a10f86443605e72c8158fbdbe0d35342e36382e3233352e32303114c075993a8336f93a13bb7bbb7e0e89928be4aafbfb4e1ffb05a3fb8f30002091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d2091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d01309418730d55f9813b944c857e73544681bfb28cfb0cb8f80cc6853b060ce980d5124c451302681fd64507973dafd4fe050c35322e34302e3231392e34311402aa69f8ef6666e7cad6d9323755a0ef3c1b6bd9fb4e1ffb05a3fb8f3000209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df5401309373b16af5c5922151307961ff6ba2932577a762412ddcecd8ea5e9d9de353687517a99179641a64867412dfa02b30e50d33352e38322e3139372e31393714ed1131823bcea23ac78af8c01e4d24683d6ecf88fb4e1ffb05a3fb8f30002098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920962098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920960130aa42f5cc6c6b0b157ebbccb51c179e6da1f657aa975cfe316bba65bb795d27c1a36fc89f277310e10d648b4eb2f3a4d70c34342e3233322e3139362e3614d6ece912cbf02627a4efc3dd37e6833cf3671551fb4e1ffb05a3fb8f300020b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f20b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f0130b9b68ea1d8c99b7cf1241fe98bbb671d4503b181af78d2cdd3b6c26717c5bbcc0f9977fd5e1ba2a89681f2c7193b30590b35322e34332e31332e39321441b308f737ca9e39f67b553158903198a88c516efb4e1ffb05a3fb8f300020bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb820bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb80130b9b9b9d80cac56a2354054847aad75cac16f3e004983c4287887ce67fe9151dc85ca64efced2acbb2fe1249edb97aeaa0c33352e38322e34392e31393614dbbebbc52a5bae21b818e0487311041c91b2683bfb4e1ffb05a3fb8f300020d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8920d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8901308c5fe2277f8f09c710ebc292b57abae1db9fb98a55db37c6d84d22d28616b0241a136a89addfbcf6d40a7cca5fbeb7020d34342e3234302e39382e313032147034f0d3853c5351fb8e0ffd3c1daf12c51c2d89fb4e1ffb05a3fb8f300020f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba786399038120f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba78639903810130b29a3615c31170fc5065b8c97c12db5f6dc30a6f7d3d851f7e8b5794dd4868b72eac1cf8e0938af1818f36eccf96b7560d35322e31332e3235302e31383214fe2d4798df3e9b41a6823bc0b3f020478e87925dfb4e1ffb05a3fb8f300020ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac920ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac90130a7219c2a26bf3628b8dad42325c9e2d03dd265015c2552990081ac3461f49b1ffc0e89f32fe01155655b12f2e5a2869f0d35342e3138372e31342e3233321467e05b1b52c7c896adf20035036fe1d30dcefc9cfb4e1ffb05a3fb8f300030b16ea424860dc0726c5e7215e1e982a42eab9330137b9fc25cb52f631237c875a75c2f1f601750686e417f0ccbdf398120000000e7654d577ec30cf6779bb7f025807118c9ee33113ea249fa1ce94906460020000000e7654d577ec30cf6779bb7f025807118c9ee33113ea249fa1ce949064600fc001109b8192005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea82005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea801308b962de6fb2b78ecd4a0d38a1e6599629e2f2ee7cf9bf120d2a42a5187f6b7bff3ad999d489ad01402952e13a7b2a0cd0d35322e32342e3132342e313632148feb00404d6f765856c95e587b2523a365bc7258fb4e1ffb05a3fb8f30002012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a22012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a201308f075ac06941ccf4426e74cca625cba70aa51383684e5b2ca68a5969980c577692a2a4fc04eaf6d75e06d46d47789d8a0e3231322e32342e3130332e31343914c1161c96de3dae28cd7f20ff8c2aa7b94b866d76fb4e1ffb05a3fb8f300020143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11320143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f113013094ef996c8d9e5d050b0eb315c2953b3e7a6a2c0c814a4f091b0a899758193809d59932a177bb4bfe3612795c1cb1af180d33352e3136342e32332e32343514b5f25f8f70cf8d05c2d2970bdf186c994431d84efb4e1ffb05a3fb8f30002020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c2020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c0130b5c4608e61eec256009dced5e14f32abea62323bf9afc6bd3aa94775a69deffb4fbe7ced991719ae42f0464143739c050c33352e38352e32312e3137391435d9eb76397d05b43b5cd8da7ccfa8408bc89ab3fb4e1ffb05a3fb8f3000202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb0130af4e360b85ba0e07ff4daf222828646b8553d34e13d27e0c0ab73b8d0819a7de542c8b75b908f2a522783805e98161ed0d35342e3134392e33332e313637141ffbf1d32541dcb8f5555305295704a9ff9adc24fb4e1ffb05a3fb8f3000203971dab9691efac06e4ce7a5483131373e84726458924fe48b7d541791693be1203971dab9691efac06e4ce7a5483131373e84726458924fe48b7d541791693be10130b3c583538cd672a8811fd6ad676f0ab86fb20142cde7318f6821ab80c747d667e65aac29cad1642220484b528e2b97a60d39322e36332e3137362e3230321461c274080f47a95be5372ef8c69bb60ab1d4ca82fb4e1ffb05a3fb8f30002039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a2039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a01308fa018aa37212ef01b6736ed5642f2e72bee1de375bfa8b8b670d3f91c6740d603d4d28712b4bf20a9823816dc0395220e33352e3136332e3134342e32333014ec7bf3b9bc72eda38c80bb7cf16e294e763e56b4fb4e1ffb05a3fb8f30002040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d2040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d0130864d618197d9c45ce9466461c76b2a7706c7651d52fd0a9c66dacea54359b82788580f51c44144d13d03924a2f231a6b0c35322e31302e3232392e3131143e8b10646ee9d6c28d75c280b357dd3a9ae9f962fb4e1ffb05a3fb8f3000205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a23205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a230130b7e90c414091b2b3fc3167cdf880027601fa23caacd4d806e561dd60368f4926fbf2794ed7256d2b9cae61cdd37cf61a0d33352e3136352e35302e31323614f460a07a2b0dc932e1d8ff2dee2b984ac415dcebfb4e1ffb05a3fb8f30002061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb2061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb01308062ad18e48955d3c60465639795e5eb5d06a307710278c033336338e1f165bb3f38d8193b331e7b8e5c7174f1bcc3290c35322e31322e3137362e3930147ada3e486409b39c94a0833c8d782f35bc24e96afb4e1ffb05a3fb8f3000206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e528633209660130a3c4dc99f61b79db373f2cbb31282dab6c9f1e061d3ae149f292e7d2a57867af64dbaff63d8209eb2eae7bc4d19f18ba0e34342e3232382e3234322e31383114c374f016ea61e76aab79b8bb95a1ba0e6e3eee6ffb4e1ffb05a3fb8f3000207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf7019207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf70190130b0d3a176e29c34f594cd740859a21fdeddea237d66b706439b745b64da4bc910a6454a6c24766007bef5fddc60025aa00d35342e3138392e3136342e333914f9956e70daffa263e8cf29fa6557b7b630a595a8fb4e1ffb05a3fb8f300020754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e20754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e01308f9b3c93f75c54aaa7e94af920af8d570dbeccc8f03976a95aa6cd4956c57c4320ff54d3b9a6383801d78f3e89e842880c34342e3233332e34342e39351446d938862af6d9a291e26c0048177db2892a710bfb4e1ffb05a3fb8f30002087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789182087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d678918013098bacabb7caa139502f082638a2c5557402755a734420a4170e0625ba4cc6a90236624023c697478134010ecf2a024710e33352e3136372e3134352e313439149b9cdbfe3568cc0b37f136b00a634c75653f05e3fb4e1ffb05a3fb8f30002088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f2088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f01308f176c317a778eb340cbff32a482253eccade757f6be7ce3264efb3cc6bae9a49f44ac1634dbd916280d1f935f4da87c0b35322e33332e32382e343714711fd9548ae19b2e91c7a9b4067000467ccdd2b5fb4e1ffb05a3fb8f3000208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e081501309861cc2ef8a3969143f1b32a715a6e10c3c2d7ba46cb7bc54e4e8101f08b85589f3ad825896c5b21e5d608d9200496840c35322e33342e3134342e353014a0a0e17bfe82a484fefe348b7569a6d77d29d2c2fb4e1ffb05a3fb8f3000208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc40130a45b1a6bffa54f659e58329868160e6e4503756ebffe1cc7bba724987832f81811883638133ef1b55a877a0650e6c4d10c35322e34332e38362e32333114337b7fb5d2c531825c3e0123ac3354018085b302fb4e1ffb05a3fb8f3000208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0013085ae9000f50f53adb25405b339df3a86c180a2312ba857d94c077e474a3a577e3dc4eb53a0cd2b1b1e880383d3680af80c35322e38392e3135342e3438146d57707c196e06487d326094c964f258f5b77c35fb4e1ffb05a3fb8f3000208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f0130a8534f9a11dda86ea001342d7166778b70849462281cf7a5f92bcb82044900b5abb42f7301ff900e62915898bf8835710d35342e36382e3233352e32303114c075993a8336f93a13bb7bbb7e0e89928be4aafbfb4e1ffb05a3fb8f30002091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d2091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d0130b080fa15ef37262f5c499bdf9c9487a0e8f3419c3a809aa794af4cae7cde22052eb8323559da812edce33431f0d826020c35322e34302e3231392e34311402aa69f8ef6666e7cad6d9323755a0ef3c1b6bd9fb4e1ffb05a3fb8f30002098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920962098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920960130add41989d620cc7df4eafbc7b268d334953c1e8ba5608f454c9d0a427b58721950c46f79c0b22038b12eebc7e6ec83100c34342e3233322e3139362e3614d6ece912cbf02627a4efc3dd37e6833cf3671551fb4e1ffb05a3fb8f300020b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f20b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f0130872c5ed02a4b12f4131bd64f4c59271102507c9a96dbd531b35cf3c1d10b285b8edb0dc6d6f641c5868f1ec065ab08050b35322e34332e31332e39321441b308f737ca9e39f67b553158903198a88c516efb4e1ffb05a3fb8f300020ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e25421620ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e2542160130b0c7d63093cb1972c8aa94c78045cff4973d79ae141365aa6392aba6939d7cf6f5a7395fc57ac6045781acaae05f67cd0d35322e34322e3230322e3132381462e0104ce0aafc1f06bde37c73702fe84b307f05fb4e1ffb05a3fb8f300020c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba820c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba8013092ae2a2792e73608a20d7b12888d2582d6647b43eb8ee8f61e09e9520732dfdd7160dfe5c6f3386a32955171b59e9b230d35342e3231332e3230342e383514fdae7cdf38811659ce9481975b326a5d07236bc5fb4e1ffb05a3fb8f300020ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac920ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac9013086abcf53a568276f5dace92dbdaf038d5f959742360527941a2e3b320334bff61c9e36af902b6332e667d54b4e43f20f0d35342e3138372e31342e3233321467e05b1b52c7c896adf20035036fe1d30dcefc9cfb4e1ffb05a3fb8f3000308624b652c48f38d61cda305260bff8d679d8d4194d3f94263f4be2b109b459fd257d09b21daea3ce5d607f5cf329fcc020000001d6bd1fcac1f64325a6a26b0a3a02d1e3b61267d50f855984a873c3d6890020000001d6bd1fcac1f64325a6a26b0a3a02d1e3b61267d50f855984a873c3d68900fc001109a0192005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea82005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea80130801d1caeb0249874c51e6aef9c319b3260af3a7f4abd77e44f7f2794be2b1f1211ac2e06d951dc1102541944767bf70b0d35322e32342e3132342e313632148feb00404d6f765856c95e587b2523a365bc7258fb4e1ffb05a3fb8f30002012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a22012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a201308959077c75d865f18eb0e6da55e1685c071b16b2ebc6ae717d9ecb15c40783a22cfc80283ec15b1b58d011f5d211de470e3231322e32342e3130332e31343914c1161c96de3dae28cd7f20ff8c2aa7b94b866d76fb4e1ffb05a3fb8f300020143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11320143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f1130130964add28e4e033a83073203713210ba9451300e370901e24c64c170c9c714df36bcdfee02c6358c7e9348cc2193c1c790d33352e3136342e32332e32343514b5f25f8f70cf8d05c2d2970bdf186c994431d84efb4e1ffb05a3fb8f3000202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb01308dd74a742631dd039ae8b11e2f3f2f1fc2503ba590ee5487a9af71d4713c0b7df9c91e730f246c5b012d682623bfe5980d35342e3134392e33332e313637141ffbf1d32541dcb8f5555305295704a9ff9adc24fb4e1ffb05a3fb8f3000203971dab9691efac06e4ce7a5483131373e84726458924fe48b7d541791693be1203971dab9691efac06e4ce7a5483131373e84726458924fe48b7d541791693be10130839b06bd3faa0249a1de9e490de0ae9b1f687f01748000720b6181271185e83deb5ee39085aacb7a19164e2c7995b9510d39322e36332e3137362e3230321461c274080f47a95be5372ef8c69bb60ab1d4ca82fb4e1ffb05a3fb8f30002039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a2039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a01308ad035bbe534c684bcc4edd241a3ae3710ff2484e4cbfdd7e2778574a4a10a038716232d4645f6a0986116156930da2d0e33352e3136332e3134342e32333014ec7bf3b9bc72eda38c80bb7cf16e294e763e56b4fb4e1ffb05a3fb8f30002040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d2040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d0130a48d35c8976bdb0d6feaed8a7fafecd6c9790eca8cc5a1e576e1ab1081caaddc5d35dbed22462b065da699d9796470030c35322e31302e3232392e3131143e8b10646ee9d6c28d75c280b357dd3a9ae9f962fb4e1ffb05a3fb8f3000205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a23205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a2301309761664a2d48424101e4d22d0ddb7bf68a1a51d10278418bfa86125eddbf53a73116d8e11d35fc56dcdf7dd1cbc198340d33352e3136352e35302e31323614f460a07a2b0dc932e1d8ff2dee2b984ac415dcebfb4e1ffb05a3fb8f3000205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef43601309444afcc0ef76d51219a693687d3373ae2d63cf0f2982ac364cde53ea5f3f4aad1abd2e9236848dd229fcc7bd461f4e70d34342e3233392e33392e31353314972a33056d57359de8acfa4fb8b29dc1c14f76b8fb4e1ffb05a3fb8f30002061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb2061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb01308f6f64001871f148e8f2befa5562d682e5ea35b15d651c1e5632a9ec007897ae1accdb7c771935efaadb053584f0f0ec0c35322e31322e3137362e3930147ada3e486409b39c94a0833c8d782f35bc24e96afb4e1ffb05a3fb8f3000206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e528633209660130b2bdf73ed77b5ee1eba76d9597269b9acb54c53483f48d8a96724a8d41c77a7b54853ef41561c95823ae001fe226cd070e34342e3232382e3234322e31383114c374f016ea61e76aab79b8bb95a1ba0e6e3eee6ffb4e1ffb05a3fb8f3000207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf7019207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf70190130ac23ec29fa032506a8a1f534c0dbbfe234ab8c4a2492c6513a7a0cf8b9ba8ee80c2b8677acbe1005e9552608eef4c74f0d35342e3138392e3136342e333914f9956e70daffa263e8cf29fa6557b7b630a595a8fb4e1ffb05a3fb8f300020754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e20754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e0130a806786c7e246db9861c45ddbc16849415da9abbca80b2a92f07aa09b19c258598c62dce654153b5815b50ce21506e970c34342e3233332e34342e39351446d938862af6d9a291e26c0048177db2892a710bfb4e1ffb05a3fb8f30002085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8242085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be824013091096939bbbc3b696e76a7def9734e8afd250c49b307930f2be484a5cfb353cfb08aee953809cfa8e25138c9230bece70d35342e3230312e33322e3133311468c506d43816d1a8389c860c1d162be44d1e777cfb4e1ffb05a3fb8f30002087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789182087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789180130a64af69f8174bf8a7f8398cba7e349b62b2fd2ecf61446a10a16a9e71cd67c8f2eb725d4cbd1c2081a5200cc2016e74a0e33352e3136372e3134352e313439149b9cdbfe3568cc0b37f136b00a634c75653f05e3fb4e1ffb05a3fb8f30002088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f2088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f01308e7b3b55424d3b06d8aa1c4ca3af5de96b8af54adb860d22f6b857cf836038ef9b711dc3a1c47cb0f0bd31e553904de50b35322e33332e32382e343714711fd9548ae19b2e91c7a9b4067000467ccdd2b5fb4e1ffb05a3fb8f3000208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f23401308d003529801f709ead3ed646f86e29eefd3563fd10eb48c5814929970e48691da65986d9d798cb084b085327e3e2210e0d35322e31332e3133322e313436145bdbf34a0dad860c6ec71523ae39373325225cc1fb4e1ffb05a3fb8f3000208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e08150130b5d56dbd660b42d9c79be5d94912c86001c7c0118508e90ea71113f81b7ef412a56ed53bf635f8463495db374ad105b20c35322e33342e3134342e353014a0a0e17bfe82a484fefe348b7569a6d77d29d2c2fb4e1ffb05a3fb8f3000208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4013091557309e257281d2910e7914b80bb4cfa78a74530d8c0a54b088ca244380e3f248f95e3d716b2e8043d0e74d3c362460c35322e34332e38362e32333114337b7fb5d2c531825c3e0123ac3354018085b302fb4e1ffb05a3fb8f3000208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c00130874f7d242343c8a96748110a12dbb246a3fcc772e25e1ad6a7dcae333ae99c205c9a85ef73441097f8b88ff2253bdb680c35322e38392e3135342e3438146d57707c196e06487d326094c964f258f5b77c35fb4e1ffb05a3fb8f30002091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d2091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d01308bc0894362a31bb574775fb54873f6f4b231df32e8142bc2f18839bfb54422df8f6295590fc51fab1c27040c2b34b51a0c35322e34302e3231392e34311402aa69f8ef6666e7cad6d9323755a0ef3c1b6bd9fb4e1ffb05a3fb8f3000209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df5401308ccc32d24ef5626ddcd2b28e9736617e4674fe9108af2a67f3ab4d88857d8e932cad9abe7f37a81cb42e00b5a23924c20d33352e38322e3139372e31393714ed1131823bcea23ac78af8c01e4d24683d6ecf88fb4e1ffb05a3fb8f300020ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e25421620ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e2542160130b12d38eb7f5de9b145b9f9e14e97e0e624ff91e61c9ef66e50366df4439e1f5936494e12b4216352919679e4d759c0e00d35322e34322e3230322e3132381462e0104ce0aafc1f06bde37c73702fe84b307f05fb4e1ffb05a3fb8f300020c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba820c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba801308654755a932cc93d963a2d802cabae33db99828405fe03a3838f73a05ae88c0733f9170f77f92b66d3291d7c8675dc6b0d35342e3231332e3230342e383514fdae7cdf38811659ce9481975b326a5d07236bc5fb4e1ffb05a3fb8f300020f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba786399038120f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba7863990381013084980eccb0d1103b2ca52e2180e96c26b287ff0dbe1038e495bb6e77bfe339a5890f7d3c10c40aa756c72c1349dd27be0d35322e31332e3235302e31383214fe2d4798df3e9b41a6823bc0b3f020478e87925dfb4e1ffb05a3fb8f30003087087556f670d7bc712e350d4b5afbf9ef0224447ac207a2ee76e040c468605d8b9cabbabe620278d01a8da30ee7026b20000000b6ebee5a8f801f7b66c32a3454b12513c76ab58b121a4e9c579bcd4e8c0020000000b6ebee5a8f801f7b66c32a3454b12513c76ab58b121a4e9c579bcd4e8c00fc00110988192005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea82005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea80130a703c06bb0c06e1af4dc7396d1f19f8959c5a56e99717647a91b65cc8aa543fd700b7ec561e3050ef9e868104f3c6b790d35322e32342e3132342e313632148feb00404d6f765856c95e587b2523a365bc7258fb4e1ffb05a3fb8f30002012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a22012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a20130a324d275351dad7c90e3a9a94f6efbd8ea6b865f34a09a20fb82ed55134c45982f798e26a4e80e1fb0a8c50813b86d280e3231322e32342e3130332e31343914c1161c96de3dae28cd7f20ff8c2aa7b94b866d76fb4e1ffb05a3fb8f300020143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11320143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f1130130ad5a967b04be6266f12c245cb62edb02873a37f72d2de496d8d1f1cc92905786be7aa7c24c7941ca80b11675f44fd48f0d33352e3136342e32332e32343514b5f25f8f70cf8d05c2d2970bdf186c994431d84efb4e1ffb05a3fb8f30002020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c2020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c01308aa08b567a66acb8356e54f688575350edd7f2d9efa7e1c9a3897011f83caa03a7deac4146592b8ca527263332e4d0840c33352e38352e32312e3137391435d9eb76397d05b43b5cd8da7ccfa8408bc89ab3fb4e1ffb05a3fb8f3000202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb0130ac508c0feb7d9b38e641298a71e6f10f3a8a30fa42c01856b6cfded1b452d802b6196e4b66602ea8cfafae03a37e57a00d35342e3134392e33332e313637141ffbf1d32541dcb8f5555305295704a9ff9adc24fb4e1ffb05a3fb8f30002040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d2040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d0130940b0a12e79c9c2b8889e6cf84f1d2c64277587471a8eecd7abec19c9f9a558791199c8fc6f07abd9b0459527e9625fd0c35322e31302e3232392e3131143e8b10646ee9d6c28d75c280b357dd3a9ae9f962fb4e1ffb05a3fb8f3000205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a23205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a230130b32376df0aa47f5bc41d383d00ba171eae10e87eb5dec1ffa8cb498dacdf98462e3f562e8c4901acde83da95d0d454780d33352e3136352e35302e31323614f460a07a2b0dc932e1d8ff2dee2b984ac415dcebfb4e1ffb05a3fb8f3000205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef4360130a50f2b1af92150d81387393503c15a485518b8375578b721e52bd84b1124e9a265e985681eb76e15c6a478d5b529f5ed0d34342e3233392e33392e31353314972a33056d57359de8acfa4fb8b29dc1c14f76b8fb4e1ffb05a3fb8f30002061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb2061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb0130b4c6e2f51056f17dc3cce763ea819a77770edc7122c39e68a0d8629ea8f36937468761952d9fca90a7c2c7f78f8b85770c35322e31322e3137362e3930147ada3e486409b39c94a0833c8d782f35bc24e96afb4e1ffb05a3fb8f3000206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966013080266707faf18059f5040438724f9f46921d5f600dd837dc1aea1f08f3dc2a7d12247a3ca0feff3ebde6855e221503c30e34342e3232382e3234322e31383114c374f016ea61e76aab79b8bb95a1ba0e6e3eee6ffb4e1ffb05a3fb8f3000207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf7019207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf70190130976e8ee23029edeaae45c1737a2ab7e440145fc145a2410aff4a0735335c6d73320c6dc5425449c00458fe214f10f0c70d35342e3138392e3136342e333914f9956e70daffa263e8cf29fa6557b7b630a595a8fb4e1ffb05a3fb8f30002085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8242085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8240130b311bf70f84c1332681af71fe6d684933be12807de50e6a3eed260d649891e3b409c75fff910381db43f5e5cc3eec96b0d35342e3230312e33322e3133311468c506d43816d1a8389c860c1d162be44d1e777cfb4e1ffb05a3fb8f30002087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789182087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789180130a57c0905911f436b83521d87ef76513c25e1c7177050b62ce038c0c485c7d7286b86822a1db20ee50e14c7bbca115e2f0e33352e3136372e3134352e313439149b9cdbfe3568cc0b37f136b00a634c75653f05e3fb4e1ffb05a3fb8f30002088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f2088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f0130b642e74f36ecfc0984377db6259e30010d61d4b4b309668af59718d570c8f9f253baa2ac00dc6041b12c79b77eb646af0b35322e33332e32382e343714711fd9548ae19b2e91c7a9b4067000467ccdd2b5fb4e1ffb05a3fb8f3000208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f2340130b5f63cf0be89e8e46af538e71e1a98d33173f83131572bff054c5fc3855fdd8f4d2359b91f164a082f65232960a6bb8b0d35322e31332e3133322e313436145bdbf34a0dad860c6ec71523ae39373325225cc1fb4e1ffb05a3fb8f3000208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e08150130a201efcc30db8655f99be543485d749efaaf164e222370f9dd50a3ecb0a428a07a16f7d9f9d7be5182e0974f926405f20c35322e33342e3134342e353014a0a0e17bfe82a484fefe348b7569a6d77d29d2c2fb4e1ffb05a3fb8f3000208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc40130b54279aae2009b7651c29c87d6a00bace24b0112690401ac71c935ba79c637ebab1dd1b6c8e5dd70c002846b87c580430c35322e34332e38362e32333114337b7fb5d2c531825c3e0123ac3354018085b302fb4e1ffb05a3fb8f3000208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f01308b55bd02dd900fc8f513373fc4275474e3c64f489463a2d167d93eb81cd6e41c54f06554d280ac71bd80b12f93c386e30d35342e36382e3233352e32303114c075993a8336f93a13bb7bbb7e0e89928be4aafbfb4e1ffb05a3fb8f30002091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d2091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d0130b847c83b10bac91203bd0ffbdee778131803975467db2d0889defa1f4671ab9207d330e944772f7ac7b7b05c04b59d5c0c35322e34302e3231392e34311402aa69f8ef6666e7cad6d9323755a0ef3c1b6bd9fb4e1ffb05a3fb8f3000209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c0130a76f59dad02d335374150895bcda911a1c8f77fc49938a60fc913ac1b01dca06eaf67c34145efa68f02d8ed5aacf60980c33342e3231342e34382e36381462e960a3f6b650feed98a266b3ccdf6e363562cffb4e1ffb05a3fb8f300020ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e25421620ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e2542160130a510330a7be7301de1872e3fb864ce4a6d9e6faad494159a5a29476c7110dc8fa10921c63d3e93f4181845c7fabd2c7f0d35322e34322e3230322e3132381462e0104ce0aafc1f06bde37c73702fe84b307f05fb4e1ffb05a3fb8f300020bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb820bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb80130b29f367ac0aa1c4a047507c039c7b406ddd38256b55fcc636ed00badef8240e50905b96d810b2eefc2ff0a82d0434a5f0c33352e38322e34392e31393614dbbebbc52a5bae21b818e0487311041c91b2683bfb4e1ffb05a3fb8f300020c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba820c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba80130b04058eaf4d337cdc95914d77fbc9f22be1dadd3fce162bf4bf3f67372383b7cc287eef82634ba9f69182c9e615b83ce0d35342e3231332e3230342e383514fdae7cdf38811659ce9481975b326a5d07236bc5fb4e1ffb05a3fb8f300020f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba786399038120f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba78639903810130a190aad82d3d99b77ba2ec6019caa72e82575fb72cf05d9eb97ef0f8d3f088c7350fbeb19c8a13c95f7e68073ef64fb20d35322e31332e3235302e31383214fe2d4798df3e9b41a6823bc0b3f020478e87925dfb4e1ffb05a3fb8f300020ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac920ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac901308d0c12f1fc8ee77846153c42e78d2e420358de9478058680d0c1019b33e65b1da765e8a369620e06145a573f46d5d6a70d35342e3138372e31342e3233321467e05b1b52c7c896adf20035036fe1d30dcefc9cfb4e1ffb05a3fb8f300030a6ece569edd51a503a2cfe5b2be0e24c33179ee6f8afa152d185b19f87fccb8ce5ecff6300fc600bd0418b69dcc3f4f220000000e78672b7a792c03ffc5e06c6512e0ae64c4b5410a2e41b6b871036e5d30020000000e78672b7a792c03ffc5e06c6512e0ae64c4b5410a2e41b6b871036e5d300fc00110970192005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea82005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea8000d35322e32342e3132342e313632148feb00404d6f765856c95e587b2523a365bc7258fb4e1ffb05a3fb8f30002012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a22012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a2000e3231322e32342e3130332e31343914c1161c96de3dae28cd7f20ff8c2aa7b94b866d76fb4e1ffb05a3fb8f30002020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c2020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c000c33352e38352e32312e3137391435d9eb76397d05b43b5cd8da7ccfa8408bc89ab3fb4e1ffb05a3fb8f30002039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a2039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a000e33352e3136332e3134342e32333014ec7bf3b9bc72eda38c80bb7cf16e294e763e56b4fb4e1ffb05a3fb8f30002040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d2040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d000c35322e31302e3232392e3131143e8b10646ee9d6c28d75c280b357dd3a9ae9f962fb4e1ffb05a3fb8f30002061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb2061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb000c35322e31322e3137362e3930147ada3e486409b39c94a0833c8d782f35bc24e96afb4e1ffb05a3fb8f3000206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966000e34342e3232382e3234322e31383114c374f016ea61e76aab79b8bb95a1ba0e6e3eee6ffb4e1ffb05a3fb8f3000207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf7019207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf7019000d35342e3138392e3136342e333914f9956e70daffa263e8cf29fa6557b7b630a595a8fb4e1ffb05a3fb8f300020754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e20754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e000c34342e3233332e34342e39351446d938862af6d9a291e26c0048177db2892a710bfb4e1ffb05a3fb8f3000207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290000d34342e3232372e3133372e3737140498ade3c80045c2a7520e921180ae1c39da5c57fb4e1ffb05a3fb8f30002085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8242085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be824000d35342e3230312e33322e3133311468c506d43816d1a8389c860c1d162be44d1e777cfb4e1ffb05a3fb8f30002087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789182087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d678918000e33352e3136372e3134352e313439149b9cdbfe3568cc0b37f136b00a634c75653f05e3fb4e1ffb05a3fb8f30002088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f2088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f000b35322e33332e32382e343714711fd9548ae19b2e91c7a9b4067000467ccdd2b5fb4e1ffb05a3fb8f3000208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234000d35322e31332e3133322e313436145bdbf34a0dad860c6ec71523ae39373325225cc1fb4e1ffb05a3fb8f3000208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815000c35322e33342e3134342e353014a0a0e17bfe82a484fefe348b7569a6d77d29d2c2fb4e1ffb05a3fb8f3000208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4000c35322e34332e38362e32333114337b7fb5d2c531825c3e0123ac3354018085b302fb4e1ffb05a3fb8f3000208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0000c35322e38392e3135342e3438146d57707c196e06487d326094c964f258f5b77c35fb4e1ffb05a3fb8f3000208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f000d35342e36382e3233352e32303114c075993a8336f93a13bb7bbb7e0e89928be4aafbfb4e1ffb05a3fb8f30002091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d2091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d000c35322e34302e3231392e34311402aa69f8ef6666e7cad6d9323755a0ef3c1b6bd9fb4e1ffb05a3fb8f30002098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920962098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba092096000c34342e3233322e3139362e3614d6ece912cbf02627a4efc3dd37e6833cf3671551fb4e1ffb05a3fb8f3000209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c000c33342e3231342e34382e36381462e960a3f6b650feed98a266b3ccdf6e363562cffb4e1ffb05a3fb8f300020b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f20b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f000b35322e34332e31332e39321441b308f737ca9e39f67b553158903198a88c516efb4e1ffb05a3fb8f300020c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba820c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba8000d35342e3231332e3230342e383514fdae7cdf38811659ce9481975b326a5d07236bc5fb4e1ffb05a3fb8f300020d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8920d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f89000d34342e3234302e39382e313032147034f0d3853c5351fb8e0ffd3c1daf12c51c2d89fb4e1ffb05a3fb8f300020f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba786399038120f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba7863990381000d35322e31332e3235302e31383214fe2d4798df3e9b41a6823bc0b3f020478e87925dfb4e1ffb05a3fb8f300030952b5f1b8f31ad775ba1420d465e22b9db941245eacc8d738bee5b8e4704771d461a42949afe7e2ae91d49e795cf9ba22000000021160aae5b92562c94a5d6735c5dff3a92aa0a8d9b02aa0c614ca7154a002000000021160aae5b92562c94a5d6735c5dff3a92aa0a8d9b02aa0c614ca7154a00fc00110958192005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea82005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea8000d35322e32342e3132342e313632148feb00404d6f765856c95e587b2523a365bc7258fb4e1ffb05a3fb8f30002012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a22012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a2000e3231322e32342e3130332e31343914c1161c96de3dae28cd7f20ff8c2aa7b94b866d76fb4e1ffb05a3fb8f300020143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11320143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f113000d33352e3136342e32332e32343514b5f25f8f70cf8d05c2d2970bdf186c994431d84efb4e1ffb05a3fb8f30002020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c2020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c000c33352e38352e32312e3137391435d9eb76397d05b43b5cd8da7ccfa8408bc89ab3fb4e1ffb05a3fb8f3000202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb000d35342e3134392e33332e313637141ffbf1d32541dcb8f5555305295704a9ff9adc24fb4e1ffb05a3fb8f30002039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a2039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a000e33352e3136332e3134342e32333014ec7bf3b9bc72eda38c80bb7cf16e294e763e56b4fb4e1ffb05a3fb8f30002040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d2040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d000c35322e31302e3232392e3131143e8b10646ee9d6c28d75c280b357dd3a9ae9f962fb4e1ffb05a3fb8f3000205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436000d34342e3233392e33392e31353314972a33056d57359de8acfa4fb8b29dc1c14f76b8fb4e1ffb05a3fb8f30002061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb2061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb000c35322e31322e3137362e3930147ada3e486409b39c94a0833c8d782f35bc24e96afb4e1ffb05a3fb8f3000206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966000e34342e3232382e3234322e31383114c374f016ea61e76aab79b8bb95a1ba0e6e3eee6ffb4e1ffb05a3fb8f3000207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290000d34342e3232372e3133372e3737140498ade3c80045c2a7520e921180ae1c39da5c57fb4e1ffb05a3fb8f30002088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f2088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f000b35322e33332e32382e343714711fd9548ae19b2e91c7a9b4067000467ccdd2b5fb4e1ffb05a3fb8f3000208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234000d35322e31332e3133322e313436145bdbf34a0dad860c6ec71523ae39373325225cc1fb4e1ffb05a3fb8f3000208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4000c35322e34332e38362e32333114337b7fb5d2c531825c3e0123ac3354018085b302fb4e1ffb05a3fb8f3000208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0000c35322e38392e3135342e3438146d57707c196e06487d326094c964f258f5b77c35fb4e1ffb05a3fb8f3000208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f000d35342e36382e3233352e32303114c075993a8336f93a13bb7bbb7e0e89928be4aafbfb4e1ffb05a3fb8f30002091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d2091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d000c35322e34302e3231392e34311402aa69f8ef6666e7cad6d9323755a0ef3c1b6bd9fb4e1ffb05a3fb8f3000209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54000d33352e38322e3139372e31393714ed1131823bcea23ac78af8c01e4d24683d6ecf88fb4e1ffb05a3fb8f300020b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f20b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f000b35322e34332e31332e39321441b308f737ca9e39f67b553158903198a88c516efb4e1ffb05a3fb8f300020ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e25421620ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e254216000d35322e34322e3230322e3132381462e0104ce0aafc1f06bde37c73702fe84b307f05fb4e1ffb05a3fb8f300020bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb820bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb8000c33352e38322e34392e31393614dbbebbc52a5bae21b818e0487311041c91b2683bfb4e1ffb05a3fb8f300020c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba820c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba8000d35342e3231332e3230342e383514fdae7cdf38811659ce9481975b326a5d07236bc5fb4e1ffb05a3fb8f300020d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8920d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f89000d34342e3234302e39382e313032147034f0d3853c5351fb8e0ffd3c1daf12c51c2d89fb4e1ffb05a3fb8f300020f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba786399038120f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba7863990381000d35322e31332e3235302e31383214fe2d4798df3e9b41a6823bc0b3f020478e87925dfb4e1ffb05a3fb8f300020ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac920ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac9000d35342e3138372e31342e3233321467e05b1b52c7c896adf20035036fe1d30dcefc9cfb4e1ffb05a3fb8f300030afe32c814088749bdf90012b78f156d0bea19ba06a56d4d6a22e80fbe9444d64c5b1545b55bb0f1c92fd79a1eae4e29d20000001561ac909f7762f03b801661c0ab46943d603d2883b36535ad5f6344cb80020000001561ac909f7762f03b801661c0ab46943d603d2883b36535ad5f6344cb800fc00110940192005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea82005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea8000d35322e32342e3132342e313632148feb00404d6f765856c95e587b2523a365bc7258fb4e1ffb05a3fb8f30002012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a22012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a2000e3231322e32342e3130332e31343914c1161c96de3dae28cd7f20ff8c2aa7b94b866d76fb4e1ffb05a3fb8f300020143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11320143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f113000d33352e3136342e32332e32343514b5f25f8f70cf8d05c2d2970bdf186c994431d84efb4e1ffb05a3fb8f3000202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb000d35342e3134392e33332e313637141ffbf1d32541dcb8f5555305295704a9ff9adc24fb4e1ffb05a3fb8f30002039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a2039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a000e33352e3136332e3134342e32333014ec7bf3b9bc72eda38c80bb7cf16e294e763e56b4fb4e1ffb05a3fb8f30002040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d2040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d000c35322e31302e3232392e3131143e8b10646ee9d6c28d75c280b357dd3a9ae9f962fb4e1ffb05a3fb8f3000205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436000d34342e3233392e33392e31353314972a33056d57359de8acfa4fb8b29dc1c14f76b8fb4e1ffb05a3fb8f30002061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb2061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb000c35322e31322e3137362e3930147ada3e486409b39c94a0833c8d782f35bc24e96afb4e1ffb05a3fb8f3000206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966000e34342e3232382e3234322e31383114c374f016ea61e76aab79b8bb95a1ba0e6e3eee6ffb4e1ffb05a3fb8f300020754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e20754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e000c34342e3233332e34342e39351446d938862af6d9a291e26c0048177db2892a710bfb4e1ffb05a3fb8f3000207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290000d34342e3232372e3133372e3737140498ade3c80045c2a7520e921180ae1c39da5c57fb4e1ffb05a3fb8f30002085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8242085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be824000d35342e3230312e33322e3133311468c506d43816d1a8389c860c1d162be44d1e777cfb4e1ffb05a3fb8f30002088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f2088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f000b35322e33332e32382e343714711fd9548ae19b2e91c7a9b4067000467ccdd2b5fb4e1ffb05a3fb8f3000208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234000d35322e31332e3133322e313436145bdbf34a0dad860c6ec71523ae39373325225cc1fb4e1ffb05a3fb8f3000208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815000c35322e33342e3134342e353014a0a0e17bfe82a484fefe348b7569a6d77d29d2c2fb4e1ffb05a3fb8f3000208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4000c35322e34332e38362e32333114337b7fb5d2c531825c3e0123ac3354018085b302fb4e1ffb05a3fb8f3000208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0000c35322e38392e3135342e3438146d57707c196e06487d326094c964f258f5b77c35fb4e1ffb05a3fb8f3000208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f000d35342e36382e3233352e32303114c075993a8336f93a13bb7bbb7e0e89928be4aafbfb4e1ffb05a3fb8f3000209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54000d33352e38322e3139372e31393714ed1131823bcea23ac78af8c01e4d24683d6ecf88fb4e1ffb05a3fb8f30002098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920962098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba092096000c34342e3233322e3139362e3614d6ece912cbf02627a4efc3dd37e6833cf3671551fb4e1ffb05a3fb8f300020b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f20b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f000b35322e34332e31332e39321441b308f737ca9e39f67b553158903198a88c516efb4e1ffb05a3fb8f300020bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb820bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb8000c33352e38322e34392e31393614dbbebbc52a5bae21b818e0487311041c91b2683bfb4e1ffb05a3fb8f300020c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba820c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba8000d35342e3231332e3230342e383514fdae7cdf38811659ce9481975b326a5d07236bc5fb4e1ffb05a3fb8f300020d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8920d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f89000d34342e3234302e39382e313032147034f0d3853c5351fb8e0ffd3c1daf12c51c2d89fb4e1ffb05a3fb8f300020f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba786399038120f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba7863990381000d35322e31332e3235302e31383214fe2d4798df3e9b41a6823bc0b3f020478e87925dfb4e1ffb05a3fb8f3000308759c691df7b1ba670491acca647d6b73b22357fdd6bc666f9ff12e0b05386c9b448b2565acc758f8200037776704fd120000000c9c3825db4b9a1751e94ef41634a33e2df66e8f9ddcd56dd435232f48f0020000000c9c3825db4b9a1751e94ef41634a33e2df66e8f9ddcd56dd435232f48f00fc00110928192005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea82005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea80130924ad656b10ed6bb91d0e3d628dcdb849ea66d25e377f2371bfd491c40e74788c859ad024da1d5cf4949834b7e79f2ee0d35322e32342e3132342e313632148feb00404d6f765856c95e587b2523a365bc7258fb4e1ffb05a3fb8f30002012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a22012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a20130aac9ede908775e57d5b1bce4b6b7fc2b1c50c8ac8353232620e979fb669b1af81690c2739bc60f35a8958764496946280e3231322e32342e3130332e31343914c1161c96de3dae28cd7f20ff8c2aa7b94b866d76fb4e1ffb05a3fb8f300020143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11320143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f113013083ce4eb1e593141192a2453ca0ed4cfe462af4c2f564099e1defb49bc7febbb62b5f2dfd1e64e9a57e65354df6327d1c0d33352e3136342e32332e32343514b5f25f8f70cf8d05c2d2970bdf186c994431d84efb4e1ffb05a3fb8f30002020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c2020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c0130adc8f74781a33cc6773cdce95d58a3c2cbe36a40c4f971987226a8027787d5ddf82bfb51dbd48023b5cfacb152029c970c33352e38352e32312e3137391435d9eb76397d05b43b5cd8da7ccfa8408bc89ab3fb4e1ffb05a3fb8f3000202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb0130b5ac90f960f003df563d7d8dc350e26e218efbc993f9cb52a59290579da516e83a69b56dea7be3f0d29f6266b9caa2b50d35342e3134392e33332e313637141ffbf1d32541dcb8f5555305295704a9ff9adc24fb4e1ffb05a3fb8f3000205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a23205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a230130aa742f3326d38b837ef98fb9736469642f166926f7961859c5d01dd49bfc66904b49edabf995b8e0a3b6389387614a2c0d33352e3136352e35302e31323614f460a07a2b0dc932e1d8ff2dee2b984ac415dcebfb4e1ffb05a3fb8f3000205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef4360130976d7f5ed93385d48d42851930ed313180a8a9be816085db2763dfcc233c8cf07a78ce2f3e90a48ae48f3c6203f3766f0d34342e3233392e33392e31353314972a33056d57359de8acfa4fb8b29dc1c14f76b8fb4e1ffb05a3fb8f30002061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb2061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb013083dd7663c78d21bda4652a64bd714dc888a76b8e60da2d3cccb5530b73722ec81e67815668af7a71ed484347b60586320c35322e31322e3137362e3930147ada3e486409b39c94a0833c8d782f35bc24e96afb4e1ffb05a3fb8f3000206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966013083bcb86817efb833569855c921422c2bf1b091def65d4ad85e19e668720c238bbfed72b10f46c2a4018acdf170007d080e34342e3232382e3234322e31383114c374f016ea61e76aab79b8bb95a1ba0e6e3eee6ffb4e1ffb05a3fb8f3000207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf7019207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf70190130971f8a04797eaaa9b3b9dd3d693cd306521e1cf500952419a34b1977d086a3df182a700b02872dff3cb290a04208a9c50d35342e3138392e3136342e333914f9956e70daffa263e8cf29fa6557b7b630a595a8fb4e1ffb05a3fb8f300020754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e20754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e013081b9ffd0d23314602ccc44eaaa8f2c40583963c2100106341900d1280850b4e84f7a31950c2279d43202348c3c857f330c34342e3233332e34342e39351446d938862af6d9a291e26c0048177db2892a710bfb4e1ffb05a3fb8f3000207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be42900130acd93627366f7f42ef27d343f9c57a8db738e45db943c10fcd26f960a1a23a8ea25d4a3202a7ed7cc194b75f47d35c100d34342e3232372e3133372e3737140498ade3c80045c2a7520e921180ae1c39da5c57fb4e1ffb05a3fb8f30002087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789182087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789180130b6c4b5c7ce4c90a8f2c49558894d88400f82cc709c639c0331ae0e576f37548d54bdad91e49445ec9e68881cb392e9220e33352e3136372e3134352e313439149b9cdbfe3568cc0b37f136b00a634c75653f05e3fb4e1ffb05a3fb8f30002088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f2088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f013099419898f07b65df952ce60727b69493cae876e624d268710df77535afd899f6a02cdcba635b8ad3cc9842ae140e7fc90b35322e33332e32382e343714711fd9548ae19b2e91c7a9b4067000467ccdd2b5fb4e1ffb05a3fb8f3000208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0013083d49c9014f9cf4a73ec9166c321ec4dffe9d7610ae2690141470fa2906dc8b8b0b65c38b881f4c87d5ba273a36476460c35322e38392e3135342e3438146d57707c196e06487d326094c964f258f5b77c35fb4e1ffb05a3fb8f30002091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d2091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d0130a5b2b14324b75a8f03645434878fd9b78326125ca9a5479b3a63fc9c3e269f07e0914101476f0f7a81ce74db682df2330c35322e34302e3231392e34311402aa69f8ef6666e7cad6d9323755a0ef3c1b6bd9fb4e1ffb05a3fb8f30002098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920962098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920960130a910e926ae8a2a9ac7130053e40ff33f8a6b05f465619eaeea156550ef956c663797d5096f7db4eb1db5bf328ba963440c34342e3233322e3139362e3614d6ece912cbf02627a4efc3dd37e6833cf3671551fb4e1ffb05a3fb8f3000209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c0130ad328fa477cf797787c60fb91c2cb603896d04de19515bfa94fcf6dcd943a5dfe09f3341ca7ca0872cd8da59e68d72b10c33342e3231342e34382e36381462e960a3f6b650feed98a266b3ccdf6e363562cffb4e1ffb05a3fb8f300020b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f20b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f0130b123e19529c06f90a4c62c60fa86a64681ad3d93a0ada42ebc496f1643448819bed2a94b1ff5e5ff32ca3a9589fc37590b35322e34332e31332e39321441b308f737ca9e39f67b553158903198a88c516efb4e1ffb05a3fb8f300020ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e25421620ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e2542160130a3e517adf8333dfc0ae60504cfaa02dc1387a5c2d59cbf8d9cf07a84bedbea0b0b40821152f18a17529e2bf1fece004c0d35322e34322e3230322e3132381462e0104ce0aafc1f06bde37c73702fe84b307f05fb4e1ffb05a3fb8f300020bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb820bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb80130b345c75d74bd26b8c95f30eb1e23a2a892b507269f5f5416faefd7f4ce9e721210246dc074f6b2a42129a1f8dce17dfc0c33352e38322e34392e31393614dbbebbc52a5bae21b818e0487311041c91b2683bfb4e1ffb05a3fb8f300020c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba820c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba80130a556c58a4ceca86bf6e7c7cec01ecea90d9ddabc76eaa64de7e15d71ec4463d0712ddb7fc27afcf9328348e9b4555d320d35342e3231332e3230342e383514fdae7cdf38811659ce9481975b326a5d07236bc5fb4e1ffb05a3fb8f300020d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8920d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f890130b97076e5170bae287a101f96a2a57c43d88d28f24c74eb3b5f19dbe8e9b0556abcaed75ff70b48f0a742afbdc32f368f0d34342e3234302e39382e313032147034f0d3853c5351fb8e0ffd3c1daf12c51c2d89fb4e1ffb05a3fb8f300020f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba786399038120f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba78639903810130b720e1f87cdd506feece2e0778a91d716671c7c7f19e766e5e13541074c9e053406f59816566cf4a67239d9e8101ff8d0d35322e31332e3235302e31383214fe2d4798df3e9b41a6823bc0b3f020478e87925dfb4e1ffb05a3fb8f300020ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac920ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac90130875fe89958bd413087ee35b99293b326b5b505482a25a3bfab04e5ac59ee2c0687c01febceffc2cc50cab76bce3cad510d35342e3138372e31342e3233321467e05b1b52c7c896adf20035036fe1d30dcefc9cfb4e1ffb05a3fb8f300030875f8e47eb3ef86e27ad3a5b0003289cdf445aed6ee7ab0f21c24e595c1f19fe9d969fdc6c5a6eeb66d712bf75846cf720000000b91e2a2fe9ab4c3899dc7d2d85c9e00e068603afe59058d5415a84773d0020000000b91e2a2fe9ab4c3899dc7d2d85c9e00e068603afe59058d5415a84773d00fc00110910192005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea82005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea8000d35322e32342e3132342e313632148feb00404d6f765856c95e587b2523a365bc7258fb4e1ffb05a3fb8f30002012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a22012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a2000e3231322e32342e3130332e31343914c1161c96de3dae28cd7f20ff8c2aa7b94b866d76fb4e1ffb05a3fb8f30002020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c2020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c000c33352e38352e32312e3137391435d9eb76397d05b43b5cd8da7ccfa8408bc89ab3fb4e1ffb05a3fb8f3000202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb000d35342e3134392e33332e313637141ffbf1d32541dcb8f5555305295704a9ff9adc24fb4e1ffb05a3fb8f30002039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a2039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a000e33352e3136332e3134342e32333014ec7bf3b9bc72eda38c80bb7cf16e294e763e56b4fb4e1ffb05a3fb8f30002040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d2040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d000c35322e31302e3232392e3131143e8b10646ee9d6c28d75c280b357dd3a9ae9f962fb4e1ffb05a3fb8f3000205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436000d34342e3233392e33392e31353314972a33056d57359de8acfa4fb8b29dc1c14f76b8fb4e1ffb05a3fb8f30002061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb2061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb000c35322e31322e3137362e3930147ada3e486409b39c94a0833c8d782f35bc24e96afb4e1ffb05a3fb8f3000206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966000e34342e3232382e3234322e31383114c374f016ea61e76aab79b8bb95a1ba0e6e3eee6ffb4e1ffb05a3fb8f300020754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e20754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e000c34342e3233332e34342e39351446d938862af6d9a291e26c0048177db2892a710bfb4e1ffb05a3fb8f3000207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290000d34342e3232372e3133372e3737140498ade3c80045c2a7520e921180ae1c39da5c57fb4e1ffb05a3fb8f30002087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789182087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d678918000e33352e3136372e3134352e313439149b9cdbfe3568cc0b37f136b00a634c75653f05e3fb4e1ffb05a3fb8f3000208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234000d35322e31332e3133322e313436145bdbf34a0dad860c6ec71523ae39373325225cc1fb4e1ffb05a3fb8f3000208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815000c35322e33342e3134342e353014a0a0e17bfe82a484fefe348b7569a6d77d29d2c2fb4e1ffb05a3fb8f3000208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4000c35322e34332e38362e32333114337b7fb5d2c531825c3e0123ac3354018085b302fb4e1ffb05a3fb8f3000208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0000c35322e38392e3135342e3438146d57707c196e06487d326094c964f258f5b77c35fb4e1ffb05a3fb8f3000209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54000d33352e38322e3139372e31393714ed1131823bcea23ac78af8c01e4d24683d6ecf88fb4e1ffb05a3fb8f30002098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920962098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba092096000c34342e3233322e3139362e3614d6ece912cbf02627a4efc3dd37e6833cf3671551fb4e1ffb05a3fb8f3000209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c000c33342e3231342e34382e36381462e960a3f6b650feed98a266b3ccdf6e363562cffb4e1ffb05a3fb8f300020b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f20b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f000b35322e34332e31332e39321441b308f737ca9e39f67b553158903198a88c516efb4e1ffb05a3fb8f300020ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e25421620ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e254216000d35322e34322e3230322e3132381462e0104ce0aafc1f06bde37c73702fe84b307f05fb4e1ffb05a3fb8f300020bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb820bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb8000c33352e38322e34392e31393614dbbebbc52a5bae21b818e0487311041c91b2683bfb4e1ffb05a3fb8f300020c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba820c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba8000d35342e3231332e3230342e383514fdae7cdf38811659ce9481975b326a5d07236bc5fb4e1ffb05a3fb8f300020d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8920d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f89000d34342e3234302e39382e313032147034f0d3853c5351fb8e0ffd3c1daf12c51c2d89fb4e1ffb05a3fb8f300020f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba786399038120f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba7863990381000d35322e31332e3235302e31383214fe2d4798df3e9b41a6823bc0b3f020478e87925dfb4e1ffb05a3fb8f300030811c99ba6830312caf298444f81f4cf1007ddb18aafc86c3b07709355078e76b5c6dc4986f90e3ab4c49eb3277e8f05820000000503099f9f7fc49ca9350ce1951c09325670b8b459f3a55ebe6811f13e10020000000503099f9f7fc49ca9350ce1951c09325670b8b459f3a55ebe6811f13e100fc001108f8192005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea82005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea80130ade4f9ac0bf7a220bd7931db817cfe4a1948c980bda2b9fa47f388094c433ae05f4ca9336b866f1f0ad1df11d84d9aa40d35322e32342e3132342e313632148feb00404d6f765856c95e587b2523a365bc7258fb4e1ffb05a3fb8f30002012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a22012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a20130a0aae269176730e5448cb9f9ad9112e5d8ecf10e7cd60749573096bce1f92a8c54ab971b159b181b2e77d91f03a163420e3231322e32342e3130332e31343914c1161c96de3dae28cd7f20ff8c2aa7b94b866d76fb4e1ffb05a3fb8f300020143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11320143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11301308f158752c7ec2792ed365eb5452ffb7284baa0daaccabc0a373fe93e4437ac914e99fa3585ee13b2233ea957a7b875f30d33352e3136342e32332e32343514b5f25f8f70cf8d05c2d2970bdf186c994431d84efb4e1ffb05a3fb8f3000202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb0130a61711a34d191e0c70f0f357c9ef6c12f0933031d2d5364ad77f2d2139232bba8450d3dd947923639669dbcb2cdc77000d35342e3134392e33332e313637141ffbf1d32541dcb8f5555305295704a9ff9adc24fb4e1ffb05a3fb8f30002039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a2039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a013095fe0a1e5cec63ada905498014c403049ee0fac572b21ff7d9bfc64e0c58bfc04ec29aa4567fcaf9af431b8925d001e40e33352e3136332e3134342e32333014ec7bf3b9bc72eda38c80bb7cf16e294e763e56b4fb4e1ffb05a3fb8f30002040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d2040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d0130b504e0534e88aeb51c3a3f7ca3d6668753ad6502218f173eee918767286822d99f4ee80bf7c07e717d2b107745d63fd70c35322e31302e3232392e3131143e8b10646ee9d6c28d75c280b357dd3a9ae9f962fb4e1ffb05a3fb8f3000205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a23205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a230130a16d937e47da149a8c71d34c552c98585faafa99c2986397fc8455e45adf1573dd4535806a8a084b7fa34bbeea9253a80d33352e3136352e35302e31323614f460a07a2b0dc932e1d8ff2dee2b984ac415dcebfb4e1ffb05a3fb8f3000205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef4360130a547a8172171c9ddaeae2eb272e92184a751a53d51476684342c06f6968c32dd9a23742df2e9194613934c5e58ef7e620d34342e3233392e33392e31353314972a33056d57359de8acfa4fb8b29dc1c14f76b8fb4e1ffb05a3fb8f30002061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb2061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb0130a5374524f11f982d5bc082567c60fa9c1bc5be1510eeb42b0f6c2810c8e6da16e609603ce456f17df3636c5407ca5d160c35322e31322e3137362e3930147ada3e486409b39c94a0833c8d782f35bc24e96afb4e1ffb05a3fb8f3000206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e528633209660130972f1c4070d037808f22be8a28ec2b12a4737a70d803498b39b9c1cd5f060a3c14b8682c484517e66b10f8a339e1f1900e34342e3232382e3234322e31383114c374f016ea61e76aab79b8bb95a1ba0e6e3eee6ffb4e1ffb05a3fb8f3000207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf7019207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf70190130843e716b0c02fff03ab196cf7807890ea4135b104698007370fbaad68eda6926588a2252c8716fbcff2f2e18de92da4e0d35342e3138392e3136342e333914f9956e70daffa263e8cf29fa6557b7b630a595a8fb4e1ffb05a3fb8f300020754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e20754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e0130ace190d30463989a24b517945d94dc45894993e493cd32be40bc8b0d0946801af5be6ce4cd0bdf1189436bf085ed96df0c34342e3233332e34342e39351446d938862af6d9a291e26c0048177db2892a710bfb4e1ffb05a3fb8f3000207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be429001308a393458f5158095c5b380e1bc1a19ebc9060d6322422bcebf338382de0accb2d24783a33ad9f0bd06f0b522ce9b2dfa0d34342e3232372e3133372e3737140498ade3c80045c2a7520e921180ae1c39da5c57fb4e1ffb05a3fb8f30002085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8242085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8240130868eea59f1f6748680f0513feec4c06fbc416c3a37a45494fc1a8aab3982c3c0dd206af2d6bdfd28f3f88be4fd3b2f080d35342e3230312e33322e3133311468c506d43816d1a8389c860c1d162be44d1e777cfb4e1ffb05a3fb8f30002087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789182087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789180130862184496a4ed2deea7ad130bca509f8ca0ebda660ab7b5189f3c40e8f3e62c665e0031ccc7bffdc32a5fb921a022e930e33352e3136372e3134352e313439149b9cdbfe3568cc0b37f136b00a634c75653f05e3fb4e1ffb05a3fb8f30002088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f2088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f013097f08edddfd65e13651bf00b0f3485e2d81a477f45d9b46bdda40a416178cb0fb16199a2f8e969cfb37ed37c234a9cd20b35322e33332e32382e343714711fd9548ae19b2e91c7a9b4067000467ccdd2b5fb4e1ffb05a3fb8f3000208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f2340130a8e6429fd5e3e981383c03637e707d3b313fbc1606a8023a40e48bf071e45db9b451a3fd2760d28d75a43417e958e7830d35322e31332e3133322e313436145bdbf34a0dad860c6ec71523ae39373325225cc1fb4e1ffb05a3fb8f3000208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c00130b2fad499c0eced2e83c79ea1c2b03ec399b2fb7411fe2a744979277b75d401b039dbcece4d9d3c0e035c339901d7a6330c35322e38392e3135342e3438146d57707c196e06487d326094c964f258f5b77c35fb4e1ffb05a3fb8f3000208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f0130990f8dfc1e064ccb5c1dae252c390fc0ca792e730cada8ca1bd9a0b87a22bd08692827b19e614886125734d25bdbbb1c0d35342e36382e3233352e32303114c075993a8336f93a13bb7bbb7e0e89928be4aafbfb4e1ffb05a3fb8f30002091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d2091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d013082743c519fc81d9496a0b6b5dea3010daebd5d07e7819fdca3a7b9763c9cc96554f45243e4f3dd3bd550556630ea0e4c0c35322e34302e3231392e34311402aa69f8ef6666e7cad6d9323755a0ef3c1b6bd9fb4e1ffb05a3fb8f3000209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c0130a87c6b9f8d841bac3ad961c636f6112def93e8f1444da8ed44fb45eb8b8f76c64c4eb56f2d6a4c73bfc7bebbe388bff60c33342e3231342e34382e36381462e960a3f6b650feed98a266b3ccdf6e363562cffb4e1ffb05a3fb8f300020c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba820c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba80130821654a83db6fda5da7398f8caf30cec37f572cbb06ab2c16087b5a10f5bc02ecb9b577282b56be8efd15dd743d3a49a0d35342e3231332e3230342e383514fdae7cdf38811659ce9481975b326a5d07236bc5fb4e1ffb05a3fb8f300020d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8920d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f890130b95ef4d4f00f59a98abefd80d26838fa5e6ebbbf7f53708cea1e4bb5bc29b4db8df9a2b212915bce9c6c9243335695150d34342e3234302e39382e313032147034f0d3853c5351fb8e0ffd3c1daf12c51c2d89fb4e1ffb05a3fb8f300020f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba786399038120f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba7863990381013082799988066eb079178da860dea57e31e6908b1395b7ff048078d62c21a8c1a8d3356aaedfa3946054ef8803b04d82700d35322e31332e3235302e31383214fe2d4798df3e9b41a6823bc0b3f020478e87925dfb4e1ffb05a3fb8f300020ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac920ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac90130b99743b53234d7c72f44f464edf915d5ede43f8864b8c5224c7b2ff1f3d3afe29ee1313bd1d24eb20ea9436fd59d0e5c0d35342e3138372e31342e3233321467e05b1b52c7c896adf20035036fe1d30dcefc9cfb4e1ffb05a3fb8f300030b5da956497c5d4f39fca6f5b1c03f6c05992d1d654f226cf79019376aa64597614dd570190e16958718b9941acd718a1200000004d43bd84ac6be16b9b7e352b3e9905e1337d7d4d6dd0b8a0ff92a89f1c00200000004d43bd84ac6be16b9b7e352b3e9905e1337d7d4d6dd0b8a0ff92a89f1c00fc001108e01920143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11320143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11301308b460fcb3cc7ee796175caa6f052d3bdc69e818d74112b2ab846c918669bf638c7ee40ed205995a29033acc18d59ddb80d33352e3136342e32332e32343514b5f25f8f70cf8d05c2d2970bdf186c994431d84efb4e1ffb05a3fb8f30002020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c2020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c0130ae54bad16d671bc5c15961a2831600a97d2d45656a05d3ff23e1dfbca7b7ffaf3f6849b963d7c6da2207bc45f82149180c33352e38352e32312e3137391435d9eb76397d05b43b5cd8da7ccfa8408bc89ab3fb4e1ffb05a3fb8f30002039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a2039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a0130a754aef784851c7b33edc0672fdc4acbbb5b68d18cc599d5ea0f90dc18f1d0f9b240852300bb4897a840c3ad75ad92720e33352e3136332e3134342e32333014ec7bf3b9bc72eda38c80bb7cf16e294e763e56b4fb4e1ffb05a3fb8f30002040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d2040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d0130997667cb4a12ed8a163f798d3adb2ce58fd6893a43f6076aaa4361fb72252e0b199e4ec1ce8a5f7c28cd4569f22811760c35322e31302e3232392e3131143e8b10646ee9d6c28d75c280b357dd3a9ae9f962fb4e1ffb05a3fb8f3000205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a23205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a2301308f7f1b73f23c47a901bc0fcafee3390f1814082c6ba58fbe8ff3bfb2d8ae59e166b9bf4cafeb73ab84f8c92bf025d5680d33352e3136352e35302e31323614f460a07a2b0dc932e1d8ff2dee2b984ac415dcebfb4e1ffb05a3fb8f30002061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb2061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb0130af907e5db8f2044c7439fcf769805a1cb6d6fe054dcc0143f1fc016887fa3e5d118d00ee3915a17232d4d3399fe72d5b0c35322e31322e3137362e3930147ada3e486409b39c94a0833c8d782f35bc24e96afb4e1ffb05a3fb8f3000206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e528633209660130a09832716c65b1546e347932ef900e805a201ce2dcc0f63f9a4134f0f63e1f1a8fe21c73c8bb611f8be20e39534e083c0e34342e3232382e3234322e31383114c374f016ea61e76aab79b8bb95a1ba0e6e3eee6ffb4e1ffb05a3fb8f3000207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf7019207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf70190130b08d9d26e9e4be1c5126efd8ddb59794fd773a02842acc3d3da4bac6c0c617e6d7252eb8b6cf39c31768046f428d2ce20d35342e3138392e3136342e333914f9956e70daffa263e8cf29fa6557b7b630a595a8fb4e1ffb05a3fb8f300020754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e20754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e013097532b6be5b41d239a8645d8d64afb5cef699c098a67b4a9937821bc1dd20b5bdee4c1e426c5a7f8052eb3952190cfa70c34342e3233332e34342e39351446d938862af6d9a291e26c0048177db2892a710bfb4e1ffb05a3fb8f3000207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be42900130ab556ce9c2e2700225559ec1959d45c83253cb296dce2b6b33cbfe9b874dbfe9dbe904fa2dcea902415fc1ecfc39474a0d34342e3232372e3133372e3737140498ade3c80045c2a7520e921180ae1c39da5c57fb4e1ffb05a3fb8f30002085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8242085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8240130b54b2015b5e21346dbc940cc84bf51b4e6ff48dde45eee42fda6fd2e52ecb69a3a59583d4f07abcb116277878de85d590d35342e3230312e33322e3133311468c506d43816d1a8389c860c1d162be44d1e777cfb4e1ffb05a3fb8f30002087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789182087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789180130b07b9e19df45bab4886e1725af1ceb51c9ec8d6b7de345396996a5d541f0360fde8b4cd19e09c01fb82bf36460c9ce060e33352e3136372e3134352e313439149b9cdbfe3568cc0b37f136b00a634c75653f05e3fb4e1ffb05a3fb8f3000208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e08150130a2578e7fa88cdd15a5eaf6f627d5180fb2c5867b1a63435e6cc69087b219012d39fdd00bed9c975a4692ef5b55212ba20c35322e33342e3134342e353014a0a0e17bfe82a484fefe348b7569a6d77d29d2c2fb4e1ffb05a3fb8f3000208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4013088f04eb6df9fd7339e63ceb4eebc70de145b4013dd6df67e22de136983e4065a5afe874be3352522a801c2c20a7f90cd0c35322e34332e38362e32333114337b7fb5d2c531825c3e0123ac3354018085b302fb4e1ffb05a3fb8f3000208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0013089ef74e90f14b3548986e55bf793a404f6c6c51d37ac118fe09f8869c71fd25aeba2f6c6951cf41fd5ca240907a760690c35322e38392e3135342e3438146d57707c196e06487d326094c964f258f5b77c35fb4e1ffb05a3fb8f3000208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f01309796d4499f58876deedf4904e96de7c6f308aea15e7f1495db988e1dd70c5703fc3338127dd6fbaa638fd09d9a2495440d35342e36382e3233352e32303114c075993a8336f93a13bb7bbb7e0e89928be4aafbfb4e1ffb05a3fb8f30002091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d2091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d0130a28553f210bcac6400cfae3cf36294b373acdd4d66b92bd30c0c7230f5cc080e6546eb961f6432e51e0d88d1449185f70c35322e34302e3231392e34311402aa69f8ef6666e7cad6d9323755a0ef3c1b6bd9fb4e1ffb05a3fb8f3000209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df540130a04038f4955841d76aae11e2c4b51c4efbf4bbc4c5af0a6132d9d8d5134ea141ed2e791cff5056981015b9eb03f96d790d33352e38322e3139372e31393714ed1131823bcea23ac78af8c01e4d24683d6ecf88fb4e1ffb05a3fb8f30002098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920962098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920960130a883d1e8398a8cf66ff2c695422b1caaaa7df58efc0637b38b48621c2e3357d25618b6e54335a311fba33c1a60fa8c540c34342e3233322e3139362e3614d6ece912cbf02627a4efc3dd37e6833cf3671551fb4e1ffb05a3fb8f3000209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c0130aab78e91fd352d70ed1c717c4d69726dc6cfeba4c6047040fb52cb0b6eb06aacba7c11e780f17e29da8886d5207d7d2d0c33342e3231342e34382e36381462e960a3f6b650feed98a266b3ccdf6e363562cffb4e1ffb05a3fb8f300020b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f20b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f013092d3231b5c4ca6ad3957123950f519f38d5a03a65161eadfddbe218afc12a9845ada84209325149769949c8870a25d4a0b35322e34332e31332e39321441b308f737ca9e39f67b553158903198a88c516efb4e1ffb05a3fb8f300020ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e25421620ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e254216013083f05b849c08d76c2b699210c780112ef7ee1d76ae57cb216afc4a0a97ebe696e723f4c0f885a5329c8efd2727ee9f9f0d35322e34322e3230322e3132381462e0104ce0aafc1f06bde37c73702fe84b307f05fb4e1ffb05a3fb8f300020bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb820bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb8013086283e5e604d24192e21ce9a909afbc49045776ee5145aeccdedd7b52e4a0ebb184ca3c9d837f2d4d6a1b0e91104fd2b0c33352e38322e34392e31393614dbbebbc52a5bae21b818e0487311041c91b2683bfb4e1ffb05a3fb8f300020c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba820c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba801308c9d01a4115483815958f4a125dfbf62d7ec434070e27d4aa68900709d9e6c178b1d4109fc9b6de2c7485cfc0e8597f30d35342e3231332e3230342e383514fdae7cdf38811659ce9481975b326a5d07236bc5fb4e1ffb05a3fb8f300020d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8920d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f890130a4ed1dc172bcaed49303cf1fc09c8b7307cd3a6ce73813c7ad4771f165e11c091a5f6b89f1faaca3596e70dd23a81cdd0d34342e3234302e39382e313032147034f0d3853c5351fb8e0ffd3c1daf12c51c2d89fb4e1ffb05a3fb8f30003094c59ea9aec7e4e60572a74af7ccb95127fb165f09adc32178ad80e4bc58f63161d9f02833a9980c23db78640cd67e8320000000d4b6e3c3b706bd8941885c8fb46dee63ffbe116888d8892b7f53a0a0da0020000000d4b6e3c3b706bd8941885c8fb46dee63ffbe116888d8892b7f53a0a0da00fc001108c8192005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea82005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea80130a05b8b13fdcc6917524714eb250387f6330775cb97dbc6724a73246a480c1504469a777d03478de1d3bb535baeef5c7f0d35322e32342e3132342e313632148feb00404d6f765856c95e587b2523a365bc7258fb4e1ffb05a3fb8f30002012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a22012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a20130a726d33bb1b575eef918031911618076c72b24b7c00e0f093feb2c2f14d1fd83d3ef4e4351d329afa693264644dd220c0e3231322e32342e3130332e31343914c1161c96de3dae28cd7f20ff8c2aa7b94b866d76fb4e1ffb05a3fb8f300020143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11320143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f1130130af03210533c4b3b2200dbc65961590904b19e8132fc759c0bd6ab38c88078ce9f1ded55e4c46e8f000f5744e5927fcd80d33352e3136342e32332e32343514b5f25f8f70cf8d05c2d2970bdf186c994431d84efb4e1ffb05a3fb8f30002020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c2020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c0130a7740f3302e48e88527030630d7c776cd4f0738a0413fa26b1acd1053e24eb42aad8c606f24b226fdae48a25db7b62d00c33352e38352e32312e3137391435d9eb76397d05b43b5cd8da7ccfa8408bc89ab3fb4e1ffb05a3fb8f3000202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb0130967b38cebd11a41fc82acb6739a375e5459c51804ed58be7e7eb384481dc6631ebb32ad78ed5c21624ea6af1202ef03a0d35342e3134392e33332e313637141ffbf1d32541dcb8f5555305295704a9ff9adc24fb4e1ffb05a3fb8f30002039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a2039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a01308b5e034afabfc19434e05306ed05e611efba5eb2b6e199114266d60f315a9d3aba5e913d20dd060478d58667cda4c6290e33352e3136332e3134342e32333014ec7bf3b9bc72eda38c80bb7cf16e294e763e56b4fb4e1ffb05a3fb8f30002040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d2040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d01309398faf325dbac5f84b53d53dc0118e187ef1cfab954a1f41e5474d893e779fad2cf9206df0f28ba31938a07543ae1c00c35322e31302e3232392e3131143e8b10646ee9d6c28d75c280b357dd3a9ae9f962fb4e1ffb05a3fb8f3000205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a23205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a230130abc8583618c7a847a00a0d2164a28ebdcead0d7a23df00553f9e0fdca2a8049f0504d9a4d472131e671de8fc1d4e99960d33352e3136352e35302e31323614f460a07a2b0dc932e1d8ff2dee2b984ac415dcebfb4e1ffb05a3fb8f3000205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef4360130a6d31c009e09302a3d19f5dd1c56ad3e8b9205a1a23c49e93721599d6623be423bf85f72aa3ada53bcbfe0d9da1a93fc0d34342e3233392e33392e31353314972a33056d57359de8acfa4fb8b29dc1c14f76b8fb4e1ffb05a3fb8f30002061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb2061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb0130a0ff36d3273675e24d02d0f3e4083f99388b3561333abbeea8a46ad84e06e536f595382ca44aefc370ca7d64ef88b5b90c35322e31322e3137362e3930147ada3e486409b39c94a0833c8d782f35bc24e96afb4e1ffb05a3fb8f300020754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e20754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e0130b56355b74fbe62ca05d14bdf3d1896465cd5b41e897da999c08ad39e7a4fafe32c46fee3536dce92db32347a0fcebc5e0c34342e3233332e34342e39351446d938862af6d9a291e26c0048177db2892a710bfb4e1ffb05a3fb8f30002085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8242085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8240130ae8ea031f0c46ea23fe6c45199e9e089283dd1003d6eeac30541b20b45989756052e943853f83e015e7060fdffae94c80d35342e3230312e33322e3133311468c506d43816d1a8389c860c1d162be44d1e777cfb4e1ffb05a3fb8f30002087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789182087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d678918013088c024a804b1cd694b087c8648789fbb3b4653784a1bbfab88db8afc2c8fb87cfdff5aed6eb6561d301e4cff2336c9060e33352e3136372e3134352e313439149b9cdbfe3568cc0b37f136b00a634c75653f05e3fb4e1ffb05a3fb8f30002088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f2088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f013093aae6cf15f02ce0939bad8f654d85a724c70b8bbffeccb336bcdf7cae780057ed4e579d25511d3dc8c79700f7902c8a0b35322e33332e32382e343714711fd9548ae19b2e91c7a9b4067000467ccdd2b5fb4e1ffb05a3fb8f3000208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f23401308596fa5844b472ff7e62d6a083c2c37dbced2d8279d617392f79329539a30606f24f072a6f89119f8580c031867c97750d35322e31332e3133322e313436145bdbf34a0dad860c6ec71523ae39373325225cc1fb4e1ffb05a3fb8f3000208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815013095e700df712726032efacc015206cc8905c6a262d2a09f39c0c4947186778dad1c7e7c0bbd994a828ebf7381297e5a090c35322e33342e3134342e353014a0a0e17bfe82a484fefe348b7569a6d77d29d2c2fb4e1ffb05a3fb8f3000208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc40130acc4a68d6a4a1a02f015c149e62943d6e2d03699bba71092bb324abdc68a78cd05d28f570ed6517edb456a38cbc20b860c35322e34332e38362e32333114337b7fb5d2c531825c3e0123ac3354018085b302fb4e1ffb05a3fb8f30002091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d2091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d0130a95f3700cbeb45904f7c09df31e142193aa9b277ec80da5458136a0b4c4c1bf26eb9b8f420b788779d2d92a5db71a4360c35322e34302e3231392e34311402aa69f8ef6666e7cad6d9323755a0ef3c1b6bd9fb4e1ffb05a3fb8f3000209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df540130944d564c8f03423d7923069004a0ff33a9febb61295158fb95ada04745f8070410e4f22041d6c5ab1227c8ca7ec5d2b00d33352e38322e3139372e31393714ed1131823bcea23ac78af8c01e4d24683d6ecf88fb4e1ffb05a3fb8f30002098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920962098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba09209601308b6c3bd1b6d10f712dcdc043287608210e64357e44076bae3f630063f27a00134479b06655305d4dfc14d783c610ef190c34342e3233322e3139362e3614d6ece912cbf02627a4efc3dd37e6833cf3671551fb4e1ffb05a3fb8f300020ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e25421620ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e2542160130a4545d995258e0c25eaa5395cdd85aba924c7653248c79e9b6d54c5c95457f9c383aec10e9c7135910efc896a552cb400d35322e34322e3230322e3132381462e0104ce0aafc1f06bde37c73702fe84b307f05fb4e1ffb05a3fb8f300020bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb820bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb80130a963c8918e33ab77885122c7e72dc5d5ed58747b6341d055c36af803af19b674eaacfa397368cfe31e50e0458663a7700c33352e38322e34392e31393614dbbebbc52a5bae21b818e0487311041c91b2683bfb4e1ffb05a3fb8f300020c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba820c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba80130b09a36c2cd9523f2036fe71755ce02b4722467eabbe2d9606ddcaf5c1c73f8dd21c1d697c9bece75d952f13adac2b9670d35342e3231332e3230342e383514fdae7cdf38811659ce9481975b326a5d07236bc5fb4e1ffb05a3fb8f300020d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8920d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f890130a0f49df8abdbc389ab1bbb99ca45a4268d7858301b259652dfc699795db7f35113f2d29f4c41cd0029faa88df14c549d0d34342e3234302e39382e313032147034f0d3853c5351fb8e0ffd3c1daf12c51c2d89fb4e1ffb05a3fb8f300020ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac920ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac90130864a2eb7c4019522c831b28bb8c84ec256556f06d90e71f05d12cebd6cc3e8a9360749637e9f7acd2c8bf08d438eaead0d35342e3138372e31342e3233321467e05b1b52c7c896adf20035036fe1d30dcefc9cfb4e1ffb05a3fb8f300030a89b8a9e053bcedea6d6c29e63526edf069639d25ec8ceb1f6f127e3259c71769f1e54d867ca5b8449c8d55c19248cd720000000ceb90097be7a897c47be4752340dab3c394e860cac4f03f7bce60caa860020000000ceb90097be7a897c47be4752340dab3c394e860cac4f03f7bce60caa8600fc001108b0192012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a22012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a2013088a4d69c5ae7263da2494237b4eb77db4cc5e59d3a3f1413a35c96684b858db2be1f22203712c93a51befaf591bd972c0e3231322e32342e3130332e31343914c1161c96de3dae28cd7f20ff8c2aa7b94b866d76fb4e1ffb05a3fb8f30002020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c2020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c0130aebaa7d29121c7845ae2aa701eea659f2d54c0151eabaf7f2069ffed57a846deb657e6376f5f5f6aed9c3060e2ffeb030c33352e38352e32312e3137391435d9eb76397d05b43b5cd8da7ccfa8408bc89ab3fb4e1ffb05a3fb8f3000202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb01308e081ac0afd47eb31e2e796c69a3cba48c4a7f5c63b71ff5ad946c6b193bd0c921fe3ae922eb0e8d5c6123907ca66ba60d35342e3134392e33332e313637141ffbf1d32541dcb8f5555305295704a9ff9adc24fb4e1ffb05a3fb8f3000205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a23205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a230130a1814ef35a03c54d6ea3170d794a4dd10bd6d49aea8fe03d1607a240c94083dceb3a69e1dad6ec2f3f49f818b9ee462a0d33352e3136352e35302e31323614f460a07a2b0dc932e1d8ff2dee2b984ac415dcebfb4e1ffb05a3fb8f3000205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef4360130a71ce89bb92a4730672b2c774de958dd4c85dc53461cb41105d7766aabe1b473722a483585603c3323e2bf7bfb3d47e90d34342e3233392e33392e31353314972a33056d57359de8acfa4fb8b29dc1c14f76b8fb4e1ffb05a3fb8f3000206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966013093bec6a7ba821198140ab7a1d0ea93a96d8a2b961f7a09b594ec768b0e99bbb74e8ef075efc43943f7f4d2c73d967ed00e34342e3232382e3234322e31383114c374f016ea61e76aab79b8bb95a1ba0e6e3eee6ffb4e1ffb05a3fb8f3000207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf7019207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf70190130b8de15f05a0fa8b4606fc7aa14fef15c5c9ac74b8b8de56761fd870c40d1fe9f0a1e0e75fd05ce23989acd3002aa54100d35342e3138392e3136342e333914f9956e70daffa263e8cf29fa6557b7b630a595a8fb4e1ffb05a3fb8f3000207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be429001308cc7fc20d72fbad37344f1f22fd028878f9eb1ce487464d8bb7e88511703289b03f636cbe329bc724d1fd7a5e0e228950d34342e3232372e3133372e3737140498ade3c80045c2a7520e921180ae1c39da5c57fb4e1ffb05a3fb8f30002085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8242085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8240130826005c487974a10dfc6c0e9b81d36d01f7868f28cd41bcbf1c70ea40085d054e1c466f7e3481fed2c051bcf3f2e8ffb0d35342e3230312e33322e3133311468c506d43816d1a8389c860c1d162be44d1e777cfb4e1ffb05a3fb8f30002087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789182087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789180130ab28bc9b23df49c4dab9d8ed5dce583172aa6115c64f4799b640337b8f789d1776e8dd2a54fef6cb688421f4f4405f540e33352e3136372e3134352e313439149b9cdbfe3568cc0b37f136b00a634c75653f05e3fb4e1ffb05a3fb8f30002088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f2088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f0130a69dd93e9acc2df9091efdbb6af018914c02610ecba8f9a87d0072bcb905e69f2f86ef5b0a9db53fe9e0468ea8b47bf10b35322e33332e32382e343714711fd9548ae19b2e91c7a9b4067000467ccdd2b5fb4e1ffb05a3fb8f3000208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f2340130a28b26c15833231fb3e4f819803c6c197c9ca4666d6bae08c684ec87d36f087d3f7311db12c1d316aa48807a38389af70d35322e31332e3133322e313436145bdbf34a0dad860c6ec71523ae39373325225cc1fb4e1ffb05a3fb8f3000208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc401309576536e85632411c5464c48458c59388447399d11717b8fb9bd08654efaf40d2c4263574eee84333c569a01186f3cbe0c35322e34332e38362e32333114337b7fb5d2c531825c3e0123ac3354018085b302fb4e1ffb05a3fb8f3000208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c001308b16d7e9c9d09f4c1c68a485a842c42df657993e39852ecf497a343e2e4091244d6c54426765ed3b35fa5428c56c42060c35322e38392e3135342e3438146d57707c196e06487d326094c964f258f5b77c35fb4e1ffb05a3fb8f3000208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f0130a723e5361a30fa8b8abe2ada16f6355bef4426fa666248b1e7acc1166b9c771327a26d8476219366264af23d3690c6850d35342e36382e3233352e32303114c075993a8336f93a13bb7bbb7e0e89928be4aafbfb4e1ffb05a3fb8f30002091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d2091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d0130a0c9d56c59553573bfd2820e100c32677a0f8acef152aec3a9ba26de65f5c00111e607f84f06054fd9715d53467923a60c35322e34302e3231392e34311402aa69f8ef6666e7cad6d9323755a0ef3c1b6bd9fb4e1ffb05a3fb8f3000209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df540130b7da304a882b4b043fb3c9f4b3f1a95b712348df94041029612a987e91eb902dcd12b287747776fec40ca8920df8fe5f0d33352e38322e3139372e31393714ed1131823bcea23ac78af8c01e4d24683d6ecf88fb4e1ffb05a3fb8f30002098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920962098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920960130ad516ec8101f2b352444645838f496ef4d3d692cc4f7058175c3dae158625f3a735d78da982faab68d89909392595ddd0c34342e3233322e3139362e3614d6ece912cbf02627a4efc3dd37e6833cf3671551fb4e1ffb05a3fb8f3000209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c0130adf3ec0568e65c42c340b3dbc03145486abb34af601372b30a992aa66ca5800247e4e3df8c14a74933e7dcbb25f271dd0c33342e3231342e34382e36381462e960a3f6b650feed98a266b3ccdf6e363562cffb4e1ffb05a3fb8f300020b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f20b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f0130982d001eb233cd0e83f9112eb853945033cee76decb4618ee280bf6125fd082c179639ad92154990877e9d63a55637400b35322e34332e31332e39321441b308f737ca9e39f67b553158903198a88c516efb4e1ffb05a3fb8f300020ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e25421620ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e254216013090980e5b0b2050070d1217dbd9694f7c58f00f67827613c3b045897c7fbbdd18e30a9068fb0dff2b73c76946f979ab1c0d35322e34322e3230322e3132381462e0104ce0aafc1f06bde37c73702fe84b307f05fb4e1ffb05a3fb8f300020bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb820bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb80130ad04595d1ecbded5cc553eca173eea397c402aab1fc08eb46e38013ebb7a4f859fe1f2b32d922bab2fd628d38b9f541f0c33352e38322e34392e31393614dbbebbc52a5bae21b818e0487311041c91b2683bfb4e1ffb05a3fb8f300020d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8920d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8901308478b47312f9b93e9d7fc2262c286b0ff0f14edc2fab154c5b6739f849d9257a5c767c06db8e9d27ffec3084ab645fcf0d34342e3234302e39382e313032147034f0d3853c5351fb8e0ffd3c1daf12c51c2d89fb4e1ffb05a3fb8f300020f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba786399038120f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba7863990381013082e166338742861b258ef7ba49636a4f1b0febeb9a19216c758465c4e6d0822ed3f7887e9f474ed474ffad65d86496ee0d35322e31332e3235302e31383214fe2d4798df3e9b41a6823bc0b3f020478e87925dfb4e1ffb05a3fb8f300020ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac920ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac90130a58ac81821f89a959b0e3feb0768e7301b918a348227704a7685deb45c29196e4f4a1c2715327a127d08fb5d33a731240d35342e3138372e31342e3233321467e05b1b52c7c896adf20035036fe1d30dcefc9cfb4e1ffb05a3fb8f300030b3601dc016ef030a4707e2afd8669eaf547aed29a43a3c3f0a1f5da0f50d3ccf3717876623efaaf4fd01d56d4f19c4af200000007672f63d6d54737b0dc862fe00a4c146100e922c39e2b8349a48088d5200200000007672f63d6d54737b0dc862fe00a4c146100e922c39e2b8349a48088d5200fc00110898192012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a22012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a20130b868374061b0f68d2c262e87dc45c2bf048a9f3a9f6e91f51cb1b7fe623deb3709b439cdaec9a48519201cfaceaa3bf40e3231322e32342e3130332e31343914c1161c96de3dae28cd7f20ff8c2aa7b94b866d76fb4e1ffb05a3fb8f300020143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11320143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f1130130b4915f6d8f4ddb2132ddeaa39ac3c7ee6a6e4e026d1a634c146c705a0a1e5303939da3957af20e322f32bdeeda3bf78c0d33352e3136342e32332e32343514b5f25f8f70cf8d05c2d2970bdf186c994431d84efb4e1ffb05a3fb8f30002020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c2020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c0130a962184d452a61d4adf3d719cda3a02eb6eaf1b7838144b2e0bd9fe8db237c14912369484d2eeed76159e9592604cf150c33352e38352e32312e3137391435d9eb76397d05b43b5cd8da7ccfa8408bc89ab3fb4e1ffb05a3fb8f3000202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb0130ad0d7d5ef86215650c75e1b9b6773db96a06835508dd97590f56f8b678313f8fe082112bb8ced61e0ae797981ede6f7a0d35342e3134392e33332e313637141ffbf1d32541dcb8f5555305295704a9ff9adc24fb4e1ffb05a3fb8f30002039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a2039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a0130adcefadcab21ba07c09f07eaedaf087adf5b674028af47d1251bdc3cfcf032b79ea71e530caccb20361b9a5c25a440460e33352e3136332e3134342e32333014ec7bf3b9bc72eda38c80bb7cf16e294e763e56b4fb4e1ffb05a3fb8f30002040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d2040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d01308abf30d7c88c6104d05ca58f08fb61c70c3d655576b559a27c2b1baff75802b6bc99fb206db5473ebabda0bdf79bad400c35322e31302e3232392e3131143e8b10646ee9d6c28d75c280b357dd3a9ae9f962fb4e1ffb05a3fb8f3000205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a23205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a230130ae3b8d52b37ae8382811cf52d9b29fddd46fd66c098dc03df1857a50effa2c85674e195d4ae0ac22d25df111b9289cd50d33352e3136352e35302e31323614f460a07a2b0dc932e1d8ff2dee2b984ac415dcebfb4e1ffb05a3fb8f3000205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef4360130916c39a7d78a348ce8c99f798ed84d7368601612dce992277e945ee3d34308a70e92b08635258ca6cac8539355779f0c0d34342e3233392e33392e31353314972a33056d57359de8acfa4fb8b29dc1c14f76b8fb4e1ffb05a3fb8f30002061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb2061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb0130ac518d843f4893fb55f7db299c2fba948107223385f82981dd8aa4e073731029efbb116b85ebd2912f69e8a20b898ec30c35322e31322e3137362e3930147ada3e486409b39c94a0833c8d782f35bc24e96afb4e1ffb05a3fb8f3000206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966013081730f2f8ca06b21e037e1413f4e07286daa61effdddffedb1e3d37be25be8f724a2c5cedd2267bc712e09ecc864b94f0e34342e3232382e3234322e31383114c374f016ea61e76aab79b8bb95a1ba0e6e3eee6ffb4e1ffb05a3fb8f3000207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf7019207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf70190130a666c20f678260e6cf732ca2d9c335aa7eee07e9a48f15fc52bc70a0e91bbbb601235905a7c2e94f7b73d4be85684fb50d35342e3138392e3136342e333914f9956e70daffa263e8cf29fa6557b7b630a595a8fb4e1ffb05a3fb8f3000207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290013094813102a7c65673c8421b5098bdb3527a6374488c6e4005077589ea6d88cb978149246858b01f5c043b0db861bfd7710d34342e3232372e3133372e3737140498ade3c80045c2a7520e921180ae1c39da5c57fb4e1ffb05a3fb8f30002087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789182087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d6789180130a4e5e437e79ca948abb1c47d227e0cf431223858e232efc678f2f44c01b8f03fc8bfc783de1c9aa25fa33ff26e34683b0e33352e3136372e3134352e313439149b9cdbfe3568cc0b37f136b00a634c75653f05e3fb4e1ffb05a3fb8f30002088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f2088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f0130b96bbcd66fe7998497d85b794b7ac3db4f6aa623cda276bd5794ef34e187556fda94f0a79e9f821ef4c75c27366cd7480b35322e33332e32382e343714711fd9548ae19b2e91c7a9b4067000467ccdd2b5fb4e1ffb05a3fb8f3000208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e081501308f492b943a251501373b176dfb18a0f7870823efe32b9cff53992283704048e8760a9000f26b94dd297621f8d8deba080c35322e33342e3134342e353014a0a0e17bfe82a484fefe348b7569a6d77d29d2c2fb4e1ffb05a3fb8f3000208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc4208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc40130b2079d4be290c58b34c9c14fbfd01bb9f1aaef01d002b319925a243335c52878ac883f9b7e0127271590188df43119f60c35322e34332e38362e32333114337b7fb5d2c531825c3e0123ac3354018085b302fb4e1ffb05a3fb8f3000208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f0130a92f9d9f46f6c9553c28adbe4855f42298c48953fdceec62c7382ec7ded8e0bbff64efe7df4db32c7829f41719d340690d35342e36382e3233352e32303114c075993a8336f93a13bb7bbb7e0e89928be4aafbfb4e1ffb05a3fb8f30002091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d2091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d0130aef0a3f51cd505157dcdf018bf77412f70236117262a69892b426c48ccb906614b68adbb916310fbfe770b29c0e109ad0c35322e34302e3231392e34311402aa69f8ef6666e7cad6d9323755a0ef3c1b6bd9fb4e1ffb05a3fb8f3000209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df540130813f9716f1fefada2d1a750779935e9571bded5f0a2a0a08b19edbf4d821538999d4acdd537755599eff93717fa071430d33352e38322e3139372e31393714ed1131823bcea23ac78af8c01e4d24683d6ecf88fb4e1ffb05a3fb8f3000209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c013095202e363e72de2c2f1824d118a6b19243808d4bf3090cd6ce1bcf0c92937f6b2665f05e497f0dd27586452f9e1507230c33342e3231342e34382e36381462e960a3f6b650feed98a266b3ccdf6e363562cffb4e1ffb05a3fb8f300020ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e25421620ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e2542160130b5ad25d83182aea77532834687bab1d6240b7b40a55ca27e60259c1e4f5077ffb26c3b1a0434d9eef529596d632c9b710d35322e34322e3230322e3132381462e0104ce0aafc1f06bde37c73702fe84b307f05fb4e1ffb05a3fb8f300020c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba820c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba80130b9a2cdce8e51b6a514e599ab5edda00e6d69fc0cc43c380915149abe7159f9c856e5ad391e7eb443ff8a5bfeed2659d10d35342e3231332e3230342e383514fdae7cdf38811659ce9481975b326a5d07236bc5fb4e1ffb05a3fb8f300020d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8920d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f890130a5d068fa707cd7a1dae2b4e30f384a516e4b86bd69ea0ae40204f35235fe866a3f54e1f7460ed9744485b7744b58c4850d34342e3234302e39382e313032147034f0d3853c5351fb8e0ffd3c1daf12c51c2d89fb4e1ffb05a3fb8f300020f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba786399038120f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba78639903810130b11e5897513333cacd8b5761d884b08699da6d8dac9e965a366599813ab7599ea6ac86f064060761559940e2e1fad3ad0d35322e31332e3235302e31383214fe2d4798df3e9b41a6823bc0b3f020478e87925dfb4e1ffb05a3fb8f300020ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac920ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac90130b006eca834e243cfa364f0b6a127aa221306b1d3f51d29b99e673d69a2e6fe60e27dbe859bcd85ac786430a8cbd6775b0d35342e3138372e31342e3233321467e05b1b52c7c896adf20035036fe1d30dcefc9cfb4e1ffb05a3fb8f300030a8aa56233bd002f4e294ab97dd212cbca4f79aea9cf6e80ff7a568ed5668569cfb5dac816a3f8561ef04251a28fd530c20000000251c6293f36145e149a75179d723b88d675332f8efd1667cf871d246710020000000251c6293f36145e149a75179d723b88d675332f8efd1667cf871d2467100fc00110880192005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea82005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea80130990f9bdf2dc93b6566cc92ebeff39bdcc062a37575b737848ef93f040e09d8fc7104116a48c83376d050ef245e90fdf50d35322e32342e3132342e313632148feb00404d6f765856c95e587b2523a365bc7258fb4e1ffb05a3fb8f300020143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11320143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f1130130a306779bbe3f86d7b731176aa1a86a6ee080adf527953a6844e02e668b67fab78e859690844d72aad89602d175150e3e0d33352e3136342e32332e32343514b5f25f8f70cf8d05c2d2970bdf186c994431d84efb4e1ffb05a3fb8f30002039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a2039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a01308db9d17923c5acb439a2ca05d6b8a9b8e4b68a0554b1a0325c926e92e13ea0a8c4c9a6f38bb16b9d7807532ef96064490e33352e3136332e3134342e32333014ec7bf3b9bc72eda38c80bb7cf16e294e763e56b4fb4e1ffb05a3fb8f30002040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d2040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d0130a660a964938e90ba91e8f1bcf46f5b61edf9e7bd1c974e7f58ece9f6806f9e6e6fa06301e75cdffd923089c78ecf5a610c35322e31302e3232392e3131143e8b10646ee9d6c28d75c280b357dd3a9ae9f962fb4e1ffb05a3fb8f3000205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a23205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a2301308e64b6456c41e771170854d8415bb95fd47c597373c00a55a4beeea43d6a22830e2e4c6dbe4dc03794e0c8786d9a040b0d33352e3136352e35302e31323614f460a07a2b0dc932e1d8ff2dee2b984ac415dcebfb4e1ffb05a3fb8f3000205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef436205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef43601308317d15d474b38602d5e3ec6d1c3da6284da53b47b5084534b65debf30c2018a048b3561c38429530a53f2ea5583de9a0d34342e3233392e33392e31353314972a33056d57359de8acfa4fb8b29dc1c14f76b8fb4e1ffb05a3fb8f30002061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb2061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb0130b09010ae7148d6459b2e3821ee2ea2e8c2077bd948a16ded93977f4865ba6d04a3e82ece2da5703d04e0d68fcec043610c35322e31322e3137362e3930147ada3e486409b39c94a0833c8d782f35bc24e96afb4e1ffb05a3fb8f3000206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e52863320966013088412ab841f7b0951d6f0d035a9e91472983c1f66801e14ded8f71f7e6ffbf4d37ad1097cf4b2df332b4bf30ff5f45430e34342e3232382e3234322e31383114c374f016ea61e76aab79b8bb95a1ba0e6e3eee6ffb4e1ffb05a3fb8f3000207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf7019207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf70190130aec0362b40aff3bd20153844977a6b5178c8f4a0b59d13c3331c1713a984d9d0fe4e33bd73892fc7b9db0276f04822dc0d35342e3138392e3136342e333914f9956e70daffa263e8cf29fa6557b7b630a595a8fb4e1ffb05a3fb8f300020754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e20754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e01309757740efe454850a7e553e29ec92082f41c8559c209738e4bf2622856ce8a25c982715ab6b6b51224ae7b98f822e4b80c34342e3233332e34342e39351446d938862af6d9a291e26c0048177db2892a710bfb4e1ffb05a3fb8f3000207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be4290207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be429001308c41f9e11ecb851812be5235cd0cee625e9bebb624583096ff39a673d20f589021c6f3870191bbdafc32ed5245738b520d34342e3232372e3133372e3737140498ade3c80045c2a7520e921180ae1c39da5c57fb4e1ffb05a3fb8f30002085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8242085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be8240130af5da56ee0a828c4ba881d28c2adc2ae288690fe37535a075ba54b72c6532c26095cc71d80f681d725e063d1f500e06d0d35342e3230312e33322e3133311468c506d43816d1a8389c860c1d162be44d1e777cfb4e1ffb05a3fb8f30002088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f2088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f0130a51dbf35096235fe2018a7f1ff00c3c18e541e6e5ae2a81c0952ed5a3c8800e1e6b5632ec1dad41af24c0d9bd8cdd2b00b35322e33332e32382e343714711fd9548ae19b2e91c7a9b4067000467ccdd2b5fb4e1ffb05a3fb8f3000208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f234208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f2340130b8f10efb4b60b6a2cc781c0f894151e0053e764175e261c75af516ec1cdab766de87b69453a73be3c234e6f4aefee6fe0d35322e31332e3133322e313436145bdbf34a0dad860c6ec71523ae39373325225cc1fb4e1ffb05a3fb8f3000208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e0815208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e08150130afa10520f621ca2cf4ee8ac229f9ffafdf0837f802eada2a823255235841f08544fcdb989fb4bff6348de6bb6cce8a0d0c35322e33342e3134342e353014a0a0e17bfe82a484fefe348b7569a6d77d29d2c2fb4e1ffb05a3fb8f3000208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c0208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c00130b1bf5c07ab8dbc65148edb38632459cc79b85290185b7bd6870f9352bde07980986a5427f783cbe3ec3946a5eeddc3300c35322e38392e3135342e3438146d57707c196e06487d326094c964f258f5b77c35fb4e1ffb05a3fb8f3000208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f0130a56d524c550f683ffa4aa0be33fdd59b3b02b6c46bcf4696283da657d2d7581cc4ee52a38671b310d7d7e526f7f4557c0d35342e36382e3233352e32303114c075993a8336f93a13bb7bbb7e0e89928be4aafbfb4e1ffb05a3fb8f30002091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d2091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d0130a818137a518d06c03a98e2bdf2fe4fbef96ebcda3042504d109feab8c28692fc8d521de2f3cf75e3a412e09f9dbf17a30c35322e34302e3231392e34311402aa69f8ef6666e7cad6d9323755a0ef3c1b6bd9fb4e1ffb05a3fb8f3000209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df54209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df540130a94edfaa78eadaa7cad31be5997fba9465def62ae4e6abd5b94483b67836e61b418ec9288e3e5d928cfbd70a739928530d33352e38322e3139372e31393714ed1131823bcea23ac78af8c01e4d24683d6ecf88fb4e1ffb05a3fb8f30002098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920962098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba0920960130b59b4cef03be4158392249c56d61e50a21785005ba8982c4afa93d271bc4d0b7c19415013cdea9403c23c4a814aa1b920c34342e3233322e3139362e3614d6ece912cbf02627a4efc3dd37e6833cf3671551fb4e1ffb05a3fb8f3000209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c0130885910160755543c1bbe191ccc79fc8eea5d6683a2186fa7666ad88caf4fb08c6c92b7baf1db457cdc11956e35b8a2050c33342e3231342e34382e36381462e960a3f6b650feed98a266b3ccdf6e363562cffb4e1ffb05a3fb8f300020ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e25421620ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e2542160130ae0682a10deb1a2c80076b617e220491c372ec9b62870789b419914c56f998ff30fc260ed11569e6ed864ef5774d95ee0d35322e34322e3230322e3132381462e0104ce0aafc1f06bde37c73702fe84b307f05fb4e1ffb05a3fb8f300020bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb820bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb80130a9eb13ce08f590b3346f9f6f36ec10a7860e3c1eae70c9df7663772224a60c7773f83ea2f080d0f74ae67ba223a9dec90c33352e38322e34392e31393614dbbebbc52a5bae21b818e0487311041c91b2683bfb4e1ffb05a3fb8f300020c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba820c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba8013095e62cf6ff14e6d8ef16761cde3384fc19533ea21e46001b57181b7af678eecaed015cdc58d10c4de4acfc937b5f18ac0d35342e3231332e3230342e383514fdae7cdf38811659ce9481975b326a5d07236bc5fb4e1ffb05a3fb8f300020ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac920ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac901309338650338a17c01b5b225d5618187861fdfb4ecee36d56c141ffc55a5b1f31120fd0148f8f50bb071734375ac888afb0d35342e3138372e31342e3233321467e05b1b52c7c896adf20035036fe1d30dcefc9cfb4e1ffb05a3fb8f3000308bbe3bb70f3f0e4204b96c4ab65ee2574d35ced1d63e67379d9dda4017504767ac94148797747faf41a1532578e2ad400000180018180000000b8cd4ead1ee12d25126921d918020cd77745d9cce5b59f7287a2a296e309860460119622e94b562c3dcec8445e63d04f8f88d4d0835358f79ced0342b43822e32a35c32ebdf76eca5d940a999480000000021160aae5b92562c94a5d6735c5dff3a92aa0a8d9b02aa0c614ca7154a30b450abf6838c0026c4a8526d7dcb44426b02f225d98ec9d43bbbf91a204b9c50252b2e3c9af4c237dc117d73fd60345100000000251c6293f36145e149a75179d723b88d675332f8efd1667cf871d246713086fb47b84caacf7734799c2106fa87d8dac68bcceefa3fd33dd568ecbd7bae3fe312835eff8d68b9bfefa852d12589cc0000000029787a10cbbd05260d3c7a8114746b568d0a5fbd2fdb9f080ac12c5acd30a53f79f722b98c47ce515144b41daa3a97cc7176c456b05fee6d5fd0216e123c07b1c0ae5eccb6d637d88e9d45bd544c000000004689a842c049d460ee314df1bbfa36530ff86632142fe3b6eee824003430a0fc274fc7b00cebe08b5a91f39ff7435b0d944ba82abb5a3df6a768051b674fcda0c9ed7478801f58abb1d081319e3c000000004d43bd84ac6be16b9b7e352b3e9905e1337d7d4d6dd0b8a0ff92a89f1c30844a36bc9a23cadfc278a9cd6df42b375ce2080c106c8ce01b3aefcac3f81ac3ba2abd5208165ff95039bed9d8ff94ab00000000503099f9f7fc49ca9350ce1951c09325670b8b459f3a55ebe6811f13e1308c43a90fc0e9a3b85297dfc221a1edd2b791c03bb2f5cda875a8844edfb73d8548bcc3be5ac5cf6548b9023fc551dffa0000000050b5530a426cc3a37ae64b7e37879c0905cd90391226fd7395a19cad2b30a99406603295d31f2f2bac6c2cf95a3b950b7abbdf74928010514d2ec53a5c4d3111fde6eb703f6e5599bddfb6ef2de30000000072da33f586cdd86a566cb30268f411dad855dc3fd18c5669410c7cdaea30935e67335f895fc17481cb14a4cf7976d449446bc45714c8c33888228d1a8833b372f0bf5e57d3da8d8b46a3df24ba18000000007672f63d6d54737b0dc862fe00a4c146100e922c39e2b8349a48088d523084fd520baf70c5d1f099f89c30e4824cf9307db2d50d04ad055a3cd4b1ca382e097615cb41a814d6c8af1df3f41ea40e00000000b6ebee5a8f801f7b66c32a3454b12513c76ab58b121a4e9c579bcd4e8c30a073fdd826b6f0528d57640ed2c442f427ae50365c8ee533aea561a43f0a847535d1de724b4cb33d8f1ebb1b7ec1fee800000000b91e2a2fe9ab4c3899dc7d2d85c9e00e068603afe59058d5415a84773d30acdda79998aa4a7c8db61e4de0c0033a6ad68b8e898017a0a1e478204a9fff434dc7d874a4346ff3f0cad0e6d6a7f0cc00000000c9c3825db4b9a1751e94ef41634a33e2df66e8f9ddcd56dd435232f48f3097fbe82232f01d505db016f9acedd89b3b64aeebe3ee42c618a70940c223b44702d47289706c066001f399911b13e5d900000000ca47540e3e2bbbfc91ad3581df6b5f730ea457841a3544e2ab3c54c24530b81e791bfd854cadc0ade4456d2eb225c921545d3c6511771be3e41f96b828e14fb560a4c8d86eab9935b6b3f7dfa0e000000000ceb90097be7a897c47be4752340dab3c394e860cac4f03f7bce60caa8630b594ee3dce15b395606f54f5269d69688c38b90958253f6f75897a312849d64f5f991600032a11b4f44162d429a08b9b00000000d4b6e3c3b706bd8941885c8fb46dee63ffbe116888d8892b7f53a0a0da3085a9c445b48a8fd3703c240ac3c838f65f78f6208698dc651d1a24ea3f09a72dc43389bea4e65f4576708b39f139b9f100000000e5d8948d2c695de557f1327a8f323fe00ea463ab53d415589456cae543309428bbc401fabb4f3e7c3a6a5bcc139a4ae581645729bd4dee7f272446357cb0c4064ffde38e5eed63720df03259ca7e00000000e7654d577ec30cf6779bb7f025807118c9ee33113ea249fa1ce949064630aee6aa85f79fefcde7fb71a8c880f6474fde2cbfd5cb6d1afe1cec9506fb25b1f8908e1934648898c79dc403f2094d6300000000e78672b7a792c03ffc5e06c6512e0ae64c4b5410a2e41b6b871036e5d330a89228f3c8f7b8cc5080b6721668c5f6ffa0c6b7c7fbd6182e968882e6676a436d47ea673c2ddc83aa6692c44972a6fa00000000f1187cb12e35cb2a20fa7ebaad86a10a07f37a26d91068fcbde0ee462d30a7bbbc25d144e31734003aa26cbb696ff91d5895c67110369dd24998e7da857bbe7a40a9086b96752c1e35e19a485594000000010832789d4cdff3cc8a63fad668ccac708af7433c42e189ada6c6e5e66e3083e592e3320143c10ef29d05f6094f428fbeec17671057917f2bc2f6d71f8151e3c22379c9414e41f568a0dad43a49a2000000013b5860da205d4132c60deedcd2f06f18c77718fc9f96a5473d05e596fa30b64e26f35b32ed7fcdbf760a3806137ee21208642ee072e3284df4a1f9197b2b2c1036a355d2fc670b37f6d06631195600000001561ac909f7762f03b801661c0ab46943d603d2883b36535ad5f6344cb830a9c57b1671efe72ccf52577b20fdee42c4f93c2098dcce5e0589b4eced2a1403c4834084b950f775a23745c73f85edfe00000001d6bd1fcac1f64325a6a26b0a3a02d1e3b61267d50f855984a873c3d689308c3f90fa3b27af67e8f0b3078169ea2cc61ef13b075fd8e0d2d6a7e83ccf0c59370020e5c753a0ad1a684efcfd68499a0001180000000b8cd4ead1ee12d25126921d918020cd77745d9cce5b59f7287a2a296e309860460119622e94b562c3dcec8445e63d04f8f88d4d0835358f79ced0342b43822e32a35c32ebdf76eca5d940a999480000000021160aae5b92562c94a5d6735c5dff3a92aa0a8d9b02aa0c614ca7154a30b450abf6838c0026c4a8526d7dcb44426b02f225d98ec9d43bbbf91a204b9c50252b2e3c9af4c237dc117d73fd60345100000000251c6293f36145e149a75179d723b88d675332f8efd1667cf871d246713086fb47b84caacf7734799c2106fa87d8dac68bcceefa3fd33dd568ecbd7bae3fe312835eff8d68b9bfefa852d12589cc0000000029787a10cbbd05260d3c7a8114746b568d0a5fbd2fdb9f080ac12c5acd30a53f79f722b98c47ce515144b41daa3a97cc7176c456b05fee6d5fd0216e123c07b1c0ae5eccb6d637d88e9d45bd544c000000004689a842c049d460ee314df1bbfa36530ff86632142fe3b6eee824003430a0fc274fc7b00cebe08b5a91f39ff7435b0d944ba82abb5a3df6a768051b674fcda0c9ed7478801f58abb1d081319e3c000000004d43bd84ac6be16b9b7e352b3e9905e1337d7d4d6dd0b8a0ff92a89f1c30844a36bc9a23cadfc278a9cd6df42b375ce2080c106c8ce01b3aefcac3f81ac3ba2abd5208165ff95039bed9d8ff94ab00000000503099f9f7fc49ca9350ce1951c09325670b8b459f3a55ebe6811f13e1308c43a90fc0e9a3b85297dfc221a1edd2b791c03bb2f5cda875a8844edfb73d8548bcc3be5ac5cf6548b9023fc551dffa0000000050b5530a426cc3a37ae64b7e37879c0905cd90391226fd7395a19cad2b30a99406603295d31f2f2bac6c2cf95a3b950b7abbdf74928010514d2ec53a5c4d3111fde6eb703f6e5599bddfb6ef2de30000000072da33f586cdd86a566cb30268f411dad855dc3fd18c5669410c7cdaea30935e67335f895fc17481cb14a4cf7976d449446bc45714c8c33888228d1a8833b372f0bf5e57d3da8d8b46a3df24ba18000000007672f63d6d54737b0dc862fe00a4c146100e922c39e2b8349a48088d523084fd520baf70c5d1f099f89c30e4824cf9307db2d50d04ad055a3cd4b1ca382e097615cb41a814d6c8af1df3f41ea40e00000000a9510131c07fb58ce1f572165af5af245f7be594245cdc40b7b4b95cc7308ab76c9e9a341d200635323b462be31199e93cd43bfeecdc1243d7c8d1ba41910edc07cf6f197d55da1f5c760dd661fc00000000b6ebee5a8f801f7b66c32a3454b12513c76ab58b121a4e9c579bcd4e8c30a073fdd826b6f0528d57640ed2c442f427ae50365c8ee533aea561a43f0a847535d1de724b4cb33d8f1ebb1b7ec1fee800000000b91e2a2fe9ab4c3899dc7d2d85c9e00e068603afe59058d5415a84773d30acdda79998aa4a7c8db61e4de0c0033a6ad68b8e898017a0a1e478204a9fff434dc7d874a4346ff3f0cad0e6d6a7f0cc00000000c9c3825db4b9a1751e94ef41634a33e2df66e8f9ddcd56dd435232f48f3097fbe82232f01d505db016f9acedd89b3b64aeebe3ee42c618a70940c223b44702d47289706c066001f399911b13e5d900000000ca47540e3e2bbbfc91ad3581df6b5f730ea457841a3544e2ab3c54c24530b81e791bfd854cadc0ade4456d2eb225c921545d3c6511771be3e41f96b828e14fb560a4c8d86eab9935b6b3f7dfa0e000000000ceb90097be7a897c47be4752340dab3c394e860cac4f03f7bce60caa8630b594ee3dce15b395606f54f5269d69688c38b90958253f6f75897a312849d64f5f991600032a11b4f44162d429a08b9b00000000d4b6e3c3b706bd8941885c8fb46dee63ffbe116888d8892b7f53a0a0da3085a9c445b48a8fd3703c240ac3c838f65f78f6208698dc651d1a24ea3f09a72dc43389bea4e65f4576708b39f139b9f100000000e5d8948d2c695de557f1327a8f323fe00ea463ab53d415589456cae543309428bbc401fabb4f3e7c3a6a5bcc139a4ae581645729bd4dee7f272446357cb0c4064ffde38e5eed63720df03259ca7e00000000e7654d577ec30cf6779bb7f025807118c9ee33113ea249fa1ce949064630aee6aa85f79fefcde7fb71a8c880f6474fde2cbfd5cb6d1afe1cec9506fb25b1f8908e1934648898c79dc403f2094d6300000000e78672b7a792c03ffc5e06c6512e0ae64c4b5410a2e41b6b871036e5d330a89228f3c8f7b8cc5080b6721668c5f6ffa0c6b7c7fbd6182e968882e6676a436d47ea673c2ddc83aa6692c44972a6fa000000010832789d4cdff3cc8a63fad668ccac708af7433c42e189ada6c6e5e66e3083e592e3320143c10ef29d05f6094f428fbeec17671057917f2bc2f6d71f8151e3c22379c9414e41f568a0dad43a49a2000000013b5860da205d4132c60deedcd2f06f18c77718fc9f96a5473d05e596fa30b64e26f35b32ed7fcdbf760a3806137ee21208642ee072e3284df4a1f9197b2b2c1036a355d2fc670b37f6d06631195600000001561ac909f7762f03b801661c0ab46943d603d2883b36535ad5f6344cb830a9c57b1671efe72ccf52577b20fdee42c4f93c2098dcce5e0589b4eced2a1403c4834084b950f775a23745c73f85edfe00000001d6bd1fcac1f64325a6a26b0a3a02d1e3b61267d50f855984a873c3d689308c3f90fa3b27af67e8f0b3078169ea2cc61ef13b075fd8e0d2d6a7e83ccf0c59370020e5c753a0ad1a684efcfd68499a00fc00110ab1fc00110ab301fc00110a9c00042001fb0120200000001c17557b0aa6d56b745b60fd4c3c53f2beba8fce58a6a01fc50fce1cd630919fdb493c7492c92651b5b48643001974e9c6c08dc38d201e914672732b7e237f81a9a883cdc12b446548823fc52769011600000024dd142c3b883d9653935780d82dfa760af504be48745a9ccfeb87f95e3080fb2822996190c9ebe6ef941f7b9c2cf140117614926c516865791a2713ea6a773751e9753b0ed63849763e435d027d0102000000372aeb94a3ad89154fc41c296b1bfbd2f744934dec354ac9f121a3c2f730ab6d16078b0190e779e516e9119abcc0623d14034dd8cac836d9114239251a0d10a77e498c92db7894d8359ebb8fc628011d00000037608455165b3d7f752e5576bb9e3fdb54af8c9f6aea8c5c39f607ebeb3091199e5de7deeb39bf99ff557a5267ee0fc5e4297089e1ce03afbe27d7a4ef75196c6e599e4b15314213368b00c3cee4010b00000037e2a2a37e026777d2ba67371b1dd0c7d49044c5a566f0469be085c16f30a184eebcce47f63dae0e2a55a74afbe53b671b6fb9954936fbd17bc890ca3f0e769983b188a22469c394c9bc1dba8a6b011f000000411dd2ec65ed0f979acff00da0df586357e715de8ca3b2d42cd39614573095598b486466ed807f4306968b15410d4a55cd1e38f7bc3a489b1056ba8eae9a6dd5e1ed9e59c772cbf5da7e8b8c293e01090000004be4965bcf4d4e63c8250f81c617a58a5a268dc8ea3c3f86de0b3a806d308734df8c4bb9757e5157ef809535296800a14c76a4c925dcc26f74efd78bb45974590efe53d6d12eea41c1cfaaf5dd90011e0000004c4be4ac378bff06fc33e9677589e9cd45fe403dfc27c7874f95d42a6b30ade14cd45e426734de61d95bb6ffbb1e64e7c3dd3e046d3fc0d39edc28e1f047c07e44ca7fda141356d35119dcea53210119000000504bcfbaaf0684b5f9e5b43925497de07e93444da15568fd67daa3e3ca30b885843723894347bc0bb59761178e34b5ed29b879e23ce3bf84d60de0fab9e4d2272106f7c83799a1350ed11859df1c01030000005634442336d250bc6f41a1beb3150bf00c4386e29c782c86f64e524af7308422c8690ea530d4c1c13d841bbe24ec66d82f1b962ce39241ad45c13a62ba4aec66bc80b9d3ba52642b9ec7d471fe06010f0000005a8b5ca058cba2953dc80aa4485f2acced3922c29d3388b167cf78b35730965fd8b4db515a89e27c43dc591d47e343edb967d52fb8f1423fbefaa91b97fadb131b99dbcc28235ff0879dbb6a42df010c00000066677ad0a47afd2836cfd9b29a60f2a5f5b76e27cfc5fadfbd9a56a0d33092517556cba9e44f944d656e0bd15062b41d172f9a3ecc7fee1d79909e3dd9929f5120dadb0d6650a92b0ddc4e4d1fd6010a00000097e09e2749e43066a7ec3e08da9786b4597ec68aa764a5b12fa994209430a03cc310e3d46343430851204829272c534ceb7b9bf0b774f8e00148932d1c6d7e9bf4e1616cb943aa44fd6010b147e1011300000099f4ba9b8f567066725e949ae6d15af33124f288930c05f29e5b9c63ed30a473df3015852e967e3365b140353ce5800e15abdf8c7736e2df5304a779b7e588b7d72423c9901004182809f64008990107000000a8d450eefbf6324878ad6e6203ca409d206772a0e83910352e76e5478e30b72a08760cb1af67a0881b13d87f4f746b7e782f9c4dd8f61f7e25ab359fae768a25cbab2004fe9a095e9e97d8fc6f3b0114000000a946faee14ef3fe5b06dde3132766c3edafcae89fdb534c2c2d0be155c30822fc04e42baae578281253c438dd9d8611f0bc325b9a9e39a2ec8b952c963401dedf25fa2cbc8ef26c7a5783c2372f80106000000bce166b1ab589a089dcf9ea84bbf00c42f3b2699aa067c53ac6a942ae63093025ddc9b3f01449f67864c0b9cc26db0e8526d0c08035ce8151aacdb204b0d0c33aa7b6462a5d09b3b00f1783183b5011c000000cac98a5ab2a2156e2648bc99a6eb514aba8d1a46167cdd21baa11488033090c1cbb77a5995d55907bab10d33eaa999219dd3751385d9259dec972208a6789b2ba31e2c254889895508fc077212bd0104000000e2113e90d0ec07975c2aec2c8afe986477d1eba19a7811d5d33b1d448630b9cc6d95122f1c1ccdc7b5d3171427fd2b3de05835649902ace1f73788e4939aee450e72209b9c6d28910eefecb7335e011b000000e3b9c3ac893562d87389c0255c7f95a51db2960302fb8d6c9d82972567308b82f0157d4eecdca9a865abccf6ead67a65478b29c4021e15b26210880552bc61cd7762c8203d6b7cac79f6ec11db930112000000e42610cff0fc6648d1cd6d4d54dc3ffcecb374e945db637b7fc7e1094f30acb1a3b40966809d190d78514794ec2062ac3a567cf878513f8c2793bd555ae2107a1be0e09e4c35029aeb5104d8e5be0117000000e7654d577ec30cf6779bb7f025807118c9ee33113ea249fa1ce949064630b51b3d77bad620570ddfc765e459c508e780168c1e76c2ba6b3312a21a0e9da0b54c7f26331d962c30097ac89f4590dc0118000000e8528886d471e749c483155d887f9c8a50625b0263103e18dd0771d8aa3086ece6336903315a8e34688eff6f5534bacd3ab8f6b3364738467a7b26079acca871dded3d3b402cf90f2f9f71375fa70115000000e90fdf133f8cc78262509b2dd44809d0cfce8c8d895145fb76aa72994730b20fdbe02732421192ed34d58bbcc7252869c16480638a4d4f95fa35b39ecfc914960b1f883a3503e43ae29913ba8a33011a000000f4fee40e6c8b309743319b89d273476ce3f480adf035ffe6d35680c03530a51f0d204efa8aac21d376a7fe892d270ac5ac1d8b6bb2f2633c358937ebc950a120acfa13d51358e2edf9d31099b5090108000001027d7fd3b22fb92e73d2148ce965d2e3684a7dd241215bd01be45764943091c2b79dcb3d7493c35b41838867fc468d5c691c8835f643acb2a75eb438d8fe64d44ecafe51373514f2b2bdb8c1e55e010e000001082689584968c870268b47d0d3d3c7ae0655fd1ab678ed72d359cf1a67308b44174aada80c6112c7d703a4e60a76a837432a45142f02eaab5f5b7ca558e5bef1c82f7554af04394201960fa7ec0c010100000133375fb619887caee8dfe8c764a3ccfb10a2896075d79b55e00833182f308f11d173cd8faa2a60f2160205ac5a327c62b5b0796eb5f479eeb08873039c52c619d5066f30625bf757f01ec4885b4c01110000013337cca3c54b9ee0d086cf98c4ad8fbf2912a8281d31b5bb675b9ce1e73089a581df737b98b4ee8329a7ca0c38684dd6c6bbdfdeaa415dd7f26251b0571f9a33f25d9e83e55661918ec38fc752ad010d00000135fec3b0a50d647054092ac6dbdf51f4b86bcfb108cbba6d6f3deec30030ae5fa9750ead0aecee2ed5ab68056870a6cc8ba46e9580080325a8c418eb1e747bc165e504beb9ddc5ed4ec168516ad30110000001d60371889ab189c71d65fab144450f460ca502c1fc0236947a11e69715308f00f47f5a43d0c0f1f3c34ed98e9570b2db010ea6586e49b72bf68060b926ffdbef76c2bc4fcd53116a26c02bbc3ed00105000001d6bd1fcac1f64325a6a26b0a3a02d1e3b61267d50f855984a873c3d68930a51f3fcd0dbcfb1a8283e2e476a24dd722da031ad8c800ae359757c57ec4f939cf1562f5337c6863140b862d7aed3eb80100012000000003b8ac2b8c34bb5c5e581b140305c9213f8e269d075f7c3ce35058657730938107a9ea8b35489dde14f2d2107fe95a9c6a6aebf73f4133a5e8a7896434fd44f8770d6ca3901938ba36bc244079d801100000000ebfb3fd8682d13b42d76227518da219365299bf25f60e060228c3c4f03088234afd114926aa4b1e7c279f29bd6b929b332025998236811a4afc1a64a8bf319580bcab4d21f0281c090583122352010b0000000efb7bdfeab3aa6b9a7aade1624bfe5139dc053648fde77414e5d0d26a3082a519cc0363d0b7525fc99c81ab531a06d4008d1371e9b9bfb0326a39a35250e71c6f546d48502e529a9904afe1f8de010900000015c1b422d89b76d662e8878f1e898e0e52bf1c7e4c8b5a5d84819e58bd309585750dd1e0e508b8cb449030845947a2cc2ba0fe61ab0d0d42cd4d3369789d9baa599618886ccf46d672ca96fa0177010a000000239040f5760172bf089991bdd423d77fe12ed94c6d6cce4e4ebaeea24030b1804746481f8b92b0f9031caabccc24ac90f83d050208a6d634a6e91612627c7ebd6862ee169b010e66c139c92192190116000000251c6293f36145e149a75179d723b88d675332f8efd1667cf871d24671309452257af9160aae311e167e55120f056c1ecaab2d83c920e5ad61904c7d308eb7309b207e91ab891a211ee4170b7d77010000000027d6c573e287f6815e8d549b7533b43d565f194fa4707c2c452c5efd71309992d9ae0daec52bd07358f00829c9e3146e1e43aa093670a89793feefee6668526097480e2840781f18e35565a106a601010000002864d8f7a309572aa28f644fe14b35996a6e4a277b7e2d4a61c869df6e308a37b3962e6a9bceb12c0456e65fbcdc8bbc1ce74a93f3be699c0608253a3674a8a4b6581576b57e288082732ceeba1501110000002f841c6f9980ac707036873109f38a5dea30d9b7b4440b5f39da05a69930a13ced5397b305ffb410d814d7a13d1f2d9e4cb246d2a9c1b67c6d00abd8fbd8ebc3a95255b3878366fce78f8446bf62011900000038975f7c98f3b1d4520cff75e2cd2fa8cdc1b2ae5ec173e8e3526fbf3e30a2f847e67c532dd711760aacb2ab1014655c197abb1969d2a35906fbcdc1df36f4653d0867a8ba0245f377a30d49c30f01120000003fc35bec19e30621f4df1807cdbdd46e7c2ee5fa7e3d16373604222b693099ef5fee5370fa30abb6aebddf9d70fcaccb586405ec9b0db02d068bdba05aff6d31a00cb7327a98df9b43543fb7b4990105000000568e1d35844bf5d087f1e09cfba371602447652743af5405fbd011418c30892f812b0354223bfd407a021e7ddada119fad9a78577ab35f7470b296b1447f813782c20cba5f7704f25c860601cd8d010300000058d4f48f9b03d5f56a1bfeac784020bec3fb8a158d5db64edbe3ec1d2330b261c3f2146141eb69446088de98875b7de7fd24b33bd411ea0bc2b1ae81057503afc3680af273dda36bc16e0c009cfa01130000005daaf8a7fdd8cf47fe818294ee93ffc2f3152bdb8d3cbf6defdbdc42ee30b9428acd63393effd14cafebe45395dd1fd1fa629760b9865dcb2e439d18c1624a3b0e4275ea86ef397078442866f9a501020000005f1c7c759087736e3790693baeed92291652f555159fca5df6ead3e3e430b66abbb198f79e638f60a65b2e8fa5d16b69fd86745aade4f1646d3ef6b9310a143cfc9f2d34f74185e01ad49b859a3101060000006c001fa7195e51d929c1007cb5529543fc5bd3e5e5f3d04fa580a118cb308c7271e6b940b60ee8779d1e17f9e4af1cbfe4002ec3f56485d1e126862d0bd67a30fedf00b79d1f7c33b2b9c6928f31011c0000007672f63d6d54737b0dc862fe00a4c146100e922c39e2b8349a48088d5230a14bcb0c1c0ba486a22e7f949c5d2001bb19574d61c7978e7652ee0b87579836cea127d01f2b30cf13a468cdcc9e56a30118000000923d006513e9f6f37a420a38601150bc26d58e5fc2fa90ef3de096ad6f30aabfe8dfc0aaf0f181eb03d5e6a8f3582fe0e87bcd0a6058c60ea4087a3f30bb71254212b5bce14217812204b58dc2500115000000a61f54580c3b3aedfadbdb39930754eb59740e06878c4b21e077b1779430a3133fb93de26128c7bc8558c07a701dfd34a8e7fd27c314e8200b84b90a3b8a51b90f028fa19c9b968494f1dc2a7897010d000000a7e630c41fc945da3e67a106656547bd01bb26a94664cfd9fa939f5b213089c5b215e5fec1fe83d2981940189f99f0bc5b4ba486061b76ac78d3eadd91fd75b4fff44af75302c889c6f05d3ecb080114000000a8995453aa34952a7b6a36d6668b30a5a60c552463546daf9fbac737b330afa30a9e33607a758b18ea83bf64da1564f374e6c92860bfaaaf9951489bacd7dc1e939cf8ec833a58b5f5d9e606c98a011a000000a900df280c8aae91f937784f000311185df27d367735d38819e417f27230848e2ce2f08bd3b353728ccad3b745f1ce0ad43a9bf09fa84197777b874d8cbfdb6d5281e478835e656b1c25aa294306011f000000a98c40586e7e085eb8d9c5cff72b242266ed2c422950e03b3b6324c15f3095a2759d436fbd36219acc6ad722cb88cda15acb23452bfc80adff6d81501ac7c2d6699fd7f19c60baf141a545fdf65e010f000000ab19860011844cbc2b934da040a0905e91cd35c37704ff8ceee8d0823530a87362c64e1d3e7a56a82005512bfa53ead93ec50cbd20b316708a2e826524138a4d31cc3c156027608079226de7246a010e000000b88bba6c313f883b01ce114e6ec70d6c4e41846d16eb44e06e49d543a23094b6e8291c5a475ed15351e29b983b396ed28e67e6c6e3d9bbd0c82b99aabd1bbd4522d664ab75172bf1b1dfe2d784bd0108000000e8a99b7e41ab9e02d32c6753100a2dea5017a9779637ca7130a977a95730ac1f0e94b8813aa30abad4706d95bece76775b64d7969a4dc2f2e5c483768b2e8e3ca4eadca1bae00413c8a285612ab2010c000000eaf3661e56b8cec97c193a3ad4e3d5f8cb37d705a1c174c978b416d7de308117dd50ff24ec61c520e41613735160802fa2152243a6a4d5a639a236b68ab731b7b9bea06a030ae060a865135ee66e011e000001027c75a5e4f11e783325731c111a76d945df2f5614291c703b67dcfa2c30917b41386bf28e1a947006a1ecafcf6e6fcb0f59214095d78c070e75feeaf63b9f12b71aa2daf423f4bb5cd47b1c1ee4010400000104ff1afc8929aa90902f74f8b84959f56f53bf85e8274d590d3793118c3082b15f8072faec35371f7b62f5ef89a67de7504aff13f1a6b3928da68f276ee2b38a7e1a0697dfc2eb8e418b8ac3d7c6011b00000105ab5699c9f8fe76ddf1926a37c5f6b3e51be4eeb193a8eb2d4c28504e30a1ce4ac97fdfffd7eaa24438995b6c9e47309c2170aff3521fa1bd3da88eaf651d4f6a66918ec46cf9789562160c251c01070000010a27199898d02e56af922c456e32c4a919c21c33816cbedeba92630dc630a2a6d644970fd77c8ac18fcd70530c956686f7e97ac99eb155232df3b65467fac075bf22d480eb18cb723dc43d056cd5011d00000139d670e3c5a70b07b89fa3ee670b7ba3211c8c61ba8b1cb07d0039861e3081038507c58da0174ca63f45e8fa7eeb1c1529883ba24046ca56948de5172fd0e86f3b50d3ee4795a1684aa95b305be60117fc001109c7fc001109ca01fc001108aafb020c00850daffb0c2c6d85e766cd1540ab6384ef345187201df1fce9f6392abb152f00002000850daffb0c2c6d85e766cd1540ab6384ef345187201df1fce9f6392abb152f2030fcd315cee833f41272d6285560c7e738c6c0b267061d1d8e3ee7387221a09101ab35421915e3ea320ee07071957cf4cd0ecd8a0100000000005fb3bd75fb752ffc000977ff0001fc0009785300d36a190c0296d43164e19fa84c5e07b099800160b278c771d9cadb83d08cbd822125e04bf704f547b14cd2568f910b8f00de48144592d8ec9dbc809130027b568db397773d473e1e7c5a06af5254ea184be9e0e648f96969c662fb10eb6d559fcfc9ddc7ab8649e360d7db6e59000000000139ef5468acdc98c786a23397a0abc167110f46bf7a33cba29de48f7597cded0000200139ef5468acdc98c786a23397a0abc167110f46bf7a33cba29de48f7597cded20edcd97758fe49da2cb337abf460f1167c1aba09733a286c798dcac6854ef39010014315246edc109d76d15bcc5e24da55d453931860000000000ae22e971fb4e1ffc000cf03e01fc000cf13601fc000cf6cb00fad60b7fee893ef0b8a4602a2250ffdedaad6dd3ce7f101b7f075273c892063b1b8571311737a5767f95c0f808aff27883260bfaf9cfe2b84519a6b2300d4b5e1f48d7a77746676f09e2b995389d0f1c18601a6f909a4b542fccce87d9f5f30695d078a9181e142602d2e93f8f0000000001bbb58bd974fb622e39f7cf717d8942e210a84534ef9561087339e79181299200002001bbb58bd974fb622e39f7cf717d8942e210a84534ef9561087339e79181299220a3262f49c21c338fda802a6ac34fe12156d45e83bfc153b96d1631eb8b7c8ba300d5ce05217d6eb331ee3567e65e0229b5ea0d20510000000000235acda9fb4e1ffc000bb3b40001fc000bc76b0026a40a8e5da5d14302d09c58ac9ace45b54b1c5a26a40a8e5da5d14302d09c58ac9ace45b54b1c5a1ec5c66e9789c655ae068d35088b4073345fe0b030048a9403592bfa7ff82749de976c5e67a36c9d6b00a6665ae7281ec87572cd4643f15e78daa4cc251d5f2dd4611e37da0000000001f023a48ba1d046f980800d8c39b239e21d04855876700421f36e716a91f9fa00002001f023a48ba1d046f980800d8c39b239e21d04855876700421f36e716a91f9fa2026da1ea7d012875ece7ceb8e7b0f0beeb31c79a0ce9d97a2da25a2a6a7c5277b0008d98f95a7cf2eb4acf392bd81733e94c3f61dea000000000036bcc146fb4e1ffc0006567a0001fc000bd99b00b8fc46281e0f858dca3ba911af267d0ba2145249b8fc46281e0f858dca3ba911af267d0ba21452491ec5c66e9789c655ae068d35088b4073345fe0b0308f2ad27c0cb7b64b6e1aa5205f78e466b70ef61c6d529202c7b7d8ca9450d08d46234fc8aed1bb6594525d300ee931cd00000000021d46a532f0610618aa12d1dca47921623ec9db0b6397b90abe63967551bb3e000020021d46a532f0610618aa12d1dca47921623ec9db0b6397b90abe63967551bb3e20d83d93971aabeb80314062415c801838c3476d30e88a185a8fc621f45cd3c780009fb125d219bc182a771e7f3b7a910fd2c0cb5c0f000000000047c6dc84fb4e1ffc000722600001fc000722ab0057124732477195239cee3a968c4923f5f8adb96157124732477195239cee3a968c4923f5f8adb961c2610f8892172b3d1cb171d0c9bae78576b38379301135af6f4c73cd6f45513a9bdbf919fc9dcf76b18c0a3256b4aee0ed48360fa88637cd113502e4f6027232c2ed5de3b8000000000264e34848ae0fffb92a5f0fb446468fcd4c18014f66212529f2a3c585709b1a0000200264e34848ae0fffb92a5f0fb446468fcd4c18014f66212529f2a3c585709b1a206cac8d4777288a5504b95c30030aab85079cbbb9dbc106b0817459c66ee4f745015b5de31b03ba63480ddd09689f9eb5a33bdb78d4000000000012eca4cbfb4e1ffc000bb3b40001fc000bd233009260f93ba7145509852239781f4f83e02fe7d3ba9260f93ba7145509852239781f4f83e02fe7d3ba1ec5c66e9789c655ae068d35088b4073345fe0b0309532b2b80bbf0241d4e35a803eee7a70a1f6c016be57daa0602d180b7969409e8518d860ae8b9c403a36dfc821fbc12d00000000037db07b953e2196d659075376e7ba9d85baebed5c49577a898c0ace2515c1ca000020037db07b953e2196d659075376e7ba9d85baebed5c49577a898c0ace2515c1ca20661dc5aa428875848e4d049e053010747c592204575036a2505345b34dd3e0bb006cae25f986f4a1e14498c3f5a8517606a0b2b8da000000000080c763bffb4e1ffb5f7e0001fc00011b13008fa9e72582f9dc7882e0e40c932d98d3026765918fa9e72582f9dc7882e0e40c932d98d3026765916cae25f986f4a1e14498c3f5a8517606a0b2b8da308f3afb0dbbfec8610efdb4089f1b163e7f55325f6c0503470e8d49ecf439c848ff9448749e0a383980824994aa5dc50d000000000428147f6fe14b66e31c953141e884b5f7075adeea7bb8d1ec85297e594dd8b10000200428147f6fe14b66e31c953141e884b5f7075adeea7bb8d1ec85297e594dd8b120d2fa36682b5c4f47ac2f5b75ad137997110f677329e8b66cfccd06df324ad897010e421caec046e5b6106f222d32d987b094441a6c000000000040b0c6a1fb4e1ffc0010ddf70001fc0010de2b0022e16c08c8f80616d040b0dc6cc6ec9bc04b467aa2c6189093918db0942b8ad5c215989cef4d367cf440eb4f521312677cf98771dc52789eb9039fc3308510cbaaeb8d82f2cf1fe1c6e6d3e7fe3d9e6ef58a5cf1c135a0d39194c457fbc8921dbcda07fce72e6aef5b54f9b06000000000044b879c7014a715eb1bd98c79e6137f45011a0cfe3d21b24edee3c1650eabd9000020044b879c7014a715eb1bd98c79e6137f45011a0cfe3d21b24edee3c1650eabd920a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e182c84bc3be703bce7915fd9e65780589f11d9e708000000000023a59c9ffb4e1ffc000ccadd000000cc93037f5cdf14ebd273fc3d4999b9cdf81865d9cc93037f5cdf14ebd273fc3d4999b9cdf81865d964f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730002a2e19ac4b986e20f55ddb19cdfa69cbd5f76c5e2d66ac6d9c8418aa1f0836e61b643bf48eeb004ccf3f3f0f03b82a00000000045678f95d95679868cc84d96299a0b58e123e9c94088e10ae9fb54ec93bf20a000020045678f95d95679868cc84d96299a0b58e123e9c94088e10ae9fb54ec93bf20a200af23bc94eb59fae108e08949c3e128eb5a09962d984cc689867955df978560401457e250622793189bce9372839a4be7c32717f42412000000045454445fb07cffc0010644801fc0010645001fc001064630013cfc3d991d28803909680da446febc9d5b51c74542a58cb756c3edab85a715297c77ff4e02c9bcf42b5c40299408be68d22cca757ef58cf74f77c9f3085a8e547858c3772041317eac7dcd53f61fca75a5595870b44081a6bb83e78d28c397222c3c2b3015e651e163f62880b000000000569ce8b1a5fddf85850b5415b0435c46e198a8f146b1344bd618c8fc6e9e5410000200569ce8b1a5fddf85850b5415b0435c46e198a8f146b1344bd618c8fc6e9e54120027869aab3935227b4fb89499f881af9bc48c20157d1d897866e21eb4b1c3a210168688f2bafcec3f41d3c087722fc60e45a7dc96700000000010000000000000000000000000000000000fc0001653b01fc0001653c01fc00022f9b007dbc4d6ed0c5a83f528d03638e7fd3ff633a8e4d5a3086c1c6e57c19d3613870421059d308d5b16fd7c588a531c364e9462b46397e5dca10aa10dd9d300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea800012005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea820593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c093de7795dfedb896cb65547535ed92f27489d8df3000000000034187ca2fb4e1ffc000cf99e000000ec83a5f23ec17737f590153eb7eed16f7b2f1327ec83a5f23ec17737f590153eb7eed16f7b2f1327c69a0bda7daaae481be8def95e5f347a1d00a4b43080f8efb42f65ed9650078785be5d13e6e90eb9df87a99261d4de34df2b4b79a9c9b8c5e1aec7ac068ebef14636ceac4c00018feb00404d6f765856c95e587b2523a365bc725801fb8f3001fb05a30631c61e2ebf3d2f3b5022022b304492e935dfa25f9f52d13a45b448a61dea4d0000200631c61e2ebf3d2f3b5022022b304492e935dfa25f9f52d13a45b448a61dea4d2057468a144f4909b986f268cb90e353e7ab55b2c5ae55718362760a3afcb2f7e4002c89477d74bbf943461baf67ad023440a6c585ba000000000074cbc507fb4e1ffc0002d62e0001fc0002d7d400383f1034f0693df2fc8b166d242b00917b7fec07383f1034f0693df2fc8b166d242b00917b7fec072c89477d74bbf943461baf67ad023440a6c585ba30186053ffd90c84db8fb369e1178492b3a0a3941d33c43cd84b839d92668203b6501c786486083eff2b229cec3e0a190d00000000063b57f59d1ff9847f08a7f06d14a5dde1686cb43b6269e2500b2445f83aea7d000020063b57f59d1ff9847f08a7f06d14a5dde1686cb43b6269e2500b2445f83aea7d20112c24c30b2452394fb6ab5c0f9102813f19bc4e47066079329c150b567bfcd3019e735807e679a83188b4ec1b3b65192c62d4bf0000000000002d4dde3cfb4e1ffc000615a50001fc000615fb00766423d2a57121314b7b8dbea06fb83e5bb32d57555ac4d7829d25f1fb6c3abb84a180f5cf746f3e9e735807e679a83188b4ec1b3b65192c62d4bf00300c1c54b5377e920076f2fec26824a5d15ff6144dc106185a614e60fd9722d7577609ae202168a02a50ec45e01f5b7e6b0000000006a45723cb72c6dac0d839223ffb9a9ebba95d257a92537dcb7baada7fa744b300002006a45723cb72c6dac0d839223ffb9a9ebba95d257a92537dcb7baada7fa744b320a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e40841087a740cb6221d73791c04f925366d62815ad0000000000235ac1a9fb4e1ffc000ccadd000000eee87111a02be65095125160059b010ac7ca3d30eee87111a02be65095125160059b010ac7ca3d3064f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7300e9855b2ee991f988e446b60dcd637f33a782baf1e755785ca058f0398133bf3a95e4e77d4168c13c47d7e3fb1e3ecfc0000000006ae5ed69b8a8eee0cd37f7b642989834cd1e139d1aa9de23db9a627c2fb95ad00002006ae5ed69b8a8eee0cd37f7b642989834cd1e139d1aa9de23db9a627c2fb95ad20ef3191fca4f21577e7acf2af43a36ad7f2fc0112c86ecc24e9985136201cf8b100a84773e6457d1e33d424b397108e9f462aed85cf000000000034287e22fb4e1ffc000bb3b40001fc000bc76b003db48f21a053984465132097e8e9e8b049a3d0133db48f21a053984465132097e8e9e8b049a3d0131ec5c66e9789c655ae068d35088b4073345fe0b03019bfb0fe221451734fa025e4c778fce35e56f89a1595df9cb6c0f94b76deafc6ec438c83834c9e9cf3363ee48d749c23000000000742f64ec887a0ca73a4bfbce78eb34845cee638ab574921ca260f8e218f34d10000200742f64ec887a0ca73a4bfbce78eb34845cee638ab574921ca260f8e218f34d1209602ae8d8c7e8d90259c444837e3f7bb39a5e6b4f1b2cc2b963fd42cd6b23d6f018125767a2e37003a592c97e8c4522269989e236900000000004d173304fb4e1ffc000ca6e001fc000cb48f01fc000cb5a30071a28ebfc5b60e77b6e5b853f8e0e47dfd21bb719fadaadbe9448ec9a703912e80e3b90f36519de2b802ee81026bdd6abe5b6296b993c8b4c02cbd153012271e7f58e6f7d3e2b7bf724729808642a16369b4ad22de438ed38df62b415a92bdcbe7923a858532eeedb44bf12c120000000007d22e8dadd5aa686a7b3bf833eb9bdddf4aad71a79992cbb99bf52f1e42609c00002007d22e8dadd5aa686a7b3bf833eb9bdddf4aad71a79992cbb99bf52f1e42609c204dea6406996a98efea88a66bddbe7f9568093185b08c865b1b664ae0e594c7be09eaeb400fc58666b81179de7c181cea9c63ba55f400000000010000000000000000000000000000000000fc000cf6350001fc000cf8890086a16b7ebc0c836151f6fcd1d21594cd050180bc86a16b7ebc0c836151f6fcd1d21594cd050180bcc69a0bda7daaae481be8def95e5f347a1d00a4b430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000867e1018f1de184690af3586fc3b4e17cf61614cd926532cc13f9ecf12445230000200867e1018f1de184690af3586fc3b4e17cf61614cd926532cc13f9ecf124452320ba2a81e3cc15c2f44ba26ed842c034219c7070a07e03ad29f6177bf1afa0f3bb0171cc985fc2a69592a7be596af81beded7b914ad00000000000a516d595fb4e1ffc00025b4601fc000266ac01fc00040524006de6137f220482eab495340caf21f19261b1e8416de6137f220482eab495340caf21f19261b1e84186cf2c5c943a6d1d8364fc87e8d859f86de1524030881cec3eab18eaeb916d3f234fae24363b68faa705f51a6efb06f83adef70f73fe28ee70bf4c8300ec4f77f017dbf7f00000000009214af325b2129b52873d9e42fc94ac127aa14da17b1e579d0bee746739136c00002009214af325b2129b52873d9e42fc94ac127aa14da17b1e579d0bee746739136c20aeb90c01cdc9753256874b7e3c8dcd88388b4f5a180608b6a84fb4b5304ea69f0091e45b373304666fd45136542848ca9264f1be72000000000036d4e686fb4e1ffc000bb3b40001fc000bce5b0075400fca445584e71127ad1393fd82a37a82b60a75400fca445584e71127ad1393fd82a37a82b60a1ec5c66e9789c655ae068d35088b4073345fe0b0308d42f142045c5ab515ccc12f2ebbb43f84c822cdd8f98eb5e707d3b334c45018e40b1e2701fcd42ee1189bba2d1d8894000000000ae71d42a6b2956f22a11d20e12dbe309a20fec575aa6023b983fe1b8976ac530000200ae71d42a6b2956f22a11d20e12dbe309a20fec575aa6023b983fe1b8976ac5320eb475a0049470e4629de778010cfc0b305e70d7c5ff6e6731398e26b8fa9ff98018caf465181f5759bf9aa46aa56d8acc5666e460100000000000d3be7c5fb2715fc0003a9520001fc0003a9d300b0bd96751e06b5f3f3bb00dbbeab1576fc941f5fb0bd96751e06b5f3f3bb00dbbeab1576fc941f5f0af0fa3c6b4cfb31f4667e98c4441ec4a72c635e301438959163472114ebd0f4e72e984527894a871063cefbc8cc492593a7afbf4214538c0618ff8477590f40a3b2155aee000000000b4b33aadb8095af383a8c9c5e63750b8ef4abb5d9c091360d788cf18267fe9e0000200b4b33aadb8095af383a8c9c5e63750b8ef4abb5d9c091360d788cf18267fe9e2032048e6d7e2751d4029bfddd77d06ea72c07fffb2d2a67b73ac1cc499fd10cf9010363c23a16386411774051c4dcfd52af186bfe1e000000000091efeb11fb4e1ffc000153460001fc000241bb009e1a38143b4dffb85126ea5a1d78f957327ddde69e1a38143b4dffb85126ea5a1d78f957327ddde62588a17ab3f917f19afeb8c32fa7c486ab4105a33011d05fff5f406fd207bc8984188894b6bbd32098e58244136519a51c183c70db3d713a33c9a55f8d6993f644fb34ff2d000000000b53cea62f79dbd8b43ef803b9eb1d47a1dec3611f460dba83ba9dc32483f9c60000200b53cea62f79dbd8b43ef803b9eb1d47a1dec3611f460dba83ba9dc32483f9c620eb2272deb86efc72e1f06244693d51f169c565fd32bf3d84125ce3f6b5df327000a1d87fa55ec32af91687a166746b992beff2c41000000000005fb3fbb6fb4e1ffc0004c8340001fc00052d9300eaa8b45af937c2eefe766f3bc3ab753329aa4438eaa8b45af937c2eefe766f3bc3ab753329aa4438382477245731a85b4a1b2ca6af9e904517d07e973090403255a5c2aef92a899cf01080a78446f07e0a25fe391a81791c37eddba6e82aee9b8b86b7aa4f44129637146221c9000000000bb4178501da3646c2ac908c25dc6d890bcee788bde6b8391ccde7c6486075900000200bb4178501da3646c2ac908c25dc6d890bcee788bde6b8391ccde7c648607590204e98d6d8591e28eff43f5b3d7b8577a632df86aa7b9705eede76fdde90544c5c0141307e80a8d668b0bf3cc98a52f8d85ec8cf5ae2000000000074ca448efb4e1ffc0001fe8b0001fc0002ab7b00408fea2918afc5688ce5093b789cf08823a57ae1408fea2918afc5688ce5093b789cf08823a57ae1c0a84112810ea249524c9060518b76dbee8b86cd308ef072018a444bc1f30885a199087d2e2200ea31acc4659eb0c05cca30f83e4bd940ed27873458fb605c92556883933b000000000c807e5e4c96d56008c2e3de266027c7232d070710868e6751c2ff907a4dba970000200c807e5e4c96d56008c2e3de266027c7232d070710868e6751c2ff907a4dba972087b9b1f14a8ab17354e7504b46b9b654a7e21975f37d4bd3cdad9b6f58a1beb9010c45984a63e92bc430d99a4ecfd2e715b56b8e6a00000000006b9679d9fb4e1ffc0001939c0001fc000194ab00d3f9cdef09c63434024f1da8554f5d0ea8f2c0200df5db4ce6161b24565f0e90a154cb4e38751eebaf5f151f150e533b675c159dda83d2cd6b22c89030088f0bea4590c29e0a8657faea9d5f2e0f79cbe8f1cae3cf9111e84ecace1443ed8dfe136c539019684d9511d1bba807000000000c90176ebed8489ad010c0429751dd46ec7463589ae9023795cc49f98274f8520000200c90176ebed8489ad010c0429751dd46ec7463589ae9023795cc49f98274f852200237cc9e407352476436f36492b64e09d13d7d6acd6725965f5b368fdd55d13c01308e3fe247704d2b44831bfe98d6421c6880e5d241a0000000cebd93f0fb4e1ffc0007675301fc00076a8001fc000af0bb009ce9b000c1432c3b5ad66db07c99e97cec08e568e1668a2c23b7a257d3e1acfe926e7fb5d64b24ea022d6bcddcd53b3ce77c5afe910cad2e92c3cce4300128cccd87ee9fa75531c9d8db129ecdec0931b57d3d521d35df8af82f6972bbca75f3861faecd3b701bf4aa678b18e5017fcbdbc8ad21929157bc68c6ce50170f41bbcc5d0000000cb486a3f478e2baccb3bc755f87b241e9ffe05dd693ba92e4777dd2175b5a160000200cb486a3f478e2baccb3bc755f87b241e9ffe05dd693ba92e4777dd2175b5a1620165a5b17d27d77e492ba93d65de0ffe941b2875f75bcb3ccbae278f4a386b40c00da952b3b45775c0af85fbe2e2ab21549d86beb0a41000000010000000000000000000000000000000000fc000541050001fc0005410700864b42ecaf278c146420dd46bb2c4914328b38827200be0fcbcb2c10e968ea0b5508bc3424c9c68bda952b3b45775c0af85fbe2e2ab21549d86beb0a30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cee39f44c73a6e829fe53ee34a37ee4358ae31c2bbbae2877949ae8729276020000200cee39f44c73a6e829fe53ee34a37ee4358ae31c2bbbae2877949ae87292760220a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e1a2dd7c9995b2e03f9795f30ba18c95833f6ec3eba000000000036bd7debfb4e1ffc000ccadd000000b73068d00c048915c175450c366478f783bc455bb73068d00c048915c175450c366478f783bc455b64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730880f24b5e040dcbf86c3f468dd28bf45d9e41fbcd127fad56669d9afe358dcdc26e42f0f8b19997b1741dbb99c553aa6000000000d20e20e6a7ed1999b25f2dee0a53893a462e92170bc13a8b321f25c87d997280000200d20e20e6a7ed1999b25f2dee0a53893a462e92170bc13a8b321f25c87d99728202897d9875cf221b3a813bc7021e962a49338a5e0def2259b99d17e6a0ee2200d019bec606b655f5b5bbd68207755e614a79dbf4db300000000009f4145f5fb4e1ffc000129d80001fc00012a74008442f1717c0be09dd835dcf2e7383c9f1bff46c93e6504110505f16171693fa5f8582c03d7e0450a9bec606b655f5b5bbd68207755e614a79dbf4db33014bf71456476fa02cfe3de9735eaa10513e943db4576667128051f34692ce042c90cbb9dbb268d3ebf89205e5c8e2afc000000000d685a3c70d983d5668e63e80c3a756b10e19228d943fc478bcb9e2e37f97ee20000200d685a3c70d983d5668e63e80c3a756b10e19228d943fc478bcb9e2e37f97ee220cfafd40a2b9ad8fd3ace89a7a408dfe19b93696d6ced7957c2b424937849540000b1317409f33b2b7166f3e3f0651d0c0b93c0e86000000000002359990ffb4e1ffc000bb3b40001fc000bc7b3000d0cc1e8d68b1d6dc7b746ca1dae2a99a5e252760d0cc1e8d68b1d6dc7b746ca1dae2a99a5e252761ec5c66e9789c655ae068d35088b4073345fe0b030989e7cc1586c9cdc8c55cdcf122ef91481fa3d344fb313c1909d3a70e675cdc805378116b48829d287c8e27792c7ea68000000000d862fc048631f81cabda9446c5f94c8c9a559d2107db383379697381816d66a0000200d862fc048631f81cabda9446c5f94c8c9a559d2107db383379697381816d66a20818115fe0e0e7d78b05f07f774480a6e1e7cc609f071e3aa4d7ce41ba05a7a5e01eae7576cf57e066d9a46c1fafd95b339698687ff000000000074cbcc78fb4e1ffc00044ea30001fc0004c97300a86191b01824b41f452f494a6d62026fcfc373f7a86191b01824b41f452f494a6d62026fcfc373f7eae7576cf57e066d9a46c1fafd95b339698687ff30028f3d9ff027351da67047d78254333d5430c022f800ce5530835d1f048721a82d87bfe959b74aa447908e3c3cacb63a000000000e5ed7d2e33f2e0b221648c3f99735afd6762270ff6a35978df389a7f82976d90000200e5ed7d2e33f2e0b221648c3f99735afd6762270ff6a35978df389a7f82976d920a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e6ff44b8561fe1997ac3bd7d42baa68bc1e2d22e77f000000000036d48a4bfb4e1ffc000ccadd0000007d0138cea5135b7e0d5ff96c57483eb5c155f1447d0138cea5135b7e0d5ff96c57483eb5c155f14464f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73001f24418ec73b09b00514dba8fb18d6d8af1dc2ff93d594bf987911f3b98d659eb43286cd450b7e1ee5978b361660d73000000000e72e0c50a6516ce833427d6100a83eb6f3e0e80234e126fdacf96aa669e206c0000200e72e0c50a6516ce833427d6100a83eb6f3e0e80234e126fdacf96aa669e206c2059902572f2a755ca1892ad551bb5444b4de7be0df294e2dc7f2884940d5f21eb008c7a89bc1f8f97177251dbc8aa45a53e83f7734a0000000000ae22e970fb4e1ffc000cf03e01fc000cf16701fc000cf6e30060800eb548f8267927a424fbcc75e67aad0653bfce7f101b7f075273c892063b1b8571311737a5767f95c0f808aff27883260bfaf9cfe2b84519a6b2308d29637a7883deac9d725e72cc5a1c366ea0dea49bb61dc118d2c2afe7f0916ac7b2516a4ad4bdbe7dfe68533867a866000000000ecf23a896fc8062fc373acbe0dc218c508e3e6fb0bf6d3ac8cbb3f09edd3e4f0000200ecf23a896fc8062fc373acbe0dc218c508e3e6fb0bf6d3ac8cbb3f09edd3e4f20dda17bc4e0a6ddb04f8a833c1fe9fb3aae484bc435452fd8db27cc90d0ae2511016de8fd61834a14f28d1981f188901bca0c6150a3000000000036be1b70fb4e1ffc000bb3b40001fc000bd20300e3ffb4d81895df6f9c29b45115faa19327a44d18e3ffb4d81895df6f9c29b45115faa19327a44d181ec5c66e9789c655ae068d35088b4073345fe0b03085960dddf69493f1302342857508ae1d2f02441ce7d43336d5829fa868e80ed94d77a0008ffe76b16354067952aa5b2e000000000fbea7792604319890cf39e6afed9e0866f33c38bb56424cba1cc27ff462f9470000200fbea7792604319890cf39e6afed9e0866f33c38bb56424cba1cc27ff462f9472047f962f47fc21cba4c4256bb383cf366089eedafe639cf909831042679a7be0f01527cd9e5065a523e44a8e9135c9274a6af6fe19600000000010000000000000000000000000000000000fc0001a34c01fc0001a34d01fc0001c81900ddba67c250a9c4121d546702cc9d29f65007c855ddba67c250a9c4121d546702cc9d29f65007c8558602cef7812c9171873346962583e161da2a263b30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001123e20847f3690fdd917393ce5fe60a64e3f5900cb167ca31a605683d06e70d0000201123e20847f3690fdd917393ce5fe60a64e3f5900cb167ca31a605683d06e70d202bd1a8ceda027ded8260ba896392d67b5cce6d04f0c9c717e560b5d72335816c004551586144b293cb01564f408f51f778a92730ac00000000003695858ffb4e1ffc0006567a01fc0006c05c01fc000bd9b400309f13210e37d13d130867462ed770f7a6957d8a309f13210e37d13d130867462ed770f7a6957d8a1ec5c66e9789c655ae068d35088b4073345fe0b030154fc5a23ca644b5d085ba1fd39eb6d18e070e14a703de84dcdd54bb37746461f5db2f0c949cddd6e3b225029a0342ad00000000113f86cd2940e9638cf59e9e06e9a73aa132b73c78b8b39c28ae2544ab765979000020113f86cd2940e9638cf59e9e06e9a73aa132b73c78b8b39c28ae2544ab765979202ad2e62e05e11789b21b735f21cf420f5410c0e51b163ac218a0ce6620f5a43400d0047699d8198a6066f90ea2f04011d359289e94000000000012e76fdbfb4e1ffc000113a001fc00012e7d01fc00013fec004daf7ca1ba224384b1a8d0ec83d87513ef08b120caca93fb8cc121ec6183f5cb288779a519cff814b2334b22379811352d9988876a6e586d975e7329309273016bb92b9101798bdbaf656bb14f47120241ff9c76d2650da9e399edb4f7bde8238b260a3bd935609e15e2a7c4790000000011de79269062f95fcf9f5185e33736819af5d1f83ff06589016e7992f9a76e0400002011de79269062f95fcf9f5185e33736819af5d1f83ff06589016e7992f9a76e04203363eea84b7a41211f93a8ea4fe121740ff396ad1a8c91ffe36e350930bbc3b1003623e2c434132d7cc18a2473ef9633c9b814f8cf000000000012ec4499fb4e1ffc0006568001fc000b9be201fc000bd4a30068c9612622050d25168f8ffe4f6b6819f7e4817768c9612622050d25168f8ffe4f6b6819f7e481771ec5c66e9789c655ae068d35088b4073345fe0b03002986699f0f7767bd666ae5087aa0c128b41d2e883c46ddef6e4abe8cb7ea470a2dba2a67e93274818d75839a9e631010000000012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a200012012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a2206793cf0a4aff111f1d61a13002686c066afbfe5da974cc7dec8cb4cef736dd8000542bd8c9d87e1cdd3db777d29c35e9903b17727a4120000000d4186795fb4e1ffc0010903d0000006e52a40d2dc4dea0ae7ff2b299283de0f2798b0a12deb4ca2b5a05b6eb2ab25bb5fee75d3287b3df0d5bcbeeb459af40f97fcb4a98e9d1ed13e904c8308a3dbdeee728fdec9cea3508c19ece8d2e8330b666e25666b1766ed5f44609dc8674dab4163e8574f4adf2e936a209d501c623e2d926af5eb52dcc2b931993d3e52714511801c1161c96de3dae28cd7f20ff8c2aa7b94b866d7601fb8f3001fb05a3138195ab6034f5bb94cb48fd7d46406025e17e49f41df40efa13aa0c40cc945a000020138195ab6034f5bb94cb48fd7d46406025e17e49f41df40efa13aa0c40cc945a205a94cc400caa13fa0ef41df4497ee1256040467dfd48cb94bbf53460ab95811301dd55cf012dea9a2f7ebf0237de0b9221cbdc4026000000000023e6538efb4e1ffc0008e9e701fc0008eb4e01fc0009b06300a8f3150f40bb0cabcfae79e98faa3d9d855d9f27a8f3150f40bb0cabcfae79e98faa3d9d855d9f276da7526423ec9db134526f944a3dc9a050d347ee300d554f8bc61403a96326c47b95797ff0ca91971a73f50b9c95837b912d8f0c191a85792f7ae6106fbff7e51d50818b180000000013b50c43c05e0841efa73ed52a2e5e7fc4790bffed05733243927bca596dd7d700002013b50c43c05e0841efa73ed52a2e5e7fc4790bffed05733243927bca596dd7d720b2a32448a7b0ce9868b350e12c6d0bc2ac0869659c31c8e3b1408ec253b6678e00d2962bb5abd70b77f3f33e3ec87f9684c0a0688b000000000036ca6038fb4e1ffc000bb3b40001fc000bcbaa0088b9b93ab35e81bf4152890bd22abfee38fe60fb88b9b93ab35e81bf4152890bd22abfee38fe60fb1ec5c66e9789c655ae068d35088b4073345fe0b030199cca14db47c035d175e38902dc1e3a25d52bc4ca982e4d6aa380337ab683c941842d01e436f66a746c1da20168da9600000000143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f113000120143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11320593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c13838ddf0c05bbc0edebee7e368f4dc6306d524af2000000000023a417f5fb4e1ffc000cf99e0000007395853c0be5fb0f0348aff8128979368f52b0ee7395853c0be5fb0f0348aff8128979368f52b0eec69a0bda7daaae481be8def95e5f347a1d00a4b430b928fa4e127214ccb2b5de1660b5e371d2f3c9845077bc3900fc6aabe82ddd2e61530be3765cea15752e30fc761ab7300001b5f25f8f70cf8d05c2d2970bdf186c994431d84e01fb8f3001fb05a314bd7ee89d452d76d524dbfc31b6f2526d7c904a8d7bc1cc70d9e3e0b3d47cce00002014bd7ee89d452d76d524dbfc31b6f2526d7c904a8d7bc1cc70d9e3e0b3d47cce20a1e78087eb631164b217b6efe4fbd23722765c2ddcab903537722d183b12610a00a444ea8d94ff116c8c8363a70aac7c27a224da9e000000000022de350dfb4e1ffc000bb3b40001fc000bcbaa00fad0b3a1008363b74993501effde3aa3760ab6e4fad0b3a1008363b74993501effde3aa3760ab6e41ec5c66e9789c655ae068d35088b4073345fe0b03017288f1886c1f8dcf1d1ca73d4586fc143b1a8abd1f438a3f592b17f35f942de3ca9acc93f18cb3f4ba82b12d6313cc20000000014f2f481ca295a5bdb3e3d7f50ff87f205230609c53989da809420b874a17f3400002014f2f481ca295a5bdb3e3d7f50ff87f205230609c53989da809420b874a17f3420d8c62e2deee0738b5f0f896655ea8acc3f8c0cdb486831d94cf221a13caad545010f3771e69d7faf4ef340696fe5074743a262a6c900000000009f59898ffb4e1ffbc4230001fc0001950c009b5722d68e5dae3988ab71e01497235c79f96196a2b7623bf2c1186d629fd3234b1d058a1ae5b372b2334b22379811352d9988876a6e586d975e7329300871c91beabf5c3b98cdb1009763d03f62550e676d20b54c3fde7e50ba97e54b1cd7bf83909932697fba7627a8e583e50000000015d1b166ff3603d1a583f028e9a0b5334a48db7f3272ea2e4d101306e353f74800002015d1b166ff3603d1a583f028e9a0b5334a48db7f3272ea2e4d101306e353f748208e8e515f7025352e7c608479e413beacf0d95cbb964b47e4a98fd27b6b6b628a5be2e173478997f5d3a3289c84783714de82779cd10000000000369ad3f2fb65a6fc0005e6990001fc0006573c006b78d97d6d777cdadb430c72745d53aa169eed8f6b78d97d6d777cdadb430c72745d53aa169eed8fe2e173478997f5d3a3289c84783714de82779cd13018e4c1013002f690ead979628cecef981034bf9277813035637c376ce9dd04b1b379c4abd45bc5ea969a894fa0d0ebc200000000160120d0aa01ae90e2abb2791a313af326274536f930c95e393959598f29c636000020160120d0aa01ae90e2abb2791a313af326274536f930c95e393959598f29c63620a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e192d7ae4aac5e298584fc2e2eddcf2522ac3b8e3b5000000000036cabeb5fb4e1ffc000ccadd000000ae2c14ab7113b1aea921177e509bc59048556b97ae2c14ab7113b1aea921177e509bc59048556b9764f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730066d57a6451b7800c1c2a6c6e04fe73ec2e1c95e492bacae760ad2f79ca3c30727ec9bf0daea43c08ff1ad6c2cf07612000000001645a3ebdeff58bb478421fe8e33119d10f22f238c9270a1e80ad46fcaa188a40000201645a3ebdeff58bb478421fe8e33119d10f22f238c9270a1e80ad46fcaa188a4207bb3153777f087f2d3c88debb4372f695aed7e3dfd3efca720e8cf4ef14cfd3e0079e8a0e8b5ad86975702bbd7f192c9cac1104292000000000068f8872cfb4e1ffc000628210001fc00062e1300dec4f1bdf91c23a8ed56738a32f2795855bc9827dec4f1bdf91c23a8ed56738a32f2795855bc98270e5c35f6bd12cc355ab5cf466721bb948e46afb9300a5c47983c44aa99ce5f04b32cfbdff42e7f92b1410558559dcbff3ca8aacc3c2fcaf05db6f021a9f335ba05b9af4c5200000000164730f2cb1a5e6660e77d03c2a4fbf4e9dd23a0798fa7697bcd0aae145ec3b0000020164730f2cb1a5e6660e77d03c2a4fbf4e9dd23a0798fa7697bcd0aae145ec3b0200e1d20e176856da05c1af552bb3d15182d45e15962bbba97702537dfaa8b51b00179f83ea215fcf6ad17a7d147199dca75723dacb600000000005350e2ebfb4e1ffc0006b25b01fc000723fa01fc00074c4b00ed358f1398a3cf37e1b3131e7c492161d6892789d593063ca9a226192be390d6841d9fc28f33818c9602f50d8a498a04e95c35af3c2545ffb074865030874a5fe9d0a2d7ec3ce741fa441e2f9a2f1726fbd2d09a000a6dd4828bd4951a82b0bef934716a40d0ff36e4641f9378000000001659e06c825212c9b11325760a18f6ea06194ec4efd603f03d8704f23d818a6f0000201659e06c825212c9b11325760a18f6ea06194ec4efd603f03d8704f23d818a6f206f8a813df204873df003d6efc44e1906eaf6180a762513b1c91252826ce0591601c274b44875713f1f7107b98c82ec14a3738e36d041300000010000000000000000000000000000000000fb36460001fb364b01140b2fea5ae1aa7e6b8ee68a11d2727663397163595d9f40d00a7ea5cca2502a1c5bc47706688c42c0ee80d8e78d59877e5ca6fa6d071f2bbf3037e6300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017013c34733cdafc4feb7f317587cbb891b1027ded099e2dc2e8e1da05ad0f4200002017013c34733cdafc4feb7f317587cbb891b1027ded099e2dc2e8e1da05ad0f42208e8e515f7025352e7c608479e413beacf0d95cbb964b47e4a98fd27b6b6b628a21492077ea3f2aae501b0dfa814c61c5626c09a614000000000034d41347fb65bafc0005e6990001fc0006576c005caf3605e05011b3abef72e467ab5334e74d68635caf3605e05011b3abef72e467ab5334e74d6863492077ea3f2aae501b0dfa814c61c5626c09a61430836747d419d09200e404aa3500fc5d51f044fc01fd1a9f452324c8c14ab90ccd75887b6bae1599cdd458e738a53587f20000000017454490f2e0d86c39e8d0981b1d1b67354a96915a5866c527ba06fa08b43dcd00002017454490f2e0d86c39e8d0981b1d1b67354a96915a5866c527ba06fa08b43dcd2059e4a4ffb2097f50e8636da1d9fb7b58400563bb19ffe74555b42f7581cc2b74006fb36a0176a614d53ec1402019421234316f9d83000000000036b8f747fb4e1ffc000bb3b40001fc000bcbaa00babd4d5499f8186f8b73cba064eb0cfc4deff4f6babd4d5499f8186f8b73cba064eb0cfc4deff4f61ec5c66e9789c655ae068d35088b4073345fe0b0308fd6de82030e06682e2e65de0fe7efe2edde83f5f96c3446716278d240e0bffb9bf33df3d64d36b9cc6649da7bb0b41b00000000188b4f3700c029d93de43a0e865b3e2e800c3bc67718f8d213dd111a9e401cc2000020188b4f3700c029d93de43a0e865b3e2e800c3bc67718f8d213dd111a9e401cc22068cae611582070c7859ca4ff173baee189eae61bcdd27be131df62a3a630d34901d13ab9ef967f44ff97748303c21e421a7f80974a0000000000761f230dfb4e21fc0003c37c0001fc00044d830039935d16dd5f12eb27272a4190608370e212224fa7755e80caba03e54606c89f955d1d4b9b85d91cdbfeb2a85d70b0a32d9cbc6f4b8f1ba6e375065d30831193814d5cddb0268d276281ff7356b9cbe560bbcb6c9c55f12a53b0dfdb60ed5570c9c4bdd39d8a0728dfb2b0596f000000001910a0aa60c10475397dfc5507a1d765070f96efa15e7a4c6ee559461b23ec8d0000201910a0aa60c10475397dfc5507a1d765070f96efa15e7a4c6ee559461b23ec8d201cee1e4ff907fed96b4079561103d57bda553019cca81d84d0f749c60a5da59c0170f9622bdffd2cf2aa9d2e54ca97ae74ff19b54200000000005350cc76fb4e1ffc000ba06001fc000bbb2d01fc000bbb6b00a2e7118000386185b278ec3d5304db462f23cc55a2e7118000386185b278ec3d5304db462f23cc5590cc3f0be1a150f59168adb0236005438c282f9d3090a2a532b28ceb661521902ada94853f1b90c1a7d13d8ce8a40ebec6c7a62a4e22fe5c1019e278750fc93f6808f410d3000000001a5889046c1a29a03a8a40bbe26da1539d1abf53f9b846857c7fede4d5e3926b0000201a5889046c1a29a03a8a40bbe26da1539d1abf53f9b846857c7fede4d5e3926b20a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e70f6e92e766ee782976b3a25db2143060fd0e69c5d000000000036c8dc69fb4e1ffc000ccadd0001fc0011055b00a5c9f61e9276d9a8471b75beae8d0b91b5b1cbb9a5c9f61e9276d9a8471b75beae8d0b91b5b1cbb964f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7300406e459bfd155c81f9103a1fe076f1261ee7513275d744c133c5d5dfa956b1449f173bd110bbc03673f376593f32a27000000001b34fcc8306280449bae2eda2361fd372380b9b630b272fc44f55105c58f16110000201b34fcc8306280449bae2eda2361fd372380b9b630b272fc44f55105c58f161120eb748acc6851ad16efe38875924bc04b4c3451ac244e1c979217ecc42b2f90460075fb7f518ebf31fc70855f607f7a092e8bef53cf000000000036cb869dfb4e1ffc000656a80001fc00066e7c00e922c71d669bf4aa1fe543345d67d0be170b91eae922c71d669bf4aa1fe543345d67d0be170b91ea1ec5c66e9789c655ae068d35088b4073345fe0b0301622ef0d7145ce02babddc8762f170f46d5d55c151218ffc12aab3ea9faf90dc97bf158a0fe37a3d8c1fc416bf01bffd000000001b8466759e68ad97c55c8c96a24a060a839baf8a014a7ec897ab6fee410e66e60000201b8466759e68ad97c55c8c96a24a060a839baf8a014a7ec897ab6fee410e66e620e6660e41ee6fab97c87e4a018aaf9b830a064aa2968c5cc597ad689e7566841b0138c25763a87e0036a3f5dab27aca1c85bea508e8412000000023f70440fb4e1ffc00081f780001fc00087abb0046d82dfecb82e98abd5b694ffa54558168fa593c46d82dfecb82e98abd5b694ffa54558168fa593c6ba9df01752f7015bb150fb432f598a91f8b22e3300b0a6390cd90308c8b7adc4374fee6d4c1d0f467d543dec6e306922e7e78d06ddff70e6adf6b2410cdaaf0d7fbab39ba000000001ba9b400a99c8ab19e2681db0e868814aa273e8eaa13615979a14c50bbd53f4c0001201ba9b400a99c8ab19e2681db0e868814aa273e8eaa13615979a14c50bbd53f4c204c3fd5bb504ca179596113aa8e3e27aa1488860edb81269eb18a9ca900b4a91b017c706d1b78fadb609fd92ff5929901a706c55877000000000058162c0bfb08aefc000cf9830001fc000cf99b00f74034f58c080be74bec51165c5ffe60ed1a615f96375e263814e1d54fc3297fe893dfb5a9c1a9eb6443411c39e405d2520567d4f6b041c5c550086230b006ed30975f322c830001d1b3c2e2f14a4ef35445431356f1c5b93c2eedd9c7ea24c4429d27d45f2fd701733ffd65540001f2dbd9b0a1f541a7c44d34a58674d0262f5feca501fb592501fb59261be5730f3876206a58161fa0db37e54389324519b2ffbe53a18910d63e5f74db0000201be5730f3876206a58161fa0db37e54389324519b2ffbe53a18910d63e5f74db2075fc3c877547021a42f8a7f69212d570e4b1c261d7ccbd13a46a0e4cd6661de000d1297438fe58cf5cfbba6dae5cca982c28d8e1460000000000235b74e0fb4e1ffc000bb3b40001fc000bce4300dbf20e7b2d642daebba0567c14cda3d4363ba372dbf20e7b2d642daebba0567c14cda3d4363ba3721ec5c66e9789c655ae068d35088b4073345fe0b0300c03388550cdb5148a63bd3f4ba937b05845748773dfd1adf509ab94d5c525e57f8654b723abadd85d2b650f14a8b9cd000000001bf9d1c02dd94bf4784aa6c1b959942ef6acf0ab1a8579be428b01b5fb87bc8a0000201bf9d1c02dd94bf4784aa6c1b959942ef6acf0ab1a8579be428b01b5fb87bc8a20a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e0b14169d588590a243f1ca0618dd35474b06d08daf000000000032703a72fb4e1ffc000ccadd01fc00107aeb01fc00107b130083564ef2fc85085dc7f2a155a64fb5d14d89dadc83564ef2fc85085dc7f2a155a64fb5d14d89dadc64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73014e81203caa5c0cc305b5e0f3ae7a388b974a629358e4e83e50a25b2c2a387e3d114c7c82e2b23c25b65585220e63c99000000001c692349b501682aa983907516959bd6a0148c23ff9b8cbd178e1e07fd9275660000201c692349b501682aa983907516959bd6a0148c23ff9b8cbd178e1e07fd92756620a3ff4c5428133a31449bde462aabfbc9c65ac5044e832ca0900819c8a7feb17d01f32dc6faea0264ec91432ffc25183c63b695ab1f00000000002cf298cbfb4e1ffc000b16820001fc000b17d3000bdc4306178f7c576e5904ed9c0643f2faad4ae3a164232c5ce6f1a1448084d628145eedb09f01472567856cdf62ed7325c44bd7b7557e1acb330a63300923d28fcb1fb8b90bf8281f2f50b6a109f2f5b17a4e1653e193ae58980a03b3538ceb82c6b4e1e986ad40d08c63e330000000001ce233bc4e4b8104def542c9ca2929cc95b42a3bff03ce5c3035dc04cc71bbcb0000201ce233bc4e4b8104def542c9ca2929cc95b42a3bff03ce5c3035dc04cc71bbcb20f8607030e04bafa10d798515b6877c0a599fe907b1737cd0db970c8d144e82f000307a1f9ad73350c1489d17a35ceced0d0405aae8000000000023a51841fb4e1ffc000bb3b40001fc000bce4300d5b08c823b75db3900a75e36c0504619e8a47ecbd5b08c823b75db3900a75e36c0504619e8a47ecb1ec5c66e9789c655ae068d35088b4073345fe0b030880423a2ded94f06b02b66e22219495c386733a27f1ebf1d5aea6017cfe510d6d0e0479d2a5acbf410e4d6e85d7d10f7000000001d0adeaf787ed8f6f73fa936c6313ddfa2dd33ea693a2de22bc346c1b73a4a020000201d0adeaf787ed8f6f73fa936c6313ddfa2dd33ea693a2de22bc346c1b73a4a0220a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e3c6c8d7e6bc5c0d0f84af28da5ef358d40f058ba81000000000022dcaf1dfb4e1ffc000ccadd00000068a589741e0d3d06e5aae5ae008f2a8b11426a8c68a589741e0d3d06e5aae5ae008f2a8b11426a8c64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7308b7c76ec03f7ae0dc9be41fb9168906ef0d0d4de74f0ad8c5cf0a30483879b5203ae5d7c6aeee5b92998444bc10f68ec000000001d808b8e69cf109e2b25bb87e40e76593d385bec2ef26e9b0672a3c69418c0f70000201d808b8e69cf109e2b25bb87e40e76593d385bec2ef26e9b0672a3c69418c0f7202fa3b3c49a569e0b5d61aeb0dce73c34d2b267de6c03f81dc4509c1ca6d3f7d300337dde5fe7ce3f75adbda925932e38c456e59e8b000000000022aada88fb4e1ffc000bb09201fc000bb20e01fc000bb2230091755d751fafdbf3c4d1e1dc94c2bc198f7b5bb591755d751fafdbf3c4d1e1dc94c2bc198f7b5bb5a683e40cf2b717576d777fd4a81660ac6c7d939c309687b4c357c8faa53e6733e83b77b94e92d2b528047e2e4cad325810b5e4856b7ffabfdf97c825d224992838d7435d75000000001f1443d9f38273f6437fe37eb34c30033fcd51c7e7f563504c8809906e711de30000201f1443d9f38273f6437fe37eb34c30033fcd51c7e7f563504c8809906e711de3209e3bd9b71a626baac323ec5a6216882496eefb8d70c6a1ef95ee01d57659aa39012ef68619350d67f5e1269aeb7d0459317ee69f3700000000010000000000000000000000000000000000fc0001a89d01fc0001a8a101fc00022899000733464b2d4975e9739512fd74cd6747495adf2f4d532ed2827d7bea5c49ac0e1cf57d6dabe11e06219c4fe7634649826ed14bb206cf90cd20d5bc1130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f3ead0b52a6e6e289794c0e84dfe988bd88605fb987a919ea4e3956dc4791240000201f3ead0b52a6e6e289794c0e84dfe988bd88605fb987a919ea4e3956dc4791242046867d5c2d93ac83e7ad8a5079e609902a62f394b4c1858324fa459a652837f60137c49591bb612183440470cfa5065e4090d31e290000000000344820cffb4e1ffc000bdf300001fc000bf28b0048022a40c99c1a58ee5371a2cfc1079df5715aa3e1aea521fd5d9c90c17704c6a7b653c6fdd42ce8264726481a36d7c39125bf90457cd47190718d5f301641b24598bd24e49c4c2c59d027567d89f2e7315e53fabafb508e48a93b48f32525fd9dd9266b0ca4bef5d08b9605af0000000020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c00012020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c20593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c117663ee06b0b159308edf41150954372a730aa6a50000000000235515b3fb4e1ffc000cf99e00000004d65ec5142719f58e31f4510dda3c810a84364204d65ec5142719f58e31f4510dda3c810a843642c69a0bda7daaae481be8def95e5f347a1d00a4b430b6e979f20241cbb73de7451779e8e059d9cb75a74b72ea6862d7ac703dc2ac07d86cec39b6e8923b55fd54dbc6177c3a000135d9eb76397d05b43b5cd8da7ccfa8408bc89ab301fb8f3001fb05a3207d97711f4c60a23f5ba1a79bf4b86adceb51bdfc25ce25172c8a311147bce8000020207d97711f4c60a23f5ba1a79bf4b86adceb51bdfc25ce25172c8a311147bce820cb2fc1a392bb538ebcc5d73250eccafe08c96e6e7e209185f6e73ee8ffd84074001738f719112c8fb6fb5e9d66f9b011c24219177a000000000034286568fb4e1ffc0006568001fc000b9be201fc000bd4aa00caa5590bf043919888c4bc0c739482e84d51030dcaa5590bf043919888c4bc0c739482e84d51030d1ec5c66e9789c655ae068d35088b4073345fe0b0301956c264759bd857f9d78d04cc67e42b39e5296bb15f16d0350d741b026ac4a7fa79985eb63c487d91b7ac250dea3afd000000002344c8196ab9a4becdfb3a287a511278581d784b9afda234be289c85463219ad0000202344c8196ab9a4becdfb3a287a511278581d784b9afda234be289c85463219ad20e79944387083c27fe76eed01599c5c4921f40cff7a45e6b62624b97b748730ed005b224c407e486ad5d944af0e7344fd0dc3a20e05000000000022dc4a30fb4e1ffc0006567a0001fc000bdc0b00a988a44ae537e9365e8199cbfe84c453714bf3aaa988a44ae537e9365e8199cbfe84c453714bf3aa1ec5c66e9789c655ae068d35088b4073345fe0b0300d85038bf7b6e4365042c33610afbd181c0729f2107bb7e3e229daa870007757e1851a077e252405ff35373e780815d7000000002356f75f3f35322a81e5b8a37bf6ec59388408f8faa6468075ee5f4026ee0f930000202356f75f3f35322a81e5b8a37bf6ec59388408f8faa6468075ee5f4026ee0f932015842c095193a92bfc68c7b66dce922a9c3a119721ea0f0131727a1633bb982f01cba75a1c4d696337d08874fd92650aae0b7f8226000000000023ac3458fb4e1ffc0003844b0001fc00048ffb00dfeb04f9a4566f877926da380ff6cd983f693747e37b26efc667299ef749a8ffb5a2a64bc48c5236315fddab967ae28ddfb91ddd515c7b89bfeaf2ee3005d35fb7ea96c707d0bb6a9185f575596285d3578af73d43d2940e6ba7a39a60ad5d3a6f5df16449e4f5ba1cbd8306f60000000023dfd9ad3215287b8e08973b049a55a3024058390e1e9c338c98c967e6de38f900002023dfd9ad3215287b8e08973b049a55a3024058390e1e9c338c98c967e6de38f920b6f6b4620ced1393cbbd57400b11c84142d66c9ab6553cc5dd4b21e6add8c96801a62279c8b16cc1c8e38faadd5c7d146e67e5bf3a000000000022db3f31fb4e1ffc000b9ba201fc000ba67d01fc000bd4a30078ef25845ce006d5f5fc3be9773e2f57282f4bdb78ef25845ce006d5f5fc3be9773e2f57282f4bdb1ec5c66e9789c655ae068d35088b4073345fe0b03014e98c3260409c144f2ef15607ca1677c6eecdf723e3f7c99b25e0f561d4a315d25b702e9153524446b0a2514bb09adb0000000023f239d376d072dfcc083c6e012b1aa149a3ab66cb8bd524c2a00fd534a5d26100002023f239d376d072dfcc083c6e012b1aa149a3ab66cb8bd524c2a00fd534a5d26120a83c3da02e42ee3c9c13e27ec391c97a43f6fbb59ca6dab3086f6f6f2180565601f2b65c96c7febf32ea46461feb1b1c0d00516b6e000000000050f0182cfb4e1ffc0006d4c101fc0007015b01fc000701ab0091cf245e465930b748480cf54da8da800e8b49591516fc10404fc6199c750577dabb9f26800c86525748d29ccddd0db9317ce1f8c3f4b8ac69731c4d3094b3e11094b8781908d100194fa8b47659c2ee17720200f9fcdc2804c557d219e87eb68fb0e6db97822f1f73ab7f846d00000000246b31866af114ef8f6d7146a68bf15004c1dbcc7229accd1ad81078547b4d96000020246b31866af114ef8f6d7146a68bf15004c1dbcc7229accd1ad81078547b4d9620904bca9accaa1c0120066b43889cde3737f885679baecd956cb34caa1523842f012aec349ad1f39b61c6116b419d98d1ebfa980fa2000000000022d934eefb4e1ffc000bb3b40001fc000bce2b0057fc65161b69a4d3fadc9c4e75850d5b4ae0256757fc65161b69a4d3fadc9c4e75850d5b4ae025671ec5c66e9789c655ae068d35088b4073345fe0b03017b350c9c4d8b39af2ce0e3fd8d7cb9539a6da30533f8fa7c2aa1c4f6b976f625c6b68e86d95e79bf9c758076569c35d00000000254739a1dfbf7795267e64686dd07cd61c6f87e665efd52e15910fa29b3da3bd000020254739a1dfbf7795267e64686dd07cd61c6f87e665efd52e15910fa29b3da3bd2068d9641221273796f8fbe1d920832c88a3b5b4b95463206485182f648dd3fa670096345fddfd53f65ef43487849a6f469c9eb64136000000000047c6dc82fb4e1ffc0006f4d10001fc0006f51b00eafc007af0360da4457b92cbb8ad08650f20ea4ceafc007af0360da4457b92cbb8ad08650f20ea4c19c2c7d2ac04ffda699922b0d78957ee839ebffa3090f7f3a97069a5090c885a85aa7e8c970b5d3982718dc4394e2de8ecc2d1c38c8ef51a322e6a5e9660eb794af6c404740000000025b1e2cc3dec589720bafa5769d16437e2e5073d63df9659d05199fe22366b0900002025b1e2cc3dec589720bafa5769d16437e2e5073d63df9659d05199fe22366b0920d73d548e5f6c1b4f19114e39bf27e78530faa14c6fd4f019c589805c624556c4014e63b061493879a21b61e49607d988ce43449eed000000000012ec855ffb4e1ffc000bb3b40001fc000bce43001c544de6c1eaa3cbaa78ebceeb76f1c9d9d799941c544de6c1eaa3cbaa78ebceeb76f1c9d9d799941ec5c66e9789c655ae068d35088b4073345fe0b03083cc6e11edd346dcb19cd422faeb218e37568f66ef70656c93d6d43bbd2eb8715a99af27323d075f6b31d955ccb303e400000000262f95031d76363e3fad8c110694a8894077ca0ae98acffc94200b16cba997b4000020262f95031d76363e3fad8c110694a8894077ca0ae98acffc94200b16cba997b420abf84695101d7649a8be1488b7173bcd83a050c4d4735974b6f08c997f1fffa201feadb5e4467d54029de5820c960b2932ba61b58b000000000003e25369fb4e1ffc000607de0001fc00065754000348d6a81e71ebb94c607c7c79d9500f2d689869f98d462531cb02fdc829890da5d5f248c81f961958b2b6e9982851794782fc7102ceffef076d4c15308a50a9ec0042d293ca23c941142561632df2f182445a96d693b70079a085dc35073092d00761156f88a1f269a2d87e7f000000002695fed97527f712995a207d278a1cb7fea614effd3f6d3cacf58052af020b8c0000202695fed97527f712995a207d278a1cb7fea614effd3f6d3cacf58052af020b8c208e8e515f7025352e7c608479e413beacf0d95cbb964b47e4a98fd27b6b6b628a46ba4f939d4efc43e1a17deec2b9695271bd162d14000000000034d41347fb65a2fc0005e6990001fc0006578400c33d559a563e9c22c95585c0f556727c6c5195f4c33d559a563e9c22c95585c0f556727c6c5195f4ba4f939d4efc43e1a17deec2b9695271bd162d143091c5a9a2513c46543acad374e11f69e63df9583e74e511e619355f2cb7c1b9cd7b4c1ddf3f33c28a8c046658958c3a1000000000271b3eaea9e4fa8717b42dc04a257bf689d56e400683d608ff7cec3a34ad7115000020271b3eaea9e4fa8717b42dc04a257bf689d56e400683d608ff7cec3a34ad711520a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e428d9aaf516d9d692b3476014c6f0790a8c609991b000000000022d21a5dfb4e1ffc000ccadd0001fc0010b6cb00476fca90e883f3fa6116515e120c7e4c1b33d302476fca90e883f3fa6116515e120c7e4c1b33d30264f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73012730062f122f937b29f69536db3ad36980b88004eadc2ca341425d432723d67e53a4f55786c54017d77c1bd1df6b31000000000274ae6ab38ea0f3b8fe726b3e52d998443ba0d77e85d88c20d179d4fecd0b96e000020274ae6ab38ea0f3b8fe726b3e52d998443ba0d77e85d88c20d179d4fecd0b96e20a096901dffaa36cab6566f3a7028c1cb81ab8906b6804a12132666cfb240301301bceb142ede41aa52eed6c38b326e7df12226e01c000000000086d1e74ffb4e1ffc000335940001fc00052b840074f9875462d0f10d60acafc3f64ca89e86e491977f0dddb29235681f498bb64f7bdcee4bee1f4c98bceb142ede41aa52eed6c38b326e7df12226e01c300db6da5d8ee9fb8925f0818df7553062bf35ec9d62114144bc395980c29fcd06b738beca63faf265d7480106fc6cceea00000000289b8c9733345bd0c9855f933d947192f566a6d6bd5ca694d3ae0b5e9d3882f6000020289b8c9733345bd0c9855f933d947192f566a6d6bd5ca694d3ae0b5e9d3882f620a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e1b2f17f1892888740eff564e5925560fedfee93f7e000000000022d254a3fb4e1ffc000ccadd0000001c6031c212e840f9756b8f08e3801cca20b38a621c6031c212e840f9756b8f08e3801cca20b38a6264f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7300e2825781a496023c8be61f2bf352ad1094afd6e4f84c4ef331bc727bc149a6dd7e23d78944b8b047c03da44eef1c79600000000298bb1ffac5832d9bad4339c93948f449a2aaeb2d66f685836b6bdf4275b6d6d000020298bb1ffac5832d9bad4339c93948f449a2aaeb2d66f685836b6bdf4275b6d6d206d6d5b27f4bdb63658686fd6b2ae2a9a448f94939c33d4bad93258acffb18b2901dbc9cf11f6b96f87c6435430e66384b80d674c380000000000ae22e976fb4e1ffc000c225401fc000cf06901fc000cf6cb0031471f3f5be089945132a63168b2e4feb2cc5893ce7f101b7f075273c892063b1b8571311737a5767f95c0f808aff27883260bfaf9cfe2b84519a6b230925d20af1a6d0ccd3890f0aead4a05a59be22e005b6d732f855311915b351a9153b2c83d84611b2c9958f806c93f7b5f000000002ab90c655fce7462791fd57049fd3477460cf45aec3483dd8f92ac76cbb5b65f0000202ab90c655fce7462791fd57049fd3477460cf45aec3483dd8f92ac76cbb5b65f20ff005bf96c06ff60140f082130050e2c3231178769c841f5d2e7c8936c53214301491707fcd2969c5f8ece1e0102d6f8425336700100000000009fcb1514fb4e1ffc0001aa940001fc0001ab14009406f3c3f3e20632e58e419a5107a5db669cb4209406f3c3f3e20632e58e419a5107a5db669cb420491707fcd2969c5f8ece1e0102d6f842533670013006b2e598c2a16e7394cff63bb9939e8bec49849f2520f97d8de70ed9336625ea0582889be68007e93663685d03d6996b000000002ab9d8594ed6b96aad7e0d89e739e15f43540da076265f22f1f2be892b9af9ba0000202ab9d8594ed6b96aad7e0d89e739e15f43540da076265f22f1f2be892b9af9ba2031b660b28d594534ac630a8e9739ec2d87f054298223188a66f7ab813007545901653e5576338dd6a629c58b7bed6fada76b62919b00000000003ada3c2afb4e21fc0003b80f0001fc0004053b006672b178caabeecb6cbe108c960367333fd237f778a2c01c623373d2761103791484d3ad1164c06d22ee55a30f4a11a8c3fbd3eb1ec76d9ca8ff4ff73004eda2a8c31489e17463ea27c0c39473afe2c9153641028de360eee8ce213d36a14ef8f8b4f85fb2cd70815a9c1f56db000000002bcdbb54e0eba24d0a83a339436d84c916947205535f755f21cc4843ea3d2cf10000202bcdbb54e0eba24d0a83a339436d84c916947205535f755f21cc4843ea3d2cf120d7c8b2f884a83fecc4227138495333e0db8b7125f2d9a306218176604a30f48600481565d75de04c111a345dd844afde2b9a54220b000000000022dca522fb4e1ffc000bb3b40001fc000bc79c0008b5cf180aa32a061e3ad75bc37908a4ff705ce808b5cf180aa32a061e3ad75bc37908a4ff705ce81ec5c66e9789c655ae068d35088b4073345fe0b0300d450032d437d4a3ce7b62b4fcf70599c467722d2a3ec10844d4cedbe6783d39b7180fa294e7b3f819c4b4c293437770000000002bd7d5200b9a5e22d5c95c2c19923e9cff64ed36a1f736372b87d82b2383926c0000202bd7d5200b9a5e22d5c95c2c19923e9cff64ed36a1f736372b87d82b2383926c20451a8c759ac8fd8f333e230268f26808131fc02a734a1fe98b234ddbae4b1375019263a05cc87500b6bd59287c7665e0c84f210c9f000000000022dc8cccfb4e1ffc000bb3b40001fc000bd21b00eca70167cf9b64e7daa3bbefa9fdafb213f5016beca70167cf9b64e7daa3bbefa9fdafb213f5016b1ec5c66e9789c655ae068d35088b4073345fe0b0301066424f46c8c13274c1aa17df6a3fc1ca4fe80d9dac09525ae40670c5a6ca193854ef663940ddf64740fcaf7b83bac3000000002c8126dfa695f9c0da6183451834b6ada03adc05c54c72594187bbf65d8591f30000202c8126dfa695f9c0da6183451834b6ada03adc05c54c72594187bbf65d8591f32095cfedb09499fd9459f4cb839f6fc086a7ab10762181108913f996689914d050019f9db9aeabf86561085372a2ba98078afc0ef278000000000036bd713efb4e1ffc000bb3b401fc000bbd8501fc000bd21b00b2a4ee6e3d9d40899ab18ae6f737c85278d907f4b2a4ee6e3d9d40899ab18ae6f737c85278d907f41ec5c66e9789c655ae068d35088b4073345fe0b0301095623aca38c0609bf75ce889406d896b2d06763728796d1d9e154392e74e16e41716c1dae79d1e321a47ce2e4eac7a000000002cb309db9b7c22b337a7c24aca6a2d730030bef2f3a7c5f104d6c9ffd9ee64d00000202cb309db9b7c22b337a7c24aca6a2d730030bef2f3a7c5f104d6c9ffd9ee64d020d0cdca3ceae80c1da9521a82711b05c63a82a6821b2c1ba4e9d2a529f645bd61003d1eb245b39df4983715e8579b8053ae088176cc00000000007217368dfb4e1ffc000606a50001fc0006072b005871467000cb7d7144ece56406a6d0f8e97360395871467000cb7d7144ece56406a6d0f8e97360393d1eb245b39df4983715e8579b8053ae088176cc30903a0f90f0ee9ee05c0d567eaae8ca9aab5bf0d5d1e0240494f40e4bf954201e48585c5a2897ed76697b4fb95dd993f5000000002cc0a073e9fadb5cea5cc3303b8f85ed603dc6de043f0ec06edab72d886c57cd0000202cc0a073e9fadb5cea5cc3303b8f85ed603dc6de043f0ec06edab72d886c57cd20f2645684284391532fda7db234d517365631647782fcdfae42d5d7ebca78f3cc013c56bfe3279092a8afe0a282c66f1c68c6a331a100000000005fd8ae98fb4e1ffc0002ddc90001fc0002df8400c5871227ddeef90af4d9e891170c4407a5957ca0c5871227ddeef90af4d9e891170c4407a5957ca03c56bfe3279092a8afe0a282c66f1c68c6a331a1308dd3ff4dfb358ca5c5c58f5c163d73482caf44427b62751b18255a456b8edb175f887db87b3b214753045f631db58475000000002d3394ece5ebfb9e2f369fae0c663b01b978f946dfa06fe938f2c292661c94990000202d3394ece5ebfb9e2f369fae0c663b01b978f946dfa06fe938f2c292661c94992005987511f1162441ccd624fae51f48274da77bd4a6a103de7b767a963e06280e00bbae8d6f3091b51bb8bd2e948907ee11744e6616000000000050f017c7fb4e1ffc0005329d0001fc0005340c008c5f76e0794a0729c41142e619663b77948748ab8c5f76e0794a0729c41142e619663b77948748abc66ab236698c66f559ac918689cadae4c8aff0f6301260b9b40d6a39c14c5f52763ef6e98094a6d41ed35660ba24334c50b60cbf18a524aec8bd4d0203c3257e70e193fd30000000002e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb0001202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb20593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c0101e19b30edacc8bd047a72d6b12b79b3f1b2babd0000000000369521a7fb4e1ffc000cf99e00000063f16c50b9cd1dccd8465e1802749bd00dd49a2d63f16c50b9cd1dccd8465e1802749bd00dd49a2dc69a0bda7daaae481be8def95e5f347a1d00a4b430943a88959611417f9e8ce4e664e1d9c6a839daae14f54ae8e78bc5ef6ec1524d116efca49ecd5c57dce31d90015a51ff00011ffbf1d32541dcb8f5555305295704a9ff9adc2401fb8f3001fb05a32f4bf68bcd9f4fe5171f8111a7f007f76d1298c1124b8a85174e64e057a2522d0000202f4bf68bcd9f4fe5171f8111a7f007f76d1298c1124b8a85174e64e057a2522d202c4f5235e6615104fa3709900b96bfc192e6264d8edfbc24f7af6f1d9b2508e900e5ec4a87e9bd6276f5954a87ddbae45e398bba5c00000000003694d7a1fb4e1ffc0006567a0001fc000bd99b0031e5d66a6457e3181b3dc060f5a278bb61a54aba31e5d66a6457e3181b3dc060f5a278bb61a54aba1ec5c66e9789c655ae068d35088b4073345fe0b030978c2c6ad4f75b983efe0be4ff9d9fd5c70645dfe27b4aadbb33ea857e63ae59f7907a9e65850000d968af60e264370c0000000030110b4643c2d8c7521f27ccc2a6a70579bc859087fb95facbb831b3a3d107c700012030110b4643c2d8c7521f27ccc2a6a70579bc859087fb95facbb831b3a3d107c720fbcd42341652da33e977bab8bbef42d0f053f93e9e2748f3f39881d11e28910c017798d43ef1f85193b1a0e5a7ab7853a39d27f0334060000000a6469a72fb4e1ffc000f01930001fc001046630057656569e143ae0cc0419020708c8ce5f4c776e452bfa12608d37422d52423c3a71f9574ffa8267f535e571f5fb89e31f634da8b91769ea4dd252e19308cf6a03c7a0bd8c38c1fc536a013f93afc8224cbfc79d8b0157c7080117ec9c1c60198c3fb3886ec472aeaf80bd5fffc0001c3f93922e89f4bb3869da0c18d8e30dd91019bb101fb669601fb2710302ba9134d9d734e0a76599c9cddfdd1ea2231ff6c152fd5a95c9ec38aa66d02000020302ba9134d9d734e0a76599c9cddfdd1ea2231ff6c152fd5a95c9ec38aa66d02203114c3b632de2d7ece96a92ea26b83b4ea213a9db1eb4fdfc2dcfa84e7cc500900c437a1e129915fbc02e98bca6d8e8fb8d08001c60000000000a5e33fdffb4e1ffbc40f0001fc000196140036c7c737a21e3e6227791978495ea6516da151c9cea287fadf53be3891e7d421908b9a64a5ef3147b2334b22379811352d9988876a6e586d975e732930083997ad0a7d12c5038242eb54f0aa3952ede09814c57b7392adc4db58f4070dc0b44431c20be0636a21ec238436fafb00000000306c038de5c583febcb09b55f527eaffe177acd9d118e8076f61349a305e902c000020306c038de5c583febcb09b55f527eaffe177acd9d118e8076f61349a305e902c208e8e515f7025352e7c608479e413beacf0d95cbb964b47e4a98fd27b6b6b628a0e1e7fc490e774db8c9100bd196291d79699001e24000000000034d41347fb6598fc0005e69901fc0005f6b801fc0006573c0077d7ce66a12ce0c43ee6b3b9116649dba376cbeb77d7ce66a12ce0c43ee6b3b9116649dba376cbeb1e7fc490e774db8c9100bd196291d79699001e2430052abb8468545b0593010c326d358cec47a3079a36c6f5002b2c36fb45aeaa6ef00746d0e73697fef01704d51d8704940000000030bd48a0fe09f6d72a94df8ca9d58e1c9015dc218685f17e2f711a1c8fd3c3fa00002030bd48a0fe09f6d72a94df8ca9d58e1c9015dc218685f17e2f711a1c8fd3c3fa20ade9aaa50015e14f1e50cb83348552efacd55d5f4198c837d8b6e01af95e510501bc1b78aed1c8dde1141a1880702373d656b7e7420000000000235a9f29fb4e1ffc000bb3b40001fc000bd20300941e9b03a9e4597551f4335ad9b6bd400313e19a941e9b03a9e4597551f4335ad9b6bd400313e19a1ec5c66e9789c655ae068d35088b4073345fe0b0300e2f8770da14ae4c8a45692c8939addbeed7a91b3006e827def586f427cc4deba43db8f89cffc5d2ab9196763671c1cf0000000030db7910ec759ca0b32c3ab934092fe50b1fe9af6fbb76fd5efd7a47eab53b7600002030db7910ec759ca0b32c3ab934092fe50b1fe9af6fbb76fd5efd7a47eab53b7620a4bd1cd4f0ade45f968839d7a0f661d603f7c02d2a1c6f659e6685d67d8d7e3b00358bb3c78aa69792b91f6e14efc4dac13b46d557000000000022d1ecfafb4e1ffc000bb3b40001fc000bc79c00a52289f61d0ba312a086112ba5fee4cf65057ccfa52289f61d0ba312a086112ba5fee4cf65057ccf1ec5c66e9789c655ae068d35088b4073345fe0b0300729c8e764d6566a66b65ab3b4467b5e463984c8841d6a93a869848958a052e1acea53bec6cfb00de6f2e0b8cb0491180000000030eded4041e2c494c3e5ae391331b4ea1dc464d50a34d76178d20fe9904d041d00002030eded4041e2c494c3e5ae391331b4ea1dc464d50a34d76178d20fe9904d041d204809ea7f6bb2e840e7a71c40e435edfb9618c79f822165c721dce537b7ce52c601f44f02a47f3e123e3fdbeddf59307407d1b272870000000000a747dfd4fb07cffc000241e10001fc0002433b008d2aefc27102e8b3f7615e419a61bc394fe83ba4ac1a700d32a6ab3f00aebf68573e26613e62a825d458f5157d91f4832e66eb8630ab3dbff95551d8300d731903ca090050801af45465c96d1248532819959a5a97eacb1ce518dcd5c5a21f20676d7c893f81ba672fcfb0f8050000000030fb0b68444a03b7a3a7f079f1445cab153962fdebaf77d9752cd1c08c816c4800002030fb0b68444a03b7a3a7f079f1445cab153962fdebaf77d9752cd1c08c816c4820a2805906f085aa712b452f8f05002dd3ae71648511dc6a88fe742bdf1990edf1006b827aec87ef146557c8528760f9240e747a8b96000000000022d3f475fb4e1ffc0006567a0001fc000bd99b007ab77c02d06ed94aeb677fbafdeaf0f6c0da49c57ab77c02d06ed94aeb677fbafdeaf0f6c0da49c51ec5c66e9789c655ae068d35088b4073345fe0b0300610fa6d1e213d65b653302ee8ea682b7c454e2117939ca77ee122a5cd8a387cc199ed1bc01d18641a05aa1e7ffe74300000000031a74f4cfe217fd8504e6b210fcdf12243828a67191448b649b648f7397da08d00002031a74f4cfe217fd8504e6b210fcdf12243828a67191448b649b648f7397da08d20520e51c4633d678e5ae07dcdeb878c950195be4f521e76a8e8efb802490bc7540105dbe6edec2480181164c7d62edf45068cc3e5a800000000008b3bf941fb4e1ffc0005e2fe01fc0005ef9701fc0005efbb0005d6c86082462b374e1eedaf7f53bd44e95a1f68c522817f1747a9922db608af9f16503bff07798005dbe6edec2480181164c7d62edf45068cc3e5a83082f48df5b39fac4fe299c0741cdf675eb53aa0b936ea147d4883b650596887142e4fecf91087799de85312aa47c6d60100000000324443f3ffc7b3cc689194e0a0acbbcb943482010e6ebe895e3ccaec58525922000020324443f3ffc7b3cc689194e0a0acbbcb943482010e6ebe895e3ccaec585259222018929b9319a3c5f73c75d7696fb45a41da8842a9a1df4a94b6c7ea5ce5e4696200e405f89a110cceae2689f59d7eee20122e7b23d50000000000235a73befb4e1ffc000bb3b40001fc000bcba300c04ced284f6d465e579d8e64e9eab9c0852c0766c04ced284f6d465e579d8e64e9eab9c0852c07661ec5c66e9789c655ae068d35088b4073345fe0b03007cbeec33e4aacfe4a2b4a29b60a7b702bf3735bf48fbb86a2ca883c949c0d2c84b26cffd564411041ee5218f551ce2b0000000032f66942ac8ad4e5d6552e1c22d990c8663deedee1b0f79783ab4ab395f5652c00002032f66942ac8ad4e5d6552e1c22d990c8663deedee1b0f79783ab4ab395f5652c2034ba66b442a95a29eb695c36e912dc00d958f0a7f2ea178d8f8081115c0af1b6004ee9a0820126e33f0b27f53b37fec69d0322eb86000000000022dda8affb4e1ffc000bb3b40001fc000bcbaa009eebe57e4f2f24ec1aa880e2ea00513ab416e7339eebe57e4f2f24ec1aa880e2ea00513ab416e7331ec5c66e9789c655ae068d35088b4073345fe0b0301368e69be7748d2e13f6e6addd0a775062a856a9333dd25a1ca0662decf7bb98a2f3181fa53598fd387da63b5704250500000000339358bbca4d00397e0b4fa1fce5b7af195a8e8e14e79e75a91dc54ca34fd2c8000020339358bbca4d00397e0b4fa1fce5b7af195a8e8e14e79e75a91dc54ca34fd2c820b8ef3ff343c38e2a71c8be729700db41bfeeb0df9e57b48534227c44f6d53db600038ac68f188a776526681ef676fb5d6404d78b4d000000000022ddef7afb4e1ffc000bb3b40001fc000bcbaa0073f6d493ef502c02f82678f82b2d834cb361254d73f6d493ef502c02f82678f82b2d834cb361254d1ec5c66e9789c655ae068d35088b4073345fe0b03083415bb44cad9fc44854254a6bba65b7b34f1226bc3e844685e7e62cd6f53e7a6dc7b12d1fffbad7fe0c135101408d320000000033c82292c562fca8cd876144b725bfab4be9975cd54a5f7903663c2ee60d49fe00002033c82292c562fca8cd876144b725bfab4be9975cd54a5f7903663c2ee60d49fe20e597f8e67bfb6955354448b6d50e77ede36dadef2c313f79cd42274fa195eea001a7283956624e1d51147b90106872fe169291f4e50000000000235b9986fb4e1ffc000bb3b40001fc000bce2b00607f9501a1545d0aae13127aa475a3f25c6d8458607f9501a1545d0aae13127aa475a3f25c6d84581ec5c66e9789c655ae068d35088b4073345fe0b0308800a5f9efc7684c4fce24f11c103b04634b52d008e0272d89d9105d57e6fd8c4079e6a8331f2cc2b8f36b28c4afe3f90000000033ef407d7aa49e2e929285bdbd1dc6e4b8e2e423e0e0f2b28328ae8a8ffbeaea00002033ef407d7aa49e2e929285bdbd1dc6e4b8e2e423e0e0f2b28328ae8a8ffbeaea2084b5cee14786065b3efe381a9f7e0619548c5fe19e68d20532a00b262f8c72e3013b4bdf5074ad4c48e2669cff6b8b5bc260919178000000000088f471a6fb4e1ffc0007e4d20001fc0008df3b00f019d6736feb8fa148524c0b3fa3af0da39ae5aa4f9406e645e1d2a24f68a29124a5ed91782c9208598120ebfed5f9197261ee352b5029f9cacd5983300032db28dfb209566356ae396255132f8f8e412d6a59dd5cde82ca347f4fb2a4713d8a49dd2dd9b8019bc2dd3a62745a0000000034f19e4ac7e1b2abbded7fe0d19991cde34eb7797d8e81fe01d6e73db209718000002034f19e4ac7e1b2abbded7fe0d19991cde34eb7797d8e81fe01d6e73db209718020cafd1d29a6bfb5294fb789c8226d61a2f4b641964f2d2483fe880ebb5d6a506f0176a4e499430b47be702257744898bb3d95e06799000000000003144612fb2713fc0003ac100001fc0003b5eb001dc640b7e408921b2c99d18ec5bfee69e61d85b61dc640b7e408921b2c99d18ec5bfee69e61d85b64217790c6c0655795f7c3d47e42d94c9dae99d4b300fb7164d86058e2b22c4a6f6917714dfa4a2cb4d54bebbf3c9300ebfe1759b33d15b0b68e32999aae19bf0dd92341e400000000036c99a74a4cfec77b2a7438558a8ec53ee09c11833597c1b601c5b00c93e37d600002036c99a74a4cfec77b2a7438558a8ec53ee09c11833597c1b601c5b00c93e37d62002b0140755817c6d71787ea5004a1342bcf6f1ea8626eee46ab8affd15a5fe6901c9d30aa841c8e37e16f8095f20aaeac9869d26d9000000000023af3e6afb4e1ffc0001e72f01fc0003707201fc0004053b0052b7f1604d249547c79a4056b2969ef98e816aba7509e1003c6e1b4f64a954ba6297e4554f3e7359b508db53f0a3f072b00f579a86e813d6af2856f3308f2caf4cf1e01130aa6bcf27784bb36a2b4daea4ada3be553c9b709afcc752d0f34a0c35e3301e8f6a2fb3ca44656be20000000038f8cc9f9bbfc0ea0b35880a727940037849db6f717f146392a2bc3e971a6f6100002038f8cc9f9bbfc0ea0b35880a727940037849db6f717f146392a2bc3e971a6f6120a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e4790853e3887a8aba03562d217ed6db4fd74aefe82000000000022d21ac3fb4e1ffc000ccadd000000ea1e4a53ffa1572af733c63b530860885f9c8ad8ea1e4a53ffa1572af733c63b530860885f9c8ad864f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730897fc76b69f1ff4b06535e7a4bc7396fb66b33194effbb72214dbefc2c7cd3220ab6cc39fe4630a513879f9f8dca27e300000000393936246926976b4135b6dca4295f45dcf95c875422b70be451f2d51293c7d4000020393936246926976b4135b6dca4295f45dcf95c875422b70be451f2d51293c7d42096e4d1ef906cdfa4084e2a8dfe662116ad8fdf25b395ec355602edc0d72eb8ea001feec80a8a9f80fbb419cd7e118c67524156f51e00000000005fb3a457fb4e1ffc000532300001fc000533f400e8ca11e6c7d6a9e15b9676b534663298040b88b7e8ca11e6c7d6a9e15b9676b534663298040b88b7c66ab236698c66f559ac918689cadae4c8aff0f630847383710ac1786f020769809abad8f93018338eb855c103f5239d75dc2767770eb45709c895c99c0c86d375ddbe478d000000003971dab9691efac06e4ce7a5483131373e84726458924fe48b7d541791693be10001203971dab9691efac06e4ce7a5483131373e84726458924fe48b7d541791693be120926c6d0e0ce17a51dadcdc5be4f4cce0175d8d7a147e294580e3080d6a22f96d00e5cae595965e89fa9f94152f57b315ca504ee1b300000000005c3fb0cafb4e1ffc0011098b000000b29a8f14049a111260586f489d72cfea1ed8ee5d492df4065de3d5d44692934635d826255f7a60f80e7e48253baecd886fd539601fd5e95efd61534d30b92d4ef819fe283a307e6bcd500d8cd35e9a7b779dbca59bd3bc77b3bb3611c370258aa6dec13d0781e0b53c911bde08000161c274080f47a95be5372ef8c69bb60ab1d4ca8201fb8f3001fb05a339741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a00012039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a20593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c0826c998cd53845caec6858f3121e5d3a88df6c7a3000000000023a390e6fb4e1ffc000cf99e000000bd9857229d4c0509c753afc85d264fe2e4f344a3bd9857229d4c0509c753afc85d264fe2e4f344a3c69a0bda7daaae481be8def95e5f347a1d00a4b430b6693296894820bdc3c0ae76f357e544847f10a68f0046f53745370dbe861d57e194ddaf7ff7d5e73cc3f240515c448e0001ec7bf3b9bc72eda38c80bb7cf16e294e763e56b401fb8f3001fb05a33979cfb79c4562e819aca69ffae2ea84b9b8f29bd89bdc68be67b88c6f31bf990001203979cfb79c4562e819aca69ffae2ea84b9b8f29bd89bdc68be67b88c6f31bf992067a0592b5510496cb42f2d784cc3b933a0156b10c8b54e440673bb87c57dbb01011353eea2d4fbc06aedc288e493b70de32b3e977f0000000000adc777f2fb4e1ffc000d5e0f0001fc000d5e4b00d8155dce6238737a6af04e068bd92048e68a7f51212e07f7407be541b585ff0a8225fa1afbcc9ac8dc82946c9cee9ab3e8fef5a5d641a57bdf1523c030a73d8c1e640d29e2257042a39bbbac8d867f69ae252e146884816b98ab0d0526ed4992d9cff22ef04878423f66583382000171b5c04007f6af71d99893478feb52df0f5a770101fb592501fb592639a1339d9bf26de701345beecc5de75a690bc9533741a3dbe90f2fd88b8ed46100002039a1339d9bf26de701345beecc5de75a690bc9533741a3dbe90f2fd88b8ed461209b9054ff7839b940277b8eb8211570b2f16850ef729ee635e24d722fbc4a462301852d4f5bcc34685e3583dbbdc92e9bedd3e985a60000000000c6c74af1fb4e1ffbfb1e01fc000107bb01fc000134f400891cbc8a94fa7fea64ca9994870dca0f75bbd075359c348a574176c210c37a25d4ffd917866fb0a3e54445646929fac8b7d6c71715913af443249784300efda51589f86e30cc2305e7388c01ce0309c19a182cf37bced97c7da72236f660c0a395e765e6e06962ecff5a69d7de0000000039b88e537c795f0b093c951539695fd4819a91a542b247ebd3a0ddd6a4c1c43900012039b88e537c795f0b093c951539695fd4819a91a542b247ebd3a0ddd6a4c1c43920bb600d779c7be93a83b9d7878fb38b0b1b7ff1390b231c5da8136b674cde822f01fd9cd0a5165717d4b3a17afddc669f3fd14efbb5000000000082a2e172fb4e1ffc000ddfee0001fc000e0d6b00f5cd552d14676526ef325757eddcfa285b15ac34bf951db34349385992e0303f21fd7240e44e4b0222319c7fcaf88f86259ffd3fa8430e4665f2e1f53090d98ff5c2f2970197ce80ca8cba9431f7dd7cff5d9fc9c4e99c2ed06e598f273d31dad8d8d05655c8b04599495cee2300018e976c7a2f79745d70e41aab1e61cb5f4db4323c01fb682001fb01bb39ec834a6c7ac5ebf5fd885a271e2149099e87e89a9ea30f573b4b699b9399c600002039ec834a6c7ac5ebf5fd885a271e2149099e87e89a9ea30f573b4b699b9399c6203eee0b9d7239564719e9ece229505909d518b38defcf16aa286871b5d6afae03007e345d48c4d9a24dfed5f23ce04963868ae7bc3e000000000086d10280fb4e1ffbc4260001fc0001962b008b7355042f324a44995bb21f9b68d63e4ae3ca6b959ccc5ac3cb8830eec83a7f15d433ac5452d425b2334b22379811352d9988876a6e586d975e7329300617fffba2681e4712782d97b84cb41b722d56089c3f3b3978b8724cb02baf0f67a57e8d1e2f8227d21700f7b10230c4000000003a3e75555ef79cb77c55684587b65a9ef728efcbb443b46fe2e7ed3e660c4a660000203a3e75555ef79cb77c55684587b65a9ef728efcbb443b46fe2e7ed3e660c4a66202cbbc61af11fd5c13e19c53fe37aafb9ec1793a6682273ac1c639ebdb605d36101f8bf45c29243a614283bcb7e6ba1995124d670ce000000000067507615fb4e1ffc0007ca830001fc0007cac3006dfb5ed0a495b0082f54056634d8bc1431d4f00f0aeea2780fdcce25eb1ff50c0edafd09e0397ec1201d032a4c937947e7d6469d39b2092dfcaa0b723087a55d353f1c76f34d45486140b3242762e03d9f688b7be28be4389f552b7a057e3a014f7f654cf7da7260b5ec1c15e5000000003a541549d161a0e134f54db0afaee615530bb6d84e353b82afc9af76a9a393290000203a541549d161a0e134f54db0afaee615530bb6d84e353b82afc9af76a9a3932920fd9f12dc7a00babfb75867303b9e99bed0d2ad149074350c4659612c0b88cb5b00d488c9d5bc5de3c5b9190fec92c5b37e705ce3f700000000008b3b2314fb4e1ffbc8a50001fc0001197c00abbbe06cd2bdb3615599a7576dacf0cc3cad128728c20f725ddcc44c5d6c728b05b886805ca125afd488c9d5bc5de3c5b9190fec92c5b37e705ce3f7300a97f109f81f15cc0b6af0a57ec93cf9f201789fd28494baf1840594d4bb233cb790f4ba434c49ecb6a1ebba61beec03000000003a80d01eee0c4b79f9de8393f0260fe859677b6bda207a21fc3217a9ae4b5a030000203a80d01eee0c4b79f9de8393f0260fe859677b6bda207a21fc3217a9ae4b5a0320035a4baea91732fc217a20da6b7b6759e80f26f09383def9794b0cee1ed0803a00cb3b7402b0dcee772112cfae17e12cda1eae0dd600000000010000000000000000000000000000000000fc000194d001fc000194d201fc0001a33d00e3f6150f12df79d8bf1fa5513edcc000b93d388ae3f6150f12df79d8bf1fa5513edcc000b93d388a2c0be6e924cf853fa531434308f0c389449ec73930000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003aa33cbad1659ba0bdf6530b5ba543592e2f30c5a35cd89fac77604317cff0f10000203aa33cbad1659ba0bdf6530b5ba543592e2f30c5a35cd89fac77604317cff0f1201927dfd5c8e7396db11536e478f4ccba1a05c7cbde3fcd5c2c98eee94178916d01cfc20de0654c5bb2318915c8f9a3bc3395f84e64000000000074cbc88bfb4e1ffc00035a160001fc00052a63002576863b75bc6a1861ac0a2f0e18ab0d373986b5e5abcfb8f638610b4b5ea0b23d82db8e7560b4003b9fac2da702d7161a178f359f98f0276d9556b1308130957c5939cc5aa59a9d7ebb88a03c8e60175230f87927f9485d452f6c844454148d8efdeb9e3216600b7f6645ecb8000000003ada735b7fb780232ed20e0a96d293385a0793ab7c5c360dd356c98192cc290a0000203ada735b7fb780232ed20e0a96d293385a0793ab7c5c360dd356c98192cc290a20a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e3154cf88c4f4815dbbf2a3912e55b1bd7d84fd8a800000000000235b9d1efb4e1ffc000ccadd0000004c58fc64d6bf36b4cd655f04a3e35ddb1ed7a48b4c58fc64d6bf36b4cd655f04a3e35ddb1ed7a48b64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7308c290b31d2e878c2d7235efb0c61f423aa37742a31318e61f8bb0bd6c110a892dc244512fec12a8b0fe7cbb08e12be28000000003b056202a743c16d86aff2f8ef6cf5d402e312f70740b9ae20ae92e47f1de1740000203b056202a743c16d86aff2f8ef6cf5d402e312f70740b9ae20ae92e47f1de17420a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e2945dcbb68ad19e70cbbd741c61b2267e08ba65182000000000022de150efb4e1ffc000ccadd00000042d81ce6e9a394d9a408d1fa828a8bb7bf84d17342d81ce6e9a394d9a408d1fa828a8bb7bf84d17364f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7300d9ee7b7e66124c4b047e1f93aed5a764ed7384292737ea17f3a7e429ce3f24d602d54b97f72d181b6f093da9b3ad3f5000000003bed128ba5c04b627627cf5d9f1dec0622caef4725d8d9d4c37c65642dce92ff0000203bed128ba5c04b627627cf5d9f1dec0622caef4725d8d9d4c37c65642dce92ff20ff92ce2d64657cc3d4d9d82547efca2206ec1d9f5dcf2776624bc0a58b12ed3b01cf2d268921dbfa2c604c708275f79623d67b0e6c0000000000ae22e973fb4e1ffc000cf13801fc000cf17501fc000cf6e3009c543dbc00467b9451f2e47e7c6f01f7695c0451ce7f101b7f075273c892063b1b8571311737a5767f95c0f808aff27883260bfaf9cfe2b84519a6b2308c9c5c77fe321ff0a115d1ba5bf7462063ef21a82ba796415f4ee538bf9e8a6a49707530c72cbb6b60026c46ff1b9443000000003c7e5634f8fd8af476905ba2e94db5d6b46c41b22445382bf949a71cd16fc18f0000203c7e5634f8fd8af476905ba2e94db5d6b46c41b22445382bf949a71cd16fc18f20a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e15241e1813fbd233ceb15a094365a689154d9b9a0d000000000022ddfcb3fb4e1ffc000ccadd000000055d0c3a48dbbfab9fe7e77aaff5818e4d5a0ef2055d0c3a48dbbfab9fe7e77aaff5818e4d5a0ef264f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7301130b42d6eb505e811dfb18ff87c4bcacde56b76a7d47a8db88ca26e75f5c2eebdd767d440f375784f9d1f127f57c977000000003c99840d0c2ebb37b76a6a9dce2b876822ef969f7c2dabe67f0e7f071f2b03180000203c99840d0c2ebb37b76a6a9dce2b876822ef969f7c2dabe67f0e7f071f2b031820a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e448fa93403837002c7b2d0de6c44892051489928ac000000000022dd6633fb4e1ffc000ccadd000000c682e285e7a7bd65e9268c1bc695091eb4ce5a8cc682e285e7a7bd65e9268c1bc695091eb4ce5a8c64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730121adeaff038746afb470b84fb3a58f1a3bf304cac771d16980845c4902e5da34d366394c8e84a46d8bc0c0a1da23cc6000000003dbb7de94e219e8f7eaea4f3c01cf97d77372e10152734c1959f17302369aa490000203dbb7de94e219e8f7eaea4f3c01cf97d77372e10152734c1959f17302369aa4920b23e38fe428255d0068cc218c2c831e3bfc87c8249f3cba941e126053fd73b8a017aebdd020a3c7d9accde7db5d32c6a06d4c8ee9f000000000034244094fb4e1ffbfb9d01fbfe0d01fc0001195600ecb1486be55e4301c45b87cbad94daa8c5d17fdd6cc4a7bb877a80c11ae06b988d98305773f93b9856bcf3cac49235537d6ce0fb3214d8850a6db77730139b654f0b1c031e1cf2b934c2d895178875cfe7c6a4f6758f02bc66eea7fc292d0040701acbe31f5e14a911cb061a2f000000003ecdbedf3d9a13822f437a1f0c5ea44f290ab90f7c3bb42c1b5fd785b5f9596a0000203ecdbedf3d9a13822f437a1f0c5ea44f290ab90f7c3bb42c1b5fd785b5f9596a2072f157ae4a1ecfc6aceedf008abd5679ec9731abfa05dca49eba50b1c0b6ba860021a6e0e4828963d5f39e3129bbd9e1af873671e700000000006c3dc02ffb4e1ffb1c6501fc0001f46401fc000532f5001bba3b56ededb76c1834f3b3e02c159aba4777a61bba3b56ededb76c1834f3b3e02c159aba4777a6415e1236ed7df54649a880d353acb6f9ccdc622c300634f8b926631cb2b14c81720c6130b3f6f5429da1c9dc9c33918b2474b7ffff239caa9b59c7b1a782565052232d052a000000003f43ff3539e5a4fbcc88c7f031a544fe7e62557b5963cb7e43157ef73abfb13d0001203f43ff3539e5a4fbcc88c7f031a544fe7e62557b5963cb7e43157ef73abfb13d20476ad8662b3be5582b98569b76f66d2eecb59a943e9fb28bcbd23a10d53817bb01127e174ed242c758d4db9b7d5b19c1e0743728960000000000b29d5bbcfb4e1ffc000de50401fc000def0c01fc000e366a008ee38b4c9c407b21612862db1ac4e98a6edacb4b62026629f37f587b1dc70ccbc6732225803db4e3ecc3795b4c3e8c5b840dbfa092df1395237f2f8a30980213c5fa8031aff096b8a3eddeefd0584a0e5c2492f631ef67941e082763250e2615975db1f1bfae631f80d41d839a000100120432e9d299caad204ff1ec0c515babddc28601fb8f3001fb05a33f669abeefbe8527a5ca342037f8f97f5e6c8a65f559936abe546601efdab6030000203f669abeefbe8527a5ca342037f8f97f5e6c8a65f559936abe546601efdab60320106da0d689007410d07536c59586b62f5507aec775cc2a9cb4b73de8b7681cca0091c213cd9929a245bcfc03a9add339a210101ea3000000000022d17c70fb4e1ffc0006567a01fc0006c05c01fc000bdc0b0012e05b745751ccacdbc852c12ab9c3b9feb5b77412e05b745751ccacdbc852c12ab9c3b9feb5b7741ec5c66e9789c655ae068d35088b4073345fe0b0308c6eabbfad80e5acfbaa7a4fc148317f52d80d4249b62b9c3b23ae8592cb7306e798cda7c90dd366ced083618fe2bb8c000000003f960fd8d414906a260cd07db16f743f65306823355b61b5d3ad4bdcf91845490000203f960fd8d414906a260cd07db16f743f65306823355b61b5d3ad4bdcf9184549209c8946bb69fa334913c78c08bcc2ce898861e57a316b6edf4b3f4d6d8de49d33013f7a3f24310795b901908ce57d40dae9d09dc59100000000010000000000000000000000000000000000fc000196f301fc000196f401fc00022899007118238bc3182204c634d9035a968e9b59cd11971db884e38658de13612ec46d636c67f26d3c43ab771e413eefaafeea2aa4c0ecf2fad265164e83f330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003fe25a5d51edc1942b3e68170fd693bf8068968ca6e1be3a1721bfe5ac8416420000203fe25a5d51edc1942b3e68170fd693bf8068968ca6e1be3a1721bfe5ac84164220cedb19ac5ae1a42eff8e7bc39aa68803f6828db1549bf1f17f041816c961f8cf0163df30d171377fbf7611b741436a40d70969a98a000000000086d15a70fb4e1ffc0001aa9401fc0005f08501fc0005f34b00d71dc86bda7e222f78c9e45f22deae9437028650d71dc86bda7e222f78c9e45f22deae94370286501bc18ed01b8e3a9f78a209e7eb7f07edcdacb0ff3091386d3acee0bf9044cce40a07515289589b68fc9b8c8e5d184471ed7982106b1e11587af4c9e983883baec00b67e473000000004008a18371798ba28da7c9a581daf0aa92c4ac0b980c3438936823274f64dfef0000204008a18371798ba28da7c9a581daf0aa92c4ac0b980c3438936823274f64dfef20efdf644f2723689338340c980bacc492aaf0da81a5c9a78da28b797183a10840019bec606b655f5b5bbd68207755e614a79dbf4db30000000000a5e30a44fb4e1ffc000123a90001fc000123e300207d0b14af27f5a735cc27f37c29428f99fdc25c463b7729308cbc30c9c199ccee5a77921bb0ace59bec606b655f5b5bbd68207755e614a79dbf4db330121af4d4c49a65e1439a27ce0f39a2eca5ff751e9998c0fea7a3c2b13731cfa47fc6a56a313a38b448f3792fb60dc11700000000400c7f8990e6f8a3993b7d5900ea0b58e18bf86ba9b147bdefcd0df4cda1887b000020400c7f8990e6f8a3993b7d5900ea0b58e18bf86ba9b147bdefcd0df4cda1887b2017808983e70240144c4c811a1c3404d9d2f1395dc937dd761dc437d80e07928401d45a97fcf480feb7b262a80eda5b78a2a1a0621600000000005911296afb4e1ffb392101fc000124ed01fc00013d4b00724befff5e89d92cbad3cb0cc8281020b0243bd8724befff5e89d92cbad3cb0cc8281020b0243bd8d45a97fcf480feb7b262a80eda5b78a2a1a0621630848bfbe1bf50debe1322e14c9115adb3b96e5b8a3ae96beb7e2161281d9e56c30e43478d6f39835e3533a1c54377258b0000000040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d00012040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d20593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c02024eb44eadf4a67de93988f1400bfd5fd6fdbf830000000000340ae50bfb4e1ffc000cf99e000000f37ebd7e83f4185ccc5fb617a7ac9e09c11ffc12f37ebd7e83f4185ccc5fb617a7ac9e09c11ffc12c69a0bda7daaae481be8def95e5f347a1d00a4b43082f60dad4b7b498379d1c700da56d4927727eab4387a793b861a96df47bdabe5666c270acf04b5b842ab54045bbf102a00013e8b10646ee9d6c28d75c280b357dd3a9ae9f96201fb8f3001fb05a34106bef7acd1243652495260325ec3baf5bba47bb6e5d934c67b96bb24e3af1c0000204106bef7acd1243652495260325ec3baf5bba47bb6e5d934c67b96bb24e3af1c206658709bcdba4349bbf6d9fad0c66006993521ad1b989113855bf751a5ca1ff301f153617d41645e0e25985e35c09f98960f1863dc0000000000c3c91328fb4e1ffc00044ff60001fc0004c9730032b8da1c9e22be858fa29f61e92d6d48eb84e27032b8da1c9e22be858fa29f61e92d6d48eb84e270f153617d41645e0e25985e35c09f98960f1863dc3098e7dca1b8dbcfdc54faff65b94f81f2e3fce6440bb10848d434a96ebe30ccbb33aa586a2d0ddce112e38cb09bbf13c70000000041c4a6b724a0d25cb089ef946b7c1985a2815bc6a4e45f15bbcbd445b6d10b7900002041c4a6b724a0d25cb089ef946b7c1985a2815bc6a4e45f15bbcbd445b6d10b7920a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e172c58166b1f9c8d9f67b86e3812f98d4bfd86404b000000000022dcbbe9fb4e1ffc000ccadd0000008164fcd1a488ebde9344cbd205ce705bbe3121808164fcd1a488ebde9344cbd205ce705bbe31218064f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73007df25a28955c903cc19f836a4daa0842d203cfc0dc5ae9b57b8246a4787ee4c98ea3f2586203315d61f4e77b6c80dc50000000041e41c6b6e1b1c43e73c7644ea36eb622bee149ab05693ea487e784614e524fc00002041e41c6b6e1b1c43e73c7644ea36eb622bee149ab05693ea487e784614e524fc207a644e33e16840030e5170f7e07877c4f992de0d330c7ba1568a651edc3c4cbe012c72148f57b165ac7a3a23d0a28ee3baa6675b8f000000000095f8331efb4e1ffc00021d3d0001fc00021deb00df7e1106ceb6cbdd287af2c99fad3d0d9181ff127efda5f8279fc8c7490aa37ed57903870a1f4ee1fd5780dec499c5f53a4222c6e0a5e3bd74097a043099567cfb20c6bed5d20638c31e7e512aedda02649e82f2b955ecd3e34f73c2229b350069f6e74a4304acedddd87997fe0000000041fb85bb67981f4e1fe41e0f7d520bf6df2167c9ced5e51fae33343f98d9cc9900002041fb85bb67981f4e1fe41e0f7d520bf6df2167c9ced5e51fae33343f98d9cc9920cc86f090d7505156acdb61b8b997eac5cbc5c77e72fd3c04ccc0a01a77183f210104b4bd6b5d6e830b55249ec9858328a1a1f504090000000000019f8febfb4e1ffc0002f8cd0001fc0002fa840040374e1c147337992d41ef2dfc974f928bd2d5a607ee5dd8d1e99e4bc8e015d94346580d7cfb1c44aeba71ea426d63532121268dec246f833444bb33308e53b8ab39fcc259aa22b93d1ab4e333353e6d56b9bd4d194985a59e0de5060c1225588a256569848ea421725223711b00000000422456a81d1601f5aab4494d935919058905ffe2dff342e8be1345f5e5b46c51000020422456a81d1601f5aab4494d935919058905ffe2dff342e8be1345f5e5b46c5120f9cdc515389213075782c4f03fad8a5010b7aa4165b804fbb1caae54c1c0f15701e1e77f1b5b7d2696a2836aee5e97b0eaaafe9fd000000000009b8aefd9fb4e1ffc000533b001fc00053d0d01fc00053fdc003d88e6f4cd4c285f48dadba815f581acc2e2df7c3d88e6f4cd4c285f48dadba815f581acc2e2df7cda952b3b45775c0af85fbe2e2ab21549d86beb0a3014f9192c3986e589f919f428c43770c3eca5c4ff3722d967d8f0d4b69ec3ec02fd876737fb06880a54566f5639389972000000004289460073f565eebd310b303cbc14fcee17c4df56a3b09e42888ded565599640000204289460073f565eebd310b303cbc14fcee17c4df56a3b09e42888ded5655996420d0407f4f9a7f087c1dd689e30783aa29dc3ed7da4b1b571dd314adac9baaa61e003b79244bcba351a570b19909002352062aa889ab0000000000235a990afb4e1ffc000bb3b40001fc000bce2b00f039342be55b7297da4170afd2df995d185f699bf039342be55b7297da4170afd2df995d185f699b1ec5c66e9789c655ae068d35088b4073345fe0b0309349d9598c25eb5aa9bc9d29c5c82fdbeefc73d1902ab2eee457b9898933a782f7db5676929c1cf3041db9322c06cbdd000000004292028ae9eb69f51d35a8a0f1cdd625f6dfee2a9ebc7bd4d9b7cb99ecc43f9b0000204292028ae9eb69f51d35a8a0f1cdd625f6dfee2a9ebc7bd4d9b7cb99ecc43f9b20a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e6ef29d62543892b99ae4398060c478dccfc4ce432f0000000000235afc03fb4e1ffc000ccadd000000ecd8bcbf77d0dae7f59c750bf68d5d33a45ddfa2ecd8bcbf77d0dae7f59c750bf68d5d33a45ddfa264f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7308f70ff352844250e267b31c0ddb83dffd4cac43532194bd47cbabf410ca29fa7f1ecec08c8fde8c0d13910e903016d5a00000000429e8599b012fb642220d2308c8747d148f14fd3d92e169e5a5bce329853ef40000020429e8599b012fb642220d2308c8747d148f14fd3d92e169e5a5bce329853ef402003bdcb9deb0c0f2f807aabe0edf471a0bdaa803cf56fe0e855c2e60c119ee86a011574764041f46b7e8b0a3e77991a49c39f2f47f900000000003419c8a3fb4e1ffc000bb3b40001fc000bd23300f9c8a5855606a8895a4e3efaa42d987b2b7aeb0ff9c8a5855606a8895a4e3efaa42d987b2b7aeb0f1ec5c66e9789c655ae068d35088b4073345fe0b030814562b9c96db22a34d86e5c8db1fa30cf322fc3ccf743d5253f37e1cf09fb6347cc57bdbf221f076bf7c818caeffc430000000042a6958a544309799f965d193372baad8f38120a117e3700ad2d62ded1ed440800002042a6958a544309799f965d193372baad8f38120a117e3700ad2d62ded1ed440820c3448a2225a03a273f6a972bedb320c0eda40dfc46a11cdca62edb64212e1f3e005f813b236a6fbe45983588d7851c9344abe32d9a000000000023a67a3dfb4e1ffc000bb3b40001fc000bcba3009b6fde4a7f45246abc4d043aeab7c7d35934580e9b6fde4a7f45246abc4d043aeab7c7d35934580e1ec5c66e9789c655ae068d35088b4073345fe0b03091b5adb32d0031219fb93e5e8b20219b07b8a7860770e7d8935fcaa32ec36d75458180b71fcbd20a808373a16dfe972b0000000042f67134f85223da03fd3a670e68802d959ec1236fc6317b855d7133df4ee59400002042f67134f85223da03fd3a670e68802d959ec1236fc6317b855d7133df4ee59420a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e3054331ff5356c8a834bc40ec241aacfae8bf5c54e00000000003424147bfb4e1ffc000ccadd000000bb34d97e1f0a6406ea00f10eaced5e3ef227a5cabb34d97e1f0a6406ea00f10eaced5e3ef227a5ca64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7300bde30ce81e7c6396e334eb1bd788b683535eefe9911286bb42662c46e3712ddb5c7c24d7998118ae089e804e14efee500000000431514b6af73d8a20f06ce90b838acc055d749d77762adfb29a918dbe7611352000020431514b6af73d8a20f06ce90b838acc055d749d77762adfb29a918dbe761135220319b982bf533a97290333d1a2dbdc0e5d516bd1c2add8c0eaa6d248fd26d732d007a4bcc5bcf61fabd62a57eae55f427a8a1fb8800000000000022d8f465fb4e1ffc000bb3b40001fc000bc7cb00e921c4edd1f6b892477f9b5eb39a324aa6e5839ee921c4edd1f6b892477f9b5eb39a324aa6e5839e1ec5c66e9789c655ae068d35088b4073345fe0b030981f8a7f20ae3ff84c15f27a7157dc2e4935e956ed25166035e012ecd7f0885d961564111704303642151aa6fbdf34f000000000436f16038374090405c95464197b0a756aa8ec72137ddbd21161fcc6fc3c61f5000020436f16038374090405c95464197b0a756aa8ec72137ddbd21161fcc6fc3c61f52025ca852a8da0b2ff4aac4af3ae4088c7ae49c0656371511c187f4de7f1f3b524018bbebe630cc30eee2942c1f398fdcd8ec7ccc8cd000000000003d8c6fbfb4e1ffc000b21600001fc000b42ab006eb2e3cb6be0a0244121fcd374a5dd38e4e0ec33e7cbf5568870f2e301ec84dd720ce2d71d2ef6db3a840c9fab8a7618147fb2f3060fd847cf86f08f3007bab9e0cfd301779007735cfcd14445ef09191df5a8ac39aa177abcd56d20e46f7aff4286ca6ff02f4747c0534dae9a000000004393fb7ebb6fa9df7073cfa5bdd241f420520e1a50e6f3b6f9c436d578bb26e20000204393fb7ebb6fa9df7073cfa5bdd241f420520e1a50e6f3b6f9c436d578bb26e220910cf7ec24b21aa8582d11d9a17fc912cb0f9688e4426100fb96a7e08d3a712c0017c0398111d8169fa33a3eebfaeb34ac7b82109c0000000000235b320cfb4e1ffc000bb3b40001fc000bc783002fa548f62b9105adc27c7c69f93e32b395009dfd2fa548f62b9105adc27c7c69f93e32b395009dfd1ec5c66e9789c655ae068d35088b4073345fe0b03006e17d8852c49d0bf9ca9cb2aa16aadc523dcba6af2db6d774b3092f8522595b72564f777a8d60ad8ea79fa1c817068c0000000043e49c1f2735906dc298e133e1d22e8fe4a2a4b23e05e871deb6e99dd6a924cd00002043e49c1f2735906dc298e133e1d22e8fe4a2a4b23e05e871deb6e99dd6a924cd20e0afab253c2a299493acab401cb0ff85bde56b38d310e86627713c849fea165f0066ca67531d6cf56218281080a0a9903032bb0edb00000000003429c6f2fb4e1ffc0006567a0001fc000bd99b00bcb01d935cf0b393aea40d7f0b39f24f27f364f5bcb01d935cf0b393aea40d7f0b39f24f27f364f51ec5c66e9789c655ae068d35088b4073345fe0b0300c33a73d7e9ef598da0b1b9ad04b12f98da67f75d66f1237866fa64f4586a4b156a83e8c79b38139d32f452dee313bf600000000444d4d1e9850cf19adcf3aa6e01e8a198779eecc8d55fe8bc9715726efc58987000020444d4d1e9850cf19adcf3aa6e01e8a198779eecc8d55fe8bc9715726efc58987203cbfe25dc4f982ee3ce537123108745285809ce3d8e5f71c6049b1b328356808015ee12a27a3bdbea28f50b697200e612dbd4a249d0000000000cf9af29dfb4e1ffc0001167d01fc00011b9701fc00011d0b003cc1fe7d3423d6a9a847723ecdee0368320171ad3cc1fe7d3423d6a9a847723ecdee0368320171ad5ee12a27a3bdbea28f50b697200e612dbd4a249d30958adbe9f954ec23983c4be5788e86e0df30fed1d6852136376b49c1a24e0fe1da1178b23dec4ea098b9e355aba8de0b00000000445e313b262961a5244f30e02946445dfcb52420767688db8aaa6cb5f382052c000020445e313b262961a5244f30e02946445dfcb52420767688db8aaa6cb5f382052c20a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e4184248712d2e21cddf89379ad490e99dafabeccc20000000000235971c3fb4e1ffc000ccadd0000000a2d318258cf9455a414d2fbe30c69f5ce8d09290a2d318258cf9455a414d2fbe30c69f5ce8d092964f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73012fa57a5676925e8dfe3b340df2132f5844ad9f89594b04efa28fb4fb884fe21f411fa49120ed7a60ce9381a54232a1000000000446395517d8dc7a2fe06ffc2dcb5300c248a324b9bd5bd91532acd77eabb5d69000020446395517d8dc7a2fe06ffc2dcb5300c248a324b9bd5bd91532acd77eabb5d6920e51b139b1838d2b9b4bc77080544cd03c11eeb0c5b70f5af44f33fc940de433901a38211dfb24c64aedfd08760984fee730d6e60cf00000000010000000000000000000000000000000000fc0002ddd70001fc00033e4c016af70254b26589b80f06011b3de26f7fbf715b8e6af70254b26589b80f06011b3de26f7fbf715b8ea38211dfb24c64aedfd08760984fee730d6e60cf3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000447962fd8a1e759aea5e00d0272df10c38deab7fd410c916a2b77eee7276b047000020447962fd8a1e759aea5e00d0272df10c38deab7fd410c916a2b77eee7276b047207ebcb8e4c5a9e6837e65e818f89ccd6063c1c5c3604b073ab60015b7ea7f41fe002c491d6e81334e057e3a1fbf1bb18ef2b90fa19d000000000022ddbfaafb4e1ffc000bb3b40001fc000bcba30075c6a48d5a612acd4bd3feebe0f6da422f685de775c6a48d5a612acd4bd3feebe0f6da422f685de71ec5c66e9789c655ae068d35088b4073345fe0b0308d3a62107f6534da1933eae8fae34d5b2c7fce2a39672e9c4473323f90dd9cfb333cc4d39b45cb220460b63c1d11009b0000000045a9800145a0abd2b8f4fe1fed333f712091bc46b4c1a4ed4c21390ec2ddeab600002045a9800145a0abd2b8f4fe1fed333f712091bc46b4c1a4ed4c21390ec2ddeab620410c3c13c2080484354a44116a425a0582bca2873f9ad8e9e914eaa9962baf6e006fa76977109534ddafa6eef7bb017d4c3a882222000000000036da6255fb4e1ffc000bb3b40001fc000bcba300ddf3baa5c5a1d3992213b6780d5bb228d54c2928ddf3baa5c5a1d3992213b6780d5bb228d54c29281ec5c66e9789c655ae068d35088b4073345fe0b030808963d5165e95a9c68094c7ddf16300ce59f127e4555633603efa4e776b026819e534ec54357e25ab467c9859e2a14d000000004636ed7acbacbc76aba60aa7a1011688fe9ad5fd701d0bf8fc42a502ea3e65430000204636ed7acbacbc76aba60aa7a1011688fe9ad5fd701d0bf8fc42a502ea3e654320cebdbed894cf5595b08368bcaafa6112fa743ac8bf50ec4788f5ae60e7783ac0007733a403791a61f42a529fd3281758a248195249000000000086d10594fb4e1ffbc4110001fc00019493006a6434babd99215b4f98316b3f701ecb7cca0aa2a820f49ed49d977621b499c9fc344f28a9b1c0cbb2334b22379811352d9988876a6e586d975e73293083a6548569b0c410d7e1dec3f4f5a18a0790723a991d3b9477a9e062c660959bdbe5b3c1d231195801b9072ae94279660000000046ce2b4b45b41f52b9e634ebc3e8b37c3e1685dcf53092521050884a2dff406d00002046ce2b4b45b41f52b9e634ebc3e8b37c3e1685dcf53092521050884a2dff406d2013f4687763666394944279985ab891c698a9bffc567be7751a80488f98f0cd210189e26bbc182969b51b8d729c0196c0f7b29811d4000000000036caf173fb4e1ffc000bb3b40001fc000bd21b00f07a6a479a2cd5a6e130d51d128a8ca998d1b209f07a6a479a2cd5a6e130d51d128a8ca998d1b2091ec5c66e9789c655ae068d35088b4073345fe0b030870b84b1994be69b0dcfee35aa1e5d1042ab1407b1eb5622eef0fa248e562220695ca423ef6a41abdeff3d802d1ca2440000000046dbd118b9d9b138a5be20446ae3448e8c41acc8c28411848fc85f563090b19600002046dbd118b9d9b138a5be20446ae3448e8c41acc8c28411848fc85f563090b1962094aa08aaeaa7f1581edad08db7bccb4cb24055fe20dd3c783df878e8f12a0042001bc18ed01b8e3a9f78a209e7eb7f07edcdacb0ff0000000000a516e93bfb4e1ffc0002925d01fc0002aaf501fc00052cd300ad0d1c7493405ae2836390ada4ad0227c8278f39e3bbcadcc1f89ed98a2ada3473bde7dc618cf3a763df30d171377fbf7611b741436a40d70969a98a3097adf3867ae5155b18345e44e277ab26b9a497c7d0cf9b53bdc42362dff3642c922d1d10e277ce6bd407f48bfabac68b00000000484c56b2f30e7a223d5a633d19bb54100bf9bc8a1a6ed1e72ba86c9758558d19000020484c56b2f30e7a223d5a633d19bb54100bf9bc8a1a6ed1e72ba86c9758558d19205b016215386c035a42042a93736befccdb87c30cb90adc3b1279da58ac57cc1401112c35b14433e8a28f70889c6d8ca99095bf0a91000000000036b99e7cfb4e1ffc000cf8b101fc000cf93601fc000d049300f6dfd96165379ea02d0e5650085cbc5765d22df2f6dfd96165379ea02d0e5650085cbc5765d22df2c69a0bda7daaae481be8def95e5f347a1d00a4b43093b18f6658a9d0830057a2a0513c2f4bc70eb0c41df4346fc849170fe0b1374716d0d1ea24726fdce68636fe713ef44a00000000485d33cc5a823b6ed0ac345b93438ecbfc44aea7964ca95cfd998dbfaa16ec76000020485d33cc5a823b6ed0ac345b93438ecbfc44aea7964ca95cfd998dbfaa16ec7620a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e4c9d7137cc2ba84ef788209f51340daf53f40a2437000000000023594254fb4e1ffc000ccadd000000192cc27d195d1a06bd813765887587824d036b25192cc27d195d1a06bd813765887587824d036b2564f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73015f9da603c572257802a689964ca8f4d96f9b94f33ab75968c9cb6c730a28d50b7bb72ac2cfceee6ab0755ead9cb53cd0000000048c29275ad2ba66954b3ed4d58a29c799da0abcfbbd38da9646079e94610c8cc00002048c29275ad2ba66954b3ed4d58a29c799da0abcfbbd38da9646079e94610c8cc20d3ca56e9eb70d7e9a43a93f27446d29c9017bd3225905e50b1d56daaa6c515c10089ffce4da0663d5e5ae1a930ca9f919b8e7500da000000000088f459e2fb4e1ffc0005e0ee0001fc0005e26b004188469fff56b20349d06ab783d8e44b7e698a734188469fff56b20349d06ab783d8e44b7e698a73776e544e9097c2457f74dd5bf1ee545643d2ceb23090dfa669abbc6504966bf8cc2b4971db18a5052b70475fdd5e6f427349635ccd6b9c7869b52ff3133c5661412ea5ec130000000048eb1b545d87e712edb1382d8bee300aa0bae80bfd0c347920f4afcd0ea34b0b00002048eb1b545d87e712edb1382d8bee300aa0bae80bfd0c347920f4afcd0ea34b0b2093e40ad62d5fad58ff996065d66ba1adde1f4c1d47ab9407614c98f8523d95ff00c8b1d47b6f0a98d16aadcfa32910b454024fb63a000000000023a84ebffb4e1ffc0002199b01fc0005007901fc000607bc0098bbc48b046bf66975aaec4bc7a1d9224d75c75e27ab63981bb3d5f5b0375ebd3c709b95174ec67a253cae727106faa4bf76b0b4f8375091889f671530051b1a638ba22cba300ba0836304586ba5572a525622c4dd49e7178214985277eebad66a371253163e35e93d3b44081b00000000493422474d55896888a6eb24804cf3af1d7479956d6706a44ed80aa5cde12af7000020493422474d55896888a6eb24804cf3af1d7479956d6706a44ed80aa5cde12af72054d645b1fba1e7adff0e213c3fb1de352e6f806fc7c5f9d0b716599b66c7261a01c940f123afaf075e70ab25bc4cbf59248e37e7e400000000002358395afb4e1ffc000bb3b40001fc000bd20300d40244c9f7115897ec1afb80fca9e5c7cbffa2e2d40244c9f7115897ec1afb80fca9e5c7cbffa2e21ec5c66e9789c655ae068d35088b4073345fe0b03007e428808a71ba6201f8bb0a3dd71be6de31816eeafb1108b3710e956db7ef5bcf2fb8bc9976a20799077a24fa847d660000000049f9818da1c1948ffbd964d593b7ef590031b794617e62587d984f61f2fbe20e00002049f9818da1c1948ffbd964d593b7ef590031b794617e62587d984f61f2fbe20e20a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e2339ebe0fa295b303b5b8aadfd91a64d75e46740590000000000235bef4bfb4e1ffc000ccadd000000ec97fc04493eb004db432813f88f3ce6e730baf5ec97fc04493eb004db432813f88f3ce6e730baf564f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7308c1cc0f5e0a5aea680a170ec945074f5b83d83db4d208854204f57c0de220ceb63b0121bd2a7bdb214228338c575ff6f000000004a7d3e011dcbe58192a8bee91d366c6f3720d8247a7dd586b8a50a0159eec9370000204a7d3e011dcbe58192a8bee91d366c6f3720d8247a7dd586b8a50a0159eec9372026dc073174dba917c013e7e0751c19e58fb1e7f86fcca485b2e96d2933096ae400986b9daca0805a7096a6c63e7873b66f6f49c055000000000022d149d0fb4e1ffc0006567a01fc0006c05c01fc000bd4aa00f2ccd30a71c62243bc1b85b0a7346be5b0365febf2ccd30a71c62243bc1b85b0a7346be5b0365feb1ec5c66e9789c655ae068d35088b4073345fe0b0308979c7c3f2f5778e536fa1136af3a024021cd7be5c6dcfc2d51e84091783a5b512b7f6a2c5851be08437be08d17199f1000000004ac3d41c3b2fb88c4e4c33b465ec1150b43522985fe221f18c4b91b5f7b43cdf0000204ac3d41c3b2fb88c4e4c33b465ec1150b43522985fe221f18c4b91b5f7b43cdf207523a0aad3ec9005879e0066cc09b41e57f3b9fd6110f99de7d485ad8f1f192b0143c1ba3eb8658a4a88acfc9842eef008612bb8a242c8000000b93e96c3fb2711fc000152b90001fc000155c4009b977ce8fb19c58e12c2da268990d358df102721208d9e4d63aa7667b7b67bebf81d9e58e2f4d464b88b7859dca0971128eca01438c8a22d7ff13b5f308ebffc014c8b97d9da8841464d3c7cd09b9f679471a068666c217ec13524ad7ccafa50eb18126c99edcb43fb74e290b901b88b7859dca0971128eca01438c8a22d7ff13b5f0000004ba9ca59a188bca15df2ede79db16e72f427d2f8b6f6786d82d4c64319411e230000204ba9ca59a188bca15df2ede79db16e72f427d2f8b6f6786d82d4c64319411e2320a9fee48733f80aec8d5fa07e467748169501c42f39b051f970827b977e4c68c501f74cd1f9e2fa05c4244dd2489fc836825e9f10d800000000000343bb9bfb4e1ffc000b2b630001fc000b2d1b00dc02c3b908e77a84a09427aaaf15c5256f5b458e1f69134183fab7568ebf7eef6c97f80b3ed603aeab2f3158075540dbf499033592d803e7fa3675a2308b7381340a3e266498248137c146a3c82e36c27c196bac05772dd7b22132912bcfdc1263e2761245b6871b47dba982a6000000004bba47ad7330a358cafe2890f1578f874006a68bdc7b786a7c1d440823e683d40001204bba47ad7330a358cafe2890f1578f874006a68bdc7b786a7c1d440823e683d420ca7dbad69767b30fe851c08c80df2cc8398bcc8c33df2d03bcb810485f3d8d31006e6c9189021b6e38326dff6886104054a110990d00000000005fd916b6fb4e1ffc0010871f0001fc0010874300bd8b7dede4dab5e22b84ee0f3dace1c1021add92c9924137fa318dbfca7cabf3a1127fc358acc74d6e6c9189021b6e38326dff6886104054a110990d308ebfddfa72f3140798b6c0d89190164c4dc569ffdd95bd1dd43e7f54f1405c1927b37b499623b4c806ea396bea40a84d0001b98306c317875b12fae8a85c85eb23269168981801fb682301fb01c14d13a8912d3119f1a9eea95d70a546bc449307af3521dd532c0ecb1ee5a494d70000204d13a8912d3119f1a9eea95d70a546bc449307af3521dd532c0ecb1ee5a494d7203df27e67f50cb6875d7b692c594939cf46afb84f80c3a483181a3235532c325a01c329e938e558a6f1a348468050a6a0a48f8468d1000000000036c8c8e4fb4e1ffb66b70001fb69fa00e855484a6e6f72f6f4793b80cafc202a981fe8c1e855484a6e6f72f6f4793b80cafc202a981fe8c14fc445e107964acb8baf2e91cc87acc92ec7fa6c3009ca23af93ce00a95bfefe790ffca791e093a8c0e79675b103b2a4d06f930433b3f6b15c83f4e2c4b5118fe0c27ca13a000000004d159f983d445130fff5ade93b05e01172ee4c56ee3c5b252277615ac10c4c8f0000204d159f983d445130fff5ade93b05e01172ee4c56ee3c5b252277615ac10c4c8f20313e02ee0e20e1cdbca93d89490c8c9caaba06e6558670cacd259f1c8814007b01e0464a5d60141aeb8650b95a88f576c86ad8230200000000003425a9c4fb4e1ffc000bb3b40001fc000bd23300f062a34a0fb6489242d4679a98a4b853087d6903f062a34a0fb6489242d4679a98a4b853087d69031ec5c66e9789c655ae068d35088b4073345fe0b030848d62d66f87f7de6ad828ffbfbd1432dbc983ce86bba885cabf1114835f6de4614d3cf293d6daa92d98e5e1ca36d26e000000004d5087a16a45ee3434db18ba9be18b627794ea9fcc2ade4411ab0745c587c16a0000204d5087a16a45ee3434db18ba9be18b627794ea9fcc2ade4411ab0745c587c16a20486494877c77a3dd5d80aea481a1dd6821d00eb7785d7c5b0646dfe9cc7c01b901a610254a55a28d50033f2df6b34baf904c3132e3000000000041152056fb4e1ffc000c329401fc000cc8b801fc000ce9c300336788df1ce1418edfb0b8321db1611264010a7b336788df1ce1418edfb0b8321db1611264010a7b7ad529c7f0f78a1f5a4ee5c4f8855dad34d7c535308162401aae703d5bb3f53a7b9c5b65b9a94dbd1c207a8da8f1350200a960d1607e89e50b365afb14cf3b700662342a4c000000004d5fe9da329316db465fb3f4925cd5604dd61335c32f0b7d79bdcc98e71880d20000204d5fe9da329316db465fb3f4925cd5604dd61335c32f0b7d79bdcc98e71880d220a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e50a4cbeb2381d842c9d9e0221395627f391d1581a200000000003422fad6fb4e1ffc000ccadd0000004bd7db8a067386d8bda99986fd6661186757bf954bd7db8a067386d8bda99986fd6661186757bf9564f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73087be789e5b798cf3a40ff5dc22b0384dc690acadd614067c0f7e6a933b8f0c72c67b3f4b3e666e6fc48369a8161b04e6000000004e440fd1740b4ad578af9d5f11667830eaf8f422898c00d891e3f3cd075ea6130000204e440fd1740b4ad578af9d5f11667830eaf8f422898c00d891e3f3cd075ea61320b1e914db9a6663500db9ff75eba0c6717a9fec4abd9abe995897ca5cd84ec20e00beb09ba540e70a97843006e392a012cb8cbdc70900000000005fd916b6fb4e19fc00108b3f0001fc00108b7b000586047cd6cfc021d742ed07f331cc5e41b6b76d21be19b26057cba9acdd22fabf0d3643e8440b65beb09ba540e70a97843006e392a012cb8cbdc7093090e7cc61a596c1cae0c431f22e92ad1ea142558e6e2fdfd8cba033040a4bc56e58f44ccb3380d10ce89246fb6f1c52bb000000004ee1227ac0f4be1fe27ec0d00601287cbcd3182d3b10db952fec225d68f717b90000204ee1227ac0f4be1fe27ec0d00601287cbcd3182d3b10db952fec225d68f717b920037c32c262a9f798855661033c70a485c9efbab9379458ebd2bc3dce1f2cbf48011f6a174996c5075c827596ea0bfc10a97a071dd100000000010000000000000000000000000000000000fc00067ac70001fc00067af3016398e2e031739ca5378d8b64d33340a99d1317260258f7afa5a4ec575f6781fb2d91fd59f8a409d63e28db34964d56b44c53996dd85877e69c9453ef30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f4cdd55a71a68183cd6ceb8da6e95c9526e259ce0d243e297ecbeaae0f93ef70000204f4cdd55a71a68183cd6ceb8da6e95c9526e259ce0d243e297ecbeaae0f93ef720b711c40f6d1eb02fff2b03c35a759fa63b3eedc2b47e59191b7e1d0353b814cd0072235a751c82d0d01ab336190bdfd4eceebf4a6e0000000000b23e5de2fb4e1ffc00022f9b01fc000266ac01fc00052bcb00a97f2ca1f2953b0ad3dbc58b12fde33f39a4fbeee0cabfbceeb716b5b558739f218f9516c16918d272235a751c82d0d01ab336190bdfd4eceebf4a6e3093a5eb4a6fb84c13bba4d597a6f9d37f565048a384c94d3b81630c6965a023eb3748b6fed0ebc224f051eb23f50d9ff300000000500bde7398a2ef46b93994f34d3607875321076ee3ef975d5477c3d06b0c1659000020500bde7398a2ef46b93994f34d3607875321076ee3ef975d5477c3d06b0c1659200a73fb35537392612450d065440abe6b192373607da402843c78ceddccb3cca201f958e2271fac8498a057a0f4715f46ecae3993bd0000000000a763b737fb4e1ffc00051ba001fc00052fc601fc00053183003a442deb895344b8c98d1f96db46d73aec73149334e4669b580af3248979acd2db51c30d0794c76ef958e2271fac8498a057a0f4715f46ecae3993bd30822967c827427a4ea722459a6a5d007c5a14e1da4b6fd52417914cdac7dfbc9233dd046cda0c2980d1936cfa8b22920000000000507e64b697d351d57308e00312cb269564502e07fb3a05c501952de3972f059a000020507e64b697d351d57308e00312cb269564502e07fb3a05c501952de3972f059a2034fe0ea681d38ede04970088cdd82161c09e03c24f08d62c08bbecfcdc62ec1b00979be1258712fc0292ed17304a2aa2f05ae762e6000000000036cb2ac0fb4e1ffc000bb3b40001fc000bc79c00491b2884357e499e86dad5fc363b951305570ace491b2884357e499e86dad5fc363b951305570ace1ec5c66e9789c655ae068d35088b4073345fe0b03081baf71805fd63ca4357d12c6b77cd04b70846abd99d8dfa9e8b4469c2d167909399b2efcb32ec817e7fe75324151c080000000051172935cfc699e312ec12338e14d12fd54a5fb4065922055980d8206ded70ec00002051172935cfc699e312ec12338e14d12fd54a5fb4065922055980d8206ded70ec20ca564761a2aae2a77d104426a7843a92995d2d94f7e951d792bb78fc22be0d5c00636bf0d4a97d772962f96c66675629bd3e6578ff000000000022d0be82fb4e1ffc0006567a0001fc000bdc2300587cd605573d22f879d8f02b4fc6901ffa1ce1df587cd605573d22f879d8f02b4fc6901ffa1ce1df1ec5c66e9789c655ae068d35088b4073345fe0b03005e41c9c5f3e90a39f01b6a6723d505378fb3a25e19c0b7915303a1e7da89a19ed0a1c5ea765a6ed2efb3710de56f19b0000000051238bb9e2b68fc822e8eb15d415e97ebc86f769a72c15e0a6e25d9ea8d3847500002051238bb9e2b68fc822e8eb15d415e97ebc86f769a72c15e0a6e25d9ea8d384752073663de296744bdf1a11ef3f43d64e249644ea7499e54a8848baed56d716fc3e002b7856de53d4c1823090c98f8ad79862842c09b54120000000b23ecbf9fb4e1ffc0006b1f900000091448a07a2696b4d310761442aa07e3f2021cb731341a33990289395b5659a4cb30cc07ba002b505288e0340106fb37e4cba12e21c2af87e965ebb8b30ace65ce6933fbafc8686ea9e8ba72bc98f3d07905b4ccfb83162db440308e9255f708ce4f2623b27f9fc04fe11cf605700000000518ebe3158701e981095522cab5941883e56240c8ce9ddd79247fc5efa00af3d000020518ebe3158701e981095522cab5941883e56240c8ce9ddd79247fc5efa00af3d20a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e162ad150d5b108c42779d7e62869b5c32c2352498b000000000022dc764ffb4e1ffc000ccadd00000081a5a6e113fbb398b5dd1a3817a4cd66b955b58881a5a6e113fbb398b5dd1a3817a4cd66b955b58864f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73096594c4eedb5183b0a4e1e96e45bbe8a042904abea4ece4619cc4c3c70073036adb8eb9130a672481eef6a2143b8761c00000000520c7377bf695cde36a0dc0ddd9aea060ce4a4cdce59022e7d74f501e5fa71c0000020520c7377bf695cde36a0dc0ddd9aea060ce4a4cdce59022e7d74f501e5fa71c020a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e62dab139056dee908016c56f7676e18f04666c4937000000000036bf9289fb4e1ffc000ccadd00000033fe2817ece26659df352c7abdf87f8cb7dde58b33fe2817ece26659df352c7abdf87f8cb7dde58b64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730842d732a03847819b1e2675ac48b9af4a1c92b310ecacc42c428ff902099cc47d08ecd4616da55d185463855aee99f7900000000521e7d6a4b937cb19dc62371436f1805c2337a772a5e3884097088b23cb39c9a000020521e7d6a4b937cb19dc62371436f1805c2337a772a5e3884097088b23cb39c9a2016bfb58979d90f27253d7a052b620631266a3f35e1e46fc40ff6481f2acebe40000ba3bc9b96c628693877db3bfeebe29b3ac1b1ae000000000023596403fb4e1ffc000bb3b40001fc000bc76b000fe161af74ed12af85556bae73fd1d3af6a01ea40fe161af74ed12af85556bae73fd1d3af6a01ea41ec5c66e9789c655ae068d35088b4073345fe0b0308d51215f8e1c1f68fc8db92517650a76251c8ee8800de92b97c7f4d29c50eda699c82a7f671b597eb52fe08cad760d6400000000528b059c0430be26babd893fce8850ef5f10ba1b166331aa66de0f58f1bd5cb9000020528b059c0430be26babd893fce8850ef5f10ba1b166331aa66de0f58f1bd5cb920778ce40a708f33b1ed5239b14edeae85497eef97146cbbb8ca62b37873abdb07002300d33f550b325773744b9f8843a65151388644000000000022d1a62afb4e1ffc0006567a0001fc000bd983009678d36b05e068a7aefc08edf11353d6db33253d9678d36b05e068a7aefc08edf11353d6db33253d1ec5c66e9789c655ae068d35088b4073345fe0b03080a3e42e4ef0c3f27fcc7b70edb253590af1ae9865bc936210f0b68f8e7c0690b6ba65daec04e9da61da85ec8865244f000000005346dd62f6d0d846ca8b37cad7e4438d1effa1a61a63f8d55ba93069f560949b0000205346dd62f6d0d846ca8b37cad7e4438d1effa1a61a63f8d55ba93069f560949b20ef27728a1bfbf13abcf7420e3118cae96ca0184ff1d0a796b90c51a543202b0001a01a6124dd32d31434325f8b39e3133ca643b8c3000000000034348bbafb4e1ffc00013b0a01fc00014e4301fc0001517300692ac6d2aff4da4de4a815b41b58369de627380f692ac6d2aff4da4de4a815b41b58369de627380f69a9e3015032f43608f55847cfac26a1926ace9b30847178ed08f0f5728dfe39ba9e3a43555b4c5e8100d825d91bf452bb7dad7bce7e8224fb665abc59cfc74d3bd1e040e10000000053572db6934dd429546362bd33dd18aed1a49b96dd9a8bf0ce1936975991b6b200002053572db6934dd429546362bd33dd18aed1a49b96dd9a8bf0ce1936975991b6b220b2b69159973619cef08b9add969ba4d1ae18dd33bd62635429d44d93b62d5753013ee3c4a4a092ba275cdff0c03b912eb1d83c5e8c0000000000ae22e975fb4e1ffc000cf13c0001fc000cf6cb000d432b7c544c11176c8b543613cc395f4b1bbcf8ce7f101b7f075273c892063b1b8571311737a5767f95c0f808aff27883260bfaf9cfe2b84519a6b23007f818e5c2330ac4e7f0ef820f337addf8ab28b07c9d451304d807feda1d764c7074bccbbd941284b0d0276a96cf5e7f0000000053bb55e972ab4f796aae8c7eed34d09adc55241edeead6c7171c2ada2769c68f00002053bb55e972ab4f796aae8c7eed34d09adc55241edeead6c7171c2ada2769c68f208230f90a0fa0e758f70dcee360ab25c46f3c43e674fe277b60ca7764c5f420840076e959b03bac123bf2ced68c6705fe4fd4e280f441700000002269201dfb4e1ffc0008836d0001fc0008844b00df18a921f89745939ee3f00b9dfc07a167f4061fc291f09365d25227523575b9f07683a28c205a30de9aea4685986edd2c37ee8a3245d8886e63fc663008af8fcaaef14df7bc8ddfae8fbcb1f239040be0ac89d43ce0f27ea3f7a00d1685ffc1075614144e70f02df385a996f7000000005557273f5922d9925e2327908ddb128bcf8e055a04d86e23431809bedd0770600000205557273f5922d9925e2327908ddb128bcf8e055a04d86e23431809bedd0770602011980a810803e9264875774c7b736eafc40e3c0c6d86b719f2e54143874d0299011485ab410c60ed103eb5a0bae666add00978a88140a00000005fde193cfb4e1dfc0004a2b30001fc0004a34c00b0e606ec0ec732170fada5204ef8ef5d1dcf73948fd1a9502c58ab103792693e951bf39f10ee46a9cb4b5cb5765cfbfbc3ae17aeb48f8533bd5391ee3008b66151b81bd6a08bad2e68810ea07014012d6d804859219958a7fbc293689aa902bd0cd6db7a4699c9e88a4ae8c2c00000000055cd64d8a3d53fde1faeb46de639a7478b4559aa9040d37b2b19a28a7c029cf100002055cd64d8a3d53fde1faeb46de639a7478b4559aa9040d37b2b19a28a7c029cf12071f2bf95b4d52ba83c2fac722efd30723f3e99ccd83849006df4045760bc919e002e7e345d77cab6d1ec5e81f17b98f1e4d0ebc4984120000000c1758ec8fb4e1ffc000ac3160001fc000ac34300d2f955d617b4c5687619d9030ff1b9bc39a7fb4ad2f955d617b4c5687619d9030ff1b9bc39a7fb4abb42031cbd012787b56d53dff7a46c1d0b66ff77300a1442ae1b122649814bd8354b4daee4a289220eea514988d6cc93ec6302e346bdc77236c91967ff86362d81b18b1c7c00000000568a820b27ca755a2dbd072d68d0a8bb19ff486b472aca350290ca30ac7a934d000020568a820b27ca755a2dbd072d68d0a8bb19ff486b472aca350290ca30ac7a934d204d937aac30ca900235ca2a476b48ff19bba8d0682d07bd2d5a75ca270b828a5601ae69c3808753ea7dd0e2e3d1565ded12d8eadb9e000000000004030201fb4e1ffc0007581001fc0007586401fc000758930094c7496c719925d805ad2f0a75c837fd9abc52c794c7496c719925d805ad2f0a75c837fd9abc52c754de5d26228df57289545787fa448a7c9f7ebe2c30983bd995f3e1280858f37e33edabbd8ca4d90605e26cb6dce824a2c03f83dd498180085db4168f9e6b4df0b46a7f4f54000000005725d47a054dc1b4d34f719c4f9a5a75b52f08b59b0ba5ad788c1e29bbca0ca50000205725d47a054dc1b4d34f719c4f9a5a75b52f08b59b0ba5ad788c1e29bbca0ca5200e2bea11a7d2fa54cfab488d4cb0e7e5c28d8fb1f17b89b3a5346bdec9b53fd900e4f9a674bedaa1272b51355d8efad13d6fe7653f000000000036bb2f47fb4e1ffc000bb3b40001fc000bcb8b00482738ebae2e214d55bbcd03d7d0e81a7130f955482738ebae2e214d55bbcd03d7d0e81a7130f9551ec5c66e9789c655ae068d35088b4073345fe0b0308397590e589e42728f349a499466c06a7dbc797a07787b79145d6e18ef9859e0b07e64a665a3e1c2b54663ee8dca6bd500000000574a8a1c55a14ef27fbc1cbc52545d9e94944984c1201fba3aeacc309a63660b000020574a8a1c55a14ef27fbc1cbc52545d9e94944984c1201fba3aeacc309a63660b205fd493a731389488c69e721fbe31f8996395311728f8393c97648970b1c3f0af0033cfb3f4008a512c56a47174b23d40700065161700000000003422e1c6fb4e1ffc000bb3b40001fc000bce1300175b30c912de7bbb1a71fb1766ca91eaaab6e8b0175b30c912de7bbb1a71fb1766ca91eaaab6e8b01ec5c66e9789c655ae068d35088b4073345fe0b03009637af6c8533b5329eee8457477bf89386af20149a7f4ad3a76dc74876907cae2672324e816d70b9160e27e335f1bc0000000005855f045dc4db4213f0bd153adf6ce3a02e59a06a3887cf01ff552f81e580cc10000205855f045dc4db4213f0bd153adf6ce3a02e59a06a3887cf01ff552f81e580cc120e75569a4dfbbd1fd45e5f54f03642caba755b5ff7d1e2919f71c069cdb9266d90012da5021d6ab01854ecf7510d834d6ae89cead96000000000012edcc99fb4e1ffc000656800001fc000bd4aa005b7fffe5a92fb181e91ab6fa5cbdff30266c86d25b7fffe5a92fb181e91ab6fa5cbdff30266c86d21ec5c66e9789c655ae068d35088b4073345fe0b03018ea4f800b55d185f2abf9b0df7aee48cdca7089178e1b1ed212f2b561eb2f66d638c64e9a3dec12490c04a4deac6faf00000000585674740dac63692bbb0ea4ee899c575f9883e91fb5ba5ebf26b5b2fb66f21b000020585674740dac63692bbb0ea4ee899c575f9883e91fb5ba5ebf26b5b2fb66f21b202bba3595a323203f3baaf14c9e656a2db305b371f974fd2c08d63559dcb356380181949e154a2d3e19abaadccd78998f419f86075e000000000034dc8558fb4e1ffc00012b5f0001fc0001305c00c1eab1a29d98db4b44708a6db97dfeae5fb123c60e03a8899ae0f3a5771fa41ee75752713e920fd85aad5c1b35da17982597334b504c22752cd6319e3093dac0f5d028eeddeaf4257919511991872523675ab24d1d971af3ab1900f27fc617d1d53a846c32abe1ef52a2cb26ee0000000058eac04dafeed9c30b3397c527714c273323fa036a0ccfe5aa71d5c4fdcc270800002058eac04dafeed9c30b3397c527714c273323fa036a0ccfe5aa71d5c4fdcc2708205529d4297a7587a2a915070b9b6f53eacdb4350d118e5af99b6a2abc8b500029005127e6f29037d8849f2a3be369dd9989e383016d00000000000b7a212cfb4e1ffc000607b20001fc0006087b0044c8afafbb5c35b797e7a8876f8932829f99c6c044c8afafbb5c35b797e7a8876f8932829f99c6c05127e6f29037d8849f2a3be369dd9989e383016d30046e3d8efdf54e1cf182c8eb894c4bc1a2845fd3e8e20a383a80435dd131e34e69ee562cc7f31628960e1ad57fdc538a0000000059d45830e45260a043fdd196f966679f1a63f1b6c28f04563738226bd654865800002059d45830e45260a043fdd196f966679f1a63f1b6c28f04563738226bd654865820a042308e7ee24af38a5afdd588c33e007a0ff9168bc6cdbd7ad29836488c64c6006b4ca496710b456df19d9f8f7bbda99d4a9bbfe4000000000036da68c2fb4e1ffc0006567a0001fc000bd99b00717fb4495269642bdd0e16cbc60d15e31a2802aa717fb4495269642bdd0e16cbc60d15e31a2802aa1ec5c66e9789c655ae068d35088b4073345fe0b0308ba4d80404dae1a9a1b3aa7bb7173ba161b87f3212cc4566bc22ff9cb1253376d8f9edfaab3db702a32741b1bd902016000000005a5b3a5da96d5ee8ec30e9cfe76cf0c407ef040836d2dcedd94c4315c9f07b590000205a5b3a5da96d5ee8ec30e9cfe76cf0c407ef040836d2dcedd94c4315c9f07b5920597bf0c915434cd9eddcd2360804ef07c4f06ce7cfe930ece85e6da95d3a5b5a016cc8146b2b970595fbf4e267afcfc3212002584c410000000012de6f46fb4e1ffc0005418b0001fc000543b40010b27fac0d3106227397fb1cb91eabba630c0a31f0c742302a89db49217e328e18811d0ab1904ac5da952b3b45775c0af85fbe2e2ab21549d86beb0a3080f8dfef131ac329d428504e7cb89974f188f07caef0668df1daa4ca8fc5f50f6c5945f020271292dc220ce313c00f16000000005a608427d3cb472597fe47ed7f9c4b430961bff0e7fd3bbe3a4553375cf2e4ab0000205a608427d3cb472597fe47ed7f9c4b430961bff0e7fd3bbe3a4553375cf2e4ab20abe4f25c3753453abe3bfde7f0bf6109434b9c7fed47fe972547cbd32784605a01118b5a615cdde7e435bb8bd1ee15a7f4c490d21e0000000000ae22e977fb4e1ffc000c225301fc000cf06701fc000cf6cb00c1ad3af209f75deaeb9216fc8339fd48d376f9b0ce7f101b7f075273c892063b1b8571311737a5767f95c0f808aff27883260bfaf9cfe2b84519a6b2308a0ede82d78a0a8f4c2332d431c7be496c3aa09349ed3b2db30f7eb7dcc7b6e580a9d71f7d76bdaca1b3670e0cf4cd3c000000005a6d674367f4fad9883595d74d6eb628c59495a3af0732d24db983359cb7127f0000205a6d674367f4fad9883595d74d6eb628c59495a3af0732d24db983359cb7127f20de14b280405beaa7359475326e337d7fe322e550a612c188c8c33f1ec05ffc7a01b1ec17072d731ed30edac35422f49fc43c6117d50000000000b9c313d4fb4e1ffb89660001fb89da00a6c4b0ce143aed43b6665e086fdabc05f6797a2aa6c4b0ce143aed43b6665e086fdabc05f6797a2a486c5d35a36a1cc86cb1c8946be6c3095b79a544308f53fb19c3be85ce00e96d634221f20a06a3a50942998193004264075a70422a3305f57c0c478a70ad69f1112e2f9993000000005b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a230001205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a2320774441a2d4ff6133747a8bb1b5e4a9a21bb73c4b77cf31e85bda68f898949db0013f978f2c099e310cac9e854b99bc981c8fdcade2000000000023a5327efb4e1ffc000cfb4d000000ebb7d8141ecbdf2abcdc3ebe25420b9425745293ebb7d8141ecbdf2abcdc3ebe25420b9425745293c69a0bda7daaae481be8def95e5f347a1d00a4b430b44cee83a79fa151527e527f3f4f5ba022e73ae8b0d913c4185a45c2a129aef935a585a7a725edcb36ece72a957586880001f460a07a2b0dc932e1d8ff2dee2b984ac415dceb01fb8f3001fb05a35b5e74eaa81cf214241dc38fda186e7782243b77f112bd61c3e4e83f49f27a270000205b5e74eaa81cf214241dc38fda186e7782243b77f112bd61c3e4e83f49f27a27201059a0d6de258ea8455e3b995cfc62aa2773a3bafd6e1fcc00e9c4c5b8bb9a7d01433d10cc55f8c79b2dc5909099ee24ae9d3f56590000000000037c8ecdfb34a1fc000d6e440001fc000d6e9b001c2ce317e6977a829188866e9d4f82b53b82ac0c90d6c5ee0763ec84de95ae93cdabd1155d9d8f4e972364013299903de8c3a8c504669542ce20fd04308119fe1f9f05f7222f62c4b22a05880a89e4d8b3b8fd3011661df80e46da3ccb2222598129e3e67998883ede2bfe1143000000005be5a28138a658a802a1e871d7bb4a5e8a167effe9e665b4a2ecaa559d01734e0000205be5a28138a658a802a1e871d7bb4a5e8a167effe9e665b4a2ecaa559d01734e20439873740ad2b64a21becf94198b3d570250c8230b4a0ece9e0b78a9035c189b0096fee7f21ab31bda8471cec48b23e87b029d42d7000000000022de6689fb4e1ffc0006567a0001fc000bdbf30028a6d0e9738eb5ac91e4e5e5e715f0b16631396728a6d0e9738eb5ac91e4e5e5e715f0b1663139671ec5c66e9789c655ae068d35088b4073345fe0b0300dd55240db07aa6079e3b84af0d86acf307411f6a99d9570eebec93b6e7e5890db40e31efdca4d5d7bcee1f105e80ea4000000005c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef4360001205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef43620593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c0f62555d44fc8d089674bab5d090a48825bea701b700000000002cef2799fb4e1ffc000cf99e0000007ef7c15840f96c603fcd29409a70f77f878d25d87ef7c15840f96c603fcd29409a70f77f878d25d8c69a0bda7daaae481be8def95e5f347a1d00a4b43086d0a2ca6f434eaa47ff6919ecafa4fc3b012b89c62a04835a24c00faf62c3d30d3f8755c33a7abc595e96fb5b79594a0001972a33056d57359de8acfa4fb8b29dc1c14f76b801fb8f3001fb05a35c6d5b4d2567346b2ada40d2dabbc907cf8a53c352593333e7d1fa8a635572080000205c6d5b4d2567346b2ada40d2dabbc907cf8a53c352593333e7d1fa8a63557208205b016215386c035a42042a93736befccdb87c30cb90adc3b1279da58ac57cc14046094547209833dca44803c3a5b039a038be4034c000000000012eddee4fb4e1ffc000cf8b101fc000cf93501fc000cf95300bfa25fb4ed44c385e69d5d8369a0a7b90d68b4f7bfa25fb4ed44c385e69d5d8369a0a7b90d68b4f7c69a0bda7daaae481be8def95e5f347a1d00a4b43096f1efdb9fbe12961b7f113de6a5e57e6f547a3b27b4b8941a5265ddc51de7b6dfa7eb52ef96fef6503b4a729884ef12000000005cd86ed16f87819dca7b6e4e3d24947b1a6328ed8cc4c9aec7af35fa2b1622200000205cd86ed16f87819dca7b6e4e3d24947b1a6328ed8cc4c9aec7af35fa2b16222020fbae7f5db70dfecd69081854b27514ec0b29f4bab86717174e0220bd7bb9584700b9dd1b5f9c18e8260fd7e7f9f1d9503709f9168b000000000044b7a710fb4e1ffbc4230001fc000195cc0025c8d7361af14d912026940701c3d5d440ae6913069efe06c4c2d7ac2a8c61f961f686a13423467cb2334b22379811352d9988876a6e586d975e73293018af4d035eed23d30eb02808af0c133d9879c0fb82c72329ab2ed208ebc1631641ca42bbf462239d151f4e84d8dcde7b000000005d49c93481f99c7e1d85cde715697762973d9c49d6facf50131e11b2c14c78130000205d49c93481f99c7e1d85cde715697762973d9c49d6facf50131e11b2c14c781320a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e1120959bed4177d7abcdbb412bd8b8e1f920bb623a000000000022d93a9efb4e1ffc000ccadd000000079a7d38b11c6a3e040e4e665150768b8a5faec4079a7d38b11c6a3e040e4e665150768b8a5faec464f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730826cbf63d989916d252cfc2cf827f34314c32c64acc0c252f1c3d42019589650c3ecb098655ba153dbc04211a1a73e88000000005d906997d8b370d37f813ed55c664457fc98acabfbf5e5602952f710b54bd4e50000205d906997d8b370d37f813ed55c664457fc98acabfbf5e5602952f710b54bd4e520a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e3d6ca51bdcb6817cb4f722a45a7646fa5070ee902800000000002357ee76fb4e1ffc000ccadd000000431c84baf52eb97d5546ed1ee44872c30772a30a431c84baf52eb97d5546ed1ee44872c30772a30a64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730155b2a1aa71cbb3b5fc81b00242805a6d573826679a2b6a5c49bec714829322efe8af0c1640ba3b59811c70e17b488a5000000005dbd3e1adcef3a9e61ea1c8d0d3bed643ab3a36872ad78905b009cd6dbde6df50000205dbd3e1adcef3a9e61ea1c8d0d3bed643ab3a36872ad78905b009cd6dbde6df5208e8e515f7025352e7c608479e413beacf0d95cbb964b47e4a98fd27b6b6b628a275615f5efe0555e81f7799ff3e1017eed0f5d8160000000000034d41347fb65a7fc0005e6990001fc0006579c00d0a7d804064376431fc57385721270a55fd99154d0a7d804064376431fc57385721270a55fd991545615f5efe0555e81f7799ff3e1017eed0f5d816030119d599048331efb5bd38ea0506ac51765eaddf396114dcf14fbbbab70b7a929c9227f8ec980851ad79f502d2fd1750a000000005dd021fc25cffa8a8fcc138726d3771d7a11ed67826ef92f8cce1deeeb8994cd0000205dd021fc25cffa8a8fcc138726d3771d7a11ed67826ef92f8cce1deeeb8994cd207d3a61ee47e7406247f3c530c94eca04fb61215407084d494fe341e0bd6e6dfb00e64dbdd97978ca06825948e22965eaf261f75e3e0000000000b2077c28fb4e1ffc000732760001fc00073283006d40952f2f57e3d63ad144d4171de75dbad6871c6d40952f2f57e3d63ad144d4171de75dbad6871c3b8fed059edc3b85af8bc75de109566b89aef260300cacf46c91a350240272bcf66d48eafd77c78ab71185ca41769621116c8dae8b29732fb998cb6547f3fb27b556c660ed000000005f8457a7640a8e99840193865a971146d9e25a97d8dfd6f0f1f73b18fd962c440000205f8457a7640a8e99840193865a971146d9e25a97d8dfd6f0f1f73b18fd962c4420e77f5d18d3565f6130ef095290517a91b9591ae927defeafd6875daade6ee39601609b88d96948cb06b59241d773a085b72f416caf3f80000000b951a487fb4e1ffc0007d1f4000000d45e1d0d83cae06f0c68b0dfba62807d59214bc0fbe729266f43adfcdf3ede4f478c7a0ef915cd460d5bcbeeb459af40f97fcb4a98e9d1ed13e904c83097d5f022c3b6c314bde5171ead1616e4c27f0e9a48a9a9dc3a7227a62d42213b93c8a4c32af18bd8ff931b7732782e0901c623e2d926af5eb52dcc2b931993d3e5271451180000006029fadf3355a31c6f841570e76bcdf5636378c65ff1da8f580806602752694b0001206029fadf3355a31c6f841570e76bcdf5636378c65ff1da8f580806602752694b203e14ea3daa62c03d9ed56e8895b5d98188711c49818cd0add43d37fe512c93d1012a5d83dcce0edae361a62d8bc2a308a87e29a49b000000000059a9ab6afb4e1ffc001079fe01fc00107c0e01fc00108203001119c437dbe2c3aeb4a3c7d1e29380738e3372433e443eba6ce82ca15b203d10117c653f26944256cb505749178fb4f731643d9aa56c54e504f9cc6e30a4adf9fa35bc975e52e3f667e48ff3ed7ce71f8ecb85d5ec728596f7fee735c2f857fae1569c8b4c6839ca849cba42d1000197ed64c04be77ef571fd5624c0f7705192630e3a01fb8f3001fb05a36071df1e3bf80ba6cb9795bb2a82ef426cf559b7711e555af45fd8da7fb629b80001206071df1e3bf80ba6cb9795bb2a82ef426cf559b7711e555af45fd8da7fb629b820387368b816ed3599d758185ae60d943afc22201e94e06ffb3dad30a3ddc6756b0005ccc78c0358f7b71d254b28c7287da9b39b81f400000000002d20db70fb4e1ffc000d05b30001fc000d05cb00434dcdb7115427657cf2936248b62a97b9969795ff1266f2c8aa7b1f93a15b8882013af424d7d9e805ccc78c0358f7b71d254b28c7287da9b39b81f430b4e545a909b1916959139eaea845262b0aadec1c5cf555922bb6e6d1804343e6490428a382a0c01832fc70c50438fea6000152cdd176257544a263ecadb986ed72375589a8a401fb682001fb01bb610f8f8dd4cae7aec25116ce7104742254ec559baa67b27ab471ece2a2aa7803000020610f8f8dd4cae7aec25116ce7104742254ec559baa67b27ab471ece2a2aa780320a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e264345f7c30d3267da06c6f685ac42770abc5b0ab8000000000036ba9112fb4e1ffc000ccadd000000bec1b55112fe6dee11593a3ec19e9d7128555218bec1b55112fe6dee11593a3ec19e9d712855521864f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73090ea47f22be1644834d8756793f2308f2c5b40afd16ebb98d29a3bd37e437990d4d5930ccfa56c1ea0b4e51d05a49f2300000000617d72f6941af02ef5f2ceaa2ac0315ed5db0979c45391398f74b0fadc100ca6000020617d72f6941af02ef5f2ceaa2ac0315ed5db0979c45391398f74b0fadc100ca620a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e69eaa58fb3c117406b24cb6bce3b818f582ea7647e000000000023587acafb4e1ffc000ccadd00000017acdf555cdcf9dec1b41f2b44511123917d299817acdf555cdcf9dec1b41f2b44511123917d299864f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730067ec5f7cb5511ba2bf10aa09eac4107d76fd53edeb2fd94edef4555171dbe3ed7dc6cfe37b087390af61a6aa269182b0000000061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb00012061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb20593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c15888380d6096d829d6864cf6eec66812266839e0d0000000000340cb05afb4e1ffc000cf99e000000b5b414e1a68e36a25df214ac6eba35782a0437dab5b414e1a68e36a25df214ac6eba35782a0437dac69a0bda7daaae481be8def95e5f347a1d00a4b430a6a63376eb861bda6afa09e28e39ba40cdfb877ee6f9aace10eaccd4caafe8d9243f2f2c0ef982a0766347073cc199bb00017ada3e486409b39c94a0833c8d782f35bc24e96a01fb8f3001fb05a36213059ec1749bcbb42e7b0ee5205b88df03ea2fb1a73d6c4ee10c9d3de9345c0000206213059ec1749bcbb42e7b0ee5205b88df03ea2fb1a73d6c4ee10c9d3de9345c203ad8c08b05fcd0c0dd9cdd85ffceb21c25366f4f32b81f6a0cc009e774987154006d2ceb670b5e0484285fd83d0d13177f608641a5000000000055d1f304fb4e1ffc0010173e0001fc0010175300da8d49b6e91746c548bbd0de25fdb62bbed5b872a43561ee4583153f4b18ea92e8fdcb3a602e84fc482551fcc51ba10000202e7d6a7938cba1cd28ef3013b9b565d5772aeb5080dc5bdc91a319dc33b4a2fca52d3998d6561a043b51bca50eea4dd8e8510239af01fcd6312f050000000063115def57591ee9abad23b796cff8cf63b7c1e9878ab77ce8e354c38803501600002063115def57591ee9abad23b796cff8cf63b7c1e9878ab77ce8e354c38803501620c72e50fdd7acc0be5942e53d2e5a616f7e86c4b4ae675b8099e4f8a1caef049f0018d49a0f47500900fc886294ab346b7c02c7a9d800000000002d4db010fb4e20fc000374ad0001fc00037a330079cd5958432147b2cafde22aad47375e690a9a4d79cd5958432147b2cafde22aad47375e690a9a4d83ee938aaaf0e18dbe7bdf40e639fd2d2dc188d93002ede7bba4f6330aa85b22f2d20167cb529ac1334125ec439f873c0cd7d54e7c07b65bca725799f8292564af4296f0600000000063dc5ee3b0ae326b1d590c1253aceb6b50982721e6d8b20e862433a2a6438c6000002063dc5ee3b0ae326b1d590c1253aceb6b50982721e6d8b20e862433a2a6438c6020a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e6bee55061de10219326c570d2c39cd051ef00d2c5e0000000000235bc5dafb4e1ffc000ccadd000000b190542b5c7522f4db19e48033d17c34afd71845b190542b5c7522f4db19e48033d17c34afd7184564f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73013f411bb160a34b3d8254e7c537e1300afed010d4a245e376b81d889020854fb999fe9cbb7430ddee0faf2fe5e711ebb0000000065d8d0b30932771009cd7f022fa796da3ef4c1268728843ba71b5ca8c6c4374a00002065d8d0b30932771009cd7f022fa796da3ef4c1268728843ba71b5ca8c6c4374a204a37c4c6a85c1ba73b84288726c1f43eda96a72f027fcd0910773209b3d0d86500bce5e6c41e6658bf2a5738b7fcac02c520e391be000000000023a155eafb4e1ffc000b942c0001fc000b9d53008e9431059fc57f8c0c1a9625506b80589feb7fd6faab53c3c104da464745c096b8c79c91f47b835ef9cdba10be63d3e13607d4f420bb6b8013af2f7d308b98c8e6620c7893f7c26acc50d4e335b74f9cc866019ff0b6af497407fd0ebdb33c2cba0a6f2c4ea9a8aee85f22bf5f000000006691b5981eb27314fdd2c2eedf58a0571da48ee074600449eb825c485a17ea7c0000206691b5981eb27314fdd2c2eedf58a0571da48ee074600449eb825c485a17ea7c20a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e13229a05ff3504b016eafada8216af6f4a4170e2b4000000000036bf1c2cfb4e1ffc000ccadd000000f719327671f37c8f4dca62dba332ba17ba42e7e2f719327671f37c8f4dca62dba332ba17ba42e7e264f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73000a2e66a810493a91b5ed1a8ef8ac4be41543598f5b4765a6f5d6339078ab88030817dc9c9bdb60c7c7a02d7787d6f2e00000000672830015f3330a96d5aa74d43b6dd2f6896821d8caed7fdad6427c74b7a7e2c000020672830015f3330a96d5aa74d43b6dd2f6896821d8caed7fdad6427c74b7a7e2c208e8e515f7025352e7c608479e413beacf0d95cbb964b47e4a98fd27b6b6b628a4ac20bcbf3e1989bd3da763af41bfd39b45b130e11000000000034d41347fb65f3fc0005e6990001fc0006573c000fb0af93f68351ac5e92ff99c982c664da1697020fb0af93f68351ac5e92ff99c982c664da169702c20bcbf3e1989bd3da763af41bfd39b45b130e1130151436dee05a55afb36dfcc21afcd193ec0852d2f2b27d86f3ce8c05e7e4d4af4e0023d0089b0ef3d41bcdaf4556b1fe0000000067491f0cb0874d179d8ece6f3ff25f721b2eb016ab5768bfabdc5e6ca614aaf900002067491f0cb0874d179d8ece6f3ff25f721b2eb016ab5768bfabdc5e6ca614aaf9200b469b5bc9057f1869e277e9abc139e8a7fa9cbf98f3bf4592a740249834d5a001cf333b39b37c22e1bcbfb2cfb9e98e85c622f08200000000005bbe7d85fb1a0bfb4ab40001fb701200de6d2589b9cd1d134c8aee733d9ecf70a21d3347de6d2589b9cd1d134c8aee733d9ecf70a21d3347a618f8434a31c9d45afc5d99aa253bdf1319f9413091e633b72726091f58e3bd1ede3a21de66abb2456c2f669be8bdcf76f3ab76aa2d75f7d03cf2f7d5761ab15e62e006130000000067636d7c7516e0eba85e2950cfa2c4d14e89b0aeb6d1700cb1c9f1bfdb4bb8ec00002067636d7c7516e0eba85e2950cfa2c4d14e89b0aeb6d1700cb1c9f1bfdb4bb8ec20bf0cdd7af7085c9e845a46ffd4fb3f460b73ab18af5ab9d7c76c1a8f13f63f210029aebc9994e27800397664c85b8d7c3c19ab788000000000003427fc58fb4e1ffc000bb3b40001fc000bc79c00a32c3c54a801798f6c7e4e579dcca4d55b9f6ddfa32c3c54a801798f6c7e4e579dcca4d55b9f6ddf1ec5c66e9789c655ae068d35088b4073345fe0b030071b53468e6124803ed05bb4961177a9e5207744ce04e742c6397e70c3bab2c4161838ce8a7284a043f7d1ab1f18d025000000006802ed5074a42b84a99b5fb6da29d04c2c80e6c9dc437203acd698ade36c6eee0000206802ed5074a42b84a99b5fb6da29d04c2c80e6c9dc437203acd698ade36c6eee20ee6e6ce3ad98d6ac037243dcc9e6802c4cd029dab65f9ba9842ba47450ed026801eaf63db1bbed2ccc65ff8763bf9cabf44b8d6dce000000000022e09864fb4e1ffc00017ebb0001fc0001aa6c00c924a295c5c6c72c2a650224eaf345293a9c18050c5f490d930fd36cd578b0f71c053b488b42c4edf32bb66d6fdcd07b1268d21a3e021c9c95445293308d6bea256f36d8b92071b66fa64f4023737cbd1b5dac7c1c9bf514cae400c332a1091df0ba8cd007d641a92507d9cbbf00000000682b3e58e283081c51f2e8e7a7de5c7312a2e8074affaf389fafcc39c4805404000020682b3e58e283081c51f2e8e7a7de5c7312a2e8074affaf389fafcc39c48054042090e2875a5147dd4d0c167017ddc3050be5a0c8690348ceb20567f5f9b8dc55490144d0e04d397a70492557046f0416c70765363f6c000000000040c13ecefb4e1ffb1bde0001fb37d200f4aa6fd6b27d9649267b4ae48e3be5399c89d63af4aa6fd6b27d9649267b4ae48e3be5399c89d63ace33dbd25c0eca0572668b263e170a70de199dac3005f2269374676476f00068b7cb168d124b7b780a92e8564e18edf45d77497abd9debf186ee98001a0c9a6dfccbab7a0a0000000068512af99ba954cba495e96651a8d730880e21437a873fd9309b54ea9e3b53cc00012068512af99ba954cba495e96651a8d730880e21437a873fd9309b54ea9e3b53cc207459dbe6d9b1930f8d6bf4d0872b2ed6af58baa2f0effe608e6e2ab0c98c148501f30f8dc6c5b956089b30b3dc91867a3b72620b2f0000000000b92f8494fb4e1ffc000faa6501fc000fcdc401fc000fcdec0044b7348492de6612c17d0aff5a3f6fb5f338d57ab2f70938b1cfaba9eab8eee718a48f292e1d5180d86df99cea20e4fadf223310df529ce645f0db2330a28a648ac2b271105426f11a070d3f4854f812c3fd0241860afd511a7ac76e681210505ed41121b141e377a73faaedde0001e33c1f9be807b975c0f5e1c0e3c63175d9e55ea901fb8f3001fb05a368fa216e06d6eded3afecfe2c4b1320a20652972a006f85bc024d8f46dbe8d8800002068fa216e06d6eded3afecfe2c4b1320a20652972a006f85bc024d8f46dbe8d8820f526a08420ddb3e2613d4b76068f9ab4e1fddf144ed69a02e8db33eb66b653d601eda9e9c11e82f102204cff0c4002e701b3f5cd1100000000009f45480cfb4e1ffc000504b10001fc000514d40086e21949f0e591e8803504f5245bef823d701997f07b6cfed0116e02792156cfa9f595b52a3d87c82d08e955f84b217d4dde65a6519ab77800c7954730039715a9bc06634ab10b432e3a9d446d436b4584f65c19aef93c69d07802690df0b51d81da6ff9a8de1542c40edb0b1a00000000697c2c82e72c2adb8909de0659da51fd64cca28f8e3bda7edd8db0d0653d4e2f000020697c2c82e72c2adb8909de0659da51fd64cca28f8e3bda7edd8db0d0653d4e2f20dd94d2653996e56e93e922e2dee824f6bab41274f86b183fc7312eedb229840700840a5c486b762696e25eae2bc9ff85b0d44011f50000000000235c0934fb4e1ffc000bb3b40001fc000bcbaa006aa4bdc44241524d580524e2623576169a0ab5616aa4bdc44241524d580524e2623576169a0ab5611ec5c66e9789c655ae068d35088b4073345fe0b030947b7beffebce3bdee5bba609a5c4491711f9c8c42d25fa02ed7da12f2fd7342762ef913986f1df8cc13c0a4381d1e1d0000000069d69bae567a8184b2b254ca9a5c4b8732daef78788a3b722f931f74df08f9e400002069d69bae567a8184b2b254ca9a5c4b8732daef78788a3b722f931f74df08f9e420b90bf3823ec4c4c6b4e0283d7ddb9ec00f99797471d585a93c0cf29f9bc98fb000cdd609cf68a00b4c13b040736aca0237a41d3006000000000022d78201fb4e1ffc000bb3b40001fc000bcba3001e009a2934acb4c1bf40a84eb29cb251d18e8fb31e009a2934acb4c1bf40a84eb29cb251d18e8fb31ec5c66e9789c655ae068d35088b4073345fe0b03084c5c9186e0d8efb404f4806218c2a5bc711396f445c27b0cdc8d31246ac7cf42d4b38ffe62340570711e446651569cb0000000069f156c10220991da1f4e8d692a582ea686a028d532b037f29684610fdb60d2600002069f156c10220991da1f4e8d692a582ea686a028d532b037f29684610fdb60d26208e8e515f7025352e7c608479e413beacf0d95cbb964b47e4a98fd27b6b6b628a409a9ff9309062608aa8b3124cb264fd29810bfbe4000000000034d41347fb65e6fc0005e6990001fc000657240076a035432f549ce35f39ae28b45f19965340d82a76a035432f549ce35f39ae28b45f19965340d82a9a9ff9309062608aa8b3124cb264fd29810bfbe4308e72ce4ecb7e37c0ba5376c77ec364606b796eccd05d80583a36da42d57421c21d3ccc3b3105ab18f87901e03ce09a000000000069fea9883dea2a9a962965e56322afc4f22484c3289726708fc760110804abc900002069fea9883dea2a9a962965e56322afc4f22484c3289726708fc760110804abc920ae65c812772f699dfef8c267595bcd8989043245ffd5a478953f4ff6bafb6af401a7749b674b1a7a60ef4e659d00e285c83dffdeef000000000022e180e4fb4e1ffc000607e90001fc00062e5b002c191f6fe901a5475f2a87fc3aaa12502057e97cf573287084ca8cd1ca8ab21ff5436945022466c2c9d30aa841c8e37e16f8095f20aaeac9869d26d93018d5da073c85f04213bf2cbc10eaab55f3a2779c0f347e2fb9c869024f30afa57c7054ed6b69f2a03ce928bc9683ecad000000006bb76b085315ed584034979fc0df5d8c09abf056299dfbab264a82f57b7245ae0000206bb76b085315ed584034979fc0df5d8c09abf056299dfbab264a82f57b7245ae20a0fcf7abd47df5bc7389ce1562d3b36d08d13ccfce876241191ffc269a4ba76b00885df61c52dd658243170bcb804fd4437895c8c0000000000023a48665fb4e1ffc000bb3b40001fc000bc79c005fd714f8f797e38f44abc6bf6ee6a17a932b68e65fd714f8f797e38f44abc6bf6ee6a17a932b68e61ec5c66e9789c655ae068d35088b4073345fe0b0308552bfb82f92fc63648ab91ea38925f889da4e349a2fe50e07b06beb1d15668e0e6fcee57dd80ad932459dbe6c8ecbbb000000006c397ecdbcf1a9b5901d871dd908ecac4a132391989bbfe0f75251eddd6fa21a0000206c397ecdbcf1a9b5901d871dd908ecac4a132391989bbfe0f75251eddd6fa21a20741e45b4f21dcb9bc4c1395a714685c225b50ffffe403bc369da656127e31167001a63f648d47bd04707df3fdc4ebe860990625393000000000022de80e0fb4e1ffc000bb3b40001fc000bcba300fbcff1cbe6c28765f774e51a53601d2687c831c4fbcff1cbe6c28765f774e51a53601d2687c831c41ec5c66e9789c655ae068d35088b4073345fe0b0300befed2efcc28f3b82a25c59d2ae163d3940801f2ac4f36afbd372d6c1f6c02a8a5214a29aac39d2059ffe6ac8217925000000006cca50b04c9816b07a8a831ebec34866f1f0fe836047890dce4f1c46f9e8a3c00000206cca50b04c9816b07a8a831ebec34866f1f0fe836047890dce4f1c46f9e8a3c020a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e102031ace81ec2e17de17e57c69f3c3eead8334423000000000036bc4559fb4e1ffc000ccadd00000094d596c0f06812174b31eb104a44cb1c9456307394d596c0f06812174b31eb104a44cb1c9456307364f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7300ad4f577d067630f6fd15f4d2aefdb9456d648b71cb7253d47511acc81dd5ddb69a03c848322aa11e5242f66afde5a2a000000006ced683bb70cfb82159b08d68a9b6bf2069b328e3bd028a441574fdbb0f9d9a70000206ced683bb70cfb82159b08d68a9b6bf2069b328e3bd028a441574fdbb0f9d9a720a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e5dcef7f4fc2d4474828e84e85ddaafe52f606d7a3f000000000022d7abedfb4e1ffc000ccadd000000ad8cd8652d70a94aed1d6802bcfe9858f7c8a079ad8cd8652d70a94aed1d6802bcfe9858f7c8a07964f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730118081d1c248d74a0737f36e5bd40aa71b512c6be6f68e3664723849ac47a62fc743c4dc7234694bda1b7701f33d2e81000000006d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e528633209660001206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e5286332096620593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c18a93e60c572add22525a10a5554e6f6a4feca49fe00000000002ce4f2b5fb4e1ffc000cf99e000000f3a83d259634fbfc3e3c4ed50cdcab6598fce20bf3a83d259634fbfc3e3c4ed50cdcab6598fce20bc69a0bda7daaae481be8def95e5f347a1d00a4b430b8a2161c64bfdc7d621df51de569911a219f718bad4d6058dcca9bddf6696d43ddc4c1e3cf91640c93f820e5680efac30001c374f016ea61e76aab79b8bb95a1ba0e6e3eee6f01fb8f3001fb05a36d6eb7a108fef471947d245e9189e47284d9a720f95aab0127adb9bc6459557a0000206d6eb7a108fef471947d245e9189e47284d9a720f95aab0127adb9bc6459557a20a159f4eb744960b4d191a95585db3f17384e36e5f1cf8c7ceae4f13a1dc46505016c8a0d99a474b91b9119b0b6bfc4da988491ec0300000000005fd91a87fb49c8fc0004e25101fc0005345d01fc000536ab00fb38720e8317dce4ccfc1174da29f071077dd371387b6ba2b25346e89278b4fae874858a8c09960f6ebb7dea2d0ff4054af20815296dbcb9e0cfe2ba30955368e9fb5cce100a0ce6df64bcf624355222e19032cff0c80cbc75140173c2eb47863b189d2423b64af6544226bb50000000006da069138e905fcf845d2e92979086e2bf89ba25d50e1c59799cbf4d2f2a9d010000206da069138e905fcf845d2e92979086e2bf89ba25d50e1c59799cbf4d2f2a9d012055f820fe0081c55c139ebd9eb6d053aadb85d441a7e8eae8dfde4f4bddb3f1ac00777742af1e086c95ad279e2173e6e04937d9206f000000000036bf0f03fb4e1ffc000656800001fc000bd4aa006c0659d3417e8b51836885241a09ac204e87c55c6c0659d3417e8b51836885241a09ac204e87c55c1ec5c66e9789c655ae068d35088b4073345fe0b0308ea05dfec6d5186476b3096e34f6777c221cf0bbce352daf402bb182e2d94297521ffe8c3d09e3e430376fc5c147fe64000000006e736990d9bd8b9b1c0164b8634a07c0da1a2bce1543e7620513b5c95fe288490000206e736990d9bd8b9b1c0164b8634a07c0da1a2bce1543e7620513b5c95fe2884920db520fffbbe239dbebf8301c7ce3bc55a891e467cb3dafe3479fc4e97072d84700ca6b25bd815213810f685818fa28dfb0760b07c8000000000036b856cdfb4e1ffc000bb3b40001fc000bcb8b00a0efde49999335db44bcaeac0af934a4759ad34aa0efde49999335db44bcaeac0af934a4759ad34a1ec5c66e9789c655ae068d35088b4073345fe0b0308c74753516550b53c30a89f5d0c5e08cdc0145d1be5e45d8db75597745346ff4aacc04c1de1f31aa42e43e3fba15ec6b000000006e84dcf6f2ddcf4444bec6dc070d9cbc52c3ef6681a14238b2e1390a77a6435e0000206e84dcf6f2ddcf4444bec6dc070d9cbc52c3ef6681a14238b2e1390a77a6435e202208e9b3635f0fcc623f88c9f45256d6557744d5aa12f126adc3d07ed43a2e8d0192ad947d47ae5f960ea418954db0f96dda7572d60000000000175b61d3fb4e1ffc00025be10001fc00025c4400aff050dc4d29cd0413c1890c6d8db9e8372b4cd38d83de554dcaf4e9c01608497bf4b6bc63210142a4687a0e78a9b3a071ad6ce8e33b008ab5cb7dca300064583f3f5dbb756708aa405572d2eaf3349ec2d9048c93f21a2d1e5a0da7ae1675d27d626035ce0754de1898d5cc30000000006ebfbf45a7e6f5e4d25ba315f1e1a44178f6961271b23925a2871d0c5b9e132e0000206ebfbf45a7e6f5e4d25ba315f1e1a44178f6961271b23925a2871d0c5b9e132e20a06518e3c9374e778a185bf5a4d056b1816719feb626112da42d4a065fdf5e90000b22ca74c045f776efd482aca95f692d3551dd6500000000002d3dbaf5fb4e1ffc000c6da10001fc000c6deb0035d5591040d1158f08d837b59f0b57b6912560cd75246a92185e0f116ef70707a58be008da5ce1680b22ca74c045f776efd482aca95f692d3551dd65300f57b0dd5947df31adba9480eda73a2282aeee0bace77680da718af1b91a05f878e433e8455ad56a38918b5aa262be09000000006fbe7935a362d6c08e5d10af09398ac4ebd2edcd1f5d657816c4f0982da6999b0000206fbe7935a362d6c08e5d10af09398ac4ebd2edcd1f5d657816c4f0982da6999b2051352f9cdd2b3bed963c98435f57a9c2c868773e4aa0ac4e3b8d07afd2da0b3a004b1eda1e91bd4d5907b65f8755c4e3e0e12453d70000000000a5e3146ffb4e1ffbc4110001fc00019d0400fa2440f3ed05121bcc2463ed00d1664946b68b120f4dbff3f157e6fbdf65169a1c1a26fedf178dfdb2334b22379811352d9988876a6e586d975e7329300dc936ac5a2e0e0e81a682afbf1d5a4b6c761d265c944b7065cde7c0009b103b6e163441eab78460b0aa6951477123a0000000006fc2e949a1bb5bff22ac494c3434d2db20a61bc91c9f8a3e57048292abd33f780000206fc2e949a1bb5bff22ac494c3434d2db20a61bc91c9f8a3e57048292abd33f7820c73a0b3cce7ca6c5b5370ac2311140cdc30315ddb718f8c46bc2149894da68d80194970c5f6511cf4757972c8c723ca5e097d0999f0000000000c2100205fb07cefc00040bcd01fc000468e101fc00046af300e565047bbe00199e47400db3a356034373647fe7c8a4cfec45b3e5793f8413968d3bd6aa7c6bfffd9a5ff3a72145e4bae41ff7842782f8e851d4275b30032bfab78f78c968f4a1e7fb87d9b3bd75dd2a49e18b7592e4274322660c27f213b898442eb41f5db42291a2172508b600000000712c0edad9b39de087a2422aae59cbee77b63aef06de6db44b2b8287303620ef000020712c0edad9b39de087a2422aae59cbee77b63aef06de6db44b2b8287303620ef2078d4881f8591d4de1be992256cb869064f8a1778c71815e1854c8258f505a3fe01087514e6edcdb460ec2ec30cd6479db40659f0900000000000c9100205fb07cefc00046a5f0001fc0004709400b0c562adbfdb889b2e9cc84e0858209799bbe16857ac5622d91ea4b76a62b0e4d0a47bfc4a1fc03c9d2a53910bb9aaf740ddcea71e896e5fc5aa5239300ec57774146e447ac6cf131a40fb37664ed5f9ff45b59d22cc68f2aa9f4659cef42235b63c3f2c3ed36f8b2344399d2f000000007135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf70190001207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf701920593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c1063c03764190123b001e65fd3aa12c030df5bde82000000000036bda427fb4e1ffc000cf99e000000b920a2229f777e360b7da76885a556bb439533bfb920a2229f777e360b7da76885a556bb439533bfc69a0bda7daaae481be8def95e5f347a1d00a4b4309472710b11e34dd5f6fa0d43cdde23ddb33558be1539cc7275cf06ba2d82c6ba0c712e7022752843f411e6702eaa736d0001f9956e70daffa263e8cf29fa6557b7b630a595a801fb8f3001fb05a3714874684cfabe0cca907ff0e61bde28c2fc1a8840c485fa14ba5660bfad5e2c000020714874684cfabe0cca907ff0e61bde28c2fc1a8840c485fa14ba5660bfad5e2c201bbc52c48482f1e6f57e1eab3d8dc53904d5a16f9bbdabee5724578a8bf897560194cbdd7f7e53872cc579e60314867dcdeccea50f0000000000b6327d55fb4e1ffc000218db0001fc0002192400efeb6789243fa23cbf6b5137aa5d4dea847830e33f309e73b02fc83f88a0bf28f87d715a48678ea6e3c8d9b74f3cacd7ab94430574b9816e5047b9033011b8a3cdbf872f868b08b211878ef11a0f6f7a7ebd55533864aa98e53e194faa159ae2d13a7625384a3fd1572f68deb4000000007161d8618826c76aad36d8b59bc4c1fabb1d8299115f8314e74d7854fc3ef6660000207161d8618826c76aad36d8b59bc4c1fabb1d8299115f8314e74d7854fc3ef666202ae863fa61ba16e37e3dad6fc5c07939b8caf322da44272eeea7f645c447234b0049ec22c09c3152674ae7af85ee7e747d08ec387900000000010000000000000000000000000000000000fc0004bea80001fc0004c8e5019676669d0daf4a6ac06239eae91b43b4469cecb49676669d0daf4a6ac06239eae91b43b4469cecb449ec22c09c3152674ae7af85ee7e747d08ec38793000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000717a502e11bfa52d11a10635536205d60934f6f2d0ac64d7fc0f1808a5aaff01000020717a502e11bfa52d11a10635536205d60934f6f2d0ac64d7fc0f1808a5aaff012014d197a4d96ac8c0895b28bfa5ba04c094fdb7a9e073407a499b07b391d3cb980147a99e2ca7487d874d547e887d3f457175ae5897000000000040b032a7fb4e1ffc000d08f40001fc000d091300b7fc053090e0f10f64d962b36ef797ae608f4851b6e879f9bd59a349caa9d490f0bd51988bb1fc341f9162e004553e9fa0d415cfc38431bddd799a6230a90fce30ea814b244dc767b5d29bf227842226705a0bd2e8589e776a4dd113ed3dada52c6a07f55be90173d6431d8f340000000071d1eee72379edada11d464bcee475b37371e4d907db5848c3f50e0bed00a45600002071d1eee72379edada11d464bcee475b37371e4d907db5848c3f50e0bed00a45620e86078d3a9106a2cf3762064b7326edfcf99ac4e1dd76d6e80c9b94bd766737b01c34bf769f46fcc5ba593c2f3a4009c02e6e0cac000000000010000000000000000000000000000000000fc0002d5880001fc0002d5f10159b1ebf04d63af3ef87391a0a4a7b47f5f5e791159b1ebf04d63af3ef87391a0a4a7b47f5f5e7911c34bf769f46fcc5ba593c2f3a4009c02e6e0cac0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071e6b3fc43cbb7a04eac2799d8f98f76f3b0ac867a8b8c82caf876cd0737ac9800002071e6b3fc43cbb7a04eac2799d8f98f76f3b0ac867a8b8c82caf876cd0737ac98208e8e515f7025352e7c608479e413beacf0d95cbb964b47e4a98fd27b6b6b628a51ce81fb48d349c7ac0e09a8a5d152475b586f4275000000000034d41347fb65f1fc0005e6990001fc0006579c000883903918c1154fb2b589d80caed855a157b1240883903918c1154fb2b589d80caed855a157b124ce81fb48d349c7ac0e09a8a5d152475b586f427530975c482384c7bd4cfd5930fabac11646121d420e31883673dfb6e6e3bfa273da73a2a91b4b69cc108eff9619fdbb4cf4000000007228951470758be7eecda8126c7a23fe8ad019e67f3fdd5507003bf0d2d4159d0000207228951470758be7eecda8126c7a23fe8ad019e67f3fdd5507003bf0d2d4159d209d15d4d2f03b000755dd3f7fe619d08afe237a6c12a8cdeee78b75701495287201e0e440d4c365236c93f5fbe402336cba2c5a506242c80000003feee5bafb270efbeb250001fbec0200ad045f8cfda05187e5dd3f59cdc7f7692816320a5fb5dd519d994f5e5706b4047d65ba1b873d9ffc818d7b316758b285e41c565599c9168da68592913088d719278eef605d9c19037366910b59bc28d437de4a8db4d76fda6d6985dbdf10404fb9bb5cd0e8c22f4a914a6c55660000000072ee70fa75262781a17d1eb69a6c3e97328208be98b59d5530164f31e481d3aa00002072ee70fa75262781a17d1eb69a6c3e97328208be98b59d5530164f31e481d3aa20a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e60d38405d40979e4834a09345b8c7398e0ef14293b0000000000235bd038fb4e1ffc000ccadd000000889e8cd2ab0cc70e36e566648e265c7536a8fcaf889e8cd2ab0cc70e36e566648e265c7536a8fcaf64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73091f9052f62561db112ddca7df3d914d546866b130124eccb2ae1e8419563e51f239b2efec3d1b3fd388072610939d6940000000073091b5bc227073da93ca7c25ffee4f9c9e8b3f77b935c99e30e71268704f5ff00002073091b5bc227073da93ca7c25ffee4f9c9e8b3f77b935c99e30e71268704f5ff204cf1e357dc63a5335aa184c8ff929e4db36e83072425065c0655e09f072fea560000899ddc10954edc1ea1398edfd31b0621e5982d00000000008d47264efb4e1ffc000b3c090001fc000b3c630094ced88d9bd5cd2ec75faf451a5e3bb46f5eca6f90614a6e4cf57a7381bd81839ebce238cca8f9f1349317eb79cf1748fda1de3ea69a777d4272c2ee300fa3db9b808db89b49f91f6136cfb966288a56d731c9afd44dc8c4819ae5c286d08dc0572249f41dc919f888d562340100000000731ddb4dace693a27ac91c696685bf3e01440e2f5d57b53e2ed57059f6a33e0d000020731ddb4dace693a27ac91c696685bf3e01440e2f5d57b53e2ed57059f6a33e0d200064d134104e9a09e6e469e442e305ee542d1b5136a7dece41a2b812e3d89a2a00a4ee8867262e7b96728c873c15ae6d983a9e2478000000000036bfed34fb4e1ffc0006567a0001fc000bd98300cf3908c18dbc7d817330d948866a29f69ca15a75cf3908c18dbc7d817330d948866a29f69ca15a751ec5c66e9789c655ae068d35088b4073345fe0b0301213e8a0f73b54c388c26dcf85c158dad87ce9889f45a38bc330d1da4d73a6c02a8d9f6cdf60cdeeadf084c2749fa47d00000000737cba5a656579e1d2becfee2d92f6c7ae3b84a8ecef02c6f53764a6499a8c79000020737cba5a656579e1d2becfee2d92f6c7ae3b84a8ecef02c6f53764a6499a8c7920931fa180adaccb45deeea0a6a7dd618beea65f600ac6fe734e871f97e4476691004b1a70c1e0e8bfe39a5879c943a850f21875508f000000000012ecc7e8fb4e1ffc0006567a0001fc000bd983000eb5e37e0ff88007604e4ebdb28c3beb8120d5fb0eb5e37e0ff88007604e4ebdb28c3beb8120d5fb1ec5c66e9789c655ae068d35088b4073345fe0b03017de44da9886d130629436db995acc9d5f0ef849ff32c4f57b65674f19420dfe8e583dd2c5f37f88edee1ca119f0e8be00000000753f4ae544d5a43787502bda92bf3f635143a0953b31a62c2f61cf8c7df4345c000020753f4ae544d5a43787502bda92bf3f635143a0953b31a62c2f61cf8c7df4345c20141a04d46e28743a8ab8367ab44f05114161e45f3799c2b9f822d8f9895365ac001309f03f9235a96efbe29a9ca62e8fc600208c3c000000000022de04c5fb4e1ffc000bb3b40001fc000bcbaa008186bacf6b22c42e8a63e48c2b2e1ac614bf92db8186bacf6b22c42e8a63e48c2b2e1ac614bf92db1ec5c66e9789c655ae068d35088b4073345fe0b030147039e55cada215fe076a972b046224b43198c9f8d4ddd55db4dc38e4168ec1bcae3cad84f0bb2d9f3db9688561c84000000000754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e000120754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e20593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c19ad66f3780f47e83479e1846ecca44d71ba5a902f00000000002ce92c5ffb4e1ffc000cf99e000000e65f1647a5477a20d178b12c509738d7a35ff312e65f1647a5477a20d178b12c509738d7a35ff312c69a0bda7daaae481be8def95e5f347a1d00a4b43099b9f0fbeea3822cdc5b3654dea52103b3d9d5f01db4201955ea3689074d37da4711d8f313d4b5458eef3395aa75bfc7000146d938862af6d9a291e26c0048177db2892a710b01fb8f3001fb05a37551fe264f2ccc4e714195d2ffb79eea7ebd47517a7164c69653569b10f51fc30000207551fe264f2ccc4e714195d2ffb79eea7ebd47517a7164c69653569b10f51fc320c14b73c62e6c0b2df561e37a65ab15e2813a4fbbaa182eae0bb87e3506d4bd9b01b96ce21a90ba65c455609913a18eb7ff20ad55c70000000000a1bd4319fb4e1ffc000376690001fc00038a9c00abf73c421d3d73583ebcd9fdf55fe8b3013a8223abf73c421d3d73583ebcd9fdf55fe8b3013a8223fa34940e957a62dc7177dcf44e74e39828a2a371300becd48c0d44ca6fbff3825f55c35a6f70024f2b8f4f939260d40b5b51c11cdfff85f7d0444a1a9cb8fc45bacd237b310000000075adf981e3a77630507882a9a41d551ee1e5b8ed570e61a855008ca293e615ad00002075adf981e3a77630507882a9a41d551ee1e5b8ed570e61a855008ca293e615ad207a80d77b707fba35384adf0c231ce60d32273de39c9afa9ffc3edf9a2605fa7101828af5d4e701d9c3869a22f2417110f518f364fb0000000000a7636e3bfb4e1ffb9f600001fbeeea0082242bff3c046e018b795b7bc3bb8667628dc02b82242bff3c046e018b795b7bc3bb8667628dc02b69abc168964f63618f587649cb25ddecfb20fcca300fd87b62bf91162008451c1f00a1d7bd65ef581e88c153d105970ab30e451378966b6e4141e68024b3976461605e84020000000075aec7fff319c066890515c7d626166cdd3a28c9bbcd5d949027e5aec46dcbad00002075aec7fff319c066890515c7d626166cdd3a28c9bbcd5d949027e5aec46dcbad20a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e3f7100e7a52bc4a9c2bf5ba1bed4da45153e0f52de0000000000235ad9d0fb4e1ffc000ccadd00000036e3ce4c7f353ef721fc1754406cf534bab728b036e3ce4c7f353ef721fc1754406cf534bab728b064f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730124aaa5688cb7220be4600211257ae054554583ad9233e8ca0d58abafe317129dcca9e34a1b9bbfa175b88d9fb31b55e0000000075e5c254c195ef04d5bd91294b78211263726c3bc0bf5d4f92690144f65660b600002075e5c254c195ef04d5bd91294b78211263726c3bc0bf5d4f92690144f65660b620052fc2a04f75b150e4ab7c5981bd24532a49805ee42167b6058b832e3b0c2b5300a9b4fc06befaf833456c54d913154f8f115b412b000000000023573001fb4e1ffc000bb3b40001fc000bc7cb00cf3023e2146c3765ae4218f86e605ac503019d63cf3023e2146c3765ae4218f86e605ac503019d631ec5c66e9789c655ae068d35088b4073345fe0b0300100ed63b1fc72b11ffaac5471ec57d9c9a79214f936932e6a59ebef5938be6190ec7de6b98cf6ae92964d2c7a03cb0d0000000075f082ddd488b36e46fcfe4c5284898d3139ea58f9effa9b70fa12b25619890b00002075f082ddd488b36e46fcfe4c5284898d3139ea58f9effa9b70fa12b25619890b20070280de80a8c5f34f7eb94dc35d847530f7ef5a9a6d43d840b2256829e297aa00c4fca50e9f87d5a53b57d8a678b4fc048c7e475000000000010000000000000000000000000000000000fc000ff1b40001fc000ff220013baaeba63dfa6ee2fd67021647213b024f30d9593baaeba63dfa6ee2fd67021647213b024f30d959c4fca50e9f87d5a53b57d8a678b4fc048c7e4750300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076476a2678d5c1e9ea4951cdd00babd50f6c53f91427ba8dc8fe49f5dc1f5c9700002076476a2678d5c1e9ea4951cdd00babd50f6c53f91427ba8dc8fe49f5dc1f5c9720ebd8732e4738756b96dee3c0e3e60a0027e3b31c3fb0804ef78d46182a84e81c01e03b915271e6dfe5b91126e4bc7b8a981c7459fd000000000034dc3d58fb4e1ffb34f501fb355701fb81fa006dddbc8e0c2bf0803d236fcba6cc32a8123ef43e6dddbc8e0c2bf0803d236fcba6cc32a8123ef43e49d0dcb6162703c2544068536b0b1813c459dff83010142d44041c90621d111283fe46fd8b2450d4b9bebad194290fce09ba080679c748b1ba70e3959623f127af0d2bc9c400000000766c3edf3c134fc0b5ede4fb57b15564819caad310b1929cb5b57251114d64e5000020766c3edf3c134fc0b5ede4fb57b15564819caad310b1929cb5b57251114d64e520b07dc210a205645699a1c7d92d55b55dddedc6fb6c9a7265d1588320a024736501f09070f51717b8bc2800781c21d9b10733d912ec00000000010000000000000000000000000000000000fc0001904201fc0001904301fc00021efd0096b5ec297ab7b977f1f3318291a77ffad070259d8fce46d5cc1aec576dbf5ba0ada049a2c2c64fb3655d3f8b0d7ac259ce9244933bb35544a1341a7d30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be42900001207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be429020593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c1feea83c4756a349e76b9077636dd04b3306bac60d00000000002ce3894dfb4e1ffc000cf99e000000c0e3581e5165c63790a2b8d2670fb4a1917cd4b8c0e3581e5165c63790a2b8d2670fb4a1917cd4b8c69a0bda7daaae481be8def95e5f347a1d00a4b430b675a1940be872b6a0d4e1696bb39ea38179933a1bae02ae1eaf4b47f625bd939482f8791eb38925af47f73be027a64c00010498ade3c80045c2a7520e921180ae1c39da5c5701fb8f3001fb05a3777dffee76d4ac2b3c9222e6d3ce285527a16281b1d22d511fdfedde4e46ee70000020777dffee76d4ac2b3c9222e6d3ce285527a16281b1d22d511fdfedde4e46ee702079a698f19126f940710af2e89919bf10587c5e9de50451d2f53e76f05ece62a60032b089976a177c7b080b8bdc40d5f387113ed2c8000000000022d73700fb4e1ffc0006567a0001fc000bdc0b000f39e252e534cfd876389ce5770a92ab1d3454ab0f39e252e534cfd876389ce5770a92ab1d3454ab1ec5c66e9789c655ae068d35088b4073345fe0b03089fb9bc6b79eb7b71f8b0dd60c2eb5e0298124b9b10ee29c85415f245c67f4a3d7a8b57573e36110c85fbfedea7129110000000077fcca4a0e43f6e0b96687a87b4272eb8523315c8f2a176d0a2df549a869f3af00002077fcca4a0e43f6e0b96687a87b4272eb8523315c8f2a176d0a2df549a869f3af20460c7a309c739da005bea72bfbf0e74767da84a28f8524f8f5b328518ef147cd0177947714219c0af2be7af73357d3b65ffb6513c800000000008b9fce4cfb4e1ffb5df50001fb97a200f2d2bd8ce0dcf0434c3cf661c2045c6fdd22ba57f2d2bd8ce0dcf0434c3cf661c2045c6fdd22ba5795e13b9a85676df4a1c90dfe0be9725ed714828d30914aa95d1c7d7c39e0a3b213b6497f5c8624d4f476b8043b22c4f30cd05bc037c80d02b42625d743c6a18d0562aeb579000000007838259f0ed6819c5325b663499299319c7e882353c922a11c8ad517a0df99a70000207838259f0ed6819c5325b663499299319c7e882353c922a11c8ad517a0df99a720f3f696aaa2fcab176b1032150d96afaf982b58e24faa35b0c842ede6c9953d6300acb39ddb2ca2a929b3fcf215b699fd2459072ca4000000000022dbd200fb4e1ffc000bb3b40001fc000bce430070a68f83c21da5efaf550eaf261357e8fbbbe4b370a68f83c21da5efaf550eaf261357e8fbbbe4b31ec5c66e9789c655ae068d35088b4073345fe0b030854c69a40b8e3d4209fa88590a9119fb6274d3270618bbb0bee5bd22c801185369babdaf658d5bc6946f55d3e5e14f60000000007893b72d36e71a7b83a1fff61e4fbbe1400b11f12bfb349923397a2df3a9ff4f0000207893b72d36e71a7b83a1fff61e4fbbe1400b11f12bfb349923397a2df3a9ff4f2008ea185caab7f5f289c78dee4563bad2e103b12f662fd23eae770e5a04c48c44016922eb5a8a9b1d41b93076ad1e0a908fc6c5bc01000000000036ecd608fb4e1ffc0003842f0001fc000607bc0069d9f48f92fcc82ac6b04a2b303fb420c500f78643497f4ae216cc6f837b4d82ca8e6cd348b636b1f32bb66d6fdcd07b1268d21a3e021c9c954452933092427cdb8c9694e0c6ba086ed7c00dd9f52ca18e335f65de8a839a378b1e040b279c05e3822e7c2fbd57fa8852d04cf40000000079d1d6276e486ab033dd0984a1da33470b6ef293e19492f459cfba43e703f5f300002079d1d6276e486ab033dd0984a1da33470b6ef293e19492f459cfba43e703f5f320a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e55b4c00cc8352c3dc490b5fd1554666a1c90240a840000000000235d97bcfb4e1ffc000ccadd000000e7378cfcf68e9645d0d0ecbabbeaeb48af9a5ddbe7378cfcf68e9645d0d0ecbabbeaeb48af9a5ddb64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73092cafe1870e043973b2f1fded8de3d5a66dac5ade46aa0995157077efee92d852857bc7f03ed69c92723a58f8bd2926e000000007a1ae04de7582262d9dea3f4d72bc24a474c6f71988066b74a41f17be55526520001207a1ae04de7582262d9dea3f4d72bc24a474c6f71988066b74a41f17be555265220593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c1cc1d71953a4a45bd11d458683bbf2ef794d6d6e3d000000000023a612a6fb4e1ffc000cf99e0001fc0010f2fb0063c8d3ed082eb5d476a0940ef9c3fadafc4c5d2c63c8d3ed082eb5d476a0940ef9c3fadafc4c5d2cc69a0bda7daaae481be8def95e5f347a1d00a4b43093943908436a934c08582583b08cbcc50b4478bb79b7718789c25eb0ad2f3e5713ad4c152d4b1fd13cfd12bf896072e600017478cfd163788e3bbe09645776cf59642f28e37901fb8f3001fb05a37abe11022a30fb9e614725880e035fb48a8438d3885a3762cc53b2c3cffa38240000207abe11022a30fb9e614725880e035fb48a8438d3885a3762cc53b2c3cffa3824200c66ca577eb357cbbf6b8e64aabf19a07ac6876fb673547b44f6fe65a0e1adc10143af4ad2582f518ac45af4604ebb893c30a198ee0000000000128891a5fb4e1efc00012b310001fc00012d8b0028895ba824b3989b308b4062cb93c22a842e885ad6f5f660f9cf13ff1ff56a13042be5cdb214c1c114da731fe63359a29148e3f59d4235d5bd261c53308edd5cbdd7b381c92ac7de638440bb1ad417af0e82fece69432f36930a6defd3faa0d53d79bc3347ef684eb1e470abbc000000007ace7f64afc3f78ba5dcabc7f384a1a01ebd4d147f8ef629a968df09885db2770000207ace7f64afc3f78ba5dcabc7f384a1a01ebd4d147f8ef629a968df09885db27720a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e0a122072fe97d1a974045569ff2ed7743096099716000000000036d4597ffb4e1ffc000ccadd000000139d5a4134c30bebba6a178a1c8cf91d8bc47b33139d5a4134c30bebba6a178a1c8cf91d8bc47b3364f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730826fc7f30c49215b98d5cb47a350f888a306c52fa42c77e765b55288e622f03859273cae7e1cac99e67f7a9a96a6aa2c000000007ad29bc543761bfa9ee6a8be1f32bf5bbbc4f979d036676835b4717f8abb92110000207ad29bc543761bfa9ee6a8be1f32bf5bbbc4f979d036676835b4717f8abb92112039a506efedb5d184475201e06dec512e3216b1e42b1d7c0d6f8b0440e6e6f69601c51cb65f93928d010a18197b6c8631c41edf55cd00000000010000000000000000000000000000000000fc0002d5820001fc0002d5f301224cc410b74ac6206018520cac60988122bb337a224cc410b74ac6206018520cac60988122bb337ac51cb65f93928d010a18197b6c8631c41edf55cd30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007bf37a9b228fa18b95fe74186ebfd2f16a15b970fb0ce68c43fe7dd3ca1924470000207bf37a9b228fa18b95fe74186ebfd2f16a15b970fb0ce68c43fe7dd3ca19244720472419cad37dfe438ce60cfb70b9156af1d2bf6e1874fe958ba18f229b7af37b0133c019d4b8dcd9ba7a78607bf0a8f3c86bba886e000000000009080706fb4e1ffc000763f60001fc0007641b00e6dd610e8d417424f55f90b5c468011307051ecae6dd610e8d417424f55f90b5c468011307051eca02216766b853b1e605f1e7ffb5f50c61278ef9ca30897af9fdc7920426089efaabbae8aacd61ea4306c0a2c89b140c9d3a69a56084dabcea352d2e1ff8e1f3ae127313e989000000007c124a4c83e1947d0474b005dd388928970147153d2d6ac4a5d3ac7a56a88dd90000207c124a4c83e1947d0474b005dd388928970147153d2d6ac4a5d3ac7a56a88dd9208ed933b32509d96770e36575cb341bfadd20d512271caae9816fc65e0c4d50da0081c33ea64d832d50287c2769407fbab4e9487941000000000036f46ccafb4e1ffc000bb3b40001fc000bce2b008e4a45ffd92c0a560ae047a37ae10ae6082acac98e4a45ffd92c0a560ae047a37ae10ae6082acac91ec5c66e9789c655ae068d35088b4073345fe0b0300cf64b243bc58bb385cb911efa5aa0675e9a05d582e9a9aa9bec875931bd11e82c652a7523e37c945be068f3a5af5002000000007cbb7c6b65f9360c3ef908ccf93ef438a449938acf05c743b7b92647ab3ad2640000207cbb7c6b65f9360c3ef908ccf93ef438a449938acf05c743b7b92647ab3ad26420534d653b186b8ab60b401e8572d1f8da42eb274441c955f65c59f0fe3d275158018da8375dd317a277a3f946077e1c970a1d8ccdc8000000000068f85c62fb4e1ffbca950001fbe5d200f46b2001f6dd71cf0fa69aea9f5a71ff61423024f46b2001f6dd71cf0fa69aea9f5a71ff61423024709834244eb07040d585e826f04d8d26b016555130136de56a265eb21c006bd312a0353c7c3eed46f4f63c301c348fb5d5de8f965c9b60ac6a4ae805d0d241e4942821ed9a000000007cc4df7db9cf413c897452820cd2625afffc89711f0a26eefa7cb08f8806a1720000207cc4df7db9cf413c897452820cd2625afffc89711f0a26eefa7cb08f8806a17220f6b63b050d5a90a14e3d59047050495646ec5e1242ba53b62ce81cdafbeef24900e2a84d616dc589856872cf05535d435c81f4cd190000000000235b1690fb4e1ffc000bb3b40001fc000bce2b00cec1c86cf65d548313f4401d83ac2ecd67b89a35cec1c86cf65d548313f4401d83ac2ecd67b89a351ec5c66e9789c655ae068d35088b4073345fe0b03009c21792725c0c58038362caec9e4c73f02fbdbf2244404d91b39b3788360139178a60e16e9094af50c71df853c5d2c1000000007e065c97170d9ca4aff3f9815a989c45a81bd7cb2d691fb32b3282ef6e9ccf8a0000207e065c97170d9ca4aff3f9815a989c45a81bd7cb2d691fb32b3282ef6e9ccf8a200c7bc19d6b2acdb1f6f33f065a8c4e1522af8f036e65cae356be2ddaed7f1b9e004062160cb5c4f52f266ba4c0318d365450c9137100000000003695f949fb4e1ffc000bb3b40001fc000bcbaa00817a4306a27d64e71528a625310b5f347d55d180817a4306a27d64e71528a625310b5f347d55d1801ec5c66e9789c655ae068d35088b4073345fe0b03099b0d7b98000098120aab913482266dde9ce62412767f2771bb4b51036a59f3f93d65ab54b583641dd565e47132abac0000000007e1d6bdfbe135910f32160c96a38469c52e0c8c3af6c489dfbbca6b187e978490000207e1d6bdfbe135910f32160c96a38469c52e0c8c3af6c489dfbbca6b187e97849207c4283aaa1bcca10b1358405b9a9758b2dc48b90cc7847af63fe78f08e96f262016740b901d43493fde55958720fbe004747d1c7cc00000000002d4db010fb4e1ffc000374860001fc0003795b002226272b80f5aa9fce78cc60704f1dbcf81715012226272b80f5aa9fce78cc60704f1dbcf8171501b624b6528c6d0ffdd4993a76a23d06016cdefd73300d5a850d41302b179b9009a4969537c5cbf7f0145c94de4306a4e09115ec00248cb1aa76cf04249e2a5104b5cfa86879000000007e56cc8c37501f3db794a554deb4287ac61c83635a0dec6d0f8e0b54ab14f8cd0001207e56cc8c37501f3db794a554deb4287ac61c83635a0dec6d0f8e0b54ab14f8cd2095f18528a48b7308195ec8201220efaafecfbf4df55cc2c8ab6b518733c22d63010e3edcfe65ca42dccfb1cb826562a46097c6f044412000000022df662bfb4e1ffc001066880001fc00108203006afebaad117b22669d50cf8bffc7863662b1d7e16afebaad117b22669d50cf8bffc7863662b1d7e16c671d1b8ae658d8102e47f0bb3f795482a6e215308156eebd6b52f4146a5b3f9686b9712f48980dfa4e8f17b514ba185a31e8d5fa7568c69aa79d9533fa6efd380c27b0c00001390fef6518c3b4b95551fe1707e0f0c398d5580801fb682001fb01bb7f3eea026e3a3bbc8552525a653de7ad02256e664dc6a0dd5e85b6a4aa5386da0000207f3eea026e3a3bbc8552525a653de7ad02256e664dc6a0dd5e85b6a4aa5386da204dea6406996a98efea88a66bddbe7f9568093185b08c865b1b664ae0e594c7be08b1dce6de276ab51d6d1e36be38a3bb1908438b0d000000000036c96174fb4e1ffc000cf6350001fc000d08b30013b0b76a88de761e2de68dd590fb9b636aa288f613b0b76a88de761e2de68dd590fb9b636aa288f6c69a0bda7daaae481be8def95e5f347a1d00a4b43094916711f20db42a7a62118260a70fedcf09443a263ef1891a0744601315b81b03b68fceff6a505581dedcb794a164cd000000007f771a55bf8d18d1ec8c60e61494546e5b9ea1d0639369aa5d09cb3ec7d531440000207f771a55bf8d18d1ec8c60e61494546e5b9ea1d0639369aa5d09cb3ec7d5314420a56ba768ccfa43f27b401cc24a58c43bc067da2b413ea55538d03d322de2e75c01e5ca81c3110acfa3ac727a1bd05453d6cf06bceb41200000002f4b449afb4e1ffc0001c4110001fc0001c61400ba437071f332909dad28d293eadd2d532700e8a1f0a5dd8f973cec456a2423da87b5f1aa97f282e02f8c9d8ff7ef2ad45047238e6bc187d8c124247f30842b8e5b5cc0841de193f440d5fa3e0b4a34df7fffa798fb8c3df46fa31187162cc3b3ecf929689ae35e04cbac6e069f00000000802811a147502b6982e3b863c43b6cbe305cec9929ef3bef5674122ce17cf1dc000020802811a147502b6982e3b863c43b6cbe305cec9929ef3bef5674122ce17cf1dc208c47b1a602d9a9b72807b5c193807b04179fea1d2bbbe6ba2ea6fe36e6c5896e001a135a0120585004a87405b40ed844252aaf6bab000000000012edd9b2fb4e1ffc000bb3b40001fc000bc7b30000f9c0ee13e710b556c5abb7dba04252cff9525600f9c0ee13e710b556c5abb7dba04252cff952561ec5c66e9789c655ae068d35088b4073345fe0b0300b53e680359dcb0decea5bbbdc65576c6a03efc22d93347f19e635feb55fe0cdff6c0b9685dbc999d889f8eed8833fdb00000000807b6948d2bf213b63f7fb1af6175692b6df4629a6c83d59d933ca0c744a0007000020807b6948d2bf213b63f7fb1af6175692b6df4629a6c83d59d933ca0c744a00072007004a740cca33d9593dc8a62946dfb6925617f61afbf7633b21bfd248697b80007dd6b299910d521be585a9288ca0c7b20c9ca26f00000000002ce28ea0fb4e1ffc000b94c70001fc000b9cf300b5d77242ba975cfd47ebb7c1c6f991a868622f1867d64f06bd6c80af5a0ce510c05488c6b605f5b27dd6b299910d521be585a9288ca0c7b20c9ca26f3091ecae225a25f252b7acb8e79173ab1eebd850c6415019b7ba8d11510a48591c2d4d863ba8b716fe38f248fbe8a1f06a0000000083977cb9a12a31f510641cf6bf09190ebe245b167d9b455cd0437a197933dfcf00002083977cb9a12a31f510641cf6bf09190ebe245b167d9b455cd0437a197933dfcf2073839439e285bc285f129f2439f8f1d6f01092909bd405c318e10b1d68d5af2501eb95c9099b7ea9dcf7d12eab52c964628d99901500000000003695bb4efb4e1ffc000b9bb30001fc000bd21b00c4cb4d2d29e56d01ad22d35a7e9cb0b1bb694ca5c4cb4d2d29e56d01ad22d35a7e9cb0b1bb694ca51ec5c66e9789c655ae068d35088b4073345fe0b03091aa06ab2cf470a4265fbde61c153eabe3bd5efca205dc5de54c42f0041b163cee67b72f3b1da2962a5dee3096cfb580000000008458fbd557903692f8e27b4639421db21b0f90469d310bc9221ef592519cb3250000208458fbd557903692f8e27b4639421db21b0f90469d310bc9221ef592519cb32520a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e66e4dc94aa0f3fc1bca598bcc432424bc69ddf4de6000000000036b87e19fb4e1ffc000ccadd0001fc0010e78b00158c9bc3beedd2fae2f1a25b954f315c4fa44f6e158c9bc3beedd2fae2f1a25b954f315c4fa44f6e64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7300935576848f6ab7e27fff34b671953672012352e36f5147181926b8bbc9e8b43b98458704666df25d36f37d41eb7c6940000000084bb939170f4714be54d6217cffa5a3818a1c521115d45141b4df642b1dbc5ac00002084bb939170f4714be54d6217cffa5a3818a1c521115d45141b4df642b1dbc5ac20fc2b411dcc940c02c50ba66566ebc630687c29da1c8c6797c24a101118202d2801b4b492aad7a4e1697be9c6c24f6b4ae07b46190300000000006d61d62bfb4e1ffb8be60001fb8c3200dd52f6e013f0cff9cda0dae34d43317bcb66edfadd52f6e013f0cff9cda0dae34d43317bcb66edfa976b7ff055f5ce7ed9315f6bba901f6064495822300f4002936319c495d9557ac1bd514bc760cb8db72dd99d5d20af93dd5a7570974d75e5761fc494de28127ae02413819c0000000084cb17f8193558315fbb5acb6b285f80c3727489f3f167380189c73751ee99ec00002084cb17f8193558315fbb5acb6b285f80c3727489f3f167380189c73751ee99ec2049c551c2b1b3c0a0e8c90be10c5847f49f7573ba6038dfe56dde66127bada0b3001b35584083c3b6032acef150d939f606bdfcbfeb00000000010000000000000000000000000000000000fc0004bea80001fc0004c8e50197726f02d3aa3114065784a38c5b0c7dd66811d897726f02d3aa3114065784a38c5b0c7dd66811d81b35584083c3b6032acef150d939f606bdfcbfeb300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084d181ca2e1afd3fb416c71f62c2f5370a1e7f54c3400faadde30563e62f731800002084d181ca2e1afd3fb416c71f62c2f5370a1e7f54c3400faadde30563e62f7318204d00207605a792d8f6a528dadf5169b89982dbe9614f11224f70c4b03d45cb4301f3ce2464a6f42e28bdd570214f656bc226992fc200000000008e5d284ffb4e1ffc0001aa950001fc0001abbc00a4e27301bbacc1c42b5e2268bc2b4400599edcf1a4e27301bbacc1c42b5e2268bc2b4400599edcf1f3ce2464a6f42e28bdd570214f656bc226992fc23005b69b964d581a7659f5fcf2cf4a50a75e9cacccebc4e18d27364225eb3f9886de5472cfffbf9cf029f81b49037e27a20000000085412e8586e7e2015db1d2e9b4dd380e89251ed812e40bf8d5e220ee40bc18a000002085412e8586e7e2015db1d2e9b4dd380e89251ed812e40bf8d5e220ee40bc18a020da0c7a3d5af8a813d69d33357370066a2f5e1f7aa6fd6672090f355b81c3d566014c70d3eeab48b3455b85cfd354c9b4de7c267e3e3c23d70a00a747dfd4fb4e1efc00024da90001fc00025d63000835d0e8b7da48d8880e8d3420b7c8351c7a31d84b682e8847992b8e9a2531cef5a3169ea5b80c58d458f5157d91f4832e66eb8630ab3dbff95551d83080b7defb6341399f9e9b4ed7c2d627fc828d0eff9c168165b75b24e5fc6c3f5bc8a9eeaee2bc655fdaa58c0d2f3b1b940000000085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be82400012085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be82420593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c1aba3f43f7376b9025296fa73a30c07ccf5266eed8000000000036c92083fb4e1ffc000cf99e0000000f89b9ac5ac8f31255f692a3eb0283d0ef3be4360f89b9ac5ac8f31255f692a3eb0283d0ef3be436c69a0bda7daaae481be8def95e5f347a1d00a4b430ac3026b3e3023db1db9ec8e3b7678761820a2a6e96e7a5d9a39b1894170f9cea7765d3d131d60fa9d17492ba560fb1f9000168c506d43816d1a8389c860c1d162be44d1e777c01fb8f3001fb05a38627ed5599adf01d97427316b0589c2e97ba6418916a9bde5b2585e1c9c4f6250000208627ed5599adf01d97427316b0589c2e97ba6418916a9bde5b2585e1c9c4f62520aafe6abef33b368787d302dc54f71cd0a619d4f988d3263aecc745238871bd0d01deaeccbae07a6664dc82067b7cfff4ff84c09c1b000000000022d0d181fb4e1ffc000bb3b40001fc000bd203008b582cf224fbd769b14e7bab26bdb4e0c9ca5f038b582cf224fbd769b14e7bab26bdb4e0c9ca5f031ec5c66e9789c655ae068d35088b4073345fe0b0301261d7939ba80738dd1ca4ed73829488159433938e37256803daebcd7042f1963a66a2eb58622a87cc91aee8225a464e00000000869b6700423da629920dc2101ec88e894f450f66aa751879dce0468945e04179000020869b6700423da629920dc2101ec88e894f450f66aa751879dce0468945e04179200c0397f81c000328a2de9d047105f8e01d0ef36fd900ad13691aeec8c536595501352b6ca5a0485762fbe87165aaeed5c05ed4882700000000010000000000000000000000000000000000fc000192350001fc00021efd00e049e560af6d16e85a90ec84285dabca4e44514e011b1a772ead943d16af20c36c7255e18ea51027c0f5b027f3497c6e3151b44b63e43776d34c3b62300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086b8061fb7fe866b492b84e85aa0548f68ff376c4cbc5893e46ae361a5e5724100002086b8061fb7fe866b492b84e85aa0548f68ff376c4cbc5893e46ae361a5e572412085accdf9c5e5c660057521c0001e313efd673a38d30be926546f897d5b71fdd901e0d22538c2de001eb6fc6c2444c442e944e888e500000000006deb4738fb4e1ffb1c3401fc000132f901fc000378e300c8270f9d208c75006659cedd927f04ccf829242cc8270f9d208c75006659cedd927f04ccf829242c39ec59af37fd69ca39664fea97c3a5d3758f3b17308d1412ff39045ef39c2e19a75cb3ad986afc14c3139ed0a3392b41d471558676029a8137f95b0ba0e7315bf11c497f0f0000000087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d67891800012087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d67891820593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c071594bae6e759f13fbc246c11fbd8d97d68911241000000000023a79195fb4e1ffc000cf99e000000762e689e7bfecbe16bfd0e6138eea642ee0513c5762e689e7bfecbe16bfd0e6138eea642ee0513c5c69a0bda7daaae481be8def95e5f347a1d00a4b430a7afe7674de986aff5e2e0a173be8c29abed8b5d6f878389ea18be0d43c62ad1ba66a59e9e8d8453aa0ed1a69697675800019b9cdbfe3568cc0b37f136b00a634c75653f05e301fb8f3001fb05a3870c6a346d863f0963e4a5f251dcd712b0a8bd8ef6aa8f63c7ccfdf981810705000020870c6a346d863f0963e4a5f251dcd712b0a8bd8ef6aa8f63c7ccfdf98181070520634482f1393532816bd77ece32a84a17a334ac110e47184574d16d8b772261c9007d4af03527d7d34738eefa6bef126718c5e4edc50000000000235667d3fb4e1ffc000bb3b40001fc000bc783006d8404dcefe34e6d52bdb4350026dc8ce574b05e6d8404dcefe34e6d52bdb4350026dc8ce574b05e1ec5c66e9789c655ae068d35088b4073345fe0b03001715f72f5b165d307bac41c2f933aff79265d1b3b7fbcea31e1cf842ff4955b8ec9f510391659eb05282aaf7434b4b500000000874c44b97f12d2ab126377cacdeab45e3fff8c78267c71b1ad051a714d58e6d5000020874c44b97f12d2ab126377cacdeab45e3fff8c78267c71b1ad051a714d58e6d520a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e4da1130bbd7061d88f984d3ec1507026ba9b2493b3000000000023552198fb4e1ffc000ccadd00000001ecf043431973b9cff69b82f15ac7f6a6eb15cd01ecf043431973b9cff69b82f15ac7f6a6eb15cd64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73015a577f51dc6fd7fa4621f0a4601e48fd65418a89c2af2afef725fb4f053a8ee5841cd3fdae39ebdf5a202e0c4deca230000000087c23375674218932c768502d4ed00794fa327b0a95f3fd07e3366021284a8ff00002087c23375674218932c768502d4ed00794fa327b0a95f3fd07e3366021284a8ff20e7b95bea480d82316911dec49a09e8ab6a65a40fd4fdd93f11372737636de4cb019dd617c523be40d62d6fe6c8099a2731bb8f64b200000000000353f0dcfb07cefc0001d4d40001fc0001d7830041abf15cda4f87c47836fa95b0e6909449272a4af2b29900381739339a74d57fdbc677a6ef249f1c040683a4f0f1c3abb09335c41cba814d8f1a24a3308074793934715bde7630f4f267a9647955ac45400792369bd3e5f88e2b9d6c809251b79428e3a8ec07bdbb7364e3c2990000000087c5a82f46522a809f60943985bdbbe6ab131f49bc4b35602c0b2ed34dab354d00002087c5a82f46522a809f60943985bdbbe6ab131f49bc4b35602c0b2ed34dab354d20ae0e04e42fd5e99597eeca25834c5eacb8c990957a179f2873cf4b913b97af9d019723404c2622b84de329f7bc2459cc224eec9ba03c23d70a009de62866fb4e1dfc00025ea30001fc0002847c008a8dfe8a388fbef15d0035c320ebefd5ac5ae2463305078857e34417e861260119603fc23c67d221d458f5157d91f4832e66eb8630ab3dbff95551d83084fb8f4119d367a2336982fecdcf326c56b7c09c0911994720ebe2a657d5d95252be1871889b13f81cdd16d49e15a7d30000000087d21608895b8148fdb2c846d5401158720c3721dc07c4fa0981f2bb25ae52d600002087d21608895b8148fdb2c846d5401158720c3721dc07c4fa0981f2bb25ae52d6201e4a5c4121ca8d8f8e51946d9fc42b510937cc7e0a0b9ff1b353aa316ce8a4fc017433ee61219aace0ffab939271e77c28e1290556000000000044b7a536fb2714fb6a490001fb6aa200419483f32fe1e48e4fb5ae37cb31cd39247ed46a419483f32fe1e48e4fb5ae37cb31cd39247ed46a6428ac0c44a1383f70c2fe1f13b588e2dd3b14dc30974b7b4e608007f22ece8fb933fc18d66cf35cc0e5a7977279a092976b501786d4ab9108c7fda681e23978bf54b7709a00000000880ddeceb54dfaa8c4750e03f69d38c06dcb2f8ffa9dafe9b3f7a08d28d45e99000020880ddeceb54dfaa8c4750e03f69d38c06dcb2f8ffa9dafe9b3f7a08d28d45e9920a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e63dbebe4f6a661367d4a83b8f988b5759628d7f66f000000000022dc5551fb4e1ffc000ccadd000000a9cab48330c4f2058fc7d331b9355b91056c68e1a9cab48330c4f2058fc7d331b9355b91056c68e164f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730111a30e0a5f2f5135dcc5f09498e4ba5de22c7680f396599f7f29b91ac569c3d4336bc157443cf8c06682bfb5abb22710000000088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f00012088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f20593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c03090aa69c8d1a95839e017d1b2b53d3499fa0a9aa000000000034211c2ffb4e1ffc000cf99e0000000799f054652c1cef10d2994fb83d012d559a1faf0799f054652c1cef10d2994fb83d012d559a1fafc69a0bda7daaae481be8def95e5f347a1d00a4b430af9cd8567923fea3f6e6bbf5e1b3a76bf772f6a3c72b41be15c257af50533b32cc3923cebdeda9fce7a6bc9659123d530001711fd9548ae19b2e91c7a9b4067000467ccdd2b501fb8f3001fb05a3886622da5d1f1b025f69e4cd924fc1928ea35d8312b807d8b50d63107fbd9a16000020886622da5d1f1b025f69e4cd924fc1928ea35d8312b807d8b50d63107fbd9a1620afdc274a214d9cffbd84cca49182cdd43ad3abf0aadb1546dc88cfe6c0a754ac0008dcd60f55257d858dca51e0ab3b65e4680cf572000000000022de0637fb4e1ffc0006567a0001fc000bdbf3000fa716254623b29b7651b989fbada389aafe097a0fa716254623b29b7651b989fbada389aafe097a1ec5c66e9789c655ae068d35088b4073345fe0b030162563fec3d0cae18031294dd0f6a4bbcd153bc1c087b18a7438a95650a2225926347ed3f7cb4723972ad97251b6b35d000000008917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f2340001208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f23420593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c21fe8d862d5042691749e866af337e50e599e64fdc0000000000340d8492fb4e1ffc000cf99e00000018d9316618b1f55977af250cc5d8783617084aac18d9316618b1f55977af250cc5d8783617084aacc69a0bda7daaae481be8def95e5f347a1d00a4b43087d25769002af2a4f050127c73fff03a24935e48f34fecaacd69410787d0e6384b345c78e81b1cb397b43dcd635568b600015bdbf34a0dad860c6ec71523ae39373325225cc101fb8f3001fb05a3892048b276a248b44e0e0c498fe0133e19a9a19ff03d2a6201779759a9e597fc000020892048b276a248b44e0e0c498fe0133e19a9a19ff03d2a6201779759a9e597fc205b016215386c035a42042a93736befccdb87c30cb90adc3b1279da58ac57cc14035a6f7ff4fd5aeedd90b2d4a9a746d07039afe6e3000000000022dbcd67fb4e1ffc000cf8b101fc000cf99801fc000d04c300db6568bf9cb89a725c973fffccd4baf12b4bcb82db6568bf9cb89a725c973fffccd4baf12b4bcb82c69a0bda7daaae481be8def95e5f347a1d00a4b430a7676e9a8ef4eaafcf47451801388500aaa1c1994c5df1619eb3b54b83dfab28c7969b262454c0397fe6fc14dc8c62d9000000008ab9b419adde6c292a0376f1b010293252bbb70b7d1ac3e08a843cf7c1d1ec390000208ab9b419adde6c292a0376f1b010293252bbb70b7d1ac3e08a843cf7c1d1ec3920b7ced6bdbb2bd4be7c03c89225aa80a21fa0f189164195d6b38e852a9f615a66000abaa849176e61dab40c075e5a1e80e0f5dc8133000000000022d18d8cfb4e1ffc000bb3b40001fc000bcbaa00a3b6ec8347384c53813aa4eec3f5b4608434ad71a3b6ec8347384c53813aa4eec3f5b4608434ad711ec5c66e9789c655ae068d35088b4073345fe0b0309226928f9d21053e24678f1aea92d7668e8c8b6f75c07519a32a40491428908dd31fcc8c7c630d92eb1255592169b8ab000000008ad0ad3c5d5e607a7978ba3f026240beb079a186a784e2034b41fffe917c46fd0000208ad0ad3c5d5e607a7978ba3f026240beb079a186a784e2034b41fffe917c46fd20a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e458fbc9d5e0fa407cd7238155ef388b400bdb7aeba0000000000235cdb7cfb4e1ffc000ccadd0001fc0010e77400cfbd1e90f25b6978cc09db70685726fd4469de39cfbd1e90f25b6978cc09db70685726fd4469de3964f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7308ea71272ac9a9c891f0987a75e2200a44fc063bca92892c0a174cff4c0a524935e0b870bd091329836e43ca7d7c87e7f000000008b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e08150001208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e081520593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c0b3fe432c394e3e96e8804a8e059b1887afc913012000000000034229032fb4e1ffc000cf99e000000b802f02882ed36279ba95674e7e190e86bd6458db802f02882ed36279ba95674e7e190e86bd6458dc69a0bda7daaae481be8def95e5f347a1d00a4b430a1749fecb407bb0e0ab9d6df65ea068dba5dc03e14dcb36abe5cb2b5c6e424683f715ff09ce290d035dbb31add0c01800001a0a0e17bfe82a484fefe348b7569a6d77d29d2c201fb8f3001fb05a38b971ef085c168cae87c3ef20dcdebb23a9a26eb7d47a4f793aa2353bed4018e0000208b971ef085c168cae87c3ef20dcdebb23a9a26eb7d47a4f793aa2353bed4018e20506cc8538b9cda4631382a1226a65d86a77ee7ca6fdf7d649c06a104c956903b00e91bdc77d4faecb8481e9d54c7e69a74c98d664c000000000023a63971fb4e1ffc000656800001fc000bd4aa000466dd0bf8e08e82a49b9d1e42872510886ab7630466dd0bf8e08e82a49b9d1e42872510886ab7631ec5c66e9789c655ae068d35088b4073345fe0b0300d82df2de7cad8263357f244c3c20824b450e7ad24c6ab0e264a0936b7f737e9402144c5205d4e38507dc90226ab97f6000000008ba8c6867b46bb40408022696bab30719990806d6e5eeebebe8e5377228b3ac70000208ba8c6867b46bb40408022696bab30719990806d6e5eeebebe8e5377228b3ac720dc964f0dba071a3102960a4848d57042e6397a041568e0d8f988d79202fcab780186f37c9afcf2222c2e1846e6aca7cc3075cbbf81000000000022d2f6b9fb4e1ffb7a1501fb868501fc000119c3007dc8a7ab041ff32acaee3dcfcac1e36bbc126cd2b2ea896299dd86bc7c3353a40d354be43ca263727eb0a0af302dd9ff95daf9e98d2f1f2c5d764f74308b5d53516c0c7134efabc77f5f7d19b6e289b5e8befc35ca5d77626a252e659888fdd09a7c9bb286dd9fc4d73025bcd7000000008bcd5c2b4956f890f454d07300fbc2bd5ec291f9f68c5ab4f44af8073a5fbd8b0000208bcd5c2b4956f890f454d07300fbc2bd5ec291f9f68c5ab4f44af8073a5fbd8b20a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e59c3439bb3f8a5f9106af32c1c8cc8d730bbbd8e9e00000000003646f303fb4e1ffc000ccadd0001fc0010e84b00365a8a65e5270895c8e0a3557b1bb425c8efd7da365a8a65e5270895c8e0a3557b1bb425c8efd7da64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730183e7c881c6c556701b21eb3f837e2661ad4ae1ad5b9f11faf6cb1246daf99157f3da6491b8dca8517b33b32abce82a3000000008bf18698fd403d18f976fc5f89d79db263fb354a63781a512e2d48faa17190f10000208bf18698fd403d18f976fc5f89d79db263fb354a63781a512e2d48faa17190f12051d89c906e2bddf572717e4806a4be5db96b544b5c9425a069351a0e218c9c2d01e973eded63a3abfb7f48eb28c27469e5da76a01e000000000017f0e8c3fb4e1ffc0001ca240001fc0001ca940039f55c68417e332cb9d56879392d0d34b8858df704dbf4531a1c3aa937a63bb4d5a67f13a335d5c3b1605918c84d18613d2c487619ae380f36282ec8308041404bfd1cd4b71416116af92b7a17f42c47bf3dbc2294369fe1691eccb9ba851183a0e85a4fd728c946a582d006a7000000008c15296dda100476466c2af9f2d212097c0dad634c47894e34e89b0772a7ef6a0000208c15296dda100476466c2af9f2d212097c0dad634c47894e34e89b0772a7ef6a202dd418858077835bf0cee0935325099557a492a8de9117e9477c520eb8349d5c013db931950d15afac53606bc3191ea0ceb8f1a0380000000000340ce25efb4e1ffc000b9bb30001fc000bd24b00bda32a6923c976abd03cf593ee3eca92f44213e0bda32a6923c976abd03cf593ee3eca92f44213e01ec5c66e9789c655ae068d35088b4073345fe0b030858aa595f574ea2a3c76a01d3de5ae733932304d08be169583c75df7879dff27232b0aae832aaa25f318c38794b9f670000000008c754a2bdd2ace903ed98aae9f52f481e7a6949ccf422f4297e0ba9a500ca2740000208c754a2bdd2ace903ed98aae9f52f481e7a6949ccf422f4297e0ba9a500ca27420a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e51a502e87250d362827c252cbf2a4b54bc793b34670000000000340c3659fb4e1ffc000ccadd0000004bbca9fd6c162000d1042f510196c4d069bb05f94bbca9fd6c162000d1042f510196c4d069bb05f964f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73014eabcb82f2b0b9cda8eaa3cecd39f0058b418cb7a25795f597a811895bfcc23643bb25ae8432a52804dfb53575b649e000000008d4d1bfc7e6667a370e072079dc70b3e3268f71a32a54371487339429aa475360000208d4d1bfc7e6667a370e072079dc70b3e3268f71a32a54371487339429aa4753620431d3dbca48a3392be9c41a68961f2d1cf3d5e5b93151b2b1e47f635e03ba2b6001d70b39a95401ae5dd407a846e9a775a92513f5941700000002d3f6868fb4e1ffb544c0001fb669a00752afd96dceb969687676e32c4cd3116b76a5c84571ac9b0061529d85a340440e6fd38a3ad5633c847b71db162f3f607a3fde13909f0df2e296a72703005e588704a6f6d703617081d8328c006b1173d60aa26cfe44b954f1279a1ba9a042bddc5b3a00cbc8180676d12060d620155ecbd72e31176702506fd6219751a8ae1a6c4310000008de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc40001208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc420593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c1dd08fdbbe79813bc43a306740d2182674141d76de0000000000342b56e7fb4e1ffc000cf99e000000300904176cc6023370b2462964c12c5979b9f411300904176cc6023370b2462964c12c5979b9f411c69a0bda7daaae481be8def95e5f347a1d00a4b4309502bb884b3437d65c0e025e49fb00ff6ea9f55d5bcdc36330b46c8bd18be9126b7a6d7f35f558ef8040f2c2284500a50001337b7fb5d2c531825c3e0123ac3354018085b30201fb8f3001fb05a38e0c95f8f71cd450abe7495077ecb431068da7821ca4e38af735565ec630deeb0000208e0c95f8f71cd450abe7495077ecb431068da7821ca4e38af735565ec630deeb20a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e375f7056751bb5796fd2d228ed85f5c88b053e6443000000000036be8308fb4e1ffc000ccadd000000d28ef7142aa96b23b44a0e7a5294dc2152e5f53fd28ef7142aa96b23b44a0e7a5294dc2152e5f53f64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73094a0bd3671bf20ef2a75c2e1723eda50a4d7566ceb0f5e018af7c576e11b1320b4b370e703afd4a7220a7c5688414040000000008e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c00001208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c020593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c20f53e3ff160dab7ec3cc2a6b0afa6dd8d36e38794000000000034599a30fb4e1ffc000cf99e0000000063eb51fcfd121e6c3eae23b90b26cd1100217b0063eb51fcfd121e6c3eae23b90b26cd1100217bc69a0bda7daaae481be8def95e5f347a1d00a4b4308160877a911d8bb7d1e75e2320e98cc3233c1f6972cb642424bfcec7c182c56d2c0ebb59e45f788f4d5dbfa2ebff3e3a00016d57707c196e06487d326094c964f258f5b77c3501fb8f3001fb05a38e7a3cbb99a9ce89685175ce3b3b5efe33498f22ddb539a2c66190390ff9e37e0000208e7a3cbb99a9ce89685175ce3b3b5efe33498f22ddb539a2c66190390ff9e37e20a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e325baf1be4d6ff7516aa41a0c9947396f5dba016a70000000000235a2a40fb4e1ffc000ccadd00000072ed00fe080bf542275abf350c2922a8a2ff119672ed00fe080bf542275abf350c2922a8a2ff119664f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730082cbd9118474316f40b800e43f94a121928f256fd340098ff0ad81a902c4326dda4b42737d52739482f2baa80c487cc000000008eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f0001208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f20593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c0e55b79902ab8dc5c126e61ebd5bdc2ec98d80836600000000003644ebc9fb4e1ffc000cf99e000000983259ad7ed51267fb83a8e41bbaa5ab55c632e1983259ad7ed51267fb83a8e41bbaa5ab55c632e1c69a0bda7daaae481be8def95e5f347a1d00a4b430b942e2e50c5cf9d9fe81119cc5379057c05fe15134f85847356b5d1f6a21f29f4a53f61f03338d056edc15a8c63fbbe80001c075993a8336f93a13bb7bbb7e0e89928be4aafb01fb8f3001fb05a3900618389dd73377e2b33b021d2e8b0e7c51f8f5c1d871af15886e3cd6e6d6ae000020900618389dd73377e2b33b021d2e8b0e7c51f8f5c1d871af15886e3cd6e6d6ae20a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e3a699566abcaa3fe7f3568b95e28dec3bb11537726000000000022dcc2fdfb4e1ffc000ccadd000000e7b23e56a97aec080890987ca187cc902a4efe21e7b23e56a97aec080890987ca187cc902a4efe2164f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7300dc75e865b89e96560b38fae96f1d0a5438795778e68b705a506046245ca5dbbedb09e2379eea4c9bde0d0fd4fe0508000000000902c18f9e7451f382b6a41e96b766ac3754e792a31e75c8ca0f2da5bda93c708000020902c18f9e7451f382b6a41e96b766ac3754e792a31e75c8ca0f2da5bda93c708203ad39dbb8bfdfb4a46d3f8b1e5b328c4724acac30b82034349a6b831070b8dbe0008cfb189e4df6f2fee5f9c756a0cd23b3c871067000000000053e97783fb4e1ffc000aa0540001fc000ad2eb00747d38fd242d8f1114f47fa24a233831b5305962747d840bce00916fa12947def52684f03a37618b08cfb189e4df6f2fee5f9c756a0cd23b3c87106730198e877839e3a29d8e1e0f0f8db6d9e533902dac30db36ab1330fc4e1e45427b658fac866dd8bb65b0c68b263ebc695f00000000904132db5c8718123233252283268bd908f1585a7a8db92f997c03694914f0d7000020904132db5c8718123233252283268bd908f1585a7a8db92f997c03694914f0d7208e8e515f7025352e7c608479e413beacf0d95cbb964b47e4a98fd27b6b6b628a20484569a0b078f0dcb21a0253aff10ec06b1aaf01000000000034d41347fb65e1fc0005e6990001fc00065754006efa257a906f0adf9b184b0738a187a5b775df686efa257a906f0adf9b184b0738a187a5b775df68484569a0b078f0dcb21a0253aff10ec06b1aaf0130962c65927aa1616e3783ae7cdf8c3d19b4c26b477686a9f146cd9ae40eb7c0e01a1580d5df8c32d1f4c43a52f62ff5e00000000091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d00012091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d20593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c1eea45a388d248dcd7433c8c8113d5d0966069413500000000003428db29fb4e1ffc000cf99e000000cf83406065cb65ce74100f3c35a0324bfc92dcb0cf83406065cb65ce74100f3c35a0324bfc92dcb0c69a0bda7daaae481be8def95e5f347a1d00a4b43081ad0f9be5a88ae62ff54fe938dfceea71be03bd4c6a7aebf75896e8d495d310acc4146aa4820bc0e5f5b06579dedea5000102aa69f8ef6666e7cad6d9323755a0ef3c1b6bd901fb8f3001fb05a39212f5312730c7881b882b9fb7864dc686fa5a585b7a93253ccf1ce87ee593310000209212f5312730c7881b882b9fb7864dc686fa5a585b7a93253ccf1ce87ee59331203193e57ee81ccf3c25937a5b585afa86c64d86b79f2b881b88c7302731f5129201eaf63db1bbed2ccc65ff8763bf9cabf44b8d6dce00000000006418ef40fb4e1ffc00017eae0001fc0001eef4009f804e8f9cea38d4380e1e4600d4e16bd49ac9d695dc83d7059a8aeca9996d6c5436db3f8c9924fff32bb66d6fdcd07b1268d21a3e021c9c95445293301931bdfa94f15b64ed9d09d210db9998dfa068332fee19d8e1ba4872c0acc3efc723e2fd04a64ef2da473caa4471c69e0000000092b5bbdfcd2d46938c23f5d48ac6dbc2fb041172766455fbd8863cf81e8bc9df00002092b5bbdfcd2d46938c23f5d48ac6dbc2fb041172766455fbd8863cf81e8bc9df20bfbd6a521797bda7e2a5219db241c335870a521037815380e7ac2bca5be84948017bfd226583bc3ca0a3547672f9d264fa04a9d9c200000000006a0c494afb4e1ffc0002fbd50001fc000377ac0007ec0bbe822a5aa140229c9a460489563a7b6a77bb9bd2501e88903aa50a1eb8f36a5eb1fd0a29e250299c1357baa7e34f19a5be2a225eb65f5dd9993007cff9e4c50da82722bf41fa5da01ca4bdb238d8d53fef085a56c34a432f6994c79e5bf754898499ec4dbe91eec0d00a0000000092e1ab09f73e703c196eea46780a14e8eefa5b5e1c0ee31be05718056e020af200002092e1ab09f73e703c196eea46780a14e8eefa5b5e1c0ee31be05718056e020af22020904a313c770af35f380bd22f3f7a1891a7f368e4594de5889adb9beae26911003306e27f0719a83ffd6ebd35183d8dd714991b39000000000012ec7145fb4e1ffc000bb3b40001fc000bc7cb004c6cab39e8742edc7d062b3ec2c51aee9342e8dd4c6cab39e8742edc7d062b3ec2c51aee9342e8dd1ec5c66e9789c655ae068d35088b4073345fe0b03011b5a1fc5f84431ab1546dd7189b7ce61eb9a0615a96e4467819a4af04a633627aca3494cf5636f2376228bbf7e91b470000000094044c070f9ce6bdd05c2b655ad2383c8402a74c10e0a9a3099d759b33cb763000002094044c070f9ce6bdd05c2b655ad2383c8402a74c10e0a9a3099d759b33cb76302081dbccc2d89066db311d0d2ca068436e6d98ffce705abfd0ecf69d70f7206ba401b542c265e3f41425380ee61edfec8a5dea7fda0600000000006c3dbd90fb4e1ffc00023acd0001fc000529a4003c7b27ea1137b6aa8714ebf68d9c54fd7fe23b414915c7d1e335096ed8afa549bd4b52c6491d0df912b3c0f5799b64529486fff598dc276c4897154630996f5888a81b9668c16a12c87134536e3616c929a7b67b37aa06d3eb7d7e405e3d3148ce7a072128c9063e1a8042eccd000000009427f6cbb0807d4783d74927eaf1a70e9c19339ac47ac7be1dd80b0ca4ec28350000209427f6cbb0807d4783d74927eaf1a70e9c19339ac47ac7be1dd80b0ca4ec283520a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e438df2a5d0be49659e711d7ee517481e23107fd25e000000000022d1eee4fb4e1ffc000ccadd000000de39cdda2efe7dde604c1965fa539df01785bccade39cdda2efe7dde604c1965fa539df01785bcca64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730959f6f2d48d283390b246a55b19a267f8ada326c8eb67f217839d5d1cc55377d8c1a2962cd5e80b892577454390c36b800000000957acb5bb59e253059da86924b5bbd94c1daf5b0fcd313bdb78e43bdc7cad000000120957acb5bb59e253059da86924b5bbd94c1daf5b0fcd313bdb78e43bdc7cad00020176deee4e53c297f44029a7db294451139901bb49f33a2a0ac8bd1b9e744fee201c406356d37513ea70f93868797061aec981337a700000000002d87b4aafb4e1ffc00102b8501fc0010594501fc0010598300cf0ea50da406da09dd78689abaa7c44aad428e3f37f1afe5852c1aece552ed1be61dc898a8db05f06e0e8a6ca912d408dc8369365e947a41d9d0a9d83098fc5928355798aa9237b107935ba606bd749e16f2922d8c4eb6b6c2cbbb4210f3bad09fe7d199aa3884fae3fce0120d0001a5bf8ff04bf1be7f1d98cb952f1b49f8d162d8a301fb682001fb01bb961e7fe42fe63f21e6e21556d2b4cc8c0423c1e176873efed3a14136dcbcf887000020961e7fe42fe63f21e6e21556d2b4cc8c0423c1e176873efed3a14136dcbcf887206fe932a6b6385b29bcd78378e71a727bcff83226945744019035493b24003e5301892f0612c075706dadccef0848d67a8ff5b8446f4120000000a7637017fb4e1ffc000899e301fc0008a30d01fc0009093b00a656c3104b5aa2a042680aef3494b62eb3ac3e7ea656c3104b5aa2a042680aef3494b62eb3ac3e7e52e70333f9bcad1e0b5c60777fbc3a17bf23e1d830804fadcd7b5dade6f9f577fe663cdf86f1483b71e6fd8e7c5cc4b981c0ee086412b16c796ce8fa3f7b6445fbee8666400152e70333f9bcad1e0b5c60777fbc3a17bf23e1d80000009693e443a6820038ad1160ae01311a85b4573965ca4480317611d5b6e048aa2d0000209693e443a6820038ad1160ae01311a85b4573965ca4480317611d5b6e048aa2d20b7b7b143980f65ade8556b431882dcab54ac9387fef544e8581d709e53d19a000052fc8bcf6fea0c7ac216d544308afa9d8920774900000000003695fc92fb4e1ffc0006567a0001fc000bdc0b005e66b53e3569ba6d1dff160ed56d074dc63f96c35e66b53e3569ba6d1dff160ed56d074dc63f96c31ec5c66e9789c655ae068d35088b4073345fe0b0309058f3873b1b4fcde2ee8c817d04626cad7de91c972988a4288d4548d2585074c11f29e270d094a9ed95f8618ab8ed54000000009712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df540001209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df5420593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c1277e135a613d9797db4d7a9d2e51bfe8599d3650200000000002352c5c5fb4e1ffc000cf99e00000020c7f1991e06d09b1f067b049fe6d0af0a20f79c20c7f1991e06d09b1f067b049fe6d0af0a20f79cc69a0bda7daaae481be8def95e5f347a1d00a4b430a8dbccb130522909dc710a65728006732c18441757f12a338cf4a6d8cbd5baf1a484537a6a0542f51bb686e6e546f1a00001ed1131823bcea23ac78af8c01e4d24683d6ecf8801fb8f3001fb05a39767a4cafa9d1057b48de795ea834a15664b58a79d75a4f826299ce1ba11842c0000209767a4cafa9d1057b48de795ea834a15664b58a79d75a4f826299ce1ba11842c20cfc9ca7becc69990bce0fdcf42c6d7ab1317281effbb2bef1deb457d226f3c1c012a566509d67f0566a01c5bc8c19b455095a52eb000000000010000000000000000000000000000000000fc000170b801fc0001b6f301fc0002289400f3fab21f5d1e86919c2e57fb4561244688c773aa25df60b3535787ed34aa614aeeea9f99236ea994f0e4fe2e70afb072ea5c2d06f5cf8503068add46300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba09209600012098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba09209620593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c178b5541d75eaaa98f8ad22355a122c55741f339f200000000002ce8c406fb4e1ffc000cf99e000000caf6f1b9916245ce300a63fa2254ada25e0423d6caf6f1b9916245ce300a63fa2254ada25e0423d6c69a0bda7daaae481be8def95e5f347a1d00a4b430b6175b59aba8cc0477d4fff78bd90294f31ebd385c39bc254c7995a5dd3ccb8dc1d8869e247bf63bef8ec79317f479a90001d6ece912cbf02627a4efc3dd37e6833cf367155101fb8f3001fb05a3995d7facdd36d2db5a0e3621ea50678ce494149b4d2dece73d4a7fa2e095ac1c000020995d7facdd36d2db5a0e3621ea50678ce494149b4d2dece73d4a7fa2e095ac1c206a963e1d05f10a5a744a8429a7d5ee8f482c4f6e7c4093a2c60c124f4ae2717001683eda694e5f2b0e9edd6f281eaac015f59790500000000000cff66169fb4e1ffc0002055a01fc0002099e01fc00020beb00f05505af7fce03ad669a45ee34ffcdba84636ca2373eabed3a46c91e10415d8a7e0b36c2867b92f96baeb84347272b9450cfad36524806f5f8135952308c26812d38faf159f811a09c1462e07e40d6b44881114358cb5390b65778ee437018c5879fbf935fd78955899b67633e000000009a37c6dc3e32f3c52d3f3af8b4d46b773e01d3bf27817bf609b60631c620b5900000209a37c6dc3e32f3c52d3f3af8b4d46b773e01d3bf27817bf609b60631c620b59020a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e2b481b3ac3d0ca22240b01de36b235aa1eaf0b05a3000000000022d4a1bafb4e1ffc000ccadd000000fd47aa98b58734af1453cdbbe5ef9396716775f8fd47aa98b58734af1453cdbbe5ef9396716775f864f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7300aeb5c2757211202b3afd2033ec1b4ef2dfe376ba5c6c07b45e6a7460afa4086423c4a704eb9a781514fbc513e190a62000000009a7f3e66905a2588695023cb6638bac294aa7ba4fc332737062398a173447f4e0000209a7f3e66905a2588695023cb6638bac294aa7ba4fc332737062398a173447f4e206c4add138ec5499b898d5d712924cf027be42e67c94174caebf143030cf15bd401d544504a737db17be4b9bcbe091cb419c8dbe3f000000000000de4d231fb4e1ffc00092bc20001fc000b4a5b0092d2b72ce01caa349e82d0490990e20b88bea135fcec2b5f013e92232ebfdc4f814ac10eb533a25ea5aa7b99f9638528d9186dd57d008654a3abc7a8300517910047a316c354423fedf0402dde38c90fb376dfb680e6b2b430addea140d0b6c795d90ca17f1df658a5d401c9da000000009adf02049b965817cf6fb5b675c17dbc00df7e2fbf68cf3377adfe30e3ed0bca0000209adf02049b965817cf6fb5b675c17dbc00df7e2fbf68cf3377adfe30e3ed0bca205e09a967f881113c81812102e3d365e6573b7269ff1613c7110d058e24ea123601800f683c47564b0cf20428c9abbc735e96c6a49941200000004e2eb95efb4e1ffc0005a5ef0001fc0005a6d500a7889dad2c33e1f6b8b68aa5cbb7392d9e96bdeea7889dad2c33e1f6b8b68aa5cbb7392d9e96bdee27aec5b42d8d74dd11d216bd2628111c4d9fccda300df074095e5498c6f1b76508c3ae700484d8b0d5cd12a990f3dd54e35b47d6fc943af4223d390ddaf8989d883c84b284000000009b135e3d6365e6acc8c0eeb513a3c8cfb68525e6d4719645fdb3fb3340caadc90000209b135e3d6365e6acc8c0eeb513a3c8cfb68525e6d4719645fdb3fb3340caadc920c9cf125e893ba997d1e05decc65ca4ae5c3c658df9b693f1c3b8ca6a14c2157800279480b2aaabcef3c8f4d073724dfffdf6696d13000000000012ec1e46fb4e1ffc000af11f0001fc000af13300d89c5ba79b9553a13f783b50673e15283eff3a3bd89c5ba79b9553a13f783b50673e15283eff3a3b49fd7c9727399a9d1d592b68eb09583bfbbe9ca73088ec95047130c4b310db3b6585c2fbe9453c7f5ff43ee5fe844e74c25766488fae8ad62052ec76a6c2b584029e1b1b04000000009bd4945c016d11b08f5c137900df9fd5472726e002fd7531ffdb4b25bb3c9d330000209bd4945c016d11b08f5c137900df9fd5472726e002fd7531ffdb4b25bb3c9d33208a2bba7feee4b42f3f0d1bf6dec1a3360ea7f61d3352af8bf3a37cfa9a2281ad0077398906f47400c2223db65c6d6b6aff09e0dd2c000000000036c83f2afb4e1ffc000bb3b40001fc000bce8b000a641ffc2886d96fc0d6739f2877e0cb81fe075a0a641ffc2886d96fc0d6739f2877e0cb81fe075a1ec5c66e9789c655ae068d35088b4073345fe0b0301964cfb5518ae0d35f2d02dd5c402351c318b79de1c5ee407811fa950b0ea2ca9f794a8d07ce9cc30fb76fb4e9ca3799000000009cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c0001209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c20593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c1bbb948d5d33120f51f2ca02c77a0b69761b719f07000000000022d63044fb4e1ffc000cf99e000000c54ac69739bf492d4328f1bf0d49581ce0b10d41c54ac69739bf492d4328f1bf0d49581ce0b10d417ea623bdf8c5607f0390c85586d83d473fa6a1c630b6ee48c7a71a9d8e0813e68ca09846245fa155285f24a62b0ce9cb0102b1994ec58af8ba2a01c09363bdcc395d41f3df000162e960a3f6b650feed98a266b3ccdf6e363562cf01fb8f3001fb05a39f1e242390cde84d67d9e2caeb1fc042a6bf0c85c8393026733ef5543fb0bd2e0000209f1e242390cde84d67d9e2caeb1fc042a6bf0c85c8393026733ef5543fb0bd2e20428e2f87d85de3d5b6a5a86ea5863d35b08e9c514460cda44dcb7e199bb769350083f05c3c1667334c68c95ededade304e08b756ca0000000000369550c1fb4e1ffc0006567a0001fc000bdc0b00cbc9ac9fd1bebaf88433e4ffbf3199ba365153bacbc9ac9fd1bebaf88433e4ffbf3199ba365153ba1ec5c66e9789c655ae068d35088b4073345fe0b03005987ec3ce6dac84c1b2cbb4753e5f361fd2217ca4251211d4eb0d82ec729b1ca540da4d8649c74b3a82e8a6e4fdafa8000000009f4f9f83ecbcd5739d7f1479ee14b508f2414d044a717acba0960566c4e6091d0000209f4f9f83ecbcd5739d7f1479ee14b508f2414d044a717acba0960566c4e6091d20ae21919b512cc68554ca16c583688865967f5375d107bbfdcfd79da5cccf772a01bfe3d321e667dfd5d7f5922c1d6bafaea45caf4e00000000002d20d39bfb4e1ffb1be20001fc0001850300a2dbf2c2b6149412562f306841959b9cac234b73a2dbf2c2b6149412562f306841959b9cac234b735cadeb631ebd16a92cbe6cac1be92247e95b51463008e37b3fcba972fe0c2c0ea15f8285c8bfb262ad4d8a6741a530154f1abc4edd367a22abd0cb1934647f033913cca58a000000009fcf7b15b9c7ce71c11b7577e05edd1ea922125b9ee8fed7d0d8ff21d530a33b0000209fcf7b15b9c7ce71c11b7577e05edd1ea922125b9ee8fed7d0d8ff21d530a33b20a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e2f5380d6cae296849f7444e27f8ccba243332d0bd8000000000012edaa20fb4e1ffc000ccadd000000f1b18d69579c40dc8292842f02ff5f511e61609df1b18d69579c40dc8292842f02ff5f511e61609d64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7300b04bcb5cf6d2d6df5979234611da42854a5e69374a29e0c85128caedb53d9c818042613d2f30f3ef782ed37bd8ce161000000009fe2f8d43c11c61b5a545f451d5f9ffb89bed5bd91f43988eb97ce9a336922810000209fe2f8d43c11c61b5a545f451d5f9ffb89bed5bd91f43988eb97ce9a33692281200e7a78c30d54bc56f44597f4369f988aa213df3bb910776ba9940e048e37bb9f00e06459f7aafb271dfbfd7ed7dd16fe623589a9ef00000000004e2ea116fb4e1ffc0002dcf40001fc0002dd8c007ec334a85c5cf331176646c2c357732ec06eba397ec334a85c5cf331176646c2c357732ec06eba39e06459f7aafb271dfbfd7ed7dd16fe623589a9ef3080174252e0f66a71b7e53f8b32dea5f97a6b39dfc1479c6e355daa415b1ff7733a4bea6bbe3fdf412fed0fb60e5b71d700000000a052764f93c4edb6c4bad2de10f9328738aef20bbcf3185dee993853a746c097000020a052764f93c4edb6c4bad2de10f9328738aef20bbcf3185dee993853a746c097204dea6406996a98efea88a66bddbe7f9568093185b08c865b1b664ae0e594c7be04692f66e4d117895e7a587976901020ee0bb57dd1000000000036bf4419fb4e1ffc000cf6350001fc000d08cb00cfdabb52d6248b141eb688cdb12f8f07641c3e94cfdabb52d6248b141eb688cdb12f8f07641c3e94c69a0bda7daaae481be8def95e5f347a1d00a4b4300f6c077a09de24df2cc17b64543bb12955632f52bb9525df7686f61c5c86d820ef6d71e9e333ecc869e71418cad80cb000000000a07dffc303cc8c8305380d7d1076d4a0b49bf8ea06352751a1480dd40bf806b0000020a07dffc303cc8c8305380d7d1076d4a0b49bf8ea06352751a1480dd40bf806b0205b016215386c035a42042a93736befccdb87c30cb90adc3b1279da58ac57cc1402276e8dda7b00c16f6cb09751662b1ad26766fff0000000000036bc2e26fb4e1ffc000cf8b101fc000cf93401fc000d08b30083abe51882a96d3c10cbe4a277aec4e0cfbe39cc83abe51882a96d3c10cbe4a277aec4e0cfbe39ccc69a0bda7daaae481be8def95e5f347a1d00a4b430818b1f2d7341dbe7d236945a76a2798da654c792e1311a92736ba4de810af25f1b305ce9acb314eafddca5489f1db88800000000a2313686a6daf92c85bf10c45876b257aaa710b6767d60850c78e33905be433b000020a2313686a6daf92c85bf10c45876b257aaa710b6767d60850c78e33905be433b203b43be0539e3780c85607d76b610a7aa57b27658c410bf852cf9daa6863631a20171d7b555e8a999afba6cb76fd165477520839400000000000068ec34d6fb4e1ffc00065b2b0001fc00065b450050b0f07133bb2fecd59710ae0a4baef7223aceba83c1f4c02bce59c4775cec76c6ca37241429c4e2967023bde3c52aa6bca87686da2c8d5f6cbda76e30915b61f2b726d5409a26a41bb3f350c1e4bbeb5e07e808f9f68361d70ac7fc2fc33178ac9639ae7ef484a427d326f24600000000a3b3e4b3d98c934f056a2e76ec8ff07ef8473b87f559295ece2254b3820e54f0000020a3b3e4b3d98c934f056a2e76ec8ff07ef8473b87f559295ece2254b3820e54f02071ec8af2ff6a68c9fe83db26214dc6cfa49f7e48e20099bb676bc08a26e5691801c81d0059d50a9da36b88ec6e8d69cecf84b567d63dcccccd00d25ad25afb4afffc000446080001fc0004713b002ee6bd87c06f15d21562672548ebb844c5877d5bd641c8b61a2c1d3a3bd4e4c850daccffc59a4ef4c5591200b21667500e76c560dde632b87998d67c3081bc001c31c71b0d4d4f9ecfb205e914fd9cdaab4e7dbaf0b320d40f0bd5b193d1be809ca34eb4979d661f487b21124b00000000a3c1bd9b636f0ddfd72bf99f48c516050085973cd2d30dd637a55bf7178af9f5000020a3c1bd9b636f0ddfd72bf99f48c516050085973cd2d30dd637a55bf7178af9f520a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e5ac5bad801f3318192b2d124eae58e0e24cf32b76a000000000022db991efb4e1ffc000ccadd00000080a52baea6d3b53815a8daab24bb7229c3c6288d80a52baea6d3b53815a8daab24bb7229c3c6288d64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73094a637afe3810d73e3402b5d6a398e45222ba846a339f1c3570aa8e3f7f5b9d7acef08ac234cce4f706671498330a59900000000a430cff6d81721057000ace8eec27abbb70d223a6bd565126337ed69493e56d0000020a430cff6d81721057000ace8eec27abbb70d223a6bd565126337ed69493e56d02056475cf5f3827ba09e0307be6d1374b9e5fa9e9cc8dccfc96168be082f335031018f67a58864ad617560e1c9e6b181d0305d3b537800000000008a440d6efb4e1ffc000a7e7701fc000a818a01fc000b4a8b00f89615731050212b9a50c9a6039059397601920484a12f2ef1a65969f60c6d2e2b2974c36cb309d0f629010378393c23e3d0e1382099f8c7f3c2157e308e845bfce2651b80e95f37e231301260449d1d89aad58729398208007ee430fc8137c323857bc75cd9bda7334838181300000000a4d877cee62f82868034fb678436d87afbb13330d2b66a24ae1d357f0de55c68000020a4d877cee62f82868034fb678436d87afbb13330d2b66a24ae1d357f0de55c6820fc211290b15b583a7a8b55990bdab4493a1fe73cfd96c238a205a93b9ca23f080160859bf00fe1859bd038ccb54f7def625334914500000000005350e5d5fb4e1ffb35df0001fb51fa00d0669e929f06ac80c05365d9558ad79cbb78f2c0d0669e929f06ac80c05365d9558ad79cbb78f2c068189a3fea9999f9897f4542a7a0170679a3c3713016415af54406658be9ea44d82b6b502bb90d93e32997484533a8a71a4ed98d12cea3709d84a5835b6ad8ed48d310163300000000a565c913052a586db0d5a000007ff981ff3b59982e662e02ac6d45e37bf8f0e6000020a565c913052a586db0d5a000007ff981ff3b59982e662e02ac6d45e37bf8f0e620589799b1d3a737137c9aca1650ad98fe415cc3c035618c9f0f01b60725c2e156014cbf5b172cbd72849fa68c6fab1041a618599868000000000091efeb10fb4e1ffc000153440001fc0002426400d2a33a64d0e54ed860973f6c22ad36aebba1dc9ed2a33a64d0e54ed860973f6c22ad36aebba1dc9e2588a17ab3f917f19afeb8c32fa7c486ab4105a33001e584b5723fec78495744b68b971fd654f16b016d676ffdbac01b2c64f319675eda577f5eaa5cf5379e95418c61ab1000000000a671f057d9937b97c9d256e4eca70318cf51f7259fed49b9ab441f13cc1b12d0000020a671f057d9937b97c9d256e4eca70318cf51f7259fed49b9ab441f13cc1b12d020a8bbae719937bb8bbad2f4067a16377a022dd411f2a676d49815482084d1d235000ba82bccdd17d425113f03d098dbe9a7285cfa01000000000068f8da17fb4e1ffbc4110001fc000194c300bd605f715f78f4639ee2cb9894f6750526c952da61110603fcbf3d2a30482e4901612318b34602cdb2334b22379811352d9988876a6e586d975e732930898839eeb51c078a7785efeed45b73db7e97138eb950b84302f2f13d6b33e6f8e58eb14e52c4a9c168edf50f35d0a4cc00000000a690051e69de6e36eeba664bff34e017f973d27ce91c1f2247120e8ce586b1f1000020a690051e69de6e36eeba664bff34e017f973d27ce91c1f2247120e8ce586b1f120f1b186e58c0e1247221f1ce97cd273f917e034ff4b66baee366ede691e0590a601aba486210cd648afc5ebb8842b543da323eace1341200000002d4da7f7fb4e1ffb509701fc000b9e8901fc000bdf0b009de28ef58bce6c501541a589eadc9900dbecc7dd4d31414b558eff2b3b489b6128ac6852e0fdb85c5a375814e9caf5b8575a8221be246457e5c5c28d308b165f653a3970a17f432f6c3abb8b681c71a3775f998fff322341d2994767c167c8a43b1b4661b9c01ef637763d4d8100000000a776b3114d2137d1eedb0908aecef3c35ef001166bf3644d8c9f149b3843fde3000020a776b3114d2137d1eedb0908aecef3c35ef001166bf3644d8c9f149b3843fde320a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e3967f8bdf103c99ddc20f32961a22dcc88fe23b014000000000022d3acd4fb4e1ffc000ccadd000000127b867e4c2d040cedaff979c39220c717011dab127b867e4c2d040cedaff979c39220c717011dab64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73009f8a06bd95c1be3cfdcd2516fabc0858c611d63c76da3a5beaa007b9d7c895aa63c0b2887bd584a76892db417a6683f00000000aab7b2ed5bc2fa962dca591440e22b47ce41bcd2b79394d53dfac5173a3f97bc000020aab7b2ed5bc2fa962dca591440e22b47ce41bcd2b79394d53dfac5173a3f97bc20a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e53b1be8daa1cafd2685237f3e5652da5d0aee9eaec000000000022dcf318fb4e1ffc000ccadd000000853fd590bbfa10868687b7c648238857248adfb7853fd590bbfa10868687b7c648238857248adfb764f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730018a6d23ae53d6231f7dd73a058f125340e92f6e97897f017d9d9d4e6671bbd92241170dfcdd5a4ab8ef47ef12ddcad500000000aace03a9c75c17bfb8ed760974e5dd8c94f13234cf03a76123b667caf2b71bbb000020aace03a9c75c17bfb8ed760974e5dd8c94f13234cf03a76123b667caf2b71bbb20b78304bdd6f104cf06b25c94e1de8cd1bc493b801983af667840129fa996dccc007e145aa6ecceb9581d21fe84b2c9f536f31ee0af000000000012ec8031fb4e1ffc0006567a0001fc000bd9b4008b8f48a17ec07a3e313369919447fd44560798a18b8f48a17ec07a3e313369919447fd44560798a11ec5c66e9789c655ae068d35088b4073345fe0b03019f3ddb941f0abfa5195a679846217c55a4a9830e73a97d0b93848928378dedb7a416f875525e6f16b2587abda624d4f00000000ab51b2ba4dca27658e13fea81c0764167c1466aa2d92050c67e4490ce7623da0000020ab51b2ba4dca27658e13fea81c0764167c1466aa2d92050c67e4490ce7623da02042b5315bf35d6f493d885fd156c7a9200cdf5e1aa08b27a035bdcd8058f0fb6401c7aca57d5af87880188266cc82fb2e0306d1af200000000000a763a43cfb4e1ffbc40f0001fc0001949300f769eb159cd4004c2546a757e50efced82fa88d7682f324019f53145cfdee3eb63d2dcdc151a5f6ab2334b22379811352d9988876a6e586d975e7329308072ac9a55d1cf5bf9c4262d49e2ef1ffcd716b8983ffdc62b940fec6cb4179d6275f8b68316f29c6c2ad540db32925800000000ab60639a6f7bb2c6c67fa5a65060fa94d3edc1868e8dd16457945f35caee57a9000020ab60639a6f7bb2c6c67fa5a65060fa94d3edc1868e8dd16457945f35caee57a9206a135dfa33b83c7d1afddef6dcfae0a0ff5e6c7cf6cc8f1d07451e251b0d4d8a00766e47227b7aed504a1ef568f67b059d07b67a53000000000012ed802efb4e1ffc000656800001fc000bd4aa007ad999d1a421e1d109569aeb5969d30283e68ce47ad999d1a421e1d109569aeb5969d30283e68ce41ec5c66e9789c655ae068d35088b4073345fe0b030125e7412707146bae96346cdcf3f7ed773646e5547ba57e318078051893e45b0e88ad1a6ae0fcdd89a93bc009e22075a00000000ac5b22cc7947409cd806908ac78a0a600fc6cac2a9a2eeb4a77d8915933696f1000020ac5b22cc7947409cd806908ac78a0a600fc6cac2a9a2eeb4a77d8915933696f120c7ee263d7818e4d18c578e2be6e4858c9631d303131205f9f3a43a6a4df16eeb0020a0d68a349226cc5ff472d2d6ed5cd288856ed5000000000036c81f99fb4e1ffc000bb3b40001fc000bcbaa00abee7c29b0755392bbe29c42ae94823da8025876abee7c29b0755392bbe29c42ae94823da80258761ec5c66e9789c655ae068d35088b4073345fe0b030081d223cb560a023f279a41df68f22478636932932c5e8ea6fbe56b534d4c09603587bbdd2f68a8d6e4f36838030483000000000accd3915d6756cd44d0334a6f753082cd62e723408f02c52ecd7b74280cd3fbd000020accd3915d6756cd44d0334a6f753082cd62e723408f02c52ecd7b74280cd3fbd202b9cfba78ebe0e26d1318e56bdcc2f26a896a166cb7479088558a550ebc86ab400ba7dcabb1a39ea0e8d19419f6b249eadd48352a200000000010000000000000000000000000000000000fc0004bea80001fc0004c8e50154e91ab69c8979d6f2b5f476f666dd09a07f099c54e91ab69c8979d6f2b5f476f666dd09a07f099cba7dcabb1a39ea0e8d19419f6b249eadd48352a23000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aceff858918e60e1afb3f7418dfac7b05ebe4f5402687a7b31ad0c1f70c615e1000020aceff858918e60e1afb3f7418dfac7b05ebe4f5402687a7b31ad0c1f70c615e12042fa8da0fee62ef58885385a220ba2b8ba2d7a88eadd23137b03c8a3c9c1a92d0025b9f391c4357fd53d01c5e83916a18ad24868be000000000023a36314fb4e1ffc0006567a0001fc000bd9b4002d499b03a1f4cf6ccf3491629430440c885a399d2d499b03a1f4cf6ccf3491629430440c885a399d1ec5c66e9789c655ae068d35088b4073345fe0b0300fb1e1939b4b6e7da5bc51c8ac931736cf02e21b96c8a57e6db35e62c702745d7a838cfb50a87d1acec4a52f6b8a893100000000ad9ae35caf7548cf3df6343dede0e585702eb5cf80306e76b65db2c603baa0ac000020ad9ae35caf7548cf3df6343dede0e585702eb5cf80306e76b65db2c603baa0ac20de3daf0213196f7d5138276d9a81318e2a6f2ff27781089cafc3d3817d8f211800c45bbf7b65fec374b69de7b5585a301558adacda00000000010000000000000000000000000000000000fc0004bea80001fc0004c8e5018a366a03dfaa43d112376f878b171f8df72896008a366a03dfaa43d112376f878b171f8df7289600c45bbf7b65fec374b69de7b5585a301558adacda3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae6f0501ba42aa004525f41ffb59ca39f85170e69a241b69cc493118ab745b31000020ae6f0501ba42aa004525f41ffb59ca39f85170e69a241b69cc493118ab745b3120790e6b01db05c42af47508ae009a24e8e0ae633aaaac9afaac23580d0b3e744e002a3b1c1fca3044d3a94b0b264c7ce60e0df75347000000000023a5bb26fb4e1ffc000bb3b40001fc000bc7b3005721268dd22359aae9210eb45596b00ba85de9ca5721268dd22359aae9210eb45596b00ba85de9ca1ec5c66e9789c655ae068d35088b4073345fe0b0308e9a07b8e11d3941637f74c58e60a917e0ae9327bfde9f2b9f1586b52416f4abce50e2c577ff1bdfc0a5d59e094be47b00000000aea2c0ad3c65b374731f81c1c3b9d08ada064798f788cd8346315eab076f6057000020aea2c0ad3c65b374731f81c1c3b9d08ada064798f788cd8346315eab076f6057209bf6470c04b9f1bcbf9c3cb2ff4d5b633101fbb5352f2aded8df1cde62867bea01066c33e3367b1047bdbad8fdcfb3fcd8daa62046000000000074cb570cfb4e1ffc00044c040001fc0004c92c00a17349d2777d28f0cc7d39fda9cace46c23036a0a17349d2777d28f0cc7d39fda9cace46c23036a0066c33e3367b1047bdbad8fdcfb3fcd8daa620463095234e6e7d476318b4811f1daaa7e887fad24b1499b3472a3a7decdd88e8bdd14551b7b67b22ab896adb298600aee96f00000000aedce7a4ed26b9f1975d071c46d6b8792c96e618215b1e3086da5d94543f2ad6000020aedce7a4ed26b9f1975d071c46d6b8792c96e618215b1e3086da5d94543f2ad620a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e0c1b9fe116e4b5263c75a13b5a3b078c30c9a2a6ac000000000012eda5f2fb4e1ffc000ccadd000000996eefc4c3da0c2c59fceec99aac79122c44d632996eefc4c3da0c2c59fceec99aac79122c44d63264f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730007b1f3f16835ebfba6f505f43c6de757bb22ecf27a89703e90e43aedafea3df353a5bd1915b27e8db397d53f0a23f6000000000aee65248d2955c6954334ada761dd15cb67a58f919e13a41f45d2cb19a35ad26000020aee65248d2955c6954334ada761dd15cb67a58f919e13a41f45d2cb19a35ad262008ac0860ca2a3ddf7ffd7568e37bf192ef8bc83345d12510300fb2cf0150400a015c768ab3ddc84e3d35cb1e9e7daf17a359379a2c000000000036bbef0dfb4e1ffc000bb3b40001fc000bce2b006448d9ce86668d353b6cdef19b1c6523e42f08d46448d9ce86668d353b6cdef19b1c6523e42f08d41ec5c66e9789c655ae068d35088b4073345fe0b03010f6ffb8deec0cbaec7f1284b6cca9c1a46dbb59133c32d58d79490488fce662a9e54d2e9256f394b167ff12b15fb82700000000af33ec874b37177f0ff404564837ad74930b21eca87727b27c2494cf76f580bb000020af33ec874b37177f0ff404564837ad74930b21eca87727b27c2494cf76f580bb20568ac2cbf4c913be67e97440d1666ae9f284a195eaaeb5d6cc088f02c6a40fd8015c6ed0d12929502d6632482c6dc079b38ed1096e000000000034182d1ffb4e1ffc000b9ba201fc000ba67d01fc000bd4aa00c637ae108ab48b62a5c6353f8fdae3578e63e6d3c637ae108ab48b62a5c6353f8fdae3578e63e6d31ec5c66e9789c655ae068d35088b4073345fe0b03018fd8f5cb1579c5a3358126df2a4c0670029ecf97ec95ab2e41e3786bfa9b2c7da308953cb1ea3aebf42910ffbd00f5a00000000af39e406e48c5fac9cd44da1a84541e74f968766bf403718854f8ad2c4f3a1fe000020af39e406e48c5fac9cd44da1a84541e74f968766bf403718854f8ad2c4f3a1fe2035095f3703e5379b03644ff25063c3fc1433144657864d06904b8c4c81235ab8001980cf5e5a4b2e6008ca1f834e297a1a550bb6e7000000000022d111c9fb4e1ffc000bb3b40001fc000bc79c00d3735099e625828d21cd2495e700d8e5fc696bc0d3735099e625828d21cd2495e700d8e5fc696bc01ec5c66e9789c655ae068d35088b4073345fe0b03090680ace6a8f09953a47344b83911d1a1b2c8628d4c712589a9814a04272b70842c9c7cacd1ff5cb19c97e88c67ebec500000000af879b5cbf2bfc94e1a2af602159930146caf7a91e7d9bb08272b82be03137ac000020af879b5cbf2bfc94e1a2af602159930146caf7a91e7d9bb08272b82be03137ac20ac3731e02bb87282b09b7d1ea9f7ca460193592160afa2e194fc2bbf5c9b87af01e31328e1bc246922c2954f8e93562c1e96b9b8ac0000000000ae22e974fb4e1ffc000cf13b0001fc000cf6cb0020c3d21ea834c65e7584f4d3a9270c70297f04d9ce7f101b7f075273c892063b1b8571311737a5767f95c0f808aff27883260bfaf9cfe2b84519a6b230932f6fc90c9dcaacdf9d836a2a7e60d090fe5e55b0b02f5a4f608a4b8235ba5aa7abc4e05f9387d1d942adc57c87f5b700000000b00179bd307619645399361abddcb07287ecd406301fdf405d9a82c8e333aa03000020b00179bd307619645399361abddcb07287ecd406301fdf405d9a82c8e333aa032060c6085ff3174d7f715fe6160822a1ec9a5182e6a6fa7603cdf6759db9726ad90116cb1e8f2ee25a6e24d3bdf0ec74b68635e822410000000000c38d8f31fb4e1ffc00010db90001fc0001854c00307e6b1e1ebb35dc358870ed74feb6563617e40d307e6b1e1ebb35dc358870ed74feb6563617e40dc7bb875d7fd38c672ce10427e7e172735c827f0330878386a8d07cf79e1dc6963d4cdcd7a4af6ef7e350cad3e1373e45fb86fdd9390a77366ccffda6ebe1470c45b0f7591000000000b00c8c773b22a9aa8364340a901a7538459ee38c7a68926e3996be85f6cc0d25000020b00c8c773b22a9aa8364340a901a7538459ee38c7a68926e3996be85f6cc0d252022c561566ca492327efaee43f294f42c95f87499c302dbdeeaf0bfe29ee2d0b00179fef4f73db8737c12eb3b5cbd44882d442c80170000000000ae22e96efb4e1ffc000cf03e01fc000cf12b01fc000cf6cb00d47c40c18e5a783a9277314480c9c0512a8fe825ce7f101b7f075273c892063b1b8571311737a5767f95c0f808aff27883260bfaf9cfe2b84519a6b230926eed90600b93cd05453899e96db8dfa36d2c71c3209e1660738c6b3af11473b5169c8f8dfacd89ad1bc92a481978f700000000b037d52073d1e445bc2fd41e35be1c52426e00152e49ffa55b6fc20f33b28483000020b037d52073d1e445bc2fd41e35be1c52426e00152e49ffa55b6fc20f33b28483208384b2330fc26f5ba5ff492e15006e42521cbe351ed42fbc45e4d17320d537b0014e6de0e472aa530261d5fbd3801d6d777aa7338e00000000010000000000000000000000000000000000fc0001e7020001fc0001e7100052254c6cd12c657c27876bc3c0a7b82aef45305fbf9ef9d3fee586e471698a3f70eaff9dcc96ba84a58bd603afbd1d6198ee831cefe1380b073a24d53009a5e37e3b9e556a7d7fe7cda1b54682351d4d1f6ecd331d98816db0696a5389c4a09bfc57f66f0a27120302ceadb07800000000b0447996025ff084c1fa1e0fc755b32d540143fed28b89791789fde2464f9f2e000020b0447996025ff084c1fa1e0fc755b32d540143fed28b89791789fde2464f9f2e20502fdd2e5de1a8c6ba9b4bfcbd14bb30743353814ee50e33f80c2e063a4ec6ef0045cf243bace96dcc31b4311405a12153630969330000000000235868cffb4e1ffc000bb3b40001fc000bc78300692790b0e670372748d3029fce2bdeb14816c27e692790b0e670372748d3029fce2bdeb14816c27e1ec5c66e9789c655ae068d35088b4073345fe0b03019f2c10770cebad591eefa4fa1e71d2baa7213f7bfea0d7cf6fc9313df3a6095f480b7eedb63ce8aabe16dfb418a9f0000000000b09c47d39537078986e4639420ce87b32039b17d80ff4eb88238c27fcfa1abd3000020b09c47d39537078986e4639420ce87b32039b17d80ff4eb88238c27fcfa1abd32040b9e1633d6a6c0a38ef14d5590c5cba47ea35c13fcdb2b1b86d08f2297a9a0400d8a0974e7667d17dd9a12a9fcfb313a13c918ce7000000000023a97188fb4e1ffc0002198f0001fc0002fd2400c7ddc0f64cab219e4119020d7a9c0ffea17b9ed0dc7ad6d9a56d9e5370352a41c4b9b55601009064253cae727106faa4bf76b0b4f8375091889f6715301848a0024f4a1b85e18552105a7d397714bb9d16a392a29b5d6d18bba91fc880a6b20be09f1400dfe58de3ea87f919ba00000000b0aee43d5964ae06a7ce63c03332d9f1af46386b91738cbbfdf42f67db488c5f000020b0aee43d5964ae06a7ce63c03332d9f1af46386b91738cbbfdf42f67db488c5f2046674ef4c6ad3a94ca837fdda85dcacd4e685f2722cd1b33c26505a95faad46e00976899eaa0087e8b7daf0d688fdaaf2197da58c4000000000022e99becfb4e1ffc000384320001fc000608030014cc95cebcd011e38ee7a83fb6ea445ff8ed0550177f797c6205c1997ff1ffaaf6aac98c13d865ddf32bb66d6fdcd07b1268d21a3e021c9c954452933090ea99287802a44836309be934ed63933b423580626adeb428026acde6bdb283f370ff19bb37f81b0e4775187ad006a300000000b0f7021cd2662eb74b1802ba34fef476d176e815569aadd4931bd4288f5256a8000020b0f7021cd2662eb74b1802ba34fef476d176e815569aadd4931bd4288f5256a8201b6c893a523e3fc81e071e645926300e1a37d71f02e1bbc3aaf75ee1961bb56700a445f904cfb88572a605f98fe2826aacf9bcf268000000000022d91746fb4e1ffc0006567a01fc0006c05c01fc000bdc0b001a238d7bcdd356d52831c991b56beb9a50a986541a238d7bcdd356d52831c991b56beb9a50a986541ec5c66e9789c655ae068d35088b4073345fe0b0309247cd1a65f03a854cf5c9d7ef6c606d5a8789ddcfa7e2f04ec03d6c93b365a01d2f302f1c93aff66f33d55fddc721ed00000000b149c50e97a1411b76b2e26ca20b9a6a317d0afe19df2b78b967f0b94aef1f38000020b149c50e97a1411b76b2e26ca20b9a6a317d0afe19df2b78b967f0b94aef1f3820595c1fb1f5d3ec30b832c9c3cd68e19b4dc85334d0dbf734671e3c38844c8513011fdcb249be6d1f0896ffd3c5965cac5f087864d0412000000034235351fb4e1ffc0001991e01fc0001fa4501fc00038bec002adba90fd804d6d89438ea6729608d5276687fbc2adba90fd804d6d89438ea6729608d5276687fbc44fdc27a48f627d31adb54f482d59e535c226de0308f60f80538f335ba0f9f5452f02d7f5527652671da80c3d1c10e31e040f9b901a53b476a9ce02b507958bc8a65acd7b0018b3277a4f4a3667225def8a4f83000c086719cd9000000b1b3f7b8e4ae179563fc3cf3bf51148644cf9e38256a06d73d31050ebaf486e4000020b1b3f7b8e4ae179563fc3cf3bf51148644cf9e38256a06d73d31050ebaf486e420945e0ef94323e11ae3c6348c22d0106e35d724c00bc81c70956bd98d42a46074009b3193d314bfd2e375084a1d45eb689ccad9c2dc00000000006ca0877ffb4e1ffc0006fcd40001fc00070ca3002986dbc41a156ebc9c49fdf1d1842a76f21044b7c61ae923d66d3e7a9a82b85fe5eb375e966b109103650c94f0e6f7a84dac1089fd0f6dac2aa7b4ea300d7a075032c423dfd82adaba63256db7c7a0ab10eecc99544fd628e76840759ce5fc0f27ad83197f464371a1b353095200000000b1d373e438cf455c8297ff3d8fd1b27a1be7365dc55bdc963d0c02930338a519000020b1d373e438cf455c8297ff3d8fd1b27a1be7365dc55bdc963d0c02930338a519206a67f98d40507765c2142f4d70d3133a428859b1d4eb7f7c702d82781350b7b8016cfeef7175b7dd90412dc38d3cbb55a5da930fd9000000000034281b0efb4e1ffc000bb3b40001fc000bd23300ae5ae49de2bf939a61037d1ab3c9aac1528a8034ae5ae49de2bf939a61037d1ab3c9aac1528a80341ec5c66e9789c655ae068d35088b4073345fe0b030874adb6d0e5b65105e507f97944c24c90c5120d804ee0f36c7079c7c7c2f86aec079d13392b583e0553b699dcfab799400000000b27a788d5106178e1e365336ba2a53d6f0e4a48b76eab2faf3aac12123473740000020b27a788d5106178e1e365336ba2a53d6f0e4a48b76eab2faf3aac1212347374020a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e3b6b2d6b24f4fb4800563a0c581278ba501dd5b46b0000000000235b8659fb4e1ffc000ccadd0000002d0ac80af443e477060c785066014d561253d22d2d0ac80af443e477060c785066014d561253d22d64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73000eb80b32b60db5d7b03559f6e9205beac8d047689904bdda0bc50987d5f208d39b78ed90a34af7e1e9d44495ca1eb4200000000b2f62d6812c31f4f46265267da924e38395274e12148d979e4b4759035b26072000020b2f62d6812c31f4f46265267da924e38395274e12148d979e4b4759035b2607220a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e06083c6d6b80dea08171cdbe3134fa90e5dc9711c1000000000022de5512fb4e1ffc000ccadd0001fc0010df0300a3efa844b6dc22d05e802ebd5d1eb02cca122c25a3efa844b6dc22d05e802ebd5d1eb02cca122c2564f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730075b907b6d6c12aa111da0e102186b9d06f4e065969b60732207f18c2c5d0deb8ecba47cb4c0929647db0e2fae6f08ca00000000b3004b53adce8cdf983830857449bb18787178023971a621d988d360b703e529000020b3004b53adce8cdf983830857449bb18787178023971a621d988d360b703e529204dea6406996a98efea88a66bddbe7f9568093185b08c865b1b664ae0e594c7be010eac161c360c57015ce83107d781b9ed935d3edf000000000008090a0bfb4e1ffc000cf63501fc000cf87a01fc000cf893008a69e5fe65c9a67e214d84a116b441abd5f9aad38a69e5fe65c9a67e214d84a116b441abd5f9aad3c69a0bda7daaae481be8def95e5f347a1d00a4b4308fed7a63ded7f5de0bfee9808589940f1148f47656d017a1fa77642352b5348ee318af4ac3fd63fff3b4e5c55ac1624b00000000b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f000120b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f20593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c1689fa69f20934cc3ede9dff4589af59c19a14a3f70000000000342b0d5cfb4e1ffc000cf99e000000d57dc73bca0753cbd47bb33f68362ac13e6daeadd57dc73bca0753cbd47bb33f68362ac13e6daeadc69a0bda7daaae481be8def95e5f347a1d00a4b430816ab3f50007333bcb40445130cd0e82139f8c68b592001cd686efc15e303206491fada6cf90af8f24a28b81a9b59ccf000141b308f737ca9e39f67b553158903198a88c516e01fb8f3001fb05a3b42fd6e07095c8b1c88ac52a22cd97d8ebb051ba7adf401896d8aebf04db1080000020b42fd6e07095c8b1c88ac52a22cd97d8ebb051ba7adf401896d8aebf04db108020a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e71fd01a6dcb1e645d921f8e714b2181c90b94e1a24000000000022dc861efb4e1ffc000ccadd000000b4fb462bdbb65e1dc1380a1d4723220a09f3b4ddb4fb462bdbb65e1dc1380a1d4723220a09f3b4dd64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730088905cc3f99e76b3a1abf714a55978d9930c2abdc77a21bd809e452e8c47c35d38e318ec3118e1944cf1a4a8df907c100000000b43dadbd485e4d1e1d202ea5180f0ad4e8e7f05e97a7e566a764ed714356bd1f000020b43dadbd485e4d1e1d202ea5180f0ad4e8e7f05e97a7e566a764ed714356bd1f205c71e5f46d35196e33b45c5d59d3fd2dc84381942064cae21744fb717412c1ac010f673549b55f956f58bd209f0cda6e0af0d65b2d00000000002f6fb5cffb4e21fc0003c5f80001fc0003c6840099e9dff4cd5a0abc61b5287a0ba48c0553d6358829dcf16f7a66b832d3b84dbab400a1e9eb7f30ac955410003527bf2b360a7a390b9ff14b9106c6323090c0e9ec9dc5f08b1d4d0211920fe5d96a225c555a4ba7dd7f6cb14e271c925f2fc72316a01282973f9ad9cf1e39e03800000000b4ba4ab73c3757ba9cc6b6fb98020b854228be7de4704ceb7da02e7c6a2ad741000020b4ba4ab73c3757ba9cc6b6fb98020b854228be7de4704ceb7da02e7c6a2ad74120bdfda6f0bbcffdd7aa32a0b762eb6506cd719d88cf5f272d1ced2485a6bcc9ca0149ffc6acbf7ea405fb117bfaea252f885c6b6ba300000000010000000000000000000000000000000000fc0001b1ab01fc0001b1b001fc00021efc0064cf453213924a7f394eb5ff3be693174b8d0d983db6e109e8d2e2f052216a47568b8881f7df245bd8acf473f417dbb62954adab796af04a646847b13000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4ef45b7d0b716ffa761809326697a6420365e1d137b52d7d275e7f326280ac1000020b4ef45b7d0b716ffa761809326697a6420365e1d137b52d7d275e7f326280ac1201eda6d2f8839ac6331393c4c9e2c97ab17fbd99ee5bf9f02b3ab288d60aeed4101c829eedbb02f90bd3a33dcbd225256ac75e2298c412000000050d1e860fb4e1ffc0007d1da00000064cb3ef38948917a58eca6dcaf03c4d94a3219011546085b56803db4366c2059d4755c8a28796ca30d5bcbeeb459af40f97fcb4a98e9d1ed13e904c8300450dbbbe82df6808151b83a46f8c531cb240eccfe65f8f0b49f3717056da7268c14e45f0dd14fff8daed28fd353c1b401c623e2d926af5eb52dcc2b931993d3e527145118000000b4f9de65ae676b63f84f2865317b8b512a12516c4459f2f59ca2626c71f7dda3000020b4f9de65ae676b63f84f2865317b8b512a12516c4459f2f59ca2626c71f7dda320a3ddf7716c62a29cf5f259446c51122a518b7b3165284ff8636b67ae65def9b401f9a85a965fd3f6ea024aa1af9af585b3993c2882000000000001010101fb4e1ffbed7c0001fbedb2002e57d3d0f052b955f247a5c1d4a41266cf5bd93c6960122148b84c5f044a812c35d5380281a0f02e88a052d5925781c116dff6be4f04739113c0f9a430016a16472319f62f71bb60e38038aa8cb93a301ff6c3727f75f4d770428d71d032fdbd27c5d03dc56ef1d658fefe795400000000b55a74503e30b3f3066ef0d94ddce16cc7f87831a4b782764b588e5575382a88000020b55a74503e30b3f3066ef0d94ddce16cc7f87831a4b782764b588e5575382a88200b18bab21b495a6bd4d872e3fa0f87e5ec27effa90d3c58cca27843d9d96da4f010f4af69185db513ed69f7538a80cdf50cbf6ce2f0000000000235902aefb4e1ffc000bb3b40001fc000bce4300b6bc771fdb7d72115152872d2809ff854a16c4cab6bc771fdb7d72115152872d2809ff854a16c4ca1ec5c66e9789c655ae068d35088b4073345fe0b0309489f888b6bb2b9aea1dc7580c45a7e38d3d3f197ab688c48962ef102588017558d6bc1ad8bec667892b2436e64ba50f00000000b5706630cf1c631b5f95edf39d0fa1fcdaba9d34459b0b392e3f28eb59ae90f6000020b5706630cf1c631b5f95edf39d0fa1fcdaba9d34459b0b392e3f28eb59ae90f620f690ae59eb283f2e390b9b45349dbadafca10f9df3ed955f1b631ccf306670b5016c87be22108a3287243c4bfd060433101cff516f00000000009de6137ffb4e1ffb602001fb626c01fc0001195600d157ab8fe5436f4c7a475be8a35079b3aca6c5fbd157ab8fe5436f4c7a475be8a35079b3aca6c5fb6d4c795644ca86f717628ea27f0af13b0ea70eb730874b17058e37c39f770188dfe8e699959654d723e62e28b2760900e5284f63f6b70e077a6ea9803714bdf62d083b1d9e00000000b5c0d248eac5f19d665159412f357073359d0d643930adee1d071f02e9ad0a1f000020b5c0d248eac5f19d665159412f357073359d0d643930adee1d071f02e9ad0a1f201f0aade9021f071deead3039640d9d357370352f415951669df1c5ea48d2c0b501ab386459f5642306e5993f9f7584fb744de7076300000000010000000000000000000000000000000000fc00025b7301fc00025b7d01fc00026ef0008923f5540c3cde8ff5f57178422303c469510c488923f5540c3cde8ff5f57178422303c469510c484deccc4867afa6d1f8e500e66da4f136e46638b83000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b5d5c145d244a98b81cc9b5fa2f841cb6689e7cab76566fdc66ba16a82db95a5000020b5d5c145d244a98b81cc9b5fa2f841cb6689e7cab76566fdc66ba16a82db95a520dd55abceed2198b21aa5486f47bd0715607d41c79b75aa3e3ce3091b57b46f020159b77252b432ccfd639e3d1286a82a8700f91a4b0000000000336b0426fb4e1ffc000386690001fc00052bfb002e1496064dd3a7a8c0a5cda78f3b4a4073ffa2392e1496064dd3a7a8c0a5cda78f3b4a4073ffa239a6a050bffabcdf986e775567e1ba53dddf578ca1308f4fed7576bd1e31d45225788c1c96836dbc85b3ece3b77fbe4ede0f5f784f138ef6b32884e3345915a758364d1e582300000000b698b5e762f0d11faa437d55b16ca54722ba8ddb0b3eef0256ff80354f0c8d83000020b698b5e762f0d11faa437d55b16ca54722ba8ddb0b3eef0256ff80354f0c8d8320cb53246d5a57694cf7e19868540214769b2d7fad12f824c47130244873204e8c00a80186b44321096c4c5997ee6358e220bfb3d6ce000000000012c3324efb4e1ffc000d62c20001fc000d62fb0023142164ea1319cf4ad34e8fbd273c5502d5dc352e3252f64967541fc0092b78aac3dfbb7fdfa8d2a90c41d69e6e6132b5433b45a661b5f2187458a130a90febb8c2b031ae7ca222debc10f12fa0a71fcef84e2d92f13c1ad192c42e371324bbb66c86e24434754e2864ba14ce00000000b7c7c32bc7f34cb18da6b4b3fa53d8a6125d6f6dec3f7849e728bc8f89eae495000020b7c7c32bc7f34cb18da6b4b3fa53d8a6125d6f6dec3f7849e728bc8f89eae49520e7365918822860b9120091cdf14e16507de20bb5dcdb6784b16352c2b66ba700008f6273f09406792bb9b717499634ecd4446db449000000000036cb0d93fb4e1ffc000bb3b40001fc000bce5b00563f03e344dc17a7849e6320f56c13b0b5c32cb7563f03e344dc17a7849e6320f56c13b0b5c32cb71ec5c66e9789c655ae068d35088b4073345fe0b030011bc68f6561d4a7d5f7c1e6fe4742d8ce2bfec24576e40c8eaec56b3759bdb5be5e6b9234c77475c74be1b0466ad9e400000000b7f0ada8d395f428a1a72db04b76caa042f7020b2f90641fcd1499be6c37fc9e000020b7f0ada8d395f428a1a72db04b76caa042f7020b2f90641fcd1499be6c37fc9e20a3b41298f1b62474eaf528e96815202beebb6eb5751f0b495a7ea49ec6aa04df0029ab2ca57c2c3d3a756db61eefa71cd784a7533f000000000022d536e7fb4e1ffc000bb3b40001fc000bc7e300538584030db46ef33cafa5765401d48e0b9fe6b9538584030db46ef33cafa5765401d48e0b9fe6b91ec5c66e9789c655ae068d35088b4073345fe0b0301802f2a1951734dff2eaf714cb8de115a8df7bbae8da6a1e1bfc9c0f020908cf68cfb2f5efaa4412fea5116db12b569100000000b9e4c7189d01f8da6eb8bb5f4b8f8c2a0a24293d0f6e900aa0371bc32ec6021d000020b9e4c7189d01f8da6eb8bb5f4b8f8c2a0a24293d0f6e900aa0371bc32ec6021d205ab2eb7a853640b8282676a50464bd24596d3094fbe40afa6d2159a6ea64488500db4c10c95bbf83225e49ec3967653007708d8d8b00000000008b3b5692fb4e1ffc0001167b01fc00011b9701fc00011c1b00fc8511ca8de4f660ed57620e4537737e55622bd9fc8511ca8de4f660ed57620e4537737e55622bd9db4c10c95bbf83225e49ec3967653007708d8d8b3098bae0f71cbb77fff1560f45680ada9492ec4c9f779df777754b54bfb3474729c269399bd3cdfc736866364d3fb011d100000000b9eeb35f00d10ebde45a23db94875bed007b94eb03cd0317ff721e24dd5363c8000020b9eeb35f00d10ebde45a23db94875bed007b94eb03cd0317ff721e24dd5363c820f9ada33272169ea08ff6161000b9fee6eb81785cc491b284a2acbb87738a330f0139387c3d869b645b7700d9e16011681c0971cbf63c23d70a009de62866fb4e1cfc000283a70001fc0002ad4400caf26da61833c492453bc2d74c6dce3d91e2c38fda5ea047322750daebfc463a87ec042108d63ce9d458f5157d91f4832e66eb8630ab3dbff95551d8308f420a082c56b30c9bd8492394d83066a8d03628a7c8e3eac27486377e2648bdb3cebcc4fdd16cb4cab1341e480fa43900000000b9fab136129b05d86ccfeee5298f207ab2d76131af41987baccf55fea5efb4c1000020b9fab136129b05d86ccfeee5298f207ab2d76131af41987baccf55fea5efb4c120a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e2542293a57d22c1f9064bb876ef27b3f4a9e5824f5000000000023a21274fb4e1ffc000ccadd000000289d0729f182f703f2df4990b51e2b103515a32b289d0729f182f703f2df4990b51e2b103515a32b64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7300fa5377eb256323aace31b45c3e48ea110404b053cb80e8043bd1e44de1705130548e4ab28738816251ea57a7fc1032400000000ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e254216000120ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e25421620593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c1488164ceb25e5c05e3192511d2be4a5ac103cc5f70000000000342aca80fb4e1ffc000cf99e000000ca94dd35b74cb251457e475dd7507055eaf1b4e1ca94dd35b74cb251457e475dd7507055eaf1b4e1c69a0bda7daaae481be8def95e5f347a1d00a4b430acec7bbead86221590f132810b8262cf98c91b338927907b86bf48baa54dd1912bfc1f6fccd069052cc8c79eb9e8ed2c000162e0104ce0aafc1f06bde37c73702fe84b307f0501fb8f3001fb05a3bac184b9f1e4eb098d1f8df0b07af6af8919c60c1f60e31ba29c2f39f395ff22000020bac184b9f1e4eb098d1f8df0b07af6af8919c60c1f60e31ba29c2f39f395ff22207186875d6669311c046bc6052538390054e2cebd21b2eaa908af5a273602fe1a00d97799fa72f75b2cab264f40eae80856f27f6f10000000000003dd1d17fb4e1ffc00021c2901fc00021c3c01fc0002712c003da6a63a5f595ab15da44601749453c0ac0b8b7d5519b11029baf89428cad6fd4e70e3bb09f356f1d97799fa72f75b2cab264f40eae80856f27f6f10308bf25d66d63197e3144f6fa17ad92ae38cc11b143027fb91dcf5c20fde6e52bde7f46f2789e6fa84573197d8085389dd00000000bad4dcdc0ec1f274f70f87a3f4509096e7ba517adef56a4121a20f665d5e8e7c000020bad4dcdc0ec1f274f70f87a3f4509096e7ba517adef56a4121a20f665d5e8e7c2076a391457a0942b72645223669feb8e22db6e8ec7d9056eb5149f5689cc3e0c40054a71d0e91f24c449a09b22c0f77e6540261a5500000000000235ae333fb4e1ffc000bb3b40001fc000bc7b300a14dca43f5ef41a8a4340a62787f0901e54e8adfa14dca43f5ef41a8a4340a62787f0901e54e8adf1ec5c66e9789c655ae068d35088b4073345fe0b030848001b4004d5e5eb6782bcf3a3b62c2d14f237af0be67c10d70d84be1a28142bd5edcf4d90de08af31f8381510ff61600000000bb889ccdc43531f927eee1dbf095a5367ea314eb44818be2277476617af7d35a000020bb889ccdc43531f927eee1dbf095a5367ea314eb44818be2277476617af7d35a205ad3f77a61767427e28b8144eb14a37e36a595f0dbe1ee27f93135c4cd9c88bb0176e71a262cca9f6667bd35b19f182ba67b44c9cb000000000059280381fb4e1ffc001094df00000059ba7af9e92023a6b1160a0a45aad2dec70e7cd703815c232820445f311d1192f578077c1cdd3b540d5bcbeeb459af40f97fcb4a98e9d1ed13e904c830b529e500f236ee90a3e7c274dd51ad91310561f10d066560b0f28922634fbf67f50660e317f3f4c06441fa5ca98775d900000000bba99873df74a78b6fd5150907b216eafe16816006225a4912affea3ffb41e00000020bba99873df74a78b6fd5150907b216eafe16816006225a4912affea3ffb41e00207b744d5c91d46c013969caef13e72e56c6ae7bc89588edee53cf4ceb6973a2f50120120c7dfc6f165a4f2c104d6febd11c496069c000000000006b16c782fb4e1ffc000607dc0001fc00062e430047c6566a13ba6a7f8c6a3cb8872664c2f8f4ee27dd3b064ca33829ca65c37e911259da50d3490ef3b508db53f0a3f072b00f579a86e813d6af2856f3301059c4fdcdc32d831534403f7e6587555d74dc1624f6e2bcdba10a099e6c4f8d5f31d4c270231180ded264a009387e6c00000000bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb8000120bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb820593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c060d8235767cb55972a30d653eb9dd10f51b3c46ec0000000000235231c4fb4e1ffc000cf99e000000f9b93e179a0c22afd92523427341b5e0b2c2a102f9b93e179a0c22afd92523427341b5e0b2c2a102c69a0bda7daaae481be8def95e5f347a1d00a4b43095c89af86eeacfe403684306c98173c2a59198047a778787887d34ad6b0c9b787d689a7c3cd9e9dd5d103cba70f3855f0001dbbebbc52a5bae21b818e0487311041c91b2683b01fb8f3001fb05a3bc77a5a2cec455c79fb92fb683dbd87a2a92b663c9a46d0c50d11889b4aeb121000020bc77a5a2cec455c79fb92fb683dbd87a2a92b663c9a46d0c50d11889b4aeb12120a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e5fd2b74b9987e80fcdd3aebe95721c6c4709724ee6000000000036d55ed8fb4e1ffc000ccadd0000002878a638db0682d49249ff8ca872f16653a84f912878a638db0682d49249ff8ca872f16653a84f9164f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730174de56654f2bb6417e15ff06361ea0becc00bd72a3eba0f83b60feac860570769fbf28482a706f10906a1e96dae4a8f00000000bc9479593e38ab280b75dc76bb4d10483b1b341c2e792d7dd278c21d202d2b93000020bc9479593e38ab280b75dc76bb4d10483b1b341c2e792d7dd278c21d202d2b9320e9d3abf500bd0cba0f374490d4e0b3adf1dcd865da1ab04e8bef255e4a24ff630041796bb0563ff119ced9d76be68c0d5898bad86e000000000036da55d2fb4e1ffc000bb3b40001fc000bc7b300422b11d7511cab020721d07fa2d011bb1b7ae433422b11d7511cab020721d07fa2d011bb1b7ae4331ec5c66e9789c655ae068d35088b4073345fe0b0308f6e3e0e34f5afcbf9eb7077a3f0e5ddbc2902f5610447b9bbf871fd0065c8f156b514bc5180d579bad722d6112f1a3800000000bdd08cc998cc494d2e008405bd71d5917a64adde6216339d74be4d379c90ff19000020bdd08cc998cc494d2e008405bd71d5917a64adde6216339d74be4d379c90ff1920d5b7bf68c3d573cb8c592b4fca527b753ada034710ae8b5eeec83c426ab00dec01673a5871f70c41403b9fcbdcb7a7e2b734f3cf130000000000951ccbbefb4e1ffc0006592e01fc00065b0801fc00065e350047d2c552db05fdbee9a78f346a8bfbdfbbeaa5a068eb72f005d366e18db38f638716d97bf60d53c7673a5871f70c41403b9fcbdcb7a7e2b734f3cf133003d325fdc665db2900c24c0736b927b7fa7ba7068c9595991e6cfaaa0f8e1269a31f6d1da2b85fd922186a9979872cff00000000be563f5793f34f16e6653efd9060c4042b492cbf676cdc66f9d68836f078b71f000020be563f5793f34f16e6653efd9060c4042b492cbf676cdc66f9d68836f078b71f206a0871d1bd82667b5df31b0c09861a71061f9fb1f0df3c2a8ad0aa11710100410109c927a4a7a41ffdd8cfe3f780f5108a6ffa1c514248000000c3c925fffb4e1ffc00062ecd0001fc00062f6300c5775227677d9c67fb4c13795a2bf9d80ea231c9304c46d5f01a600ba66e3dbbd8bf6dc23e8c5297aabc8c5bbac24daa81a5f2425983dde53230cc203093612d652fabcdc0052e5bde98d276e49ea71d050a323b98c368a06742fd964d21f567e16fbda2c17b00adc470f6f61400000000be89ade2107051d4f50cbf1d99338d42b33fa7efb079e14d906ed9b518768d36000020be89ade2107051d4f50cbf1d99338d42b33fa7efb079e14d906ed9b518768d3620f2cacab8a192994c64ca14bf7a9d1c045a8234e615dcc6764219af3b0705adc000e6996e06f219509dce93957d76e2fde11a5958380000000000341bc6f6fb4e1ffc0006568001fc000a68af01fc000bd4aa004d0684329ab95dd4ee2c0d275ef313bc0e0adaa24d0684329ab95dd4ee2c0d275ef313bc0e0adaa21ec5c66e9789c655ae068d35088b4073345fe0b03016c6904fbceb7584e75ef553b85ca20ec8cbcb1ac49d985b0cb77760107753205415c4d5cffe3be0a10219d0dea98e2200000000be8d0533c692cf23e3d3eeb3957422b5a98acd82aadbf7baef255edb2f491b82000020be8d0533c692cf23e3d3eeb3957422b5a98acd82aadbf7baef255edb2f491b8220821b492fdb5e25efbaf7dbaa82cd8aa9b5227495b3eed3e323cf92c633058dbe01c428ff31ec6308043a7b282eed63d1d8920c2d8300000000010000000000000000000000000000000000fc000293b401fc000293b801fc0002b6e70091b4363730ea1c02de53aaade78508ee41c38f9c91b4363730ea1c02de53aaade78508ee41c38f9cc4097f46f9eb0990bc7e22d3bb29af6eb76d94d03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c08b723b79a7139fa7097bb85b4d0dc387097cf2ea66ad34992b60e1fdb5df1e000020c08b723b79a7139fa7097bb85b4d0dc387097cf2ea66ad34992b60e1fdb5df1e20c0785da69e10c38185460b8c938566484f113a1bd42feed2e03b8a76567f6b820024ecdc76f0781a35a9a47762313f63c5e21ac0fc000000000022dd41a3fb4e1ffc000bb3b40001fc000bc78300a7afe89589507a716dfcd88009d108734edddeb7a7afe89589507a716dfcd88009d108734edddeb71ec5c66e9789c655ae068d35088b4073345fe0b030169fd77b3f11dd8f82c03ed8b79c1d986fa1445e6f726b0c1b556bb884c83890339733b2521630b8ae57c1428d0ba12c00000000c0aae8ab24aab988cc84385d16af7ffcfd365d0e016f5799759e0525a435a617000020c0aae8ab24aab988cc84385d16af7ffcfd365d0e016f5799759e0525a435a61720a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e355f1d75bff42c098ef3598a9a5fdf2aefd216ef66000000000036be3d46fb4e1ffc000ccadd000000ec74aec7dcccccfaec4c5fe65166a2d5ce0e3268ec74aec7dcccccfaec4c5fe65166a2d5ce0e326864f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730892a3de6fe305d39d81ecc9dbc7c85bc6eb57434618903f45ac8996aecfa9a7945e2cc48c40c1540172096229780519e00000000c0dc1876eca746f08e401c7873260e277baf0096a0b19e519e6298b649dd23bb000020c0dc1876eca746f08e401c7873260e277baf0096a0b19e519e6298b649dd23bb2025ab3aaf757e9002b95d75ddc9f2ff18ae237e53a8e10a93dc47fc163bc91d120128c20f725ddcc44c5d6c728b05b886805ca125af0000000000b280576ffb4e1ffbc9de0001fc0001196300febd730bedac1010a2943dff1c796cc544609f7cfebd730bedac1010a2943dff1c796cc544609f7c477a52436b944f3e9223ac8404a7717d4176fa533003f959fdcb3eefebe409ee7044748f71ec8cba18a7a73df9d55d118e170d7ec2540d5c08a4cadc4bdeff3f7886265ac100000000c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba8000120c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba820593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c040cb28bcdc1d1a970b6255a04138f84c0ebfa52b6000000000036d5cc55fb4e1ffc000cf99e000000ec040cc1866da3e55c8ae6c0f739cafabe3f5cbaec040cc1866da3e55c8ae6c0f739cafabe3f5cbac69a0bda7daaae481be8def95e5f347a1d00a4b430aa910b9552857a7712d54b468dfcbb7d9e27f26a49e06fb1f0fb00dd0f5a1bf926863c25ad03fd49c56b62065ecd06e70001fdae7cdf38811659ce9481975b326a5d07236bc501fb8f3001fb05a3c1df04cbbc1c77ae3157c4d6b50eac093068c1acccccd1f6206fc6bb892e8bc8000020c1df04cbbc1c77ae3157c4d6b50eac093068c1acccccd1f6206fc6bb892e8bc82015bbe1f1af1bc27cff5a355b82d0c0aaaa5bb19a634fae26671416b39c92630f007a36078fcf52a03235ec5b11dcf012eb7beb356f000000000022da4cb3fb4e1ffc0006568001fc000b9be201fc000bd4aa000eaa20f14a3447fe10315f6891d24da0e44ac1940eaa20f14a3447fe10315f6891d24da0e44ac1941ec5c66e9789c655ae068d35088b4073345fe0b030181387e11f86685b42d5030cf61959e3005d1c328556c83637e4a0acaeb62046847d6260c968ab433c9c6c946d170ef800000000c226d6e2c423eee0bf233ec020c8012b6ccfc1bd5430a02c55613eede35e9107000020c226d6e2c423eee0bf233ec020c8012b6ccfc1bd5430a02c55613eede35e910720bfcb8e882baba43c6975d87daca9b5223c9f8e6ca0ac9e2965c06ead3d89a08200c3063b19c638a44112f5f75c1d066261a497223c000000000022dc8349fb4e1ffc000bb3b40001fc000bce5b0001b9d16bb8176bc52aa900abd93b3613e5e91ca901b9d16bb8176bc52aa900abd93b3613e5e91ca91ec5c66e9789c655ae068d35088b4073345fe0b03017ccfcb2e59e9efd15cd4096192fd937119581523caacb1320afe058b2784b0668e4831bf6e8e79954cd2118d1b0e45700000000c2a54c1ad133acbf3366aba2534ed6c1f01728553a7e877ac2a22c98be085c68000020c2a54c1ad133acbf3366aba2534ed6c1f01728553a7e877ac2a22c98be085c6820bf623c10780b9dcf9e60e181c82b093884f950faeef2c50c9b268342b182b6d301b528aa08346d887417ad542b2dcaba998abb900600000000009de66e56fb4e1ffc00011b610001fc00011d6b0007b48a04d0a73deac14da9df36ca49ffb142339107b48a04d0a73deac14da9df36ca49ffb14233916d4c795644ca86f717628ea27f0af13b0ea70eb73085f01c97f8e6d601ed269d4fd1d33b456c5c940aecc45b084c0f8d9ddac26d6fb7c5cc1eb817a41bca401e5c9c4ff85600000000c321458ad5e9517e64583facbe4ee3d0694ab856377fe216ab2f4bca85cc2f76000020c321458ad5e9517e64583facbe4ee3d0694ab856377fe216ab2f4bca85cc2f7620762fcc85ca4b2fab16e27f3756b84a69d0e34ebeac3f58647e51e9d58a4521c3003e9257ce8103b6a3836bd1e6eb938ea1c04efb480000000000ae22e972fb4e1ffc000cf03e01fc000cf13701fc000cf6cb0044e7c4cde18464d480d28b52fd7d23ffa72d128bce7f101b7f075273c892063b1b8571311737a5767f95c0f808aff27883260bfaf9cfe2b84519a6b23017a49cea05ca2e18f74af110c5ab52c89a43ced4e056a8af7ca8973401494bdaba26d1c56b46b018091d0dd64f24475000000000c36584a1242574644c1a1620703c55200cc0158de276dc388ffa9815ec328c31000020c36584a1242574644c1a1620703c55200cc0158de276dc388ffa9815ec328c3120c6db6a114efbdf794abc8a68954f6005393aa508ff4ba392eb913aca117c8509016dcc6dfbd52edfa0d3cb1b5d503c5c7b00f05d83412000000023a3e220fb4e1ffc000197ca0001fc00019a0300f4c0fe75eec22907d6b043edb0df74ccc7b85a45f4c0fe75eec22907d6b043edb0df74ccc7b85a456dcc6dfbd52edfa0d3cb1b5d503c5c7b00f05d833008b4c1a8b9c1402ea84afe7c47f7e98d657df873b9747a0e4a497120ec62c81f314ad91a6f3384648e7e60f2734554f700000000c367704082306916bf8d0dd2dfabf778c701ca6006a55b56de4e55a0ed9e2f02000020c367704082306916bf8d0dd2dfabf778c701ca6006a55b56de4e55a0ed9e2f0220a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e4b9b98f6b2dadc95391afc16b570bf7e3c706d796c000000000036f54b2ffb4e1ffc000ccadd000000df89a7a4e97a87e090c06cc44cdf6f596632e62cdf89a7a4e97a87e090c06cc44cdf6f596632e62c64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73016ca29d03ef4897a22fe467bb58c52448c63bb29534502305e8ff142ac03907fae0851ff2528e4878ef51bfa3d5a1f2200000000c3f559e803f09bb261a5f94a5c020816a4ca04627d1969819c32026d46004816000020c3f559e803f09bb261a5f94a5c020816a4ca04627d1969819c32026d46004816200525bd19daef243898853c4ba419ecdd8e493fa1db91277e6e4de61697438d2900c9a47526781022a84b503301b47c4c277d0d7d700000000000340c2f56fb4e1ffc0006567a01fc0006c05c01fc000bdc2300072732cc8d834a9c3cce0d05deffb324874388ee072732cc8d834a9c3cce0d05deffb324874388ee1ec5c66e9789c655ae068d35088b4073345fe0b0309757e077c72c5dfc02197ea345b361d66f861a16a3d506b5a99493929b7b42d2af420fa73b5c3728b8995d19b5952c0400000000c43b8e35d23d9cb0a088b5153414a204f436683298ad311c9cf2643cb9e482db000020c43b8e35d23d9cb0a088b5153414a204f436683298ad311c9cf2643cb9e482db209795d0f8c2ebc027150b12624db495b54580e283674c062f680b136e6477683801e8588af19dc9a7724451f1ff8a506b30cd18ff8000000000008d47264ffb4e1ffc0009235801fc0009a50701fc000a95e300c42520f12ca094d0c840ec18eaaf497adda92995c42520f12ca094d0c840ec18eaaf497adda9299521fb41623befdb80651c8eb65b8dfa90f1f507993081ace6ff9442d477f7eb80ebdaa666804cd0c1d6cb131838847f75cd83540eace2c501484adf0333b847ddaa6c087a8600000000c4b4329ea9e95851296c2c59d395399e36e2f0a6436d3a03cec8de73f35dd121000020c4b4329ea9e95851296c2c59d395399e36e2f0a6436d3a03cec8de73f35dd12120a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e2d4ec0d7b93616ff664078c9308e0bec4c8284cfec0000000000235c8f07fb4e1ffc000ccadd0001fc0010b8340020b99d09dfcc0f9b69fa97738487f20cc6c5786820b99d09dfcc0f9b69fa97738487f20cc6c5786864f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7300196970badc74d068ec1226ffd4a656313decef59d792237a32e6ff56cd4e43030c436025831a4a3d0306a616f03381000000000c54b7009fd21294b6bd144e1d8b12492cdb0d2fe3b78007aa29142a84bd2e5d7000020c54b7009fd21294b6bd144e1d8b12492cdb0d2fe3b78007aa29142a84bd2e5d7204dea6406996a98efea88a66bddbe7f9568093185b08c865b1b664ae0e594c7be0238c1a1bec916b5169f94d1600c9062c9e44b62d6000000000036b95180fb4e1ffc000cf6350001fc000d08cb001e8e94abc60514536d80abdcbd1f252523eeb1941e8e94abc60514536d80abdcbd1f252523eeb194c69a0bda7daaae481be8def95e5f347a1d00a4b4300946837d177bd2b042cf1fe665aee99844afcd270601fdc4860231b9cc97909ccc214adbd2406ab38045d4465e3d1d5e00000000c582fbac1ab54ae7b5c89bd0bd92fdcb5e604bde4805e8ca5a61629cba7ef8d6000020c582fbac1ab54ae7b5c89bd0bd92fdcb5e604bde4805e8ca5a61629cba7ef8d6206ab54c4c60a06c2b59c05ce53c8a7939a128e0b8840d37132f13c3b84d203d11010625d7198a11ff1b8b2fdc69bc709657c2a1f7f80000000000035aa743fb4e1ffc0007b74b0001fc0008ac9b00bd63760f50bda0f3d8db2aeff88bc9eaa88596c3ffc45339be50b5953200438ba8c71ebabe9575e9ef0605d9bc9d3b3e7207258797498daded9527f63096153a0fb857c1da0f6bb1ce2e569bebfa14e6e1f532139f9dcb720d481db17999cbcd8eb66a5ab4c0fd20c5f9695fb100000000c6b291a26712b3f789a6f9379d55029d78f895fe3372c701dd5ef0a597be3b69000020c6b291a26712b3f789a6f9379d55029d78f895fe3372c701dd5ef0a597be3b692061f246afa7628f4c86905fc4f9063dba843830d5e5b9f069a6fd7981bb2c34bb01334f24c69a36c9adf8c9c644f9650da7a6655c3800000000002e65f354fb4e1ffc00053c1d01fc0005ad3a01fc0005b1f30033d78a9b138826acab6c464a74f84b9fa5cb23db5d068e0fe2b3fd8bf7983a2d806e797c522b75a9334f24c69a36c9adf8c9c644f9650da7a6655c383083152e6489f210094f5dd558373a1ce9abf36bb8001d4f35b3dea74f7ae74baf859abd22238c682ac94cab82eeb58aab00000000c6eee81fd38e6db24cb5e847794cefca7f3f8f95a066028bb8dfd6f36fb92921000020c6eee81fd38e6db24cb5e847794cefca7f3f8f95a066028bb8dfd6f36fb929212026101299b476b793ac0d19aee60267b583d670c5dae71755decbaab175c8afdd00c9f0eac27fa56e424e669e9205194fc9b173fdbb000000000068f8f27efb4e1ffb5ffe01fbc39901fc000119630038130b3e02c119f53aba29a12de6be40f0c6596f38130b3e02c119f53aba29a12de6be40f0c6596f6d4c795644ca86f717628ea27f0af13b0ea70eb730050f3a743867bf78d2e9a3906d15d8400d8d58255771d12828922386e8685f8aeccb8d9d81153f9c2d7da0436a71fe5500000000c7290309328d48982f4a265566615083ad72ae2e7cca5fdde599371762cd105a000020c7290309328d48982f4a265566615083ad72ae2e7cca5fdde599371762cd105a20c48677c8c69a59d52c2136a85090d3184e46f0c149bb319ffc2bc23d41e39009011a5f40c458858c685001ce69f201d3790b48a88e000000000036f4e7e6fb4e1ffc000bb3b40001fc000bd21b00a0d72e1d1296d2303c68aa6e148064a03e30dea4a0d72e1d1296d2303c68aa6e148064a03e30dea41ec5c66e9789c655ae068d35088b4073345fe0b0300422f6f4b6fb939bad0c5eced0d0085a9cdffe158b7fa0f5a4d83a2e311f080d92346f11764a2a8212196157d83a640b00000000c81c26dda720ccca323cca9a675257c9ea50c4aaf40cb1a4c2e931435f160fb8000020c81c26dda720ccca323cca9a675257c9ea50c4aaf40cb1a4c2e931435f160fb82066f6464e611b519b7abe070b67794d606b844fdfc365560468eca287bb381763014f6a74e089ab620cd7289a8a46a6564092782bb6412000000036bead17fb4e1ffc0004ee4b0001fc00052a3400e614deca3fce7919013e4e440fd3d4721ad3465de614deca3fce7919013e4e440fd3d4721ad3465da91a0b2b6a951742b8766f9a9554c313f29e86d83010d9901c0aa8f9b3e789a1413e731ff07b9b58d4f53925f53a1502f00e6ccf056dc86ffa5595a1ca5c02cbdfb38b1cb800000000c87218fb9d031f4926c22430c69b4edf1f0fb80c331c1a79e3b1b3873407c0ac000020c87218fb9d031f4926c22430c69b4edf1f0fb80c331c1a79e3b1b3873407c0ac20a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e3e709e0d0819c27bba7eb754839e873e9aae580b74000000000036b94585fb4e1ffc000ccadd0000005c0c201c793d6cb7265b6897058b0b1e75fdf5285c0c201c793d6cb7265b6897058b0b1e75fdf52864f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730842c53c3aa11ae4b985a52ae6a3170bdb58f88ec04c62013f9322bd5fda4417939836b6f41741dd864c348103a1155d300000000c940d40d2849fe70baeffa8e343024d01dc80380f38b2a015798f503cba26d3f000020c940d40d2849fe70baeffa8e343024d01dc80380f38b2a015798f503cba26d3f20ab742c3f5293d67a1834b2506f41b1a36d58b09d713389e35d48beba6c145f620112521c58f53340f2c9569bf9e7d9c04f1b625a390000000000cf9afaaffb4e1ffbcc580001fbe61a008fe94ff326b3d3f9986fe97fb2eefa9a365629198fe94ff326b3d3f9986fe97fb2eefa9a36562919a86ff169d2789750a0bb4a5adecf343dbd10987230069dd3113d6320397e9674ba3595f46dacd562e013e9e80a2e7d1095525f35134d4a8c19f4cd4a19d3886edf6032875500000000c95f78ad5dab4ceaa98ff2d9d60d6d69e741f554b3ff876998dd832b2255a5c1000020c95f78ad5dab4ceaa98ff2d9d60d6d69e741f554b3ff876998dd832b2255a5c120c013351de51a56f7b39f2c10f3840e3fe943a174af4860f8e8665bb78247951501fdb9e309b9b441317475ef6c6bc6c1ea892d6a8c00000000002d2056e7fb4e1ffc0001a3c60001fc0001c433000e06d6f85fbf739967d628e48d87300c4bfa93e565b4b2bd9e302d32234a9bb205db6e51c08767ed1086f7c42d054d120f9ec84739e2211a19866e3d30128e20333b8b51fb8c72c2d5acafa049758b53279bf78f10a1f32995bd05d4f6313b2bd67fbc48379455d89ef869fa6e00000000ca0d0910002aedb97fb303e97b1db11583be62b3db8b6147ffa84b98309fce71000020ca0d0910002aedb97fb303e97b1db11583be62b3db8b6147ffa84b98309fce7120a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e4893f68af96d322ebc11029150d446a551042bcedb000000000036d45b94fb4e1ffc000ccadd000000b7e99fc3ee4cf3d64c4438fc2a61cba12c0e7319b7e99fc3ee4cf3d64c4438fc2a61cba12c0e731964f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73092823797ad456d53ce1e6bde84e8a19164ff88a73ccd242ec48d9c6a479f2a049e214c7e8ec2243b7ea74ca6144ab2c500000000cc02c1be8ef00540856c769f77bca1afc593d3c40cdaf5ca033e462f1c43fc52000020cc02c1be8ef00540856c769f77bca1afc593d3c40cdaf5ca033e462f1c43fc5220a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e1423146e911e2951e98aadb67f0c40c8a21ed6bf79000000000023a1de4afb4e1ffc000ccadd0001fc0010d993001d92da27f8fd00226f85d9e1c2ae33f2d57b84361d92da27f8fd00226f85d9e1c2ae33f2d57b843664f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73013146b3252f408f1cffc875b12b61f56c1ae02113b24c0b5aaedcda4a9b509332c8c4587450074f3e0906aaf3ceca75400000000ccc3668156451b3e10ac5c97d60e2c20fadf88c6266e3b2a9afb0e33e658734e000020ccc3668156451b3e10ac5c97d60e2c20fadf88c6266e3b2a9afb0e33e658734e20f9cdc515389213075782c4f03fad8a5010b7aa4165b804fbb1caae54c1c0f15700034ce75a5b9ab22d285c7876ccf1ea1ec4bcfdd300000000009b8ae253fb4e1ffc0005336e01fc00053d0d01fc00053e2c00d144786581a774e12dacc4aa155eb7d6d73869dfd144786581a774e12dacc4aa155eb7d6d73869dfda952b3b45775c0af85fbe2e2ab21549d86beb0a30057b3b0190261b1ded22b9c58550f7bf17a150de6a755a5478988b58e32bb7a53e7e6f9981bdbf416324e75ddd9853b800000000cd2963744e83eb775912b47e751f825f7fc8319db11f7ad4aa8e0f8831d12e09000020cd2963744e83eb775912b47e751f825f7fc8319db11f7ad4aa8e0f8831d12e0920f8659149d6af2d9b210531475f23dc5de3bfa2c35b45b4e54dcc471ab1b7222f0149343c1994d094b8ca7e095671e7aa7ce5cc141300000000002d200ceafb4e1ffc0006f1390001fc0006f1a300f6cdfba67f9b6228a325c80d5723557d8a2006d8f6cdfba67f9b6228a325c80d5723557d8a2006d849343c1994d094b8ca7e095671e7aa7ce5cc14133004ed653b556ea9d8b8391dc59ce49796b15c118e37daa2eb42326f72571b195cf21e814f93338ac9488000dc3d8b4d5500000000cd3fbcf015bb8071f253c07a4c5511e4759db5f655e2d198e4e2042e3986e828000020cd3fbcf015bb8071f253c07a4c5511e4759db5f655e2d198e4e2042e3986e82820dbad65a4c4cdae2325f1cf0f399a16a978c433a81e38987b8d9a5992087607e7019e5d4165c421b666fa97b17b6202fb4a3c34ed4941f00000003ccdda05fb4e1ffc0007663c0001fc0009419300742612cedde82b7e8d1f49ecc96cbd3b3c65372c7fffc5375fa606d4066bfd9f4fd211b3c5d59a955cffda7bd45f324d8b3b96059c999ac2d95044903091da7eb4d0d0f78e4aa5379d45c779105a0d809a04497186d53743876e31874d663f965507339259ce2b99fd3ea4c275015cffda7bd45f324d8b3b96059c999ac2d9504490000000ce09b01abb1fdadc8c04db6f8e9141187b034ae536776134e01156196fd595ed000020ce09b01abb1fdadc8c04db6f8e9141187b034ae536776134e01156196fd595ed20a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e64e01963565d4e45dd2c88567cbf3f1ba813737203000000000022d9bfa4fb4e1ffc000ccadd0001fc0011087300c826f62669213156ccf082dc70087b8e68ff4c58c826f62669213156ccf082dc70087b8e68ff4c5864f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730068631f31e13e1c29c739619b2cb58adf73724dd8c6227ab1b8f45c08c5d6934338365ed45c795e4117ddf79f1e5037000000000cf774e2a4bcab3c7e7d2d934cd2977b090fc1e414d26dce53e16cf2cc5971ccd000020cf774e2a4bcab3c7e7d2d934cd2977b090fc1e414d26dce53e16cf2cc5971ccd20e91b3aa22e4f2d8326a68f0400a8ab92d2ec4b4af9beb3abebba5ed8127b8cc0005b156c7020f5322d482e14d95a666d0b36d9b8c100000000009f416929fb4e1ffbc4230001fc0001949300beb0ac49dd993a3841c7f91fc63faf17e32ef6edd1c380a3095e1088aae13a699aa83f4dd1bc0fd9b2334b22379811352d9988876a6e586d975e732930002decf89a99afc7bfddbac08c6c25a028e58f0c7863b7fa6811ff84afcefb933b510b78df6551f844eb2221b0c0bb5300000000cfa6f7b58c78f827c15e8f1b6a5a2a3a92140101719006d8226a363e2c0c8e5c000020cfa6f7b58c78f827c15e8f1b6a5a2a3a92140101719006d8226a363e2c0c8e5c201f44f17b876717517c7d133c9128abf51bb6733c87b0ec7ef06ccb96478e8aec01559cd372f02cbd4b52375512d9d55e153a3a873300000000008a442d76fb4e1ffbc39e0001fc000194dc00fd42c918654ccfaef1b1c70efb20d3f4f6b50b65eb294d05b014930dccd16d4878159584189e77c0b2334b22379811352d9988876a6e586d975e7329308ff05fb385c08528b762683c2ab6864ab1ac031146d9be0df597961625c9538e0bb03ae6a759d66e1717e879ebaad41c00000000cfcddb737317b86698faef84734e9e655fcc2899ee449d13ff70b014419b6c4d000020cfcddb737317b86698faef84734e9e655fcc2899ee449d13ff70b014419b6c4d206716b03191d4b9c5e813998018f03105ad3a5a0a7de1a62efc94339fa84afe9601bf58e573242232de98f1bee4b787f64252361cc000000000003415087cfb4e1ffc00021c240001fc0002fdcc00cba37b8b60880605abd3ca81294ca6b6e725a4038b7f823b0acb2fce829b7434a720075572ce6dd69a1a33fb82e27f0405303a4a4183199a5f2fcab830009a876325699d6979757ac10d6b37eb7f6690a40447f6473779eb9130975998d3a9fd6e9ada19559730bc017843ce1200000000d00a073a9de7c2efe78c712aaea77fa1a6c0ed00b55ed2289cf763763eb32a43000020d00a073a9de7c2efe78c712aaea77fa1a6c0ed00b55ed2289cf763763eb32a4320a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e2e5167565f0e750fbe3b6b7baf519c5dca2be263e6000000000036d63baefb4e1ffc000ccadd000000bae896aae3de540d18e5ea8573182860471082f9bae896aae3de540d18e5ea8573182860471082f964f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73013dac269908111b8b091edbda123d5884f4d47d21225fa319d344b350762a85c6cdbe21804ef9b2cc53a878c72a001d600000000d0b3fda32eacb51f9bf25e533344e144245d629cb1decc05eef2781a658f4ede000020d0b3fda32eacb51f9bf25e533344e144245d629cb1decc05eef2781a658f4ede205d054509583f78aefb625c44e87477878cad43c597a0f169ff8450a1abcc313e004490108b0958d28e47e691abeb21bddee8d08cef000000000022dcaf58fb4e1ffc000bb3b40001fc000bce2b008f4c05bb6a71e94abccfc1c722494ce77ed0a3418f4c05bb6a71e94abccfc1c722494ce77ed0a3411ec5c66e9789c655ae068d35088b4073345fe0b030031eb004643118075e2e22389b29d78e797ca7dc18edf201a2c324658b261803e8d162b172fb00822da1fe4283f8863a00000000d0c37ae5ff62e92d9f065b453c79bdd8b967a7e7e5e3753e94e0f2929065579a000020d0c37ae5ff62e92d9f065b453c79bdd8b967a7e7e5e3753e94e0f2929065579a203432a97c8b76efce888ae94aab39a57465f1e833f89364e8a4d13bf657c24cfa010dcb7083110afca0bb2af934af50512b0bda0d6600000000008c520f8ffb4e1ffc0006b0b601fc0006b32d01fc00071acb000b5424d01a3096f1a61dded02a329caaed8300d16150352212815041fa5dc70a94c7dfd507f4861975f49a2ef947f1f126a241add5de9e0965d20c483010ac5b643b6dfa29989103ad74641e5fa27626492f08b8337a8415b598ebf2bc6676c73621905a71a15d7bf9f92d6efd00000000d1ce9c61c04501fdade45632d83ba14b76b8cd89de369e7ba9594731e21a8c97000020d1ce9c61c04501fdade45632d83ba14b76b8cd89de369e7ba9594731e21a8c9720df179634db5c8c4cfedca1271ed90c3615ef15757d5c7d6fabbd9e18e8752f5201afe98cb66e8326b286b5eb9dd53b0f3043cbcc21000000000044b7c45dfb4e1ffbf08d0001fc0001195600227ac0c292b7d209dc75272563f6e3e40bcd4b66227ac0c292b7d209dc75272563f6e3e40bcd4b666d4c795644ca86f717628ea27f0af13b0ea70eb7300c49037992160cb8d7f6ad7e13d778fbbfb5d10230b456bb3aca1c044e79fb15c3b1fcef7efac59899eccbd190bdc40e00000000d2148afa283037e255d65a3acc82428d6a712215003963a60c6e015aaaa4bff0000020d2148afa283037e255d65a3acc82428d6a712215003963a60c6e015aaaa4bff0207a296529680d98fe988f25841cefd74be42dc27ca52ef6f46421c200f477525301c1e0f105b18897e33ed0d0636a1841c38e3ea826000000000003140e8ffb2712fc00035e2401fc0003cdd701fc0003ce6400bc0daad062fd3cff45c9494fc80bee6a0ad1ef904e818207ce6a7e9752c006ae4328b26c14af2a955e7e959febf6f6f5e42de569815cc416d06032ea308de1a5d67b291f75e87e20eb4b9fa7246dff5bcf4030ae26c321b1845609d50d04b240cc51862b4a7b3dc9be4aff050f00000000d23a37ad5fc04ff18955da1ea1cec8975fa03c525104f9553b3cacd36045b6ea000020d23a37ad5fc04ff18955da1ea1cec8975fa03c525104f9553b3cacd36045b6ea20347d39a27538a8a7819cb8d3aa5e7484b6ceb2ebb18de76970cbadc12837b98700eaf1ecf2a52c4b15b1f29ae0776532a4fab56025000000000036da7f80fb4e1ffc0006568001fc000ba7e201fc000bd4aa00af19744774b258e0ebf2a01006ee507c6a368f27af19744774b258e0ebf2a01006ee507c6a368f271ec5c66e9789c655ae068d35088b4073345fe0b0308b2ae1b6528eb36f1d87d61e763e5d5d26f6eacbfc6b91305eb30d4d4136e7edaf3bcf2fd07f8a91cdef268465f5085400000000d23e1b9f3cb6ed89beb1f11ac96f61c0011655c6cd02c600c6a671cf92c9f070000020d23e1b9f3cb6ed89beb1f11ac96f61c0011655c6cd02c600c6a671cf92c9f07020a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e5bc7da1882838f4aecbe1de16036780bc6dbb5d48c000000000023a7a5e0fb4e1ffc000ccadd0001fc0010a8eb008496f3b53ff1854c310cec50faaed0a3980374dc8496f3b53ff1854c310cec50faaed0a3980374dc64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7309291debc5e6c56a9e1a9b77cb980115c36a4d3d584826e62fc4b6ad7834cfc21e7c80226d46e90f4fda7771b4511152600000000d2467a06e67cfe57ce8723f565c296f97abb663380ce87bb8d5e72989e3301d1000020d2467a06e67cfe57ce8723f565c296f97abb663380ce87bb8d5e72989e3301d120da822286edec580e48efe91cf1129ece56530d16667549522d6bcc6d3e3b09910022de1a923e40b1fd9f13fb4f076b69d9ee94e0b3000000000068ee9c6dfb4e1ffbd50c0001fbd68a006bf6187199e0d3b146d1daeb844abed61dde51215d63ccb848f51351e6623f5841dd00e057e4633722de1a923e40b1fd9f13fb4f076b69d9ee94e0b330145a212f37b991a6c050cfaaad7e83f1347486984174e8f446e59fa6c225691ea679f70613d829f536bb1a311d812cb800000000d304e1e869e1a9aee1952f06bfd8dd43f8a4d12231c5d43641a31f89a53eca2c000020d304e1e869e1a9aee1952f06bfd8dd43f8a4d12231c5d43641a31f89a53eca2c2054be51b0a5708936a13e637645dc0c002a2d79282d4f5f2e89aefdfc4c49c8ac0141307e80a8d668b0bf3cc98a52f8d85ec8cf5ae20000000000904c4214fb4e1ffc0001b6a60001fc0003eb43006f39ee8ed58b56b0fdecdbf64cc71b75041ac7716f39ee8ed58b56b0fdecdbf64cc71b75041ac771c0a84112810ea249524c9060518b76dbee8b86cd3009591bf26ea6f179457440d73ebc70c44310ea56dad7539a93be903e28788cac013b646e3ed4198ca74a8325d8a721c200000000d3a0e645c1830de00ca370761d0db7a75a408b9322ca571fe26b7f8cc5a0ecc4000020d3a0e645c1830de00ca370761d0db7a75a408b9322ca571fe26b7f8cc5a0ecc420c4eca0c58c7f6be21f57ca22938b405aa7b70d1d7670a30ce00d83c145e6a0d300b0adcebc8b989c5d9248b195d5b3a3b1a57a855800000000010000000000000000000000000000000000fbaa690001fbaa69001e88661c273d73b44bbf942d3f1cfc145539969d1e88661c273d73b44bbf942d3f1cfc145539969d05b1290b6787444d5ddfdf30f732ee620dadda063005b7d7aee629c25efc5604104a3a9af1e23663464e0505a057e68cf12317834160597fcf80287a94e98f171a8c79a2a900000000d625ce5bfbadaeae3ea778ba16d871e6b61ec07faea80403dd51a9d28df8deea000020d625ce5bfbadaeae3ea778ba16d871e6b61ec07faea80403dd51a9d28df8deea20862bff54719c5747b08e2b5b646efc0e1ae8527b72e6526554e8b1db8655c5b400c315ac9f0d1a78172378ccf1dbe786b01ee7764b000000000055d1f301fb4e1ffc0010173e0001fc0010176b00b80018523ca775bdcf9f5b35b31aec7974cf3b15b80018523ca775bdcf9f5b35b31aec7974cf3b1517c1532d16104848a1cc23893816c93d5559beac3089b278c3322e9e5193d133bd49d958d05383835371944dca113bae75a3c741a61202a7d3f99447f7521708b308028b1200000000d73cc0f5964b94a5c72bf9457ea1681a4dc61940f75e991492b669697a392ffe000020d73cc0f5964b94a5c72bf9457ea1681a4dc61940f75e991492b669697a392ffe20024f7b3d5ef9e0a82cb75799a1589f8bf5d988e1bc342ac533a5aa94f32fb38401a8b2af0c1699023cd662f648d477e7b52bcdffd3000000000036f40a18fb4e1ffc000bb3b40001fc000bd21b00e433c14f7b979d60aa65bdd41a61793a80cb4af9e433c14f7b979d60aa65bdd41a61793a80cb4af91ec5c66e9789c655ae068d35088b4073345fe0b03008591f0c86bab284e3e43d622ebf60c6f2e508d574fce16bec8cf35a04f69fe667a65072dc7e0ebdc78c0a2f82d5d4a000000000d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f89000120d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8920593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c0d47eb59e9a49b3794acf272f1bfff17f228291daf00000000002cf06266fb4e1ffc000cf99e0000007334f54da07d3b9e177f6e57c64f97bb0f982caf7334f54da07d3b9e177f6e57c64f97bb0f982cafc69a0bda7daaae481be8def95e5f347a1d00a4b43086108e551691da2642f37b68bcfbc5bbe9984ca51aca15ee24b6fa9b8690ed62c6ed722d091e04ef617cfc99341fd35800017034f0d3853c5351fb8e0ffd3c1daf12c51c2d8901fb8f3001fb05a3da0a60d91a09d34a39ba34e4175d2efca738ebb409e3fbb0546d41a24e83a722000020da0a60d91a09d34a39ba34e4175d2efca738ebb409e3fbb0546d41a24e83a72220a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e57bfc4a68510d0df6c7f9b006df5845a8468b5f390000000000036443095fb4e1ffc000ccadd0001fc0010efea009c14a51ad09e0eedf4d49b11a779aebe5755a4e89c14a51ad09e0eedf4d49b11a779aebe5755a4e864f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7301099dcddc6560d1039b0edb91bd700e5deae0cba43163fa289a80c2bd22335b5b0e7a1fb8f5494c0e6360e73a12fe0a800000000da21ca075f0b1b6c29df0391165030d85a8d5e7474c6358d9edbd3dd270de78e000020da21ca075f0b1b6c29df0391165030d85a8d5e7474c6358d9edbd3dd270de78e20d77e2ba2a4cd96a0cffe43117209beaa0bcca463d583c02ecd118a3e04e5ddfb007caf7956015e9404896b6492227b8517c679a02d000000000036b807b8fb4e1ffc0006567a01fc0006c05c01fc000bdc0b00f5a25e1acba9dae504fb92b2b7f4f8c776b450b8f5a25e1acba9dae504fb92b2b7f4f8c776b450b81ec5c66e9789c655ae068d35088b4073345fe0b0309760a3bdbe28cbc5c64b7426b7b59aa84f6ad6c4fdbe040a9158c359e39feeae4b4168d6231d636eb4024f072b4d465500000000db3158d303d9634fc0a4772452707e4f6154aabedcce40d60e7932137ca52efa000020db3158d303d9634fc0a4772452707e4f6154aabedcce40d60e7932137ca52efa208e8e515f7025352e7c608479e413beacf0d95cbb964b47e4a98fd27b6b6b628a19379812a735584751c27ae8d47205e7048ad8afb7000000000034d41347fb65b0fc0005e6990001fc0006584400f312f66e9433c75b461b481f0576d3acd398c223f312f66e9433c75b461b481f0576d3acd398c223379812a735584751c27ae8d47205e7048ad8afb730989f584df6e5a359bc469a4975baccda2bc6a3fc3e89721c639f5567db7abef79f31ddeb4832b95418d49322419d3eb000000000dbe6cc582f7b5c0eeeab18c03d651274a36a26e5222e9e6ab5dbeef9590c3d40000020dbe6cc582f7b5c0eeeab18c03d651274a36a26e5222e9e6ab5dbeef9590c3d4020a94e29c854f2cf4113be2e8b61faa8bc4749778dffa3edefc112d01de9a677a701bbac279c1e96b87d49a7da69df88948d81d5043c000000000023a39c47fb4e1ffc000b9ba201fc000ba67d01fc000bd4aa0099b35d5698744965f753a627926c0d59b1821c5199b35d5698744965f753a627926c0d59b1821c511ec5c66e9789c655ae068d35088b4073345fe0b030811536feb53c015c2aa7e518611a2f6609fe3362d64b225dd26ec2becf55100402e561aff014fa31ee0ab41e53d437ff00000000dc1a51970c343e17706bf77aa4309149613f7a69650f274b6a9fa1c6dd1c4f87000020dc1a51970c343e17706bf77aa4309149613f7a69650f274b6a9fa1c6dd1c4f87205b016215386c035a42042a93736befccdb87c30cb90adc3b1279da58ac57cc1407eeccb10d4e73ed1650cd3fcb2dd3cf4c2f7347420000000000235adf83fb4e1ffc000cf8b101fc000cf98d01fc000cf9fb00f49a8758b606e7ecf90fda27c30efdd71ab8be9ef49a8758b606e7ecf90fda27c30efdd71ab8be9ec69a0bda7daaae481be8def95e5f347a1d00a4b430846e41a6e970b78fdcf39e3348689944de461e961a0c5dae123c3b7c4d985bbfb0eae2da56b6600dcf82f196df258ee600000000dc2e02ac95ce4ccc9843c38de7bdaf32f2a1d5966c054127a3f4ca4f4bbd5991000020dc2e02ac95ce4ccc9843c38de7bdaf32f2a1d5966c054127a3f4ca4f4bbd599120a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e2239379b568d6e941d8e551204c4a13b38a8313155000000000023576903fb4e1ffc000ccadd00000032eb51df8032392d44594907e5032d23df570b2d32eb51df8032392d44594907e5032d23df570b2d64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7300db85a27cd589d225beff9977aa0ac32551d15bd906a899bc1ef33458d7c979118f92bf1de4ddb55144acc2f7cf6d85400000000dcbcf8311e414aaafac3650f3f61326dce386eee3d1a53da86e4c9925af48d9d000020dcbcf8311e414aaafac3650f3f61326dce386eee3d1a53da86e4c9925af48d9d209d8df45a92c9e486da531a3dee6e38ce6d32613f0f65c3faaa4a411e31f8bcdc01c939bc570a54556243cc0386615fd4f77fc3a3950000000000b23e440afb4e1ffb66900001fc0001193400d930d39369c43d62ef0fa29c85a349673712f597d930d39369c43d62ef0fa29c85a349673712f597c939bc570a54556243cc0386615fd4f77fc3a3953089277d2620e48dcf8456cc8815aa18ad3587bbf40cf0d1718696bd126e19791bb600b22f1063d4e5e8efe85fab8f90c800000000ddb33a8e1dc94f0d2c78faf99f2209c5a6304924675ee639b237e00051e5adbd000020ddb33a8e1dc94f0d2c78faf99f2209c5a6304924675ee639b237e00051e5adbd20a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e020173018c4450e8125fd37bc507fb4feeeec09d49000000000022de527ffb4e1ffc000ccadd00000017a7876ff09a4592bf27959546c02232a48d49f117a7876ff09a4592bf27959546c02232a48d49f164f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730882aed1df01917097a5502ff541a800d268967ab39c8f841ed62c5387eb46459d6f6959166cafec148dcae03830e83a500000000deaaf275e9e384f3e7b190cb4e779d200a8c22dd968e6eaee0bf0a2900ac93b7000020deaaf275e9e384f3e7b190cb4e779d200a8c22dd968e6eaee0bf0a2900ac93b720a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e080dbf942f2afe5fc96072af6ae4599720d1e88c3f000000000022db21e7fb4e1ffc000ccadd00000076c44d67639aaa8fb877f1db08d5e582b570c25d76c44d67639aaa8fb877f1db08d5e582b570c25d64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73017f78abcee6d2ed68bf2c82afbf56ef9af67313e2eb655ea5178850907cb3057cae0bb5a1d09f161057bf62f9d4890c600000000df770657631b27b71aa97f295c8c345df6f73617f2cc48f5d414955094a4d2ab000020df770657631b27b71aa97f295c8c345df6f73617f2cc48f5d414955094a4d2ab20eb25924c31ced9ab50bb1efa43f51e7f9e3a883b0668b1aca170731b2c73876f0116464c645e265c1dc215d0da895a91cf33c53f720000000000a123e12efb4e1ffc0006b45c0001fc0006b4cb0069c4cac4ececac7282dac6b8a9198772ce3f72995603402752878f5c76e9f40a3091b748a731beea16464c645e265c1dc215d0da895a91cf33c53f7230865e0561715f28e996d2c63e1ed462c82d403ad9300369529cc8932f02a8ecd6bf5c5b316130997f2c1ad1df700ea2fb00000000dfab7fd7e6f141d1ad7ff9fcaf8dafaf85b05dafc9058b376a33c6f4ee1da607000020dfab7fd7e6f141d1ad7ff9fcaf8dafaf85b05dafc9058b376a33c6f4ee1da6072032048e6d7e2751d4029bfddd77d06ea72c07fffb2d2a67b73ac1cc499fd10cf90210837fd9d5cba10bb91fc24c4faa5c7f591f4289000000000091efeb12fb4e1ffc000153490001fc0002427c004c90d0d2b49179ba1311496241623928b4e9bfc64c90d0d2b49179ba1311496241623928b4e9bfc62588a17ab3f917f19afeb8c32fa7c486ab4105a3300b4282cdfe1cd639e60b6c58b2f210bfe6b57f8f247cc5b55673d188ef458270c7314f7128b286a3326b9ab6109bd2ff00000000e0e5e51a1d6c471289fa4dde52bf5de747e1238a478a7fad107427a485921dea000020e0e5e51a1d6c471289fa4dde52bf5de747e1238a478a7fad107427a485921dea20c476e128117f5b8573cdedca3abdad1e49bc2d1ccbc8d536286a10c14c4bfbe9012aff26638de9d67c2ff76983669a27a5369f1146000000000002030405fb4e1ffc000834c30001fc000834e3003a8be94ab784cc8472ac6739fc763589673af28152b3089828ccd5c5e2929bb45057829bf2cd9900194748ff7e003ab02fd6964087130588b6c71c743019224c48bde28c061c99ca2a641ed1f695546fb6f1d103e93b4d8aa5164f5fdced8073ee239baa885cf377c8c173016500000000e0ef260e49c9f2139825cc98504c536397595e05813cc1de5dff2eb793aeb5ef000020e0ef260e49c9f2139825cc98504c536397595e05813cc1de5dff2eb793aeb5ef20aaa6c559704660301f5d58d95bba0be1df90ac849a60e537a7e1895e3a90d354016582f71a9a070fc634378449053280e8b5a64a0200000000008e5da342fb4e1ffb92e801fb93eb01fb96fa005d3a8bd28dc7d0ea750f976b89991482da5ef8bf5d3a8bd28dc7d0ea750f976b89991482da5ef8bf8e9c7503df018ff14c7f28047d833d1dda31efe5300dda9adbc22cdf89c04e8ee714da7d80dd5620c1d14e30780668d3b782b2f0acac9f00a556be1548733c1ad1abdd96ff00000000e1051e900f3f13c6cf79e1734ae1c65683c627982c5ddeb30f8afaa85116ab4e000020e1051e900f3f13c6cf79e1734ae1c65683c627982c5ddeb30f8afaa85116ab4e204dea6406996a98efea88a66bddbe7f9568093185b08c865b1b664ae0e594c7be06aec4b5523c900755019a250cd5922349690a448c00000000010000000000000000000000000000000000fc000cf6350001fc000cf889002a5b7ea1a484ccab3250dc7656ca99f7bc1cd21c2a5b7ea1a484ccab3250dc7656ca99f7bc1cd21cc69a0bda7daaae481be8def95e5f347a1d00a4b43000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e11bc5514ce9e362112fe4bc2356d68a63dd62b3834e320726709bb707564510000020e11bc5514ce9e362112fe4bc2356d68a63dd62b3834e320726709bb70756451020a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e499644ab02bf96193c58f4421e41886319036b09c60000000000235a35b4fb4e1ffc000ccadd00000002b43db3b33d56022be0be0abcd8a470f3624c8602b43db3b33d56022be0be0abcd8a470f3624c8664f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73017596d7a72b65531fffd5f610752422d6e286c975f30d026092f7900f8015073bd6f6d1b85dd3981814c093910e7dac600000000e220b3b30879a4e489a99f265f00aeafaab0fbedd0ec3fa194befc03fe93ac30000020e220b3b30879a4e489a99f265f00aeafaab0fbedd0ec3fa194befc03fe93ac302049104fbd6215a0f0642bb38f73f479a8694ab35111093a57d07464b7224857e70060494598e236442ea115c2fd4772c8ef4881c0c00000000000951c7f08fb5207fc0004f3ab0001fc0004f3eb0027ac0bbb97d398cc78587b58ea40d92039f6a27527ac0bbb97d398cc78587b58ea40d92039f6a2754a0ba964dc2701ea622ef904633191f9444a5fce30127147f0cd5bc3ec7c8c5704924e855d46dac21de72e2de112f7dee7c9c3f9c40d4474c0d9ae36a56b800659af62c16d00000000e341b4207f799d7b216593303c5705c97825331805f32cf54188dd05a7e9940a000020e341b4207f799d7b216593303c5705c97825331805f32cf54188dd05a7e9940a20ed0a3741f44d013b11c389c282f6ba4b53abd15f4b8b7d2b08ac06ccb7a923f401844e2264660076d8db9477d915f43ee0c68d228c0000000000369d0891fb4e1ffc000384570001fc00044423000ee3064c60e85c3f9e8175b2a4d748a2fa3138949dbb34ad2ac21a13371e4212a67150bbc0320b2ff28f590dc3a245b02f545deca4b8d37217444def30029d0298b3ab58f541f566ba5ddd40e8e1e711dca26b1757fd1b707baea16ce77aaf8a836232809a5e1d301a36f2045800000000e44e528f46f8338398e514570b715cb77f2e001bed967bf0012f99a81be34d9b000020e44e528f46f8338398e514570b715cb77f2e001bed967bf0012f99a81be34d9b20cbfd47c5be15b98099bde2b2d79a1b71ab29e9f70fe74b9a41d3ad87bd1b33f900a51180fa46b6e0e6763d1ec58803d676fddd4a3f0000000000235590e7fb4e1ffc000bb3b40001fc000bcba300c830435c4611335accf4d70344a9512e4af1cf82c830435c4611335accf4d70344a9512e4af1cf821ec5c66e9789c655ae068d35088b4073345fe0b0300c07de8f27328b0e1dfd46c77a183f153ef4179971b08597e3206b97b7ebd80a6d0fd81ae6d69fd9f1c2425952e6636f00000000e461d74c2d6f83e032068bf1f8bc5e019f220187c74ce90625ffff2fb0622a48000020e461d74c2d6f83e032068bf1f8bc5e019f220187c74ce90625ffff2fb0622a48204d5e955db2aa6907ad086e36d6e596554d9fe90df258edb34c1db83dbe05bded00c82b198d97a2b96efc25645a104f3de3f25ae4dd000000000036c81bcefb4e1ffc000bb3b40001fc000bcbaa0095745dc68d45784cfcba71fd18c5b0b0e2ed4f7e95745dc68d45784cfcba71fd18c5b0b0e2ed4f7e1ec5c66e9789c655ae068d35088b4073345fe0b03092110df65b98e79912f6b80aed1eda6e66c55da2549472aa7a089a003efdd5244b39c208acf902198701f623fac145b300000000e52d2f726c9d7fe66a042564fcde9d4189180b7f9debb60ae3241872338b8e9f000020e52d2f726c9d7fe66a042564fcde9d4189180b7f9debb60ae3241872338b8e9f2091cd1bffaa50fef228069e113b7935af4b78c904a32ed0e7984b1086478373020199f5f489bbf74630e2aa67714aa7596510133be5000000000036cad177fb4e1ffc000bb3b40001fc000bd21b009017184ce5f2e988321891515465de3330af413c9017184ce5f2e988321891515465de3330af413c1ec5c66e9789c655ae068d35088b4073345fe0b03010487fb44636ebee88be5e76841d80b2710c25717d82d4ded913ca5c9c9a5d85f80268687b237632cac812518a2464cb00000000e558c21609f13196f38a0e135c8a56ee4632ea1681a9dedd5d65ae8031b34be1000020e558c21609f13196f38a0e135c8a56ee4632ea1681a9dedd5d65ae8031b34be1208e8e515f7025352e7c608479e413beacf0d95cbb964b47e4a98fd27b6b6b628a07082bf9bc77c34eaaf9c9cf4b1b8cd01f1768bab0000000000034d41347fb6596fc0005e6990001fc0006579c0018fdd71cb9d2d0a4cd75e08191dff37fbdf4465018fdd71cb9d2d0a4cd75e08191dff37fbdf44650082bf9bc77c34eaaf9c9cf4b1b8cd01f1768bab030005d1f334fabccd08847756effff3116eece973c077e3acd1aa936f4e51293fa8753de661dc7a03edde24714eb7acdcd00000000e58b99ba67999559acc105b139ad7c0f75e4b88b64ec8e9e3f91d19b18a02fa5000020e58b99ba67999559acc105b139ad7c0f75e4b88b64ec8e9e3f91d19b18a02fa520b4863351e597af3a020f3a1bdcfcca49c63059d3a2769c3bc5628f2c580d988d006156c9f4174e1544f07c378dc4c20b5fff8877ee000000000022ddabc6fb4e1ffc000bb3b40001fc000bc78300b42b27cc27998975c7ebebbbcc18c98c097b60aab42b27cc27998975c7ebebbbcc18c98c097b60aa1ec5c66e9789c655ae068d35088b4073345fe0b030067ff22ce46ff515d5869ef672ace862c7afe2e81a6820d39098419322ad2858a3305f03601a9a85f76333be38b65c4300000000e6595f88f935fef934a6d51dc0a1fd43e65de1adfacc2c99851a69d80cd26493000020e6595f88f935fef934a6d51dc0a1fd43e65de1adfacc2c99851a69d80cd26493208e8e515f7025352e7c608479e413beacf0d95cbb964b47e4a98fd27b6b6b628a3273c764874df7a0f6d7b1c77ae924dde0e3affe430000000000369ad3f2fb65d8fc0005e6990001fc0006575400ca9f4452a8988619c535d28f0b25aaf2c34b5d13ca9f4452a8988619c535d28f0b25aaf2c34b5d1373c764874df7a0f6d7b1c77ae924dde0e3affe43308f72e69ac2373a62f14b7b1d99fb24eafdc87b74247af42a591aef0989c9a3e152197736dbc266b2535c4b4b53d8ec4a00000000e780a06795b6c316aa84451acf07e0f11f9565e256a59057717fbcf0008ac254000020e780a06795b6c316aa84451acf07e0f11f9565e256a59057717fbcf0008ac25420e06631f4da3659b5efefa7eda26e82d9f30427da7c63c0943aa4e6a5a03079c900d1f5e6e6661ec2fbbd62e961da89d2d9fcf11099000000000022dc5846fb4e1ffc0006567a01fc0006c42101fc000bd4a3007d1c61a5a5d33cf6b75aad99d80d90e6f6585dfb7d1c61a5a5d33cf6b75aad99d80d90e6f6585dfb1ec5c66e9789c655ae068d35088b4073345fe0b03007f707431f05ae863a756854d6a8e6c5c37d071f5dc9e3debd2057c36106eaf8102b3313d1b369f3dfddefbc1394639400000000e9126eafb8f62f5a4e8b4d4f2419f4377a8dd14635fc749f9ca2636ffa93815e000020e9126eafb8f62f5a4e8b4d4f2419f4377a8dd14635fc749f9ca2636ffa93815e20cea979a463cdaf780c42b7a196049c04fb8466bf35b0618814e0759fb702c3cd01e0ce79910a4636b0e6a1d9695cee5aada92ee76e00000000003695cfc1fb4e1ffb699601fb868d01fc0001194c00b2ea896299dd86bc7c3353a40d354be43ca26372b2ea896299dd86bc7c3353a40d354be43ca263727eb0a0af302dd9ff95daf9e98d2f1f2c5d764f74308ad9500ef26ae510e0dd8cf0568b2a89d1234697873db2fcdd11674a73caba91cd416f9ac701f4f7807d8db102bc4a3900000000e995e4b4ba9fb3fc8cbc7c779b8b933367c54166175c3cf507aa92d0667ba7b3000020e995e4b4ba9fb3fc8cbc7c779b8b933367c54166175c3cf507aa92d0667ba7b320a5fa769a80bb95a3901423e38b27a4708f7ea2719b1e4bd01aa4a5b8ec9eadb300d33fa6c54b097be5bdc537d894e2d2f144f9847b0000000000ae22e96ffb4e1ffc000cf03e01fc000cf17501fc000cf6e30007f79cc14feaf70775dfd89cdaabc42f9d5a3416ce7f101b7f075273c892063b1b8571311737a5767f95c0f808aff27883260bfaf9cfe2b84519a6b2300620124f5dbe95b93bbcbab48452ba0cc47beaaf554e63db5deef90c10ca79c1e83c08a43d4316105419bccf6595802300000000eaaf0220c44e4e049b5899f162e7adf2da1e7946a2272489f304fe3df5247349000020eaaf0220c44e4e049b5899f162e7adf2da1e7946a2272489f304fe3df52473492050f57d34e7aceac2e5ac132c091ae69842d484ab382d59ac5459a9c8c3efdd4b01fac33d28f64870ce06e55c632d3ce829c9aa8e4e00000000009fcb2263fb4e1ffb641e0001fb64420016c792ef93229ad52721ad5b08249eac743fb74f16c792ef93229ad52721ad5b08249eac743fb74ffac33d28f64870ce06e55c632d3ce829c9aa8e4e300452f32ac367f352d6ef53f984667db9ad658bf940292eae2440024e5af9445f7a7a618d536c4743c9de4c3e07b6a5f900000000ead18f6dabac93c3fa0df238e992fabbecfd75b28dfbbcbcd0ac4bd4dc89a255000020ead18f6dabac93c3fa0df238e992fabbecfd75b28dfbbcbcd0ac4bd4dc89a25520ae5c3b488065fb736209d417e87458b953d6ac9b7bee596447ac119f68f3a287008ff714a271165a679a084036555ef7ea685a458a000000000022d743e0fb4e1ffc0006567a01fc00068cf701fc000bd99b00c9adf3d64cbd87212f093e52caace7296c89fe68c9adf3d64cbd87212f093e52caace7296c89fe681ec5c66e9789c655ae068d35088b4073345fe0b030023bdd31086c9f2de87f380a0c24fd3e7d699a2a43f87bc8d5a395c0eb3f8e19d82af15542302c129c981f352a3e890900000000ec6e4e052c3b28d77c13ccc5072b5f5c185e1a53a6ffaedbb1de9739c0d31489000020ec6e4e052c3b28d77c13ccc5072b5f5c185e1a53a6ffaedbb1de9739c0d31489206fe7864bc5e0241a306eb3adac70d56ba305b520ed44b6917981be5862ac7c76011172bfbafd8ddfbb947170ff69ebc2bc1a7c16680000000000c380664bfb4e1ffc0004bc490001fc0004be7b00cebc041331aa21d5fdce3e44b4a2a520889d4ba4cebc041331aa21d5fdce3e44b4a2a520889d4ba4382477245731a85b4a1b2ca6af9e904517d07e97301926b68942b544b4e17347c5e0d28ba91453984294c7679965f3a1d3cdcd9f5bf80f2c28a48b503f301bada54479896800000000ed1caa0e3a8c97dffb71fd26d6aa03a4d52347d8da71709220b0b4357e2a7236000020ed1caa0e3a8c97dffb71fd26d6aa03a4d52347d8da71709220b0b4357e2a7236207027e327b827fa7edc0fbd17b85900f2787d210c76a3ea06182088249d157679008e7e021f47d1e9425609af4dd695253fd8a9a0760000000000235a0070fb4e1ffc000bb3b40001fc000bce430039e05a296f11c657770a6161ea00a72b625d1de439e05a296f11c657770a6161ea00a72b625d1de41ec5c66e9789c655ae068d35088b4073345fe0b0300583a5fb61d625bb0640bbd1dbec505e8747dee734bd9dcda0c62fffeb13e24bc8cf3475e1535f8f8700fc48f177569100000000ed8575335b7e0b420b09b4b8c530711b98aa472504d91bbca9745873a106cb0c000020ed8575335b7e0b420b09b4b8c530711b98aa472504d91bbca9745873a106cb0c2092ebd7ca076b40f4012ca7e115e04bc2b1baab1be5289f8c975d580d64848769019aa6ac346d95f15724c602b262b8178333646dcd00000000008b3b51aafb4e1ffc0001aaae0001fc0001aae4009f9695e95af100e56314bd08680812a0f6256e119f9695e95af100e56314bd08680812a0f6256e119aa6ac346d95f15724c602b262b8178333646dcd308dd3b8d006c8ea260bc6158daf0680c5cc7cf4936458024b51ea2036a800ec6563d75135004055d94743b8341b70135800000000edc1fe5456b869747a4f41f92ab8bb8b10c1f43bbbd97957a16698783baa0d2a000020edc1fe5456b869747a4f41f92ab8bb8b10c1f43bbbd97957a16698783baa0d2a20a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e335e9d6b2065deb3d586152f44f0578cb0d51a5e74000000000022dc9b03fb4e1ffc000ccadd0000000e42f45a86824089891f17af573e84512f00d8850e42f45a86824089891f17af573e84512f00d88564f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73006e81b2ac08c3ba6308868ced5075f366013ee8598961bc84150d8dfe9085fdceafc082fd18d3a7bb1338b74584048fc00000000edfb29497dd86e1bcbe72cce1cca1adbc1d9a991d3384c0a1a83d35808cbf5a4000020edfb29497dd86e1bcbe72cce1cca1adbc1d9a991d3384c0a1a83d35808cbf5a4206deb6528ee95044163f5e417053b8b43f32ebf26fad8d9e47e1222d611f7cd1c00ff84a8ead83fb486d9321ea63b356b287c2c569600000000000b7a212dfb4e1ffc000607a70001fc000608330035d72ae28122e666401fbc5f914da502815aedd335d72ae28122e666401fbc5f914da502815aedd3ff84a8ead83fb486d9321ea63b356b287c2c5696308d052595c653122cccb964230a5404399634e7cc6b3fa9314b54678c28d2f9c4854baa7be02845937bb0de35e43cfbd400000000ee12a4658170bf28f8ae6eacbc48fbe62d009582bafe6714f630484b14474944000020ee12a4658170bf28f8ae6eacbc48fbe62d009582bafe6714f630484b14474944206d945b3976197533a8283ecf24a1f1b86c51eaaaa28b4556e6fac59a0d21875f0108bd9dfcf61ed79b051ac428f69328463aab0001000000000034ce62c4fb4e1ffc000a4a8e0001fc000a4a9b0025a3f54d7d674aa11d94a1a7d4f40d618f8aff3a9a870b5d4ccfe0068e92a6cb4cd35915ef94df9c3a840c9fab8a7618147fb2f3060fd847cf86f08f30121a1cade221b1eadcc0c7a02a03508551dfb97b959ae1511d4cae47b503b39ba0fb37b984e4010164378513edfaf07200000000ee733db5519c987496eb3b871d5fa543ddb19db3e848f2fbb0af01585fc76af5000120ee733db5519c987496eb3b871d5fa543ddb19db3e848f2fbb0af01585fc76af520f56ac75f5801afb0fbf248e8b39db1dd43a55f1d873beb9674989c51b53d73ee0191be18196047ed60fca300e6fdca0b7bea81beac00000000000238d45dfb4e1ffc000de7c001fc000de9f801fc000f13a3000bf9547a7b4d12def0019da71e989821a60d9c915b44dc4b3f0ed26a8243afa46bada49c18da6b2a21eca01872dbfce4bf20886a004f6caaa69c1ff730b695a4757d60c472f67a7807def81ab7a52dec3bc64aa1c4188d02a4768ac3a862b404f0656ed395f1eb6470dca7bca400018355913e3791438c18b5ac50fe03784df789424101fb8f3001fb05a3eeb8cb773673c77f664501bc68b813206e9cd0920a11cb74cc918897804bee24000020eeb8cb773673c77f664501bc68b813206e9cd0920a11cb74cc918897804bee2420ded1303c7551bf04f34b3b61a00d142d46f2329ed8137295b51c89f613f5b62f01df33af9d739271f406b1c31d11a2f570c524e9dd0000000000030d2293fb2711fc0003abff0001fc0003b6940087de47ade017f67b717616f8bd4f5fc3005dbe8587de47ade017f67b717616f8bd4f5fc3005dbe8567918cbbd6928be3a8e76c1a8d89717c2e3d08ce3004cab5bc1d73f5f8299feeecc0bee2d76f27c3b2a56a7e2fc1f927e495ac9b2a0560b7d82fd06fa8fce4af69d0fcb10b00000000efb3f539ad844bf34f9529602480e504885915b42b10102b9be38c4db31eb1b1000020efb3f539ad844bf34f9529602480e504885915b42b10102b9be38c4db31eb1b1200ce06bc2b322337c43a1d3befe252ff366f81600bee06a14c07ac462e17498e00020eba3616392708db9c3a971924380b6080bd17e000000000022db5eb2fb4e1ffc0006568001fc000b9be201fc000bd4aa0086cd7c93e15658bbce6b175c320e67aad70c8cc686cd7c93e15658bbce6b175c320e67aad70c8cc61ec5c66e9789c655ae068d35088b4073345fe0b0300abc2b9eab7faedd46b321ef733583d1edf73112492b5a84f8d61bb83801f1269878d663ba0f037752792ff5226b02b700000000efd6717fe659d2b949955f2c01985d4ff36848c96e425c6bea4780e2ab0ff2d9000020efd6717fe659d2b949955f2c01985d4ff36848c96e425c6bea4780e2ab0ff2d920c8c64c21433a191413a465619ed9255bec0027a8f938e34af2846a3ef764d87101719ad3711be4ac4c4d3e916a78bf59fa8b486d1e000000000022e0950afb4e1ffc000bdcae0001fc000bdccc00e88bf8b114ce7d91ae8968eaba14be60d05491579d39d1cb8cd5844cb453cdb1a62b73e0ea6cde7b43e505b33b6e189d0f3c9f598a1e551fcd953cd6301560ff0ddb3c1e8bad9f2e237b3ad39c37ba804fc09d4ccd928362ee874308b29e827ea60c21b3c04787d771a16e732100000000f0e0387783674bd818ebae2fb6b5c20659cfcd5c68a2f8a1f03b03ae3004724c000020f0e0387783674bd818ebae2fb6b5c20659cfcd5c68a2f8a1f03b03ae3004724c2049106aa9cb4165261f6af3c21680cc16effd3449f9f73ac5e765c2e2380587ee01e02dac43c4d57aa2a821a9b0b25068f5f5edfa3200000000002be54d2efb4e1ffc0009c59901fc000c0e8a01fc000c13aa00e53909416dd7f61cdabae76c20347cabeec8a21ca6986dc7a8d22b1ec6edc799608163d63eb92ff6e02dac43c4d57aa2a821a9b0b25068f5f5edfa323088aef910c408df03f396e0f92411de096d08d4ea727fb3abf45541685d0327ee1e8d5b5a5057c92fa2360d9c0abbd11f00000000f129a2035414a54881224bb0926390bef90b8bfcc63fd2757ae95f07fc9cb381000020f129a2035414a54881224bb0926390bef90b8bfcc63fd2757ae95f07fc9cb381202d618978b20c66d63c97dbcc2f064fccbc03d2403baae27322c43315b1543391017f5372f19a541e9afb85c443c3645ad95a37f15d0000000000a747dfd4fb4e1ffc00023d3b0001fc000242030026cfdbcfd54646d88cd9fe62da04f5e70eba5ce6e21d3baa7509a95b0a9d741549047c2e90ed8aa785512acdbe7b71cba4d29a25df44193d6e950c063084657bff1dbf81b2aa50e385d01549f9c3683994ab0b16d5b7e3ede8efe95992bb621ec221c5003d2f9f26fa190ffb2a00000000f14c9af014af86568a4ae2582c3ffcf6602920ee4155b8a08b1054cbf31536c1000020f14c9af014af86568a4ae2582c3ffcf6602920ee4155b8a08b1054cbf31536c120a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e6df28cf902610e816bd509758353005ba3ee418fa0000000000023593580fb4e1ffc000ccadd0000001cffef89d1917166a4e3d2443411f6cd1032bf291cffef89d1917166a4e3d2443411f6cd1032bf2964f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7300ea46d70601eb45319ab495e2462f981debc8316df2bb1a679ae3525c7f517e535b69a02052844374c887a9312a4798400000000f2382c75e2009f5ce32df63933aa700a05239dde4f2df94a40ba2234b8e777f2000020f2382c75e2009f5ce32df63933aa700a05239dde4f2df94a40ba2234b8e777f2200c69789a95af40ef45beaa00faff26487428af61cefe1f64b4099f4a90583bbc015d58fd558edd7f6e2ed85b5fa134648f477d32f30000000000342ad593fb4e1ffb783b01fb868c01fc0001196300c3bd25702c4c5cabd642d5498f118ec73134c534c3bd25702c4c5cabd642d5498f118ec73134c5347eb0a0af302dd9ff95daf9e98d2f1f2c5d764f743016d49c42cf506d5687c4035fc8ea37c2bc293761412b8c28a73f674df9d3983581f53a8eeb7f1c7b6382bb0485df381400000000f2b2cda32fe9ab9a29ad463e878bc4061e3fd74bd30508c53a214333f8b58839000020f2b2cda32fe9ab9a29ad463e878bc4061e3fd74bd30508c53a214333f8b58839203988b5f83343213ac50805d34bd73f1e06c48b873e46ad299aabe92fa3cdb2f201e0e440d4c365236c93f5fbe402336cba2c5a506242c800000022d1d386fb4e1ffbed4e0001fbf1ea003e58db4338161895653ffe307a9fd3567d7b3c3bba7c694196934a70e11ed92a56db5766131968cc365b70e557479d57b35b99598327dfbd0bf9291330195b44e1d553d160abfcf70b8ccfaf24480ad34fa7917fb87675f712f0795a23dd0107f5f3e39c07474697e95b15170d00000000f311a4630250c2c2fe0f6121d7214b1e962d2e7385e78cdc3ff694c9cfc0cbe8000020f311a4630250c2c2fe0f6121d7214b1e962d2e7385e78cdc3ff694c9cfc0cbe82090d0e59ebc9e022b3074f6eb4a31650a7d41f7e2d4a97a1956577ab903a5afe801794b99b1cd0a4f69ee1072b041560edd584e1d1a41a00000006a334e46fb4e1efc0003a9ef0001fc0003aaf4006171861fc24ad0c91cf01b5950b00dfd2b0e65e757f73d89afcfbd3c34ff42e19f32af77dfd7a8990fdbf7aed02a6e0d546fa6c8abb8d7e1f65743d03001841a16adc73f0224e6544d0cc57057ee2508c906706307ef8561908bd476594ff1e825798faac54c8f8a66583a3dba00000000f39722e1e9d02ddb49512b16674868a865bae2a912401bb6b006b09a74186beb000020f39722e1e9d02ddb49512b16674868a865bae2a912401bb6b006b09a74186beb2047d6aaf3ee8ba77263837e9720492e7b57d59345881f5443442861f43fbd0f68017583afdc80db725044af4e20f5a892f4a60770fb0000000000030d2293fb2717fc0003ab450001fc0003b66300bc97efd5f5716cff0af50478f0d383052635c7ebbc97efd5f5716cff0af50478f0d383052635c7eb0740696a1602a31eda2d6bbd49303ad3c665a3c63096395d8ca159e5ca66eae7685beb6766a6c0ae50b4569809c4ecca3e101a1f210bc35637473b5afd5e71bfbbc976277d00000000f3eeb1461780dc6c62c5793df607e23f55153945b17ee029b3404dce7450ca84000020f3eeb1461780dc6c62c5793df607e23f55153945b17ee029b3404dce7450ca8420a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e6aee197c209560b451adf796ae802f30ef1375183a000000000022ddc467fb4e1ffc000ccadd0001fc0010dcca003ecf5e66d9c0373f20f86d3fefdce2165c19c7be3ecf5e66d9c0373f20f86d3fefdce2165c19c7be64f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73090051db915bd86bd938746c14440b11ee3b2801cbc6d6c1c912e8b41ea5eb1d8f852abf220ae91ecdb6da094846c1ba800000000f5e25c2dc6aedeff586b26a5fef15bfeb332963bd32fa02d1e8e1b0b74784c7e000020f5e25c2dc6aedeff586b26a5fef15bfeb332963bd32fa02d1e8e1b0b74784c7e207d6e5caedcfca225cb8da762d52bcd3d73b2b3ce2c7f8fa3f900bf0b6c75460b01c106d71f6a7402065c35fda833c7148623179b56000000000022cb31a3fb4e1ffc000a4aaf0001fc000a4afb0015b1012a3f35f6b6873a144ed87b5711f467030601878fc5b0bde020f35fd7dab0709c0faacba8fe3a840c9fab8a7618147fb2f3060fd847cf86f08f3099cec23c58cf89081e39d8862912ecd50a18b44dbe92af0378ef2a3bbbdf4a6a11a76af5b70db205cfd31323391ee64000000000f5ff9fbf1daf5db3539c7e307d9d50b12bb58a491b2f684c123256fd8193aa22000020f5ff9fbf1daf5db3539c7e307d9d50b12bb58a491b2f684c123256fd8193aa2220693022de7fb65f12cc990c6c3db7b02488cfa0d222ad3ce8ce8970dcd945666e01feac00c4a5ee38b2a8e6857126d5b39c05062c1e00000000010000000000000000000000000000000000fc0001923901fc0001ba5b01fc00021efd00d3f5c934320be62f66647087ee07d9e3b68996165bd941a8832f305921d4f2bdf7946d8ac1b6b379bcfd75be0403b27a8121583a01d004c114f919753000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f60f6c91316fb671bc4887c714f9ff99a836645e69d0a411fd85468602489133000020f60f6c91316fb671bc4887c714f9ff99a836645e69d0a411fd85468602489133200f90ec21220fcd572f8a7361d9b45930be3067834acbb21df32da4f8070d03c701989c8077698d0a9dd2f90be13019eae3a8d13e0600000000002cea7d97fb4e1ffc000b18330001fc000b1a2b00e3ea58a452a6c8d408df64a2f8511642921268034e28cb55a991fc1d6062edd80b6597f7e72d2a922567856cdf62ed7325c44bd7b7557e1acb330a633006af52990c96c3d5aa6d8d29ffc118f43a74c12f3dc860825818e70bbdc9548a6b62d680af91772ba9231378cb6d292500000000f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba7863990381000120f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba786399038120593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c050d1611e03249023d89c1ac086036cbea392768cc0000000000340dfab6fb4e1ffc000cf99e0000006cc3fca46aae1c44ea1bab81d506e9f0a3ae1d056cc3fca46aae1c44ea1bab81d506e9f0a3ae1d05c69a0bda7daaae481be8def95e5f347a1d00a4b4308f2df81ba65db70eaab625c5fe46f0f5e52a45b25c761686db23b4f18e547cb0d161912dd187302eb6f7c4a9a666a3230001fe2d4798df3e9b41a6823bc0b3f020478e87925d01fb8f3001fb05a3f69c63feb0590c9febd1f76164c44123538f67e4c9fd6f8d6393908f80c01d87000020f69c63feb0590c9febd1f76164c44123538f67e4c9fd6f8d6393908f80c01d87204dea6406996a98efea88a66bddbe7f9568093185b08c865b1b664ae0e594c7be07b165b659c3d7c15bba69e00c837d2a599526c6ec00000000003270c21afb4e1ffc000cf8b10001fc000d0b2300f0d1ca8f807aedfa439ff530b2653ae37bb94e6af0d1ca8f807aedfa439ff530b2653ae37bb94e6ac69a0bda7daaae481be8def95e5f347a1d00a4b43016cfe921690a750621948774a88522d4af9e4167a605797abdc8adb414aa254c2e16c43b95e491c1965eb90c528224a600000000f6f8f1b3377129a483e7c027f8ea7df7d2378de902f0788b132ba87c19c29f2f000020f6f8f1b3377129a483e7c027f8ea7df7d2378de902f0788b132ba87c19c29f2f20970ad5ad9687bcd4e164c49064780b2b2a038c942a81f7f939543dc0447996110031331182f4105cd8a4690b82482ec4c09197f5e9000000000022d91cf8fb4e1ffc0006567a01fc00091ca701fc000bdc0b005964edbb7dea08cb0987faa03a37a2295c19f4105964edbb7dea08cb0987faa03a37a2295c19f4101ec5c66e9789c655ae068d35088b4073345fe0b030167d2ac620df46eb74cb2069f69c30965f6c899a134366ab95e41c894293e0d987a3cb78176fe852a309faf101883bb100000000f718902044925ab8ba5089667a4c2a1e45b855eb4388d21c1b14e1d05bc1991f000020f718902044925ab8ba5089667a4c2a1e45b855eb4388d21c1b14e1d05bc1991f20c3aedb72e0902bd6da0a97cf554bdbe6aa6183fb075b4aa3a13fafd81f430e200150046adb767e71c9cd404518f190faa10ca9b9b800000000002e65348afb4e1ffbe5be0001fc00011beb00a7327f6d42206d3642c4633c4b6b10919202cc8ba7327f6d42206d3642c4633c4b6b10919202cc8b6d4c795644ca86f717628ea27f0af13b0ea70eb7300d2be4cbd0faf7a27695a4f11690ba772a32c9df368f0558998681d697e60888b7127314dfa8495096050638d8507c9200000000f735ca801b3ed2a87a0fe2838a38a56d72239fd0c4e3877e80cc280090c6f8e2000020f735ca801b3ed2a87a0fe2838a38a56d72239fd0c4e3877e80cc280090c6f8e220362c9cd667b23f106f2fe366206f8e1d7353c5185de1426e64fabbc2ebe2856d00a1dbf97a74f90b10f8ebb6d919f21cc2cf9e2a13412000000022da8162fb4e1ffc0001980801fc0001c2de01fc0002787b0065802f3ece78b624b0739a8002fe35327ab85b7065802f3ece78b624b0739a8002fe35327ab85b703864c3d41a45675756b2543a0bd787a1a18fb4d9308cf9b3235f77637f144728584ca13d1d3fd47450ad392a510beb2425e0d88f6a3354f0cbdd26d4e6152d38899c025aa3018b3277a4f4a3667225def8a4f83000c086719cd9000000f773def21e01af33f508b4e978631b99405fd1ad3947984d3bbca5b41b221175000020f773def21e01af33f508b4e978631b99405fd1ad3947984d3bbca5b41b2211752071e06128c6220c4671d4582596eaa9528757fc86bfd42a7e6545314a2271c2c501cfdae7bd25128cbaf6e27f37b9bd0e1024d4d3fd000000000023b9cadbfb4e1ffbe35e01fc00015cf101fc000467dc008a108538dca5b073f24fb8db78f06ab6a0aec27e8a108538dca5b073f24fb8db78f06ab6a0aec27e23baa2294dc2c2f7b6e6fa3717074afef3ef2d783004f1a3407bf953809815243d539d316d2b055a57ff6c5412f31d98f0d5ea84f54511fa9f02ddd6d7f8751505c560eaec00000000f7f3a36e13bd406d5b9c9a19b6c67c5051f7a29e6596c1413326b98c00cad909000020f7f3a36e13bd406d5b9c9a19b6c67c5051f7a29e6596c1413326b98c00cad9092009d9ca008cb9263341c196659ea2f751507cc6b6199a9c5b6d40bd136ea3f3f7001d328264ad882a524f8fdec5cadc094fec10834b00000000010000000000000000000000000000000000fc0001979e01fc000197a101fc0001a33d00954c2b52b2f86d89f81b8eb64b0944a1b1033e38954c2b52b2f86d89f81b8eb64b0944a1b1033e385f9227e2d862ef10a8aed1df196e5267accf22023000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8293d83dfb38fa7a6c34928e9171fe6a112d5a5b1d07592d59f37a23ed0a00c000020f8293d83dfb38fa7a6c34928e9171fe6a112d5a5b1d07592d59f37a23ed0a00c20e0699697fd9e5d90cf616f1f65e6172be9660e8741e431a48b5b280ec9c54aa001a01a6124dd32d31434325f8b39e3133ca643b8c3000000000034348bbafb4e21fc00014c6b0001fc00014cc400894737fba2d8ab6dd337538735ae0a74b18cd19a8e4960713412ea367f0a11c39808c2e77b83048b69a9e3015032f43608f55847cfac26a1926ace9b30803d3e3a2593dfd56111203f3f7c562d1df639d57376d1994aff17260cfbfa576bfed870eedf234bec169e2f8e6c44da00000000f82d3b1184dc6c6f444bea666c1b0da5e0d58a4a29b036e6c21d9e26ec349b44000020f82d3b1184dc6c6f444bea666c1b0da5e0d58a4a29b036e6c21d9e26ec349b442048ba30ad4c27e9c0e3b495b609c15987832ab0f4f22d138dbde025c25e500dcf00d5918187a24fbec74eba87813da01d4977383bf90000000000037ffd56fb4e1bfc000d63490001fc000d640300336fd9a1efbd7983dfc291e482862541dd50af197d354fb6b06f9f41e73aef311024f576db99e6c365af4ce6e6ba9ae427611b7164d92adeddc6c7dd308458274be8fddb6b8685d753bb151ebe32a9021fab91228611a81c3c70b287b607a81388b46aabb16518494f9127776600000000f8ef5516cb8f36418e42dc9e078b26b0c4b1b9ad810019974686fb9a6dc88206000020f8ef5516cb8f36418e42dc9e078b26b0c4b1b9ad810019974686fb9a6dc8820620a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e12220b8c3cf751fb6bcf3b11f12e6406cee717c1ad0000000000235a9dcefb4e1ffc000ccadd000000baee5acad0f663430ff83c4e9b9fcb0122789520baee5acad0f663430ff83c4e9b9fcb012278952064f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730015ae7a4f88fd79e4659c4b24b32f24d1e92106b867a2c23d1d084cfedd0e2766edd3f0a77f274acd4d1d53fb1ff021800000000f94177aabacd11c12c92b1d5ec28b8ee9f1c07b220ab783cbf8a1a21cf6a5f55000020f94177aabacd11c12c92b1d5ec28b8ee9f1c07b220ab783cbf8a1a21cf6a5f55202048b7ea90f351d942342361942f53cc52eac2b6d2df7aa5cde9ca4f832e699401ad1d4e86ad3a26c56694ad85fc4e14bb01a0244700000000009de6f7dbfb4e1ffbc8190001fc0001195600365a7fa9a52936ee5272729a4011c8a00c0351d3365a7fa9a52936ee5272729a4011c8a00c0351d3ad1d4e86ad3a26c56694ad85fc4e14bb01a02447309993c900fc49b020d4050981a45281cc71274196c57c9405f7ea8d82823b2cb36c04a2aa363111d74e383bdf9fdfe25400000000f9b4e4b1c35b8890d0ef29ee2c8ba7e600ba9acee68b100d24f4c30f190f07b6000020f9b4e4b1c35b8890d0ef29ee2c8ba7e600ba9acee68b100d24f4c30f190f07b620a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e52b046b8be830ef6606eb16136766fb8f5a378f4ce000000000022dcab9cfb4e1ffc000ccadd000000e148cd41cb7a2aa954707c3a5846ea7927d7c835e148cd41cb7a2aa954707c3a5846ea7927d7c83564f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d7308d4afa904198af1607c56fd3a1e8fa546dd2940e603c87fd64905a5eb86334046a7eb8638e36a2dbdb6ca59fa8e6886400000000fa6350305c1ce0de594787f20ff7ddd0c35a4cbdf10c8a9956d833ab6fdcd225000020fa6350305c1ce0de594787f20ff7ddd0c35a4cbdf10c8a9956d833ab6fdcd22520a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e030254e4408d72c5c1ccad797bc8c1bfd869d91c24000000000023a44db1fb4e1ffc000ccadd0001fc0010e71300ea33f7129398e7e2436a712ab55fa95a2c0e4cc6ea33f7129398e7e2436a712ab55fa95a2c0e4cc664f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73000ea87eef15f38c1a844d77348e687794c601277011c933026cdfdb649524632b055feea3539abc48472cb447d281d6500000000fb1f0a8cd13a1ed6e11d83d906cf3cd42114e36a762e214e04f6f0bfa698dbc2000020fb1f0a8cd13a1ed6e11d83d906cf3cd42114e36a762e214e04f6f0bfa698dbc220a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e1d32db872659af4d0bd7c6f8f7e40f40564c4fcea1000000000022d3c081fb4e1ffc000ccadd000000083a4e9632bcb5c6490a92b3c3b05979bcc866f5083a4e9632bcb5c6490a92b3c3b05979bcc866f564f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73002ce863d0843ca66b4a64d94c0d84ec15980ea04e4444ac4d4188f38cc0da4d6d2360b8a2046725b682862255af6a48c00000000fbdcb8ebb8b7b0536b8af0bd89b5f973fedb880b51d03434767eaf9ea7443bb6000020fbdcb8ebb8b7b0536b8af0bd89b5f973fedb880b51d03434767eaf9ea7443bb620a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e4a999c0b640e64f1d95e90b4e6b75651cd9581d92c000000000036cae7c3fb4e1ffc000ccadd000000982169553d0e618637a1cc6847b185baa50a2ae4982169553d0e618637a1cc6847b185baa50a2ae464f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d73017f2a4f37de1f78a0d356835de99c7639d8daf824b0d432b2a7c01a921f6a8cd4028272e2962f7d04abf9bfd5a77ab8e00000000fc07e381f05476042949b584f41fabd582e6a54d70657b8ff39fce58af62eb53000020fc07e381f05476042949b584f41fabd582e6a54d70657b8ff39fce58af62eb5320a8e7d1287b0354408fda5a65427a636c7c5854a957b94c5f993d727450ffe34e2a473290be126b36c0ebbc0ea853721bc67ea994a80000000000235b9622fb4e1ffc000ccadd0001fc0011030a0087e9edf19d1998903bf17a10a954872f429ced8287e9edf19d1998903bf17a10a954872f429ced8264f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d730090f1ca955443740346b5b4b0bfb8251f040074b5a2feb77e54add831bf34aaf1d84207691f6f5aa5e702152a496fadc00000000fc196382366234f4645215261ca7e62f53499345ec1def69289e47c0c388dc6d000120fc196382366234f4645215261ca7e62f53499345ec1def69289e47c0c388dc6d20151b4f6fbc7351efba1dd1c36c733978a184561af7497b25b4a8a3e0afec0e7f016608134feb91cb878b26b977f1d7983a2f14452a4248000000258b0cf7fb4e1ffc000df5420001fc000df56b00c346a8ffbdcc80462cb69a6f524388a5f496fc6ec9a9263ee8c8c606c449959c48978ba70d4a097bfc86e599d56c282377dd9510ee62c55fefa553b1308d0651a04f9c243872f613901a1eeb2fa86f3e9a65168bc39941790783d9189a9a7876cedb0c6d7ff7d49fbc88a7191100011348d8f97063cf6ff602c14bf59b5ff501c8bbf401fb8f3001fb05a3fcc330b0afdf27d07997b93277a3942e28f7cf4fd043b7ee64b6b5c16173c936000020fcc330b0afdf27d07997b93277a3942e28f7cf4fd043b7ee64b6b5c16173c9362036c97361c1b5b664eeb743d04fcff7282e94a37732b99779d027dfafb030c3fc003d2324a9cadcb2ea6579a7348ab70aa933472bfa41000000000381198efb4e1ffc000541190001fc000541d400e73be15c24f67457c2337a8c99ca1e58aa68598d7200be0fcbcb2c10e968ea0b5508bc3424c9c68bda952b3b45775c0af85fbe2e2ab21549d86beb0a3089aaf743d70a26ecd18aae71d8e2ff0bfc98a51511f83c8acda856e3f5d7c61c21ff4e19a56f02ecfb6ee014097945e300000000fcdeb237fae2e669a85a86e8077e608c6939ef0f4f9e49a44e5ed6795572e6a8000020fcdeb237fae2e669a85a86e8077e608c6939ef0f4f9e49a44e5ed6795572e6a820d3a8d64ff151b1ba13683b26008256b24aacec6f9da5c0066ca64c10a73517ce012c3e80b009a279f6b8cd5db9fb3206f14676366000000000002356861dfb4e1ffc000b9bb301fc000ba63001fc000bd21b0047618a2082ca728a4d9397643a7578a735a44d1b47618a2082ca728a4d9397643a7578a735a44d1b1ec5c66e9789c655ae068d35088b4073345fe0b0308341875737a85768a19cfe8c6c220b594bb18131adfd2fb44e386f7b31253aeeb48140170e29db98507489c7b1f792de00000000fd21cf50c8f2f7e475b7092a5f136129b12d30e9ec98b03614ea0788fae2f888000020fd21cf50c8f2f7e475b7092a5f136129b12d30e9ec98b03614ea0788fae2f88820a8e027adb039814f1d9a37963c233d9d768e2fbe810c79c0818a5fe103a2505c00582f33bc9bb2587d4d87dfbb37d44b1d1c201fe7000000000022dfe2e0fb4e1ffc0006567a01fc00068cf701fc000bd9830055f851335398fd598265dcc41dcbefbc307b609955f851335398fd598265dcc41dcbefbc307b60991ec5c66e9789c655ae068d35088b4073345fe0b030046fe8b4fa7dd4fb52ac2a77b4ef7dcd3f4ee6c940789144504c95390d556eab1ed97db4d9de695796fc0bdbf0543cf700000000fdb15344c0b81fa9204adadf4fbb285a8e57c6079071c1e6134ef1a28ff23630000020fdb15344c0b81fa9204adadf4fbb285a8e57c6079071c1e6134ef1a28ff23630205b016215386c035a42042a93736befccdb87c30cb90adc3b1279da58ac57cc1406928d5d3df4acda874f594b59a88a38052478f10d000000000036b87f1cfb4e1ffc000cf8b101fc000cf98701fc000d0493000453c5b78e603d51a58a56e7a3b6a4bcfa5b1bca0453c5b78e603d51a58a56e7a3b6a4bcfa5b1bcac69a0bda7daaae481be8def95e5f347a1d00a4b4308a1a6b956acbb6cc1c4fc3713ae482d84ac9d3e00ec86ffe25a56a717b748564128c97f38e99bfe7292fd4737ce5299c00000000fef106ff6420f9c6638c9676988a8fc655750caafb506c98cb5ff3d4fea99a41000020fef106ff6420f9c6638c9676988a8fc655750caafb506c98cb5ff3d4fea99a41203933d2e77a9b59df4215597e381942291a23aa6765386dbabb04117c1018988001d5faf54e1d7675b61cd63f569ee38bfaee9501b800000000002d30a810fb4e1ffb3e6401fc000b253301fc000b322c00ce2342a602ce6bd150809591377ecf31971558cace2342a602ce6bd150809591377ecf31971558ca05ea03a6c9dfa67e1837b3c14965ba3cb53bce7230842476e8d82327adfb9b617a7ac3f62868946c0c4b6b0e365747cfb8825b8b79ba0eb1fa62e8583ae7102f59bf70c7c700000000ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac9000120ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac920593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c0c456ce31778e3778c88a87ac36a1a8bd4aa5bdbe9000000000036bb0ee8fb4e1ffc000cf99e000000b14f661da8227a41acef9f8096df2afd2a192aafb14f661da8227a41acef9f8096df2afd2a192aafc69a0bda7daaae481be8def95e5f347a1d00a4b430967796952922dcc5208a3848ab85a787e4592df2d8ce36a29369b0b3a9576073651075039e1377873aa8c67514ad2726000167e05b1b52c7c896adf20035036fe1d30dcefc9c01fb8f3001fb05a33005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea800012005b687978344fa2433b2aa99d41f643e2d8581a789cdc23084889ceca5244ea820593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c093de7795dfedb896cb65547535ed92f27489d8df3000000000034187ca2fb4e1ffc000cf99e000000ec83a5f23ec17737f590153eb7eed16f7b2f1327ec83a5f23ec17737f590153eb7eed16f7b2f1327c69a0bda7daaae481be8def95e5f347a1d00a4b43080f8efb42f65ed9650078785be5d13e6e90eb9df87a99261d4de34df2b4b79a9c9b8c5e1aec7ac068ebef14636ceac4c00018feb00404d6f765856c95e587b2523a365bc725801fb8f3001fb05a312de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a200012012de3ea6678dadb1db529b7fa98762160625055de2aa34e757c93c136233f4a2206793cf0a4aff111f1d61a13002686c066afbfe5da974cc7dec8cb4cef736dd8000542bd8c9d87e1cdd3db777d29c35e9903b17727a4120000000d4186795fb4e1ffc0010903d0000006e52a40d2dc4dea0ae7ff2b299283de0f2798b0a12deb4ca2b5a05b6eb2ab25bb5fee75d3287b3df0d5bcbeeb459af40f97fcb4a98e9d1ed13e904c8308a3dbdeee728fdec9cea3508c19ece8d2e8330b666e25666b1766ed5f44609dc8674dab4163e8574f4adf2e936a209d501c623e2d926af5eb52dcc2b931993d3e52714511801c1161c96de3dae28cd7f20ff8c2aa7b94b866d7601fb8f3001fb05a3143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f113000120143dcd6a6b7684fde01e88a10e5d65de9a29244c5ecd586d14a342657025f11320593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c13838ddf0c05bbc0edebee7e368f4dc6306d524af2000000000023a417f5fb4e1ffc000cf99e0000007395853c0be5fb0f0348aff8128979368f52b0ee7395853c0be5fb0f0348aff8128979368f52b0eec69a0bda7daaae481be8def95e5f347a1d00a4b430b928fa4e127214ccb2b5de1660b5e371d2f3c9845077bc3900fc6aabe82ddd2e61530be3765cea15752e30fc761ab7300001b5f25f8f70cf8d05c2d2970bdf186c994431d84e01fb8f3001fb05a31ba9b400a99c8ab19e2681db0e868814aa273e8eaa13615979a14c50bbd53f4c0001201ba9b400a99c8ab19e2681db0e868814aa273e8eaa13615979a14c50bbd53f4c204c3fd5bb504ca179596113aa8e3e27aa1488860edb81269eb18a9ca900b4a91b017c706d1b78fadb609fd92ff5929901a706c55877000000000058162c0bfb08aefc000cf9830001fc000cf99b00f74034f58c080be74bec51165c5ffe60ed1a615f96375e263814e1d54fc3297fe893dfb5a9c1a9eb6443411c39e405d2520567d4f6b041c5c550086230b006ed30975f322c830001d1b3c2e2f14a4ef35445431356f1c5b93c2eedd9c7ea24c4429d27d45f2fd701733ffd65540001f2dbd9b0a1f541a7c44d34a58674d0262f5feca501fb592501fb592620107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c00012020107ec50e81880dca18178bb7e53e2d0449c0734106a607253b9af2ffea006c20593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c117663ee06b0b159308edf41150954372a730aa6a50000000000235515b3fb4e1ffc000cf99e00000004d65ec5142719f58e31f4510dda3c810a84364204d65ec5142719f58e31f4510dda3c810a843642c69a0bda7daaae481be8def95e5f347a1d00a4b430b6e979f20241cbb73de7451779e8e059d9cb75a74b72ea6862d7ac703dc2ac07d86cec39b6e8923b55fd54dbc6177c3a000135d9eb76397d05b43b5cd8da7ccfa8408bc89ab301fb8f3001fb05a32e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb0001202e48651a2e9c0cb4f2fb7ab874061aa4af0cd28b59695631e6a35af3950ef6fb20593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c0101e19b30edacc8bd047a72d6b12b79b3f1b2babd0000000000369521a7fb4e1ffc000cf99e00000063f16c50b9cd1dccd8465e1802749bd00dd49a2d63f16c50b9cd1dccd8465e1802749bd00dd49a2dc69a0bda7daaae481be8def95e5f347a1d00a4b430943a88959611417f9e8ce4e664e1d9c6a839daae14f54ae8e78bc5ef6ec1524d116efca49ecd5c57dce31d90015a51ff00011ffbf1d32541dcb8f5555305295704a9ff9adc2401fb8f3001fb05a330110b4643c2d8c7521f27ccc2a6a70579bc859087fb95facbb831b3a3d107c700012030110b4643c2d8c7521f27ccc2a6a70579bc859087fb95facbb831b3a3d107c720fbcd42341652da33e977bab8bbef42d0f053f93e9e2748f3f39881d11e28910c017798d43ef1f85193b1a0e5a7ab7853a39d27f0334060000000a6469a72fb4e1ffc000f01930001fc001046630057656569e143ae0cc0419020708c8ce5f4c776e452bfa12608d37422d52423c3a71f9574ffa8267f535e571f5fb89e31f634da8b91769ea4dd252e19308cf6a03c7a0bd8c38c1fc536a013f93afc8224cbfc79d8b0157c7080117ec9c1c60198c3fb3886ec472aeaf80bd5fffc0001c3f93922e89f4bb3869da0c18d8e30dd91019bb101fb669601fb27103971dab9691efac06e4ce7a5483131373e84726458924fe48b7d541791693be10001203971dab9691efac06e4ce7a5483131373e84726458924fe48b7d541791693be120926c6d0e0ce17a51dadcdc5be4f4cce0175d8d7a147e294580e3080d6a22f96d00e5cae595965e89fa9f94152f57b315ca504ee1b300000000005c3fb0cafb4e1ffc0011098b000000b29a8f14049a111260586f489d72cfea1ed8ee5d492df4065de3d5d44692934635d826255f7a60f80e7e48253baecd886fd539601fd5e95efd61534d30b92d4ef819fe283a307e6bcd500d8cd35e9a7b779dbca59bd3bc77b3bb3611c370258aa6dec13d0781e0b53c911bde08000161c274080f47a95be5372ef8c69bb60ab1d4ca8201fb8f3001fb05a339741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a00012039741ad83dd791e1e738f19edae82d6c0322972e6a455981424da3769b3dbd4a20593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c0826c998cd53845caec6858f3121e5d3a88df6c7a3000000000023a390e6fb4e1ffc000cf99e000000bd9857229d4c0509c753afc85d264fe2e4f344a3bd9857229d4c0509c753afc85d264fe2e4f344a3c69a0bda7daaae481be8def95e5f347a1d00a4b430b6693296894820bdc3c0ae76f357e544847f10a68f0046f53745370dbe861d57e194ddaf7ff7d5e73cc3f240515c448e0001ec7bf3b9bc72eda38c80bb7cf16e294e763e56b401fb8f3001fb05a33979cfb79c4562e819aca69ffae2ea84b9b8f29bd89bdc68be67b88c6f31bf990001203979cfb79c4562e819aca69ffae2ea84b9b8f29bd89bdc68be67b88c6f31bf992067a0592b5510496cb42f2d784cc3b933a0156b10c8b54e440673bb87c57dbb01011353eea2d4fbc06aedc288e493b70de32b3e977f0000000000adc777f2fb4e1ffc000d5e0f0001fc000d5e4b00d8155dce6238737a6af04e068bd92048e68a7f51212e07f7407be541b585ff0a8225fa1afbcc9ac8dc82946c9cee9ab3e8fef5a5d641a57bdf1523c030a73d8c1e640d29e2257042a39bbbac8d867f69ae252e146884816b98ab0d0526ed4992d9cff22ef04878423f66583382000171b5c04007f6af71d99893478feb52df0f5a770101fb592501fb592639b88e537c795f0b093c951539695fd4819a91a542b247ebd3a0ddd6a4c1c43900012039b88e537c795f0b093c951539695fd4819a91a542b247ebd3a0ddd6a4c1c43920bb600d779c7be93a83b9d7878fb38b0b1b7ff1390b231c5da8136b674cde822f01fd9cd0a5165717d4b3a17afddc669f3fd14efbb5000000000082a2e172fb4e1ffc000ddfee0001fc000e0d6b00f5cd552d14676526ef325757eddcfa285b15ac34bf951db34349385992e0303f21fd7240e44e4b0222319c7fcaf88f86259ffd3fa8430e4665f2e1f53090d98ff5c2f2970197ce80ca8cba9431f7dd7cff5d9fc9c4e99c2ed06e598f273d31dad8d8d05655c8b04599495cee2300018e976c7a2f79745d70e41aab1e61cb5f4db4323c01fb682001fb01bb3f43ff3539e5a4fbcc88c7f031a544fe7e62557b5963cb7e43157ef73abfb13d0001203f43ff3539e5a4fbcc88c7f031a544fe7e62557b5963cb7e43157ef73abfb13d20476ad8662b3be5582b98569b76f66d2eecb59a943e9fb28bcbd23a10d53817bb01127e174ed242c758d4db9b7d5b19c1e0743728960000000000b29d5bbcfb4e1ffc000de50401fc000def0c01fc000e366a008ee38b4c9c407b21612862db1ac4e98a6edacb4b62026629f37f587b1dc70ccbc6732225803db4e3ecc3795b4c3e8c5b840dbfa092df1395237f2f8a30980213c5fa8031aff096b8a3eddeefd0584a0e5c2492f631ef67941e082763250e2615975db1f1bfae631f80d41d839a000100120432e9d299caad204ff1ec0c515babddc28601fb8f3001fb05a340784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d00012040784f3f9a761c60156f9244a902c0626f8bc8fe003786c70f1fc6be41da467d20593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c02024eb44eadf4a67de93988f1400bfd5fd6fdbf830000000000340ae50bfb4e1ffc000cf99e000000f37ebd7e83f4185ccc5fb617a7ac9e09c11ffc12f37ebd7e83f4185ccc5fb617a7ac9e09c11ffc12c69a0bda7daaae481be8def95e5f347a1d00a4b43082f60dad4b7b498379d1c700da56d4927727eab4387a793b861a96df47bdabe5666c270acf04b5b842ab54045bbf102a00013e8b10646ee9d6c28d75c280b357dd3a9ae9f96201fb8f3001fb05a34bba47ad7330a358cafe2890f1578f874006a68bdc7b786a7c1d440823e683d40001204bba47ad7330a358cafe2890f1578f874006a68bdc7b786a7c1d440823e683d420ca7dbad69767b30fe851c08c80df2cc8398bcc8c33df2d03bcb810485f3d8d31006e6c9189021b6e38326dff6886104054a110990d00000000005fd916b6fb4e1ffc0010871f0001fc0010874300bd8b7dede4dab5e22b84ee0f3dace1c1021add92c9924137fa318dbfca7cabf3a1127fc358acc74d6e6c9189021b6e38326dff6886104054a110990d308ebfddfa72f3140798b6c0d89190164c4dc569ffdd95bd1dd43e7f54f1405c1927b37b499623b4c806ea396bea40a84d0001b98306c317875b12fae8a85c85eb23269168981801fb682301fb01c15b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a230001205b246080ba64350685fe302d3d790f5bb238cb619920d46230c844f079944a2320774441a2d4ff6133747a8bb1b5e4a9a21bb73c4b77cf31e85bda68f898949db0013f978f2c099e310cac9e854b99bc981c8fdcade2000000000023a5327efb4e1ffc000cfb4d000000ebb7d8141ecbdf2abcdc3ebe25420b9425745293ebb7d8141ecbdf2abcdc3ebe25420b9425745293c69a0bda7daaae481be8def95e5f347a1d00a4b430b44cee83a79fa151527e527f3f4f5ba022e73ae8b0d913c4185a45c2a129aef935a585a7a725edcb36ece72a957586880001f460a07a2b0dc932e1d8ff2dee2b984ac415dceb01fb8f3001fb05a35c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef4360001205c6542766615387183715d958a925552472f93335fa1612880423e4bbdaef43620593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c0f62555d44fc8d089674bab5d090a48825bea701b700000000002cef2799fb4e1ffc000cf99e0000007ef7c15840f96c603fcd29409a70f77f878d25d87ef7c15840f96c603fcd29409a70f77f878d25d8c69a0bda7daaae481be8def95e5f347a1d00a4b43086d0a2ca6f434eaa47ff6919ecafa4fc3b012b89c62a04835a24c00faf62c3d30d3f8755c33a7abc595e96fb5b79594a0001972a33056d57359de8acfa4fb8b29dc1c14f76b801fb8f3001fb05a36029fadf3355a31c6f841570e76bcdf5636378c65ff1da8f580806602752694b0001206029fadf3355a31c6f841570e76bcdf5636378c65ff1da8f580806602752694b203e14ea3daa62c03d9ed56e8895b5d98188711c49818cd0add43d37fe512c93d1012a5d83dcce0edae361a62d8bc2a308a87e29a49b000000000059a9ab6afb4e1ffc001079fe01fc00107c0e01fc00108203001119c437dbe2c3aeb4a3c7d1e29380738e3372433e443eba6ce82ca15b203d10117c653f26944256cb505749178fb4f731643d9aa56c54e504f9cc6e30a4adf9fa35bc975e52e3f667e48ff3ed7ce71f8ecb85d5ec728596f7fee735c2f857fae1569c8b4c6839ca849cba42d1000197ed64c04be77ef571fd5624c0f7705192630e3a01fb8f3001fb05a36071df1e3bf80ba6cb9795bb2a82ef426cf559b7711e555af45fd8da7fb629b80001206071df1e3bf80ba6cb9795bb2a82ef426cf559b7711e555af45fd8da7fb629b820387368b816ed3599d758185ae60d943afc22201e94e06ffb3dad30a3ddc6756b0005ccc78c0358f7b71d254b28c7287da9b39b81f400000000002d20db70fb4e1ffc000d05b30001fc000d05cb00434dcdb7115427657cf2936248b62a97b9969795ff1266f2c8aa7b1f93a15b8882013af424d7d9e805ccc78c0358f7b71d254b28c7287da9b39b81f430b4e545a909b1916959139eaea845262b0aadec1c5cf555922bb6e6d1804343e6490428a382a0c01832fc70c50438fea6000152cdd176257544a263ecadb986ed72375589a8a401fb682001fb01bb61d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb00012061d33f478933797be4de88353c7c2d843c21310f6d00f6eff31424a756ee7dfb20593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c15888380d6096d829d6864cf6eec66812266839e0d0000000000340cb05afb4e1ffc000cf99e000000b5b414e1a68e36a25df214ac6eba35782a0437dab5b414e1a68e36a25df214ac6eba35782a0437dac69a0bda7daaae481be8def95e5f347a1d00a4b430a6a63376eb861bda6afa09e28e39ba40cdfb877ee6f9aace10eaccd4caafe8d9243f2f2c0ef982a0766347073cc199bb00017ada3e486409b39c94a0833c8d782f35bc24e96a01fb8f3001fb05a368512af99ba954cba495e96651a8d730880e21437a873fd9309b54ea9e3b53cc00012068512af99ba954cba495e96651a8d730880e21437a873fd9309b54ea9e3b53cc207459dbe6d9b1930f8d6bf4d0872b2ed6af58baa2f0effe608e6e2ab0c98c148501f30f8dc6c5b956089b30b3dc91867a3b72620b2f0000000000b92f8494fb4e1ffc000faa6501fc000fcdc401fc000fcdec0044b7348492de6612c17d0aff5a3f6fb5f338d57ab2f70938b1cfaba9eab8eee718a48f292e1d5180d86df99cea20e4fadf223310df529ce645f0db2330a28a648ac2b271105426f11a070d3f4854f812c3fd0241860afd511a7ac76e681210505ed41121b141e377a73faaedde0001e33c1f9be807b975c0f5e1c0e3c63175d9e55ea901fb8f3001fb05a36d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e528633209660001206d1b185ba036efcd44a77e05a9aaf69a0c4e40976aec00b04773e5286332096620593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c18a93e60c572add22525a10a5554e6f6a4feca49fe00000000002ce4f2b5fb4e1ffc000cf99e000000f3a83d259634fbfc3e3c4ed50cdcab6598fce20bf3a83d259634fbfc3e3c4ed50cdcab6598fce20bc69a0bda7daaae481be8def95e5f347a1d00a4b430b8a2161c64bfdc7d621df51de569911a219f718bad4d6058dcca9bddf6696d43ddc4c1e3cf91640c93f820e5680efac30001c374f016ea61e76aab79b8bb95a1ba0e6e3eee6f01fb8f3001fb05a37135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf70190001207135069642e1a72807a383fb5a14b9af6758292fee53fe2a7f7ac6f528bf701920593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c1063c03764190123b001e65fd3aa12c030df5bde82000000000036bda427fb4e1ffc000cf99e000000b920a2229f777e360b7da76885a556bb439533bfb920a2229f777e360b7da76885a556bb439533bfc69a0bda7daaae481be8def95e5f347a1d00a4b4309472710b11e34dd5f6fa0d43cdde23ddb33558be1539cc7275cf06ba2d82c6ba0c712e7022752843f411e6702eaa736d0001f9956e70daffa263e8cf29fa6557b7b630a595a801fb8f3001fb05a3754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e000120754b89dae8db20fc4cee5e3adb07b146d7efe508a66fa0a8e1094675b9daa35e20593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c19ad66f3780f47e83479e1846ecca44d71ba5a902f00000000002ce92c5ffb4e1ffc000cf99e000000e65f1647a5477a20d178b12c509738d7a35ff312e65f1647a5477a20d178b12c509738d7a35ff312c69a0bda7daaae481be8def95e5f347a1d00a4b43099b9f0fbeea3822cdc5b3654dea52103b3d9d5f01db4201955ea3689074d37da4711d8f313d4b5458eef3395aa75bfc7000146d938862af6d9a291e26c0048177db2892a710b01fb8f3001fb05a37718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be42900001207718edad371e46d20fad30086e4acf4a05c2b660df6ae5f2a684aebdf1be429020593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c1feea83c4756a349e76b9077636dd04b3306bac60d00000000002ce3894dfb4e1ffc000cf99e000000c0e3581e5165c63790a2b8d2670fb4a1917cd4b8c0e3581e5165c63790a2b8d2670fb4a1917cd4b8c69a0bda7daaae481be8def95e5f347a1d00a4b430b675a1940be872b6a0d4e1696bb39ea38179933a1bae02ae1eaf4b47f625bd939482f8791eb38925af47f73be027a64c00010498ade3c80045c2a7520e921180ae1c39da5c5701fb8f3001fb05a37a1ae04de7582262d9dea3f4d72bc24a474c6f71988066b74a41f17be55526520001207a1ae04de7582262d9dea3f4d72bc24a474c6f71988066b74a41f17be555265220593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c1cc1d71953a4a45bd11d458683bbf2ef794d6d6e3d000000000023a612a6fb4e1ffc000cf99e0001fc0010f2fb0063c8d3ed082eb5d476a0940ef9c3fadafc4c5d2c63c8d3ed082eb5d476a0940ef9c3fadafc4c5d2cc69a0bda7daaae481be8def95e5f347a1d00a4b43093943908436a934c08582583b08cbcc50b4478bb79b7718789c25eb0ad2f3e5713ad4c152d4b1fd13cfd12bf896072e600017478cfd163788e3bbe09645776cf59642f28e37901fb8f3001fb05a37e56cc8c37501f3db794a554deb4287ac61c83635a0dec6d0f8e0b54ab14f8cd0001207e56cc8c37501f3db794a554deb4287ac61c83635a0dec6d0f8e0b54ab14f8cd2095f18528a48b7308195ec8201220efaafecfbf4df55cc2c8ab6b518733c22d63010e3edcfe65ca42dccfb1cb826562a46097c6f044412000000022df662bfb4e1ffc001066880001fc00108203006afebaad117b22669d50cf8bffc7863662b1d7e16afebaad117b22669d50cf8bffc7863662b1d7e16c671d1b8ae658d8102e47f0bb3f795482a6e215308156eebd6b52f4146a5b3f9686b9712f48980dfa4e8f17b514ba185a31e8d5fa7568c69aa79d9533fa6efd380c27b0c00001390fef6518c3b4b95551fe1707e0f0c398d5580801fb682001fb01bb85f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be82400012085f15a31d3838293a9c1d72a1a0fa21e66110ce20878bd4c1024c4ae1d5be82420593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c1aba3f43f7376b9025296fa73a30c07ccf5266eed8000000000036c92083fb4e1ffc000cf99e0000000f89b9ac5ac8f31255f692a3eb0283d0ef3be4360f89b9ac5ac8f31255f692a3eb0283d0ef3be436c69a0bda7daaae481be8def95e5f347a1d00a4b430ac3026b3e3023db1db9ec8e3b7678761820a2a6e96e7a5d9a39b1894170f9cea7765d3d131d60fa9d17492ba560fb1f9000168c506d43816d1a8389c860c1d162be44d1e777c01fb8f3001fb05a387075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d67891800012087075234ac47353b42bb97ce46330cb67cd4648c01f0b2393d7e729b0d67891820593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c071594bae6e759f13fbc246c11fbd8d97d68911241000000000023a79195fb4e1ffc000cf99e000000762e689e7bfecbe16bfd0e6138eea642ee0513c5762e689e7bfecbe16bfd0e6138eea642ee0513c5c69a0bda7daaae481be8def95e5f347a1d00a4b430a7afe7674de986aff5e2e0a173be8c29abed8b5d6f878389ea18be0d43c62ad1ba66a59e9e8d8453aa0ed1a69697675800019b9cdbfe3568cc0b37f136b00a634c75653f05e301fb8f3001fb05a388251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f00012088251bd4b124efeb87537deabeec54f6c8f575f4df81f10cf5e8eea073092b6f20593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c03090aa69c8d1a95839e017d1b2b53d3499fa0a9aa000000000034211c2ffb4e1ffc000cf99e0000000799f054652c1cef10d2994fb83d012d559a1faf0799f054652c1cef10d2994fb83d012d559a1fafc69a0bda7daaae481be8def95e5f347a1d00a4b430af9cd8567923fea3f6e6bbf5e1b3a76bf772f6a3c72b41be15c257af50533b32cc3923cebdeda9fce7a6bc9659123d530001711fd9548ae19b2e91c7a9b4067000467ccdd2b501fb8f3001fb05a38917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f2340001208917bb546318f3410d1a7901c7b846a73446311b5164b45a03f0e613f208f23420593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c21fe8d862d5042691749e866af337e50e599e64fdc0000000000340d8492fb4e1ffc000cf99e00000018d9316618b1f55977af250cc5d8783617084aac18d9316618b1f55977af250cc5d8783617084aacc69a0bda7daaae481be8def95e5f347a1d00a4b43087d25769002af2a4f050127c73fff03a24935e48f34fecaacd69410787d0e6384b345c78e81b1cb397b43dcd635568b600015bdbf34a0dad860c6ec71523ae39373325225cc101fb8f3001fb05a38b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e08150001208b8d1193afd22e538ce0c9fb50fee155d0f6176ca68e65da684c5dce2d1e081520593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c0b3fe432c394e3e96e8804a8e059b1887afc913012000000000034229032fb4e1ffc000cf99e000000b802f02882ed36279ba95674e7e190e86bd6458db802f02882ed36279ba95674e7e190e86bd6458dc69a0bda7daaae481be8def95e5f347a1d00a4b430a1749fecb407bb0e0ab9d6df65ea068dba5dc03e14dcb36abe5cb2b5c6e424683f715ff09ce290d035dbb31add0c01800001a0a0e17bfe82a484fefe348b7569a6d77d29d2c201fb8f3001fb05a38de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc40001208de8b12952f7058d827bd04cdff1c2175d87bbf89f28b52452a637bc979addc420593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c1dd08fdbbe79813bc43a306740d2182674141d76de0000000000342b56e7fb4e1ffc000cf99e000000300904176cc6023370b2462964c12c5979b9f411300904176cc6023370b2462964c12c5979b9f411c69a0bda7daaae481be8def95e5f347a1d00a4b4309502bb884b3437d65c0e025e49fb00ff6ea9f55d5bcdc36330b46c8bd18be9126b7a6d7f35f558ef8040f2c2284500a50001337b7fb5d2c531825c3e0123ac3354018085b30201fb8f3001fb05a38e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c00001208e11eb784883d3dc9d0d74a74633f067dc61c408dfdee49b8f93bb161f2916c020593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c20f53e3ff160dab7ec3cc2a6b0afa6dd8d36e38794000000000034599a30fb4e1ffc000cf99e0000000063eb51fcfd121e6c3eae23b90b26cd1100217b0063eb51fcfd121e6c3eae23b90b26cd1100217bc69a0bda7daaae481be8def95e5f347a1d00a4b4308160877a911d8bb7d1e75e2320e98cc3233c1f6972cb642424bfcec7c182c56d2c0ebb59e45f788f4d5dbfa2ebff3e3a00016d57707c196e06487d326094c964f258f5b77c3501fb8f3001fb05a38eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f0001208eca4bcbb3a124ab283afd42dad3bdb2077b3809659788a0f1daffce5b9f001f20593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c0e55b79902ab8dc5c126e61ebd5bdc2ec98d80836600000000003644ebc9fb4e1ffc000cf99e000000983259ad7ed51267fb83a8e41bbaa5ab55c632e1983259ad7ed51267fb83a8e41bbaa5ab55c632e1c69a0bda7daaae481be8def95e5f347a1d00a4b430b942e2e50c5cf9d9fe81119cc5379057c05fe15134f85847356b5d1f6a21f29f4a53f61f03338d056edc15a8c63fbbe80001c075993a8336f93a13bb7bbb7e0e89928be4aafb01fb8f3001fb05a391bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d00012091bbce94c34ebde0d099c0a2cb7635c0c31425ebabcec644f4f1a0854bfa605d20593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c1eea45a388d248dcd7433c8c8113d5d0966069413500000000003428db29fb4e1ffc000cf99e000000cf83406065cb65ce74100f3c35a0324bfc92dcb0cf83406065cb65ce74100f3c35a0324bfc92dcb0c69a0bda7daaae481be8def95e5f347a1d00a4b43081ad0f9be5a88ae62ff54fe938dfceea71be03bd4c6a7aebf75896e8d495d310acc4146aa4820bc0e5f5b06579dedea5000102aa69f8ef6666e7cad6d9323755a0ef3c1b6bd901fb8f3001fb05a3957acb5bb59e253059da86924b5bbd94c1daf5b0fcd313bdb78e43bdc7cad000000120957acb5bb59e253059da86924b5bbd94c1daf5b0fcd313bdb78e43bdc7cad00020176deee4e53c297f44029a7db294451139901bb49f33a2a0ac8bd1b9e744fee201c406356d37513ea70f93868797061aec981337a700000000002d87b4aafb4e1ffc00102b8501fc0010594501fc0010598300cf0ea50da406da09dd78689abaa7c44aad428e3f37f1afe5852c1aece552ed1be61dc898a8db05f06e0e8a6ca912d408dc8369365e947a41d9d0a9d83098fc5928355798aa9237b107935ba606bd749e16f2922d8c4eb6b6c2cbbb4210f3bad09fe7d199aa3884fae3fce0120d0001a5bf8ff04bf1be7f1d98cb952f1b49f8d162d8a301fb682001fb01bb9712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df540001209712e85d660fa2f761f980ef5812c225f33f336f285728803dcd421937d3df5420593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c1277e135a613d9797db4d7a9d2e51bfe8599d3650200000000002352c5c5fb4e1ffc000cf99e00000020c7f1991e06d09b1f067b049fe6d0af0a20f79c20c7f1991e06d09b1f067b049fe6d0af0a20f79cc69a0bda7daaae481be8def95e5f347a1d00a4b430a8dbccb130522909dc710a65728006732c18441757f12a338cf4a6d8cbd5baf1a484537a6a0542f51bb686e6e546f1a00001ed1131823bcea23ac78af8c01e4d24683d6ecf8801fb8f3001fb05a398ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba09209600012098ef58c338a0a68e4f2f1d1ee9eb05fcafbb9177d192dac0f698d3d9ba09209620593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c178b5541d75eaaa98f8ad22355a122c55741f339f200000000002ce8c406fb4e1ffc000cf99e000000caf6f1b9916245ce300a63fa2254ada25e0423d6caf6f1b9916245ce300a63fa2254ada25e0423d6c69a0bda7daaae481be8def95e5f347a1d00a4b430b6175b59aba8cc0477d4fff78bd90294f31ebd385c39bc254c7995a5dd3ccb8dc1d8869e247bf63bef8ec79317f479a90001d6ece912cbf02627a4efc3dd37e6833cf367155101fb8f3001fb05a39cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c0001209cb04f271ba050132c00cc5838fb69e77bc55b5689f9d2d850dc528935f8145c20593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c1bbb948d5d33120f51f2ca02c77a0b69761b719f07000000000022d63044fb4e1ffc000cf99e000000c54ac69739bf492d4328f1bf0d49581ce0b10d41c54ac69739bf492d4328f1bf0d49581ce0b10d417ea623bdf8c5607f0390c85586d83d473fa6a1c630b6ee48c7a71a9d8e0813e68ca09846245fa155285f24a62b0ce9cb0102b1994ec58af8ba2a01c09363bdcc395d41f3df000162e960a3f6b650feed98a266b3ccdf6e363562cf01fb8f3001fb05a3b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f000120b3b5748571b60fe9ad112715d6a51725d6e5a52a9c3af5fd36a1724cf50d862f20593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c1689fa69f20934cc3ede9dff4589af59c19a14a3f70000000000342b0d5cfb4e1ffc000cf99e000000d57dc73bca0753cbd47bb33f68362ac13e6daeadd57dc73bca0753cbd47bb33f68362ac13e6daeadc69a0bda7daaae481be8def95e5f347a1d00a4b430816ab3f50007333bcb40445130cd0e82139f8c68b592001cd686efc15e303206491fada6cf90af8f24a28b81a9b59ccf000141b308f737ca9e39f67b553158903198a88c516e01fb8f3001fb05a3ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e254216000120ba8ce1dc72857b4168e33272571df7fbaf84c316dfe48217addcf6595e25421620593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c1488164ceb25e5c05e3192511d2be4a5ac103cc5f70000000000342aca80fb4e1ffc000cf99e000000ca94dd35b74cb251457e475dd7507055eaf1b4e1ca94dd35b74cb251457e475dd7507055eaf1b4e1c69a0bda7daaae481be8def95e5f347a1d00a4b430acec7bbead86221590f132810b8262cf98c91b338927907b86bf48baa54dd1912bfc1f6fccd069052cc8c79eb9e8ed2c000162e0104ce0aafc1f06bde37c73702fe84b307f0501fb8f3001fb05a3bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb8000120bbfd0ac1977011267a7032641ef5487fe15a4de798faa485b156fb3b7eb0acb820593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c060d8235767cb55972a30d653eb9dd10f51b3c46ec0000000000235231c4fb4e1ffc000cf99e000000f9b93e179a0c22afd92523427341b5e0b2c2a102f9b93e179a0c22afd92523427341b5e0b2c2a102c69a0bda7daaae481be8def95e5f347a1d00a4b43095c89af86eeacfe403684306c98173c2a59198047a778787887d34ad6b0c9b787d689a7c3cd9e9dd5d103cba70f3855f0001dbbebbc52a5bae21b818e0487311041c91b2683b01fb8f3001fb05a3c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba8000120c11c1168dcf9479475cb1355855e30ea75c0cdda8a8f9ea80591568dd1c33ba820593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c040cb28bcdc1d1a970b6255a04138f84c0ebfa52b6000000000036d5cc55fb4e1ffc000cf99e000000ec040cc1866da3e55c8ae6c0f739cafabe3f5cbaec040cc1866da3e55c8ae6c0f739cafabe3f5cbac69a0bda7daaae481be8def95e5f347a1d00a4b430aa910b9552857a7712d54b468dfcbb7d9e27f26a49e06fb1f0fb00dd0f5a1bf926863c25ad03fd49c56b62065ecd06e70001fdae7cdf38811659ce9481975b326a5d07236bc501fb8f3001fb05a3d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f89000120d9b090cfc19caf2e27d512e69c43812a274bdf29c081d0ade4fd272ad56a5f8920593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c0d47eb59e9a49b3794acf272f1bfff17f228291daf00000000002cf06266fb4e1ffc000cf99e0000007334f54da07d3b9e177f6e57c64f97bb0f982caf7334f54da07d3b9e177f6e57c64f97bb0f982cafc69a0bda7daaae481be8def95e5f347a1d00a4b43086108e551691da2642f37b68bcfbc5bbe9984ca51aca15ee24b6fa9b8690ed62c6ed722d091e04ef617cfc99341fd35800017034f0d3853c5351fb8e0ffd3c1daf12c51c2d8901fb8f3001fb05a3ee733db5519c987496eb3b871d5fa543ddb19db3e848f2fbb0af01585fc76af5000120ee733db5519c987496eb3b871d5fa543ddb19db3e848f2fbb0af01585fc76af520f56ac75f5801afb0fbf248e8b39db1dd43a55f1d873beb9674989c51b53d73ee0191be18196047ed60fca300e6fdca0b7bea81beac00000000000238d45dfb4e1ffc000de7c001fc000de9f801fc000f13a3000bf9547a7b4d12def0019da71e989821a60d9c915b44dc4b3f0ed26a8243afa46bada49c18da6b2a21eca01872dbfce4bf20886a004f6caaa69c1ff730b695a4757d60c472f67a7807def81ab7a52dec3bc64aa1c4188d02a4768ac3a862b404f0656ed395f1eb6470dca7bca400018355913e3791438c18b5ac50fe03784df789424101fb8f3001fb05a3f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba7863990381000120f6496d3c0ac1ad94ff5e3aab2edcabc1c8ba3fbfea0ef3026e90ba786399038120593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c050d1611e03249023d89c1ac086036cbea392768cc0000000000340dfab6fb4e1ffc000cf99e0000006cc3fca46aae1c44ea1bab81d506e9f0a3ae1d056cc3fca46aae1c44ea1bab81d506e9f0a3ae1d05c69a0bda7daaae481be8def95e5f347a1d00a4b4308f2df81ba65db70eaab625c5fe46f0f5e52a45b25c761686db23b4f18e547cb0d161912dd187302eb6f7c4a9a666a3230001fe2d4798df3e9b41a6823bc0b3f020478e87925d01fb8f3001fb05a3fc196382366234f4645215261ca7e62f53499345ec1def69289e47c0c388dc6d000120fc196382366234f4645215261ca7e62f53499345ec1def69289e47c0c388dc6d20151b4f6fbc7351efba1dd1c36c733978a184561af7497b25b4a8a3e0afec0e7f016608134feb91cb878b26b977f1d7983a2f14452a4248000000258b0cf7fb4e1ffc000df5420001fc000df56b00c346a8ffbdcc80462cb69a6f524388a5f496fc6ec9a9263ee8c8c606c449959c48978ba70d4a097bfc86e599d56c282377dd9510ee62c55fefa553b1308d0651a04f9c243872f613901a1eeb2fa86f3e9a65168bc39941790783d9189a9a7876cedb0c6d7ff7d49fbc88a7191100011348d8f97063cf6ff602c14bf59b5ff501c8bbf401fb8f3001fb05a3ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac9000120ff261d2c1c76907a2ad8aeb6c5611796f03b5cbd88ae92452a4727e13f4f4ac920593aaec65459ca9a97bd34b2657c8201ae83952d062715ba3af0d4255e54e86c0c456ce31778e3778c88a87ac36a1a8bd4aa5bdbe9000000000036bb0ee8fb4e1ffc000cf99e000000b14f661da8227a41acef9f8096df2afd2a192aafb14f661da8227a41acef9f8096df2afd2a192aafc69a0bda7daaae481be8def95e5f347a1d00a4b430967796952922dcc5208a3848ab85a787e4592df2d8ce36a29369b0b3a9576073651075039e1377873aa8c67514ad2726000167e05b1b52c7c896adf20035036fe1d30dcefc9c01fb8f3001fb05a301fb037f01fb03e8fb6978fb0190140afb07d0fb3a98fc000493e0fb3c8cfc000493e0fb0dac64fb012cfb1388fb177064fb2710fb2328fb3a98fb2328fb2710fb271032fb01f40a28321e643cfc000186a0fc000186a0fc000186a0fc000186a0fc000186a0fc000186a0fc000186a0fd00000004a817c800fd0000005d21dba000fc00989680" +}); diff --git a/packages/rs-drive/src/drive/document/delete/mod.rs b/packages/rs-drive/src/drive/document/delete/mod.rs index 3f64724bfd..c2da69240b 100644 --- a/packages/rs-drive/src/drive/document/delete/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/mod.rs @@ -76,10 +76,11 @@ mod tests { use dpp::tests::json_document::{json_document_to_contract, json_document_to_document}; use crate::util::test_helpers::setup::setup_drive_with_initial_state_structure; + use dpp::version::fee::FeeVersion; use dpp::version::PlatformVersion; static EPOCH_CHANGE_FEE_VERSION_TEST: Lazy = - Lazy::new(|| BTreeMap::from([(0, PlatformVersion::first().fee_version.clone())])); + Lazy::new(|| BTreeMap::from([(0, FeeVersion::first())])); #[test] fn test_add_and_remove_family_one_document_no_transaction() { diff --git a/packages/rs-drive/src/drive/document/insert/mod.rs b/packages/rs-drive/src/drive/document/insert/mod.rs index ae327e8c30..f0eb33b8a7 100644 --- a/packages/rs-drive/src/drive/document/insert/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/mod.rs @@ -60,10 +60,11 @@ mod tests { use dpp::fee::default_costs::{CachedEpochIndexFeeVersions, EpochCosts}; use dpp::fee::fee_result::FeeResult; use dpp::tests::json_document::json_document_to_document; + use dpp::version::fee::FeeVersion; use dpp::version::PlatformVersion; static EPOCH_CHANGE_FEE_VERSION_TEST: Lazy = - Lazy::new(|| BTreeMap::from([(0, PlatformVersion::first().fee_version.clone())])); + Lazy::new(|| BTreeMap::from([(0, FeeVersion::first())])); #[test] fn test_add_dashpay_documents_no_transaction() { diff --git a/packages/rs-drive/src/drive/document/update/mod.rs b/packages/rs-drive/src/drive/document/update/mod.rs index e7dc236f43..fccb43e3e8 100644 --- a/packages/rs-drive/src/drive/document/update/mod.rs +++ b/packages/rs-drive/src/drive/document/update/mod.rs @@ -65,11 +65,12 @@ mod tests { use dpp::fee::fee_result::FeeResult; use dpp::platform_value; use dpp::tests::json_document::json_document_to_document; + use dpp::version::fee::FeeVersion; use once_cell::sync::Lazy; use platform_version::version::PlatformVersion; static EPOCH_CHANGE_FEE_VERSION_TEST: Lazy = - Lazy::new(|| BTreeMap::from([(0, PlatformVersion::first().fee_version.clone())])); + Lazy::new(|| BTreeMap::from([(0, FeeVersion::first())])); #[test] fn test_create_and_update_document_same_transaction() { diff --git a/packages/rs-drive/tests/query_tests.rs b/packages/rs-drive/tests/query_tests.rs index e7a880a02c..5c792aa873 100644 --- a/packages/rs-drive/tests/query_tests.rs +++ b/packages/rs-drive/tests/query_tests.rs @@ -75,6 +75,7 @@ use dpp::tests::json_document::json_document_to_contract; use dpp::util::cbor_serializer; use once_cell::sync::Lazy; +use dpp::version::fee::FeeVersion; use dpp::version::PlatformVersion; #[cfg(feature = "server")] @@ -2305,7 +2306,7 @@ fn test_family_person_update() { let platform_version = PlatformVersion::latest(); let epoch_change_fee_version_test: Lazy = - Lazy::new(|| BTreeMap::from([(0, PlatformVersion::first().fee_version.clone())])); + Lazy::new(|| BTreeMap::from([(0, FeeVersion::first())])); let db_transaction = drive.grove.start_transaction(); @@ -2883,7 +2884,7 @@ fn test_family_with_nulls_query() { let platform_version = PlatformVersion::latest(); let epoch_change_fee_version_test: Lazy = - Lazy::new(|| BTreeMap::from([(0, PlatformVersion::first().fee_version.clone())])); + Lazy::new(|| BTreeMap::from([(0, FeeVersion::first())])); let db_transaction = drive.grove.start_transaction(); diff --git a/packages/rs-drive/tests/query_tests_history.rs b/packages/rs-drive/tests/query_tests_history.rs index 2d609f0c2b..c14dfeca9e 100644 --- a/packages/rs-drive/tests/query_tests_history.rs +++ b/packages/rs-drive/tests/query_tests_history.rs @@ -53,6 +53,7 @@ use dpp::document::serialization_traits::{ use dpp::document::DocumentV0Getters; use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::tests::json_document::json_document_to_contract; +use dpp::version::fee::FeeVersion; use dpp::version::PlatformVersion; use drive::util::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; #[cfg(feature = "server")] @@ -166,7 +167,7 @@ pub fn setup( let platform_version = PlatformVersion::latest(); let epoch_change_fee_version_test: Lazy = - Lazy::new(|| BTreeMap::from([(0, PlatformVersion::first().fee_version.clone())])); + Lazy::new(|| BTreeMap::from([(0, FeeVersion::first())])); let drive = setup_drive(Some(drive_config)); @@ -260,7 +261,7 @@ fn test_query_historical() { let platform_version = PlatformVersion::latest(); let epoch_change_fee_version_test: Lazy = - Lazy::new(|| BTreeMap::from([(0, PlatformVersion::first().fee_version.clone())])); + Lazy::new(|| BTreeMap::from([(0, FeeVersion::first())])); let db_transaction = drive.grove.start_transaction(); diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index bb74c9d433..03ac8cad96 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -77,7 +77,7 @@ pub struct DriveAbciQuerySystemVersions { #[derive(Clone, Debug, Default)] pub struct DriveAbciStructureVersions { pub platform_state_structure: FeatureVersion, - pub platform_state_for_saving_structure: FeatureVersion, + pub platform_state_for_saving_structure_default: FeatureVersion, pub state_transition_execution_context: FeatureVersion, pub commit: FeatureVersion, pub masternode: FeatureVersion, diff --git a/packages/rs-platform-version/src/version/fee/mod.rs b/packages/rs-platform-version/src/version/fee/mod.rs index 6022a89a1f..735e1b5146 100644 --- a/packages/rs-platform-version/src/version/fee/mod.rs +++ b/packages/rs-platform-version/src/version/fee/mod.rs @@ -1,9 +1,13 @@ +use crate::error::PlatformVersionError; use crate::version::fee::data_contract::FeeDataContractValidationVersion; use crate::version::fee::hashing::FeeHashingVersion; -use crate::version::fee::processing::FeeProcessingVersion; +use crate::version::fee::processing::{ + FeeProcessingVersion, FeeProcessingVersionFieldsBeforeVersion1Point4, +}; use crate::version::fee::signature::FeeSignatureVersion; use crate::version::fee::state_transition_min_fees::StateTransitionMinFees; use crate::version::fee::storage::FeeStorageVersion; +use crate::version::fee::v1::FEE_VERSION1; use crate::version::fee::vote_resolution_fund_fees::VoteResolutionFundFees; use bincode::{Decode, Encode}; @@ -16,8 +20,13 @@ pub mod storage; pub mod v1; pub mod vote_resolution_fund_fees; +pub type FeeVersionNumber = u32; + +pub const FEE_VERSIONS: &[FeeVersion] = &[FEE_VERSION1]; + #[derive(Clone, Debug, Encode, Decode, Default, PartialEq, Eq)] pub struct FeeVersion { + pub fee_version_number: FeeVersionNumber, // Permille means devise by 1000 pub uses_version_fee_multiplier_permille: Option, pub storage: FeeStorageVersion, @@ -29,137 +38,70 @@ pub struct FeeVersion { pub vote_resolution_fund_fees: VoteResolutionFundFees, } -#[cfg(test)] -mod tests { - use super::FeeVersion; - use crate::version::fee::data_contract::FeeDataContractValidationVersion; - use crate::version::fee::hashing::FeeHashingVersion; - use crate::version::fee::processing::FeeProcessingVersion; - use crate::version::fee::signature::FeeSignatureVersion; - use crate::version::fee::state_transition_min_fees::StateTransitionMinFees; - use crate::version::fee::storage::FeeStorageVersion; - use crate::version::fee::vote_resolution_fund_fees::VoteResolutionFundFees; +impl FeeVersion { + pub fn as_static(&self) -> &'static FeeVersion { + FeeVersion::get(self.fee_version_number).expect("expected fee version to exist") + } + pub fn get<'a>(version: FeeVersionNumber) -> Result<&'a Self, PlatformVersionError> { + if version > 0 { + FEE_VERSIONS.get(version as usize - 1).ok_or_else(|| { + PlatformVersionError::UnknownVersionError(format!("no fee version {version}")) + }) + } else { + Err(PlatformVersionError::UnknownVersionError(format!( + "no fee version {version}" + ))) + } + } + + pub fn get_optional<'a>(version: FeeVersionNumber) -> Option<&'a Self> { + if version > 0 { + FEE_VERSIONS.get(version as usize - 1) + } else { + None + } + } + + pub fn first<'a>() -> &'a Self { + FEE_VERSIONS + .first() + .expect("expected to have a fee version") + } - #[test] - // If this test failed, then a new field was added in FeeVersion. And the corresponding eq needs to be updated as well - fn test_fee_version_equality() { - let version1 = FeeVersion { - uses_version_fee_multiplier_permille: None, - storage: FeeStorageVersion { - storage_disk_usage_credit_per_byte: 1, - storage_processing_credit_per_byte: 2, - storage_load_credit_per_byte: 3, - non_storage_load_credit_per_byte: 4, - storage_seek_cost: 5, - }, - signature: FeeSignatureVersion { - verify_signature_ecdsa_secp256k1: 1, - verify_signature_bls12_381: 2, - verify_signature_ecdsa_hash160: 3, - verify_signature_bip13_script_hash: 4, - verify_signature_eddsa25519_hash160: 5, - }, - hashing: FeeHashingVersion { - single_sha256_base: 1, - blake3_base: 2, - sha256_ripe_md160_base: 3, - sha256_per_block: 4, - blake3_per_block: 5, - }, - processing: FeeProcessingVersion { - fetch_identity_balance_processing_cost: 1, - fetch_identity_revision_processing_cost: 2, - fetch_identity_balance_and_revision_processing_cost: 3, - fetch_identity_cost_per_look_up_key_by_id: 4, - fetch_single_identity_key_processing_cost: 5, - perform_network_threshold_signing: 6, - validate_key_structure: 7, - fetch_prefunded_specialized_balance_processing_cost: 8, - }, - data_contract: FeeDataContractValidationVersion { - document_type_base_fee: 1, - document_type_size_fee: 2, - document_type_per_property_fee: 3, - document_type_base_non_unique_index_fee: 4, - document_type_non_unique_index_per_property_fee: 5, - document_type_base_unique_index_fee: 6, - document_type_unique_index_per_property_fee: 7, - }, - state_transition_min_fees: StateTransitionMinFees { - credit_transfer: 1, - credit_withdrawal: 2, - identity_update: 3, - document_batch_sub_transition: 4, - contract_create: 5, - contract_update: 6, - masternode_vote: 7, - }, - vote_resolution_fund_fees: VoteResolutionFundFees { - contested_document_vote_resolution_fund_required_amount: 1, - contested_document_vote_resolution_unlock_fund_required_amount: 2, - contested_document_single_vote_cost: 3, - }, - }; + pub fn latest<'a>() -> &'a Self { + FEE_VERSIONS.last().expect("expected to have a fee version") + } +} - let version2 = FeeVersion { - uses_version_fee_multiplier_permille: None, - storage: FeeStorageVersion { - storage_disk_usage_credit_per_byte: 1, - storage_processing_credit_per_byte: 2, - storage_load_credit_per_byte: 3, - non_storage_load_credit_per_byte: 4, - storage_seek_cost: 5, - }, - signature: FeeSignatureVersion { - verify_signature_ecdsa_secp256k1: 1, - verify_signature_bls12_381: 2, - verify_signature_ecdsa_hash160: 3, - verify_signature_bip13_script_hash: 4, - verify_signature_eddsa25519_hash160: 5, - }, - hashing: FeeHashingVersion { - single_sha256_base: 1, - blake3_base: 2, - sha256_ripe_md160_base: 3, - sha256_per_block: 4, - blake3_per_block: 5, - }, - processing: FeeProcessingVersion { - fetch_identity_balance_processing_cost: 1, - fetch_identity_revision_processing_cost: 2, - fetch_identity_balance_and_revision_processing_cost: 3, - fetch_identity_cost_per_look_up_key_by_id: 4, - fetch_single_identity_key_processing_cost: 5, - perform_network_threshold_signing: 6, - validate_key_structure: 7, - fetch_prefunded_specialized_balance_processing_cost: 8, - }, - data_contract: FeeDataContractValidationVersion { - document_type_base_fee: 1, - document_type_size_fee: 2, - document_type_per_property_fee: 3, - document_type_base_non_unique_index_fee: 4, - document_type_non_unique_index_per_property_fee: 5, - document_type_base_unique_index_fee: 6, - document_type_unique_index_per_property_fee: 7, - }, - state_transition_min_fees: StateTransitionMinFees { - credit_transfer: 1, - credit_withdrawal: 2, - identity_update: 3, - document_batch_sub_transition: 4, - contract_create: 5, - contract_update: 6, - masternode_vote: 7, - }, - vote_resolution_fund_fees: VoteResolutionFundFees { - contested_document_vote_resolution_fund_required_amount: 1, - contested_document_vote_resolution_unlock_fund_required_amount: 2, - contested_document_single_vote_cost: 3, - }, - }; +// This is type only meant for deserialization because of an issue +// The issue was that the platform state was stored with FeeVersions in it before version 1.4 +// When we would add new fields we would be unable to deserialize +// This FeeProcessingVersionFieldsBeforeVersion4 is how things were before version 1.4 was released +#[derive(Clone, Debug, Encode, Decode, Default, PartialEq, Eq)] +pub struct FeeVersionFieldsBeforeVersion4 { + // Permille means devise by 1000 + pub uses_version_fee_multiplier_permille: Option, + pub storage: FeeStorageVersion, + pub signature: FeeSignatureVersion, + pub hashing: FeeHashingVersion, + pub processing: FeeProcessingVersionFieldsBeforeVersion1Point4, + pub data_contract: FeeDataContractValidationVersion, + pub state_transition_min_fees: StateTransitionMinFees, + pub vote_resolution_fund_fees: VoteResolutionFundFees, +} - // This assertion will check if all fields are considered in the equality comparison - assert_eq!(version1, version2, "FeeVersion equality test failed. If a field was added or removed, update the Eq implementation."); +impl From for FeeVersion { + fn from(value: FeeVersionFieldsBeforeVersion4) -> Self { + FeeVersion { + fee_version_number: 1, + uses_version_fee_multiplier_permille: value.uses_version_fee_multiplier_permille, + storage: value.storage, + signature: value.signature, + hashing: value.hashing, + processing: FeeProcessingVersion::from(value.processing), + data_contract: value.data_contract, + state_transition_min_fees: value.state_transition_min_fees, + vote_resolution_fund_fees: value.vote_resolution_fund_fees, + } } } diff --git a/packages/rs-platform-version/src/version/fee/processing/mod.rs b/packages/rs-platform-version/src/version/fee/processing/mod.rs index df88c9c0dc..a4f33696c0 100644 --- a/packages/rs-platform-version/src/version/fee/processing/mod.rs +++ b/packages/rs-platform-version/src/version/fee/processing/mod.rs @@ -1,3 +1,4 @@ +use crate::version::fee::v1::FEE_VERSION1; use bincode::{Decode, Encode}; pub mod v1; @@ -10,40 +11,42 @@ pub struct FeeProcessingVersion { pub fetch_identity_cost_per_look_up_key_by_id: u64, pub fetch_prefunded_specialized_balance_processing_cost: u64, pub fetch_single_identity_key_processing_cost: u64, - pub perform_network_threshold_signing: u64, pub validate_key_structure: u64, + pub perform_network_threshold_signing: u64, } -#[cfg(test)] -mod tests { - use super::FeeProcessingVersion; - - #[test] - // If this test failed, then a new field was added in FeeProcessingVersion. And the corresponding eq needs to be updated as well - fn test_fee_processing_version_equality() { - let version1 = FeeProcessingVersion { - fetch_identity_balance_processing_cost: 1, - fetch_identity_revision_processing_cost: 2, - fetch_identity_balance_and_revision_processing_cost: 3, - fetch_identity_cost_per_look_up_key_by_id: 4, - fetch_single_identity_key_processing_cost: 5, - perform_network_threshold_signing: 6, - validate_key_structure: 7, - fetch_prefunded_specialized_balance_processing_cost: 8, - }; - - let version2 = FeeProcessingVersion { - fetch_identity_balance_processing_cost: 1, - fetch_identity_revision_processing_cost: 2, - fetch_identity_balance_and_revision_processing_cost: 3, - fetch_identity_cost_per_look_up_key_by_id: 4, - fetch_single_identity_key_processing_cost: 5, - perform_network_threshold_signing: 6, - validate_key_structure: 7, - fetch_prefunded_specialized_balance_processing_cost: 8, - }; +// This is type only meant for deserialization because of an issue +// The issue was that the platform state was stored with FeeVersions in it before version 1.4 +// When we would add new fields we would be unable to deserialize +// This FeeProcessingVersionFieldsBeforeVersion4 is how things were before version 1.4 was released +#[derive(Clone, Debug, Encode, Decode, Default, PartialEq, Eq)] +pub struct FeeProcessingVersionFieldsBeforeVersion1Point4 { + pub fetch_identity_balance_processing_cost: u64, + pub fetch_identity_revision_processing_cost: u64, + pub fetch_identity_balance_and_revision_processing_cost: u64, + pub fetch_identity_cost_per_look_up_key_by_id: u64, + pub fetch_prefunded_specialized_balance_processing_cost: u64, + pub fetch_single_identity_key_processing_cost: u64, + pub validate_key_structure: u64, +} - // This assertion will check if all fields are considered in the equality comparison - assert_eq!(version1, version2, "FeeProcessingVersion equality test failed. If a field was added or removed, update the Eq implementation."); +impl From for FeeProcessingVersion { + fn from(old: FeeProcessingVersionFieldsBeforeVersion1Point4) -> Self { + FeeProcessingVersion { + fetch_identity_balance_processing_cost: old.fetch_identity_balance_processing_cost, + fetch_identity_revision_processing_cost: old.fetch_identity_revision_processing_cost, + fetch_identity_balance_and_revision_processing_cost: old + .fetch_identity_balance_and_revision_processing_cost, + fetch_identity_cost_per_look_up_key_by_id: old + .fetch_identity_cost_per_look_up_key_by_id, + fetch_prefunded_specialized_balance_processing_cost: old + .fetch_prefunded_specialized_balance_processing_cost, + fetch_single_identity_key_processing_cost: old + .fetch_single_identity_key_processing_cost, + validate_key_structure: old.validate_key_structure, + perform_network_threshold_signing: FEE_VERSION1 + .processing + .perform_network_threshold_signing, + } } } diff --git a/packages/rs-platform-version/src/version/fee/v1.rs b/packages/rs-platform-version/src/version/fee/v1.rs index dc5a976e11..fe43f0464c 100644 --- a/packages/rs-platform-version/src/version/fee/v1.rs +++ b/packages/rs-platform-version/src/version/fee/v1.rs @@ -8,6 +8,7 @@ use crate::version::fee::vote_resolution_fund_fees::v1::VOTE_RESOLUTION_FUND_FEE use crate::version::fee::FeeVersion; pub const FEE_VERSION1: FeeVersion = FeeVersion { + fee_version_number: 1, uses_version_fee_multiplier_permille: Some(1000), //No action storage: FEE_STORAGE_VERSION1, signature: FEE_SIGNATURE_VERSION1, diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 380e9ae88e..0edf2b425b 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -603,7 +603,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { drive_abci: DriveAbciVersion { structs: DriveAbciStructureVersions { platform_state_structure: 0, - platform_state_for_saving_structure: 0, + platform_state_for_saving_structure_default: 0, state_transition_execution_context: 0, commit: 0, masternode: 0, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 436b1d9b89..07e3d37ecd 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -603,7 +603,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { drive_abci: DriveAbciVersion { structs: DriveAbciStructureVersions { platform_state_structure: 0, - platform_state_for_saving_structure: 0, + platform_state_for_saving_structure_default: 0, state_transition_execution_context: 0, commit: 0, masternode: 0, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index c762c864b2..8369d3a30f 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -602,7 +602,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { drive_abci: DriveAbciVersion { structs: DriveAbciStructureVersions { platform_state_structure: 0, - platform_state_for_saving_structure: 0, + platform_state_for_saving_structure_default: 0, state_transition_execution_context: 0, commit: 0, masternode: 0, diff --git a/packages/rs-platform-version/src/version/v2.rs b/packages/rs-platform-version/src/version/v2.rs index 7df825fb32..2859bb744e 100644 --- a/packages/rs-platform-version/src/version/v2.rs +++ b/packages/rs-platform-version/src/version/v2.rs @@ -602,7 +602,7 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion { drive_abci: DriveAbciVersion { structs: DriveAbciStructureVersions { platform_state_structure: 0, - platform_state_for_saving_structure: 0, + platform_state_for_saving_structure_default: 0, state_transition_execution_context: 0, commit: 0, masternode: 0, diff --git a/packages/rs-platform-version/src/version/v3.rs b/packages/rs-platform-version/src/version/v3.rs index 609a9a9015..2c0660be1a 100644 --- a/packages/rs-platform-version/src/version/v3.rs +++ b/packages/rs-platform-version/src/version/v3.rs @@ -609,7 +609,7 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { drive_abci: DriveAbciVersion { structs: DriveAbciStructureVersions { platform_state_structure: 0, - platform_state_for_saving_structure: 0, + platform_state_for_saving_structure_default: 0, state_transition_execution_context: 0, commit: 0, masternode: 0, diff --git a/packages/rs-platform-version/src/version/v4.rs b/packages/rs-platform-version/src/version/v4.rs index dd693aa2f8..fd6429c6f6 100644 --- a/packages/rs-platform-version/src/version/v4.rs +++ b/packages/rs-platform-version/src/version/v4.rs @@ -604,7 +604,7 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { drive_abci: DriveAbciVersion { structs: DriveAbciStructureVersions { platform_state_structure: 0, - platform_state_for_saving_structure: 0, + platform_state_for_saving_structure_default: 0, state_transition_execution_context: 0, commit: 0, masternode: 0, From 26e3c47f0e83a6bb425e4775b226a1545daa7ec0 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 8 Oct 2024 16:59:34 +0300 Subject: [PATCH 53/90] chore(release): update changelog and bump version to 1.4.0-dev.8 (#2229) --- CHANGELOG.md | 12 +++++ Cargo.lock | 50 +++++++++---------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/check-features/Cargo.toml | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 44 files changed, 79 insertions(+), 67 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6929775650..bb91d62475 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +## [1.4.0-dev.8](https://github.com/dashpay/platform/compare/v1.4.0-dev.7...v1.4.0-dev.8) (2024-10-08) + + +### Features + +* **sdk:** fix client tls connections ([#2223](https://github.com/dashpay/platform/issues/2223)) + + +### Bug Fixes + +* **platform:** fixed Platform State deserialization issue ([#2227](https://github.com/dashpay/platform/issues/2227)) + ## [1.4.0-dev.7](https://github.com/dashpay/platform/compare/v1.4.0-dev.6...v1.4.0-dev.7) (2024-10-07) diff --git a/Cargo.lock b/Cargo.lock index 92ff215c4b..65e04a426f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -674,7 +674,7 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "check-features" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "toml", ] @@ -1043,7 +1043,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1059,7 +1059,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "dapi-grpc", "heck 0.5.0", @@ -1104,7 +1104,7 @@ dependencies = [ [[package]] name = "dash-sdk" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "arc-swap", "async-trait", @@ -1204,7 +1204,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "platform-value", "platform-version", @@ -1214,7 +1214,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1345,7 +1345,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "platform-value", "platform-version", @@ -1355,7 +1355,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "anyhow", "assert_matches", @@ -1407,7 +1407,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "arc-swap", "assert_matches", @@ -1448,7 +1448,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "arc-swap", "assert_matches", @@ -1503,7 +1503,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "bincode", "dapi-grpc", @@ -1724,7 +1724,7 @@ checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "feature-flags-contract" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "platform-value", "platform-version", @@ -2562,7 +2562,7 @@ dependencies = [ [[package]] name = "json-schema-compatibility-validator" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "assert_matches", "json-patch", @@ -2720,7 +2720,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "platform-value", "platform-version", @@ -3300,7 +3300,7 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "platform-serialization" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "bincode", "platform-version", @@ -3308,7 +3308,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "proc-macro2", "quote", @@ -3318,7 +3318,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "base64 0.22.1", "bincode", @@ -3339,7 +3339,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "quote", "syn 2.0.75", @@ -3347,7 +3347,7 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "bincode", "grovedb-version", @@ -3358,7 +3358,7 @@ dependencies = [ [[package]] name = "platform-versioning" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "proc-macro2", "quote", @@ -3850,7 +3850,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "backon", "chrono", @@ -4317,7 +4317,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "base64 0.22.1", "bincode", @@ -4383,7 +4383,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "bincode", "dpp", @@ -5302,7 +5302,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "anyhow", "async-trait", @@ -5604,7 +5604,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" dependencies = [ "num_enum 0.5.11", "platform-value", diff --git a/package.json b/package.json index 135b7d3084..e09d8f5559 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.4.0-dev.7", + "version": "1.4.0-dev.8", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index b3e2fac245..9b6fcad436 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.4.0-dev.7", + "version": "1.4.0-dev.8", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/check-features/Cargo.toml b/packages/check-features/Cargo.toml index 7d11a7421f..3b6028f2e3 100644 --- a/packages/check-features/Cargo.toml +++ b/packages/check-features/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "check-features" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index be9ba8e05b..bf4af39109 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index 558ad26654..c59cb9d1aa 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.4.0-dev.7", + "version": "1.4.0-dev.8", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index eff603e912..e41ab91f07 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.4.0-dev.7", + "version": "1.4.0-dev.8", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index e8f982f0ea..2347b72092 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "2.4.0-dev.7", + "version": "2.4.0-dev.8", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index 397c430574..f4affd1289 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.4.0-dev.7", + "version": "1.4.0-dev.8", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index dd94bf77f0..7ca4e6235f 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index 9d8bc10a8c..548fdfab72 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.4.0-dev.7", + "version": "1.4.0-dev.8", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index 5c7c908471..b3e2f39cee 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index e26c6b3f92..192b13af0a 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index c653837569..aa6d3cf0e8 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.4.0-dev.7", + "version": "1.4.0-dev.8", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index c96643b8cd..12d6b4df0b 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index 70f1e9a538..c10ce31d4e 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.4.0-dev.7", + "version": "1.4.0-dev.8", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index 4339db52be..31a02a53e1 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.4.0-dev.7", + "version": "1.4.0-dev.8", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index 6355ee3c35..551b95e254 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.4.0-dev.7", + "version": "4.4.0-dev.8", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index c57a55fbe7..27b69fe125 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.4.0-dev.7", + "version": "1.4.0-dev.8", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index 0ba5f04dfe..53eb117be4 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index 20a60d9fa3..f10231a2ed 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.4.0-dev.7", + "version": "1.4.0-dev.8", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index 3ed5cf8d91..1436edb885 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.4.0-dev.7", + "version": "1.4.0-dev.8", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index fb06b6abdc..21ab0b978c 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index 5b4b883c56..c2f1a05b64 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index f096f1f747..eafc2c232f 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" edition = "2021" rust-version.workspace = true authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 2c88cf0e16..75333a4fba 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index f6ebac3824..a3612cb0de 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" edition = "2021" rust-version.workspace = true diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 394bd20eb1..f7a641ca18 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-json-schema-compatibility-validator/Cargo.toml b/packages/rs-json-schema-compatibility-validator/Cargo.toml index e7598b319c..9b53e16651 100644 --- a/packages/rs-json-schema-compatibility-validator/Cargo.toml +++ b/packages/rs-json-schema-compatibility-validator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "json-schema-compatibility-validator" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" edition = "2021" rust-version.workspace = true authors = ["Ivan Shumkov "] diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index 790f2b2c1b..0a319be2ea 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index ddb9000e9b..681d00e4b4 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index 1b570a4325..3d1b56ca01 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index 1f5ac10e8f..7789994d4c 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 7497dd8786..c719edc92a 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Versioning library for Platform" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index 0941cffbe5..e064c13b91 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index aa41ed04ae..4cd743c252 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dash-sdk" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index aa28658d71..3f8c78bb28 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" edition = "2021" rust-version.workspace = true diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index 20f191c0a5..108e4446d8 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 8c23365ab4..7c90d720bf 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.4.0-dev.7", + "version": "8.4.0-dev.8", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index ec72884429..c70ce583dd 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" edition = "2021" rust-version.workspace = true authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index 3e7d34045d..824d08221e 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.4.0-dev.7", + "version": "1.4.0-dev.8", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index bab39adb8c..7a330aa1a1 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.4.0-dev.7" +version = "1.4.0-dev.8" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index f4270b3bc7..50657efdea 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.4.0-dev.7", + "version": "1.4.0-dev.8", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From de5236ea04611971929d433a7b69ceab792cd169 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Wed, 9 Oct 2024 13:09:39 +0700 Subject: [PATCH 54/90] chore(dpp): add method for decoding identifier with unknown string encoding (#2230) --- .../rs-platform-value/src/string_encoding.rs | 14 ++++++++++ .../rs-platform-value/src/types/identifier.rs | 26 ++++++++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/packages/rs-platform-value/src/string_encoding.rs b/packages/rs-platform-value/src/string_encoding.rs index c31d172839..bce2c69fbb 100644 --- a/packages/rs-platform-value/src/string_encoding.rs +++ b/packages/rs-platform-value/src/string_encoding.rs @@ -3,13 +3,27 @@ use base64; use base64::prelude::BASE64_STANDARD; use base64::Engine; use bs58; +use std::fmt; +#[derive(Debug, Copy, Clone)] pub enum Encoding { Base58, Base64, Hex, } +pub const ALL_ENCODINGS: [Encoding; 3] = [Encoding::Hex, Encoding::Base58, Encoding::Base64]; + +impl fmt::Display for Encoding { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Encoding::Base58 => write!(f, "Base58"), + Encoding::Base64 => write!(f, "Base64"), + Encoding::Hex => write!(f, "Hex"), + } + } +} + pub fn decode(encoded_value: &str, encoding: Encoding) -> Result, Error> { match encoding { Encoding::Base58 => Ok(bs58::decode(encoded_value) diff --git a/packages/rs-platform-value/src/types/identifier.rs b/packages/rs-platform-value/src/types/identifier.rs index 07bdcbd425..19bfbf82b2 100644 --- a/packages/rs-platform-value/src/types/identifier.rs +++ b/packages/rs-platform-value/src/types/identifier.rs @@ -11,7 +11,8 @@ use serde::{Deserialize, Serialize}; #[cfg(feature = "json")] use serde_json::Value as JsonValue; -use crate::string_encoding::Encoding; +use crate::string_encoding::Encoding::Base58; +use crate::string_encoding::{Encoding, ALL_ENCODINGS}; use crate::types::encoding_string_to_encoding; use crate::{string_encoding, Error, Value}; @@ -170,6 +171,29 @@ impl Identifier { Identifier::from_bytes(&vec) } + pub fn from_string_try_encodings( + encoded_value: &str, + encodings: &[Encoding], + ) -> Result { + let mut tried = vec![]; + for encoding in encodings { + if let Ok(vec) = string_encoding::decode(encoded_value, *encoding) { + if vec.len() == 32 { + return Identifier::from_bytes(&vec); + } + } + tried.push(encoding.to_string()); + } + Err(Error::StringDecodingError(format!( + "Failed to decode string with encodings [{}]", + tried.join(", ") + ))) + } + + pub fn from_string_unknown_encoding(encoded_value: &str) -> Result { + Identifier::from_string_try_encodings(encoded_value, &ALL_ENCODINGS) + } + pub fn from_string_with_encoding_string( encoded_value: &str, encoding_string: Option<&str>, From a646669c3951364b741cebaff8bcac6ae557c461 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Wed, 9 Oct 2024 21:50:03 +0700 Subject: [PATCH 55/90] refactor(sdk): contested resource as struct type (#2225) Co-authored-by: Lukasz Klimek <842586+lklimek@users.noreply.github.com> --- Cargo.lock | 13 ++++++++++ packages/rs-dapi-client/Cargo.toml | 5 ++-- packages/rs-drive-proof-verifier/src/proof.rs | 2 +- packages/rs-drive-proof-verifier/src/types.rs | 23 ++++++------------ packages/rs-sdk/Cargo.toml | 1 + packages/rs-sdk/src/lib.rs | 1 + .../rs-sdk/tests/fetch/contested_resource.rs | 12 ++++----- ...12bea6a47c9f7bf30133713b6b5cfec3a4d57.json | Bin 157634 -> 156167 bytes ...799af81392b7b0cbb7e86412da37ab13aef4b.json | Bin 95464 -> 94813 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216857 bytes ...26c1ffa6fb229b31c0802b1808d2c85dbc248.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...5bce08c84a0cf72b34f6a408982f7babce2c2.json | Bin 63476 -> 63473 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216857 bytes ...26c1ffa6fb229b31c0802b1808d2c85dbc248.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...d84b9984fd04a4ca40a146aea81c3ea5c39ef.json | Bin 48372 -> 48333 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216857 bytes ...26c1ffa6fb229b31c0802b1808d2c85dbc248.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...bfa6b1eff43954af904bce8f123fed7515132.json | Bin 50569 -> 50539 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216857 bytes ...26c1ffa6fb229b31c0802b1808d2c85dbc248.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...f67620695a23f63dc7376bd4a509e93335ce9.json | Bin 60008 -> 59999 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216857 bytes ...26c1ffa6fb229b31c0802b1808d2c85dbc248.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...ce28a227def58e23c39e0384e0cc02fe6360b.json | Bin 95489 -> 94838 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216857 bytes ...26c1ffa6fb229b31c0802b1808d2c85dbc248.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...d5387b9cca48a3062a4db8bf0341a839f2bae.json | Bin 62162 -> 59804 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216857 bytes ...26c1ffa6fb229b31c0802b1808d2c85dbc248.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - 36 files changed, 38 insertions(+), 33 deletions(-) create mode 100644 packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json delete mode 100644 packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json diff --git a/Cargo.lock b/Cargo.lock index 65e04a426f..fcaa082439 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -314,6 +314,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4fa97bb310c33c811334143cf64c5bb2b7b3c06e453db6b095d7061eff8f113" dependencies = [ "fastrand", + "gloo-timers", "tokio", ] @@ -1955,6 +1956,18 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + [[package]] name = "grovedb" version = "2.1.0" diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index 21ab0b978c..cf944603a3 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -5,6 +5,7 @@ edition = "2021" [features] default = ["mocks", "offline-testing"] +tokio-sleep = ["backon/tokio-sleep"] mocks = [ "dep:sha2", "dep:hex", @@ -19,9 +20,7 @@ dump = ["mocks"] offline-testing = [] [dependencies] -backon = { version = "1.2", default-features = false, features = [ - "tokio-sleep", -] } +backon = { version = "1.2"} dapi-grpc = { path = "../dapi-grpc", features = [ "core", "platform", diff --git a/packages/rs-drive-proof-verifier/src/proof.rs b/packages/rs-drive-proof-verifier/src/proof.rs index 89fef81360..0d7b23e05d 100644 --- a/packages/rs-drive-proof-verifier/src/proof.rs +++ b/packages/rs-drive-proof-verifier/src/proof.rs @@ -1379,7 +1379,7 @@ impl FromProof for ContestedResources { verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; let resources: ContestedResources = - items.into_iter().map(ContestedResource::Value).collect(); + items.into_iter().map(|v| ContestedResource(v)).collect(); Ok((resources.into_option(), mtd.clone(), proof.clone())) } diff --git a/packages/rs-drive-proof-verifier/src/types.rs b/packages/rs-drive-proof-verifier/src/types.rs index d49301720b..a40fefb98c 100644 --- a/packages/rs-drive-proof-verifier/src/types.rs +++ b/packages/rs-drive-proof-verifier/src/types.rs @@ -224,11 +224,8 @@ pub struct ElementFetchRequestItem(pub Element); pub type IdentityBalanceAndRevision = (u64, Revision); /// Contested resource values. -#[derive(Debug, derive_more::From, Clone, PartialEq)] -pub enum ContestedResource { - /// Generic [Value] - Value(Value), -} +#[derive(Debug, Clone, PartialEq)] +pub struct ContestedResource(pub Value); impl ContestedResource { /// Get the value. @@ -244,13 +241,9 @@ impl ContestedResource { } } -impl TryInto for ContestedResource { - type Error = crate::Error; - - fn try_into(self) -> Result { - match self { - ContestedResource::Value(value) => Ok(value), - } +impl Into for ContestedResource { + fn into(self) -> Value { + self.0 } } @@ -261,9 +254,7 @@ impl PlatformVersionEncode for ContestedResource { encoder: &mut E, _platform_version: &platform_version::PlatformVersion, ) -> Result<(), bincode::error::EncodeError> { - match self { - ContestedResource::Value(value) => value.encode(encoder), - } + self.0.encode(encoder) } } @@ -273,7 +264,7 @@ impl PlatformVersionedDecode for ContestedResource { decoder: &mut D, _platform_version: &platform_version::PlatformVersion, ) -> Result { - Ok(ContestedResource::Value(Value::decode(decoder)?)) + Ok(ContestedResource(Value::decode(decoder)?)) } } diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 4cd743c252..b5d33176b1 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -57,6 +57,7 @@ test-case = { version = "3.3.1" } [features] default = ["mocks", "offline-testing"] +tokio-sleep = ["rs-dapi-client/tokio-sleep"] mocks = [ "dep:serde", diff --git a/packages/rs-sdk/src/lib.rs b/packages/rs-sdk/src/lib.rs index 62bd9fea4c..7f18174610 100644 --- a/packages/rs-sdk/src/lib.rs +++ b/packages/rs-sdk/src/lib.rs @@ -76,6 +76,7 @@ pub use sdk::{RequestSettings, Sdk, SdkBuilder}; pub use dashcore_rpc; pub use dpp; pub use drive; +pub use drive_proof_verifier::types as query_types; pub use rs_dapi_client as dapi_client; /// Version of the SDK diff --git a/packages/rs-sdk/tests/fetch/contested_resource.rs b/packages/rs-sdk/tests/fetch/contested_resource.rs index 4f899c2126..950e141601 100644 --- a/packages/rs-sdk/tests/fetch/contested_resource.rs +++ b/packages/rs-sdk/tests/fetch/contested_resource.rs @@ -105,7 +105,7 @@ async fn contested_resources_start_at_value() { for inclusive in [true, false] { // when I set start_at_value to some value, for (i, start) in all.0.iter().enumerate() { - let ContestedResource::Value(start_value) = start.clone(); + let ContestedResource(start_value) = start.clone(); let query = VotePollsByDocumentTypeQuery { start_at_value: Some((start_value, inclusive)), @@ -217,7 +217,7 @@ async fn contested_resources_limit_PLAN_656() { ); } - let ContestedResource::Value(last) = + let ContestedResource(last) = rss.0.into_iter().last().expect("last contested resource"); start_at_value = Some((last, false)); @@ -231,14 +231,14 @@ async fn contested_resources_limit_PLAN_656() { /// ## Preconditions /// /// None -#[test_case::test_case(|_q| {}, Ok("ContestedResources([Value(Text(".into()); "unmodified base query is Ok")] +#[test_case::test_case(|_q| {}, Ok("ContestedResources([ContestedResource(Text(".into()); "unmodified base query is Ok")] #[test_case::test_case(|q| q.start_index_values = vec![Value::Text("".to_string())], Ok("".into()); "index value empty string is Ok")] #[test_case::test_case(|q| q.document_type_name = "some random non-existing name".to_string(), Err(r#"code: InvalidArgument, message: "document type some random non-existing name not found"#); "non existing document type returns InvalidArgument")] #[test_case::test_case(|q| q.index_name = "nx index".to_string(), Err(r#"code: InvalidArgument, message: "index with name nx index is not the contested index"#); "non existing index returns InvalidArgument")] #[test_case::test_case(|q| q.index_name = "dashIdentityId".to_string(), Err(r#"code: InvalidArgument, message: "index with name dashIdentityId is not the contested index"#); "existing non-contested index returns InvalidArgument")] // Disabled due to bug PLAN-653 // #[test_case::test_case(|q| q.start_at_value = Some((Value::Array(vec![]), true)), Err(r#"code: InvalidArgument"#); "start_at_value wrong index type returns InvalidArgument PLAN-653")] -#[test_case::test_case(|q| q.start_index_values = vec![], Ok(r#"ContestedResources([Value(Text("dash"))])"#.into()); "start_index_values empty vec returns top-level keys")] +#[test_case::test_case(|q| q.start_index_values = vec![], Ok(r#"ContestedResources([ContestedResource(Text("dash"))])"#.into()); "start_index_values empty vec returns top-level keys")] #[test_case::test_case(|q| q.start_index_values = vec![Value::Text("".to_string())], Ok(r#"ContestedResources([])"#.into()); "start_index_values empty string returns zero results")] #[test_case::test_case(|q| { q.start_index_values = vec![ @@ -249,7 +249,7 @@ async fn contested_resources_limit_PLAN_656() { #[test_case::test_case(|q| { q.start_index_values = vec![]; q.end_index_values = vec![Value::Text(TEST_DPNS_NAME.to_string())]; -}, Ok(r#"ContestedResources([Value(Text("dash"))])"#.into()); "end_index_values one value with empty start_index_values returns 'dash'")] +}, Ok(r#"ContestedResources([ContestedResource(Text("dash"))])"#.into()); "end_index_values one value with empty start_index_values returns 'dash'")] #[test_case::test_case(|q| { q.start_index_values = vec![]; q.end_index_values = vec![Value::Text(TEST_DPNS_NAME.to_string()), Value::Text("non existing".to_string())]; @@ -278,7 +278,7 @@ async fn contested_resources_limit_PLAN_656() { }, Ok("ContestedResources([])".into()); "Non-existing end_index_values returns error")] #[test_case::test_case(|q| q.end_index_values = vec![Value::Array(vec![0.into(), 1.into()])], Err("incorrect index values error: too many end index values were provided"); "wrong type of end_index_values should return InvalidArgument")] #[test_case::test_case(|q| q.limit = Some(0), Err(r#"code: InvalidArgument"#); "limit 0 returns InvalidArgument")] -#[test_case::test_case(|q| q.limit = Some(std::u16::MAX), Err(r#"code: InvalidArgument"#); "limit std::u16::MAX returns InvalidArgument")] +#[test_case::test_case(|q| q.limit = Some(u16::MAX), Err(r#"code: InvalidArgument"#); "limit u16::MAX returns InvalidArgument")] // Disabled due to bug PLAN-656 // #[test_case::test_case(|q| { // q.start_index_values = vec![Value::Text("dash".to_string())]; diff --git a/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/msg_GetContestedResourceVoteStateRequest_aaaa80ce4fdfc75252132a85e6c12bea6a47c9f7bf30133713b6b5cfec3a4d57.json b/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/msg_GetContestedResourceVoteStateRequest_aaaa80ce4fdfc75252132a85e6c12bea6a47c9f7bf30133713b6b5cfec3a4d57.json index 300e476a45efe82d06c6fbbc30d2a237fcb3ba55..822344f493ef34d65a9bc55fec3e59bbadcb629e 100644 GIT binary patch literal 156167 zcmeI*-;P$tl?Cv*_ER9Px!`NShTP5lXyyT;2oal%PzXdAdnStf?z7gZa&y3#uHVUY z1o4qR>~5$!`_Ec??Ok=+=I>wKxpVi&=Wo7$@%q)>-`)9pzU^<^zy3Pkef#>=+c(d? zef#vqclqt#Z%exD>cRbc*WX<3Kiqxu~Z_`-96al&jsNE|=Zzhr7q_*F4!jXt)0H zH}4EQ*!}+1!`+4l`zZGQJ>KoOJlQ?!;m-EsM-zcR{A}v(cdx(w;V;i$y?y%jZ-0IM z^wqP!JP&I5-M>70@#^mNsu!=md;Y)IfBM&FZ?fY*v-aO#efJ;F{`mamhbw=4_VS14 z-@k|dJ0{$@bJ+oY=guyq{L%egZtvXLN0L9h?2zu-hu4g{j_A&gb01oI&+O&0%WEID zL;IJeK3KeGz%RVqvuk_sJ1>8c|2NOS|Ka7xe$sVKnY+(kzI^>ZPhY(H_T>-XJ%9T0 z^|yb1{@v4Ouk!1U-@gquFJArk(;r{Ieg5=qR{kwp-@f_b`88fy^5*T+XDz}Y_2N%2 zp1;Yn{`5NQUj6X$<@LI6U;psx?T5el*Eg?!EDQR?&EKE$&!4{f>8pSH>hE{|>(6(8 z_xnq#BpG;cwS6Amy9ChY?{ewakMebXUHW|%J-qkmao4@SX}|Sh{`^y`uGc29!_3$B zLX1+S{|Yqu*TNItJtuC~-MV?dq15fK-#wzwx_|G{)xAgg;!%G;O7bq?@tplXAKrTs z*S3hqqn|w5ekTv!9Bn${Y|SN8S=Z(F8$!L9e{zFU@hG+Y=)t{5U*GJ`NK=yjv#p2k zqU(bmFFYa{85tT`-@I>>TS5k=%}jiHw599oEo1p-Quoc~=wFzq!Odct}g*8je}vCF_J@57q}J(wROQ`BaRZ zotv4sTYO!VznZ<>;$bT=(Bhi7vD|l79$ktwnMlYj!CxWAFH_W#{{&%n&WycrDO=W` z-wNI;b$v_yPZT#6+RnFH`DQ_Qc3TcunOi8miCxm$KvqO}7s%LRRF7Ao)-p+IBGlC_ zX>kEXtqAV*O4A#q5)+BNpBsDH4w3RC8AB^A6QR~HLE-oLsVu4AW*DKLRy3B)w{^Bm zD+~_4!gDT_2LDGWZBoLzt`9ln?NlThgEUlNmtddS-aJgHXs-9x0`ABS4`4 zx9U>;iGU!`jas%GP_`pmB2!YWZ3Ku#^;5PqiW_gGb~9VE8a0sIX0hsXquB27s9I}C z(%UFD-^j{=j5T}$CF=#0rb|@4{%Gru3DM`e6e}V=#UfEluSr(bMDYiw{gklGsLZ>|7&C)fOOnUZ4*I9+F5wDbK6VDpTA0A}HASPb422C5Vqw z;y@C+AXqEeB94`cTR4!ev7S1hm-%2Lcoh@E!v>DycehBBZ3xRt3qOnN2cfjhASl_H$4S3~iZb-VadR!1eujG>h~ za@#79D5&)mZcVICdK(a`r6m=WC!R3}+)Q;Hff9SR$P`!5as7cUJ^YHu*F*vlWhjDb zB3=>b>XM$XQ{7s9>7D{#QzRxP5IQp?v7}U(sCp⩔sa~!iqjTN-kM#vj}iR?{H5- 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 literal 157634 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 PAH4Ui{fqqZr=R~1ms`b@ diff --git a/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/msg_GetContestedResourcesRequest_8f71462d5f438e1b12fedf94ad5799af81392b7b0cbb7e86412da37ab13aef4b.json b/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/msg_GetContestedResourcesRequest_8f71462d5f438e1b12fedf94ad5799af81392b7b0cbb7e86412da37ab13aef4b.json index d9c45a55bb22d82b10cb63e2f1a12560c9cff490..01c11efc17f5bb335927feb3f588ca8923746bd4 100644 GIT binary patch literal 94813 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 literal 95464 zcmeI*&2C&rk_F&d`zZvixnNPGB=&Chjh+W+7>35u42-rZLzayh7=HIT=jOF|{U_y@ zXbP=y0Y#~b%%6x8Cr(7>rJx@_d-Uk>53k;Q_topW$A5YBV?Op9m+#)^)0eOB-oAP9 z<=Zd5dYNzkeH+qYS5Gc4-hDV-ULQW(KEMC){PzC+>DkTU!{ycC!?VNutE$Azz++)uwfEOokidjEsd!Ii7SQm4~l_Vr=e%)X6M=y@{JwMDi-5!>@KJ5McW{<$8%$i#>FY8LpetK_2 z*E(I?JiEBrzL`Y4_jW9D{PX(aHg;|9j&*Nuw(n%s&B|gCOS@NK%D4`{to=1%|H%g| zN*>(AsHZjRgXRp3g80vSUEjNQb2%|TSPX0i-ka%l@#cP=KvbJy62e;b5|7~O%oda3p-aC5rNBwyFGuw*q zFT=UTd9yQEY;%83jssCnQTjhLufBJa`d@ELkFw>!%HK<%!}8ts7cdsP&6+>XzvJ}r zzBVKy-o;{1?9z0P!!c67+9HzvzC=0f7Ha$<6o+9$VFty*ulXq-X2M~Yu79${Z=OtK z;$e&CN;3C@{QT9Fq}Nk0tPsf-BXQ?Z?RZ&#_qv?=oqX8K$HCoL$lnAmN`*XZAVe1GvS3Hlgi>s=U&=03b;T;-5W+X;+Ph{8wMz7d#c<=T@jS5*z0zqFhbhS}BOy+C>coI`u`;r(R=sSAi9v zc>PWDiQe@hRuQR0!@Iur1`C0R&PeQ<7coqAgJL(fK&)DcWJ(#LHDXlNdBOCmJ%SF| zoh>AMT|bU%HyGvjDd5EhtU3~3NN+=0_Cm6|_Dpl5f$$Qu;Bu#kVTpofw|T8fKGcBf z5$V8CewBiS6Lf$TI;9vl zkR<5hB8>P3KBaU?vH7QNX-N{9#5-3w`TYR?u#$PVE-`MVoKq$T{7by7^{ z0c1?#qqu2<6MZj;6&7MLCSw+-($n$rLdtHZBvT03Oo>oP4J}GJ7m)kOFSM$@h*iZ3 zv$&26ycx_9O!c8HQsBgkdMzle#4h$r>{_FV8;OE<4yA_zOXCBqNb3%)c5&D%Dz-%_ zj!-xRrG0&3Y}OZif+VZiCSI8`qe4=5GReX(j%Hl&ClkDPN_hV zM#U<0Byb4LA#E{pT8d2r>RZ>}4P!c~xm!AtM ziN0hDN`zoVl2v%6(2Q_s;&%(jil#I*f))DGDZ=@MvkzM(-Bcmc222@(sZoYV(X7;q z%MAgQhJ+Y5iYhG9lp zJl)qS?9X>c=Hb;?55c7SB`g+oL1Nbo!oaO0#o8{SIn^jB^du{xpitIA!g(32{TjQJNO8Gagi$i35t3&- z2SQQ8UZN(YLn8(TsD&mcKuN-e9)xYfha_qEP;5IT2#buwsv;~?x{IbcK6-21vy0@^ z7_UL8@515kvW3zzB~v`v8=Cow7B7gvF=;`9688nFpbFJ6O8E>H-y6gf1#x5qT?tus zQQVUzGJZHhz9&J5SKT5(mvD4SA}H{73Z~(FYGm>G!6gPd+bBPn@daOyEKvi#DCYvV zJ4Lo=2rw5qC9IHLY8CcKof3qlx35*GoSl-oEHc>fVpSc%xDR-Vx*2RlJSAJL8sz19H*q)l2iq@woPL@bbyM>@O^%ZhFgH@ z`f;4fO2RF`sy!L65SjhSZaIu(aa%tj&{j5EU`7;G;a)XOqFh!a5Cl}b7Vgy~(oCro z8iL_3L8_IjHAq~jNr4nwvd)t9To^wLGf^64g`^Tso#7HOyi(~MOMMrTcYJs*5vgG~ zzV%V2#Hvm~LFg1Y84aG$l=>ddqhTE{Vpzi>Zh}}1)3^vvYK)2lR*kZq^mb5JrXbVwI|gBuKp$plW~EOJ1k!QktVZEw~7g*`MsD(@JEG z@JR>)k+_icH6t2j;a)XOyeKO^vSO8Y^OQoM#D zQ3F2`jY2kdp>)n*f@t4jp<|T83jsy#EA<-;{1+InAw<%VLr(L>w}>S7ef0 zof6f;-oA#3`)w8Q3SxI(Vpm}yM}n24i~?0`W0Dl*P6f)}eqkTfSHfX3tcyGay|q=tA+vEJts?lC2Aw(jTNZ9^#Y$YTv>Z^c0* zW!R%#Xy`!<>3EUTogw7-LM%cmDJ3Mld#u%KEVUMe1^SH>fmED2zR-I|*-)m!D0V+2 z5g8dgq+ObQ<27IDhLVV3J$HzV43o$a8oUD~5!`t~CWMHqY^+$-ZQMK$HE<>WO_ne4HucJW@0DYUDD)G z){hFVhAkXse_Dx*3}NhssH{z5oHDq+YT4uPwr%1Z=fpF)O-a#CvVF01|F zId=Xn8I*mYhh$$D7nC?D)E>>#@L`aAzPK!$J-1!xlo6mPiArxx?M#t7kOGCNT^BM- zlCF+mJJBh5kv<1rNu{ozR1$=Fe6m~CAG|d$;5I`m6FFW5HR zsYjx0yBAW$c6ddfGi6>zNcp>R{1unAiRu=KHA2+b2}FDB2q=+);R59m+28d^FrynH zeR~v8`5Oh9@^QG)SPNG5T^&Jq6Kf7fOwtG@Ple$Nj++#uOh_PTFnQXtE0&O(=fTH+ zg&nGN7 zm>pA?A-TBF!(&J#-F_IwzGr>$y*yV9iR@@Z;)o_-a#nW9U`yBq$H&#s^mQ=>!Um7j z6Z(})NWbJots*)}lr>N50)}8=i}*`<-Hev{HC)J_rnGo}+x0h+%OWebT z+|-yZ&uK7rWtsvHJ>FnUj6|+!FcH4&5=+R<^Wfu6#Tkt=8b<_<@6X&gqj5yw_}=uH zTB(RXwIWg}+A}XSoOGM9(8=e7OAw`P))JW>GWQI0$Q?%>H7xy=Olfl)UoJ29zAA*mERBg;mo zq@FOU#0aTq7rY+aNjqOGLZoaV#8C0CN#QERZZKScYOIk|yx20 zSxP|f?ufUspHeAadunLH?%^QEljEec$dCd{_M{J_@k2Q!FNX4S_6a@8jijE|BXN9B zig{U+#f=i$JALBgjXB{zl@b|j5~Qa^DNlsSdGPTT<&4G|jUxib_h)YWsnDQG!QxMC zo|K`U6Q$MJyCXSh^nOMfn080$3AIJn5}94j7pm|5&p}51CU(kgJyWlA^|6YQB8;M@ zDD*gAs80SrKIxNH5F~aLgq*?U5Ld=-5wsgH*`n*m3z4Z|5@%ENQ{WoeM5?||k-}lw zgsGRsE!>jLUmz_6jr219bYKNawFGR%NC{UmVlH>G+6T}_M70uWf7=GO>bXw z?JQ9kTM#`MrFb3EPTw*$%8?oofpSSSvr&+YXrO8R*n`iD>$SMt@qQcJS>njpg*3K~ zOJ47ekOu0rm4st^&6BX$Drv=QI*AaT&7B1WkjnTGwg@Xq3}S^kPA;GCV1IK)BUv~P z{!?8;ox^<&_Yr~P`~Uac&_)j05chxZ^%17j3xEUl<<~#J|d`yWeb#%#!+iG*5V?T z=xZqPiGapY)0`MmdI&?pjTM=F&@E_jJc%e7=D}yCiJKJD^WZ<#70@}{=WrhpIKDq~ zq7fAbEl(zFA@HSSF z7ddoLQ#4LD8imY~6Twc8c?QO1JPP%^iKk%g+k1~k$H1HmBz8Rng(1kO&cZ1)zUwc9 zW8ta?;VM>n33c}=LS4%yNxd2q0d$5?Y9!WlIMqDry%2hx@x;IamF(8*l+2QB-Lp@o z)G)0welb$Gh_Ol7@Cq+}>x=HP@H{KNs7j+@T^|Wajz@4-c%@$BmE%z91u-H0+;>rG z`Nd{ImZCP2m*U^6{qSJZs8M-3^$MITSg>pwpNM4|#Hd-u#trm-DrtXp{xXVJrmWb0XL98#4#DeV4 zJBTd}JqD###dl5KB}b^jnmAy&uh;1E0;vYJ^U9F%D~2HtOG1S!k|;SydC`id5CuU-Tw*`iah4{x6=O?cOr*wv%}C0BNhLT2F<8sGI%4Ted?kWN9k zid9}h-F=Es*Rn}cuf{~o(f-&&;nUbr5@m6+f9I-{iJ-JIa9a60KILAoxfTlR!f!?D zGl*v&>F zl!3fXEEXEbV1-s0J>oU#bBqxN?sU>{lS$GPQDv#8o6^oh+9@fK2vK(tu6F$e!-j41 zf`i>-tJg}Ha=ZoL> z{#%=&EhS-2{hAt?B_u4PBsG+N_2PW-JNX}+B^Gi~Tx?Mdc2WsLI_1xH@r##}BZ=&y zBeBj)uC|)jIiG6m@HVXB_Hs|{!C+MWgyUx-f{qs}QnmrF=xw|v#~bm8q2%~Jg&c9L z6x#wz;fv#GsIb-Pc-f_caSLKd)^BRit!b2##&5DfUN?5+^@2$WH*KNK^TLgKypU9F z>@uFbh*fgx=@xR=&Ev)REPnb>*Ks@PUG6qdPxAFFU#EQabKYOxUfkZ~uj`B3{$#v; z67hL{kq-7YBR^!oyGD19&io~6piXZrLfS1bQ#vIDS|q4)9f?pHD3h@i#vV2)`K8Ut z78I!Ish+q6rTiWXB?)GIcUh>0nI*oLga~iPXBVMX$1fZxq`=iGM7UG%;by0Vz#94x z65(n=5m{!c1S|2P5!9gT9hCpVLm)C>TU}a2-t&^;)zZ|j7O~4wt)7k=)>?LXx>&1P zWu@??tW?cQ{3X5i_-lQLRmie=ncuyh>@~KS2USwXcs*}VAyPQBUH`ei)=O!WKxJEbRER7DyAA6uBy~*c{d-p20HbKVu7gA;ctW*XJC=GKlZ5J>lAJ}VK=z3-N~a1S3W(O<;;EV( zJhib=FOoqc*3(tBy_3YEUT3`cUX$<$)(Ad)p4Jifol>PSo(D-cUvN_fWJyAVu~F}u|j2Rf@m6sD&k9nxQU}7jLF_zki$D$#FstvIwc*yOeq@|?o*P# zq$-KKjNg6NOqob4c{cRNzu0ifGoq{hzQa{&+u<2eoeY}qwc~WvO87g^uYTtTzxdYv KA%A`T)BgcoLAovg diff --git a/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 808b4f01189bc76a5960f835750320fe8eb70b21..b0fd7fd2be28484d3236142bfeaf40d55aba1928 100644 GIT binary patch delta 2577 zcmY*be{7WH9nbsY?q~xPEl?Wfdabb;_1=4*_kHhu5NDq=}LmQ2Kw$yh+QRn*fBb7v?iVu==dtG1Dz zvl{r~F0-C4TEUl7YA^oc(E3<1h$TI>g5Axf)2()f@499*&@p?booK=8ua?xzG=wG$ zPMX!&&eYaSIgxH|0X%`qx8+4PT1dVy~~W;i(Z)`H>F)Do9+=Mt2UhUw~0 zUGkSF_|YCqXFFcu&~$s4?mD8gt?9M|=eFuvxbb~M(EVpziuw^=s4%hjvf$!btl|f) z*tm`!XcW}GJg$iR3r3QS*53o&EwQY64g&xbrLxex;vs_+r6~*QItO)PE+xG&K!a;`$)ggMLQ&4uZP47D{Eo+MN>^;C}S)HIuovwtDzgKU@ zDB2v*CmB!mcx+SySlrb_lcPRO-(i!xN@IYiW36F+c&inoH?KRKuQ9`Ptis^~i}*3@ z$5n(sHK3+G%+cs>o18X>(usi24p}LxSm|=z z2d1aciBEVqgrD1_z>vteG_oqe(~nC;F^13(63&JKxo~$xlT~{O{Q$+at8tG7ly;)9EJlNIQtdTr3Yr> zifL!Mgak(Q&P#hN0FIM8-!)x5yWF`5kA{G5y29qatu+M~I#uCedZGTLDlc8@^Yjg) zi7K1atog`RaI?^}p1$qJz`6+MFM>5WkYxI@%QrKc5{Ac*cUnGEKgghXFxv_qJp4P; zlbTSi^WiKwI%fp*reA{sn{9q)7|EY( zDa}j{5hCEmeyldNxitGmgp0pLy4z1B=#PC46>2OpEWHAIg_QG4 z58)gRYu=n_la?ao+rQ>+&dp)@WVet)WO*hJ76Uri9dPsmaHANw z+_k~_IkhKlv8l5EDw3PY6#sJrut1oA4mg1p@#4yWhSzHC-pFVU(U;c1>S6!VmbC*Y zeu=ul z?c`3sM=!fR&8~>kWHmxw7YdyGet;v5aAO*fNi#U}RrnrkU6#bT3D~2OwZ0c{-7H|` zR?n8^E$GCs0*=0O%Av_RN8jNz+lKD0sJCCR9~u+1;)(`sU#(BYkA%su1KL##_(cB~@t!)O=Yks$xezw1+=b6Vb!IZjMu*kM zgIlcQG7JTWa0j&l(fpw>t$s&RC?dt^vp<2`Vo%zNmuDp@BUS&KLCZrq#vFDj6`=eS zoo(}Y6dyyBZw%9DWfQ%)RIvMX$QmQ@>G^uWyYb1Qo$++H;E#t&6uuUAxp%#GM=C4s nKd^c@-}p8NbWOqn4b`RZ^5kYr@6(l@jZZ$I+j(T0_2d5nOe~Zp delta 3064 zcmY*bdu$Zv5!XKM&OGnT!;UTE7!w|6@7{j9dv`WA_ML-c0@&b4MJZ|1nktSOBI={4 ziYg`aC{iLNJe*8)6ITYGRH@B_2otN+B~@{&rV&c14ODFvQDP!gl_)K?A{DiT(wXnu zJKDc6x4Yjr^Lx#VoLuta+s>e0{)P$X`z_}Jp z6fWy=9RH_oLblQ7ccI~36K7Xa?INey5Tjpn=)va=K5VKJs>IQ_n5d0j2yy!w0UdSV z!4400xGwCg^R*OQ%6fQko8jU2I_V4s>Ffd@I_eZq-|D8ixrkSj4j&lCj&8#)Ukv%} zVf;~(W^;kE9ynIxU@U6*uMq*O1Q8H0VdMMFgf~NZzrFF_6H7;Q$r9umJ$Sn{DLDXs za-!D|aIMvn7sJ_F8waAq){}1rADmqf@OPT%gaOCG*!PK=e#`I~bGR3`A=4eg&>dZN zrcPGf_^@VF;PJoej-E;r2!l8?pbaub*#92APK^;~Rtawbf2)u{pjbv%eEJ1xjV^@T zg$QK##U(@^uk^9XH9S4#E`2czUJb;?z$xlGZ}f+^DB82xEJTk-+zF>JsNd zAHmEmKXZ=m&UB|`+tiIH9MPMhqcPCnfhxmi8Ss6Yz)La1gAX2Xpnrwz7)Sf4WC=0k zJs53E!b=T4zI&dOG*O#`2NwOG4Tx!Zt}Mod6A9mlv4yo;|gQE`fUp(weT9uvS!!9__GJkVRS10I zO$q?E93fs726KNtaj7#W+ zCT=-{ky5E(w{z)9xK~NU)|&VW_RYNwMv{Fh;Dw_?OT+$22a7l8hMBrBUWpOdWa+|p zl$`J)2VMi|DVHH{Zhb>f7k2TxSw7LF&-b(^vG@nQ3CFXfN~suTl2lKwQB0C@pqLeW z0pzmM$FQVIrNNat55}@d%y$xLie<%iU_u{ZPIF71ft{a}8R2;0GuWMFrKE7}R^5dk zqM|5PB{R~)J+0LAIkGdpLKw)4rnWgakTDW0I=n*;CC!-lTZ(e&6ao`Pv(b#v9?gU4 zHp02h2t&F{0N0$&2tEZr@(IYyZimH|kR1+HlOhNKe#+?K`42S#e{NNg$RWhpLcv!e ztSKx_ztr~N`5RKTiNn*~FHLuAKb`K@uU*ID2U-OC_Y?k{7Wi}@XVf;;#jhSJ;VR%J z2q}-@wqROG%k{5_6voJUpM2)R(o9-vP|lj&6{@7kwF0KARjR5u0PWu?a5mXER!vvs zs(h&z{OU#W+CYk8cd}WHjO;REjbre5QxKplzNQOGw63Zojyyv8ok~jQ;A|JcesYzB zMdn@Xu>@|hjkkFa!iy_h$S(*LJ_`m%?`Fv#)8gSR%V_4Oc=|j&rb&lm9!afMlmc)| z2SIdnSo}}DgPL!+L{6FqrblJCoQ$d_o}AY@9jIQUYMWdufu$bykezva z(l}RbV==940zENHd2i|<4d85*&|08!Nh9vHDK-0&#+PyFdL=X77z7k2RdJMfiZ+@7 z<#>X_s~wp^_+%UP746k59N1`>__HppNv1`OtEL}(eUoDN(GG$(`mql$+;H#*opb|} zusK$?d3p7)Aog+#_OGIh&v$8(BuXvbLiTQ;;ijfDg$@m5a2y+Mhka6^fT2lZq%@ML z%M|3F6DmV36>ejdg2n)ot;IbUi3fw_$`hn^j<|nhiHMB}ftO=+QO#l-ijPKcX-a96 zbbLLoc{sd_4hZHR8h0pKr@IB_mQkrxlgoOB{9+qVr0LiPJH815@L}Ik;5$4p6BwIN^Fel3N@WM;A|`}CDr;Asnx~D16R0*Sg~LXniE>YGlgk(z zn1enyPwde00QsXTux^6-Y}Z;^lycf`xzbQu>hQN>|Fap=l0<16WFs9%)9w^0iRcK! z*7d4bS_E1!n3WMIZuMYj-Y?8i@&^kaX_2lcG|GZIxW)J}4qv7)W-+tgbL&YG)XQsY zXjESH;qwXt**0`EoIycz)D9i)-Nu5y0!rXG&#xjNp{Q;na SKLPdX@-=Ly9(-emap=Ex<3oP{ diff --git a/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json b/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json new file mode 100644 index 0000000000..635ffb325f --- /dev/null +++ b/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json @@ -0,0 +1 @@ +9192c1fc0db514525cac97f9afc0bd811b64d9cfbe81c62afdc4568238bb27e72fa397498db6a0869b4ff55be912edc3 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/msg_GetContestedResourcesRequest_25a3f1603510228a22726e0b4c35bce08c84a0cf72b34f6a408982f7babce2c2.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/msg_GetContestedResourcesRequest_25a3f1603510228a22726e0b4c35bce08c84a0cf72b34f6a408982f7babce2c2.json index bbfdee7b8e0a8cf65ae5a436d3e9129562e0f422..d672792464ac922480cd785141a4609975b00489 100644 GIT binary patch literal 63473 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

0G;;X-;tB)7mgO%Ne3LJktWcADan2pu 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 808b4f01189bc76a5960f835750320fe8eb70b21..b0fd7fd2be28484d3236142bfeaf40d55aba1928 100644 GIT binary patch delta 2577 zcmY*be{7WH9nbsY?q~xPEl?Wfdabb;_1=4*_kHhu5NDq=}LmQ2Kw$yh+QRn*fBb7v?iVu==dtG1Dz zvl{r~F0-C4TEUl7YA^oc(E3<1h$TI>g5Axf)2()f@499*&@p?booK=8ua?xzG=wG$ zPMX!&&eYaSIgxH|0X%`qx8+4PT1dVy~~W;i(Z)`H>F)Do9+=Mt2UhUw~0 zUGkSF_|YCqXFFcu&~$s4?mD8gt?9M|=eFuvxbb~M(EVpziuw^=s4%hjvf$!btl|f) z*tm`!XcW}GJg$iR3r3QS*53o&EwQY64g&xbrLxex;vs_+r6~*QItO)PE+xG&K!a;`$)ggMLQ&4uZP47D{Eo+MN>^;C}S)HIuovwtDzgKU@ zDB2v*CmB!mcx+SySlrb_lcPRO-(i!xN@IYiW36F+c&inoH?KRKuQ9`Ptis^~i}*3@ z$5n(sHK3+G%+cs>o18X>(usi24p}LxSm|=z z2d1aciBEVqgrD1_z>vteG_oqe(~nC;F^13(63&JKxo~$xlT~{O{Q$+at8tG7ly;)9EJlNIQtdTr3Yr> zifL!Mgak(Q&P#hN0FIM8-!)x5yWF`5kA{G5y29qatu+M~I#uCedZGTLDlc8@^Yjg) zi7K1atog`RaI?^}p1$qJz`6+MFM>5WkYxI@%QrKc5{Ac*cUnGEKgghXFxv_qJp4P; zlbTSi^WiKwI%fp*reA{sn{9q)7|EY( zDa}j{5hCEmeyldNxitGmgp0pLy4z1B=#PC46>2OpEWHAIg_QG4 z58)gRYu=n_la?ao+rQ>+&dp)@WVet)WO*hJ76Uri9dPsmaHANw z+_k~_IkhKlv8l5EDw3PY6#sJrut1oA4mg1p@#4yWhSzHC-pFVU(U;c1>S6!VmbC*Y zeu=ul z?c`3sM=!fR&8~>kWHmxw7YdyGet;v5aAO*fNi#U}RrnrkU6#bT3D~2OwZ0c{-7H|` zR?n8^E$GCs0*=0O%Av_RN8jNz+lKD0sJCCR9~u+1;)(`sU#(BYkA%su1KL##_(cB~@t!)O=Yks$xezw1+=b6Vb!IZjMu*kM zgIlcQG7JTWa0j&l(fpw>t$s&RC?dt^vp<2`Vo%zNmuDp@BUS&KLCZrq#vFDj6`=eS zoo(}Y6dyyBZw%9DWfQ%)RIvMX$QmQ@>G^uWyYb1Qo$++H;E#t&6uuUAxp%#GM=C4s nKd^c@-}p8NbWOqn4b`RZ^5kYr@6(l@jZZ$I+j(T0_2d5nOe~Zp delta 3064 zcmY*bdu$Zv5!XKM&OGnT!;UTE7!w|6@7{j9dv`WA_ML-c0@&b4MJZ|1nktSOBI={4 ziYg`aC{iLNJe*8)6ITYGRH@B_2otN+B~@{&rV&c14ODFvQDP!gl_)K?A{DiT(wXnu zJKDc6x4Yjr^Lx#VoLuta+s>e0{)P$X`z_}Jp z6fWy=9RH_oLblQ7ccI~36K7Xa?INey5Tjpn=)va=K5VKJs>IQ_n5d0j2yy!w0UdSV z!4400xGwCg^R*OQ%6fQko8jU2I_V4s>Ffd@I_eZq-|D8ixrkSj4j&lCj&8#)Ukv%} zVf;~(W^;kE9ynIxU@U6*uMq*O1Q8H0VdMMFgf~NZzrFF_6H7;Q$r9umJ$Sn{DLDXs za-!D|aIMvn7sJ_F8waAq){}1rADmqf@OPT%gaOCG*!PK=e#`I~bGR3`A=4eg&>dZN zrcPGf_^@VF;PJoej-E;r2!l8?pbaub*#92APK^;~Rtawbf2)u{pjbv%eEJ1xjV^@T zg$QK##U(@^uk^9XH9S4#E`2czUJb;?z$xlGZ}f+^DB82xEJTk-+zF>JsNd zAHmEmKXZ=m&UB|`+tiIH9MPMhqcPCnfhxmi8Ss6Yz)La1gAX2Xpnrwz7)Sf4WC=0k zJs53E!b=T4zI&dOG*O#`2NwOG4Tx!Zt}Mod6A9mlv4yo;|gQE`fUp(weT9uvS!!9__GJkVRS10I zO$q?E93fs726KNtaj7#W+ zCT=-{ky5E(w{z)9xK~NU)|&VW_RYNwMv{Fh;Dw_?OT+$22a7l8hMBrBUWpOdWa+|p zl$`J)2VMi|DVHH{Zhb>f7k2TxSw7LF&-b(^vG@nQ3CFXfN~suTl2lKwQB0C@pqLeW z0pzmM$FQVIrNNat55}@d%y$xLie<%iU_u{ZPIF71ft{a}8R2;0GuWMFrKE7}R^5dk zqM|5PB{R~)J+0LAIkGdpLKw)4rnWgakTDW0I=n*;CC!-lTZ(e&6ao`Pv(b#v9?gU4 zHp02h2t&F{0N0$&2tEZr@(IYyZimH|kR1+HlOhNKe#+?K`42S#e{NNg$RWhpLcv!e ztSKx_ztr~N`5RKTiNn*~FHLuAKb`K@uU*ID2U-OC_Y?k{7Wi}@XVf;;#jhSJ;VR%J z2q}-@wqROG%k{5_6voJUpM2)R(o9-vP|lj&6{@7kwF0KARjR5u0PWu?a5mXER!vvs zs(h&z{OU#W+CYk8cd}WHjO;REjbre5QxKplzNQOGw63Zojyyv8ok~jQ;A|JcesYzB zMdn@Xu>@|hjkkFa!iy_h$S(*LJ_`m%?`Fv#)8gSR%V_4Oc=|j&rb&lm9!afMlmc)| z2SIdnSo}}DgPL!+L{6FqrblJCoQ$d_o}AY@9jIQUYMWdufu$bykezva z(l}RbV==940zENHd2i|<4d85*&|08!Nh9vHDK-0&#+PyFdL=X77z7k2RdJMfiZ+@7 z<#>X_s~wp^_+%UP746k59N1`>__HppNv1`OtEL}(eUoDN(GG$(`mql$+;H#*opb|} zusK$?d3p7)Aog+#_OGIh&v$8(BuXvbLiTQ;;ijfDg$@m5a2y+Mhka6^fT2lZq%@ML z%M|3F6DmV36>ejdg2n)ot;IbUi3fw_$`hn^j<|nhiHMB}ftO=+QO#l-ijPKcX-a96 zbbLLoc{sd_4hZHR8h0pKr@IB_mQkrxlgoOB{9+qVr0LiPJH815@L}Ik;5$4p6BwIN^Fel3N@WM;A|`}CDr;Asnx~D16R0*Sg~LXniE>YGlgk(z zn1enyPwde00QsXTux^6-Y}Z;^lycf`xzbQu>hQN>|Fap=l0<16WFs9%)9w^0iRcK! z*7d4bS_E1!n3WMIZuMYj-Y?8i@&^kaX_2lcG|GZIxW)J}4qv7)W-+tgbL&YG)XQsY zXjESH;qwXt**0`EoIycz)D9i)-Nu5y0!rXG&#xjNp{Q;na SKLPdX@-=Ly9(-emap=Ex<3oP{ diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json new file mode 100644 index 0000000000..635ffb325f --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json @@ -0,0 +1 @@ +9192c1fc0db514525cac97f9afc0bd811b64d9cfbe81c62afdc4568238bb27e72fa397498db6a0869b4ff55be912edc3 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/msg_GetContestedResourcesRequest_80ba1d11caa6442b39ab0f05e7fd84b9984fd04a4ca40a146aea81c3ea5c39ef.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/msg_GetContestedResourcesRequest_80ba1d11caa6442b39ab0f05e7fd84b9984fd04a4ca40a146aea81c3ea5c39ef.json index f4c8ab177bb3090cbc9f0600a8ebcbfc0d1f3bab..a95169e68c55090f4d1ed40df4d4038ea90fd211 100644 GIT binary patch delta 4161 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 literal 48372 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 delta 3064 zcmY*bdu$Zv5!XKM&OGnT!;UTE7!w|6@7{j9dv`WA_ML-c0@&b4MJZ|1nktSOBI={4 ziYg`aC{iLNJe*8)6ITYGRH@B_2otN+B~@{&rV&c14ODFvQDP!gl_)K?A{DiT(wXnu zJKDc6x4Yjr^Lx#VoLuta+s>e0{)P$X`z_}Jp z6fWy=9RH_oLblQ7ccI~36K7Xa?INey5Tjpn=)va=K5VKJs>IQ_n5d0j2yy!w0UdSV z!4400xGwCg^R*OQ%6fQko8jU2I_V4s>Ffd@I_eZq-|D8ixrkSj4j&lCj&8#)Ukv%} zVf;~(W^;kE9ynIxU@U6*uMq*O1Q8H0VdMMFgf~NZzrFF_6H7;Q$r9umJ$Sn{DLDXs za-!D|aIMvn7sJ_F8waAq){}1rADmqf@OPT%gaOCG*!PK=e#`I~bGR3`A=4eg&>dZN zrcPGf_^@VF;PJoej-E;r2!l8?pbaub*#92APK^;~Rtawbf2)u{pjbv%eEJ1xjV^@T zg$QK##U(@^uk^9XH9S4#E`2czUJb;?z$xlGZ}f+^DB82xEJTk-+zF>JsNd zAHmEmKXZ=m&UB|`+tiIH9MPMhqcPCnfhxmi8Ss6Yz)La1gAX2Xpnrwz7)Sf4WC=0k zJs53E!b=T4zI&dOG*O#`2NwOG4Tx!Zt}Mod6A9mlv4yo;|gQE`fUp(weT9uvS!!9__GJkVRS10I zO$q?E93fs726KNtaj7#W+ zCT=-{ky5E(w{z)9xK~NU)|&VW_RYNwMv{Fh;Dw_?OT+$22a7l8hMBrBUWpOdWa+|p zl$`J)2VMi|DVHH{Zhb>f7k2TxSw7LF&-b(^vG@nQ3CFXfN~suTl2lKwQB0C@pqLeW z0pzmM$FQVIrNNat55}@d%y$xLie<%iU_u{ZPIF71ft{a}8R2;0GuWMFrKE7}R^5dk zqM|5PB{R~)J+0LAIkGdpLKw)4rnWgakTDW0I=n*;CC!-lTZ(e&6ao`Pv(b#v9?gU4 zHp02h2t&F{0N0$&2tEZr@(IYyZimH|kR1+HlOhNKe#+?K`42S#e{NNg$RWhpLcv!e ztSKx_ztr~N`5RKTiNn*~FHLuAKb`K@uU*ID2U-OC_Y?k{7Wi}@XVf;;#jhSJ;VR%J z2q}-@wqROG%k{5_6voJUpM2)R(o9-vP|lj&6{@7kwF0KARjR5u0PWu?a5mXER!vvs zs(h&z{OU#W+CYk8cd}WHjO;REjbre5QxKplzNQOGw63Zojyyv8ok~jQ;A|JcesYzB zMdn@Xu>@|hjkkFa!iy_h$S(*LJ_`m%?`Fv#)8gSR%V_4Oc=|j&rb&lm9!afMlmc)| z2SIdnSo}}DgPL!+L{6FqrblJCoQ$d_o}AY@9jIQUYMWdufu$bykezva z(l}RbV==940zENHd2i|<4d85*&|08!Nh9vHDK-0&#+PyFdL=X77z7k2RdJMfiZ+@7 z<#>X_s~wp^_+%UP746k59N1`>__HppNv1`OtEL}(eUoDN(GG$(`mql$+;H#*opb|} zusK$?d3p7)Aog+#_OGIh&v$8(BuXvbLiTQ;;ijfDg$@m5a2y+Mhka6^fT2lZq%@ML z%M|3F6DmV36>ejdg2n)ot;IbUi3fw_$`hn^j<|nhiHMB}ftO=+QO#l-ijPKcX-a96 zbbLLoc{sd_4hZHR8h0pKr@IB_mQkrxlgoOB{9+qVr0LiPJH815@L}Ik;5$4p6BwIN^Fel3N@WM;A|`}CDr;Asnx~D16R0*Sg~LXniE>YGlgk(z zn1enyPwde00QsXTux^6-Y}Z;^lycf`xzbQu>hQN>|Fap=l0<16WFs9%)9w^0iRcK! z*7d4bS_E1!n3WMIZuMYj-Y?8i@&^kaX_2lcG|GZIxW)J}4qv7)W-+tgbL&YG)XQsY zXjESH;qwXt**0`EoIycz)D9i)-Nu5y0!rXG&#xjNp{Q;na SKLPdX@-=Ly9(-emap=Ex<3oP{ diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json new file mode 100644 index 0000000000..635ffb325f --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json @@ -0,0 +1 @@ +9192c1fc0db514525cac97f9afc0bd811b64d9cfbe81c62afdc4568238bb27e72fa397498db6a0869b4ff55be912edc3 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/msg_GetContestedResourcesRequest_5396ff2dd55051d854e18e406fbbfa6b1eff43954af904bce8f123fed7515132.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/msg_GetContestedResourcesRequest_5396ff2dd55051d854e18e406fbbfa6b1eff43954af904bce8f123fed7515132.json index 827e98aa3b6d58e89039a4069cbaf976426b9fb1..dbc1e576a813171b37e5c8f55d2d5783e14b440c 100644 GIT binary patch literal 50539 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 I<)=^o1=y>6TL1t6 literal 50569 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 SKEL|HFFyHEf0I9c`|w}#mV*lb diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 808b4f01189bc76a5960f835750320fe8eb70b21..b0fd7fd2be28484d3236142bfeaf40d55aba1928 100644 GIT binary patch delta 2577 zcmY*be{7WH9nbsY?q~xPEl?Wfdabb;_1=4*_kHhu5NDq=}LmQ2Kw$yh+QRn*fBb7v?iVu==dtG1Dz zvl{r~F0-C4TEUl7YA^oc(E3<1h$TI>g5Axf)2()f@499*&@p?booK=8ua?xzG=wG$ zPMX!&&eYaSIgxH|0X%`qx8+4PT1dVy~~W;i(Z)`H>F)Do9+=Mt2UhUw~0 zUGkSF_|YCqXFFcu&~$s4?mD8gt?9M|=eFuvxbb~M(EVpziuw^=s4%hjvf$!btl|f) z*tm`!XcW}GJg$iR3r3QS*53o&EwQY64g&xbrLxex;vs_+r6~*QItO)PE+xG&K!a;`$)ggMLQ&4uZP47D{Eo+MN>^;C}S)HIuovwtDzgKU@ zDB2v*CmB!mcx+SySlrb_lcPRO-(i!xN@IYiW36F+c&inoH?KRKuQ9`Ptis^~i}*3@ z$5n(sHK3+G%+cs>o18X>(usi24p}LxSm|=z z2d1aciBEVqgrD1_z>vteG_oqe(~nC;F^13(63&JKxo~$xlT~{O{Q$+at8tG7ly;)9EJlNIQtdTr3Yr> zifL!Mgak(Q&P#hN0FIM8-!)x5yWF`5kA{G5y29qatu+M~I#uCedZGTLDlc8@^Yjg) zi7K1atog`RaI?^}p1$qJz`6+MFM>5WkYxI@%QrKc5{Ac*cUnGEKgghXFxv_qJp4P; zlbTSi^WiKwI%fp*reA{sn{9q)7|EY( zDa}j{5hCEmeyldNxitGmgp0pLy4z1B=#PC46>2OpEWHAIg_QG4 z58)gRYu=n_la?ao+rQ>+&dp)@WVet)WO*hJ76Uri9dPsmaHANw z+_k~_IkhKlv8l5EDw3PY6#sJrut1oA4mg1p@#4yWhSzHC-pFVU(U;c1>S6!VmbC*Y zeu=ul z?c`3sM=!fR&8~>kWHmxw7YdyGet;v5aAO*fNi#U}RrnrkU6#bT3D~2OwZ0c{-7H|` zR?n8^E$GCs0*=0O%Av_RN8jNz+lKD0sJCCR9~u+1;)(`sU#(BYkA%su1KL##_(cB~@t!)O=Yks$xezw1+=b6Vb!IZjMu*kM zgIlcQG7JTWa0j&l(fpw>t$s&RC?dt^vp<2`Vo%zNmuDp@BUS&KLCZrq#vFDj6`=eS zoo(}Y6dyyBZw%9DWfQ%)RIvMX$QmQ@>G^uWyYb1Qo$++H;E#t&6uuUAxp%#GM=C4s nKd^c@-}p8NbWOqn4b`RZ^5kYr@6(l@jZZ$I+j(T0_2d5nOe~Zp delta 3064 zcmY*bdu$Zv5!XKM&OGnT!;UTE7!w|6@7{j9dv`WA_ML-c0@&b4MJZ|1nktSOBI={4 ziYg`aC{iLNJe*8)6ITYGRH@B_2otN+B~@{&rV&c14ODFvQDP!gl_)K?A{DiT(wXnu zJKDc6x4Yjr^Lx#VoLuta+s>e0{)P$X`z_}Jp z6fWy=9RH_oLblQ7ccI~36K7Xa?INey5Tjpn=)va=K5VKJs>IQ_n5d0j2yy!w0UdSV z!4400xGwCg^R*OQ%6fQko8jU2I_V4s>Ffd@I_eZq-|D8ixrkSj4j&lCj&8#)Ukv%} zVf;~(W^;kE9ynIxU@U6*uMq*O1Q8H0VdMMFgf~NZzrFF_6H7;Q$r9umJ$Sn{DLDXs za-!D|aIMvn7sJ_F8waAq){}1rADmqf@OPT%gaOCG*!PK=e#`I~bGR3`A=4eg&>dZN zrcPGf_^@VF;PJoej-E;r2!l8?pbaub*#92APK^;~Rtawbf2)u{pjbv%eEJ1xjV^@T zg$QK##U(@^uk^9XH9S4#E`2czUJb;?z$xlGZ}f+^DB82xEJTk-+zF>JsNd zAHmEmKXZ=m&UB|`+tiIH9MPMhqcPCnfhxmi8Ss6Yz)La1gAX2Xpnrwz7)Sf4WC=0k zJs53E!b=T4zI&dOG*O#`2NwOG4Tx!Zt}Mod6A9mlv4yo;|gQE`fUp(weT9uvS!!9__GJkVRS10I zO$q?E93fs726KNtaj7#W+ zCT=-{ky5E(w{z)9xK~NU)|&VW_RYNwMv{Fh;Dw_?OT+$22a7l8hMBrBUWpOdWa+|p zl$`J)2VMi|DVHH{Zhb>f7k2TxSw7LF&-b(^vG@nQ3CFXfN~suTl2lKwQB0C@pqLeW z0pzmM$FQVIrNNat55}@d%y$xLie<%iU_u{ZPIF71ft{a}8R2;0GuWMFrKE7}R^5dk zqM|5PB{R~)J+0LAIkGdpLKw)4rnWgakTDW0I=n*;CC!-lTZ(e&6ao`Pv(b#v9?gU4 zHp02h2t&F{0N0$&2tEZr@(IYyZimH|kR1+HlOhNKe#+?K`42S#e{NNg$RWhpLcv!e ztSKx_ztr~N`5RKTiNn*~FHLuAKb`K@uU*ID2U-OC_Y?k{7Wi}@XVf;;#jhSJ;VR%J z2q}-@wqROG%k{5_6voJUpM2)R(o9-vP|lj&6{@7kwF0KARjR5u0PWu?a5mXER!vvs zs(h&z{OU#W+CYk8cd}WHjO;REjbre5QxKplzNQOGw63Zojyyv8ok~jQ;A|JcesYzB zMdn@Xu>@|hjkkFa!iy_h$S(*LJ_`m%?`Fv#)8gSR%V_4Oc=|j&rb&lm9!afMlmc)| z2SIdnSo}}DgPL!+L{6FqrblJCoQ$d_o}AY@9jIQUYMWdufu$bykezva z(l}RbV==940zENHd2i|<4d85*&|08!Nh9vHDK-0&#+PyFdL=X77z7k2RdJMfiZ+@7 z<#>X_s~wp^_+%UP746k59N1`>__HppNv1`OtEL}(eUoDN(GG$(`mql$+;H#*opb|} zusK$?d3p7)Aog+#_OGIh&v$8(BuXvbLiTQ;;ijfDg$@m5a2y+Mhka6^fT2lZq%@ML z%M|3F6DmV36>ejdg2n)ot;IbUi3fw_$`hn^j<|nhiHMB}ftO=+QO#l-ijPKcX-a96 zbbLLoc{sd_4hZHR8h0pKr@IB_mQkrxlgoOB{9+qVr0LiPJH815@L}Ik;5$4p6BwIN^Fel3N@WM;A|`}CDr;Asnx~D16R0*Sg~LXniE>YGlgk(z zn1enyPwde00QsXTux^6-Y}Z;^lycf`xzbQu>hQN>|Fap=l0<16WFs9%)9w^0iRcK! z*7d4bS_E1!n3WMIZuMYj-Y?8i@&^kaX_2lcG|GZIxW)J}4qv7)W-+tgbL&YG)XQsY zXjESH;qwXt**0`EoIycz)D9i)-Nu5y0!rXG&#xjNp{Q;na SKLPdX@-=Ly9(-emap=Ex<3oP{ diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json new file mode 100644 index 0000000000..635ffb325f --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json @@ -0,0 +1 @@ +9192c1fc0db514525cac97f9afc0bd811b64d9cfbe81c62afdc4568238bb27e72fa397498db6a0869b4ff55be912edc3 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/msg_GetContestedResourcesRequest_f06ea270a508a9d9c386b8da170f67620695a23f63dc7376bd4a509e93335ce9.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/msg_GetContestedResourcesRequest_f06ea270a508a9d9c386b8da170f67620695a23f63dc7376bd4a509e93335ce9.json index df53609095ab5d37b6d19fef2ff2b465a48fa654..d043efe3169fa06d7a617671972f7abc868bb6ab 100644 GIT binary patch literal 59999 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 literal 60008 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 delta 3064 zcmY*bdu$Zv5!XKM&OGnT!;UTE7!w|6@7{j9dv`WA_ML-c0@&b4MJZ|1nktSOBI={4 ziYg`aC{iLNJe*8)6ITYGRH@B_2otN+B~@{&rV&c14ODFvQDP!gl_)K?A{DiT(wXnu zJKDc6x4Yjr^Lx#VoLuta+s>e0{)P$X`z_}Jp z6fWy=9RH_oLblQ7ccI~36K7Xa?INey5Tjpn=)va=K5VKJs>IQ_n5d0j2yy!w0UdSV z!4400xGwCg^R*OQ%6fQko8jU2I_V4s>Ffd@I_eZq-|D8ixrkSj4j&lCj&8#)Ukv%} zVf;~(W^;kE9ynIxU@U6*uMq*O1Q8H0VdMMFgf~NZzrFF_6H7;Q$r9umJ$Sn{DLDXs za-!D|aIMvn7sJ_F8waAq){}1rADmqf@OPT%gaOCG*!PK=e#`I~bGR3`A=4eg&>dZN zrcPGf_^@VF;PJoej-E;r2!l8?pbaub*#92APK^;~Rtawbf2)u{pjbv%eEJ1xjV^@T zg$QK##U(@^uk^9XH9S4#E`2czUJb;?z$xlGZ}f+^DB82xEJTk-+zF>JsNd zAHmEmKXZ=m&UB|`+tiIH9MPMhqcPCnfhxmi8Ss6Yz)La1gAX2Xpnrwz7)Sf4WC=0k zJs53E!b=T4zI&dOG*O#`2NwOG4Tx!Zt}Mod6A9mlv4yo;|gQE`fUp(weT9uvS!!9__GJkVRS10I zO$q?E93fs726KNtaj7#W+ zCT=-{ky5E(w{z)9xK~NU)|&VW_RYNwMv{Fh;Dw_?OT+$22a7l8hMBrBUWpOdWa+|p zl$`J)2VMi|DVHH{Zhb>f7k2TxSw7LF&-b(^vG@nQ3CFXfN~suTl2lKwQB0C@pqLeW z0pzmM$FQVIrNNat55}@d%y$xLie<%iU_u{ZPIF71ft{a}8R2;0GuWMFrKE7}R^5dk zqM|5PB{R~)J+0LAIkGdpLKw)4rnWgakTDW0I=n*;CC!-lTZ(e&6ao`Pv(b#v9?gU4 zHp02h2t&F{0N0$&2tEZr@(IYyZimH|kR1+HlOhNKe#+?K`42S#e{NNg$RWhpLcv!e ztSKx_ztr~N`5RKTiNn*~FHLuAKb`K@uU*ID2U-OC_Y?k{7Wi}@XVf;;#jhSJ;VR%J z2q}-@wqROG%k{5_6voJUpM2)R(o9-vP|lj&6{@7kwF0KARjR5u0PWu?a5mXER!vvs zs(h&z{OU#W+CYk8cd}WHjO;REjbre5QxKplzNQOGw63Zojyyv8ok~jQ;A|JcesYzB zMdn@Xu>@|hjkkFa!iy_h$S(*LJ_`m%?`Fv#)8gSR%V_4Oc=|j&rb&lm9!afMlmc)| z2SIdnSo}}DgPL!+L{6FqrblJCoQ$d_o}AY@9jIQUYMWdufu$bykezva z(l}RbV==940zENHd2i|<4d85*&|08!Nh9vHDK-0&#+PyFdL=X77z7k2RdJMfiZ+@7 z<#>X_s~wp^_+%UP746k59N1`>__HppNv1`OtEL}(eUoDN(GG$(`mql$+;H#*opb|} zusK$?d3p7)Aog+#_OGIh&v$8(BuXvbLiTQ;;ijfDg$@m5a2y+Mhka6^fT2lZq%@ML z%M|3F6DmV36>ejdg2n)ot;IbUi3fw_$`hn^j<|nhiHMB}ftO=+QO#l-ijPKcX-a96 zbbLLoc{sd_4hZHR8h0pKr@IB_mQkrxlgoOB{9+qVr0LiPJH815@L}Ik;5$4p6BwIN^Fel3N@WM;A|`}CDr;Asnx~D16R0*Sg~LXniE>YGlgk(z zn1enyPwde00QsXTux^6-Y}Z;^lycf`xzbQu>hQN>|Fap=l0<16WFs9%)9w^0iRcK! z*7d4bS_E1!n3WMIZuMYj-Y?8i@&^kaX_2lcG|GZIxW)J}4qv7)W-+tgbL&YG)XQsY zXjESH;qwXt**0`EoIycz)D9i)-Nu5y0!rXG&#xjNp{Q;na SKLPdX@-=Ly9(-emap=Ex<3oP{ diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json new file mode 100644 index 0000000000..635ffb325f --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json @@ -0,0 +1 @@ +9192c1fc0db514525cac97f9afc0bd811b64d9cfbe81c62afdc4568238bb27e72fa397498db6a0869b4ff55be912edc3 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/msg_GetContestedResourcesRequest_c8608f7aed7bbe4ced03c9c23f1ce28a227def58e23c39e0384e0cc02fe6360b.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/msg_GetContestedResourcesRequest_c8608f7aed7bbe4ced03c9c23f1ce28a227def58e23c39e0384e0cc02fe6360b.json index b689eb30423e876d884def8b357bdf1146883df2..5d8110bf5f19106dc88d21c5b9b3dcc35eb2a287 100644 GIT binary patch literal 94838 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 literal 95489 zcmeI*&2C*sk_6yc`zZvix!|QlN$lP12Qv@QFbs{Q9vE#)hAbO1F#PTlaq3t+ZvUvh zLesF(2e_2(CF>_6Gcq!(4rPD;$)iV)zkB`en=jtJdHk10-{)h$asAb!)rSw4>!*hgcQ5Wgytuo6e|dg;_;7u5`0)HN|K{c}?B>bk ze%RCFsKfiq^JiGtF~YN9aiPQb7tilE zcyjpu&C|n#Cr1=V`(7MoT<#7_Jw5FG;&zX~r$27>_|@Cbzy0djX zz5Mdq*Wdhv1^0Y-^yqR3`=dt(VENJY!NZRp9r5IcmqWZe_UQ*+efl$euiw1-nKk$5 zhqW)?f3}&Lfq#1&bKiXX<(D6zfByE{H}C)Pn{VH}dj0ORm*0Gz<-d6IKl$kpH@e)smfI`aLyZ(naF{g6L@_~eIA{_T_RAOF|iAOGdAmk=#9dUCV9o?czzjmz~V zfA{@u-skJm&l&Xe>h?v){dCfC>eKxEw?=&!8|IH~o?XSO^>hEaY@a4pxL+q`*4&zT zT_`pC*}V~6>vDDb{OWf5W-{>}?O5da=hLgZ*tNkO>)zdN-^r?*mGwm|?Ot(H#&!60 z?XL;@Pd;K%65%#RJ*!b4HD~xJ9{+K#r}xlquP5fm7sEHh-<#=$czeH2TvVHGud?9n z%~e8J`-aoD@8n1Q=0<>zTYRatjY3J2-FM6TF;1%iGZc$OAKhwm{?8-R=p4uzcpvE1 zANAwik8G=de;Up$&YPX_#WwfHqe2xRWR=i$KwzuHq&halAVoqJO%Kh<>nB++LJAQL*)*GNAwHify2?F zDcQZN%}49x0m~ZjVwddhE}4RcwM1irG>B+eolJ&FLUrYg$0>xmLC=e_gYYJBQ7YtN z10k|d$f5}}c({mUGsZKKGUb6ar$DlcIJS8gF+^o!(nbj}RhxI}t_=&tu{;#)_3&C< z)|}eT9DpTln|gQwNTx_ohP&ob>}(XVYNjWMq(33N`YPcN-~|!_OD4AQ7OOItB}lvO zO;76K`Ia)i71VW-qt%-C&g8rvQr0u?i$uNN+=0Mj_c^v8ukpEG}?yZw7M&Q+;TQ6gWXq)Z(R;*u{Q{U28OPBT?|qq4ZG4()c)5q;+?! zc5&D%s&DJ10HJV*m-h9Eu~}bawp*Z=I>i~qc{E)~S9BwgC2EC?^{Z3#Ax;`&rAIWA znx74bPN_hVM#U-wlJzMfC9MKS&FT7tdYlN9S0Ra%7(%V7k;Qwc(c?g3M-Z@T55bx5 zmJ30n5IPBJEnXcjT-wz`Q3SYD)kaOMs_fJH5dm61QIPcqF;r?O(A`3au`qs~*jd~L zkFqsgNxS}b`k3E^+G(=C+C@bKnFbiK(9Ew)4jIuQ{kQBJCk5@Xv3?DLQJS|ZsVpog zi65fN&xMpkEZKq*A-*EXs(Yo-jBse;cMJCwO=)VxSBRxkg!2n$AGS)msk%rTFl7j) zMj0YSvr;dR8v-f~2{HDBI=&%}SBXeNZ>6}bScO+u2^@)SlWw}f=-`xTsnm6B93}MF z(@oT77-po!(|xVN{(J{A?_Q1d5KOvX!eUVf61!#)25u!O)^-uisYXemFUd!C%!fOI zL%z*;GASCasT$Oxfon<8SyW%5X%xFS3S})MoR`7cudz#s6v*8ojFKrGkG)e#F2K75 z_7VjmB+qybgn9{kiJFuSjTjh5Ei^fClq78ELB4JHkR%NsifyOF!y+TGsvedp-9^(J zAH6m1*+p_{jMtzPyKuO>Y@xJF$rMlahGxE^1qBf}CM`%%;=Vu?RG}J1DWAcDy+KS- z5FjJyO31Q{;+`~-@dF59Pl6DyxwNKK zi5lmNaxQSYQ)G*V0CS;J!V1}?R$-6SDec>1gj4ubP;N? zs=_WN6-A~{EH;&+h?F7OLc13&3fNQ-W9ujh1c620PD!^VsS0duoA&L{0V*y7 z`}`ISw>YZn2RN0Lgj*b|_GG-e$m~yc%V8vo+xiKCwzAm*GooGP) z;a*K5&6G-^AsBecrCPaKg9JiNic7I2>nusnh4I5M6QxmBNGkEv87>jSE0x}{6uXeT z>}HGQoibk2!Zmgw zp-?jHTS!m1qaf@wc=HlzS4?UroQdMwrnBT)w-6w7((h@PDe7YbSAK(c$krwIEaNrSG?I{DNx!0s~2$4;uhm!C-0uv8I zbve>D?lQh4JdeQB|1&a@o%%MikTjf6+w%x~_`hiV;{OjW^rj9c{@09XlqpI7{72w= zRoV}7DaC6j5;gE6(I{kN7fR<0CKv5nEOd-=cp*no`%3)=JAYadZDn#@#5v8al*{@g zTZlMhaIeTDxjH4Pg}r?Z6ZmZv@CsswFR`nz5RmvvQbrwB-^L^<%AFFP=&@ScbzMIu z35te$dqFpn@p|Lr2{L%7X;{OMCzc(#NRgZ!sX-={SLrk)XV<0-0?)_2;}d!zBnxQ{ z%PPFFN+MDe38G#U1UT+8?^tqa>{m(el<^XY&MxMqKV&16s1b@fO1#vnL4p${90@MF zG#04pzXOm0SD8v4NrKl`i6CiCN&t<=^>>pf97zp9O|jnX5fXMv0znN}G*cjCi|!(U z=oIBS9k3O= zRGl+e+*@%FNg4KN7aDpHLpomMbY}MGi||qhxwQTn!hQ zs%By*++EV-P}YwMu7)ifW`jk8GEb+}da6ee3e5d#JKa-l4Vc9uRuKw3FO(jBrO;X8 ztMXP-qmYGuwFh;+Q?R5_iF>r3p0SCvtnr6iQ`U4J1QA(b#>4~Mv`q{>SKWS>HY ziE>hE?~v90@Ekk;mJG_i&_lAXi;I^yDbya#)9_)Ce7?9WoIST)=#&vhQ4*Ejn%bEn zcOZ2XrgkA@mLy$)U^~$%d67QHy^=~@KdB@h=JCmHS%2`>Pz1GTPPf2>>J;p3I|cg? zLmm31pBLXY+^I*RYV!L}qpEG4%Mo9U)a_|adZKAqGVvR0p?8HTT?8s3f1p|WS zQL)dL7~$&fRm|%KT1?t^(by&2YFMm#XcFS-zSz}W1R)xWC32oi6y??|v4kRZ4nF=1 zk<%NeH;x`SzCXEfdgJJU<9pL*De)D5sqbV-+5qkZuuQidl}0g@QI9Ht%q23roR{#w z`OhQ=y%RfPRKu5JqqNEm-*yB>t~AiDyRwg&J!(6sGnso`ijR#&nbLccSH$0!a=)qFr_)x zzO3KWAZ17)qw$+^66)Pi^H+!qCMDeD*gz(F;5AnR5fqZDos#i{B34P&D`Z4HFMwll zgML~*@KK#ft@Et6^Ybd+)h3@2On=^PH&vvIC|jt{^Z8L zls8PDrCwM3rC5_Csp(wSvF4r^v)Z0D;@I~>FQMnz^I~@Hzqq*f)zYUWRqgsBIv~=K z!RN*7WiEV;g>D@q}0Jh|%DoOY>cABRu;5A-SyO0M1r!R#%9xuH+ zMbDm@5|YcMcXz=X>~0}S+buFh`lx-1{EqZaUEKwhhky^B1PgQsu_v#Gj$n92x2AX- z)9|^Bv|LK~I-VG^@SEp&4`1N%65lxX*AOJ#c(~a^vWYhZTQn zET#EL=Rlo6+xzs!Vo%Dt)-Ua)yG4M|DSn}`l*V=Mf22_yQ;0|j1fkwzAwYWYCq~iW zoa3lhNubm2BK-zx>hQaZ{8nmRwDEj?7w%oNei*Lq%H4(JMNwpmoUeCM$*I3Gf@hYv zi?FZA6duV7JV4aF$yvc(Wut^$(C46_oFWp+;QBN6qe~kIv43Hgt}kL<2n1YZRwz;b zghe7~`xMf9Km;idLg1w2v{h0FA2%JOR`mq zMSQEp0xv&nSf=1EO<0AGyLA1$L>Y=Dp%gZDim;`j$DnkJVAteb0;1)B;@)sb&`Er{ za$+svZmcDCzsDA2e+rFol?Gd+B28imh3Oo8y!|-6aeCwEf#ds=8>csp9yq=?eWo&v zr(m)qZI5<7$pUIi+6KrmCzY{%IJqcYpO(ncSW-VQ4qs|mu*;MIpMx_01U9{{9Pae| zSo`s&E{rW{DHdt+3B|(ote@zMUHY^Fm((a^Us+J^GDO(?Yi(0kue4a~5RU(E#KCfqg_RomOf#=}k1(;G(*9N(YZ__KS1 zT3PD^@T^LfWH7b6T|6~fI%Mi(#^MGcWg0uN_R`XR*GqZ%QGx1OJ8V(9MX<|x zbH`5Z(i?*?Tq7tDiaI9(Izhy-8tx^AP%H{$;q0GT8jZ(#sq?7^N%*3 z=-uW-f=h!#p84Elno$;?gAW(N#E^6FpZ$XCjNlo;qX&-fi5m|q{@5f#Wx*?vmaTMF zbhJs&fK7NiYO0UvDi=Dj8~~;ECB%B3?UaREkzkQ~D)UuNzC@>m(@G8n(tFoS+hGuR z8>qWg9jU}%xY~l9_1ulUr{W3*vG8ec}cL_Ii zu;x)*WP+1)5P@3p>e_v>s0Vu~s6*Q6f8o+7M`|$8mZx}+*FcjF1TwZa%I%I%NkywV zOQwunNMj2erK3Pd1G9zFBN3q~F-b{_j*V~UlY)AurVmN+A8fqw?Ytd5TpNyi19IRw zc=@vBblvH?qX&-fPj37Hy+J*I6=*%jQ8#klj!qvR65^E;%6U8bvo7M8zj$M(83sV67*0#EkQE(=#8$|b!L!AE0-oLe1aNZl)r zYOM7dIpM=Q)c|P_siO!GxlvhhSM*s*KelzQenz^8c!^Gqdn^RV!Vw!< ztQ?)BC9C~u!jT&T^}JR4E^;7h(rrAS-=#qGA|l5?b=Sh}P^QR{b^xbtKkj1eIZX)m z6`6|cXhZ@8&*sfp*(HNXc~*c21?7|kf}*ykp3tvcN{L)JYzhjBatG7mfq)@c*diuT zUe~46sB93bgwsdth8u6xyZ%-M=6BhBD_FXPMkFMp!W#XT5>u0MUn**2NuBjk09Q&_ zyeeJ_>he|ubI^mPlvGJrVTj5yEnW!N1BV#Kjf@w~uf`JhupuYG93h@pfCnEhY9C`R zAA5d%HyN5J?d3_np6Bb5uYS(^>$|JF+x+$P>aIT-Z=XaxUR>qSdY6$OGhm!;V`^Q8 z39D4>79#s2 zE~&7j>Y0+4VDI|q-j2^MLamMucEQqJq>=7;^l+zO&(J9$u&}XH7P`b}vdA)11q)mw zs6mf15QNlp)Ss+xJZyDo5&4am6t9-1ezk~Qk81U7)UejF>&w+z)ha6`y>^O8-Zxhy zz4rKHd`f)D6^(z_CrwQgL0%HPb&##4%HI%<#?>Sw$pKnDG+pUoE1IPCP3q^M5Q z_{~wlLO_Zg&%qTf!X6+J4zi~i7kh-~g&fDCqecYDx9!9Ucm}Igq8_c-79?Fuq;@?U3CU3nABH2TN{%gK zF?Kac1z|c>hdpJKOrh~ZJxmR>PmeOAS36$RqnajOYSg3uJVQpf?v;hK5Ucl~Ve-)bzZg5yvA^c^fA$P+bcvjt@_$c5BB{)Gk$L<;@UTVbik}35nR^^7zuLjCqa&LIJAg0)n)K{pCO%P4PP(`rpnJaa@LBVA2 zF391XErO+nCGu5NDq=}LmQ2Kw$yh+QRn*fBb7v?iVu==dtG1Dz zvl{r~F0-C4TEUl7YA^oc(E3<1h$TI>g5Axf)2()f@499*&@p?booK=8ua?xzG=wG$ zPMX!&&eYaSIgxH|0X%`qx8+4PT1dVy~~W;i(Z)`H>F)Do9+=Mt2UhUw~0 zUGkSF_|YCqXFFcu&~$s4?mD8gt?9M|=eFuvxbb~M(EVpziuw^=s4%hjvf$!btl|f) z*tm`!XcW}GJg$iR3r3QS*53o&EwQY64g&xbrLxex;vs_+r6~*QItO)PE+xG&K!a;`$)ggMLQ&4uZP47D{Eo+MN>^;C}S)HIuovwtDzgKU@ zDB2v*CmB!mcx+SySlrb_lcPRO-(i!xN@IYiW36F+c&inoH?KRKuQ9`Ptis^~i}*3@ z$5n(sHK3+G%+cs>o18X>(usi24p}LxSm|=z z2d1aciBEVqgrD1_z>vteG_oqe(~nC;F^13(63&JKxo~$xlT~{O{Q$+at8tG7ly;)9EJlNIQtdTr3Yr> zifL!Mgak(Q&P#hN0FIM8-!)x5yWF`5kA{G5y29qatu+M~I#uCedZGTLDlc8@^Yjg) zi7K1atog`RaI?^}p1$qJz`6+MFM>5WkYxI@%QrKc5{Ac*cUnGEKgghXFxv_qJp4P; zlbTSi^WiKwI%fp*reA{sn{9q)7|EY( zDa}j{5hCEmeyldNxitGmgp0pLy4z1B=#PC46>2OpEWHAIg_QG4 z58)gRYu=n_la?ao+rQ>+&dp)@WVet)WO*hJ76Uri9dPsmaHANw z+_k~_IkhKlv8l5EDw3PY6#sJrut1oA4mg1p@#4yWhSzHC-pFVU(U;c1>S6!VmbC*Y zeu=ul z?c`3sM=!fR&8~>kWHmxw7YdyGet;v5aAO*fNi#U}RrnrkU6#bT3D~2OwZ0c{-7H|` zR?n8^E$GCs0*=0O%Av_RN8jNz+lKD0sJCCR9~u+1;)(`sU#(BYkA%su1KL##_(cB~@t!)O=Yks$xezw1+=b6Vb!IZjMu*kM zgIlcQG7JTWa0j&l(fpw>t$s&RC?dt^vp<2`Vo%zNmuDp@BUS&KLCZrq#vFDj6`=eS zoo(}Y6dyyBZw%9DWfQ%)RIvMX$QmQ@>G^uWyYb1Qo$++H;E#t&6uuUAxp%#GM=C4s nKd^c@-}p8NbWOqn4b`RZ^5kYr@6(l@jZZ$I+j(T0_2d5nOe~Zp delta 3064 zcmY*bdu$Zv5!XKM&OGnT!;UTE7!w|6@7{j9dv`WA_ML-c0@&b4MJZ|1nktSOBI={4 ziYg`aC{iLNJe*8)6ITYGRH@B_2otN+B~@{&rV&c14ODFvQDP!gl_)K?A{DiT(wXnu zJKDc6x4Yjr^Lx#VoLuta+s>e0{)P$X`z_}Jp z6fWy=9RH_oLblQ7ccI~36K7Xa?INey5Tjpn=)va=K5VKJs>IQ_n5d0j2yy!w0UdSV z!4400xGwCg^R*OQ%6fQko8jU2I_V4s>Ffd@I_eZq-|D8ixrkSj4j&lCj&8#)Ukv%} zVf;~(W^;kE9ynIxU@U6*uMq*O1Q8H0VdMMFgf~NZzrFF_6H7;Q$r9umJ$Sn{DLDXs za-!D|aIMvn7sJ_F8waAq){}1rADmqf@OPT%gaOCG*!PK=e#`I~bGR3`A=4eg&>dZN zrcPGf_^@VF;PJoej-E;r2!l8?pbaub*#92APK^;~Rtawbf2)u{pjbv%eEJ1xjV^@T zg$QK##U(@^uk^9XH9S4#E`2czUJb;?z$xlGZ}f+^DB82xEJTk-+zF>JsNd zAHmEmKXZ=m&UB|`+tiIH9MPMhqcPCnfhxmi8Ss6Yz)La1gAX2Xpnrwz7)Sf4WC=0k zJs53E!b=T4zI&dOG*O#`2NwOG4Tx!Zt}Mod6A9mlv4yo;|gQE`fUp(weT9uvS!!9__GJkVRS10I zO$q?E93fs726KNtaj7#W+ zCT=-{ky5E(w{z)9xK~NU)|&VW_RYNwMv{Fh;Dw_?OT+$22a7l8hMBrBUWpOdWa+|p zl$`J)2VMi|DVHH{Zhb>f7k2TxSw7LF&-b(^vG@nQ3CFXfN~suTl2lKwQB0C@pqLeW z0pzmM$FQVIrNNat55}@d%y$xLie<%iU_u{ZPIF71ft{a}8R2;0GuWMFrKE7}R^5dk zqM|5PB{R~)J+0LAIkGdpLKw)4rnWgakTDW0I=n*;CC!-lTZ(e&6ao`Pv(b#v9?gU4 zHp02h2t&F{0N0$&2tEZr@(IYyZimH|kR1+HlOhNKe#+?K`42S#e{NNg$RWhpLcv!e ztSKx_ztr~N`5RKTiNn*~FHLuAKb`K@uU*ID2U-OC_Y?k{7Wi}@XVf;;#jhSJ;VR%J z2q}-@wqROG%k{5_6voJUpM2)R(o9-vP|lj&6{@7kwF0KARjR5u0PWu?a5mXER!vvs zs(h&z{OU#W+CYk8cd}WHjO;REjbre5QxKplzNQOGw63Zojyyv8ok~jQ;A|JcesYzB zMdn@Xu>@|hjkkFa!iy_h$S(*LJ_`m%?`Fv#)8gSR%V_4Oc=|j&rb&lm9!afMlmc)| z2SIdnSo}}DgPL!+L{6FqrblJCoQ$d_o}AY@9jIQUYMWdufu$bykezva z(l}RbV==940zENHd2i|<4d85*&|08!Nh9vHDK-0&#+PyFdL=X77z7k2RdJMfiZ+@7 z<#>X_s~wp^_+%UP746k59N1`>__HppNv1`OtEL}(eUoDN(GG$(`mql$+;H#*opb|} zusK$?d3p7)Aog+#_OGIh&v$8(BuXvbLiTQ;;ijfDg$@m5a2y+Mhka6^fT2lZq%@ML z%M|3F6DmV36>ejdg2n)ot;IbUi3fw_$`hn^j<|nhiHMB}ftO=+QO#l-ijPKcX-a96 zbbLLoc{sd_4hZHR8h0pKr@IB_mQkrxlgoOB{9+qVr0LiPJH815@L}Ik;5$4p6BwIN^Fel3N@WM;A|`}CDr;Asnx~D16R0*Sg~LXniE>YGlgk(z zn1enyPwde00QsXTux^6-Y}Z;^lycf`xzbQu>hQN>|Fap=l0<16WFs9%)9w^0iRcK! z*7d4bS_E1!n3WMIZuMYj-Y?8i@&^kaX_2lcG|GZIxW)J}4qv7)W-+tgbL&YG)XQsY zXjESH;qwXt**0`EoIycz)D9i)-Nu5y0!rXG&#xjNp{Q;na SKLPdX@-=Ly9(-emap=Ex<3oP{ diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json new file mode 100644 index 0000000000..635ffb325f --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json @@ -0,0 +1 @@ +9192c1fc0db514525cac97f9afc0bd811b64d9cfbe81c62afdc4568238bb27e72fa397498db6a0869b4ff55be912edc3 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/msg_GetContestedResourcesRequest_7dd3b1061a019dac5fa1f385b8bd5387b9cca48a3062a4db8bf0341a839f2bae.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/msg_GetContestedResourcesRequest_7dd3b1061a019dac5fa1f385b8bd5387b9cca48a3062a4db8bf0341a839f2bae.json index 4f9cc1a381705d25dd55fcea7c11d771ff12b0d0..73a6e5dbf6dc01bfc06222aa7a39196b7f9930a8 100644 GIT binary patch literal 59804 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 AI{*Lx literal 62162 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 J{OkK){ttG=3B&*Z diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 808b4f01189bc76a5960f835750320fe8eb70b21..b0fd7fd2be28484d3236142bfeaf40d55aba1928 100644 GIT binary patch delta 2577 zcmY*be{7WH9nbsY?q~xPEl?Wfdabb;_1=4*_kHhu5NDq=}LmQ2Kw$yh+QRn*fBb7v?iVu==dtG1Dz zvl{r~F0-C4TEUl7YA^oc(E3<1h$TI>g5Axf)2()f@499*&@p?booK=8ua?xzG=wG$ zPMX!&&eYaSIgxH|0X%`qx8+4PT1dVy~~W;i(Z)`H>F)Do9+=Mt2UhUw~0 zUGkSF_|YCqXFFcu&~$s4?mD8gt?9M|=eFuvxbb~M(EVpziuw^=s4%hjvf$!btl|f) z*tm`!XcW}GJg$iR3r3QS*53o&EwQY64g&xbrLxex;vs_+r6~*QItO)PE+xG&K!a;`$)ggMLQ&4uZP47D{Eo+MN>^;C}S)HIuovwtDzgKU@ zDB2v*CmB!mcx+SySlrb_lcPRO-(i!xN@IYiW36F+c&inoH?KRKuQ9`Ptis^~i}*3@ z$5n(sHK3+G%+cs>o18X>(usi24p}LxSm|=z z2d1aciBEVqgrD1_z>vteG_oqe(~nC;F^13(63&JKxo~$xlT~{O{Q$+at8tG7ly;)9EJlNIQtdTr3Yr> zifL!Mgak(Q&P#hN0FIM8-!)x5yWF`5kA{G5y29qatu+M~I#uCedZGTLDlc8@^Yjg) zi7K1atog`RaI?^}p1$qJz`6+MFM>5WkYxI@%QrKc5{Ac*cUnGEKgghXFxv_qJp4P; zlbTSi^WiKwI%fp*reA{sn{9q)7|EY( zDa}j{5hCEmeyldNxitGmgp0pLy4z1B=#PC46>2OpEWHAIg_QG4 z58)gRYu=n_la?ao+rQ>+&dp)@WVet)WO*hJ76Uri9dPsmaHANw z+_k~_IkhKlv8l5EDw3PY6#sJrut1oA4mg1p@#4yWhSzHC-pFVU(U;c1>S6!VmbC*Y zeu=ul z?c`3sM=!fR&8~>kWHmxw7YdyGet;v5aAO*fNi#U}RrnrkU6#bT3D~2OwZ0c{-7H|` zR?n8^E$GCs0*=0O%Av_RN8jNz+lKD0sJCCR9~u+1;)(`sU#(BYkA%su1KL##_(cB~@t!)O=Yks$xezw1+=b6Vb!IZjMu*kM zgIlcQG7JTWa0j&l(fpw>t$s&RC?dt^vp<2`Vo%zNmuDp@BUS&KLCZrq#vFDj6`=eS zoo(}Y6dyyBZw%9DWfQ%)RIvMX$QmQ@>G^uWyYb1Qo$++H;E#t&6uuUAxp%#GM=C4s nKd^c@-}p8NbWOqn4b`RZ^5kYr@6(l@jZZ$I+j(T0_2d5nOe~Zp delta 3064 zcmY*bdu$Zv5!XKM&OGnT!;UTE7!w|6@7{j9dv`WA_ML-c0@&b4MJZ|1nktSOBI={4 ziYg`aC{iLNJe*8)6ITYGRH@B_2otN+B~@{&rV&c14ODFvQDP!gl_)K?A{DiT(wXnu zJKDc6x4Yjr^Lx#VoLuta+s>e0{)P$X`z_}Jp z6fWy=9RH_oLblQ7ccI~36K7Xa?INey5Tjpn=)va=K5VKJs>IQ_n5d0j2yy!w0UdSV z!4400xGwCg^R*OQ%6fQko8jU2I_V4s>Ffd@I_eZq-|D8ixrkSj4j&lCj&8#)Ukv%} zVf;~(W^;kE9ynIxU@U6*uMq*O1Q8H0VdMMFgf~NZzrFF_6H7;Q$r9umJ$Sn{DLDXs za-!D|aIMvn7sJ_F8waAq){}1rADmqf@OPT%gaOCG*!PK=e#`I~bGR3`A=4eg&>dZN zrcPGf_^@VF;PJoej-E;r2!l8?pbaub*#92APK^;~Rtawbf2)u{pjbv%eEJ1xjV^@T zg$QK##U(@^uk^9XH9S4#E`2czUJb;?z$xlGZ}f+^DB82xEJTk-+zF>JsNd zAHmEmKXZ=m&UB|`+tiIH9MPMhqcPCnfhxmi8Ss6Yz)La1gAX2Xpnrwz7)Sf4WC=0k zJs53E!b=T4zI&dOG*O#`2NwOG4Tx!Zt}Mod6A9mlv4yo;|gQE`fUp(weT9uvS!!9__GJkVRS10I zO$q?E93fs726KNtaj7#W+ zCT=-{ky5E(w{z)9xK~NU)|&VW_RYNwMv{Fh;Dw_?OT+$22a7l8hMBrBUWpOdWa+|p zl$`J)2VMi|DVHH{Zhb>f7k2TxSw7LF&-b(^vG@nQ3CFXfN~suTl2lKwQB0C@pqLeW z0pzmM$FQVIrNNat55}@d%y$xLie<%iU_u{ZPIF71ft{a}8R2;0GuWMFrKE7}R^5dk zqM|5PB{R~)J+0LAIkGdpLKw)4rnWgakTDW0I=n*;CC!-lTZ(e&6ao`Pv(b#v9?gU4 zHp02h2t&F{0N0$&2tEZr@(IYyZimH|kR1+HlOhNKe#+?K`42S#e{NNg$RWhpLcv!e ztSKx_ztr~N`5RKTiNn*~FHLuAKb`K@uU*ID2U-OC_Y?k{7Wi}@XVf;;#jhSJ;VR%J z2q}-@wqROG%k{5_6voJUpM2)R(o9-vP|lj&6{@7kwF0KARjR5u0PWu?a5mXER!vvs zs(h&z{OU#W+CYk8cd}WHjO;REjbre5QxKplzNQOGw63Zojyyv8ok~jQ;A|JcesYzB zMdn@Xu>@|hjkkFa!iy_h$S(*LJ_`m%?`Fv#)8gSR%V_4Oc=|j&rb&lm9!afMlmc)| z2SIdnSo}}DgPL!+L{6FqrblJCoQ$d_o}AY@9jIQUYMWdufu$bykezva z(l}RbV==940zENHd2i|<4d85*&|08!Nh9vHDK-0&#+PyFdL=X77z7k2RdJMfiZ+@7 z<#>X_s~wp^_+%UP746k59N1`>__HppNv1`OtEL}(eUoDN(GG$(`mql$+;H#*opb|} zusK$?d3p7)Aog+#_OGIh&v$8(BuXvbLiTQ;;ijfDg$@m5a2y+Mhka6^fT2lZq%@ML z%M|3F6DmV36>ejdg2n)ot;IbUi3fw_$`hn^j<|nhiHMB}ftO=+QO#l-ijPKcX-a96 zbbLLoc{sd_4hZHR8h0pKr@IB_mQkrxlgoOB{9+qVr0LiPJH815@L}Ik;5$4p6BwIN^Fel3N@WM;A|`}CDr;Asnx~D16R0*Sg~LXniE>YGlgk(z zn1enyPwde00QsXTux^6-Y}Z;^lycf`xzbQu>hQN>|Fap=l0<16WFs9%)9w^0iRcK! z*7d4bS_E1!n3WMIZuMYj-Y?8i@&^kaX_2lcG|GZIxW)J}4qv7)W-+tgbL&YG)XQsY zXjESH;qwXt**0`EoIycz)D9i)-Nu5y0!rXG&#xjNp{Q;na SKLPdX@-=Ly9(-emap=Ex<3oP{ diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json new file mode 100644 index 0000000000..635ffb325f --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json @@ -0,0 +1 @@ +9192c1fc0db514525cac97f9afc0bd811b64d9cfbe81c62afdc4568238bb27e72fa397498db6a0869b4ff55be912edc3 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file From 3ca878dda798e647c13ad86e09e3c090fb0ac8fb Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 10 Oct 2024 10:35:32 +0700 Subject: [PATCH 56/90] fix(sdk): added signing_withdrawal_key_to_use to withdraw sdk call (#2234) --- .../platform/transition/withdraw_from_identity.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs b/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs index db06f29a2a..ce6d32e071 100644 --- a/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs +++ b/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs @@ -3,7 +3,7 @@ use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::core_script::CoreScript; use dpp::identity::signer::Signer; -use dpp::identity::Identity; +use dpp::identity::{Identity, IdentityPublicKey}; use dpp::prelude::UserFeeIncrease; use crate::platform::transition::broadcast::BroadcastStateTransition; @@ -19,13 +19,15 @@ use dpp::withdrawal::Pooling; #[async_trait::async_trait] pub trait WithdrawFromIdentity { /// Function to withdraw credits from an identity. Returns the final identity balance. + /// If signing_withdrawal_key_to_use is not set, we will try to use one in the signer that is + /// available for withdrawal async fn withdraw( &self, sdk: &Sdk, address: Option

, amount: u64, core_fee_per_byte: Option, - user_fee_increase: Option, + signing_withdrawal_key_to_use: Option<&IdentityPublicKey>, signer: S, settings: Option, ) -> Result; @@ -39,12 +41,15 @@ impl WithdrawFromIdentity for Identity { address: Option
, amount: u64, core_fee_per_byte: Option, - user_fee_increase: Option, + signing_withdrawal_key_to_use: Option<&IdentityPublicKey>, signer: S, settings: Option, ) -> Result { let new_identity_nonce = sdk.get_identity_nonce(self.id(), true, settings).await?; let script = address.map(|address| CoreScript::new(address.script_pubkey())); + let user_fee_increase = settings + .map(|settings| settings.user_fee_increase) + .flatten(); let state_transition = IdentityCreditWithdrawalTransition::try_from_identity( self, script, @@ -53,7 +58,7 @@ impl WithdrawFromIdentity for Identity { core_fee_per_byte.unwrap_or(1), user_fee_increase.unwrap_or_default(), signer, - None, + signing_withdrawal_key_to_use, PreferredKeyPurposeForSigningWithdrawal::TransferPreferred, new_identity_nonce, sdk.version(), From 4199607fd9ef1341eac52b994906a2034c77021a Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 10 Oct 2024 12:11:36 +0700 Subject: [PATCH 57/90] feat(dpp): added identity public key private key validation methods (#2235) --- .../identity/identity_public_key/key_type.rs | 2 +- .../identity_public_key/methods/hash/mod.rs | 11 + .../methods/hash/v0/mod.rs | 8 + .../identity_public_key/v0/methods/mod.rs | 213 +++++++++++++++++- .../rs-platform-value/src/types/identifier.rs | 1 - packages/rs-sdk/src/platform/types/evonode.rs | 2 +- 6 files changed, 233 insertions(+), 4 deletions(-) diff --git a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs index 908f913969..2d64045452 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs @@ -305,7 +305,7 @@ impl KeyType { KeyType::EDDSA_25519_HASH160 => { let key_pair = ed25519_dalek::SigningKey::generate(rng); ( - key_pair.verifying_key().to_bytes().to_vec(), + ripemd160_sha256(key_pair.verifying_key().to_bytes().as_slice()).to_vec(), key_pair.to_bytes().to_vec(), ) } diff --git a/packages/rs-dpp/src/identity/identity_public_key/methods/hash/mod.rs b/packages/rs-dpp/src/identity/identity_public_key/methods/hash/mod.rs index 6978a3035d..b22a3f0c26 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/methods/hash/mod.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/methods/hash/mod.rs @@ -2,6 +2,7 @@ mod v0; use crate::identity::IdentityPublicKey; use crate::ProtocolError; +use dashcore::Network; pub use v0::*; impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKey { @@ -10,4 +11,14 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKey { IdentityPublicKey::V0(v0) => v0.public_key_hash(), } } + + fn validate_private_key_bytes( + &self, + private_key_bytes: &[u8], + network: Network, + ) -> Result { + match self { + IdentityPublicKey::V0(v0) => v0.validate_private_key_bytes(private_key_bytes, network), + } + } } diff --git a/packages/rs-dpp/src/identity/identity_public_key/methods/hash/v0/mod.rs b/packages/rs-dpp/src/identity/identity_public_key/methods/hash/v0/mod.rs index 7b656292e3..b11c79c31f 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/methods/hash/v0/mod.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/methods/hash/v0/mod.rs @@ -1,6 +1,14 @@ use crate::ProtocolError; +use dashcore::Network; pub trait IdentityPublicKeyHashMethodsV0 { /// Get the original public key hash fn public_key_hash(&self) -> Result<[u8; 20], ProtocolError>; + + /// Verifies that the private key bytes match this identity public key + fn validate_private_key_bytes( + &self, + private_key_bytes: &[u8], + network: Network, + ) -> Result; } diff --git a/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs b/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs index 05232ed22a..891bd5ed82 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs @@ -5,7 +5,9 @@ use crate::util::hash::ripemd160_sha256; use crate::ProtocolError; use anyhow::anyhow; use dashcore::hashes::Hash; -use dashcore::PublicKey as ECDSAPublicKey; +use dashcore::key::Secp256k1; +use dashcore::secp256k1::SecretKey; +use dashcore::{Network, PublicKey as ECDSAPublicKey}; use platform_value::Bytes20; impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { @@ -45,4 +47,213 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { } } } + + fn validate_private_key_bytes( + &self, + private_key_bytes: &[u8], + network: Network, + ) -> Result { + match self.key_type { + KeyType::ECDSA_SECP256K1 => { + let secp = Secp256k1::new(); + let secret_key = match SecretKey::from_slice(private_key_bytes) { + Ok(secret_key) => secret_key, + Err(_) => return Ok(false), + }; + let private_key = dashcore::PrivateKey::new(secret_key, network); + + Ok(private_key.public_key(&secp).to_bytes() == self.data.as_slice()) + } + KeyType::BLS12_381 => { + #[cfg(feature = "bls-signatures")] + { + let private_key = + match bls_signatures::PrivateKey::from_bytes(private_key_bytes, false) { + Ok(secret_key) => secret_key, + Err(_) => return Ok(false), + }; + let g1_element = match private_key.g1_element() { + Ok(g1_element) => g1_element, + Err(_) => return Ok(false), + }; + + Ok(g1_element.to_bytes().as_slice() == self.data.as_slice()) + } + #[cfg(not(feature = "bls-signatures"))] + return Err(ProtocolError::NotSupported( + "Converting a private key to a bls public key is not supported without the bls-signatures feature".to_string(), + )); + } + KeyType::ECDSA_HASH160 => { + let secp = Secp256k1::new(); + let secret_key = match SecretKey::from_slice(private_key_bytes) { + Ok(secret_key) => secret_key, + Err(_) => return Ok(false), + }; + let private_key = dashcore::PrivateKey::new(secret_key, network); + + Ok( + ripemd160_sha256(private_key.public_key(&secp).to_bytes().as_slice()) + .as_slice() + == self.data.as_slice(), + ) + } + KeyType::EDDSA_25519_HASH160 => { + #[cfg(feature = "ed25519-dalek")] + { + let secret_key = match private_key_bytes.try_into() { + Ok(secret_key) => secret_key, + Err(_) => return Ok(false), + }; + let key_pair = ed25519_dalek::SigningKey::from_bytes(&secret_key); + Ok( + ripemd160_sha256(key_pair.verifying_key().to_bytes().as_slice()).as_slice() + == self.data.as_slice(), + ) + } + #[cfg(not(feature = "ed25519-dalek"))] + return Err(ProtocolError::NotSupported( + "Converting a private key to a eddsa hash 160 is not supported without the ed25519-dalek feature".to_string(), + )); + } + KeyType::BIP13_SCRIPT_HASH => { + return Err(ProtocolError::NotSupported( + "Converting a private key to a script hash is not supported".to_string(), + )); + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::identity::{Purpose, SecurityLevel}; + use dashcore::Network; + use dpp::version::PlatformVersion; + use rand::rngs::StdRng; + use rand::SeedableRng; + + #[cfg(feature = "random-public-keys")] + #[test] + fn test_validate_private_key_bytes_with_random_keys() { + let platform_version = PlatformVersion::latest(); + let mut rng = StdRng::from_entropy(); + + // Test for ECDSA_SECP256K1 + let key_type = KeyType::ECDSA_SECP256K1; + let (public_key_data, private_key_data) = key_type + .random_public_and_private_key_data(&mut rng, &platform_version) + .expect("expected to generate random keys"); + + let identity_public_key = IdentityPublicKeyV0 { + id: 1, + purpose: Purpose::AUTHENTICATION, + security_level: SecurityLevel::HIGH, + contract_bounds: None, + key_type, + data: public_key_data.into(), + read_only: false, + disabled_at: None, + }; + + // Validate that the private key matches the public key + assert_eq!( + identity_public_key + .validate_private_key_bytes(&private_key_data, Network::Testnet) + .unwrap(), + true + ); + + // Test with an invalid private key + let invalid_private_key_bytes = vec![0u8; private_key_data.len()]; + assert_eq!( + identity_public_key + .validate_private_key_bytes(&invalid_private_key_bytes, Network::Testnet) + .unwrap(), + false + ); + } + + #[cfg(all(feature = "random-public-keys", feature = "bls-signatures"))] + #[test] + fn test_validate_private_key_bytes_with_random_keys_bls12_381() { + let platform_version = PlatformVersion::latest(); + let mut rng = StdRng::from_entropy(); + + // Test for BLS12_381 + let key_type = KeyType::BLS12_381; + let (public_key_data, private_key_data) = key_type + .random_public_and_private_key_data(&mut rng, &platform_version) + .expect("expected to generate random keys"); + + let identity_public_key = IdentityPublicKeyV0 { + id: 2, + purpose: Purpose::AUTHENTICATION, + security_level: SecurityLevel::HIGH, + contract_bounds: None, + key_type, + data: public_key_data.into(), + read_only: false, + disabled_at: None, + }; + + // Validate that the private key matches the public key + assert_eq!( + identity_public_key + .validate_private_key_bytes(&private_key_data, Network::Testnet) + .unwrap(), + true + ); + + // Test with an invalid private key + let invalid_private_key_bytes = vec![0u8; private_key_data.len()]; + assert_eq!( + identity_public_key + .validate_private_key_bytes(&invalid_private_key_bytes, Network::Testnet) + .unwrap(), + false + ); + } + + #[cfg(all(feature = "random-public-keys", feature = "ed25519-dalek"))] + #[test] + fn test_validate_private_key_bytes_with_random_keys_eddsa_25519_hash160() { + let platform_version = PlatformVersion::latest(); + let mut rng = StdRng::from_entropy(); + + // Test for EDDSA_25519_HASH160 + let key_type = KeyType::EDDSA_25519_HASH160; + let (public_key_data, private_key_data) = key_type + .random_public_and_private_key_data(&mut rng, &platform_version) + .expect("expected to generate random keys"); + + let identity_public_key = IdentityPublicKeyV0 { + id: 3, + purpose: Purpose::AUTHENTICATION, + security_level: SecurityLevel::HIGH, + contract_bounds: None, + key_type, + data: public_key_data.into(), + read_only: false, + disabled_at: None, + }; + + // Validate that the private key matches the public key + assert_eq!( + identity_public_key + .validate_private_key_bytes(&private_key_data, Network::Testnet) + .unwrap(), + true + ); + + // Test with an invalid private key + let invalid_private_key_bytes = vec![0u8; private_key_data.len()]; + assert_eq!( + identity_public_key + .validate_private_key_bytes(&invalid_private_key_bytes, Network::Testnet) + .unwrap(), + false + ); + } } diff --git a/packages/rs-platform-value/src/types/identifier.rs b/packages/rs-platform-value/src/types/identifier.rs index 19bfbf82b2..f2f173b7d7 100644 --- a/packages/rs-platform-value/src/types/identifier.rs +++ b/packages/rs-platform-value/src/types/identifier.rs @@ -11,7 +11,6 @@ use serde::{Deserialize, Serialize}; #[cfg(feature = "json")] use serde_json::Value as JsonValue; -use crate::string_encoding::Encoding::Base58; use crate::string_encoding::{Encoding, ALL_ENCODINGS}; use crate::types::encoding_string_to_encoding; use crate::{string_encoding, Error, Value}; diff --git a/packages/rs-sdk/src/platform/types/evonode.rs b/packages/rs-sdk/src/platform/types/evonode.rs index 77e893dfd5..af0fee4210 100644 --- a/packages/rs-sdk/src/platform/types/evonode.rs +++ b/packages/rs-sdk/src/platform/types/evonode.rs @@ -10,7 +10,7 @@ use futures::{FutureExt, TryFutureExt}; use rs_dapi_client::transport::{ AppliedRequestSettings, PlatformGrpcClient, TransportClient, TransportRequest, }; -use rs_dapi_client::{Address, ConnectionPool, DapiClientError, RequestSettings}; +use rs_dapi_client::{Address, ConnectionPool, RequestSettings}; #[cfg(feature = "mocks")] use serde::{Deserialize, Serialize}; use std::fmt::Debug; From 91235b1abe70439f5e81c163695f2fafe56c6678 Mon Sep 17 00:00:00 2001 From: thephez Date: Thu, 10 Oct 2024 05:59:39 -0400 Subject: [PATCH 58/90] docs: update README (#2219) --- README.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 46e02e1db7..3b2bd65ecb 100644 --- a/README.md +++ b/README.md @@ -25,8 +25,6 @@ If you are looking for how to contribute to the project or need any help with building an app on the Dash Platform - message us on the [Devs Discord](https://chat.dashdevs.org/)! -## Note: Dash Platform is currently available on the Dash Testnet only - ## Intro This is a multi-package repository - sometimes also known as monorepository - @@ -41,9 +39,9 @@ Dash Platform is currently undergoing testing and final development necessary to support its release on the Dash production network (mainnet). The packages in this repository may be used on the following networks: -- [x] **Development networks** ([**devnets**](https://dashplatform.readme.io/docs/reference-glossary#devnet)) -- [x] [**Testnet**](https://dashplatform.readme.io/docs/reference-glossary#testnet) -- [x] [Mainnet](https://dashplatform.readme.io/docs/reference-glossary#mainnet) +- [x] **Development networks** ([**devnets**](https://docs.dash.org/projects/platform/en/stable/docs/reference/glossary.html#devnet)) +- [x] [**Testnet**](https://docs.dash.org/projects/platform/en/stable/docs/reference/glossary.html#testnet) +- [x] [Mainnet](https://docs.dash.org/projects/platform/en/stable/docs/reference/glossary.html#mainnet) ## FAQ @@ -89,7 +87,7 @@ Discord](https://chat.dashdevs.org/) ### Where are the docs? Our docs are hosted on -[readme.io](https://dashplatform.readme.io/docs/introduction-what-is-dash-platform). +[docs.dash.org](https://docs.dash.org/projects/platform/en/stable/docs/intro/what-is-dash-platform.html). You can create issues and feature requests in the [issues](https://github.com/dashpay/platform/issues) for this repository. From e406d63b899387f2cb48d209f0a09b21e5b01497 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 10 Oct 2024 18:24:48 +0700 Subject: [PATCH 59/90] chore(release): update changelog and version to 1.4.0 (#2237) --- CHANGELOG.md | 96 +++++++++++++++++++ Cargo.lock | 50 +++++----- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/check-features/Cargo.toml | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- .../configs/getConfigFileMigrationsFactory.js | 8 ++ packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 45 files changed, 171 insertions(+), 67 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb91d62475..39f0b2fe88 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,99 @@ +## [1.4.0](https://github.com/dashpay/platform/compare/v1.4.0-dev.8...v1.4.0) (2024-10-10) + + +### Features + +* **dpp:** added identity public key private key validation methods ([#2235](https://github.com/dashpay/platform/issues/2235)) +* **sdk:** fix client tls connections ([#2223](https://github.com/dashpay/platform/issues/2223)) +* **dpp:** add a convenience method to get the public key data for a private key depending on the key type ([#2214](https://github.com/dashpay/platform/issues/2214)) +* **platform:** add owner keys to identities, fixed verification of use of owner keys ([#2215](https://github.com/dashpay/platform/issues/2215)) +* **sdk:** enable withdrawals v1 in JS SDK ([#2201](https://github.com/dashpay/platform/issues/2201)) +* start network with latest version if genesis version not set ([#2206](https://github.com/dashpay/platform/issues/2206)) +* **dashmate:** confirm a node reset ([#2160](https://github.com/dashpay/platform/issues/2160)) +* **platform:** do not switch to oldest quorums in validator set update ([#2167](https://github.com/dashpay/platform/issues/2167)) +* **platform:** get current quorum info ([#2168](https://github.com/dashpay/platform/issues/2168)) +* **platform:** withdrawals polishing and fixes for mainnet ([#2166](https://github.com/dashpay/platform/issues/2166)) +* **sdk:** change default network to mainnet ([#2161](https://github.com/dashpay/platform/issues/2161)) + + +### Bug Fixes + +* **sdk:** added signing_withdrawal_key_to_use to withdraw sdk call ([#2234](https://github.com/dashpay/platform/issues/2234)) +* **platform:** fixed Platform State deserialization issue ([#2227](https://github.com/dashpay/platform/issues/2227)) +* cookie accepts cookie name, path, and domain with out of bounds characters ([#2211](https://github.com/dashpay/platform/issues/2211)) +* **drive:** set sign height when rebroadcasting ([#2210](https://github.com/dashpay/platform/issues/2210)) +* **sdk:** small sdk improvements and fixes for v1.4 ([#2200](https://github.com/dashpay/platform/issues/2200)) +* **drive-abci:** fix network upgrade to version 4 ([#2189](https://github.com/dashpay/platform/issues/2189)) +* **dashmate:** collect docker stats in the doctor command ([#2180](https://github.com/dashpay/platform/issues/2180)) +* **dashmate:** validate external IP ([#2183](https://github.com/dashpay/platform/issues/2183)) +* **platform:** matched withdrawal fees to actual processing cost ([#2186](https://github.com/dashpay/platform/issues/2186)) +* **platform:** withdrawal automatic retries after core rejection ([#2185](https://github.com/dashpay/platform/issues/2185)) +* **platform:** withdrawal limits ([#2182](https://github.com/dashpay/platform/issues/2182)) +* **sdk:** get node status ([#2139](https://github.com/dashpay/platform/issues/2139)) +* **dapi:** getStatus cache invalidation ([#2155](https://github.com/dashpay/platform/issues/2155)) +* **dapi:** invalid mainnet seed ports ([#2173](https://github.com/dashpay/platform/issues/2173)) +* **dashmate:** cannot read properties of undefined (reading 'expires') ([#2164](https://github.com/dashpay/platform/issues/2164)) +* **dashmate:** colors[updated] is not a function ([#2157](https://github.com/dashpay/platform/issues/2157)) +* **dashmate:** doctor fails collecting to big logs ([#2158](https://github.com/dashpay/platform/issues/2158)) +* **dashmate:** port marks as closed if ipv6 is not disabled ([#2162](https://github.com/dashpay/platform/issues/2162)) +* **dashmate:** remove confusing short flag name ([#2165](https://github.com/dashpay/platform/issues/2165)) + + +### Miscellaneous Chores + +* **dpp:** add method for decoding identifier with unknown string encoding ([#2230](https://github.com/dashpay/platform/issues/2230)) +* **drive:** log invalid state on deserialisation ([#2220](https://github.com/dashpay/platform/issues/2220)) +* **sdk:** expose drive module in public API for rs-sdk ([#2217](https://github.com/dashpay/platform/issues/2217)) +* update dependences ([#2072](https://github.com/dashpay/platform/issues/2072)) +* bump GroveDB dependency ([#2196](https://github.com/dashpay/platform/issues/2196)) +* **drive:** improve withdrawal logging ([#2203](https://github.com/dashpay/platform/issues/2203)) +* **drive:** logs and metrics for withdrawal daily limit ([#2192](https://github.com/dashpay/platform/issues/2192)) +* **release:** replace colima with native docker in macOS builds ([#2188](https://github.com/dashpay/platform/issues/2188)) +* **dashmate:** do not call mint on masternodes ([#2172](https://github.com/dashpay/platform/issues/2172)) +* **platform:** protocol version 4 creation ([#2153](https://github.com/dashpay/platform/issues/2153)) + + +### Code Refactoring + +* **sdk:** contested resource as struct type ([#2225](https://github.com/dashpay/platform/issues/2225)) +* **drive:** remove duplicated withdrawal amount validation ([#2191](https://github.com/dashpay/platform/issues/2191)) + + +### Build System + +* devcontainer support ([#2179](https://github.com/dashpay/platform/issues/2179)) + + +### Continuous Integration + +* prebuild dev containers ([#2184](https://github.com/dashpay/platform/issues/2184)) +* build dashmate on macos14 + + +### Tests + +* **test-suite:** enable withdrawal tests ([#2202](https://github.com/dashpay/platform/issues/2202)) +* **dashmate:** e2e tests failing due to DKG interval check ([#2171](https://github.com/dashpay/platform/issues/2171)) + + +### Documentation + +* **dashmate:** document logging configuration ([#2156](https://github.com/dashpay/platform/issues/2156)) +* update README ([#2219](https://github.com/dashpay/platform/issues/2219)) + + +### ⚠ BREAKING CHANGES + +* **platform:** add owner keys to identities, fixed verification of use of owner keys. While these are breaking changes, they will only happen in Protocol V4. (#2215) +* **platform:** matched withdrawal fees to actual processing cost. Since fees change it is is a breaking change that will take effect in v4 of the protocol. (#2186) +* **platform:** withdrawal automatic retries after core rejection. This is a breaking change that will be marked as active in v1.4 (#2185) +* **platform:** withdrawal limits. This is breaking, and will be activated in version 1.4 (#2182) +* **sdk:** Now if network is not specified, JS SDK will connect to mainnet. (#2161) +* **dashmate:** confirm a node reset. This change will break any non interactive execution of reset command so now the force flag must be provided to skip the reset confirmation. (#2160) +* **platform:** withdrawals polishing and fixes for mainnet. Updating in V4 hard fork. (#2166) +* **platform:** do not switch to oldest quorums in validator set update. This is included as a change in protocol version 4. (#2167) + + ## [1.4.0-dev.8](https://github.com/dashpay/platform/compare/v1.4.0-dev.7...v1.4.0-dev.8) (2024-10-08) diff --git a/Cargo.lock b/Cargo.lock index fcaa082439..a1783ebc24 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -675,7 +675,7 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "check-features" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "toml", ] @@ -1044,7 +1044,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1060,7 +1060,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "dapi-grpc", "heck 0.5.0", @@ -1105,7 +1105,7 @@ dependencies = [ [[package]] name = "dash-sdk" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "arc-swap", "async-trait", @@ -1205,7 +1205,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "platform-value", "platform-version", @@ -1215,7 +1215,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1346,7 +1346,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "platform-value", "platform-version", @@ -1356,7 +1356,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "anyhow", "assert_matches", @@ -1408,7 +1408,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "arc-swap", "assert_matches", @@ -1449,7 +1449,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "arc-swap", "assert_matches", @@ -1504,7 +1504,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "bincode", "dapi-grpc", @@ -1725,7 +1725,7 @@ checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "feature-flags-contract" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "platform-value", "platform-version", @@ -2575,7 +2575,7 @@ dependencies = [ [[package]] name = "json-schema-compatibility-validator" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "assert_matches", "json-patch", @@ -2733,7 +2733,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "platform-value", "platform-version", @@ -3313,7 +3313,7 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "platform-serialization" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "bincode", "platform-version", @@ -3321,7 +3321,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "proc-macro2", "quote", @@ -3331,7 +3331,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "base64 0.22.1", "bincode", @@ -3352,7 +3352,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "quote", "syn 2.0.75", @@ -3360,7 +3360,7 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "bincode", "grovedb-version", @@ -3371,7 +3371,7 @@ dependencies = [ [[package]] name = "platform-versioning" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "proc-macro2", "quote", @@ -3863,7 +3863,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "backon", "chrono", @@ -4330,7 +4330,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "base64 0.22.1", "bincode", @@ -4396,7 +4396,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "bincode", "dpp", @@ -5315,7 +5315,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "anyhow", "async-trait", @@ -5617,7 +5617,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.4.0-dev.8" +version = "1.4.0" dependencies = [ "num_enum 0.5.11", "platform-value", diff --git a/package.json b/package.json index e09d8f5559..dfe0758011 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.4.0-dev.8", + "version": "1.4.0", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index 9b6fcad436..3b83e0ff06 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.4.0-dev.8", + "version": "1.4.0", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/check-features/Cargo.toml b/packages/check-features/Cargo.toml index 3b6028f2e3..2e2ca33b22 100644 --- a/packages/check-features/Cargo.toml +++ b/packages/check-features/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "check-features" -version = "1.4.0-dev.8" +version = "1.4.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index bf4af39109..a25344622c 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.4.0-dev.8" +version = "1.4.0" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index c59cb9d1aa..bbfe77ac10 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.4.0-dev.8", + "version": "1.4.0", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index e41ab91f07..e843ee4e32 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.4.0-dev.8", + "version": "1.4.0", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index 2347b72092..409dcf0ea5 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "2.4.0-dev.8", + "version": "2.4.0", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/configs/getConfigFileMigrationsFactory.js b/packages/dashmate/configs/getConfigFileMigrationsFactory.js index 5fa706c7c4..2620636325 100644 --- a/packages/dashmate/configs/getConfigFileMigrationsFactory.js +++ b/packages/dashmate/configs/getConfigFileMigrationsFactory.js @@ -1011,6 +1011,14 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) }); return configFile; }, + '1.4.0': (configFile) => { + Object.entries(configFile.configs) + .forEach(([, options]) => { + options.platform.drive.abci.docker.image = 'dashpay/drive:1'; + options.platform.dapi.api.docker.image = 'dashpay/dapi:1'; + }); + return configFile; + }, }; } diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index f4affd1289..6debccd8b4 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.4.0-dev.8", + "version": "1.4.0", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index 7ca4e6235f..f3588078e4 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.4.0-dev.8" +version = "1.4.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index 548fdfab72..61fb25e51c 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.4.0-dev.8", + "version": "1.4.0", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index b3e2f39cee..8aa3850d0c 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.4.0-dev.8" +version = "1.4.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 192b13af0a..76a32b11ff 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.4.0-dev.8" +version = "1.4.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index aa6d3cf0e8..6c755ddadb 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.4.0-dev.8", + "version": "1.4.0", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index 12d6b4df0b..32a924ac7f 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.4.0-dev.8" +version = "1.4.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index c10ce31d4e..e5ca99e0bf 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.4.0-dev.8", + "version": "1.4.0", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index 31a02a53e1..d2fb8e05f4 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.4.0-dev.8", + "version": "1.4.0", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index 551b95e254..a8ea9eec0b 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.4.0-dev.8", + "version": "4.4.0", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index 27b69fe125..f03173e570 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.4.0-dev.8", + "version": "1.4.0", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index 53eb117be4..cec3b5c509 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.4.0-dev.8" +version = "1.4.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index f10231a2ed..86e84d4acd 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.4.0-dev.8", + "version": "1.4.0", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index 1436edb885..d765fbc32c 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.4.0-dev.8", + "version": "1.4.0", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index cf944603a3..7b63e47f79 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.4.0-dev.8" +version = "1.4.0" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index c2f1a05b64..73baa82706 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.4.0-dev.8" +version = "1.4.0" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index eafc2c232f..202fc344ca 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.4.0-dev.8" +version = "1.4.0" edition = "2021" rust-version.workspace = true authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 75333a4fba..2e1f9fc5c8 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.4.0-dev.8" +version = "1.4.0" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index a3612cb0de..e5cd005a7c 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.4.0-dev.8" +version = "1.4.0" edition = "2021" rust-version.workspace = true diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index f7a641ca18..4ae5b5bcdb 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.4.0-dev.8" +version = "1.4.0" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-json-schema-compatibility-validator/Cargo.toml b/packages/rs-json-schema-compatibility-validator/Cargo.toml index 9b53e16651..24703a2da8 100644 --- a/packages/rs-json-schema-compatibility-validator/Cargo.toml +++ b/packages/rs-json-schema-compatibility-validator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "json-schema-compatibility-validator" -version = "1.4.0-dev.8" +version = "1.4.0" edition = "2021" rust-version.workspace = true authors = ["Ivan Shumkov "] diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index 0a319be2ea..86f21057a6 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.4.0-dev.8" +version = "1.4.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index 681d00e4b4..0faa783e88 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.4.0-dev.8" +version = "1.4.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index 3d1b56ca01..99ebdaa250 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.4.0-dev.8" +version = "1.4.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index 7789994d4c..b24bd08431 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.4.0-dev.8" +version = "1.4.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index c719edc92a..8f130491d7 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Versioning library for Platform" -version = "1.4.0-dev.8" +version = "1.4.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index e064c13b91..bd138b068d 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.4.0-dev.8" +version = "1.4.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index b5d33176b1..43333af6ff 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dash-sdk" -version = "1.4.0-dev.8" +version = "1.4.0" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index 3f8c78bb28..24d6affaac 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.4.0-dev.8" +version = "1.4.0" edition = "2021" rust-version.workspace = true diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index 108e4446d8..75a040a7a9 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.4.0-dev.8" +version = "1.4.0" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 7c90d720bf..047705b1e9 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.4.0-dev.8", + "version": "8.4.0", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index c70ce583dd..45ab37a3a2 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.4.0-dev.8" +version = "1.4.0" edition = "2021" rust-version.workspace = true authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index 824d08221e..be7a9991b1 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.4.0-dev.8", + "version": "1.4.0", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index 7a330aa1a1..2a08d84753 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.4.0-dev.8" +version = "1.4.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index 50657efdea..3b4f2b14ee 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.4.0-dev.8", + "version": "1.4.0", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From 7da5601e5b2c4ea3a55728d66039a89d22ca0181 Mon Sep 17 00:00:00 2001 From: lklimek <842586+lklimek@users.noreply.github.com> Date: Thu, 10 Oct 2024 14:33:47 +0200 Subject: [PATCH 60/90] refactor(sdk)!: improve mock context provider async processing (#2232) Co-authored-by: Quantum Explorer --- Cargo.lock | 23 ++- packages/rs-drive-proof-verifier/src/error.rs | 4 + packages/rs-sdk/Cargo.toml | 5 +- packages/rs-sdk/examples/read_contract.rs | 5 +- .../dash_core_client.rs} | 26 ++- packages/rs-sdk/src/core/mod.rs | 4 + packages/rs-sdk/src/lib.rs | 3 +- packages/rs-sdk/src/mock/provider.rs | 15 +- packages/rs-sdk/src/mock/sdk.rs | 165 +++++++++-------- .../src/platform/block_info_from_metadata.rs | 4 +- .../transition/withdraw_from_identity.rs | 5 +- packages/rs-sdk/src/sdk.rs | 66 ++++--- packages/rs-sdk/src/sync.rs | 171 ++++++++++++++++++ packages/rs-sdk/tests/fetch/config.rs | 10 +- .../rs-sdk/tests/fetch/contested_resource.rs | 51 +++--- .../fetch/contested_resource_vote_state.rs | 2 +- packages/rs-sdk/tests/fetch/mock_fetch.rs | 3 +- 17 files changed, 397 insertions(+), 165 deletions(-) rename packages/rs-sdk/src/{core_client.rs => core/dash_core_client.rs} (89%) create mode 100644 packages/rs-sdk/src/sync.rs diff --git a/Cargo.lock b/Cargo.lock index a1783ebc24..24cbb1a6e9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1128,7 +1128,6 @@ dependencies = [ "hex", "http", "lru", - "pollster", "rs-dapi-client", "sanitize-filename", "serde", @@ -1140,6 +1139,7 @@ dependencies = [ "tokio-util", "tracing", "tracing-subscriber", + "zeroize", ] [[package]] @@ -3406,12 +3406,6 @@ dependencies = [ "plotters-backend", ] -[[package]] -name = "pollster" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2" - [[package]] name = "portable-atomic" version = "1.7.0" @@ -5669,6 +5663,21 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "serde", + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.75", +] [[package]] name = "zip" diff --git a/packages/rs-drive-proof-verifier/src/error.rs b/packages/rs-drive-proof-verifier/src/error.rs index 02752a4b12..3203eb7317 100644 --- a/packages/rs-drive-proof-verifier/src/error.rs +++ b/packages/rs-drive-proof-verifier/src/error.rs @@ -106,6 +106,10 @@ pub enum ContextProviderError { /// Core Fork Error #[error("activation fork error: {0}")] ActivationForkError(String), + + /// Async error, eg. when tokio runtime fails + #[error("async error: {0}")] + AsyncError(String), } impl From for Error { diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 43333af6ff..788bd8a593 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -18,7 +18,7 @@ drive-proof-verifier = { path = "../rs-drive-proof-verifier" } dapi-grpc-macros = { path = "../rs-dapi-grpc-macros" } http = { version = "1.1" } thiserror = "1.0.64" -tokio = { version = "1.40", features = ["macros"] } +tokio = { version = "1.40", features = ["macros", "rt-multi-thread"] } tokio-util = { version = "0.7.12" } async-trait = { version = "0.1.83" } ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined" } @@ -36,7 +36,7 @@ derive_more = { version = "1.0", features = ["from"] } dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.4" } lru = { version = "0.12.3", optional = true } bip37-bloom-filter = { git = "https://github.com/dashpay/rs-bip37-bloom-filter", branch = "develop" } -pollster = { version = "0.3.0" } +zeroize = { version = "1.8", features = ["derive"] } [dev-dependencies] tokio = { version = "1.40", features = ["macros", "rt-multi-thread"] } @@ -71,6 +71,7 @@ mocks = [ "dep:dotenvy", "dep:envy", "dep:lru", + "zeroize/serde", ] # Run integration tests using test vectors from `tests/vectors/` instead of connecting to live Dash Platform. diff --git a/packages/rs-sdk/examples/read_contract.rs b/packages/rs-sdk/examples/read_contract.rs index ca37f1cfa7..7ac2cc333d 100644 --- a/packages/rs-sdk/examples/read_contract.rs +++ b/packages/rs-sdk/examples/read_contract.rs @@ -4,6 +4,7 @@ use clap::Parser; use dash_sdk::{mock::provider::GrpcContextProvider, platform::Fetch, Sdk, SdkBuilder}; use dpp::prelude::{DataContract, Identifier}; use rs_dapi_client::AddressList; +use zeroize::Zeroizing; #[derive(clap::Parser, Debug)] #[command(version)] @@ -22,7 +23,7 @@ pub struct Config { // Dash Core RPC password #[arg(short = 'p', long)] - pub core_password: String, + pub core_password: Zeroizing, /// Dash Platform DAPI port #[arg(short = 'd', long)] @@ -86,7 +87,7 @@ fn setup_sdk(config: &Config) -> Sdk { .expect("parse uri"); // Now, we create the Sdk with the wallet and context provider. - let mut sdk = SdkBuilder::new(AddressList::from_iter([uri])) + let sdk = SdkBuilder::new(AddressList::from_iter([uri])) .build() .expect("cannot build sdk"); diff --git a/packages/rs-sdk/src/core_client.rs b/packages/rs-sdk/src/core/dash_core_client.rs similarity index 89% rename from packages/rs-sdk/src/core_client.rs rename to packages/rs-sdk/src/core/dash_core_client.rs index e68bb6166d..d59af4207c 100644 --- a/packages/rs-sdk/src/core_client.rs +++ b/packages/rs-sdk/src/core/dash_core_client.rs @@ -14,20 +14,33 @@ use dpp::dashcore::ProTxHash; use dpp::prelude::CoreBlockHeight; use drive_proof_verifier::error::ContextProviderError; use std::{fmt::Debug, sync::Mutex}; +use zeroize::Zeroizing; /// Core RPC client that can be used to retrieve quorum keys from core. /// -/// Implements [`ContextProvider`] trait. -/// /// TODO: This is a temporary implementation, effective until we integrate SPV. -pub struct CoreClient { +pub struct LowLevelDashCoreClient { core: Mutex, server_address: String, core_user: String, + core_password: Zeroizing, core_port: u16, } -impl Debug for CoreClient { +impl Clone for LowLevelDashCoreClient { + // As Client does not implement Clone, we just create a new instance of CoreClient here. + fn clone(&self) -> Self { + LowLevelDashCoreClient::new( + &self.server_address, + self.core_port, + &self.core_user, + &self.core_password, + ) + .expect("Failed to clone CoreClient when cloning, this should not happen") + } +} + +impl Debug for LowLevelDashCoreClient { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("CoreClient") .field("server_address", &self.server_address) @@ -37,7 +50,7 @@ impl Debug for CoreClient { } } -impl CoreClient { +impl LowLevelDashCoreClient { /// Create new Dash Core client. /// /// # Arguments @@ -63,13 +76,14 @@ impl CoreClient { core: Mutex::new(core), server_address: server_address.to_string(), core_user: core_user.to_string(), + core_password: core_password.to_string().into(), core_port, }) } } // Wallet functions -impl CoreClient { +impl LowLevelDashCoreClient { /// List unspent transactions /// /// ## Arguments diff --git a/packages/rs-sdk/src/core/mod.rs b/packages/rs-sdk/src/core/mod.rs index ed7d4726cf..f642f3b26f 100644 --- a/packages/rs-sdk/src/core/mod.rs +++ b/packages/rs-sdk/src/core/mod.rs @@ -1,4 +1,8 @@ //! Dash Core SDK implementation. //! //! TODO: This is work in progress. +#[cfg(feature = "mocks")] +mod dash_core_client; mod transaction; +#[cfg(feature = "mocks")] +pub use dash_core_client::LowLevelDashCoreClient; diff --git a/packages/rs-sdk/src/lib.rs b/packages/rs-sdk/src/lib.rs index 7f18174610..1f928ab6db 100644 --- a/packages/rs-sdk/src/lib.rs +++ b/packages/rs-sdk/src/lib.rs @@ -62,8 +62,6 @@ #![allow(rustdoc::private_intra_doc_links)] pub mod core; -#[cfg(feature = "mocks")] -mod core_client; pub mod error; mod internal_cache; pub mod mock; @@ -78,6 +76,7 @@ pub use dpp; pub use drive; pub use drive_proof_verifier::types as query_types; pub use rs_dapi_client as dapi_client; +pub mod sync; /// Version of the SDK pub const VERSION: &str = env!("CARGO_PKG_VERSION"); diff --git a/packages/rs-sdk/src/mock/provider.rs b/packages/rs-sdk/src/mock/provider.rs index 8c0297bf47..879c4137eb 100644 --- a/packages/rs-sdk/src/mock/provider.rs +++ b/packages/rs-sdk/src/mock/provider.rs @@ -1,13 +1,13 @@ //! Example ContextProvider that uses the Core gRPC API to fetch data from Platform. -use crate::core_client::CoreClient; +use crate::core::LowLevelDashCoreClient; use crate::platform::Fetch; +use crate::sync::block_on; use crate::{Error, Sdk}; use arc_swap::ArcSwapAny; use dpp::prelude::{CoreBlockHeight, DataContract, Identifier}; use drive_proof_verifier::error::ContextProviderError; use drive_proof_verifier::ContextProvider; -use pollster::FutureExt; use std::hash::Hash; use std::num::NonZeroUsize; use std::sync::Arc; @@ -17,7 +17,7 @@ use std::sync::Arc; /// Example [ContextProvider] used by the Sdk for testing purposes. pub struct GrpcContextProvider { /// Core client - core: CoreClient, + core: LowLevelDashCoreClient, /// [Sdk] to use when fetching data from Platform /// /// Note that if the `sdk` is `None`, the context provider will not be able to fetch data itself and will rely on @@ -62,7 +62,8 @@ impl GrpcContextProvider { data_contracts_cache_size: NonZeroUsize, quorum_public_keys_cache_size: NonZeroUsize, ) -> Result { - let core_client = CoreClient::new(core_ip, core_port, core_user, core_password)?; + let core_client = + LowLevelDashCoreClient::new(core_ip, core_port, core_user, core_password)?; Ok(Self { core: core_client, sdk: ArcSwapAny::new(Arc::new(sdk)), @@ -197,9 +198,9 @@ impl ContextProvider for GrpcContextProvider { let sdk_cloned = sdk.clone(); - let data_contract: Option = DataContract::fetch(&sdk_cloned, contract_id) - .block_on() - .map_err(|e| ContextProviderError::DataContractFailure(e.to_string()))?; + let data_contract: Option = + block_on(async move { DataContract::fetch(&sdk_cloned, contract_id).await })? + .map_err(|e| ContextProviderError::DataContractFailure(e.to_string()))?; if let Some(ref dc) = data_contract { self.data_contracts_cache.put(*data_contract_id, dc.clone()); diff --git a/packages/rs-sdk/src/mock/sdk.rs b/packages/rs-sdk/src/mock/sdk.rs index 02258c0cd1..bc9c392771 100644 --- a/packages/rs-sdk/src/mock/sdk.rs +++ b/packages/rs-sdk/src/mock/sdk.rs @@ -6,6 +6,7 @@ use crate::{ types::{evonode::EvoNode, identity::IdentityRequest}, DocumentQuery, Fetch, FetchMany, Query, }, + sync::block_on, Error, Sdk, }; use arc_swap::ArcSwapOption; @@ -24,7 +25,7 @@ use rs_dapi_client::{ DapiClient, DumpData, }; use std::{collections::BTreeMap, path::PathBuf, sync::Arc}; -use tokio::sync::Mutex; +use tokio::sync::{Mutex, OwnedMutexGuard}; use super::MockResponse; @@ -82,6 +83,17 @@ impl MockDashPlatformSdk { self.platform_version } + /// Load all expectations from files in a directory asynchronously. + /// + /// See [MockDashPlatformSdk::load_expectations_sync()] for more details. + #[deprecated(since = "1.4.0", note = "use load_expectations_sync")] + pub async fn load_expectations + Send + 'static>( + &mut self, + dir: P, + ) -> Result<&mut Self, Error> { + self.load_expectations_sync(dir) + } + /// Load all expectations from files in a directory. /// /// @@ -89,7 +101,7 @@ impl MockDashPlatformSdk { /// This function can be used to load expectations after the Sdk is created, or use alternative location. /// Expectation files must be prefixed with [DapiClient::DUMP_FILE_PREFIX] and /// have `.json` extension. - pub async fn load_expectations>( + pub fn load_expectations_sync>( &mut self, dir: P, ) -> Result<&mut Self, Error> { @@ -114,97 +126,80 @@ impl MockDashPlatformSdk { .map(|f| f.path()) .collect(); + let mut dapi = block_on(self.dapi.clone().lock_owned())?; + for filename in &files { let basename = filename.file_name().unwrap().to_str().unwrap(); let request_type = basename.split('_').nth(1).unwrap_or_default(); match request_type { - "DocumentQuery" => self.load_expectation::(filename).await?, + "DocumentQuery" => load_expectation::(&mut dapi, filename)?, "GetEpochsInfoRequest" => { - self.load_expectation::(filename) - .await? + load_expectation::(&mut dapi, filename)? } "GetDataContractRequest" => { - self.load_expectation::(filename) - .await? + load_expectation::(&mut dapi, filename)? } "GetDataContractsRequest" => { - self.load_expectation::(filename) - .await? + load_expectation::(&mut dapi, filename)? } "GetDataContractHistoryRequest" => { - self.load_expectation::(filename) - .await? + load_expectation::(&mut dapi, filename)? } - "IdentityRequest" => self.load_expectation::(filename).await?, + "IdentityRequest" => load_expectation::(&mut dapi, filename)?, "GetIdentityRequest" => { - self.load_expectation::(filename) - .await? + load_expectation::(&mut dapi, filename)? } "GetIdentityBalanceRequest" => { - self.load_expectation::(filename) - .await? + load_expectation::(&mut dapi, filename)? } "GetIdentityContractNonceRequest" => { - self.load_expectation::(filename) - .await? - } - "GetIdentityBalanceAndRevisionRequest" => { - self.load_expectation::(filename) - .await? + load_expectation::(&mut dapi, filename)? } + "GetIdentityBalanceAndRevisionRequest" => load_expectation::< + proto::GetIdentityBalanceAndRevisionRequest, + >(&mut dapi, filename)?, "GetIdentityKeysRequest" => { - self.load_expectation::(filename) - .await? - } - "GetProtocolVersionUpgradeStateRequest" => { - self.load_expectation::(filename) - .await? + load_expectation::(&mut dapi, filename)? } + "GetProtocolVersionUpgradeStateRequest" => load_expectation::< + proto::GetProtocolVersionUpgradeStateRequest, + >(&mut dapi, filename)?, "GetProtocolVersionUpgradeVoteStatusRequest" => { - self.load_expectation::( - filename, - ) - .await? + load_expectation::( + &mut dapi, filename, + )? } "GetContestedResourcesRequest" => { - self.load_expectation::(filename) - .await? - } - "GetContestedResourceVoteStateRequest" => { - self.load_expectation::(filename) - .await? + load_expectation::(&mut dapi, filename)? } + "GetContestedResourceVoteStateRequest" => load_expectation::< + proto::GetContestedResourceVoteStateRequest, + >(&mut dapi, filename)?, "GetContestedResourceVotersForIdentityRequest" => { - self.load_expectation::( - filename, - ) - .await? + load_expectation::( + &mut dapi, filename, + )? } "GetContestedResourceIdentityVotesRequest" => { - self.load_expectation::( - filename, - ) - .await? + load_expectation::( + &mut dapi, filename, + )? } "GetVotePollsByEndDateRequest" => { - self.load_expectation::(filename) - .await? - } - "GetPrefundedSpecializedBalanceRequest" => { - self.load_expectation::(filename) - .await? + load_expectation::(&mut dapi, filename)? } + "GetPrefundedSpecializedBalanceRequest" => load_expectation::< + proto::GetPrefundedSpecializedBalanceRequest, + >(&mut dapi, filename)?, "GetPathElementsRequest" => { - self.load_expectation::(filename) - .await? - } - "GetTotalCreditsInPlatformRequest" => { - self.load_expectation::(filename) - .await? + load_expectation::(&mut dapi, filename)? } - "EvoNode" => self.load_expectation::(filename).await?, + "GetTotalCreditsInPlatformRequest" => load_expectation::< + proto::GetTotalCreditsInPlatformRequest, + >(&mut dapi, filename)?, + "EvoNode" => load_expectation::(&mut dapi, filename)?, _ => { return Err(Error::Config(format!( "unknown request type {} in {}, missing match arm in load_expectations?", @@ -218,21 +213,6 @@ impl MockDashPlatformSdk { Ok(self) } - async fn load_expectation(&mut self, path: &PathBuf) -> Result<(), Error> { - let data = DumpData::::load(path) - .map_err(|e| { - Error::Config(format!( - "cannot load mock expectations from {}: {}", - path.display(), - e - )) - })? - .deserialize(); - - self.dapi.lock().await.expect(&data.0, &data.1)?; - Ok(()) - } - /// Expect a [Fetch] request and return provided object. /// /// This method is used to define mock expectations for [Fetch] requests. @@ -304,7 +284,7 @@ impl MockDashPlatformSdk { /// ## Generic Parameters /// /// - `O`: Type of the object that will be returned in response to the query. - /// Must implement [FetchMany]. `Vec` must implement [MockResponse]. + /// Must implement [FetchMany]. `Vec` must implement [MockResponse]. /// - `Q`: Type of the query that will be sent to Platform. Must implement [Query] and [Mockable]. /// /// ## Arguments @@ -330,20 +310,23 @@ impl MockDashPlatformSdk { K: Ord, O: FetchMany, Q: Query<>::Request>, - R: FromIterator<(K, Option)> + MockResponse + Send + Default, + R, >( &mut self, query: Q, objects: Option, ) -> Result<&mut Self, Error> where - R: MockResponse, - <>::Request as TransportRequest>::Response: Default, - R: FromProof< + R: FromIterator<(K, Option)> + + MockResponse + + FromProof< >::Request, Request = >::Request, Response = <>::Request as TransportRequest>::Response, - > + Sync, + > + Sync + + Send + + Default, + <>::Request as TransportRequest>::Response: Default, { let grpc_request = query.query(self.prove()).expect("query must be correct"); self.expect(grpc_request, objects).await?; @@ -431,3 +414,25 @@ impl MockDashPlatformSdk { } } } + +/// Load expectation from file and save it to `dapi_guard` mock Dapi client. +/// +/// This function is used to load expectations from files in a directory. +/// It is implemented without reference to the `MockDashPlatformSdk` object +/// to make it easier to use in async context. +fn load_expectation( + dapi_guard: &mut OwnedMutexGuard, + path: &PathBuf, +) -> Result<(), Error> { + let data = DumpData::::load(path) + .map_err(|e| { + Error::Config(format!( + "cannot load mock expectations from {}: {}", + path.display(), + e + )) + })? + .deserialize(); + dapi_guard.expect(&data.0, &data.1)?; + Ok(()) +} diff --git a/packages/rs-sdk/src/platform/block_info_from_metadata.rs b/packages/rs-sdk/src/platform/block_info_from_metadata.rs index 713e1e176d..5e96e13655 100644 --- a/packages/rs-sdk/src/platform/block_info_from_metadata.rs +++ b/packages/rs-sdk/src/platform/block_info_from_metadata.rs @@ -12,8 +12,8 @@ use drive::error::proof::ProofError; /// /// # Parameters /// - `response_metadata`: A reference to `ResponseMetadata` obtained from a platform response. -/// This metadata includes various block-related information such as time in milliseconds, -/// height, core chain locked height, and epoch. +/// This metadata includes various block-related information such as time in milliseconds, +/// height, core chain locked height, and epoch. /// /// # Returns /// If successful, returns `Ok(BlockInfo)` where `BlockInfo` contains: diff --git a/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs b/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs index ce6d32e071..1d72c86e07 100644 --- a/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs +++ b/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs @@ -4,7 +4,6 @@ use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::core_script::CoreScript; use dpp::identity::signer::Signer; use dpp::identity::{Identity, IdentityPublicKey}; -use dpp::prelude::UserFeeIncrease; use crate::platform::transition::broadcast::BroadcastStateTransition; use crate::platform::transition::put_settings::PutSettings; @@ -47,9 +46,7 @@ impl WithdrawFromIdentity for Identity { ) -> Result { let new_identity_nonce = sdk.get_identity_nonce(self.id(), true, settings).await?; let script = address.map(|address| CoreScript::new(address.script_pubkey())); - let user_fee_increase = settings - .map(|settings| settings.user_fee_increase) - .flatten(); + let user_fee_increase = settings.and_then(|settings| settings.user_fee_increase); let state_transition = IdentityCreditWithdrawalTransition::try_from_identity( self, script, diff --git a/packages/rs-sdk/src/sdk.rs b/packages/rs-sdk/src/sdk.rs index abd02e184c..f7f938703d 100644 --- a/packages/rs-sdk/src/sdk.rs +++ b/packages/rs-sdk/src/sdk.rs @@ -7,6 +7,7 @@ use crate::mock::MockResponse; use crate::mock::{provider::GrpcContextProvider, MockDashPlatformSdk}; use crate::platform::transition::put_settings::PutSettings; use crate::platform::{Fetch, Identifier}; +use arc_swap::{ArcSwapAny, ArcSwapOption}; use dapi_grpc::mock::Mockable; use dapi_grpc::platform::v0::{Proof, ResponseMetadata}; use dpp::bincode; @@ -40,6 +41,7 @@ use std::time::{SystemTime, UNIX_EPOCH}; #[cfg(feature = "mocks")] use tokio::sync::{Mutex, MutexGuard}; use tokio_util::sync::{CancellationToken, WaitForCancellationFuture}; +use zeroize::Zeroizing; /// How many data contracts fit in the cache. pub const DEFAULT_CONTRACT_CACHE_SIZE: usize = 100; @@ -79,7 +81,6 @@ pub type LastQueryTimestamp = u64; /// ## Examples /// /// See tests/ for examples of using the SDK. -#[derive(Clone)] pub struct Sdk { /// The network that the sdk is configured for (Dash (mainnet), Testnet, Devnet, Regtest) pub network: Network, @@ -97,7 +98,7 @@ pub struct Sdk { /// ## Panics /// /// Note that setting this to None can panic. - context_provider: Option>>, + context_provider: ArcSwapOption>, /// Cancellation token; once cancelled, all pending requests should be aborted. pub(crate) cancel_token: CancellationToken, @@ -105,6 +106,20 @@ pub struct Sdk { #[cfg(feature = "mocks")] dump_dir: Option, } +impl Clone for Sdk { + fn clone(&self) -> Self { + Self { + network: self.network, + inner: self.inner.clone(), + proofs: self.proofs, + internal_cache: Arc::clone(&self.internal_cache), + context_provider: ArcSwapOption::new(self.context_provider.load_full()), + cancel_token: self.cancel_token.clone(), + #[cfg(feature = "mocks")] + dump_dir: self.dump_dir.clone(), + } + } +} impl Debug for Sdk { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -203,8 +218,7 @@ impl Sdk { O::Request: Mockable, { let provider = self - .context_provider - .as_ref() + .context_provider() .ok_or(drive_proof_verifier::Error::ContextProviderNotSet)?; match self.inner { @@ -243,8 +257,7 @@ impl Sdk { O::Request: Mockable, { let provider = self - .context_provider - .as_ref() + .context_provider() .ok_or(drive_proof_verifier::Error::ContextProviderNotSet)?; match self.inner { @@ -262,8 +275,13 @@ impl Sdk { } } } + + /// Return [ContextProvider] used by the SDK. pub fn context_provider(&self) -> Option { - self.context_provider.as_ref().map(Arc::clone) + let provider_guard = self.context_provider.load(); + let provider = provider_guard.as_ref().map(Arc::clone); + + provider } /// Returns a mutable reference to the `MockDashPlatformSdk` instance. @@ -493,9 +511,9 @@ impl Sdk { /// [ContextProvider] is used to access state information, like data contracts and quorum public keys. /// /// Note that this will overwrite any previous context provider. - pub fn set_context_provider(&mut self, context_provider: C) { + pub fn set_context_provider(&self, context_provider: C) { self.context_provider - .replace(Arc::new(Box::new(context_provider))); + .swap(Some(Arc::new(Box::new(context_provider)))); } /// Returns a future that resolves when the Sdk is cancelled (eg. shutdown was requested). @@ -568,7 +586,7 @@ pub struct SdkBuilder { core_ip: String, core_port: u16, core_user: String, - core_password: String, + core_password: Zeroizing, /// If true, request and verify proofs of the responses. proofs: bool, @@ -604,7 +622,7 @@ impl Default for SdkBuilder { network: Network::Dash, core_ip: "".to_string(), core_port: 0, - core_password: "".to_string(), + core_password: "".to_string().into(), core_user: "".to_string(), proofs: true, @@ -727,7 +745,7 @@ impl SdkBuilder { self.core_ip = ip.to_string(); self.core_port = port; self.core_user = user.to_string(); - self.core_password = password.to_string(); + self.core_password = Zeroizing::from(password.to_string()); self } @@ -772,16 +790,18 @@ impl SdkBuilder { network: self.network, inner:SdkInstance::Dapi { dapi, version:self.version }, proofs:self.proofs, - context_provider: self.context_provider.map(Arc::new), + context_provider: ArcSwapOption::new( self.context_provider.map(Arc::new)), cancel_token: self.cancel_token, #[cfg(feature = "mocks")] dump_dir: self.dump_dir, internal_cache: Default::default(), }; // if context provider is not set correctly (is None), it means we need to fallback to core wallet - if sdk.context_provider.is_none() { + if sdk.context_provider.load().is_none() { #[cfg(feature = "mocks")] if !self.core_ip.is_empty() { + tracing::warn!( + "ContextProvider not set, falling back to a mock one; use SdkBuilder::with_context_provider() to set it up"); let mut context_provider = GrpcContextProvider::new(None, &self.core_ip, self.core_port, &self.core_user, &self.core_password, self.data_contract_cache_size, self.quorum_public_keys_cache_size)?; @@ -792,15 +812,19 @@ impl SdkBuilder { // We have cyclical dependency Sdk <-> GrpcContextProvider, so we just do some // workaround using additional Arc. let context_provider= Arc::new(context_provider); - sdk.context_provider.replace(Arc::new(Box::new(context_provider.clone()))); + sdk.context_provider.swap(Some(Arc::new(Box::new(context_provider.clone())))); context_provider.set_sdk(Some(sdk.clone())); } else{ - tracing::warn!( - "Configure ContextProvider with Sdk::with_context_provider(); otherwise Sdk will fail"); + return Err(Error::Config(concat!( + "context provider is not set, configure it with SdkBuilder::with_context_provider() ", + "or configure Core access with SdkBuilder::with_core() to use mock context provider") + .to_string())); } #[cfg(not(feature = "mocks"))] - tracing::warn!( - "Configure ContextProvider with Sdk::with_context_provider(); otherwise Sdk will fail"); + return Err(Error::Config(concat!( + "context provider is not set, configure it with SdkBuilder::with_context_provider() ", + "or enable `mocks` feature to use mock context provider") + .to_string())); }; sdk @@ -831,13 +855,13 @@ impl SdkBuilder { dump_dir: self.dump_dir.clone(), proofs:self.proofs, internal_cache: Default::default(), - context_provider:Some(Arc::new(context_provider)), + context_provider:ArcSwapAny::new( Some(Arc::new(context_provider))), cancel_token: self.cancel_token, }; let mut guard = mock_sdk.try_lock().expect("mock sdk is in use by another thread and connot be reconfigured"); guard.set_sdk(sdk.clone()); if let Some(ref dump_dir) = self.dump_dir { - pollster::block_on( guard.load_expectations(dump_dir))?; + guard.load_expectations_sync(dump_dir)?; }; sdk diff --git a/packages/rs-sdk/src/sync.rs b/packages/rs-sdk/src/sync.rs new file mode 100644 index 0000000000..d3c066e8cb --- /dev/null +++ b/packages/rs-sdk/src/sync.rs @@ -0,0 +1,171 @@ +//! Handle async calls from sync code. +//! +//! This is a workaround for an issue in tokio, where you cannot call `block_on` from sync call that is called +//! inside a tokio runtime. This module spawns async futures in active tokio runtime, and retrieves the result +//! using a channel. +use drive_proof_verifier::error::ContextProviderError; +use std::{future::Future, sync::mpsc::SendError}; +use tokio::runtime::TryCurrentError; + +#[derive(Debug, thiserror::Error)] +pub enum AsyncError { + /// Not running inside tokio runtime + #[error("not running inside tokio runtime: {0}")] + NotInTokioRuntime(#[from] TryCurrentError), + + /// Cannot receive response from async function + #[error("cannot receive response from async function: {0}")] + RecvError(#[from] std::sync::mpsc::RecvError), + + /// Cannot send response from async function + #[error("cannot send response from async function: {0}")] + SendError(String), + + #[error("asynchronous call from synchronous context failed: {0}")] + #[allow(unused)] + Generic(String), +} + +impl From> for AsyncError { + fn from(error: SendError) -> Self { + Self::SendError(error.to_string()) + } +} + +impl From for ContextProviderError { + fn from(error: AsyncError) -> Self { + ContextProviderError::AsyncError(error.to_string()) + } +} + +impl From for crate::Error { + fn from(error: AsyncError) -> Self { + Self::ContextProviderError(error.into()) + } +} + +/// Blocks on the provided future and returns the result. +/// +/// This function is used to call async functions from sync code. +/// Requires the current thread to be running in a tokio runtime. +/// +/// Due to limitations of tokio runtime, we cannot use `tokio::runtime::Runtime::block_on` if we are already inside a tokio runtime. +/// This function is a workaround for that limitation. +pub fn block_on(fut: F) -> Result +where + F: Future + Send + 'static, + F::Output: Send, +{ + tracing::trace!("block_on: running async function from sync code"); + let rt = tokio::runtime::Handle::try_current()?; + let (tx, rx) = std::sync::mpsc::channel(); + tracing::trace!("block_on: Spawning worker"); + let hdl = rt.spawn(worker(fut, tx)); + tracing::trace!("block_on: Worker spawned"); + let resp = tokio::task::block_in_place(|| rx.recv())?; + + tracing::trace!("Response received"); + if !hdl.is_finished() { + tracing::debug!("async-sync worker future is not finished, aborting; this should not happen, but it's fine"); + hdl.abort(); // cleanup the worker future + } + + Ok(resp) +} + +/// Worker function that runs the provided future and sends the result back to the caller using oneshot channel. +async fn worker( + fut: F, + // response: oneshot::Sender, + response: std::sync::mpsc::Sender, +) -> Result<(), AsyncError> { + tracing::trace!("Worker start"); + let result = fut.await; + tracing::trace!("Worker async function completed, sending response"); + response.send(result)?; + tracing::trace!("Worker response sent"); + + Ok(()) +} + +#[cfg(test)] +mod test { + use super::*; + use std::future::Future; + use tokio::{ + runtime::Builder, + sync::mpsc::{self, Receiver}, + }; + + /// Test for block_on with async code that calls sync code, which then calls async code again. + /// + /// Given: An async function that calls a sync function, which then calls another async function. + /// When: The async function is executed using block_on. + /// Then: Other threads can still do some work + #[test] + fn test_block_on_nested_async_sync() { + let rt = Builder::new_multi_thread() + .worker_threads(1) // we should be good with 1 worker thread + .max_blocking_threads(1) // we should be good with 1 blocking thread + .enable_all() + .build() + .expect("Failed to create Tokio runtime"); + // we repeat this test a few times, to make sure it's stable + for _repeat in 0..5 { + // Create a Tokio runtime; we use the current thread runtime for this test. + + const MSGS: usize = 10; + let (tx, rx) = mpsc::channel::(1); + + // Spawn new worker that will just count. + let worker = async move { + for count in 0..MSGS { + tx.send(count).await.unwrap(); + } + }; + let worker_join = rt.spawn(worker); + // Define the number of levels of execution + let levels = 4; + + // Define the innermost async function + async fn innermost_async_function( + mut rx: Receiver, + ) -> Result { + for i in 0..MSGS { + let count = rx.recv().await.unwrap(); + assert_eq!(count, i); + } + + Ok(String::from("Success")) + } + + // Define the nested sync function + fn nested_sync_function(fut: F) -> Result + where + F: Future> + Send + 'static, + F::Output: Send, + { + block_on(fut)?.map_err(|e| ContextProviderError::Generic(e.to_string())) + } + + // Define the outer async function + async fn outer_async_function( + levels: usize, + rx: Receiver, + ) -> Result { + let mut result = innermost_async_function(rx).await; + for _ in 0..levels { + result = nested_sync_function(async { result }); + } + result + } + + // Run the outer async function using block_on + let result = rt.block_on(outer_async_function(levels, rx)); + + rt.block_on(worker_join).unwrap(); + // Assert the result + assert_eq!(result.unwrap(), "Success"); + } + } +} diff --git a/packages/rs-sdk/tests/fetch/config.rs b/packages/rs-sdk/tests/fetch/config.rs index 445904795d..1b6efbc615 100644 --- a/packages/rs-sdk/tests/fetch/config.rs +++ b/packages/rs-sdk/tests/fetch/config.rs @@ -11,6 +11,7 @@ use dpp::{ use rs_dapi_client::AddressList; use serde::Deserialize; use std::{path::PathBuf, str::FromStr}; +use zeroize::Zeroizing; /// Existing document ID /// @@ -43,7 +44,7 @@ pub struct Config { pub core_user: String, /// Password for Dash Core RPC interface #[serde(default)] - pub core_password: String, + pub core_password: Zeroizing, /// When true, use SSL for the Dash Platform node grpc interface #[serde(default)] pub platform_ssl: bool, @@ -71,6 +72,7 @@ pub struct Config { /// ID of document of the type [`existing_document_type_name`](Config::existing_document_type_name) /// in [`existing_data_contract_id`](Config::existing_data_contract_id). #[serde(default = "Config::default_document_id")] + #[allow(unused)] pub existing_document_id: Identifier, // Hex-encoded ProTxHash of the existing HP masternode #[serde(default = "Config::default_protxhash")] @@ -141,14 +143,14 @@ impl Config { /// ## Feature flags /// /// * `offline-testing` is not set - connect to Platform and generate - /// new test vectors during execution + /// new test vectors during execution /// * `offline-testing` is set - use mock implementation and - /// load existing test vectors from disk + /// load existing test vectors from disk /// /// ## Arguments /// /// * namespace - namespace to use when storing mock expectations; this is used to separate - /// expectations from different tests. + /// expectations from different tests. /// /// When empty string is provided, expectations are stored in the root of the dump directory. pub async fn setup_api(&self, namespace: &str) -> dash_sdk::Sdk { diff --git a/packages/rs-sdk/tests/fetch/contested_resource.rs b/packages/rs-sdk/tests/fetch/contested_resource.rs index 950e141601..643396d495 100644 --- a/packages/rs-sdk/tests/fetch/contested_resource.rs +++ b/packages/rs-sdk/tests/fetch/contested_resource.rs @@ -19,7 +19,6 @@ use drive::query::{ vote_polls_by_document_type_query::VotePollsByDocumentTypeQuery, }; use drive_proof_verifier::types::ContestedResource; -use std::panic::catch_unwind; /// Test that we can fetch contested resources /// @@ -304,33 +303,35 @@ async fn contested_resources_fields( tracing::debug!(?expect, "Running test case"); // handle panics to not stop other test cases from running - let unwinded = catch_unwind(|| { - { - pollster::block_on(async { - let mut query = base_query(&cfg); - query_mut_fn(&mut query); - - let (test_case_id, sdk) = - setup_sdk_for_test_case(cfg, query.clone(), "contested_resources_fields").await; - tracing::debug!(test_case_id, ?query, "Executing query"); - - ContestedResource::fetch_many(&sdk, query).await - }) - } - }); - let result = match unwinded { + let join_handle = tokio::task::spawn(async move { + let mut query = base_query(&cfg); + query_mut_fn(&mut query); + + let (test_case_id, sdk) = + setup_sdk_for_test_case(cfg, query.clone(), "contested_resources_fields").await; + tracing::debug!(test_case_id, ?query, "Executing query"); + + ContestedResource::fetch_many(&sdk, query).await + }) + .await; + let result = match join_handle { Ok(r) => r, Err(e) => { - let msg = if let Some(s) = e.downcast_ref::<&str>() { - s.to_string() - } else if let Some(s) = e.downcast_ref::() { - s.to_string() - } else { - format!("unknown panic type: {:?}", std::any::type_name_of_val(&e)) - }; + if e.is_panic() { + let e = e.into_panic(); + let msg = if let Some(s) = e.downcast_ref::<&str>() { + s.to_string() + } else if let Some(s) = e.downcast_ref::() { + s.to_string() + } else { + format!("unknown panic type: {:?}", std::any::type_name_of_val(&e)) + }; - tracing::error!("PANIC: {}", msg); - Err(Error::Generic(msg)) + tracing::error!("PANIC: {}", msg); + Err(Error::Generic(msg)) + } else { + Err(Error::Generic(format!("JoinError: {:?}", e))) + } } }; diff --git a/packages/rs-sdk/tests/fetch/contested_resource_vote_state.rs b/packages/rs-sdk/tests/fetch/contested_resource_vote_state.rs index 69b66e0e48..fef6138902 100644 --- a/packages/rs-sdk/tests/fetch/contested_resource_vote_state.rs +++ b/packages/rs-sdk/tests/fetch/contested_resource_vote_state.rs @@ -276,7 +276,7 @@ async fn contested_resource_vote_states_with_limit_PLAN_674() { type MutFn = fn(&mut ContestedDocumentVotePollDriveQuery); #[test_case(|q| q.limit = Some(0), Err("limit 0 out of bounds of [1, 100]"); "limit 0")] -#[test_case(|q| q.limit = Some(std::u16::MAX), Err("limit 65535 out of bounds of [1, 100]"); "limit std::u16::MAX")] +#[test_case(|q| q.limit = Some(u16::MAX), Err("limit 65535 out of bounds of [1, 100]"); "limit u16::MAX")] #[test_case(|q| q.start_at = Some(([0x11; 32], true)), Ok("Contenders { winner: None, contenders: {Identifier("); "start_at does not exist should return next contenders")] #[test_case(|q| q.start_at = Some(([0xff; 32], true)), Ok("Contenders { winner: None, contenders: {}, abstain_vote_tally: None, lock_vote_tally: None }"); "start_at 0xff;32 should return zero contenders")] #[test_case(|q| q.vote_poll.document_type_name = "nx doctype".to_string(), Err(r#"code: InvalidArgument, message: "document type nx doctype not found"#); "non existing document type returns InvalidArgument")] diff --git a/packages/rs-sdk/tests/fetch/mock_fetch.rs b/packages/rs-sdk/tests/fetch/mock_fetch.rs index a5d4916077..1b96614ecd 100644 --- a/packages/rs-sdk/tests/fetch/mock_fetch.rs +++ b/packages/rs-sdk/tests/fetch/mock_fetch.rs @@ -1,5 +1,4 @@ -//! -//! +//! Tests of mocked Fetch trait implementations. use super::common::{mock_data_contract, mock_document_type}; use dash_sdk::{ From c071a368a8f86092d6df34a9b8a1d8770b9d1dff Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 12 Oct 2024 18:35:50 +0700 Subject: [PATCH 61/90] fix(sdk): testnet chain sync failed (#2236) --- .pnp.cjs | 24 ++++++++-------- ...e-lib-npm-0.21.3-8c8abba924-28e2731ac6.zip | Bin 898723 -> 0 bytes ...e-lib-npm-0.22.0-9a6dd273b9-ac9e268f6e.zip | Bin 0 -> 901587 bytes packages/bench-suite/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- packages/dashmate/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/package.json | 2 +- yarn.lock | 26 +++++++++--------- 13 files changed, 34 insertions(+), 34 deletions(-) delete mode 100644 .yarn/cache/@dashevo-dashcore-lib-npm-0.21.3-8c8abba924-28e2731ac6.zip create mode 100644 .yarn/cache/@dashevo-dashcore-lib-npm-0.22.0-9a6dd273b9-ac9e268f6e.zip diff --git a/.pnp.cjs b/.pnp.cjs index fe35a836e4..0a13a010d1 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -2551,7 +2551,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./packages/bench-suite/",\ "packageDependencies": [\ ["@dashevo/bench-suite", "workspace:packages/bench-suite"],\ - ["@dashevo/dashcore-lib", "npm:0.21.3"],\ + ["@dashevo/dashcore-lib", "npm:0.22.0"],\ ["@dashevo/dpns-contract", "workspace:packages/dpns-contract"],\ ["@dashevo/wallet-lib", "workspace:packages/wallet-lib"],\ ["@dashevo/wasm-dpp", "workspace:packages/wasm-dpp"],\ @@ -2589,7 +2589,7 @@ const RAW_RUNTIME_STATE = ["@dashevo/bls", "npm:1.2.9"],\ ["@dashevo/dapi-client", "workspace:packages/js-dapi-client"],\ ["@dashevo/dapi-grpc", "workspace:packages/dapi-grpc"],\ - ["@dashevo/dashcore-lib", "npm:0.21.3"],\ + ["@dashevo/dashcore-lib", "npm:0.22.0"],\ ["@dashevo/dashd-rpc", "npm:19.0.0"],\ ["@dashevo/dp-services-ctl", "https://github.com/dashevo/js-dp-services-ctl.git#commit=3976076b0018c5b4632ceda4c752fc597f27a640"],\ ["@dashevo/grpc-common", "workspace:packages/js-grpc-common"],\ @@ -2634,7 +2634,7 @@ const RAW_RUNTIME_STATE = ["@babel/core", "npm:7.23.3"],\ ["@dashevo/dapi-grpc", "workspace:packages/dapi-grpc"],\ ["@dashevo/dash-spv", "workspace:packages/dash-spv"],\ - ["@dashevo/dashcore-lib", "npm:0.21.3"],\ + ["@dashevo/dashcore-lib", "npm:0.22.0"],\ ["@dashevo/grpc-common", "workspace:packages/js-grpc-common"],\ ["@dashevo/wasm-dpp", "workspace:packages/wasm-dpp"],\ ["assert-browserify", "npm:2.0.0"],\ @@ -2726,7 +2726,7 @@ const RAW_RUNTIME_STATE = ["@dashevo/dash-spv", "workspace:packages/dash-spv"],\ ["@dashevo/dark-gravity-wave", "npm:1.1.1"],\ ["@dashevo/dash-util", "npm:2.0.3"],\ - ["@dashevo/dashcore-lib", "npm:0.21.3"],\ + ["@dashevo/dashcore-lib", "npm:0.22.0"],\ ["chai", "npm:4.3.10"],\ ["eslint", "npm:8.53.0"],\ ["eslint-config-airbnb-base", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:15.0.0"],\ @@ -2753,10 +2753,10 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["@dashevo/dashcore-lib", [\ - ["npm:0.21.3", {\ - "packageLocation": "./.yarn/cache/@dashevo-dashcore-lib-npm-0.21.3-8c8abba924-28e2731ac6.zip/node_modules/@dashevo/dashcore-lib/",\ + ["npm:0.22.0", {\ + "packageLocation": "./.yarn/cache/@dashevo-dashcore-lib-npm-0.22.0-9a6dd273b9-ac9e268f6e.zip/node_modules/@dashevo/dashcore-lib/",\ "packageDependencies": [\ - ["@dashevo/dashcore-lib", "npm:0.21.3"],\ + ["@dashevo/dashcore-lib", "npm:0.22.0"],\ ["@dashevo/bls", "npm:1.2.9"],\ ["@dashevo/x11-hash-js", "npm:1.0.2"],\ ["@types/node", "npm:12.20.37"],\ @@ -2939,7 +2939,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@dashevo/platform-test-suite", "workspace:packages/platform-test-suite"],\ ["@dashevo/dapi-client", "workspace:packages/js-dapi-client"],\ - ["@dashevo/dashcore-lib", "npm:0.21.3"],\ + ["@dashevo/dashcore-lib", "npm:0.22.0"],\ ["@dashevo/dpns-contract", "workspace:packages/dpns-contract"],\ ["@dashevo/feature-flags-contract", "workspace:packages/feature-flags-contract"],\ ["@dashevo/grpc-common", "workspace:packages/js-grpc-common"],\ @@ -3034,7 +3034,7 @@ const RAW_RUNTIME_STATE = ["@dashevo/wallet-lib", "workspace:packages/wallet-lib"],\ ["@dashevo/dapi-client", "workspace:packages/js-dapi-client"],\ ["@dashevo/dash-spv", "workspace:packages/dash-spv"],\ - ["@dashevo/dashcore-lib", "npm:0.21.3"],\ + ["@dashevo/dashcore-lib", "npm:0.22.0"],\ ["@dashevo/grpc-common", "workspace:packages/js-grpc-common"],\ ["@dashevo/wasm-dpp", "workspace:packages/wasm-dpp"],\ ["@yarnpkg/pnpify", "npm:4.0.0-rc.42"],\ @@ -3096,7 +3096,7 @@ const RAW_RUNTIME_STATE = ["@babel/core", "npm:7.23.3"],\ ["@babel/preset-env", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:7.23.3"],\ ["@dashevo/bls", "npm:1.2.9"],\ - ["@dashevo/dashcore-lib", "npm:0.21.3"],\ + ["@dashevo/dashcore-lib", "npm:0.22.0"],\ ["@dashevo/dpns-contract", "workspace:packages/dpns-contract"],\ ["@types/bs58", "npm:4.0.1"],\ ["@types/node", "npm:14.17.34"],\ @@ -8473,7 +8473,7 @@ const RAW_RUNTIME_STATE = ["@dashevo/bls", "npm:1.2.9"],\ ["@dashevo/dapi-client", "workspace:packages/js-dapi-client"],\ ["@dashevo/dapi-grpc", "workspace:packages/dapi-grpc"],\ - ["@dashevo/dashcore-lib", "npm:0.21.3"],\ + ["@dashevo/dashcore-lib", "npm:0.22.0"],\ ["@dashevo/dashpay-contract", "workspace:packages/dashpay-contract"],\ ["@dashevo/dpns-contract", "workspace:packages/dpns-contract"],\ ["@dashevo/grpc-common", "workspace:packages/js-grpc-common"],\ @@ -8552,7 +8552,7 @@ const RAW_RUNTIME_STATE = ["@babel/eslint-parser", "virtual:6c6296bde00603e266f7d80babe1e01aa0c19f626934f58fe08f890a291bb1a38fcee25bf30c24857d5cfba290f01209decc48384318fd6815c5a514cb48be25#npm:7.23.3"],\ ["@dashevo/bls", "npm:1.2.9"],\ ["@dashevo/dapi-client", "workspace:packages/js-dapi-client"],\ - ["@dashevo/dashcore-lib", "npm:0.21.3"],\ + ["@dashevo/dashcore-lib", "npm:0.22.0"],\ ["@dashevo/dashd-rpc", "npm:19.0.0"],\ ["@dashevo/docker-compose", "npm:0.24.4"],\ ["@dashevo/wallet-lib", "workspace:packages/wallet-lib"],\ diff --git a/.yarn/cache/@dashevo-dashcore-lib-npm-0.21.3-8c8abba924-28e2731ac6.zip b/.yarn/cache/@dashevo-dashcore-lib-npm-0.21.3-8c8abba924-28e2731ac6.zip deleted file mode 100644 index f9ac0cfb726b81ec8ae23a38a0dccf427bca3ce3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 898723 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 =yX4A9F#|i7 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

1MtAhYE01 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

0t`u*fWHRn4J0p#fd}t3*t{s7g90@TFdPvbC9GF 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

K< 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

$xv^Om|s}vE8;GL2u_0kM@C>YD3ns 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:?j3x+GpZru>(b&)Y4N7C_^Pz@rnGcZTDmDM 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%0DakLDu{MlMy-3jc|C(xcpsg%Rc^SoE_vc@x98 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 Wb01>}HJ!U0@n) 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 z zrZ~Ix0qqXGBggxD*~k+!Udb~R!I}xgL4Y{1{6v-@__6(*az?RRo~iQJ**bdP-X`6$ z-6!%m;cT(Rx9Go}CDX`}__Rx+LYNX|?SFbNt)BGdrY;Ho+349m4>>aWBVEdxrs;V}L*yki=ZwTa*6^-==J3^^{p_xBcL5L{pYR0UQ@r<$ZVspP4W7CFrT zW$wuZ&JG{tgz#OCokZg8NS3I&)>ZfyQQ8wxkfeX-BLPYLXS^wNU7#rYSA*j7=_gCJ z&cxi036QuI+jwgOP(078@b3vrsOHw?;W!N#DP@;C`~MblNmIB2E$3`egzFgZEVf^? zWXr$1=co*v{N**QX!K5dFCz7R?abTqP~-;3r-p(9H4(`d3TA$yEX2@$D=^Dx)(qq{ z&qv^UqKh$sn_BB1vqCn+V+tSgRyTxDRrd^KeE$<`IF(!J%wjQ!J?6j}oxnUm1|dj8 zgWU6{>|MwHeG56F9Yu-2CSHo!-LA}i=|Q==QN_NKZOh{s4;dz5>g;qsz;_a8$`D1l zteDtxcq_o1w#HHDHu>-!e#C`x$9}E`THZafeE-+c!mI4CO}zYL3tn8EdMjn=oMCBg zyY}SDhH?EntY%q}_F8nY0rlgqts4pWcw!JEKgFppXVM=u-&H5dS18pUjxq#wS&45- zU*?MyLuEGU4b4SDJwz#r(B80Rc+%Qb!k*Ec0~i<*^?g|duW@INRZ;l9QiMLZ{25PX z9@0e5CGJ_9$|0otd6N@+-9-cgCLNQQEd%FxT;z;tvRIe~-}2D=`C6p#1LgoPC-db7 zs$d(qzuQBRm5(`WALLW+_ptq?$ndIi^3VM7*R|*#0N>RyHSV8P+qZ`S$LQYXBx1HC zp&~TujPA5>jMvi25m_lhyz-G>HZzd!D+WIo!tj*mgiqRh9+oMA;L2N9U@mboPoV>f z82VwS-L(vH%;H|21eJ8S{W+ixQ+y}QBUFg|M?LHOR(_l8OI^-kZ37BccGrr74xMH` z)=YMDjh#2U@OYD5O+7ht*0m*4lixOLv7h!VXrVP=Mr*^rs9yx90G;<(Iv=4g7!a)8&Fe}P;L_kIc*2dtsD=cBIC%^oMH4HG>}J<8eV(sd{MP{cY_ zxwBZeYCd8|*zyy+y1}TlwapnVT~0L~1VlT4DA7Bpq3F0Sgx@jmq)Ot9Y z$4bNwSES|g(7AB(f+#OH%AZ;k!zG4_0t~PkxoU4De{+f{ns(X7u`N*0Bx|0VI+|{x zQ99C$cZMGiy-oV1K)K$ja2sd)&QY*JnV3z)G85A|BUuS_{R(=3%K~rF`=uB}Mtjr_71&H+dt#jS+;68qfqOPNg}E1#e2-O{Xevj)!uzFwg=F0^=~Nh$ zN_XHo`cMy40o|5_qRS;Yd8()it}>V!ua8VY&8m>b#68sucHX=88C6YlpWJ-NC=#6z z@S8uf4gR2-CM2MJ%LCVhv}jXgh&)13DlJ~nU1Ud{lp2=_h00G~f=0Lh|m zjFUxx`j9Ry2iDn{j>T$@z=w~g8Fx$5Vf2F)*ire1Zbc_iM+$M=VqKoOC*-+*-So^H6S214DrBus`6B{LUQ=7pzkVT+yUrXp$A;+2X=tW5ZgqYepBW-=7*Hy zC&bGb$8}P}?rS<@jKa8LlD)U(3FAV9eXJ&m=W!VLsq8wuM6SJ@(e}oF=2UFY8n|&W zSw<3E^3JQumW!Q)ZI#j&SNw`VY{{*x= zc?Pk80uGay8(Afr5S<%uuG!dZQ6_bLehDMJllhReye`$;ni(Oe@p_IZVe@=gXqvNf z>7`|{VnYo=vk=@g0n3HTzI?4JEYT<_?Nzn+9j@hu87Vm`2f&<_xdoe)=7FHFe&`{C z`DL?53VIs_2^jz7P4unf%HtY;exD zbR(q!?6J{*ACL~g#I{}iU9SnTE0b~Luq@Exr4fV8=f4`@++lY3-9e0<*t%$_7W-?@ zmD``L=~@Et>#^Yi9LI)dM)6>U0lnIt0R^%3oODPp5$; z{#vMg=(h?dFA_E|OSg^@b`^I>a(Y%}kPxfah}%c{cV!V~30{p)W3G(wCmnA3{-R;_ z>iHt}EUxnsr|(vVdGYV33#Zx$mzcHm(lL8FN-EQacq~JJHkTB)pwhbo6p3DRpI+JI z{GY1WC%~20q#wI|>M>S03HFsrt0`4L^)4HP77nA1xN`(7u9|j=x+byZwwT2Lnmf+K z4O8>f=|MN|rD(GZfmRBOGO>2;itA{fD5Z`F)UKJsYkicBkjw-hc&C-)c{;oFC-$$1$0ya7AeYi=OH-2OF>-E1^ zmP}>D-9XZEfch3Rc;dgbgVeqV1a{N%HYP0Oj?GE7-xsw*nPVS&DQFVfY*u>Pzq&<2 zd{^^jZz9xJX0F^ZO54z*RKmFm#%yy-L9|<@_etdNwXKQXltOFMgYu*;iE5-2_*i-4 zdEfg{Pf&TX)NRlZB2a+IM}9lnW(#RwEp&S9L!pMBv%XEbH#OsUXEE5?tH6cu(URasD}#3vG%z?B@7V znNt`NkHwLp)pzogr4qdueG}@&JH>`C)O)wmU7k}zUK=jG1i8jOcxa*IxPa8LLJl%bwt-+(b?2XY)^K=90PV;#8;gP<1iI{L^bSS%LNY~tk(#M| zc)buyB}ATnG%Bakn%Y~evDs)4W_Eclx?IM5Vhe&J#=fmb;ADqfTT5&WWK{#}v7z+7 z@kpIBmmyczgNONT$j$(0GRmkacd5PafvYxaisYOn%GxK&BY7cTp`LQyXG2$Ve?R+sK!89V! zaCiDmYV+@=WmfJTL~OEjD<9oiWVq!Y`rx<-t1(Q#!Mv+eb^dYR6JjIfc>)1VI-)9G zvj}l4naMReEEkuYtPTty6G4V|@rKQcanT+TF}!lY7&X(>MRGG)1B54T480&ZZF+hUU1WShncQI+7hw?fH zKhzB9{ARaTEU@hcZ#y@9k=`+w$q~yeT}Jayo11V`sGOv)>IR>9ZtwFU_f-UH2mivF zEWu5*Y2^v2{grs)#agO(lkz@ZNYQeFJWvF&SRfM>?~ z`cT+rds-A`?Hho}0PeHcOZz#UtV3tIvFhw|CHq@99bEK-@iP+=B5YgpgPw+;{Lufy z((_Y(zWej)|6kF9e<_0hV*~on{r}yV{vG@eZ9o3vLtCbQOG-6Em&P=HPz)*9C{ie zBRfeTK?9^uUmtgyU;;oTBU;P8jH8Boc|Ush9s%w2VrH?<1?zef`-a?^^7|JDV^Juc zQ)$jKMkTM>RLRvCU_ESw+5vN&C)nwMk^ZdxE=J--#VfeYO2jM^ zwyfGLU~P`jkw5w{BV$rjE~QbX%uNyuhefP8E8@v2s(BO8B~V&ch0VpfR28mqJ3Y3= zz6O6zb$djxK8APJ7k@t!q=~rx^}gS6PIXz<&^2S0pzy4iTyTB+E(-Y->0n}|jq~ST z*J+z0v7;^ZpP_^?2m}_DTk2sl|HEj2CieSxpUIW#NM-cU$hLPbRx#`se>HR~Hg40H)dOviKs50qC zypqH#KVW zQnQ&NO1mTcN$Qd5BKbfUyWw`$JfgRgFdY(C>llFEdWDwquUL`H%c~IU8HUC3<_U8B@Q%gzVn+6Xp^msJ#>Zuh!!GZzY!UA zgZXa+;Op1FKY=*^48`QOo*1V)20uJLo093;uH54YvN*Jlsb+JX@yiWXO0`9%78Gnl zVkCi$mfU$RCU`ri$rXNsCdshY_gV|-PD%78Pf2OfK18GQkPCHkiyy(`r>ur95g#_;HsMbR9r zmPe=B^Jbc4)wo4YEvr<7q?M@?ivP)#(}w6Qp&S zbJ!qZ6ebpuoKf6n)rNp+CEbH)J`N|`&J+d^d&tOeb%ZX6`jrm=BIIYaX~|pbmF?77E$zgl z+`6Xj0$1G}=cSF|b+-5ZXl=xz zE?tI8`H^-^*lyFLKVsodENMS~0H@Xxz<>!=pe>bW!0>fee@;bbf%*Db(UFL~fR{~P_%pVnw;5$>D3(dA7C<1k#Ocq){?e8FzZ`KJH4wl+-o z$Iof~bV$U$EAm>k4bpDWrT~y?mlyM>%^KdCU{4S?<9=%&Y|9c0SD zQT8)*K%X+tr*Y0mo_m%E*Cjjx_eL}XuiP!aT(-j(ud5OFCP>20JVTYj#uw$T_y9rp zDvue2Zv(!b78K^eu(OMtkV&TmmVK5WJh__(p63r;Jwm+>;paGMlDc<3JOg1~bl1MM zIg625Jtora_MT!Nr>w;ma#{~ohEe?lSt(3fEj@oIs;rrRH(ngNKn}ynhtjCKuC(9` zHfZUmS%;%atp(e~6^0xp7S4jjwbo%#yd@4Kl1dkV*n^U4($BPh%bS@?*1nAg9d@5D zZEl&ivB&un%R)!z4^x}jx+UAuVRZ0=R>YMK(dq(?{Nk{K*z=c-~BhQdeD+mNUKu+hb6`WEtgIXzrHt)4&I-=$@R ztB33RJukl;vqXsvr7pCZkn%we?GggRQ4Iow00{uV`rkjx{|gjo@ed&Q?+ouz-L>9iK=7N@cdQr6{`r$s4O_AehV8vJ zNs)YA;Ud^D+Zti(nYdL-{k`j+n4=*ng(apA(ct>Jz3rao;^YBQ?yQ)Zq+!7~i3m5O zhcOsmRi}>b5F6SpT#m8>scB6>07P%xo@NC{rrapUY|UCIBWR&p1ZI~%910i{dj9;; zA~q)$`S*$5yGJ5*qn~(=8PT$)9kDTl{0#!ie^tnE&YVW)@dZ4shr4!9I)|j(4=cew z-dcF|n3VRik5DIgZlSxNK2~(EO z+MMf<*on*)v%?LDh&f;kuOBd)Ddr?kRSR7sGygIWa+?MxeF7kby@hJE#4y3DJf;}j zDY#W@uI=~(SWTTVLx&?;G-?AR`DC1Y#H=IcMC(hi(47s-yZ3(m$d*!hphp7Pj{SO- z?6w5%>lLl-pcSKMl#Ctt59^qvE<2UMwX`n95r){)<2c*7MxhC!M!md)tChZd7Se4O zB;?Ch?{B|xPhZZah#41?y?1NHo}PJ@gSELg3r-&0w&p+)>x!HAIf#OsAB?k)g%-rn zRQd%GOoPd*kzC?%5Oc-CT&+;ng~=%E=ps>T6)uc{y`g>=EJBFGjRO&2R>rYL zDOs?*t^zTE25s7XTyV)9Ncv)UC2Sb{redofk<;hBW%!@d5J;a)G;_wOAJCx{qjix+ zFNo@vruAvE;Hq951v%`oI4HOUG>vT09FBuyjs3CSJeLN#^X7y5n>W>rw1P+#1P-44 zu(YQ;mXhQ7d8IYgYivhpjke~xzI;zh5adgWdz^{!wK&_R9=c{z$zT~`gstie+_rq! zzO%0vo?SSwHsFaS-&tGPtI_fg_q36Z)l~jfZTDe*^3t`MVSm8?Y@6t#;P&%>?V|I~ zOU?e@ZyQ$^OB?$C-8BFEyDW=Jsf z4v6ouM;!m*@)jF;hoc)6K@{7wL{m5vsTgN)Bh#`Oc*@05*0j*Ye|Jt+*zBgPoTk4P z)yb>ShdPshTc?IG_Yr?ga&XfulKr8ed-I1dZP6j#lr-uqzp$8|zTTFny;a^sx=bBX z;KORjL{Dj4K%&E1&NEa5hLUz}c;aMm=u|4h@qv)NkX+;eOHD7*?_Ddm|Ig~NFfNh% zVgUe1`2LURq!uO)PL^(lE~eI|p8tw>&Fk;JDHiwpsVwvGk*Y+a+?eS0c*S9xU0mZ% zFQ<3)4{)01YGG;9kRU-TIr38aa{~@@!X93HMbfilyZCAqISi1F2@nj(P_)lGI_a6I zs=e4OBX^p;jco@Le)V?Tl*WCoLMIY7LZN4o~(N`;;l9v<>SgXRHmAl z)6`6(-fbc|!sMsP$R}GB8*8EJq^2gyRZ+Md8w)Qvkl1)6I`X11@Y^8;y%T*VxwMOV zD}SZ_=#!bu{Cq+Esmi0HdhP?UCHnvqQR1malpnCg?;=P(vfMZkUX~%$l9&8-8BT{V zOZJY^$;5+7uRB-9%;&ia#V-i4d?s$d{daKcVwSLOSb@s{la~f{t_lZ?Bf=`uo<$?U zPlD=4-S2pi?)=@`uY^E<2<0T2U{t7kq3CZk5xrF1;z7nBYZjk6!xPcZea5~>-0sCy z3_AaS325o9O1H|{kJA#sOLWEtI(RrZy`Puk!`I#0^Q5{z|2jVhUl7{nVR#~r4?m}$ zXX8Jr+vx!)Hq-mXNYXD1>$jITOndn2jcvU*!4rWZ=`0n(aZHJ(Ch2-e(-%zNjFKM7 zh)Jqk;`>*WET>C~dSrIqFlO!%oKt9H(4k`E(~Y!##o z{+Dj*(4wc`KkK~d2((Wty4w$R z>_Z*By#IdEMJDOUI~djDI#pJ_6@#~)*Inx@pB)2R_n050IfX&=5z?F1%)6|R};)*$TdS+p>4)_M+5 zd0vty7cbC!VBhb7GI+M6ot*l)&xdaUJx{wXplO2$R#E-W@!7E;BVMkZ zdDRFdeX`PJTbU={spQKwYZmDU%8@(Oj#PtMU0o@qW5FYo~{P~(YcW4YGu`lj)^6(2aJF*)OJe{@x@4?2A!sqcZE7XB{A`PGE=rHCr{>uW!X6>Uz7+<^i{qQI^|Sj<15GE z+^W^6t_UfO*ke<70IEVu)(HWbrd~qko)$E0${UGMg=yJ4RaUAYYA0Gb?z2ab4`?zm zMOR!V0aYfl3ZO0mR|Di*#Bp50gbkCvtRN-MM%`n# z7vHIcQ0~-XF%Cp^FF?2FWyD0za|5K_Zp_X~s$M!&?BcTZJV}`BV90Chrx5P6#GdpR zPO?^Td5KMX%Qm_d%C|epwG}AKoLEbJ!loOG!Q7S_^}Hn@1T@1>C?4WR&0hnhN1Ce< zIBprZSldlQ0;(^V7v@FlP)+xslP_}{vfKd@K5mbZR(u8}?7Qnyp6>R%;*t`57M?I- zXvb-TDD`?DoYQ~H5OY>x$vzDU8$OL=zgk#T`agdLsy>ZhP<*%%&K6OQ9w(mqHFckd z-5V%isTw&A@C6&GweXg*a1H6}RM9g}GS`+rq!Jh5q_3-gGbA$a zB7;c0BZmF=QkdrEek1z>v{xx_6q^~rosR4&q`d^lK4@qspwv3|Mf)hpy)>T-^KV%y3e{j>wFDb&dhL0Ky?K+i=OEn{NIY@L`6%u?C>m zmgXBJ8p%@Im1`LflchpRAXGUp1QjdSQTG=MA>kAvUsyvfB9!CbOoO^uTd9(q>A)PB z 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

Ww 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 diff --git a/.yarn/cache/@dashevo-dashcore-lib-npm-0.22.0-9a6dd273b9-ac9e268f6e.zip b/.yarn/cache/@dashevo-dashcore-lib-npm-0.22.0-9a6dd273b9-ac9e268f6e.zip new file mode 100644 index 0000000000000000000000000000000000000000..909a68aca0e2ccf6b3d1118a92401c1358cdcc1d GIT binary patch literal 901587 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 =yX4A9F#|i7 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%0Av=#~ssPK?V?7mf@wk@;Oj8zSND(?c9xbiIh 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 z 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

nDO! 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%0A>vGi` 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ℜ;MDYg&O{aRYdr$#c?&JJE+Oa{q-`-yP0 z!@zElB^Y9Q*Z7Z%+2xQlnB2mLiR_;pYFVFjtWLVh)?8Um&|~FR#X7tSkeG%^%Z6n* zDazQuK74w*)1SY>5PeoU-H~XyQ>w&2KaRLj)!E=`u7_I5?=L6gizVIAh0*2Y#SZS+ z_9RIqmXrSFPH7RG`KM2G3CVsw#>Q=)NxAX1m+SGi!_K;kAKpVN4t|8Pt~%}!8JmMn zh>pDtnUvmNHPfGW*8B!bpXS5>|Cndaf81H~2Bfgwii!Wr&YE)|RruESQ0ap_SAb7C z`F@p@1kCdh_-$uH3?HQeH-zv};V>_Pk4lHR0eloZ%#Gip_+f7N9%T@3i{7I=Vt()* z!586tDHx@=3AC z%_md$;?JFXcaTNs(e>r>dc3^;;cB+L{s$BZ%-wI0eD2(TfNaCbcX5#D&vzHItNDP` z*x$yNzDX|qu5<7HZ}tkOPZm!epY3*wzj?r`@95&nwO&sbJ1bY0yg z+18XrFU!3TdwcEo8{(c>&cU)UO#{GMDO;?_A%y;xnXkr?8MV^rHYC=w5(TZ z$Q>%~P<4lzJJj8w;SNoA*mnolX8FJ!`tA#^a}6D8s%cny#(+=X{r~=he@8S$zqvDP zx!w;)qmjspF7NCq$s(GK_cxqJLWo&90u6V~)6z1{bF zdhAp8hrl`MJ0IMQ^v@ z=Yr)QS`(+g?=eM8z?s$GE6`riT653u6yHP3^#=kw-T;n3aldv}d-0Wf^84(QyFcVU>|6gKZrv`}+e*?f6sE2`{_48=+56YEFW-l@ zZBtj8D&E}t>cgUCVmQA(1v@=GqqXFf#qzp39bVVw!^|rP_VFuVEPLgX9!nAQ%8frt z#_x6;OS`t6*qc8Z(BjgHuaP=&re@Eq@iR7oUAh(tInz&f&;PKi*H%iDQ%<&^S`-R8 zbqS9di(?mef)us(6O_7RY&6G^PmE7JbEwlqpxH^7L-*TrYVIU`Uug^Vm)vqCpW1mR zO}1IuaZ|G6a%h%(wq*Tq!e(hlf?(XYl#z^2LhjLDOFI(qi92Z$MT|Q9GwbD7ljjjN zjyRnxK9E*bJ&LQS@)JdQ{0Qa$%n&nMT5gQx>2FDdusr?H{{Ccte{X+3vcFI5@5lD{ z2mAY#OER%M9ogxn{r$xL4(;#P_V@45Z`)c!uUzt8ONm-hDqJhl&y?ZadH@Yp^)wh#07 zGyD70{(fwKf3Ux9v|}5|*hVrAd)cR#Y%Br@_*2?>mmlwHt4;YK*m^SOhgRItSWev0 zUpVj=4t8$vs_58?8K9O<{2A+4I$HjkNR86f@>iQBk4aRG2Ip#di)FI(aG9gaqpgR_ zJZ;{^vZLnFwWbQahs)BVW#@v+N6W+pJzC})q5a#589M#F(GLBHR~{`>OLY1>-xOWC z5LI$)8I6L~ZjE{2|lQO>!UUtC}93<`L~~t zHu>0>%g_jek8iGv{8P8+W%G$k-u-O3>d-$|S10+?Fuy;sX^7;-M`_`_jG{@?A1wbi z@~hn##Hy8_@atJ7seXez+P`0B_0w^OR2jqQ?NXl9 z`Bg0=+Yy?VJWaj%>JK7EW zS<(-Dv;4J5iIOJ1%d8&(YH>xxhjLolt)vP5W{8tGhy)A#?ea|$_au-1E<-egte3eF zjJ7Jp0B+w|=I8fG(;P+l^RPnlpIU6Wu#SApr`yBqe_729ezxgNIJI5UUDR=m%-Qk~chyS9z zgRJ;Bf7c!Uo;&=P?(omHcTPC`bMElZyTiZW4*ykqXTssXc8CAQ9sXN)_?Ox{pK zkj{ftdhkxFd?T>Et{`fE0>izLwa)*D}*6WY|syqDa z?(lEA!@uPY|B5Z!AOAIX_&40)@3_Oi?GDV*Z#n#X?(iSD!++!sOb!Z*KmPmf@E^Lv zf9wtb+lL(fGj{;yn3zBQ=kD-d7)1Q>@43T&rFFX9{A981`I=YrW{_pPa zf7;ECsSf8QPcLw8`szT)toxWj+u4lEVAoo?^&N-* z%^m&^cVKaT=J3C}!~bcAKl1exEj(>cSouE*T>z9f%6C5G@@jWai4jVfS>hVw5K=2f_mwyNEAzos4nUw^SYQ4zh4OC)yKOBVgGNb6}-h&*h5$^ygj z?H@@x|J>=Elnmzd%o@slOmTWkdHvpGzGD1akYglaW0qoL#y#I(b0Y3p_~>DfCe^a@ z#9PR=5Bq}sVcVz8PAa+W(`F}?;_cIBFO~fEk%IHar&)?t5>m#zaADbrnfT*n`$E-> zM*XYH<)U!B^cqLic`tG2#boe|t7!KL_qpr+qukSRz}L~y1Xl8 zyezD7n=+>^?|SvyWBv9SNuKFG009P0%T=-{2=%&CdaS6_U=<$xiBs= z%}-@K{IO@LzvH{V?WJ7*r1!U!>04&X3ldJou9_1WD3`v@l&q4=poEkRkU#XgKcHN^ zyqpcbo-X<$oSJ2F1Oc)P*(#DHjqhh$9~W;WOXCN%jV6~;%Jb98nM)n-mLVs( z4T>DMc!>kz zv|o?;^;6^_E6tENDg8d`{1kP6ijw?@lhQ}=r6eKnBxPNmM&37hGB)4U?Jr!4XEG9o zkvX47u8c3)dx@l;vmc_JT6lnk%ai{qX9 z_TVCjtOwU$^e0oUP#`+KWVLm_d zscJ5|tzM+f;(EczR5=%g+E?54uv{w8_r3j|xMF>%#lE%kX>z`e?(xbh^UPGp$VHw` z%`IID$E18;&r0`^i+r_o-y$g8mm-Zt(IS3>+I7r_@RAD}Tz^#UL#b>N*aTk-_AyDx{SY?wdI}&?VY_QuqX#$gH&W;k59~a`*L> zWTIS3Y+s>navpH&@e9HI7b2(k-Tq-_pun~3>&V4kZx@!nZVj?m{6?U0oM+7k z2D$0fD}OMJ&aF&>`wWRmwtW7{oc8AP*B0HgPTo>=FKKHsPpuAdBC>g&Qe7tAOhLUs zO+B5j7L5B+`I0}es!^fXlMH69re1&9?JxiAs(PtNKhF`Or>QYeL7Y=%IP)06glTmB zGn1GxK0F?)0nQTeoCRY2e8pDe^1#F(LNY)Cb0QMZ!zV1$YY&uTuFZOs0yX_2SpemV zbs#cUoCSUu3ld}FMbfF?u|fdKxj>J*kt=e@(`_qFR~qXZ@hXoGJ%L^g<2-VBMz@cQ zijQ-`f)WJcsdboKM`V4eBuT45qk!3+I{^b?RCdRp*;TWrSv!_={^DwB=Ntq5yZ|dn zd%LB5NEXSo{L@wEV(QY1lScd{UM-!@bB)B%WBk^0z2(w-bN^F&YGgG@x2Jx@Af@B( zFE{PcH2c9tH#dOsOSL$dx>6f5-)*XpXaN6p4DjUSr&sOGO+E~oWcS$PZm?E_UYTZh zd=j+wer9a$+PQn-%j~e@Q9oWEb&}L{ZBTLW01ov|3Bckd)G5$D_0r!Z(>1woJ)Urx(dW~j1^Km;q|OfyXFkN9 z6r78(6~@TXyn+75#^!*J<{lrBXrw4q-<~?@B=OynjWZ-n4F9{*j`JKwo2}IN&)w9vO;g8Ak+3r zExfs}g~xoWD?w)82xG76Sjcx^>=OJM0`UZY8q??P8M#f29!Jci|l)Op90+VtL5VyYLBu^X$ z-I502h^e@~PH)5`ym^Ws9z91@wv5mj(874p`6XHm`pECUD@EcixYd5Agmx>MznJO4 zc8}_h{rSY$4b(rA=jQv^{^e==sq%w74N}T=eh5x7cS01>c^Z|z3g7xTDugcgC^Mxd#DulOhF4l#WJd63<_>)(M_uoK;zIcn( zUCBR~efRbi4YT*XO-{k@dbcJO%y!`omV52{mOgNjWDd+WxVoOPQ%8P|!0fwkv~tMr z^K3T2`D?QQ&ckegrJrBFey>UL_kEOP`8!8B@I{o#^Y^`w)z5FV&_~m^%IcSGb#?9H z%+1r)1b*4qHmp$an$L@reQnd?r0*$*_gf_8o2NEA5|o zPTH&auTFb~&U60ed9RFdKAv|znG{}-SpT8@dNmiSOx5Irc{tLQi%I& zD;D;Pd9L^OMxRJ|M8aO;mtH(f5;qZ}QRo|Kf?MWf`)CY{47WG7qFAmJ&bXu;L$UCk z_TW)wL}^m3{1L^&u&lmXmfq@!M)S~X)UoyooXUFdsz`j)xkMv`>a8&0yV5pK@6Y^5 zy#TO$P*!sKF)YJ_N_Qk-WGTI}HQxS2A`kn$VZyLXv8-C@yA&Orm96$%J2>$)+kM)6VaEX&Dn=zeH~Y1xz?i zhB@8jH_s%4J#lXcRyRUO~91)FReNs zNSb4-bv0J?5oLxs(r)et1+041S3IN?yz<9hN$9+i&?y%Z-WW!OtGKBXxEP)_6G(w* zw%G&H&ae}&5@D3nV%N)`w0K3{oSQ4_nM0%6@((+zT%U@j$M+>@#uz>>NY`^c-`oU^{7Va-^m$p5JE;R_|3DnlBDfD6`i_3*?m$qXA_r$6fr%CqO zYXt*SEx5Of^>tjTn$5U-*>-B+6N-u1Z>}G83X2Yrh@FX!`KT-xySURv8Q)f0R5sh+6AQ=%Vuw4X>HW5W0Kh+8Q8&$LERjV-}!Q$Mli)jZhW=|Mu}}IOED2x9wZiIqY|) zwo^&nm*8<-N~#>%vQWoI=@PR`cZ9yrkaSq?u%DDW9LMDj)A`7$cQ{My9nRjO-eC$A z9zaaL;O2E4M|vIIUt|g%_E!oX&V9kdF*)4Qf``f(7Zf~T4Zp9sciM z>oD9@vrMhS3{<6OABfrnwCa-;#doFzwVWch=Q&FMSw`tU4eCHgv6>%)G-1=-KI$1& zP&w_xI-IpBwaL+0`qTJU2NS8Vu;>(AOGTOArT1P)@2$3iwvGOr#O4I=l##X?7(U&O zOX2DmuIdC0_rk#F%7f9dfe~c+sB}`QF;_4_$3cTRmWi(eO26$*#w-!mSzKN3-1*58 z`7h63-mvPKNFl*3c4n)AHw_}!l)^D#ThwM7e|6@frGI>2Y z^t7K^Cd5HM!<2qFkJEa-KMhR4qbN>XYAKl$`6Xd%ivf49Y>^?rTUi62emM&Kt&@-b zlzcQ}U(d}39V9Z&=|#?0(vI7RN>Mm~xdV{GN`H|x<;atcX|gsfA8(^nN}TBjR#0Znd{3eSgo#S z?q2%?>7VDNTKL5uGMsVGMPyvgGt#%!1QvjZSx!hQFoiL5JCCxaHH5!(^}L{~Us~0B z@xrd4@4^|=ieZN7rOWSpQuKs%Mq%{6xDXgFUv?KC)vL~tMrVE#?mNfgxfddy+m2yg zhzHT{?T6-n#>XJjC8|G*^U${K7rP+2_ILgl9vswNf7nH|!#a4>!8c&?|oy#u^OA}uX2*;$jlve@ZwlN`rB&n=1T4{MzbjuEtWo7sPeXH_klg;b25l`5Z2|MgNU;xict*hq7W|hZj zI8?!WHP6^&J2ze|XqPIEGP{Jicr*^T?%wo0!w zo>q6BxXd8htycVS!dIs;xK9q*xszfy{pf^`wy)%dG)a{I-f)Fyw;^!L`xX8?c$hkL4rjkCe^Zsob+@CE!^;k>F7H(x)23@TFE1vS z;;M6afp4>2`h*wAZBfP+LyQ9T%O>1!O!h zR*l~$U2_q{t+&|j>-Vuc-F^u1@aN)L?Hb~Xes5psynCg&yJGGRA9bglBW7>bIf^F@ z1H`P9q^z$86W5>o>HuxoO1rX_wr7UZF)JvZzzn0Fa~L1`aBZ7&)?s#&Lys4e+sZ^B zWgnTqK4|X-6zF8KvFuLJYzKER|T{w&5p3UWOf?uKo1EFMdNsJNxvMVrZe>Yjx|DK4eIP|Z-V?b+W zBj-BU=S2x3sg)?TcAq$F_mQpONwIz6To&a@&eT6-?ant}e%k6Yt79gR&7NY|}X6m6ms@E3puT$Y9rt6$%())5-m6lC-NU z_*bgOcA)I>oX#8u^Uxk6r)lAZ<4)Aq7n9Dn^OTQyHCYX&SV?~7b9~JSIFg<%df>bm z;@7OrmlMmgnj?*`#D7Z=PQU$pk`yXWQpLpyzKVxynW?_-b-(X{`Pw-_7C}yp!R&?d zCWg^j7W;8aFhdZM5e9OYG0-^8#7L;RbEzN3W#7* zIMrd+Idb;9j>TMM`4Mqkup`En80keu*p}^SrkYAi3w{K(E@Vj59h|@11t@gn4%2v* zDlWpxy{tx1qF!Hfj4TPHyMy<+yTF@ccZiA5UK}Q{6)59>jIrh76ed8sMPGz$=GyGC? z51oi)@uJufE^|0scSd;pMjbc#Eb0A1=O=0Jk6iEj>ireHKT_|HUGJy&j}D7hLT<(d z$De>vb{G6t5xKG7>&Fq~5o@ zoFH3Y`WN>HT}NE%+Qvex#N96bm6Mt9v&n|EM5%fQREje4eA%ANC56HAC<-7+yK0K| z6UFFMEgm#*3<**Ew_&NwER&Zt)!|MD^zBt3AqvWTQ0*#hu~H>4q7;xG)N&1tGh$Ts z_GB{UZH$hLBuRff*7Ea(`!)E48J`vPlj(0+T%lsp!^t0sThcX^(xi^djOOi=+h#AZ zHb$wEM%dyT&1Zt!k$8F`cwXsNzOk{`yMeMQ8Je`)>POX8H4Jjzy79+b7 z3DPZ-ME6)?WLsz*#h*0O%Q*LutD4q*C72`OrK@AGqfjJAD^pe99C}|U?oNXqd^ov1 z38s?#_6y&u4@m}{-&rb6bSpXpZT*znR!muwf{{rK=7!AQE(u09>$hDqQ`c(B@AM89 zu=RZ3E4TSmji0IC_6&b&@q>-mKFFVX{B-lpp5{*@er5kHUg1yk%<)wg+tdp~o5Y|w zHarSSsiI<=%ULws0l&X(2RLl(P=Mc?%VI31pJ*f3FcNiK_IWte@(cX5zsJ7`$>ycA2Yv3Y|h2zc@Bk z|6zW_;dm|LkmqKO^VxBJMbakpr;2QJ7{DitK?GN*j%B091CKd392zBxR=s1NmhLBL zYtbF6H8Y*TD7~B(P6X_C?$oPwglB+3oD@Kin1Cy~d>|K$zJK`4uYJFCBH(TF#5j5U zrJC?WMa_FeSH83Fh|EUeY8aaGs!SWbVuU6mQ95EHeh^yKES0 ziT*K`5?$a4H6o>(WO~5sy6fDPbaNUw0cWVo)0k~At8d9v#HGY4yS#IRicGly29_J( zqEjU~06t!nLF72X*K5)?M73&1gJ!3=|0tb+7|brkcHxxXIXWB)j4oB1BYBDwP0@vc z!;8*Bwhzi4l1ulp^uqc6LuM~KaIu%x^9zOK+NH<3q=D$t(O&0OiMc(x?}zlVv+!-i z*@N8ppH51XyFu|uCgig8(oM$RkwXyA@pOyYHl6P?@aGcu5_un%GT}D6mz`%*z5-kH zh;Kijg6d_uZAxeePwpS7v;K|FiHpi$ck$O!Zn>YK4nd69`|{ahy5DDL@B6iXUb@UU zAl$|+VD?}7TZg2 zYqxU}DfaGNMb7s&%{++$1E%L#QA5gJ6RBoBD#5%v8>nwNTLvrA)jaY7EJ#xc9+ zOf80WQ#|s8r+*rmY$04KBUkA9y8q|8@P|alz+~Jk-cx`L7EXzGW3jJjV1;AGrwU(% zw?&A;-q?xKR6wpj9fPzkiI^<8f16KFEx|@$ncg(&v{LX2B<7_siA=V;^dr912>FgH zlM)z^Ct07Ik~FgkZf=pKWqI8>?k?IVr8)+#JDtBS9HSRr6wR&fPG_$kr)oGgSCY~( z!=LbXY=0%6=&x`03>+UNLH`dE(0J*5m_C~p23#!-LNwW#m%i5ZY_P{Sfd=Tj7sN$} zt{hI$qOteP92dvwmx)~|JhC;f9++X-QuxPP$!XViNlaaglbuFM#>Cx1!9C#;bm^(x z!miSE?aBdQ^{ry|nY}30Yn$@Su>NCdaD?4Fai z%TZv){PuSF#KH@L5c2oCW0O+&`K)_nKXVnvn_OW|m79KfX6f^V2DIVB4E!;40R^Rp zr9tT;_A#!y{6E`|Lh1LG1QL2{Bww$@xk0awJP;o2vpbKq#|NE(?XN-m(w2B&JM^M+ zVOKBOTp|=@w8x|#r+yO4J14GVmz^2>!ttTC=G3d5M}l8-s(a;t+zsclG;~8UHUh`s zT=yQy1R!S}kcqFQd6?X<)JzxNk$-%vV>!?4H>-fhSMPK`<{7c(owiVY*IKZYb2$;N z+;Z>ROiE2ROO0Mc7sy`%ain81$>dr-?0~-Cuu{a-9FrJxx;}$(17GA-Om3p05CZ%yu2`LU$ zWkY$T@f>qNTHD4M{goQBKjy<8Sd9fyy0JF`r0BBP)H{X~_o@x33mX^!F23xvEItVO z+0QMuGVSDZv$KGk9j|ke8kXWlPze7`2Q?6SPQPxNcN zXP)0DG6%8}eYsG&J`~1#oj7c)2w_SY)>(#OofsB}jV(octRd{gYgx(}{tqt8q*govkh~&%*>%_XxApvYicK{rWWV(-M-Yc zuN}@3>eh>uv`3oxNur|dJJs?+s^xS&P~0Z8>3szRPGbiDD4vhV9M@zRb>c(57oUbb zxnh44 z7C~Q=9Lr>H+6hqoPO5m-y}~-nx_X*$gwb3@-C- z;5rE$Mn0Se{Xlnex-M#U<4aVTAxX^+YEW{8zX+UER@V8Gu?u}!W-^+_V!K?ZCgz88 zXr{MQk=b)8qt0^H?l{9;=CbN5)y7;nXpG8bSqJ4i*7o6)%AdKig>M2zA&x04k!)dP zm@Q97@l6=U6C%Nr^7?2BHQkHwm}n0C$s--bui4G!Wt z4zyDtkF2Y>xy*X!_3eVId*~89nD4l^`X~q)6J?^VxxS{AZFs?Ho4S*Er3@9GG%m=N zHB=moemI9S3;f7(C7?V6d_v&K`1+TGARmT3r^g#DnRVx<(A=Ez6`?b`aV$ZsRpva+94lH zm!CPzj2Dc|)E=q9mLOm^)8lFCS+gyt4m~9`#tnr6?%cU>(ev*+Eksag7>lGFV!yt= zK2IN`pul$L{p;&b-K9?>^v{dg<&Sbc+wS~$ef?wl?2mf(+4c3~^wMKp`anR&E?*Bf zwEPUhn&dj@X7+_QseYufw4Dp*yyz{Ib8njbAc_riU;Fd{$%XfQQrP6ek3L^(a^ab~ z@L_V{gTQKTGx>bl`2@$Uar-i$@9&2>hm|cLj8P64<3f(P--=!&D@k?h5Q5J$^>-{z z#03-tjz!bgRb_GzXikDkw&x>RTxRYVD5by(v^PIa*XoBV?7{@&UXl#2t%AFyu-Zam zL`qFksRA_?yY`lW>ePoejO7wDIbH6`HC*n1X&4PkWdcgm{Qn0bm|M{ zBU6CIk@3DNS4&)oyeJUtqk?t@&@~GWZ9~G*dAZVOFr(ZYApiRrYm)z z*AbssQG**9L~Qq^jwV4PgtTqLqQ4pnG$c=XQ z_v=jyF_r7i!`U!0_njo9ekTKm^VLvNm(k6`N_Ubxc-&KMD$HJ>dY9i#{#Zf5>FLI> zhU@F2^*s1*8KCe{+hOa_w}W)P?Z1ZPGIkkn_sQ?le+X?&Ze zI_i-H9GAYExd87|E9Un@-n(vp{4O-MeCOC$wkD`}Q==tw)u|?pfAtq_Txqsl!zrYF zKF!O!wHhq7Jx~0655t1)vL~1wE%BnXNVkayJ)vIGlb5V8_=&jpT2XPNsd4vLecGX! z*n*W9^PM#hqdsBh_VFnnm&Je>3(@p!H>S?#Co#B&8j&3Nu4^e5E5(do|IZn&Oe7(U zLU$7OH>>LxqZbQ78co6+`$3)vAsi0fXYye5pzz(MrhexIhP5VX<#!@y-6ct!BbTu_ zk)Xhf*$+i-a#Gm)_ANgM+RtNb(e(OcmaqH%q_kWE&)xUXyVZp`H zH=FW47{q^W2^}-OGvisR65rf8yn|=KWW<`5s7a@f~Q4w}6Yp-Pa(Vk1-# z%w_ZQov$@<^7a4`G?9UYqdylG!iGH5H6AiK`XBqF*i&dnO*LO!ml)z!NW?v~_h11r@ z&I#)#QDQNAOwcRE{Zf79d^L1%Xp};}EwLw7RN9Sp3ziODC2+%LjGwititWKnlER`b z?|mOe2o`p^7vbsVD}@V-&W$w>B2~OCMao{lnmDe#Xhur+?lh^v@@Uo}?4z)1E)BC` zb$53qTC`^_KTaiicZ524QurKM_V_DAdU^l5&(OpQ|6pQRSXQdm&N<6C^XPt7OErt8N%q`8(t zFG14F)qqL));cYA60*>hfY?SI;rtAyhx{P;vUaBSD_*%)WXEY zatmQx<+ItEA}&%@h>|H9V?vVnsVqz8cjY`aCJu$BdZt;JG$LQWyxdg3rzbwUm(lil z=6tXBz;awLeSyDtszhKP-^a4B4+6%d{J~w;!Rjv6NskVk_rZ`S49^C8ZQ3 z_1lx**euQ4M$#rl?VFo|o9<~gR6FGVa70~nsJt{1hjZ0cZLf9^aQrByKqxo&P7YHq z1!;zf4hB*Ys;uN(Z|{gyPk}WnF#|uwdC6P~0`AIEhWjtCQaj*eufXRL$U5#0HT`2< zJyIc&n-z0cFrtN$YCyx>Pzr83`k|RC(=X`hBcC&29;l>eMp~83(i^81p$qthFXR;G zj76cSgmLLa4uTp?Y0#p-O9Gsml*g3+3MmyzX8f|u;N)Ea`1(UtNhjmTac75W)8F4fxXS1rX?+PKaRp(9ZB%dm{b!b!<)1V@(k z9#0k0M^hkZNIC6H$&X-`rNisDFAJJP^ua^hvtQrBf*v^z-f?Wd&EJ6Gqsh#ya9bay z{B+)q3CwA4guGUaP_WZS63~^pgxzx zQb_cQiF0zXxWWKrpm;sn6udQ0%|LPHrnxdVtprHvTJbQ9#qhA=Vlhe|%{FTLpiN8B zrjKT6JcW_Gg~+>S$ezCb{imz%p9JrJoTu&xAHGWYiEz9Au%cXXDf82W_=Y#Wnstb4 z_!K+G=k_cAGb$*nu6z&sH(%%MQsV`s)r;NF=6RJSd|v(_@wkprr0T8P->hGyG8O~B zE7=8ucj;%$l*=yAaJekr(!8%9@JYa?eY2{man2>G4m4=!M!j+i`Zt zHG@Q)2|urju1}o5JI9_# zLi4xT+SWZO^7J_DwNS0Wd2Gvy==4W!j{4)yE1RQNZ?cgdyP{Q#ap$GI^zuz6_E|8o zC*j2A81uGG2qtk}=CfZ0E|8f9Vi(3uEAyF+@rrz?*4^i~c6S9cZO@jc*36l&)HN2K z{=F)7jc>u&_d8kJ9XL|ndV zpqJ<;?Cuow!<=|n^f|(PWr$26Znav7bGy5`+o{>YqM+JKg+QG|?H{a$Zy-yBJFwS{ z>unm4{DWKz16JNDvkY!(6aXmJ?v4I2)EsHdi!!)#%cQ%$Y24& zxQN|Fe^Uu?AbR5Na*tkyuZ^-@!^rK#^RhxLg6A&dC0XCvnJjr3%d&YEJN)c>mY2QC z&GqM_Zt_bNI`E-1ul=qZM6f&umhA1dPsj7ItJl6;#yR7W+7bu4WGSJA$;Ix;vJhvN zB4ta|t+rdm_Cn<{V^PL^e|`FbVA=ZkTUrDezBUp+m3MYi8bjwsR=SJ>w?uy z|HRi#cX1t=Z28M#is~c}MqXE@FbVNKFY`Ww8=>(+5{HYWe(;#Szk`h(v;L1?vLY57Lr&4 zO^k_om3=slO))91BcXn-3479ho;3wp96F|+z={6ZIKNz(cXEC_cOduWxbtz2BJ@@X z_->pW*Ys_1Xwd=!2ET2r>cXKPRJM+lpD(wEZ>@nPBYUYgXJY?F{g$(8UrRB63ChJH&?BsiR zrL;oJP}YoMRrv46n;Tav7=u4Sn{g7WQ<%tho%P(ex{i+B~Rkz z7lW!#Mk-a~b1SH69+mygNafQt?60|75M4zE+-X+vJtg>(Dzz8C$?itikM`!CbVJ#xf&>zBRxG&3J3 z{VcoTIJZgXrPb^y`gH0_C*VV7V`qEh%veWhVJepSg#0AV1mYX8*8EN(daB^f6+33S zH){iIRdm-*m0qtG7DV`TnJG#Vh4F2N=G{A2D(Nu!nJ%vBsI%?@hpwPdnogmx>JFjd zN2_k3t9}oudt&IiFn68{sTm;lU+5|Eap2d%jNc@svYlGGXStH?J3e>TS!nFM@xYu) z@%@4?sC(7#koD&S#jM(|$NYL|zdl@sQgjHRR^q9PKO@&+R==`kn8! zQ6AYbvr$I<)OsG~E>17|Duly+=ZB4|fL-_&MRmOBcgWAOGl(Xa_(#9G?Uj3a1&-&X zdu4Pvlg`JvIrK~K-}dTz{?&8$>U?%J9rC$PZ+mCY^)QA9qF4JP!dE+M65XF^6{iJE z;`b|wr&+#L{N|>lF3ewbp3UsnVlg4C_|-T)Ihl4|W=_8)vZ3=lxMUaJcNb8e+K=-H z?l9_nX|0~)2i^HB`PqZRiTd%`$I+|K2X+q|&C*oho$NriSHpL+9uq<4ImJq> zW{qnvbsoA8U0h9{tz|h_68h0iq6OO)LQur}$mMZa+Oj#+w82q$YSm=Y&ZUB-Qtg*5 zfd=WDruV>dhcg*z$cdq34VL?QR+>??Dp}LM>-FsU3$REhKZsRz((@fbRXW3}B`lLf zf}{acK%a8TQASChod!kJ-N&X7+|K62e&Jwy>*G`+-yXisbSe{FO?0sn43G)%h6`>^ zlH~%Mx%9Ztl)S7hLEPKLigDkDIUyK1gO9|Z2U}y={UFZ|GdG?IOJV*NJB?gMdCTZ> zX2reE*7Bf*F~Ju3yG$bHdp>g{tj)wU5!!}n@>;uGNiJLVLO*I6eZJ`2hH#U~_+*@u znj;|UCn-lzNH`1s87ZwL9{y=sf-|{PEeP_Ox_c8yq^>2NvLR$H0 z1j2|0D}NEkPT=J#RZGy+uWKb~Vl=tD?5rzcHsbmiYRKT1llm`;o%KpSB1Y~m)Ai!c z304mCq4T%}lK6s6oxRAHb3y?l*I1`$oLg0=N6OLb9-LccCt?{NsH(?EHx5m=3F9kF zzYI$E#h(v{zs`YVJS3kj+mEsylJ?$ZfB9+uMgF{lyuGufd|rdcZI8U}mE)CHUMw#< z8-(V#oJ7UN0hNMQqO_G|H0^vb4bE1&@%rGK<8;2_7FK)p`bOfw#CTt%O-}N9ox1b+?D-e{$$atFoPre|Nx6iH;}Y-`k^5*zR4EZXTqk_{xil$I zUcH>B%B#$KC(}21^Xv4@F^u&KkmE~3pp)rjIq6@%>DqbBv{y;ydNN%qN3Ffw`DVI$ zi4T3ZcG2+gxBfCIZkL@e$LR^Ld={V1o<-Ud&s|@AVjA+$==53iibvm{`QHl&cKnk` z`PxoM3|BXc<{w2OJFJ;QQ#a}>s z6XgO5C5tm0h<_B%2{c>FSNRCS>JBeLuJC#Ed`65dk+|+`KE{kcPJY|6edy1Z7qelf z09Zh$zu!+!J|A@!?sW1KqQQy%o2)8z%?cwYZwi7Q)-A-VmPmwbIUXU`|g z&QIg`=h24onVK3;J5w;nuZmO1OYt--RP_aWW)7pW(r6|dT9{5pzG$u@dCahJRnGk- z@!y^?G8Ii6VX6C3>`89LkK9)Q{mxZC{>em96LJ=x9`o;2=Qz3jc=kN%Jhamn{kiSn zk7mJ{LuOCYOSU~fb?1}8v(E3w@lQtjkvoZ@WzY{#S=TqyPplcsoHYDGm*1JjKP9d9 zX2IFoOuuPVUm9H7y9wGeDE*Z!T10Ko8U)6=I`2=}3K#w4x0~Nb?gG*1Sl!%%k^Fex zi1>TR6#aJ)FlYDum@gSPkBhumw8S`Nd6Q1hN-G>tf^IUEL}org6*(;MgEzj)Y0?y- z6{kW-#951boWy8|q%g}j(ywfEWc@az-AhlqecP7syc5}EF8a@3Tt<(Dkv1A>@^uVO z!Qf~7ov8he&A6AL@Y~(gUK)IKPoF7xn_ z?|E`NNL;xDw7;_uCYki*AmH2S@pJ0quW!Vfo_sXu$`oCDNGdG z`oc)whQiTXOH*CWeQcd0>{rwN{8io@S-7HCJ6ui0NX}=;Z?N?wJu@mfjn7|80ggfn zaP@|`|0oal>*X~P9qkfl5KixyUot>DxeGB0!Nn z-gsl#bvH<7v%=-XyFcp5pJr58nfYIU!Abnv#(iXGn%t}Sm*0oEjjLL${3A+B`y2VO zCU0%lnytLqnH znfaE{^A~W$&R#%_#iiU)I$w?5`3tJtUy2R>++Dy9+j-%hy@W^Jtjlv@jLtnk4E%O{ zp%7OPkwhAi5umj6_m-Ww%1BXc#8UTgM0Pbd5{B3kKIK7)sUhmYLmM=M?!m^&gPV7- zd%Sc@PMWl(*R)c9eJkEhM2yoddtU`ro!IzED#2jcz=G2GJ~U+9-b~MhR#^shXRi2h zGNhbA-@(>!kt@)~-bkL!Jj@mcR-j|TwmUcSNStR9##o5<5--Ez1B-Y`(nL(P@Ya>+ zht3ZU;1>X4uAq`~#@{A>+NmeoH>F7;P`ft1jK;@5y|}%lX)mX#30`ndp1gBsCuz@A zBDav;?&D>9kYwsy6Gqv2F$>Nd8~iH1l)>jY9-_VWWiS&UcK;c@ zxz17NyguCU`sXjF8_D^L^~tvvZuuZ@y;^&VnBC4}+il}z=c}3f0j9KH1o&?5d+440 zqn}z{V78uFdl!<%es)^wAxM6LYHZebis`}S)o?}C>&S7>C*|n1fADc1^0JzDZ3ni? zhbyJlW8n1mDdkh$jV#TYi>Qh23n};RTIM@qF$BE?s*$;x%TJdcp1I<6@%Gf43qXHn zDmdQ(k2NRLFHKFhQCIUe)w;q6QYB`!UE8~V>3-fMRiF}zUi)N1E8nbM@yy0|{`!&28=Zs3w#%+?f>oeh3+Ec%`1jq1zxB;2 zNl52+{^a;FQpY=+9eAfRgw`#4IZMQqSz2wQ|G_0P+~ z=GkrVvLOkH3D5!Sf zOvvZ`bCbZnun}I0i~HR){(15jAhYOD){~ybc~6U*lAc=N=;~)vKe=eP;?k8X_*Tic z)3EHV#L=Gr}k){FZM6vjCbTdk5A5H zZ?+z8l6t+g3p?TZ(7m$2LSt*TmvZO|66bramMX9F;=O9T3n-8KNXdR^b+@<6*}$LO z_-`Li-~RJy=0luSyVfjU4Q$H&;o~LN_&>AZq*+Tf>rMO%QGt!*+1aQ}q0_;XVFK_j z^!QcegVka&duG9A(tdfAfP#BCTUT!@-&&@C%B?1~SQ8bLX-c#%iF&HNez#{*kpf#L zR#M1XamE=W08CcI9jm0#h1Z4H4HpShmO0oY4qkk)jIpy~()GEyV%U|f{Wr?1`I}0t ze193G&d#b&xjTJN^?`R$N9>B=Vf9l|0ZB8=h5(Lqrui`D862{ zzfcvxRhRJlwFFzor~^BJQYs(M!^Us3ceyY8_N~A0F!{oZsK5MmmUn7Kd-YV(mZ0kv zUwD>8Z&(JZm8t>vYv{(734~e+)}G~-^6m&Aunluy37yu9Nx49FymF|rV6e5~91)h> zii=F0QA5@NF(jU7sYvkHQ)oLiY<=eD_AHG>x4tQarE~7QM6QVS07ov-2m_#rd&6ey z|L>yq@8+rXKkEjOBi3z|H>BloSR_{_OA}Ifxvc91vUVtdx$jRgR2pmW-PqadpWhDK zA1>R|$y;gPoC|={kL8k}Szu}j9^ULhG@fJ}g;rl&;o&yt0=M*%@$h^vES<*v$cj|; ztgJ~g?em+M*9*Rw>i%vSTf&L0yz{0*-1Pq1NK@zu{X6{xq&w5GD1-` z1CDRU$@$_|Pb{y$4vTmPit40Cv4Xpl>ZhaKL~|W0sux%1SYqKlK6RYa)$`Xeb3c1l zv0e5JJbx2T?&pwi^smZvbD3w^bI=kzfpkJm&hg?fZ#Se0{paJtFE=G+D1FB#BeY8H z@%6it=aO;BGnf40IijJkLRdXvtaD^7MS}=|B&n$LynQiK53a9Yk@c;k5<^?Novn9w zNN4(EuRw|&r=8b*Wv;)P4=7}Ly|a51o>*dzUa$MG*Is!{4aj!rKM~w}XQ#9?hM^$Q z<-L3Vz?QrI^_QP?cqzybm0aJEH`3kY)JScN`R_eh+#8ovE2zD5IU7=}F`Zg_VR5>% zyG2PURS6>IdxtVXhp7eOIGgK0)^DYEO--nlwt=a<+U>;9cEbInftNkfU<0xytKl@k zb35;D?LHx=eVcNrj(CJKe8PnTPrE!vsW zPI0T#F%fmEyY=q7TkS3GCXJtT`pFh>sU?!H9J(5^!OU`D(m%h9T;i?xOuKquSm4SV zTL!Dzl#?kdIvH;LRs7ChZOvY|ygI}wqGAEAW?O&tG+BecB1wT|#{s~sTvGwbytws? z27jf+xKRhMI)z#HDw)&I#csB*(n9Vw?C13^K<&CMzPqBKOKlNL{r3;{sc1KN^jFyHu zn@)i?(=<5rFeN&P}jn#A`h zuv&VUyuy4Ilfq65ONYQpUifX(xhfIZe-W=|Vq|c1d`V5P#X2!4co*#AefZ(tgNLhG zw0(iJ9+{{PbC!#4|13k+OTP`kIo8#J$Rsc3;=A z7)Mg+THjVVzc=e;rgvr6FY9)G-||J~*Y_?f(*Byh_0pcL_3KK(z4_kSHHE0{+`W5u z$ERFd7Gv>pXAvQ*_mv27VwL0WCKuXM9KCiNR(CfgOC_28BehAm10mwGsk^UX+>I}h z;rPZ$FUhn7%&YmJ#s$&cKxauVE)#_xbY|HJ=~K!N$zg6Y*H1&==PrXH1<9GCG3(b) z=cb*)MBgQc40CWVcIUb#+SuRi#FFS9tV&`h!NzRU54__;Jl z^h$DmyNXWoBD!~XKTJ}UT64Qg?^EVcQ|EW%QZ2jVHtPsOoiut z;+quC^fX#6Dxa1kPYGzr0%o3DiBF&V4iNaoG77XwOJUAY-yDDW_~i4?Iy?2dmHoTb z%1()lB&R#dZ~#Z?6CLo&;+5m0b&?Yw1e5-9H_ozA>rYiUH501*REf3RhZG0P`|{4s zzNb-zReDu?HT0}b11O#Ub(ADJNNT^h2vKD_!FIbe$Ij0qmz~?yMTyJlB}q!cce*-N zzaA>CoOC9ZXn*A**g$3RCeh2ZzKhBA_OQe%y51&3k{%mQ=1-qua@cXxBnC(sL(8tN#D7_b=LU z9Lb?5`YR-sM@Ab>s;V+89{^ieAc^t7mNcWs*q%dkv_P^6^cDrkKtq}_3IEw$_ml1~ z+<0YXWLANsch3D$<#MK(LW(3P=7VKM5@i1b+cYvO z=uU52P5G++1OYR!-FZl;Cjvvk^MBVUcpqW(9W}>y52cz_xOhXj=H!+JgM8+e#dwqE z5nQv})i~{CY8=|-_CL1qdgo1cD))^#r0bjd*{Cb!DtGCnrYgt!S2M4esuXZmIODr> zWl7!YuJU;|QdW|yRTUI-)4Ng%q20R;^Dg$7To5Mq{j!UKO7j z2jQ#2S7*hqCstE}6x3K~7oxqOw-vB;k>RXSt`0Z>&{?r|*nNON`XX3zc?(vEZ)`6HZ{nflo6E zH|&F9&Lvt6eEMf>D;FkzGn$wp5xvXlR*5kNZXypsY_5D`ovyZZ$T0NHimp^ZxbW^B zS+xScHDlx>_f8=7=rQXE9K0^H-O$Y;x`qW8!3QVc30M0Y%|`~_0Q>uy{X=FD!k66d zd7s`i9>Xx+&iy;$o`FyaT#((rS-xDI!rxz2$x1SEmrgni@%dHc{c(_3ES{T*mBs#owRMC z{daA~gYWJp7|mM_-FlF()?Vxd|1^W(Okv8ZJ=qOKZA~bU-RTTs~#rilU!rO!@T_01QKNQg;c@&7U2uG@F5eS*8H3X4ufotbwlMc>I(c+*C7G40GA%fZi-spCZ zDn@aUO8mpBgd=XdM7wsnI__fz{7hq!g{XvEb!P!2jlZZ0Gn=UEd9_>Mp z&L&aH9Z|g1<@UklA{n2(rKg{LP|Un|1ytY`uDzROyVTTM%m;+&0&N_C9GyM51QK+0 zc(#8DLq1teHyO~QlZ5$i;BDg=`**sW?lhM5tkFp(1Y%eraX5y5vm^YCn6%a|C2=;N zpr!rMKF#v!g9kv)9vvSP4Xc;98bCvyU4v^mbO-nH(PLSMuU03|UV@Xg)mPa~$?^?+ z5aI!z7WfS8)v#Kc=aDPbF8{hIgPK|=$}nh7`{PQl-50kY8MNm1_}Wt zbQ|KaG#@Jo`u^FfDOan|zr~OduH}X72I0J_l8b_?I;Cx+WRlqelJ}kkO`|OFszAuvFEPSN&5j>!@48BpTnoZn9gzOp`5GONO>>^F zZ*we(CF!iNkFs5qYtm~kxM{dm@!W2g!E|n4h{o!(#Ki0x&3qQq|d~Xe75w>mv}<&)&`yRIYq)mt*IK4`l=?Ds(*3a z^dIV7QH{RhzCi$-psLydt@?XtF9IQ}4syM|_dF-Y*vNAd$1W}&vb76Reb_&ABj4?v z+L~v`+NrpD&L%>0y6U|d#$fws1oUEMyTJ_5M(+jmay5()qbHcY8wB)fH9&Wa2|g6> z$EQu8qeokK>HO?7Gdxg{#jcYr7w|2xb4sK-&;{JxezJb|U)xWv7JHk$3y5=h3F7p3 zDlpH<`wL&aTYvIjcNTv9-ok%g|M||6H}5OC{`2nk9kkjMzJj+K&~-RdDDAt}M7>bJ zqtzu^YaM_?UWX3u78L(OR^-j)%kR+(5-3$|&G7m0uKkCtmO8;Y=D_DKmU099?j`IH zSu7xb*So3vr~|k(u7_9H&bV&raVuS8KwQc|>VGD7aNJ;tyCrz@gDL@2EI9{i1}&3Ap~J@Q zjF4}p{l3QjKQ+;NuY8*maJ&08WIl zg}Ng&lQ0xBnjun0qyxABL+pL$g98(BX#YgD?{NLF{n0tQjM(~#ZXJp{3;5Z4nBU&w z_)k=`xVhrccP_>V!|!tEq;=>OES<4kaNRg<9p~4Cu6JE9GmT?uXRHk&x_+j0i={)v z6|!Nbby(if1#4jhVWx2`KKQYBa4_7od0d&k^RRNpj5Dp{-h#3~0miPMX&sk#2xABT zA7Du)?GLnf4Qw57qB(8e_n`m9cjXBdkZXG}!P&w?~x%OfDU4S-V@7rnnv~vyY4A4}u zGwmZ{8~tD{tgoMG9}W&|4LDdK&NLoz=fbIi#qZ*@aa=W^rm%B*i#vNd{jhwaft~^4 z>8N#3M54vleZX3V7~K$@9jO-?z1_8ZkM?JeU+V+IR5zt6qXNDr{C4I}U|(+=Rl0CErm;Eiss1B`Z|aoAjD zrUSUQ1`7>X8~scN@MyyH0#1f=F>Sx60l?ai@ZT`g0VF%#SdVk$=Guo5^rnOU_0Gnb z4iMS1fR^k4bZy!Jq`I&z{pcd@u1N=A0zHf%csOA*?c?@}uy+E~F;er1!;`;zYmA95 zES~(`yUMVaiEG%~WZ0|3KOkRoTeC8+HfNQe!X%6!X62ds{rlIi;i`Z#mVOA!Ny2BN z%OVSAbkJ6Gx0~ivY%B9oSzMwrt-1<$cV(liGyZ%9Vx>PO28&bpevW777vx6r*tH!M zi3>dLyn*syM+a1u{+La9xeRxtydq8lB(CLZa(24}M#axv zzs9kX`&Y#4Oy-2?8pBV8V7G(@_;}~oJOs}KuWn1t7oZh1al~HDk?W8WsnyF6Hq9tG?RJ9fUjW1qlnu*VE7Ro(VUh zAMjxnys~Kh$w^nPCe9YJ&IIbiD_yoDbTuT?oCm?)rF5;^*0E<2LT{SkfxznF4ldK* zb#S`3S2A8>#`7yo0GaTaYU4Awj68V29elhhgQIEL%C_BaG@^{Ji)$*MT-v ze}IX&Cdq6Euh=&<^_QS=RlXqFWWEI*ulj@IN2dqJ&_$G_pnmA?%?h=dUws2X20;|Y z6%?NYk}KCmf?ZU&1BrANN#k|B*ktN80hz~B@CO8sce5*9uggZQ%SF2`o0)Z4x9f7L z*5wS>PALA@x<4NfA_#mn1 zr3TWXoi>YhQ7zi_WYNw(v}hN((HnCAj?FF7WKcg@3%9K1b+ejhQbAMsU6th}Cs~cR zj)XcT!g-e0-Pax%S@ebh#*aV=|4M>A0p5U6NeaP%XcfFSwf-+eZx*~OY$sK&XR6!> zO>VwcCNp(0|>N(fD76B z3W6>ywtE;32i}3R9ySuF@`8LjqwbMrkTv+lor^M$OUkB;HUy9Mx;zu;See{|ZEoo& zgaKO66LI&B{3~Z;DXivv{g)jw$bSn@k42C3(`SD^eej>%gZO;!)3Xg~Dkr_&-wgNB zF&E^f8RNq@X>m2AIN8Yvn5@zE;GaFb5y2eY=9tAZ{mmF2gz#5Sz^BX+sPQBI*nIX` z0Q5eL<0qSgi$iGy#Y_9yS@dllAp}_a&-K;i0P<5@h~I&-EjT}cx4oB8<*Z>F@(?SfPzs|0&oI_n)pYcsFVk-UoAWa$j?Q zOZ4y-c%%3sL8pZ)ATuApi;JKWd(OgNxO-Yeo)E)&2t?jCAm;^TFS6u^{R&T(Zvn0U z;qnc+9ofHJZqN=CW#gyV`~8b0=wAG=e|Ec2yb#2%!kRzaH|WQ~dnCg%`Z(M(I39=j z7wD3M&=>muL7^{=c9UjhzGY@EuZp_IW|v!9zJ;cM<-niF_7hkhG&u6v1YJarF8-bb!c5`#Hdi!_yFtd3{dzqe8_Q4G9@31@=_tS6m ziFtK#`i4GUU!h)1{w3b83gDW4ZZ3dN{@ohY4$AkxZeD@v1b$v#{BZf7uVH?#fvX3c zbB@f$T*?}09Vgsus~YLM)cE7++4|r3E|$OlRDEBiZbHqMZ{B>qeyu;hz5G#q{hRvz zC;q*D^O}DAyngZhh7AYSubw_uuy0_lq16-cMafWjTfY2xA6dlXMk@xC!NdbkIo6!L zaH3h1k6yGS5u?Q7dAWJE^LIdEo`bpsZ%9t3&;a}}xMIjN%(KHDciN^PjVgS+TfWMcm<8{63-aNz;JpSJ?$na*TyOfZ#GKR{0=_Ahnw_dfiNU`TR6FZ&IWM z^yN;D`{rLh6@IygW#J7J-&m6iq4c>fecqG?lfZ+_3XswYJ5&SRMTK!-LcRimnEUq? zI(e(=`HFjSnp=L|IwrV#KSIsNnY%}pS_LY`@5%1yDc&jQ(sT!J9-WlIy;;1*Shfmv zLB~&?y?L(tj^CyG^p&vJ&8=dWuaMgHGYM;{tbb41T)CH* z>(?-E8`Tf8o!&mIrfaoHYFX8E(nvpkHh<}ysh*^kRu`h|QaW<<=Ijz=r{_PMkVo3r z8&oC!sQ#R$k~@^Lc~$iZ2p9004{_svhegTI|MX2geK%J>txM_oOlZvd1CDyG4?oV# z#(&Jf&hn(FMo2yWOwGkNH*~!6bRnbkD<%Vu8iqY8iPufNkO!n}a2oR>l@&S@Q`yq1 zvX6d2f9^hdAJx-x(xKv)byv%_J{7~=(%0jQmsfxN5j41dRi|~==F&H>X1Cg_H8pxi zq3>U%aIs)>!Pj?`a@&C|@VZ0IROAPL>3rrK`tBpqZgjUALkg{8;beCx5^q zYg*1}xtHgcDB~mhi&sw&hp}p~EFhcR+|>2`4X1c+$y zl!8c|GiCY-#?oT~{~+)}1cByHfe~7(foIr9j{0h5yw`fwfyV>x7jWgrOC81S{Kzr0P-f=zlNbh4 zPA~o{wCaBc-M(Y{d=%CGzY9TKYV!Ft1ouXN&rdhk=qu}HbA7&k_2uag^Xs#{L|+S7 zhbC)ZKmGC>c>KVK-}BwS#LFv|(x~;0M$)FcdUcU1m5m3(yq2w{(b2!4*QCw%V^PP& z<@WI!F4Ak6xlPTMZI51Wi4<|#6j@<>8Nxju*Br>+E>51#?xmNofN-mLgUbVsIH4#s zvU|U;+3W4azsOG41Pmln>i9nX=1IAu{9+WUQ6Hg_`Hc-vRbczh4u9qlQATDnI}%)` z+~iq3X^t_k-VEB6eLPp}dhY0OzO!k=e`J3hxC|)!Z*le=$4{UA`^CS*liAbbe||vH)_X_C-#pj_Ls(D=TD-%*aiG7T zXTDfGc=Gtka`zcL*&RLj-SfSLlorT;;@94%tCH~P4?x^L{qqC-@A2_Jo_u)^tA6+o zhxh*Z_)m*>PmaI-_T;xGPmaDlUQiy$fALH5Pa7ui@t05U{d-S8{|>4o!vxT8UXViG^Pp zE~uZZ(-6LbaeZhA$ux3%dbXeH*etN?(2G;B875$bb_jVTlSIIP_$#`dAEA)z;qGM~bdQU4V}8DS7v12{%YY-8F)FIER7R zVD%4weEj*z6FfXnDK`kx$X%>I=Wc5!rTB-Lt5Lt$)fEJbkUsYhhljy-5BnZ8_T$4I z{}1eDlII>R&q>z6yc%dT&y6?YG9 zRdE?5U#TC;B@bpQUCcgi45{^3*QcrZN#(Z(5*}^8RYifN z_$~mQ&lvmOAHF{M7uY7esyBBiN0lZ;=n0|UCaoQ8oy`193i{%aYk6e=3bFvam71aE%`^yF%AP}`7tOgU00Hv{9C=WL5K}!{Rg=VFsvAB zb76kTooc_$zKCOd<$FKeTyO8aSi?g&mwI^b>oq7r|Fp(Efo9te8NPW`FuADP1Ud)e zc%t~a#PO!4cvh~mk9f5wk_&x7d>K{;{fQ}BYiPu@_m%pi}&Z6?q?kxpNLzd!Jt zbhWAhQ1xGkK@qbB}C5ZQ5)poGO0D6A+S3F*`B3)yE_;rEJyt-)=kZP%>>AYLi>me9WUk4jchUW?!VF(MSi=VI0X1*y zDz*(OMtrTz2U6|_XTT3%JUTtR*gpl%7m)p9nES_%;O%P<2pkR>qYhltuhY-??@R-b zcaeR9G3Ef6_@u^(ems*b*y!Rj3`;dLaL93ZvU*H@z#l^vh^Vj-Ur4uXm@vtY&E4Fe z>m3sxYUPINg67#iL0022#BV!+2yQU=D;oS`#P>Lz_nVGA#(Oz->Nx4tAMX*0-9HwT zn-Ao1!3@WHW#}j1obGH7Ug74}>XT1kv6eYA#ZCDE+$(*430kakdf2y1aBxNb&3*y0 zDGL90;2OM|Q2-xMe!N^ARVcYXcmPhP(pK1Q>Hq^Aww$;?Y9+3%gt$R<$-fuT&#S{V zA|Aw=`)iJ^3ceXX1xWE_jS-Phn9~eVjwGLDTyxO*Y1yTD*C~IG64{-535iS?r@x1N zls$LCG-N)AL$~S{w+ii~--S(LpJ_$=tDJN6mVQ*w0b6C|Q`v+3=mG1DuJzP|oA3^% zUJS#oCx{}g2%ppY=!$}(5~>wou7%@cU^9>mG?Fx?;0id|jE9*2!Gkjjx`AFv&v;Xu z7V?N8S1%3$v`=+kP}UMbCaohnzrVeEM5*h|kUlVwi!_i68i?Lm7wABxYJ7>$CzE5c zd$dr80S325?@?;&BlD|ze8xRKOUz=+^wL1?qjec?a1K|3Zj{e(s)=bjrD>&baA*6( zJ<&KIni}y^Tlzw}p8b?vplj>1G6QO$K-{?{2pWfcvar#-$F7ij!XGd_dP25zs$L`6 z+wRZCwLSPXx&DMX=PfG%(E&FD zk-aVvJ#8N%T0kKwxp{>CV(btwz52_RerF4y!!_+}EOxlwyV_raUDXv>Ss)*d9xGX- zJ>3_)C*EQ?a0`oQ7XM(Q_!pYNKkQj@=QfeL2HAp~H{p>M(_S#9y#o85UG5$7DX;;1 zjLY3AyFl2Da04T(00bMh<%!yoM6*vm1LevG4^9?o|Lr#Ifh1{>5C1hE{*$~TuXsmZ z9$v0aXh$N!eVljXC4E&p5^&5JRvc;-? zO0IYvS6B)#&c$Kct@X%A)CCBe>+ zy~iE6Dx?W+r;Ggy8UQ9RCw;qws1kTFSiV}n+5CV)%YC45OHjc!1KFW0f4scj{DnC#~fNI6hn z28>^nH0DWhCzX4ABEiP~nG}Cce+I0z6qmMtc>K>#e~ZI~6a5S&UVv5~!z1m^b9kgV zUtjF*&hU)z0F*QC))g&LEDsKK*^eeZT0`&?ux&cu=X@J@E<0LYJ$hvD3Ha_NF49XB zY9h_QY{JHTxjY9Ghqp6!ad<`l3IZRUubAIrZ2Wrl_!;64?(Fef7-l4@^*QTk10^2`;CA2nYn{aT3MrQi5QDh<;C&?c_kaX2{aVF+Uoc9 zwtfMF09B4et7L-mo%Oy%6*>X44z&mAtL&f;l+OI}4ca6n0}%Kv^z{i!&A?RzyT8~4 zOmwv**J5FLG}&OvZV64t={0wE&I4aDPR6FtBpaq>Qk@FYd-x>p$=8eh)3QNHCF3i( zt+umHw4KaoKq{fjG?p~?zQX1Ciq~_^PO`}n(-d20ad5kGvkSM{x!Jyc5Oy+UzO#tv z_#iKxAG0_@(M0Z64|5|w$E1XP#W3C*e|CL@e&0JQNXK21ijylEJJQPMQ#BGb9RZLn5i*PV4H2SKxCE zOI&S!T&IuQgVqOPig8uB@hv_Twv{1PdgFvpHS8~FS5d*W3dKZDWODW+m0d2-+`S#S zwB#-l0Nm2=z^M5*xcw!2w$s%P4=$DAL31XUD;V=ZzS^JSH4S>1<-CuGWyKd=euaGo z0brjakEk4{TvpC}PWK)o?gN%&9)1iQd~$7a{p|SpYP5ge!r$c$e#C)3#H6vUVZ8?y zNT4Zs`Qu-ApFlt`e0X3Dt_?&y?^jRC$FREQk4p^ie#5`vrEw)5xygMIg*q0;-bnXB zW;-e@1lHy3vVZsi_ro0=D;VqAF6le+Z2yeZE@+p*Q|HJD{OL$_KIxs}|o zfS)XUCt`*{2>xkB@OPQwpC*dG$kL0GX1cHVDPM!quE1s3@_>$M8FKWvye*!<9quK} z;RY3@ij$(NPk|Bn3Z!aZJ%W&qU!hxwW9>xh@$v3gGqt@2(^;5)XzhZR8tpV+gS+$o z;MJq`!7HrijpTVFd4^K_N7!>eK6-iZBjkJi?8oPSUcG^TZ(s8eP9Op!#JpU+Ok$oB zz*mS>X7JTVD6t88ztY-GCE%TU=`8w8IpUo#k`nZpOa-|PsO(?BslBQy<$d^qGQfh& zU}6X^F%kJK;g_IP_=Q~nzslIsy-N`C+?ueV6`P2aEhh_TT<||8cN;Y@;p}s>}n%LS|k!h;t?{%=`$=i+S znVhkr$h~f#{`5tyAaxeSE|fORq-n-Wf`br0MKPVYnE55em=WWG_LmieS;V4AVSoZ7 zDi6yj7@*hL%SRV!4i*>BF45DSez!dMP^0W;n_9hKuJLxiVzzLn6=rM6a;CfoZnaJU z>I*lQmU08V2WXZ!n-}1y;a;*Iue1ba%D;RAVIn`ahD*7QpgdAteUm;-hLBl4J*jQk z{W?5me)7q*#8%a^Y>O+)c7_N?4v0u6sa35r)fvb$Hf6ZIy{|7_P}O!d7iKAU=dk>Q z%X7XKK-lqHzBbI1*3){ZKlU$54d6%p_Ex+Hg4hbxZ%M9qLT?Aful3?BTm;UN)Gxh& zAD-faH#0CGU8Bdp)BHYhv#S+EZukNBezt+XM2~JLh*YBURQO;kF*^VaP_N)M?c@;v zp$livPM#AzS{zV=rPS>i`I+DmwAWYI1$q*4C=mq{|6r6CFzkH{?LJp#UDdQ~tDqGr zju5uhW?AdaqO#P>UnblUyf4~b(!3T2=IWn4=YD}=I zN(26^U(^rI6Z}j*zMjFOibhZC=Le_acM4BD^&f78D6`F~1?X7-EEvEk%3Vxh8L~!Z zW$gIi4so$Tnz-7LTP=jbN*7!dc3*)btDi8)DQI(Eo&AIxJySqbAITrroC%;$Fz>5Z zpMxC}+NIGq?DaMOc>S9GUafz){Apd~VbBpclo9APf!7$L1%Lbq%H|L;rz#_`-$V5k z{7tT6DjtJa0yst>-x$(br%zC9zVUPBdmBcw*AO!na6DnyC270NxSRTPhtkebIQ>zL zP}Vz|xcLDjn=?T(I^+x?fOjpeW;1)%O9h6=k+ZIC(zbiL&I!Fpv&B_`l$iA<)>MmW z%loKpk`hw2ca^Rh&&5IiA7YQsIXbmrkc;@NF26dHo9a$rRcy7Ikw+Q=qNuw}J&F$A zWvUWiictOTGTlA_l>+MDMURk_E8Rjbmq^fADq8N!@@rjg&BY7LWq!yY_ky?-bL@Rc z-d?MXZ--e zhOu9wHVEoTdItbvFTZnmif&o7nGVtqQs2p1dO(;U6MIbsW%I22l&{0d`-66MOC}`s39eNb0Dj5ZEJjbs z&B2{&*@7bIdXALleORpbF)$WmJaw5d+gZkJrx~-=Sd4Mp<6nl)ZVqlffX|N6;!`+S z#1J=&6Y^{J+4{i^C`C_Z8QcI~gDX6E%(}b> z@fy$anMhTyA6!vM7{>a+3GnqV!R;nk=z{DJnol_JdU?D|B_K)wAOu2*m%A_F4+_A* z!y0^@FHg$b4ff(x)sf3X{^dEuSjE?_Cny?9&maBF{N)3LL2uHyFYlO6+Pa?sKI=bf zCSY$Jre0lwk~Bn>0nyL?gloru4;7C{<`9ULwnpgAi)JgyT1(yz_IX2#9i2EC@kBOEFVpRMxO;vlKv2^(>Ss+gyr zol#`#GyNpf9bCf`%if+yF;2id4;V?nSrAdQSP@??cYZT;@F?(d^(2c|L6ZCujSfI> z_z9}Mpb313>I09<_e)@qK*tDj02D2dZ&qxH^vADHo?QOG`vkG#@f;jo9iTxVNN_86 z*%!}loKSY{3Cgs0<-+=_jGM!|`*>$dsFR3Z8N9jcv0^KxazGPFA%JY#(J|&Wc@Eze zlQB$$jfGx?fPwm`_YXkAz>GmKCs1_6plHqyag_5veaFtaW$=g&zkj%XLSF|cHpEB_ z7)0dq2l7L4eRvl##RsC#G~@X-`XUx8bA=vcuD7I?b9wIv@D+6LiYmQ_^#3|X&%A8t zG(9_kt5^E7Srjvh?%)(?_37SfvzT;oS6q~W!|~I-P4fLZlZ~|yrZV8|;{9&}Tct}< zNdNw<5AX@W{bmi;lj}5mKDYNI911-aG!h_~Aqt~Cgb@UaX89pGMiy}bvd@eMfExw_Z)#Fu*rF!hVgAZMQ}-rx22_WR#2u-TWY+rNEp zw*^D+W@S(0bbY|c*|K#{;pg{Xoc`tW#DU+nlY!~hsxZT%7Srbdu@e=Tckj^G{=8Pn zB{{`b?{SqP%x9pub*DDWr0C5Cg;c31sP7(qw!PyhNm+dLfgVzHk)6fuR2}3Oj|boV zf7NK3g4I~|wx6wWG^clrhF^;bD_nye*c&~RWOI5B22QkG;GEFdZTToa{zQei@$&q zV=*+w9Sp91@m@1430xU@o2JnvapClSex>Qow&FmK)XQGG2*S&@>MNk}y}wT5lImbF zC=_`%oI1jr{AQuTI0(neu0nRNN(w)bqzjyKyiUP}zWa{SFtGh{b4wnfRBkeQxS~JH zO;ro9c+f@EkKNqr&_Q=a?s;2ZR5O2!qLe#WVUZUSqFJs#8xD7XM@6EsljITG<<7mG zMfxhn74RA}#!rm=4A=<9#{?%O~8p=~S&kXw>c&a9TzmSjul>G0mpa+|KQ z_knY{eAFFw`+JwmB!xnQ=8MH4DAVl_Mqo`3D20|)$pzP+5&9{`QQA)#F;m+w(d^8) zVvXvv86%)nt2QB|e&J-VA7laE8heELoXdi&pxv|84%wsS#jMtBQ+-|Gin3Et5p*$Q zKi}P{sxWmF?w9kirpm2sO2GJQ%n{=k6bzt=O9G?@RY#bNqeo z@##m7CLx(KG)->I?aFpe8qc%a>zi-CK0f;5yFdK#o8NtR^xJQbzy9v{_rKjC&tq$F zY(wIR#l2JXka-VNa=|Z-zy00spMLk{@4x--|mv4Qd2Lx;H6lfFGU`V!~r4<~qpQ&)ZjE#@Un1;%!#SV3*MfBpL8 z+vBt}U&6?C=&f104k`(g5?}uD^UoPEeFM3_0QE*}fJ-4i$T;a5%~p8aJ2U&@k6-@t zm%snlFQLgNzkho2 zgM4SSA$bQJ28bO2egN?wp!0$)=D zR+rVMy2qS|GSz)zV>C~AlGSIC55#;27nLg0^0NLEwQ&ez`n%INuYV89FQ}!1(zyE^ zYB25C6uUQluh5;XpPcFTvY`8u#NId^ol6%@#ct zLe}-Gckk5Qi}m5_TP&(zLQXI>kZr!4G zuYFX&TW@E=t<81uT-Spk*nUADm{tGvjf2(rOpl14m4i{VFrjq&D-kJ5%Oi?!f#!=Hvw$3)dF-|8spwDu;JW;OzOHh=Ven&v#Br*nb=>|N|OmkZs6Kf-BrHZ!bR{J9TrTOvvn3_fFhUuK-5HK zURQ?lboun**Lu!YKLEDIfa;5f$4Ft0LH`fVp`i9V>|L_HA1WHjb|v&bjGbZag5V)c zc@Z4ew{b;%Km(M+g^<>Pbr=jBNXsXmpxNb%o3l5UXNTqIu29IG#r~v*^u~o|VuQz5 zEf8V$am2@Y=$Qr6F+9~3%7UkOiYN)!um4!SUVZg&?y>>4CY&(KCV~|Tr_S?&%OC5) zchLS!GM~bWG!5sktCtT+bL96|PkGxee})K+tV{y26p8oC=O2SEp571yY*GOY>?niq zAJ|$G%^^WP0E&pfGoU>%h$lgdG{1Ni$qyVakSyu_d?mDyU!K0e>-7EmN9uFANoP`J zX}&?wcE6C!-)DHTe$p$mI!~JDJE=fJY?1?emP(RLQVhVv3yp-kNA~i1Ra9~5`^n|a z#Wv-54P+LTQ%fEqnVI6k7axlP!aiY<^nHyIoBLAV#d`hf>%s^~C0xSS~K;{846ZREy(NTu`skyX9I!9 zNic^EJJQ0>r?q$E16zaT$L47es37StmwfS?YfH}Lpkf|R+3dC_n=@w zGoa~{3N3E8=`5p_BA(JiG`u1QDeWn3k0`m@nH<}0`8CSHNV=gsc%r9`i#b)c1C(1T zLG=~LMz8cfIz@xcR#^4!T@iVMV7o%1yS&Rl#`Thy>sczl+)2#vP9e4sYIiHTqgPsS zicB0X7WhhXQO0puHC6fjTFi>oKz>#g5uOzzPnVd$z$cK~$;{=DzxNp#>RI-sfeKZ? z8eJ;vdq{nSq5rtp{{p8UwlQe6tG@FFOWEEOm99(0h~`MO)%LwiTMsos56S2`?M0Fr zpgMFt(oX5`9_Idlo18CcYp6c<$sH*SyJ}Q&%Cg*-0iaW?q-1(olST1-mA7|3)L*1S z4R^pq&^Q`-Q8B(RCjho}g|eAsux{E8DjM$Ze(+>1uMYEZOyY_)8jeqns6J<(e1fNM zLF3-ub<=$MKX<=*@1ie?<7tY$YuIwW;HumdvJqdU^_BL~GkjiU?C z?g{2r#4$jVnwgdN6wR5GPt>{Wa^}tf2)8~^Ka;?+U>&f*6U+$giXtbVE-s6L4k{VM zY>i|z2ujpDs1v`LKR^1wC!V~?A`JN^n>66tAWh*KN}8 zR3>B{-fbHEg!&eT3Ik>Yz16csGa)J2*#+FDKik&mmY9zEUNYyG^t07Z;C}ZfsNlha z<tgcMeH2ro-=BTBP z-xhW1gZsIp?oFoOkG3uUa0hp=I4C@LF{^@U|KaqnFV;AC>>0h#-0SEW0)Mg>T~!Mk z-!!A?OV>Yt&l+!M?!raZL^pQ5TAv|D-`tUD4)}gtkN{G&Nj=2tEKq~`NGj1jdHzUR z!=<%*xEK($?)#YuD5d_9*M-WF3}%@pVo`n~JD=umJ9o)18*9ZT_o$Lzb<3@O zq!N_J?@73+m2_xPFhVUyKiEZExwX!V_jF+5DT?L-v7w;fUF{d(yVeY(R$K#PMl{Yx zZ5%MjS6=7ut+Tu1Tg|MIkfhS{=M#&bZb7_R!Y!e1HzmbsmJu-6QL-UDBHTGg1tj1? zd!N~5)6*Kumf#6(ii)6sI#NQevSSeL|Ngy}q_*U3o*DWROM3Rd=fA`)Cttn5mNQqi z$oUsD$M};^{-g`1hlG062c^3RF304>!0>`zVHnk;=Y)UA~82J z<5}OA4JgCi|Q;@pPT6$99 z`TMDu?OZ95efFv(KsdP^?;v?u67Vzmu>{|noFQA}a01^~fHTvz@2$Y;G`NTWz`d9B zLhzecsGoMd`py4B=Nlzw5|Li6cJITjm?ZBsv#_g=@U8^rB(FecTz$dI&Ee_(dAa4F zWj#w^FE4H`ux|3mN|9z@8`H&ggBEOmq(o%v^e67(YxYZYar2{aB-+i#Zh9noGMC2K zdWSs2P7+_?2HOGi)R{DSfjXW`lVM;Wo%OUJsw|w|nQ}gt!rSl$&Cl@Kf2H<6@=@)p z@ckA<$3U{5RGxlLcV+4miA7*1t0B{dIGMX3HeOWcISH)h z_ZLrj=Ji2eR9|?4%NN`?83*VLc)o?zI)aK4J5M+MCgP zkJ-7tVZ2P+Pcpp!_*O;FxoAciC_2NRgw2wJCR*EccxL<)&b}!%K7X>?!Zv}_J7EKT zM@nhecnguA5T&Rw>(oi;w6A<=xv_??o?%$I^8I|DwrW->)d+}Bq{ed$sjwSUG(M(l z+#+%ySbRa)KHs(0`8J4RnMOd_5V3Tc=XuJv1yzH%ItNYIYHFq=aLF&mT>24{5lKQ$ zgSZX(CWU$R$lbhfm*d~#<71kRgtv(Pt{2SjkXgl1@xj4oaZ`2b;A30MLQ8braq(z# zfCuvG*~Rm@9yGJH(85V^=JDO`HY10FItoKdArosdZSEIU*B$_6Z)cZqBM(LXqB8vQ zy%SXLh|Ad*KdqSvSt_@B+r@ij@qA>-H}CG%j5vhV8{Q)kAx7j%i9d@X0bYMgW-%(h zs_v*WO`<)?Oh>LJqR1<~&#vaw9SGg2%feNDN-9#4e9MGs3uN5`^BP%eXZgRaM z+7nv6Qp@`0SouTy&?45^n*~iv*G#SI?dROvwy!fD*rvGU^1TJb&m8q7d$XJNh&liK zGE?y$WEhPJf+`DokrgOJr76=K6LNN!AuOZD~tD4RVfSQ67xlBEueaQ zKVO~xcn6(Yu4l>BmB!Z_(*7nEf_UBCI=Uf@1sg!e!J>JupUy?LAiHJVD0C13Dsqc- z36o!RLB3ri)|&a3%8!9=oS9PHI>kDvU+p)DBa~2*<(t5wVraW{^`5`MLtE@}w&_WW zOzKc`C$o~=$3;=mfEfi>2D8yPjwoSQvXoWX&fN~uK|=0`kM@x|*TA=LlaG`jiCzf)=yt~dZf?+kl=YbIQj4zC2JX-q`~^DM^=bP^ z1@+lJ{0as2k5F4+DfTby%5NFZ{5K{dzncGgU5SM3lBUFWs4alxVD*<@GL~PVXFvBU zjeU6k7RK()YeMI(dJGwlajW*uFVM{QDN!U;F-Mj05387;6cuyPM&4ks@4MBCFH&-A zltqpaG3DE@kG}lox4-}Ti|>v;2i4=Je<~0#Wm=w1vi;x# zi#*`EmD?#@b!G(C4>LgS05UAb#xGwe^}#EB`$?}5e6>SaBI=|`Db#Y~+eWU3KUs3Q zl>G=0eK90ogwvwHv8AnJV{X;ocPwRxJ2H zV0-d@6|)M(HjP#rltM8!bv2i%+p4kmo5GM`%}&W9uMSlOw8d9|WK=!MCu#0rF|aJb9tfQmSUSNtIg-6Cc|2kPf%)Dt7oN zRU`VYMP9qQ%H_76Hxy`BSZ%Uy^BRw*Gg+z)RGH_dFmdQcV~8JXD>dixny`kLc0jaD zZNUIe^VK&aAI;R>pWk~&T=d{bRUtkx57HiDK?7P>qsVPdKG9#k0Es_^flpd|w-|}% z>U-Qqm_wxwdaUhpf+kgG5Mjv4R#nQF6uhxJ)UsAxvT^k3Cv3ZtFx=ve@ zuImq*be)j!l>z!3~|KEk;FOdUW zfmZj=ewD#fZD58&*4^dfm{KdtFut_?fkP1JGM5)ErD{+|aY$2>|0Ocl*arG})?D@s zlcT)_p4T4C@##v95G@-;DG$D^Zkm{2Zqg?0)T7^mzbv!me-iwW89<~G^Ayk!gs${XlJs_dr&a%;!S ziND&_!{93d%;*;kcPJDC*hi>weX+zQ!NUw2h49Z?LC<9uTO_wXH%PG|&b^43eTqJT*#L@^As9n!=>bu3U1$gKb@S%`Q+l(Q zBKGbeDNixpnynE*u6;_Xjo=QKdawi+O8o%^V_|G^4RNh_H{35l9${BNB%({9!__Q71dHw6 z$mo(9LH)OxqtA(wXC?RQ_uz=4+}mOoGPPsn`1L{ZCNneuhxadhEbbUV7tP&&s`xJ#K28KmElaEqk08$v8Z+2M( zf^*is5UT3QprJ68u&3w3Jxcd6b3skJAJb1#z^pfT#lu$bkl*t=WWpb!?vV0j%Yd{jbI8ra$Bw>X)ASIZyNWjcGi(O1`mLFCQ1**r^f z7zObg@+%%*QfkAp+hr3#a9+IsgBI_G2;RB8=HVNq&w-h@lAI_hcXsU7*l%BCN{n!{BcP zGJPUbC7+`s{*TLf*W1Z*ns@n@yr1n)RTb|i?nz|QEDVKx{1hz-NYSgBHht~<0pD{l zzT%vToX$A&AYUm~RXW9AE!wy3J0*G;^JL200jb1iq1FA1>KPbSvq2hpw_SeLqqv7A zH>cXwELpkEjPkTtucH#eoXcMFqlkxxF#ZyxYpb;7_qSvfe=)JJUCy91cF6cMJOK#O zKb*TQl2Z18pk;-qSeH&ToA!6lYTk(%DtcnhfmMWn9dhW`H&YW~^cGONDd4P6-s7f# zqS`F)gKq9FyCKkh#LFWY`pRCwD-*_;MyRHeNgNHXs}0aFqzrj!;g){MF4oUlgZdoBteD)Nu}7rUT}FHd z*IC0~SlCYDzzO}vrC`=c0)VV$xsHQ*UgRx55nV0w)6ix~n}2`3OzhJB#S#}v9*s`G zMHBIDvlZ@7*_zpWcd%2yld|`O%$}Xe8fQC{yhYBIyuiR8*H{B*V-l#dp#VH%dwZ?c zXIob5LDhCqM^Xn_UGYye2rkQVl%)wrbJB#PIcY-DX_^?SKW&6oO)S}2BYq^&+sn@{ ze+KozQ_^Jt7dX!-#Mx3LT=?e!{yn{Zx!J&9cyBztLJw0fpoFuS2bNj5>ZH=O|J_q}gw^{EhT#2N7fntvVv+sLvix%GVn)#PW< zBUugZKI_(&1DJlUM3%+p7&rWtP|TL-;msmRo;$gpEY}s+u4Q^8si?Khkt8TH&m-;X zQ*hMPa=rNF`}Tj_r{v$#=gLQ%m=F3~nfLbiUT==GK35)p$mh!AU*U7*c8Mx!zve+v z``Es>B{j>#`31qO!li@2MlAva<3gj6vzz>#W(9sjTmjS_1hK)^Wb(S(lXK zoRZu)9w_q}rA#0rKU%&58=d{_t+tyf=GY+3DoPTo@At7V{7aPAV=G^+=KWmhODZafzE1hBn|$zavBE2^c%QCM zFAU(8`KwvBW66?m@OoSgUn-F4h8e(yMT$cCPo7Wn&^~~%^BG2WS|vYBW9v1G2(^@M zbzL^|!Cf%s+#%p+bke-Pt(&@~{~c&2MX*Ywgt6e;OKNLY<)n@R1DwtI`l5~;1!F#J zhPS_kIC50t79EV;VyIkxDJYLYe34Z9sLb=l-E(+B`{$tUI8}6$gDl*WF`^h25XqcU z?D7st2ks}>HmCtf1hvYi)SEuMQb%fO*`;j#6o|`p$6DQzSGMI>i`jT~B?4$2-sANW zHavzb0S~SDY*%<|iCsHOiCI0ZPCxxX`t=9WPjcf^Z%o;*!nD}UR9>>o;`+7PB@jMn zow3Y1W0`fvGDk3_SBz!$cPYaWr=sRl-SAe$I?Hul?lw9u_?7_DrS}93pm#gG*e0}z z?dfa%eU7U0{*F_eJqmcUOU~B?4dUI{9xN-N@XYII6(!PMG7c1rK&tm6)Bwy5 zg;;zEv05%c{ccC#I|s9&1oP03b|=ahq~Ti&HRnT2Rq-}XA!NrXIJ$rc8zo@YPO)1O z)f&{_E6?}a)6E>nu^&Vi~N zJXYkEMXs}7dbU;F+AjC@R6#hQ+`3ryeq;x7-M0tHnnwAwD2?g)xvS;*c4@)#4JAd3 zSAv}E6fR9>Uw7nCwOlRAev?2I(c>WKy_E8Bl5!Wx8PQA^?`oo1_f!o!Nt&DBWM`~K znxfF=N8xShENq#b9SG?|gWr;;7kI&0toK$&37U~m9sxO8`bCZ3yUfAaOD|Yj+eRS; z$9UZ$$?~a-XK3jJFHI;LhYmrP!E65NY$LtI3=MQSUsGg@bdOYl} z>n<{1OdKE8+eQ1asuNOdFMX;hWj^B(Ij1^Gb2n*#b;-nw)|NlN1LBe+bM0qPex_KK z6(e6+GkZ>p404;fRB7PuldLyVk32l@8C>I|2dg68&O0k|&gRwZY{H!^&F1Osu}p7sZLGq=qHJLfw~w;< zWZsF1Ravi?Z_PQ-d4>Mi2Sw)XZ-&Dw;TciM5%`gZ(7^HO%k!G;6TS?+T;MC{2iU*s zS%z)1MiZ+K72QP-&8km#bm(r5@I$OA`LMbzk<~zt9ByvFNx~C4>>}VDiGey{?upzr z01x&YWu+IpDtIG`I5*zJ)8|Ar8GqG{qX}?*e68spR`QxSo^b37QyWA{u-Ct#ar7i6C0OuNfrW1_ET{P zDwTprq@APn`$m6wrInoVjeY$KCTjy6Ofypq0?NPJ)XZ1&{RVoQX7qNM<=Ycp^OsI@ zKWq8dhC-Q2R_-oaMOOKhi`Xyk40`sS#Hz=2>YR;2lVwhWdRohS(;J0rSg6`QWd9EB z|JH9qi|IIKhEfd!wHDM4Q;@@=9Ja+rtQLO(;l)RT529%{+Ie`l@Trb(e>=Tp!_^wO z^^3b)Qst=Lm`@}@2OI+9Eehvm%-p~RWa?LeRKsD{qaJLLV6?2k@=EF0qQVSZJ2sEN zCXoCVf%AsK9Be@KO*>yfA;j%2D6(vlU%++tbRzBn*D6?G@xh8xiY)EOIZMdEZT`JH ztrQqkp%Wym*Aq9bSon@jxjfNz(Mh;Q90Udr$zKsv`53Eg3DbKdr#HG%(z+tAeP>mr z$JLsp1hRv8GSRX~OL>XD;80=nW4goMy=f`0P(LcSu-HdUu4}62Lo@aMdRT^eyL?$M z$<_KlNQjxDYVC&P8>c8{SJDMu1jXM_fKEIX~9S+hwSxviW-ZPmea+Ozr-2Z zDXXp$&Z&8B_0%A45~HA#1R{X;yA z4kai6{H%ns2pmP&m`sUDM=b>yKK%(UW#q+tgO@B&q=Hh{a5becg3-G7B6{(pP;4|W z;1)-=mM7nQ1E!5=qxlVJ;caGZDYds#d9DyK>5+EDN%85B416?3XJtH6vS2hU&kDs` z4!-PNEV4nM_`8(Z-L26dJwRk{9_;N#Ue3v%#PV&zGW**iDc{^qA7k=6DLxaBBFV*W ze&aly8;eMjNy#*oMuUyze+Ok8p{qsuy*sN>lQ{sz3kX_+9s$Be&j8{xv3e1|rVH0@ z?eU@t4oR*kx0Uw=Jpd6Z%xURA%XWtS^TRV>On$ul5qfoYJ1?Hk>gf|YzEyOb1S|Mf zaYT<4_&TBJI6PG(eT~QRR9?HU+@eoF#I!5=m4zmc1|{ylND2+tJBj>nAO3Lqx&NlF1W@M4~x(~~>}P|K?u zkhYxQK}YNBU&7HP6YSsr;afI-R*xiaTO;oMMhAD3#yTHfUfvy#8n5X`t*`V$bOg`u z6X+`$nZNuHFDky9>)!$jM)NYz-~QrsdyejfU}s!lTq2mIi$|SWsH@%0;d+1PyjHs_ znxs_)S^QBc?7IElnP3q)qiMXF(lS4D5mmtp0oYy;E}uD%)pPmb+|xQ~ACY3|^$iGY zz5@~EQ4zH?@9kO$^A@Gs+pC+GAlli_kMFf!mwNnb9|lpU|91bb9+3x=x1~>F^j7%- zSgUU8j_K~>;#81_s@E%eJPFq8+1^Dj%4NbS1o`6OH*^e1d|Mo>!$%N8Ub8|*PWFcJeVyTRHl6DpQ4}AlIHtY(JRN!W#46c*{A-(|!)|UOS?9H;b z%YFp7r4LMU2r!u3LEaHcW1b#L8Y*caZ^S%-s`g7NVlc}{m0~K@)M1u^t2U4k%Jke1 z1a|N%B6PqesNx>71uRT`=*@Gu#XO@zo;ovN8dc{~2cRJJ)nSsMe2_e*3dhuiNS%f6 zamo20)p1Wl?n1|v2T0-0;5bI=DQ7X#58V+wn9oo>S}I)R% zj66eW_8mdEf*?~FdA__fLj^pg4N}(eAR+;2k^+ON9glx_k*y?CHMIV`2qEQ-GB15@ ze~_g#dF`RVbGQdS!}7WJBNz0vuVj>#S0iq3a6$eHHz!px#D_Ad4=-@yfavA22GRa%elE&Iv( z-G6OAxwH6J?=KGQ<$tXgcenofL#QWF00 z)#-LU&vJs`8koxMquw2W9>RjuWn``4P49aW??C7oGkku$YyV-pP*SH({EMA}xGDX9 zfwCs~jh;Nx?^hr$Nx#?Ne5REBQI-9xD*Ll4`-3X`6uSHLQGkEIo`$)z7t1dI)Vsso z7ps@MX~vFGJ@(nt=Ww2Y;ay(C&&BeK)tlW{%O95zgM9e|YRyuH8_aNm85a9bADICw zI-jkmFBQF>t*BQO*?<*&HCxe8D*9@+qCr*UELQY-wjxt1I-jk`(OV z-p}v4gM?3HxnUFk@UF`!MHYVVc<)t)%ERn;>%H~fj~SZ$H=gcY?fo@FPgg(P)@R_= z<_zt%CNBrH%b%&=zkmH2uBLl?&sY7B(3eX1Y;;+Y&nE;_=icmg)0_&E@&VjkOf#*z z3V3&AqpLHLt;iqK$>bEii{W1W1-W6vx~}c$0V9Vie%U{izq8E{||fW5cBoRg;ok`Zbh4t zg73(iCFP#DcTEv8;D+=9q+~^AGOyrwB*KJyKftRv3EW<+LA_5(=k?AbUW($!``Wz! zi`uN)<5k-zW4dCWb2v5IJ-p)6gI(B9zw@t-0zg%&Dib@yzd@hN94(sGaLNA%TfBOR z4P=ce^cC2Lxif%AV=>wPqMD#^Mmqev*`F&tCw{Z}&vgz2Oc@Dsw9H5aH2XH%?6hG% zsGV7pP72E`wws81a_nWzbf|`xn^n^d)D}vjv&&WP5vkpsJp#qMe85jvm%rJ-1&HJ% z;Q4X);=$Q+^8kH>Lf(@{*9RvcV*`Efy%WR$XYl6$^zg2iyO;3q;y0Vss!Mtbf;88a zWdt=0ihE)rr)Q)kMU7)iDEFIYTn81cnoy=pHTLl7`Lk8CT$x@;M^(u=;*-o+R^cCV zhsb})qm><^jm{6?2=NZ;^7wdn-ENKtRvDyRt#(T-pR57La~n zmC&8tp8?CfdE>_ z3<)qg6fN2q1psnL^swndDl+y1<_J9sps?l{OvWN6woeR^g-sf}0Sb6Fe~W$q`Qak% z#}Jke0$hrtAA8_&&yoMk-9Y3op zE0TQYD+LK@T+VWzx5!efL8M+YIOLY}G z6WA+t5jqvv8pHtgnjj*ZI)1pQ^mgyy=wUj`LNz?SN}F)?Ds95otF$R+uM%f?`%@5~ z17i6<02_>q41D8p|9$A<@&AJ^ehs?d15N1SW`U=3f-Y_ZUF2g=xpvXS@P;wQ4P%TO z!5BA)F#rYhgaS;7I0RCzgJZ7cn9tc0L>|Y4JYE7G0CC^r-6tAb93!@P@*HF$1z(&L zeDU)C!59Bcd;xsNd+`PHAr~2QT(+1)BLWa0d<-JEm?DB-eh3X7F5h=%$m<<@&?)bn zGkLW`Kll#h{xPq$?X8VH$ozd?YGAB8ID%nJpx1E1p`Olk!ziG$Rqp@~dKXNp>m0h! z0cf;x;rOV1Qrm+J;jVph_b$16kKDaO-m^cd-7%N+dO6(Hi8FX|neHjvGQXAv_3-RI z!aEMU{UEV{$8-ztd7X{0+}6X-IQ00)fLEVLPe7xA8ob3PAP?(h zh5<^s!J5!_0iO5zZjA6a1aD?=Zy3e_ka2GZ7XsF{>?1t)dw4d2^1U12=g`6HpzCdb z938xe4mJ!>4yy_VNMwg~0s4pktoIi3TIeYhga&MY9>DJKun9+K7GLOK_l;dY;OpQB z{f2D?KVx*AvoSzZBkZT43jy9O!vHT-P#Zj;#u0Y03otJRCcyN@;bZ`@hgl8qer13j z!4sFKM>3cshm!%MX27|IH$XTPFx(E_^}NBV@U0H+lO870V0;IU zY|tME58op^kM%eNnAi?y7_z|O@XNu&$^feXGYoyj<6`kKcL3(Wz+A%&8Bj-YFfG`@ z9)>suAdv9r*5P|x2QSiHgdBbBV2F5-pa1}&q5=8|n4yD12XF82z&J)YkmCrif^Y)i z(cQz-E7WFSE8v^vFyN~6u$CkC9TpAd+FQs6)D;+-2$St_jbJlFFQMD;s5nqF9ZcL3 zErpvfTg0Fas z$+f63L!WGcnE{)IJCw1=(sFo5Jk#RO^wk^u?4x`RlnQSWRqUFoyu%!WOXYj|>{Iy> zKYbN?xi0Q0|CovgYR@kIOb?pBiUISnGqBKw0fVKny|J*M8Tt2JkH-_%Q!!w$oOCEN z_J^n87@`4-rHuUt*r0eCU^67_k7vtRH~<;>!#i?sVebox_}|aDJ;}dc1M`%ApFxz2 z^!ps*Vsr;zF?aVB@NHjBxx24~yZZ{>(Mm47#}SA3)q~+VilKV{ZVPLMONdNeAL-L9 z{!CxpVh^+W=X)UGf*<|(oFV$^_!|21np=6z)bP#feD7xWbg_30JKzZ@_5!c>`Z*MQ z4GbSVnLS2^@MM?W00IkmzIq8GeF7stMI-;cH~6wkEa67@!8iCM_P>KC%zNdDz+PwA z+3Kah&NA#AMk>F46+a2Wq5lK;gt?@1ARSW{0)<`gXG>A|^|5RzP@Z4Rm!cH8hiUlb z*a`ST=u-#C$t7&@0?>s6@`h|c-gf6JWJ-XH03J)*4$1=khkK*TyY3vXo4xG--K6SX zLs1j4k-;RhBhXv}o&fIeP-8|?P!`EDupoWHln@zU$~nK8vd(X&yz`qG=K0MG_xxst zeSR~;Kfn1KFwh`XEi1bfrvPu;owmH1>^{i1XUn5RI!EVun(#y=@Qd?2Q+Q|+_~m(? zEjktn{^~qW8EyOoU!Uh`TcWr(!C#-}sRNE^hM|Vd{@-V)VNXTxKs&YKtz9<&{|Fk7 zHJ9x`s%(ML(hT>2at~mnfVVEZw?!5f7$)Q*3ma}a)V%_>daO8d*y_Nyj=)1z%((+S zOk^oFpFSX=25DBbie-nvz}*5*lIGqGGH+0u)r>q)^$te_0MiS{2e}Y+I~YK` z2HbKqMqd;xXtDucjH6a}hA={1{a{9YeSl7m!27~PR5uBj2iOh)8TE3hfHjT4a2xDa zxnFqaJkGGwHw_SA0o!c@vb^fj0T=~XFIX>q|A1r*oIKnS^i^cA4jFhFM7fm!vM_L$ z2>OBo2p@KHG)`Sr`W{xoLuahMwE%hqjva3Y`T{e;1prWF81-ES=RIH>Mqg`S4WKd) zYo~8Gz${u^Hr#sUvIFQ7kSZX@LEn2|sDScd8TAbadea35JYrW}hI*V0!2G7V7mcu^ zM>ri`Uy*u1)IIbtG?yjhM)6*x?oB<2ZQ#s8C-fDnw+^UI4{N4wQ(=Tt6JbKty$Vhg zFu1S~gSukD@}gL?$LnIgZ5hPm0k))37cT=k&)o=!qf>VUsaa3l?0*~^8_;;jHS zO?9<{5xGdysxNsUo$Y%Pfvfu-(m+@dM1ke%ha-aybU0o(Og(H4z#WJ#0nxzT!bOH% z3GcNqH*k<(vhYLzKI@<*SX9_WBcP)=!g|0?fvwYFR*<|$Sc*c;NIOLQNQ38U4A$1XY*&~SogoV2t z&^~NL3uFn78XQBI1!x0Rnvs5Z>yR43K#`Tfx~xNd5c}u9ii6wCad7_=x9g&s%U9rl z_aQ5{qjKBcs>^Q^8MZ3lTe?q$azozo4Vh|)RD-E6*li71!lWxXl^^7W?e9=3eqTAc zwr`uBznqrOH$fgc_0@30u2DArsDdJI*pj@VQ8zBjf|?PJuv`bu^}Aogq)%lC=QBct z^BF0^`HUFhd`6CNJ|jptpGp!Yq6A{nfv<`{=KWCg9ao6ypfHe*!lgrJdm#USV+)%O zhzXD;V9Z$9bfAZT=f>VBHXSGk5Qjc<_-9xhplLXO)@v>uCJAsz{H219Eap(^(C1no z`dlkSpKFcib0ziwwzIq(^RekA>IJK*UzNvS&_N?1d^GK>ma87 z8?Zk7>45A%P?g#Kyu<=#Jnq~f1eU+?{K@2lNEEx$xz%RjAl|7rD4d%s1< z>Q8&0Lype@zS#SnK>h-dzbsJ1f#d(DG~7SkruF|0X6ZW`;&(K}e}YE8!}j10mQQo3F&{{w!Kdi7%YEr@5O9D!3O zOntL@4cp}f>{E!V2C;bYrGPZexr22U%bgGe@X}ZWrDtZqjbPuCFrX+sBvEK zMEapL&R-|!>oDbK5O(3?+r;Gq9p@~l&y_4(de&I9NFhmz-Y z%JcdhUZTIsG3l32OP;fo=j?p%bXqUD6p2TI zpPlF3wX~|;^YgsFNPWMRkO0%&&D!X0vJvLgR=4(BbETtXqG{*?lqo50Z8k9#`%?f- z3{5w!q3LGE&~!6vXu6pinrYr1ZqpuNhcglkiGylv7wAmr z$5XIf%|CW4_iGSGMESKLZ|IEcA@tM>Szre>0qr)fR!UgT^prFbk^-{pGbdakvS zc1LR`?`iF1uEv~}Jy~lfG1qA~=!Wx(pEN6el5*>B3D}5!Dv%pELJfZR|5(}oYAbtS z{LP1~)+q(i?LqBnk}fX?GAxNr zKNEe6?>LRs%KhXUhDTYvARinoq{btekm)p3C4bFmO9k}Jb-X!+uw;ERv655L4yN<0 zSA&)=UA^=C(SBv-jI?6eQSE_R7)nR0kIy0Q z4Y2S{rZicl%9B#%W5{hJcfH;2m0(t@8xFOQOC5{t1qRyr62kta80z@_?d2A@eg$}P zetMP6kc2hd)^1CczAU^0`onG?#3tivNA?()R|=*>tsRzF z)Js{cXQ~anY_|YfD&N^a>cc{9tkm9v+{2nxN~C8uyJgxgegnGFUGYYlyH;WVO4Q~Y z9t8q#p8|9AYJCL0inHG%%5?SF3Z&E#EQ7Betwv`+@2GMGU1q)6?6#gE*gY%dJPM>3 zb#h-NgG6ARorptEN{o%!#{0JM;k}JR?eo*JELmE9Qo>mwdDPzCC9WO#@7hTrnaUnf z%=}%aE+fFbJN8rQUAI(bcoWxN+*Gv<%z;v+M^>s-nxaH*lQ-WymFB^^olJQAp$gtV zrTe@8t@U0kXZu%HWW8uLz_jMK` z%U`29)O+G6=hzKLlc*7*n>Mov0g}Du?FtP@gpp`Xi}zPG{I{y2+=n2h z->)h~2}ec_iB1YtxLONAx$M`3JwI<-!cy!3V%Sut#@+l^1mFu(A%km95O5k&EVT`4)l! zT&+MC0`yKcD^#jjUbL5NY#GCn{Rm-fw#g9wHQcLjt^ikn7XXYF2ky?$V;I=@JOZn! z5fnsE7iSnvtdkJg&#LoQEWEalT=(u>kB|0`;4-m&1o}UnKV)Z(`IYJ)u|`^S!tv zg!>3CJ{FYn9<68`&>7&FI{Rp=U1PIj#Es;^>|DhePU7im=>K7N`(VS5OP4Ttm!P8! zlX(e~30A^!?-IJbH-vuxGyT)bP#L@UY`Hvp&hg&B$@GIOu=T(G4LqTPzb&$jMz;54 zf!=~v&#v~aADk@h*he(|C!~&Ta^hxB`B%LD6buI!OKM(&e*@r8LGzQn{b2tuA&v)h zI8cWX_>Ag@K5zFf+s;02C-W*rMuE8THz;X)=1^1SlkM|&@4$z+TIW;+OgL~u5Y>)c zDLfJOb#*Q7G`|Mtk=xym2}qd*>PIAs#~8H|zZkBz=s)wD8@RxpwXdZ4B|CA)N5UQ7 zQbD*yf3O_r>vUWWUX)FZ;=p(PkH3|3*8264&7HzKq~lo6#BP0dIV1|_Y_MsyDEl(|{$>ZR2c5a6W8rxcc?A<<`w!Cxl^gWs+wm5(vsl5FUEh0$ zTjb)&s%<9>?i@JdQ#*-|-(6MMmc}6eintyzkZjdKQEE#6p|MJ=a&3WBF2oSA<&iFzte5vV%`kIcq)T)gEar13j)G8US@3ON9BX(gmH~D8iVne6F z!IV!(()dh>;h8uFJ->{fCzVDuA6-k{ytUKokQ|jrsqFm@|Dj=AcW|-=HaUX8(;MuZ zJ)wLvWb`Kg6Tc?z=TsQfmg5#PBAD;LiVd00R-Q8P!~j!#QV!jDwp9qUtFlSd_Y!&f zWvDkI$~EpJTxDUBKj;|6c~jLE>9Z`M4}d{mqm6&28^q=8NDw?@S0-wo#V= zw(S$MlV!2pZi^!Bw88Dg&kJQZluOuMMompXHH$b`*ZBEN%fe75K7(X2l&%dCpJxN3 zL>!x-PKd8zo&Mfk$Nr|Zxj%WwJTA`N@b&Cz_75AYqdn0F&yQZO&`O_iwDqa#PE6$B zV>YLcypFQ@nc0VapO+_{?WR9!o8nPhW$7xYi{6~M0^bjBs??)>e#V2Y@6Z3L!j7~O z2VblHYukgK-S!7W-(E&_0zwa;lR+p&1y||$;}ONB(Gts&pOj`!x5P{0I5F3+3W)|9jo)^UC8}fVH1ceFuvOCGilq$ z|24D#4d^HH6>HyxmVvG4GZEjz;dcF7&Ki$@)C zQ*zIxsQwBH*yR@vX2-GueCt{jXUflU`m95;uA#CB%4`SYgTK&8 z{_fk0NQ3Te11uTuCAFC>xLy)^QxC3uf3+ndyZ4 zGN_=NO8O^rLZTpIA=ux%_WLv7CfjvK3MTETgEN*V)t6IR($2 zP4W_`tW%=Ed>HbG=cv<2x4w-q(~628-6Rp>ow@oUAf3DFQV#%3ob7tlx^s%$rACm~b5C7BYNYFS=XY&WLA4}Xo|#J8I^FvTQirgMW{ zQskkLS)!-ITM)+RRwf%7LJHo(1NFgLa#Ho7xN#EA1xPf9wDm+rLY0GO!EY^(fN)se zKnhD~-~$?}2#g<32!E=&BJv=*`nZiI0OPKHjur8ej9(Q$aD~6FHl)Di1Fzi>s zPj5o{+&j%*SZk6>W{Tl$IN1Alq)?gpfo4v%1A(J#X@!U(dlkZtOT=8(w<7o53EkA? zCFvY+QAar1Y>MtFtEH>)Q>tdy#k`QT$x``^1F(&E?hs0;0nOFwBJAuD$ zfVR^DbsG|(^e2>69KUwyqt7`rLL?n;ZeYdPWGJv{^4p%kyRkU1MdK6_o*_%>+@a;5wyPSP)r&L7H)XLT#o? z8rXJ$RaH561DcmN5d)cf3XJFS?^Ql zY>;b>7lDqQ>sOL*zcR?q(B2S`gho@jG?fEtp)tA6mAB%AAufDfK+D05iv96?R9C8J z*QP3NjoJbBzxx##vwGX0Qk1mbNT_9EDQ9rO-h|ba`dt;zaWJ{Y@?NqtJO+=-F@>Sw zp(^iFhoSMJs-&A<0Tz=uIBEu|w`h!%OQL%e#kHVEC6HpI(A2KNXeW5uL#;v-#rs>@ z1H~{R#4t>XqKg%WLp5P`QPhsiV6x~bL#HLnumd_ALq&Y%_(n?5O*;fywR-gis*qBiR$pXDU`lLmjSl$T<5J zCh3A?{?F%ZuF8GG@E45}^T!U8T890sFxicz5LecZuL-}wDZt49^y?Wu!8y{Pr-UTc zcknFoxx51<0)x{R11=xz=WGk*sR~F>CD$gownW*HXKNIkU^r;-h)kv4RYRo;5~+O` zAxd0kk2Dl~vybt&zVOkctSXTDxYUplr+l-?#N@XCP$}?xxY=9Xc}=L2e;+vKE(r?! zn1W-PzEmbsIoiY{zGt$u#}%kK$Q$HaLm2`cuvGbT5dQCv=XqE~#}(T6kaos7MWE-S zZ23NMk@L=Uy-i4;giQC{zG@$x2lNZKAgYo&^Ij0VFr@Ke@|3*ULX~Dq-`b=Z}y`{Hi|3aZIF@{-WLO8S=CW7GEh`{4R7M z$o`aC#?c)m>>wwMVR_32n%KVA{i=}CX;IK&m%@xR2K$-ybDoeRl&Z5^WaQMrp0dP2 zpA7AxZKs@FeiLoxd_i|T$VstkGwVanO((mzx@V)j2X|3l&ep9&s@a6G>_>I_^u?li zsZ|T3g?d+N*#K>eaLu>!XCmjv+}g3j#qC`&w3+xeG66;VsT{RiQ$+F zbKE)JDtIl+)|bwQgyXhQ<~`xjY=W{~<}VhK4VGPX)S_b(-jmNtnbK>)vg@0L=hHVb zWyv;-ERV|S;cg6NHE6ZlTGygzIBx%Ly zu;C1_SP(zuGtVLUE^yI37Se35jb!3dML}-$)bxvxE7M}!75H5?X%#zia%BYu<*;kz z4@b5s<_o2Z-{ic#|y>()UR+V~_m|QyDFXjCHtemw;P6{kN&VCot*F%M~lszF^ zx^p~-=jIa~F%8u>leQScnMhfO)YeyN_z}>RA`5QxE;{~b7e$4=z!f&M_QCJi6r(~N zGrg-W{lFFGy!H`m2YoU&fq{&J)h?&J(kOLF!yw7B!!N>t8pSU5ZNni0j0EoJiLpyE zFI7fc31o5^%BkVX9ZHIhlbLkRpXy1VlN}|->L(pQRs@j<|Q3>rJL%554@z%?>23m z%S&PDhSWq|FBV3c2xzdNG$4mX#pg2LHBP<+NDM!aR83Hg(2l4IY!`L8dQpZiqw3&} zbaD~#e2_Qk<)Q zN~hnjq$53EJ9~YVeckF%`MCs$yqAFwD4cz4FM8zvwmKY2%6~VJ{u+94^Z?9~?FNl| zzQ>4+9P>`};Gl?icFtd~vi@CsaZ4&J34$Q+fExm=XLQMmAlckUM{$uIIizbMyghf@ znUJ=mwNtqIaURLh;j5Gzno!~6F)goA#4-474iQ1T_AzGar z^Oj|vIvgZ~?;Ja9NO2x}oJF7@GF&0F4+j1j{Mu|(7$7w?ZU~h+4HQgnppJRWth>0+ ze6=6Xd9#0$_ia0x@%<5i6xDyUC2G!m>?1jzvw39tCI1n9H1iSdOSMGb!S*fi30#OX z1Z>}$E6PT;oJ~`AU@uxv>Q?5+ghx?z67Qngn|suqWR8?^8)=iNt( zl0>$b{}*AG>pA`d3W>TE{$JNdRT})=|jnQ_R{k(Y=`{*|x$sEvt6CXamE*9!6 zacN)>&Zn3Fej(ZF>CKpK@8oV1*8LB;yziA5CJ*P~M=tT^slyHeO91bmLf^k6GL3dn z!w}M~-pQe})WfKX-~J9D*-Lagyf>;LqH)B^+nKaNr%rAPu!%p)mT^$cABX;iD6FuP z-Zt@=l84AbI$_Q#_C4o#{(MY!4LhP&fb|cl!1TvJzH6R;pK#a zbuHfQsiJ>YQh!>$$=msafz`~G3PuD+2}D`1Uz5v&Cu56bbh1nwvUYt*av(Jv z(hxHyG)Z%jI3PUtrrdpWP6}H|Y!~0)B0x@oS5q~qsB)4Y)xlU&bk`U^a#DoB^HgA<=F%HZ;*E1e=PRg?*l4ihem zB2*x|l#K!YF6pl+spTo*E^tc3ChKgRxmws*`;N>@{@DF+FHepmF{KTcXo|0-|Mf6a zk}XI62Gy=B%auADq(wxU)J+EXIa6bduGdG+aa*i2GEgY9>l>~qcIFI64hlMz%Ff6G zY%OL0sbXOpb_^?`-Btuq9aX&8tM-^jI6o6W_^Mk+&qaa`w1H&L@WQYp&mXey6&^vvwElsbbqm zE9F-rLa95}8q_8D8k( zyl2FORbO_SPs|tizpD~oyOX+?!YaJcDv>}IKRCrAb^l%499`;6av^+;)rziw|<+_CYwDk6eLv!U&g{sMgIV30sfYmH&Lc@KF5C zrm}^!pn(dlGz)cJJsUwmGrLwNq`7kx0oF(nZ!)HN4?~WAMNw+31sT33e2CpFu?O0tkKLC3}FKA345@#TqE=B+hI#gKFsI-rC@b%7Cl|pNWEiI8NF)B52?9x=@WDEgv^g&V+bJeWSSFpqa zLv8lE{-IR9M3UYk6qx$oY^CV+0aK4Lrpg)RF#|FI#>yAxN*G5B;c9~rE%Sl9nF5=n zN@s9N!@K&Qh!-B*2rI6owuy9)k5K6Wcu(05Ti~DS*SO1dO8*;d$bXX?g-cek?{>=$ z%l0T#hEo(zI;}QpUB$RJ6&nQ0p5lE%Cg`xD1-r!)A=l3zXxZX4W(x8C4cd=rc-IJD zvIC8Pt$p<&k`2pL3)#daPbBq zK`Y`VW*M{!qx!UoY8tWy7`a_zPl`FxO9>8|L(3(HYXA6)HkIE!?*vOXP1xjY1``Tb z9L_2HQWNRaJ)o}gr#N5vJKJ`z+WruQqpC{f5Z`CeftBq=x>&mSW=$~-w zou4~xCOmy~CHExbQ>QL0)(@s}&9hvma^1Q0XD(F~ z@^{EP!Q_o|MR*;u;VXZ|F7R{adf=Q*Y1oO#aj*t=F`U$Kf~yUbCp=iSF|NX=Tsw1FOWh(ZF2lp;iMKLj1r_ z8nX&PUDD;UH`%z@_xjLQPR!+S6M&Y?=NR*A5{;(>im5Omi$$5B>+nr00yY;yjP$1K zv?Qi;Yt0y-B>t$ki7@sJ=ypF4EBVz;`mt*eGSsM;o6Mk+QNXq|phmR?B*&mj8k8e7 zi6OdhWo=`r*g%+ioXAImt9KPG2((xbL~qph^7_Bq;G>tji3WLJQYz@|V`!njldxYr zYtgrl7W7R6GQ6_ex!m2BY6(yJIxiTjasDz%*F&;>4VXar%VT2C~03=_^B zeoQblMw=iFb5f39lfG-Acx#KFfGAL9|V1;Z12pIt*)uSJ$ zh(+*Sb5K$vYR42sC95G67r=JEOG~*LA3`azGVVz}y+ zS!3d)hKgX$1XI;%?O`{Ym2P_mWcDRaH8$ zm#vBID|(aC;%B0SAGB-oM)0i_&-^#Grx`@z%1*;LDB}qJ3~%rJlGEkjjMPnAs4cc> zcJhHK8VAl1D%la^#6ap2lPzNoLvB3ULNTE9*-=hcSZ*M)NUvh}!I6R&Xhw&ZV1)@O zwL6aAKPy{Nj3p?xHw-U{>YqH@B6)g;Q_4hh%`NJe%q#haxT9x=;Bw1$S0sSjW2r-H zp8j6JT;4D^!EOWqSdAu9@=NhS^(@VXLCijtSG4T@Z_w#Vi*(!CxXnQ zicR@(OQq?D0)BCBaTbcJg`U|1=`wbvBEZ>P?rVyb>>sWQ!Lp=-H)*y#Ldwel(9N^|_*C$Uoe7{so6TSk!gCV&|M2 zZqeHCEC@HXoy0;D{Ws!>J50CXee@8W9_n~*e*KHPY~QYagWbO3zV)dV(QG7HpP4yo z#rlG)cItbDY+R`F{xxQ;0hgk2f-AXmV#543vc}&ToF@oZ6-bXV839>_5%5Pk7GetM zr3Zc71(T9=JYj+3IShD9jYIj3S)zmowJzdGd%9y_l%qwWw#rthyrt4tDU6K|;^zA) zh>a@JL-JNAyrsY^F%!=Ooyg8a?5EAD-S?G)?^XN)_M)wm3FBC?Tr8Y1R*BFe@FsaL+w zq$N5W3Yw>Vji-4V`Mz6;4T>6JuJTp;2mdnb_z!CNH~EaCQXPi!z>BQW+8~TBqBE>g zf#h4pFHaJNkO_-wUytibr0B@_q3uwXyR|iF%7X%N!X5uyoy_%W0g0l zY~;{EJyni^cS40fIWOAOeoK7spi0=E#eo!F#&5ML&#?;|Kg8M3q@;)W$^7#IIzA>( z4M_e)-%q;heW`g{VYD{&sQmT=W)O1p?0Em8ab2eju>%A>TY&u4cRbFvW1IYOvwLrs z89@(1dgAv+$;y%9@EoeryYBhh7tM`^pFEexfJf||e<$5xp^@pj*(7X1_`Zf&TMcww z34;yYxLfqx&``AMe%jvl{>Qm>#6r-TO@v~e9biv9+pn|U5r$kBg$Aq zlZQqgd!nUDuMlbu^v0RaR{5+cENK=P2Knu*8L}@LqY>mRJV6b%M-%rMuxI612jaHDJxAXZ6kF86Z~n2d^5nOtQ_#)k2uR>o!4ooAfk zrS|YPF*Rv=kKk6D^{<<^U7aMxVXfzo2U`77+f$z~UWjtB*11!Yv!mm2u49rJU1e+i zGM3l4C{Q_FikWW=VX2}ItpeENu9wxVjm7%j3cVEyRn+U774{;UO{|r8P#+#AYarf? zQ8|pI@(6f|QiB*HhHHY@e*QoQaa*PZ+5DFYMvUaxiE&Y>mf8f@S_kq<9ap7(VU5Y_ zwUFd_qKYUG_1)jXdODD2I1L`skzTWQ+dtKG3}WL?`k#!Zs+EeKr6T*e2f{fA!YP0- z4O(>lZ{*Lj zuXfm4rB}W2Kf$(AD{qy%#PXl-jr;co-r7U;I-z54$I8k@1SgG#5( zEZ856l!@{zan3ZdzzPDbLUSf9*Kv1}uJI%XAm0HtL=Pbv2h(oaB6!bB0h_7(?5_NR z&+M-L!s3tY8!9sB*^!Zub2ehic&!EFDaK}0Azj-N%HdNL4G?u!$!uGPEjP$LWrX`{ z7X&bvN~lVf6I_@*SO#TD&;=2ohb{y*oZ%QZDY)zm3CP`N>ZPoIFKb^ZeB5up8Dfz8 z8E#5BqZVnZz;Tdgtklz)pMw>JAmK-THhT`q+YYdOl+ZfLhEs&UAo^sTvi$N}^5BR| zaNAc8Ao|Tge1s+I66d^J>V!dzZ;{+NKXU26*o1WLN~2J8;=YAAsQba|{*8Nm2uzZZ zd%@#*oCG9U&*82?_O6E_P?+_W@j)uF3&hs>w^@>uAjrC*4tu9)@)>s`f@SPc2{l+M98>$DzpC8Pj9#~ryX#>Q zAin9oah3eyH$yvr1$c=Uqr%a==w2Bem^$f_Jucx<;?1lM{G7GYK*ue#F67)*(?CeP zKv^atGL8v{u299O;!?)^BkanQj|TT}{w`yJ$op4ZU(fy9G+1T-^rG7h!WfCn(oU!uybU^q?Zh_mmUD z$xej(s)n4iexeKI|KNO4#xEAXb3I+(2KP__84q#lU}!#sR*Ca%$lOd3jp?1vG!TZa z3ylh%rmvVWRi+%wOp2$R<^MGa(h7V?F zLlM_K94K.b2v*KVHknxKN*Pe2uTYk!3skz7X1H4FS8#ZA}s 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­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 CjSu2qH~D+6ShXpp?Ek87g^LrK8k8!u$3bU_2u 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

%PV*;Mk-ojoQ3Rwr0Hh1u zi!?uREa3eb^~dp-qgZ@xgBFDZW{eQ9KLUCY#t!jVNdF;4ss32QW&lL!0DjQ+@&ff( zI0rJx{Zk`H@s&5|q87=k*;4WPSzN<{ygA*g`U zB!3>mKx zU0fi0fSyaA{P$o7&s-ezt)n=FZaq1H3vG{)f$gmm{+1dMta2}32YHIYnZpZB&;E-3 z-oy;0wEr8dTCu+QR_-t`eMSL`KnIZjpkPVkJOh%v0xf94tswAz2;_i++4lHM(>Blu zd=jv*MID9TZ%mSH*pdjw9s+DGNI0ih@e1f)GvI`11kAHQdPyULCDmO3-bsMX720Q+ z)T)85cmZ?;YGW+HhU%_>>?gqHj3>1>UC#j96xP7VM|DP!J=L87*;Rne8R)mM!=eS) z9d#th8OT*t2-@B3=miM+jcN!>-GZoLDgKOrenlC=_TpfYY)7;PkS{Dl_bmFAVhHPu zLP)X>e!&>J4d|B+A#5m$Ajt;gIK;ey2;ExrOI;Awc1DwAE$oVy0B=^{I1&THD Date: Sat, 12 Oct 2024 18:44:31 +0700 Subject: [PATCH 62/90] chore: add some extra unit tests --- .../v0/mod.rs | 18 +- .../document_type/methods/mod.rs | 28 + .../src/data_contract/document_type/mod.rs | 10 + packages/rs-dpp/src/errors/consensus/codes.rs | 1 + .../document_contest_not_paid_for_error.rs | 54 ++ .../errors/consensus/state/document/mod.rs | 1 + .../src/errors/consensus/state/state_error.rs | 4 + .../check_tx_verification/v0/mod.rs | 2 + .../state_transition/processor/v0/mod.rs | 18 +- .../document_create_transition_action/mod.rs | 7 +- .../structure_v0/mod.rs | 39 ++ .../advanced_structure/v0/mod.rs | 13 +- .../state_transitions/documents_batch/mod.rs | 563 ++++++++++++++++++ .../masternode_vote/advanced_structure/mod.rs | 4 + .../src/errors/consensus/consensus_error.rs | 4 + 15 files changed, 758 insertions(+), 8 deletions(-) create mode 100644 packages/rs-dpp/src/errors/consensus/state/document/document_contest_not_paid_for_error.rs diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/contested_vote_poll_for_document/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/contested_vote_poll_for_document/v0/mod.rs index d8f419a1a4..ac9911fe5b 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/contested_vote_poll_for_document/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/contested_vote_poll_for_document/v0/mod.rs @@ -3,12 +3,22 @@ use crate::data_contract::document_type::v0::DocumentTypeV0; use crate::document::{Document, DocumentV0Getters}; use crate::voting::vote_polls::contested_document_resource_vote_poll::ContestedDocumentResourceVotePoll; use crate::voting::vote_polls::VotePoll; +use platform_value::btreemap_extensions::BTreeValueMapPathHelper; +use platform_value::Value; +use std::collections::BTreeMap; impl DocumentTypeV0 { /// Figures out the prefunded voting balance (v0) for a document in a document type pub(in crate::data_contract::document_type) fn contested_vote_poll_for_document_v0( &self, document: &Document, + ) -> Option { + self.contested_vote_poll_for_document_properties_v0(document.properties()) + } + + pub(in crate::data_contract::document_type) fn contested_vote_poll_for_document_properties_v0( + &self, + document_properties: &BTreeMap, ) -> Option { self.indexes() .values() @@ -18,7 +28,11 @@ impl DocumentTypeV0 { .field_matches .iter() .all(|(field, field_match)| { - if let Some(value) = document.get(field) { + if let Some(value) = document_properties + .get_optional_at_path(field) + .ok() + .flatten() + { field_match.matches(value) } else { false @@ -29,7 +43,7 @@ impl DocumentTypeV0 { } }) .map(|index| { - let index_values = index.extract_values(document.properties()); + let index_values = index.extract_values(document_properties); VotePoll::ContestedDocumentResourceVotePoll(ContestedDocumentResourceVotePoll { contract_id: self.data_contract_id, document_type_name: self.name.clone(), diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs index ca83589ccc..1c05a45304 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs @@ -138,6 +138,12 @@ pub trait DocumentTypeV0Methods { document: &Document, platform_version: &PlatformVersion, ) -> Result, ProtocolError>; + /// Gets the vote poll associated with a document + fn contested_vote_poll_for_document_properties( + &self, + document_properties: &BTreeMap, + platform_version: &PlatformVersion, + ) -> Result, ProtocolError>; } impl DocumentTypeV0Methods for DocumentTypeV0 { @@ -399,4 +405,26 @@ impl DocumentTypeV0Methods for DocumentTypeV0 { }), } } + + /// Gets the vote poll associated with a document + fn contested_vote_poll_for_document_properties( + &self, + document_properties: &BTreeMap, + platform_version: &PlatformVersion, + ) -> Result, ProtocolError> { + match platform_version + .dpp + .contract_versions + .document_type_versions + .methods + .contested_vote_poll_for_document + { + 0 => Ok(self.contested_vote_poll_for_document_properties_v0(document_properties)), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "contested_vote_poll_for_document_properties".to_string(), + known_versions: vec![0], + received: version, + }), + } + } } diff --git a/packages/rs-dpp/src/data_contract/document_type/mod.rs b/packages/rs-dpp/src/data_contract/document_type/mod.rs index 89143a89a5..a87ceb3c9c 100644 --- a/packages/rs-dpp/src/data_contract/document_type/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/mod.rs @@ -268,4 +268,14 @@ impl<'a> DocumentTypeV0Methods for DocumentTypeRef<'a> { } } } + fn contested_vote_poll_for_document_properties( + &self, + document_properties: &BTreeMap, + platform_version: &PlatformVersion, + ) -> Result, ProtocolError> { + match self { + DocumentTypeRef::V0(v0) => v0 + .contested_vote_poll_for_document_properties(document_properties, platform_version), + } + } } diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index aa05a541bf..b238f55c02 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -216,6 +216,7 @@ impl ErrorWithCode for StateError { Self::DocumentContestNotJoinableError(_) => 40111, Self::DocumentContestIdentityAlreadyContestantError(_) => 40112, Self::DocumentContestDocumentWithSameIdAlreadyPresentError(_) => 40113, + Self::DocumentContestNotPaidForError(_) => 40114, // Identity Errors: 40200-40299 Self::IdentityAlreadyExistsError(_) => 40200, diff --git a/packages/rs-dpp/src/errors/consensus/state/document/document_contest_not_paid_for_error.rs b/packages/rs-dpp/src/errors/consensus/state/document/document_contest_not_paid_for_error.rs new file mode 100644 index 0000000000..9e6138c7a5 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/document/document_contest_not_paid_for_error.rs @@ -0,0 +1,54 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::errors::ProtocolError; +use crate::fee::Credits; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Contest for document {document_id} was not paid for, needs payment of {expected_amount} Credits")] +#[platform_serialize(unversioned)] +pub struct DocumentContestNotPaidForError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + document_id: Identifier, + + expected_amount: Credits, + + paid_amount: Credits, +} + +impl DocumentContestNotPaidForError { + pub fn new(document_id: Identifier, expected_amount: Credits, paid_amount: Credits) -> Self { + Self { + document_id, + expected_amount, + paid_amount, + } + } + + pub fn document_id(&self) -> &Identifier { + &self.document_id + } + + pub fn expected_amount(&self) -> Credits { + self.expected_amount + } + + pub fn paid_amount(&self) -> Credits { + self.paid_amount + } +} + +impl From for ConsensusError { + fn from(err: DocumentContestNotPaidForError) -> Self { + Self::StateError(StateError::DocumentContestNotPaidForError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/document/mod.rs b/packages/rs-dpp/src/errors/consensus/state/document/mod.rs index 2a3441fe12..0c59e8741c 100644 --- a/packages/rs-dpp/src/errors/consensus/state/document/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/state/document/mod.rs @@ -3,6 +3,7 @@ pub mod document_contest_currently_locked_error; pub mod document_contest_document_with_same_id_already_present_error; pub mod document_contest_identity_already_contestant; pub mod document_contest_not_joinable_error; +pub mod document_contest_not_paid_for_error; pub mod document_incorrect_purchase_price_error; pub mod document_not_for_sale_error; pub mod document_not_found_error; diff --git a/packages/rs-dpp/src/errors/consensus/state/state_error.rs b/packages/rs-dpp/src/errors/consensus/state/state_error.rs index ab98b5c6fe..8b0ac2b26b 100644 --- a/packages/rs-dpp/src/errors/consensus/state/state_error.rs +++ b/packages/rs-dpp/src/errors/consensus/state/state_error.rs @@ -33,6 +33,7 @@ use crate::consensus::state::document::document_contest_currently_locked_error:: use crate::consensus::state::document::document_contest_document_with_same_id_already_present_error::DocumentContestDocumentWithSameIdAlreadyPresentError; use crate::consensus::state::document::document_contest_identity_already_contestant::DocumentContestIdentityAlreadyContestantError; use crate::consensus::state::document::document_contest_not_joinable_error::DocumentContestNotJoinableError; +use crate::consensus::state::document::document_contest_not_paid_for_error::DocumentContestNotPaidForError; use crate::consensus::state::document::document_incorrect_purchase_price_error::DocumentIncorrectPurchasePriceError; use crate::consensus::state::document::document_not_for_sale_error::DocumentNotForSaleError; use crate::consensus::state::identity::identity_public_key_already_exists_for_unique_contract_bounds_error::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError; @@ -81,6 +82,9 @@ pub enum StateError { #[error(transparent)] DocumentContestIdentityAlreadyContestantError(DocumentContestIdentityAlreadyContestantError), + #[error(transparent)] + DocumentContestNotPaidForError(DocumentContestNotPaidForError), + #[error(transparent)] DocumentContestDocumentWithSameIdAlreadyPresentError( DocumentContestDocumentWithSameIdAlreadyPresentError, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs index dde9c1e1f3..acd1515749 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs @@ -135,6 +135,8 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC // Validating structure let result = state_transition.validate_advanced_structure_from_state( + platform.state.last_block_info(), + platform.config.network, &action, maybe_identity.as_ref(), &mut state_transition_execution_context, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs index bea2dcdccf..f1210e3c0f 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs @@ -1,3 +1,4 @@ +use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::types::execution_event::ExecutionEvent; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; @@ -5,21 +6,20 @@ use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; +use dpp::dashcore::Network; use dpp::fee::Credits; use dpp::identity::PartialIdentity; use dpp::prefunded_specialized_balance::PrefundedSpecializedBalanceIdentifier; use dpp::prelude::ConsensusValidationResult; -use dpp::ProtocolError; -use std::collections::BTreeMap; - -use crate::error::execution::ExecutionError; use dpp::serialization::Signable; use dpp::state_transition::StateTransition; use dpp::validation::SimpleConsensusValidationResult; use dpp::version::{DefaultForPlatformVersion, PlatformVersion}; +use dpp::ProtocolError; use drive::drive::Drive; use drive::grovedb::TransactionArg; use drive::state_transition_action::StateTransitionAction; +use std::collections::BTreeMap; use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext}; use crate::execution::validation::state_transition::common::validate_simple_pre_check_balance::ValidateSimplePreCheckBalance; @@ -215,6 +215,8 @@ pub(super) fn process_state_transition_v0<'a, C: CoreRPCLike>( // Validating structure let result = state_transition.validate_advanced_structure_from_state( + block_info, + platform.config.network, &action, maybe_identity.as_ref(), &mut state_transition_execution_context, @@ -403,6 +405,8 @@ pub(crate) trait StateTransitionStructureKnownInStateValidationV0 { /// * `Result` - A result with either a SimpleConsensusValidationResult or an Error. fn validate_advanced_structure_from_state( &self, + block_info: &BlockInfo, + network: Network, action: &StateTransitionAction, maybe_identity: Option<&PartialIdentity>, execution_context: &mut StateTransitionExecutionContext, @@ -746,6 +750,8 @@ impl StateTransitionAdvancedStructureValidationV0 for StateTransition { impl StateTransitionStructureKnownInStateValidationV0 for StateTransition { fn validate_advanced_structure_from_state( &self, + block_info: &BlockInfo, + network: Network, action: &StateTransitionAction, maybe_identity: Option<&PartialIdentity>, execution_context: &mut StateTransitionExecutionContext, @@ -753,6 +759,8 @@ impl StateTransitionStructureKnownInStateValidationV0 for StateTransition { ) -> Result, Error> { match self { StateTransition::DocumentsBatch(st) => st.validate_advanced_structure_from_state( + block_info, + network, action, maybe_identity, execution_context, @@ -774,6 +782,8 @@ impl StateTransitionStructureKnownInStateValidationV0 for StateTransition { ) } StateTransition::MasternodeVote(st) => st.validate_advanced_structure_from_state( + block_info, + network, action, maybe_identity, execution_context, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs index bff6309b3d..7dfa5e8eba 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs @@ -1,3 +1,4 @@ +use dashcore_rpc::dashcore::Network; use dpp::block::block_info::BlockInfo; use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; @@ -20,6 +21,8 @@ pub trait DocumentCreateTransitionActionValidation { fn validate_structure( &self, owner_id: Identifier, + block_info: &BlockInfo, + network: Network, platform_version: &PlatformVersion, ) -> Result; @@ -38,6 +41,8 @@ impl DocumentCreateTransitionActionValidation for DocumentCreateTransitionAction fn validate_structure( &self, owner_id: Identifier, + block_info: &BlockInfo, + network: Network, platform_version: &PlatformVersion, ) -> Result { match platform_version @@ -47,7 +52,7 @@ impl DocumentCreateTransitionActionValidation for DocumentCreateTransitionAction .documents_batch_state_transition .document_create_transition_structure_validation { - 0 => self.validate_structure_v0(owner_id, platform_version), + 0 => self.validate_structure_v0(owner_id, block_info, network, platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "DocumentCreateTransitionAction::validate_structure".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs index 1fbfb2096a..1ad014fe17 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs @@ -1,6 +1,10 @@ +use dpp::block::block_info::BlockInfo; use dpp::consensus::basic::document::{DocumentCreationNotAllowedError, InvalidDocumentTypeError}; +use dpp::consensus::state::document::document_contest_not_paid_for_error::DocumentContestNotPaidForError; +use dpp::dashcore::Network; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::data_contract::document_type::methods::DocumentTypeV0Methods; use dpp::data_contract::document_type::restricted_creation::CreationRestrictionMode; use dpp::data_contract::validate_document::DataContractDocumentValidationMethodsV0; use dpp::identifier::Identifier; @@ -14,6 +18,8 @@ pub(super) trait DocumentCreateTransitionActionStructureValidationV0 { fn validate_structure_v0( &self, owner_id: Identifier, + block_info: &BlockInfo, + network: Network, platform_version: &PlatformVersion, ) -> Result; } @@ -21,6 +27,8 @@ impl DocumentCreateTransitionActionStructureValidationV0 for DocumentCreateTrans fn validate_structure_v0( &self, owner_id: Identifier, + block_info: &BlockInfo, + network: Network, platform_version: &PlatformVersion, ) -> Result { let contract_fetch_info = self.base().data_contract_fetch_info(); @@ -36,6 +44,37 @@ impl DocumentCreateTransitionActionStructureValidationV0 for DocumentCreateTrans )); }; + // Don't do the following validation on testnet before epoch 2080 + // As state transitions already happened that would break this validation + if !(network == Network::Testnet && block_info.epoch.index < 2080) { + if document_type + .contested_vote_poll_for_document_properties(self.data(), platform_version)? + .is_some() + { + let expected_amount = platform_version + .fee_version + .vote_resolution_fund_fees + .contested_document_vote_resolution_fund_required_amount; + if let Some((_, paid_amount)) = self.prefunded_voting_balance() { + if expected_amount != *paid_amount { + return Ok(SimpleConsensusValidationResult::new_with_error( + DocumentContestNotPaidForError::new( + self.base().id(), + expected_amount, + *paid_amount, + ) + .into(), + )); + } + } else { + return Ok(SimpleConsensusValidationResult::new_with_error( + DocumentContestNotPaidForError::new(self.base().id(), expected_amount, 0) + .into(), + )); + } + } + } + match document_type.creation_restriction_mode() { CreationRestrictionMode::NoRestrictions => {} CreationRestrictionMode::OwnerOnly => { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs index 6c9f7b93b4..5ac5d1630d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs @@ -1,6 +1,8 @@ use crate::error::Error; +use dpp::block::block_info::BlockInfo; use dpp::consensus::basic::document::InvalidDocumentTransitionIdError; use dpp::consensus::signature::{InvalidSignaturePublicKeySecurityLevelError, SignatureError}; +use dpp::dashcore::Network; use dpp::document::Document; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::identity::PartialIdentity; @@ -36,6 +38,8 @@ pub(in crate::execution::validation::state_transition::state_transitions::docume { fn validate_advanced_structure_from_state_v0( &self, + block_info: &BlockInfo, + network: Network, action: &DocumentsBatchTransitionAction, identity: &PartialIdentity, execution_context: &mut StateTransitionExecutionContext, @@ -46,6 +50,8 @@ pub(in crate::execution::validation::state_transition::state_transitions::docume impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransition { fn validate_advanced_structure_from_state_v0( &self, + block_info: &BlockInfo, + network: Network, action: &DocumentsBatchTransitionAction, identity: &PartialIdentity, execution_context: &mut StateTransitionExecutionContext, @@ -119,7 +125,12 @@ impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransi for transition in action.transitions() { match transition { DocumentTransitionAction::CreateAction(create_action) => { - let result = create_action.validate_structure(identity.id, platform_version)?; + let result = create_action.validate_structure( + identity.id, + block_info, + network, + platform_version, + )?; if !result.is_valid() { let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the create action"), self.owner_id(), self.user_fee_increase()), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index eaa0f93bcc..51c1dd11fa 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -8,6 +8,7 @@ mod state; mod transformer; use dpp::block::block_info::BlockInfo; +use dpp::dashcore::Network; use dpp::identity::PartialIdentity; use dpp::prelude::*; use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; @@ -137,6 +138,8 @@ impl StateTransitionNonceValidationV0 for DocumentsBatchTransition { impl StateTransitionStructureKnownInStateValidationV0 for DocumentsBatchTransition { fn validate_advanced_structure_from_state( &self, + block_info: &BlockInfo, + network: Network, action: &StateTransitionAction, identity: Option<&PartialIdentity>, execution_context: &mut StateTransitionExecutionContext, @@ -162,6 +165,8 @@ impl StateTransitionStructureKnownInStateValidationV0 for DocumentsBatchTransiti ))); }; self.validate_advanced_structure_from_state_v0( + block_info, + network, documents_batch_transition_action, identity, execution_context, @@ -299,6 +304,14 @@ mod tests { use crate::platform_types::state_transitions_processing_result::StateTransitionExecutionResult::PaidConsensusError; use crate::test::helpers::fast_forward_to_block::fast_forward_to_block; use dpp::consensus::state::state_error::StateError; + use dpp::dashcore::Network; + use dpp::dashcore::Network::Testnet; + use dpp::identity::SecurityLevel; + use dpp::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; + use dpp::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransitionV0; + use dpp::state_transition::documents_batch_transition::{DocumentCreateTransition, DocumentsBatchTransitionV0}; + use dpp::state_transition::StateTransition; + use crate::config::PlatformConfig; #[test] fn test_document_creation() { @@ -1111,6 +1124,556 @@ mod tests { assert_eq!(second_contender.vote_tally(), Some(0)); } + #[test] + fn test_document_creation_on_contested_unique_index_should_fail_if_not_paying_for_it() { + let platform_version = PlatformVersion::latest(); + let platform_config = PlatformConfig { + network: Network::Dash, + ..Default::default() + }; + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .with_config(platform_config) + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity_1, signer_1, key_1) = + setup_identity(&mut platform, 958, dash_to_credits!(0.5)); + + let dpns = platform.drive.cache.system_data_contracts.load_dpns(); + let dpns_contract = dpns.clone(); + + let preorder = dpns_contract + .document_type_for_name("preorder") + .expect("expected a profile document type"); + + assert!(!preorder.documents_mutable()); + assert!(preorder.documents_can_be_deleted()); + assert!(!preorder.documents_transferable().is_transferable()); + + let domain = dpns_contract + .document_type_for_name("domain") + .expect("expected a profile document type"); + + assert!(!domain.documents_mutable()); + // Deletion is disabled with data trigger + assert!(domain.documents_can_be_deleted()); + assert!(domain.documents_transferable().is_transferable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut preorder_document_1 = preorder + .random_document_with_identifier_and_entropy( + &mut rng, + identity_1.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + let mut document_1 = domain + .random_document_with_identifier_and_entropy( + &mut rng, + identity_1.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document_1.set("parentDomainName", "dash".into()); + document_1.set("normalizedParentDomainName", "dash".into()); + document_1.set("label", "quantum".into()); + document_1.set("normalizedLabel", "quantum".into()); + document_1.set("records.identity", document_1.owner_id().into()); + document_1.set("subdomainRules.allowSubdomains", false.into()); + + let salt_1: [u8; 32] = rng.gen(); + + let mut salted_domain_buffer_1: Vec = vec![]; + salted_domain_buffer_1.extend(salt_1); + salted_domain_buffer_1.extend("quantum.dash".as_bytes()); + + let salted_domain_hash_1 = hash_double(salted_domain_buffer_1); + + preorder_document_1.set("saltedDomainHash", salted_domain_hash_1.into()); + + document_1.set("preorderSalt", salt_1.into()); + + let documents_batch_create_preorder_transition_1 = + DocumentsBatchTransition::new_document_creation_transition_from_document( + preorder_document_1, + preorder, + entropy.0, + &key_1, + 2, + 0, + &signer_1, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_preorder_transition_1 = + documents_batch_create_preorder_transition_1 + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let owner_id = document_1.owner_id(); + let create_transition: DocumentCreateTransition = DocumentCreateTransitionV0 { + base: DocumentBaseTransition::from_document( + &document_1, + domain, + 3, + platform_version, + None, + ) + .expect("expected a base transition"), + entropy: entropy.0, + data: document_1.clone().properties_consumed(), + prefunded_voting_balance: None, + } + .into(); + let documents_batch_inner_create_transition_1: DocumentsBatchTransition = + DocumentsBatchTransitionV0 { + owner_id, + transitions: vec![create_transition.into()], + user_fee_increase: 0, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + let mut documents_batch_create_transition_1: StateTransition = + documents_batch_inner_create_transition_1.into(); + documents_batch_create_transition_1 + .sign_external(&key_1, &signer_1, Some(|_, _| Ok(SecurityLevel::HIGH))) + .expect("expected to sign"); + + let documents_batch_create_serialized_transition_1 = + documents_batch_create_transition_1 + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_preorder_transition_1.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.valid_count(), 1); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition_1.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [PaidConsensusError( + ConsensusError::StateError(StateError::DocumentContestNotPaidForError(_)), + _ + )] + ); + + // Now let's run a query for the vote totals + + let config = bincode::config::standard() + .with_big_endian() + .with_no_limit(); + + let dash_encoded = bincode::encode_to_vec(Value::Text("dash".to_string()), config) + .expect("expected to encode the word dash"); + + let quantum_encoded = + bincode::encode_to_vec(Value::Text("quantum".to_string()), config) + .expect("expected to encode the word quantum"); + + let index_name = "parentNameAndLabel".to_string(); + + let query_validation_result = platform + .query_contested_resource_vote_state( + GetContestedResourceVoteStateRequest { + version: Some(get_contested_resource_vote_state_request::Version::V0( + GetContestedResourceVoteStateRequestV0 { + contract_id: dpns_contract.id().to_vec(), + document_type_name: domain.name().clone(), + index_name: index_name.clone(), + index_values: vec![dash_encoded.clone(), quantum_encoded.clone()], + result_type: ResultType::DocumentsAndVoteTally as i32, + allow_include_locked_and_abstaining_vote_tally: false, + start_at_identifier_info: None, + count: None, + prove: false, + }, + )), + }, + &platform_state, + platform_version, + ) + .expect("expected to execute query") + .into_data() + .expect("expected query to be valid"); + + let get_contested_resource_vote_state_response::Version::V0( + GetContestedResourceVoteStateResponseV0 { + metadata: _, + result, + }, + ) = query_validation_result.version.expect("expected a version"); + + let Some( + get_contested_resource_vote_state_response_v0::Result::ContestedResourceContenders( + get_contested_resource_vote_state_response_v0::ContestedResourceContenders { + contenders, + abstain_vote_tally, + lock_vote_tally, + finished_vote_info, + }, + ), + ) = result + else { + panic!("expected contenders") + }; + + assert_eq!(abstain_vote_tally, None); + + assert_eq!(lock_vote_tally, None); + + assert_eq!(finished_vote_info, None); + + assert_eq!(contenders.len(), 0); + + let drive_query = DriveDocumentQuery::new_primary_key_single_item_query( + &dpns, + domain, + document_1.id(), + ); + + let documents = platform + .drive + .query_documents(drive_query, None, false, None, None) + .expect("expected to get back documents") + .documents_owned(); + + assert!(documents.get(0).is_none()); + } + + #[test] + fn test_document_creation_on_contested_unique_index_should_not_fail_if_not_paying_for_it_on_testnet_before_epoch_2080( + ) { + let platform_version = PlatformVersion::latest(); + let platform_config = PlatformConfig { + network: Testnet, + ..Default::default() + }; + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .with_config(platform_config) + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity_1, signer_1, key_1) = + setup_identity(&mut platform, 958, dash_to_credits!(0.5)); + + let dpns = platform.drive.cache.system_data_contracts.load_dpns(); + let dpns_contract = dpns.clone(); + + let preorder = dpns_contract + .document_type_for_name("preorder") + .expect("expected a profile document type"); + + assert!(!preorder.documents_mutable()); + assert!(preorder.documents_can_be_deleted()); + assert!(!preorder.documents_transferable().is_transferable()); + + let domain = dpns_contract + .document_type_for_name("domain") + .expect("expected a profile document type"); + + assert!(!domain.documents_mutable()); + // Deletion is disabled with data trigger + assert!(domain.documents_can_be_deleted()); + assert!(domain.documents_transferable().is_transferable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut preorder_document_1 = preorder + .random_document_with_identifier_and_entropy( + &mut rng, + identity_1.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + let mut document_1 = domain + .random_document_with_identifier_and_entropy( + &mut rng, + identity_1.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document_1.set("parentDomainName", "dash".into()); + document_1.set("normalizedParentDomainName", "dash".into()); + document_1.set("label", "quantum".into()); + document_1.set("normalizedLabel", "quantum".into()); + document_1.set("records.identity", document_1.owner_id().into()); + document_1.set("subdomainRules.allowSubdomains", false.into()); + + let salt_1: [u8; 32] = rng.gen(); + + let mut salted_domain_buffer_1: Vec = vec![]; + salted_domain_buffer_1.extend(salt_1); + salted_domain_buffer_1.extend("quantum.dash".as_bytes()); + + let salted_domain_hash_1 = hash_double(salted_domain_buffer_1); + + preorder_document_1.set("saltedDomainHash", salted_domain_hash_1.into()); + + document_1.set("preorderSalt", salt_1.into()); + + let documents_batch_create_preorder_transition_1 = + DocumentsBatchTransition::new_document_creation_transition_from_document( + preorder_document_1, + preorder, + entropy.0, + &key_1, + 2, + 0, + &signer_1, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_preorder_transition_1 = + documents_batch_create_preorder_transition_1 + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let owner_id = document_1.owner_id(); + let create_transition: DocumentCreateTransition = DocumentCreateTransitionV0 { + base: DocumentBaseTransition::from_document( + &document_1, + domain, + 3, + platform_version, + None, + ) + .expect("expected a base transition"), + entropy: entropy.0, + data: document_1.clone().properties_consumed(), + prefunded_voting_balance: None, + } + .into(); + let documents_batch_inner_create_transition_1: DocumentsBatchTransition = + DocumentsBatchTransitionV0 { + owner_id, + transitions: vec![create_transition.into()], + user_fee_increase: 0, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + let mut documents_batch_create_transition_1: StateTransition = + documents_batch_inner_create_transition_1.into(); + documents_batch_create_transition_1 + .sign_external(&key_1, &signer_1, Some(|_, _| Ok(SecurityLevel::HIGH))) + .expect("expected to sign"); + + let documents_batch_create_serialized_transition_1 = + documents_batch_create_transition_1 + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_preorder_transition_1.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.valid_count(), 1); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition_1.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(..)] + ); + + // Now let's run a query for the vote totals + + let config = bincode::config::standard() + .with_big_endian() + .with_no_limit(); + + let dash_encoded = bincode::encode_to_vec(Value::Text("dash".to_string()), config) + .expect("expected to encode the word dash"); + + let quantum_encoded = + bincode::encode_to_vec(Value::Text("quantum".to_string()), config) + .expect("expected to encode the word quantum"); + + let index_name = "parentNameAndLabel".to_string(); + + let query_validation_result = platform + .query_contested_resource_vote_state( + GetContestedResourceVoteStateRequest { + version: Some(get_contested_resource_vote_state_request::Version::V0( + GetContestedResourceVoteStateRequestV0 { + contract_id: dpns_contract.id().to_vec(), + document_type_name: domain.name().clone(), + index_name: index_name.clone(), + index_values: vec![dash_encoded.clone(), quantum_encoded.clone()], + result_type: ResultType::DocumentsAndVoteTally as i32, + allow_include_locked_and_abstaining_vote_tally: false, + start_at_identifier_info: None, + count: None, + prove: false, + }, + )), + }, + &platform_state, + platform_version, + ) + .expect("expected to execute query") + .into_data() + .expect("expected query to be valid"); + + let get_contested_resource_vote_state_response::Version::V0( + GetContestedResourceVoteStateResponseV0 { + metadata: _, + result, + }, + ) = query_validation_result.version.expect("expected a version"); + + let Some( + get_contested_resource_vote_state_response_v0::Result::ContestedResourceContenders( + get_contested_resource_vote_state_response_v0::ContestedResourceContenders { + contenders, + abstain_vote_tally, + lock_vote_tally, + finished_vote_info, + }, + ), + ) = result + else { + panic!("expected contenders") + }; + + assert_eq!(abstain_vote_tally, None); + + assert_eq!(lock_vote_tally, None); + + assert_eq!(finished_vote_info, None); + + assert_eq!(contenders.len(), 0); // no contenders should have been created the document should just exist + + let drive_query = DriveDocumentQuery::new_primary_key_single_item_query( + &dpns, + domain, + document_1.id(), + ); + + let documents = platform + .drive + .query_documents(drive_query, None, false, None, None) + .expect("expected to get back documents") + .documents_owned(); + + assert!(documents.get(0).is_some()); + } + #[test] fn test_document_creation_on_contested_unique_index_should_fail_if_reusing_entropy() { let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/advanced_structure/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/advanced_structure/mod.rs index b44732c3d0..40cc8ef3c5 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/advanced_structure/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/advanced_structure/mod.rs @@ -3,6 +3,8 @@ use crate::error::Error; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::execution::validation::state_transition::masternode_vote::advanced_structure::v0::MasternodeVoteStateTransitionAdvancedStructureValidationV0; use crate::execution::validation::state_transition::processor::v0::StateTransitionStructureKnownInStateValidationV0; +use dpp::block::block_info::BlockInfo; +use dpp::dashcore::Network; use dpp::identity::PartialIdentity; use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::masternode_vote_transition::MasternodeVoteTransition; @@ -14,6 +16,8 @@ pub(crate) mod v0; impl StateTransitionStructureKnownInStateValidationV0 for MasternodeVoteTransition { fn validate_advanced_structure_from_state( &self, + _block_info: &BlockInfo, + _network: Network, action: &StateTransitionAction, identity: Option<&PartialIdentity>, execution_context: &mut StateTransitionExecutionContext, diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index ba828e674e..627b65a267 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -70,6 +70,7 @@ use dpp::consensus::state::document::document_contest_currently_locked_error::Do use dpp::consensus::state::document::document_contest_document_with_same_id_already_present_error::DocumentContestDocumentWithSameIdAlreadyPresentError; use dpp::consensus::state::document::document_contest_identity_already_contestant::DocumentContestIdentityAlreadyContestantError; use dpp::consensus::state::document::document_contest_not_joinable_error::DocumentContestNotJoinableError; +use dpp::consensus::state::document::document_contest_not_paid_for_error::DocumentContestNotPaidForError; use dpp::consensus::state::document::document_incorrect_purchase_price_error::DocumentIncorrectPurchasePriceError; use dpp::consensus::state::document::document_not_for_sale_error::DocumentNotForSaleError; use dpp::consensus::state::identity::identity_public_key_already_exists_for_unique_contract_bounds_error::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError; @@ -304,6 +305,9 @@ pub fn from_state_error(state_error: &StateError) -> JsValue { StateError::NoTransferKeyForCoreWithdrawalAvailableError(e) => { generic_consensus_error!(NoTransferKeyForCoreWithdrawalAvailableError, e).into() } + StateError::DocumentContestNotPaidForError(e) => { + generic_consensus_error!(DocumentContestNotPaidForError, e).into() + } } } From b6bb2b59d6d60495454e9bc4a96ed0a0ee978ffa Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 12 Oct 2024 19:24:23 +0700 Subject: [PATCH 63/90] refactor: minor fixes and extra comments --- .../document_create_transition_action/structure_v0/mod.rs | 3 +++ .../state_transitions/documents_batch/mod.rs | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs index 1ad014fe17..7ae98cf477 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs @@ -46,7 +46,10 @@ impl DocumentCreateTransitionActionStructureValidationV0 for DocumentCreateTrans // Don't do the following validation on testnet before epoch 2080 // As state transitions already happened that would break this validation + // We want to keep both if-s for better readability + #[allow(clippy::collapsible_if)] if !(network == Network::Testnet && block_info.epoch.index < 2080) { + // Only for contested documents if document_type .contested_vote_poll_for_document_properties(self.data(), platform_version)? .is_some() diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index 51c1dd11fa..1cb7c26a62 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -1240,6 +1240,7 @@ mod tests { .expect("expected a base transition"), entropy: entropy.0, data: document_1.clone().properties_consumed(), + // Sending 0 balance that should not be valid prefunded_voting_balance: None, } .into(); @@ -1397,7 +1398,7 @@ mod tests { .expect("expected to get back documents") .documents_owned(); - assert!(documents.get(0).is_none()); + assert!(documents.first().is_none()); } #[test] @@ -1671,7 +1672,7 @@ mod tests { .expect("expected to get back documents") .documents_owned(); - assert!(documents.get(0).is_some()); + assert!(documents.first().is_some()); } #[test] From af542f7abe46cfcc167eb2d9f40ce8019e98b9f6 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 12 Oct 2024 21:48:32 +0700 Subject: [PATCH 64/90] chore(release): update changelog and version to 1.4.1 (#2239) --- CHANGELOG.md | 22 ++++++++ Cargo.lock | 50 +++++++++---------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/check-features/Cargo.toml | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 44 files changed, 89 insertions(+), 67 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 39f0b2fe88..f90a4979b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,25 @@ +### [1.4.1](https://github.com/dashpay/platform/compare/v1.4.0...v1.4.1) (2024-10-12) + + +### ⚠ BREAKING CHANGES + +* **sdk:** improve mock context provider async processing (#2232) + +### Bug Fixes + +* **sdk:** testnet chain sync failed ([#2236](https://github.com/dashpay/platform/issues/2236)) + + +### Miscellaneous Chores + +* add some extra unit tests + + +### Code Refactoring + +* minor fixes and extra comments +* **sdk:** improve mock context provider async processing ([#2232](https://github.com/dashpay/platform/issues/2232)) + ## [1.4.0](https://github.com/dashpay/platform/compare/v1.4.0-dev.8...v1.4.0) (2024-10-10) diff --git a/Cargo.lock b/Cargo.lock index 24cbb1a6e9..8ee9c7c2ac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -675,7 +675,7 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "check-features" -version = "1.4.0" +version = "1.4.1" dependencies = [ "toml", ] @@ -1044,7 +1044,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.4.0" +version = "1.4.1" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1060,7 +1060,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.4.0" +version = "1.4.1" dependencies = [ "dapi-grpc", "heck 0.5.0", @@ -1105,7 +1105,7 @@ dependencies = [ [[package]] name = "dash-sdk" -version = "1.4.0" +version = "1.4.1" dependencies = [ "arc-swap", "async-trait", @@ -1205,7 +1205,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.4.0" +version = "1.4.1" dependencies = [ "platform-value", "platform-version", @@ -1215,7 +1215,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.4.0" +version = "1.4.1" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1346,7 +1346,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.4.0" +version = "1.4.1" dependencies = [ "platform-value", "platform-version", @@ -1356,7 +1356,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.4.0" +version = "1.4.1" dependencies = [ "anyhow", "assert_matches", @@ -1408,7 +1408,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "arc-swap", "assert_matches", @@ -1449,7 +1449,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.4.0" +version = "1.4.1" dependencies = [ "arc-swap", "assert_matches", @@ -1504,7 +1504,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.4.0" +version = "1.4.1" dependencies = [ "bincode", "dapi-grpc", @@ -1725,7 +1725,7 @@ checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "feature-flags-contract" -version = "1.4.0" +version = "1.4.1" dependencies = [ "platform-value", "platform-version", @@ -2575,7 +2575,7 @@ dependencies = [ [[package]] name = "json-schema-compatibility-validator" -version = "1.4.0" +version = "1.4.1" dependencies = [ "assert_matches", "json-patch", @@ -2733,7 +2733,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.4.0" +version = "1.4.1" dependencies = [ "platform-value", "platform-version", @@ -3313,7 +3313,7 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "platform-serialization" -version = "1.4.0" +version = "1.4.1" dependencies = [ "bincode", "platform-version", @@ -3321,7 +3321,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.4.0" +version = "1.4.1" dependencies = [ "proc-macro2", "quote", @@ -3331,7 +3331,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.4.0" +version = "1.4.1" dependencies = [ "base64 0.22.1", "bincode", @@ -3352,7 +3352,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.4.0" +version = "1.4.1" dependencies = [ "quote", "syn 2.0.75", @@ -3360,7 +3360,7 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.4.0" +version = "1.4.1" dependencies = [ "bincode", "grovedb-version", @@ -3371,7 +3371,7 @@ dependencies = [ [[package]] name = "platform-versioning" -version = "1.4.0" +version = "1.4.1" dependencies = [ "proc-macro2", "quote", @@ -3857,7 +3857,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.4.0" +version = "1.4.1" dependencies = [ "backon", "chrono", @@ -4324,7 +4324,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.4.0" +version = "1.4.1" dependencies = [ "base64 0.22.1", "bincode", @@ -4390,7 +4390,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.4.0" +version = "1.4.1" dependencies = [ "bincode", "dpp", @@ -5309,7 +5309,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.4.0" +version = "1.4.1" dependencies = [ "anyhow", "async-trait", @@ -5611,7 +5611,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.4.0" +version = "1.4.1" dependencies = [ "num_enum 0.5.11", "platform-value", diff --git a/package.json b/package.json index dfe0758011..c1a993ced1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.4.0", + "version": "1.4.1", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index 0b4a66e822..1e6befe213 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.4.0", + "version": "1.4.1", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/check-features/Cargo.toml b/packages/check-features/Cargo.toml index 2e2ca33b22..de43293845 100644 --- a/packages/check-features/Cargo.toml +++ b/packages/check-features/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "check-features" -version = "1.4.0" +version = "1.4.1" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index a25344622c..14aa3139be 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.4.0" +version = "1.4.1" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index bbfe77ac10..2fd2bf508a 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.4.0", + "version": "1.4.1", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index fd188d291f..a6f52bdc50 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.4.0", + "version": "1.4.1", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index dca5db69ca..de71743fa0 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "2.4.0", + "version": "2.4.1", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index 42e809b778..6620a2fc3f 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.4.0", + "version": "1.4.1", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index f3588078e4..35a591d48c 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.4.0" +version = "1.4.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index 61fb25e51c..74bdc33f77 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.4.0", + "version": "1.4.1", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index 8aa3850d0c..21b309f881 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.4.0" +version = "1.4.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 76a32b11ff..0841354e40 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.4.0" +version = "1.4.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index 6c755ddadb..98701984c1 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.4.0", + "version": "1.4.1", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index 32a924ac7f..0a52c83f22 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.4.0" +version = "1.4.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index e5ca99e0bf..2c46c68e82 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.4.0", + "version": "1.4.1", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index bcb6237521..a3d72af982 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.4.0", + "version": "1.4.1", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index 8921d35c49..5f232ba903 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.4.0", + "version": "4.4.1", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index f03173e570..ee51714414 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.4.0", + "version": "1.4.1", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index cec3b5c509..e7b8c4a298 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.4.0" +version = "1.4.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index 86e84d4acd..8682f46915 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.4.0", + "version": "1.4.1", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index 21214b00e1..8655c8deac 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.4.0", + "version": "1.4.1", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index 7b63e47f79..f3682130fc 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.4.0" +version = "1.4.1" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index 73baa82706..8df0883193 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.4.0" +version = "1.4.1" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 202fc344ca..4d7d1c79d9 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.4.0" +version = "1.4.1" edition = "2021" rust-version.workspace = true authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 2e1f9fc5c8..dfcd0e0e25 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.4.0" +version = "1.4.1" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index e5cd005a7c..baee7efa93 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.4.0" +version = "1.4.1" edition = "2021" rust-version.workspace = true diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 4ae5b5bcdb..ef9f1c4570 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.4.0" +version = "1.4.1" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-json-schema-compatibility-validator/Cargo.toml b/packages/rs-json-schema-compatibility-validator/Cargo.toml index 24703a2da8..1bf215ed99 100644 --- a/packages/rs-json-schema-compatibility-validator/Cargo.toml +++ b/packages/rs-json-schema-compatibility-validator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "json-schema-compatibility-validator" -version = "1.4.0" +version = "1.4.1" edition = "2021" rust-version.workspace = true authors = ["Ivan Shumkov "] diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index 86f21057a6..7f8296f4b4 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.4.0" +version = "1.4.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index 0faa783e88..b6c39cd79d 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.4.0" +version = "1.4.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index 99ebdaa250..ad17e9d567 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.4.0" +version = "1.4.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index b24bd08431..15a35ffb22 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.4.0" +version = "1.4.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 8f130491d7..4113302c47 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Versioning library for Platform" -version = "1.4.0" +version = "1.4.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index bd138b068d..69916cbdee 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.4.0" +version = "1.4.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 788bd8a593..dcce9de6fb 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dash-sdk" -version = "1.4.0" +version = "1.4.1" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index 24d6affaac..aaa449c293 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.4.0" +version = "1.4.1" edition = "2021" rust-version.workspace = true diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index 75a040a7a9..437d73457c 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.4.0" +version = "1.4.1" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 8ce733cc3b..9536e860ec 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.4.0", + "version": "8.4.1", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index 45ab37a3a2..e9bc972494 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.4.0" +version = "1.4.1" edition = "2021" rust-version.workspace = true authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index fcba8950bc..7821b424df 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.4.0", + "version": "1.4.1", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index 2a08d84753..3f776fd03c 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.4.0" +version = "1.4.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index 3b4f2b14ee..89cfc8ebd1 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.4.0", + "version": "1.4.1", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From 908d0b31ac4e93109957f162dc044b7541c77827 Mon Sep 17 00:00:00 2001 From: lklimek <842586+lklimek@users.noreply.github.com> Date: Wed, 16 Oct 2024 13:08:36 +0200 Subject: [PATCH 65/90] fix(sdk)!: wrong order of objects returned by Drive (#2207) Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- Cargo.lock | 45 +++--- packages/rs-drive-proof-verifier/Cargo.toml | 2 + packages/rs-drive-proof-verifier/src/proof.rs | 138 ++++++++++++------ .../rs-drive-proof-verifier/src/provider.rs | 2 +- packages/rs-drive-proof-verifier/src/types.rs | 47 +++--- .../rs-drive-proof-verifier/src/unproved.rs | 2 +- packages/rs-sdk/src/mock/requests.rs | 37 ++++- packages/rs-sdk/src/platform/fetch_many.rs | 3 +- packages/rs-sdk/tests/fetch/data_contract.rs | 7 +- packages/rs-sdk/tests/fetch/document.rs | 3 +- packages/rs-sdk/tests/fetch/epoch.rs | 12 +- .../rs-sdk/tests/fetch/mock_fetch_many.rs | 7 +- 12 files changed, 200 insertions(+), 105 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8ee9c7c2ac..518b077b81 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1376,7 +1376,7 @@ dependencies = [ "env_logger 0.11.5", "getrandom", "hex", - "indexmap 2.4.0", + "indexmap 2.6.0", "integer-encoding", "itertools 0.13.0", "json-schema-compatibility-validator", @@ -1429,7 +1429,7 @@ dependencies = [ "grovedb-storage", "grovedb-version", "hex", - "indexmap 2.4.0", + "indexmap 2.6.0", "integer-encoding", "intmap", "itertools 0.13.0", @@ -1472,7 +1472,7 @@ dependencies = [ "envy", "file-rotate", "hex", - "indexmap 2.4.0", + "indexmap 2.6.0", "integer-encoding", "itertools 0.13.0", "lazy_static", @@ -1512,6 +1512,7 @@ dependencies = [ "dpp", "drive", "hex", + "indexmap 2.6.0", "platform-serialization", "platform-serialization-derive", "serde", @@ -1988,7 +1989,7 @@ dependencies = [ "grovedbg-types", "hex", "hex-literal", - "indexmap 2.4.0", + "indexmap 2.6.0", "integer-encoding", "intmap", "itertools 0.12.1", @@ -2045,7 +2046,7 @@ dependencies = [ "grovedb-version", "grovedb-visualize", "hex", - "indexmap 2.4.0", + "indexmap 2.6.0", "integer-encoding", "num_cpus", "rand", @@ -2121,7 +2122,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.4.0", + "indexmap 2.6.0", "slab", "tokio", "tokio-util", @@ -2163,6 +2164,12 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" + [[package]] name = "hdrhistogram" version = "7.5.4" @@ -2446,12 +2453,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.4.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.0", "serde", ] @@ -2782,7 +2789,7 @@ dependencies = [ "http-body-util", "hyper", "hyper-util", - "indexmap 2.4.0", + "indexmap 2.6.0", "ipnet", "metrics", "metrics-util", @@ -3260,7 +3267,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.4.0", + "indexmap 2.6.0", ] [[package]] @@ -3338,7 +3345,7 @@ dependencies = [ "bs58", "ciborium 0.2.0", "hex", - "indexmap 2.4.0", + "indexmap 2.6.0", "lazy_static", "platform-serialization", "platform-version", @@ -4148,7 +4155,7 @@ version = "1.0.126" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3b863381a05ffefbc82571a2d893edf47b27fb0ebedbf582c39640e51abebef" dependencies = [ - "indexmap 2.4.0", + "indexmap 2.6.0", "itoa", "memchr", "ryu", @@ -4223,7 +4230,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.4.0", + "indexmap 2.6.0", "serde", "serde_derive", "serde_json", @@ -4861,7 +4868,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.4.0", + "indexmap 2.6.0", "toml_datetime", "winnow 0.5.40", ] @@ -4872,7 +4879,7 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.4.0", + "indexmap 2.6.0", "toml_datetime", "winnow 0.5.40", ] @@ -4883,7 +4890,7 @@ version = "0.22.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" dependencies = [ - "indexmap 2.4.0", + "indexmap 2.6.0", "serde", "serde_spanned", "toml_datetime", @@ -4944,7 +4951,7 @@ source = "git+https://github.com/QuantumExplorer/tower?branch=fix/indexMap2OnV04 dependencies = [ "futures-core", "futures-util", - "indexmap 2.4.0", + "indexmap 2.6.0", "pin-project", "pin-project-lite", "rand", @@ -5710,7 +5717,7 @@ dependencies = [ "crossbeam-utils", "displaydoc", "flate2", - "indexmap 2.4.0", + "indexmap 2.6.0", "memchr", "thiserror", "zopfli", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index baee7efa93..f46f844629 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -15,6 +15,7 @@ mocks = [ "dep:platform-serialization-derive", "dep:platform-serialization", "dpp/document-serde-conversion", + "indexmap/serde", ] [dependencies] @@ -42,4 +43,5 @@ serde_json = { version = "1.0.103", features = [ "preserve_order", ], optional = true } hex = { version = "0.4.3" } +indexmap = { version = "2.6.0" } derive_more = { version = "1.0", features = ["from"] } diff --git a/packages/rs-drive-proof-verifier/src/proof.rs b/packages/rs-drive-proof-verifier/src/proof.rs index 0d7b23e05d..3685df1779 100644 --- a/packages/rs-drive-proof-verifier/src/proof.rs +++ b/packages/rs-drive-proof-verifier/src/proof.rs @@ -43,6 +43,7 @@ use drive::query::vote_poll_contestant_votes_query::ContestedDocumentVotePollVot use drive::query::vote_poll_vote_state_query::ContestedDocumentVotePollDriveQuery; use drive::query::vote_polls_by_document_type_query::VotePollsByDocumentTypeQuery; use drive::query::{DriveDocumentQuery, VotePollsByEndDateDriveQuery}; +use indexmap::IndexMap; use std::array::TryFromSliceError; use std::collections::BTreeMap; use std::num::TryFromIntError; @@ -831,25 +832,22 @@ impl FromProof for DataContracts { })?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; - - let maybe_contracts: Option>> = - if !contracts.is_empty() { - let contracts: DataContracts = contracts - .into_iter() - .try_fold(DataContracts::new(), |mut acc, (k, v)| { - Identifier::from_bytes(&k).map(|id| { - acc.insert(id, v); - acc - }) - }) - .map_err(|e| Error::ResultEncodingError { + let contracts = contracts + .into_iter() + .map(|(k, v)| { + Identifier::from_bytes(&k).map(|id| (id, v)).map_err(|e| { + Error::ResultEncodingError { error: e.to_string(), - })?; + } + }) + }) + .collect::>()?; - Some(contracts) - } else { - None - }; + let maybe_contracts = if contracts.is_empty() { + None + } else { + Some(contracts) + }; Ok((maybe_contracts, mtd.clone(), proof.clone())) } @@ -904,7 +902,11 @@ impl FromProof for DataContractHistory verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; - Ok((maybe_history, mtd.clone(), proof.clone())) + Ok(( + maybe_history.map(IndexMap::from_iter), + mtd.clone(), + proof.clone(), + )) } } @@ -987,13 +989,13 @@ impl FromProof for ExtendedEpochInfo { provider, )?; - if let Some(mut e) = epochs.0 { + if let Some(e) = epochs.0 { if e.len() != 1 { return Err(Error::RequestError { error: format!("expected 1 epoch, got {}", e.len()), }); } - let epoch = e.pop_first().and_then(|v| v.1); + let epoch = e.into_iter().next().and_then(|v| v.1); Ok((epoch, epochs.1, epochs.2)) } else { Ok((None, epochs.1, epochs.2)) @@ -1056,7 +1058,7 @@ impl FromProof for ExtendedEpochInfos { (info.index, Some(v)) }) - .collect::>>(); + .collect::(); verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -1203,10 +1205,11 @@ impl FromProof for Elements { let (root_hash, objects) = Drive::verify_elements(&proof.grovedb_proof, path, keys, platform_version)?; + let elements: Elements = Elements::from_iter(objects); verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; - Ok((objects.into_option(), mtd.clone(), proof.clone())) + Ok((elements.into_option(), mtd.clone(), proof.clone())) } } @@ -1378,8 +1381,7 @@ impl FromProof for ContestedResources { verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; - let resources: ContestedResources = - items.into_iter().map(|v| ContestedResource(v)).collect(); + let resources: ContestedResources = items.into_iter().map(ContestedResource).collect(); Ok((resources.into_option(), mtd.clone(), proof.clone())) } @@ -1638,23 +1640,25 @@ impl FromProof for Vote { } }; - let (mut maybe_votes, mtd, proof) = - ResourceVotesByIdentity::maybe_from_proof_with_metadata( - request, - response, - network, - platform_version, - provider, - )?; + let (maybe_votes, mtd, proof) = ResourceVotesByIdentity::maybe_from_proof_with_metadata( + request, + response, + network, + platform_version, + provider, + )?; - let (id, vote) = match maybe_votes.as_mut() { + let (id, vote) = match maybe_votes { Some(v) if v.len() > 1 => { return Err(Error::ResponseDecodeError { error: format!("expected 1 vote, got {}", v.len()), }) } Some(v) if v.is_empty() => return Ok((None, mtd, proof)), - Some(v) => v.pop_first().expect("is_empty() must detect empty map"), + Some(v) => v + .into_iter() + .next() + .expect("is_empty() must detect empty map"), None => return Ok((None, mtd, proof)), }; @@ -1849,6 +1853,8 @@ fn u32_to_u16_opt(i: u32) -> Result, Error> { pub trait Length { /// Return number of non-None elements in the data structure fn count_some(&self) -> usize; + /// Return number of all elements in the data structure, including None + fn count(&self) -> usize; } impl Length for Option { @@ -1858,24 +1864,52 @@ impl Length for Option { Some(i) => i.count_some(), } } + fn count(&self) -> usize { + match self { + None => 0, + Some(i) => i.count(), + } + } } impl Length for Vec> { fn count_some(&self) -> usize { self.iter().filter(|v| v.is_some()).count() } + + fn count(&self) -> usize { + self.len() + } } impl Length for Vec<(K, Option)> { fn count_some(&self) -> usize { self.iter().filter(|(_, v)| v.is_some()).count() } + + fn count(&self) -> usize { + self.len() + } } impl Length for BTreeMap> { fn count_some(&self) -> usize { self.values().filter(|v| v.is_some()).count() } + + fn count(&self) -> usize { + self.len() + } +} + +impl Length for IndexMap> { + fn count_some(&self) -> usize { + self.values().filter(|v| v.is_some()).count() + } + + fn count(&self) -> usize { + self.len() + } } /// Implement Length trait for a type @@ -1885,16 +1919,24 @@ impl Length for BTreeMap> { /// * `$object`: The type for which to implement Length trait /// * `$len`: A closure that returns the length of the object; if ommitted, defaults to 1 macro_rules! define_length { - ($object:ty,$len:expr) => { + ($object:ty,$some:expr,$counter:expr) => { impl Length for $object { fn count_some(&self) -> usize { #[allow(clippy::redundant_closure_call)] - $len(self) + $some(self) + } + + fn count(&self) -> usize { + #[allow(clippy::redundant_closure_call)] + $counter(self) } } }; + ($object:ty,$some:expr) => { + define_length!($object, $some, $some); + }; ($object:ty) => { - define_length!($object, |_| 1); + define_length!($object, |_| 1, |_| 1); }; } @@ -1904,22 +1946,30 @@ define_length!(Document); define_length!(Identity); define_length!(IdentityBalance); define_length!(IdentityBalanceAndRevision); -define_length!(IdentitiesContractKeys, |x: &IdentitiesContractKeys| x - .values() - .map(|v| v.count_some()) - .sum()); +define_length!( + IdentitiesContractKeys, + |x: &IdentitiesContractKeys| x.values().map(|v| v.count_some()).sum(), + |x: &IdentitiesContractKeys| x.len() +); define_length!(ContestedResources, |x: &ContestedResources| x.0.len()); define_length!(Contenders, |x: &Contenders| x.contenders.len()); define_length!(Voters, |x: &Voters| x.0.len()); define_length!( VotePollsGroupedByTimestamp, - |x: &VotePollsGroupedByTimestamp| x.0.iter().map(|v| v.1.len()).sum() + |x: &VotePollsGroupedByTimestamp| x.0.iter().map(|v| v.1.len()).sum(), + |x: &VotePollsGroupedByTimestamp| x.0.len() ); + +/// Convert a type into an Option trait IntoOption where Self: Sized, { - /// For zero-length data structures, return None, otherwise return Some(self) + /// For zero-length data structures, return None, otherwise return Some(self). + /// + /// In case of a zero-length data structure, the function returns None. + /// Otherwise, it returns Some(self), even it all values are None. This is to ensure that proof of absence + /// preserves the keys that are not present in the data structure. fn into_option(self) -> Option; } @@ -1928,7 +1978,7 @@ impl IntoOption for L { where Self: Sized, { - if self.count_some() == 0 { + if self.count() == 0 { None } else { Some(self) diff --git a/packages/rs-drive-proof-verifier/src/provider.rs b/packages/rs-drive-proof-verifier/src/provider.rs index ecead85994..e7eafd2e45 100644 --- a/packages/rs-drive-proof-verifier/src/provider.rs +++ b/packages/rs-drive-proof-verifier/src/provider.rs @@ -47,7 +47,7 @@ pub trait ContextProvider: Send + Sync { /// # Returns /// /// * `Ok(Option>)`: On success, returns the data contract if it exists, or `None` if it does not. - /// We use Arc to avoid copying the data contract. + /// We use Arc to avoid copying the data contract. /// * `Err(Error)`: On failure, returns an error indicating why the operation failed. fn get_data_contract( &self, diff --git a/packages/rs-drive-proof-verifier/src/types.rs b/packages/rs-drive-proof-verifier/src/types.rs index a40fefb98c..40fa528a54 100644 --- a/packages/rs-drive-proof-verifier/src/types.rs +++ b/packages/rs-drive-proof-verifier/src/types.rs @@ -31,6 +31,8 @@ use dpp::{ }; use drive::grovedb::query_result_type::Path; use drive::grovedb::Element; +// IndexMap is exposed to the public API +pub use indexmap::IndexMap; use std::collections::{BTreeMap, BTreeSet}; #[cfg(feature = "mocks")] @@ -49,36 +51,46 @@ pub use evonode_status::*; /// from a server using [`FetchMany`](dash_sdk::platform::FetchMany) or parsing a proof that contains multiple objects /// using [`FromProof`](crate::FromProof). /// -/// Each key in the `RetrievedObjects` corresponds to an object of generic type `O`. -/// If an object is found for a given key, the value is `Some(object)`. -/// If no object is found for a given key, the value is `None`. +/// Each key `K` in the `RetrievedObjects` corresponds to zero or one object of generic type `O`: +/// * if an object is found for a given key, the value is `Some(object)`, +/// * if no object is found for a given key, the value is `None`; this can be interpreted as a proof of absence. +/// +/// This data structure preserves order of objects insertion. However, actual order of objects depends on the order of +/// objects returned by Dash Drive, which is not always guaranteed to be correct. +/// You can sort the objects by key if you need a specific order; see [`IndexMap::sort_keys`] and similar methods. +/// +/// `RetrievedObjects` is a wrapper around the [`IndexMap`] type. /// /// # Generic Type Parameters /// /// * `K`: The type of the keys in the map. /// * `O`: The type of the objects in the map. -pub type RetrievedObjects = BTreeMap>; +pub type RetrievedObjects = IndexMap>; -/// A data structure that holds a set of objects of a generic type `O`, indexed by a key of type `K`. +/// A data structure that holds a set of values of a generic type `I`, indexed by a key of type `K`. /// /// This type is typically returned by functions that operate on multiple objects, such as fetching multiple objects /// from a server using [`FetchMany`](dash_sdk::platform::FetchMany) or parsing a proof that contains multiple objects /// using [`FromProof`](crate::FromProof). /// -/// Each key in the `RetrievedObjects` corresponds to an object of generic type `O`. -/// If a value is found for a given key, the value is `value`. -/// If no value is found for a given key, the value is `0`. +/// Each key in this data structure corresponds to an existing value of generic type `I`. It differs from +/// [`RetrievedObjects`] in that it does not contain `Option`, but only `I`, so it cannot be interpreted as a +/// proof of absence. +/// +/// This data structure preserves the order of object insertion. However, the actual order of objects depends on the +/// order of objects returned by Dash Drive, which is not always guaranteed to be correct. +/// You can sort the objects by key if you need a specific order; see [`IndexMap::sort_keys`] and similar methods. /// /// # Generic Type Parameters /// /// * `K`: The type of the keys in the map. -/// * `I`: The type of the integer in the map. -pub type RetrievedIntegerValue = BTreeMap; +/// * `I`: The type of the integer values in the map. +pub type RetrievedValues = IndexMap; /// History of a data contract. /// /// Contains a map of data contract revisions to data contracts. -pub type DataContractHistory = BTreeMap; +pub type DataContractHistory = RetrievedValues; /// Multiple data contracts. /// /// Mapping between data contract IDs and data contracts. @@ -240,10 +252,9 @@ impl ContestedResource { ) } } - -impl Into for ContestedResource { - fn into(self) -> Value { - self.0 +impl From for Value { + fn from(resource: ContestedResource) -> Self { + resource.0 } } @@ -561,7 +572,7 @@ pub type MasternodeProtocolVotes = RetrievedObjects); +pub struct ProposerBlockCounts(pub RetrievedValues); impl FromIterator<(ProTxHash, Option)> for ProposerBlockCounts { fn from_iter)>>( @@ -575,7 +586,7 @@ impl FromIterator<(ProTxHash, Option)> for ProposerBl let identifier = Identifier::from(pro_tx_hash.to_byte_array()); // Adjust this conversion logic as needed (identifier, block_count) }) - .collect::>(); + .collect::>(); ProposerBlockCounts(map) } @@ -593,7 +604,7 @@ impl FromIterator<(ProTxHash, Option)> for ProposerBlock let identifier = Identifier::from(pro_tx_hash.to_byte_array()); // Adjust this conversion logic as needed (identifier, block_count) }) - .collect::>(); + .collect::>(); ProposerBlockCounts(map) } diff --git a/packages/rs-drive-proof-verifier/src/unproved.rs b/packages/rs-drive-proof-verifier/src/unproved.rs index bc2f2e9e51..cc7c63c83e 100644 --- a/packages/rs-drive-proof-verifier/src/unproved.rs +++ b/packages/rs-drive-proof-verifier/src/unproved.rs @@ -218,7 +218,7 @@ impl FromUnproved for CurrentQuorumsInfo let mut quorum_hash = [0u8; 32]; quorum_hash.copy_from_slice(&vs.quorum_hash); - // Parse ValidatorV0 members into a BTreeMap + // Parse ValidatorV0 members let members = vs .members .into_iter() diff --git a/packages/rs-sdk/src/mock/requests.rs b/packages/rs-sdk/src/mock/requests.rs index 0b2e43692f..582c3628a0 100644 --- a/packages/rs-sdk/src/mock/requests.rs +++ b/packages/rs-sdk/src/mock/requests.rs @@ -3,7 +3,7 @@ use dpp::bincode::config::standard; use dpp::{ bincode, block::extended_epoch_info::ExtendedEpochInfo, - dashcore::{hashes::Hash, ProTxHash}, + dashcore::{hashes::Hash as CoreHash, ProTxHash}, document::{serialization_traits::DocumentCborMethodsV0, Document}, identifier::Identifier, identity::IdentityPublicKey, @@ -18,11 +18,11 @@ use dpp::{ use drive::grovedb::Element; use drive_proof_verifier::types::{ Contenders, ContestedResources, CurrentQuorumsInfo, ElementFetchRequestItem, EvoNodeStatus, - IdentityBalanceAndRevision, MasternodeProtocolVote, PrefundedSpecializedBalance, - ProposerBlockCounts, RetrievedIntegerValue, TotalCreditsInPlatform, - VotePollsGroupedByTimestamp, Voters, + IdentityBalanceAndRevision, IndexMap, MasternodeProtocolVote, PrefundedSpecializedBalance, + ProposerBlockCounts, RetrievedValues, TotalCreditsInPlatform, VotePollsGroupedByTimestamp, + Voters, }; -use std::collections::BTreeMap; +use std::{collections::BTreeMap, hash::Hash}; static BINCODE_CONFIG: bincode::config::Configuration = bincode::config::standard(); @@ -115,6 +115,29 @@ impl MockResponse for BTreeMap { } } +impl MockResponse for IndexMap { + fn mock_deserialize(sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self + where + Self: Sized, + { + let (data, _): (IndexMap, Vec>, _) = + bincode::serde::decode_from_slice(buf, BINCODE_CONFIG).expect("decode IndexMap"); + + data.into_iter() + .map(|(k, v)| (K::mock_deserialize(sdk, &k), V::mock_deserialize(sdk, &v))) + .collect() + } + + fn mock_serialize(&self, sdk: &MockDashPlatformSdk) -> Vec { + let data: IndexMap, Vec> = self + .iter() + .map(|(k, v)| (k.mock_serialize(sdk), v.mock_serialize(sdk))) + .collect(); + + bincode::serde::encode_to_vec(data, BINCODE_CONFIG).expect("encode IndexMap") + } +} + /// Serialize and deserialize the object for mocking using bincode. /// /// Use this macro when the object implements platform serialization. @@ -232,7 +255,7 @@ impl MockResponse for ProTxHash { { let data = platform_versioned_decode_from_slice(buf, BINCODE_CONFIG, sdk.version()) .expect("decode ProTxHash"); - ProTxHash::from_raw_hash(Hash::from_byte_array(data)) + ProTxHash::from_raw_hash(CoreHash::from_byte_array(data)) } } @@ -245,7 +268,7 @@ impl MockResponse for ProposerBlockCounts { where Self: Sized, { - let data = RetrievedIntegerValue::::mock_deserialize(sdk, buf); + let data = RetrievedValues::::mock_deserialize(sdk, buf); ProposerBlockCounts(data) } } diff --git a/packages/rs-sdk/src/platform/fetch_many.rs b/packages/rs-sdk/src/platform/fetch_many.rs index eede165d26..4ecf6e42cc 100644 --- a/packages/rs-sdk/src/platform/fetch_many.rs +++ b/packages/rs-sdk/src/platform/fetch_many.rs @@ -41,7 +41,6 @@ use drive_proof_verifier::types::{ }; use drive_proof_verifier::{types::Documents, FromProof}; use rs_dapi_client::{transport::TransportRequest, DapiRequest, RequestSettings}; -use std::collections::BTreeMap; /// Fetch multiple objects from Platform. /// @@ -239,7 +238,7 @@ impl FetchMany for Document { tracing::trace!(request=?document_query, response=?response, "fetch multiple documents"); // let object: Option> = sdk - let documents: BTreeMap> = sdk + let documents: Documents = sdk .parse_proof::(document_query, response) .await? .unwrap_or_default(); diff --git a/packages/rs-sdk/tests/fetch/data_contract.rs b/packages/rs-sdk/tests/fetch/data_contract.rs index b59acbb97a..adddd35cd6 100644 --- a/packages/rs-sdk/tests/fetch/data_contract.rs +++ b/packages/rs-sdk/tests/fetch/data_contract.rs @@ -145,6 +145,11 @@ async fn test_data_contract_history_read() { let result = DataContractHistory::fetch(&sdk, LimitQuery::from((id, 10))).await; assert!(matches!(result, Ok(Some(_))), "result: {:?}", result); - let (_, contract) = result.unwrap().unwrap().pop_first().unwrap(); + let (_, contract) = result + .expect("request should succeed") + .expect("data contract should exist") + .into_iter() + .next() + .expect("data contract"); assert_eq!(contract.id(), id); } diff --git a/packages/rs-sdk/tests/fetch/document.rs b/packages/rs-sdk/tests/fetch/document.rs index 8263250d0b..088cf73136 100644 --- a/packages/rs-sdk/tests/fetch/document.rs +++ b/packages/rs-sdk/tests/fetch/document.rs @@ -34,7 +34,8 @@ async fn document_read() { let first_doc = Document::fetch_many(&sdk, all_docs_query) .await .expect("fetch many documents") - .pop_first() + .into_iter() + .next() .expect("first item must exist") .1 .expect("document must exist"); diff --git a/packages/rs-sdk/tests/fetch/epoch.rs b/packages/rs-sdk/tests/fetch/epoch.rs index 8080e3b344..0c8f429d7f 100644 --- a/packages/rs-sdk/tests/fetch/epoch.rs +++ b/packages/rs-sdk/tests/fetch/epoch.rs @@ -1,5 +1,3 @@ -use std::collections::BTreeMap; - use super::{common::setup_logs, config::Config}; use dapi_grpc::platform::{ v0::{get_identity_request::GetIdentityRequestV0, GetIdentityRequest}, @@ -15,6 +13,7 @@ use dash_sdk::{ use dpp::block::epoch::EpochIndex; use dpp::block::extended_epoch_info::v0::ExtendedEpochInfoV0Getters; use dpp::block::extended_epoch_info::ExtendedEpochInfo; +use drive_proof_verifier::types::ExtendedEpochInfos; use rs_dapi_client::{DapiRequestExecutor, RequestSettings}; /// Get current epoch index from DAPI response metadata @@ -35,7 +34,7 @@ async fn get_current_epoch(sdk: &Sdk, cfg: &Config) -> EpochIndex { } /// Check some assertions on returned epochs list fn assert_epochs( - epochs: BTreeMap>, + epochs: ExtendedEpochInfos, starting_epoch: EpochIndex, current_epoch: EpochIndex, limit: u16, @@ -89,10 +88,9 @@ async fn test_epoch_list() { let current_epoch = get_current_epoch(&sdk, &cfg).await; // When we fetch epochs from the server, starting with `starting_epoch` - let epochs: BTreeMap> = - ExtendedEpochInfo::fetch_many(&sdk, starting_epoch) - .await - .expect("list epochs"); + let epochs: ExtendedEpochInfos = ExtendedEpochInfo::fetch_many(&sdk, starting_epoch) + .await + .expect("list epochs"); assert_epochs( epochs, diff --git a/packages/rs-sdk/tests/fetch/mock_fetch_many.rs b/packages/rs-sdk/tests/fetch/mock_fetch_many.rs index fdf3811d8d..36bce78543 100644 --- a/packages/rs-sdk/tests/fetch/mock_fetch_many.rs +++ b/packages/rs-sdk/tests/fetch/mock_fetch_many.rs @@ -1,5 +1,3 @@ -use std::collections::BTreeMap; - use super::common::{mock_data_contract, mock_document_type}; use dash_sdk::{ platform::{DocumentQuery, FetchMany}, @@ -14,6 +12,7 @@ use dpp::{ }, document::{Document, DocumentV0Getters}, }; +use drive_proof_verifier::types::Documents; /// Given some data contract, document type and 1 document of this type, when I request multiple documents, I get that /// document. @@ -26,13 +25,13 @@ async fn test_mock_document_fetch_many() { let expected_doc = document_type .random_document(None, sdk.version()) .expect("document should be created"); - let expected = BTreeMap::from([(expected_doc.id(), Some(expected_doc.clone()))]); + let expected = Documents::from([(expected_doc.id(), Some(expected_doc.clone()))]); // document that should not be returned, as it will be defined as a duplicate let not_expected_doc = document_type .random_document(None, sdk.version()) .expect("document 2 should be created"); - let not_expected = BTreeMap::from([(not_expected_doc.id(), Some(not_expected_doc))]); + let not_expected = Documents::from([(not_expected_doc.id(), Some(not_expected_doc))]); let document_type_name = document_type.name(); From 1c81d68a263ac959b2c7c8ab2bf105bd20301f6b Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 17 Oct 2024 17:22:24 +0700 Subject: [PATCH 66/90] chore: update to latest rust dash core with x11 optional (#2251) --- Cargo.lock | 56 +++++++++++++++---------------- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- 5 files changed, 31 insertions(+), 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 518b077b81..754666c08a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -451,18 +451,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" [[package]] -name = "bitcoin-private" -version = "0.1.0" +name = "bitcoin-io" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73290177011694f38ec25e165d0387ab7ea749a4b81cd4c80dae5988229f7a57" +checksum = "340e09e8399c7bd8912f495af6aa58bea0c9214773417ffaa8f6460f93aaee56" [[package]] name = "bitcoin_hashes" -version = "0.12.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d7066118b13d4b20b23645932dfb3a81ce7e29f95726c2036fa33cd7b092501" +checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" dependencies = [ - "bitcoin-private", + "bitcoin-io", + "hex-conservative", ] [[package]] @@ -1145,7 +1146,7 @@ dependencies = [ [[package]] name = "dashcore" version = "0.30.0" -source = "git+https://github.com/dashpay/rust-dashcore?branch=master#a29315dbe56729be1be963fb6f7b60a22288663f" +source = "git+https://github.com/dashpay/rust-dashcore?tag=0.31.0#003b1aed973be7eb98591c6ec3c8f82eafab4645" dependencies = [ "anyhow", "bech32", @@ -1161,12 +1162,12 @@ dependencies = [ [[package]] name = "dashcore-private" version = "0.1.0" -source = "git+https://github.com/dashpay/rust-dashcore?branch=master#a29315dbe56729be1be963fb6f7b60a22288663f" +source = "git+https://github.com/dashpay/rust-dashcore?tag=0.31.0#003b1aed973be7eb98591c6ec3c8f82eafab4645" [[package]] name = "dashcore-rpc" -version = "0.15.2" -source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.4#bd6efdb850151f1dcd8e3f38d4796d18c5be518c" +version = "0.15.7" +source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.7#3a16a75496939e6855fc9c823a4d5de11c2f0ee8" dependencies = [ "dashcore-private", "dashcore-rpc-json", @@ -1180,8 +1181,8 @@ dependencies = [ [[package]] name = "dashcore-rpc-json" -version = "0.15.2" -source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.4#bd6efdb850151f1dcd8e3f38d4796d18c5be518c" +version = "0.15.7" +source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.7#3a16a75496939e6855fc9c823a4d5de11c2f0ee8" dependencies = [ "bincode", "dashcore", @@ -1195,10 +1196,9 @@ dependencies = [ [[package]] name = "dashcore_hashes" version = "0.12.0" -source = "git+https://github.com/dashpay/rust-dashcore?branch=master#a29315dbe56729be1be963fb6f7b60a22288663f" +source = "git+https://github.com/dashpay/rust-dashcore?tag=0.31.0#003b1aed973be7eb98591c6ec3c8f82eafab4645" dependencies = [ "dashcore-private", - "rs-x11-hash", "secp256k1", "serde", ] @@ -2216,6 +2216,15 @@ dependencies = [ "serde", ] +[[package]] +name = "hex-conservative" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" +dependencies = [ + "arrayvec", +] + [[package]] name = "hex-literal" version = "0.4.1" @@ -3882,17 +3891,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "rs-x11-hash" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94ea852806513d6f5fd7750423300375bc8481a18ed033756c1a836257893a30" -dependencies = [ - "bindgen 0.65.1", - "cc", - "libc", -] - [[package]] name = "rust_decimal" version = "1.36.0" @@ -4062,9 +4060,9 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "secp256k1" -version = "0.27.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" +checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" dependencies = [ "bitcoin_hashes", "rand", @@ -4074,9 +4072,9 @@ dependencies = [ [[package]] name = "secp256k1-sys" -version = "0.8.1" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" dependencies = [ "cc", ] diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 4d7d1c79d9..8d6e3c93c5 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -29,7 +29,7 @@ dashcore = { git = "https://github.com/dashpay/rust-dashcore", features = [ "rand", "signer", "serde", -], default-features = false, branch = "master" } +], default-features = false, tag = "0.31.0" } env_logger = { version = "0.11" } getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4" } diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index dfcd0e0e25..b9a1eda906 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -28,7 +28,7 @@ rand = "0.8.5" tempfile = "3.3.0" hex = "0.4.3" indexmap = { version = "2.2.6", features = ["serde"] } -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.4" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.7" } dpp = { path = "../rs-dpp", features = ["abci"] } simple-signer = { path = "../simple-signer" } rust_decimal = "1.2.5" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index dcce9de6fb..992a4a9b1d 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -33,7 +33,7 @@ envy = { version = "0.4.2", optional = true } futures = { version = "0.3.30" } derive_more = { version = "1.0", features = ["from"] } # dashcore-rpc is only needed for core rpc; TODO remove once we have correct core rpc impl -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.4" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.7" } lru = { version = "0.12.3", optional = true } bip37-bloom-filter = { git = "https://github.com/dashpay/rs-bip37-bloom-filter", branch = "develop" } zeroize = { version = "1.8", features = ["derive"] } diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index aaa449c293..29f0989df0 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -8,6 +8,6 @@ rust-version.workspace = true [dependencies] bincode = { version = "2.0.0-rc.3", features = ["serde"] } -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.4" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.7" } dpp = { path = "../rs-dpp", features = ["abci"] } base64 = { version = "0.22.1" } From 5c639bf6629927e43756398c2d2a5e77a3ce0d29 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Fri, 18 Oct 2024 00:01:25 +0700 Subject: [PATCH 67/90] chore: add partial eq to document query (#2253) --- packages/rs-sdk/src/platform/document_query.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-sdk/src/platform/document_query.rs b/packages/rs-sdk/src/platform/document_query.rs index 9c61f94376..a6b1f7c773 100644 --- a/packages/rs-sdk/src/platform/document_query.rs +++ b/packages/rs-sdk/src/platform/document_query.rs @@ -37,7 +37,7 @@ use super::fetch::Fetch; /// required to correctly verify proofs returned by the Dash Platform. /// /// Conversions are implemented between this type, [GetDocumentsRequest] and [DriveDocumentQuery] using [TryFrom] trait. -#[derive(Debug, Clone, dapi_grpc_macros::Mockable)] +#[derive(Debug, Clone, PartialEq, dapi_grpc_macros::Mockable)] #[cfg_attr(feature = "mocks", derive(serde::Serialize, serde::Deserialize))] pub struct DocumentQuery { /// Data contract ID From 0a57e76d8130e6a24d93bedc369b152dc0e8985a Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Fri, 18 Oct 2024 00:49:12 +0700 Subject: [PATCH 68/90] chore: move BLS Sigs import to Rust Dash Core (#2252) --- Cargo.lock | 30 +++++++++++-------- packages/rs-dpp/Cargo.toml | 8 +++-- packages/rs-dpp/src/bls/native_bls.rs | 2 +- .../identity/identity_public_key/key_type.rs | 2 +- .../identity_public_key/v0/methods/mod.rs | 2 +- packages/rs-dpp/src/lib.rs | 6 ++-- packages/rs-dpp/src/signing.rs | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- .../src/execution/check_tx/v0/mod.rs | 6 ++-- .../state_transitions/identity_update/mod.rs | 4 +-- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- 12 files changed, 37 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 754666c08a..51e82dbf4d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -515,7 +515,7 @@ dependencies = [ [[package]] name = "bls-dash-sys" version = "1.2.5" -source = "git+https://github.com/dashpay/bls-signatures?tag=v1.3.1#1c2fc79c19dc8041610c005e68d58bfb4bc32721" +source = "git+https://github.com/dashpay/bls-signatures?tag=1.3.3#4e070243aed142bc458472f8807ab77527dd879a" dependencies = [ "bindgen 0.65.1", "cc", @@ -525,7 +525,7 @@ dependencies = [ [[package]] name = "bls-signatures" version = "1.2.5" -source = "git+https://github.com/dashpay/bls-signatures?tag=v1.3.1#1c2fc79c19dc8041610c005e68d58bfb4bc32721" +source = "git+https://github.com/dashpay/bls-signatures?tag=1.3.3#4e070243aed142bc458472f8807ab77527dd879a" dependencies = [ "bls-dash-sys", "hex", @@ -1145,29 +1145,35 @@ dependencies = [ [[package]] name = "dashcore" -version = "0.30.0" -source = "git+https://github.com/dashpay/rust-dashcore?tag=0.31.0#003b1aed973be7eb98591c6ec3c8f82eafab4645" +version = "0.32.0" +source = "git+https://github.com/dashpay/rust-dashcore?tag=0.32.0#6a0ec164ca1bdcb8d19b29f40e946120e99473eb" dependencies = [ "anyhow", "bech32", + "bitflags 2.6.0", + "bls-signatures", "dashcore-private", "dashcore_hashes", + "ed25519-dalek", "hex", "hex_lit", + "lazy_static", "rustversion", "secp256k1", "serde", + "serde_repr", + "strum", ] [[package]] name = "dashcore-private" version = "0.1.0" -source = "git+https://github.com/dashpay/rust-dashcore?tag=0.31.0#003b1aed973be7eb98591c6ec3c8f82eafab4645" +source = "git+https://github.com/dashpay/rust-dashcore?tag=0.32.0#6a0ec164ca1bdcb8d19b29f40e946120e99473eb" [[package]] name = "dashcore-rpc" -version = "0.15.7" -source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.7#3a16a75496939e6855fc9c823a4d5de11c2f0ee8" +version = "0.15.8" +source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.8#4d4d5b1488daa7f083d254a1f5acf03b550d5b10" dependencies = [ "dashcore-private", "dashcore-rpc-json", @@ -1181,8 +1187,8 @@ dependencies = [ [[package]] name = "dashcore-rpc-json" -version = "0.15.7" -source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.7#3a16a75496939e6855fc9c823a4d5de11c2f0ee8" +version = "0.15.8" +source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.8#4d4d5b1488daa7f083d254a1f5acf03b550d5b10" dependencies = [ "bincode", "dashcore", @@ -1195,8 +1201,8 @@ dependencies = [ [[package]] name = "dashcore_hashes" -version = "0.12.0" -source = "git+https://github.com/dashpay/rust-dashcore?tag=0.31.0#003b1aed973be7eb98591c6ec3c8f82eafab4645" +version = "0.14.0" +source = "git+https://github.com/dashpay/rust-dashcore?tag=0.32.0#6a0ec164ca1bdcb8d19b29f40e946120e99473eb" dependencies = [ "dashcore-private", "secp256k1", @@ -1363,7 +1369,6 @@ dependencies = [ "async-trait", "base64 0.22.1", "bincode", - "bls-signatures", "bs58", "byteorder", "chrono", @@ -1372,7 +1377,6 @@ dependencies = [ "data-contracts", "derive_more 1.0.0", "dpp", - "ed25519-dalek", "env_logger 0.11.5", "getrandom", "hex", diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 8d6e3c93c5..591a86701d 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -15,7 +15,6 @@ authors = [ anyhow = { version = "1.0.81" } async-trait = { version = "0.1.79" } base64 = "0.22.1" -bls-signatures = { git = "https://github.com/dashpay/bls-signatures", tag = "v1.3.1", optional = true } bs58 = "0.5" byteorder = { version = "1.4" } chrono = { version = "0.4.35", default-features = false, features = [ @@ -29,7 +28,9 @@ dashcore = { git = "https://github.com/dashpay/rust-dashcore", features = [ "rand", "signer", "serde", -], default-features = false, tag = "0.31.0" } + "bls", + "eddsa" +], default-features = false, tag = "0.32.0" } env_logger = { version = "0.11" } getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4" } @@ -56,7 +57,6 @@ platform-versioning = { path = "../rs-platform-versioning" } platform-serialization = { path = "../rs-platform-serialization" } platform-serialization-derive = { path = "../rs-platform-serialization-derive" } derive_more = { version = "1.0", features = ["from", "display"] } -ed25519-dalek = { version = "2.1", features = ["rand_core"], optional = true } nohash-hasher = "0.2.0" rust_decimal = "1.29.1" rust_decimal_macros = "1.29.1" @@ -75,6 +75,8 @@ once_cell = "1.7" [features] default = ["platform-value", "state-transitions"] +bls-signatures = ["dashcore/bls"] +ed25519-dalek = ["dashcore/eddsa"] all_features = [ "json-object", "platform-value", diff --git a/packages/rs-dpp/src/bls/native_bls.rs b/packages/rs-dpp/src/bls/native_bls.rs index f613284266..5dc7e2bc82 100644 --- a/packages/rs-dpp/src/bls/native_bls.rs +++ b/packages/rs-dpp/src/bls/native_bls.rs @@ -1,6 +1,6 @@ use crate::{BlsModule, ProtocolError, PublicKeyValidationError}; use anyhow::anyhow; -use bls_signatures::{PrivateKey, PublicKey}; +use dashcore::bls_signatures::{self, PrivateKey, PublicKey}; #[derive(Default)] pub struct NativeBlsModule; diff --git a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs index 2d64045452..e40437a33e 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs @@ -8,7 +8,7 @@ use dashcore::secp256k1::rand::rngs::StdRng as EcdsaRng; #[cfg(feature = "random-public-keys")] use dashcore::secp256k1::rand::SeedableRng; use dashcore::secp256k1::Secp256k1; -use dashcore::Network; +use dashcore::{bls_signatures, ed25519_dalek, Network}; use itertools::Itertools; use lazy_static::lazy_static; diff --git a/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs b/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs index 891bd5ed82..470dc92b9b 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs @@ -7,7 +7,7 @@ use anyhow::anyhow; use dashcore::hashes::Hash; use dashcore::key::Secp256k1; use dashcore::secp256k1::SecretKey; -use dashcore::{Network, PublicKey as ECDSAPublicKey}; +use dashcore::{bls_signatures, ed25519_dalek, Network, PublicKey as ECDSAPublicKey}; use platform_value::Bytes20; impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { diff --git a/packages/rs-dpp/src/lib.rs b/packages/rs-dpp/src/lib.rs index 6dd0312fc2..a5d4ec177e 100644 --- a/packages/rs-dpp/src/lib.rs +++ b/packages/rs-dpp/src/lib.rs @@ -90,11 +90,11 @@ pub mod prelude { pub use bincode; #[cfg(all(not(target_arch = "wasm32"), feature = "bls-signatures"))] -pub use bls_signatures; +pub use dashcore::bls_signatures; +#[cfg(feature = "ed25519-dalek")] +pub use dashcore::ed25519_dalek; #[cfg(feature = "system_contracts")] pub use data_contracts; -#[cfg(feature = "ed25519-dalek")] -pub use ed25519_dalek; #[cfg(feature = "jsonschema")] pub use jsonschema; pub use platform_serialization; diff --git a/packages/rs-dpp/src/signing.rs b/packages/rs-dpp/src/signing.rs index 96c810ff36..d4f69942b6 100644 --- a/packages/rs-dpp/src/signing.rs +++ b/packages/rs-dpp/src/signing.rs @@ -8,7 +8,7 @@ use crate::serialization::PlatformMessageSignable; use crate::validation::SimpleConsensusValidationResult; #[cfg(feature = "message-signing")] use crate::{BlsModule, ProtocolError}; -use dashcore::signer; +use dashcore::{bls_signatures, signer}; impl PlatformMessageSignable for &[u8] { #[cfg(feature = "message-signature-verification")] diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index b9a1eda906..e79b1e55e2 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -28,7 +28,7 @@ rand = "0.8.5" tempfile = "3.3.0" hex = "0.4.3" indexmap = { version = "2.2.6", features = ["serde"] } -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.7" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.8" } dpp = { path = "../rs-dpp", features = ["abci"] } simple-signer = { path = "../simple-signer" } rust_decimal = "1.2.5" diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index d24ce2361d..acfb7fca04 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -213,7 +213,7 @@ mod tests { use dpp::consensus::ConsensusError; use dpp::dashcore::secp256k1::Secp256k1; - use dpp::dashcore::{key::KeyPair, signer, Network, PrivateKey}; + use dpp::dashcore::{key::Keypair, signer, Network, PrivateKey}; use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; use dpp::data_contract::document_type::random_document::{ @@ -2659,7 +2659,7 @@ mod tests { let secp = Secp256k1::new(); - let new_key_pair = KeyPair::new(&secp, &mut rng); + let new_key_pair = Keypair::new(&secp, &mut rng); let mut new_key = IdentityPublicKeyInCreationV0 { id: 2, @@ -2760,7 +2760,7 @@ mod tests { let platform_state = platform.state.load(); - let new_key_pair = KeyPair::new(&secp, &mut rng); + let new_key_pair = Keypair::new(&secp, &mut rng); let new_key = IdentityPublicKeyInCreationV0 { id: 2, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs index 629240407a..fd1cdba343 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs @@ -122,7 +122,7 @@ mod tests { use dpp::block::block_info::BlockInfo; use dpp::consensus::ConsensusError; use dpp::dash_to_credits; - use dpp::dashcore::key::{KeyPair, Secp256k1}; + use dpp::dashcore::key::{Keypair, Secp256k1}; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::contract_bounds::ContractBounds; @@ -371,7 +371,7 @@ mod tests { let mut rng = StdRng::seed_from_u64(1292); - let new_key_pair = KeyPair::new(&secp, &mut rng); + let new_key_pair = Keypair::new(&secp, &mut rng); let new_key = IdentityPublicKeyInCreationV0 { id: 2, diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 992a4a9b1d..ebf783f652 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -33,7 +33,7 @@ envy = { version = "0.4.2", optional = true } futures = { version = "0.3.30" } derive_more = { version = "1.0", features = ["from"] } # dashcore-rpc is only needed for core rpc; TODO remove once we have correct core rpc impl -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.7" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.8" } lru = { version = "0.12.3", optional = true } bip37-bloom-filter = { git = "https://github.com/dashpay/rs-bip37-bloom-filter", branch = "develop" } zeroize = { version = "1.8", features = ["derive"] } diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index 29f0989df0..12bb07870d 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -8,6 +8,6 @@ rust-version.workspace = true [dependencies] bincode = { version = "2.0.0-rc.3", features = ["serde"] } -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.7" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.8" } dpp = { path = "../rs-dpp", features = ["abci"] } base64 = { version = "0.22.1" } From 00df5a64c2ee00722fc3c4d624b3c4dd7c8ac8d2 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 18 Oct 2024 16:41:02 +0700 Subject: [PATCH 69/90] fix(dashmate): invalid drive status check (#2248) --- Cargo.lock | 1 - .../dashmate/src/commands/status/index.js | 6 +- .../src/config/generateEnvsFactory.js | 1 + .../dashmate/src/status/determineStatus.js | 4 + .../dashmate/src/status/scopes/overview.js | 3 +- .../dashmate/src/status/scopes/platform.js | 38 +++++---- .../test/unit/status/scopes/platform.spec.js | 8 +- packages/rs-drive-abci/Cargo.toml | 1 - packages/rs-drive-abci/src/main.rs | 82 +++++++++---------- 9 files changed, 80 insertions(+), 64 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 51e82dbf4d..a6d1c8fd71 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1502,7 +1502,6 @@ dependencies = [ "tokio-util", "tracing", "tracing-subscriber", - "ureq", "url", ] diff --git a/packages/dashmate/src/commands/status/index.js b/packages/dashmate/src/commands/status/index.js index 6276bb9796..c22269ccdc 100644 --- a/packages/dashmate/src/commands/status/index.js +++ b/packages/dashmate/src/commands/status/index.js @@ -108,8 +108,12 @@ export default class StatusCommand extends ConfigBaseCommand { plain['Platform Enabled'] = platform.enabled || 'n/a'; + const platformStatus = platform.tenderdash.serviceStatus !== ServiceStatusEnum.up + ? platform.tenderdash.serviceStatus + : platform.drive.serviceStatus; + if (platform.enabled) { - plain['Platform Status'] = colors.status(platform.tenderdash.serviceStatus)(platform.tenderdash.serviceStatus) || 'n/a'; + plain['Platform Status'] = colors.status(platformStatus)(platformStatus) || 'n/a'; if (platform.tenderdash.serviceStatus === ServiceStatusEnum.up) { plain['Platform Version'] = platform.tenderdash.version || 'n/a'; diff --git a/packages/dashmate/src/config/generateEnvsFactory.js b/packages/dashmate/src/config/generateEnvsFactory.js index 781ef7bdaa..8d7823db07 100644 --- a/packages/dashmate/src/config/generateEnvsFactory.js +++ b/packages/dashmate/src/config/generateEnvsFactory.js @@ -69,6 +69,7 @@ export default function generateEnvsFactory(configFile, homeDir, getConfigProfil let driveAbciMetricsUrl = ''; if (config.get('platform.drive.abci.metrics.enabled')) { + // IP and port inside container driveAbciMetricsUrl = 'http://0.0.0.0:29090'; } diff --git a/packages/dashmate/src/status/determineStatus.js b/packages/dashmate/src/status/determineStatus.js index 723302a006..b089f1f7f7 100644 --- a/packages/dashmate/src/status/determineStatus.js +++ b/packages/dashmate/src/status/determineStatus.js @@ -49,6 +49,10 @@ export default { return coreIsSynced ? ServiceStatusEnum.up : ServiceStatusEnum.wait_for_core; } + if (dockerStatus === DockerStatusEnum.not_started) { + return ServiceStatusEnum.stopped; + } + return ServiceStatusEnum.error; }, }; diff --git a/packages/dashmate/src/status/scopes/overview.js b/packages/dashmate/src/status/scopes/overview.js index a38d9ffb5e..2a56bd3678 100644 --- a/packages/dashmate/src/status/scopes/overview.js +++ b/packages/dashmate/src/status/scopes/overview.js @@ -57,8 +57,9 @@ export default function getOverviewScopeFactory( } if (config.get('platform.enable')) { - const { tenderdash } = await getPlatformScope(config); + const { drive, tenderdash } = await getPlatformScope(config); + platform.drive = drive; platform.tenderdash = tenderdash; } diff --git a/packages/dashmate/src/status/scopes/platform.js b/packages/dashmate/src/status/scopes/platform.js index 7605104ecb..9943e35b10 100644 --- a/packages/dashmate/src/status/scopes/platform.js +++ b/packages/dashmate/src/status/scopes/platform.js @@ -1,4 +1,5 @@ import prettyMs from 'pretty-ms'; +import DockerComposeError from '../../docker/errors/DockerComposeError.js'; import providers from '../providers.js'; import { DockerStatusEnum } from '../enums/dockerStatus.js'; import { ServiceStatusEnum } from '../enums/serviceStatus.js'; @@ -162,31 +163,36 @@ export default function getPlatformScopeFactory( try { info.dockerStatus = await determineStatus.docker(dockerCompose, config, 'drive_abci'); - info.serviceStatus = determineStatus.platform(info.dockerStatus, isCoreSynced, mnRRSoftFork); + } catch (e) { + if (e instanceof ContainerIsNotPresentError) { + info.dockerStatus = DockerStatusEnum.not_started; + } else { + throw e; + } + } + + info.serviceStatus = determineStatus.platform(info.dockerStatus, isCoreSynced, mnRRSoftFork); - if (info.serviceStatus === ServiceStatusEnum.up) { - const driveEchoResult = await dockerCompose.execCommand( + // Get Drive status to make sure it's responding + if (info.serviceStatus === ServiceStatusEnum.up) { + try { + await dockerCompose.execCommand( config, 'drive_abci', 'drive-abci status', ); - - if (driveEchoResult.exitCode !== 0) { + } catch (e) { + if (e instanceof DockerComposeError + && e.dockerComposeExecutionResult + && e.dockerComposeExecutionResult.exitCode !== 0) { info.serviceStatus = ServiceStatusEnum.error; + } else { + throw e; } } - - return info; - } catch (e) { - if (e instanceof ContainerIsNotPresentError) { - return { - dockerStatus: DockerStatusEnum.not_started, - serviceStatus: ServiceStatusEnum.stopped, - }; - } - - return info; } + + return info; }; /** diff --git a/packages/dashmate/test/unit/status/scopes/platform.spec.js b/packages/dashmate/test/unit/status/scopes/platform.spec.js index c3a1c28ff1..b94f0da636 100644 --- a/packages/dashmate/test/unit/status/scopes/platform.spec.js +++ b/packages/dashmate/test/unit/status/scopes/platform.spec.js @@ -1,3 +1,5 @@ +import ContainerIsNotPresentError + from '../../../../src/docker/errors/ContainerIsNotPresentError.js'; import providers from '../../../../src/status/providers.js'; import determineStatus from '../../../../src/status/determineStatus.js'; import getConfigMock from '../../../../src/test/mock/getConfigMock.js'; @@ -377,7 +379,7 @@ describe('getPlatformScopeFactory', () => { mockDetermineDockerStatus.withArgs(mockDockerCompose, config, 'drive_tenderdash') .returns(DockerStatusEnum.running); mockDetermineDockerStatus.withArgs(mockDockerCompose, config, 'drive_abci') - .throws(); + .throws(new ContainerIsNotPresentError('drive_abci')); mockDockerCompose.execCommand.returns({ exitCode: 0, out: '' }); mockMNOWatchProvider.returns(Promise.resolve('OPEN')); @@ -430,8 +432,8 @@ describe('getPlatformScopeFactory', () => { network: 'test', }, drive: { - dockerStatus: null, - serviceStatus: null, + dockerStatus: DockerStatusEnum.not_started, + serviceStatus: ServiceStatusEnum.stopped, }, }; diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index e79b1e55e2..7e8346fe95 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -63,7 +63,6 @@ metrics-exporter-prometheus = { version = "0.15", default-features = false, feat "http-listener", ] } url = { version = "2.3.1" } -ureq = { "version" = "2.6.2" } tokio = { version = "1.40", features = [ "macros", "signal", diff --git a/packages/rs-drive-abci/src/main.rs b/packages/rs-drive-abci/src/main.rs index aab50e3e06..a76fffd1c7 100644 --- a/packages/rs-drive-abci/src/main.rs +++ b/packages/rs-drive-abci/src/main.rs @@ -3,11 +3,15 @@ //! RS-Drive-ABCI server starts a single-threaded server and listens to connections from Tenderdash. use clap::{Parser, Subcommand}; +use dapi_grpc::platform::v0::get_status_request; +use dapi_grpc::platform::v0::get_status_request::GetStatusRequestV0; +use dapi_grpc::platform::v0::platform_client::PlatformClient; +use dapi_grpc::tonic::transport::Uri; use dpp::version::PlatformVersion; use drive_abci::config::{FromEnv, PlatformConfig}; use drive_abci::core::wait_for_core_to_sync::v0::wait_for_core_to_sync_v0; use drive_abci::logging::{LogBuilder, LogConfig, LogDestination, Loggers}; -use drive_abci::metrics::{Prometheus, DEFAULT_PROMETHEUS_PORT}; +use drive_abci::metrics::Prometheus; use drive_abci::platform_types::platform::Platform; use drive_abci::rpc::core::DefaultCoreRPC; use drive_abci::{logging, server}; @@ -17,6 +21,7 @@ use std::fs::remove_file; use std::net::SocketAddr; use std::path::PathBuf; use std::process::ExitCode; +use std::str::FromStr; use std::sync::Arc; use tokio::runtime::{Builder, Runtime}; use tokio::signal::unix::{signal, SignalKind}; @@ -98,6 +103,13 @@ impl Cli { ) -> Result<(), String> { match self.command { Commands::Start => { + tracing::info!( + version = env!("CARGO_PKG_VERSION"), + features = list_enabled_features().join(","), + rust = env!("CARGO_PKG_RUST_VERSION"), + "drive-abci server initializing", + ); + if config.drive.grovedb_verify_on_startup { verify_grovedb(&config.db_path, false)?; } @@ -129,10 +141,12 @@ impl Cli { server::start(runtime, Arc::new(platform), config, cancel); + tracing::info!("drive-abci server is stopped"); + return Ok(()); } Commands::Config => dump_config(&config)?, - Commands::Status => check_status(&config)?, + Commands::Status => runtime.block_on(check_status(&config))?, Commands::Verify => verify_grovedb(&config.db_path, true)?, }; @@ -202,13 +216,6 @@ fn main() -> Result<(), ExitCode> { install_panic_hook(cancel.clone()); // Start runtime in the main thread - tracing::info!( - version = env!("CARGO_PKG_VERSION"), - features = list_enabled_features().join(","), - rust = env!("CARGO_PKG_RUST_VERSION"), - "drive-abci server initializing", - ); - let runtime_guard = runtime.enter(); runtime.spawn(handle_signals(cancel.clone(), loggers)); @@ -219,15 +226,13 @@ fn main() -> Result<(), ExitCode> { Ok(()) } Err(e) => { - tracing::error!(error = e, "drive-abci failed"); + tracing::error!(error = e, "drive-abci failed: {e}"); Err(ExitCode::FAILURE) } }; drop(runtime_guard); runtime.shutdown_timeout(Duration::from_millis(SHUTDOWN_TIMEOUT_MILIS)); - tracing::info!("drive-abci server is stopped"); - result } @@ -303,31 +308,27 @@ fn list_enabled_features() -> Vec<&'static str> { } /// Check status of ABCI server. -fn check_status(config: &PlatformConfig) -> Result<(), String> { - if let Some(prometheus_addr) = &config.prometheus_bind_address { - let url = - url::Url::parse(prometheus_addr).expect("cannot parse ABCI_PROMETHEUS_BIND_ADDRESS"); - - let addr = format!( - "{}://{}:{}/metrics", - url.scheme(), - url.host() - .ok_or("ABCI_PROMETHEUS_BIND_ADDRESS must contain valid host".to_string())?, - url.port().unwrap_or(DEFAULT_PROMETHEUS_PORT) - ); - - let body: String = ureq::get(&addr) - .set("Content-type", "text/plain") - .call() - .map_err(|e| e.to_string())? - .into_string() - .map_err(|e| e.to_string())?; +async fn check_status(config: &PlatformConfig) -> Result<(), String> { + // Convert the gRPC bind address string to a Uri + let uri = Uri::from_str(&format!("http://{}", config.grpc_bind_address)) + .map_err(|e| format!("invalid url: {e}"))?; + + // Connect to the gRPC server + let mut client = PlatformClient::connect(uri.clone()) + .await + .map_err(|e| format!("can't connect to grpc server {uri}: {e}"))?; + + // Make a request to the server + let request = dapi_grpc::platform::v0::GetStatusRequest { + version: Some(get_status_request::Version::V0(GetStatusRequestV0 {})), + }; - println!("{}", body); - Ok(()) - } else { - Err("ABCI_PROMETHEUS_BIND_ADDRESS not defined, cannot check status".to_string()) - } + // Should return non-zero error code if Drive is not responding + client + .get_status(request) + .await + .map(|_| ()) + .map_err(|e| format!("can't request status: {e}")) } /// Verify GroveDB integrity. @@ -415,7 +416,7 @@ fn configure_logging(cli: &Cli, config: &PlatformConfig) -> Result 0 { let cli_config = LogConfig { destination: LogDestination::StdOut, - level: cli.verbose.try_into().unwrap(), + level: cli.verbose.try_into()?, color: cli.color, ..Default::default() }; @@ -442,15 +443,14 @@ fn install_panic_hook(cancel: CancellationToken) { #[cfg(test)] mod test { + use ::drive::{drive::Drive, query::Element}; + use dpp::block::epoch::Epoch; + use drive::drive::credit_pools::epochs::epoch_key_constants; use std::{ fs, path::{Path, PathBuf}, }; - use ::drive::{drive::Drive, query::Element}; - use dpp::block::epoch::Epoch; - use drive::drive::credit_pools::epochs::epoch_key_constants; - use dpp::version::PlatformVersion; use drive::drive::credit_pools::epochs::paths::EpochProposers; use drive_abci::logging::LogLevel; From 1c3538610b8e719bbcc2790b8b3092d4b9cc14f9 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 19 Oct 2024 00:12:29 +0700 Subject: [PATCH 70/90] fix(dashmate): invalid platform version in the status command (#2249) --- .yarnrc.yml | 1 + .../dashmate/src/commands/group/status.js | 2 +- .../dashmate/src/commands/status/index.js | 2 +- .../dashmate/src/commands/status/platform.js | 1 - .../dashmate/src/status/scopes/platform.js | 18 +++++++++++++ .../test/unit/status/scopes/platform.spec.js | 25 +++++++++++++------ packages/rs-drive-abci/src/main.rs | 25 +++++++++++-------- 7 files changed, 54 insertions(+), 20 deletions(-) diff --git a/.yarnrc.yml b/.yarnrc.yml index dd002648b0..c59f803d7d 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -16,6 +16,7 @@ npmAuditExcludePackages: - "@humanwhocodes/object-schema" # TODO: Update eslint - micromatch # TODO: remove when new micromatch will be released https://github.com/advisories/GHSA-952p-6rrq-rcjv - eslint # TODO: Update eslint https://github.com/dashpay/platform/issues/2212 + - elliptic # TODO: Remove when elliptic >6.5.7 released packageExtensions: "@dashevo/protobufjs@*": diff --git a/packages/dashmate/src/commands/group/status.js b/packages/dashmate/src/commands/group/status.js index d3edbd8800..f9c20f800f 100644 --- a/packages/dashmate/src/commands/group/status.js +++ b/packages/dashmate/src/commands/group/status.js @@ -86,7 +86,7 @@ export default class GroupStatusCommand extends GroupBaseCommand { plain['Platform Status'] = colors.status(scope.platform.tenderdash.serviceStatus)(scope.platform.tenderdash.serviceStatus) || 'n/a'; } else { plain['Platform Status'] = colors.status(scope.platform.tenderdash.serviceStatus)(scope.platform.tenderdash.serviceStatus) || 'n/a'; - plain['Platform Version'] = scope.platform.tenderdash.version || 'n/a'; + plain['Platform Version'] = scope.platform.drive.version || 'n/a'; plain['Platform Block Height'] = scope.platform.tenderdash.latestBlockHeight || 'n/a'; plain['Platform Peers'] = scope.platform.tenderdash.peers || 'n/a'; plain['Platform Network'] = scope.platform.tenderdash.network || 'n/a'; diff --git a/packages/dashmate/src/commands/status/index.js b/packages/dashmate/src/commands/status/index.js index c22269ccdc..defeb7b80d 100644 --- a/packages/dashmate/src/commands/status/index.js +++ b/packages/dashmate/src/commands/status/index.js @@ -116,7 +116,7 @@ export default class StatusCommand extends ConfigBaseCommand { plain['Platform Status'] = colors.status(platformStatus)(platformStatus) || 'n/a'; if (platform.tenderdash.serviceStatus === ServiceStatusEnum.up) { - plain['Platform Version'] = platform.tenderdash.version || 'n/a'; + plain['Platform Version'] = platform.drive.version || 'n/a'; plain['Platform Block Height'] = platform.tenderdash.latestBlockHeight || 'n/a'; plain['Platform Peers'] = platform.tenderdash.peers || 'n/a'; plain['Platform Network'] = platform.tenderdash.network || 'n/a'; diff --git a/packages/dashmate/src/commands/status/platform.js b/packages/dashmate/src/commands/status/platform.js index 2c0e401f18..4f6eba5fbb 100644 --- a/packages/dashmate/src/commands/status/platform.js +++ b/packages/dashmate/src/commands/status/platform.js @@ -32,7 +32,6 @@ export default class PlatformStatusCommand extends ConfigBaseCommand { flags, dockerCompose, createRpcClient, - getConnectionHost, config, getPlatformScope, ) { diff --git a/packages/dashmate/src/status/scopes/platform.js b/packages/dashmate/src/status/scopes/platform.js index 9943e35b10..04daa6070f 100644 --- a/packages/dashmate/src/status/scopes/platform.js +++ b/packages/dashmate/src/status/scopes/platform.js @@ -159,6 +159,7 @@ export default function getPlatformScopeFactory( const info = { dockerStatus: null, serviceStatus: null, + version: null, }; try { @@ -192,6 +193,23 @@ export default function getPlatformScopeFactory( } } + try { + const driveVersionResult = await dockerCompose.execCommand( + config, + 'drive_abci', + 'drive-abci version', + ); + + info.version = driveVersionResult.out.trim(); + } catch (e) { + // Throw an error if it's not a Drive issue + if (!(e instanceof DockerComposeError + && e.dockerComposeExecutionResult + && e.dockerComposeExecutionResult.exitCode !== 0)) { + throw e; + } + } + return info; }; diff --git a/packages/dashmate/test/unit/status/scopes/platform.spec.js b/packages/dashmate/test/unit/status/scopes/platform.spec.js index b94f0da636..fc8bc8bf1c 100644 --- a/packages/dashmate/test/unit/status/scopes/platform.spec.js +++ b/packages/dashmate/test/unit/status/scopes/platform.spec.js @@ -1,5 +1,6 @@ import ContainerIsNotPresentError from '../../../../src/docker/errors/ContainerIsNotPresentError.js'; +import DockerComposeError from '../../../../src/docker/errors/DockerComposeError.js'; import providers from '../../../../src/status/providers.js'; import determineStatus from '../../../../src/status/determineStatus.js'; import getConfigMock from '../../../../src/test/mock/getConfigMock.js'; @@ -73,7 +74,8 @@ describe('getPlatformScopeFactory', () => { }, }); mockDockerCompose.isServiceRunning.returns(true); - mockDockerCompose.execCommand.returns({ exitCode: 0, out: '' }); + mockDockerCompose.execCommand.withArgs(config, 'drive_abci', 'drive-abci status').resolves({ exitCode: 0, out: '' }); + mockDockerCompose.execCommand.withArgs(config, 'drive_abci', 'drive-abci version').resolves({ exitCode: 0, out: '1.4.1' }); mockMNOWatchProvider.returns(Promise.resolve('OPEN')); const mockStatus = { @@ -121,6 +123,7 @@ describe('getPlatformScopeFactory', () => { drive: { dockerStatus: DockerStatusEnum.running, serviceStatus: ServiceStatusEnum.up, + version: '1.4.1', }, }; @@ -147,7 +150,7 @@ describe('getPlatformScopeFactory', () => { }, }); mockDockerCompose.isServiceRunning.returns(true); - mockDockerCompose.execCommand.returns({ exitCode: 0, out: '' }); + mockDockerCompose.execCommand.withArgs(config, 'drive_abci', 'drive-abci version').resolves({ exitCode: 0, out: '1.4.1' }); mockMNOWatchProvider.returns(Promise.resolve('OPEN')); const mockStatus = { @@ -195,6 +198,7 @@ describe('getPlatformScopeFactory', () => { drive: { dockerStatus: DockerStatusEnum.running, serviceStatus: ServiceStatusEnum.up, + version: '1.4.1', }, }; @@ -212,7 +216,6 @@ describe('getPlatformScopeFactory', () => { it('should return empty scope if error during request to core', async () => { mockRpcClient.mnsync.withArgs('status').throws(new Error()); - mockDockerCompose.execCommand.returns({ exitCode: 0, out: '' }); mockDockerCompose.isServiceRunning.returns(true); mockDetermineDockerStatus.withArgs(mockDockerCompose, config, 'drive_tenderdash') .returns(DockerStatusEnum.running); @@ -268,7 +271,7 @@ describe('getPlatformScopeFactory', () => { }, }, }); - mockDockerCompose.execCommand.returns({ exitCode: 1, out: '' }); + mockDockerCompose.execCommand.withArgs(config, 'drive_abci', 'drive-abci version').resolves({ exitCode: 0, out: '1.4.1' }); mockMNOWatchProvider.returns(Promise.resolve('OPEN')); const expectedScope = { @@ -300,6 +303,7 @@ describe('getPlatformScopeFactory', () => { drive: { dockerStatus: DockerStatusEnum.running, serviceStatus: ServiceStatusEnum.wait_for_core, + version: '1.4.1', }, }; @@ -324,7 +328,7 @@ describe('getPlatformScopeFactory', () => { .returns(DockerStatusEnum.running); mockDetermineDockerStatus.withArgs(mockDockerCompose, config, 'drive_abci') .returns(DockerStatusEnum.running); - mockDockerCompose.execCommand.returns({ exitCode: 0, out: '' }); + mockDockerCompose.execCommand.withArgs(config, 'drive_abci', 'drive-abci version').resolves({ exitCode: 0, out: '1.4.1' }); mockMNOWatchProvider.returns(Promise.resolve('OPEN')); const expectedScope = { @@ -356,6 +360,7 @@ describe('getPlatformScopeFactory', () => { drive: { dockerStatus: DockerStatusEnum.running, serviceStatus: ServiceStatusEnum.up, + version: '1.4.1', }, }; @@ -380,8 +385,11 @@ describe('getPlatformScopeFactory', () => { .returns(DockerStatusEnum.running); mockDetermineDockerStatus.withArgs(mockDockerCompose, config, 'drive_abci') .throws(new ContainerIsNotPresentError('drive_abci')); - mockDockerCompose.execCommand.returns({ exitCode: 0, out: '' }); mockMNOWatchProvider.returns(Promise.resolve('OPEN')); + const error = new DockerComposeError({ + exitCode: 1, + }); + mockDockerCompose.execCommand.withArgs(config, 'drive_abci', 'drive-abci version').rejects(error); const mockStatus = { node_info: { @@ -434,6 +442,7 @@ describe('getPlatformScopeFactory', () => { drive: { dockerStatus: DockerStatusEnum.not_started, serviceStatus: ServiceStatusEnum.stopped, + version: null, }, }; @@ -454,7 +463,8 @@ describe('getPlatformScopeFactory', () => { mockDockerCompose.isServiceRunning .withArgs(config, 'drive_tenderdash') .returns(true); - mockDockerCompose.execCommand.returns({ exitCode: 0, out: '' }); + mockDockerCompose.execCommand.withArgs(config, 'drive_abci', 'drive-abci status').resolves({ exitCode: 0, out: '' }); + mockDockerCompose.execCommand.withArgs(config, 'drive_abci', 'drive-abci version').resolves({ exitCode: 0, out: '1.4.1' }); mockDetermineDockerStatus.returns(DockerStatusEnum.running); mockMNOWatchProvider.returns(Promise.resolve('OPEN')); mockFetch.returns(Promise.reject(new Error('FetchError'))); @@ -488,6 +498,7 @@ describe('getPlatformScopeFactory', () => { drive: { dockerStatus: DockerStatusEnum.running, serviceStatus: ServiceStatusEnum.up, + version: '1.4.1', }, }; diff --git a/packages/rs-drive-abci/src/main.rs b/packages/rs-drive-abci/src/main.rs index a76fffd1c7..a8ae1adccd 100644 --- a/packages/rs-drive-abci/src/main.rs +++ b/packages/rs-drive-abci/src/main.rs @@ -59,6 +59,10 @@ enum Commands { /// by creating `.fsck` file in database directory (`DB_PATH`). #[command()] Verify, + + /// Print current software version + #[command()] + Version, } /// Server that accepts connections from Tenderdash, and @@ -148,6 +152,7 @@ impl Cli { Commands::Config => dump_config(&config)?, Commands::Status => runtime.block_on(check_status(&config))?, Commands::Verify => verify_grovedb(&config.db_path, true)?, + Commands::Version => print_version(), }; Ok(()) @@ -220,16 +225,11 @@ fn main() -> Result<(), ExitCode> { runtime.spawn(handle_signals(cancel.clone(), loggers)); - let result = match cli.run(&runtime, config, cancel) { - Ok(()) => { - tracing::debug!("shutdown complete"); - Ok(()) - } - Err(e) => { - tracing::error!(error = e, "drive-abci failed: {e}"); - Err(ExitCode::FAILURE) - } - }; + let result = cli.run(&runtime, config, cancel).map_err(|e| { + tracing::error!(error = e, "drive-abci failed: {e}"); + + ExitCode::FAILURE + }); drop(runtime_guard); runtime.shutdown_timeout(Duration::from_millis(SHUTDOWN_TIMEOUT_MILIS)); @@ -387,6 +387,11 @@ fn verify_grovedb(db_path: &PathBuf, force: bool) -> Result<(), String> { } } +/// Print current software version. +fn print_version() { + println!("{}", env!("CARGO_PKG_VERSION")); +} + fn load_config(path: &Option) -> PlatformConfig { if let Some(path) = path { if let Err(e) = dotenvy::from_path(path) { From e7ad4f373d4f5b13c4c16b0f92f69fc2d351d134 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 19 Oct 2024 12:29:05 +0700 Subject: [PATCH 71/90] chore(dashmate): report port check errors (#2245) --- .../tasks/doctor/collectSamplesTaskFactory.js | 9 ++++--- packages/dashmate/src/status/providers.js | 27 ++++++++++++------- packages/dashmate/src/status/scopes/core.js | 4 ++- .../dashmate/src/status/scopes/platform.js | 7 +++-- .../test/unit/status/scopes/core.spec.js | 6 ++--- 5 files changed, 34 insertions(+), 19 deletions(-) diff --git a/packages/dashmate/src/listr/tasks/doctor/collectSamplesTaskFactory.js b/packages/dashmate/src/listr/tasks/doctor/collectSamplesTaskFactory.js index a3be754509..3909edff78 100644 --- a/packages/dashmate/src/listr/tasks/doctor/collectSamplesTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/doctor/collectSamplesTaskFactory.js @@ -167,7 +167,8 @@ export default function collectSamplesTaskFactory( title: 'Core P2P port', task: async () => { const port = config.get('core.p2p.port'); - const response = await providers.mnowatch.checkPortStatus(port, config.get('externalIp')); + const response = await providers.mnowatch.checkPortStatus(port, config.get('externalIp')) + .catch((e) => e.toString()); ctx.samples.setServiceInfo('core', 'p2pPort', response); }, @@ -177,7 +178,8 @@ export default function collectSamplesTaskFactory( enabled: () => config.get('platform.enable'), task: async () => { const port = config.get('platform.gateway.listeners.dapiAndDrive.port'); - const response = await providers.mnowatch.checkPortStatus(port, config.get('externalIp')); + const response = await providers.mnowatch.checkPortStatus(port, config.get('externalIp')) + .catch((e) => e.toString()); ctx.samples.setServiceInfo('gateway', 'httpPort', response); }, @@ -186,7 +188,8 @@ export default function collectSamplesTaskFactory( title: 'Tenderdash P2P port', task: async () => { const port = config.get('platform.drive.tenderdash.p2p.port'); - const response = await providers.mnowatch.checkPortStatus(port, config.get('externalIp')); + const response = await providers.mnowatch.checkPortStatus(port, config.get('externalIp')) + .catch((e) => e.toString()); ctx.samples.setServiceInfo('drive_tenderdash', 'p2pPort', response); }, diff --git a/packages/dashmate/src/status/providers.js b/packages/dashmate/src/status/providers.js index 46c491c920..24594477c1 100644 --- a/packages/dashmate/src/status/providers.js +++ b/packages/dashmate/src/status/providers.js @@ -1,5 +1,4 @@ import https from 'https'; -import { PortStateEnum } from './enums/portState.js'; const MAX_REQUEST_TIMEOUT = 5000; const MAX_RESPONSE_SIZE = 1 * 1024 * 1024; // 1 MB @@ -82,10 +81,9 @@ export default { path: ip ? `/${port}/?validateIp=${ip}` : `/${port}/`, method: 'GET', family: 4, // Force IPv4 - timeout: MAX_REQUEST_TIMEOUT, }; - return new Promise((resolve) => { + return new Promise((resolve, reject) => { const req = https.request(options, (res) => { let data = ''; @@ -95,9 +93,12 @@ export default { // eslint-disable-next-line no-console console.warn(`Port check request failed with status code ${res.statusCode}`); } - // Consume response data to free up memory - res.resume(); - resolve(PortStateEnum.ERROR); + + const error = new Error(`Invalid status code ${res.statusCode}`); + + res.destroy(error); + + // Do not handle request further return; } @@ -109,14 +110,14 @@ export default { data += chunk; if (data.length > MAX_RESPONSE_SIZE) { - resolve(PortStateEnum.ERROR); - if (process.env.DEBUG) { // eslint-disable-next-line no-console console.warn('Port check response size exceeded'); } - req.destroy(); + const error = new Error('Response size exceeded'); + + req.destroy(error); } }); @@ -126,13 +127,19 @@ export default { }); }); + req.setTimeout(MAX_REQUEST_TIMEOUT, () => { + const error = new Error('Port check timed out'); + + req.destroy(error); + }); + req.on('error', (e) => { if (process.env.DEBUG) { // eslint-disable-next-line no-console console.warn(`Port check request failed: ${e}`); } - resolve(PortStateEnum.ERROR); + reject(e); }); req.end(); diff --git a/packages/dashmate/src/status/scopes/core.js b/packages/dashmate/src/status/scopes/core.js index c460f305de..63132d77f5 100644 --- a/packages/dashmate/src/status/scopes/core.js +++ b/packages/dashmate/src/status/scopes/core.js @@ -1,4 +1,5 @@ /* eslint-disable camelcase */ +import { PortStateEnum } from '../enums/portState.js'; import providers from '../providers.js'; import { ServiceStatusEnum } from '../enums/serviceStatus.js'; import { DockerStatusEnum } from '../enums/dockerStatus.js'; @@ -116,7 +117,8 @@ export default function getCoreScopeFactory( const providersResult = await Promise.allSettled([ providers.github.release('dashpay/dash'), - providers.mnowatch.checkPortStatus(config.get('core.p2p.port'), config.get('externalIp')), + providers.mnowatch.checkPortStatus(config.get('core.p2p.port'), config.get('externalIp')) + .catch(() => PortStateEnum.ERROR), providers.insight(config.get('network')).status(), ]); diff --git a/packages/dashmate/src/status/scopes/platform.js b/packages/dashmate/src/status/scopes/platform.js index 04daa6070f..09f65ebaff 100644 --- a/packages/dashmate/src/status/scopes/platform.js +++ b/packages/dashmate/src/status/scopes/platform.js @@ -1,4 +1,5 @@ import prettyMs from 'pretty-ms'; +import { PortStateEnum } from '../enums/portState.js'; import DockerComposeError from '../../docker/errors/DockerComposeError.js'; import providers from '../providers.js'; import { DockerStatusEnum } from '../enums/dockerStatus.js'; @@ -90,8 +91,10 @@ export default function getPlatformScopeFactory( // Collecting platform data fails if Tenderdash is waiting for core to sync if (info.serviceStatus === ServiceStatusEnum.up) { const portStatusResult = await Promise.allSettled([ - providers.mnowatch.checkPortStatus(config.get('platform.gateway.listeners.dapiAndDrive.port'), config.get('externalIp')), - providers.mnowatch.checkPortStatus(config.get('platform.drive.tenderdash.p2p.port'), config.get('externalIp')), + providers.mnowatch.checkPortStatus(config.get('platform.gateway.listeners.dapiAndDrive.port'), config.get('externalIp')) + .catch(() => PortStateEnum.ERROR), + providers.mnowatch.checkPortStatus(config.get('platform.drive.tenderdash.p2p.port'), config.get('externalIp')) + .catch(() => PortStateEnum.ERROR), ]); const [httpPortState, p2pPortState] = portStatusResult.map((result) => (result.status === 'fulfilled' ? result.value : null)); diff --git a/packages/dashmate/test/unit/status/scopes/core.spec.js b/packages/dashmate/test/unit/status/scopes/core.spec.js index b9c5c0de55..9587684f7f 100644 --- a/packages/dashmate/test/unit/status/scopes/core.spec.js +++ b/packages/dashmate/test/unit/status/scopes/core.spec.js @@ -78,7 +78,7 @@ describe('getCoreScopeFactory', () => { }); mockGithubProvider.returns('v1337-dev'); - mockMNOWatchProvider.returns('OPEN'); + mockMNOWatchProvider.resolves('OPEN'); mockInsightProvider.returns({ status: this.sinon.stub().returns({ info: { blocks: 1337 }, @@ -219,7 +219,7 @@ describe('getCoreScopeFactory', () => { }); mockGithubProvider.returns('v1337-dev'); - mockMNOWatchProvider.returns('OPEN'); + mockMNOWatchProvider.resolves('OPEN'); mockInsightProvider.returns({ status: this.sinon.stub().returns({ info: { blocks: 1337 }, @@ -271,7 +271,7 @@ describe('getCoreScopeFactory', () => { }); mockGithubProvider.returns(Promise.reject()); - mockMNOWatchProvider.returns(PortStateEnum.ERROR); + mockMNOWatchProvider.rejects(PortStateEnum.ERROR); mockInsightProvider.returns({ status: () => Promise.reject(), }); From b0fa337eb5f05159c8694b16ef71ff110eb4ab0e Mon Sep 17 00:00:00 2001 From: lklimek <842586+lklimek@users.noreply.github.com> Date: Sat, 19 Oct 2024 07:31:39 +0200 Subject: [PATCH 72/90] feat(sdk): detect stale nodes (#2254) --- packages/rs-dapi-client/src/dapi_client.rs | 10 +- packages/rs-dapi-client/src/lib.rs | 13 +- packages/rs-dapi-client/src/transport/grpc.rs | 5 +- packages/rs-sdk/Cargo.toml | 2 +- packages/rs-sdk/src/error.rs | 39 +- packages/rs-sdk/src/sdk.rs | 372 ++++++++++++++++-- 6 files changed, 400 insertions(+), 41 deletions(-) diff --git a/packages/rs-dapi-client/src/dapi_client.rs b/packages/rs-dapi-client/src/dapi_client.rs index 372b28bc3f..468ca39974 100644 --- a/packages/rs-dapi-client/src/dapi_client.rs +++ b/packages/rs-dapi-client/src/dapi_client.rs @@ -39,11 +39,11 @@ pub enum DapiClientError { } impl CanRetry for DapiClientError { - fn is_node_failure(&self) -> bool { + fn can_retry(&self) -> bool { use DapiClientError::*; match self { NoAvailableAddresses => false, - Transport(transport_error, _) => transport_error.is_node_failure(), + Transport(transport_error, _) => transport_error.can_retry(), AddressList(_) => false, #[cfg(feature = "mocks")] Mock(_) => false, @@ -233,7 +233,7 @@ impl DapiRequestExecutor for DapiClient { tracing::trace!(?response, "received {} response", response_name); } Err(error) => { - if error.is_node_failure() { + if !error.can_retry() { if applied_settings.ban_failed_address { let mut address_list = self .address_list @@ -264,12 +264,12 @@ impl DapiRequestExecutor for DapiClient { duration.as_secs_f32() ) }) - .when(|e| e.is_node_failure()) + .when(|e| e.can_retry()) .instrument(tracing::info_span!("request routine")) .await; if let Err(error) = &result { - if error.is_node_failure() { + if !error.can_retry() { tracing::error!(?error, "request failed"); } } diff --git a/packages/rs-dapi-client/src/lib.rs b/packages/rs-dapi-client/src/lib.rs index 976537097e..760d9ce2e7 100644 --- a/packages/rs-dapi-client/src/lib.rs +++ b/packages/rs-dapi-client/src/lib.rs @@ -71,9 +71,16 @@ impl DapiRequest for T { } } -/// Allows to flag the transport error variant how tolerant we are of it and whether we can -/// try to do a request again. +/// Returns true if the operation can be retried. pub trait CanRetry { + /// Returns true if the operation can be retried safely. + fn can_retry(&self) -> bool; + /// Get boolean flag that indicates if the error is retryable. - fn is_node_failure(&self) -> bool; + /// + /// Depreacted in favor of [CanRetry::can_retry]. + #[deprecated = "Use !can_retry() instead"] + fn is_node_failure(&self) -> bool { + !self.can_retry() + } } diff --git a/packages/rs-dapi-client/src/transport/grpc.rs b/packages/rs-dapi-client/src/transport/grpc.rs index d5180099d0..e32d6c70f0 100644 --- a/packages/rs-dapi-client/src/transport/grpc.rs +++ b/packages/rs-dapi-client/src/transport/grpc.rs @@ -117,11 +117,12 @@ impl TransportClient for CoreGrpcClient { } impl CanRetry for dapi_grpc::tonic::Status { - fn is_node_failure(&self) -> bool { + fn can_retry(&self) -> bool { let code = self.code(); use dapi_grpc::tonic::Code::*; - matches!( + + !matches!( code, Ok | DataLoss | Cancelled diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index ebf783f652..98f5dd4c02 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" [dependencies] arc-swap = { version = "1.7.1" } +chrono = { version = "0.4.38" } dpp = { path = "../rs-dpp", default-features = false, features = [ "dash-sdk-features", ] } @@ -52,7 +53,6 @@ data-contracts = { path = "../data-contracts" } tokio-test = { version = "0.4.4" } clap = { version = "4.5.4", features = ["derive"] } sanitize-filename = { version = "0.5.0" } -chrono = { version = "0.4.38" } test-case = { version = "3.3.1" } [features] diff --git a/packages/rs-sdk/src/error.rs b/packages/rs-sdk/src/error.rs index ce8b3f309a..e55bda4742 100644 --- a/packages/rs-sdk/src/error.rs +++ b/packages/rs-sdk/src/error.rs @@ -5,7 +5,7 @@ use std::time::Duration; use dapi_grpc::mock::Mockable; use dpp::version::PlatformVersionError; use dpp::ProtocolError; -use rs_dapi_client::DapiClientError; +use rs_dapi_client::{CanRetry, DapiClientError}; pub use drive_proof_verifier::error::ContextProviderError; @@ -67,6 +67,10 @@ pub enum Error { /// Operation cancelled - cancel token was triggered, timeout, etc. #[error("Operation cancelled: {0}")] Cancelled(String), + + /// Remote node is stale; try another server + #[error(transparent)] + StaleNode(#[from] StaleNodeError), } impl From> for Error { @@ -80,3 +84,36 @@ impl From for Error { Self::Protocol(value.into()) } } + +impl CanRetry for Error { + fn can_retry(&self) -> bool { + matches!(self, Error::StaleNode(..) | Error::TimeoutReached(_, _)) + } +} + +/// Server returned stale metadata +#[derive(Debug, thiserror::Error)] +pub enum StaleNodeError { + /// Server returned metadata with outdated height + #[error("received height is outdated: expected {expected_height}, received {received_height}, tolerance {tolerance_blocks}; try another server")] + Height { + /// Expected height - last block height seen by the Sdk + expected_height: u64, + /// Block height received from the server + received_height: u64, + /// Tolerance - how many blocks can be behind the expected height + tolerance_blocks: u64, + }, + /// Server returned metadata with time outside of the tolerance + #[error( + "received invalid time: expected {expected_timestamp_ms}ms, received {received_timestamp_ms} ms, tolerance {tolerance_ms} ms; try another server" + )] + Time { + /// Expected time in milliseconds - is local time when the message was received + expected_timestamp_ms: u64, + /// Time received from the server in the message, in milliseconds + received_timestamp_ms: u64, + /// Tolerance in milliseconds + tolerance_ms: u64, + }, +} diff --git a/packages/rs-sdk/src/sdk.rs b/packages/rs-sdk/src/sdk.rs index f7f938703d..2b9268f275 100644 --- a/packages/rs-sdk/src/sdk.rs +++ b/packages/rs-sdk/src/sdk.rs @@ -1,6 +1,6 @@ //! [Sdk] entrypoint to Dash Platform. -use crate::error::Error; +use crate::error::{Error, StaleNodeError}; use crate::internal_cache::InternalSdkCache; use crate::mock::MockResponse; #[cfg(feature = "mocks")] @@ -36,7 +36,8 @@ use std::fmt::Debug; use std::num::NonZeroUsize; #[cfg(feature = "mocks")] use std::path::{Path, PathBuf}; -use std::sync::Arc; +use std::sync::atomic::Ordering; +use std::sync::{atomic, Arc}; use std::time::{SystemTime, UNIX_EPOCH}; #[cfg(feature = "mocks")] use tokio::sync::{Mutex, MutexGuard}; @@ -100,6 +101,21 @@ pub struct Sdk { /// Note that setting this to None can panic. context_provider: ArcSwapOption>, + /// Last seen height; used to determine if the remote node is stale. + /// + /// This is clone-able and can be shared between threads. + metadata_last_seen_height: Arc, + + /// How many blocks difference is allowed between the last height and the current height received in metadata. + /// + /// See [SdkBuilder::with_height_tolerance] for more information. + metadata_height_tolerance: Option, + + /// How many milliseconds difference is allowed between the time received in response and current local time. + /// + /// See [SdkBuilder::with_time_tolerance] for more information. + metadata_time_tolerance_ms: Option, + /// Cancellation token; once cancelled, all pending requests should be aborted. pub(crate) cancel_token: CancellationToken, @@ -115,6 +131,9 @@ impl Clone for Sdk { internal_cache: Arc::clone(&self.internal_cache), context_provider: ArcSwapOption::new(self.context_provider.load_full()), cancel_token: self.cancel_token.clone(), + metadata_last_seen_height: Arc::clone(&self.metadata_last_seen_height), + metadata_height_tolerance: self.metadata_height_tolerance, + metadata_time_tolerance_ms: self.metadata_time_tolerance_ms, #[cfg(feature = "mocks")] dump_dir: self.dump_dir.clone(), } @@ -192,7 +211,7 @@ impl Sdk { &self, request: O::Request, response: O::Response, - ) -> Result, drive_proof_verifier::Error> + ) -> Result, Error> where O::Request: Mockable, { @@ -213,31 +232,32 @@ impl Sdk { &self, request: O::Request, response: O::Response, - ) -> Result<(Option, ResponseMetadata), drive_proof_verifier::Error> + ) -> Result<(Option, ResponseMetadata), Error> where O::Request: Mockable, { - let provider = self - .context_provider() - .ok_or(drive_proof_verifier::Error::ContextProviderNotSet)?; + let (object, metadata, _proof) = self + .parse_proof_with_metadata_and_proof(request, response) + .await?; - match self.inner { - SdkInstance::Dapi { .. } => O::maybe_from_proof_with_metadata( - request, - response, - self.network, - self.version(), - &provider, - ) - .map(|(a, b, _)| (a, b)), - #[cfg(feature = "mocks")] - SdkInstance::Mock { ref mock, .. } => { - let guard = mock.lock().await; - guard - .parse_proof_with_metadata(request, response) - .map(|(a, b, _)| (a, b)) - } - } + Ok((object, metadata)) + } + + /// Verify response metadata against the current state of the SDK. + fn verify_response_metadata(&self, metadata: &ResponseMetadata) -> Result<(), Error> { + if let Some(height_tolerance) = self.metadata_height_tolerance { + verify_metadata_height( + metadata, + height_tolerance, + Arc::clone(&(self.metadata_last_seen_height)), + )?; + }; + if let Some(time_tolerance) = self.metadata_time_tolerance_ms { + let now = chrono::Utc::now().timestamp_millis() as u64; + verify_metadata_time(metadata, now, time_tolerance)?; + }; + + Ok(()) } /// Retrieve object `O` from proof contained in `request` (of type `R`) and `response`. @@ -252,7 +272,7 @@ impl Sdk { &self, request: O::Request, response: O::Response, - ) -> Result<(Option, ResponseMetadata, Proof), drive_proof_verifier::Error> + ) -> Result<(Option, ResponseMetadata, Proof), Error> where O::Request: Mockable, { @@ -260,7 +280,7 @@ impl Sdk { .context_provider() .ok_or(drive_proof_verifier::Error::ContextProviderNotSet)?; - match self.inner { + let (object, metadata, proof) = match self.inner { SdkInstance::Dapi { .. } => O::maybe_from_proof_with_metadata( request, response, @@ -273,7 +293,10 @@ impl Sdk { let guard = mock.lock().await; guard.parse_proof_with_metadata(request, response) } - } + }?; + + self.verify_response_metadata(&metadata)?; + Ok((object, metadata, proof)) } /// Return [ContextProvider] used by the SDK. @@ -544,6 +567,105 @@ impl Sdk { } } +/// If received metadata time differs from local time by more than `tolerance`, the remote node is considered stale. +/// +/// ## Parameters +/// +/// - `metadata`: Metadata of the received response +/// - `now_ms`: Current local time in milliseconds +/// - `tolerance_ms`: Tolerance in milliseconds +fn verify_metadata_time( + metadata: &ResponseMetadata, + now_ms: u64, + tolerance_ms: u64, +) -> Result<(), Error> { + let metadata_time = metadata.time_ms; + + // metadata_time - tolerance_ms <= now_ms <= metadata_time + tolerance_ms + if now_ms.abs_diff(metadata_time) > tolerance_ms { + tracing::warn!( + expected_time = now_ms, + received_time = metadata_time, + tolerance_ms, + "received response with stale time; you should retry with another server" + ); + return Err(StaleNodeError::Time { + expected_timestamp_ms: now_ms, + received_timestamp_ms: metadata_time, + tolerance_ms, + } + .into()); + } + + tracing::trace!( + expected_time = now_ms, + received_time = metadata_time, + tolerance_ms, + "received response with valid time" + ); + Ok(()) +} + +/// If current metadata height is behind previously seen height by more than `tolerance`, the remote node +/// is considered stale. +fn verify_metadata_height( + metadata: &ResponseMetadata, + tolerance: u64, + last_seen_height: Arc, +) -> Result<(), Error> { + let mut expected_height = last_seen_height.load(Ordering::Relaxed); + let received_height = metadata.height; + + // Same height, no need to update. + if received_height == expected_height { + tracing::trace!( + expected_height, + received_height, + tolerance, + "received message has the same height as previously seen" + ); + return Ok(()); + } + + // If expected_height <= tolerance, then Sdk just started, so we just assume what we got is correct. + if expected_height > tolerance && received_height < expected_height - tolerance { + tracing::warn!( + expected_height, + received_height, + tolerance, + "received message with stale height; you should retry with another server" + ); + return Err(StaleNodeError::Height { + expected_height, + received_height, + tolerance_blocks: tolerance, + } + .into()); + } + + // New height is ahead of the last seen height, so we update the last seen height. + tracing::trace!( + expected_height = expected_height, + received_height = received_height, + tolerance, + "received message with new height" + ); + while let Err(stored_height) = last_seen_height.compare_exchange( + expected_height, + received_height, + Ordering::SeqCst, + Ordering::Relaxed, + ) { + // The value was changed to a higher value by another thread, so we need to retry. + if stored_height >= metadata.height { + break; + } + expected_height = stored_height; + } + + Ok(()) +} + #[async_trait::async_trait] impl DapiRequestExecutor for Sdk { async fn execute( @@ -605,6 +727,17 @@ pub struct SdkBuilder { /// Context provider used by the SDK. context_provider: Option>, + /// How many blocks difference is allowed between the last seen metadata height and the height received in response + /// metadata. + /// + /// See [SdkBuilder::with_height_tolerance] for more information. + metadata_height_tolerance: Option, + + /// How many milliseconds difference is allowed between the time received in response metadata and current local time. + /// + /// See [SdkBuilder::with_time_tolerance] for more information. + metadata_time_tolerance_ms: Option, + /// directory where dump files will be stored #[cfg(feature = "mocks")] dump_dir: Option, @@ -626,6 +759,8 @@ impl Default for SdkBuilder { core_user: "".to_string(), proofs: true, + metadata_height_tolerance: Some(1), + metadata_time_tolerance_ms: None, #[cfg(feature = "mocks")] data_contract_cache_size: NonZeroUsize::new(DEFAULT_CONTRACT_CACHE_SIZE) @@ -750,6 +885,41 @@ impl SdkBuilder { self } + /// Change number of blocks difference allowed between the last height and the height received in current response. + /// + /// If height received in response metadata is behind previously seen height by more than this value, the node + /// is considered stale, and the request will fail. + /// + /// If None, the height is not checked. + /// + /// Note that this feature doesn't guarantee that you are getting latest data, but it significantly decreases + /// probability of getting old data. + /// + /// This is set to `1` by default. + pub fn with_height_tolerance(mut self, tolerance: Option) -> Self { + self.metadata_height_tolerance = tolerance; + self + } + + /// How many milliseconds difference is allowed between the time received in response and current local time. + /// If the received time differs from local time by more than this value, the remote node is stale. + /// + /// If None, the time is not checked. + /// + /// This is set to `None` by default. + /// + /// Note that enabling this check can cause issues if the local time is not synchronized with the network time, + /// when the network is stalled or time between blocks increases significantly. + /// + /// Selecting a safe value for this parameter depends on maximum time between blocks mined on the network. + /// For example, if the network is configured to mine a block every maximum 3 minutes, setting this value + /// to a bit more than 6 minutes (to account for misbehaving proposers, network delays and local time + /// synchronization issues) should be safe. + pub fn with_time_tolerance(mut self, tolerance_ms: Option) -> Self { + self.metadata_time_tolerance_ms = tolerance_ms; + self + } + /// Configure directory where dumps of all requests and responses will be saved. /// Useful for debugging. /// @@ -792,9 +962,13 @@ impl SdkBuilder { proofs:self.proofs, context_provider: ArcSwapOption::new( self.context_provider.map(Arc::new)), cancel_token: self.cancel_token, + internal_cache: Default::default(), + // Note: in future, we need to securely initialize initial height during Sdk bootstrap or first request. + metadata_last_seen_height: Arc::new(atomic::AtomicU64::new(0)), + metadata_height_tolerance: self.metadata_height_tolerance, + metadata_time_tolerance_ms: self.metadata_time_tolerance_ms, #[cfg(feature = "mocks")] dump_dir: self.dump_dir, - internal_cache: Default::default(), }; // if context provider is not set correctly (is None), it means we need to fallback to core wallet if sdk.context_provider.load().is_none() { @@ -850,13 +1024,15 @@ impl SdkBuilder { mock:mock_sdk.clone(), dapi, version:self.version, - }, dump_dir: self.dump_dir.clone(), proofs:self.proofs, internal_cache: Default::default(), context_provider:ArcSwapAny::new( Some(Arc::new(context_provider))), cancel_token: self.cancel_token, + metadata_last_seen_height: Arc::new(atomic::AtomicU64::new(0)), + metadata_height_tolerance: self.metadata_height_tolerance, + metadata_time_tolerance_ms: self.metadata_time_tolerance_ms, }; let mut guard = mock_sdk.try_lock().expect("mock sdk is in use by another thread and connot be reconfigured"); guard.set_sdk(sdk.clone()); @@ -902,3 +1078,141 @@ pub fn prettify_proof(proof: &Proof) -> String { proof.quorum_type, ) } + +#[cfg(test)] +mod test { + use std::sync::Arc; + + use dapi_grpc::platform::v0::ResponseMetadata; + use test_case::test_matrix; + + use crate::SdkBuilder; + + #[test_matrix(97..102, 100, 2, false; "valid height")] + #[test_case(103, 100, 2, true; "invalid height")] + fn test_verify_metadata_height( + expected_height: u64, + received_height: u64, + tolerance: u64, + expect_err: bool, + ) { + let metadata = ResponseMetadata { + height: received_height, + ..Default::default() + }; + + let last_seen_height = + std::sync::Arc::new(std::sync::atomic::AtomicU64::new(expected_height)); + + let result = + super::verify_metadata_height(&metadata, tolerance, Arc::clone(&last_seen_height)); + + assert_eq!(result.is_err(), expect_err); + if result.is_ok() { + assert_eq!( + last_seen_height.load(std::sync::atomic::Ordering::Relaxed), + received_height, + "previous height should be updated" + ); + } + } + + #[test] + fn cloned_sdk_verify_metadata_height() { + let sdk1 = SdkBuilder::new_mock() + .build() + .expect("mock Sdk should be created"); + + // First message verified, height 1. + let metadata = ResponseMetadata { + height: 1, + ..Default::default() + }; + + sdk1.verify_response_metadata(&metadata) + .expect("metadata should be valid"); + + assert_eq!( + sdk1.metadata_last_seen_height + .load(std::sync::atomic::Ordering::Relaxed), + metadata.height, + "initial height" + ); + + // now, we clone sdk and do two requests. + let sdk2 = sdk1.clone(); + let sdk3 = sdk1.clone(); + + // Second message verified, height 2. + let metadata = ResponseMetadata { + height: 2, + ..Default::default() + }; + sdk2.verify_response_metadata(&metadata) + .expect("metadata should be valid"); + + assert_eq!( + sdk1.metadata_last_seen_height + .load(std::sync::atomic::Ordering::Relaxed), + metadata.height, + "first sdk should see height from second sdk" + ); + assert_eq!( + sdk3.metadata_last_seen_height + .load(std::sync::atomic::Ordering::Relaxed), + metadata.height, + "third sdk should see height from second sdk" + ); + + // Third message verified, height 3. + let metadata = ResponseMetadata { + height: 3, + ..Default::default() + }; + sdk3.verify_response_metadata(&metadata) + .expect("metadata should be valid"); + + assert_eq!( + sdk1.metadata_last_seen_height + .load(std::sync::atomic::Ordering::Relaxed), + metadata.height, + "first sdk should see height from third sdk" + ); + + assert_eq!( + sdk2.metadata_last_seen_height + .load(std::sync::atomic::Ordering::Relaxed), + metadata.height, + "second sdk should see height from third sdk" + ); + + // Now, using sdk1 for height 1 again should fail, as we are already at 3, with default tolerance 1. + let metadata = ResponseMetadata { + height: 1, + ..Default::default() + }; + + sdk1.verify_response_metadata(&metadata) + .expect_err("metadata should be invalid"); + } + + #[test_matrix([90,91,100,109,110], 100, 10, false; "valid time")] + #[test_matrix([0,89,111], 100, 10, true; "invalid time")] + #[test_matrix([0,100], [0,100], 100, false; "zero time")] + #[test_matrix([99,101], 100, 0, true; "zero tolerance")] + fn test_verify_metadata_time( + received_time: u64, + now_time: u64, + tolerance: u64, + expect_err: bool, + ) { + let metadata = ResponseMetadata { + time_ms: received_time, + ..Default::default() + }; + + let result = super::verify_metadata_time(&metadata, now_time, tolerance); + + assert_eq!(result.is_err(), expect_err); + } +} From a2034fd7a1727cc5ce9ac7f72798ab93c8366bd6 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 19 Oct 2024 15:28:21 +0700 Subject: [PATCH 73/90] feat(dashmate): add protocol version to the status command (#2255) --- .../dashmate/src/commands/status/platform.js | 6 ++ .../dashmate/src/status/scopes/platform.js | 17 ++++- .../test/unit/status/scopes/platform.spec.js | 69 ++++++++++++++++++- 3 files changed, 87 insertions(+), 5 deletions(-) diff --git a/packages/dashmate/src/commands/status/platform.js b/packages/dashmate/src/commands/status/platform.js index 4f6eba5fbb..17abfcdf1e 100644 --- a/packages/dashmate/src/commands/status/platform.js +++ b/packages/dashmate/src/commands/status/platform.js @@ -47,6 +47,8 @@ export default class PlatformStatusCommand extends ConfigBaseCommand { 'Drive Service Status': 'n/a', 'Network': 'n/a', 'Tenderdash Version': 'n/a', + 'Protocol Version': 'n/a', + 'Desired Protocol Version': 'n/a', 'Block height': 'n/a', 'Peer count': 'n/a', 'App hash': 'n/a', @@ -92,6 +94,8 @@ export default class PlatformStatusCommand extends ConfigBaseCommand { if (tenderdash.version) { const { version: tenderdashVersion, + protocolVersion, + desiredProtocolVersion, latestBlockHeight: platformBlockHeight, latestAppHash: platformLatestAppHash, peers: platformPeers, @@ -100,6 +104,8 @@ export default class PlatformStatusCommand extends ConfigBaseCommand { plain['Network'] = tenderdashNetwork || 'n/a'; plain['Tenderdash Version'] = tenderdashVersion || 'n/a'; + plain['Protocol Version'] = protocolVersion || 'n/a'; + plain['Desired Protocol Version'] = desiredProtocolVersion || 'n/a'; plain['Block height'] = platformBlockHeight || 'n/a'; plain['Peer count'] = platformPeers || 'n/a'; plain['App hash'] = platformLatestAppHash || 'n/a'; diff --git a/packages/dashmate/src/status/scopes/platform.js b/packages/dashmate/src/status/scopes/platform.js index 09f65ebaff..c3fe48d8e8 100644 --- a/packages/dashmate/src/status/scopes/platform.js +++ b/packages/dashmate/src/status/scopes/platform.js @@ -53,6 +53,8 @@ export default function getPlatformScopeFactory( dockerStatus: null, serviceStatus: null, version: null, + protocolVersion: null, + desiredProtocolVersion: null, listening: null, catchingUp: null, latestBlockHash: null, @@ -110,14 +112,20 @@ export default function getPlatformScopeFactory( const port = config.get('platform.drive.tenderdash.rpc.port'); - const [tenderdashStatusResponse, tenderdashNetInfoResponse] = await Promise.all([ + const [ + tenderdashStatusResponse, + tenderdashNetInfoResponse, + tenderdashAbciInfoResponse, + ] = await Promise.all([ fetch(`http://${tenderdashHost}:${port}/status`), fetch(`http://${tenderdashHost}:${port}/net_info`), + fetch(`http://${tenderdashHost}:${port}/abci_info`), ]); - const [tenderdashStatus, tenderdashNetInfo] = await Promise.all([ + const [tenderdashStatus, tenderdashNetInfo, tenderdashAbciInfo] = await Promise.all([ tenderdashStatusResponse.json(), tenderdashNetInfoResponse.json(), + tenderdashAbciInfoResponse.json(), ]); const { version, network, moniker } = tenderdashStatus.node_info; @@ -136,6 +144,8 @@ export default function getPlatformScopeFactory( } info.version = version; + info.protocolVersion = parseInt(tenderdashStatus.node_info.protocol_version.app, 10); + info.desiredProtocolVersion = tenderdashAbciInfo.response.app_version; info.listening = listening; info.latestBlockHeight = latestBlockHeight; info.latestBlockTime = latestBlockTime; @@ -248,6 +258,8 @@ export default function getPlatformScopeFactory( dockerStatus: null, serviceStatus: null, version: null, + protocolVersion: null, + desiredProtocolVersion: null, listening: null, catchingUp: null, latestBlockHash: null, @@ -261,6 +273,7 @@ export default function getPlatformScopeFactory( drive: { dockerStatus: null, serviceStatus: null, + version: null, }, }; diff --git a/packages/dashmate/test/unit/status/scopes/platform.spec.js b/packages/dashmate/test/unit/status/scopes/platform.spec.js index fc8bc8bf1c..14f0d88cff 100644 --- a/packages/dashmate/test/unit/status/scopes/platform.spec.js +++ b/packages/dashmate/test/unit/status/scopes/platform.spec.js @@ -80,6 +80,11 @@ describe('getPlatformScopeFactory', () => { const mockStatus = { node_info: { + protocol_version: { + p2p: '10', + block: '14', + app: '3', + }, version: '0', network: 'test', moniker: 'test', @@ -94,6 +99,15 @@ describe('getPlatformScopeFactory', () => { }; const mockNetInfo = { n_peers: 6, listening: true }; + const mockAbciInfo = { + response: { + version: '1.4.1', + app_version: 4, + last_block_height: 90, + last_block_app_hash: 's0CySQxgRg96DrnJ7HCsql+k/Sk4JiT3y0psCaUI3TI=', + }, + }; + const expectedScope = { platformActivation: 'Activated (at height 1337)', coreIsSynced: true, @@ -109,6 +123,8 @@ describe('getPlatformScopeFactory', () => { p2pPortState: PortStateEnum.OPEN, dockerStatus: DockerStatusEnum.running, serviceStatus: ServiceStatusEnum.up, + protocolVersion: 3, + desiredProtocolVersion: 4, version: '0', listening: true, catchingUp: false, @@ -131,7 +147,9 @@ describe('getPlatformScopeFactory', () => { .onFirstCall() .returns(Promise.resolve({ json: () => Promise.resolve(mockStatus) })) .onSecondCall() - .returns(Promise.resolve({ json: () => Promise.resolve(mockNetInfo) })); + .returns(Promise.resolve({ json: () => Promise.resolve(mockNetInfo) })) + .onThirdCall() + .resolves({ json: () => Promise.resolve(mockAbciInfo) }); mockMNOWatchProvider.returns(Promise.resolve('OPEN')); const scope = await getPlatformScope(config); @@ -155,6 +173,11 @@ describe('getPlatformScopeFactory', () => { const mockStatus = { node_info: { + protocol_version: { + p2p: '10', + block: '14', + app: '3', + }, version: '0', network: 'test', moniker: 'test', @@ -169,6 +192,15 @@ describe('getPlatformScopeFactory', () => { }; const mockNetInfo = { n_peers: 6, listening: true }; + const mockAbciInfo = { + response: { + version: '1.4.1', + app_version: 4, + last_block_height: 90, + last_block_app_hash: 's0CySQxgRg96DrnJ7HCsql+k/Sk4JiT3y0psCaUI3TI=', + }, + }; + const expectedScope = { platformActivation: 'Activated (at height 1337)', coreIsSynced: true, @@ -185,6 +217,8 @@ describe('getPlatformScopeFactory', () => { dockerStatus: DockerStatusEnum.running, serviceStatus: ServiceStatusEnum.syncing, version: '0', + protocolVersion: 3, + desiredProtocolVersion: 4, listening: true, catchingUp: true, latestBlockHash: 'DEADBEEF', @@ -206,7 +240,9 @@ describe('getPlatformScopeFactory', () => { .onFirstCall() .returns(Promise.resolve({ json: () => Promise.resolve(mockStatus) })) .onSecondCall() - .returns(Promise.resolve({ json: () => Promise.resolve(mockNetInfo) })); + .returns(Promise.resolve({ json: () => Promise.resolve(mockNetInfo) })) + .onThirdCall() + .resolves({ json: () => Promise.resolve(mockAbciInfo) }); mockMNOWatchProvider.returns(Promise.resolve('OPEN')); const scope = await getPlatformScope(config); @@ -238,6 +274,8 @@ describe('getPlatformScopeFactory', () => { dockerStatus: null, serviceStatus: null, version: null, + protocolVersion: null, + desiredProtocolVersion: null, listening: null, catchingUp: null, latestBlockHash: null, @@ -251,6 +289,7 @@ describe('getPlatformScopeFactory', () => { drive: { dockerStatus: null, serviceStatus: null, + version: null, }, }; @@ -290,6 +329,8 @@ describe('getPlatformScopeFactory', () => { dockerStatus: DockerStatusEnum.running, serviceStatus: ServiceStatusEnum.wait_for_core, version: null, + protocolVersion: null, + desiredProtocolVersion: null, listening: null, catchingUp: null, latestBlockHash: null, @@ -347,6 +388,8 @@ describe('getPlatformScopeFactory', () => { dockerStatus: DockerStatusEnum.running, serviceStatus: ServiceStatusEnum.error, version: null, + protocolVersion: null, + desiredProtocolVersion: null, listening: null, catchingUp: null, latestBlockHash: null, @@ -393,6 +436,11 @@ describe('getPlatformScopeFactory', () => { const mockStatus = { node_info: { + protocol_version: { + p2p: '10', + block: '14', + app: '3', + }, version: '0', network: 'test', moniker: 'test', @@ -407,11 +455,22 @@ describe('getPlatformScopeFactory', () => { }; const mockNetInfo = { n_peers: 6, listening: true }; + const mockAbciInfo = { + response: { + version: '1.4.1', + app_version: 4, + last_block_height: 90, + last_block_app_hash: 's0CySQxgRg96DrnJ7HCsql+k/Sk4JiT3y0psCaUI3TI=', + }, + }; + mockFetch .onFirstCall() .returns(Promise.resolve({ json: () => Promise.resolve(mockStatus) })) .onSecondCall() - .returns(Promise.resolve({ json: () => Promise.resolve(mockNetInfo) })); + .returns(Promise.resolve({ json: () => Promise.resolve(mockNetInfo) })) + .onThirdCall() + .resolves({ json: () => Promise.resolve(mockAbciInfo) }); const expectedScope = { platformActivation: 'Activated (at height 1337)', @@ -429,6 +488,8 @@ describe('getPlatformScopeFactory', () => { dockerStatus: DockerStatusEnum.running, serviceStatus: ServiceStatusEnum.up, version: '0', + protocolVersion: 3, + desiredProtocolVersion: 4, listening: true, catchingUp: false, latestBlockHash: 'DEADBEEF', @@ -485,6 +546,8 @@ describe('getPlatformScopeFactory', () => { dockerStatus: DockerStatusEnum.running, serviceStatus: ServiceStatusEnum.error, version: null, + protocolVersion: null, + desiredProtocolVersion: null, listening: null, catchingUp: null, latestBlockHash: null, From 93425cf0592e71f9c0bf7a109a19fed34e849f85 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 22 Oct 2024 12:43:18 +0700 Subject: [PATCH 74/90] fix(sdk): opposite retry trigger (#2265) --- packages/rs-dapi-client/src/dapi_client.rs | 2 +- packages/rs-dapi-client/src/transport/grpc.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/rs-dapi-client/src/dapi_client.rs b/packages/rs-dapi-client/src/dapi_client.rs index 468ca39974..b352cba2c1 100644 --- a/packages/rs-dapi-client/src/dapi_client.rs +++ b/packages/rs-dapi-client/src/dapi_client.rs @@ -233,7 +233,7 @@ impl DapiRequestExecutor for DapiClient { tracing::trace!(?response, "received {} response", response_name); } Err(error) => { - if !error.can_retry() { + if error.can_retry() { if applied_settings.ban_failed_address { let mut address_list = self .address_list diff --git a/packages/rs-dapi-client/src/transport/grpc.rs b/packages/rs-dapi-client/src/transport/grpc.rs index e32d6c70f0..fc98d63296 100644 --- a/packages/rs-dapi-client/src/transport/grpc.rs +++ b/packages/rs-dapi-client/src/transport/grpc.rs @@ -122,7 +122,7 @@ impl CanRetry for dapi_grpc::tonic::Status { use dapi_grpc::tonic::Code::*; - !matches!( + matches!( code, Ok | DataLoss | Cancelled From 24de2352d0872536a4857eca565004585d0d9a0d Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Wed, 23 Oct 2024 12:45:51 +0700 Subject: [PATCH 75/90] refactor: platform version refactoring into sub versions (#2269) --- .../find_identifier_and_binary_paths/mod.rs | 2 +- .../rs-dpp/src/data_contract/factory/mod.rs | 3 +- .../src/document/document_factory/mod.rs | 6 +- .../specialized_document_factory/mod.rs | 6 +- .../src/attribute.rs | 3 - .../src/version/dpp_versions.rs | 281 ---- .../dpp_asset_lock_versions/mod.rs | 8 + .../dpp_asset_lock_versions/v1.rs | 10 + .../dpp_versions/dpp_contract_versions/mod.rs | 74 + .../dpp_versions/dpp_contract_versions/v1.rs | 54 + .../dpp_versions/dpp_costs_versions/mod.rs | 8 + .../dpp_versions/dpp_costs_versions/v1.rs | 5 + .../dpp_versions/dpp_document_versions/mod.rs | 23 + .../dpp_versions/dpp_document_versions/v1.rs | 31 + .../dpp_versions/dpp_factory_versions/mod.rs | 9 + .../dpp_versions/dpp_factory_versions/v1.rs | 6 + .../dpp_versions/dpp_identity_versions/mod.rs | 17 + .../dpp_versions/dpp_identity_versions/v1.rs | 12 + .../dpp_versions/dpp_method_versions/mod.rs | 9 + .../dpp_versions/dpp_method_versions/v1.rs | 5 + .../mod.rs | 12 + .../v1.rs | 9 + .../v2.rs | 9 + .../mod.rs | 18 + .../v1.rs | 15 + .../mod.rs | 29 + .../v1.rs | 105 ++ .../dpp_state_transition_versions/mod.rs | 46 + .../dpp_state_transition_versions/v1.rs | 29 + .../dpp_state_transition_versions/v2.rs | 29 + .../dpp_validation_versions/mod.rs | 47 + .../dpp_validation_versions/v1.rs | 31 + .../dpp_validation_versions/v2.rs | 31 + .../dpp_versions/dpp_voting_versions/mod.rs | 11 + .../dpp_versions/dpp_voting_versions/v1.rs | 7 + .../dpp_versions/dpp_voting_versions/v2.rs | 7 + .../src/version/dpp_versions/mod.rs | 45 + .../src/version/drive_abci_versions.rs | 362 ----- .../drive_abci_method_versions/mod.rs | 166 ++ .../drive_abci_method_versions/v1.rs | 121 ++ .../drive_abci_method_versions/v2.rs | 122 ++ .../drive_abci_method_versions/v3.rs | 121 ++ .../drive_abci_query_versions/mod.rs | 68 + .../drive_abci_query_versions/v1.rs | 168 +++ .../drive_abci_structure_versions/mod.rs | 13 + .../drive_abci_structure_versions/v1.rs | 11 + .../drive_abci_validation_versions/mod.rs | 115 ++ .../drive_abci_validation_versions/v1.rs | 146 ++ .../drive_abci_validation_versions/v2.rs | 146 ++ .../drive_abci_validation_versions/v3.rs | 146 ++ .../drive_abci_withdrawal_constants/mod.rs | 8 + .../drive_abci_withdrawal_constants/v1.rs | 7 + .../drive_abci_withdrawal_constants/v2.rs | 7 + .../src/version/drive_abci_versions/mod.rs | 19 + .../src/version/drive_versions.rs | 756 ---------- .../drive_contract_method_versions/mod.rs | 59 + .../drive_contract_method_versions/v1.rs | 33 + .../drive_credit_pool_method_versions/mod.rs | 49 + .../drive_credit_pool_method_versions/v1.rs | 41 + .../drive_document_method_versions/mod.rs | 90 ++ .../drive_document_method_versions/v1.rs | 72 + .../drive_grove_method_versions/mod.rs | 66 + .../drive_grove_method_versions/v1.rs | 54 + .../drive_identity_method_versions/mod.rs | 199 +++ .../drive_identity_method_versions/v1.rs | 151 ++ .../mod.rs | 39 + .../v1.rs | 36 + .../drive_structure_version/mod.rs | 10 + .../drive_structure_version/v1.rs | 20 + .../drive_verify_method_versions/mod.rs | 76 + .../drive_verify_method_versions/v1.rs | 57 + .../drive_vote_method_versions/mod.rs | 56 + .../drive_vote_method_versions/v1.rs | 38 + .../drive_vote_method_versions/v2.rs | 38 + .../src/version/drive_versions/mod.rs | 161 ++ .../src/version/drive_versions/v1.rs | 100 ++ .../src/version/drive_versions/v2.rs | 100 ++ .../src/version/mocks/v2_test.rs | 1104 +------------- .../src/version/mocks/v3_test.rs | 1232 +-------------- .../rs-platform-version/src/version/mod.rs | 4 +- .../src/version/protocol_version.rs | 12 +- .../mod.rs} | 2 + .../system_data_contract_versions/v1.rs | 10 + .../{limits.rs => system_limits/mod.rs} | 2 + .../src/version/system_limits/v1.rs | 11 + .../rs-platform-version/src/version/v1.rs | 1343 +---------------- .../rs-platform-version/src/version/v2.rs | 1343 +---------------- .../rs-platform-version/src/version/v3.rs | 1342 +--------------- .../rs-platform-version/src/version/v4.rs | 1341 +--------------- 89 files changed, 4019 insertions(+), 8826 deletions(-) delete mode 100644 packages/rs-platform-version/src/version/dpp_versions.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_asset_lock_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_asset_lock_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_costs_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_costs_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_document_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_document_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_factory_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_factory_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_identity_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_identity_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_method_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_method_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/v2.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_method_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_method_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_serialization_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_serialization_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_versions/v2.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v2.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_voting_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_voting_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_voting_versions/v2.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/mod.rs delete mode 100644 packages/rs-platform-version/src/version/drive_abci_versions.rs create mode 100644 packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v2.rs create mode 100644 packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v3.rs create mode 100644 packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_structure_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_structure_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v2.rs create mode 100644 packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v3.rs create mode 100644 packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_withdrawal_constants/mod.rs create mode 100644 packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_withdrawal_constants/v1.rs create mode 100644 packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_withdrawal_constants/v2.rs create mode 100644 packages/rs-platform-version/src/version/drive_abci_versions/mod.rs delete mode 100644 packages/rs-platform-version/src/version/drive_versions.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_contract_method_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_contract_method_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_credit_pool_method_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_credit_pool_method_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_grove_method_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_grove_method_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_identity_method_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_identity_method_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_state_transition_method_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_state_transition_method_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_structure_version/mod.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_structure_version/v1.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_verify_method_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_verify_method_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_vote_method_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_vote_method_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_vote_method_versions/v2.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/v2.rs rename packages/rs-platform-version/src/version/{contracts.rs => system_data_contract_versions/mod.rs} (95%) create mode 100644 packages/rs-platform-version/src/version/system_data_contract_versions/v1.rs rename packages/rs-platform-version/src/version/{limits.rs => system_limits/mod.rs} (96%) create mode 100644 packages/rs-platform-version/src/version/system_limits/v1.rs diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/find_identifier_and_binary_paths/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/find_identifier_and_binary_paths/mod.rs index a8f97466e7..ccd1e64fed 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/find_identifier_and_binary_paths/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/find_identifier_and_binary_paths/mod.rs @@ -1,9 +1,9 @@ use crate::data_contract::document_type::property::DocumentProperty; use crate::data_contract::document_type::v0::DocumentTypeV0; use crate::data_contract::document_type::DocumentType; -use crate::version::dpp_versions::DocumentTypeVersions; use crate::ProtocolError; use indexmap::IndexMap; +use platform_version::version::dpp_versions::dpp_contract_versions::DocumentTypeVersions; use std::collections::BTreeSet; mod v0; diff --git a/packages/rs-dpp/src/data_contract/factory/mod.rs b/packages/rs-dpp/src/data_contract/factory/mod.rs index ff3a11ec2e..0953489760 100644 --- a/packages/rs-dpp/src/data_contract/factory/mod.rs +++ b/packages/rs-dpp/src/data_contract/factory/mod.rs @@ -39,7 +39,8 @@ impl DataContractFactory { pub fn new(protocol_version: u32) -> Result { let platform_version = PlatformVersion::get(protocol_version)?; match platform_version - .platform_architecture + .dpp + .factory_versions .data_contract_factory_structure_version { 0 => Ok(DataContractFactoryV0::new(protocol_version).into()), diff --git a/packages/rs-dpp/src/document/document_factory/mod.rs b/packages/rs-dpp/src/document/document_factory/mod.rs index b026e80551..75db720fd5 100644 --- a/packages/rs-dpp/src/document/document_factory/mod.rs +++ b/packages/rs-dpp/src/document/document_factory/mod.rs @@ -42,7 +42,8 @@ impl DocumentFactory { pub fn new(protocol_version: u32) -> Result { let platform_version = PlatformVersion::get(protocol_version)?; match platform_version - .platform_architecture + .dpp + .factory_versions .document_factory_structure_version { 0 => Ok(DocumentFactoryV0::new(protocol_version).into()), @@ -60,7 +61,8 @@ impl DocumentFactory { ) -> Result { let platform_version = PlatformVersion::get(protocol_version)?; match platform_version - .platform_architecture + .dpp + .factory_versions .document_factory_structure_version { 0 => Ok(DocumentFactoryV0::new_with_entropy_generator( diff --git a/packages/rs-dpp/src/document/specialized_document_factory/mod.rs b/packages/rs-dpp/src/document/specialized_document_factory/mod.rs index 2e8cd371cd..8a9c438804 100644 --- a/packages/rs-dpp/src/document/specialized_document_factory/mod.rs +++ b/packages/rs-dpp/src/document/specialized_document_factory/mod.rs @@ -42,7 +42,8 @@ impl SpecializedDocumentFactory { pub fn new(protocol_version: u32, data_contract: DataContract) -> Result { let platform_version = PlatformVersion::get(protocol_version)?; match platform_version - .platform_architecture + .dpp + .factory_versions .document_factory_structure_version { 0 => Ok(SpecializedDocumentFactoryV0::new(protocol_version, data_contract).into()), @@ -61,7 +62,8 @@ impl SpecializedDocumentFactory { ) -> Result { let platform_version = PlatformVersion::get(protocol_version)?; match platform_version - .platform_architecture + .dpp + .factory_versions .document_factory_structure_version { 0 => Ok(SpecializedDocumentFactoryV0::new_with_entropy_generator( diff --git a/packages/rs-platform-serialization-derive/src/attribute.rs b/packages/rs-platform-serialization-derive/src/attribute.rs index d908a7c165..3b873607cd 100644 --- a/packages/rs-platform-serialization-derive/src/attribute.rs +++ b/packages/rs-platform-serialization-derive/src/attribute.rs @@ -5,7 +5,6 @@ use virtue::utils::{parse_tagged_attribute, ParsedAttribute}; pub struct ContainerAttributes { pub crate_name: String, pub untagged: bool, - pub unversioned: bool, pub bounds: Option<(String, Literal)>, pub decode_bounds: Option<(String, Literal)>, pub borrow_decode_bounds: Option<(String, Literal)>, @@ -16,7 +15,6 @@ impl Default for ContainerAttributes { fn default() -> Self { Self { crate_name: "::platform_serialization".to_string(), - unversioned: false, untagged: false, bounds: None, decode_bounds: None, @@ -111,7 +109,6 @@ impl FromAttribute for ContainerAttributes { pub struct FieldAttributes { pub with_serde: bool, pub with_platform_version: bool, - pub platform_version_path_bounds: String, } impl FromAttribute for FieldAttributes { diff --git a/packages/rs-platform-version/src/version/dpp_versions.rs b/packages/rs-platform-version/src/version/dpp_versions.rs deleted file mode 100644 index 713f9dc54a..0000000000 --- a/packages/rs-platform-version/src/version/dpp_versions.rs +++ /dev/null @@ -1,281 +0,0 @@ -use crate::version::{FeatureVersion, FeatureVersionBounds}; - -#[derive(Clone, Debug, Default)] -pub struct DPPVersion { - pub costs: CostVersions, - pub validation: DPPValidationVersions, - // TODO: Should be split by state transition type - pub state_transition_serialization_versions: StateTransitionSerializationVersions, - pub state_transition_conversion_versions: StateTransitionConversionVersions, - pub state_transition_method_versions: StateTransitionMethodVersions, - pub state_transitions: StateTransitionVersions, - pub contract_versions: ContractVersions, - pub document_versions: DocumentVersions, - pub identity_versions: IdentityVersions, - pub voting_versions: VotingVersions, - pub asset_lock_versions: AssetLockVersions, - pub methods: DPPMethodVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct StateTransitionVersions { - pub documents: DocumentTransitionVersions, - pub identities: IdentityTransitionVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct IdentityTransitionVersions { - pub max_public_keys_in_creation: u16, - pub asset_locks: IdentityTransitionAssetLockVersions, - pub credit_withdrawal: IdentityCreditWithdrawalTransitionVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct IdentityCreditWithdrawalTransitionVersions { - pub default_constructor: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct IdentityTransitionAssetLockVersions { - pub required_asset_lock_duff_balance_for_processing_start_for_identity_create: u64, - pub required_asset_lock_duff_balance_for_processing_start_for_identity_top_up: u64, - pub validate_asset_lock_transaction_structure: FeatureVersion, - pub validate_instant_asset_lock_proof_structure: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DocumentTransitionVersions { - pub documents_batch_transition: DocumentsBatchTransitionVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DocumentsBatchTransitionVersions { - pub validation: DocumentsBatchTransitionValidationVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DocumentsBatchTransitionValidationVersions { - pub find_duplicates_by_id: FeatureVersion, - pub validate_base_structure: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct CostVersions { - pub signature_verify: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DPPValidationVersions { - pub json_schema_validator: JsonSchemaValidatorVersions, - pub data_contract: DataContractValidationVersions, - pub document_type: DocumentTypeValidationVersions, - pub voting: VotingValidationVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DataContractValidationVersions { - pub validate: FeatureVersion, - pub validate_config_update: FeatureVersion, - pub validate_index_definitions: FeatureVersion, - pub validate_index_naming_duplicates: FeatureVersion, - pub validate_not_defined_properties: FeatureVersion, - pub validate_property_definition: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct VotingValidationVersions { - /// How long do we allow other contenders to join a contest after the first contender - pub allow_other_contenders_time_mainnet_ms: u64, - /// How long do we allow other contenders to join a contest after the first contender in a testing environment - pub allow_other_contenders_time_testing_ms: u64, - /// How many votes do we allow from the same masternode? - pub votes_allowed_per_masternode: u16, -} - -#[derive(Clone, Debug, Default)] -pub struct DocumentTypeValidationVersions { - pub validate_update: FeatureVersion, - pub unique_index_limit: u16, - pub contested_index_limit: u16, -} - -#[derive(Clone, Debug, Default)] -pub struct JsonSchemaValidatorVersions { - pub new: FeatureVersion, - pub validate: FeatureVersion, - pub compile: FeatureVersion, - pub compile_and_validate: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct StateTransitionMethodVersions { - pub public_key_in_creation_methods: PublicKeyInCreationMethodVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct PublicKeyInCreationMethodVersions { - pub from_public_key_signed_with_private_key: FeatureVersion, - pub from_public_key_signed_external: FeatureVersion, - pub hash: FeatureVersion, - pub duplicated_key_ids_witness: FeatureVersion, - pub duplicated_keys_witness: FeatureVersion, - pub validate_identity_public_keys_structure: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct StateTransitionConversionVersions { - pub identity_to_identity_create_transition: FeatureVersion, - pub identity_to_identity_top_up_transition: FeatureVersion, - pub identity_to_identity_withdrawal_transition: FeatureVersion, - pub identity_to_identity_create_transition_with_signer: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct StateTransitionSerializationVersions { - pub identity_public_key_in_creation: FeatureVersionBounds, - pub identity_create_state_transition: FeatureVersionBounds, - pub identity_update_state_transition: FeatureVersionBounds, - pub identity_top_up_state_transition: FeatureVersionBounds, - pub identity_credit_withdrawal_state_transition: FeatureVersionBounds, - pub identity_credit_transfer_state_transition: FeatureVersionBounds, - pub masternode_vote_state_transition: FeatureVersionBounds, - pub contract_create_state_transition: FeatureVersionBounds, - pub contract_update_state_transition: FeatureVersionBounds, - pub documents_batch_state_transition: FeatureVersionBounds, - pub document_base_state_transition: FeatureVersionBounds, - pub document_create_state_transition: DocumentFeatureVersionBounds, - pub document_replace_state_transition: DocumentFeatureVersionBounds, - pub document_delete_state_transition: DocumentFeatureVersionBounds, - pub document_transfer_state_transition: DocumentFeatureVersionBounds, - pub document_update_price_state_transition: DocumentFeatureVersionBounds, - pub document_purchase_state_transition: DocumentFeatureVersionBounds, -} - -#[derive(Clone, Debug, Default)] -pub struct DocumentFeatureVersionBounds { - pub bounds: FeatureVersionBounds, -} - -#[derive(Clone, Debug, Default)] -pub struct ContractVersions { - /// The maximum that we can store a data contract in the state. There is a possibility that a client - /// sends a state transition serialized in a specific version and that the system re-serializes it - /// to the current version, and in so doing increases it's size. - pub max_serialized_size: u32, - /// This is how we serialize and deserialize a contract - pub contract_serialization_version: FeatureVersionBounds, - /// This is the structure of the Contract as it is defined for code paths - pub contract_structure_version: FeatureVersion, - pub created_data_contract_structure: FeatureVersion, - pub config: FeatureVersion, - pub methods: DataContractMethodVersions, - pub document_type_versions: DocumentTypeVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DataContractMethodVersions { - pub validate_document: FeatureVersion, - pub validate_update: FeatureVersion, - pub schema: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DocumentTypeClassMethodVersions { - pub try_from_schema: FeatureVersion, - pub create_document_types_from_document_schemas: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DocumentTypeIndexVersions { - pub index_levels_from_indices: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DocumentTypeVersions { - pub index_versions: DocumentTypeIndexVersions, - pub class_method_versions: DocumentTypeClassMethodVersions, - /// This is for the overall structure of the document type, like DocumentTypeV0 - pub structure_version: FeatureVersion, - pub schema: DocumentTypeSchemaVersions, - pub methods: DocumentTypeMethodVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DocumentTypeMethodVersions { - pub create_document_from_data: FeatureVersion, - pub create_document_with_prevalidated_properties: FeatureVersion, - pub prefunded_voting_balance_for_document: FeatureVersion, - pub contested_vote_poll_for_document: FeatureVersion, - pub estimated_size: FeatureVersion, - pub index_for_types: FeatureVersion, - pub max_size: FeatureVersion, - pub serialize_value_for_key: FeatureVersion, - pub deserialize_value_for_key: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DocumentTypeSchemaVersions { - pub enrich_with_base_schema: FeatureVersion, - pub find_identifier_and_binary_paths: FeatureVersion, - pub validate_max_depth: FeatureVersion, - pub max_depth: u16, - pub recursive_schema_validator_versions: RecursiveSchemaValidatorVersions, - pub validate_schema_compatibility: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct RecursiveSchemaValidatorVersions { - pub traversal_validator: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct AssetLockVersions { - pub reduced_asset_lock_value: FeatureVersionBounds, -} - -#[derive(Clone, Debug, Default)] -pub struct IdentityVersions { - /// This is the structure of the Identity as it is defined for code paths - pub identity_structure_version: FeatureVersion, - pub identity_key_structure_version: FeatureVersion, - pub identity_key_type_method_versions: IdentityKeyTypeMethodVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct VotingVersions { - pub default_vote_poll_time_duration_mainnet_ms: u64, - pub default_vote_poll_time_duration_test_network_ms: u64, - pub contested_document_vote_poll_stored_info_version: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct IdentityKeyTypeMethodVersions { - pub random_public_key_data: FeatureVersion, - pub random_public_and_private_key_data: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DocumentVersions { - // This is for the overall structure of the document, like DocumentV0 - pub document_structure_version: FeatureVersion, - pub document_serialization_version: FeatureVersionBounds, - pub document_cbor_serialization_version: FeatureVersionBounds, - pub extended_document_structure_version: FeatureVersion, - pub extended_document_serialization_version: FeatureVersionBounds, - pub document_method_versions: DocumentMethodVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DocumentMethodVersions { - pub is_equal_ignoring_timestamps: FeatureVersion, - pub hash: FeatureVersion, - pub get_raw_for_contract: FeatureVersion, - pub get_raw_for_document_type: FeatureVersion, - pub try_into_asset_unlock_base_transaction_info: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DPPMethodVersions { - pub epoch_core_reward_credits_for_distribution: FeatureVersion, - pub daily_withdrawal_limit: FeatureVersion, -} diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_asset_lock_versions/mod.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_asset_lock_versions/mod.rs new file mode 100644 index 0000000000..50f27a70ed --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_asset_lock_versions/mod.rs @@ -0,0 +1,8 @@ +use versioned_feature_core::FeatureVersionBounds; + +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct DPPAssetLockVersions { + pub reduced_asset_lock_value: FeatureVersionBounds, +} diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_asset_lock_versions/v1.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_asset_lock_versions/v1.rs new file mode 100644 index 0000000000..0e494c8662 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_asset_lock_versions/v1.rs @@ -0,0 +1,10 @@ +use crate::version::dpp_versions::dpp_asset_lock_versions::DPPAssetLockVersions; +use versioned_feature_core::FeatureVersionBounds; + +pub const DPP_ASSET_LOCK_VERSIONS_V1: DPPAssetLockVersions = DPPAssetLockVersions { + reduced_asset_lock_value: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, +}; diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/mod.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/mod.rs new file mode 100644 index 0000000000..91fd85cbae --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/mod.rs @@ -0,0 +1,74 @@ +use versioned_feature_core::{FeatureVersion, FeatureVersionBounds}; +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct DPPContractVersions { + /// The maximum that we can store a data contract in the state. There is a possibility that a client + /// sends a state transition serialized in a specific version and that the system re-serializes it + /// to the current version, and in so doing increases it's size. + pub max_serialized_size: u32, + /// This is how we serialize and deserialize a contract + pub contract_serialization_version: FeatureVersionBounds, + /// This is the structure of the Contract as it is defined for code paths + pub contract_structure_version: FeatureVersion, + pub created_data_contract_structure: FeatureVersion, + pub config: FeatureVersion, + pub methods: DataContractMethodVersions, + pub document_type_versions: DocumentTypeVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DataContractMethodVersions { + pub validate_document: FeatureVersion, + pub validate_update: FeatureVersion, + pub schema: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DocumentTypeClassMethodVersions { + pub try_from_schema: FeatureVersion, + pub create_document_types_from_document_schemas: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DocumentTypeIndexVersions { + pub index_levels_from_indices: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DocumentTypeVersions { + pub index_versions: DocumentTypeIndexVersions, + pub class_method_versions: DocumentTypeClassMethodVersions, + /// This is for the overall structure of the document type, like DocumentTypeV0 + pub structure_version: FeatureVersion, + pub schema: DocumentTypeSchemaVersions, + pub methods: DocumentTypeMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DocumentTypeMethodVersions { + pub create_document_from_data: FeatureVersion, + pub create_document_with_prevalidated_properties: FeatureVersion, + pub prefunded_voting_balance_for_document: FeatureVersion, + pub contested_vote_poll_for_document: FeatureVersion, + pub estimated_size: FeatureVersion, + pub index_for_types: FeatureVersion, + pub max_size: FeatureVersion, + pub serialize_value_for_key: FeatureVersion, + pub deserialize_value_for_key: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DocumentTypeSchemaVersions { + pub enrich_with_base_schema: FeatureVersion, + pub find_identifier_and_binary_paths: FeatureVersion, + pub validate_max_depth: FeatureVersion, + pub max_depth: u16, + pub recursive_schema_validator_versions: RecursiveSchemaValidatorVersions, + pub validate_schema_compatibility: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct RecursiveSchemaValidatorVersions { + pub traversal_validator: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/v1.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/v1.rs new file mode 100644 index 0000000000..5483e66c95 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/v1.rs @@ -0,0 +1,54 @@ +use crate::version::dpp_versions::dpp_contract_versions::{ + DPPContractVersions, DataContractMethodVersions, DocumentTypeClassMethodVersions, + DocumentTypeIndexVersions, DocumentTypeMethodVersions, DocumentTypeSchemaVersions, + DocumentTypeVersions, RecursiveSchemaValidatorVersions, +}; +use versioned_feature_core::FeatureVersionBounds; + +pub const CONTRACT_VERSIONS_V1: DPPContractVersions = DPPContractVersions { + max_serialized_size: 65000, + contract_serialization_version: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + contract_structure_version: 0, + created_data_contract_structure: 0, + config: 0, + methods: DataContractMethodVersions { + validate_document: 0, + validate_update: 0, + schema: 0, + }, + document_type_versions: DocumentTypeVersions { + index_versions: DocumentTypeIndexVersions { + index_levels_from_indices: 0, + }, + class_method_versions: DocumentTypeClassMethodVersions { + try_from_schema: 0, + create_document_types_from_document_schemas: 0, + }, + structure_version: 0, + schema: DocumentTypeSchemaVersions { + enrich_with_base_schema: 0, + find_identifier_and_binary_paths: 0, + validate_max_depth: 0, + max_depth: 256, + recursive_schema_validator_versions: RecursiveSchemaValidatorVersions { + traversal_validator: 0, + }, + validate_schema_compatibility: 0, + }, + methods: DocumentTypeMethodVersions { + create_document_from_data: 0, + create_document_with_prevalidated_properties: 0, + prefunded_voting_balance_for_document: 0, + contested_vote_poll_for_document: 0, + estimated_size: 0, + index_for_types: 0, + max_size: 0, + serialize_value_for_key: 0, + deserialize_value_for_key: 0, + }, + }, +}; diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_costs_versions/mod.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_costs_versions/mod.rs new file mode 100644 index 0000000000..672e076137 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_costs_versions/mod.rs @@ -0,0 +1,8 @@ +use versioned_feature_core::FeatureVersion; + +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct DPPCostsVersions { + pub signature_verify: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_costs_versions/v1.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_costs_versions/v1.rs new file mode 100644 index 0000000000..0d8d5622ec --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_costs_versions/v1.rs @@ -0,0 +1,5 @@ +use crate::version::dpp_versions::dpp_costs_versions::DPPCostsVersions; + +pub const DPP_COSTS_VERSIONS_V1: DPPCostsVersions = DPPCostsVersions { + signature_verify: 0, +}; diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_document_versions/mod.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_document_versions/mod.rs new file mode 100644 index 0000000000..d5a81808e4 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_document_versions/mod.rs @@ -0,0 +1,23 @@ +use versioned_feature_core::{FeatureVersion, FeatureVersionBounds}; + +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct DPPDocumentVersions { + // This is for the overall structure of the document, like DocumentV0 + pub document_structure_version: FeatureVersion, + pub document_serialization_version: FeatureVersionBounds, + pub document_cbor_serialization_version: FeatureVersionBounds, + pub extended_document_structure_version: FeatureVersion, + pub extended_document_serialization_version: FeatureVersionBounds, + pub document_method_versions: DocumentMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DocumentMethodVersions { + pub is_equal_ignoring_timestamps: FeatureVersion, + pub hash: FeatureVersion, + pub get_raw_for_contract: FeatureVersion, + pub get_raw_for_document_type: FeatureVersion, + pub try_into_asset_unlock_base_transaction_info: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_document_versions/v1.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_document_versions/v1.rs new file mode 100644 index 0000000000..8911129ab6 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_document_versions/v1.rs @@ -0,0 +1,31 @@ +use crate::version::dpp_versions::dpp_document_versions::{ + DPPDocumentVersions, DocumentMethodVersions, +}; +use versioned_feature_core::FeatureVersionBounds; + +pub const DOCUMENT_VERSIONS_V1: DPPDocumentVersions = DPPDocumentVersions { + document_structure_version: 0, + document_serialization_version: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + document_cbor_serialization_version: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + extended_document_structure_version: 0, + extended_document_serialization_version: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + document_method_versions: DocumentMethodVersions { + is_equal_ignoring_timestamps: 0, + hash: 0, + get_raw_for_contract: 0, + get_raw_for_document_type: 0, + try_into_asset_unlock_base_transaction_info: 0, + }, +}; diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_factory_versions/mod.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_factory_versions/mod.rs new file mode 100644 index 0000000000..1ce467d139 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_factory_versions/mod.rs @@ -0,0 +1,9 @@ +pub mod v1; + +use versioned_feature_core::FeatureVersion; + +#[derive(Clone, Debug, Default)] +pub struct DPPFactoryVersions { + pub data_contract_factory_structure_version: FeatureVersion, + pub document_factory_structure_version: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_factory_versions/v1.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_factory_versions/v1.rs new file mode 100644 index 0000000000..1eb875eab1 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_factory_versions/v1.rs @@ -0,0 +1,6 @@ +use crate::version::dpp_versions::dpp_factory_versions::DPPFactoryVersions; + +pub const DPP_FACTORY_VERSIONS_V1: DPPFactoryVersions = DPPFactoryVersions { + data_contract_factory_structure_version: 0, + document_factory_structure_version: 0, +}; diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_identity_versions/mod.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_identity_versions/mod.rs new file mode 100644 index 0000000000..df9356c003 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_identity_versions/mod.rs @@ -0,0 +1,17 @@ +use versioned_feature_core::FeatureVersion; + +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct DPPIdentityVersions { + /// This is the structure of the Identity as it is defined for code paths + pub identity_structure_version: FeatureVersion, + pub identity_key_structure_version: FeatureVersion, + pub identity_key_type_method_versions: IdentityKeyTypeMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct IdentityKeyTypeMethodVersions { + pub random_public_key_data: FeatureVersion, + pub random_public_and_private_key_data: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_identity_versions/v1.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_identity_versions/v1.rs new file mode 100644 index 0000000000..6726dbc55d --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_identity_versions/v1.rs @@ -0,0 +1,12 @@ +use crate::version::dpp_versions::dpp_identity_versions::{ + DPPIdentityVersions, IdentityKeyTypeMethodVersions, +}; + +pub const IDENTITY_VERSIONS_V1: DPPIdentityVersions = DPPIdentityVersions { + identity_structure_version: 0, + identity_key_structure_version: 0, + identity_key_type_method_versions: IdentityKeyTypeMethodVersions { + random_public_key_data: 0, + random_public_and_private_key_data: 0, + }, +}; diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_method_versions/mod.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_method_versions/mod.rs new file mode 100644 index 0000000000..a39362f90e --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_method_versions/mod.rs @@ -0,0 +1,9 @@ +use versioned_feature_core::FeatureVersion; + +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct DPPMethodVersions { + pub epoch_core_reward_credits_for_distribution: FeatureVersion, + pub daily_withdrawal_limit: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_method_versions/v1.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_method_versions/v1.rs new file mode 100644 index 0000000000..dfc749b7b3 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_method_versions/v1.rs @@ -0,0 +1,5 @@ +use crate::version::dpp_versions::dpp_method_versions::DPPMethodVersions; +pub const DPP_METHOD_VERSIONS_V1: DPPMethodVersions = DPPMethodVersions { + epoch_core_reward_credits_for_distribution: 0, + daily_withdrawal_limit: 0, +}; diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/mod.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/mod.rs new file mode 100644 index 0000000000..4c2e0a22a3 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/mod.rs @@ -0,0 +1,12 @@ +use versioned_feature_core::FeatureVersion; + +pub mod v1; +pub mod v2; + +#[derive(Clone, Debug, Default)] +pub struct DPPStateTransitionConversionVersions { + pub identity_to_identity_create_transition: FeatureVersion, + pub identity_to_identity_top_up_transition: FeatureVersion, + pub identity_to_identity_withdrawal_transition: FeatureVersion, + pub identity_to_identity_create_transition_with_signer: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/v1.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/v1.rs new file mode 100644 index 0000000000..d465374250 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/v1.rs @@ -0,0 +1,9 @@ +use crate::version::dpp_versions::dpp_state_transition_conversion_versions::DPPStateTransitionConversionVersions; + +pub const STATE_TRANSITION_CONVERSION_VERSIONS_V1: DPPStateTransitionConversionVersions = + DPPStateTransitionConversionVersions { + identity_to_identity_create_transition: 0, + identity_to_identity_top_up_transition: 0, + identity_to_identity_withdrawal_transition: 0, + identity_to_identity_create_transition_with_signer: 0, + }; diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/v2.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/v2.rs new file mode 100644 index 0000000000..17fd17bd94 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/v2.rs @@ -0,0 +1,9 @@ +use crate::version::dpp_versions::dpp_state_transition_conversion_versions::DPPStateTransitionConversionVersions; + +pub const STATE_TRANSITION_CONVERSION_VERSIONS_V2: DPPStateTransitionConversionVersions = + DPPStateTransitionConversionVersions { + identity_to_identity_create_transition: 0, + identity_to_identity_top_up_transition: 0, + identity_to_identity_withdrawal_transition: 1, + identity_to_identity_create_transition_with_signer: 0, + }; diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_method_versions/mod.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_method_versions/mod.rs new file mode 100644 index 0000000000..ad2a16e431 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_method_versions/mod.rs @@ -0,0 +1,18 @@ +use versioned_feature_core::FeatureVersion; + +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct DPPStateTransitionMethodVersions { + pub public_key_in_creation_methods: PublicKeyInCreationMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct PublicKeyInCreationMethodVersions { + pub from_public_key_signed_with_private_key: FeatureVersion, + pub from_public_key_signed_external: FeatureVersion, + pub hash: FeatureVersion, + pub duplicated_key_ids_witness: FeatureVersion, + pub duplicated_keys_witness: FeatureVersion, + pub validate_identity_public_keys_structure: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_method_versions/v1.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_method_versions/v1.rs new file mode 100644 index 0000000000..f8844fa69e --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_method_versions/v1.rs @@ -0,0 +1,15 @@ +use crate::version::dpp_versions::dpp_state_transition_method_versions::{ + DPPStateTransitionMethodVersions, PublicKeyInCreationMethodVersions, +}; + +pub const STATE_TRANSITION_METHOD_VERSIONS_V1: DPPStateTransitionMethodVersions = + DPPStateTransitionMethodVersions { + public_key_in_creation_methods: PublicKeyInCreationMethodVersions { + from_public_key_signed_with_private_key: 0, + from_public_key_signed_external: 0, + hash: 0, + duplicated_key_ids_witness: 0, + duplicated_keys_witness: 0, + validate_identity_public_keys_structure: 0, + }, + }; diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_serialization_versions/mod.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_serialization_versions/mod.rs new file mode 100644 index 0000000000..3ad838e5de --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_serialization_versions/mod.rs @@ -0,0 +1,29 @@ +use versioned_feature_core::FeatureVersionBounds; + +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct DPPStateTransitionSerializationVersions { + pub identity_public_key_in_creation: FeatureVersionBounds, + pub identity_create_state_transition: FeatureVersionBounds, + pub identity_update_state_transition: FeatureVersionBounds, + pub identity_top_up_state_transition: FeatureVersionBounds, + pub identity_credit_withdrawal_state_transition: FeatureVersionBounds, + pub identity_credit_transfer_state_transition: FeatureVersionBounds, + pub masternode_vote_state_transition: FeatureVersionBounds, + pub contract_create_state_transition: FeatureVersionBounds, + pub contract_update_state_transition: FeatureVersionBounds, + pub documents_batch_state_transition: FeatureVersionBounds, + pub document_base_state_transition: FeatureVersionBounds, + pub document_create_state_transition: DocumentFeatureVersionBounds, + pub document_replace_state_transition: DocumentFeatureVersionBounds, + pub document_delete_state_transition: DocumentFeatureVersionBounds, + pub document_transfer_state_transition: DocumentFeatureVersionBounds, + pub document_update_price_state_transition: DocumentFeatureVersionBounds, + pub document_purchase_state_transition: DocumentFeatureVersionBounds, +} + +#[derive(Clone, Debug, Default)] +pub struct DocumentFeatureVersionBounds { + pub bounds: FeatureVersionBounds, +} diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_serialization_versions/v1.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_serialization_versions/v1.rs new file mode 100644 index 0000000000..917b8405f0 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_serialization_versions/v1.rs @@ -0,0 +1,105 @@ +use crate::version::dpp_versions::dpp_state_transition_serialization_versions::{ + DPPStateTransitionSerializationVersions, DocumentFeatureVersionBounds, +}; +use versioned_feature_core::FeatureVersionBounds; + +pub const STATE_TRANSITION_SERIALIZATION_VERSIONS_V1: DPPStateTransitionSerializationVersions = + DPPStateTransitionSerializationVersions { + identity_public_key_in_creation: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_create_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_update_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_top_up_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_credit_withdrawal_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_credit_transfer_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + masternode_vote_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + contract_create_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + contract_update_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + documents_batch_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + document_base_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + document_create_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + document_replace_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + document_delete_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + document_transfer_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + document_update_price_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + document_purchase_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + }; diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_versions/mod.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_versions/mod.rs new file mode 100644 index 0000000000..407e6e1c52 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_versions/mod.rs @@ -0,0 +1,46 @@ +use versioned_feature_core::FeatureVersion; + +pub mod v1; +pub mod v2; + +#[derive(Clone, Debug, Default)] +pub struct DPPStateTransitionVersions { + pub documents: DocumentTransitionVersions, + pub identities: IdentityTransitionVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct IdentityTransitionVersions { + pub max_public_keys_in_creation: u16, + pub asset_locks: IdentityTransitionAssetLockVersions, + pub credit_withdrawal: IdentityCreditWithdrawalTransitionVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct IdentityCreditWithdrawalTransitionVersions { + pub default_constructor: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct IdentityTransitionAssetLockVersions { + pub required_asset_lock_duff_balance_for_processing_start_for_identity_create: u64, + pub required_asset_lock_duff_balance_for_processing_start_for_identity_top_up: u64, + pub validate_asset_lock_transaction_structure: FeatureVersion, + pub validate_instant_asset_lock_proof_structure: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DocumentTransitionVersions { + pub documents_batch_transition: DocumentsBatchTransitionVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DocumentsBatchTransitionVersions { + pub validation: DocumentsBatchTransitionValidationVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DocumentsBatchTransitionValidationVersions { + pub find_duplicates_by_id: FeatureVersion, + pub validate_base_structure: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_versions/v1.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_versions/v1.rs new file mode 100644 index 0000000000..2dac96fd8f --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_versions/v1.rs @@ -0,0 +1,29 @@ +use crate::version::dpp_versions::dpp_state_transition_versions::{ + DPPStateTransitionVersions, DocumentTransitionVersions, + DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions, + IdentityCreditWithdrawalTransitionVersions, IdentityTransitionAssetLockVersions, + IdentityTransitionVersions, +}; + +pub const STATE_TRANSITION_VERSIONS_V1: DPPStateTransitionVersions = DPPStateTransitionVersions { + documents: DocumentTransitionVersions { + documents_batch_transition: DocumentsBatchTransitionVersions { + validation: DocumentsBatchTransitionValidationVersions { + find_duplicates_by_id: 0, + validate_base_structure: 0, + }, + }, + }, + identities: IdentityTransitionVersions { + max_public_keys_in_creation: 6, + asset_locks: IdentityTransitionAssetLockVersions { + required_asset_lock_duff_balance_for_processing_start_for_identity_create: 200000, + required_asset_lock_duff_balance_for_processing_start_for_identity_top_up: 50000, + validate_asset_lock_transaction_structure: 0, + validate_instant_asset_lock_proof_structure: 0, + }, + credit_withdrawal: IdentityCreditWithdrawalTransitionVersions { + default_constructor: 0, + }, + }, +}; diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_versions/v2.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_versions/v2.rs new file mode 100644 index 0000000000..2a5d2d0651 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_versions/v2.rs @@ -0,0 +1,29 @@ +use crate::version::dpp_versions::dpp_state_transition_versions::{ + DPPStateTransitionVersions, DocumentTransitionVersions, + DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions, + IdentityCreditWithdrawalTransitionVersions, IdentityTransitionAssetLockVersions, + IdentityTransitionVersions, +}; + +pub const STATE_TRANSITION_VERSIONS_V2: DPPStateTransitionVersions = DPPStateTransitionVersions { + documents: DocumentTransitionVersions { + documents_batch_transition: DocumentsBatchTransitionVersions { + validation: DocumentsBatchTransitionValidationVersions { + find_duplicates_by_id: 0, + validate_base_structure: 0, + }, + }, + }, + identities: IdentityTransitionVersions { + max_public_keys_in_creation: 6, + asset_locks: IdentityTransitionAssetLockVersions { + required_asset_lock_duff_balance_for_processing_start_for_identity_create: 200000, + required_asset_lock_duff_balance_for_processing_start_for_identity_top_up: 50000, + validate_asset_lock_transaction_structure: 0, + validate_instant_asset_lock_proof_structure: 0, + }, + credit_withdrawal: IdentityCreditWithdrawalTransitionVersions { + default_constructor: 1, + }, + }, +}; diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/mod.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/mod.rs new file mode 100644 index 0000000000..ebaa11678f --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/mod.rs @@ -0,0 +1,47 @@ +use versioned_feature_core::FeatureVersion; + +pub mod v1; +pub mod v2; + +#[derive(Clone, Debug, Default)] +pub struct DPPValidationVersions { + pub json_schema_validator: JsonSchemaValidatorVersions, + pub data_contract: DataContractValidationVersions, + pub document_type: DocumentTypeValidationVersions, + pub voting: VotingValidationVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DataContractValidationVersions { + pub validate: FeatureVersion, + pub validate_config_update: FeatureVersion, + pub validate_index_definitions: FeatureVersion, + pub validate_index_naming_duplicates: FeatureVersion, + pub validate_not_defined_properties: FeatureVersion, + pub validate_property_definition: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct VotingValidationVersions { + /// How long do we allow other contenders to join a contest after the first contender + pub allow_other_contenders_time_mainnet_ms: u64, + /// How long do we allow other contenders to join a contest after the first contender in a testing environment + pub allow_other_contenders_time_testing_ms: u64, + /// How many votes do we allow from the same masternode? + pub votes_allowed_per_masternode: u16, +} + +#[derive(Clone, Debug, Default)] +pub struct DocumentTypeValidationVersions { + pub validate_update: FeatureVersion, + pub unique_index_limit: u16, + pub contested_index_limit: u16, +} + +#[derive(Clone, Debug, Default)] +pub struct JsonSchemaValidatorVersions { + pub new: FeatureVersion, + pub validate: FeatureVersion, + pub compile: FeatureVersion, + pub compile_and_validate: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v1.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v1.rs new file mode 100644 index 0000000000..e698694e62 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v1.rs @@ -0,0 +1,31 @@ +use crate::version::dpp_versions::dpp_validation_versions::{ + DPPValidationVersions, DataContractValidationVersions, DocumentTypeValidationVersions, + JsonSchemaValidatorVersions, VotingValidationVersions, +}; + +pub const DPP_VALIDATION_VERSIONS_V1: DPPValidationVersions = DPPValidationVersions { + json_schema_validator: JsonSchemaValidatorVersions { + new: 0, + validate: 0, + compile: 0, + compile_and_validate: 0, + }, + data_contract: DataContractValidationVersions { + validate: 0, + validate_config_update: 0, + validate_index_definitions: 0, + validate_index_naming_duplicates: 0, + validate_not_defined_properties: 0, + validate_property_definition: 0, + }, + document_type: DocumentTypeValidationVersions { + validate_update: 0, + contested_index_limit: 1, + unique_index_limit: 10, + }, + voting: VotingValidationVersions { + allow_other_contenders_time_mainnet_ms: 604_800_000, // 1 week in ms + allow_other_contenders_time_testing_ms: 604_800_000, // 1 week in ms for v1 (changes in v2) + votes_allowed_per_masternode: 5, + }, +}; diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v2.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v2.rs new file mode 100644 index 0000000000..7122390711 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v2.rs @@ -0,0 +1,31 @@ +use crate::version::dpp_versions::dpp_validation_versions::{ + DPPValidationVersions, DataContractValidationVersions, DocumentTypeValidationVersions, + JsonSchemaValidatorVersions, VotingValidationVersions, +}; + +pub const DPP_VALIDATION_VERSIONS_V2: DPPValidationVersions = DPPValidationVersions { + json_schema_validator: JsonSchemaValidatorVersions { + new: 0, + validate: 0, + compile: 0, + compile_and_validate: 0, + }, + data_contract: DataContractValidationVersions { + validate: 0, + validate_config_update: 0, + validate_index_definitions: 0, + validate_index_naming_duplicates: 0, + validate_not_defined_properties: 0, + validate_property_definition: 0, + }, + document_type: DocumentTypeValidationVersions { + validate_update: 0, + contested_index_limit: 1, + unique_index_limit: 10, + }, + voting: VotingValidationVersions { + allow_other_contenders_time_mainnet_ms: 604_800_000, // 1 week in ms + allow_other_contenders_time_testing_ms: 2_700_000, //45 minutes + votes_allowed_per_masternode: 5, + }, +}; diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_voting_versions/mod.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_voting_versions/mod.rs new file mode 100644 index 0000000000..900fab5a43 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_voting_versions/mod.rs @@ -0,0 +1,11 @@ +use versioned_feature_core::FeatureVersion; + +pub mod v1; +pub mod v2; + +#[derive(Clone, Debug, Default)] +pub struct DPPVotingVersions { + pub default_vote_poll_time_duration_mainnet_ms: u64, + pub default_vote_poll_time_duration_test_network_ms: u64, + pub contested_document_vote_poll_stored_info_version: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_voting_versions/v1.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_voting_versions/v1.rs new file mode 100644 index 0000000000..944a295d1f --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_voting_versions/v1.rs @@ -0,0 +1,7 @@ +use crate::version::dpp_versions::dpp_voting_versions::DPPVotingVersions; + +pub const VOTING_VERSION_V1: DPPVotingVersions = DPPVotingVersions { + default_vote_poll_time_duration_mainnet_ms: 1_209_600_000, //2 weeks + default_vote_poll_time_duration_test_network_ms: 1_209_600_000, //2 weeks + contested_document_vote_poll_stored_info_version: 0, +}; diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_voting_versions/v2.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_voting_versions/v2.rs new file mode 100644 index 0000000000..de072e8783 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_voting_versions/v2.rs @@ -0,0 +1,7 @@ +use crate::version::dpp_versions::dpp_voting_versions::DPPVotingVersions; + +pub const VOTING_VERSION_V2: DPPVotingVersions = DPPVotingVersions { + default_vote_poll_time_duration_mainnet_ms: 1_209_600_000, //2 weeks + default_vote_poll_time_duration_test_network_ms: 5_400_000, //90 minutes + contested_document_vote_poll_stored_info_version: 0, +}; diff --git a/packages/rs-platform-version/src/version/dpp_versions/mod.rs b/packages/rs-platform-version/src/version/dpp_versions/mod.rs new file mode 100644 index 0000000000..e51203512c --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/mod.rs @@ -0,0 +1,45 @@ +pub mod dpp_asset_lock_versions; +pub mod dpp_contract_versions; +pub mod dpp_costs_versions; +pub mod dpp_document_versions; +pub mod dpp_factory_versions; +pub mod dpp_identity_versions; +pub mod dpp_method_versions; +pub mod dpp_state_transition_conversion_versions; +pub mod dpp_state_transition_method_versions; +pub mod dpp_state_transition_serialization_versions; +pub mod dpp_state_transition_versions; +pub mod dpp_validation_versions; +pub mod dpp_voting_versions; + +use dpp_asset_lock_versions::DPPAssetLockVersions; +use dpp_contract_versions::DPPContractVersions; +use dpp_costs_versions::DPPCostsVersions; +use dpp_document_versions::DPPDocumentVersions; +use dpp_factory_versions::DPPFactoryVersions; +use dpp_identity_versions::DPPIdentityVersions; +use dpp_method_versions::DPPMethodVersions; +use dpp_state_transition_conversion_versions::DPPStateTransitionConversionVersions; +use dpp_state_transition_method_versions::DPPStateTransitionMethodVersions; +use dpp_state_transition_serialization_versions::DPPStateTransitionSerializationVersions; +use dpp_state_transition_versions::DPPStateTransitionVersions; +use dpp_validation_versions::DPPValidationVersions; +use dpp_voting_versions::DPPVotingVersions; + +#[derive(Clone, Debug, Default)] +pub struct DPPVersion { + pub costs: DPPCostsVersions, + pub validation: DPPValidationVersions, + // TODO: Should be split by state transition type + pub state_transition_serialization_versions: DPPStateTransitionSerializationVersions, + pub state_transition_conversion_versions: DPPStateTransitionConversionVersions, + pub state_transition_method_versions: DPPStateTransitionMethodVersions, + pub state_transitions: DPPStateTransitionVersions, + pub contract_versions: DPPContractVersions, + pub document_versions: DPPDocumentVersions, + pub identity_versions: DPPIdentityVersions, + pub voting_versions: DPPVotingVersions, + pub asset_lock_versions: DPPAssetLockVersions, + pub methods: DPPMethodVersions, + pub factory_versions: DPPFactoryVersions, +} diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs deleted file mode 100644 index 03ac8cad96..0000000000 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ /dev/null @@ -1,362 +0,0 @@ -use crate::version::{FeatureVersion, FeatureVersionBounds, OptionalFeatureVersion}; - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciVersion { - pub structs: DriveAbciStructureVersions, - pub methods: DriveAbciMethodVersions, - pub validation_and_processing: DriveAbciValidationVersions, - pub withdrawal_constants: DriveAbciWithdrawalConstants, - pub query: DriveAbciQueryVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciQueryVersions { - pub max_returned_elements: u16, - pub response_metadata: FeatureVersion, - pub proofs_query: FeatureVersionBounds, - pub document_query: FeatureVersionBounds, - pub prefunded_specialized_balances: DriveAbciQueryPrefundedSpecializedBalancesVersions, - pub identity_based_queries: DriveAbciQueryIdentityVersions, - pub validator_queries: DriveAbciQueryValidatorVersions, - pub data_contract_based_queries: DriveAbciQueryDataContractVersions, - pub voting_based_queries: DriveAbciQueryVotingVersions, - pub system: DriveAbciQuerySystemVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciQueryPrefundedSpecializedBalancesVersions { - pub balance: FeatureVersionBounds, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciQueryIdentityVersions { - pub identity: FeatureVersionBounds, - pub identities_contract_keys: FeatureVersionBounds, - pub keys: FeatureVersionBounds, - pub identity_nonce: FeatureVersionBounds, - pub identity_contract_nonce: FeatureVersionBounds, - pub balance: FeatureVersionBounds, - pub identities_balances: FeatureVersionBounds, - pub balance_and_revision: FeatureVersionBounds, - pub identity_by_public_key_hash: FeatureVersionBounds, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciQueryValidatorVersions { - pub proposed_block_counts_by_evonode_ids: FeatureVersionBounds, - pub proposed_block_counts_by_range: FeatureVersionBounds, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciQueryVotingVersions { - pub vote_polls_by_end_date_query: FeatureVersionBounds, - pub contested_resource_vote_state: FeatureVersionBounds, - pub contested_resource_voters_for_identity: FeatureVersionBounds, - pub contested_resource_identity_vote_status: FeatureVersionBounds, - pub contested_resources: FeatureVersionBounds, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciQueryDataContractVersions { - pub data_contract: FeatureVersionBounds, - pub data_contract_history: FeatureVersionBounds, - pub data_contracts: FeatureVersionBounds, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciQuerySystemVersions { - pub version_upgrade_state: FeatureVersionBounds, - pub version_upgrade_vote_status: FeatureVersionBounds, - pub epoch_infos: FeatureVersionBounds, - pub current_quorums_info: FeatureVersionBounds, - pub partial_status: FeatureVersionBounds, - pub path_elements: FeatureVersionBounds, - pub total_credits_in_platform: FeatureVersionBounds, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciStructureVersions { - pub platform_state_structure: FeatureVersion, - pub platform_state_for_saving_structure_default: FeatureVersion, - pub state_transition_execution_context: FeatureVersion, - pub commit: FeatureVersion, - pub masternode: FeatureVersion, - pub signature_verification_quorum_set: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciMethodVersions { - pub engine: DriveAbciEngineMethodVersions, - pub initialization: DriveAbciInitializationMethodVersions, - pub core_based_updates: DriveAbciCoreBasedUpdatesMethodVersions, - pub protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions, - pub block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions, - pub core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants, - pub core_instant_send_lock: DriveAbciCoreInstantSendLockMethodVersions, - pub fee_pool_inwards_distribution: DriveAbciFeePoolInwardsDistributionMethodVersions, - pub fee_pool_outwards_distribution: DriveAbciFeePoolOutwardsDistributionMethodVersions, - pub withdrawals: DriveAbciIdentityCreditWithdrawalMethodVersions, - pub voting: DriveAbciVotingMethodVersions, - pub state_transition_processing: DriveAbciStateTransitionProcessingMethodVersions, - pub epoch: DriveAbciEpochMethodVersions, - pub block_start: DriveAbciBlockStartMethodVersions, - pub block_end: DriveAbciBlockEndMethodVersions, - pub platform_state_storage: DriveAbciPlatformStateStorageMethodVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciValidationVersions { - pub state_transitions: DriveAbciStateTransitionValidationVersions, - pub process_state_transition: FeatureVersion, - pub state_transition_to_execution_event_for_check_tx: FeatureVersion, - pub penalties: PenaltyAmounts, - pub event_constants: DriveAbciValidationConstants, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciWithdrawalConstants { - pub core_expiration_blocks: u32, - pub cleanup_expired_locks_of_withdrawal_amounts_limit: u16, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciValidationConstants { - pub maximum_vote_polls_to_process: u16, - pub maximum_contenders_to_consider: u16, -} - -/// All of these penalty amounts are in credits -#[derive(Clone, Debug, Default)] -pub struct PenaltyAmounts { - pub identity_id_not_correct: u64, - pub unique_key_already_present: u64, - pub validation_of_added_keys_structure_failure: u64, - pub validation_of_added_keys_proof_of_possession_failure: u64, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciPlatformStateStorageMethodVersions { - pub fetch_platform_state: FeatureVersion, - pub store_platform_state: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciDocumentsStateTransitionValidationVersions { - pub balance_pre_check: FeatureVersion, - pub basic_structure: FeatureVersion, - pub advanced_structure: FeatureVersion, - pub revision: FeatureVersion, - pub state: FeatureVersion, - pub transform_into_action: FeatureVersion, - pub data_triggers: DriveAbciValidationDataTriggerAndBindingVersions, - pub is_allowed: FeatureVersion, - pub document_create_transition_structure_validation: FeatureVersion, - pub document_delete_transition_structure_validation: FeatureVersion, - pub document_replace_transition_structure_validation: FeatureVersion, - pub document_transfer_transition_structure_validation: FeatureVersion, - pub document_purchase_transition_structure_validation: FeatureVersion, - pub document_update_price_transition_structure_validation: FeatureVersion, - pub document_create_transition_state_validation: FeatureVersion, - pub document_delete_transition_state_validation: FeatureVersion, - pub document_replace_transition_state_validation: FeatureVersion, - pub document_transfer_transition_state_validation: FeatureVersion, - pub document_purchase_transition_state_validation: FeatureVersion, - pub document_update_price_transition_state_validation: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciValidationDataTriggerAndBindingVersions { - pub bindings: FeatureVersion, - pub triggers: DriveAbciValidationDataTriggerVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciValidationDataTriggerVersions { - pub create_contact_request_data_trigger: FeatureVersion, - pub create_domain_data_trigger: FeatureVersion, - pub create_identity_data_trigger: FeatureVersion, - pub create_feature_flag_data_trigger: FeatureVersion, - pub create_masternode_reward_shares_data_trigger: FeatureVersion, - pub delete_withdrawal_data_trigger: FeatureVersion, - pub reject_data_trigger: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciStateTransitionValidationVersion { - pub basic_structure: OptionalFeatureVersion, - pub advanced_structure: OptionalFeatureVersion, - pub identity_signatures: OptionalFeatureVersion, - pub advanced_minimum_balance_pre_check: OptionalFeatureVersion, - pub nonce: OptionalFeatureVersion, - pub state: FeatureVersion, - pub transform_into_action: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciStateTransitionValidationVersions { - pub common_validation_methods: DriveAbciStateTransitionCommonValidationVersions, - pub max_asset_lock_usage_attempts: u16, - pub identity_create_state_transition: DriveAbciStateTransitionValidationVersion, - pub identity_update_state_transition: DriveAbciStateTransitionValidationVersion, - pub identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion, - pub identity_credit_withdrawal_state_transition: DriveAbciStateTransitionValidationVersion, - pub identity_credit_withdrawal_state_transition_purpose_matches_requirements: FeatureVersion, - pub identity_credit_transfer_state_transition: DriveAbciStateTransitionValidationVersion, - pub masternode_vote_state_transition: DriveAbciStateTransitionValidationVersion, - pub contract_create_state_transition: DriveAbciStateTransitionValidationVersion, - pub contract_update_state_transition: DriveAbciStateTransitionValidationVersion, - pub documents_batch_state_transition: DriveAbciDocumentsStateTransitionValidationVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciStateTransitionCommonValidationVersions { - pub asset_locks: DriveAbciAssetLockValidationVersions, - pub validate_identity_public_key_contract_bounds: FeatureVersion, - pub validate_identity_public_key_ids_dont_exist_in_state: FeatureVersion, - pub validate_identity_public_key_ids_exist_in_state: FeatureVersion, - pub validate_state_transition_identity_signed: FeatureVersion, - pub validate_unique_identity_public_key_hashes_in_state: FeatureVersion, - pub validate_master_key_uniqueness: FeatureVersion, - pub validate_simple_pre_check_balance: FeatureVersion, -} - -#[derive(Clone, Copy, Debug, Default)] -pub struct DriveAbciAssetLockValidationVersions { - pub fetch_asset_lock_transaction_output_sync: FeatureVersion, - pub verify_asset_lock_is_not_spent_and_has_enough_balance: FeatureVersion, -} - -#[derive(Clone, Copy, Debug, Default)] -pub struct DriveAbciEngineMethodVersions { - pub init_chain: FeatureVersion, - pub check_tx: FeatureVersion, - pub run_block_proposal: FeatureVersion, - pub finalize_block_proposal: FeatureVersion, - pub consensus_params_update: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciCoreBasedUpdatesMethodVersions { - pub update_core_info: FeatureVersion, - pub update_masternode_list: FeatureVersion, - pub update_quorum_info: FeatureVersion, - pub masternode_updates: DriveAbciMasternodeIdentitiesUpdatesMethodVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciMasternodeIdentitiesUpdatesMethodVersions { - pub get_voter_identity_key: FeatureVersion, - pub get_operator_identity_keys: FeatureVersion, - pub get_owner_identity_withdrawal_key: FeatureVersion, - pub get_owner_identity_owner_key: FeatureVersion, - pub get_voter_identifier_from_masternode_list_item: FeatureVersion, - pub get_operator_identifier_from_masternode_list_item: FeatureVersion, - pub create_operator_identity: FeatureVersion, - pub create_owner_identity: FeatureVersion, - pub create_voter_identity: FeatureVersion, - pub disable_identity_keys: FeatureVersion, - pub update_masternode_identities: FeatureVersion, - pub update_operator_identity: FeatureVersion, - pub update_owner_withdrawal_address: FeatureVersion, - pub update_voter_identity: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciInitializationMethodVersions { - pub initial_core_height_and_time: FeatureVersion, - pub create_genesis_state: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciBlockFeeProcessingMethodVersions { - pub add_process_epoch_change_operations: FeatureVersion, - pub process_block_fees: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciCoreInstantSendLockMethodVersions { - pub verify_recent_signature_locally: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciCoreChainLockMethodVersionsAndConstants { - pub choose_quorum: FeatureVersion, - pub verify_chain_lock: FeatureVersion, - pub verify_chain_lock_locally: FeatureVersion, - pub verify_chain_lock_through_core: FeatureVersion, - pub make_sure_core_is_synced_to_chain_lock: FeatureVersion, - pub recent_block_count_amount: u32, //what constitutes a recent block, for v0 it's 2. -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciFeePoolInwardsDistributionMethodVersions { - pub add_distribute_block_fees_into_pools_operations: FeatureVersion, - pub add_distribute_storage_fee_to_epochs_operations: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciFeePoolOutwardsDistributionMethodVersions { - pub add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations: FeatureVersion, - pub add_epoch_pool_to_proposers_payout_operations: FeatureVersion, - pub find_oldest_epoch_needing_payment: FeatureVersion, - pub fetch_reward_shares_list_for_masternode: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciEpochMethodVersions { - pub gather_epoch_info: FeatureVersion, - pub get_genesis_time: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciBlockStartMethodVersions { - pub clear_drive_block_cache: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciBlockEndMethodVersions { - pub update_state_cache: FeatureVersion, - pub update_drive_cache: FeatureVersion, - pub validator_set_update: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciVotingMethodVersions { - pub keep_record_of_finished_contested_resource_vote_poll: FeatureVersion, - pub clean_up_after_vote_poll_end: FeatureVersion, - pub clean_up_after_contested_resources_vote_poll_end: FeatureVersion, - pub check_for_ended_vote_polls: FeatureVersion, - pub tally_votes_for_contested_document_resource_vote_poll: FeatureVersion, - pub award_document_to_winner: FeatureVersion, - pub delay_vote_poll: FeatureVersion, - pub run_dao_platform_events: FeatureVersion, - pub remove_votes_for_removed_masternodes: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciIdentityCreditWithdrawalMethodVersions { - pub build_untied_withdrawal_transactions_from_documents: FeatureVersion, - pub dequeue_and_build_unsigned_withdrawal_transactions: FeatureVersion, - pub fetch_transactions_block_inclusion_status: FeatureVersion, - pub pool_withdrawals_into_transactions_queue: FeatureVersion, - pub update_broadcasted_withdrawal_statuses: FeatureVersion, - pub rebroadcast_expired_withdrawal_documents: FeatureVersion, - pub append_signatures_and_broadcast_withdrawal_transactions: FeatureVersion, - pub cleanup_expired_locks_of_withdrawal_amounts: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciProtocolUpgradeMethodVersions { - pub check_for_desired_protocol_upgrade: FeatureVersion, - pub upgrade_protocol_version_on_epoch_change: FeatureVersion, - pub perform_events_on_first_block_of_protocol_change: OptionalFeatureVersion, - pub protocol_version_upgrade_percentage_needed: u64, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciStateTransitionProcessingMethodVersions { - pub execute_event: FeatureVersion, - pub process_raw_state_transitions: FeatureVersion, - pub decode_raw_state_transitions: FeatureVersion, - pub validate_fees_of_event: FeatureVersion, -} diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/mod.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/mod.rs new file mode 100644 index 0000000000..5f6dacf380 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/mod.rs @@ -0,0 +1,166 @@ +use versioned_feature_core::{FeatureVersion, OptionalFeatureVersion}; + +pub mod v1; +pub mod v2; +pub mod v3; + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciMethodVersions { + pub engine: DriveAbciEngineMethodVersions, + pub initialization: DriveAbciInitializationMethodVersions, + pub core_based_updates: DriveAbciCoreBasedUpdatesMethodVersions, + pub protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions, + pub block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions, + pub core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants, + pub core_instant_send_lock: DriveAbciCoreInstantSendLockMethodVersions, + pub fee_pool_inwards_distribution: DriveAbciFeePoolInwardsDistributionMethodVersions, + pub fee_pool_outwards_distribution: DriveAbciFeePoolOutwardsDistributionMethodVersions, + pub withdrawals: DriveAbciIdentityCreditWithdrawalMethodVersions, + pub voting: DriveAbciVotingMethodVersions, + pub state_transition_processing: DriveAbciStateTransitionProcessingMethodVersions, + pub epoch: DriveAbciEpochMethodVersions, + pub block_start: DriveAbciBlockStartMethodVersions, + pub block_end: DriveAbciBlockEndMethodVersions, + pub platform_state_storage: DriveAbciPlatformStateStorageMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciPlatformStateStorageMethodVersions { + pub fetch_platform_state: FeatureVersion, + pub store_platform_state: FeatureVersion, +} + +#[derive(Clone, Copy, Debug, Default)] +pub struct DriveAbciEngineMethodVersions { + pub init_chain: FeatureVersion, + pub check_tx: FeatureVersion, + pub run_block_proposal: FeatureVersion, + pub finalize_block_proposal: FeatureVersion, + pub consensus_params_update: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciCoreBasedUpdatesMethodVersions { + pub update_core_info: FeatureVersion, + pub update_masternode_list: FeatureVersion, + pub update_quorum_info: FeatureVersion, + pub masternode_updates: DriveAbciMasternodeIdentitiesUpdatesMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciMasternodeIdentitiesUpdatesMethodVersions { + pub get_voter_identity_key: FeatureVersion, + pub get_operator_identity_keys: FeatureVersion, + pub get_owner_identity_withdrawal_key: FeatureVersion, + pub get_owner_identity_owner_key: FeatureVersion, + pub get_voter_identifier_from_masternode_list_item: FeatureVersion, + pub get_operator_identifier_from_masternode_list_item: FeatureVersion, + pub create_operator_identity: FeatureVersion, + pub create_owner_identity: FeatureVersion, + pub create_voter_identity: FeatureVersion, + pub disable_identity_keys: FeatureVersion, + pub update_masternode_identities: FeatureVersion, + pub update_operator_identity: FeatureVersion, + pub update_owner_withdrawal_address: FeatureVersion, + pub update_voter_identity: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciInitializationMethodVersions { + pub initial_core_height_and_time: FeatureVersion, + pub create_genesis_state: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciBlockFeeProcessingMethodVersions { + pub add_process_epoch_change_operations: FeatureVersion, + pub process_block_fees: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciCoreInstantSendLockMethodVersions { + pub verify_recent_signature_locally: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciCoreChainLockMethodVersionsAndConstants { + pub choose_quorum: FeatureVersion, + pub verify_chain_lock: FeatureVersion, + pub verify_chain_lock_locally: FeatureVersion, + pub verify_chain_lock_through_core: FeatureVersion, + pub make_sure_core_is_synced_to_chain_lock: FeatureVersion, + pub recent_block_count_amount: u32, //what constitutes a recent block, for v0 it's 2. +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciFeePoolInwardsDistributionMethodVersions { + pub add_distribute_block_fees_into_pools_operations: FeatureVersion, + pub add_distribute_storage_fee_to_epochs_operations: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciFeePoolOutwardsDistributionMethodVersions { + pub add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations: FeatureVersion, + pub add_epoch_pool_to_proposers_payout_operations: FeatureVersion, + pub find_oldest_epoch_needing_payment: FeatureVersion, + pub fetch_reward_shares_list_for_masternode: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciEpochMethodVersions { + pub gather_epoch_info: FeatureVersion, + pub get_genesis_time: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciBlockStartMethodVersions { + pub clear_drive_block_cache: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciBlockEndMethodVersions { + pub update_state_cache: FeatureVersion, + pub update_drive_cache: FeatureVersion, + pub validator_set_update: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciVotingMethodVersions { + pub keep_record_of_finished_contested_resource_vote_poll: FeatureVersion, + pub clean_up_after_vote_poll_end: FeatureVersion, + pub clean_up_after_contested_resources_vote_poll_end: FeatureVersion, + pub check_for_ended_vote_polls: FeatureVersion, + pub tally_votes_for_contested_document_resource_vote_poll: FeatureVersion, + pub award_document_to_winner: FeatureVersion, + pub delay_vote_poll: FeatureVersion, + pub run_dao_platform_events: FeatureVersion, + pub remove_votes_for_removed_masternodes: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciIdentityCreditWithdrawalMethodVersions { + pub build_untied_withdrawal_transactions_from_documents: FeatureVersion, + pub dequeue_and_build_unsigned_withdrawal_transactions: FeatureVersion, + pub fetch_transactions_block_inclusion_status: FeatureVersion, + pub pool_withdrawals_into_transactions_queue: FeatureVersion, + pub update_broadcasted_withdrawal_statuses: FeatureVersion, + pub rebroadcast_expired_withdrawal_documents: FeatureVersion, + pub append_signatures_and_broadcast_withdrawal_transactions: FeatureVersion, + pub cleanup_expired_locks_of_withdrawal_amounts: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciProtocolUpgradeMethodVersions { + pub check_for_desired_protocol_upgrade: FeatureVersion, + pub upgrade_protocol_version_on_epoch_change: FeatureVersion, + pub perform_events_on_first_block_of_protocol_change: OptionalFeatureVersion, + pub protocol_version_upgrade_percentage_needed: u64, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciStateTransitionProcessingMethodVersions { + pub execute_event: FeatureVersion, + pub process_raw_state_transitions: FeatureVersion, + pub decode_raw_state_transitions: FeatureVersion, + pub validate_fees_of_event: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v1.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v1.rs new file mode 100644 index 0000000000..e6e1c63a40 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v1.rs @@ -0,0 +1,121 @@ +use crate::version::drive_abci_versions::drive_abci_method_versions::{ + DriveAbciBlockEndMethodVersions, DriveAbciBlockFeeProcessingMethodVersions, + DriveAbciBlockStartMethodVersions, DriveAbciCoreBasedUpdatesMethodVersions, + DriveAbciCoreChainLockMethodVersionsAndConstants, DriveAbciCoreInstantSendLockMethodVersions, + DriveAbciEngineMethodVersions, DriveAbciEpochMethodVersions, + DriveAbciFeePoolInwardsDistributionMethodVersions, + DriveAbciFeePoolOutwardsDistributionMethodVersions, + DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, + DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, + DriveAbciPlatformStateStorageMethodVersions, DriveAbciProtocolUpgradeMethodVersions, + DriveAbciStateTransitionProcessingMethodVersions, DriveAbciVotingMethodVersions, +}; + +pub const DRIVE_ABCI_METHOD_VERSIONS_V1: DriveAbciMethodVersions = DriveAbciMethodVersions { + engine: DriveAbciEngineMethodVersions { + init_chain: 0, + check_tx: 0, + run_block_proposal: 0, + finalize_block_proposal: 0, + consensus_params_update: 0, + }, + initialization: DriveAbciInitializationMethodVersions { + initial_core_height_and_time: 0, + create_genesis_state: 0, + }, + core_based_updates: DriveAbciCoreBasedUpdatesMethodVersions { + update_core_info: 0, + update_masternode_list: 0, + update_quorum_info: 0, + masternode_updates: DriveAbciMasternodeIdentitiesUpdatesMethodVersions { + get_voter_identity_key: 0, + get_operator_identity_keys: 0, + get_owner_identity_withdrawal_key: 0, + get_owner_identity_owner_key: 0, + get_voter_identifier_from_masternode_list_item: 0, + get_operator_identifier_from_masternode_list_item: 0, + create_operator_identity: 0, + create_owner_identity: 0, + create_voter_identity: 0, + disable_identity_keys: 0, + update_masternode_identities: 0, + update_operator_identity: 0, + update_owner_withdrawal_address: 0, + update_voter_identity: 0, + }, + }, + protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { + check_for_desired_protocol_upgrade: 0, + upgrade_protocol_version_on_epoch_change: 0, + perform_events_on_first_block_of_protocol_change: None, + protocol_version_upgrade_percentage_needed: 75, + }, + block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { + add_process_epoch_change_operations: 0, + process_block_fees: 0, + }, + core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants { + choose_quorum: 0, + verify_chain_lock: 0, + verify_chain_lock_locally: 0, + verify_chain_lock_through_core: 0, + make_sure_core_is_synced_to_chain_lock: 0, + recent_block_count_amount: 2, + }, + core_instant_send_lock: DriveAbciCoreInstantSendLockMethodVersions { + verify_recent_signature_locally: 0, + }, + fee_pool_inwards_distribution: DriveAbciFeePoolInwardsDistributionMethodVersions { + add_distribute_block_fees_into_pools_operations: 0, + add_distribute_storage_fee_to_epochs_operations: 0, + }, + fee_pool_outwards_distribution: DriveAbciFeePoolOutwardsDistributionMethodVersions { + add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations: 0, + add_epoch_pool_to_proposers_payout_operations: 0, + find_oldest_epoch_needing_payment: 0, + fetch_reward_shares_list_for_masternode: 0, + }, + withdrawals: DriveAbciIdentityCreditWithdrawalMethodVersions { + build_untied_withdrawal_transactions_from_documents: 0, + dequeue_and_build_unsigned_withdrawal_transactions: 0, + fetch_transactions_block_inclusion_status: 0, + pool_withdrawals_into_transactions_queue: 0, + update_broadcasted_withdrawal_statuses: 0, + rebroadcast_expired_withdrawal_documents: 0, + append_signatures_and_broadcast_withdrawal_transactions: 0, + cleanup_expired_locks_of_withdrawal_amounts: 0, + }, + voting: DriveAbciVotingMethodVersions { + keep_record_of_finished_contested_resource_vote_poll: 0, + clean_up_after_vote_poll_end: 0, + clean_up_after_contested_resources_vote_poll_end: 0, + check_for_ended_vote_polls: 0, + tally_votes_for_contested_document_resource_vote_poll: 0, + award_document_to_winner: 0, + delay_vote_poll: 0, + run_dao_platform_events: 0, + remove_votes_for_removed_masternodes: 0, + }, + state_transition_processing: DriveAbciStateTransitionProcessingMethodVersions { + execute_event: 0, + process_raw_state_transitions: 0, + decode_raw_state_transitions: 0, + validate_fees_of_event: 0, + }, + epoch: DriveAbciEpochMethodVersions { + gather_epoch_info: 0, + get_genesis_time: 0, + }, + block_start: DriveAbciBlockStartMethodVersions { + clear_drive_block_cache: 0, + }, + block_end: DriveAbciBlockEndMethodVersions { + update_state_cache: 0, + update_drive_cache: 0, + validator_set_update: 0, + }, + platform_state_storage: DriveAbciPlatformStateStorageMethodVersions { + fetch_platform_state: 0, + store_platform_state: 0, + }, +}; diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v2.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v2.rs new file mode 100644 index 0000000000..1e355fa6a2 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v2.rs @@ -0,0 +1,122 @@ +use crate::version::drive_abci_versions::drive_abci_method_versions::{ + DriveAbciBlockEndMethodVersions, DriveAbciBlockFeeProcessingMethodVersions, + DriveAbciBlockStartMethodVersions, DriveAbciCoreBasedUpdatesMethodVersions, + DriveAbciCoreChainLockMethodVersionsAndConstants, DriveAbciCoreInstantSendLockMethodVersions, + DriveAbciEngineMethodVersions, DriveAbciEpochMethodVersions, + DriveAbciFeePoolInwardsDistributionMethodVersions, + DriveAbciFeePoolOutwardsDistributionMethodVersions, + DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, + DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, + DriveAbciPlatformStateStorageMethodVersions, DriveAbciProtocolUpgradeMethodVersions, + DriveAbciStateTransitionProcessingMethodVersions, DriveAbciVotingMethodVersions, +}; + +pub const DRIVE_ABCI_METHOD_VERSIONS_V2: DriveAbciMethodVersions = DriveAbciMethodVersions { + engine: DriveAbciEngineMethodVersions { + init_chain: 0, + check_tx: 0, + run_block_proposal: 0, + finalize_block_proposal: 0, + // Update app version if changed as well + consensus_params_update: 1, + }, + initialization: DriveAbciInitializationMethodVersions { + initial_core_height_and_time: 0, + create_genesis_state: 0, + }, + core_based_updates: DriveAbciCoreBasedUpdatesMethodVersions { + update_core_info: 0, + update_masternode_list: 0, + update_quorum_info: 0, + masternode_updates: DriveAbciMasternodeIdentitiesUpdatesMethodVersions { + get_voter_identity_key: 0, + get_operator_identity_keys: 0, + get_owner_identity_withdrawal_key: 0, + get_owner_identity_owner_key: 0, + get_voter_identifier_from_masternode_list_item: 0, + get_operator_identifier_from_masternode_list_item: 0, + create_operator_identity: 0, + create_owner_identity: 0, + create_voter_identity: 0, + disable_identity_keys: 0, + update_masternode_identities: 0, + update_operator_identity: 0, + update_owner_withdrawal_address: 0, + update_voter_identity: 0, + }, + }, + protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { + check_for_desired_protocol_upgrade: 1, + upgrade_protocol_version_on_epoch_change: 0, + perform_events_on_first_block_of_protocol_change: None, + protocol_version_upgrade_percentage_needed: 67, + }, + block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { + add_process_epoch_change_operations: 0, + process_block_fees: 0, + }, + core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants { + choose_quorum: 0, + verify_chain_lock: 0, + verify_chain_lock_locally: 0, + verify_chain_lock_through_core: 0, + make_sure_core_is_synced_to_chain_lock: 0, + recent_block_count_amount: 2, + }, + core_instant_send_lock: DriveAbciCoreInstantSendLockMethodVersions { + verify_recent_signature_locally: 0, + }, + fee_pool_inwards_distribution: DriveAbciFeePoolInwardsDistributionMethodVersions { + add_distribute_block_fees_into_pools_operations: 0, + add_distribute_storage_fee_to_epochs_operations: 0, + }, + fee_pool_outwards_distribution: DriveAbciFeePoolOutwardsDistributionMethodVersions { + add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations: 0, + add_epoch_pool_to_proposers_payout_operations: 0, + find_oldest_epoch_needing_payment: 0, + fetch_reward_shares_list_for_masternode: 0, + }, + withdrawals: DriveAbciIdentityCreditWithdrawalMethodVersions { + build_untied_withdrawal_transactions_from_documents: 0, + dequeue_and_build_unsigned_withdrawal_transactions: 0, + fetch_transactions_block_inclusion_status: 0, + pool_withdrawals_into_transactions_queue: 0, + update_broadcasted_withdrawal_statuses: 0, + rebroadcast_expired_withdrawal_documents: 0, + append_signatures_and_broadcast_withdrawal_transactions: 0, + cleanup_expired_locks_of_withdrawal_amounts: 0, + }, + voting: DriveAbciVotingMethodVersions { + keep_record_of_finished_contested_resource_vote_poll: 0, + clean_up_after_vote_poll_end: 0, + clean_up_after_contested_resources_vote_poll_end: 0, + check_for_ended_vote_polls: 0, + tally_votes_for_contested_document_resource_vote_poll: 0, + award_document_to_winner: 0, + delay_vote_poll: 0, + run_dao_platform_events: 0, + remove_votes_for_removed_masternodes: 0, + }, + state_transition_processing: DriveAbciStateTransitionProcessingMethodVersions { + execute_event: 0, + process_raw_state_transitions: 0, + decode_raw_state_transitions: 0, + validate_fees_of_event: 0, + }, + epoch: DriveAbciEpochMethodVersions { + gather_epoch_info: 0, + get_genesis_time: 0, + }, + block_start: DriveAbciBlockStartMethodVersions { + clear_drive_block_cache: 0, + }, + block_end: DriveAbciBlockEndMethodVersions { + update_state_cache: 0, + update_drive_cache: 0, + validator_set_update: 0, + }, + platform_state_storage: DriveAbciPlatformStateStorageMethodVersions { + fetch_platform_state: 0, + store_platform_state: 0, + }, +}; diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v3.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v3.rs new file mode 100644 index 0000000000..2b48e7a034 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v3.rs @@ -0,0 +1,121 @@ +use crate::version::drive_abci_versions::drive_abci_method_versions::{ + DriveAbciBlockEndMethodVersions, DriveAbciBlockFeeProcessingMethodVersions, + DriveAbciBlockStartMethodVersions, DriveAbciCoreBasedUpdatesMethodVersions, + DriveAbciCoreChainLockMethodVersionsAndConstants, DriveAbciCoreInstantSendLockMethodVersions, + DriveAbciEngineMethodVersions, DriveAbciEpochMethodVersions, + DriveAbciFeePoolInwardsDistributionMethodVersions, + DriveAbciFeePoolOutwardsDistributionMethodVersions, + DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, + DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, + DriveAbciPlatformStateStorageMethodVersions, DriveAbciProtocolUpgradeMethodVersions, + DriveAbciStateTransitionProcessingMethodVersions, DriveAbciVotingMethodVersions, +}; + +pub const DRIVE_ABCI_METHOD_VERSIONS_V3: DriveAbciMethodVersions = DriveAbciMethodVersions { + engine: DriveAbciEngineMethodVersions { + init_chain: 0, + check_tx: 0, + run_block_proposal: 0, + finalize_block_proposal: 0, + consensus_params_update: 1, + }, + initialization: DriveAbciInitializationMethodVersions { + initial_core_height_and_time: 0, + create_genesis_state: 0, + }, + core_based_updates: DriveAbciCoreBasedUpdatesMethodVersions { + update_core_info: 0, + update_masternode_list: 0, + update_quorum_info: 0, + masternode_updates: DriveAbciMasternodeIdentitiesUpdatesMethodVersions { + get_voter_identity_key: 0, + get_operator_identity_keys: 0, + get_owner_identity_withdrawal_key: 0, + get_owner_identity_owner_key: 0, + get_voter_identifier_from_masternode_list_item: 0, + get_operator_identifier_from_masternode_list_item: 0, + create_operator_identity: 0, + create_owner_identity: 1, + create_voter_identity: 0, + disable_identity_keys: 0, + update_masternode_identities: 0, + update_operator_identity: 0, + update_owner_withdrawal_address: 1, + update_voter_identity: 0, + }, + }, + protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { + check_for_desired_protocol_upgrade: 1, + upgrade_protocol_version_on_epoch_change: 0, + perform_events_on_first_block_of_protocol_change: Some(0), + protocol_version_upgrade_percentage_needed: 67, + }, + block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { + add_process_epoch_change_operations: 0, + process_block_fees: 0, + }, + core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants { + choose_quorum: 0, + verify_chain_lock: 0, + verify_chain_lock_locally: 0, + verify_chain_lock_through_core: 0, + make_sure_core_is_synced_to_chain_lock: 0, + recent_block_count_amount: 2, + }, + core_instant_send_lock: DriveAbciCoreInstantSendLockMethodVersions { + verify_recent_signature_locally: 0, + }, + fee_pool_inwards_distribution: DriveAbciFeePoolInwardsDistributionMethodVersions { + add_distribute_block_fees_into_pools_operations: 0, + add_distribute_storage_fee_to_epochs_operations: 0, + }, + fee_pool_outwards_distribution: DriveAbciFeePoolOutwardsDistributionMethodVersions { + add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations: 0, + add_epoch_pool_to_proposers_payout_operations: 0, + find_oldest_epoch_needing_payment: 0, + fetch_reward_shares_list_for_masternode: 0, + }, + withdrawals: DriveAbciIdentityCreditWithdrawalMethodVersions { + build_untied_withdrawal_transactions_from_documents: 0, + dequeue_and_build_unsigned_withdrawal_transactions: 0, + fetch_transactions_block_inclusion_status: 0, + pool_withdrawals_into_transactions_queue: 0, + update_broadcasted_withdrawal_statuses: 0, + rebroadcast_expired_withdrawal_documents: 0, + append_signatures_and_broadcast_withdrawal_transactions: 0, + cleanup_expired_locks_of_withdrawal_amounts: 0, + }, + voting: DriveAbciVotingMethodVersions { + keep_record_of_finished_contested_resource_vote_poll: 0, + clean_up_after_vote_poll_end: 0, + clean_up_after_contested_resources_vote_poll_end: 0, + check_for_ended_vote_polls: 0, + tally_votes_for_contested_document_resource_vote_poll: 0, + award_document_to_winner: 0, + delay_vote_poll: 0, + run_dao_platform_events: 0, + remove_votes_for_removed_masternodes: 0, + }, + state_transition_processing: DriveAbciStateTransitionProcessingMethodVersions { + execute_event: 0, + process_raw_state_transitions: 0, + decode_raw_state_transitions: 0, + validate_fees_of_event: 0, + }, + epoch: DriveAbciEpochMethodVersions { + gather_epoch_info: 0, + get_genesis_time: 0, + }, + block_start: DriveAbciBlockStartMethodVersions { + clear_drive_block_cache: 0, + }, + block_end: DriveAbciBlockEndMethodVersions { + update_state_cache: 0, + update_drive_cache: 0, + validator_set_update: 1, + }, + platform_state_storage: DriveAbciPlatformStateStorageMethodVersions { + fetch_platform_state: 0, + store_platform_state: 0, + }, +}; diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/mod.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/mod.rs new file mode 100644 index 0000000000..8b010c9c3d --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/mod.rs @@ -0,0 +1,68 @@ +pub mod v1; + +use versioned_feature_core::{FeatureVersion, FeatureVersionBounds}; + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciQueryVersions { + pub max_returned_elements: u16, + pub response_metadata: FeatureVersion, + pub proofs_query: FeatureVersionBounds, + pub document_query: FeatureVersionBounds, + pub prefunded_specialized_balances: DriveAbciQueryPrefundedSpecializedBalancesVersions, + pub identity_based_queries: DriveAbciQueryIdentityVersions, + pub validator_queries: DriveAbciQueryValidatorVersions, + pub data_contract_based_queries: DriveAbciQueryDataContractVersions, + pub voting_based_queries: DriveAbciQueryVotingVersions, + pub system: DriveAbciQuerySystemVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciQueryPrefundedSpecializedBalancesVersions { + pub balance: FeatureVersionBounds, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciQueryIdentityVersions { + pub identity: FeatureVersionBounds, + pub identities_contract_keys: FeatureVersionBounds, + pub keys: FeatureVersionBounds, + pub identity_nonce: FeatureVersionBounds, + pub identity_contract_nonce: FeatureVersionBounds, + pub balance: FeatureVersionBounds, + pub identities_balances: FeatureVersionBounds, + pub balance_and_revision: FeatureVersionBounds, + pub identity_by_public_key_hash: FeatureVersionBounds, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciQueryValidatorVersions { + pub proposed_block_counts_by_evonode_ids: FeatureVersionBounds, + pub proposed_block_counts_by_range: FeatureVersionBounds, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciQueryVotingVersions { + pub vote_polls_by_end_date_query: FeatureVersionBounds, + pub contested_resource_vote_state: FeatureVersionBounds, + pub contested_resource_voters_for_identity: FeatureVersionBounds, + pub contested_resource_identity_vote_status: FeatureVersionBounds, + pub contested_resources: FeatureVersionBounds, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciQueryDataContractVersions { + pub data_contract: FeatureVersionBounds, + pub data_contract_history: FeatureVersionBounds, + pub data_contracts: FeatureVersionBounds, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciQuerySystemVersions { + pub version_upgrade_state: FeatureVersionBounds, + pub version_upgrade_vote_status: FeatureVersionBounds, + pub epoch_infos: FeatureVersionBounds, + pub current_quorums_info: FeatureVersionBounds, + pub partial_status: FeatureVersionBounds, + pub path_elements: FeatureVersionBounds, + pub total_credits_in_platform: FeatureVersionBounds, +} diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/v1.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/v1.rs new file mode 100644 index 0000000000..b6af08405c --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/v1.rs @@ -0,0 +1,168 @@ +use crate::version::drive_abci_versions::drive_abci_query_versions::{ + DriveAbciQueryDataContractVersions, DriveAbciQueryIdentityVersions, + DriveAbciQueryPrefundedSpecializedBalancesVersions, DriveAbciQuerySystemVersions, + DriveAbciQueryValidatorVersions, DriveAbciQueryVersions, DriveAbciQueryVotingVersions, +}; +use versioned_feature_core::FeatureVersionBounds; + +pub const DRIVE_ABCI_QUERY_VERSIONS_V1: DriveAbciQueryVersions = DriveAbciQueryVersions { + max_returned_elements: 100, + response_metadata: 0, + proofs_query: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + document_query: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + prefunded_specialized_balances: DriveAbciQueryPrefundedSpecializedBalancesVersions { + balance: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + identity_based_queries: DriveAbciQueryIdentityVersions { + identity: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + keys: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identities_contract_keys: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_nonce: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_contract_nonce: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + balance: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identities_balances: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + balance_and_revision: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_by_public_key_hash: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + validator_queries: DriveAbciQueryValidatorVersions { + proposed_block_counts_by_evonode_ids: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + proposed_block_counts_by_range: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + data_contract_based_queries: DriveAbciQueryDataContractVersions { + data_contract: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + data_contract_history: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + data_contracts: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + voting_based_queries: DriveAbciQueryVotingVersions { + vote_polls_by_end_date_query: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + contested_resource_vote_state: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + contested_resource_voters_for_identity: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + contested_resource_identity_vote_status: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + contested_resources: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + system: DriveAbciQuerySystemVersions { + version_upgrade_state: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + version_upgrade_vote_status: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + epoch_infos: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + current_quorums_info: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + partial_status: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + path_elements: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + total_credits_in_platform: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, +}; diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_structure_versions/mod.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_structure_versions/mod.rs new file mode 100644 index 0000000000..d00c9187ae --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_structure_versions/mod.rs @@ -0,0 +1,13 @@ +pub mod v1; + +use versioned_feature_core::FeatureVersion; + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciStructureVersions { + pub platform_state_structure: FeatureVersion, + pub platform_state_for_saving_structure_default: FeatureVersion, + pub state_transition_execution_context: FeatureVersion, + pub commit: FeatureVersion, + pub masternode: FeatureVersion, + pub signature_verification_quorum_set: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_structure_versions/v1.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_structure_versions/v1.rs new file mode 100644 index 0000000000..b8e6725281 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_structure_versions/v1.rs @@ -0,0 +1,11 @@ +use crate::version::drive_abci_versions::drive_abci_structure_versions::DriveAbciStructureVersions; + +pub const DRIVE_ABCI_STRUCTURE_VERSIONS_V1: DriveAbciStructureVersions = + DriveAbciStructureVersions { + platform_state_structure: 0, + platform_state_for_saving_structure_default: 0, + state_transition_execution_context: 0, + commit: 0, + masternode: 0, + signature_verification_quorum_set: 0, + }; diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/mod.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/mod.rs new file mode 100644 index 0000000000..c2044bb829 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/mod.rs @@ -0,0 +1,115 @@ +pub mod v1; +pub mod v2; +pub mod v3; + +use versioned_feature_core::{FeatureVersion, OptionalFeatureVersion}; + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciValidationVersions { + pub state_transitions: DriveAbciStateTransitionValidationVersions, + pub process_state_transition: FeatureVersion, + pub state_transition_to_execution_event_for_check_tx: FeatureVersion, + pub penalties: PenaltyAmounts, + pub event_constants: DriveAbciValidationConstants, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciValidationConstants { + pub maximum_vote_polls_to_process: u16, + pub maximum_contenders_to_consider: u16, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciStateTransitionValidationVersion { + pub basic_structure: OptionalFeatureVersion, + pub advanced_structure: OptionalFeatureVersion, + pub identity_signatures: OptionalFeatureVersion, + pub advanced_minimum_balance_pre_check: OptionalFeatureVersion, + pub nonce: OptionalFeatureVersion, + pub state: FeatureVersion, + pub transform_into_action: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciStateTransitionValidationVersions { + pub common_validation_methods: DriveAbciStateTransitionCommonValidationVersions, + pub max_asset_lock_usage_attempts: u16, + pub identity_create_state_transition: DriveAbciStateTransitionValidationVersion, + pub identity_update_state_transition: DriveAbciStateTransitionValidationVersion, + pub identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion, + pub identity_credit_withdrawal_state_transition: DriveAbciStateTransitionValidationVersion, + pub identity_credit_withdrawal_state_transition_purpose_matches_requirements: FeatureVersion, + pub identity_credit_transfer_state_transition: DriveAbciStateTransitionValidationVersion, + pub masternode_vote_state_transition: DriveAbciStateTransitionValidationVersion, + pub contract_create_state_transition: DriveAbciStateTransitionValidationVersion, + pub contract_update_state_transition: DriveAbciStateTransitionValidationVersion, + pub documents_batch_state_transition: DriveAbciDocumentsStateTransitionValidationVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciStateTransitionCommonValidationVersions { + pub asset_locks: DriveAbciAssetLockValidationVersions, + pub validate_identity_public_key_contract_bounds: FeatureVersion, + pub validate_identity_public_key_ids_dont_exist_in_state: FeatureVersion, + pub validate_identity_public_key_ids_exist_in_state: FeatureVersion, + pub validate_state_transition_identity_signed: FeatureVersion, + pub validate_unique_identity_public_key_hashes_in_state: FeatureVersion, + pub validate_master_key_uniqueness: FeatureVersion, + pub validate_simple_pre_check_balance: FeatureVersion, +} + +/// All of these penalty amounts are in credits +#[derive(Clone, Debug, Default)] +pub struct PenaltyAmounts { + pub identity_id_not_correct: u64, + pub unique_key_already_present: u64, + pub validation_of_added_keys_structure_failure: u64, + pub validation_of_added_keys_proof_of_possession_failure: u64, +} + +#[derive(Clone, Copy, Debug, Default)] +pub struct DriveAbciAssetLockValidationVersions { + pub fetch_asset_lock_transaction_output_sync: FeatureVersion, + pub verify_asset_lock_is_not_spent_and_has_enough_balance: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciDocumentsStateTransitionValidationVersions { + pub balance_pre_check: FeatureVersion, + pub basic_structure: FeatureVersion, + pub advanced_structure: FeatureVersion, + pub revision: FeatureVersion, + pub state: FeatureVersion, + pub transform_into_action: FeatureVersion, + pub data_triggers: DriveAbciValidationDataTriggerAndBindingVersions, + pub is_allowed: FeatureVersion, + pub document_create_transition_structure_validation: FeatureVersion, + pub document_delete_transition_structure_validation: FeatureVersion, + pub document_replace_transition_structure_validation: FeatureVersion, + pub document_transfer_transition_structure_validation: FeatureVersion, + pub document_purchase_transition_structure_validation: FeatureVersion, + pub document_update_price_transition_structure_validation: FeatureVersion, + pub document_create_transition_state_validation: FeatureVersion, + pub document_delete_transition_state_validation: FeatureVersion, + pub document_replace_transition_state_validation: FeatureVersion, + pub document_transfer_transition_state_validation: FeatureVersion, + pub document_purchase_transition_state_validation: FeatureVersion, + pub document_update_price_transition_state_validation: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciValidationDataTriggerAndBindingVersions { + pub bindings: FeatureVersion, + pub triggers: DriveAbciValidationDataTriggerVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciValidationDataTriggerVersions { + pub create_contact_request_data_trigger: FeatureVersion, + pub create_domain_data_trigger: FeatureVersion, + pub create_identity_data_trigger: FeatureVersion, + pub create_feature_flag_data_trigger: FeatureVersion, + pub create_masternode_reward_shares_data_trigger: FeatureVersion, + pub delete_withdrawal_data_trigger: FeatureVersion, + pub reject_data_trigger: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v1.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v1.rs new file mode 100644 index 0000000000..a617c54afb --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v1.rs @@ -0,0 +1,146 @@ +use crate::version::drive_abci_versions::drive_abci_validation_versions::{ + DriveAbciAssetLockValidationVersions, DriveAbciDocumentsStateTransitionValidationVersions, + DriveAbciStateTransitionCommonValidationVersions, DriveAbciStateTransitionValidationVersion, + DriveAbciStateTransitionValidationVersions, DriveAbciValidationConstants, + DriveAbciValidationDataTriggerAndBindingVersions, DriveAbciValidationDataTriggerVersions, + DriveAbciValidationVersions, PenaltyAmounts, +}; + +pub const DRIVE_ABCI_VALIDATION_VERSIONS_V1: DriveAbciValidationVersions = + DriveAbciValidationVersions { + state_transitions: DriveAbciStateTransitionValidationVersions { + common_validation_methods: DriveAbciStateTransitionCommonValidationVersions { + asset_locks: DriveAbciAssetLockValidationVersions { + fetch_asset_lock_transaction_output_sync: 0, + verify_asset_lock_is_not_spent_and_has_enough_balance: 0, + }, + validate_identity_public_key_contract_bounds: 0, + validate_identity_public_key_ids_dont_exist_in_state: 0, + validate_identity_public_key_ids_exist_in_state: 0, + validate_state_transition_identity_signed: 0, + validate_unique_identity_public_key_hashes_in_state: 0, + validate_master_key_uniqueness: 0, + validate_simple_pre_check_balance: 0, + }, + max_asset_lock_usage_attempts: 16, + identity_create_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: Some(0), + identity_signatures: Some(0), + advanced_minimum_balance_pre_check: None, + nonce: None, + state: 0, + transform_into_action: 0, + }, + identity_update_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: Some(0), + identity_signatures: Some(0), + advanced_minimum_balance_pre_check: None, + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: None, + nonce: None, + state: 0, + transform_into_action: 0, + }, + identity_credit_withdrawal_state_transition: + DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: Some(0), + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + identity_credit_withdrawal_state_transition_purpose_matches_requirements: 0, + identity_credit_transfer_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: Some(0), + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + masternode_vote_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: None, + advanced_structure: Some(0), + identity_signatures: None, + advanced_minimum_balance_pre_check: Some(0), + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + contract_create_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: None, + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + contract_update_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: None, + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: None, + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + documents_batch_state_transition: DriveAbciDocumentsStateTransitionValidationVersions { + balance_pre_check: 0, + basic_structure: 0, + advanced_structure: 0, + state: 0, + revision: 0, + transform_into_action: 0, + data_triggers: DriveAbciValidationDataTriggerAndBindingVersions { + bindings: 0, + triggers: DriveAbciValidationDataTriggerVersions { + create_contact_request_data_trigger: 0, + create_domain_data_trigger: 0, + create_identity_data_trigger: 0, + create_feature_flag_data_trigger: 0, + create_masternode_reward_shares_data_trigger: 0, + delete_withdrawal_data_trigger: 0, + reject_data_trigger: 0, + }, + }, + is_allowed: 0, + document_create_transition_structure_validation: 0, + document_delete_transition_structure_validation: 0, + document_replace_transition_structure_validation: 0, + document_transfer_transition_structure_validation: 0, + document_purchase_transition_structure_validation: 0, + document_update_price_transition_structure_validation: 0, + document_create_transition_state_validation: 0, + document_delete_transition_state_validation: 0, + document_replace_transition_state_validation: 0, + document_transfer_transition_state_validation: 0, + document_purchase_transition_state_validation: 0, + document_update_price_transition_state_validation: 0, + }, + }, + process_state_transition: 0, + state_transition_to_execution_event_for_check_tx: 0, + penalties: PenaltyAmounts { + identity_id_not_correct: 50000000, + unique_key_already_present: 10000000, + validation_of_added_keys_structure_failure: 10000000, + validation_of_added_keys_proof_of_possession_failure: 50000000, + }, + event_constants: DriveAbciValidationConstants { + maximum_vote_polls_to_process: 2, + maximum_contenders_to_consider: 100, + }, + }; diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v2.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v2.rs new file mode 100644 index 0000000000..577fc0c74b --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v2.rs @@ -0,0 +1,146 @@ +use crate::version::drive_abci_versions::drive_abci_validation_versions::{ + DriveAbciAssetLockValidationVersions, DriveAbciDocumentsStateTransitionValidationVersions, + DriveAbciStateTransitionCommonValidationVersions, DriveAbciStateTransitionValidationVersion, + DriveAbciStateTransitionValidationVersions, DriveAbciValidationConstants, + DriveAbciValidationDataTriggerAndBindingVersions, DriveAbciValidationDataTriggerVersions, + DriveAbciValidationVersions, PenaltyAmounts, +}; + +pub const DRIVE_ABCI_VALIDATION_VERSIONS_V2: DriveAbciValidationVersions = + DriveAbciValidationVersions { + state_transitions: DriveAbciStateTransitionValidationVersions { + common_validation_methods: DriveAbciStateTransitionCommonValidationVersions { + asset_locks: DriveAbciAssetLockValidationVersions { + fetch_asset_lock_transaction_output_sync: 0, + verify_asset_lock_is_not_spent_and_has_enough_balance: 0, + }, + validate_identity_public_key_contract_bounds: 0, + validate_identity_public_key_ids_dont_exist_in_state: 0, + validate_identity_public_key_ids_exist_in_state: 0, + validate_state_transition_identity_signed: 0, + validate_unique_identity_public_key_hashes_in_state: 0, + validate_master_key_uniqueness: 0, + validate_simple_pre_check_balance: 0, + }, + max_asset_lock_usage_attempts: 16, + identity_create_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: Some(0), + identity_signatures: Some(0), + advanced_minimum_balance_pre_check: None, + nonce: None, + state: 0, + transform_into_action: 0, + }, + identity_update_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: Some(0), + identity_signatures: Some(0), + advanced_minimum_balance_pre_check: None, + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: None, + nonce: None, + state: 0, + transform_into_action: 0, + }, + identity_credit_withdrawal_state_transition: + DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: Some(0), + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + identity_credit_withdrawal_state_transition_purpose_matches_requirements: 0, + identity_credit_transfer_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: Some(0), + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + masternode_vote_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: None, + advanced_structure: Some(0), + identity_signatures: None, + advanced_minimum_balance_pre_check: Some(0), + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + contract_create_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: None, + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + contract_update_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: None, + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: None, + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + documents_batch_state_transition: DriveAbciDocumentsStateTransitionValidationVersions { + balance_pre_check: 0, + basic_structure: 0, + advanced_structure: 0, + state: 0, + revision: 0, + transform_into_action: 0, + data_triggers: DriveAbciValidationDataTriggerAndBindingVersions { + bindings: 0, + triggers: DriveAbciValidationDataTriggerVersions { + create_contact_request_data_trigger: 0, + create_domain_data_trigger: 0, + create_identity_data_trigger: 0, + create_feature_flag_data_trigger: 0, + create_masternode_reward_shares_data_trigger: 0, + delete_withdrawal_data_trigger: 0, + reject_data_trigger: 0, + }, + }, + is_allowed: 0, + document_create_transition_structure_validation: 0, + document_delete_transition_structure_validation: 0, + document_replace_transition_structure_validation: 0, + document_transfer_transition_structure_validation: 0, + document_purchase_transition_structure_validation: 0, + document_update_price_transition_structure_validation: 0, + document_create_transition_state_validation: 1, + document_delete_transition_state_validation: 0, + document_replace_transition_state_validation: 0, + document_transfer_transition_state_validation: 0, + document_purchase_transition_state_validation: 0, + document_update_price_transition_state_validation: 0, + }, + }, + process_state_transition: 0, + state_transition_to_execution_event_for_check_tx: 0, + penalties: PenaltyAmounts { + identity_id_not_correct: 50000000, + unique_key_already_present: 10000000, + validation_of_added_keys_structure_failure: 10000000, + validation_of_added_keys_proof_of_possession_failure: 50000000, + }, + event_constants: DriveAbciValidationConstants { + maximum_vote_polls_to_process: 2, + maximum_contenders_to_consider: 100, + }, + }; diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v3.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v3.rs new file mode 100644 index 0000000000..76197377e6 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v3.rs @@ -0,0 +1,146 @@ +use crate::version::drive_abci_versions::drive_abci_validation_versions::{ + DriveAbciAssetLockValidationVersions, DriveAbciDocumentsStateTransitionValidationVersions, + DriveAbciStateTransitionCommonValidationVersions, DriveAbciStateTransitionValidationVersion, + DriveAbciStateTransitionValidationVersions, DriveAbciValidationConstants, + DriveAbciValidationDataTriggerAndBindingVersions, DriveAbciValidationDataTriggerVersions, + DriveAbciValidationVersions, PenaltyAmounts, +}; + +pub const DRIVE_ABCI_VALIDATION_VERSIONS_V3: DriveAbciValidationVersions = + DriveAbciValidationVersions { + state_transitions: DriveAbciStateTransitionValidationVersions { + common_validation_methods: DriveAbciStateTransitionCommonValidationVersions { + asset_locks: DriveAbciAssetLockValidationVersions { + fetch_asset_lock_transaction_output_sync: 0, + verify_asset_lock_is_not_spent_and_has_enough_balance: 0, + }, + validate_identity_public_key_contract_bounds: 0, + validate_identity_public_key_ids_dont_exist_in_state: 0, + validate_identity_public_key_ids_exist_in_state: 0, + validate_state_transition_identity_signed: 0, + validate_unique_identity_public_key_hashes_in_state: 0, + validate_master_key_uniqueness: 0, + validate_simple_pre_check_balance: 0, + }, + max_asset_lock_usage_attempts: 16, + identity_create_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: Some(0), + identity_signatures: Some(0), + advanced_minimum_balance_pre_check: None, + nonce: None, + state: 0, + transform_into_action: 0, + }, + identity_update_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: Some(0), + identity_signatures: Some(0), + advanced_minimum_balance_pre_check: None, + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: None, + nonce: None, + state: 0, + transform_into_action: 0, + }, + identity_credit_withdrawal_state_transition: + DriveAbciStateTransitionValidationVersion { + basic_structure: Some(1), + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: Some(0), + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + identity_credit_withdrawal_state_transition_purpose_matches_requirements: 0, + identity_credit_transfer_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: Some(0), + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + masternode_vote_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: None, + advanced_structure: Some(0), + identity_signatures: None, + advanced_minimum_balance_pre_check: Some(0), + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + contract_create_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: None, + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + contract_update_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: None, + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: None, + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + documents_batch_state_transition: DriveAbciDocumentsStateTransitionValidationVersions { + balance_pre_check: 0, + basic_structure: 0, + advanced_structure: 0, + state: 0, + revision: 0, + transform_into_action: 0, + data_triggers: DriveAbciValidationDataTriggerAndBindingVersions { + bindings: 0, + triggers: DriveAbciValidationDataTriggerVersions { + create_contact_request_data_trigger: 0, + create_domain_data_trigger: 0, + create_identity_data_trigger: 0, + create_feature_flag_data_trigger: 0, + create_masternode_reward_shares_data_trigger: 0, + delete_withdrawal_data_trigger: 0, + reject_data_trigger: 0, + }, + }, + is_allowed: 0, + document_create_transition_structure_validation: 0, + document_delete_transition_structure_validation: 0, + document_replace_transition_structure_validation: 0, + document_transfer_transition_structure_validation: 0, + document_purchase_transition_structure_validation: 0, + document_update_price_transition_structure_validation: 0, + document_create_transition_state_validation: 1, + document_delete_transition_state_validation: 0, + document_replace_transition_state_validation: 0, + document_transfer_transition_state_validation: 0, + document_purchase_transition_state_validation: 0, + document_update_price_transition_state_validation: 0, + }, + }, + process_state_transition: 0, + state_transition_to_execution_event_for_check_tx: 0, + penalties: PenaltyAmounts { + identity_id_not_correct: 50000000, + unique_key_already_present: 10000000, + validation_of_added_keys_structure_failure: 10000000, + validation_of_added_keys_proof_of_possession_failure: 50000000, + }, + event_constants: DriveAbciValidationConstants { + maximum_vote_polls_to_process: 2, + maximum_contenders_to_consider: 100, + }, + }; diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_withdrawal_constants/mod.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_withdrawal_constants/mod.rs new file mode 100644 index 0000000000..b20f85efde --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_withdrawal_constants/mod.rs @@ -0,0 +1,8 @@ +pub mod v1; +pub mod v2; + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciWithdrawalConstants { + pub core_expiration_blocks: u32, + pub cleanup_expired_locks_of_withdrawal_amounts_limit: u16, +} diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_withdrawal_constants/v1.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_withdrawal_constants/v1.rs new file mode 100644 index 0000000000..73bc3f93f9 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_withdrawal_constants/v1.rs @@ -0,0 +1,7 @@ +use crate::version::drive_abci_versions::drive_abci_withdrawal_constants::DriveAbciWithdrawalConstants; + +pub const DRIVE_ABCI_WITHDRAWAL_CONSTANTS_V1: DriveAbciWithdrawalConstants = + DriveAbciWithdrawalConstants { + core_expiration_blocks: 48, + cleanup_expired_locks_of_withdrawal_amounts_limit: 0, + }; diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_withdrawal_constants/v2.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_withdrawal_constants/v2.rs new file mode 100644 index 0000000000..41cdd51f69 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_withdrawal_constants/v2.rs @@ -0,0 +1,7 @@ +use crate::version::drive_abci_versions::drive_abci_withdrawal_constants::DriveAbciWithdrawalConstants; + +pub const DRIVE_ABCI_WITHDRAWAL_CONSTANTS_V2: DriveAbciWithdrawalConstants = + DriveAbciWithdrawalConstants { + core_expiration_blocks: 48, + cleanup_expired_locks_of_withdrawal_amounts_limit: 64, + }; diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/mod.rs b/packages/rs-platform-version/src/version/drive_abci_versions/mod.rs new file mode 100644 index 0000000000..a6168ce9db --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_abci_versions/mod.rs @@ -0,0 +1,19 @@ +pub mod drive_abci_method_versions; +pub mod drive_abci_query_versions; +pub mod drive_abci_structure_versions; +pub mod drive_abci_validation_versions; +pub mod drive_abci_withdrawal_constants; + +use drive_abci_method_versions::DriveAbciMethodVersions; +use drive_abci_query_versions::DriveAbciQueryVersions; +use drive_abci_structure_versions::DriveAbciStructureVersions; +use drive_abci_validation_versions::DriveAbciValidationVersions; +use drive_abci_withdrawal_constants::DriveAbciWithdrawalConstants; +#[derive(Clone, Debug, Default)] +pub struct DriveAbciVersion { + pub structs: DriveAbciStructureVersions, + pub methods: DriveAbciMethodVersions, + pub validation_and_processing: DriveAbciValidationVersions, + pub withdrawal_constants: DriveAbciWithdrawalConstants, + pub query: DriveAbciQueryVersions, +} diff --git a/packages/rs-platform-version/src/version/drive_versions.rs b/packages/rs-platform-version/src/version/drive_versions.rs deleted file mode 100644 index 2deecab9de..0000000000 --- a/packages/rs-platform-version/src/version/drive_versions.rs +++ /dev/null @@ -1,756 +0,0 @@ -use crate::version::{FeatureVersion, FeatureVersionBounds, OptionalFeatureVersion}; -use grovedb_version::version::GroveVersion; - -#[derive(Clone, Debug, Default)] -pub struct DriveVersion { - pub structure: DriveStructureVersion, - pub methods: DriveMethodVersions, - pub grove_methods: DriveGroveMethodVersions, - pub grove_version: GroveVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveMethodVersions { - pub initialization: DriveInitializationMethodVersions, - pub credit_pools: DriveCreditPoolMethodVersions, - pub protocol_upgrade: DriveProtocolUpgradeVersions, - pub prefunded_specialized_balances: DrivePrefundedSpecializedMethodVersions, - pub balances: DriveBalancesMethodVersions, - pub document: DriveDocumentMethodVersions, - pub vote: DriveVoteMethodVersions, - pub contract: DriveContractMethodVersions, - pub fees: DriveFeesMethodVersions, - pub estimated_costs: DriveEstimatedCostsMethodVersions, - pub asset_lock: DriveAssetLockMethodVersions, - pub verify: DriveVerifyMethodVersions, - pub identity: DriveIdentityMethodVersions, - pub platform_system: DrivePlatformSystemMethodVersions, - pub operations: DriveOperationsMethodVersion, - pub batch_operations: DriveBatchOperationsMethodVersion, - pub fetch: DriveFetchMethodVersions, - pub prove: DriveProveMethodVersions, - pub state_transitions: DriveStateTransitionMethodVersions, - pub platform_state: DrivePlatformStateMethodVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DrivePlatformStateMethodVersions { - pub fetch_platform_state_bytes: FeatureVersion, - pub store_platform_state_bytes: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveStateTransitionMethodVersions { - pub operations: DriveStateTransitionOperationMethodVersions, - pub convert_to_high_level_operations: - DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions { - pub data_contract_create_transition: FeatureVersion, - pub data_contract_update_transition: FeatureVersion, - pub document_create_transition: FeatureVersion, - pub document_delete_transition: FeatureVersion, - pub document_purchase_transition: FeatureVersion, - pub document_replace_transition: FeatureVersion, - pub document_transfer_transition: FeatureVersion, - pub document_update_price_transition: FeatureVersion, - pub documents_batch_transition: FeatureVersion, - pub identity_create_transition: FeatureVersion, - pub identity_credit_transfer_transition: FeatureVersion, - pub identity_credit_withdrawal_transition: FeatureVersion, - pub identity_top_up_transition: FeatureVersion, - pub identity_update_transition: FeatureVersion, - pub masternode_vote_transition: FeatureVersion, - pub bump_identity_data_contract_nonce: FeatureVersion, - pub bump_identity_nonce: FeatureVersion, - pub partially_use_asset_lock: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveStateTransitionOperationMethodVersions { - pub finalization_tasks: FeatureVersion, - pub contracts: DriveDataContractOperationMethodVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveDataContractOperationMethodVersions { - pub finalization_tasks: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveFetchMethodVersions { - pub fetch_elements: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveProveMethodVersions { - pub prove_elements: FeatureVersion, - pub prove_multiple_state_transition_results: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveVerifyMethodVersions { - pub contract: DriveVerifyContractMethodVersions, - pub document: DriveVerifyDocumentMethodVersions, - pub identity: DriveVerifyIdentityMethodVersions, - pub single_document: DriveVerifySingleDocumentMethodVersions, - pub system: DriveVerifySystemMethodVersions, - pub voting: DriveVerifyVoteMethodVersions, - pub state_transition: DriveVerifyStateTransitionMethodVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveVerifyContractMethodVersions { - pub verify_contract: FeatureVersion, - pub verify_contract_history: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveVerifyDocumentMethodVersions { - pub verify_proof: FeatureVersion, - pub verify_proof_keep_serialized: FeatureVersion, - pub verify_start_at_document_in_proof: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveVerifyIdentityMethodVersions { - pub verify_full_identities_by_public_key_hashes: FeatureVersion, - pub verify_full_identity_by_identity_id: FeatureVersion, - pub verify_full_identity_by_public_key_hash: FeatureVersion, - pub verify_identity_balance_for_identity_id: FeatureVersion, - pub verify_identity_balances_for_identity_ids: FeatureVersion, - pub verify_identity_id_by_public_key_hash: FeatureVersion, - pub verify_identity_ids_by_public_key_hashes: FeatureVersion, - pub verify_identity_keys_by_identity_id: FeatureVersion, - pub verify_identity_nonce: FeatureVersion, - pub verify_identity_contract_nonce: FeatureVersion, - pub verify_identities_contract_keys: FeatureVersion, - pub verify_identity_revision_for_identity_id: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveVerifyVoteMethodVersions { - pub verify_masternode_vote: FeatureVersion, - pub verify_start_at_contender_in_proof: FeatureVersion, - pub verify_vote_poll_votes_proof: FeatureVersion, - pub verify_identity_votes_given_proof: FeatureVersion, - pub verify_vote_poll_vote_state_proof: FeatureVersion, - pub verify_contests_proof: FeatureVersion, - pub verify_vote_polls_by_end_date_proof: FeatureVersion, - pub verify_specialized_balance: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveVerifySystemMethodVersions { - pub verify_epoch_infos: FeatureVersion, - pub verify_epoch_proposers: FeatureVersion, - pub verify_elements: FeatureVersion, - pub verify_total_credits_in_system: FeatureVersion, - pub verify_upgrade_state: FeatureVersion, - pub verify_upgrade_vote_status: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveVerifySingleDocumentMethodVersions { - pub verify_proof: FeatureVersion, - pub verify_proof_keep_serialized: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveVerifyStateTransitionMethodVersions { - pub verify_state_transition_was_executed_with_proof: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveGroveMethodVersions { - pub basic: DriveGroveBasicMethodVersions, - pub batch: DriveGroveBatchMethodVersions, - pub apply: DriveGroveApplyMethodVersions, - pub costs: DriveGroveCostMethodVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DrivePrefundedSpecializedMethodVersions { - pub fetch_single: FeatureVersion, - pub prove_single: FeatureVersion, - pub add_prefunded_specialized_balance: FeatureVersion, - pub add_prefunded_specialized_balance_operations: FeatureVersion, - pub deduct_from_prefunded_specialized_balance: FeatureVersion, - pub deduct_from_prefunded_specialized_balance_operations: FeatureVersion, - pub estimated_cost_for_prefunded_specialized_balance_update: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveBalancesMethodVersions { - pub add_to_system_credits: FeatureVersion, - pub add_to_system_credits_operations: FeatureVersion, - pub remove_from_system_credits: FeatureVersion, - pub remove_from_system_credits_operations: FeatureVersion, - pub calculate_total_credits_balance: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveAssetLockMethodVersions { - pub add_asset_lock_outpoint: FeatureVersion, - pub add_estimation_costs_for_adding_asset_lock: FeatureVersion, - pub fetch_asset_lock_outpoint_info: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveFeesMethodVersions { - pub calculate_fee: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveContractMethodVersions { - pub prove: DriveContractProveMethodVersions, - pub apply: DriveContractApplyMethodVersions, - pub insert: DriveContractInsertMethodVersions, - pub update: DriveContractUpdateMethodVersions, - pub costs: DriveContractCostsMethodVersions, - pub get: DriveContractGetMethodVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveContractProveMethodVersions { - pub prove_contract: FeatureVersion, - pub prove_contract_history: FeatureVersion, - pub prove_contracts: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveContractApplyMethodVersions { - pub apply_contract: FeatureVersion, - pub apply_contract_with_serialization: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveContractInsertMethodVersions { - pub add_contract_to_storage: FeatureVersion, - pub insert_contract: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveContractUpdateMethodVersions { - pub update_contract: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveContractGetMethodVersions { - pub fetch_contract: FeatureVersion, - pub fetch_contract_with_history: FeatureVersion, - pub get_cached_contract_with_fetch_info: FeatureVersion, - pub get_contract_with_fetch_info: FeatureVersion, - pub get_contracts_with_fetch_info: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveContractQueryMethodVersions { - pub fetch_contract_query: FeatureVersion, - pub fetch_contract_with_history_latest_query: FeatureVersion, - pub fetch_contracts_query: FeatureVersion, - pub fetch_contract_history_query: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveContractCostsMethodVersions { - pub add_estimation_costs_for_contract_insertion: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DrivePlatformSystemMethodVersions { - pub estimation_costs: DriveSystemEstimationCostsMethodVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveOperationsMethodVersion { - pub rollback_transaction: FeatureVersion, - pub drop_cache: FeatureVersion, - pub commit_transaction: FeatureVersion, - pub apply_partial_batch_low_level_drive_operations: FeatureVersion, - pub apply_partial_batch_grovedb_operations: FeatureVersion, - pub apply_batch_low_level_drive_operations: FeatureVersion, - pub apply_batch_grovedb_operations: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveBatchOperationsMethodVersion { - pub convert_drive_operations_to_grove_operations: FeatureVersion, - pub apply_drive_operations: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveSystemEstimationCostsMethodVersions { - pub for_total_system_credits_update: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveVoteMethodVersions { - pub insert: DriveVoteInsertMethodVersions, - pub contested_resource_insert: DriveVoteContestedResourceInsertMethodVersions, - pub cleanup: DriveVoteCleanupMethodVersions, - pub setup: DriveVoteSetupMethodVersions, - pub storage_form: DriveVoteStorageFormMethodVersions, - pub fetch: DriveVoteFetchMethodVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveVoteFetchMethodVersions { - pub fetch_identities_voting_for_contenders: FeatureVersion, - pub fetch_contested_document_vote_poll_stored_info: FeatureVersion, - pub fetch_identity_contested_resource_vote: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveVoteStorageFormMethodVersions { - pub resolve_with_contract: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveVoteSetupMethodVersions { - pub add_initial_vote_tree_main_structure_operations: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveVoteCleanupMethodVersions { - pub remove_specific_vote_references_given_by_identity: FeatureVersion, - pub remove_specific_votes_given_by_identity: FeatureVersion, - pub remove_contested_resource_vote_poll_end_date_query_operations: FeatureVersion, - pub remove_contested_resource_vote_poll_votes_operations: FeatureVersion, - pub remove_contested_resource_vote_poll_documents_operations: FeatureVersion, - pub remove_contested_resource_vote_poll_contenders_operations: FeatureVersion, - pub remove_contested_resource_top_level_index_operations: FeatureVersion, - pub remove_contested_resource_info_operations: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveVoteInsertMethodVersions { - pub register_identity_vote: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveVoteContestedResourceInsertMethodVersions { - pub register_contested_resource_identity_vote: FeatureVersion, - pub insert_stored_info_for_contested_resource_vote_poll: FeatureVersion, - pub register_identity_vote: FeatureVersion, - pub add_vote_poll_end_date_query_operations: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveDocumentMethodVersions { - pub query: DriveDocumentQueryMethodVersions, - pub delete: DriveDocumentDeleteMethodVersions, - pub insert: DriveDocumentInsertMethodVersions, - pub insert_contested: DriveDocumentInsertContestedMethodVersions, - pub update: DriveDocumentUpdateMethodVersions, - pub estimation_costs: DriveDocumentEstimationCostsMethodVersions, - pub index_uniqueness: DriveDocumentIndexUniquenessMethodVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveDocumentQueryMethodVersions { - pub query_documents: FeatureVersion, - pub query_contested_documents: FeatureVersion, - pub query_contested_documents_vote_state: FeatureVersion, - pub query_documents_with_flags: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveDocumentEstimationCostsMethodVersions { - pub add_estimation_costs_for_add_document_to_primary_storage: FeatureVersion, - pub add_estimation_costs_for_add_contested_document_to_primary_storage: FeatureVersion, - pub stateless_delete_of_non_tree_for_costs: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveDocumentInsertMethodVersions { - pub add_document: FeatureVersion, - pub add_document_for_contract: FeatureVersion, - pub add_document_for_contract_apply_and_add_to_operations: FeatureVersion, - pub add_document_for_contract_operations: FeatureVersion, - pub add_document_to_primary_storage: FeatureVersion, - pub add_indices_for_index_level_for_contract_operations: FeatureVersion, - pub add_indices_for_top_index_level_for_contract_operations: FeatureVersion, - pub add_reference_for_index_level_for_contract_operations: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveDocumentInsertContestedMethodVersions { - pub add_contested_document: FeatureVersion, - pub add_contested_document_for_contract: FeatureVersion, - pub add_contested_document_for_contract_apply_and_add_to_operations: FeatureVersion, - pub add_contested_document_for_contract_operations: FeatureVersion, - pub add_contested_document_to_primary_storage: FeatureVersion, - pub add_contested_indices_for_contract_operations: FeatureVersion, - pub add_contested_reference_and_vote_subtree_to_document_operations: FeatureVersion, - pub add_contested_vote_subtree_for_non_identities_operations: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveDocumentUpdateMethodVersions { - pub add_update_multiple_documents_operations: FeatureVersion, - pub update_document_for_contract: FeatureVersion, - pub update_document_for_contract_apply_and_add_to_operations: FeatureVersion, - pub update_document_for_contract_id: FeatureVersion, - pub update_document_for_contract_operations: FeatureVersion, - pub update_document_with_serialization_for_contract: FeatureVersion, - pub update_serialized_document_for_contract: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveDocumentDeleteMethodVersions { - pub add_estimation_costs_for_remove_document_to_primary_storage: FeatureVersion, - pub delete_document_for_contract: FeatureVersion, - pub delete_document_for_contract_id: FeatureVersion, - pub delete_document_for_contract_apply_and_add_to_operations: FeatureVersion, - pub remove_document_from_primary_storage: FeatureVersion, - pub remove_reference_for_index_level_for_contract_operations: FeatureVersion, - pub remove_indices_for_index_level_for_contract_operations: FeatureVersion, - pub remove_indices_for_top_index_level_for_contract_operations: FeatureVersion, - pub delete_document_for_contract_id_with_named_type_operations: FeatureVersion, - pub delete_document_for_contract_with_named_type_operations: FeatureVersion, - pub delete_document_for_contract_operations: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveDocumentIndexUniquenessMethodVersions { - pub validate_document_uniqueness: FeatureVersion, - pub validate_document_create_transition_action_uniqueness: FeatureVersion, - pub validate_document_replace_transition_action_uniqueness: FeatureVersion, - pub validate_document_transfer_transition_action_uniqueness: FeatureVersion, - pub validate_document_purchase_transition_action_uniqueness: FeatureVersion, - pub validate_document_update_price_transition_action_uniqueness: FeatureVersion, - pub validate_uniqueness_of_data: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveGroveBasicMethodVersions { - pub grove_insert: FeatureVersion, - pub grove_insert_empty_tree: FeatureVersion, - pub grove_insert_empty_sum_tree: FeatureVersion, - pub grove_insert_if_not_exists: FeatureVersion, - pub grove_insert_if_not_exists_return_existing_element: FeatureVersion, - pub grove_clear: FeatureVersion, - pub grove_delete: FeatureVersion, - pub grove_get_raw: FeatureVersion, - pub grove_get_raw_optional: FeatureVersion, - pub grove_get_raw_value_u64_from_encoded_var_vec: FeatureVersion, - pub grove_get: FeatureVersion, - pub grove_get_path_query_serialized_results: FeatureVersion, - pub grove_get_path_query_serialized_or_sum_results: FeatureVersion, - pub grove_get_path_query: FeatureVersion, - pub grove_get_path_query_with_optional: FeatureVersion, - pub grove_get_raw_path_query_with_optional: FeatureVersion, - pub grove_get_raw_path_query: FeatureVersion, - pub grove_get_proved_path_query: FeatureVersion, - pub grove_get_proved_path_query_with_conditional: FeatureVersion, - pub grove_get_sum_tree_total_value: FeatureVersion, - pub grove_has_raw: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveGroveBatchMethodVersions { - pub batch_insert_empty_tree: FeatureVersion, - pub batch_insert_empty_tree_if_not_exists: FeatureVersion, - pub batch_insert_empty_tree_if_not_exists_check_existing_operations: FeatureVersion, - pub batch_insert_sum_item_or_add_to_if_already_exists: FeatureVersion, - pub batch_insert: FeatureVersion, - pub batch_insert_if_not_exists: FeatureVersion, - pub batch_insert_if_changed_value: FeatureVersion, - pub batch_replace: FeatureVersion, - pub batch_delete: FeatureVersion, - pub batch_delete_items_in_path_query: FeatureVersion, - pub batch_move_items_in_path_query: FeatureVersion, - pub batch_remove_raw: FeatureVersion, - pub batch_delete_up_tree_while_empty: FeatureVersion, - pub batch_refresh_reference: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveGroveApplyMethodVersions { - pub grove_apply_operation: FeatureVersion, - pub grove_apply_batch: FeatureVersion, - pub grove_apply_partial_batch: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveGroveCostMethodVersions { - pub grove_batch_operations_costs: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveInitializationMethodVersions { - pub create_initial_state_structure: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveCreditPoolMethodVersions { - pub epochs: DriveCreditPoolEpochsMethodVersions, - pub pending_epoch_refunds: DriveCreditPoolPendingEpochRefundsMethodVersions, - pub storage_fee_distribution_pool: DriveCreditPoolStorageFeeDistributionPoolMethodVersions, - pub unpaid_epoch: DriveCreditPoolUnpaidEpochMethodVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveCreditPoolEpochsMethodVersions { - pub get_epochs_infos: FeatureVersion, - pub get_epochs_protocol_versions: FeatureVersion, - pub prove_epochs_infos: FeatureVersion, - pub get_epoch_fee_multiplier: FeatureVersion, - pub get_epoch_processing_credits_for_distribution: FeatureVersion, - pub get_epoch_storage_credits_for_distribution: FeatureVersion, - pub get_epoch_total_credits_for_distribution: FeatureVersion, - pub get_storage_credits_for_distribution_for_epochs_in_range: FeatureVersion, - pub get_epoch_start_time: FeatureVersion, - pub get_epoch_start_block_core_height: FeatureVersion, - pub get_epoch_start_block_height: FeatureVersion, - pub get_first_epoch_start_block_info_between_epochs: FeatureVersion, - pub fetch_epoch_proposers: FeatureVersion, - pub prove_epoch_proposers: FeatureVersion, - pub get_epochs_proposer_block_count: FeatureVersion, - pub add_update_pending_epoch_refunds_operations: FeatureVersion, - pub is_epochs_proposers_tree_empty: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveCreditPoolUnpaidEpochMethodVersions { - pub get_unpaid_epoch_index: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveCreditPoolPendingEpochRefundsMethodVersions { - pub add_delete_pending_epoch_refunds_except_specified: FeatureVersion, - pub fetch_and_add_pending_epoch_refunds_to_collection: FeatureVersion, - pub fetch_pending_epoch_refunds: FeatureVersion, - pub add_update_pending_epoch_refunds_operations: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveCreditPoolStorageFeeDistributionPoolMethodVersions { - pub get_storage_fees_from_distribution_pool: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveProtocolUpgradeVersions { - pub clear_version_information: FeatureVersion, - pub fetch_versions_with_counter: FeatureVersion, - pub fetch_proved_versions_with_counter: FeatureVersion, - pub fetch_validator_version_votes: FeatureVersion, - pub fetch_proved_validator_version_votes: FeatureVersion, - pub remove_validators_proposed_app_versions: FeatureVersion, - pub update_validator_proposed_app_version: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveStructureVersion { - pub document_indexes: FeatureVersionBounds, - pub identity_indexes: FeatureVersionBounds, - pub pools: FeatureVersionBounds, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveIdentityMethodVersions { - pub fetch: DriveIdentityFetchMethodVersions, - pub prove: DriveIdentityProveMethodVersions, - pub keys: DriveIdentityKeysMethodVersions, - pub update: DriveIdentityUpdateMethodVersions, - pub insert: DriveIdentityInsertMethodVersions, - pub contract_info: DriveIdentityContractInfoMethodVersions, - pub cost_estimation: DriveIdentityCostEstimationMethodVersions, - pub withdrawals: DriveIdentityWithdrawalMethodVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveIdentityWithdrawalMethodVersions { - pub document: DriveIdentityWithdrawalDocumentMethodVersions, - pub transaction: DriveIdentityWithdrawalTransactionMethodVersions, - pub calculate_current_withdrawal_limit: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveIdentityWithdrawalDocumentMethodVersions { - pub fetch_oldest_withdrawal_documents_by_status: FeatureVersion, - pub find_withdrawal_documents_by_status_and_transaction_indices: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveIdentityWithdrawalTransactionMethodVersions { - pub index: DriveIdentityWithdrawalTransactionIndexMethodVersions, - pub queue: DriveIdentityWithdrawalTransactionQueueMethodVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveIdentityWithdrawalTransactionIndexMethodVersions { - pub fetch_next_withdrawal_transaction_index: FeatureVersion, - pub add_update_next_withdrawal_transaction_index_operation: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveIdentityWithdrawalTransactionQueueMethodVersions { - pub add_enqueue_untied_withdrawal_transaction_operations: FeatureVersion, - pub dequeue_untied_withdrawal_transactions: FeatureVersion, - pub remove_broadcasted_withdrawal_transactions_after_completion_operations: FeatureVersion, - pub move_broadcasted_withdrawal_transactions_back_to_queue_operations: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveIdentityContractInfoMethodVersions { - pub add_potential_contract_info_for_contract_bounded_key: FeatureVersion, - pub refresh_potential_contract_info_key_references: FeatureVersion, - pub merge_identity_contract_nonce: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveIdentityCostEstimationMethodVersions { - pub for_authentication_keys_security_level_in_key_reference_tree: FeatureVersion, - pub for_balances: FeatureVersion, - pub for_contract_info: FeatureVersion, - pub for_contract_info_group: FeatureVersion, - pub for_contract_info_group_keys: FeatureVersion, - pub for_contract_info_group_key_purpose: FeatureVersion, - pub for_keys_for_identity_id: FeatureVersion, - pub for_negative_credit: FeatureVersion, - pub for_purpose_in_key_reference_tree: FeatureVersion, - pub for_root_key_reference_tree: FeatureVersion, - pub for_update_revision: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveIdentityFetchMethodVersions { - pub public_key_hashes: DriveIdentityFetchPublicKeyHashesMethodVersions, - pub attributes: DriveIdentityFetchAttributesMethodVersions, - pub partial_identity: DriveIdentityFetchPartialIdentityMethodVersions, - pub full_identity: DriveIdentityFetchFullIdentityMethodVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveIdentityFetchPublicKeyHashesMethodVersions { - pub fetch_full_identities_by_unique_public_key_hashes: FeatureVersion, - pub fetch_full_identity_by_unique_public_key_hash: FeatureVersion, - pub fetch_identity_id_by_unique_public_key_hash: FeatureVersion, - pub fetch_identity_ids_by_non_unique_public_key_hash: FeatureVersion, - pub fetch_identity_ids_by_unique_public_key_hashes: FeatureVersion, - pub fetch_serialized_full_identity_by_unique_public_key_hash: FeatureVersion, - pub has_any_of_unique_public_key_hashes: FeatureVersion, - pub has_non_unique_public_key_hash: FeatureVersion, - pub has_non_unique_public_key_hash_already_for_identity: FeatureVersion, - pub has_unique_public_key_hash: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveIdentityFetchAttributesMethodVersions { - pub revision: FeatureVersion, - pub nonce: FeatureVersion, - pub identity_contract_nonce: FeatureVersion, - pub balance: FeatureVersion, - pub balance_include_debt: FeatureVersion, - pub negative_balance: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveIdentityFetchFullIdentityMethodVersions { - pub fetch_full_identity: OptionalFeatureVersion, - pub fetch_full_identities: OptionalFeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveIdentityFetchPartialIdentityMethodVersions { - pub fetch_identity_revision_with_keys: FeatureVersion, - pub fetch_identity_balance_with_keys: FeatureVersion, - pub fetch_identity_balance_with_keys_and_revision: FeatureVersion, - pub fetch_identity_with_balance: FeatureVersion, - pub fetch_identity_keys: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveIdentityProveMethodVersions { - pub full_identity: FeatureVersion, - pub full_identities: FeatureVersion, - pub identity_nonce: FeatureVersion, - pub identity_contract_nonce: FeatureVersion, - pub identities_contract_keys: FeatureVersion, - pub prove_full_identities_by_unique_public_key_hashes: FeatureVersion, - pub prove_full_identity_by_unique_public_key_hash: FeatureVersion, - pub prove_identity_id_by_unique_public_key_hash: FeatureVersion, - pub prove_identity_ids_by_unique_public_key_hashes: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveIdentityKeysMethodVersions { - pub fetch: DriveIdentityKeysFetchMethodVersions, - pub prove: DriveIdentityKeysProveMethodVersions, - pub insert: DriveIdentityKeysInsertMethodVersions, - pub insert_key_hash_identity_reference: DriveIdentityKeyHashesToIdentityInsertMethodVersions, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveIdentityKeysFetchMethodVersions { - pub fetch_all_current_identity_keys: FeatureVersion, - pub fetch_all_identity_keys: FeatureVersion, - pub fetch_identities_all_keys: FeatureVersion, - pub fetch_identity_keys: FeatureVersion, - pub fetch_identities_contract_keys: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveIdentityKeysProveMethodVersions { - pub prove_identities_all_keys: FeatureVersion, - pub prove_identity_keys: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveIdentityKeysInsertMethodVersions { - pub create_key_tree_with_keys: FeatureVersion, - pub create_new_identity_key_query_trees: FeatureVersion, - pub insert_key_searchable_references: FeatureVersion, - pub insert_key_to_storage: FeatureVersion, - pub insert_new_non_unique_key: FeatureVersion, - pub insert_new_unique_key: FeatureVersion, - pub replace_key_in_storage: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveIdentityKeyHashesToIdentityInsertMethodVersions { - pub add_estimation_costs_for_insert_non_unique_public_key_hash_reference: FeatureVersion, - pub add_estimation_costs_for_insert_unique_public_key_hash_reference: FeatureVersion, - pub insert_non_unique_public_key_hash_reference_to_identity: FeatureVersion, - pub insert_reference_to_non_unique_key: FeatureVersion, - pub insert_reference_to_unique_key: FeatureVersion, - pub insert_unique_public_key_hash_reference_to_identity: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveIdentityInsertMethodVersions { - pub add_new_identity: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveIdentityUpdateMethodVersions { - pub update_identity_revision: FeatureVersion, - pub merge_identity_nonce: FeatureVersion, - pub update_identity_negative_credit_operation: FeatureVersion, - pub initialize_identity_revision: FeatureVersion, - pub disable_identity_keys: FeatureVersion, - pub re_enable_identity_keys: FeatureVersion, - pub add_new_non_unique_keys_to_identity: FeatureVersion, - pub add_new_unique_keys_to_identity: FeatureVersion, - pub add_new_keys_to_identity: FeatureVersion, - pub insert_identity_balance: FeatureVersion, - pub initialize_negative_identity_balance: FeatureVersion, - pub add_to_identity_balance: FeatureVersion, - pub add_to_previous_balance: FeatureVersion, - pub apply_balance_change_from_fee_to_identity: FeatureVersion, - pub remove_from_identity_balance: FeatureVersion, - pub refresh_identity_key_reference_operations: FeatureVersion, -} - -#[derive(Clone, Debug, Default)] -pub struct DriveEstimatedCostsMethodVersions { - pub add_estimation_costs_for_levels_up_to_contract: FeatureVersion, - pub add_estimation_costs_for_levels_up_to_contract_document_type_excluded: FeatureVersion, - pub add_estimation_costs_for_contested_document_tree_levels_up_to_contract: FeatureVersion, - pub add_estimation_costs_for_contested_document_tree_levels_up_to_contract_document_type_excluded: - FeatureVersion, -} diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_contract_method_versions/mod.rs b/packages/rs-platform-version/src/version/drive_versions/drive_contract_method_versions/mod.rs new file mode 100644 index 0000000000..18cf2d3a4f --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_contract_method_versions/mod.rs @@ -0,0 +1,59 @@ +use versioned_feature_core::FeatureVersion; + +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct DriveContractMethodVersions { + pub prove: DriveContractProveMethodVersions, + pub apply: DriveContractApplyMethodVersions, + pub insert: DriveContractInsertMethodVersions, + pub update: DriveContractUpdateMethodVersions, + pub costs: DriveContractCostsMethodVersions, + pub get: DriveContractGetMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveContractProveMethodVersions { + pub prove_contract: FeatureVersion, + pub prove_contract_history: FeatureVersion, + pub prove_contracts: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveContractApplyMethodVersions { + pub apply_contract: FeatureVersion, + pub apply_contract_with_serialization: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveContractInsertMethodVersions { + pub add_contract_to_storage: FeatureVersion, + pub insert_contract: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveContractUpdateMethodVersions { + pub update_contract: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveContractGetMethodVersions { + pub fetch_contract: FeatureVersion, + pub fetch_contract_with_history: FeatureVersion, + pub get_cached_contract_with_fetch_info: FeatureVersion, + pub get_contract_with_fetch_info: FeatureVersion, + pub get_contracts_with_fetch_info: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveContractQueryMethodVersions { + pub fetch_contract_query: FeatureVersion, + pub fetch_contract_with_history_latest_query: FeatureVersion, + pub fetch_contracts_query: FeatureVersion, + pub fetch_contract_history_query: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveContractCostsMethodVersions { + pub add_estimation_costs_for_contract_insertion: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_contract_method_versions/v1.rs b/packages/rs-platform-version/src/version/drive_versions/drive_contract_method_versions/v1.rs new file mode 100644 index 0000000000..67824dafea --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_contract_method_versions/v1.rs @@ -0,0 +1,33 @@ +use crate::version::drive_versions::drive_contract_method_versions::{ + DriveContractApplyMethodVersions, DriveContractCostsMethodVersions, + DriveContractGetMethodVersions, DriveContractInsertMethodVersions, DriveContractMethodVersions, + DriveContractProveMethodVersions, DriveContractUpdateMethodVersions, +}; + +pub const DRIVE_CONTRACT_METHOD_VERSIONS_V1: DriveContractMethodVersions = + DriveContractMethodVersions { + prove: DriveContractProveMethodVersions { + prove_contract: 0, + prove_contract_history: 0, + prove_contracts: 0, + }, + apply: DriveContractApplyMethodVersions { + apply_contract: 0, + apply_contract_with_serialization: 0, + }, + insert: DriveContractInsertMethodVersions { + add_contract_to_storage: 0, + insert_contract: 0, + }, + update: DriveContractUpdateMethodVersions { update_contract: 0 }, + costs: DriveContractCostsMethodVersions { + add_estimation_costs_for_contract_insertion: 0, + }, + get: DriveContractGetMethodVersions { + fetch_contract: 0, + fetch_contract_with_history: 0, + get_cached_contract_with_fetch_info: 0, + get_contract_with_fetch_info: 0, + get_contracts_with_fetch_info: 0, + }, + }; diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_credit_pool_method_versions/mod.rs b/packages/rs-platform-version/src/version/drive_versions/drive_credit_pool_method_versions/mod.rs new file mode 100644 index 0000000000..0d116b4104 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_credit_pool_method_versions/mod.rs @@ -0,0 +1,49 @@ +use versioned_feature_core::FeatureVersion; +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct DriveCreditPoolMethodVersions { + pub epochs: DriveCreditPoolEpochsMethodVersions, + pub pending_epoch_refunds: DriveCreditPoolPendingEpochRefundsMethodVersions, + pub storage_fee_distribution_pool: DriveCreditPoolStorageFeeDistributionPoolMethodVersions, + pub unpaid_epoch: DriveCreditPoolUnpaidEpochMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveCreditPoolEpochsMethodVersions { + pub get_epochs_infos: FeatureVersion, + pub get_epochs_protocol_versions: FeatureVersion, + pub prove_epochs_infos: FeatureVersion, + pub get_epoch_fee_multiplier: FeatureVersion, + pub get_epoch_processing_credits_for_distribution: FeatureVersion, + pub get_epoch_storage_credits_for_distribution: FeatureVersion, + pub get_epoch_total_credits_for_distribution: FeatureVersion, + pub get_storage_credits_for_distribution_for_epochs_in_range: FeatureVersion, + pub get_epoch_start_time: FeatureVersion, + pub get_epoch_start_block_core_height: FeatureVersion, + pub get_epoch_start_block_height: FeatureVersion, + pub get_first_epoch_start_block_info_between_epochs: FeatureVersion, + pub fetch_epoch_proposers: FeatureVersion, + pub prove_epoch_proposers: FeatureVersion, + pub get_epochs_proposer_block_count: FeatureVersion, + pub add_update_pending_epoch_refunds_operations: FeatureVersion, + pub is_epochs_proposers_tree_empty: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveCreditPoolUnpaidEpochMethodVersions { + pub get_unpaid_epoch_index: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveCreditPoolPendingEpochRefundsMethodVersions { + pub add_delete_pending_epoch_refunds_except_specified: FeatureVersion, + pub fetch_and_add_pending_epoch_refunds_to_collection: FeatureVersion, + pub fetch_pending_epoch_refunds: FeatureVersion, + pub add_update_pending_epoch_refunds_operations: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveCreditPoolStorageFeeDistributionPoolMethodVersions { + pub get_storage_fees_from_distribution_pool: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_credit_pool_method_versions/v1.rs b/packages/rs-platform-version/src/version/drive_versions/drive_credit_pool_method_versions/v1.rs new file mode 100644 index 0000000000..4311729886 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_credit_pool_method_versions/v1.rs @@ -0,0 +1,41 @@ +use crate::version::drive_versions::drive_credit_pool_method_versions::{ + DriveCreditPoolEpochsMethodVersions, DriveCreditPoolMethodVersions, + DriveCreditPoolPendingEpochRefundsMethodVersions, + DriveCreditPoolStorageFeeDistributionPoolMethodVersions, + DriveCreditPoolUnpaidEpochMethodVersions, +}; + +pub const CREDIT_POOL_METHOD_VERSIONS_V1: DriveCreditPoolMethodVersions = + DriveCreditPoolMethodVersions { + epochs: DriveCreditPoolEpochsMethodVersions { + get_epochs_infos: 0, + get_epochs_protocol_versions: 0, + prove_epochs_infos: 0, + get_epoch_fee_multiplier: 0, + get_epoch_processing_credits_for_distribution: 0, + get_epoch_storage_credits_for_distribution: 0, + get_epoch_total_credits_for_distribution: 0, + get_storage_credits_for_distribution_for_epochs_in_range: 0, + get_epoch_start_time: 0, + get_epoch_start_block_core_height: 0, + get_epoch_start_block_height: 0, + get_first_epoch_start_block_info_between_epochs: 0, + fetch_epoch_proposers: 0, + prove_epoch_proposers: 0, + get_epochs_proposer_block_count: 0, + add_update_pending_epoch_refunds_operations: 0, + is_epochs_proposers_tree_empty: 0, + }, + pending_epoch_refunds: DriveCreditPoolPendingEpochRefundsMethodVersions { + add_delete_pending_epoch_refunds_except_specified: 0, + fetch_and_add_pending_epoch_refunds_to_collection: 0, + fetch_pending_epoch_refunds: 0, + add_update_pending_epoch_refunds_operations: 0, + }, + storage_fee_distribution_pool: DriveCreditPoolStorageFeeDistributionPoolMethodVersions { + get_storage_fees_from_distribution_pool: 0, + }, + unpaid_epoch: DriveCreditPoolUnpaidEpochMethodVersions { + get_unpaid_epoch_index: 0, + }, + }; diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/mod.rs b/packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/mod.rs new file mode 100644 index 0000000000..12eebc7386 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/mod.rs @@ -0,0 +1,90 @@ +use versioned_feature_core::FeatureVersion; + +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct DriveDocumentMethodVersions { + pub query: DriveDocumentQueryMethodVersions, + pub delete: DriveDocumentDeleteMethodVersions, + pub insert: DriveDocumentInsertMethodVersions, + pub insert_contested: DriveDocumentInsertContestedMethodVersions, + pub update: DriveDocumentUpdateMethodVersions, + pub estimation_costs: DriveDocumentEstimationCostsMethodVersions, + pub index_uniqueness: DriveDocumentIndexUniquenessMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveDocumentQueryMethodVersions { + pub query_documents: FeatureVersion, + pub query_contested_documents: FeatureVersion, + pub query_contested_documents_vote_state: FeatureVersion, + pub query_documents_with_flags: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveDocumentEstimationCostsMethodVersions { + pub add_estimation_costs_for_add_document_to_primary_storage: FeatureVersion, + pub add_estimation_costs_for_add_contested_document_to_primary_storage: FeatureVersion, + pub stateless_delete_of_non_tree_for_costs: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveDocumentInsertMethodVersions { + pub add_document: FeatureVersion, + pub add_document_for_contract: FeatureVersion, + pub add_document_for_contract_apply_and_add_to_operations: FeatureVersion, + pub add_document_for_contract_operations: FeatureVersion, + pub add_document_to_primary_storage: FeatureVersion, + pub add_indices_for_index_level_for_contract_operations: FeatureVersion, + pub add_indices_for_top_index_level_for_contract_operations: FeatureVersion, + pub add_reference_for_index_level_for_contract_operations: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveDocumentInsertContestedMethodVersions { + pub add_contested_document: FeatureVersion, + pub add_contested_document_for_contract: FeatureVersion, + pub add_contested_document_for_contract_apply_and_add_to_operations: FeatureVersion, + pub add_contested_document_for_contract_operations: FeatureVersion, + pub add_contested_document_to_primary_storage: FeatureVersion, + pub add_contested_indices_for_contract_operations: FeatureVersion, + pub add_contested_reference_and_vote_subtree_to_document_operations: FeatureVersion, + pub add_contested_vote_subtree_for_non_identities_operations: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveDocumentUpdateMethodVersions { + pub add_update_multiple_documents_operations: FeatureVersion, + pub update_document_for_contract: FeatureVersion, + pub update_document_for_contract_apply_and_add_to_operations: FeatureVersion, + pub update_document_for_contract_id: FeatureVersion, + pub update_document_for_contract_operations: FeatureVersion, + pub update_document_with_serialization_for_contract: FeatureVersion, + pub update_serialized_document_for_contract: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveDocumentDeleteMethodVersions { + pub add_estimation_costs_for_remove_document_to_primary_storage: FeatureVersion, + pub delete_document_for_contract: FeatureVersion, + pub delete_document_for_contract_id: FeatureVersion, + pub delete_document_for_contract_apply_and_add_to_operations: FeatureVersion, + pub remove_document_from_primary_storage: FeatureVersion, + pub remove_reference_for_index_level_for_contract_operations: FeatureVersion, + pub remove_indices_for_index_level_for_contract_operations: FeatureVersion, + pub remove_indices_for_top_index_level_for_contract_operations: FeatureVersion, + pub delete_document_for_contract_id_with_named_type_operations: FeatureVersion, + pub delete_document_for_contract_with_named_type_operations: FeatureVersion, + pub delete_document_for_contract_operations: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveDocumentIndexUniquenessMethodVersions { + pub validate_document_uniqueness: FeatureVersion, + pub validate_document_create_transition_action_uniqueness: FeatureVersion, + pub validate_document_replace_transition_action_uniqueness: FeatureVersion, + pub validate_document_transfer_transition_action_uniqueness: FeatureVersion, + pub validate_document_purchase_transition_action_uniqueness: FeatureVersion, + pub validate_document_update_price_transition_action_uniqueness: FeatureVersion, + pub validate_uniqueness_of_data: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/v1.rs b/packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/v1.rs new file mode 100644 index 0000000000..05479b23e9 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/v1.rs @@ -0,0 +1,72 @@ +use crate::version::drive_versions::drive_document_method_versions::{ + DriveDocumentDeleteMethodVersions, DriveDocumentEstimationCostsMethodVersions, + DriveDocumentIndexUniquenessMethodVersions, DriveDocumentInsertContestedMethodVersions, + DriveDocumentInsertMethodVersions, DriveDocumentMethodVersions, + DriveDocumentQueryMethodVersions, DriveDocumentUpdateMethodVersions, +}; + +pub const DRIVE_DOCUMENT_METHOD_VERSIONS_V1: DriveDocumentMethodVersions = + DriveDocumentMethodVersions { + query: DriveDocumentQueryMethodVersions { + query_documents: 0, + query_contested_documents: 0, + query_contested_documents_vote_state: 0, + query_documents_with_flags: 0, + }, + delete: DriveDocumentDeleteMethodVersions { + add_estimation_costs_for_remove_document_to_primary_storage: 0, + delete_document_for_contract: 0, + delete_document_for_contract_id: 0, + delete_document_for_contract_apply_and_add_to_operations: 0, + remove_document_from_primary_storage: 0, + remove_reference_for_index_level_for_contract_operations: 0, + remove_indices_for_index_level_for_contract_operations: 0, + remove_indices_for_top_index_level_for_contract_operations: 0, + delete_document_for_contract_id_with_named_type_operations: 0, + delete_document_for_contract_with_named_type_operations: 0, + delete_document_for_contract_operations: 0, + }, + insert: DriveDocumentInsertMethodVersions { + add_document: 0, + add_document_for_contract: 0, + add_document_for_contract_apply_and_add_to_operations: 0, + add_document_for_contract_operations: 0, + add_document_to_primary_storage: 0, + add_indices_for_index_level_for_contract_operations: 0, + add_indices_for_top_index_level_for_contract_operations: 0, + add_reference_for_index_level_for_contract_operations: 0, + }, + insert_contested: DriveDocumentInsertContestedMethodVersions { + add_contested_document: 0, + add_contested_document_for_contract: 0, + add_contested_document_for_contract_apply_and_add_to_operations: 0, + add_contested_document_for_contract_operations: 0, + add_contested_document_to_primary_storage: 0, + add_contested_indices_for_contract_operations: 0, + add_contested_reference_and_vote_subtree_to_document_operations: 0, + add_contested_vote_subtree_for_non_identities_operations: 0, + }, + update: DriveDocumentUpdateMethodVersions { + add_update_multiple_documents_operations: 0, + update_document_for_contract: 0, + update_document_for_contract_apply_and_add_to_operations: 0, + update_document_for_contract_id: 0, + update_document_for_contract_operations: 0, + update_document_with_serialization_for_contract: 0, + update_serialized_document_for_contract: 0, + }, + estimation_costs: DriveDocumentEstimationCostsMethodVersions { + add_estimation_costs_for_add_document_to_primary_storage: 0, + add_estimation_costs_for_add_contested_document_to_primary_storage: 0, + stateless_delete_of_non_tree_for_costs: 0, + }, + index_uniqueness: DriveDocumentIndexUniquenessMethodVersions { + validate_document_uniqueness: 0, + validate_document_create_transition_action_uniqueness: 0, + validate_document_replace_transition_action_uniqueness: 0, + validate_document_transfer_transition_action_uniqueness: 0, + validate_document_purchase_transition_action_uniqueness: 0, + validate_document_update_price_transition_action_uniqueness: 0, + validate_uniqueness_of_data: 0, + }, + }; diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_grove_method_versions/mod.rs b/packages/rs-platform-version/src/version/drive_versions/drive_grove_method_versions/mod.rs new file mode 100644 index 0000000000..c61b52f250 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_grove_method_versions/mod.rs @@ -0,0 +1,66 @@ +use versioned_feature_core::FeatureVersion; + +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct DriveGroveMethodVersions { + pub basic: DriveGroveBasicMethodVersions, + pub batch: DriveGroveBatchMethodVersions, + pub apply: DriveGroveApplyMethodVersions, + pub costs: DriveGroveCostMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveGroveBasicMethodVersions { + pub grove_insert: FeatureVersion, + pub grove_insert_empty_tree: FeatureVersion, + pub grove_insert_empty_sum_tree: FeatureVersion, + pub grove_insert_if_not_exists: FeatureVersion, + pub grove_insert_if_not_exists_return_existing_element: FeatureVersion, + pub grove_clear: FeatureVersion, + pub grove_delete: FeatureVersion, + pub grove_get_raw: FeatureVersion, + pub grove_get_raw_optional: FeatureVersion, + pub grove_get_raw_value_u64_from_encoded_var_vec: FeatureVersion, + pub grove_get: FeatureVersion, + pub grove_get_path_query_serialized_results: FeatureVersion, + pub grove_get_path_query_serialized_or_sum_results: FeatureVersion, + pub grove_get_path_query: FeatureVersion, + pub grove_get_path_query_with_optional: FeatureVersion, + pub grove_get_raw_path_query_with_optional: FeatureVersion, + pub grove_get_raw_path_query: FeatureVersion, + pub grove_get_proved_path_query: FeatureVersion, + pub grove_get_proved_path_query_with_conditional: FeatureVersion, + pub grove_get_sum_tree_total_value: FeatureVersion, + pub grove_has_raw: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveGroveBatchMethodVersions { + pub batch_insert_empty_tree: FeatureVersion, + pub batch_insert_empty_tree_if_not_exists: FeatureVersion, + pub batch_insert_empty_tree_if_not_exists_check_existing_operations: FeatureVersion, + pub batch_insert_sum_item_or_add_to_if_already_exists: FeatureVersion, + pub batch_insert: FeatureVersion, + pub batch_insert_if_not_exists: FeatureVersion, + pub batch_insert_if_changed_value: FeatureVersion, + pub batch_replace: FeatureVersion, + pub batch_delete: FeatureVersion, + pub batch_delete_items_in_path_query: FeatureVersion, + pub batch_move_items_in_path_query: FeatureVersion, + pub batch_remove_raw: FeatureVersion, + pub batch_delete_up_tree_while_empty: FeatureVersion, + pub batch_refresh_reference: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveGroveApplyMethodVersions { + pub grove_apply_operation: FeatureVersion, + pub grove_apply_batch: FeatureVersion, + pub grove_apply_partial_batch: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveGroveCostMethodVersions { + pub grove_batch_operations_costs: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_grove_method_versions/v1.rs b/packages/rs-platform-version/src/version/drive_versions/drive_grove_method_versions/v1.rs new file mode 100644 index 0000000000..6dc9b44503 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_grove_method_versions/v1.rs @@ -0,0 +1,54 @@ +use crate::version::drive_versions::drive_grove_method_versions::{ + DriveGroveApplyMethodVersions, DriveGroveBasicMethodVersions, DriveGroveBatchMethodVersions, + DriveGroveCostMethodVersions, DriveGroveMethodVersions, +}; + +pub const DRIVE_GROVE_METHOD_VERSIONS_V1: DriveGroveMethodVersions = DriveGroveMethodVersions { + basic: DriveGroveBasicMethodVersions { + grove_insert: 0, + grove_insert_empty_tree: 0, + grove_insert_empty_sum_tree: 0, + grove_insert_if_not_exists: 0, + grove_insert_if_not_exists_return_existing_element: 0, + grove_clear: 0, + grove_delete: 0, + grove_get_raw: 0, + grove_get_raw_optional: 0, + grove_get_raw_value_u64_from_encoded_var_vec: 0, + grove_get: 0, + grove_get_path_query_serialized_results: 0, + grove_get_path_query_serialized_or_sum_results: 0, + grove_get_path_query: 0, + grove_get_path_query_with_optional: 0, + grove_get_raw_path_query_with_optional: 0, + grove_get_raw_path_query: 0, + grove_get_proved_path_query: 0, + grove_get_proved_path_query_with_conditional: 0, + grove_get_sum_tree_total_value: 0, + grove_has_raw: 0, + }, + batch: DriveGroveBatchMethodVersions { + batch_insert_empty_tree: 0, + batch_insert_empty_tree_if_not_exists: 0, + batch_insert_empty_tree_if_not_exists_check_existing_operations: 0, + batch_insert_sum_item_or_add_to_if_already_exists: 0, + batch_insert: 0, + batch_insert_if_not_exists: 0, + batch_insert_if_changed_value: 0, + batch_replace: 0, + batch_delete: 0, + batch_delete_items_in_path_query: 0, + batch_move_items_in_path_query: 0, + batch_remove_raw: 0, + batch_delete_up_tree_while_empty: 0, + batch_refresh_reference: 0, + }, + apply: DriveGroveApplyMethodVersions { + grove_apply_operation: 0, + grove_apply_batch: 0, + grove_apply_partial_batch: 0, + }, + costs: DriveGroveCostMethodVersions { + grove_batch_operations_costs: 0, + }, +}; diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_identity_method_versions/mod.rs b/packages/rs-platform-version/src/version/drive_versions/drive_identity_method_versions/mod.rs new file mode 100644 index 0000000000..c44788e4c3 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_identity_method_versions/mod.rs @@ -0,0 +1,199 @@ +use versioned_feature_core::{FeatureVersion, OptionalFeatureVersion}; + +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityMethodVersions { + pub fetch: DriveIdentityFetchMethodVersions, + pub prove: DriveIdentityProveMethodVersions, + pub keys: DriveIdentityKeysMethodVersions, + pub update: DriveIdentityUpdateMethodVersions, + pub insert: DriveIdentityInsertMethodVersions, + pub contract_info: DriveIdentityContractInfoMethodVersions, + pub cost_estimation: DriveIdentityCostEstimationMethodVersions, + pub withdrawals: DriveIdentityWithdrawalMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityWithdrawalMethodVersions { + pub document: DriveIdentityWithdrawalDocumentMethodVersions, + pub transaction: DriveIdentityWithdrawalTransactionMethodVersions, + pub calculate_current_withdrawal_limit: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityWithdrawalDocumentMethodVersions { + pub fetch_oldest_withdrawal_documents_by_status: FeatureVersion, + pub find_withdrawal_documents_by_status_and_transaction_indices: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityWithdrawalTransactionMethodVersions { + pub index: DriveIdentityWithdrawalTransactionIndexMethodVersions, + pub queue: DriveIdentityWithdrawalTransactionQueueMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityWithdrawalTransactionIndexMethodVersions { + pub fetch_next_withdrawal_transaction_index: FeatureVersion, + pub add_update_next_withdrawal_transaction_index_operation: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityWithdrawalTransactionQueueMethodVersions { + pub add_enqueue_untied_withdrawal_transaction_operations: FeatureVersion, + pub dequeue_untied_withdrawal_transactions: FeatureVersion, + pub remove_broadcasted_withdrawal_transactions_after_completion_operations: FeatureVersion, + pub move_broadcasted_withdrawal_transactions_back_to_queue_operations: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityContractInfoMethodVersions { + pub add_potential_contract_info_for_contract_bounded_key: FeatureVersion, + pub refresh_potential_contract_info_key_references: FeatureVersion, + pub merge_identity_contract_nonce: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityCostEstimationMethodVersions { + pub for_authentication_keys_security_level_in_key_reference_tree: FeatureVersion, + pub for_balances: FeatureVersion, + pub for_contract_info: FeatureVersion, + pub for_contract_info_group: FeatureVersion, + pub for_contract_info_group_keys: FeatureVersion, + pub for_contract_info_group_key_purpose: FeatureVersion, + pub for_keys_for_identity_id: FeatureVersion, + pub for_negative_credit: FeatureVersion, + pub for_purpose_in_key_reference_tree: FeatureVersion, + pub for_root_key_reference_tree: FeatureVersion, + pub for_update_revision: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityFetchMethodVersions { + pub public_key_hashes: DriveIdentityFetchPublicKeyHashesMethodVersions, + pub attributes: DriveIdentityFetchAttributesMethodVersions, + pub partial_identity: DriveIdentityFetchPartialIdentityMethodVersions, + pub full_identity: DriveIdentityFetchFullIdentityMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityFetchPublicKeyHashesMethodVersions { + pub fetch_full_identities_by_unique_public_key_hashes: FeatureVersion, + pub fetch_full_identity_by_unique_public_key_hash: FeatureVersion, + pub fetch_identity_id_by_unique_public_key_hash: FeatureVersion, + pub fetch_identity_ids_by_non_unique_public_key_hash: FeatureVersion, + pub fetch_identity_ids_by_unique_public_key_hashes: FeatureVersion, + pub fetch_serialized_full_identity_by_unique_public_key_hash: FeatureVersion, + pub has_any_of_unique_public_key_hashes: FeatureVersion, + pub has_non_unique_public_key_hash: FeatureVersion, + pub has_non_unique_public_key_hash_already_for_identity: FeatureVersion, + pub has_unique_public_key_hash: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityFetchAttributesMethodVersions { + pub revision: FeatureVersion, + pub nonce: FeatureVersion, + pub identity_contract_nonce: FeatureVersion, + pub balance: FeatureVersion, + pub balance_include_debt: FeatureVersion, + pub negative_balance: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityFetchFullIdentityMethodVersions { + pub fetch_full_identity: OptionalFeatureVersion, + pub fetch_full_identities: OptionalFeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityFetchPartialIdentityMethodVersions { + pub fetch_identity_revision_with_keys: FeatureVersion, + pub fetch_identity_balance_with_keys: FeatureVersion, + pub fetch_identity_balance_with_keys_and_revision: FeatureVersion, + pub fetch_identity_with_balance: FeatureVersion, + pub fetch_identity_keys: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityProveMethodVersions { + pub full_identity: FeatureVersion, + pub full_identities: FeatureVersion, + pub identity_nonce: FeatureVersion, + pub identity_contract_nonce: FeatureVersion, + pub identities_contract_keys: FeatureVersion, + pub prove_full_identities_by_unique_public_key_hashes: FeatureVersion, + pub prove_full_identity_by_unique_public_key_hash: FeatureVersion, + pub prove_identity_id_by_unique_public_key_hash: FeatureVersion, + pub prove_identity_ids_by_unique_public_key_hashes: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityKeysMethodVersions { + pub fetch: DriveIdentityKeysFetchMethodVersions, + pub prove: DriveIdentityKeysProveMethodVersions, + pub insert: DriveIdentityKeysInsertMethodVersions, + pub insert_key_hash_identity_reference: DriveIdentityKeyHashesToIdentityInsertMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityKeysFetchMethodVersions { + pub fetch_all_current_identity_keys: FeatureVersion, + pub fetch_all_identity_keys: FeatureVersion, + pub fetch_identities_all_keys: FeatureVersion, + pub fetch_identity_keys: FeatureVersion, + pub fetch_identities_contract_keys: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityKeysProveMethodVersions { + pub prove_identities_all_keys: FeatureVersion, + pub prove_identity_keys: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityKeysInsertMethodVersions { + pub create_key_tree_with_keys: FeatureVersion, + pub create_new_identity_key_query_trees: FeatureVersion, + pub insert_key_searchable_references: FeatureVersion, + pub insert_key_to_storage: FeatureVersion, + pub insert_new_non_unique_key: FeatureVersion, + pub insert_new_unique_key: FeatureVersion, + pub replace_key_in_storage: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityKeyHashesToIdentityInsertMethodVersions { + pub add_estimation_costs_for_insert_non_unique_public_key_hash_reference: FeatureVersion, + pub add_estimation_costs_for_insert_unique_public_key_hash_reference: FeatureVersion, + pub insert_non_unique_public_key_hash_reference_to_identity: FeatureVersion, + pub insert_reference_to_non_unique_key: FeatureVersion, + pub insert_reference_to_unique_key: FeatureVersion, + pub insert_unique_public_key_hash_reference_to_identity: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityInsertMethodVersions { + pub add_new_identity: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityUpdateMethodVersions { + pub update_identity_revision: FeatureVersion, + pub merge_identity_nonce: FeatureVersion, + pub update_identity_negative_credit_operation: FeatureVersion, + pub initialize_identity_revision: FeatureVersion, + pub disable_identity_keys: FeatureVersion, + pub re_enable_identity_keys: FeatureVersion, + pub add_new_non_unique_keys_to_identity: FeatureVersion, + pub add_new_unique_keys_to_identity: FeatureVersion, + pub add_new_keys_to_identity: FeatureVersion, + pub insert_identity_balance: FeatureVersion, + pub initialize_negative_identity_balance: FeatureVersion, + pub add_to_identity_balance: FeatureVersion, + pub add_to_previous_balance: FeatureVersion, + pub apply_balance_change_from_fee_to_identity: FeatureVersion, + pub remove_from_identity_balance: FeatureVersion, + pub refresh_identity_key_reference_operations: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_identity_method_versions/v1.rs b/packages/rs-platform-version/src/version/drive_versions/drive_identity_method_versions/v1.rs new file mode 100644 index 0000000000..098f38ab7c --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_identity_method_versions/v1.rs @@ -0,0 +1,151 @@ +use crate::version::drive_versions::drive_identity_method_versions::{ + DriveIdentityContractInfoMethodVersions, DriveIdentityCostEstimationMethodVersions, + DriveIdentityFetchAttributesMethodVersions, DriveIdentityFetchFullIdentityMethodVersions, + DriveIdentityFetchMethodVersions, DriveIdentityFetchPartialIdentityMethodVersions, + DriveIdentityFetchPublicKeyHashesMethodVersions, DriveIdentityInsertMethodVersions, + DriveIdentityKeyHashesToIdentityInsertMethodVersions, DriveIdentityKeysFetchMethodVersions, + DriveIdentityKeysInsertMethodVersions, DriveIdentityKeysMethodVersions, + DriveIdentityKeysProveMethodVersions, DriveIdentityMethodVersions, + DriveIdentityProveMethodVersions, DriveIdentityUpdateMethodVersions, + DriveIdentityWithdrawalDocumentMethodVersions, DriveIdentityWithdrawalMethodVersions, + DriveIdentityWithdrawalTransactionIndexMethodVersions, + DriveIdentityWithdrawalTransactionMethodVersions, + DriveIdentityWithdrawalTransactionQueueMethodVersions, +}; + +pub const DRIVE_IDENTITY_METHOD_VERSIONS_V1: DriveIdentityMethodVersions = + DriveIdentityMethodVersions { + fetch: DriveIdentityFetchMethodVersions { + public_key_hashes: DriveIdentityFetchPublicKeyHashesMethodVersions { + fetch_full_identities_by_unique_public_key_hashes: 0, + fetch_full_identity_by_unique_public_key_hash: 0, + fetch_identity_id_by_unique_public_key_hash: 0, + fetch_identity_ids_by_non_unique_public_key_hash: 0, + fetch_identity_ids_by_unique_public_key_hashes: 0, + fetch_serialized_full_identity_by_unique_public_key_hash: 0, + has_any_of_unique_public_key_hashes: 0, + has_non_unique_public_key_hash: 0, + has_non_unique_public_key_hash_already_for_identity: 0, + has_unique_public_key_hash: 0, + }, + attributes: DriveIdentityFetchAttributesMethodVersions { + revision: 0, + nonce: 0, + identity_contract_nonce: 0, + balance: 0, + balance_include_debt: 0, + negative_balance: 0, + }, + partial_identity: DriveIdentityFetchPartialIdentityMethodVersions { + fetch_identity_revision_with_keys: 0, + fetch_identity_balance_with_keys: 0, + fetch_identity_balance_with_keys_and_revision: 0, + fetch_identity_with_balance: 0, + fetch_identity_keys: 0, + }, + full_identity: DriveIdentityFetchFullIdentityMethodVersions { + fetch_full_identity: Some(0), + fetch_full_identities: Some(0), + }, + }, + prove: DriveIdentityProveMethodVersions { + full_identity: 0, + full_identities: 0, + identity_nonce: 0, + identity_contract_nonce: 0, + identities_contract_keys: 0, + prove_full_identities_by_unique_public_key_hashes: 0, + prove_full_identity_by_unique_public_key_hash: 0, + prove_identity_id_by_unique_public_key_hash: 0, + prove_identity_ids_by_unique_public_key_hashes: 0, + }, + keys: DriveIdentityKeysMethodVersions { + fetch: DriveIdentityKeysFetchMethodVersions { + fetch_all_current_identity_keys: 0, + fetch_all_identity_keys: 0, + fetch_identities_all_keys: 0, + fetch_identity_keys: 0, + fetch_identities_contract_keys: 0, + }, + prove: DriveIdentityKeysProveMethodVersions { + prove_identities_all_keys: 0, + prove_identity_keys: 0, + }, + insert: DriveIdentityKeysInsertMethodVersions { + create_key_tree_with_keys: 0, + create_new_identity_key_query_trees: 0, + insert_key_searchable_references: 0, + insert_key_to_storage: 0, + insert_new_non_unique_key: 0, + insert_new_unique_key: 0, + replace_key_in_storage: 0, + }, + insert_key_hash_identity_reference: + DriveIdentityKeyHashesToIdentityInsertMethodVersions { + add_estimation_costs_for_insert_non_unique_public_key_hash_reference: 0, + add_estimation_costs_for_insert_unique_public_key_hash_reference: 0, + insert_non_unique_public_key_hash_reference_to_identity: 0, + insert_reference_to_non_unique_key: 0, + insert_reference_to_unique_key: 0, + insert_unique_public_key_hash_reference_to_identity: 0, + }, + }, + update: DriveIdentityUpdateMethodVersions { + update_identity_revision: 0, + merge_identity_nonce: 0, + update_identity_negative_credit_operation: 0, + initialize_identity_revision: 0, + disable_identity_keys: 0, + re_enable_identity_keys: 0, + add_new_non_unique_keys_to_identity: 0, + add_new_unique_keys_to_identity: 0, + add_new_keys_to_identity: 0, + insert_identity_balance: 0, + initialize_negative_identity_balance: 0, + add_to_identity_balance: 0, + add_to_previous_balance: 0, + apply_balance_change_from_fee_to_identity: 0, + remove_from_identity_balance: 0, + refresh_identity_key_reference_operations: 0, + }, + insert: DriveIdentityInsertMethodVersions { + add_new_identity: 0, + }, + contract_info: DriveIdentityContractInfoMethodVersions { + add_potential_contract_info_for_contract_bounded_key: 0, + refresh_potential_contract_info_key_references: 0, + merge_identity_contract_nonce: 0, + }, + cost_estimation: DriveIdentityCostEstimationMethodVersions { + for_authentication_keys_security_level_in_key_reference_tree: 0, + for_balances: 0, + for_contract_info: 0, + for_contract_info_group: 0, + for_contract_info_group_keys: 0, + for_contract_info_group_key_purpose: 0, + for_keys_for_identity_id: 0, + for_negative_credit: 0, + for_purpose_in_key_reference_tree: 0, + for_root_key_reference_tree: 0, + for_update_revision: 0, + }, + withdrawals: DriveIdentityWithdrawalMethodVersions { + document: DriveIdentityWithdrawalDocumentMethodVersions { + fetch_oldest_withdrawal_documents_by_status: 0, + find_withdrawal_documents_by_status_and_transaction_indices: 0, + }, + transaction: DriveIdentityWithdrawalTransactionMethodVersions { + index: DriveIdentityWithdrawalTransactionIndexMethodVersions { + fetch_next_withdrawal_transaction_index: 0, + add_update_next_withdrawal_transaction_index_operation: 0, + }, + queue: DriveIdentityWithdrawalTransactionQueueMethodVersions { + add_enqueue_untied_withdrawal_transaction_operations: 0, + dequeue_untied_withdrawal_transactions: 0, + remove_broadcasted_withdrawal_transactions_after_completion_operations: 0, + move_broadcasted_withdrawal_transactions_back_to_queue_operations: 0, + }, + }, + calculate_current_withdrawal_limit: 0, + }, + }; diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_state_transition_method_versions/mod.rs b/packages/rs-platform-version/src/version/drive_versions/drive_state_transition_method_versions/mod.rs new file mode 100644 index 0000000000..c482548908 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_state_transition_method_versions/mod.rs @@ -0,0 +1,39 @@ +pub mod v1; + +use crate::version::drive_versions::DriveDataContractOperationMethodVersions; +use versioned_feature_core::FeatureVersion; + +#[derive(Clone, Debug, Default)] +pub struct DriveStateTransitionMethodVersions { + pub operations: DriveStateTransitionOperationMethodVersions, + pub convert_to_high_level_operations: + DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions { + pub data_contract_create_transition: FeatureVersion, + pub data_contract_update_transition: FeatureVersion, + pub document_create_transition: FeatureVersion, + pub document_delete_transition: FeatureVersion, + pub document_purchase_transition: FeatureVersion, + pub document_replace_transition: FeatureVersion, + pub document_transfer_transition: FeatureVersion, + pub document_update_price_transition: FeatureVersion, + pub documents_batch_transition: FeatureVersion, + pub identity_create_transition: FeatureVersion, + pub identity_credit_transfer_transition: FeatureVersion, + pub identity_credit_withdrawal_transition: FeatureVersion, + pub identity_top_up_transition: FeatureVersion, + pub identity_update_transition: FeatureVersion, + pub masternode_vote_transition: FeatureVersion, + pub bump_identity_data_contract_nonce: FeatureVersion, + pub bump_identity_nonce: FeatureVersion, + pub partially_use_asset_lock: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveStateTransitionOperationMethodVersions { + pub finalization_tasks: FeatureVersion, + pub contracts: DriveDataContractOperationMethodVersions, +} diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_state_transition_method_versions/v1.rs b/packages/rs-platform-version/src/version/drive_versions/drive_state_transition_method_versions/v1.rs new file mode 100644 index 0000000000..45e732c99c --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_state_transition_method_versions/v1.rs @@ -0,0 +1,36 @@ +use crate::version::drive_versions::drive_state_transition_method_versions::{ + DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions, + DriveStateTransitionMethodVersions, DriveStateTransitionOperationMethodVersions, +}; +use crate::version::drive_versions::DriveDataContractOperationMethodVersions; + +pub const DRIVE_STATE_TRANSITION_METHOD_VERSIONS_V1: DriveStateTransitionMethodVersions = + DriveStateTransitionMethodVersions { + operations: DriveStateTransitionOperationMethodVersions { + finalization_tasks: 0, + contracts: DriveDataContractOperationMethodVersions { + finalization_tasks: 0, + }, + }, + convert_to_high_level_operations: + DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions { + data_contract_create_transition: 0, + data_contract_update_transition: 0, + document_create_transition: 0, + document_delete_transition: 0, + document_purchase_transition: 0, + document_replace_transition: 0, + document_transfer_transition: 0, + document_update_price_transition: 0, + documents_batch_transition: 0, + identity_create_transition: 0, + identity_credit_transfer_transition: 0, + identity_credit_withdrawal_transition: 0, + identity_top_up_transition: 0, + identity_update_transition: 0, + masternode_vote_transition: 0, + bump_identity_data_contract_nonce: 0, + bump_identity_nonce: 0, + partially_use_asset_lock: 0, + }, + }; diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_structure_version/mod.rs b/packages/rs-platform-version/src/version/drive_versions/drive_structure_version/mod.rs new file mode 100644 index 0000000000..474942c469 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_structure_version/mod.rs @@ -0,0 +1,10 @@ +use versioned_feature_core::FeatureVersionBounds; + +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct DriveStructureVersion { + pub document_indexes: FeatureVersionBounds, + pub identity_indexes: FeatureVersionBounds, + pub pools: FeatureVersionBounds, +} diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_structure_version/v1.rs b/packages/rs-platform-version/src/version/drive_versions/drive_structure_version/v1.rs new file mode 100644 index 0000000000..be8dc19b27 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_structure_version/v1.rs @@ -0,0 +1,20 @@ +use crate::version::drive_versions::drive_structure_version::DriveStructureVersion; +use versioned_feature_core::FeatureVersionBounds; + +pub const DRIVE_STRUCTURE_V1: DriveStructureVersion = DriveStructureVersion { + document_indexes: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_indexes: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + pools: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, +}; diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_verify_method_versions/mod.rs b/packages/rs-platform-version/src/version/drive_versions/drive_verify_method_versions/mod.rs new file mode 100644 index 0000000000..39d4255136 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_verify_method_versions/mod.rs @@ -0,0 +1,76 @@ +use versioned_feature_core::FeatureVersion; + +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct DriveVerifyMethodVersions { + pub contract: DriveVerifyContractMethodVersions, + pub document: DriveVerifyDocumentMethodVersions, + pub identity: DriveVerifyIdentityMethodVersions, + pub single_document: DriveVerifySingleDocumentMethodVersions, + pub system: DriveVerifySystemMethodVersions, + pub voting: DriveVerifyVoteMethodVersions, + pub state_transition: DriveVerifyStateTransitionMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveVerifyContractMethodVersions { + pub verify_contract: FeatureVersion, + pub verify_contract_history: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveVerifyDocumentMethodVersions { + pub verify_proof: FeatureVersion, + pub verify_proof_keep_serialized: FeatureVersion, + pub verify_start_at_document_in_proof: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveVerifyIdentityMethodVersions { + pub verify_full_identities_by_public_key_hashes: FeatureVersion, + pub verify_full_identity_by_identity_id: FeatureVersion, + pub verify_full_identity_by_public_key_hash: FeatureVersion, + pub verify_identity_balance_for_identity_id: FeatureVersion, + pub verify_identity_balances_for_identity_ids: FeatureVersion, + pub verify_identity_id_by_public_key_hash: FeatureVersion, + pub verify_identity_ids_by_public_key_hashes: FeatureVersion, + pub verify_identity_keys_by_identity_id: FeatureVersion, + pub verify_identity_nonce: FeatureVersion, + pub verify_identity_contract_nonce: FeatureVersion, + pub verify_identities_contract_keys: FeatureVersion, + pub verify_identity_revision_for_identity_id: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveVerifyVoteMethodVersions { + pub verify_masternode_vote: FeatureVersion, + pub verify_start_at_contender_in_proof: FeatureVersion, + pub verify_vote_poll_votes_proof: FeatureVersion, + pub verify_identity_votes_given_proof: FeatureVersion, + pub verify_vote_poll_vote_state_proof: FeatureVersion, + pub verify_contests_proof: FeatureVersion, + pub verify_vote_polls_by_end_date_proof: FeatureVersion, + pub verify_specialized_balance: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveVerifySystemMethodVersions { + pub verify_epoch_infos: FeatureVersion, + pub verify_epoch_proposers: FeatureVersion, + pub verify_elements: FeatureVersion, + pub verify_total_credits_in_system: FeatureVersion, + pub verify_upgrade_state: FeatureVersion, + pub verify_upgrade_vote_status: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveVerifySingleDocumentMethodVersions { + pub verify_proof: FeatureVersion, + pub verify_proof_keep_serialized: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveVerifyStateTransitionMethodVersions { + pub verify_state_transition_was_executed_with_proof: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_verify_method_versions/v1.rs b/packages/rs-platform-version/src/version/drive_versions/drive_verify_method_versions/v1.rs new file mode 100644 index 0000000000..4c40371f83 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_verify_method_versions/v1.rs @@ -0,0 +1,57 @@ +use crate::version::drive_versions::drive_verify_method_versions::{ + DriveVerifyContractMethodVersions, DriveVerifyDocumentMethodVersions, + DriveVerifyIdentityMethodVersions, DriveVerifyMethodVersions, + DriveVerifySingleDocumentMethodVersions, DriveVerifyStateTransitionMethodVersions, + DriveVerifySystemMethodVersions, DriveVerifyVoteMethodVersions, +}; + +pub const DRIVE_VERIFY_METHOD_VERSIONS_V1: DriveVerifyMethodVersions = DriveVerifyMethodVersions { + contract: DriveVerifyContractMethodVersions { + verify_contract: 0, + verify_contract_history: 0, + }, + document: DriveVerifyDocumentMethodVersions { + verify_proof: 0, + verify_proof_keep_serialized: 0, + verify_start_at_document_in_proof: 0, + }, + identity: DriveVerifyIdentityMethodVersions { + verify_full_identities_by_public_key_hashes: 0, + verify_full_identity_by_identity_id: 0, + verify_full_identity_by_public_key_hash: 0, + verify_identity_balance_for_identity_id: 0, + verify_identity_balances_for_identity_ids: 0, + verify_identity_id_by_public_key_hash: 0, + verify_identity_ids_by_public_key_hashes: 0, + verify_identity_keys_by_identity_id: 0, + verify_identity_nonce: 0, + verify_identity_contract_nonce: 0, + verify_identities_contract_keys: 0, + verify_identity_revision_for_identity_id: 0, + }, + single_document: DriveVerifySingleDocumentMethodVersions { + verify_proof: 0, + verify_proof_keep_serialized: 0, + }, + system: DriveVerifySystemMethodVersions { + verify_epoch_infos: 0, + verify_epoch_proposers: 0, + verify_elements: 0, + verify_total_credits_in_system: 0, + verify_upgrade_state: 0, + verify_upgrade_vote_status: 0, + }, + voting: DriveVerifyVoteMethodVersions { + verify_masternode_vote: 0, + verify_start_at_contender_in_proof: 0, + verify_vote_poll_votes_proof: 0, + verify_identity_votes_given_proof: 0, + verify_vote_poll_vote_state_proof: 0, + verify_contests_proof: 0, + verify_vote_polls_by_end_date_proof: 0, + verify_specialized_balance: 0, + }, + state_transition: DriveVerifyStateTransitionMethodVersions { + verify_state_transition_was_executed_with_proof: 0, + }, +}; diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_vote_method_versions/mod.rs b/packages/rs-platform-version/src/version/drive_versions/drive_vote_method_versions/mod.rs new file mode 100644 index 0000000000..825b062905 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_vote_method_versions/mod.rs @@ -0,0 +1,56 @@ +use versioned_feature_core::FeatureVersion; + +pub mod v1; +pub mod v2; + +#[derive(Clone, Debug, Default)] +pub struct DriveVoteMethodVersions { + pub insert: DriveVoteInsertMethodVersions, + pub contested_resource_insert: DriveVoteContestedResourceInsertMethodVersions, + pub cleanup: DriveVoteCleanupMethodVersions, + pub setup: DriveVoteSetupMethodVersions, + pub storage_form: DriveVoteStorageFormMethodVersions, + pub fetch: DriveVoteFetchMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveVoteFetchMethodVersions { + pub fetch_identities_voting_for_contenders: FeatureVersion, + pub fetch_contested_document_vote_poll_stored_info: FeatureVersion, + pub fetch_identity_contested_resource_vote: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveVoteStorageFormMethodVersions { + pub resolve_with_contract: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveVoteSetupMethodVersions { + pub add_initial_vote_tree_main_structure_operations: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveVoteCleanupMethodVersions { + pub remove_specific_vote_references_given_by_identity: FeatureVersion, + pub remove_specific_votes_given_by_identity: FeatureVersion, + pub remove_contested_resource_vote_poll_end_date_query_operations: FeatureVersion, + pub remove_contested_resource_vote_poll_votes_operations: FeatureVersion, + pub remove_contested_resource_vote_poll_documents_operations: FeatureVersion, + pub remove_contested_resource_vote_poll_contenders_operations: FeatureVersion, + pub remove_contested_resource_top_level_index_operations: FeatureVersion, + pub remove_contested_resource_info_operations: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveVoteInsertMethodVersions { + pub register_identity_vote: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveVoteContestedResourceInsertMethodVersions { + pub register_contested_resource_identity_vote: FeatureVersion, + pub insert_stored_info_for_contested_resource_vote_poll: FeatureVersion, + pub register_identity_vote: FeatureVersion, + pub add_vote_poll_end_date_query_operations: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_vote_method_versions/v1.rs b/packages/rs-platform-version/src/version/drive_versions/drive_vote_method_versions/v1.rs new file mode 100644 index 0000000000..1e7a59dd95 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_vote_method_versions/v1.rs @@ -0,0 +1,38 @@ +use crate::version::drive_versions::drive_vote_method_versions::{ + DriveVoteCleanupMethodVersions, DriveVoteContestedResourceInsertMethodVersions, + DriveVoteFetchMethodVersions, DriveVoteInsertMethodVersions, DriveVoteMethodVersions, + DriveVoteSetupMethodVersions, DriveVoteStorageFormMethodVersions, +}; + +pub const DRIVE_VOTE_METHOD_VERSIONS_V1: DriveVoteMethodVersions = DriveVoteMethodVersions { + insert: DriveVoteInsertMethodVersions { + register_identity_vote: 0, + }, + contested_resource_insert: DriveVoteContestedResourceInsertMethodVersions { + register_contested_resource_identity_vote: 0, + insert_stored_info_for_contested_resource_vote_poll: 0, + register_identity_vote: 0, + add_vote_poll_end_date_query_operations: 0, + }, + cleanup: DriveVoteCleanupMethodVersions { + remove_specific_vote_references_given_by_identity: 0, + remove_specific_votes_given_by_identity: 0, + remove_contested_resource_vote_poll_end_date_query_operations: 0, + remove_contested_resource_vote_poll_votes_operations: 0, + remove_contested_resource_vote_poll_documents_operations: 0, + remove_contested_resource_vote_poll_contenders_operations: 0, + remove_contested_resource_top_level_index_operations: 0, + remove_contested_resource_info_operations: 0, + }, + setup: DriveVoteSetupMethodVersions { + add_initial_vote_tree_main_structure_operations: 0, + }, + storage_form: DriveVoteStorageFormMethodVersions { + resolve_with_contract: 0, + }, + fetch: DriveVoteFetchMethodVersions { + fetch_identities_voting_for_contenders: 0, + fetch_contested_document_vote_poll_stored_info: 0, + fetch_identity_contested_resource_vote: 0, + }, +}; diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_vote_method_versions/v2.rs b/packages/rs-platform-version/src/version/drive_versions/drive_vote_method_versions/v2.rs new file mode 100644 index 0000000000..ef99612f58 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_vote_method_versions/v2.rs @@ -0,0 +1,38 @@ +use crate::version::drive_versions::drive_vote_method_versions::{ + DriveVoteCleanupMethodVersions, DriveVoteContestedResourceInsertMethodVersions, + DriveVoteFetchMethodVersions, DriveVoteInsertMethodVersions, DriveVoteMethodVersions, + DriveVoteSetupMethodVersions, DriveVoteStorageFormMethodVersions, +}; + +pub const DRIVE_VOTE_METHOD_VERSIONS_V2: DriveVoteMethodVersions = DriveVoteMethodVersions { + insert: DriveVoteInsertMethodVersions { + register_identity_vote: 0, + }, + contested_resource_insert: DriveVoteContestedResourceInsertMethodVersions { + register_contested_resource_identity_vote: 0, + insert_stored_info_for_contested_resource_vote_poll: 0, + register_identity_vote: 0, + add_vote_poll_end_date_query_operations: 0, + }, + cleanup: DriveVoteCleanupMethodVersions { + remove_specific_vote_references_given_by_identity: 0, + remove_specific_votes_given_by_identity: 0, + remove_contested_resource_vote_poll_end_date_query_operations: 1, + remove_contested_resource_vote_poll_votes_operations: 0, + remove_contested_resource_vote_poll_documents_operations: 1, + remove_contested_resource_vote_poll_contenders_operations: 1, + remove_contested_resource_top_level_index_operations: 0, + remove_contested_resource_info_operations: 0, + }, + setup: DriveVoteSetupMethodVersions { + add_initial_vote_tree_main_structure_operations: 0, + }, + storage_form: DriveVoteStorageFormMethodVersions { + resolve_with_contract: 0, + }, + fetch: DriveVoteFetchMethodVersions { + fetch_identities_voting_for_contenders: 0, + fetch_contested_document_vote_poll_stored_info: 0, + fetch_identity_contested_resource_vote: 0, + }, +}; diff --git a/packages/rs-platform-version/src/version/drive_versions/mod.rs b/packages/rs-platform-version/src/version/drive_versions/mod.rs new file mode 100644 index 0000000000..b8c3fae487 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/mod.rs @@ -0,0 +1,161 @@ +use crate::version::FeatureVersion; +use drive_contract_method_versions::DriveContractMethodVersions; +use drive_credit_pool_method_versions::DriveCreditPoolMethodVersions; +use drive_document_method_versions::DriveDocumentMethodVersions; +use drive_grove_method_versions::DriveGroveMethodVersions; +use drive_identity_method_versions::DriveIdentityMethodVersions; +use drive_state_transition_method_versions::DriveStateTransitionMethodVersions; +use drive_structure_version::DriveStructureVersion; +use drive_verify_method_versions::DriveVerifyMethodVersions; +use drive_vote_method_versions::DriveVoteMethodVersions; +use grovedb_version::version::GroveVersion; + +pub mod drive_contract_method_versions; +pub mod drive_credit_pool_method_versions; +pub mod drive_document_method_versions; +pub mod drive_grove_method_versions; +pub mod drive_identity_method_versions; +pub mod drive_state_transition_method_versions; +pub mod drive_structure_version; +pub mod drive_verify_method_versions; +pub mod drive_vote_method_versions; +pub mod v1; +pub mod v2; + +#[derive(Clone, Debug, Default)] +pub struct DriveVersion { + pub structure: DriveStructureVersion, + pub methods: DriveMethodVersions, + pub grove_methods: DriveGroveMethodVersions, + pub grove_version: GroveVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveMethodVersions { + pub initialization: DriveInitializationMethodVersions, + pub credit_pools: DriveCreditPoolMethodVersions, + pub protocol_upgrade: DriveProtocolUpgradeVersions, + pub prefunded_specialized_balances: DrivePrefundedSpecializedMethodVersions, + pub balances: DriveBalancesMethodVersions, + pub document: DriveDocumentMethodVersions, + pub vote: DriveVoteMethodVersions, + pub contract: DriveContractMethodVersions, + pub fees: DriveFeesMethodVersions, + pub estimated_costs: DriveEstimatedCostsMethodVersions, + pub asset_lock: DriveAssetLockMethodVersions, + pub verify: DriveVerifyMethodVersions, + pub identity: DriveIdentityMethodVersions, + pub platform_system: DrivePlatformSystemMethodVersions, + pub operations: DriveOperationsMethodVersion, + pub batch_operations: DriveBatchOperationsMethodVersion, + pub fetch: DriveFetchMethodVersions, + pub prove: DriveProveMethodVersions, + pub state_transitions: DriveStateTransitionMethodVersions, + pub platform_state: DrivePlatformStateMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DrivePlatformStateMethodVersions { + pub fetch_platform_state_bytes: FeatureVersion, + pub store_platform_state_bytes: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveDataContractOperationMethodVersions { + pub finalization_tasks: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveFetchMethodVersions { + pub fetch_elements: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveProveMethodVersions { + pub prove_elements: FeatureVersion, + pub prove_multiple_state_transition_results: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DrivePrefundedSpecializedMethodVersions { + pub fetch_single: FeatureVersion, + pub prove_single: FeatureVersion, + pub add_prefunded_specialized_balance: FeatureVersion, + pub add_prefunded_specialized_balance_operations: FeatureVersion, + pub deduct_from_prefunded_specialized_balance: FeatureVersion, + pub deduct_from_prefunded_specialized_balance_operations: FeatureVersion, + pub estimated_cost_for_prefunded_specialized_balance_update: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveBalancesMethodVersions { + pub add_to_system_credits: FeatureVersion, + pub add_to_system_credits_operations: FeatureVersion, + pub remove_from_system_credits: FeatureVersion, + pub remove_from_system_credits_operations: FeatureVersion, + pub calculate_total_credits_balance: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAssetLockMethodVersions { + pub add_asset_lock_outpoint: FeatureVersion, + pub add_estimation_costs_for_adding_asset_lock: FeatureVersion, + pub fetch_asset_lock_outpoint_info: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveFeesMethodVersions { + pub calculate_fee: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DrivePlatformSystemMethodVersions { + pub estimation_costs: DriveSystemEstimationCostsMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveOperationsMethodVersion { + pub rollback_transaction: FeatureVersion, + pub drop_cache: FeatureVersion, + pub commit_transaction: FeatureVersion, + pub apply_partial_batch_low_level_drive_operations: FeatureVersion, + pub apply_partial_batch_grovedb_operations: FeatureVersion, + pub apply_batch_low_level_drive_operations: FeatureVersion, + pub apply_batch_grovedb_operations: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveBatchOperationsMethodVersion { + pub convert_drive_operations_to_grove_operations: FeatureVersion, + pub apply_drive_operations: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveSystemEstimationCostsMethodVersions { + pub for_total_system_credits_update: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveInitializationMethodVersions { + pub create_initial_state_structure: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveProtocolUpgradeVersions { + pub clear_version_information: FeatureVersion, + pub fetch_versions_with_counter: FeatureVersion, + pub fetch_proved_versions_with_counter: FeatureVersion, + pub fetch_validator_version_votes: FeatureVersion, + pub fetch_proved_validator_version_votes: FeatureVersion, + pub remove_validators_proposed_app_versions: FeatureVersion, + pub update_validator_proposed_app_version: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveEstimatedCostsMethodVersions { + pub add_estimation_costs_for_levels_up_to_contract: FeatureVersion, + pub add_estimation_costs_for_levels_up_to_contract_document_type_excluded: FeatureVersion, + pub add_estimation_costs_for_contested_document_tree_levels_up_to_contract: FeatureVersion, + pub add_estimation_costs_for_contested_document_tree_levels_up_to_contract_document_type_excluded: + FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/drive_versions/v1.rs b/packages/rs-platform-version/src/version/drive_versions/v1.rs new file mode 100644 index 0000000000..bbe1a12746 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/v1.rs @@ -0,0 +1,100 @@ +use crate::version::drive_versions::drive_contract_method_versions::v1::DRIVE_CONTRACT_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_credit_pool_method_versions::v1::CREDIT_POOL_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_document_method_versions::v1::DRIVE_DOCUMENT_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_grove_method_versions::v1::DRIVE_GROVE_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_identity_method_versions::v1::DRIVE_IDENTITY_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_state_transition_method_versions::v1::DRIVE_STATE_TRANSITION_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_structure_version::v1::DRIVE_STRUCTURE_V1; +use crate::version::drive_versions::drive_verify_method_versions::v1::DRIVE_VERIFY_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_vote_method_versions::v1::DRIVE_VOTE_METHOD_VERSIONS_V1; +use crate::version::drive_versions::{ + DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, + DriveEstimatedCostsMethodVersions, DriveFeesMethodVersions, DriveFetchMethodVersions, + DriveInitializationMethodVersions, DriveMethodVersions, DriveOperationsMethodVersion, + DrivePlatformStateMethodVersions, DrivePlatformSystemMethodVersions, + DrivePrefundedSpecializedMethodVersions, DriveProtocolUpgradeVersions, + DriveProveMethodVersions, DriveSystemEstimationCostsMethodVersions, DriveVersion, +}; +use grovedb_version::version::v1::GROVE_V1; + +pub const DRIVE_VERSION_V1: DriveVersion = DriveVersion { + structure: DRIVE_STRUCTURE_V1, + methods: DriveMethodVersions { + initialization: DriveInitializationMethodVersions { + create_initial_state_structure: 0, + }, + credit_pools: CREDIT_POOL_METHOD_VERSIONS_V1, + protocol_upgrade: DriveProtocolUpgradeVersions { + clear_version_information: 0, + fetch_versions_with_counter: 0, + fetch_proved_versions_with_counter: 0, + fetch_validator_version_votes: 0, + fetch_proved_validator_version_votes: 0, + remove_validators_proposed_app_versions: 0, + update_validator_proposed_app_version: 0, + }, + prove: DriveProveMethodVersions { + prove_elements: 0, + prove_multiple_state_transition_results: 0, + }, + balances: DriveBalancesMethodVersions { + add_to_system_credits: 0, + add_to_system_credits_operations: 0, + remove_from_system_credits: 0, + remove_from_system_credits_operations: 0, + calculate_total_credits_balance: 0, + }, + document: DRIVE_DOCUMENT_METHOD_VERSIONS_V1, + vote: DRIVE_VOTE_METHOD_VERSIONS_V1, + contract: DRIVE_CONTRACT_METHOD_VERSIONS_V1, + fees: DriveFeesMethodVersions { calculate_fee: 0 }, + estimated_costs: DriveEstimatedCostsMethodVersions { + add_estimation_costs_for_levels_up_to_contract: 0, + add_estimation_costs_for_levels_up_to_contract_document_type_excluded: 0, + add_estimation_costs_for_contested_document_tree_levels_up_to_contract: 0, + add_estimation_costs_for_contested_document_tree_levels_up_to_contract_document_type_excluded: 0, + }, + asset_lock: DriveAssetLockMethodVersions { + add_asset_lock_outpoint: 0, + add_estimation_costs_for_adding_asset_lock: 0, + fetch_asset_lock_outpoint_info: 0, + }, + verify: DRIVE_VERIFY_METHOD_VERSIONS_V1, + identity: DRIVE_IDENTITY_METHOD_VERSIONS_V1, + platform_system: DrivePlatformSystemMethodVersions { + estimation_costs: DriveSystemEstimationCostsMethodVersions { + for_total_system_credits_update: 0, + }, + }, + operations: DriveOperationsMethodVersion { + rollback_transaction: 0, + drop_cache: 0, + commit_transaction: 0, + apply_partial_batch_low_level_drive_operations: 0, + apply_partial_batch_grovedb_operations: 0, + apply_batch_low_level_drive_operations: 0, + apply_batch_grovedb_operations: 0, + }, + state_transitions: DRIVE_STATE_TRANSITION_METHOD_VERSIONS_V1, + batch_operations: DriveBatchOperationsMethodVersion { + convert_drive_operations_to_grove_operations: 0, + apply_drive_operations: 0, + }, + platform_state: DrivePlatformStateMethodVersions { + fetch_platform_state_bytes: 0, + store_platform_state_bytes: 0, + }, + fetch: DriveFetchMethodVersions { fetch_elements: 0 }, + prefunded_specialized_balances: DrivePrefundedSpecializedMethodVersions { + fetch_single: 0, + prove_single: 0, + add_prefunded_specialized_balance: 0, + add_prefunded_specialized_balance_operations: 0, + deduct_from_prefunded_specialized_balance: 0, + deduct_from_prefunded_specialized_balance_operations: 0, + estimated_cost_for_prefunded_specialized_balance_update: 0, + }, + }, + grove_methods: DRIVE_GROVE_METHOD_VERSIONS_V1, + grove_version: GROVE_V1, +}; diff --git a/packages/rs-platform-version/src/version/drive_versions/v2.rs b/packages/rs-platform-version/src/version/drive_versions/v2.rs new file mode 100644 index 0000000000..5747bc732b --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/v2.rs @@ -0,0 +1,100 @@ +use crate::version::drive_versions::drive_contract_method_versions::v1::DRIVE_CONTRACT_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_credit_pool_method_versions::v1::CREDIT_POOL_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_document_method_versions::v1::DRIVE_DOCUMENT_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_grove_method_versions::v1::DRIVE_GROVE_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_identity_method_versions::v1::DRIVE_IDENTITY_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_state_transition_method_versions::v1::DRIVE_STATE_TRANSITION_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_structure_version::v1::DRIVE_STRUCTURE_V1; +use crate::version::drive_versions::drive_verify_method_versions::v1::DRIVE_VERIFY_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_vote_method_versions::v2::DRIVE_VOTE_METHOD_VERSIONS_V2; +use crate::version::drive_versions::{ + DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, + DriveEstimatedCostsMethodVersions, DriveFeesMethodVersions, DriveFetchMethodVersions, + DriveInitializationMethodVersions, DriveMethodVersions, DriveOperationsMethodVersion, + DrivePlatformStateMethodVersions, DrivePlatformSystemMethodVersions, + DrivePrefundedSpecializedMethodVersions, DriveProtocolUpgradeVersions, + DriveProveMethodVersions, DriveSystemEstimationCostsMethodVersions, DriveVersion, +}; +use grovedb_version::version::v1::GROVE_V1; + +pub const DRIVE_VERSION_V2: DriveVersion = DriveVersion { + structure: DRIVE_STRUCTURE_V1, + methods: DriveMethodVersions { + initialization: DriveInitializationMethodVersions { + create_initial_state_structure: 0, + }, + credit_pools: CREDIT_POOL_METHOD_VERSIONS_V1, + protocol_upgrade: DriveProtocolUpgradeVersions { + clear_version_information: 0, + fetch_versions_with_counter: 0, + fetch_proved_versions_with_counter: 0, + fetch_validator_version_votes: 0, + fetch_proved_validator_version_votes: 0, + remove_validators_proposed_app_versions: 0, + update_validator_proposed_app_version: 0, + }, + prove: DriveProveMethodVersions { + prove_elements: 0, + prove_multiple_state_transition_results: 0, + }, + balances: DriveBalancesMethodVersions { + add_to_system_credits: 0, + add_to_system_credits_operations: 0, + remove_from_system_credits: 0, + remove_from_system_credits_operations: 0, + calculate_total_credits_balance: 0, + }, + document: DRIVE_DOCUMENT_METHOD_VERSIONS_V1, + vote: DRIVE_VOTE_METHOD_VERSIONS_V2, + contract: DRIVE_CONTRACT_METHOD_VERSIONS_V1, + fees: DriveFeesMethodVersions { calculate_fee: 0 }, + estimated_costs: DriveEstimatedCostsMethodVersions { + add_estimation_costs_for_levels_up_to_contract: 0, + add_estimation_costs_for_levels_up_to_contract_document_type_excluded: 0, + add_estimation_costs_for_contested_document_tree_levels_up_to_contract: 0, + add_estimation_costs_for_contested_document_tree_levels_up_to_contract_document_type_excluded: 0, + }, + asset_lock: DriveAssetLockMethodVersions { + add_asset_lock_outpoint: 0, + add_estimation_costs_for_adding_asset_lock: 0, + fetch_asset_lock_outpoint_info: 0, + }, + verify: DRIVE_VERIFY_METHOD_VERSIONS_V1, + identity: DRIVE_IDENTITY_METHOD_VERSIONS_V1, + platform_system: DrivePlatformSystemMethodVersions { + estimation_costs: DriveSystemEstimationCostsMethodVersions { + for_total_system_credits_update: 0, + }, + }, + operations: DriveOperationsMethodVersion { + rollback_transaction: 0, + drop_cache: 0, + commit_transaction: 0, + apply_partial_batch_low_level_drive_operations: 0, + apply_partial_batch_grovedb_operations: 0, + apply_batch_low_level_drive_operations: 0, + apply_batch_grovedb_operations: 0, + }, + state_transitions: DRIVE_STATE_TRANSITION_METHOD_VERSIONS_V1, + batch_operations: DriveBatchOperationsMethodVersion { + convert_drive_operations_to_grove_operations: 0, + apply_drive_operations: 0, + }, + platform_state: DrivePlatformStateMethodVersions { + fetch_platform_state_bytes: 0, + store_platform_state_bytes: 0, + }, + fetch: DriveFetchMethodVersions { fetch_elements: 0 }, + prefunded_specialized_balances: DrivePrefundedSpecializedMethodVersions { + fetch_single: 0, + prove_single: 0, + add_prefunded_specialized_balance: 0, + add_prefunded_specialized_balance_operations: 0, + deduct_from_prefunded_specialized_balance: 0, + deduct_from_prefunded_specialized_balance_operations: 0, + estimated_cost_for_prefunded_specialized_balance_update: 0, + }, + }, + grove_methods: DRIVE_GROVE_METHOD_VERSIONS_V1, + grove_version: GROVE_V1, +}; diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 0edf2b425b..931ef19b97 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -1,154 +1,63 @@ use crate::version::consensus_versions::ConsensusVersions; -use crate::version::contracts::SystemDataContractVersions; -use crate::version::dpp_versions::{ - AssetLockVersions, ContractVersions, CostVersions, DPPMethodVersions, DPPValidationVersions, - DPPVersion, DataContractMethodVersions, DataContractValidationVersions, - DocumentFeatureVersionBounds, DocumentMethodVersions, DocumentTransitionVersions, - DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, DocumentTypeMethodVersions, - DocumentTypeSchemaVersions, DocumentTypeValidationVersions, DocumentTypeVersions, - DocumentVersions, DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions, - IdentityCreditWithdrawalTransitionVersions, IdentityKeyTypeMethodVersions, - IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions, - JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, - RecursiveSchemaValidatorVersions, StateTransitionConversionVersions, - StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions, - VotingValidationVersions, VotingVersions, -}; -use crate::version::drive_abci_versions::{ - DriveAbciAssetLockValidationVersions, DriveAbciBlockEndMethodVersions, - DriveAbciBlockFeeProcessingMethodVersions, DriveAbciBlockStartMethodVersions, - DriveAbciCoreBasedUpdatesMethodVersions, DriveAbciCoreChainLockMethodVersionsAndConstants, - DriveAbciCoreInstantSendLockMethodVersions, - DriveAbciDocumentsStateTransitionValidationVersions, DriveAbciEngineMethodVersions, - DriveAbciEpochMethodVersions, DriveAbciFeePoolInwardsDistributionMethodVersions, - DriveAbciFeePoolOutwardsDistributionMethodVersions, - DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, - DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, - DriveAbciPlatformStateStorageMethodVersions, DriveAbciProtocolUpgradeMethodVersions, +use crate::version::dpp_versions::dpp_asset_lock_versions::v1::DPP_ASSET_LOCK_VERSIONS_V1; +use crate::version::dpp_versions::dpp_contract_versions::v1::CONTRACT_VERSIONS_V1; +use crate::version::dpp_versions::dpp_costs_versions::v1::DPP_COSTS_VERSIONS_V1; +use crate::version::dpp_versions::dpp_document_versions::v1::DOCUMENT_VERSIONS_V1; +use crate::version::dpp_versions::dpp_factory_versions::v1::DPP_FACTORY_VERSIONS_V1; +use crate::version::dpp_versions::dpp_identity_versions::v1::IDENTITY_VERSIONS_V1; +use crate::version::dpp_versions::dpp_method_versions::v1::DPP_METHOD_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_conversion_versions::v1::STATE_TRANSITION_CONVERSION_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_method_versions::v1::STATE_TRANSITION_METHOD_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_serialization_versions::v1::STATE_TRANSITION_SERIALIZATION_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_versions::v1::STATE_TRANSITION_VERSIONS_V1; +use crate::version::dpp_versions::dpp_validation_versions::v2::DPP_VALIDATION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_voting_versions::v2::VOTING_VERSION_V2; +use crate::version::dpp_versions::DPPVersion; +use crate::version::drive_abci_versions::drive_abci_method_versions::v1::DRIVE_ABCI_METHOD_VERSIONS_V1; +use crate::version::drive_abci_versions::drive_abci_query_versions::{ DriveAbciQueryDataContractVersions, DriveAbciQueryIdentityVersions, DriveAbciQueryPrefundedSpecializedBalancesVersions, DriveAbciQuerySystemVersions, DriveAbciQueryValidatorVersions, DriveAbciQueryVersions, DriveAbciQueryVotingVersions, - DriveAbciStateTransitionCommonValidationVersions, - DriveAbciStateTransitionProcessingMethodVersions, DriveAbciStateTransitionValidationVersion, - DriveAbciStateTransitionValidationVersions, DriveAbciStructureVersions, - DriveAbciValidationConstants, DriveAbciValidationDataTriggerAndBindingVersions, - DriveAbciValidationDataTriggerVersions, DriveAbciValidationVersions, DriveAbciVersion, - DriveAbciVotingMethodVersions, DriveAbciWithdrawalConstants, PenaltyAmounts, }; +use crate::version::drive_abci_versions::drive_abci_structure_versions::v1::DRIVE_ABCI_STRUCTURE_VERSIONS_V1; +use crate::version::drive_abci_versions::drive_abci_validation_versions::v1::DRIVE_ABCI_VALIDATION_VERSIONS_V1; +use crate::version::drive_abci_versions::drive_abci_withdrawal_constants::v1::DRIVE_ABCI_WITHDRAWAL_CONSTANTS_V1; +use crate::version::drive_abci_versions::DriveAbciVersion; +use crate::version::drive_versions::drive_contract_method_versions::v1::DRIVE_CONTRACT_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_credit_pool_method_versions::v1::CREDIT_POOL_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_document_method_versions::v1::DRIVE_DOCUMENT_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_grove_method_versions::v1::DRIVE_GROVE_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_identity_method_versions::v1::DRIVE_IDENTITY_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_state_transition_method_versions::v1::DRIVE_STATE_TRANSITION_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_structure_version::v1::DRIVE_STRUCTURE_V1; +use crate::version::drive_versions::drive_verify_method_versions::v1::DRIVE_VERIFY_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_vote_method_versions::v1::DRIVE_VOTE_METHOD_VERSIONS_V1; use crate::version::drive_versions::{ DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, - DriveContractApplyMethodVersions, DriveContractCostsMethodVersions, - DriveContractGetMethodVersions, DriveContractInsertMethodVersions, DriveContractMethodVersions, - DriveContractProveMethodVersions, DriveContractUpdateMethodVersions, - DriveCreditPoolEpochsMethodVersions, DriveCreditPoolMethodVersions, - DriveCreditPoolPendingEpochRefundsMethodVersions, - DriveCreditPoolStorageFeeDistributionPoolMethodVersions, - DriveCreditPoolUnpaidEpochMethodVersions, DriveDataContractOperationMethodVersions, - DriveDocumentDeleteMethodVersions, DriveDocumentEstimationCostsMethodVersions, - DriveDocumentIndexUniquenessMethodVersions, DriveDocumentInsertContestedMethodVersions, - DriveDocumentInsertMethodVersions, DriveDocumentMethodVersions, - DriveDocumentQueryMethodVersions, DriveDocumentUpdateMethodVersions, DriveEstimatedCostsMethodVersions, DriveFeesMethodVersions, DriveFetchMethodVersions, - DriveGroveApplyMethodVersions, DriveGroveBasicMethodVersions, DriveGroveBatchMethodVersions, - DriveGroveCostMethodVersions, DriveGroveMethodVersions, - DriveIdentityContractInfoMethodVersions, DriveIdentityCostEstimationMethodVersions, - DriveIdentityFetchAttributesMethodVersions, DriveIdentityFetchFullIdentityMethodVersions, - DriveIdentityFetchMethodVersions, DriveIdentityFetchPartialIdentityMethodVersions, - DriveIdentityFetchPublicKeyHashesMethodVersions, DriveIdentityInsertMethodVersions, - DriveIdentityKeyHashesToIdentityInsertMethodVersions, DriveIdentityKeysFetchMethodVersions, - DriveIdentityKeysInsertMethodVersions, DriveIdentityKeysMethodVersions, - DriveIdentityKeysProveMethodVersions, DriveIdentityMethodVersions, - DriveIdentityProveMethodVersions, DriveIdentityUpdateMethodVersions, - DriveIdentityWithdrawalDocumentMethodVersions, DriveIdentityWithdrawalMethodVersions, - DriveIdentityWithdrawalTransactionIndexMethodVersions, - DriveIdentityWithdrawalTransactionMethodVersions, - DriveIdentityWithdrawalTransactionQueueMethodVersions, DriveInitializationMethodVersions, - DriveMethodVersions, DriveOperationsMethodVersion, DrivePlatformStateMethodVersions, - DrivePlatformSystemMethodVersions, DrivePrefundedSpecializedMethodVersions, - DriveProtocolUpgradeVersions, DriveProveMethodVersions, - DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions, - DriveStateTransitionMethodVersions, DriveStateTransitionOperationMethodVersions, - DriveStructureVersion, DriveSystemEstimationCostsMethodVersions, - DriveVerifyContractMethodVersions, DriveVerifyDocumentMethodVersions, - DriveVerifyIdentityMethodVersions, DriveVerifyMethodVersions, - DriveVerifySingleDocumentMethodVersions, DriveVerifyStateTransitionMethodVersions, - DriveVerifySystemMethodVersions, DriveVerifyVoteMethodVersions, DriveVersion, - DriveVoteCleanupMethodVersions, DriveVoteContestedResourceInsertMethodVersions, - DriveVoteFetchMethodVersions, DriveVoteInsertMethodVersions, DriveVoteMethodVersions, - DriveVoteSetupMethodVersions, DriveVoteStorageFormMethodVersions, + DriveInitializationMethodVersions, DriveMethodVersions, DriveOperationsMethodVersion, + DrivePlatformStateMethodVersions, DrivePlatformSystemMethodVersions, + DrivePrefundedSpecializedMethodVersions, DriveProtocolUpgradeVersions, + DriveProveMethodVersions, DriveSystemEstimationCostsMethodVersions, DriveVersion, }; use crate::version::fee::v1::FEE_VERSION1; -use crate::version::limits::SystemLimits; use crate::version::mocks::TEST_PROTOCOL_VERSION_SHIFT_BYTES; use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; -use crate::version::PlatformArchitectureVersion; +use crate::version::system_data_contract_versions::v1::SYSTEM_DATA_CONTRACT_VERSIONS_V1; +use crate::version::system_limits::SystemLimits; use grovedb_version::version::v1::GROVE_V1; pub const TEST_PROTOCOL_VERSION_2: u32 = (1 << TEST_PROTOCOL_VERSION_SHIFT_BYTES) + 2; pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { protocol_version: TEST_PROTOCOL_VERSION_2, - proofs: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, drive: DriveVersion { - structure: DriveStructureVersion { - document_indexes: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_indexes: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - pools: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, + structure: DRIVE_STRUCTURE_V1, methods: DriveMethodVersions { initialization: DriveInitializationMethodVersions { create_initial_state_structure: 0, }, - credit_pools: DriveCreditPoolMethodVersions { - epochs: DriveCreditPoolEpochsMethodVersions { - get_epochs_infos: 0, - get_epochs_protocol_versions: 0, - prove_epochs_infos: 0, - get_epoch_fee_multiplier: 0, - get_epoch_processing_credits_for_distribution: 0, - get_epoch_storage_credits_for_distribution: 0, - get_epoch_total_credits_for_distribution: 0, - get_storage_credits_for_distribution_for_epochs_in_range: 0, - get_epoch_start_time: 0, - get_epoch_start_block_core_height: 0, - get_epoch_start_block_height: 0, - get_first_epoch_start_block_info_between_epochs: 0, - fetch_epoch_proposers: 0, - prove_epoch_proposers: 0, - get_epochs_proposer_block_count: 0, - add_update_pending_epoch_refunds_operations: 0, - is_epochs_proposers_tree_empty: 0, - }, - pending_epoch_refunds: DriveCreditPoolPendingEpochRefundsMethodVersions { - add_delete_pending_epoch_refunds_except_specified: 0, - fetch_and_add_pending_epoch_refunds_to_collection: 0, - fetch_pending_epoch_refunds: 0, - add_update_pending_epoch_refunds_operations: 0, - }, - storage_fee_distribution_pool: - DriveCreditPoolStorageFeeDistributionPoolMethodVersions { - get_storage_fees_from_distribution_pool: 0, - }, - unpaid_epoch: DriveCreditPoolUnpaidEpochMethodVersions { - get_unpaid_epoch_index: 0, - }, - }, + credit_pools: CREDIT_POOL_METHOD_VERSIONS_V1, protocol_upgrade: DriveProtocolUpgradeVersions { clear_version_information: 0, fetch_versions_with_counter: 0, @@ -169,123 +78,9 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { remove_from_system_credits_operations: 0, calculate_total_credits_balance: 0, }, - document: DriveDocumentMethodVersions { - query: DriveDocumentQueryMethodVersions { query_documents: 0, query_contested_documents: 0, query_contested_documents_vote_state: 0, query_documents_with_flags: 0 }, - delete: DriveDocumentDeleteMethodVersions { - add_estimation_costs_for_remove_document_to_primary_storage: 0, - delete_document_for_contract: 0, - delete_document_for_contract_id: 0, - delete_document_for_contract_apply_and_add_to_operations: 0, - remove_document_from_primary_storage: 0, - remove_reference_for_index_level_for_contract_operations: 0, - remove_indices_for_index_level_for_contract_operations: 0, - remove_indices_for_top_index_level_for_contract_operations: 0, - delete_document_for_contract_id_with_named_type_operations: 0, - delete_document_for_contract_with_named_type_operations: 0, - delete_document_for_contract_operations: 0, - }, - insert: DriveDocumentInsertMethodVersions { - add_document: 0, - add_document_for_contract: 0, - add_document_for_contract_apply_and_add_to_operations: 0, - add_document_for_contract_operations: 0, - add_document_to_primary_storage: 0, - add_indices_for_index_level_for_contract_operations: 0, - add_indices_for_top_index_level_for_contract_operations: 0, - add_reference_for_index_level_for_contract_operations: 0, - }, - insert_contested: DriveDocumentInsertContestedMethodVersions { - add_contested_document: 0, - add_contested_document_for_contract: 0, - add_contested_document_for_contract_apply_and_add_to_operations: 0, - add_contested_document_for_contract_operations: 0, - add_contested_document_to_primary_storage: 0, - add_contested_indices_for_contract_operations: 0, - add_contested_reference_and_vote_subtree_to_document_operations: 0, - add_contested_vote_subtree_for_non_identities_operations: 0, - }, - update: DriveDocumentUpdateMethodVersions { - add_update_multiple_documents_operations: 0, - update_document_for_contract: 0, - update_document_for_contract_apply_and_add_to_operations: 0, - update_document_for_contract_id: 0, - update_document_for_contract_operations: 0, - update_document_with_serialization_for_contract: 0, - update_serialized_document_for_contract: 0, - }, - estimation_costs: DriveDocumentEstimationCostsMethodVersions { - add_estimation_costs_for_add_document_to_primary_storage: 0, - add_estimation_costs_for_add_contested_document_to_primary_storage: 0, - stateless_delete_of_non_tree_for_costs: 0, - }, - index_uniqueness: DriveDocumentIndexUniquenessMethodVersions { - validate_document_uniqueness: 0, - validate_document_create_transition_action_uniqueness: 0, - validate_document_replace_transition_action_uniqueness: 0, - validate_document_transfer_transition_action_uniqueness: 0, - validate_document_purchase_transition_action_uniqueness: 0, - validate_document_update_price_transition_action_uniqueness: 0, - validate_uniqueness_of_data: 0, - }, - }, - vote: DriveVoteMethodVersions { - insert: DriveVoteInsertMethodVersions { - register_identity_vote: 0, - }, - contested_resource_insert: DriveVoteContestedResourceInsertMethodVersions { - register_contested_resource_identity_vote: 0, - insert_stored_info_for_contested_resource_vote_poll: 0, - register_identity_vote: 0, - add_vote_poll_end_date_query_operations: 0, - }, - cleanup: DriveVoteCleanupMethodVersions { - remove_specific_vote_references_given_by_identity: 0, - remove_specific_votes_given_by_identity: 0, - remove_contested_resource_vote_poll_end_date_query_operations: 0, - remove_contested_resource_vote_poll_votes_operations: 0, - remove_contested_resource_vote_poll_documents_operations: 0, - remove_contested_resource_vote_poll_contenders_operations: 0, - remove_contested_resource_top_level_index_operations: 0, - remove_contested_resource_info_operations: 0, - }, - setup: DriveVoteSetupMethodVersions { - add_initial_vote_tree_main_structure_operations: 0, - }, - storage_form: DriveVoteStorageFormMethodVersions { - resolve_with_contract: 0, - }, - fetch: DriveVoteFetchMethodVersions { - fetch_identities_voting_for_contenders: 0, - fetch_contested_document_vote_poll_stored_info: 0, - fetch_identity_contested_resource_vote: 0, - }, - }, - contract: DriveContractMethodVersions { - prove: DriveContractProveMethodVersions { - prove_contract: 0, - prove_contract_history: 0, - prove_contracts: 0, - }, - apply: DriveContractApplyMethodVersions { - apply_contract: 0, - apply_contract_with_serialization: 0, - }, - insert: DriveContractInsertMethodVersions { - add_contract_to_storage: 0, - insert_contract: 0, - }, - update: DriveContractUpdateMethodVersions { update_contract: 0 }, - costs: DriveContractCostsMethodVersions { - add_estimation_costs_for_contract_insertion: 0, - }, - get: DriveContractGetMethodVersions { - fetch_contract: 0, - fetch_contract_with_history: 0, - get_cached_contract_with_fetch_info: 0, - get_contract_with_fetch_info: 0, - get_contracts_with_fetch_info: 0, - }, - }, + document: DRIVE_DOCUMENT_METHOD_VERSIONS_V1, + vote: DRIVE_VOTE_METHOD_VERSIONS_V1, + contract: DRIVE_CONTRACT_METHOD_VERSIONS_V1, fees: DriveFeesMethodVersions { calculate_fee: 0 }, estimated_costs: DriveEstimatedCostsMethodVersions { add_estimation_costs_for_levels_up_to_contract: 0, @@ -298,191 +93,8 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { add_estimation_costs_for_adding_asset_lock: 0, fetch_asset_lock_outpoint_info: 0, }, - verify: DriveVerifyMethodVersions { - contract: DriveVerifyContractMethodVersions { - verify_contract: 0, - verify_contract_history: 0, - }, - document: DriveVerifyDocumentMethodVersions { - verify_proof: 0, - verify_proof_keep_serialized: 0, - verify_start_at_document_in_proof: 0, - }, - identity: DriveVerifyIdentityMethodVersions { - verify_full_identities_by_public_key_hashes: 0, - verify_full_identity_by_identity_id: 0, - verify_full_identity_by_public_key_hash: 0, - verify_identity_balance_for_identity_id: 0, - verify_identity_balances_for_identity_ids: 0, - verify_identity_id_by_public_key_hash: 0, - verify_identity_ids_by_public_key_hashes: 0, - verify_identity_keys_by_identity_id: 0, - verify_identity_nonce: 0, - verify_identity_contract_nonce: 0, - verify_identities_contract_keys: 0, - verify_identity_revision_for_identity_id: 0, - }, - single_document: DriveVerifySingleDocumentMethodVersions { - verify_proof: 0, - verify_proof_keep_serialized: 0, - }, - system: DriveVerifySystemMethodVersions { - verify_epoch_infos: 0, - verify_epoch_proposers: 0, - verify_elements: 0, - verify_total_credits_in_system: 0, - verify_upgrade_state: 0, - verify_upgrade_vote_status: 0, - }, - voting: DriveVerifyVoteMethodVersions { - verify_masternode_vote: 0, - verify_start_at_contender_in_proof: 0, - verify_vote_poll_votes_proof: 0, - verify_identity_votes_given_proof: 0, - verify_vote_poll_vote_state_proof: 0, - verify_contests_proof: 0, - verify_vote_polls_by_end_date_proof: 0, - verify_specialized_balance: 0, - }, - state_transition: DriveVerifyStateTransitionMethodVersions { - verify_state_transition_was_executed_with_proof: 0, - }, - }, - identity: DriveIdentityMethodVersions { - fetch: DriveIdentityFetchMethodVersions { - public_key_hashes: DriveIdentityFetchPublicKeyHashesMethodVersions { - fetch_full_identities_by_unique_public_key_hashes: 0, - fetch_full_identity_by_unique_public_key_hash: 0, - fetch_identity_id_by_unique_public_key_hash: 0, - fetch_identity_ids_by_non_unique_public_key_hash: 0, - fetch_identity_ids_by_unique_public_key_hashes: 0, - fetch_serialized_full_identity_by_unique_public_key_hash: 0, - has_any_of_unique_public_key_hashes: 0, - has_non_unique_public_key_hash: 0, - has_non_unique_public_key_hash_already_for_identity: 0, - has_unique_public_key_hash: 0, - }, - attributes: DriveIdentityFetchAttributesMethodVersions { - revision: 0, - nonce: 0, - identity_contract_nonce: 0, - balance: 0, - balance_include_debt: 0, - negative_balance: 0, - }, - partial_identity: DriveIdentityFetchPartialIdentityMethodVersions { - fetch_identity_revision_with_keys: 0, - fetch_identity_balance_with_keys: 0, - fetch_identity_balance_with_keys_and_revision: 0, - fetch_identity_with_balance: 0, - fetch_identity_keys: 0, - }, - full_identity: DriveIdentityFetchFullIdentityMethodVersions { - fetch_full_identity: Some(0), - fetch_full_identities: Some(0), - }, - }, - prove: DriveIdentityProveMethodVersions { - full_identity: 0, - full_identities: 0, - identity_nonce: 0, - identity_contract_nonce: 0, - identities_contract_keys: 0, - prove_full_identities_by_unique_public_key_hashes: 0, - prove_full_identity_by_unique_public_key_hash: 0, - prove_identity_id_by_unique_public_key_hash: 0, - prove_identity_ids_by_unique_public_key_hashes: 0, - }, - keys: DriveIdentityKeysMethodVersions { - fetch: DriveIdentityKeysFetchMethodVersions { - fetch_all_current_identity_keys: 0, - fetch_all_identity_keys: 0, - fetch_identities_all_keys: 0, - fetch_identity_keys: 0, - fetch_identities_contract_keys: 0, - }, - prove: DriveIdentityKeysProveMethodVersions { - prove_identities_all_keys: 0, - prove_identity_keys: 0, - }, - insert: DriveIdentityKeysInsertMethodVersions { - create_key_tree_with_keys: 0, - create_new_identity_key_query_trees: 0, - insert_key_searchable_references: 0, - insert_key_to_storage: 0, - insert_new_non_unique_key: 0, - insert_new_unique_key: 0, - replace_key_in_storage: 0, - }, - insert_key_hash_identity_reference: - DriveIdentityKeyHashesToIdentityInsertMethodVersions { - add_estimation_costs_for_insert_non_unique_public_key_hash_reference: 0, - add_estimation_costs_for_insert_unique_public_key_hash_reference: 0, - insert_non_unique_public_key_hash_reference_to_identity: 0, - insert_reference_to_non_unique_key: 0, - insert_reference_to_unique_key: 0, - insert_unique_public_key_hash_reference_to_identity: 0, - }, - }, - update: DriveIdentityUpdateMethodVersions { - update_identity_revision: 0, - merge_identity_nonce: 0, - update_identity_negative_credit_operation: 0, - initialize_identity_revision: 0, - disable_identity_keys: 0, - re_enable_identity_keys: 0, - add_new_non_unique_keys_to_identity: 0, - add_new_unique_keys_to_identity: 0, - add_new_keys_to_identity: 0, - insert_identity_balance: 0, - initialize_negative_identity_balance: 0, - add_to_identity_balance: 0, - add_to_previous_balance: 0, - apply_balance_change_from_fee_to_identity: 0, - remove_from_identity_balance: 0, - refresh_identity_key_reference_operations: 0, - }, - insert: DriveIdentityInsertMethodVersions { - add_new_identity: 0, - }, - contract_info: DriveIdentityContractInfoMethodVersions { - add_potential_contract_info_for_contract_bounded_key: 0, - refresh_potential_contract_info_key_references: 0, - merge_identity_contract_nonce: 0, - }, - cost_estimation: DriveIdentityCostEstimationMethodVersions { - for_authentication_keys_security_level_in_key_reference_tree: 0, - for_balances: 0, - for_contract_info: 0, - for_contract_info_group: 0, - for_contract_info_group_keys: 0, - for_contract_info_group_key_purpose: 0, - for_keys_for_identity_id: 0, - for_negative_credit: 0, - for_purpose_in_key_reference_tree: 0, - for_root_key_reference_tree: 0, - for_update_revision: 0, - }, - withdrawals: DriveIdentityWithdrawalMethodVersions { - document: DriveIdentityWithdrawalDocumentMethodVersions { - fetch_oldest_withdrawal_documents_by_status: 0, - find_withdrawal_documents_by_status_and_transaction_indices: 0, - }, - transaction: DriveIdentityWithdrawalTransactionMethodVersions { - index: DriveIdentityWithdrawalTransactionIndexMethodVersions { - fetch_next_withdrawal_transaction_index: 0, - add_update_next_withdrawal_transaction_index_operation: 0, - }, - queue: DriveIdentityWithdrawalTransactionQueueMethodVersions { - add_enqueue_untied_withdrawal_transaction_operations: 0, - dequeue_untied_withdrawal_transactions: 0, - remove_broadcasted_withdrawal_transactions_after_completion_operations: 0, - move_broadcasted_withdrawal_transactions_back_to_queue_operations: 0, - }, - }, - calculate_current_withdrawal_limit: 0, - }, - }, + verify: DRIVE_VERIFY_METHOD_VERSIONS_V1, + identity: DRIVE_IDENTITY_METHOD_VERSIONS_V1, platform_system: DrivePlatformSystemMethodVersions { estimation_costs: DriveSystemEstimationCostsMethodVersions { for_total_system_credits_update: 0, @@ -501,35 +113,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { convert_drive_operations_to_grove_operations: 0, apply_drive_operations: 0, }, - state_transitions: DriveStateTransitionMethodVersions { - operations: DriveStateTransitionOperationMethodVersions { - finalization_tasks: 0, - contracts: DriveDataContractOperationMethodVersions { - finalization_tasks: 0, - }, - }, - convert_to_high_level_operations: - DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions { - data_contract_create_transition: 0, - data_contract_update_transition: 0, - document_create_transition: 0, - document_delete_transition: 0, - document_purchase_transition: 0, - document_replace_transition: 0, - document_transfer_transition: 0, - document_update_price_transition: 0, - documents_batch_transition: 0, - identity_create_transition: 0, - identity_credit_transfer_transition: 0, - identity_credit_withdrawal_transition: 0, - identity_top_up_transition: 0, - identity_update_transition: 0, - masternode_vote_transition: 0, - bump_identity_data_contract_nonce: 0, - bump_identity_nonce: 0, - partially_use_asset_lock: 0, - }, - }, + state_transitions: DRIVE_STATE_TRANSITION_METHOD_VERSIONS_V1, platform_state: DrivePlatformStateMethodVersions { fetch_platform_state_bytes: 0, store_platform_state_bytes: 0, @@ -545,321 +129,14 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { estimated_cost_for_prefunded_specialized_balance_update: 0, }, }, - grove_methods: DriveGroveMethodVersions { - basic: DriveGroveBasicMethodVersions { - grove_insert: 0, - grove_insert_empty_tree: 0, - grove_insert_empty_sum_tree: 0, - grove_insert_if_not_exists: 0, - grove_insert_if_not_exists_return_existing_element: 0, - grove_clear: 0, - grove_delete: 0, - grove_get_raw: 0, - grove_get_raw_optional: 0, - grove_get_raw_value_u64_from_encoded_var_vec: 0, - grove_get: 0, - grove_get_path_query_serialized_results: 0, - grove_get_path_query_serialized_or_sum_results: 0, - grove_get_path_query: 0, - grove_get_path_query_with_optional: 0, - grove_get_raw_path_query_with_optional: 0, - grove_get_raw_path_query: 0, - grove_get_proved_path_query: 0, - grove_get_proved_path_query_with_conditional: 0, - grove_get_sum_tree_total_value: 0, - grove_has_raw: 0, - }, - batch: DriveGroveBatchMethodVersions { - batch_insert_empty_tree: 0, - batch_insert_empty_tree_if_not_exists: 0, - batch_insert_empty_tree_if_not_exists_check_existing_operations: 0, - batch_insert_sum_item_or_add_to_if_already_exists: 0, - batch_insert: 0, - batch_insert_if_not_exists: 0, - batch_insert_if_changed_value: 0, - batch_replace: 0, - batch_delete: 0, - batch_delete_items_in_path_query: 0, - batch_move_items_in_path_query: 0, - batch_remove_raw: 0, - batch_delete_up_tree_while_empty: 0, - batch_refresh_reference: 0, - }, - apply: DriveGroveApplyMethodVersions { - grove_apply_operation: 0, - grove_apply_batch: 0, - grove_apply_partial_batch: 0, - }, - costs: DriveGroveCostMethodVersions { - grove_batch_operations_costs: 0, - }, - }, + grove_methods: DRIVE_GROVE_METHOD_VERSIONS_V1, grove_version: GROVE_V1, }, - platform_architecture: PlatformArchitectureVersion { - data_contract_factory_structure_version: 0, - document_factory_structure_version: 0, - }, drive_abci: DriveAbciVersion { - structs: DriveAbciStructureVersions { - platform_state_structure: 0, - platform_state_for_saving_structure_default: 0, - state_transition_execution_context: 0, - commit: 0, - masternode: 0, - signature_verification_quorum_set: 0, - }, - methods: DriveAbciMethodVersions { - engine: DriveAbciEngineMethodVersions { - init_chain: 0, - check_tx: 0, - run_block_proposal: 0, - finalize_block_proposal: 0, - consensus_params_update: 0, - }, - initialization: DriveAbciInitializationMethodVersions { - initial_core_height_and_time: 0, - create_genesis_state: 0, - }, - core_based_updates: DriveAbciCoreBasedUpdatesMethodVersions { - update_core_info: 0, - update_masternode_list: 0, - update_quorum_info: 0, - masternode_updates: DriveAbciMasternodeIdentitiesUpdatesMethodVersions { - get_voter_identity_key: 0, - get_operator_identity_keys: 0, - get_owner_identity_withdrawal_key: 0, - get_owner_identity_owner_key: 0, - get_voter_identifier_from_masternode_list_item: 0, - get_operator_identifier_from_masternode_list_item: 0, - create_operator_identity: 0, - create_owner_identity: 0, - create_voter_identity: 0, - disable_identity_keys: 0, - update_masternode_identities: 0, - update_operator_identity: 0, - update_owner_withdrawal_address: 0, - update_voter_identity: 0, - }, - }, - protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { - check_for_desired_protocol_upgrade: 0, - upgrade_protocol_version_on_epoch_change: 0, - perform_events_on_first_block_of_protocol_change: None, - protocol_version_upgrade_percentage_needed: 75, - }, - block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { - add_process_epoch_change_operations: 0, - process_block_fees: 0, - }, - core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants { - choose_quorum: 0, - verify_chain_lock: 0, - verify_chain_lock_locally: 0, - verify_chain_lock_through_core: 0, - make_sure_core_is_synced_to_chain_lock: 0, - recent_block_count_amount: 2, - }, - core_instant_send_lock: DriveAbciCoreInstantSendLockMethodVersions { - verify_recent_signature_locally: 0, - }, - fee_pool_inwards_distribution: DriveAbciFeePoolInwardsDistributionMethodVersions { - add_distribute_block_fees_into_pools_operations: 0, - add_distribute_storage_fee_to_epochs_operations: 0, - }, - fee_pool_outwards_distribution: DriveAbciFeePoolOutwardsDistributionMethodVersions { - add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations: 0, - add_epoch_pool_to_proposers_payout_operations: 0, - find_oldest_epoch_needing_payment: 0, - fetch_reward_shares_list_for_masternode: 0, - }, - withdrawals: DriveAbciIdentityCreditWithdrawalMethodVersions { - build_untied_withdrawal_transactions_from_documents: 0, - dequeue_and_build_unsigned_withdrawal_transactions: 0, - fetch_transactions_block_inclusion_status: 0, - pool_withdrawals_into_transactions_queue: 0, - update_broadcasted_withdrawal_statuses: 0, - rebroadcast_expired_withdrawal_documents: 0, - append_signatures_and_broadcast_withdrawal_transactions: 0, - cleanup_expired_locks_of_withdrawal_amounts: 0, - }, - voting: DriveAbciVotingMethodVersions { - keep_record_of_finished_contested_resource_vote_poll: 0, - clean_up_after_vote_poll_end: 0, - clean_up_after_contested_resources_vote_poll_end: 0, - check_for_ended_vote_polls: 0, - tally_votes_for_contested_document_resource_vote_poll: 0, - award_document_to_winner: 0, - delay_vote_poll: 0, - run_dao_platform_events: 0, - remove_votes_for_removed_masternodes: 0, - }, - state_transition_processing: DriveAbciStateTransitionProcessingMethodVersions { - execute_event: 0, - process_raw_state_transitions: 0, - decode_raw_state_transitions: 0, - validate_fees_of_event: 0, - }, - epoch: DriveAbciEpochMethodVersions { - gather_epoch_info: 0, - get_genesis_time: 0, - }, - block_start: DriveAbciBlockStartMethodVersions { - clear_drive_block_cache: 0, - }, - block_end: DriveAbciBlockEndMethodVersions { - update_state_cache: 0, - update_drive_cache: 0, - validator_set_update: 0, - }, - platform_state_storage: DriveAbciPlatformStateStorageMethodVersions { - fetch_platform_state: 0, - store_platform_state: 0, - }, - }, - validation_and_processing: DriveAbciValidationVersions { - state_transitions: DriveAbciStateTransitionValidationVersions { - common_validation_methods: DriveAbciStateTransitionCommonValidationVersions { - asset_locks: DriveAbciAssetLockValidationVersions { - fetch_asset_lock_transaction_output_sync: 0, - verify_asset_lock_is_not_spent_and_has_enough_balance: 0, - }, - validate_identity_public_key_contract_bounds: 0, - validate_identity_public_key_ids_dont_exist_in_state: 0, - validate_identity_public_key_ids_exist_in_state: 0, - validate_state_transition_identity_signed: 0, - validate_unique_identity_public_key_hashes_in_state: 0, - validate_master_key_uniqueness: 0, - validate_simple_pre_check_balance: 0, - }, - max_asset_lock_usage_attempts: 16, - identity_create_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: Some(0), - identity_signatures: Some(0), - advanced_minimum_balance_pre_check: None, - nonce: None, - state: 0, - transform_into_action: 0, - }, - identity_update_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: Some(0), - identity_signatures: Some(0), - advanced_minimum_balance_pre_check: None, - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: None, - nonce: None, - state: 0, - transform_into_action: 0, - }, - identity_credit_withdrawal_state_transition: - DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: Some(0), - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - identity_credit_withdrawal_state_transition_purpose_matches_requirements: 0, - identity_credit_transfer_state_transition: - DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: Some(0), - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - masternode_vote_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: None, - advanced_structure: Some(0), - identity_signatures: None, - advanced_minimum_balance_pre_check: Some(0), - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - contract_create_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: None, - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - contract_update_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: None, - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: None, - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - documents_batch_state_transition: - DriveAbciDocumentsStateTransitionValidationVersions { - balance_pre_check: 0, - basic_structure: 0, - advanced_structure: 0, - state: 0, - revision: 0, - transform_into_action: 0, - data_triggers: DriveAbciValidationDataTriggerAndBindingVersions { - bindings: 0, - triggers: DriveAbciValidationDataTriggerVersions { - create_contact_request_data_trigger: 0, - create_domain_data_trigger: 0, - create_identity_data_trigger: 0, - create_feature_flag_data_trigger: 0, - create_masternode_reward_shares_data_trigger: 0, - delete_withdrawal_data_trigger: 0, - reject_data_trigger: 0, - }, - }, - is_allowed: 0, - document_create_transition_structure_validation: 0, - document_delete_transition_structure_validation: 0, - document_replace_transition_structure_validation: 0, - document_transfer_transition_structure_validation: 0, - document_purchase_transition_structure_validation: 0, - document_update_price_transition_structure_validation: 0, - document_create_transition_state_validation: 0, - document_delete_transition_state_validation: 0, - document_replace_transition_state_validation: 0, - document_transfer_transition_state_validation: 0, - document_purchase_transition_state_validation: 0, - document_update_price_transition_state_validation: 0, - }, - }, - process_state_transition: 0, - state_transition_to_execution_event_for_check_tx: 0, - penalties: PenaltyAmounts { - identity_id_not_correct: 50000000, - unique_key_already_present: 10000000, - validation_of_added_keys_structure_failure: 10000000, - validation_of_added_keys_proof_of_possession_failure: 50000000, - }, - event_constants: DriveAbciValidationConstants { - maximum_vote_polls_to_process: 2, - maximum_contenders_to_consider: 100, - }, - }, - withdrawal_constants: DriveAbciWithdrawalConstants { - core_expiration_blocks: 48, - cleanup_expired_locks_of_withdrawal_amounts_limit: 0, - }, + structs: DRIVE_ABCI_STRUCTURE_VERSIONS_V1, + methods: DRIVE_ABCI_METHOD_VERSIONS_V1, + validation_and_processing: DRIVE_ABCI_VALIDATION_VERSIONS_V1, + withdrawal_constants: DRIVE_ABCI_WITHDRAWAL_CONSTANTS_V1, query: DriveAbciQueryVersions { max_returned_elements: 100, response_metadata: 0, @@ -1023,281 +300,26 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, }, dpp: DPPVersion { - costs: CostVersions { - signature_verify: 0, - }, - validation: DPPValidationVersions { - json_schema_validator: JsonSchemaValidatorVersions { - new: 0, - validate: 0, - compile: 0, - compile_and_validate: 0, - }, - data_contract: DataContractValidationVersions { - validate: 0, - validate_config_update: 0, - validate_index_definitions: 0, - validate_index_naming_duplicates: 0, - validate_not_defined_properties: 0, - validate_property_definition: 0, - }, - document_type: DocumentTypeValidationVersions { - validate_update: 0, - contested_index_limit: 1, - unique_index_limit: 10, - }, - voting: VotingValidationVersions { - allow_other_contenders_time_mainnet_ms: 604_800_000, // 1 week in ms - allow_other_contenders_time_testing_ms: 2_700_000, //45 minutes - votes_allowed_per_masternode: 5, - }, - }, - state_transition_serialization_versions: StateTransitionSerializationVersions { - identity_public_key_in_creation: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_create_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_update_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_top_up_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_credit_withdrawal_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_credit_transfer_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - masternode_vote_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contract_create_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contract_update_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - documents_batch_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_base_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_create_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_replace_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_delete_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_transfer_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_update_price_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_purchase_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - }, - state_transition_conversion_versions: StateTransitionConversionVersions { - identity_to_identity_create_transition: 0, - identity_to_identity_top_up_transition: 0, - identity_to_identity_withdrawal_transition: 0, - identity_to_identity_create_transition_with_signer: 0, - }, - state_transition_method_versions: StateTransitionMethodVersions { - public_key_in_creation_methods: PublicKeyInCreationMethodVersions { - from_public_key_signed_with_private_key: 0, - from_public_key_signed_external: 0, - hash: 0, - duplicated_key_ids_witness: 0, - duplicated_keys_witness: 0, - validate_identity_public_keys_structure: 0, - }, - }, - state_transitions: StateTransitionVersions { - documents: DocumentTransitionVersions { - documents_batch_transition: DocumentsBatchTransitionVersions { - validation: DocumentsBatchTransitionValidationVersions { - find_duplicates_by_id: 0, - validate_base_structure: 0, - }, - }, - }, - identities: IdentityTransitionVersions { - max_public_keys_in_creation: 6, - asset_locks: IdentityTransitionAssetLockVersions { - required_asset_lock_duff_balance_for_processing_start_for_identity_create: - 200000, - required_asset_lock_duff_balance_for_processing_start_for_identity_top_up: - 50000, - validate_asset_lock_transaction_structure: 0, - validate_instant_asset_lock_proof_structure: 0, - }, - credit_withdrawal: IdentityCreditWithdrawalTransitionVersions { - default_constructor: 0, - }, - }, - }, - contract_versions: ContractVersions { - max_serialized_size: 65000, - contract_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contract_structure_version: 0, - created_data_contract_structure: 0, - config: 0, - methods: DataContractMethodVersions { - validate_document: 0, - validate_update: 0, - schema: 0, - }, - document_type_versions: DocumentTypeVersions { - index_versions: DocumentTypeIndexVersions { - index_levels_from_indices: 0, - }, - class_method_versions: DocumentTypeClassMethodVersions { - try_from_schema: 0, - create_document_types_from_document_schemas: 0, - }, - structure_version: 0, - schema: DocumentTypeSchemaVersions { - enrich_with_base_schema: 0, - find_identifier_and_binary_paths: 0, - validate_max_depth: 0, - max_depth: 256, - recursive_schema_validator_versions: RecursiveSchemaValidatorVersions { - traversal_validator: 0, - }, - validate_schema_compatibility: 0, - }, - methods: DocumentTypeMethodVersions { - create_document_from_data: 0, - create_document_with_prevalidated_properties: 0, - prefunded_voting_balance_for_document: 0, - contested_vote_poll_for_document: 0, - estimated_size: 0, - index_for_types: 0, - max_size: 0, - serialize_value_for_key: 0, - deserialize_value_for_key: 0, - }, - }, - }, - document_versions: DocumentVersions { - document_structure_version: 0, - document_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_cbor_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - extended_document_structure_version: 0, - extended_document_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_method_versions: DocumentMethodVersions { - is_equal_ignoring_timestamps: 0, - hash: 0, - get_raw_for_contract: 0, - get_raw_for_document_type: 0, - try_into_asset_unlock_base_transaction_info: 0, - }, - }, - identity_versions: IdentityVersions { - identity_structure_version: 0, - identity_key_structure_version: 0, - identity_key_type_method_versions: IdentityKeyTypeMethodVersions { - random_public_key_data: 0, - random_public_and_private_key_data: 0, - }, - }, - voting_versions: VotingVersions { - default_vote_poll_time_duration_mainnet_ms: 1_209_600_000, //2 weeks - default_vote_poll_time_duration_test_network_ms: 5_400_000, //90 minutes - contested_document_vote_poll_stored_info_version: 0, - }, - asset_lock_versions: AssetLockVersions { - reduced_asset_lock_value: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - methods: DPPMethodVersions { epoch_core_reward_credits_for_distribution: 0, daily_withdrawal_limit: 0 }, - }, - system_data_contracts: SystemDataContractVersions { - withdrawals: 1, - dpns: 1, - dashpay: 1, - masternode_reward_shares: 1, - feature_flags: 1, + costs: DPP_COSTS_VERSIONS_V1, + validation: DPP_VALIDATION_VERSIONS_V2, + state_transition_serialization_versions: STATE_TRANSITION_SERIALIZATION_VERSIONS_V1, + state_transition_conversion_versions: STATE_TRANSITION_CONVERSION_VERSIONS_V1, + state_transition_method_versions: STATE_TRANSITION_METHOD_VERSIONS_V1, + state_transitions: STATE_TRANSITION_VERSIONS_V1, + contract_versions: CONTRACT_VERSIONS_V1, + document_versions: DOCUMENT_VERSIONS_V1, + identity_versions: IDENTITY_VERSIONS_V1, + voting_versions: VOTING_VERSION_V2, + asset_lock_versions: DPP_ASSET_LOCK_VERSIONS_V1, + methods: DPP_METHOD_VERSIONS_V1, + factory_versions: DPP_FACTORY_VERSIONS_V1, }, + system_data_contracts: SYSTEM_DATA_CONTRACT_VERSIONS_V1, fee_version: FEE_VERSION1, system_limits: SystemLimits { estimated_contract_max_serialized_size: 16384, max_field_value_size: 5000, - max_state_transition_size: 20000, + max_state_transition_size: 20000, // Is different in this test version, not sure if this was a mistake max_transitions_in_documents_batch: 1, withdrawal_transactions_per_block_limit: 4, retry_signing_expired_withdrawal_documents_per_block_limit: 1, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 07e3d37ecd..4c54dfbfef 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -1,614 +1,49 @@ use crate::version::consensus_versions::ConsensusVersions; -use crate::version::contracts::SystemDataContractVersions; -use crate::version::dpp_versions::{ - AssetLockVersions, ContractVersions, CostVersions, DPPMethodVersions, DPPValidationVersions, - DPPVersion, DataContractMethodVersions, DataContractValidationVersions, - DocumentFeatureVersionBounds, DocumentMethodVersions, DocumentTransitionVersions, - DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, DocumentTypeMethodVersions, - DocumentTypeSchemaVersions, DocumentTypeValidationVersions, DocumentTypeVersions, - DocumentVersions, DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions, - IdentityCreditWithdrawalTransitionVersions, IdentityKeyTypeMethodVersions, - IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions, - JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, - RecursiveSchemaValidatorVersions, StateTransitionConversionVersions, - StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions, - VotingValidationVersions, VotingVersions, -}; -use crate::version::drive_abci_versions::{ - DriveAbciAssetLockValidationVersions, DriveAbciBlockEndMethodVersions, - DriveAbciBlockFeeProcessingMethodVersions, DriveAbciBlockStartMethodVersions, - DriveAbciCoreBasedUpdatesMethodVersions, DriveAbciCoreChainLockMethodVersionsAndConstants, - DriveAbciCoreInstantSendLockMethodVersions, - DriveAbciDocumentsStateTransitionValidationVersions, DriveAbciEngineMethodVersions, - DriveAbciEpochMethodVersions, DriveAbciFeePoolInwardsDistributionMethodVersions, +use crate::version::dpp_versions::dpp_asset_lock_versions::v1::DPP_ASSET_LOCK_VERSIONS_V1; +use crate::version::dpp_versions::dpp_contract_versions::v1::CONTRACT_VERSIONS_V1; +use crate::version::dpp_versions::dpp_costs_versions::v1::DPP_COSTS_VERSIONS_V1; +use crate::version::dpp_versions::dpp_document_versions::v1::DOCUMENT_VERSIONS_V1; +use crate::version::dpp_versions::dpp_factory_versions::v1::DPP_FACTORY_VERSIONS_V1; +use crate::version::dpp_versions::dpp_identity_versions::v1::IDENTITY_VERSIONS_V1; +use crate::version::dpp_versions::dpp_method_versions::v1::DPP_METHOD_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_conversion_versions::v2::STATE_TRANSITION_CONVERSION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_state_transition_method_versions::v1::STATE_TRANSITION_METHOD_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_serialization_versions::v1::STATE_TRANSITION_SERIALIZATION_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_versions::v1::STATE_TRANSITION_VERSIONS_V1; +use crate::version::dpp_versions::dpp_validation_versions::v2::DPP_VALIDATION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_voting_versions::v2::VOTING_VERSION_V2; +use crate::version::dpp_versions::DPPVersion; +use crate::version::drive_abci_versions::drive_abci_method_versions::{ + DriveAbciBlockEndMethodVersions, DriveAbciBlockFeeProcessingMethodVersions, + DriveAbciBlockStartMethodVersions, DriveAbciCoreBasedUpdatesMethodVersions, + DriveAbciCoreChainLockMethodVersionsAndConstants, DriveAbciCoreInstantSendLockMethodVersions, + DriveAbciEngineMethodVersions, DriveAbciEpochMethodVersions, + DriveAbciFeePoolInwardsDistributionMethodVersions, DriveAbciFeePoolOutwardsDistributionMethodVersions, DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, DriveAbciPlatformStateStorageMethodVersions, DriveAbciProtocolUpgradeMethodVersions, - DriveAbciQueryDataContractVersions, DriveAbciQueryIdentityVersions, - DriveAbciQueryPrefundedSpecializedBalancesVersions, DriveAbciQuerySystemVersions, - DriveAbciQueryValidatorVersions, DriveAbciQueryVersions, DriveAbciQueryVotingVersions, - DriveAbciStateTransitionCommonValidationVersions, - DriveAbciStateTransitionProcessingMethodVersions, DriveAbciStateTransitionValidationVersion, - DriveAbciStateTransitionValidationVersions, DriveAbciStructureVersions, - DriveAbciValidationConstants, DriveAbciValidationDataTriggerAndBindingVersions, - DriveAbciValidationDataTriggerVersions, DriveAbciValidationVersions, DriveAbciVersion, - DriveAbciVotingMethodVersions, DriveAbciWithdrawalConstants, PenaltyAmounts, -}; -use crate::version::drive_versions::{ - DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, - DriveContractApplyMethodVersions, DriveContractCostsMethodVersions, - DriveContractGetMethodVersions, DriveContractInsertMethodVersions, DriveContractMethodVersions, - DriveContractProveMethodVersions, DriveContractUpdateMethodVersions, - DriveCreditPoolEpochsMethodVersions, DriveCreditPoolMethodVersions, - DriveCreditPoolPendingEpochRefundsMethodVersions, - DriveCreditPoolStorageFeeDistributionPoolMethodVersions, - DriveCreditPoolUnpaidEpochMethodVersions, DriveDataContractOperationMethodVersions, - DriveDocumentDeleteMethodVersions, DriveDocumentEstimationCostsMethodVersions, - DriveDocumentIndexUniquenessMethodVersions, DriveDocumentInsertContestedMethodVersions, - DriveDocumentInsertMethodVersions, DriveDocumentMethodVersions, - DriveDocumentQueryMethodVersions, DriveDocumentUpdateMethodVersions, - DriveEstimatedCostsMethodVersions, DriveFeesMethodVersions, DriveFetchMethodVersions, - DriveGroveApplyMethodVersions, DriveGroveBasicMethodVersions, DriveGroveBatchMethodVersions, - DriveGroveCostMethodVersions, DriveGroveMethodVersions, - DriveIdentityContractInfoMethodVersions, DriveIdentityCostEstimationMethodVersions, - DriveIdentityFetchAttributesMethodVersions, DriveIdentityFetchFullIdentityMethodVersions, - DriveIdentityFetchMethodVersions, DriveIdentityFetchPartialIdentityMethodVersions, - DriveIdentityFetchPublicKeyHashesMethodVersions, DriveIdentityInsertMethodVersions, - DriveIdentityKeyHashesToIdentityInsertMethodVersions, DriveIdentityKeysFetchMethodVersions, - DriveIdentityKeysInsertMethodVersions, DriveIdentityKeysMethodVersions, - DriveIdentityKeysProveMethodVersions, DriveIdentityMethodVersions, - DriveIdentityProveMethodVersions, DriveIdentityUpdateMethodVersions, - DriveIdentityWithdrawalDocumentMethodVersions, DriveIdentityWithdrawalMethodVersions, - DriveIdentityWithdrawalTransactionIndexMethodVersions, - DriveIdentityWithdrawalTransactionMethodVersions, - DriveIdentityWithdrawalTransactionQueueMethodVersions, DriveInitializationMethodVersions, - DriveMethodVersions, DriveOperationsMethodVersion, DrivePlatformStateMethodVersions, - DrivePlatformSystemMethodVersions, DrivePrefundedSpecializedMethodVersions, - DriveProtocolUpgradeVersions, DriveProveMethodVersions, - DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions, - DriveStateTransitionMethodVersions, DriveStateTransitionOperationMethodVersions, - DriveStructureVersion, DriveSystemEstimationCostsMethodVersions, - DriveVerifyContractMethodVersions, DriveVerifyDocumentMethodVersions, - DriveVerifyIdentityMethodVersions, DriveVerifyMethodVersions, - DriveVerifySingleDocumentMethodVersions, DriveVerifyStateTransitionMethodVersions, - DriveVerifySystemMethodVersions, DriveVerifyVoteMethodVersions, DriveVersion, - DriveVoteCleanupMethodVersions, DriveVoteContestedResourceInsertMethodVersions, - DriveVoteFetchMethodVersions, DriveVoteInsertMethodVersions, DriveVoteMethodVersions, - DriveVoteSetupMethodVersions, DriveVoteStorageFormMethodVersions, + DriveAbciStateTransitionProcessingMethodVersions, DriveAbciVotingMethodVersions, }; +use crate::version::drive_abci_versions::drive_abci_query_versions::v1::DRIVE_ABCI_QUERY_VERSIONS_V1; +use crate::version::drive_abci_versions::drive_abci_structure_versions::v1::DRIVE_ABCI_STRUCTURE_VERSIONS_V1; +use crate::version::drive_abci_versions::drive_abci_validation_versions::v3::DRIVE_ABCI_VALIDATION_VERSIONS_V3; +use crate::version::drive_abci_versions::drive_abci_withdrawal_constants::v2::DRIVE_ABCI_WITHDRAWAL_CONSTANTS_V2; +use crate::version::drive_abci_versions::DriveAbciVersion; +use crate::version::drive_versions::v2::DRIVE_VERSION_V2; use crate::version::fee::v1::FEE_VERSION1; -use crate::version::limits::SystemLimits; use crate::version::mocks::TEST_PROTOCOL_VERSION_SHIFT_BYTES; -use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; -use crate::version::PlatformArchitectureVersion; -use grovedb_version::version::v1::GROVE_V1; +use crate::version::protocol_version::PlatformVersion; +use crate::version::system_data_contract_versions::v1::SYSTEM_DATA_CONTRACT_VERSIONS_V1; +use crate::version::system_limits::v1::SYSTEM_LIMITS_V1; pub const TEST_PROTOCOL_VERSION_3: u32 = (1 << TEST_PROTOCOL_VERSION_SHIFT_BYTES) + 3; pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { protocol_version: TEST_PROTOCOL_VERSION_3, - proofs: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - drive: DriveVersion { - structure: DriveStructureVersion { - document_indexes: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_indexes: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - pools: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - methods: DriveMethodVersions { - initialization: DriveInitializationMethodVersions { - create_initial_state_structure: 0, - }, - credit_pools: DriveCreditPoolMethodVersions { - epochs: DriveCreditPoolEpochsMethodVersions { - get_epochs_infos: 0, - get_epochs_protocol_versions: 0, - prove_epochs_infos: 0, - get_epoch_fee_multiplier: 0, - get_epoch_processing_credits_for_distribution: 0, - get_epoch_storage_credits_for_distribution: 0, - get_epoch_total_credits_for_distribution: 0, - get_storage_credits_for_distribution_for_epochs_in_range: 0, - get_epoch_start_time: 0, - get_epoch_start_block_core_height: 0, - get_epoch_start_block_height: 0, - get_first_epoch_start_block_info_between_epochs: 0, - fetch_epoch_proposers: 0, - prove_epoch_proposers: 0, - get_epochs_proposer_block_count: 0, - add_update_pending_epoch_refunds_operations: 0, - is_epochs_proposers_tree_empty: 0, - }, - pending_epoch_refunds: DriveCreditPoolPendingEpochRefundsMethodVersions { - add_delete_pending_epoch_refunds_except_specified: 0, - fetch_and_add_pending_epoch_refunds_to_collection: 0, - fetch_pending_epoch_refunds: 0, - add_update_pending_epoch_refunds_operations: 0, - }, - storage_fee_distribution_pool: - DriveCreditPoolStorageFeeDistributionPoolMethodVersions { - get_storage_fees_from_distribution_pool: 0, - }, - unpaid_epoch: DriveCreditPoolUnpaidEpochMethodVersions { - get_unpaid_epoch_index: 0, - }, - }, - protocol_upgrade: DriveProtocolUpgradeVersions { - clear_version_information: 0, - fetch_versions_with_counter: 0, - fetch_proved_versions_with_counter: 0, - fetch_validator_version_votes: 0, - fetch_proved_validator_version_votes: 0, - remove_validators_proposed_app_versions: 0, - update_validator_proposed_app_version: 0, - }, - prove: DriveProveMethodVersions { - prove_elements: 0, - prove_multiple_state_transition_results: 0, - }, - balances: DriveBalancesMethodVersions { - add_to_system_credits: 0, - add_to_system_credits_operations: 0, - remove_from_system_credits: 0, - remove_from_system_credits_operations: 0, - calculate_total_credits_balance: 0, - }, - document: DriveDocumentMethodVersions { - query: DriveDocumentQueryMethodVersions { query_documents: 0, query_contested_documents: 0, query_contested_documents_vote_state: 0, query_documents_with_flags: 0 }, - delete: DriveDocumentDeleteMethodVersions { - add_estimation_costs_for_remove_document_to_primary_storage: 0, - delete_document_for_contract: 0, - delete_document_for_contract_id: 0, - delete_document_for_contract_apply_and_add_to_operations: 0, - remove_document_from_primary_storage: 0, - remove_reference_for_index_level_for_contract_operations: 0, - remove_indices_for_index_level_for_contract_operations: 0, - remove_indices_for_top_index_level_for_contract_operations: 0, - delete_document_for_contract_id_with_named_type_operations: 0, - delete_document_for_contract_with_named_type_operations: 0, - delete_document_for_contract_operations: 0, - }, - insert: DriveDocumentInsertMethodVersions { - add_document: 0, - add_document_for_contract: 0, - add_document_for_contract_apply_and_add_to_operations: 0, - add_document_for_contract_operations: 0, - add_document_to_primary_storage: 0, - add_indices_for_index_level_for_contract_operations: 0, - add_indices_for_top_index_level_for_contract_operations: 0, - add_reference_for_index_level_for_contract_operations: 0, - }, - insert_contested: DriveDocumentInsertContestedMethodVersions { - add_contested_document: 0, - add_contested_document_for_contract: 0, - add_contested_document_for_contract_apply_and_add_to_operations: 0, - add_contested_document_for_contract_operations: 0, - add_contested_document_to_primary_storage: 0, - add_contested_indices_for_contract_operations: 0, - add_contested_reference_and_vote_subtree_to_document_operations: 0, - add_contested_vote_subtree_for_non_identities_operations: 0, - }, - update: DriveDocumentUpdateMethodVersions { - add_update_multiple_documents_operations: 0, - update_document_for_contract: 0, - update_document_for_contract_apply_and_add_to_operations: 0, - update_document_for_contract_id: 0, - update_document_for_contract_operations: 0, - update_document_with_serialization_for_contract: 0, - update_serialized_document_for_contract: 0, - }, - estimation_costs: DriveDocumentEstimationCostsMethodVersions { - add_estimation_costs_for_add_document_to_primary_storage: 0, - add_estimation_costs_for_add_contested_document_to_primary_storage: 0, - stateless_delete_of_non_tree_for_costs: 0, - }, - index_uniqueness: DriveDocumentIndexUniquenessMethodVersions { - validate_document_uniqueness: 0, - validate_document_create_transition_action_uniqueness: 0, - validate_document_replace_transition_action_uniqueness: 0, - validate_document_transfer_transition_action_uniqueness: 0, - validate_document_purchase_transition_action_uniqueness: 0, - validate_document_update_price_transition_action_uniqueness: 0, - validate_uniqueness_of_data: 0, - }, - }, - vote: DriveVoteMethodVersions { - insert: DriveVoteInsertMethodVersions { - register_identity_vote: 0, - }, - contested_resource_insert: DriveVoteContestedResourceInsertMethodVersions { - register_contested_resource_identity_vote: 0, - insert_stored_info_for_contested_resource_vote_poll: 0, - register_identity_vote: 0, - add_vote_poll_end_date_query_operations: 0, - }, - cleanup: DriveVoteCleanupMethodVersions { - remove_specific_vote_references_given_by_identity: 0, - remove_specific_votes_given_by_identity: 0, - remove_contested_resource_vote_poll_end_date_query_operations: 1, - remove_contested_resource_vote_poll_votes_operations: 0, - remove_contested_resource_vote_poll_documents_operations: 1, - remove_contested_resource_vote_poll_contenders_operations: 1, - remove_contested_resource_top_level_index_operations: 0, - remove_contested_resource_info_operations: 0, - }, - setup: DriveVoteSetupMethodVersions { - add_initial_vote_tree_main_structure_operations: 0, - }, - storage_form: DriveVoteStorageFormMethodVersions { - resolve_with_contract: 0, - }, - fetch: DriveVoteFetchMethodVersions { - fetch_identities_voting_for_contenders: 0, - fetch_contested_document_vote_poll_stored_info: 0, - fetch_identity_contested_resource_vote: 0, - }, - }, - contract: DriveContractMethodVersions { - prove: DriveContractProveMethodVersions { - prove_contract: 0, - prove_contract_history: 0, - prove_contracts: 0, - }, - apply: DriveContractApplyMethodVersions { - apply_contract: 0, - apply_contract_with_serialization: 0, - }, - insert: DriveContractInsertMethodVersions { - add_contract_to_storage: 0, - insert_contract: 0, - }, - update: DriveContractUpdateMethodVersions { update_contract: 0 }, - costs: DriveContractCostsMethodVersions { - add_estimation_costs_for_contract_insertion: 0, - }, - get: DriveContractGetMethodVersions { - fetch_contract: 0, - fetch_contract_with_history: 0, - get_cached_contract_with_fetch_info: 0, - get_contract_with_fetch_info: 0, - get_contracts_with_fetch_info: 0, - }, - }, - fees: DriveFeesMethodVersions { calculate_fee: 0 }, - estimated_costs: DriveEstimatedCostsMethodVersions { - add_estimation_costs_for_levels_up_to_contract: 0, - add_estimation_costs_for_levels_up_to_contract_document_type_excluded: 0, - add_estimation_costs_for_contested_document_tree_levels_up_to_contract: 0, - add_estimation_costs_for_contested_document_tree_levels_up_to_contract_document_type_excluded: 0, - }, - asset_lock: DriveAssetLockMethodVersions { - add_asset_lock_outpoint: 0, - add_estimation_costs_for_adding_asset_lock: 0, - fetch_asset_lock_outpoint_info: 0, - }, - verify: DriveVerifyMethodVersions { - contract: DriveVerifyContractMethodVersions { - verify_contract: 0, - verify_contract_history: 0, - }, - document: DriveVerifyDocumentMethodVersions { - verify_proof: 0, - verify_proof_keep_serialized: 0, - verify_start_at_document_in_proof: 0, - }, - identity: DriveVerifyIdentityMethodVersions { - verify_full_identities_by_public_key_hashes: 0, - verify_full_identity_by_identity_id: 0, - verify_full_identity_by_public_key_hash: 0, - verify_identity_balance_for_identity_id: 0, - verify_identity_balances_for_identity_ids: 0, - verify_identity_id_by_public_key_hash: 0, - verify_identity_ids_by_public_key_hashes: 0, - verify_identity_keys_by_identity_id: 0, - verify_identity_nonce: 0, - verify_identity_contract_nonce: 0, - verify_identities_contract_keys: 0, - verify_identity_revision_for_identity_id: 0, - }, - single_document: DriveVerifySingleDocumentMethodVersions { - verify_proof: 0, - verify_proof_keep_serialized: 0, - }, - system: DriveVerifySystemMethodVersions { - verify_epoch_infos: 0, - verify_epoch_proposers: 0, - verify_elements: 0, - verify_total_credits_in_system: 0, - verify_upgrade_state: 0, - verify_upgrade_vote_status: 0, - }, - voting: DriveVerifyVoteMethodVersions { - verify_masternode_vote: 0, - verify_start_at_contender_in_proof: 0, - verify_vote_poll_votes_proof: 0, - verify_identity_votes_given_proof: 0, - verify_vote_poll_vote_state_proof: 0, - verify_contests_proof: 0, - verify_vote_polls_by_end_date_proof: 0, - verify_specialized_balance: 0, - }, - state_transition: DriveVerifyStateTransitionMethodVersions { - verify_state_transition_was_executed_with_proof: 0, - }, - }, - identity: DriveIdentityMethodVersions { - fetch: DriveIdentityFetchMethodVersions { - public_key_hashes: DriveIdentityFetchPublicKeyHashesMethodVersions { - fetch_full_identities_by_unique_public_key_hashes: 0, - fetch_full_identity_by_unique_public_key_hash: 0, - fetch_identity_id_by_unique_public_key_hash: 0, - fetch_identity_ids_by_non_unique_public_key_hash: 0, - fetch_identity_ids_by_unique_public_key_hashes: 0, - fetch_serialized_full_identity_by_unique_public_key_hash: 0, - has_any_of_unique_public_key_hashes: 0, - has_non_unique_public_key_hash: 0, - has_non_unique_public_key_hash_already_for_identity: 0, - has_unique_public_key_hash: 0, - }, - attributes: DriveIdentityFetchAttributesMethodVersions { - revision: 0, - nonce: 0, - identity_contract_nonce: 0, - balance: 0, - balance_include_debt: 0, - negative_balance: 0, - }, - partial_identity: DriveIdentityFetchPartialIdentityMethodVersions { - fetch_identity_revision_with_keys: 0, - fetch_identity_balance_with_keys: 0, - fetch_identity_balance_with_keys_and_revision: 0, - fetch_identity_with_balance: 0, - fetch_identity_keys: 0, - }, - full_identity: DriveIdentityFetchFullIdentityMethodVersions { - fetch_full_identity: Some(0), - fetch_full_identities: Some(0), - }, - }, - prove: DriveIdentityProveMethodVersions { - full_identity: 0, - full_identities: 0, - identity_nonce: 0, - identity_contract_nonce: 0, - identities_contract_keys: 0, - prove_full_identities_by_unique_public_key_hashes: 0, - prove_full_identity_by_unique_public_key_hash: 0, - prove_identity_id_by_unique_public_key_hash: 0, - prove_identity_ids_by_unique_public_key_hashes: 0, - }, - keys: DriveIdentityKeysMethodVersions { - fetch: DriveIdentityKeysFetchMethodVersions { - fetch_all_current_identity_keys: 0, - fetch_all_identity_keys: 0, - fetch_identities_all_keys: 0, - fetch_identity_keys: 0, - fetch_identities_contract_keys: 0, - }, - prove: DriveIdentityKeysProveMethodVersions { - prove_identities_all_keys: 0, - prove_identity_keys: 0, - }, - insert: DriveIdentityKeysInsertMethodVersions { - create_key_tree_with_keys: 0, - create_new_identity_key_query_trees: 0, - insert_key_searchable_references: 0, - insert_key_to_storage: 0, - insert_new_non_unique_key: 0, - insert_new_unique_key: 0, - replace_key_in_storage: 0, - }, - insert_key_hash_identity_reference: - DriveIdentityKeyHashesToIdentityInsertMethodVersions { - add_estimation_costs_for_insert_non_unique_public_key_hash_reference: 0, - add_estimation_costs_for_insert_unique_public_key_hash_reference: 0, - insert_non_unique_public_key_hash_reference_to_identity: 0, - insert_reference_to_non_unique_key: 0, - insert_reference_to_unique_key: 0, - insert_unique_public_key_hash_reference_to_identity: 0, - }, - }, - update: DriveIdentityUpdateMethodVersions { - update_identity_revision: 0, - merge_identity_nonce: 0, - update_identity_negative_credit_operation: 0, - initialize_identity_revision: 0, - disable_identity_keys: 0, - re_enable_identity_keys: 0, - add_new_non_unique_keys_to_identity: 0, - add_new_unique_keys_to_identity: 0, - add_new_keys_to_identity: 0, - insert_identity_balance: 0, - initialize_negative_identity_balance: 0, - add_to_identity_balance: 0, - add_to_previous_balance: 0, - apply_balance_change_from_fee_to_identity: 0, - remove_from_identity_balance: 0, - refresh_identity_key_reference_operations: 0, - }, - insert: DriveIdentityInsertMethodVersions { - add_new_identity: 0, - }, - contract_info: DriveIdentityContractInfoMethodVersions { - add_potential_contract_info_for_contract_bounded_key: 0, - refresh_potential_contract_info_key_references: 0, - merge_identity_contract_nonce: 0, - }, - cost_estimation: DriveIdentityCostEstimationMethodVersions { - for_authentication_keys_security_level_in_key_reference_tree: 0, - for_balances: 0, - for_contract_info: 0, - for_contract_info_group: 0, - for_contract_info_group_keys: 0, - for_contract_info_group_key_purpose: 0, - for_keys_for_identity_id: 0, - for_negative_credit: 0, - for_purpose_in_key_reference_tree: 0, - for_root_key_reference_tree: 0, - for_update_revision: 0, - }, - withdrawals: DriveIdentityWithdrawalMethodVersions { - document: DriveIdentityWithdrawalDocumentMethodVersions { - fetch_oldest_withdrawal_documents_by_status: 0, - find_withdrawal_documents_by_status_and_transaction_indices: 0, - }, - transaction: DriveIdentityWithdrawalTransactionMethodVersions { - index: DriveIdentityWithdrawalTransactionIndexMethodVersions { - fetch_next_withdrawal_transaction_index: 0, - add_update_next_withdrawal_transaction_index_operation: 0, - }, - queue: DriveIdentityWithdrawalTransactionQueueMethodVersions { - add_enqueue_untied_withdrawal_transaction_operations: 0, - dequeue_untied_withdrawal_transactions: 0, - remove_broadcasted_withdrawal_transactions_after_completion_operations: 0, - move_broadcasted_withdrawal_transactions_back_to_queue_operations: 0, - }, - }, - calculate_current_withdrawal_limit: 0, - }, - }, - platform_system: DrivePlatformSystemMethodVersions { - estimation_costs: DriveSystemEstimationCostsMethodVersions { - for_total_system_credits_update: 0, - }, - }, - operations: DriveOperationsMethodVersion { - rollback_transaction: 0, - drop_cache: 0, - commit_transaction: 0, - apply_partial_batch_low_level_drive_operations: 0, - apply_partial_batch_grovedb_operations: 0, - apply_batch_low_level_drive_operations: 0, - apply_batch_grovedb_operations: 0, - }, - state_transitions: DriveStateTransitionMethodVersions { - operations: DriveStateTransitionOperationMethodVersions { - finalization_tasks: 0, - contracts: DriveDataContractOperationMethodVersions { - finalization_tasks: 0, - }, - }, - convert_to_high_level_operations: - DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions { - data_contract_create_transition: 0, - data_contract_update_transition: 0, - document_create_transition: 0, - document_delete_transition: 0, - document_purchase_transition: 0, - document_replace_transition: 0, - document_transfer_transition: 0, - document_update_price_transition: 0, - documents_batch_transition: 0, - identity_create_transition: 0, - identity_credit_transfer_transition: 0, - identity_credit_withdrawal_transition: 0, - identity_top_up_transition: 0, - identity_update_transition: 0, - masternode_vote_transition: 0, - bump_identity_data_contract_nonce: 0, - bump_identity_nonce: 0, - partially_use_asset_lock: 0, - }, - }, - batch_operations: DriveBatchOperationsMethodVersion { - convert_drive_operations_to_grove_operations: 0, - apply_drive_operations: 0, - }, - platform_state: DrivePlatformStateMethodVersions { - fetch_platform_state_bytes: 0, - store_platform_state_bytes: 0, - }, - fetch: DriveFetchMethodVersions { fetch_elements: 0 }, - prefunded_specialized_balances: DrivePrefundedSpecializedMethodVersions { - fetch_single: 0, - prove_single: 0, - add_prefunded_specialized_balance: 0, - add_prefunded_specialized_balance_operations: 0, - deduct_from_prefunded_specialized_balance: 0, - deduct_from_prefunded_specialized_balance_operations: 0, - estimated_cost_for_prefunded_specialized_balance_update: 0, - }, - }, - grove_methods: DriveGroveMethodVersions { - basic: DriveGroveBasicMethodVersions { - grove_insert: 0, - grove_insert_empty_tree: 0, - grove_insert_empty_sum_tree: 0, - grove_insert_if_not_exists: 0, - grove_insert_if_not_exists_return_existing_element: 0, - grove_clear: 0, - grove_delete: 0, - grove_get_raw: 0, - grove_get_raw_optional: 0, - grove_get_raw_value_u64_from_encoded_var_vec: 0, - grove_get: 0, - grove_get_path_query_serialized_results: 0, - grove_get_path_query_serialized_or_sum_results: 0, - grove_get_path_query: 0, - grove_get_path_query_with_optional: 0, - grove_get_raw_path_query_with_optional: 0, - grove_get_raw_path_query: 0, - grove_get_proved_path_query: 0, - grove_get_proved_path_query_with_conditional: 0, - grove_get_sum_tree_total_value: 0, - grove_has_raw: 0, - }, - batch: DriveGroveBatchMethodVersions { - batch_insert_empty_tree: 0, - batch_insert_empty_tree_if_not_exists: 0, - batch_insert_empty_tree_if_not_exists_check_existing_operations: 0, - batch_insert_sum_item_or_add_to_if_already_exists: 0, - batch_insert: 0, - batch_insert_if_not_exists: 0, - batch_insert_if_changed_value: 0, - batch_replace: 0, - batch_delete: 0, - batch_delete_items_in_path_query: 0, - batch_move_items_in_path_query: 0, - batch_remove_raw: 0, - batch_delete_up_tree_while_empty: 0, - batch_refresh_reference: 0, - }, - apply: DriveGroveApplyMethodVersions { - grove_apply_operation: 0, - grove_apply_batch: 0, - grove_apply_partial_batch: 0, - }, - costs: DriveGroveCostMethodVersions { - grove_batch_operations_costs: 0, - }, - }, - grove_version: GROVE_V1, - }, - platform_architecture: PlatformArchitectureVersion { - data_contract_factory_structure_version: 0, - document_factory_structure_version: 0, - }, + drive: DRIVE_VERSION_V2, drive_abci: DriveAbciVersion { - structs: DriveAbciStructureVersions { - platform_state_structure: 0, - platform_state_for_saving_structure_default: 0, - state_transition_execution_context: 0, - commit: 0, - masternode: 0, - signature_verification_quorum_set: 0, - }, + structs: DRIVE_ABCI_STRUCTURE_VERSIONS_V1, methods: DriveAbciMethodVersions { engine: DriveAbciEngineMethodVersions { init_chain: 0, @@ -717,595 +152,28 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { store_platform_state: 0, }, }, - validation_and_processing: DriveAbciValidationVersions { - state_transitions: DriveAbciStateTransitionValidationVersions { - common_validation_methods: DriveAbciStateTransitionCommonValidationVersions { - asset_locks: DriveAbciAssetLockValidationVersions { - fetch_asset_lock_transaction_output_sync: 0, - verify_asset_lock_is_not_spent_and_has_enough_balance: 0, - }, - validate_identity_public_key_contract_bounds: 0, - validate_identity_public_key_ids_dont_exist_in_state: 0, - validate_identity_public_key_ids_exist_in_state: 0, - validate_state_transition_identity_signed: 0, - validate_unique_identity_public_key_hashes_in_state: 0, - validate_master_key_uniqueness: 0, - validate_simple_pre_check_balance: 0, - }, - max_asset_lock_usage_attempts: 16, - identity_create_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: Some(0), - identity_signatures: Some(0), - advanced_minimum_balance_pre_check: None, - nonce: None, - state: 0, - transform_into_action: 0, - }, - identity_update_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: Some(0), - identity_signatures: Some(0), - advanced_minimum_balance_pre_check: None, - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: None, - nonce: None, - state: 0, - transform_into_action: 0, - }, - identity_credit_withdrawal_state_transition: - DriveAbciStateTransitionValidationVersion { - basic_structure: Some(1), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: Some(0), - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - identity_credit_withdrawal_state_transition_purpose_matches_requirements: 0, - identity_credit_transfer_state_transition: - DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: Some(0), - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - masternode_vote_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: None, - advanced_structure: Some(0), - identity_signatures: None, - advanced_minimum_balance_pre_check: Some(0), - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - contract_create_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: None, - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - contract_update_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: None, - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: None, - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - documents_batch_state_transition: - DriveAbciDocumentsStateTransitionValidationVersions { - balance_pre_check: 0, - basic_structure: 0, - advanced_structure: 0, - state: 0, - revision: 0, - transform_into_action: 0, - data_triggers: DriveAbciValidationDataTriggerAndBindingVersions { - bindings: 0, - triggers: DriveAbciValidationDataTriggerVersions { - create_contact_request_data_trigger: 0, - create_domain_data_trigger: 0, - create_identity_data_trigger: 0, - create_feature_flag_data_trigger: 0, - create_masternode_reward_shares_data_trigger: 0, - delete_withdrawal_data_trigger: 0, - reject_data_trigger: 0, - }, - }, - is_allowed: 0, - document_create_transition_structure_validation: 0, - document_delete_transition_structure_validation: 0, - document_replace_transition_structure_validation: 0, - document_transfer_transition_structure_validation: 0, - document_purchase_transition_structure_validation: 0, - document_update_price_transition_structure_validation: 0, - document_create_transition_state_validation: 1, - document_delete_transition_state_validation: 0, - document_replace_transition_state_validation: 0, - document_transfer_transition_state_validation: 0, - document_purchase_transition_state_validation: 0, - document_update_price_transition_state_validation: 0, - }, - }, - process_state_transition: 0, - state_transition_to_execution_event_for_check_tx: 0, - penalties: PenaltyAmounts { - identity_id_not_correct: 50000000, - unique_key_already_present: 10000000, - validation_of_added_keys_structure_failure: 10000000, - validation_of_added_keys_proof_of_possession_failure: 50000000, - }, - event_constants: DriveAbciValidationConstants { - maximum_vote_polls_to_process: 2, - maximum_contenders_to_consider: 100, - }, - }, - withdrawal_constants: DriveAbciWithdrawalConstants { - core_expiration_blocks: 48, - cleanup_expired_locks_of_withdrawal_amounts_limit: 64, - }, - query: DriveAbciQueryVersions { - max_returned_elements: 100, - response_metadata: 0, - proofs_query: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_query: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - prefunded_specialized_balances: DriveAbciQueryPrefundedSpecializedBalancesVersions { - balance: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - identity_based_queries: DriveAbciQueryIdentityVersions { - identity: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - keys: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identities_contract_keys: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_nonce: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_contract_nonce: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - balance: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identities_balances: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - balance_and_revision: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_by_public_key_hash: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - validator_queries: DriveAbciQueryValidatorVersions { - proposed_block_counts_by_evonode_ids: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - proposed_block_counts_by_range: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - data_contract_based_queries: DriveAbciQueryDataContractVersions { - data_contract: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - data_contract_history: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - data_contracts: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - voting_based_queries: DriveAbciQueryVotingVersions { - vote_polls_by_end_date_query: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contested_resource_vote_state: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contested_resource_voters_for_identity: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contested_resource_identity_vote_status: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contested_resources: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - system: DriveAbciQuerySystemVersions { - version_upgrade_state: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - version_upgrade_vote_status: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - epoch_infos: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - current_quorums_info: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - partial_status: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - path_elements: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - total_credits_in_platform: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - }, + validation_and_processing: DRIVE_ABCI_VALIDATION_VERSIONS_V3, + withdrawal_constants: DRIVE_ABCI_WITHDRAWAL_CONSTANTS_V2, + query: DRIVE_ABCI_QUERY_VERSIONS_V1, }, dpp: DPPVersion { - costs: CostVersions { - signature_verify: 0, - }, - validation: DPPValidationVersions { - json_schema_validator: JsonSchemaValidatorVersions { - new: 0, - validate: 0, - compile: 0, - compile_and_validate: 0, - }, - data_contract: DataContractValidationVersions { - validate: 0, - validate_config_update: 0, - validate_index_definitions: 0, - validate_index_naming_duplicates: 0, - validate_not_defined_properties: 0, - validate_property_definition: 0, - }, - document_type: DocumentTypeValidationVersions { - validate_update: 0, - contested_index_limit: 1, - unique_index_limit: 10, - }, - voting: VotingValidationVersions { - allow_other_contenders_time_mainnet_ms: 604_800_000, // 1 week in ms - allow_other_contenders_time_testing_ms: 2_700_000, //45 minutes - votes_allowed_per_masternode: 5, - }, - }, - state_transition_serialization_versions: StateTransitionSerializationVersions { - identity_public_key_in_creation: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_create_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_update_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_top_up_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_credit_withdrawal_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_credit_transfer_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - masternode_vote_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contract_create_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contract_update_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - documents_batch_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_base_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_create_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_replace_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_delete_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_transfer_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_update_price_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_purchase_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - }, - state_transition_conversion_versions: StateTransitionConversionVersions { - identity_to_identity_create_transition: 0, - identity_to_identity_top_up_transition: 0, - identity_to_identity_withdrawal_transition: 1, - identity_to_identity_create_transition_with_signer: 0, - }, - state_transition_method_versions: StateTransitionMethodVersions { - public_key_in_creation_methods: PublicKeyInCreationMethodVersions { - from_public_key_signed_with_private_key: 0, - from_public_key_signed_external: 0, - hash: 0, - duplicated_key_ids_witness: 0, - duplicated_keys_witness: 0, - validate_identity_public_keys_structure: 0, - }, - }, - state_transitions: StateTransitionVersions { - documents: DocumentTransitionVersions { - documents_batch_transition: DocumentsBatchTransitionVersions { - validation: DocumentsBatchTransitionValidationVersions { - find_duplicates_by_id: 0, - validate_base_structure: 0, - }, - }, - }, - identities: IdentityTransitionVersions { - max_public_keys_in_creation: 6, - asset_locks: IdentityTransitionAssetLockVersions { - required_asset_lock_duff_balance_for_processing_start_for_identity_create: - 200000, - required_asset_lock_duff_balance_for_processing_start_for_identity_top_up: - 50000, - validate_asset_lock_transaction_structure: 0, - validate_instant_asset_lock_proof_structure: 0, - }, - credit_withdrawal: IdentityCreditWithdrawalTransitionVersions { - default_constructor: 0, - }, - }, - }, - contract_versions: ContractVersions { - max_serialized_size: 65000, - contract_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contract_structure_version: 0, - created_data_contract_structure: 0, - config: 0, - methods: DataContractMethodVersions { - validate_document: 0, - validate_update: 0, - schema: 0, - }, - document_type_versions: DocumentTypeVersions { - index_versions: DocumentTypeIndexVersions { - index_levels_from_indices: 0, - }, - class_method_versions: DocumentTypeClassMethodVersions { - try_from_schema: 0, - create_document_types_from_document_schemas: 0, - }, - structure_version: 0, - schema: DocumentTypeSchemaVersions { - enrich_with_base_schema: 0, - find_identifier_and_binary_paths: 0, - validate_max_depth: 0, - max_depth: 256, - recursive_schema_validator_versions: RecursiveSchemaValidatorVersions { - traversal_validator: 0, - }, - validate_schema_compatibility: 0, - }, - methods: DocumentTypeMethodVersions { - create_document_from_data: 0, - create_document_with_prevalidated_properties: 0, - prefunded_voting_balance_for_document: 0, - contested_vote_poll_for_document: 0, - estimated_size: 0, - index_for_types: 0, - max_size: 0, - serialize_value_for_key: 0, - deserialize_value_for_key: 0, - }, - }, - }, - document_versions: DocumentVersions { - document_structure_version: 0, - document_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_cbor_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - extended_document_structure_version: 0, - extended_document_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_method_versions: DocumentMethodVersions { - is_equal_ignoring_timestamps: 0, - hash: 0, - get_raw_for_contract: 0, - get_raw_for_document_type: 0, - try_into_asset_unlock_base_transaction_info: 0, - }, - }, - identity_versions: IdentityVersions { - identity_structure_version: 0, - identity_key_structure_version: 0, - identity_key_type_method_versions: IdentityKeyTypeMethodVersions { - random_public_key_data: 0, - random_public_and_private_key_data: 0, - }, - }, - voting_versions: VotingVersions { - default_vote_poll_time_duration_mainnet_ms: 1_209_600_000, //2 weeks - default_vote_poll_time_duration_test_network_ms: 5_400_000, //90 minutes - contested_document_vote_poll_stored_info_version: 0, - }, - asset_lock_versions: AssetLockVersions { - reduced_asset_lock_value: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - methods: DPPMethodVersions { - epoch_core_reward_credits_for_distribution: 0, - daily_withdrawal_limit: 0, - }, - }, - system_data_contracts: SystemDataContractVersions { - withdrawals: 1, - dpns: 1, - dashpay: 1, - masternode_reward_shares: 1, - feature_flags: 1, + costs: DPP_COSTS_VERSIONS_V1, + validation: DPP_VALIDATION_VERSIONS_V2, + state_transition_serialization_versions: STATE_TRANSITION_SERIALIZATION_VERSIONS_V1, + state_transition_conversion_versions: STATE_TRANSITION_CONVERSION_VERSIONS_V2, + state_transition_method_versions: STATE_TRANSITION_METHOD_VERSIONS_V1, + state_transitions: STATE_TRANSITION_VERSIONS_V1, + contract_versions: CONTRACT_VERSIONS_V1, + document_versions: DOCUMENT_VERSIONS_V1, + identity_versions: IDENTITY_VERSIONS_V1, + voting_versions: VOTING_VERSION_V2, + asset_lock_versions: DPP_ASSET_LOCK_VERSIONS_V1, + methods: DPP_METHOD_VERSIONS_V1, + factory_versions: DPP_FACTORY_VERSIONS_V1, }, + system_data_contracts: SYSTEM_DATA_CONTRACT_VERSIONS_V1, fee_version: FEE_VERSION1, - system_limits: SystemLimits { - estimated_contract_max_serialized_size: 16384, - max_field_value_size: 5120, //5 KiB - max_state_transition_size: 20480, //20 KiB - max_transitions_in_documents_batch: 1, - withdrawal_transactions_per_block_limit: 4, - retry_signing_expired_withdrawal_documents_per_block_limit: 1, - max_withdrawal_amount: 50_000_000_000_000, - }, + system_limits: SYSTEM_LIMITS_V1, consensus: ConsensusVersions { tenderdash_consensus_version: 1, }, diff --git a/packages/rs-platform-version/src/version/mod.rs b/packages/rs-platform-version/src/version/mod.rs index 9ee6257751..489aa21cc4 100644 --- a/packages/rs-platform-version/src/version/mod.rs +++ b/packages/rs-platform-version/src/version/mod.rs @@ -3,15 +3,15 @@ use crate::version::v4::PROTOCOL_VERSION_4; pub use protocol_version::*; mod consensus_versions; -pub mod contracts; pub mod dpp_versions; pub mod drive_abci_versions; pub mod drive_versions; pub mod fee; -mod limits; #[cfg(feature = "mock-versions")] pub mod mocks; pub mod patches; +pub mod system_data_contract_versions; +mod system_limits; pub mod v1; pub mod v2; pub mod v3; diff --git a/packages/rs-platform-version/src/version/protocol_version.rs b/packages/rs-platform-version/src/version/protocol_version.rs index f3d4a1871d..dc408cc613 100644 --- a/packages/rs-platform-version/src/version/protocol_version.rs +++ b/packages/rs-platform-version/src/version/protocol_version.rs @@ -1,5 +1,4 @@ use crate::error::PlatformVersionError; -use crate::version::contracts::SystemDataContractVersions; use crate::version::dpp_versions::DPPVersion; use crate::version::drive_abci_versions::DriveAbciVersion; use crate::version::drive_versions::DriveVersion; @@ -10,34 +9,27 @@ use crate::version::mocks::v2_test::TEST_PLATFORM_V2; use crate::version::mocks::v3_test::TEST_PLATFORM_V3; #[cfg(feature = "mock-versions")] use crate::version::mocks::TEST_PROTOCOL_VERSION_SHIFT_BYTES; +use crate::version::system_data_contract_versions::SystemDataContractVersions; use crate::version::v1::PLATFORM_V1; #[cfg(feature = "mock-versions")] use std::sync::OnceLock; use crate::version::consensus_versions::ConsensusVersions; -use crate::version::limits::SystemLimits; +use crate::version::system_limits::SystemLimits; use crate::version::v2::PLATFORM_V2; use crate::version::v3::PLATFORM_V3; use crate::version::v4::PLATFORM_V4; use crate::version::ProtocolVersion; pub use versioned_feature_core::*; -#[derive(Clone, Debug, Default)] -pub struct PlatformArchitectureVersion { - pub data_contract_factory_structure_version: FeatureVersion, - pub document_factory_structure_version: FeatureVersion, -} - #[derive(Clone, Debug)] pub struct PlatformVersion { pub protocol_version: ProtocolVersion, - pub proofs: FeatureVersionBounds, pub dpp: DPPVersion, pub drive: DriveVersion, pub drive_abci: DriveAbciVersion, pub consensus: ConsensusVersions, pub fee_version: FeeVersion, - pub platform_architecture: PlatformArchitectureVersion, pub system_data_contracts: SystemDataContractVersions, pub system_limits: SystemLimits, } diff --git a/packages/rs-platform-version/src/version/contracts.rs b/packages/rs-platform-version/src/version/system_data_contract_versions/mod.rs similarity index 95% rename from packages/rs-platform-version/src/version/contracts.rs rename to packages/rs-platform-version/src/version/system_data_contract_versions/mod.rs index 84c0d874b1..53af3b5ce0 100644 --- a/packages/rs-platform-version/src/version/contracts.rs +++ b/packages/rs-platform-version/src/version/system_data_contract_versions/mod.rs @@ -1,3 +1,5 @@ +pub mod v1; + use crate::version::FeatureVersion; #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/system_data_contract_versions/v1.rs b/packages/rs-platform-version/src/version/system_data_contract_versions/v1.rs new file mode 100644 index 0000000000..205d6fda2a --- /dev/null +++ b/packages/rs-platform-version/src/version/system_data_contract_versions/v1.rs @@ -0,0 +1,10 @@ +use crate::version::system_data_contract_versions::SystemDataContractVersions; + +pub const SYSTEM_DATA_CONTRACT_VERSIONS_V1: SystemDataContractVersions = + SystemDataContractVersions { + withdrawals: 1, + dpns: 1, + dashpay: 1, + masternode_reward_shares: 1, + feature_flags: 1, + }; diff --git a/packages/rs-platform-version/src/version/limits.rs b/packages/rs-platform-version/src/version/system_limits/mod.rs similarity index 96% rename from packages/rs-platform-version/src/version/limits.rs rename to packages/rs-platform-version/src/version/system_limits/mod.rs index 4d10e3810d..0dd2c5b922 100644 --- a/packages/rs-platform-version/src/version/limits.rs +++ b/packages/rs-platform-version/src/version/system_limits/mod.rs @@ -1,3 +1,5 @@ +pub mod v1; + #[derive(Clone, Debug, Default)] pub struct SystemLimits { pub estimated_contract_max_serialized_size: u16, diff --git a/packages/rs-platform-version/src/version/system_limits/v1.rs b/packages/rs-platform-version/src/version/system_limits/v1.rs new file mode 100644 index 0000000000..6dacce0b35 --- /dev/null +++ b/packages/rs-platform-version/src/version/system_limits/v1.rs @@ -0,0 +1,11 @@ +use crate::version::system_limits::SystemLimits; + +pub const SYSTEM_LIMITS_V1: SystemLimits = SystemLimits { + estimated_contract_max_serialized_size: 16384, + max_field_value_size: 5120, //5 KiB + max_state_transition_size: 20480, //20 KiB + max_transitions_in_documents_batch: 1, + withdrawal_transactions_per_block_limit: 4, + retry_signing_expired_withdrawal_documents_per_block_limit: 1, + max_withdrawal_amount: 50_000_000_000_000, //500 Dash +}; diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 8369d3a30f..f7803b32c5 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -1,1310 +1,61 @@ use crate::version::consensus_versions::ConsensusVersions; -use crate::version::contracts::SystemDataContractVersions; -use crate::version::dpp_versions::{ - AssetLockVersions, ContractVersions, CostVersions, DPPMethodVersions, DPPValidationVersions, - DPPVersion, DataContractMethodVersions, DataContractValidationVersions, - DocumentFeatureVersionBounds, DocumentMethodVersions, DocumentTransitionVersions, - DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, DocumentTypeMethodVersions, - DocumentTypeSchemaVersions, DocumentTypeValidationVersions, DocumentTypeVersions, - DocumentVersions, DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions, - IdentityCreditWithdrawalTransitionVersions, IdentityKeyTypeMethodVersions, - IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions, - JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, - RecursiveSchemaValidatorVersions, StateTransitionConversionVersions, - StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions, - VotingValidationVersions, VotingVersions, -}; -use crate::version::drive_abci_versions::{ - DriveAbciAssetLockValidationVersions, DriveAbciBlockEndMethodVersions, - DriveAbciBlockFeeProcessingMethodVersions, DriveAbciBlockStartMethodVersions, - DriveAbciCoreBasedUpdatesMethodVersions, DriveAbciCoreChainLockMethodVersionsAndConstants, - DriveAbciCoreInstantSendLockMethodVersions, - DriveAbciDocumentsStateTransitionValidationVersions, DriveAbciEngineMethodVersions, - DriveAbciEpochMethodVersions, DriveAbciFeePoolInwardsDistributionMethodVersions, - DriveAbciFeePoolOutwardsDistributionMethodVersions, - DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, - DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, - DriveAbciPlatformStateStorageMethodVersions, DriveAbciProtocolUpgradeMethodVersions, - DriveAbciQueryDataContractVersions, DriveAbciQueryIdentityVersions, - DriveAbciQueryPrefundedSpecializedBalancesVersions, DriveAbciQuerySystemVersions, - DriveAbciQueryValidatorVersions, DriveAbciQueryVersions, DriveAbciQueryVotingVersions, - DriveAbciStateTransitionCommonValidationVersions, - DriveAbciStateTransitionProcessingMethodVersions, DriveAbciStateTransitionValidationVersion, - DriveAbciStateTransitionValidationVersions, DriveAbciStructureVersions, - DriveAbciValidationConstants, DriveAbciValidationDataTriggerAndBindingVersions, - DriveAbciValidationDataTriggerVersions, DriveAbciValidationVersions, DriveAbciVersion, - DriveAbciVotingMethodVersions, DriveAbciWithdrawalConstants, PenaltyAmounts, -}; -use crate::version::drive_versions::{ - DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, - DriveContractApplyMethodVersions, DriveContractCostsMethodVersions, - DriveContractGetMethodVersions, DriveContractInsertMethodVersions, DriveContractMethodVersions, - DriveContractProveMethodVersions, DriveContractUpdateMethodVersions, - DriveCreditPoolEpochsMethodVersions, DriveCreditPoolMethodVersions, - DriveCreditPoolPendingEpochRefundsMethodVersions, - DriveCreditPoolStorageFeeDistributionPoolMethodVersions, - DriveCreditPoolUnpaidEpochMethodVersions, DriveDataContractOperationMethodVersions, - DriveDocumentDeleteMethodVersions, DriveDocumentEstimationCostsMethodVersions, - DriveDocumentIndexUniquenessMethodVersions, DriveDocumentInsertContestedMethodVersions, - DriveDocumentInsertMethodVersions, DriveDocumentMethodVersions, - DriveDocumentQueryMethodVersions, DriveDocumentUpdateMethodVersions, - DriveEstimatedCostsMethodVersions, DriveFeesMethodVersions, DriveFetchMethodVersions, - DriveGroveApplyMethodVersions, DriveGroveBasicMethodVersions, DriveGroveBatchMethodVersions, - DriveGroveCostMethodVersions, DriveGroveMethodVersions, - DriveIdentityContractInfoMethodVersions, DriveIdentityCostEstimationMethodVersions, - DriveIdentityFetchAttributesMethodVersions, DriveIdentityFetchFullIdentityMethodVersions, - DriveIdentityFetchMethodVersions, DriveIdentityFetchPartialIdentityMethodVersions, - DriveIdentityFetchPublicKeyHashesMethodVersions, DriveIdentityInsertMethodVersions, - DriveIdentityKeyHashesToIdentityInsertMethodVersions, DriveIdentityKeysFetchMethodVersions, - DriveIdentityKeysInsertMethodVersions, DriveIdentityKeysMethodVersions, - DriveIdentityKeysProveMethodVersions, DriveIdentityMethodVersions, - DriveIdentityProveMethodVersions, DriveIdentityUpdateMethodVersions, - DriveIdentityWithdrawalDocumentMethodVersions, DriveIdentityWithdrawalMethodVersions, - DriveIdentityWithdrawalTransactionIndexMethodVersions, - DriveIdentityWithdrawalTransactionMethodVersions, - DriveIdentityWithdrawalTransactionQueueMethodVersions, DriveInitializationMethodVersions, - DriveMethodVersions, DriveOperationsMethodVersion, DrivePlatformStateMethodVersions, - DrivePlatformSystemMethodVersions, DrivePrefundedSpecializedMethodVersions, - DriveProtocolUpgradeVersions, DriveProveMethodVersions, - DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions, - DriveStateTransitionMethodVersions, DriveStateTransitionOperationMethodVersions, - DriveStructureVersion, DriveSystemEstimationCostsMethodVersions, - DriveVerifyContractMethodVersions, DriveVerifyDocumentMethodVersions, - DriveVerifyIdentityMethodVersions, DriveVerifyMethodVersions, - DriveVerifySingleDocumentMethodVersions, DriveVerifyStateTransitionMethodVersions, - DriveVerifySystemMethodVersions, DriveVerifyVoteMethodVersions, DriveVersion, - DriveVoteCleanupMethodVersions, DriveVoteContestedResourceInsertMethodVersions, - DriveVoteFetchMethodVersions, DriveVoteInsertMethodVersions, DriveVoteMethodVersions, - DriveVoteSetupMethodVersions, DriveVoteStorageFormMethodVersions, -}; +use crate::version::dpp_versions::dpp_asset_lock_versions::v1::DPP_ASSET_LOCK_VERSIONS_V1; +use crate::version::dpp_versions::dpp_contract_versions::v1::CONTRACT_VERSIONS_V1; +use crate::version::dpp_versions::dpp_costs_versions::v1::DPP_COSTS_VERSIONS_V1; +use crate::version::dpp_versions::dpp_document_versions::v1::DOCUMENT_VERSIONS_V1; +use crate::version::dpp_versions::dpp_factory_versions::v1::DPP_FACTORY_VERSIONS_V1; +use crate::version::dpp_versions::dpp_identity_versions::v1::IDENTITY_VERSIONS_V1; +use crate::version::dpp_versions::dpp_method_versions::v1::DPP_METHOD_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_conversion_versions::v1::STATE_TRANSITION_CONVERSION_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_method_versions::v1::STATE_TRANSITION_METHOD_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_serialization_versions::v1::STATE_TRANSITION_SERIALIZATION_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_versions::v1::STATE_TRANSITION_VERSIONS_V1; +use crate::version::dpp_versions::dpp_validation_versions::v1::DPP_VALIDATION_VERSIONS_V1; +use crate::version::dpp_versions::dpp_voting_versions::v1::VOTING_VERSION_V1; +use crate::version::dpp_versions::DPPVersion; +use crate::version::drive_abci_versions::drive_abci_method_versions::v1::DRIVE_ABCI_METHOD_VERSIONS_V1; +use crate::version::drive_abci_versions::drive_abci_query_versions::v1::DRIVE_ABCI_QUERY_VERSIONS_V1; +use crate::version::drive_abci_versions::drive_abci_structure_versions::v1::DRIVE_ABCI_STRUCTURE_VERSIONS_V1; +use crate::version::drive_abci_versions::drive_abci_validation_versions::v1::DRIVE_ABCI_VALIDATION_VERSIONS_V1; +use crate::version::drive_abci_versions::drive_abci_withdrawal_constants::v1::DRIVE_ABCI_WITHDRAWAL_CONSTANTS_V1; +use crate::version::drive_abci_versions::DriveAbciVersion; +use crate::version::drive_versions::v1::DRIVE_VERSION_V1; use crate::version::fee::v1::FEE_VERSION1; -use crate::version::limits::SystemLimits; -use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; -use crate::version::{PlatformArchitectureVersion, ProtocolVersion}; -use grovedb_version::version::v1::GROVE_V1; +use crate::version::protocol_version::PlatformVersion; +use crate::version::system_data_contract_versions::v1::SYSTEM_DATA_CONTRACT_VERSIONS_V1; +use crate::version::system_limits::v1::SYSTEM_LIMITS_V1; +use crate::version::ProtocolVersion; pub const PROTOCOL_VERSION_1: ProtocolVersion = 1; pub const PLATFORM_V1: PlatformVersion = PlatformVersion { protocol_version: 1, - proofs: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - drive: DriveVersion { - structure: DriveStructureVersion { - document_indexes: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_indexes: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - pools: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - methods: DriveMethodVersions { - initialization: DriveInitializationMethodVersions { - create_initial_state_structure: 0, - }, - credit_pools: DriveCreditPoolMethodVersions { - epochs: DriveCreditPoolEpochsMethodVersions { - get_epochs_infos: 0, - get_epochs_protocol_versions: 0, - prove_epochs_infos: 0, - get_epoch_fee_multiplier: 0, - get_epoch_processing_credits_for_distribution: 0, - get_epoch_storage_credits_for_distribution: 0, - get_epoch_total_credits_for_distribution: 0, - get_storage_credits_for_distribution_for_epochs_in_range: 0, - get_epoch_start_time: 0, - get_epoch_start_block_core_height: 0, - get_epoch_start_block_height: 0, - get_first_epoch_start_block_info_between_epochs: 0, - fetch_epoch_proposers: 0, - prove_epoch_proposers: 0, - get_epochs_proposer_block_count: 0, - add_update_pending_epoch_refunds_operations: 0, - is_epochs_proposers_tree_empty: 0, - }, - pending_epoch_refunds: DriveCreditPoolPendingEpochRefundsMethodVersions { - add_delete_pending_epoch_refunds_except_specified: 0, - fetch_and_add_pending_epoch_refunds_to_collection: 0, - fetch_pending_epoch_refunds: 0, - add_update_pending_epoch_refunds_operations: 0, - }, - storage_fee_distribution_pool: - DriveCreditPoolStorageFeeDistributionPoolMethodVersions { - get_storage_fees_from_distribution_pool: 0, - }, - unpaid_epoch: DriveCreditPoolUnpaidEpochMethodVersions { - get_unpaid_epoch_index: 0, - }, - }, - protocol_upgrade: DriveProtocolUpgradeVersions { - clear_version_information: 0, - fetch_versions_with_counter: 0, - fetch_proved_versions_with_counter: 0, - fetch_validator_version_votes: 0, - fetch_proved_validator_version_votes: 0, - remove_validators_proposed_app_versions: 0, - update_validator_proposed_app_version: 0, - }, - prove: DriveProveMethodVersions { - prove_elements: 0, - prove_multiple_state_transition_results: 0, - }, - balances: DriveBalancesMethodVersions { - add_to_system_credits: 0, - add_to_system_credits_operations: 0, - remove_from_system_credits: 0, - remove_from_system_credits_operations: 0, - calculate_total_credits_balance: 0, - }, - document: DriveDocumentMethodVersions { - query: DriveDocumentQueryMethodVersions { query_documents: 0, query_contested_documents: 0, query_contested_documents_vote_state: 0, query_documents_with_flags: 0 }, - delete: DriveDocumentDeleteMethodVersions { - add_estimation_costs_for_remove_document_to_primary_storage: 0, - delete_document_for_contract: 0, - delete_document_for_contract_id: 0, - delete_document_for_contract_apply_and_add_to_operations: 0, - remove_document_from_primary_storage: 0, - remove_reference_for_index_level_for_contract_operations: 0, - remove_indices_for_index_level_for_contract_operations: 0, - remove_indices_for_top_index_level_for_contract_operations: 0, - delete_document_for_contract_id_with_named_type_operations: 0, - delete_document_for_contract_with_named_type_operations: 0, - delete_document_for_contract_operations: 0, - }, - insert: DriveDocumentInsertMethodVersions { - add_document: 0, - add_document_for_contract: 0, - add_document_for_contract_apply_and_add_to_operations: 0, - add_document_for_contract_operations: 0, - add_document_to_primary_storage: 0, - add_indices_for_index_level_for_contract_operations: 0, - add_indices_for_top_index_level_for_contract_operations: 0, - add_reference_for_index_level_for_contract_operations: 0, - }, - insert_contested: DriveDocumentInsertContestedMethodVersions { - add_contested_document: 0, - add_contested_document_for_contract: 0, - add_contested_document_for_contract_apply_and_add_to_operations: 0, - add_contested_document_for_contract_operations: 0, - add_contested_document_to_primary_storage: 0, - add_contested_indices_for_contract_operations: 0, - add_contested_reference_and_vote_subtree_to_document_operations: 0, - add_contested_vote_subtree_for_non_identities_operations: 0, - }, - update: DriveDocumentUpdateMethodVersions { - add_update_multiple_documents_operations: 0, - update_document_for_contract: 0, - update_document_for_contract_apply_and_add_to_operations: 0, - update_document_for_contract_id: 0, - update_document_for_contract_operations: 0, - update_document_with_serialization_for_contract: 0, - update_serialized_document_for_contract: 0, - }, - estimation_costs: DriveDocumentEstimationCostsMethodVersions { - add_estimation_costs_for_add_document_to_primary_storage: 0, - add_estimation_costs_for_add_contested_document_to_primary_storage: 0, - stateless_delete_of_non_tree_for_costs: 0, - }, - index_uniqueness: DriveDocumentIndexUniquenessMethodVersions { - validate_document_uniqueness: 0, - validate_document_create_transition_action_uniqueness: 0, - validate_document_replace_transition_action_uniqueness: 0, - validate_document_transfer_transition_action_uniqueness: 0, - validate_document_purchase_transition_action_uniqueness: 0, - validate_document_update_price_transition_action_uniqueness: 0, - validate_uniqueness_of_data: 0, - }, - }, - vote: DriveVoteMethodVersions { - insert: DriveVoteInsertMethodVersions { - register_identity_vote: 0, - }, - contested_resource_insert: DriveVoteContestedResourceInsertMethodVersions { - register_contested_resource_identity_vote: 0, - insert_stored_info_for_contested_resource_vote_poll: 0, - register_identity_vote: 0, - add_vote_poll_end_date_query_operations: 0, - }, - cleanup: DriveVoteCleanupMethodVersions { - remove_specific_vote_references_given_by_identity: 0, - remove_specific_votes_given_by_identity: 0, - remove_contested_resource_vote_poll_end_date_query_operations: 0, - remove_contested_resource_vote_poll_votes_operations: 0, - remove_contested_resource_vote_poll_documents_operations: 0, - remove_contested_resource_vote_poll_contenders_operations: 0, - remove_contested_resource_top_level_index_operations: 0, - remove_contested_resource_info_operations: 0, - }, - setup: DriveVoteSetupMethodVersions { - add_initial_vote_tree_main_structure_operations: 0, - }, - storage_form: DriveVoteStorageFormMethodVersions { - resolve_with_contract: 0, - }, - fetch: DriveVoteFetchMethodVersions { - fetch_identities_voting_for_contenders: 0, - fetch_contested_document_vote_poll_stored_info: 0, - fetch_identity_contested_resource_vote: 0, - }, - }, - contract: DriveContractMethodVersions { - prove: DriveContractProveMethodVersions { - prove_contract: 0, - prove_contract_history: 0, - prove_contracts: 0, - }, - apply: DriveContractApplyMethodVersions { - apply_contract: 0, - apply_contract_with_serialization: 0, - }, - insert: DriveContractInsertMethodVersions { - add_contract_to_storage: 0, - insert_contract: 0, - }, - update: DriveContractUpdateMethodVersions { update_contract: 0 }, - costs: DriveContractCostsMethodVersions { - add_estimation_costs_for_contract_insertion: 0, - }, - get: DriveContractGetMethodVersions { - fetch_contract: 0, - fetch_contract_with_history: 0, - get_cached_contract_with_fetch_info: 0, - get_contract_with_fetch_info: 0, - get_contracts_with_fetch_info: 0, - }, - }, - fees: DriveFeesMethodVersions { calculate_fee: 0 }, - estimated_costs: DriveEstimatedCostsMethodVersions { - add_estimation_costs_for_levels_up_to_contract: 0, - add_estimation_costs_for_levels_up_to_contract_document_type_excluded: 0, - add_estimation_costs_for_contested_document_tree_levels_up_to_contract: 0, - add_estimation_costs_for_contested_document_tree_levels_up_to_contract_document_type_excluded: 0, - }, - asset_lock: DriveAssetLockMethodVersions { - add_asset_lock_outpoint: 0, - add_estimation_costs_for_adding_asset_lock: 0, - fetch_asset_lock_outpoint_info: 0, - }, - verify: DriveVerifyMethodVersions { - contract: DriveVerifyContractMethodVersions { - verify_contract: 0, - verify_contract_history: 0, - }, - document: DriveVerifyDocumentMethodVersions { - verify_proof: 0, - verify_proof_keep_serialized: 0, - verify_start_at_document_in_proof: 0, - }, - identity: DriveVerifyIdentityMethodVersions { - verify_full_identities_by_public_key_hashes: 0, - verify_full_identity_by_identity_id: 0, - verify_full_identity_by_public_key_hash: 0, - verify_identity_balance_for_identity_id: 0, - verify_identity_balances_for_identity_ids: 0, - verify_identity_id_by_public_key_hash: 0, - verify_identity_ids_by_public_key_hashes: 0, - verify_identity_keys_by_identity_id: 0, - verify_identity_nonce: 0, - verify_identity_contract_nonce: 0, - verify_identities_contract_keys: 0, - verify_identity_revision_for_identity_id: 0, - }, - single_document: DriveVerifySingleDocumentMethodVersions { - verify_proof: 0, - verify_proof_keep_serialized: 0, - }, - system: DriveVerifySystemMethodVersions { - verify_epoch_infos: 0, - verify_epoch_proposers: 0, - verify_elements: 0, - verify_total_credits_in_system: 0, - verify_upgrade_state: 0, - verify_upgrade_vote_status: 0, - }, - voting: DriveVerifyVoteMethodVersions { - verify_masternode_vote: 0, - verify_start_at_contender_in_proof: 0, - verify_vote_poll_votes_proof: 0, - verify_identity_votes_given_proof: 0, - verify_vote_poll_vote_state_proof: 0, - verify_contests_proof: 0, - verify_vote_polls_by_end_date_proof: 0, - verify_specialized_balance: 0, - }, - state_transition: DriveVerifyStateTransitionMethodVersions { - verify_state_transition_was_executed_with_proof: 0, - }, - }, - identity: DriveIdentityMethodVersions { - fetch: DriveIdentityFetchMethodVersions { - public_key_hashes: DriveIdentityFetchPublicKeyHashesMethodVersions { - fetch_full_identities_by_unique_public_key_hashes: 0, - fetch_full_identity_by_unique_public_key_hash: 0, - fetch_identity_id_by_unique_public_key_hash: 0, - fetch_identity_ids_by_non_unique_public_key_hash: 0, - fetch_identity_ids_by_unique_public_key_hashes: 0, - fetch_serialized_full_identity_by_unique_public_key_hash: 0, - has_any_of_unique_public_key_hashes: 0, - has_non_unique_public_key_hash: 0, - has_non_unique_public_key_hash_already_for_identity: 0, - has_unique_public_key_hash: 0, - }, - attributes: DriveIdentityFetchAttributesMethodVersions { - revision: 0, - nonce: 0, - identity_contract_nonce: 0, - balance: 0, - balance_include_debt: 0, - negative_balance: 0, - }, - partial_identity: DriveIdentityFetchPartialIdentityMethodVersions { - fetch_identity_revision_with_keys: 0, - fetch_identity_balance_with_keys: 0, - fetch_identity_balance_with_keys_and_revision: 0, - fetch_identity_with_balance: 0, - fetch_identity_keys: 0, - }, - full_identity: DriveIdentityFetchFullIdentityMethodVersions { - fetch_full_identity: Some(0), - fetch_full_identities: Some(0), - }, - }, - prove: DriveIdentityProveMethodVersions { - full_identity: 0, - full_identities: 0, - identity_nonce: 0, - identity_contract_nonce: 0, - identities_contract_keys: 0, - prove_full_identities_by_unique_public_key_hashes: 0, - prove_full_identity_by_unique_public_key_hash: 0, - prove_identity_id_by_unique_public_key_hash: 0, - prove_identity_ids_by_unique_public_key_hashes: 0, - }, - keys: DriveIdentityKeysMethodVersions { - fetch: DriveIdentityKeysFetchMethodVersions { - fetch_all_current_identity_keys: 0, - fetch_all_identity_keys: 0, - fetch_identities_all_keys: 0, - fetch_identity_keys: 0, - fetch_identities_contract_keys: 0, - }, - prove: DriveIdentityKeysProveMethodVersions { - prove_identities_all_keys: 0, - prove_identity_keys: 0, - }, - insert: DriveIdentityKeysInsertMethodVersions { - create_key_tree_with_keys: 0, - create_new_identity_key_query_trees: 0, - insert_key_searchable_references: 0, - insert_key_to_storage: 0, - insert_new_non_unique_key: 0, - insert_new_unique_key: 0, - replace_key_in_storage: 0, - }, - insert_key_hash_identity_reference: - DriveIdentityKeyHashesToIdentityInsertMethodVersions { - add_estimation_costs_for_insert_non_unique_public_key_hash_reference: 0, - add_estimation_costs_for_insert_unique_public_key_hash_reference: 0, - insert_non_unique_public_key_hash_reference_to_identity: 0, - insert_reference_to_non_unique_key: 0, - insert_reference_to_unique_key: 0, - insert_unique_public_key_hash_reference_to_identity: 0, - }, - }, - update: DriveIdentityUpdateMethodVersions { - update_identity_revision: 0, - merge_identity_nonce: 0, - update_identity_negative_credit_operation: 0, - initialize_identity_revision: 0, - disable_identity_keys: 0, - re_enable_identity_keys: 0, - add_new_non_unique_keys_to_identity: 0, - add_new_unique_keys_to_identity: 0, - add_new_keys_to_identity: 0, - insert_identity_balance: 0, - initialize_negative_identity_balance: 0, - add_to_identity_balance: 0, - add_to_previous_balance: 0, - apply_balance_change_from_fee_to_identity: 0, - remove_from_identity_balance: 0, - refresh_identity_key_reference_operations: 0, - }, - insert: DriveIdentityInsertMethodVersions { - add_new_identity: 0, - }, - contract_info: DriveIdentityContractInfoMethodVersions { - add_potential_contract_info_for_contract_bounded_key: 0, - refresh_potential_contract_info_key_references: 0, - merge_identity_contract_nonce: 0, - }, - cost_estimation: DriveIdentityCostEstimationMethodVersions { - for_authentication_keys_security_level_in_key_reference_tree: 0, - for_balances: 0, - for_contract_info: 0, - for_contract_info_group: 0, - for_contract_info_group_keys: 0, - for_contract_info_group_key_purpose: 0, - for_keys_for_identity_id: 0, - for_negative_credit: 0, - for_purpose_in_key_reference_tree: 0, - for_root_key_reference_tree: 0, - for_update_revision: 0, - }, - withdrawals: DriveIdentityWithdrawalMethodVersions { - document: DriveIdentityWithdrawalDocumentMethodVersions { - fetch_oldest_withdrawal_documents_by_status: 0, - find_withdrawal_documents_by_status_and_transaction_indices: 0, - }, - transaction: DriveIdentityWithdrawalTransactionMethodVersions { - index: DriveIdentityWithdrawalTransactionIndexMethodVersions { - fetch_next_withdrawal_transaction_index: 0, - add_update_next_withdrawal_transaction_index_operation: 0, - }, - queue: DriveIdentityWithdrawalTransactionQueueMethodVersions { - add_enqueue_untied_withdrawal_transaction_operations: 0, - dequeue_untied_withdrawal_transactions: 0, - remove_broadcasted_withdrawal_transactions_after_completion_operations: 0, - move_broadcasted_withdrawal_transactions_back_to_queue_operations: 0, - }, - }, - calculate_current_withdrawal_limit: 0, - }, - }, - platform_system: DrivePlatformSystemMethodVersions { - estimation_costs: DriveSystemEstimationCostsMethodVersions { - for_total_system_credits_update: 0, - }, - }, - operations: DriveOperationsMethodVersion { - rollback_transaction: 0, - drop_cache: 0, - commit_transaction: 0, - apply_partial_batch_low_level_drive_operations: 0, - apply_partial_batch_grovedb_operations: 0, - apply_batch_low_level_drive_operations: 0, - apply_batch_grovedb_operations: 0, - }, - state_transitions: DriveStateTransitionMethodVersions { - operations: DriveStateTransitionOperationMethodVersions { - finalization_tasks: 0, - contracts: DriveDataContractOperationMethodVersions { - finalization_tasks: 0, - }, - }, - convert_to_high_level_operations: - DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions { - data_contract_create_transition: 0, - data_contract_update_transition: 0, - document_create_transition: 0, - document_delete_transition: 0, - document_purchase_transition: 0, - document_replace_transition: 0, - document_transfer_transition: 0, - document_update_price_transition: 0, - documents_batch_transition: 0, - identity_create_transition: 0, - identity_credit_transfer_transition: 0, - identity_credit_withdrawal_transition: 0, - identity_top_up_transition: 0, - identity_update_transition: 0, - masternode_vote_transition: 0, - bump_identity_data_contract_nonce: 0, - bump_identity_nonce: 0, - partially_use_asset_lock: 0, - }, - }, - batch_operations: DriveBatchOperationsMethodVersion { - convert_drive_operations_to_grove_operations: 0, - apply_drive_operations: 0, - }, - platform_state: DrivePlatformStateMethodVersions { - fetch_platform_state_bytes: 0, - store_platform_state_bytes: 0, - }, - fetch: DriveFetchMethodVersions { fetch_elements: 0 }, - prefunded_specialized_balances: DrivePrefundedSpecializedMethodVersions { - fetch_single: 0, - prove_single: 0, - add_prefunded_specialized_balance: 0, - add_prefunded_specialized_balance_operations: 0, - deduct_from_prefunded_specialized_balance: 0, - deduct_from_prefunded_specialized_balance_operations: 0, - estimated_cost_for_prefunded_specialized_balance_update: 0, - }, - }, - grove_methods: DriveGroveMethodVersions { - basic: DriveGroveBasicMethodVersions { - grove_insert: 0, - grove_insert_empty_tree: 0, - grove_insert_empty_sum_tree: 0, - grove_insert_if_not_exists: 0, - grove_insert_if_not_exists_return_existing_element: 0, - grove_clear: 0, - grove_delete: 0, - grove_get_raw: 0, - grove_get_raw_optional: 0, - grove_get_raw_value_u64_from_encoded_var_vec: 0, - grove_get: 0, - grove_get_path_query_serialized_results: 0, - grove_get_path_query_serialized_or_sum_results: 0, - grove_get_path_query: 0, - grove_get_path_query_with_optional: 0, - grove_get_raw_path_query_with_optional: 0, - grove_get_raw_path_query: 0, - grove_get_proved_path_query: 0, - grove_get_proved_path_query_with_conditional: 0, - grove_get_sum_tree_total_value: 0, - grove_has_raw: 0, - }, - batch: DriveGroveBatchMethodVersions { - batch_insert_empty_tree: 0, - batch_insert_empty_tree_if_not_exists: 0, - batch_insert_empty_tree_if_not_exists_check_existing_operations: 0, - batch_insert_sum_item_or_add_to_if_already_exists: 0, - batch_insert: 0, - batch_insert_if_not_exists: 0, - batch_insert_if_changed_value: 0, - batch_replace: 0, - batch_delete: 0, - batch_delete_items_in_path_query: 0, - batch_move_items_in_path_query: 0, - batch_remove_raw: 0, - batch_delete_up_tree_while_empty: 0, - batch_refresh_reference: 0, - }, - apply: DriveGroveApplyMethodVersions { - grove_apply_operation: 0, - grove_apply_batch: 0, - grove_apply_partial_batch: 0, - }, - costs: DriveGroveCostMethodVersions { - grove_batch_operations_costs: 0, - }, - }, - grove_version: GROVE_V1, - }, - platform_architecture: PlatformArchitectureVersion { - data_contract_factory_structure_version: 0, - document_factory_structure_version: 0, - }, + drive: DRIVE_VERSION_V1, drive_abci: DriveAbciVersion { - structs: DriveAbciStructureVersions { - platform_state_structure: 0, - platform_state_for_saving_structure_default: 0, - state_transition_execution_context: 0, - commit: 0, - masternode: 0, - signature_verification_quorum_set: 0, - }, - methods: DriveAbciMethodVersions { - engine: DriveAbciEngineMethodVersions { - init_chain: 0, - check_tx: 0, - run_block_proposal: 0, - finalize_block_proposal: 0, - consensus_params_update: 0, - }, - initialization: DriveAbciInitializationMethodVersions { - initial_core_height_and_time: 0, - create_genesis_state: 0, - }, - core_based_updates: DriveAbciCoreBasedUpdatesMethodVersions { - update_core_info: 0, - update_masternode_list: 0, - update_quorum_info: 0, - masternode_updates: DriveAbciMasternodeIdentitiesUpdatesMethodVersions { - get_voter_identity_key: 0, - get_operator_identity_keys: 0, - get_owner_identity_withdrawal_key: 0, - get_owner_identity_owner_key: 0, - get_voter_identifier_from_masternode_list_item: 0, - get_operator_identifier_from_masternode_list_item: 0, - create_operator_identity: 0, - create_owner_identity: 0, - create_voter_identity: 0, - disable_identity_keys: 0, - update_masternode_identities: 0, - update_operator_identity: 0, - update_owner_withdrawal_address: 0, - update_voter_identity: 0, - }, - }, - protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { - check_for_desired_protocol_upgrade: 0, - upgrade_protocol_version_on_epoch_change: 0, - perform_events_on_first_block_of_protocol_change: None, - protocol_version_upgrade_percentage_needed: 75, - }, - block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { - add_process_epoch_change_operations: 0, - process_block_fees: 0, - }, - core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants { - choose_quorum: 0, - verify_chain_lock: 0, - verify_chain_lock_locally: 0, - verify_chain_lock_through_core: 0, - make_sure_core_is_synced_to_chain_lock: 0, - recent_block_count_amount: 2, - }, - core_instant_send_lock: DriveAbciCoreInstantSendLockMethodVersions { - verify_recent_signature_locally: 0, - }, - fee_pool_inwards_distribution: DriveAbciFeePoolInwardsDistributionMethodVersions { - add_distribute_block_fees_into_pools_operations: 0, - add_distribute_storage_fee_to_epochs_operations: 0, - }, - fee_pool_outwards_distribution: DriveAbciFeePoolOutwardsDistributionMethodVersions { - add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations: 0, - add_epoch_pool_to_proposers_payout_operations: 0, - find_oldest_epoch_needing_payment: 0, - fetch_reward_shares_list_for_masternode: 0, - }, - withdrawals: DriveAbciIdentityCreditWithdrawalMethodVersions { - build_untied_withdrawal_transactions_from_documents: 0, - dequeue_and_build_unsigned_withdrawal_transactions: 0, - fetch_transactions_block_inclusion_status: 0, - pool_withdrawals_into_transactions_queue: 0, - update_broadcasted_withdrawal_statuses: 0, - rebroadcast_expired_withdrawal_documents: 0, - append_signatures_and_broadcast_withdrawal_transactions: 0, - cleanup_expired_locks_of_withdrawal_amounts: 0, - }, - voting: DriveAbciVotingMethodVersions { - keep_record_of_finished_contested_resource_vote_poll: 0, - clean_up_after_vote_poll_end: 0, - clean_up_after_contested_resources_vote_poll_end: 0, - check_for_ended_vote_polls: 0, - tally_votes_for_contested_document_resource_vote_poll: 0, - award_document_to_winner: 0, - delay_vote_poll: 0, - run_dao_platform_events: 0, - remove_votes_for_removed_masternodes: 0, - }, - state_transition_processing: DriveAbciStateTransitionProcessingMethodVersions { - execute_event: 0, - process_raw_state_transitions: 0, - decode_raw_state_transitions: 0, - validate_fees_of_event: 0, - }, - epoch: DriveAbciEpochMethodVersions { - gather_epoch_info: 0, - get_genesis_time: 0, - }, - block_start: DriveAbciBlockStartMethodVersions { - clear_drive_block_cache: 0, - }, - block_end: DriveAbciBlockEndMethodVersions { - update_state_cache: 0, - update_drive_cache: 0, - validator_set_update: 0, - }, - platform_state_storage: DriveAbciPlatformStateStorageMethodVersions { - fetch_platform_state: 0, - store_platform_state: 0, - }, - }, - validation_and_processing: DriveAbciValidationVersions { - state_transitions: DriveAbciStateTransitionValidationVersions { - common_validation_methods: DriveAbciStateTransitionCommonValidationVersions { - asset_locks: DriveAbciAssetLockValidationVersions { - fetch_asset_lock_transaction_output_sync: 0, - verify_asset_lock_is_not_spent_and_has_enough_balance: 0, - }, - validate_identity_public_key_contract_bounds: 0, - validate_identity_public_key_ids_dont_exist_in_state: 0, - validate_identity_public_key_ids_exist_in_state: 0, - validate_state_transition_identity_signed: 0, - validate_unique_identity_public_key_hashes_in_state: 0, - validate_master_key_uniqueness: 0, - validate_simple_pre_check_balance: 0, - }, - max_asset_lock_usage_attempts: 16, - identity_create_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: Some(0), - identity_signatures: Some(0), - advanced_minimum_balance_pre_check: None, - nonce: None, - state: 0, - transform_into_action: 0, - }, - identity_update_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: Some(0), - identity_signatures: Some(0), - advanced_minimum_balance_pre_check: None, - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: None, - nonce: None, - state: 0, - transform_into_action: 0, - }, - identity_credit_withdrawal_state_transition: - DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: Some(0), - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - identity_credit_withdrawal_state_transition_purpose_matches_requirements: 0, - identity_credit_transfer_state_transition: - DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: Some(0), - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - masternode_vote_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: None, - advanced_structure: Some(0), - identity_signatures: None, - advanced_minimum_balance_pre_check: Some(0), - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - contract_create_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: None, - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - contract_update_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: None, - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: None, - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - documents_batch_state_transition: - DriveAbciDocumentsStateTransitionValidationVersions { - balance_pre_check: 0, - basic_structure: 0, - advanced_structure: 0, - state: 0, - revision: 0, - transform_into_action: 0, - data_triggers: DriveAbciValidationDataTriggerAndBindingVersions { - bindings: 0, - triggers: DriveAbciValidationDataTriggerVersions { - create_contact_request_data_trigger: 0, - create_domain_data_trigger: 0, - create_identity_data_trigger: 0, - create_feature_flag_data_trigger: 0, - create_masternode_reward_shares_data_trigger: 0, - delete_withdrawal_data_trigger: 0, - reject_data_trigger: 0, - }, - }, - is_allowed: 0, - document_create_transition_structure_validation: 0, - document_delete_transition_structure_validation: 0, - document_replace_transition_structure_validation: 0, - document_transfer_transition_structure_validation: 0, - document_purchase_transition_structure_validation: 0, - document_update_price_transition_structure_validation: 0, - document_create_transition_state_validation: 0, - document_delete_transition_state_validation: 0, - document_replace_transition_state_validation: 0, - document_transfer_transition_state_validation: 0, - document_purchase_transition_state_validation: 0, - document_update_price_transition_state_validation: 0, - }, - }, - process_state_transition: 0, - state_transition_to_execution_event_for_check_tx: 0, - penalties: PenaltyAmounts { - identity_id_not_correct: 50000000, - unique_key_already_present: 10000000, - validation_of_added_keys_structure_failure: 10000000, - validation_of_added_keys_proof_of_possession_failure: 50000000, - }, - event_constants: DriveAbciValidationConstants { - maximum_vote_polls_to_process: 2, - maximum_contenders_to_consider: 100, - }, - }, - withdrawal_constants: DriveAbciWithdrawalConstants { - core_expiration_blocks: 48, - cleanup_expired_locks_of_withdrawal_amounts_limit: 0, - }, - query: DriveAbciQueryVersions { - max_returned_elements: 100, - response_metadata: 0, - proofs_query: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_query: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - prefunded_specialized_balances: DriveAbciQueryPrefundedSpecializedBalancesVersions { - balance: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - identity_based_queries: DriveAbciQueryIdentityVersions { - identity: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - keys: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identities_contract_keys: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_nonce: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_contract_nonce: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - balance: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identities_balances: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - balance_and_revision: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_by_public_key_hash: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - validator_queries: DriveAbciQueryValidatorVersions { - proposed_block_counts_by_evonode_ids: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - proposed_block_counts_by_range: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - data_contract_based_queries: DriveAbciQueryDataContractVersions { - data_contract: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - data_contract_history: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - data_contracts: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - voting_based_queries: DriveAbciQueryVotingVersions { - vote_polls_by_end_date_query: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contested_resource_vote_state: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contested_resource_voters_for_identity: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contested_resource_identity_vote_status: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contested_resources: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - system: DriveAbciQuerySystemVersions { - version_upgrade_state: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - version_upgrade_vote_status: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - epoch_infos: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - current_quorums_info: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - partial_status: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - path_elements: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - total_credits_in_platform: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - }, + structs: DRIVE_ABCI_STRUCTURE_VERSIONS_V1, + methods: DRIVE_ABCI_METHOD_VERSIONS_V1, + validation_and_processing: DRIVE_ABCI_VALIDATION_VERSIONS_V1, + withdrawal_constants: DRIVE_ABCI_WITHDRAWAL_CONSTANTS_V1, + query: DRIVE_ABCI_QUERY_VERSIONS_V1, }, dpp: DPPVersion { - costs: CostVersions { - signature_verify: 0, - }, - validation: DPPValidationVersions { - json_schema_validator: JsonSchemaValidatorVersions { - new: 0, - validate: 0, - compile: 0, - compile_and_validate: 0, - }, - data_contract: DataContractValidationVersions { - validate: 0, - validate_config_update: 0, - validate_index_definitions: 0, - validate_index_naming_duplicates: 0, - validate_not_defined_properties: 0, - validate_property_definition: 0, - }, - document_type: DocumentTypeValidationVersions { - validate_update: 0, - contested_index_limit: 1, - unique_index_limit: 10, - }, - voting: VotingValidationVersions { - allow_other_contenders_time_mainnet_ms: 604_800_000, // 1 week in ms - allow_other_contenders_time_testing_ms: 604_800_000, // 1 week in ms for v1 (changes in v2) - votes_allowed_per_masternode: 5, - }, - }, - state_transition_serialization_versions: StateTransitionSerializationVersions { - identity_public_key_in_creation: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_create_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_update_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_top_up_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_credit_withdrawal_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_credit_transfer_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - masternode_vote_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contract_create_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contract_update_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - documents_batch_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_base_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_create_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_replace_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_delete_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_transfer_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_update_price_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_purchase_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - }, - state_transition_conversion_versions: StateTransitionConversionVersions { - identity_to_identity_create_transition: 0, - identity_to_identity_top_up_transition: 0, - identity_to_identity_withdrawal_transition: 0, - identity_to_identity_create_transition_with_signer: 0, - }, - state_transition_method_versions: StateTransitionMethodVersions { - public_key_in_creation_methods: PublicKeyInCreationMethodVersions { - from_public_key_signed_with_private_key: 0, - from_public_key_signed_external: 0, - hash: 0, - duplicated_key_ids_witness: 0, - duplicated_keys_witness: 0, - validate_identity_public_keys_structure: 0, - }, - }, - state_transitions: StateTransitionVersions { - documents: DocumentTransitionVersions { - documents_batch_transition: DocumentsBatchTransitionVersions { - validation: DocumentsBatchTransitionValidationVersions { - find_duplicates_by_id: 0, - validate_base_structure: 0, - }, - }, - }, - identities: IdentityTransitionVersions { - max_public_keys_in_creation: 6, - asset_locks: IdentityTransitionAssetLockVersions { - required_asset_lock_duff_balance_for_processing_start_for_identity_create: - 200000, - required_asset_lock_duff_balance_for_processing_start_for_identity_top_up: - 50000, - validate_asset_lock_transaction_structure: 0, - validate_instant_asset_lock_proof_structure: 0, - }, - credit_withdrawal: IdentityCreditWithdrawalTransitionVersions { - default_constructor: 0, - }, - }, - }, - contract_versions: ContractVersions { - max_serialized_size: 65000, - contract_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contract_structure_version: 0, - created_data_contract_structure: 0, - config: 0, - methods: DataContractMethodVersions { - validate_document: 0, - validate_update: 0, - schema: 0, - }, - document_type_versions: DocumentTypeVersions { - index_versions: DocumentTypeIndexVersions { - index_levels_from_indices: 0, - }, - class_method_versions: DocumentTypeClassMethodVersions { - try_from_schema: 0, - create_document_types_from_document_schemas: 0, - }, - structure_version: 0, - schema: DocumentTypeSchemaVersions { - enrich_with_base_schema: 0, - find_identifier_and_binary_paths: 0, - validate_max_depth: 0, - max_depth: 256, - recursive_schema_validator_versions: RecursiveSchemaValidatorVersions { - traversal_validator: 0, - }, - validate_schema_compatibility: 0, - }, - methods: DocumentTypeMethodVersions { - create_document_from_data: 0, - create_document_with_prevalidated_properties: 0, - prefunded_voting_balance_for_document: 0, - contested_vote_poll_for_document: 0, - estimated_size: 0, - index_for_types: 0, - max_size: 0, - serialize_value_for_key: 0, - deserialize_value_for_key: 0, - }, - }, - }, - document_versions: DocumentVersions { - document_structure_version: 0, - document_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_cbor_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - extended_document_structure_version: 0, - extended_document_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_method_versions: DocumentMethodVersions { - is_equal_ignoring_timestamps: 0, - hash: 0, - get_raw_for_contract: 0, - get_raw_for_document_type: 0, - try_into_asset_unlock_base_transaction_info: 0, - }, - }, - identity_versions: IdentityVersions { - identity_structure_version: 0, - identity_key_structure_version: 0, - identity_key_type_method_versions: IdentityKeyTypeMethodVersions { - random_public_key_data: 0, - random_public_and_private_key_data: 0, - }, - }, - voting_versions: VotingVersions { - default_vote_poll_time_duration_mainnet_ms: 1_209_600_000, //2 weeks - default_vote_poll_time_duration_test_network_ms: 1_209_600_000, //2 weeks - contested_document_vote_poll_stored_info_version: 0, - }, - asset_lock_versions: AssetLockVersions { - reduced_asset_lock_value: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - methods: DPPMethodVersions { - epoch_core_reward_credits_for_distribution: 0, - daily_withdrawal_limit: 0, - }, - }, - system_data_contracts: SystemDataContractVersions { - withdrawals: 1, - dpns: 1, - dashpay: 1, - masternode_reward_shares: 1, - feature_flags: 1, - }, + costs: DPP_COSTS_VERSIONS_V1, + validation: DPP_VALIDATION_VERSIONS_V1, + state_transition_serialization_versions: STATE_TRANSITION_SERIALIZATION_VERSIONS_V1, + state_transition_conversion_versions: STATE_TRANSITION_CONVERSION_VERSIONS_V1, + state_transition_method_versions: STATE_TRANSITION_METHOD_VERSIONS_V1, + state_transitions: STATE_TRANSITION_VERSIONS_V1, + contract_versions: CONTRACT_VERSIONS_V1, + document_versions: DOCUMENT_VERSIONS_V1, + identity_versions: IDENTITY_VERSIONS_V1, + voting_versions: VOTING_VERSION_V1, + asset_lock_versions: DPP_ASSET_LOCK_VERSIONS_V1, + methods: DPP_METHOD_VERSIONS_V1, + factory_versions: DPP_FACTORY_VERSIONS_V1, + }, + system_data_contracts: SYSTEM_DATA_CONTRACT_VERSIONS_V1, fee_version: FEE_VERSION1, - system_limits: SystemLimits { - estimated_contract_max_serialized_size: 16384, - max_field_value_size: 5120, //5 KiB - max_state_transition_size: 20480, //20 KiB - max_transitions_in_documents_batch: 1, - withdrawal_transactions_per_block_limit: 4, - retry_signing_expired_withdrawal_documents_per_block_limit: 1, - max_withdrawal_amount: 50_000_000_000_000, - }, + system_limits: SYSTEM_LIMITS_V1, consensus: ConsensusVersions { tenderdash_consensus_version: 0, }, diff --git a/packages/rs-platform-version/src/version/v2.rs b/packages/rs-platform-version/src/version/v2.rs index 2859bb744e..6e1ed40094 100644 --- a/packages/rs-platform-version/src/version/v2.rs +++ b/packages/rs-platform-version/src/version/v2.rs @@ -1,1310 +1,61 @@ use crate::version::consensus_versions::ConsensusVersions; -use crate::version::contracts::SystemDataContractVersions; -use crate::version::dpp_versions::{ - AssetLockVersions, ContractVersions, CostVersions, DPPMethodVersions, DPPValidationVersions, - DPPVersion, DataContractMethodVersions, DataContractValidationVersions, - DocumentFeatureVersionBounds, DocumentMethodVersions, DocumentTransitionVersions, - DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, DocumentTypeMethodVersions, - DocumentTypeSchemaVersions, DocumentTypeValidationVersions, DocumentTypeVersions, - DocumentVersions, DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions, - IdentityCreditWithdrawalTransitionVersions, IdentityKeyTypeMethodVersions, - IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions, - JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, - RecursiveSchemaValidatorVersions, StateTransitionConversionVersions, - StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions, - VotingValidationVersions, VotingVersions, -}; -use crate::version::drive_abci_versions::{ - DriveAbciAssetLockValidationVersions, DriveAbciBlockEndMethodVersions, - DriveAbciBlockFeeProcessingMethodVersions, DriveAbciBlockStartMethodVersions, - DriveAbciCoreBasedUpdatesMethodVersions, DriveAbciCoreChainLockMethodVersionsAndConstants, - DriveAbciCoreInstantSendLockMethodVersions, - DriveAbciDocumentsStateTransitionValidationVersions, DriveAbciEngineMethodVersions, - DriveAbciEpochMethodVersions, DriveAbciFeePoolInwardsDistributionMethodVersions, - DriveAbciFeePoolOutwardsDistributionMethodVersions, - DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, - DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, - DriveAbciPlatformStateStorageMethodVersions, DriveAbciProtocolUpgradeMethodVersions, - DriveAbciQueryDataContractVersions, DriveAbciQueryIdentityVersions, - DriveAbciQueryPrefundedSpecializedBalancesVersions, DriveAbciQuerySystemVersions, - DriveAbciQueryValidatorVersions, DriveAbciQueryVersions, DriveAbciQueryVotingVersions, - DriveAbciStateTransitionCommonValidationVersions, - DriveAbciStateTransitionProcessingMethodVersions, DriveAbciStateTransitionValidationVersion, - DriveAbciStateTransitionValidationVersions, DriveAbciStructureVersions, - DriveAbciValidationConstants, DriveAbciValidationDataTriggerAndBindingVersions, - DriveAbciValidationDataTriggerVersions, DriveAbciValidationVersions, DriveAbciVersion, - DriveAbciVotingMethodVersions, DriveAbciWithdrawalConstants, PenaltyAmounts, -}; -use crate::version::drive_versions::{ - DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, - DriveContractApplyMethodVersions, DriveContractCostsMethodVersions, - DriveContractGetMethodVersions, DriveContractInsertMethodVersions, DriveContractMethodVersions, - DriveContractProveMethodVersions, DriveContractUpdateMethodVersions, - DriveCreditPoolEpochsMethodVersions, DriveCreditPoolMethodVersions, - DriveCreditPoolPendingEpochRefundsMethodVersions, - DriveCreditPoolStorageFeeDistributionPoolMethodVersions, - DriveCreditPoolUnpaidEpochMethodVersions, DriveDataContractOperationMethodVersions, - DriveDocumentDeleteMethodVersions, DriveDocumentEstimationCostsMethodVersions, - DriveDocumentIndexUniquenessMethodVersions, DriveDocumentInsertContestedMethodVersions, - DriveDocumentInsertMethodVersions, DriveDocumentMethodVersions, - DriveDocumentQueryMethodVersions, DriveDocumentUpdateMethodVersions, - DriveEstimatedCostsMethodVersions, DriveFeesMethodVersions, DriveFetchMethodVersions, - DriveGroveApplyMethodVersions, DriveGroveBasicMethodVersions, DriveGroveBatchMethodVersions, - DriveGroveCostMethodVersions, DriveGroveMethodVersions, - DriveIdentityContractInfoMethodVersions, DriveIdentityCostEstimationMethodVersions, - DriveIdentityFetchAttributesMethodVersions, DriveIdentityFetchFullIdentityMethodVersions, - DriveIdentityFetchMethodVersions, DriveIdentityFetchPartialIdentityMethodVersions, - DriveIdentityFetchPublicKeyHashesMethodVersions, DriveIdentityInsertMethodVersions, - DriveIdentityKeyHashesToIdentityInsertMethodVersions, DriveIdentityKeysFetchMethodVersions, - DriveIdentityKeysInsertMethodVersions, DriveIdentityKeysMethodVersions, - DriveIdentityKeysProveMethodVersions, DriveIdentityMethodVersions, - DriveIdentityProveMethodVersions, DriveIdentityUpdateMethodVersions, - DriveIdentityWithdrawalDocumentMethodVersions, DriveIdentityWithdrawalMethodVersions, - DriveIdentityWithdrawalTransactionIndexMethodVersions, - DriveIdentityWithdrawalTransactionMethodVersions, - DriveIdentityWithdrawalTransactionQueueMethodVersions, DriveInitializationMethodVersions, - DriveMethodVersions, DriveOperationsMethodVersion, DrivePlatformStateMethodVersions, - DrivePlatformSystemMethodVersions, DrivePrefundedSpecializedMethodVersions, - DriveProtocolUpgradeVersions, DriveProveMethodVersions, - DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions, - DriveStateTransitionMethodVersions, DriveStateTransitionOperationMethodVersions, - DriveStructureVersion, DriveSystemEstimationCostsMethodVersions, - DriveVerifyContractMethodVersions, DriveVerifyDocumentMethodVersions, - DriveVerifyIdentityMethodVersions, DriveVerifyMethodVersions, - DriveVerifySingleDocumentMethodVersions, DriveVerifyStateTransitionMethodVersions, - DriveVerifySystemMethodVersions, DriveVerifyVoteMethodVersions, DriveVersion, - DriveVoteCleanupMethodVersions, DriveVoteContestedResourceInsertMethodVersions, - DriveVoteFetchMethodVersions, DriveVoteInsertMethodVersions, DriveVoteMethodVersions, - DriveVoteSetupMethodVersions, DriveVoteStorageFormMethodVersions, -}; +use crate::version::dpp_versions::dpp_asset_lock_versions::v1::DPP_ASSET_LOCK_VERSIONS_V1; +use crate::version::dpp_versions::dpp_contract_versions::v1::CONTRACT_VERSIONS_V1; +use crate::version::dpp_versions::dpp_costs_versions::v1::DPP_COSTS_VERSIONS_V1; +use crate::version::dpp_versions::dpp_document_versions::v1::DOCUMENT_VERSIONS_V1; +use crate::version::dpp_versions::dpp_factory_versions::v1::DPP_FACTORY_VERSIONS_V1; +use crate::version::dpp_versions::dpp_identity_versions::v1::IDENTITY_VERSIONS_V1; +use crate::version::dpp_versions::dpp_method_versions::v1::DPP_METHOD_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_conversion_versions::v1::STATE_TRANSITION_CONVERSION_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_method_versions::v1::STATE_TRANSITION_METHOD_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_serialization_versions::v1::STATE_TRANSITION_SERIALIZATION_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_versions::v1::STATE_TRANSITION_VERSIONS_V1; +use crate::version::dpp_versions::dpp_validation_versions::v2::DPP_VALIDATION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_voting_versions::v1::VOTING_VERSION_V1; +use crate::version::dpp_versions::DPPVersion; +use crate::version::drive_abci_versions::drive_abci_method_versions::v1::DRIVE_ABCI_METHOD_VERSIONS_V1; +use crate::version::drive_abci_versions::drive_abci_query_versions::v1::DRIVE_ABCI_QUERY_VERSIONS_V1; +use crate::version::drive_abci_versions::drive_abci_structure_versions::v1::DRIVE_ABCI_STRUCTURE_VERSIONS_V1; +use crate::version::drive_abci_versions::drive_abci_validation_versions::v2::DRIVE_ABCI_VALIDATION_VERSIONS_V2; +use crate::version::drive_abci_versions::drive_abci_withdrawal_constants::v1::DRIVE_ABCI_WITHDRAWAL_CONSTANTS_V1; +use crate::version::drive_abci_versions::DriveAbciVersion; +use crate::version::drive_versions::v2::DRIVE_VERSION_V2; use crate::version::fee::v1::FEE_VERSION1; -use crate::version::limits::SystemLimits; -use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; -use crate::version::{PlatformArchitectureVersion, ProtocolVersion}; -use grovedb_version::version::v1::GROVE_V1; +use crate::version::protocol_version::PlatformVersion; +use crate::version::system_data_contract_versions::v1::SYSTEM_DATA_CONTRACT_VERSIONS_V1; +use crate::version::system_limits::v1::SYSTEM_LIMITS_V1; +use crate::version::ProtocolVersion; pub const PROTOCOL_VERSION_2: ProtocolVersion = 2; pub const PLATFORM_V2: PlatformVersion = PlatformVersion { protocol_version: 2, - proofs: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - drive: DriveVersion { - structure: DriveStructureVersion { - document_indexes: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_indexes: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - pools: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - methods: DriveMethodVersions { - initialization: DriveInitializationMethodVersions { - create_initial_state_structure: 0, - }, - credit_pools: DriveCreditPoolMethodVersions { - epochs: DriveCreditPoolEpochsMethodVersions { - get_epochs_infos: 0, - get_epochs_protocol_versions: 0, - prove_epochs_infos: 0, - get_epoch_fee_multiplier: 0, - get_epoch_processing_credits_for_distribution: 0, - get_epoch_storage_credits_for_distribution: 0, - get_epoch_total_credits_for_distribution: 0, - get_storage_credits_for_distribution_for_epochs_in_range: 0, - get_epoch_start_time: 0, - get_epoch_start_block_core_height: 0, - get_epoch_start_block_height: 0, - get_first_epoch_start_block_info_between_epochs: 0, - fetch_epoch_proposers: 0, - prove_epoch_proposers: 0, - get_epochs_proposer_block_count: 0, - add_update_pending_epoch_refunds_operations: 0, - is_epochs_proposers_tree_empty: 0, - }, - pending_epoch_refunds: DriveCreditPoolPendingEpochRefundsMethodVersions { - add_delete_pending_epoch_refunds_except_specified: 0, - fetch_and_add_pending_epoch_refunds_to_collection: 0, - fetch_pending_epoch_refunds: 0, - add_update_pending_epoch_refunds_operations: 0, - }, - storage_fee_distribution_pool: - DriveCreditPoolStorageFeeDistributionPoolMethodVersions { - get_storage_fees_from_distribution_pool: 0, - }, - unpaid_epoch: DriveCreditPoolUnpaidEpochMethodVersions { - get_unpaid_epoch_index: 0, - }, - }, - protocol_upgrade: DriveProtocolUpgradeVersions { - clear_version_information: 0, - fetch_versions_with_counter: 0, - fetch_proved_versions_with_counter: 0, - fetch_validator_version_votes: 0, - fetch_proved_validator_version_votes: 0, - remove_validators_proposed_app_versions: 0, - update_validator_proposed_app_version: 0, - }, - prove: DriveProveMethodVersions { - prove_elements: 0, - prove_multiple_state_transition_results: 0, - }, - balances: DriveBalancesMethodVersions { - add_to_system_credits: 0, - add_to_system_credits_operations: 0, - remove_from_system_credits: 0, - remove_from_system_credits_operations: 0, - calculate_total_credits_balance: 0, - }, - document: DriveDocumentMethodVersions { - query: DriveDocumentQueryMethodVersions { query_documents: 0, query_contested_documents: 0, query_contested_documents_vote_state: 0, query_documents_with_flags: 0 }, - delete: DriveDocumentDeleteMethodVersions { - add_estimation_costs_for_remove_document_to_primary_storage: 0, - delete_document_for_contract: 0, - delete_document_for_contract_id: 0, - delete_document_for_contract_apply_and_add_to_operations: 0, - remove_document_from_primary_storage: 0, - remove_reference_for_index_level_for_contract_operations: 0, - remove_indices_for_index_level_for_contract_operations: 0, - remove_indices_for_top_index_level_for_contract_operations: 0, - delete_document_for_contract_id_with_named_type_operations: 0, - delete_document_for_contract_with_named_type_operations: 0, - delete_document_for_contract_operations: 0, - }, - insert: DriveDocumentInsertMethodVersions { - add_document: 0, - add_document_for_contract: 0, - add_document_for_contract_apply_and_add_to_operations: 0, - add_document_for_contract_operations: 0, - add_document_to_primary_storage: 0, - add_indices_for_index_level_for_contract_operations: 0, - add_indices_for_top_index_level_for_contract_operations: 0, - add_reference_for_index_level_for_contract_operations: 0, - }, - insert_contested: DriveDocumentInsertContestedMethodVersions { - add_contested_document: 0, - add_contested_document_for_contract: 0, - add_contested_document_for_contract_apply_and_add_to_operations: 0, - add_contested_document_for_contract_operations: 0, - add_contested_document_to_primary_storage: 0, - add_contested_indices_for_contract_operations: 0, - add_contested_reference_and_vote_subtree_to_document_operations: 0, - add_contested_vote_subtree_for_non_identities_operations: 0, - }, - update: DriveDocumentUpdateMethodVersions { - add_update_multiple_documents_operations: 0, - update_document_for_contract: 0, - update_document_for_contract_apply_and_add_to_operations: 0, - update_document_for_contract_id: 0, - update_document_for_contract_operations: 0, - update_document_with_serialization_for_contract: 0, - update_serialized_document_for_contract: 0, - }, - estimation_costs: DriveDocumentEstimationCostsMethodVersions { - add_estimation_costs_for_add_document_to_primary_storage: 0, - add_estimation_costs_for_add_contested_document_to_primary_storage: 0, - stateless_delete_of_non_tree_for_costs: 0, - }, - index_uniqueness: DriveDocumentIndexUniquenessMethodVersions { - validate_document_uniqueness: 0, - validate_document_create_transition_action_uniqueness: 0, - validate_document_replace_transition_action_uniqueness: 0, - validate_document_transfer_transition_action_uniqueness: 0, - validate_document_purchase_transition_action_uniqueness: 0, - validate_document_update_price_transition_action_uniqueness: 0, - validate_uniqueness_of_data: 0, - }, - }, - vote: DriveVoteMethodVersions { - insert: DriveVoteInsertMethodVersions { - register_identity_vote: 0, - }, - contested_resource_insert: DriveVoteContestedResourceInsertMethodVersions { - register_contested_resource_identity_vote: 0, - insert_stored_info_for_contested_resource_vote_poll: 0, - register_identity_vote: 0, - add_vote_poll_end_date_query_operations: 0, - }, - cleanup: DriveVoteCleanupMethodVersions { - remove_specific_vote_references_given_by_identity: 0, - remove_specific_votes_given_by_identity: 0, - remove_contested_resource_vote_poll_end_date_query_operations: 1, - remove_contested_resource_vote_poll_votes_operations: 0, - remove_contested_resource_vote_poll_documents_operations: 1, - remove_contested_resource_vote_poll_contenders_operations: 1, - remove_contested_resource_top_level_index_operations: 0, - remove_contested_resource_info_operations: 0, - }, - setup: DriveVoteSetupMethodVersions { - add_initial_vote_tree_main_structure_operations: 0, - }, - storage_form: DriveVoteStorageFormMethodVersions { - resolve_with_contract: 0, - }, - fetch: DriveVoteFetchMethodVersions { - fetch_identities_voting_for_contenders: 0, - fetch_contested_document_vote_poll_stored_info: 0, - fetch_identity_contested_resource_vote: 0, - }, - }, - contract: DriveContractMethodVersions { - prove: DriveContractProveMethodVersions { - prove_contract: 0, - prove_contract_history: 0, - prove_contracts: 0, - }, - apply: DriveContractApplyMethodVersions { - apply_contract: 0, - apply_contract_with_serialization: 0, - }, - insert: DriveContractInsertMethodVersions { - add_contract_to_storage: 0, - insert_contract: 0, - }, - update: DriveContractUpdateMethodVersions { update_contract: 0 }, - costs: DriveContractCostsMethodVersions { - add_estimation_costs_for_contract_insertion: 0, - }, - get: DriveContractGetMethodVersions { - fetch_contract: 0, - fetch_contract_with_history: 0, - get_cached_contract_with_fetch_info: 0, - get_contract_with_fetch_info: 0, - get_contracts_with_fetch_info: 0, - }, - }, - fees: DriveFeesMethodVersions { calculate_fee: 0 }, - estimated_costs: DriveEstimatedCostsMethodVersions { - add_estimation_costs_for_levels_up_to_contract: 0, - add_estimation_costs_for_levels_up_to_contract_document_type_excluded: 0, - add_estimation_costs_for_contested_document_tree_levels_up_to_contract: 0, - add_estimation_costs_for_contested_document_tree_levels_up_to_contract_document_type_excluded: 0, - }, - asset_lock: DriveAssetLockMethodVersions { - add_asset_lock_outpoint: 0, - add_estimation_costs_for_adding_asset_lock: 0, - fetch_asset_lock_outpoint_info: 0, - }, - verify: DriveVerifyMethodVersions { - contract: DriveVerifyContractMethodVersions { - verify_contract: 0, - verify_contract_history: 0, - }, - document: DriveVerifyDocumentMethodVersions { - verify_proof: 0, - verify_proof_keep_serialized: 0, - verify_start_at_document_in_proof: 0, - }, - identity: DriveVerifyIdentityMethodVersions { - verify_full_identities_by_public_key_hashes: 0, - verify_full_identity_by_identity_id: 0, - verify_full_identity_by_public_key_hash: 0, - verify_identity_balance_for_identity_id: 0, - verify_identity_balances_for_identity_ids: 0, - verify_identity_id_by_public_key_hash: 0, - verify_identity_ids_by_public_key_hashes: 0, - verify_identity_keys_by_identity_id: 0, - verify_identity_nonce: 0, - verify_identity_contract_nonce: 0, - verify_identities_contract_keys: 0, - verify_identity_revision_for_identity_id: 0, - }, - single_document: DriveVerifySingleDocumentMethodVersions { - verify_proof: 0, - verify_proof_keep_serialized: 0, - }, - system: DriveVerifySystemMethodVersions { - verify_epoch_infos: 0, - verify_epoch_proposers: 0, - verify_elements: 0, - verify_total_credits_in_system: 0, - verify_upgrade_state: 0, - verify_upgrade_vote_status: 0, - }, - voting: DriveVerifyVoteMethodVersions { - verify_masternode_vote: 0, - verify_start_at_contender_in_proof: 0, - verify_vote_poll_votes_proof: 0, - verify_identity_votes_given_proof: 0, - verify_vote_poll_vote_state_proof: 0, - verify_contests_proof: 0, - verify_vote_polls_by_end_date_proof: 0, - verify_specialized_balance: 0, - }, - state_transition: DriveVerifyStateTransitionMethodVersions { - verify_state_transition_was_executed_with_proof: 0, - }, - }, - identity: DriveIdentityMethodVersions { - fetch: DriveIdentityFetchMethodVersions { - public_key_hashes: DriveIdentityFetchPublicKeyHashesMethodVersions { - fetch_full_identities_by_unique_public_key_hashes: 0, - fetch_full_identity_by_unique_public_key_hash: 0, - fetch_identity_id_by_unique_public_key_hash: 0, - fetch_identity_ids_by_non_unique_public_key_hash: 0, - fetch_identity_ids_by_unique_public_key_hashes: 0, - fetch_serialized_full_identity_by_unique_public_key_hash: 0, - has_any_of_unique_public_key_hashes: 0, - has_non_unique_public_key_hash: 0, - has_non_unique_public_key_hash_already_for_identity: 0, - has_unique_public_key_hash: 0, - }, - attributes: DriveIdentityFetchAttributesMethodVersions { - revision: 0, - nonce: 0, - identity_contract_nonce: 0, - balance: 0, - balance_include_debt: 0, - negative_balance: 0, - }, - partial_identity: DriveIdentityFetchPartialIdentityMethodVersions { - fetch_identity_revision_with_keys: 0, - fetch_identity_balance_with_keys: 0, - fetch_identity_balance_with_keys_and_revision: 0, - fetch_identity_with_balance: 0, - fetch_identity_keys: 0, - }, - full_identity: DriveIdentityFetchFullIdentityMethodVersions { - fetch_full_identity: Some(0), - fetch_full_identities: Some(0), - }, - }, - prove: DriveIdentityProveMethodVersions { - full_identity: 0, - full_identities: 0, - identity_nonce: 0, - identity_contract_nonce: 0, - identities_contract_keys: 0, - prove_full_identities_by_unique_public_key_hashes: 0, - prove_full_identity_by_unique_public_key_hash: 0, - prove_identity_id_by_unique_public_key_hash: 0, - prove_identity_ids_by_unique_public_key_hashes: 0, - }, - keys: DriveIdentityKeysMethodVersions { - fetch: DriveIdentityKeysFetchMethodVersions { - fetch_all_current_identity_keys: 0, - fetch_all_identity_keys: 0, - fetch_identities_all_keys: 0, - fetch_identity_keys: 0, - fetch_identities_contract_keys: 0, - }, - prove: DriveIdentityKeysProveMethodVersions { - prove_identities_all_keys: 0, - prove_identity_keys: 0, - }, - insert: DriveIdentityKeysInsertMethodVersions { - create_key_tree_with_keys: 0, - create_new_identity_key_query_trees: 0, - insert_key_searchable_references: 0, - insert_key_to_storage: 0, - insert_new_non_unique_key: 0, - insert_new_unique_key: 0, - replace_key_in_storage: 0, - }, - insert_key_hash_identity_reference: - DriveIdentityKeyHashesToIdentityInsertMethodVersions { - add_estimation_costs_for_insert_non_unique_public_key_hash_reference: 0, - add_estimation_costs_for_insert_unique_public_key_hash_reference: 0, - insert_non_unique_public_key_hash_reference_to_identity: 0, - insert_reference_to_non_unique_key: 0, - insert_reference_to_unique_key: 0, - insert_unique_public_key_hash_reference_to_identity: 0, - }, - }, - update: DriveIdentityUpdateMethodVersions { - update_identity_revision: 0, - merge_identity_nonce: 0, - update_identity_negative_credit_operation: 0, - initialize_identity_revision: 0, - disable_identity_keys: 0, - re_enable_identity_keys: 0, - add_new_non_unique_keys_to_identity: 0, - add_new_unique_keys_to_identity: 0, - add_new_keys_to_identity: 0, - insert_identity_balance: 0, - initialize_negative_identity_balance: 0, - add_to_identity_balance: 0, - add_to_previous_balance: 0, - apply_balance_change_from_fee_to_identity: 0, - remove_from_identity_balance: 0, - refresh_identity_key_reference_operations: 0, - }, - insert: DriveIdentityInsertMethodVersions { - add_new_identity: 0, - }, - contract_info: DriveIdentityContractInfoMethodVersions { - add_potential_contract_info_for_contract_bounded_key: 0, - refresh_potential_contract_info_key_references: 0, - merge_identity_contract_nonce: 0, - }, - cost_estimation: DriveIdentityCostEstimationMethodVersions { - for_authentication_keys_security_level_in_key_reference_tree: 0, - for_balances: 0, - for_contract_info: 0, - for_contract_info_group: 0, - for_contract_info_group_keys: 0, - for_contract_info_group_key_purpose: 0, - for_keys_for_identity_id: 0, - for_negative_credit: 0, - for_purpose_in_key_reference_tree: 0, - for_root_key_reference_tree: 0, - for_update_revision: 0, - }, - withdrawals: DriveIdentityWithdrawalMethodVersions { - document: DriveIdentityWithdrawalDocumentMethodVersions { - fetch_oldest_withdrawal_documents_by_status: 0, - find_withdrawal_documents_by_status_and_transaction_indices: 0, - }, - transaction: DriveIdentityWithdrawalTransactionMethodVersions { - index: DriveIdentityWithdrawalTransactionIndexMethodVersions { - fetch_next_withdrawal_transaction_index: 0, - add_update_next_withdrawal_transaction_index_operation: 0, - }, - queue: DriveIdentityWithdrawalTransactionQueueMethodVersions { - add_enqueue_untied_withdrawal_transaction_operations: 0, - dequeue_untied_withdrawal_transactions: 0, - remove_broadcasted_withdrawal_transactions_after_completion_operations: 0, - move_broadcasted_withdrawal_transactions_back_to_queue_operations: 0, - }, - }, - calculate_current_withdrawal_limit: 0, - }, - }, - platform_system: DrivePlatformSystemMethodVersions { - estimation_costs: DriveSystemEstimationCostsMethodVersions { - for_total_system_credits_update: 0, - }, - }, - operations: DriveOperationsMethodVersion { - rollback_transaction: 0, - drop_cache: 0, - commit_transaction: 0, - apply_partial_batch_low_level_drive_operations: 0, - apply_partial_batch_grovedb_operations: 0, - apply_batch_low_level_drive_operations: 0, - apply_batch_grovedb_operations: 0, - }, - state_transitions: DriveStateTransitionMethodVersions { - operations: DriveStateTransitionOperationMethodVersions { - finalization_tasks: 0, - contracts: DriveDataContractOperationMethodVersions { - finalization_tasks: 0, - }, - }, - convert_to_high_level_operations: - DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions { - data_contract_create_transition: 0, - data_contract_update_transition: 0, - document_create_transition: 0, - document_delete_transition: 0, - document_purchase_transition: 0, - document_replace_transition: 0, - document_transfer_transition: 0, - document_update_price_transition: 0, - documents_batch_transition: 0, - identity_create_transition: 0, - identity_credit_transfer_transition: 0, - identity_credit_withdrawal_transition: 0, - identity_top_up_transition: 0, - identity_update_transition: 0, - masternode_vote_transition: 0, - bump_identity_data_contract_nonce: 0, - bump_identity_nonce: 0, - partially_use_asset_lock: 0, - }, - }, - batch_operations: DriveBatchOperationsMethodVersion { - convert_drive_operations_to_grove_operations: 0, - apply_drive_operations: 0, - }, - platform_state: DrivePlatformStateMethodVersions { - fetch_platform_state_bytes: 0, - store_platform_state_bytes: 0, - }, - fetch: DriveFetchMethodVersions { fetch_elements: 0 }, - prefunded_specialized_balances: DrivePrefundedSpecializedMethodVersions { - fetch_single: 0, - prove_single: 0, - add_prefunded_specialized_balance: 0, - add_prefunded_specialized_balance_operations: 0, - deduct_from_prefunded_specialized_balance: 0, - deduct_from_prefunded_specialized_balance_operations: 0, - estimated_cost_for_prefunded_specialized_balance_update: 0, - }, - }, - grove_methods: DriveGroveMethodVersions { - basic: DriveGroveBasicMethodVersions { - grove_insert: 0, - grove_insert_empty_tree: 0, - grove_insert_empty_sum_tree: 0, - grove_insert_if_not_exists: 0, - grove_insert_if_not_exists_return_existing_element: 0, - grove_clear: 0, - grove_delete: 0, - grove_get_raw: 0, - grove_get_raw_optional: 0, - grove_get_raw_value_u64_from_encoded_var_vec: 0, - grove_get: 0, - grove_get_path_query_serialized_results: 0, - grove_get_path_query_serialized_or_sum_results: 0, - grove_get_path_query: 0, - grove_get_path_query_with_optional: 0, - grove_get_raw_path_query_with_optional: 0, - grove_get_raw_path_query: 0, - grove_get_proved_path_query: 0, - grove_get_proved_path_query_with_conditional: 0, - grove_get_sum_tree_total_value: 0, - grove_has_raw: 0, - }, - batch: DriveGroveBatchMethodVersions { - batch_insert_empty_tree: 0, - batch_insert_empty_tree_if_not_exists: 0, - batch_insert_empty_tree_if_not_exists_check_existing_operations: 0, - batch_insert_sum_item_or_add_to_if_already_exists: 0, - batch_insert: 0, - batch_insert_if_not_exists: 0, - batch_insert_if_changed_value: 0, - batch_replace: 0, - batch_delete: 0, - batch_delete_items_in_path_query: 0, - batch_move_items_in_path_query: 0, - batch_remove_raw: 0, - batch_delete_up_tree_while_empty: 0, - batch_refresh_reference: 0, - }, - apply: DriveGroveApplyMethodVersions { - grove_apply_operation: 0, - grove_apply_batch: 0, - grove_apply_partial_batch: 0, - }, - costs: DriveGroveCostMethodVersions { - grove_batch_operations_costs: 0, - }, - }, - grove_version: GROVE_V1, - }, - platform_architecture: PlatformArchitectureVersion { - data_contract_factory_structure_version: 0, - document_factory_structure_version: 0, - }, + drive: DRIVE_VERSION_V2, drive_abci: DriveAbciVersion { - structs: DriveAbciStructureVersions { - platform_state_structure: 0, - platform_state_for_saving_structure_default: 0, - state_transition_execution_context: 0, - commit: 0, - masternode: 0, - signature_verification_quorum_set: 0, - }, - methods: DriveAbciMethodVersions { - engine: DriveAbciEngineMethodVersions { - init_chain: 0, - check_tx: 0, - run_block_proposal: 0, - finalize_block_proposal: 0, - consensus_params_update: 0, - }, - initialization: DriveAbciInitializationMethodVersions { - initial_core_height_and_time: 0, - create_genesis_state: 0, - }, - core_based_updates: DriveAbciCoreBasedUpdatesMethodVersions { - update_core_info: 0, - update_masternode_list: 0, - update_quorum_info: 0, - masternode_updates: DriveAbciMasternodeIdentitiesUpdatesMethodVersions { - get_voter_identity_key: 0, - get_operator_identity_keys: 0, - get_owner_identity_withdrawal_key: 0, - get_owner_identity_owner_key: 0, - get_voter_identifier_from_masternode_list_item: 0, - get_operator_identifier_from_masternode_list_item: 0, - create_operator_identity: 0, - create_owner_identity: 0, - create_voter_identity: 0, - disable_identity_keys: 0, - update_masternode_identities: 0, - update_operator_identity: 0, - update_owner_withdrawal_address: 0, - update_voter_identity: 0, - }, - }, - protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { - check_for_desired_protocol_upgrade: 0, - upgrade_protocol_version_on_epoch_change: 0, - perform_events_on_first_block_of_protocol_change: None, - protocol_version_upgrade_percentage_needed: 75, - }, - block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { - add_process_epoch_change_operations: 0, - process_block_fees: 0, - }, - core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants { - choose_quorum: 0, - verify_chain_lock: 0, - verify_chain_lock_locally: 0, - verify_chain_lock_through_core: 0, - make_sure_core_is_synced_to_chain_lock: 0, - recent_block_count_amount: 2, - }, - core_instant_send_lock: DriveAbciCoreInstantSendLockMethodVersions { - verify_recent_signature_locally: 0, - }, - fee_pool_inwards_distribution: DriveAbciFeePoolInwardsDistributionMethodVersions { - add_distribute_block_fees_into_pools_operations: 0, - add_distribute_storage_fee_to_epochs_operations: 0, - }, - fee_pool_outwards_distribution: DriveAbciFeePoolOutwardsDistributionMethodVersions { - add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations: 0, - add_epoch_pool_to_proposers_payout_operations: 0, - find_oldest_epoch_needing_payment: 0, - fetch_reward_shares_list_for_masternode: 0, - }, - withdrawals: DriveAbciIdentityCreditWithdrawalMethodVersions { - build_untied_withdrawal_transactions_from_documents: 0, - dequeue_and_build_unsigned_withdrawal_transactions: 0, - fetch_transactions_block_inclusion_status: 0, - pool_withdrawals_into_transactions_queue: 0, - update_broadcasted_withdrawal_statuses: 0, - rebroadcast_expired_withdrawal_documents: 0, - append_signatures_and_broadcast_withdrawal_transactions: 0, - cleanup_expired_locks_of_withdrawal_amounts: 0, - }, - voting: DriveAbciVotingMethodVersions { - keep_record_of_finished_contested_resource_vote_poll: 0, - clean_up_after_vote_poll_end: 0, - clean_up_after_contested_resources_vote_poll_end: 0, - check_for_ended_vote_polls: 0, - tally_votes_for_contested_document_resource_vote_poll: 0, - award_document_to_winner: 0, - delay_vote_poll: 0, - run_dao_platform_events: 0, - remove_votes_for_removed_masternodes: 0, - }, - state_transition_processing: DriveAbciStateTransitionProcessingMethodVersions { - execute_event: 0, - process_raw_state_transitions: 0, - decode_raw_state_transitions: 0, - validate_fees_of_event: 0, - }, - epoch: DriveAbciEpochMethodVersions { - gather_epoch_info: 0, - get_genesis_time: 0, - }, - block_start: DriveAbciBlockStartMethodVersions { - clear_drive_block_cache: 0, - }, - block_end: DriveAbciBlockEndMethodVersions { - update_state_cache: 0, - update_drive_cache: 0, - validator_set_update: 0, - }, - platform_state_storage: DriveAbciPlatformStateStorageMethodVersions { - fetch_platform_state: 0, - store_platform_state: 0, - }, - }, - validation_and_processing: DriveAbciValidationVersions { - state_transitions: DriveAbciStateTransitionValidationVersions { - common_validation_methods: DriveAbciStateTransitionCommonValidationVersions { - asset_locks: DriveAbciAssetLockValidationVersions { - fetch_asset_lock_transaction_output_sync: 0, - verify_asset_lock_is_not_spent_and_has_enough_balance: 0, - }, - validate_identity_public_key_contract_bounds: 0, - validate_identity_public_key_ids_dont_exist_in_state: 0, - validate_identity_public_key_ids_exist_in_state: 0, - validate_state_transition_identity_signed: 0, - validate_unique_identity_public_key_hashes_in_state: 0, - validate_master_key_uniqueness: 0, - validate_simple_pre_check_balance: 0, - }, - max_asset_lock_usage_attempts: 16, - identity_create_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: Some(0), - identity_signatures: Some(0), - advanced_minimum_balance_pre_check: None, - nonce: None, - state: 0, - transform_into_action: 0, - }, - identity_update_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: Some(0), - identity_signatures: Some(0), - advanced_minimum_balance_pre_check: None, - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: None, - nonce: None, - state: 0, - transform_into_action: 0, - }, - identity_credit_withdrawal_state_transition: - DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: Some(0), - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - identity_credit_withdrawal_state_transition_purpose_matches_requirements: 0, - identity_credit_transfer_state_transition: - DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: Some(0), - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - masternode_vote_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: None, - advanced_structure: Some(0), - identity_signatures: None, - advanced_minimum_balance_pre_check: Some(0), - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - contract_create_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: None, - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - contract_update_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: None, - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: None, - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - documents_batch_state_transition: - DriveAbciDocumentsStateTransitionValidationVersions { - balance_pre_check: 0, - basic_structure: 0, - advanced_structure: 0, - state: 0, - revision: 0, - transform_into_action: 0, - data_triggers: DriveAbciValidationDataTriggerAndBindingVersions { - bindings: 0, - triggers: DriveAbciValidationDataTriggerVersions { - create_contact_request_data_trigger: 0, - create_domain_data_trigger: 0, - create_identity_data_trigger: 0, - create_feature_flag_data_trigger: 0, - create_masternode_reward_shares_data_trigger: 0, - delete_withdrawal_data_trigger: 0, - reject_data_trigger: 0, - }, - }, - is_allowed: 0, - document_create_transition_structure_validation: 0, - document_delete_transition_structure_validation: 0, - document_replace_transition_structure_validation: 0, - document_transfer_transition_structure_validation: 0, - document_purchase_transition_structure_validation: 0, - document_update_price_transition_structure_validation: 0, - document_create_transition_state_validation: 1, - document_delete_transition_state_validation: 0, - document_replace_transition_state_validation: 0, - document_transfer_transition_state_validation: 0, - document_purchase_transition_state_validation: 0, - document_update_price_transition_state_validation: 0, - }, - }, - process_state_transition: 0, - state_transition_to_execution_event_for_check_tx: 0, - penalties: PenaltyAmounts { - identity_id_not_correct: 50000000, - unique_key_already_present: 10000000, - validation_of_added_keys_structure_failure: 10000000, - validation_of_added_keys_proof_of_possession_failure: 50000000, - }, - event_constants: DriveAbciValidationConstants { - maximum_vote_polls_to_process: 2, - maximum_contenders_to_consider: 100, - }, - }, - withdrawal_constants: DriveAbciWithdrawalConstants { - core_expiration_blocks: 48, - cleanup_expired_locks_of_withdrawal_amounts_limit: 0, - }, - query: DriveAbciQueryVersions { - max_returned_elements: 100, - response_metadata: 0, - proofs_query: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_query: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - prefunded_specialized_balances: DriveAbciQueryPrefundedSpecializedBalancesVersions { - balance: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - identity_based_queries: DriveAbciQueryIdentityVersions { - identity: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - keys: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identities_contract_keys: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_nonce: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_contract_nonce: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - balance: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identities_balances: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - balance_and_revision: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_by_public_key_hash: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - validator_queries: DriveAbciQueryValidatorVersions { - proposed_block_counts_by_evonode_ids: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - proposed_block_counts_by_range: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - data_contract_based_queries: DriveAbciQueryDataContractVersions { - data_contract: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - data_contract_history: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - data_contracts: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - voting_based_queries: DriveAbciQueryVotingVersions { - vote_polls_by_end_date_query: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contested_resource_vote_state: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contested_resource_voters_for_identity: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contested_resource_identity_vote_status: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contested_resources: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - system: DriveAbciQuerySystemVersions { - version_upgrade_state: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - version_upgrade_vote_status: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - epoch_infos: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - current_quorums_info: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - partial_status: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - path_elements: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - total_credits_in_platform: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - }, + structs: DRIVE_ABCI_STRUCTURE_VERSIONS_V1, + methods: DRIVE_ABCI_METHOD_VERSIONS_V1, + validation_and_processing: DRIVE_ABCI_VALIDATION_VERSIONS_V2, + withdrawal_constants: DRIVE_ABCI_WITHDRAWAL_CONSTANTS_V1, + query: DRIVE_ABCI_QUERY_VERSIONS_V1, }, dpp: DPPVersion { - costs: CostVersions { - signature_verify: 0, - }, - validation: DPPValidationVersions { - json_schema_validator: JsonSchemaValidatorVersions { - new: 0, - validate: 0, - compile: 0, - compile_and_validate: 0, - }, - data_contract: DataContractValidationVersions { - validate: 0, - validate_config_update: 0, - validate_index_definitions: 0, - validate_index_naming_duplicates: 0, - validate_not_defined_properties: 0, - validate_property_definition: 0, - }, - document_type: DocumentTypeValidationVersions { - validate_update: 0, - contested_index_limit: 1, - unique_index_limit: 10, - }, - voting: VotingValidationVersions { - allow_other_contenders_time_mainnet_ms: 604_800_000, // 1 week in ms - allow_other_contenders_time_testing_ms: 2_700_000, //45 minutes - votes_allowed_per_masternode: 5, - }, - }, - state_transition_serialization_versions: StateTransitionSerializationVersions { - identity_public_key_in_creation: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_create_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_update_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_top_up_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_credit_withdrawal_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_credit_transfer_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - masternode_vote_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contract_create_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contract_update_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - documents_batch_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_base_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_create_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_replace_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_delete_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_transfer_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_update_price_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_purchase_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - }, - state_transition_conversion_versions: StateTransitionConversionVersions { - identity_to_identity_create_transition: 0, - identity_to_identity_top_up_transition: 0, - identity_to_identity_withdrawal_transition: 0, - identity_to_identity_create_transition_with_signer: 0, - }, - state_transition_method_versions: StateTransitionMethodVersions { - public_key_in_creation_methods: PublicKeyInCreationMethodVersions { - from_public_key_signed_with_private_key: 0, - from_public_key_signed_external: 0, - hash: 0, - duplicated_key_ids_witness: 0, - duplicated_keys_witness: 0, - validate_identity_public_keys_structure: 0, - }, - }, - state_transitions: StateTransitionVersions { - documents: DocumentTransitionVersions { - documents_batch_transition: DocumentsBatchTransitionVersions { - validation: DocumentsBatchTransitionValidationVersions { - find_duplicates_by_id: 0, - validate_base_structure: 0, - }, - }, - }, - identities: IdentityTransitionVersions { - max_public_keys_in_creation: 6, - asset_locks: IdentityTransitionAssetLockVersions { - required_asset_lock_duff_balance_for_processing_start_for_identity_create: - 200000, - required_asset_lock_duff_balance_for_processing_start_for_identity_top_up: - 50000, - validate_asset_lock_transaction_structure: 0, - validate_instant_asset_lock_proof_structure: 0, - }, - credit_withdrawal: IdentityCreditWithdrawalTransitionVersions { - default_constructor: 0, - }, - }, - }, - contract_versions: ContractVersions { - max_serialized_size: 65000, - contract_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contract_structure_version: 0, - created_data_contract_structure: 0, - config: 0, - methods: DataContractMethodVersions { - validate_document: 0, - validate_update: 0, - schema: 0, - }, - document_type_versions: DocumentTypeVersions { - index_versions: DocumentTypeIndexVersions { - index_levels_from_indices: 0, - }, - class_method_versions: DocumentTypeClassMethodVersions { - try_from_schema: 0, - create_document_types_from_document_schemas: 0, - }, - structure_version: 0, - schema: DocumentTypeSchemaVersions { - enrich_with_base_schema: 0, - find_identifier_and_binary_paths: 0, - validate_max_depth: 0, - max_depth: 256, - recursive_schema_validator_versions: RecursiveSchemaValidatorVersions { - traversal_validator: 0, - }, - validate_schema_compatibility: 0, - }, - methods: DocumentTypeMethodVersions { - create_document_from_data: 0, - create_document_with_prevalidated_properties: 0, - prefunded_voting_balance_for_document: 0, - contested_vote_poll_for_document: 0, - estimated_size: 0, - index_for_types: 0, - max_size: 0, - serialize_value_for_key: 0, - deserialize_value_for_key: 0, - }, - }, - }, - document_versions: DocumentVersions { - document_structure_version: 0, - document_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_cbor_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - extended_document_structure_version: 0, - extended_document_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_method_versions: DocumentMethodVersions { - is_equal_ignoring_timestamps: 0, - hash: 0, - get_raw_for_contract: 0, - get_raw_for_document_type: 0, - try_into_asset_unlock_base_transaction_info: 0, - }, - }, - identity_versions: IdentityVersions { - identity_structure_version: 0, - identity_key_structure_version: 0, - identity_key_type_method_versions: IdentityKeyTypeMethodVersions { - random_public_key_data: 0, - random_public_and_private_key_data: 0, - }, - }, - voting_versions: VotingVersions { - default_vote_poll_time_duration_mainnet_ms: 1_209_600_000, //2 weeks - default_vote_poll_time_duration_test_network_ms: 1_209_600_000, //2 weeks - contested_document_vote_poll_stored_info_version: 0, - }, - asset_lock_versions: AssetLockVersions { - reduced_asset_lock_value: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - methods: DPPMethodVersions { - epoch_core_reward_credits_for_distribution: 0, - daily_withdrawal_limit: 0, - }, - }, - system_data_contracts: SystemDataContractVersions { - withdrawals: 1, - dpns: 1, - dashpay: 1, - masternode_reward_shares: 1, - feature_flags: 1, - }, + costs: DPP_COSTS_VERSIONS_V1, + validation: DPP_VALIDATION_VERSIONS_V2, + state_transition_serialization_versions: STATE_TRANSITION_SERIALIZATION_VERSIONS_V1, + state_transition_conversion_versions: STATE_TRANSITION_CONVERSION_VERSIONS_V1, + state_transition_method_versions: STATE_TRANSITION_METHOD_VERSIONS_V1, + state_transitions: STATE_TRANSITION_VERSIONS_V1, + contract_versions: CONTRACT_VERSIONS_V1, + document_versions: DOCUMENT_VERSIONS_V1, + identity_versions: IDENTITY_VERSIONS_V1, + voting_versions: VOTING_VERSION_V1, + asset_lock_versions: DPP_ASSET_LOCK_VERSIONS_V1, + methods: DPP_METHOD_VERSIONS_V1, + factory_versions: DPP_FACTORY_VERSIONS_V1, + }, + system_data_contracts: SYSTEM_DATA_CONTRACT_VERSIONS_V1, fee_version: FEE_VERSION1, - system_limits: SystemLimits { - estimated_contract_max_serialized_size: 16384, - max_field_value_size: 5120, //5 KiB - max_state_transition_size: 20480, //20 KiB - max_transitions_in_documents_batch: 1, - withdrawal_transactions_per_block_limit: 4, - retry_signing_expired_withdrawal_documents_per_block_limit: 1, - max_withdrawal_amount: 50_000_000_000_000, - }, + system_limits: SYSTEM_LIMITS_V1, consensus: ConsensusVersions { tenderdash_consensus_version: 0, }, diff --git a/packages/rs-platform-version/src/version/v3.rs b/packages/rs-platform-version/src/version/v3.rs index 2c0660be1a..f3856bc1e6 100644 --- a/packages/rs-platform-version/src/version/v3.rs +++ b/packages/rs-platform-version/src/version/v3.rs @@ -1,87 +1,30 @@ use crate::version::consensus_versions::ConsensusVersions; -use crate::version::contracts::SystemDataContractVersions; -use crate::version::dpp_versions::{ - AssetLockVersions, ContractVersions, CostVersions, DPPMethodVersions, DPPValidationVersions, - DPPVersion, DataContractMethodVersions, DataContractValidationVersions, - DocumentFeatureVersionBounds, DocumentMethodVersions, DocumentTransitionVersions, - DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, DocumentTypeMethodVersions, - DocumentTypeSchemaVersions, DocumentTypeValidationVersions, DocumentTypeVersions, - DocumentVersions, DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions, - IdentityCreditWithdrawalTransitionVersions, IdentityKeyTypeMethodVersions, - IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions, - JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, - RecursiveSchemaValidatorVersions, StateTransitionConversionVersions, - StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions, - VotingValidationVersions, VotingVersions, -}; -use crate::version::drive_abci_versions::{ - DriveAbciAssetLockValidationVersions, DriveAbciBlockEndMethodVersions, - DriveAbciBlockFeeProcessingMethodVersions, DriveAbciBlockStartMethodVersions, - DriveAbciCoreBasedUpdatesMethodVersions, DriveAbciCoreChainLockMethodVersionsAndConstants, - DriveAbciCoreInstantSendLockMethodVersions, - DriveAbciDocumentsStateTransitionValidationVersions, DriveAbciEngineMethodVersions, - DriveAbciEpochMethodVersions, DriveAbciFeePoolInwardsDistributionMethodVersions, - DriveAbciFeePoolOutwardsDistributionMethodVersions, - DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, - DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, - DriveAbciPlatformStateStorageMethodVersions, DriveAbciProtocolUpgradeMethodVersions, - DriveAbciQueryDataContractVersions, DriveAbciQueryIdentityVersions, - DriveAbciQueryPrefundedSpecializedBalancesVersions, DriveAbciQuerySystemVersions, - DriveAbciQueryValidatorVersions, DriveAbciQueryVersions, DriveAbciQueryVotingVersions, - DriveAbciStateTransitionCommonValidationVersions, - DriveAbciStateTransitionProcessingMethodVersions, DriveAbciStateTransitionValidationVersion, - DriveAbciStateTransitionValidationVersions, DriveAbciStructureVersions, - DriveAbciValidationConstants, DriveAbciValidationDataTriggerAndBindingVersions, - DriveAbciValidationDataTriggerVersions, DriveAbciValidationVersions, DriveAbciVersion, - DriveAbciVotingMethodVersions, DriveAbciWithdrawalConstants, PenaltyAmounts, -}; -use crate::version::drive_versions::{ - DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, - DriveContractApplyMethodVersions, DriveContractCostsMethodVersions, - DriveContractGetMethodVersions, DriveContractInsertMethodVersions, DriveContractMethodVersions, - DriveContractProveMethodVersions, DriveContractUpdateMethodVersions, - DriveCreditPoolEpochsMethodVersions, DriveCreditPoolMethodVersions, - DriveCreditPoolPendingEpochRefundsMethodVersions, - DriveCreditPoolStorageFeeDistributionPoolMethodVersions, - DriveCreditPoolUnpaidEpochMethodVersions, DriveDataContractOperationMethodVersions, - DriveDocumentDeleteMethodVersions, DriveDocumentEstimationCostsMethodVersions, - DriveDocumentIndexUniquenessMethodVersions, DriveDocumentInsertContestedMethodVersions, - DriveDocumentInsertMethodVersions, DriveDocumentMethodVersions, - DriveDocumentQueryMethodVersions, DriveDocumentUpdateMethodVersions, - DriveEstimatedCostsMethodVersions, DriveFeesMethodVersions, DriveFetchMethodVersions, - DriveGroveApplyMethodVersions, DriveGroveBasicMethodVersions, DriveGroveBatchMethodVersions, - DriveGroveCostMethodVersions, DriveGroveMethodVersions, - DriveIdentityContractInfoMethodVersions, DriveIdentityCostEstimationMethodVersions, - DriveIdentityFetchAttributesMethodVersions, DriveIdentityFetchFullIdentityMethodVersions, - DriveIdentityFetchMethodVersions, DriveIdentityFetchPartialIdentityMethodVersions, - DriveIdentityFetchPublicKeyHashesMethodVersions, DriveIdentityInsertMethodVersions, - DriveIdentityKeyHashesToIdentityInsertMethodVersions, DriveIdentityKeysFetchMethodVersions, - DriveIdentityKeysInsertMethodVersions, DriveIdentityKeysMethodVersions, - DriveIdentityKeysProveMethodVersions, DriveIdentityMethodVersions, - DriveIdentityProveMethodVersions, DriveIdentityUpdateMethodVersions, - DriveIdentityWithdrawalDocumentMethodVersions, DriveIdentityWithdrawalMethodVersions, - DriveIdentityWithdrawalTransactionIndexMethodVersions, - DriveIdentityWithdrawalTransactionMethodVersions, - DriveIdentityWithdrawalTransactionQueueMethodVersions, DriveInitializationMethodVersions, - DriveMethodVersions, DriveOperationsMethodVersion, DrivePlatformStateMethodVersions, - DrivePlatformSystemMethodVersions, DrivePrefundedSpecializedMethodVersions, - DriveProtocolUpgradeVersions, DriveProveMethodVersions, - DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions, - DriveStateTransitionMethodVersions, DriveStateTransitionOperationMethodVersions, - DriveStructureVersion, DriveSystemEstimationCostsMethodVersions, - DriveVerifyContractMethodVersions, DriveVerifyDocumentMethodVersions, - DriveVerifyIdentityMethodVersions, DriveVerifyMethodVersions, - DriveVerifySingleDocumentMethodVersions, DriveVerifyStateTransitionMethodVersions, - DriveVerifySystemMethodVersions, DriveVerifyVoteMethodVersions, DriveVersion, - DriveVoteCleanupMethodVersions, DriveVoteContestedResourceInsertMethodVersions, - DriveVoteFetchMethodVersions, DriveVoteInsertMethodVersions, DriveVoteMethodVersions, - DriveVoteSetupMethodVersions, DriveVoteStorageFormMethodVersions, -}; +use crate::version::dpp_versions::dpp_asset_lock_versions::v1::DPP_ASSET_LOCK_VERSIONS_V1; +use crate::version::dpp_versions::dpp_contract_versions::v1::CONTRACT_VERSIONS_V1; +use crate::version::dpp_versions::dpp_costs_versions::v1::DPP_COSTS_VERSIONS_V1; +use crate::version::dpp_versions::dpp_document_versions::v1::DOCUMENT_VERSIONS_V1; +use crate::version::dpp_versions::dpp_factory_versions::v1::DPP_FACTORY_VERSIONS_V1; +use crate::version::dpp_versions::dpp_identity_versions::v1::IDENTITY_VERSIONS_V1; +use crate::version::dpp_versions::dpp_method_versions::v1::DPP_METHOD_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_conversion_versions::v2::STATE_TRANSITION_CONVERSION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_state_transition_method_versions::v1::STATE_TRANSITION_METHOD_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_serialization_versions::v1::STATE_TRANSITION_SERIALIZATION_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_versions::v2::STATE_TRANSITION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_validation_versions::v2::DPP_VALIDATION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_voting_versions::v2::VOTING_VERSION_V2; +use crate::version::dpp_versions::DPPVersion; +use crate::version::drive_abci_versions::drive_abci_method_versions::v2::DRIVE_ABCI_METHOD_VERSIONS_V2; +use crate::version::drive_abci_versions::drive_abci_query_versions::v1::DRIVE_ABCI_QUERY_VERSIONS_V1; +use crate::version::drive_abci_versions::drive_abci_structure_versions::v1::DRIVE_ABCI_STRUCTURE_VERSIONS_V1; +use crate::version::drive_abci_versions::drive_abci_validation_versions::v2::DRIVE_ABCI_VALIDATION_VERSIONS_V2; +use crate::version::drive_abci_versions::drive_abci_withdrawal_constants::v1::DRIVE_ABCI_WITHDRAWAL_CONSTANTS_V1; +use crate::version::drive_abci_versions::DriveAbciVersion; +use crate::version::drive_versions::v2::DRIVE_VERSION_V2; use crate::version::fee::v1::FEE_VERSION1; -use crate::version::limits::SystemLimits; -use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; -use crate::version::{PlatformArchitectureVersion, ProtocolVersion}; -use grovedb_version::version::v1::GROVE_V1; +use crate::version::protocol_version::PlatformVersion; +use crate::version::system_data_contract_versions::v1::SYSTEM_DATA_CONTRACT_VERSIONS_V1; +use crate::version::system_limits::v1::SYSTEM_LIMITS_V1; +use crate::version::ProtocolVersion; pub const PROTOCOL_VERSION_3: ProtocolVersion = 3; @@ -94,1225 +37,32 @@ pub const PROTOCOL_VERSION_3: ProtocolVersion = 3; pub const PLATFORM_V3: PlatformVersion = PlatformVersion { protocol_version: 3, - proofs: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - drive: DriveVersion { - structure: DriveStructureVersion { - document_indexes: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_indexes: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - pools: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - methods: DriveMethodVersions { - initialization: DriveInitializationMethodVersions { - create_initial_state_structure: 0, - }, - credit_pools: DriveCreditPoolMethodVersions { - epochs: DriveCreditPoolEpochsMethodVersions { - get_epochs_infos: 0, - get_epochs_protocol_versions: 0, - prove_epochs_infos: 0, - get_epoch_fee_multiplier: 0, - get_epoch_processing_credits_for_distribution: 0, - get_epoch_storage_credits_for_distribution: 0, - get_epoch_total_credits_for_distribution: 0, - get_storage_credits_for_distribution_for_epochs_in_range: 0, - get_epoch_start_time: 0, - get_epoch_start_block_core_height: 0, - get_epoch_start_block_height: 0, - get_first_epoch_start_block_info_between_epochs: 0, - fetch_epoch_proposers: 0, - prove_epoch_proposers: 0, - get_epochs_proposer_block_count: 0, - add_update_pending_epoch_refunds_operations: 0, - is_epochs_proposers_tree_empty: 0, - }, - pending_epoch_refunds: DriveCreditPoolPendingEpochRefundsMethodVersions { - add_delete_pending_epoch_refunds_except_specified: 0, - fetch_and_add_pending_epoch_refunds_to_collection: 0, - fetch_pending_epoch_refunds: 0, - add_update_pending_epoch_refunds_operations: 0, - }, - storage_fee_distribution_pool: - DriveCreditPoolStorageFeeDistributionPoolMethodVersions { - get_storage_fees_from_distribution_pool: 0, - }, - unpaid_epoch: DriveCreditPoolUnpaidEpochMethodVersions { - get_unpaid_epoch_index: 0, - }, - }, - protocol_upgrade: DriveProtocolUpgradeVersions { - clear_version_information: 0, - fetch_versions_with_counter: 0, - fetch_proved_versions_with_counter: 0, - fetch_validator_version_votes: 0, - fetch_proved_validator_version_votes: 0, - remove_validators_proposed_app_versions: 0, - update_validator_proposed_app_version: 0, - }, - prove: DriveProveMethodVersions { - prove_elements: 0, - prove_multiple_state_transition_results: 0, - }, - balances: DriveBalancesMethodVersions { - add_to_system_credits: 0, - add_to_system_credits_operations: 0, - remove_from_system_credits: 0, - remove_from_system_credits_operations: 0, - calculate_total_credits_balance: 0, - }, - document: DriveDocumentMethodVersions { - query: DriveDocumentQueryMethodVersions { query_documents: 0, query_contested_documents: 0, query_contested_documents_vote_state: 0, query_documents_with_flags: 0 }, - delete: DriveDocumentDeleteMethodVersions { - add_estimation_costs_for_remove_document_to_primary_storage: 0, - delete_document_for_contract: 0, - delete_document_for_contract_id: 0, - delete_document_for_contract_apply_and_add_to_operations: 0, - remove_document_from_primary_storage: 0, - remove_reference_for_index_level_for_contract_operations: 0, - remove_indices_for_index_level_for_contract_operations: 0, - remove_indices_for_top_index_level_for_contract_operations: 0, - delete_document_for_contract_id_with_named_type_operations: 0, - delete_document_for_contract_with_named_type_operations: 0, - delete_document_for_contract_operations: 0, - }, - insert: DriveDocumentInsertMethodVersions { - add_document: 0, - add_document_for_contract: 0, - add_document_for_contract_apply_and_add_to_operations: 0, - add_document_for_contract_operations: 0, - add_document_to_primary_storage: 0, - add_indices_for_index_level_for_contract_operations: 0, - add_indices_for_top_index_level_for_contract_operations: 0, - add_reference_for_index_level_for_contract_operations: 0, - }, - insert_contested: DriveDocumentInsertContestedMethodVersions { - add_contested_document: 0, - add_contested_document_for_contract: 0, - add_contested_document_for_contract_apply_and_add_to_operations: 0, - add_contested_document_for_contract_operations: 0, - add_contested_document_to_primary_storage: 0, - add_contested_indices_for_contract_operations: 0, - add_contested_reference_and_vote_subtree_to_document_operations: 0, - add_contested_vote_subtree_for_non_identities_operations: 0, - }, - update: DriveDocumentUpdateMethodVersions { - add_update_multiple_documents_operations: 0, - update_document_for_contract: 0, - update_document_for_contract_apply_and_add_to_operations: 0, - update_document_for_contract_id: 0, - update_document_for_contract_operations: 0, - update_document_with_serialization_for_contract: 0, - update_serialized_document_for_contract: 0, - }, - estimation_costs: DriveDocumentEstimationCostsMethodVersions { - add_estimation_costs_for_add_document_to_primary_storage: 0, - add_estimation_costs_for_add_contested_document_to_primary_storage: 0, - stateless_delete_of_non_tree_for_costs: 0, - }, - index_uniqueness: DriveDocumentIndexUniquenessMethodVersions { - validate_document_uniqueness: 0, - validate_document_create_transition_action_uniqueness: 0, - validate_document_replace_transition_action_uniqueness: 0, - validate_document_transfer_transition_action_uniqueness: 0, - validate_document_purchase_transition_action_uniqueness: 0, - validate_document_update_price_transition_action_uniqueness: 0, - validate_uniqueness_of_data: 0, - }, - }, - vote: DriveVoteMethodVersions { - insert: DriveVoteInsertMethodVersions { - register_identity_vote: 0, - }, - contested_resource_insert: DriveVoteContestedResourceInsertMethodVersions { - register_contested_resource_identity_vote: 0, - insert_stored_info_for_contested_resource_vote_poll: 0, - register_identity_vote: 0, - add_vote_poll_end_date_query_operations: 0, - }, - cleanup: DriveVoteCleanupMethodVersions { - remove_specific_vote_references_given_by_identity: 0, - remove_specific_votes_given_by_identity: 0, - remove_contested_resource_vote_poll_end_date_query_operations: 1, - remove_contested_resource_vote_poll_votes_operations: 0, - remove_contested_resource_vote_poll_documents_operations: 1, - remove_contested_resource_vote_poll_contenders_operations: 1, - remove_contested_resource_top_level_index_operations: 0, - remove_contested_resource_info_operations: 0, - }, - setup: DriveVoteSetupMethodVersions { - add_initial_vote_tree_main_structure_operations: 0, - }, - storage_form: DriveVoteStorageFormMethodVersions { - resolve_with_contract: 0, - }, - fetch: DriveVoteFetchMethodVersions { - fetch_identities_voting_for_contenders: 0, - fetch_contested_document_vote_poll_stored_info: 0, - fetch_identity_contested_resource_vote: 0, - }, - }, - contract: DriveContractMethodVersions { - prove: DriveContractProveMethodVersions { - prove_contract: 0, - prove_contract_history: 0, - prove_contracts: 0, - }, - apply: DriveContractApplyMethodVersions { - apply_contract: 0, - apply_contract_with_serialization: 0, - }, - insert: DriveContractInsertMethodVersions { - add_contract_to_storage: 0, - insert_contract: 0, - }, - update: DriveContractUpdateMethodVersions { update_contract: 0 }, - costs: DriveContractCostsMethodVersions { - add_estimation_costs_for_contract_insertion: 0, - }, - get: DriveContractGetMethodVersions { - fetch_contract: 0, - fetch_contract_with_history: 0, - get_cached_contract_with_fetch_info: 0, - get_contract_with_fetch_info: 0, - get_contracts_with_fetch_info: 0, - }, - }, - fees: DriveFeesMethodVersions { calculate_fee: 0 }, - estimated_costs: DriveEstimatedCostsMethodVersions { - add_estimation_costs_for_levels_up_to_contract: 0, - add_estimation_costs_for_levels_up_to_contract_document_type_excluded: 0, - add_estimation_costs_for_contested_document_tree_levels_up_to_contract: 0, - add_estimation_costs_for_contested_document_tree_levels_up_to_contract_document_type_excluded: 0, - }, - asset_lock: DriveAssetLockMethodVersions { - add_asset_lock_outpoint: 0, - add_estimation_costs_for_adding_asset_lock: 0, - fetch_asset_lock_outpoint_info: 0, - }, - verify: DriveVerifyMethodVersions { - contract: DriveVerifyContractMethodVersions { - verify_contract: 0, - verify_contract_history: 0, - }, - document: DriveVerifyDocumentMethodVersions { - verify_proof: 0, - verify_proof_keep_serialized: 0, - verify_start_at_document_in_proof: 0, - }, - identity: DriveVerifyIdentityMethodVersions { - verify_full_identities_by_public_key_hashes: 0, - verify_full_identity_by_identity_id: 0, - verify_full_identity_by_public_key_hash: 0, - verify_identity_balance_for_identity_id: 0, - verify_identity_balances_for_identity_ids: 0, - verify_identity_id_by_public_key_hash: 0, - verify_identity_ids_by_public_key_hashes: 0, - verify_identity_keys_by_identity_id: 0, - verify_identity_nonce: 0, - verify_identity_contract_nonce: 0, - verify_identities_contract_keys: 0, - verify_identity_revision_for_identity_id: 0, - }, - single_document: DriveVerifySingleDocumentMethodVersions { - verify_proof: 0, - verify_proof_keep_serialized: 0, - }, - system: DriveVerifySystemMethodVersions { - verify_epoch_infos: 0, - verify_epoch_proposers: 0, - verify_elements: 0, - verify_total_credits_in_system: 0, - verify_upgrade_state: 0, - verify_upgrade_vote_status: 0, - }, - voting: DriveVerifyVoteMethodVersions { - verify_masternode_vote: 0, - verify_start_at_contender_in_proof: 0, - verify_vote_poll_votes_proof: 0, - verify_identity_votes_given_proof: 0, - verify_vote_poll_vote_state_proof: 0, - verify_contests_proof: 0, - verify_vote_polls_by_end_date_proof: 0, - verify_specialized_balance: 0, - }, - state_transition: DriveVerifyStateTransitionMethodVersions { - verify_state_transition_was_executed_with_proof: 0, - }, - }, - identity: DriveIdentityMethodVersions { - fetch: DriveIdentityFetchMethodVersions { - public_key_hashes: DriveIdentityFetchPublicKeyHashesMethodVersions { - fetch_full_identities_by_unique_public_key_hashes: 0, - fetch_full_identity_by_unique_public_key_hash: 0, - fetch_identity_id_by_unique_public_key_hash: 0, - fetch_identity_ids_by_non_unique_public_key_hash: 0, - fetch_identity_ids_by_unique_public_key_hashes: 0, - fetch_serialized_full_identity_by_unique_public_key_hash: 0, - has_any_of_unique_public_key_hashes: 0, - has_non_unique_public_key_hash: 0, - has_non_unique_public_key_hash_already_for_identity: 0, - has_unique_public_key_hash: 0, - }, - attributes: DriveIdentityFetchAttributesMethodVersions { - revision: 0, - nonce: 0, - identity_contract_nonce: 0, - balance: 0, - balance_include_debt: 0, - negative_balance: 0, - }, - partial_identity: DriveIdentityFetchPartialIdentityMethodVersions { - fetch_identity_revision_with_keys: 0, - fetch_identity_balance_with_keys: 0, - fetch_identity_balance_with_keys_and_revision: 0, - fetch_identity_with_balance: 0, - fetch_identity_keys: 0, - }, - full_identity: DriveIdentityFetchFullIdentityMethodVersions { - fetch_full_identity: Some(0), - fetch_full_identities: Some(0), - }, - }, - prove: DriveIdentityProveMethodVersions { - full_identity: 0, - full_identities: 0, - identity_nonce: 0, - identity_contract_nonce: 0, - identities_contract_keys: 0, - prove_full_identities_by_unique_public_key_hashes: 0, - prove_full_identity_by_unique_public_key_hash: 0, - prove_identity_id_by_unique_public_key_hash: 0, - prove_identity_ids_by_unique_public_key_hashes: 0, - }, - keys: DriveIdentityKeysMethodVersions { - fetch: DriveIdentityKeysFetchMethodVersions { - fetch_all_current_identity_keys: 0, - fetch_all_identity_keys: 0, - fetch_identities_all_keys: 0, - fetch_identity_keys: 0, - fetch_identities_contract_keys: 0, - }, - prove: DriveIdentityKeysProveMethodVersions { - prove_identities_all_keys: 0, - prove_identity_keys: 0, - }, - insert: DriveIdentityKeysInsertMethodVersions { - create_key_tree_with_keys: 0, - create_new_identity_key_query_trees: 0, - insert_key_searchable_references: 0, - insert_key_to_storage: 0, - insert_new_non_unique_key: 0, - insert_new_unique_key: 0, - replace_key_in_storage: 0, - }, - insert_key_hash_identity_reference: - DriveIdentityKeyHashesToIdentityInsertMethodVersions { - add_estimation_costs_for_insert_non_unique_public_key_hash_reference: 0, - add_estimation_costs_for_insert_unique_public_key_hash_reference: 0, - insert_non_unique_public_key_hash_reference_to_identity: 0, - insert_reference_to_non_unique_key: 0, - insert_reference_to_unique_key: 0, - insert_unique_public_key_hash_reference_to_identity: 0, - }, - }, - update: DriveIdentityUpdateMethodVersions { - update_identity_revision: 0, - merge_identity_nonce: 0, - update_identity_negative_credit_operation: 0, - initialize_identity_revision: 0, - disable_identity_keys: 0, - re_enable_identity_keys: 0, - add_new_non_unique_keys_to_identity: 0, - add_new_unique_keys_to_identity: 0, - add_new_keys_to_identity: 0, - insert_identity_balance: 0, - initialize_negative_identity_balance: 0, - add_to_identity_balance: 0, - add_to_previous_balance: 0, - apply_balance_change_from_fee_to_identity: 0, - remove_from_identity_balance: 0, - refresh_identity_key_reference_operations: 0, - }, - insert: DriveIdentityInsertMethodVersions { - add_new_identity: 0, - }, - contract_info: DriveIdentityContractInfoMethodVersions { - add_potential_contract_info_for_contract_bounded_key: 0, - refresh_potential_contract_info_key_references: 0, - merge_identity_contract_nonce: 0, - }, - cost_estimation: DriveIdentityCostEstimationMethodVersions { - for_authentication_keys_security_level_in_key_reference_tree: 0, - for_balances: 0, - for_contract_info: 0, - for_contract_info_group: 0, - for_contract_info_group_keys: 0, - for_contract_info_group_key_purpose: 0, - for_keys_for_identity_id: 0, - for_negative_credit: 0, - for_purpose_in_key_reference_tree: 0, - for_root_key_reference_tree: 0, - for_update_revision: 0, - }, - withdrawals: DriveIdentityWithdrawalMethodVersions { - document: DriveIdentityWithdrawalDocumentMethodVersions { - fetch_oldest_withdrawal_documents_by_status: 0, - find_withdrawal_documents_by_status_and_transaction_indices: 0, - }, - transaction: DriveIdentityWithdrawalTransactionMethodVersions { - index: DriveIdentityWithdrawalTransactionIndexMethodVersions { - fetch_next_withdrawal_transaction_index: 0, - add_update_next_withdrawal_transaction_index_operation: 0, - }, - queue: DriveIdentityWithdrawalTransactionQueueMethodVersions { - add_enqueue_untied_withdrawal_transaction_operations: 0, - dequeue_untied_withdrawal_transactions: 0, - remove_broadcasted_withdrawal_transactions_after_completion_operations: 0, - move_broadcasted_withdrawal_transactions_back_to_queue_operations: 0, - }, - }, - calculate_current_withdrawal_limit: 0, - }, - }, - platform_system: DrivePlatformSystemMethodVersions { - estimation_costs: DriveSystemEstimationCostsMethodVersions { - for_total_system_credits_update: 0, - }, - }, - operations: DriveOperationsMethodVersion { - rollback_transaction: 0, - drop_cache: 0, - commit_transaction: 0, - apply_partial_batch_low_level_drive_operations: 0, - apply_partial_batch_grovedb_operations: 0, - apply_batch_low_level_drive_operations: 0, - apply_batch_grovedb_operations: 0, - }, - state_transitions: DriveStateTransitionMethodVersions { - operations: DriveStateTransitionOperationMethodVersions { - finalization_tasks: 0, - contracts: DriveDataContractOperationMethodVersions { - finalization_tasks: 0, - }, - }, - convert_to_high_level_operations: - DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions { - data_contract_create_transition: 0, - data_contract_update_transition: 0, - document_create_transition: 0, - document_delete_transition: 0, - document_purchase_transition: 0, - document_replace_transition: 0, - document_transfer_transition: 0, - document_update_price_transition: 0, - documents_batch_transition: 0, - identity_create_transition: 0, - identity_credit_transfer_transition: 0, - identity_credit_withdrawal_transition: 0, - identity_top_up_transition: 0, - identity_update_transition: 0, - masternode_vote_transition: 0, - bump_identity_data_contract_nonce: 0, - bump_identity_nonce: 0, - partially_use_asset_lock: 0, - }, - }, - batch_operations: DriveBatchOperationsMethodVersion { - convert_drive_operations_to_grove_operations: 0, - apply_drive_operations: 0, - }, - platform_state: DrivePlatformStateMethodVersions { - fetch_platform_state_bytes: 0, - store_platform_state_bytes: 0, - }, - fetch: DriveFetchMethodVersions { fetch_elements: 0 }, - prefunded_specialized_balances: DrivePrefundedSpecializedMethodVersions { - fetch_single: 0, - prove_single: 0, - add_prefunded_specialized_balance: 0, - add_prefunded_specialized_balance_operations: 0, - deduct_from_prefunded_specialized_balance: 0, - deduct_from_prefunded_specialized_balance_operations: 0, - estimated_cost_for_prefunded_specialized_balance_update: 0, - }, - }, - grove_methods: DriveGroveMethodVersions { - basic: DriveGroveBasicMethodVersions { - grove_insert: 0, - grove_insert_empty_tree: 0, - grove_insert_empty_sum_tree: 0, - grove_insert_if_not_exists: 0, - grove_insert_if_not_exists_return_existing_element: 0, - grove_clear: 0, - grove_delete: 0, - grove_get_raw: 0, - grove_get_raw_optional: 0, - grove_get_raw_value_u64_from_encoded_var_vec: 0, - grove_get: 0, - grove_get_path_query_serialized_results: 0, - grove_get_path_query_serialized_or_sum_results: 0, - grove_get_path_query: 0, - grove_get_path_query_with_optional: 0, - grove_get_raw_path_query_with_optional: 0, - grove_get_raw_path_query: 0, - grove_get_proved_path_query: 0, - grove_get_proved_path_query_with_conditional: 0, - grove_get_sum_tree_total_value: 0, - grove_has_raw: 0, - }, - batch: DriveGroveBatchMethodVersions { - batch_insert_empty_tree: 0, - batch_insert_empty_tree_if_not_exists: 0, - batch_insert_empty_tree_if_not_exists_check_existing_operations: 0, - batch_insert_sum_item_or_add_to_if_already_exists: 0, - batch_insert: 0, - batch_insert_if_not_exists: 0, - batch_insert_if_changed_value: 0, - batch_replace: 0, - batch_delete: 0, - batch_delete_items_in_path_query: 0, - batch_move_items_in_path_query: 0, - batch_remove_raw: 0, - batch_delete_up_tree_while_empty: 0, - batch_refresh_reference: 0, - }, - apply: DriveGroveApplyMethodVersions { - grove_apply_operation: 0, - grove_apply_batch: 0, - grove_apply_partial_batch: 0, - }, - costs: DriveGroveCostMethodVersions { - grove_batch_operations_costs: 0, - }, - }, - grove_version: GROVE_V1, - }, - platform_architecture: PlatformArchitectureVersion { - data_contract_factory_structure_version: 0, - document_factory_structure_version: 0, - }, + drive: DRIVE_VERSION_V2, drive_abci: DriveAbciVersion { - structs: DriveAbciStructureVersions { - platform_state_structure: 0, - platform_state_for_saving_structure_default: 0, - state_transition_execution_context: 0, - commit: 0, - masternode: 0, - signature_verification_quorum_set: 0, - }, - methods: DriveAbciMethodVersions { - engine: DriveAbciEngineMethodVersions { - init_chain: 0, - check_tx: 0, - run_block_proposal: 0, - finalize_block_proposal: 0, - // Update app version if changed as well - consensus_params_update: 1, - }, - initialization: DriveAbciInitializationMethodVersions { - initial_core_height_and_time: 0, - create_genesis_state: 0, - }, - core_based_updates: DriveAbciCoreBasedUpdatesMethodVersions { - update_core_info: 0, - update_masternode_list: 0, - update_quorum_info: 0, - masternode_updates: DriveAbciMasternodeIdentitiesUpdatesMethodVersions { - get_voter_identity_key: 0, - get_operator_identity_keys: 0, - get_owner_identity_withdrawal_key: 0, - get_owner_identity_owner_key: 0, - get_voter_identifier_from_masternode_list_item: 0, - get_operator_identifier_from_masternode_list_item: 0, - create_operator_identity: 0, - create_owner_identity: 0, - create_voter_identity: 0, - disable_identity_keys: 0, - update_masternode_identities: 0, - update_operator_identity: 0, - update_owner_withdrawal_address: 0, - update_voter_identity: 0, - }, - }, - protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { - check_for_desired_protocol_upgrade: 1, - upgrade_protocol_version_on_epoch_change: 0, - perform_events_on_first_block_of_protocol_change: None, - protocol_version_upgrade_percentage_needed: 67, - }, - block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { - add_process_epoch_change_operations: 0, - process_block_fees: 0, - }, - core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants { - choose_quorum: 0, - verify_chain_lock: 0, - verify_chain_lock_locally: 0, - verify_chain_lock_through_core: 0, - make_sure_core_is_synced_to_chain_lock: 0, - recent_block_count_amount: 2, - }, - core_instant_send_lock: DriveAbciCoreInstantSendLockMethodVersions { - verify_recent_signature_locally: 0, - }, - fee_pool_inwards_distribution: DriveAbciFeePoolInwardsDistributionMethodVersions { - add_distribute_block_fees_into_pools_operations: 0, - add_distribute_storage_fee_to_epochs_operations: 0, - }, - fee_pool_outwards_distribution: DriveAbciFeePoolOutwardsDistributionMethodVersions { - add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations: 0, - add_epoch_pool_to_proposers_payout_operations: 0, - find_oldest_epoch_needing_payment: 0, - fetch_reward_shares_list_for_masternode: 0, - }, - withdrawals: DriveAbciIdentityCreditWithdrawalMethodVersions { - build_untied_withdrawal_transactions_from_documents: 0, - dequeue_and_build_unsigned_withdrawal_transactions: 0, - fetch_transactions_block_inclusion_status: 0, - pool_withdrawals_into_transactions_queue: 0, - update_broadcasted_withdrawal_statuses: 0, - rebroadcast_expired_withdrawal_documents: 0, - append_signatures_and_broadcast_withdrawal_transactions: 0, - cleanup_expired_locks_of_withdrawal_amounts: 0, - }, - voting: DriveAbciVotingMethodVersions { - keep_record_of_finished_contested_resource_vote_poll: 0, - clean_up_after_vote_poll_end: 0, - clean_up_after_contested_resources_vote_poll_end: 0, - check_for_ended_vote_polls: 0, - tally_votes_for_contested_document_resource_vote_poll: 0, - award_document_to_winner: 0, - delay_vote_poll: 0, - run_dao_platform_events: 0, - remove_votes_for_removed_masternodes: 0, - }, - state_transition_processing: DriveAbciStateTransitionProcessingMethodVersions { - execute_event: 0, - process_raw_state_transitions: 0, - decode_raw_state_transitions: 0, - validate_fees_of_event: 0, - }, - epoch: DriveAbciEpochMethodVersions { - gather_epoch_info: 0, - get_genesis_time: 0, - }, - block_start: DriveAbciBlockStartMethodVersions { - clear_drive_block_cache: 0, - }, - block_end: DriveAbciBlockEndMethodVersions { - update_state_cache: 0, - update_drive_cache: 0, - validator_set_update: 0, - }, - platform_state_storage: DriveAbciPlatformStateStorageMethodVersions { - fetch_platform_state: 0, - store_platform_state: 0, - }, - }, - validation_and_processing: DriveAbciValidationVersions { - state_transitions: DriveAbciStateTransitionValidationVersions { - common_validation_methods: DriveAbciStateTransitionCommonValidationVersions { - asset_locks: DriveAbciAssetLockValidationVersions { - fetch_asset_lock_transaction_output_sync: 0, - verify_asset_lock_is_not_spent_and_has_enough_balance: 0, - }, - validate_identity_public_key_contract_bounds: 0, - validate_identity_public_key_ids_dont_exist_in_state: 0, - validate_identity_public_key_ids_exist_in_state: 0, - validate_state_transition_identity_signed: 0, - validate_unique_identity_public_key_hashes_in_state: 0, - validate_master_key_uniqueness: 0, - validate_simple_pre_check_balance: 0, - }, - max_asset_lock_usage_attempts: 16, - identity_create_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: Some(0), - identity_signatures: Some(0), - advanced_minimum_balance_pre_check: None, - nonce: None, - state: 0, - transform_into_action: 0, - }, - identity_update_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: Some(0), - identity_signatures: Some(0), - advanced_minimum_balance_pre_check: None, - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: None, - nonce: None, - state: 0, - transform_into_action: 0, - }, - identity_credit_withdrawal_state_transition: - DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: Some(0), - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - identity_credit_withdrawal_state_transition_purpose_matches_requirements: 0, - identity_credit_transfer_state_transition: - DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: Some(0), - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - masternode_vote_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: None, - advanced_structure: Some(0), - identity_signatures: None, - advanced_minimum_balance_pre_check: Some(0), - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - contract_create_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: None, - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - contract_update_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: None, - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: None, - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - documents_batch_state_transition: - DriveAbciDocumentsStateTransitionValidationVersions { - balance_pre_check: 0, - basic_structure: 0, - advanced_structure: 0, - state: 0, - revision: 0, - transform_into_action: 0, - data_triggers: DriveAbciValidationDataTriggerAndBindingVersions { - bindings: 0, - triggers: DriveAbciValidationDataTriggerVersions { - create_contact_request_data_trigger: 0, - create_domain_data_trigger: 0, - create_identity_data_trigger: 0, - create_feature_flag_data_trigger: 0, - create_masternode_reward_shares_data_trigger: 0, - delete_withdrawal_data_trigger: 0, - reject_data_trigger: 0, - }, - }, - is_allowed: 0, - document_create_transition_structure_validation: 0, - document_delete_transition_structure_validation: 0, - document_replace_transition_structure_validation: 0, - document_transfer_transition_structure_validation: 0, - document_purchase_transition_structure_validation: 0, - document_update_price_transition_structure_validation: 0, - document_create_transition_state_validation: 1, - document_delete_transition_state_validation: 0, - document_replace_transition_state_validation: 0, - document_transfer_transition_state_validation: 0, - document_purchase_transition_state_validation: 0, - document_update_price_transition_state_validation: 0, - }, - }, - process_state_transition: 0, - state_transition_to_execution_event_for_check_tx: 0, - penalties: PenaltyAmounts { - identity_id_not_correct: 50000000, - unique_key_already_present: 10000000, - validation_of_added_keys_structure_failure: 10000000, - validation_of_added_keys_proof_of_possession_failure: 50000000, - }, - event_constants: DriveAbciValidationConstants { - maximum_vote_polls_to_process: 2, - maximum_contenders_to_consider: 100, - }, - }, - withdrawal_constants: DriveAbciWithdrawalConstants { - core_expiration_blocks: 48, - cleanup_expired_locks_of_withdrawal_amounts_limit: 0, - }, - query: DriveAbciQueryVersions { - max_returned_elements: 100, - response_metadata: 0, - proofs_query: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_query: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - prefunded_specialized_balances: DriveAbciQueryPrefundedSpecializedBalancesVersions { - balance: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - identity_based_queries: DriveAbciQueryIdentityVersions { - identity: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - keys: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identities_contract_keys: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_nonce: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_contract_nonce: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - balance: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identities_balances: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - balance_and_revision: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_by_public_key_hash: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - validator_queries: DriveAbciQueryValidatorVersions { - proposed_block_counts_by_evonode_ids: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - proposed_block_counts_by_range: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - data_contract_based_queries: DriveAbciQueryDataContractVersions { - data_contract: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - data_contract_history: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - data_contracts: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - voting_based_queries: DriveAbciQueryVotingVersions { - vote_polls_by_end_date_query: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contested_resource_vote_state: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contested_resource_voters_for_identity: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contested_resource_identity_vote_status: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contested_resources: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - system: DriveAbciQuerySystemVersions { - version_upgrade_state: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - version_upgrade_vote_status: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - epoch_infos: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - current_quorums_info: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - partial_status: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - path_elements: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - total_credits_in_platform: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - }, + structs: DRIVE_ABCI_STRUCTURE_VERSIONS_V1, + methods: DRIVE_ABCI_METHOD_VERSIONS_V2, + validation_and_processing: DRIVE_ABCI_VALIDATION_VERSIONS_V2, + withdrawal_constants: DRIVE_ABCI_WITHDRAWAL_CONSTANTS_V1, + query: DRIVE_ABCI_QUERY_VERSIONS_V1, }, dpp: DPPVersion { - costs: CostVersions { - signature_verify: 0, - }, - validation: DPPValidationVersions { - json_schema_validator: JsonSchemaValidatorVersions { - new: 0, - validate: 0, - compile: 0, - compile_and_validate: 0, - }, - data_contract: DataContractValidationVersions { - validate: 0, - validate_config_update: 0, - validate_index_definitions: 0, - validate_index_naming_duplicates: 0, - validate_not_defined_properties: 0, - validate_property_definition: 0, - }, - document_type: DocumentTypeValidationVersions { - validate_update: 0, - contested_index_limit: 1, - unique_index_limit: 10, - }, - voting: VotingValidationVersions { - allow_other_contenders_time_mainnet_ms: 604_800_000, // 1 week in ms - allow_other_contenders_time_testing_ms: 2_700_000, //45 minutes - votes_allowed_per_masternode: 5, - }, - }, - state_transition_serialization_versions: StateTransitionSerializationVersions { - identity_public_key_in_creation: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_create_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_update_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_top_up_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_credit_withdrawal_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_credit_transfer_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - masternode_vote_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contract_create_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contract_update_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - documents_batch_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_base_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_create_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_replace_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_delete_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_transfer_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_update_price_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_purchase_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - }, - state_transition_conversion_versions: StateTransitionConversionVersions { - identity_to_identity_create_transition: 0, - identity_to_identity_top_up_transition: 0, - identity_to_identity_withdrawal_transition: 1, - identity_to_identity_create_transition_with_signer: 0, - }, - state_transition_method_versions: StateTransitionMethodVersions { - public_key_in_creation_methods: PublicKeyInCreationMethodVersions { - from_public_key_signed_with_private_key: 0, - from_public_key_signed_external: 0, - hash: 0, - duplicated_key_ids_witness: 0, - duplicated_keys_witness: 0, - validate_identity_public_keys_structure: 0, - }, - }, - state_transitions: StateTransitionVersions { - documents: DocumentTransitionVersions { - documents_batch_transition: DocumentsBatchTransitionVersions { - validation: DocumentsBatchTransitionValidationVersions { - find_duplicates_by_id: 0, - validate_base_structure: 0, - }, - }, - }, - identities: IdentityTransitionVersions { - max_public_keys_in_creation: 6, - asset_locks: IdentityTransitionAssetLockVersions { - required_asset_lock_duff_balance_for_processing_start_for_identity_create: - 200000, - required_asset_lock_duff_balance_for_processing_start_for_identity_top_up: - 50000, - validate_asset_lock_transaction_structure: 0, - validate_instant_asset_lock_proof_structure: 0, - }, - credit_withdrawal: IdentityCreditWithdrawalTransitionVersions { - default_constructor: 1, - }, - }, - }, - contract_versions: ContractVersions { - max_serialized_size: 65000, - contract_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contract_structure_version: 0, - created_data_contract_structure: 0, - config: 0, - methods: DataContractMethodVersions { - validate_document: 0, - validate_update: 0, - schema: 0, - }, - document_type_versions: DocumentTypeVersions { - index_versions: DocumentTypeIndexVersions { - index_levels_from_indices: 0, - }, - class_method_versions: DocumentTypeClassMethodVersions { - try_from_schema: 0, - create_document_types_from_document_schemas: 0, - }, - structure_version: 0, - schema: DocumentTypeSchemaVersions { - enrich_with_base_schema: 0, - find_identifier_and_binary_paths: 0, - validate_max_depth: 0, - max_depth: 256, - recursive_schema_validator_versions: RecursiveSchemaValidatorVersions { - traversal_validator: 0, - }, - validate_schema_compatibility: 0, - }, - methods: DocumentTypeMethodVersions { - create_document_from_data: 0, - create_document_with_prevalidated_properties: 0, - prefunded_voting_balance_for_document: 0, - contested_vote_poll_for_document: 0, - estimated_size: 0, - index_for_types: 0, - max_size: 0, - serialize_value_for_key: 0, - deserialize_value_for_key: 0, - }, - }, - }, - document_versions: DocumentVersions { - document_structure_version: 0, - document_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_cbor_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - extended_document_structure_version: 0, - extended_document_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_method_versions: DocumentMethodVersions { - is_equal_ignoring_timestamps: 0, - hash: 0, - get_raw_for_contract: 0, - get_raw_for_document_type: 0, - try_into_asset_unlock_base_transaction_info: 0, - }, - }, - identity_versions: IdentityVersions { - identity_structure_version: 0, - identity_key_structure_version: 0, - identity_key_type_method_versions: IdentityKeyTypeMethodVersions { - random_public_key_data: 0, - random_public_and_private_key_data: 0, - }, - }, - voting_versions: VotingVersions { - default_vote_poll_time_duration_mainnet_ms: 1_209_600_000, //2 weeks - default_vote_poll_time_duration_test_network_ms: 5_400_000, //90 minutes - contested_document_vote_poll_stored_info_version: 0, - }, - asset_lock_versions: AssetLockVersions { - reduced_asset_lock_value: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - methods: DPPMethodVersions { - epoch_core_reward_credits_for_distribution: 0, - daily_withdrawal_limit: 0, - }, - }, - system_data_contracts: SystemDataContractVersions { - withdrawals: 1, - dpns: 1, - dashpay: 1, - masternode_reward_shares: 1, - feature_flags: 1, + costs: DPP_COSTS_VERSIONS_V1, + validation: DPP_VALIDATION_VERSIONS_V2, + state_transition_serialization_versions: STATE_TRANSITION_SERIALIZATION_VERSIONS_V1, + state_transition_conversion_versions: STATE_TRANSITION_CONVERSION_VERSIONS_V2, + state_transition_method_versions: STATE_TRANSITION_METHOD_VERSIONS_V1, + state_transitions: STATE_TRANSITION_VERSIONS_V2, + contract_versions: CONTRACT_VERSIONS_V1, + document_versions: DOCUMENT_VERSIONS_V1, + identity_versions: IDENTITY_VERSIONS_V1, + voting_versions: VOTING_VERSION_V2, + asset_lock_versions: DPP_ASSET_LOCK_VERSIONS_V1, + methods: DPP_METHOD_VERSIONS_V1, + factory_versions: DPP_FACTORY_VERSIONS_V1, }, + system_data_contracts: SYSTEM_DATA_CONTRACT_VERSIONS_V1, fee_version: FEE_VERSION1, - system_limits: SystemLimits { - estimated_contract_max_serialized_size: 16384, - max_field_value_size: 5120, //5 KiB - max_state_transition_size: 20480, //20 KiB - max_transitions_in_documents_batch: 1, - withdrawal_transactions_per_block_limit: 4, - retry_signing_expired_withdrawal_documents_per_block_limit: 1, - max_withdrawal_amount: 50_000_000_000_000, - }, + system_limits: SYSTEM_LIMITS_V1, consensus: ConsensusVersions { tenderdash_consensus_version: 1, }, diff --git a/packages/rs-platform-version/src/version/v4.rs b/packages/rs-platform-version/src/version/v4.rs index fd6429c6f6..d0b5894374 100644 --- a/packages/rs-platform-version/src/version/v4.rs +++ b/packages/rs-platform-version/src/version/v4.rs @@ -1,87 +1,30 @@ use crate::version::consensus_versions::ConsensusVersions; -use crate::version::contracts::SystemDataContractVersions; -use crate::version::dpp_versions::{ - AssetLockVersions, ContractVersions, CostVersions, DPPMethodVersions, DPPValidationVersions, - DPPVersion, DataContractMethodVersions, DataContractValidationVersions, - DocumentFeatureVersionBounds, DocumentMethodVersions, DocumentTransitionVersions, - DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, DocumentTypeMethodVersions, - DocumentTypeSchemaVersions, DocumentTypeValidationVersions, DocumentTypeVersions, - DocumentVersions, DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions, - IdentityCreditWithdrawalTransitionVersions, IdentityKeyTypeMethodVersions, - IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions, - JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, - RecursiveSchemaValidatorVersions, StateTransitionConversionVersions, - StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions, - VotingValidationVersions, VotingVersions, -}; -use crate::version::drive_abci_versions::{ - DriveAbciAssetLockValidationVersions, DriveAbciBlockEndMethodVersions, - DriveAbciBlockFeeProcessingMethodVersions, DriveAbciBlockStartMethodVersions, - DriveAbciCoreBasedUpdatesMethodVersions, DriveAbciCoreChainLockMethodVersionsAndConstants, - DriveAbciCoreInstantSendLockMethodVersions, - DriveAbciDocumentsStateTransitionValidationVersions, DriveAbciEngineMethodVersions, - DriveAbciEpochMethodVersions, DriveAbciFeePoolInwardsDistributionMethodVersions, - DriveAbciFeePoolOutwardsDistributionMethodVersions, - DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, - DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, - DriveAbciPlatformStateStorageMethodVersions, DriveAbciProtocolUpgradeMethodVersions, - DriveAbciQueryDataContractVersions, DriveAbciQueryIdentityVersions, - DriveAbciQueryPrefundedSpecializedBalancesVersions, DriveAbciQuerySystemVersions, - DriveAbciQueryValidatorVersions, DriveAbciQueryVersions, DriveAbciQueryVotingVersions, - DriveAbciStateTransitionCommonValidationVersions, - DriveAbciStateTransitionProcessingMethodVersions, DriveAbciStateTransitionValidationVersion, - DriveAbciStateTransitionValidationVersions, DriveAbciStructureVersions, - DriveAbciValidationConstants, DriveAbciValidationDataTriggerAndBindingVersions, - DriveAbciValidationDataTriggerVersions, DriveAbciValidationVersions, DriveAbciVersion, - DriveAbciVotingMethodVersions, DriveAbciWithdrawalConstants, PenaltyAmounts, -}; -use crate::version::drive_versions::{ - DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, - DriveContractApplyMethodVersions, DriveContractCostsMethodVersions, - DriveContractGetMethodVersions, DriveContractInsertMethodVersions, DriveContractMethodVersions, - DriveContractProveMethodVersions, DriveContractUpdateMethodVersions, - DriveCreditPoolEpochsMethodVersions, DriveCreditPoolMethodVersions, - DriveCreditPoolPendingEpochRefundsMethodVersions, - DriveCreditPoolStorageFeeDistributionPoolMethodVersions, - DriveCreditPoolUnpaidEpochMethodVersions, DriveDataContractOperationMethodVersions, - DriveDocumentDeleteMethodVersions, DriveDocumentEstimationCostsMethodVersions, - DriveDocumentIndexUniquenessMethodVersions, DriveDocumentInsertContestedMethodVersions, - DriveDocumentInsertMethodVersions, DriveDocumentMethodVersions, - DriveDocumentQueryMethodVersions, DriveDocumentUpdateMethodVersions, - DriveEstimatedCostsMethodVersions, DriveFeesMethodVersions, DriveFetchMethodVersions, - DriveGroveApplyMethodVersions, DriveGroveBasicMethodVersions, DriveGroveBatchMethodVersions, - DriveGroveCostMethodVersions, DriveGroveMethodVersions, - DriveIdentityContractInfoMethodVersions, DriveIdentityCostEstimationMethodVersions, - DriveIdentityFetchAttributesMethodVersions, DriveIdentityFetchFullIdentityMethodVersions, - DriveIdentityFetchMethodVersions, DriveIdentityFetchPartialIdentityMethodVersions, - DriveIdentityFetchPublicKeyHashesMethodVersions, DriveIdentityInsertMethodVersions, - DriveIdentityKeyHashesToIdentityInsertMethodVersions, DriveIdentityKeysFetchMethodVersions, - DriveIdentityKeysInsertMethodVersions, DriveIdentityKeysMethodVersions, - DriveIdentityKeysProveMethodVersions, DriveIdentityMethodVersions, - DriveIdentityProveMethodVersions, DriveIdentityUpdateMethodVersions, - DriveIdentityWithdrawalDocumentMethodVersions, DriveIdentityWithdrawalMethodVersions, - DriveIdentityWithdrawalTransactionIndexMethodVersions, - DriveIdentityWithdrawalTransactionMethodVersions, - DriveIdentityWithdrawalTransactionQueueMethodVersions, DriveInitializationMethodVersions, - DriveMethodVersions, DriveOperationsMethodVersion, DrivePlatformStateMethodVersions, - DrivePlatformSystemMethodVersions, DrivePrefundedSpecializedMethodVersions, - DriveProtocolUpgradeVersions, DriveProveMethodVersions, - DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions, - DriveStateTransitionMethodVersions, DriveStateTransitionOperationMethodVersions, - DriveStructureVersion, DriveSystemEstimationCostsMethodVersions, - DriveVerifyContractMethodVersions, DriveVerifyDocumentMethodVersions, - DriveVerifyIdentityMethodVersions, DriveVerifyMethodVersions, - DriveVerifySingleDocumentMethodVersions, DriveVerifyStateTransitionMethodVersions, - DriveVerifySystemMethodVersions, DriveVerifyVoteMethodVersions, DriveVersion, - DriveVoteCleanupMethodVersions, DriveVoteContestedResourceInsertMethodVersions, - DriveVoteFetchMethodVersions, DriveVoteInsertMethodVersions, DriveVoteMethodVersions, - DriveVoteSetupMethodVersions, DriveVoteStorageFormMethodVersions, -}; +use crate::version::dpp_versions::dpp_asset_lock_versions::v1::DPP_ASSET_LOCK_VERSIONS_V1; +use crate::version::dpp_versions::dpp_contract_versions::v1::CONTRACT_VERSIONS_V1; +use crate::version::dpp_versions::dpp_costs_versions::v1::DPP_COSTS_VERSIONS_V1; +use crate::version::dpp_versions::dpp_document_versions::v1::DOCUMENT_VERSIONS_V1; +use crate::version::dpp_versions::dpp_factory_versions::v1::DPP_FACTORY_VERSIONS_V1; +use crate::version::dpp_versions::dpp_identity_versions::v1::IDENTITY_VERSIONS_V1; +use crate::version::dpp_versions::dpp_method_versions::v1::DPP_METHOD_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_conversion_versions::v2::STATE_TRANSITION_CONVERSION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_state_transition_method_versions::v1::STATE_TRANSITION_METHOD_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_serialization_versions::v1::STATE_TRANSITION_SERIALIZATION_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_versions::v2::STATE_TRANSITION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_validation_versions::v2::DPP_VALIDATION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_voting_versions::v2::VOTING_VERSION_V2; +use crate::version::dpp_versions::DPPVersion; +use crate::version::drive_abci_versions::drive_abci_method_versions::v3::DRIVE_ABCI_METHOD_VERSIONS_V3; +use crate::version::drive_abci_versions::drive_abci_query_versions::v1::DRIVE_ABCI_QUERY_VERSIONS_V1; +use crate::version::drive_abci_versions::drive_abci_structure_versions::v1::DRIVE_ABCI_STRUCTURE_VERSIONS_V1; +use crate::version::drive_abci_versions::drive_abci_validation_versions::v3::DRIVE_ABCI_VALIDATION_VERSIONS_V3; +use crate::version::drive_abci_versions::drive_abci_withdrawal_constants::v2::DRIVE_ABCI_WITHDRAWAL_CONSTANTS_V2; +use crate::version::drive_abci_versions::DriveAbciVersion; +use crate::version::drive_versions::v2::DRIVE_VERSION_V2; use crate::version::fee::v1::FEE_VERSION1; -use crate::version::limits::SystemLimits; -use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; -use crate::version::{PlatformArchitectureVersion, ProtocolVersion}; -use grovedb_version::version::v1::GROVE_V1; +use crate::version::protocol_version::PlatformVersion; +use crate::version::system_data_contract_versions::v1::SYSTEM_DATA_CONTRACT_VERSIONS_V1; +use crate::version::system_limits::v1::SYSTEM_LIMITS_V1; +use crate::version::ProtocolVersion; pub const PROTOCOL_VERSION_4: ProtocolVersion = 4; @@ -89,1224 +32,32 @@ pub const PROTOCOL_VERSION_4: ProtocolVersion = 4; pub const PLATFORM_V4: PlatformVersion = PlatformVersion { protocol_version: PROTOCOL_VERSION_4, - proofs: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - drive: DriveVersion { - structure: DriveStructureVersion { - document_indexes: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_indexes: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - pools: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - methods: DriveMethodVersions { - initialization: DriveInitializationMethodVersions { - create_initial_state_structure: 0, - }, - credit_pools: DriveCreditPoolMethodVersions { - epochs: DriveCreditPoolEpochsMethodVersions { - get_epochs_infos: 0, - get_epochs_protocol_versions: 0, - prove_epochs_infos: 0, - get_epoch_fee_multiplier: 0, - get_epoch_processing_credits_for_distribution: 0, - get_epoch_storage_credits_for_distribution: 0, - get_epoch_total_credits_for_distribution: 0, - get_storage_credits_for_distribution_for_epochs_in_range: 0, - get_epoch_start_time: 0, - get_epoch_start_block_core_height: 0, - get_epoch_start_block_height: 0, - get_first_epoch_start_block_info_between_epochs: 0, - fetch_epoch_proposers: 0, - prove_epoch_proposers: 0, - get_epochs_proposer_block_count: 0, - add_update_pending_epoch_refunds_operations: 0, - is_epochs_proposers_tree_empty: 0, - }, - pending_epoch_refunds: DriveCreditPoolPendingEpochRefundsMethodVersions { - add_delete_pending_epoch_refunds_except_specified: 0, - fetch_and_add_pending_epoch_refunds_to_collection: 0, - fetch_pending_epoch_refunds: 0, - add_update_pending_epoch_refunds_operations: 0, - }, - storage_fee_distribution_pool: - DriveCreditPoolStorageFeeDistributionPoolMethodVersions { - get_storage_fees_from_distribution_pool: 0, - }, - unpaid_epoch: DriveCreditPoolUnpaidEpochMethodVersions { - get_unpaid_epoch_index: 0, - }, - }, - protocol_upgrade: DriveProtocolUpgradeVersions { - clear_version_information: 0, - fetch_versions_with_counter: 0, - fetch_proved_versions_with_counter: 0, - fetch_validator_version_votes: 0, - fetch_proved_validator_version_votes: 0, - remove_validators_proposed_app_versions: 0, - update_validator_proposed_app_version: 0, - }, - prove: DriveProveMethodVersions { - prove_elements: 0, - prove_multiple_state_transition_results: 0, - }, - balances: DriveBalancesMethodVersions { - add_to_system_credits: 0, - add_to_system_credits_operations: 0, - remove_from_system_credits: 0, - remove_from_system_credits_operations: 0, - calculate_total_credits_balance: 0, - }, - document: DriveDocumentMethodVersions { - query: DriveDocumentQueryMethodVersions { query_documents: 0, query_contested_documents: 0, query_contested_documents_vote_state: 0, query_documents_with_flags: 0 }, - delete: DriveDocumentDeleteMethodVersions { - add_estimation_costs_for_remove_document_to_primary_storage: 0, - delete_document_for_contract: 0, - delete_document_for_contract_id: 0, - delete_document_for_contract_apply_and_add_to_operations: 0, - remove_document_from_primary_storage: 0, - remove_reference_for_index_level_for_contract_operations: 0, - remove_indices_for_index_level_for_contract_operations: 0, - remove_indices_for_top_index_level_for_contract_operations: 0, - delete_document_for_contract_id_with_named_type_operations: 0, - delete_document_for_contract_with_named_type_operations: 0, - delete_document_for_contract_operations: 0, - }, - insert: DriveDocumentInsertMethodVersions { - add_document: 0, - add_document_for_contract: 0, - add_document_for_contract_apply_and_add_to_operations: 0, - add_document_for_contract_operations: 0, - add_document_to_primary_storage: 0, - add_indices_for_index_level_for_contract_operations: 0, - add_indices_for_top_index_level_for_contract_operations: 0, - add_reference_for_index_level_for_contract_operations: 0, - }, - insert_contested: DriveDocumentInsertContestedMethodVersions { - add_contested_document: 0, - add_contested_document_for_contract: 0, - add_contested_document_for_contract_apply_and_add_to_operations: 0, - add_contested_document_for_contract_operations: 0, - add_contested_document_to_primary_storage: 0, - add_contested_indices_for_contract_operations: 0, - add_contested_reference_and_vote_subtree_to_document_operations: 0, - add_contested_vote_subtree_for_non_identities_operations: 0, - }, - update: DriveDocumentUpdateMethodVersions { - add_update_multiple_documents_operations: 0, - update_document_for_contract: 0, - update_document_for_contract_apply_and_add_to_operations: 0, - update_document_for_contract_id: 0, - update_document_for_contract_operations: 0, - update_document_with_serialization_for_contract: 0, - update_serialized_document_for_contract: 0, - }, - estimation_costs: DriveDocumentEstimationCostsMethodVersions { - add_estimation_costs_for_add_document_to_primary_storage: 0, - add_estimation_costs_for_add_contested_document_to_primary_storage: 0, - stateless_delete_of_non_tree_for_costs: 0, - }, - index_uniqueness: DriveDocumentIndexUniquenessMethodVersions { - validate_document_uniqueness: 0, - validate_document_create_transition_action_uniqueness: 0, - validate_document_replace_transition_action_uniqueness: 0, - validate_document_transfer_transition_action_uniqueness: 0, - validate_document_purchase_transition_action_uniqueness: 0, - validate_document_update_price_transition_action_uniqueness: 0, - validate_uniqueness_of_data: 0, - }, - }, - vote: DriveVoteMethodVersions { - insert: DriveVoteInsertMethodVersions { - register_identity_vote: 0, - }, - contested_resource_insert: DriveVoteContestedResourceInsertMethodVersions { - register_contested_resource_identity_vote: 0, - insert_stored_info_for_contested_resource_vote_poll: 0, - register_identity_vote: 0, - add_vote_poll_end_date_query_operations: 0, - }, - cleanup: DriveVoteCleanupMethodVersions { - remove_specific_vote_references_given_by_identity: 0, - remove_specific_votes_given_by_identity: 0, - remove_contested_resource_vote_poll_end_date_query_operations: 1, - remove_contested_resource_vote_poll_votes_operations: 0, - remove_contested_resource_vote_poll_documents_operations: 1, - remove_contested_resource_vote_poll_contenders_operations: 1, - remove_contested_resource_top_level_index_operations: 0, - remove_contested_resource_info_operations: 0, - }, - setup: DriveVoteSetupMethodVersions { - add_initial_vote_tree_main_structure_operations: 0, - }, - storage_form: DriveVoteStorageFormMethodVersions { - resolve_with_contract: 0, - }, - fetch: DriveVoteFetchMethodVersions { - fetch_identities_voting_for_contenders: 0, - fetch_contested_document_vote_poll_stored_info: 0, - fetch_identity_contested_resource_vote: 0, - }, - }, - contract: DriveContractMethodVersions { - prove: DriveContractProveMethodVersions { - prove_contract: 0, - prove_contract_history: 0, - prove_contracts: 0, - }, - apply: DriveContractApplyMethodVersions { - apply_contract: 0, - apply_contract_with_serialization: 0, - }, - insert: DriveContractInsertMethodVersions { - add_contract_to_storage: 0, - insert_contract: 0, - }, - update: DriveContractUpdateMethodVersions { update_contract: 0 }, - costs: DriveContractCostsMethodVersions { - add_estimation_costs_for_contract_insertion: 0, - }, - get: DriveContractGetMethodVersions { - fetch_contract: 0, - fetch_contract_with_history: 0, - get_cached_contract_with_fetch_info: 0, - get_contract_with_fetch_info: 0, - get_contracts_with_fetch_info: 0, - }, - }, - fees: DriveFeesMethodVersions { calculate_fee: 0 }, - estimated_costs: DriveEstimatedCostsMethodVersions { - add_estimation_costs_for_levels_up_to_contract: 0, - add_estimation_costs_for_levels_up_to_contract_document_type_excluded: 0, - add_estimation_costs_for_contested_document_tree_levels_up_to_contract: 0, - add_estimation_costs_for_contested_document_tree_levels_up_to_contract_document_type_excluded: 0, - }, - asset_lock: DriveAssetLockMethodVersions { - add_asset_lock_outpoint: 0, - add_estimation_costs_for_adding_asset_lock: 0, - fetch_asset_lock_outpoint_info: 0, - }, - verify: DriveVerifyMethodVersions { - contract: DriveVerifyContractMethodVersions { - verify_contract: 0, - verify_contract_history: 0, - }, - document: DriveVerifyDocumentMethodVersions { - verify_proof: 0, - verify_proof_keep_serialized: 0, - verify_start_at_document_in_proof: 0, - }, - identity: DriveVerifyIdentityMethodVersions { - verify_full_identities_by_public_key_hashes: 0, - verify_full_identity_by_identity_id: 0, - verify_full_identity_by_public_key_hash: 0, - verify_identity_balance_for_identity_id: 0, - verify_identity_balances_for_identity_ids: 0, - verify_identity_id_by_public_key_hash: 0, - verify_identity_ids_by_public_key_hashes: 0, - verify_identity_keys_by_identity_id: 0, - verify_identity_nonce: 0, - verify_identity_contract_nonce: 0, - verify_identities_contract_keys: 0, - verify_identity_revision_for_identity_id: 0, - }, - single_document: DriveVerifySingleDocumentMethodVersions { - verify_proof: 0, - verify_proof_keep_serialized: 0, - }, - system: DriveVerifySystemMethodVersions { - verify_epoch_infos: 0, - verify_epoch_proposers: 0, - verify_elements: 0, - verify_total_credits_in_system: 0, - verify_upgrade_state: 0, - verify_upgrade_vote_status: 0, - }, - voting: DriveVerifyVoteMethodVersions { - verify_masternode_vote: 0, - verify_start_at_contender_in_proof: 0, - verify_vote_poll_votes_proof: 0, - verify_identity_votes_given_proof: 0, - verify_vote_poll_vote_state_proof: 0, - verify_contests_proof: 0, - verify_vote_polls_by_end_date_proof: 0, - verify_specialized_balance: 0, - }, - state_transition: DriveVerifyStateTransitionMethodVersions { - verify_state_transition_was_executed_with_proof: 0, - }, - }, - identity: DriveIdentityMethodVersions { - fetch: DriveIdentityFetchMethodVersions { - public_key_hashes: DriveIdentityFetchPublicKeyHashesMethodVersions { - fetch_full_identities_by_unique_public_key_hashes: 0, - fetch_full_identity_by_unique_public_key_hash: 0, - fetch_identity_id_by_unique_public_key_hash: 0, - fetch_identity_ids_by_non_unique_public_key_hash: 0, - fetch_identity_ids_by_unique_public_key_hashes: 0, - fetch_serialized_full_identity_by_unique_public_key_hash: 0, - has_any_of_unique_public_key_hashes: 0, - has_non_unique_public_key_hash: 0, - has_non_unique_public_key_hash_already_for_identity: 0, - has_unique_public_key_hash: 0, - }, - attributes: DriveIdentityFetchAttributesMethodVersions { - revision: 0, - nonce: 0, - identity_contract_nonce: 0, - balance: 0, - balance_include_debt: 0, - negative_balance: 0, - }, - partial_identity: DriveIdentityFetchPartialIdentityMethodVersions { - fetch_identity_revision_with_keys: 0, - fetch_identity_balance_with_keys: 0, - fetch_identity_balance_with_keys_and_revision: 0, - fetch_identity_with_balance: 0, - fetch_identity_keys: 0, - }, - full_identity: DriveIdentityFetchFullIdentityMethodVersions { - fetch_full_identity: Some(0), - fetch_full_identities: Some(0), - }, - }, - prove: DriveIdentityProveMethodVersions { - full_identity: 0, - full_identities: 0, - identity_nonce: 0, - identity_contract_nonce: 0, - identities_contract_keys: 0, - prove_full_identities_by_unique_public_key_hashes: 0, - prove_full_identity_by_unique_public_key_hash: 0, - prove_identity_id_by_unique_public_key_hash: 0, - prove_identity_ids_by_unique_public_key_hashes: 0, - }, - keys: DriveIdentityKeysMethodVersions { - fetch: DriveIdentityKeysFetchMethodVersions { - fetch_all_current_identity_keys: 0, - fetch_all_identity_keys: 0, - fetch_identities_all_keys: 0, - fetch_identity_keys: 0, - fetch_identities_contract_keys: 0, - }, - prove: DriveIdentityKeysProveMethodVersions { - prove_identities_all_keys: 0, - prove_identity_keys: 0, - }, - insert: DriveIdentityKeysInsertMethodVersions { - create_key_tree_with_keys: 0, - create_new_identity_key_query_trees: 0, - insert_key_searchable_references: 0, - insert_key_to_storage: 0, - insert_new_non_unique_key: 0, - insert_new_unique_key: 0, - replace_key_in_storage: 0, - }, - insert_key_hash_identity_reference: - DriveIdentityKeyHashesToIdentityInsertMethodVersions { - add_estimation_costs_for_insert_non_unique_public_key_hash_reference: 0, - add_estimation_costs_for_insert_unique_public_key_hash_reference: 0, - insert_non_unique_public_key_hash_reference_to_identity: 0, - insert_reference_to_non_unique_key: 0, - insert_reference_to_unique_key: 0, - insert_unique_public_key_hash_reference_to_identity: 0, - }, - }, - update: DriveIdentityUpdateMethodVersions { - update_identity_revision: 0, - merge_identity_nonce: 0, - update_identity_negative_credit_operation: 0, - initialize_identity_revision: 0, - disable_identity_keys: 0, - re_enable_identity_keys: 0, - add_new_non_unique_keys_to_identity: 0, - add_new_unique_keys_to_identity: 0, - add_new_keys_to_identity: 0, - insert_identity_balance: 0, - initialize_negative_identity_balance: 0, - add_to_identity_balance: 0, - add_to_previous_balance: 0, - apply_balance_change_from_fee_to_identity: 0, - remove_from_identity_balance: 0, - refresh_identity_key_reference_operations: 0, - }, - insert: DriveIdentityInsertMethodVersions { - add_new_identity: 0, - }, - contract_info: DriveIdentityContractInfoMethodVersions { - add_potential_contract_info_for_contract_bounded_key: 0, - refresh_potential_contract_info_key_references: 0, - merge_identity_contract_nonce: 0, - }, - cost_estimation: DriveIdentityCostEstimationMethodVersions { - for_authentication_keys_security_level_in_key_reference_tree: 0, - for_balances: 0, - for_contract_info: 0, - for_contract_info_group: 0, - for_contract_info_group_keys: 0, - for_contract_info_group_key_purpose: 0, - for_keys_for_identity_id: 0, - for_negative_credit: 0, - for_purpose_in_key_reference_tree: 0, - for_root_key_reference_tree: 0, - for_update_revision: 0, - }, - withdrawals: DriveIdentityWithdrawalMethodVersions { - document: DriveIdentityWithdrawalDocumentMethodVersions { - fetch_oldest_withdrawal_documents_by_status: 0, - find_withdrawal_documents_by_status_and_transaction_indices: 0, - }, - transaction: DriveIdentityWithdrawalTransactionMethodVersions { - index: DriveIdentityWithdrawalTransactionIndexMethodVersions { - fetch_next_withdrawal_transaction_index: 0, - add_update_next_withdrawal_transaction_index_operation: 0, - }, - queue: DriveIdentityWithdrawalTransactionQueueMethodVersions { - add_enqueue_untied_withdrawal_transaction_operations: 0, - dequeue_untied_withdrawal_transactions: 0, - remove_broadcasted_withdrawal_transactions_after_completion_operations: 0, - move_broadcasted_withdrawal_transactions_back_to_queue_operations: 0, - }, - }, - calculate_current_withdrawal_limit: 0, - }, - }, - platform_system: DrivePlatformSystemMethodVersions { - estimation_costs: DriveSystemEstimationCostsMethodVersions { - for_total_system_credits_update: 0, - }, - }, - operations: DriveOperationsMethodVersion { - rollback_transaction: 0, - drop_cache: 0, - commit_transaction: 0, - apply_partial_batch_low_level_drive_operations: 0, - apply_partial_batch_grovedb_operations: 0, - apply_batch_low_level_drive_operations: 0, - apply_batch_grovedb_operations: 0, - }, - state_transitions: DriveStateTransitionMethodVersions { - operations: DriveStateTransitionOperationMethodVersions { - finalization_tasks: 0, - contracts: DriveDataContractOperationMethodVersions { - finalization_tasks: 0, - }, - }, - convert_to_high_level_operations: - DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions { - data_contract_create_transition: 0, - data_contract_update_transition: 0, - document_create_transition: 0, - document_delete_transition: 0, - document_purchase_transition: 0, - document_replace_transition: 0, - document_transfer_transition: 0, - document_update_price_transition: 0, - documents_batch_transition: 0, - identity_create_transition: 0, - identity_credit_transfer_transition: 0, - identity_credit_withdrawal_transition: 0, - identity_top_up_transition: 0, - identity_update_transition: 0, - masternode_vote_transition: 0, - bump_identity_data_contract_nonce: 0, - bump_identity_nonce: 0, - partially_use_asset_lock: 0, - }, - }, - batch_operations: DriveBatchOperationsMethodVersion { - convert_drive_operations_to_grove_operations: 0, - apply_drive_operations: 0, - }, - platform_state: DrivePlatformStateMethodVersions { - fetch_platform_state_bytes: 0, - store_platform_state_bytes: 0, - }, - fetch: DriveFetchMethodVersions { fetch_elements: 0 }, - prefunded_specialized_balances: DrivePrefundedSpecializedMethodVersions { - fetch_single: 0, - prove_single: 0, - add_prefunded_specialized_balance: 0, - add_prefunded_specialized_balance_operations: 0, - deduct_from_prefunded_specialized_balance: 0, - deduct_from_prefunded_specialized_balance_operations: 0, - estimated_cost_for_prefunded_specialized_balance_update: 0, - }, - }, - grove_methods: DriveGroveMethodVersions { - basic: DriveGroveBasicMethodVersions { - grove_insert: 0, - grove_insert_empty_tree: 0, - grove_insert_empty_sum_tree: 0, - grove_insert_if_not_exists: 0, - grove_insert_if_not_exists_return_existing_element: 0, - grove_clear: 0, - grove_delete: 0, - grove_get_raw: 0, - grove_get_raw_optional: 0, - grove_get_raw_value_u64_from_encoded_var_vec: 0, - grove_get: 0, - grove_get_path_query_serialized_results: 0, - grove_get_path_query_serialized_or_sum_results: 0, - grove_get_path_query: 0, - grove_get_path_query_with_optional: 0, - grove_get_raw_path_query_with_optional: 0, - grove_get_raw_path_query: 0, - grove_get_proved_path_query: 0, - grove_get_proved_path_query_with_conditional: 0, - grove_get_sum_tree_total_value: 0, - grove_has_raw: 0, - }, - batch: DriveGroveBatchMethodVersions { - batch_insert_empty_tree: 0, - batch_insert_empty_tree_if_not_exists: 0, - batch_insert_empty_tree_if_not_exists_check_existing_operations: 0, - batch_insert_sum_item_or_add_to_if_already_exists: 0, - batch_insert: 0, - batch_insert_if_not_exists: 0, - batch_insert_if_changed_value: 0, - batch_replace: 0, - batch_delete: 0, - batch_delete_items_in_path_query: 0, - batch_move_items_in_path_query: 0, - batch_remove_raw: 0, - batch_delete_up_tree_while_empty: 0, - batch_refresh_reference: 0, - }, - apply: DriveGroveApplyMethodVersions { - grove_apply_operation: 0, - grove_apply_batch: 0, - grove_apply_partial_batch: 0, - }, - costs: DriveGroveCostMethodVersions { - grove_batch_operations_costs: 0, - }, - }, - grove_version: GROVE_V1, - }, - platform_architecture: PlatformArchitectureVersion { - data_contract_factory_structure_version: 0, - document_factory_structure_version: 0, - }, + drive: DRIVE_VERSION_V2, drive_abci: DriveAbciVersion { - structs: DriveAbciStructureVersions { - platform_state_structure: 0, - platform_state_for_saving_structure_default: 0, - state_transition_execution_context: 0, - commit: 0, - masternode: 0, - signature_verification_quorum_set: 0, - }, - methods: DriveAbciMethodVersions { - engine: DriveAbciEngineMethodVersions { - init_chain: 0, - check_tx: 0, - run_block_proposal: 0, - finalize_block_proposal: 0, - consensus_params_update: 1, - }, - initialization: DriveAbciInitializationMethodVersions { - initial_core_height_and_time: 0, - create_genesis_state: 0, - }, - core_based_updates: DriveAbciCoreBasedUpdatesMethodVersions { - update_core_info: 0, - update_masternode_list: 0, - update_quorum_info: 0, - masternode_updates: DriveAbciMasternodeIdentitiesUpdatesMethodVersions { - get_voter_identity_key: 0, - get_operator_identity_keys: 0, - get_owner_identity_withdrawal_key: 0, - get_owner_identity_owner_key: 0, - get_voter_identifier_from_masternode_list_item: 0, - get_operator_identifier_from_masternode_list_item: 0, - create_operator_identity: 0, - create_owner_identity: 1, - create_voter_identity: 0, - disable_identity_keys: 0, - update_masternode_identities: 0, - update_operator_identity: 0, - update_owner_withdrawal_address: 1, - update_voter_identity: 0, - }, - }, - protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { - check_for_desired_protocol_upgrade: 1, - upgrade_protocol_version_on_epoch_change: 0, - perform_events_on_first_block_of_protocol_change: Some(0), - protocol_version_upgrade_percentage_needed: 67, - }, - block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { - add_process_epoch_change_operations: 0, - process_block_fees: 0, - }, - core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants { - choose_quorum: 0, - verify_chain_lock: 0, - verify_chain_lock_locally: 0, - verify_chain_lock_through_core: 0, - make_sure_core_is_synced_to_chain_lock: 0, - recent_block_count_amount: 2, - }, - core_instant_send_lock: DriveAbciCoreInstantSendLockMethodVersions { - verify_recent_signature_locally: 0, - }, - fee_pool_inwards_distribution: DriveAbciFeePoolInwardsDistributionMethodVersions { - add_distribute_block_fees_into_pools_operations: 0, - add_distribute_storage_fee_to_epochs_operations: 0, - }, - fee_pool_outwards_distribution: DriveAbciFeePoolOutwardsDistributionMethodVersions { - add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations: 0, - add_epoch_pool_to_proposers_payout_operations: 0, - find_oldest_epoch_needing_payment: 0, - fetch_reward_shares_list_for_masternode: 0, - }, - withdrawals: DriveAbciIdentityCreditWithdrawalMethodVersions { - build_untied_withdrawal_transactions_from_documents: 0, - dequeue_and_build_unsigned_withdrawal_transactions: 0, - fetch_transactions_block_inclusion_status: 0, - pool_withdrawals_into_transactions_queue: 0, - update_broadcasted_withdrawal_statuses: 0, - rebroadcast_expired_withdrawal_documents: 0, - append_signatures_and_broadcast_withdrawal_transactions: 0, - cleanup_expired_locks_of_withdrawal_amounts: 0, - }, - voting: DriveAbciVotingMethodVersions { - keep_record_of_finished_contested_resource_vote_poll: 0, - clean_up_after_vote_poll_end: 0, - clean_up_after_contested_resources_vote_poll_end: 0, - check_for_ended_vote_polls: 0, - tally_votes_for_contested_document_resource_vote_poll: 0, - award_document_to_winner: 0, - delay_vote_poll: 0, - run_dao_platform_events: 0, - remove_votes_for_removed_masternodes: 0, - }, - state_transition_processing: DriveAbciStateTransitionProcessingMethodVersions { - execute_event: 0, - process_raw_state_transitions: 0, - decode_raw_state_transitions: 0, - validate_fees_of_event: 0, - }, - epoch: DriveAbciEpochMethodVersions { - gather_epoch_info: 0, - get_genesis_time: 0, - }, - block_start: DriveAbciBlockStartMethodVersions { - clear_drive_block_cache: 0, - }, - block_end: DriveAbciBlockEndMethodVersions { - update_state_cache: 0, - update_drive_cache: 0, - validator_set_update: 1, - }, - platform_state_storage: DriveAbciPlatformStateStorageMethodVersions { - fetch_platform_state: 0, - store_platform_state: 0, - }, - }, - validation_and_processing: DriveAbciValidationVersions { - state_transitions: DriveAbciStateTransitionValidationVersions { - common_validation_methods: DriveAbciStateTransitionCommonValidationVersions { - asset_locks: DriveAbciAssetLockValidationVersions { - fetch_asset_lock_transaction_output_sync: 0, - verify_asset_lock_is_not_spent_and_has_enough_balance: 0, - }, - validate_identity_public_key_contract_bounds: 0, - validate_identity_public_key_ids_dont_exist_in_state: 0, - validate_identity_public_key_ids_exist_in_state: 0, - validate_state_transition_identity_signed: 0, - validate_unique_identity_public_key_hashes_in_state: 0, - validate_master_key_uniqueness: 0, - validate_simple_pre_check_balance: 0, - }, - max_asset_lock_usage_attempts: 16, - identity_create_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: Some(0), - identity_signatures: Some(0), - advanced_minimum_balance_pre_check: None, - nonce: None, - state: 0, - transform_into_action: 0, - }, - identity_update_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: Some(0), - identity_signatures: Some(0), - advanced_minimum_balance_pre_check: None, - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: None, - nonce: None, - state: 0, - transform_into_action: 0, - }, - identity_credit_withdrawal_state_transition: - DriveAbciStateTransitionValidationVersion { - basic_structure: Some(1), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: Some(0), - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - identity_credit_withdrawal_state_transition_purpose_matches_requirements: 0, - identity_credit_transfer_state_transition: - DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: Some(0), - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - masternode_vote_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: None, - advanced_structure: Some(0), - identity_signatures: None, - advanced_minimum_balance_pre_check: Some(0), - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - contract_create_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: Some(0), - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: None, - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - contract_update_state_transition: DriveAbciStateTransitionValidationVersion { - basic_structure: None, - advanced_structure: None, - identity_signatures: None, - advanced_minimum_balance_pre_check: None, - nonce: Some(0), - state: 0, - transform_into_action: 0, - }, - documents_batch_state_transition: - DriveAbciDocumentsStateTransitionValidationVersions { - balance_pre_check: 0, - basic_structure: 0, - advanced_structure: 0, - state: 0, - revision: 0, - transform_into_action: 0, - data_triggers: DriveAbciValidationDataTriggerAndBindingVersions { - bindings: 0, - triggers: DriveAbciValidationDataTriggerVersions { - create_contact_request_data_trigger: 0, - create_domain_data_trigger: 0, - create_identity_data_trigger: 0, - create_feature_flag_data_trigger: 0, - create_masternode_reward_shares_data_trigger: 0, - delete_withdrawal_data_trigger: 0, - reject_data_trigger: 0, - }, - }, - is_allowed: 0, - document_create_transition_structure_validation: 0, - document_delete_transition_structure_validation: 0, - document_replace_transition_structure_validation: 0, - document_transfer_transition_structure_validation: 0, - document_purchase_transition_structure_validation: 0, - document_update_price_transition_structure_validation: 0, - document_create_transition_state_validation: 1, - document_delete_transition_state_validation: 0, - document_replace_transition_state_validation: 0, - document_transfer_transition_state_validation: 0, - document_purchase_transition_state_validation: 0, - document_update_price_transition_state_validation: 0, - }, - }, - process_state_transition: 0, - state_transition_to_execution_event_for_check_tx: 0, - penalties: PenaltyAmounts { - identity_id_not_correct: 50000000, - unique_key_already_present: 10000000, - validation_of_added_keys_structure_failure: 10000000, - validation_of_added_keys_proof_of_possession_failure: 50000000, - }, - event_constants: DriveAbciValidationConstants { - maximum_vote_polls_to_process: 2, - maximum_contenders_to_consider: 100, - }, - }, - withdrawal_constants: DriveAbciWithdrawalConstants { - core_expiration_blocks: 48, - cleanup_expired_locks_of_withdrawal_amounts_limit: 64, - }, - query: DriveAbciQueryVersions { - max_returned_elements: 100, - response_metadata: 0, - proofs_query: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_query: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - prefunded_specialized_balances: DriveAbciQueryPrefundedSpecializedBalancesVersions { - balance: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - identity_based_queries: DriveAbciQueryIdentityVersions { - identity: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - keys: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identities_contract_keys: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_nonce: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_contract_nonce: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - balance: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identities_balances: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - balance_and_revision: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_by_public_key_hash: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - validator_queries: DriveAbciQueryValidatorVersions { - proposed_block_counts_by_evonode_ids: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - proposed_block_counts_by_range: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - data_contract_based_queries: DriveAbciQueryDataContractVersions { - data_contract: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - data_contract_history: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - data_contracts: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - voting_based_queries: DriveAbciQueryVotingVersions { - vote_polls_by_end_date_query: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contested_resource_vote_state: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contested_resource_voters_for_identity: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contested_resource_identity_vote_status: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contested_resources: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - system: DriveAbciQuerySystemVersions { - version_upgrade_state: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - version_upgrade_vote_status: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - epoch_infos: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - current_quorums_info: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - partial_status: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - path_elements: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - total_credits_in_platform: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - }, + structs: DRIVE_ABCI_STRUCTURE_VERSIONS_V1, + methods: DRIVE_ABCI_METHOD_VERSIONS_V3, + validation_and_processing: DRIVE_ABCI_VALIDATION_VERSIONS_V3, + withdrawal_constants: DRIVE_ABCI_WITHDRAWAL_CONSTANTS_V2, + query: DRIVE_ABCI_QUERY_VERSIONS_V1, }, dpp: DPPVersion { - costs: CostVersions { - signature_verify: 0, - }, - validation: DPPValidationVersions { - json_schema_validator: JsonSchemaValidatorVersions { - new: 0, - validate: 0, - compile: 0, - compile_and_validate: 0, - }, - data_contract: DataContractValidationVersions { - validate: 0, - validate_config_update: 0, - validate_index_definitions: 0, - validate_index_naming_duplicates: 0, - validate_not_defined_properties: 0, - validate_property_definition: 0, - }, - document_type: DocumentTypeValidationVersions { - validate_update: 0, - contested_index_limit: 1, - unique_index_limit: 10, - }, - voting: VotingValidationVersions { - allow_other_contenders_time_mainnet_ms: 604_800_000, // 1 week in ms - allow_other_contenders_time_testing_ms: 2_700_000, //45 minutes - votes_allowed_per_masternode: 5, - }, - }, - state_transition_serialization_versions: StateTransitionSerializationVersions { - identity_public_key_in_creation: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_create_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_update_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_top_up_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_credit_withdrawal_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - identity_credit_transfer_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - masternode_vote_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contract_create_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contract_update_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - documents_batch_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_base_state_transition: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_create_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_replace_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_delete_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_transfer_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_update_price_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - document_purchase_state_transition: DocumentFeatureVersionBounds { - bounds: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - }, - state_transition_conversion_versions: StateTransitionConversionVersions { - identity_to_identity_create_transition: 0, - identity_to_identity_top_up_transition: 0, - identity_to_identity_withdrawal_transition: 1, - identity_to_identity_create_transition_with_signer: 0, - }, - state_transition_method_versions: StateTransitionMethodVersions { - public_key_in_creation_methods: PublicKeyInCreationMethodVersions { - from_public_key_signed_with_private_key: 0, - from_public_key_signed_external: 0, - hash: 0, - duplicated_key_ids_witness: 0, - duplicated_keys_witness: 0, - validate_identity_public_keys_structure: 0, - }, - }, - state_transitions: StateTransitionVersions { - documents: DocumentTransitionVersions { - documents_batch_transition: DocumentsBatchTransitionVersions { - validation: DocumentsBatchTransitionValidationVersions { - find_duplicates_by_id: 0, - validate_base_structure: 0, - }, - }, - }, - identities: IdentityTransitionVersions { - max_public_keys_in_creation: 6, - asset_locks: IdentityTransitionAssetLockVersions { - required_asset_lock_duff_balance_for_processing_start_for_identity_create: - 200000, - required_asset_lock_duff_balance_for_processing_start_for_identity_top_up: - 50000, - validate_asset_lock_transaction_structure: 0, - validate_instant_asset_lock_proof_structure: 0, - }, - credit_withdrawal: IdentityCreditWithdrawalTransitionVersions { - default_constructor: 1, - }, - }, - }, - contract_versions: ContractVersions { - max_serialized_size: 65000, - contract_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - contract_structure_version: 0, - created_data_contract_structure: 0, - config: 0, - methods: DataContractMethodVersions { - validate_document: 0, - validate_update: 0, - schema: 0, - }, - document_type_versions: DocumentTypeVersions { - index_versions: DocumentTypeIndexVersions { - index_levels_from_indices: 0, - }, - class_method_versions: DocumentTypeClassMethodVersions { - try_from_schema: 0, - create_document_types_from_document_schemas: 0, - }, - structure_version: 0, - schema: DocumentTypeSchemaVersions { - enrich_with_base_schema: 0, - find_identifier_and_binary_paths: 0, - validate_max_depth: 0, - max_depth: 256, - recursive_schema_validator_versions: RecursiveSchemaValidatorVersions { - traversal_validator: 0, - }, - validate_schema_compatibility: 0, - }, - methods: DocumentTypeMethodVersions { - create_document_from_data: 0, - create_document_with_prevalidated_properties: 0, - prefunded_voting_balance_for_document: 0, - contested_vote_poll_for_document: 0, - estimated_size: 0, - index_for_types: 0, - max_size: 0, - serialize_value_for_key: 0, - deserialize_value_for_key: 0, - }, - }, - }, - document_versions: DocumentVersions { - document_structure_version: 0, - document_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_cbor_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - extended_document_structure_version: 0, - extended_document_serialization_version: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - document_method_versions: DocumentMethodVersions { - is_equal_ignoring_timestamps: 0, - hash: 0, - get_raw_for_contract: 0, - get_raw_for_document_type: 0, - try_into_asset_unlock_base_transaction_info: 0, - }, - }, - identity_versions: IdentityVersions { - identity_structure_version: 0, - identity_key_structure_version: 0, - identity_key_type_method_versions: IdentityKeyTypeMethodVersions { - random_public_key_data: 0, - random_public_and_private_key_data: 0, - }, - }, - voting_versions: VotingVersions { - default_vote_poll_time_duration_mainnet_ms: 1_209_600_000, //2 weeks - default_vote_poll_time_duration_test_network_ms: 5_400_000, //90 minutes - contested_document_vote_poll_stored_info_version: 0, - }, - asset_lock_versions: AssetLockVersions { - reduced_asset_lock_value: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, - }, - methods: DPPMethodVersions { - epoch_core_reward_credits_for_distribution: 0, - daily_withdrawal_limit: 0, - }, - }, - system_data_contracts: SystemDataContractVersions { - withdrawals: 1, - dpns: 1, - dashpay: 1, - masternode_reward_shares: 1, - feature_flags: 1, + costs: DPP_COSTS_VERSIONS_V1, + validation: DPP_VALIDATION_VERSIONS_V2, + state_transition_serialization_versions: STATE_TRANSITION_SERIALIZATION_VERSIONS_V1, + state_transition_conversion_versions: STATE_TRANSITION_CONVERSION_VERSIONS_V2, + state_transition_method_versions: STATE_TRANSITION_METHOD_VERSIONS_V1, + state_transitions: STATE_TRANSITION_VERSIONS_V2, + contract_versions: CONTRACT_VERSIONS_V1, + document_versions: DOCUMENT_VERSIONS_V1, + identity_versions: IDENTITY_VERSIONS_V1, + voting_versions: VOTING_VERSION_V2, + asset_lock_versions: DPP_ASSET_LOCK_VERSIONS_V1, + methods: DPP_METHOD_VERSIONS_V1, + factory_versions: DPP_FACTORY_VERSIONS_V1, }, + system_data_contracts: SYSTEM_DATA_CONTRACT_VERSIONS_V1, fee_version: FEE_VERSION1, - system_limits: SystemLimits { - estimated_contract_max_serialized_size: 16384, - max_field_value_size: 5120, //5 KiB - max_state_transition_size: 20480, //20 KiB - max_transitions_in_documents_batch: 1, - withdrawal_transactions_per_block_limit: 4, - retry_signing_expired_withdrawal_documents_per_block_limit: 1, - max_withdrawal_amount: 50_000_000_000_000, //500 Dash - }, + system_limits: SYSTEM_LIMITS_V1, consensus: ConsensusVersions { tenderdash_consensus_version: 1, }, From e0e152fa796b8d997dab22f63f94774f00114414 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 24 Oct 2024 15:21:43 +0700 Subject: [PATCH 76/90] fix(dapi): invalid state transition failed with already in chain error (#2270) --- .../tenderdash/requestTenderRpc.js | 55 +++++++++++++ .../broadcastStateTransitionHandlerFactory.js | 79 ++++++++++++++++--- .../platform/platformHandlersFactory.js | 4 + ...dcastStateTransitionHandlerFactory.spec.js | 78 +++++++++++++++++- 4 files changed, 206 insertions(+), 10 deletions(-) create mode 100644 packages/dapi/lib/externalApis/tenderdash/requestTenderRpc.js diff --git a/packages/dapi/lib/externalApis/tenderdash/requestTenderRpc.js b/packages/dapi/lib/externalApis/tenderdash/requestTenderRpc.js new file mode 100644 index 0000000000..efdec5962f --- /dev/null +++ b/packages/dapi/lib/externalApis/tenderdash/requestTenderRpc.js @@ -0,0 +1,55 @@ +const UnavailableGrpcError = require('@dashevo/grpc-common/lib/server/error/UnavailableGrpcError'); +const ResourceExhaustedGrpcError = require('@dashevo/grpc-common/lib/server/error/ResourceExhaustedGrpcError'); +const RPCError = require('../../rpcServer/RPCError'); + +/** + * @param {jaysonClient} rpcClient + * @return {requestTenderRpc} A function to make RPC requests to Tenderdash. + */ +function requestTenderRpcFactory(rpcClient) { + /** + * @function + * @typedef requestTenderRpc + * @param {string} uri + * @param {Object} [params={}] + * @return {Promise} + */ + async function requestTenderRpc(uri, params = {}) { + let response; + try { + response = await rpcClient.request(uri, params); + } catch (e) { + if (e.code === 'ECONNRESET' || e.message === 'socket hang up') { + throw new UnavailableGrpcError('Tenderdash is not available'); + } + + throw new RPCError( + e.code || -32602, + `Failed to request ${uri}: ${e.message}`, + e, + ); + } + + const { result, error: jsonRpcError } = response; + + if (jsonRpcError) { + if (typeof jsonRpcError.data === 'string') { + if (jsonRpcError.data.includes('too_many_resets')) { + throw new ResourceExhaustedGrpcError('tenderdash is not responding: too many requests'); + } + } + + throw new RPCError( + jsonRpcError.code || -32602, + jsonRpcError.message || 'Internal error', + jsonRpcError.data, + ); + } + + return result; + } + + return requestTenderRpc; +} + +module.exports = requestTenderRpcFactory; diff --git a/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js index ad77276042..a17d496918 100644 --- a/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js +++ b/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js @@ -2,9 +2,10 @@ const { server: { error: { InvalidArgumentGrpcError, - AlreadyExistsGrpcError, ResourceExhaustedGrpcError, UnavailableGrpcError, + AlreadyExistsGrpcError, + InternalGrpcError, }, }, } = require('@dashevo/grpc-common'); @@ -14,15 +15,23 @@ const { BroadcastStateTransitionResponse, }, } = require('@dashevo/dapi-grpc'); + +const crypto = require('crypto'); + const logger = require('../../../logger'); /** * @param {jaysonClient} rpcClient * @param {createGrpcErrorFromDriveResponse} createGrpcErrorFromDriveResponse + * @param {requestTenderRpc} requestTenderRpc * * @returns {broadcastStateTransitionHandler} */ -function broadcastStateTransitionHandlerFactory(rpcClient, createGrpcErrorFromDriveResponse) { +function broadcastStateTransitionHandlerFactory( + rpcClient, + createGrpcErrorFromDriveResponse, + requestTenderRpc, +) { /** * @typedef broadcastStateTransitionHandler * @@ -38,7 +47,9 @@ function broadcastStateTransitionHandlerFactory(rpcClient, createGrpcErrorFromDr throw new InvalidArgumentGrpcError('State Transition is not specified'); } - const tx = Buffer.from(stByteArray) + const stBytes = Buffer.from(stByteArray); + + const tx = stBytes .toString('base64'); let response; @@ -46,7 +57,7 @@ function broadcastStateTransitionHandlerFactory(rpcClient, createGrpcErrorFromDr try { response = await rpcClient.request('broadcast_tx', { tx }); } catch (e) { - if (e.message === 'socket hang up') { + if (e.code === 'ECONNRESET' || e.message === 'socket hang up') { throw new UnavailableGrpcError('Tenderdash is not available'); } @@ -55,15 +66,65 @@ function broadcastStateTransitionHandlerFactory(rpcClient, createGrpcErrorFromDr throw e; } - const { - result, - error: jsonRpcError, - } = response; + const { result, error: jsonRpcError } = response; if (jsonRpcError) { if (typeof jsonRpcError.data === 'string') { if (jsonRpcError.data === 'tx already exists in cache') { - throw new AlreadyExistsGrpcError('state transition already in chain'); + // We need to figure out and report to user why the ST cached + const stHash = crypto.createHash('sha256') + .update(stBytes) + .digest(); + + // TODO: Apply search filter to fetch specific state transition + // Throw an already exist in mempool error if the ST in mempool + const unconfirmedTxsResponse = await requestTenderRpc('unconfirmed_txs', { limit: 100 }); + + if (unconfirmedTxsResponse?.txs?.includes(stBytes.toString('base64'))) { + throw new AlreadyExistsGrpcError('state transition already in mempool'); + } + + // Throw an already exist in chain error if the ST is committed + let txResponse; + try { + txResponse = await requestTenderRpc('tx', { hash: stHash.toString('base64') }); + } catch (e) { + if (typeof e.data !== 'string' || !e.data.includes('not found')) { + throw e; + } + } + + if (txResponse?.tx_result) { + throw new AlreadyExistsGrpcError('state transition already in chain'); + } + + // If the ST not in mempool and not in the state but still in the cache + // it means it was invalidated by CheckTx so we run CheckTx again to provide + // the validation error + const checkTxResponse = await requestTenderRpc('check_tx', { tx }); + + if (checkTxResponse?.code !== 0) { + // Return validation error + throw await createGrpcErrorFromDriveResponse( + checkTxResponse.code, + checkTxResponse.info, + ); + } else { + // CheckTx passes for the ST, it means we have a bug in Drive so ST is passing check + // tx and then removed from the block. The removal from the block doesn't remove ST + // from the cache because it's happening only one proposer and other nodes do not know + // that this ST was processed and keep it in the cache + // The best what we can do is to return an internal error and and log the transaction + logger.warn({ + tx, + }, `State transition ${stHash.toString('hex')} is passing CheckTx but removed from the block by proposal`); + + const error = new Error('State Transition processing error. Please report' + + ' faulty state transition and try to create a new state transition with different' + + ' hash as a workaround.'); + + throw new InternalGrpcError(error); + } } if (jsonRpcError.data.startsWith('Tx too large.')) { diff --git a/packages/dapi/lib/grpcServer/handlers/platform/platformHandlersFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/platformHandlersFactory.js index 641071d357..8288583ab7 100644 --- a/packages/dapi/lib/grpcServer/handlers/platform/platformHandlersFactory.js +++ b/packages/dapi/lib/grpcServer/handlers/platform/platformHandlersFactory.js @@ -55,6 +55,7 @@ const waitForTransactionToBeProvableFactory = require('../../../externalApis/ten const waitForTransactionResult = require('../../../externalApis/tenderdash/waitForTransactionToBeProvable/waitForTransactionResult'); const getExistingTransactionResultFactory = require('../../../externalApis/tenderdash/waitForTransactionToBeProvable/getExistingTransactionResult'); const getConsensusParamsFactory = require('../../../externalApis/tenderdash/getConsensusParamsFactory'); +const requestTenderRpcFactory = require('../../../externalApis/tenderdash/requestTenderRpc'); /** * @param {jaysonClient} rpcClient @@ -73,10 +74,13 @@ function platformHandlersFactory( ) { const wrapInErrorHandler = wrapInErrorHandlerFactory(logger, isProductionEnvironment); + const requestTenderRpc = requestTenderRpcFactory(rpcClient); + // broadcastStateTransition const broadcastStateTransitionHandler = broadcastStateTransitionHandlerFactory( rpcClient, createGrpcErrorFromDriveResponse, + requestTenderRpc, ); const wrappedBroadcastStateTransition = jsonToProtobufHandlerWrapper( diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.spec.js index 3dc61b2eb4..de1152d015 100644 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.spec.js +++ b/packages/dapi/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.spec.js @@ -5,6 +5,7 @@ const { AlreadyExistsGrpcError, UnavailableGrpcError, ResourceExhaustedGrpcError, + InternalGrpcError, }, }, } = require('@dashevo/grpc-common'); @@ -36,6 +37,7 @@ describe('broadcastStateTransitionHandlerFactory', () => { let log; let code; let createGrpcErrorFromDriveResponseMock; + let requestTenderRpcMock; before(async () => { await loadWasmDpp(); @@ -82,11 +84,14 @@ describe('broadcastStateTransitionHandlerFactory', () => { request: this.sinon.stub().resolves(response), }; + requestTenderRpcMock = this.sinon.stub(); + createGrpcErrorFromDriveResponseMock = this.sinon.stub(); broadcastStateTransitionHandler = broadcastStateTransitionHandlerFactory( rpcClientMock, createGrpcErrorFromDriveResponseMock, + requestTenderRpcMock, ); }); @@ -182,13 +187,38 @@ describe('broadcastStateTransitionHandlerFactory', () => { } }); - it('should throw AlreadyExistsGrpcError if transaction was broadcasted twice', async () => { + it('should throw AlreadyExistsGrpcError if transaction in mempool', async () => { + response.error = { + code: -32603, + message: 'Internal error', + data: 'tx already exists in cache', + }; + + requestTenderRpcMock.withArgs('unconfirmed_txs').resolves({ + txs: [stateTransitionFixture.toBuffer().toString('base64')], + }); + + try { + await broadcastStateTransitionHandler(call); + + expect.fail('should throw AlreadyExistsGrpcError'); + } catch (e) { + expect(e).to.be.an.instanceOf(AlreadyExistsGrpcError); + expect(e.getMessage()).to.equal('state transition already in mempool'); + } + }); + + it('should throw AlreadyExistsGrpcError if transaction in chain', async () => { response.error = { code: -32603, message: 'Internal error', data: 'tx already exists in cache', }; + requestTenderRpcMock.withArgs('tx').resolves({ + tx_result: { }, + }); + try { await broadcastStateTransitionHandler(call); @@ -199,6 +229,52 @@ describe('broadcastStateTransitionHandlerFactory', () => { } }); + it('should throw consensus result for invalid transition in cache', async () => { + response.error = { + code: -32603, + message: 'Internal error', + data: 'tx already exists in cache', + }; + + requestTenderRpcMock.withArgs('check_tx').resolves({ + code: 1, + info: 'some info', + }); + + const error = new Error('some error'); + + createGrpcErrorFromDriveResponseMock.resolves(error); + + try { + await broadcastStateTransitionHandler(call); + + expect.fail('should throw consensus error'); + } catch (e) { + expect(e).to.equal(error); + } + }); + + it('should throw internal error for transition in cache that passing check tx', async () => { + response.error = { + code: -32603, + message: 'Internal error', + data: 'tx already exists in cache', + }; + + requestTenderRpcMock.withArgs('check_tx').resolves({ + code: 0, + }); + + try { + await broadcastStateTransitionHandler(call); + + expect.fail('should throw InternalError'); + } catch (e) { + expect(e).to.be.an.instanceOf(InternalGrpcError); + expect(e.getMessage()).to.equal('Internal error'); + } + }); + it('should throw a gRPC error based on drive\'s response', async () => { const message = 'not found'; const metadata = { From bbd08c6ed8fee113f050d7d47ca9b6676699a2fc Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 25 Oct 2024 18:35:31 +0700 Subject: [PATCH 77/90] fix(sdk): `AddressListError` is private (#2278) --- packages/rs-dapi-client/src/address_list.rs | 1 + packages/rs-dapi-client/src/lib.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/rs-dapi-client/src/address_list.rs b/packages/rs-dapi-client/src/address_list.rs index bf09b1af8c..e3da22ab52 100644 --- a/packages/rs-dapi-client/src/address_list.rs +++ b/packages/rs-dapi-client/src/address_list.rs @@ -79,6 +79,7 @@ impl Address { #[derive(Debug, thiserror::Error)] #[cfg_attr(feature = "mocks", derive(serde::Serialize, serde::Deserialize))] pub enum AddressListError { + /// Specified address not present in the list #[error("address {0} not found in the list")] AddressNotFound(#[cfg_attr(feature = "mocks", serde(with = "http_serde::uri"))] Uri), } diff --git a/packages/rs-dapi-client/src/lib.rs b/packages/rs-dapi-client/src/lib.rs index 760d9ce2e7..5251363fac 100644 --- a/packages/rs-dapi-client/src/lib.rs +++ b/packages/rs-dapi-client/src/lib.rs @@ -14,6 +14,7 @@ pub mod transport; pub use address_list::Address; pub use address_list::AddressList; +pub use address_list::AddressListError; pub use connection_pool::ConnectionPool; pub use dapi_client::DapiRequestExecutor; pub use dapi_client::{DapiClient, DapiClientError}; From b46b9a469d9549e6ae0fb575468bf84fba740836 Mon Sep 17 00:00:00 2001 From: pshenmic Date: Mon, 28 Oct 2024 18:09:34 +0700 Subject: [PATCH 78/90] fix: seed nodes aren't responding (#2276) --- .../configs/defaults/getMainnetConfigFactory.js | 5 +++++ .../configs/defaults/getTestnetConfigFactory.js | 5 +++++ .../configs/getConfigFileMigrationsFactory.js | 13 +++++++++++++ packages/js-dapi-client/lib/networkConfigs.js | 2 ++ 4 files changed, 25 insertions(+) diff --git a/packages/dashmate/configs/defaults/getMainnetConfigFactory.js b/packages/dashmate/configs/defaults/getMainnetConfigFactory.js index 0159941d2f..3c780168d5 100644 --- a/packages/dashmate/configs/defaults/getMainnetConfigFactory.js +++ b/packages/dashmate/configs/defaults/getMainnetConfigFactory.js @@ -53,6 +53,11 @@ export default function getMainnetConfigFactory(homeDir, getBaseConfig) { host: '152.42.151.147', port: 26656, }, + { + id: 'fdc2239c1e0e62f3a192823d6e068d012620a2d1', + host: 'seed-1.pshenmic.dev', + port: 26656, + }, ], }, mempool: { diff --git a/packages/dashmate/configs/defaults/getTestnetConfigFactory.js b/packages/dashmate/configs/defaults/getTestnetConfigFactory.js index 3558c1daa4..3422ad2438 100644 --- a/packages/dashmate/configs/defaults/getTestnetConfigFactory.js +++ b/packages/dashmate/configs/defaults/getTestnetConfigFactory.js @@ -86,6 +86,11 @@ export default function getTestnetConfigFactory(homeDir, getBaseConfig) { host: '35.92.64.72', port: 36656, }, + { + id: 'de3a73fc78e5c828151454156b492e4a2d985849', + host: 'seed-1.pshenmic.dev', + port: 36656, + }, ], port: 36656, }, diff --git a/packages/dashmate/configs/getConfigFileMigrationsFactory.js b/packages/dashmate/configs/getConfigFileMigrationsFactory.js index 2620636325..862f3abee3 100644 --- a/packages/dashmate/configs/getConfigFileMigrationsFactory.js +++ b/packages/dashmate/configs/getConfigFileMigrationsFactory.js @@ -1019,6 +1019,19 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) }); return configFile; }, + '1.5.0': (configFile) => { + Object.entries(configFile.configs) + .forEach(([name, options]) => { + if (options.network === NETWORK_MAINNET && name !== 'base') { + options.platform.drive.tenderdash.p2p.seeds = mainnet.get('platform.drive.tenderdash.p2p.seeds'); + } + + if (options.network === NETWORK_TESTNET && name !== 'base') { + options.platform.drive.tenderdash.p2p.seeds = testnet.get('platform.drive.tenderdash.p2p.seeds'); + } + }); + return configFile; + }, }; } diff --git a/packages/js-dapi-client/lib/networkConfigs.js b/packages/js-dapi-client/lib/networkConfigs.js index 4bc7c83213..4400daa8d1 100644 --- a/packages/js-dapi-client/lib/networkConfigs.js +++ b/packages/js-dapi-client/lib/networkConfigs.js @@ -6,6 +6,7 @@ module.exports = { 'seed-3.testnet.networks.dash.org:1443', 'seed-4.testnet.networks.dash.org:1443', 'seed-5.testnet.networks.dash.org:1443', + 'seed-1.pshenmic.dev:1443', ], network: 'testnet', // Since we don't have PoSe atm, 3rd party masternodes sometimes provide wrong data @@ -57,6 +58,7 @@ module.exports = { 'seed-2.mainnet.networks.dash.org', 'seed-3.mainnet.networks.dash.org', 'seed-4.mainnet.networks.dash.org', + 'seed-1.pshenmic.dev', ], network: 'mainnet', }, From 3cd411fd6cbd363cc60bb53c3b17c15de23bbb8a Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 28 Oct 2024 20:05:35 +0700 Subject: [PATCH 79/90] fix: document query start to support pagination (#2284) Co-authored-by: Ivan Shumkov --- .../src/query/document_query/v0/mod.rs | 1096 ++++++++++++++++- packages/rs-drive-abci/src/query/mod.rs | 44 +- packages/rs-drive/src/query/mod.rs | 169 ++- .../verify_proof_keep_serialized/v0/mod.rs | 1 + packages/rs-drive/tests/query_tests.rs | 4 +- .../rs-sdk/src/platform/document_query.rs | 26 +- 6 files changed, 1323 insertions(+), 17 deletions(-) diff --git a/packages/rs-drive-abci/src/query/document_query/v0/mod.rs b/packages/rs-drive-abci/src/query/document_query/v0/mod.rs index 8af82e39cc..d4177878bc 100644 --- a/packages/rs-drive-abci/src/query/document_query/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/document_query/v0/mod.rs @@ -180,9 +180,20 @@ impl Platform { #[cfg(test)] mod tests { use super::*; - use crate::query::tests::{assert_invalid_identifier, setup_platform, store_data_contract}; + use crate::query::tests::{ + assert_invalid_identifier, setup_platform, store_data_contract, store_document, + }; + use assert_matches::assert_matches; + use ciborium::value::Value as CborValue; use dpp::dashcore::Network; + use dpp::data_contract::document_type::random_document::CreateRandomDocument; + use dpp::document::{Document, DocumentV0, DocumentV0Getters}; use dpp::tests::fixtures::get_data_contract_fixture; + use drive::query::{InternalClauses, OrderClause, WhereClause, WhereOperator}; + use indexmap::IndexMap; + use rand::rngs::StdRng; + use rand::SeedableRng; + use std::collections::BTreeMap; #[test] fn test_invalid_document_id() { @@ -479,4 +490,1087 @@ mod tests { }) )); } + + #[test] + fn test_documents_single_item_proof() { + let (platform, state, version) = setup_platform(None, Network::Testnet, None); + + let platform_version = PlatformVersion::latest(); + let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); + store_data_contract(&platform, created_data_contract.data_contract(), version); + + let data_contract_id = created_data_contract.data_contract().id(); + let document_type_name = "niceDocument"; + let document_type = created_data_contract + .data_contract() + .document_type_for_name(document_type_name) + .expect("expected document type"); + + let random_document = document_type + .random_document(Some(4), platform_version) + .expect("expected to get random document"); + + store_document( + &platform, + created_data_contract.data_contract(), + document_type, + &random_document, + platform_version, + ); + + let drive_document_query = DriveDocumentQuery { + contract: &created_data_contract.data_contract(), + document_type, + internal_clauses: Default::default(), + offset: None, + limit: Some(1), + order_by: Default::default(), + start_at: None, + start_at_included: false, + block_time_ms: None, + }; + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type_name.to_string(), + r#where: vec![], + limit: 1, + order_by: vec![], + prove: true, + start: None, + }; + + let result = platform + .query_documents_v0(request, &state, version) + .expect("expected query to succeed"); + + let Some(GetDocumentsResponseV0 { + result: Some(get_documents_response_v0::Result::Proof(proof)), + metadata: Some(_), + }) = result.data + else { + panic!("expected proof") + }; + + let (_, documents) = drive_document_query + .verify_proof(&proof.grovedb_proof, platform_version) + .expect("expected to verify proof"); + + assert_eq!(documents.len(), 1); + assert_eq!(documents.get(0).expect("first"), &random_document); + } + + #[test] + fn test_documents_range_proof() { + let (platform, state, version) = setup_platform(None, Network::Testnet, None); + + let platform_version = PlatformVersion::latest(); + let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); + store_data_contract(&platform, created_data_contract.data_contract(), version); + + let data_contract_id = created_data_contract.data_contract().id(); + let document_type_name = "niceDocument"; + let document_type = created_data_contract + .data_contract() + .document_type_for_name(document_type_name) + .expect("expected document type"); + + let mut std_rng = StdRng::seed_from_u64(393); + let mut documents_by_id = BTreeMap::new(); + for _i in 0..20 { + let random_document = document_type + .random_document_with_rng(&mut std_rng, platform_version) + .expect("expected to get random document"); + store_document( + &platform, + created_data_contract.data_contract(), + document_type, + &random_document, + platform_version, + ); + documents_by_id.insert(random_document.id(), random_document); + } + + let drive_document_query = DriveDocumentQuery { + contract: &created_data_contract.data_contract(), + document_type, + internal_clauses: Default::default(), + offset: None, + limit: Some(10), + order_by: Default::default(), + start_at: None, + start_at_included: false, + block_time_ms: None, + }; + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type_name.to_string(), + r#where: vec![], + limit: 10, + order_by: vec![], + prove: true, + start: None, + }; + + let result = platform + .query_documents_v0(request, &state, version) + .expect("expected query to succeed"); + + let Some(GetDocumentsResponseV0 { + result: Some(get_documents_response_v0::Result::Proof(proof)), + metadata: Some(_), + }) = result.data + else { + panic!("expected proof") + }; + + let (_, queried_documents) = drive_document_query + .verify_proof(&proof.grovedb_proof, platform_version) + .expect("expected to verify proof"); + + assert_eq!(queried_documents.len(), 10); + assert_eq!( + queried_documents.get(9).expect("first"), + documents_by_id + .values() + .nth(9) + .expect("expected to get 9th document") + ); + } + + #[test] + fn test_documents_start_after_proof_primary_index() { + let (platform, state, version) = setup_platform(None, Network::Testnet, None); + + let platform_version = PlatformVersion::latest(); + let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); + store_data_contract(&platform, created_data_contract.data_contract(), version); + + let data_contract_id = created_data_contract.data_contract().id(); + let document_type_name = "niceDocument"; + let document_type = created_data_contract + .data_contract() + .document_type_for_name(document_type_name) + .expect("expected document type"); + + let mut std_rng = StdRng::seed_from_u64(393); + let mut documents_by_id = BTreeMap::new(); + for _i in 0..20 { + let random_document = document_type + .random_document_with_rng(&mut std_rng, platform_version) + .expect("expected to get random document"); + store_document( + &platform, + created_data_contract.data_contract(), + document_type, + &random_document, + platform_version, + ); + documents_by_id.insert(random_document.id(), random_document); + } + + let after = documents_by_id + .keys() + .nth(9) + .expect("expected to get 9th document") + .to_buffer(); + + let drive_document_query = DriveDocumentQuery { + contract: &created_data_contract.data_contract(), + document_type, + internal_clauses: Default::default(), + offset: None, + limit: Some(10), + order_by: Default::default(), + start_at: Some(after), + start_at_included: false, + block_time_ms: None, + }; + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type_name.to_string(), + r#where: vec![], + limit: 10, + order_by: vec![], + prove: true, + start: Some(Start::StartAfter(after.to_vec())), + }; + + let result = platform + .query_documents_v0(request, &state, version) + .expect("expected query to succeed"); + + let Some(GetDocumentsResponseV0 { + result: Some(get_documents_response_v0::Result::Proof(proof)), + metadata: Some(_), + }) = result.data + else { + panic!("expected proof") + }; + + let (_, queried_documents) = drive_document_query + .verify_proof(&proof.grovedb_proof, platform_version) + .expect("expected to verify proof"); + + assert_eq!(queried_documents.len(), 10); + assert_eq!( + queried_documents.get(9).expect("last"), + documents_by_id + .values() + .nth(19) + .expect("expected to get 9th document") + ); + } + + fn serialize_vec_to_cbor>(input: Vec) -> Result, Error> { + let values = Value::Array( + input + .into_iter() + .map(|v| v.into() as Value) + .collect::>(), + ); + + let cbor_values: CborValue = TryInto::::try_into(values) + .map_err(|e| Error::Protocol(dpp::ProtocolError::EncodingError(e.to_string())))?; + + let mut serialized = Vec::new(); + ciborium::ser::into_writer(&cbor_values, &mut serialized) + .map_err(|e| Error::Protocol(dpp::ProtocolError::EncodingError(e.to_string())))?; + + Ok(serialized) + } + + #[test] + fn test_documents_start_after_proof_secondary_index() { + let (platform, state, version) = setup_platform(Some((1, 1)), Network::Testnet, None); + + let platform_version = PlatformVersion::latest(); + let withdrawals = platform + .drive + .cache + .system_data_contracts + .load_withdrawals(); + + let data_contract_id = withdrawals.id(); + let document_type_name = "withdrawal"; + let document_type = withdrawals + .document_type_for_name(document_type_name) + .expect("expected document type"); + + let mut std_rng = StdRng::seed_from_u64(393); + let mut documents_by_created_at = BTreeMap::new(); + + // Define the base time as the current system time + let base_time = 1730028481000; + + for i in 0..20 { + let created_at = base_time + i * 20000; + // Create a Document with the desired properties + let random_document: Document = DocumentV0 { + id: Identifier::random_with_rng(&mut std_rng), + owner_id: Identifier::random_with_rng(&mut std_rng), + properties: { + let mut properties = BTreeMap::new(); + properties.insert("status".to_string(), Value::I64(0)); // Always queued + properties.insert("pooling".to_string(), Value::I64(0)); // Always 0 + properties.insert("coreFeePerByte".to_string(), Value::I64(1)); // Always 1 + properties.insert("amount".to_string(), Value::I64(1000)); // Set a minimum amount of 1000 + properties.insert("outputScript".to_string(), Value::Bytes(vec![])); // Set an empty output script + properties + }, + revision: Some(1), // Example revision + created_at: Some(created_at), // Set created_at + updated_at: Some(created_at), // Set updated_at + transferred_at: None, + created_at_block_height: None, + updated_at_block_height: None, + transferred_at_block_height: None, + created_at_core_block_height: None, + updated_at_core_block_height: None, + transferred_at_core_block_height: None, + } + .into(); + store_document( + &platform, + &withdrawals, + document_type, + &random_document, + platform_version, + ); + documents_by_created_at.insert(created_at, random_document); + } + + let after = documents_by_created_at + .values() + .nth(9) + .expect("expected to get 9th document") + .id(); + + let drive_document_query = DriveDocumentQuery { + contract: &withdrawals, + document_type, + internal_clauses: InternalClauses { + primary_key_in_clause: None, + primary_key_equal_clause: None, + in_clause: None, + range_clause: None, + equal_clauses: BTreeMap::from([ + ( + "status".to_string(), + WhereClause { + field: "status".to_string(), + operator: WhereOperator::Equal, + value: Value::I64(0), + }, + ), + ( + "pooling".to_string(), + WhereClause { + field: "pooling".to_string(), + operator: WhereOperator::Equal, + value: Value::I64(0), + }, + ), + ( + "coreFeePerByte".to_string(), + WhereClause { + field: "coreFeePerByte".to_string(), + operator: WhereOperator::Equal, + value: Value::I64(1), + }, + ), + ]), + }, + offset: None, + limit: Some(10), + order_by: IndexMap::from([( + "$updatedAt".to_string(), + OrderClause { + field: "$updatedAt".to_string(), + ascending: true, + }, + )]), + start_at: Some(after.to_buffer()), + start_at_included: false, + block_time_ms: None, + }; + + let where_clauses = serialize_vec_to_cbor( + drive_document_query + .internal_clauses + .equal_clauses + .values() + .cloned() + .collect(), + ) + .expect("where clauses serialization should never fail"); + let order_by = + serialize_vec_to_cbor(drive_document_query.order_by.values().cloned().collect()) + .expect("order by clauses serialization should never fail"); + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type_name.to_string(), + r#where: where_clauses, + limit: 10, + order_by, + prove: true, + start: Some(Start::StartAfter(after.to_vec())), + }; + + let result = platform + .query_documents_v0(request, &state, version) + .expect("expected query to succeed"); + + let Some(GetDocumentsResponseV0 { + result: Some(get_documents_response_v0::Result::Proof(proof)), + metadata: Some(_), + }) = result.data + else { + panic!("expected proof") + }; + + let (_, queried_documents) = drive_document_query + .verify_proof(&proof.grovedb_proof, platform_version) + .expect("expected to verify proof"); + + assert_eq!(queried_documents.len(), 10); + assert_eq!( + queried_documents.get(9).expect("last"), + documents_by_created_at + .values() + .nth(19) + .expect("expected to get 9th document") + ); + } + + #[test] + fn test_documents_start_after_proof_secondary_index_many_statuses() { + let (platform, state, version) = setup_platform(Some((1, 1)), Network::Testnet, None); + + let platform_version = PlatformVersion::latest(); + let withdrawals = platform + .drive + .cache + .system_data_contracts + .load_withdrawals(); + + let data_contract_id = withdrawals.id(); + let document_type_name = "withdrawal"; + let document_type = withdrawals + .document_type_for_name(document_type_name) + .expect("expected document type"); + + let mut std_rng = StdRng::seed_from_u64(393); + let mut documents_by_created_at = BTreeMap::new(); + + // Define the base time as the current system time + let base_time = 1730028481000; + + for i in 0..20 { + let created_at = base_time + i * 20000; + // Create a Document with the desired properties + let random_document: Document = DocumentV0 { + id: Identifier::random_with_rng(&mut std_rng), + owner_id: Identifier::random_with_rng(&mut std_rng), + properties: { + let mut properties = BTreeMap::new(); + properties.insert("status".to_string(), Value::I64(i as i64 % 4)); // Always queued + properties.insert("pooling".to_string(), Value::I64(0)); // Always 0 + properties.insert("coreFeePerByte".to_string(), Value::I64(1)); // Always 1 + properties.insert("amount".to_string(), Value::I64(1000)); // Set a minimum amount of 1000 + properties.insert("outputScript".to_string(), Value::Bytes(vec![])); // Set an empty output script + properties + }, + revision: Some(1), // Example revision + created_at: Some(created_at), // Set created_at + updated_at: Some(created_at), // Set updated_at + transferred_at: None, + created_at_block_height: None, + updated_at_block_height: None, + transferred_at_block_height: None, + created_at_core_block_height: None, + updated_at_core_block_height: None, + transferred_at_core_block_height: None, + } + .into(); + store_document( + &platform, + &withdrawals, + document_type, + &random_document, + platform_version, + ); + documents_by_created_at.insert(created_at, random_document); + } + + let after = documents_by_created_at + .values() + .nth(9) + .expect("expected to get 9th document") + .id(); + + let drive_document_query = DriveDocumentQuery { + contract: &withdrawals, + document_type, + internal_clauses: InternalClauses { + primary_key_in_clause: None, + primary_key_equal_clause: None, + in_clause: None, + range_clause: None, + equal_clauses: BTreeMap::from([ + ( + "status".to_string(), + WhereClause { + field: "status".to_string(), + operator: WhereOperator::Equal, + value: Value::I64(0), + }, + ), + ( + "pooling".to_string(), + WhereClause { + field: "pooling".to_string(), + operator: WhereOperator::Equal, + value: Value::I64(0), + }, + ), + ( + "coreFeePerByte".to_string(), + WhereClause { + field: "coreFeePerByte".to_string(), + operator: WhereOperator::Equal, + value: Value::I64(1), + }, + ), + ]), + }, + offset: None, + limit: Some(3), + order_by: IndexMap::from([( + "$updatedAt".to_string(), + OrderClause { + field: "$updatedAt".to_string(), + ascending: true, + }, + )]), + start_at: Some(after.to_buffer()), + start_at_included: false, + block_time_ms: None, + }; + + let where_clauses = serialize_vec_to_cbor( + drive_document_query + .internal_clauses + .equal_clauses + .values() + .cloned() + .collect(), + ) + .expect("where clauses serialization should never fail"); + let order_by = + serialize_vec_to_cbor(drive_document_query.order_by.values().cloned().collect()) + .expect("order by clauses serialization should never fail"); + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type_name.to_string(), + r#where: where_clauses, + limit: 3, + order_by, + prove: true, + start: Some(Start::StartAfter(after.to_vec())), + }; + + let result = platform + .query_documents_v0(request, &state, version) + .expect("expected query to succeed"); + + let Some(GetDocumentsResponseV0 { + result: Some(get_documents_response_v0::Result::Proof(proof)), + metadata: Some(_), + }) = result.data + else { + panic!("expected proof") + }; + + let (_, queried_documents) = drive_document_query + .verify_proof(&proof.grovedb_proof, platform_version) + .expect("expected to verify proof"); + + assert_eq!(queried_documents.len(), 2); + assert_eq!( + queried_documents.get(1).expect("last"), + documents_by_created_at + .values() + .nth(16) + .expect("expected to get 2nd document") + ); + } + + #[test] + fn test_documents_proof_secondary_index_in_query() { + let (platform, state, version) = setup_platform(Some((1, 1)), Network::Testnet, None); + + let platform_version = PlatformVersion::latest(); + let withdrawals = platform + .drive + .cache + .system_data_contracts + .load_withdrawals(); + + let data_contract_id = withdrawals.id(); + let document_type_name = "withdrawal"; + let document_type = withdrawals + .document_type_for_name(document_type_name) + .expect("expected document type"); + + let mut std_rng = StdRng::seed_from_u64(393); + let mut documents_by_id = BTreeMap::new(); + + // Define the base time as the current system time + let base_time = 1730028481000; + + for i in 0..20 { + let created_at = base_time + i * 20000; + // Create a Document with the desired properties + let random_document: Document = DocumentV0 { + id: Identifier::random_with_rng(&mut std_rng), + owner_id: Identifier::random_with_rng(&mut std_rng), + properties: { + let mut properties = BTreeMap::new(); + properties.insert("status".to_string(), Value::I64(i as i64 % 4)); // Always queued + properties.insert("pooling".to_string(), Value::I64(0)); // Always 0 + properties.insert("coreFeePerByte".to_string(), Value::I64(1)); // Always 1 + properties.insert("amount".to_string(), Value::I64(1000)); // Set a minimum amount of 1000 + properties.insert("outputScript".to_string(), Value::Bytes(vec![])); // Set an empty output script + properties + }, + revision: Some(1), // Example revision + created_at: Some(created_at), // Set created_at + updated_at: Some(created_at), // Set updated_at + transferred_at: None, + created_at_block_height: None, + updated_at_block_height: None, + transferred_at_block_height: None, + created_at_core_block_height: None, + updated_at_core_block_height: None, + transferred_at_core_block_height: None, + } + .into(); + store_document( + &platform, + &withdrawals, + document_type, + &random_document, + platform_version, + ); + documents_by_id.insert(random_document.id(), random_document); + } + + let drive_document_query = DriveDocumentQuery { + contract: &withdrawals, + document_type, + internal_clauses: InternalClauses { + primary_key_in_clause: None, + primary_key_equal_clause: None, + in_clause: Some(WhereClause { + field: "status".to_string(), + operator: WhereOperator::In, + value: Value::Array(vec![ + Value::I64(0), + Value::I64(1), + Value::I64(2), + Value::I64(3), + Value::I64(4), + ]), + }), + range_clause: None, + equal_clauses: BTreeMap::default(), + }, + offset: None, + limit: Some(3), + order_by: IndexMap::from([ + ( + "status".to_string(), + OrderClause { + field: "status".to_string(), + ascending: true, + }, + ), + ( + "transactionIndex".to_string(), + OrderClause { + field: "transactionIndex".to_string(), + ascending: true, + }, + ), + ]), + start_at: None, + start_at_included: false, + block_time_ms: None, + }; + + let mut where_clauses: Vec<_> = drive_document_query + .internal_clauses + .equal_clauses + .values() + .cloned() + .collect(); + + where_clauses.insert( + 0, + drive_document_query + .internal_clauses + .in_clause + .clone() + .unwrap(), + ); + + let where_clauses_serialized = serialize_vec_to_cbor(where_clauses) + .expect("where clauses serialization should never fail"); + let order_by = + serialize_vec_to_cbor(drive_document_query.order_by.values().cloned().collect()) + .expect("order by clauses serialization should never fail"); + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type_name.to_string(), + r#where: where_clauses_serialized, + limit: 3, + order_by, + prove: true, + start: None, + }; + + let result = platform + .query_documents_v0(request, &state, version) + .expect("expected query to succeed"); + + assert!(result.errors.is_empty(), "errors are {:?}", result.errors); + + let Some(GetDocumentsResponseV0 { + result: Some(get_documents_response_v0::Result::Proof(proof)), + metadata: Some(_), + }) = result.data + else { + panic!("expected proof") + }; + + let (_, queried_documents) = drive_document_query + .verify_proof(&proof.grovedb_proof, platform_version) + .expect("expected to verify proof"); + + assert_eq!(queried_documents.len(), 3); + } + + #[test] + fn test_documents_start_after_proof_secondary_index_in_query() { + let (platform, state, version) = setup_platform(Some((1, 1)), Network::Testnet, None); + + let platform_version = PlatformVersion::latest(); + let withdrawals = platform + .drive + .cache + .system_data_contracts + .load_withdrawals(); + + let data_contract_id = withdrawals.id(); + let document_type_name = "withdrawal"; + let document_type = withdrawals + .document_type_for_name(document_type_name) + .expect("expected document type"); + + let mut std_rng = StdRng::seed_from_u64(393); + let mut documents_by_created_at = BTreeMap::new(); + + // Define the base time as the current system time + let base_time = 1730028481000; + + for i in 0..20 { + let created_at = base_time + i * 20000; + // Create a Document with the desired properties + let random_document: Document = DocumentV0 { + id: Identifier::random_with_rng(&mut std_rng), + owner_id: Identifier::random_with_rng(&mut std_rng), + properties: { + let mut properties = BTreeMap::new(); + properties.insert("status".to_string(), Value::I64(i as i64 % 4)); // Always queued + properties.insert("pooling".to_string(), Value::I64(0)); // Always 0 + properties.insert("coreFeePerByte".to_string(), Value::I64(1)); // Always 1 + properties.insert("amount".to_string(), Value::I64(1000)); // Set a minimum amount of 1000 + properties.insert("outputScript".to_string(), Value::Bytes(vec![])); // Set an empty output script + properties + }, + revision: Some(1), // Example revision + created_at: Some(created_at), // Set created_at + updated_at: Some(created_at), // Set updated_at + transferred_at: None, + created_at_block_height: None, + updated_at_block_height: None, + transferred_at_block_height: None, + created_at_core_block_height: None, + updated_at_core_block_height: None, + transferred_at_core_block_height: None, + } + .into(); + store_document( + &platform, + &withdrawals, + document_type, + &random_document, + platform_version, + ); + documents_by_created_at.insert(created_at, random_document); + } + + let after = documents_by_created_at + .values() + .nth(4) + .expect("expected to get 9th document") + .id(); + + let drive_document_query = DriveDocumentQuery { + contract: &withdrawals, + document_type, + internal_clauses: InternalClauses { + primary_key_in_clause: None, + primary_key_equal_clause: None, + in_clause: Some(WhereClause { + field: "status".to_string(), + operator: WhereOperator::In, + value: Value::Array(vec![ + Value::I64(0), + Value::I64(1), + Value::I64(2), + Value::I64(3), + Value::I64(4), + ]), + }), + range_clause: None, + equal_clauses: BTreeMap::default(), + }, + offset: None, + limit: Some(3), + order_by: IndexMap::from([ + ( + "status".to_string(), + OrderClause { + field: "status".to_string(), + ascending: true, + }, + ), + ( + "transactionIndex".to_string(), + OrderClause { + field: "transactionIndex".to_string(), + ascending: true, + }, + ), + ]), + start_at: Some(after.to_buffer()), + start_at_included: false, + block_time_ms: None, + }; + + let mut where_clauses: Vec<_> = drive_document_query + .internal_clauses + .equal_clauses + .values() + .cloned() + .collect(); + + where_clauses.insert( + 0, + drive_document_query + .internal_clauses + .in_clause + .clone() + .unwrap(), + ); + + let where_clauses_serialized = serialize_vec_to_cbor(where_clauses) + .expect("where clauses serialization should never fail"); + let order_by = + serialize_vec_to_cbor(drive_document_query.order_by.values().cloned().collect()) + .expect("order by clauses serialization should never fail"); + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type_name.to_string(), + r#where: where_clauses_serialized, + limit: 3, + order_by, + prove: true, + start: Some(Start::StartAfter(after.to_vec())), + }; + + let result = platform + .query_documents_v0(request, &state, version) + .expect("expected query to succeed"); + + assert!(result.errors.is_empty(), "errors are {:?}", result.errors); + + let Some(GetDocumentsResponseV0 { + result: Some(get_documents_response_v0::Result::Proof(proof)), + metadata: Some(_), + }) = result.data + else { + panic!("expected proof") + }; + + let (_, queried_documents) = drive_document_query + .verify_proof(&proof.grovedb_proof, platform_version) + .expect("expected to verify proof"); + + assert_eq!(queried_documents.len(), 3); + assert_eq!( + queried_documents.get(1).expect("last"), + documents_by_created_at + .values() + .nth(16) + .expect("expected to get 2nd document") + ); + } + + //todo: this should be possible + #[test] + #[ignore] + fn test_documents_start_after_proof_secondary_index_in_query_2() { + let (platform, state, version) = setup_platform(Some((1, 1)), Network::Testnet, None); + + let platform_version = PlatformVersion::latest(); + let withdrawals = platform + .drive + .cache + .system_data_contracts + .load_withdrawals(); + + let data_contract_id = withdrawals.id(); + let document_type_name = "withdrawal"; + let document_type = withdrawals + .document_type_for_name(document_type_name) + .expect("expected document type"); + + let mut std_rng = StdRng::seed_from_u64(393); + let mut documents_by_created_at = BTreeMap::new(); + + // Define the base time as the current system time + let base_time = 1730028481000; + + for i in 0..20 { + let created_at = base_time + i * 20000; + // Create a Document with the desired properties + let random_document: Document = DocumentV0 { + id: Identifier::random_with_rng(&mut std_rng), + owner_id: Identifier::random_with_rng(&mut std_rng), + properties: { + let mut properties = BTreeMap::new(); + properties.insert("status".to_string(), Value::I64(i as i64 % 4)); // Always queued + properties.insert("pooling".to_string(), Value::I64(0)); // Always 0 + properties.insert("coreFeePerByte".to_string(), Value::I64(1)); // Always 1 + properties.insert("amount".to_string(), Value::I64(1000)); // Set a minimum amount of 1000 + properties.insert("outputScript".to_string(), Value::Bytes(vec![])); // Set an empty output script + properties + }, + revision: Some(1), // Example revision + created_at: Some(created_at), // Set created_at + updated_at: Some(created_at), // Set updated_at + transferred_at: None, + created_at_block_height: None, + updated_at_block_height: None, + transferred_at_block_height: None, + created_at_core_block_height: None, + updated_at_core_block_height: None, + transferred_at_core_block_height: None, + } + .into(); + store_document( + &platform, + &withdrawals, + document_type, + &random_document, + platform_version, + ); + documents_by_created_at.insert(created_at, random_document); + } + + let after = documents_by_created_at + .values() + .nth(9) + .expect("expected to get 9th document") + .id(); + + let drive_document_query = DriveDocumentQuery { + contract: &withdrawals, + document_type, + internal_clauses: InternalClauses { + primary_key_in_clause: None, + primary_key_equal_clause: None, + in_clause: Some(WhereClause { + field: "status".to_string(), + operator: WhereOperator::In, + value: Value::Array(vec![ + Value::I64(0), + Value::I64(1), + Value::I64(2), + Value::I64(3), + Value::I64(4), + ]), + }), + range_clause: None, + equal_clauses: BTreeMap::from([ + ( + "pooling".to_string(), + WhereClause { + field: "pooling".to_string(), + operator: WhereOperator::Equal, + value: Value::I64(0), + }, + ), + ( + "coreFeePerByte".to_string(), + WhereClause { + field: "coreFeePerByte".to_string(), + operator: WhereOperator::Equal, + value: Value::I64(1), + }, + ), + ]), + }, + offset: None, + limit: Some(3), + order_by: IndexMap::from([( + "$updatedAt".to_string(), + OrderClause { + field: "$updatedAt".to_string(), + ascending: true, + }, + )]), + start_at: Some(after.to_buffer()), + start_at_included: false, + block_time_ms: None, + }; + + let mut where_clauses: Vec<_> = drive_document_query + .internal_clauses + .equal_clauses + .values() + .cloned() + .collect(); + + where_clauses.insert( + 0, + drive_document_query + .internal_clauses + .in_clause + .clone() + .unwrap(), + ); + + let where_clauses_serialized = serialize_vec_to_cbor(where_clauses) + .expect("where clauses serialization should never fail"); + let order_by = + serialize_vec_to_cbor(drive_document_query.order_by.values().cloned().collect()) + .expect("order by clauses serialization should never fail"); + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type_name.to_string(), + r#where: where_clauses_serialized, + limit: 3, + order_by, + prove: true, + start: Some(Start::StartAfter(after.to_vec())), + }; + + let result = platform + .query_documents_v0(request, &state, version) + .expect("expected query to succeed"); + + assert!(result.errors.is_empty(), "errors are {:?}", result.errors); + + let Some(GetDocumentsResponseV0 { + result: Some(get_documents_response_v0::Result::Proof(proof)), + metadata: Some(_), + }) = result.data + else { + panic!("expected proof") + }; + + let (_, queried_documents) = drive_document_query + .verify_proof(&proof.grovedb_proof, platform_version) + .expect("expected to verify proof"); + + assert_eq!(queried_documents.len(), 2); + assert_eq!( + queried_documents.get(1).expect("last"), + documents_by_created_at + .values() + .nth(16) + .expect("expected to get 2nd document") + ); + } } diff --git a/packages/rs-drive-abci/src/query/mod.rs b/packages/rs-drive-abci/src/query/mod.rs index a7d58c7358..6be97cc1cf 100644 --- a/packages/rs-drive-abci/src/query/mod.rs +++ b/packages/rs-drive-abci/src/query/mod.rs @@ -32,9 +32,15 @@ pub(crate) mod tests { use crate::config::PlatformConfig; use dpp::dashcore::Network; + use dpp::data_contract::document_type::DocumentTypeRef; + use dpp::document::Document; use dpp::prelude::{CoreBlockHeight, TimestampMillis}; - use drive::util::batch::DataContractOperationType; - use drive::util::batch::DriveOperation::DataContractOperation; + use drive::util::batch::DriveOperation::{DataContractOperation, DocumentOperation}; + use drive::util::batch::{DataContractOperationType, DocumentOperationType}; + use drive::util::object_size_info::{ + DataContractInfo, DocumentInfo, DocumentTypeInfo, OwnedDocumentInfo, + }; + use drive::util::storage_flags::StorageFlags; use platform_version::version::{PlatformVersion, ProtocolVersion}; use std::borrow::Cow; use std::sync::Arc; @@ -108,6 +114,40 @@ pub(crate) mod tests { .expect("expected to apply drive operations"); } + pub fn store_document( + platform: &Platform, + data_contract: &DataContract, + document_type: DocumentTypeRef, + document: &Document, + platform_version: &PlatformVersion, + ) { + let storage_flags = Some(Cow::Owned(StorageFlags::SingleEpoch(0))); + + let operation = DocumentOperation(DocumentOperationType::AddDocument { + owned_document_info: OwnedDocumentInfo { + document_info: DocumentInfo::DocumentRefInfo((document, storage_flags)), + owner_id: None, + }, + contract_info: DataContractInfo::BorrowedDataContract(data_contract), + document_type_info: DocumentTypeInfo::DocumentTypeRef(document_type), + override_document: false, + }); + + let block_info = BlockInfo::genesis(); + + platform + .drive + .apply_drive_operations( + vec![operation], + true, + &block_info, + None, + platform_version, + None, + ) + .expect("expected to apply drive operations"); + } + pub fn assert_invalid_identifier( validation_result: QueryValidationResult, ) { diff --git a/packages/rs-drive/src/query/mod.rs b/packages/rs-drive/src/query/mod.rs index 1d7cf24371..7491454a64 100644 --- a/packages/rs-drive/src/query/mod.rs +++ b/packages/rs-drive/src/query/mod.rs @@ -1275,23 +1275,39 @@ impl<'a> DriveDocumentQuery<'a> { #[cfg(any(feature = "server", feature = "verify"))] /// Returns a `Query` that either starts at or after the given key. fn inner_query_starts_from_key( - start_at_key: Vec, + start_at_key: Option>, left_to_right: bool, included: bool, ) -> Query { // We only need items after the start at document let mut inner_query = Query::new_with_direction(left_to_right); + if left_to_right { - if included { - inner_query.insert_range_from(start_at_key..); + if let Some(start_at_key) = start_at_key { + if included { + inner_query.insert_range_from(start_at_key..); + } else { + inner_query.insert_range_after(start_at_key..); + } } else { - inner_query.insert_range_after(start_at_key..); + inner_query.insert_all(); } } else if included { - inner_query.insert_range_to_inclusive(..=start_at_key); + if let Some(start_at_key) = start_at_key { + inner_query.insert_range_to_inclusive(..=start_at_key); + } else { + inner_query.insert_key(vec![]); + } } else { - inner_query.insert_range_to(..start_at_key); + if let Some(start_at_key) = start_at_key { + inner_query.insert_range_to(..start_at_key); + } else { + //todo: really not sure if this is correct + // Should investigate more + inner_query.insert_key(vec![]); + } } + inner_query } @@ -1434,11 +1450,11 @@ impl<'a> DriveDocumentQuery<'a> { platform_version, ) .ok() - .flatten() - .unwrap_or_default(); + .flatten(); // We should always include if we have left_over - let non_conditional_included = !left_over.is_empty() | *included; + let non_conditional_included = + !left_over.is_empty() | *included | start_at_key.is_none(); let mut non_conditional_query = Self::inner_query_starts_from_key( start_at_key, @@ -1849,6 +1865,7 @@ impl<'a> DriveDocumentQuery<'a> { drive_operations, platform_version, )?; + let query_result = drive.grove_get_path_query_serialized_results( &path_query, transaction, @@ -1976,6 +1993,8 @@ mod tests { use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::prelude::Identifier; + use grovedb::Query; + use indexmap::IndexMap; use rand::prelude::StdRng; use rand::SeedableRng; use serde_json::json; @@ -1995,11 +2014,16 @@ mod tests { use serde_json::Value::Null; use crate::config::DriveConfig; - use crate::util::test_helpers::setup::setup_drive_with_initial_state_structure; + use crate::util::test_helpers::setup::{ + setup_drive_with_initial_state_structure, setup_system_data_contract, + }; use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; + use dpp::data_contracts::SystemDataContract; + use dpp::document::DocumentV0; use dpp::platform_value::string_encoding::Encoding; use dpp::platform_value::Value; + use dpp::system_data_contracts::load_system_data_contract; use dpp::tests::fixtures::{get_data_contract_fixture, get_dpns_data_contract_fixture}; use dpp::tests::json_document::json_document_to_contract; use dpp::util::cbor_serializer; @@ -2037,6 +2061,36 @@ mod tests { (drive, contract) } + fn setup_withdrawal_contract() -> (Drive, DataContract) { + let tmp_dir = TempDir::new().unwrap(); + + let (drive, _) = Drive::open(tmp_dir, None).expect("expected to open Drive successfully"); + + let platform_version = PlatformVersion::latest(); + + drive + .create_initial_state_structure(None, platform_version) + .expect("expected to create root tree successfully"); + + // let's construct the grovedb structure for the dashpay data contract + let contract = load_system_data_contract(SystemDataContract::Withdrawals, platform_version) + .expect("load system contact"); + + let storage_flags = Some(Cow::Owned(StorageFlags::SingleEpoch(0))); + drive + .apply_contract( + &contract, + BlockInfo::default(), + true, + storage_flags, + None, + platform_version, + ) + .expect("expected to apply contract successfully"); + + (drive, contract) + } + fn setup_family_birthday_contract() -> (Drive, DataContract) { let drive = setup_drive_with_initial_state_structure(None); @@ -2667,4 +2721,99 @@ mod tests { ) .expect_err("starts with can not start with an empty string"); } + + #[test] + fn test_withdrawal_query_with_missing_transaction_index() { + // Setup the withdrawal contract + let (_, contract) = setup_withdrawal_contract(); + let platform_version = PlatformVersion::latest(); + + let document_type_name = "withdrawal"; + let document_type = contract + .document_type_for_name(document_type_name) + .expect("expected to get document type"); + + // Create a DriveDocumentQuery that simulates missing 'transactionIndex' in documents + let drive_document_query = DriveDocumentQuery { + contract: &contract, + document_type, + internal_clauses: InternalClauses { + primary_key_in_clause: None, + primary_key_equal_clause: None, + in_clause: Some(WhereClause { + field: "status".to_string(), + operator: WhereOperator::In, + value: Value::Array(vec![ + Value::U64(0), + Value::U64(1), + Value::U64(2), + Value::U64(3), + Value::U64(4), + ]), + }), + range_clause: None, + equal_clauses: BTreeMap::default(), + }, + offset: None, + limit: Some(3), + order_by: IndexMap::from([ + ( + "status".to_string(), + OrderClause { + field: "status".to_string(), + ascending: true, + }, + ), + ( + "transactionIndex".to_string(), + OrderClause { + field: "transactionIndex".to_string(), + ascending: true, + }, + ), + ]), + start_at: Some([3u8; 32]), + start_at_included: false, + block_time_ms: None, + }; + + // Create a document that we are starting at, which may be missing 'transactionIndex' + let mut properties = BTreeMap::new(); + properties.insert("status".to_string(), Value::U64(0)); + // We intentionally omit 'transactionIndex' to simulate missing field + + let starts_at_document = DocumentV0 { + id: Identifier::from([3u8; 32]), // The same as start_at + owner_id: Identifier::random(), + properties, + revision: None, + created_at: None, + updated_at: None, + transferred_at: None, + created_at_block_height: None, + updated_at_block_height: None, + transferred_at_block_height: None, + created_at_core_block_height: None, + updated_at_core_block_height: None, + transferred_at_core_block_height: None, + } + .into(); + + // Attempt to construct the path query + let result = drive_document_query + .construct_path_query(Some(starts_at_document), platform_version) + .expect("expected to construct a path query"); + + assert_eq!( + result + .clone() + .query + .query + .default_subquery_branch + .subquery + .expect("expected subquery") + .items, + Query::new_range_full().items + ); + } } diff --git a/packages/rs-drive/src/verify/document/verify_proof_keep_serialized/v0/mod.rs b/packages/rs-drive/src/verify/document/verify_proof_keep_serialized/v0/mod.rs index dc362c7ead..51c1bad4c4 100644 --- a/packages/rs-drive/src/verify/document/verify_proof_keep_serialized/v0/mod.rs +++ b/packages/rs-drive/src/verify/document/verify_proof_keep_serialized/v0/mod.rs @@ -39,6 +39,7 @@ impl<'a> DriveDocumentQuery<'a> { } else { self.construct_path_query(None, platform_version) }?; + let (root_hash, proved_key_values) = if self.start_at.is_some() { GroveDb::verify_subset_query(proof, &path_query, &platform_version.drive.grove_version)? } else { diff --git a/packages/rs-drive/tests/query_tests.rs b/packages/rs-drive/tests/query_tests.rs index 5c792aa873..23d8491885 100644 --- a/packages/rs-drive/tests/query_tests.rs +++ b/packages/rs-drive/tests/query_tests.rs @@ -4342,6 +4342,8 @@ fn test_dpns_query_start_after_with_null_id() { let domain1_id = Identifier::random_with_rng(&mut rng); + assert!(domain0_id > domain1_id); + let domain1 = Domain { id: domain1_id, owner_id: Identifier::random_with_rng(&mut rng), @@ -4428,7 +4430,7 @@ fn test_dpns_query_start_after_with_null_id() { ["normalizedParentDomainName", "==", "dash"] ], "startAfter": encoded_start_at, - "limit": 2, + "limit": 3, "orderBy": [ ["normalizedLabel", "asc"] ] diff --git a/packages/rs-sdk/src/platform/document_query.rs b/packages/rs-sdk/src/platform/document_query.rs index a6b1f7c773..c8136cf0f1 100644 --- a/packages/rs-sdk/src/platform/document_query.rs +++ b/packages/rs-sdk/src/platform/document_query.rs @@ -19,7 +19,7 @@ use dpp::{ document::Document, platform_value::{platform_value, Value}, prelude::{DataContract, Identifier}, - ProtocolError, + InvalidVectorSizeError, ProtocolError, }; use drive::query::{DriveDocumentQuery, InternalClauses, OrderClause, WhereClause, WhereOperator}; use drive_proof_verifier::{types::Documents, ContextProvider, FromProof}; @@ -326,6 +326,26 @@ impl<'a> TryFrom<&'a DocumentQuery> for DriveDocumentQuery<'a> { } else { None }; + + let (start_at, start_at_included) = match request.start.as_ref() { + None => (None, false), + Some(Start::StartAt(at)) => ( + Some(at.clone().try_into().map_err(|_| { + ProtocolError::InvalidVectorSizeError(InvalidVectorSizeError::new(32, at.len())) + })?), + true, + ), + Some(Start::StartAfter(after)) => ( + Some(after.clone().try_into().map_err(|_| { + ProtocolError::InvalidVectorSizeError(InvalidVectorSizeError::new( + 32, + after.len(), + )) + })?), + true, + ), + }; + let query = Self { contract: &request.data_contract, document_type, @@ -338,8 +358,8 @@ impl<'a> TryFrom<&'a DocumentQuery> for DriveDocumentQuery<'a> { .into_iter() .map(|v| (v.field.clone(), v)) .collect(), - start_at: None, - start_at_included: false, + start_at, + start_at_included, block_time_ms: None, }; From ffc2aeafd5f9b828ff08f0686ed91329c4b0b349 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Mon, 28 Oct 2024 20:56:44 +0700 Subject: [PATCH 80/90] feat(sdk)!: provide request execution information (#2259) Co-authored-by: Lukasz Klimek <842586+lklimek@users.noreply.github.com> --- packages/rs-dapi-client/src/address_list.rs | 18 ++- packages/rs-dapi-client/src/dapi_client.rs | 105 ++++++++++-------- packages/rs-dapi-client/src/executor.rs | 66 +++++++++++ packages/rs-dapi-client/src/lib.rs | 11 +- packages/rs-dapi-client/src/mock.rs | 78 +++++++++---- packages/rs-dapi-client/src/transport.rs | 2 +- .../rs-dapi-client/tests/mock_dapi_client.rs | 19 +++- packages/rs-sdk/src/core/transaction.rs | 7 +- packages/rs-sdk/src/mock/sdk.rs | 14 ++- packages/rs-sdk/src/platform/fetch.rs | 8 +- packages/rs-sdk/src/platform/fetch_many.rs | 13 ++- .../rs-sdk/src/platform/fetch_unproved.rs | 7 +- .../src/platform/transition/broadcast.rs | 15 ++- .../platform/transition/purchase_document.rs | 9 +- .../src/platform/transition/put_contract.rs | 9 +- .../src/platform/transition/put_document.rs | 9 +- .../src/platform/transition/put_identity.rs | 15 ++- .../platform/transition/top_up_identity.rs | 9 +- .../platform/transition/transfer_document.rs | 9 +- .../transition/update_price_of_document.rs | 9 +- .../rs-sdk/src/platform/transition/vote.rs | 17 ++- packages/rs-sdk/src/sdk.rs | 4 +- packages/rs-sdk/tests/fetch/broadcast.rs | 2 +- packages/rs-sdk/tests/fetch/config.rs | 6 +- .../contested_resource_identity_votes.rs | 2 +- packages/rs-sdk/tests/fetch/data_contract.rs | 2 +- packages/rs-sdk/tests/fetch/epoch.rs | 10 +- ...12bea6a47c9f7bf30133713b6b5cfec3a4d57.json | Bin 156167 -> 154055 bytes ...799af81392b7b0cbb7e86412da37ab13aef4b.json | Bin 94813 -> 78688 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216857 -> 216821 bytes ...26c1ffa6fb229b31c0802b1808d2c85dbc248.json | 1 - ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...6557d0524384797bb450e22f41f66743d5d11.json | Bin 37214 -> 37184 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...1b4eb361d64607a75a117ebf3096fafb32a41.json | Bin 47498 -> 0 bytes ...4cbe10d36f97230f621ab42a637983b21c58a.json | Bin 0 -> 47439 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216821 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...dbd43fab2e54a98aa44bc88c049e1cf72f5fb.json | Bin 48725 -> 48680 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216821 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...ac956499cf0081eb632e6d84ef4f9c32d8690.json | Bin 4367 -> 4121 bytes ...12bea6a47c9f7bf30133713b6b5cfec3a4d57.json | Bin 157634 -> 154055 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216821 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...c0041cdc16404006d1b30577292c6ce106cdb.json | Bin 140411 -> 136910 bytes ...12bea6a47c9f7bf30133713b6b5cfec3a4d57.json | Bin 157634 -> 154055 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216821 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...12bea6a47c9f7bf30133713b6b5cfec3a4d57.json | Bin 157634 -> 154055 bytes ...e9cd544302ca273452d9075620c895b6f7974.json | Bin 0 -> 80382 bytes ...7b889b486f0341ced46beee35a8693507d319.json | Bin 89199 -> 0 bytes ...02e4d9a981806b2efa77c35b08bcffe360bc5.json | Bin 83812 -> 0 bytes ...eb2baad30765e2616aea8a61637690cc28b91.json | Bin 83786 -> 0 bytes ...12ef8d9ef6fffa83161133f19821857242833.json | Bin 0 -> 80340 bytes ...91e659c15d8cbcb740147e01af7b1bd8a5062.json | Bin 0 -> 85689 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216821 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...5bce08c84a0cf72b34f6a408982f7babce2c2.json | Bin 63473 -> 60071 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216857 -> 216821 bytes ...26c1ffa6fb229b31c0802b1808d2c85dbc248.json | 1 - ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...cf0ed3b40564b35e3ce17ee02d5b15e9bede1.json | Bin 4003 -> 3757 bytes ...8fbd24420cbf27187df52fbb489e70b1c898d.json | Bin 8456 -> 8210 bytes ...0353cf7adee1c4b04dc8689afc26031b9b010.json | Bin 8364 -> 8118 bytes ...a7401f9ed4ef7493ce9faa08a50e6b4d2c34d.json | Bin 3821 -> 3575 bytes ...d84b9984fd04a4ca40a146aea81c3ea5c39ef.json | Bin 48333 -> 48327 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216857 -> 216821 bytes ...26c1ffa6fb229b31c0802b1808d2c85dbc248.json | 1 - ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...5a0fc6bf7035276b9ae4be55fb15774eb54e7.json | Bin 5854 -> 5608 bytes ...30e457c9e0f5d50a3b8f0f86e1da3420877d7.json | Bin 2529 -> 2283 bytes ...bfa6b1eff43954af904bce8f123fed7515132.json | Bin 50539 -> 50608 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216857 -> 216821 bytes ...26c1ffa6fb229b31c0802b1808d2c85dbc248.json | 1 - ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...f67620695a23f63dc7376bd4a509e93335ce9.json | Bin 59999 -> 56714 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216857 -> 216821 bytes ...26c1ffa6fb229b31c0802b1808d2c85dbc248.json | 1 - ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...c301f2326c1e59739fe07fb863facb5f2b5a8.json | Bin 4008 -> 3762 bytes ...ce28a227def58e23c39e0384e0cc02fe6360b.json | Bin 94838 -> 78704 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216857 -> 216821 bytes ...26c1ffa6fb229b31c0802b1808d2c85dbc248.json | 1 - ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...51b74928ffdfac56bc589d217525ce101d35b.json | Bin 6982 -> 6736 bytes ...b9c94b8d468da725cc241df1601e630036b97.json | Bin 7186 -> 6940 bytes ...d5387b9cca48a3062a4db8bf0341a839f2bae.json | Bin 59804 -> 60008 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216857 -> 216821 bytes ...26c1ffa6fb229b31c0802b1808d2c85dbc248.json | 1 - ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...1a7310d759b9fe67594f3899f1e0485c383f1.json | Bin 2417 -> 2171 bytes ...98cf774b9fe66e8103e4f370811803229f4e8.json | Bin 0 -> 60517 bytes ...b68db1c1d188ebf01dca2745102e51d0016e4.json | Bin 69198 -> 0 bytes ...649a7d9108f9b96fc074e1da61f0fa19d3b5b.json | Bin 95488 -> 78703 bytes ...4f404a90172ba46f3ce4973a5f789c7f89cfa.json | Bin 67937 -> 0 bytes ...fb6f1f5b483c9e0840abcafe5bcc30b9f0bdd.json | Bin 67539 -> 0 bytes ...f78e918d684b0f66257a9c7d33e2b62bfcfe8.json | Bin 67741 -> 0 bytes ...18f5e2f72b636986d6f0c15928353978bfd83.json | Bin 0 -> 63941 bytes ...ed11f384144320c099f54b2530f0be42f8664.json | Bin 67322 -> 63899 bytes ...1f4a723908b4ee33c4612727d101cf58f3394.json | Bin 69055 -> 67222 bytes ...1cf33dd52735f597de4b4c804effd2600d135.json | Bin 95463 -> 78687 bytes ...13ed974a48e2886d61d2f5057005e2666ae7c.json | Bin 0 -> 67582 bytes ...6bae7b358c6fa9761cb65680f9e2f54c61f50.json | Bin 0 -> 67592 bytes ...3fb36ec9234525729613a7a0a3138baff6d6a.json | Bin 69501 -> 0 bytes ...d623ba6f340f6953cc1b450631f9e38394fa6.json | Bin 71026 -> 0 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216821 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...0939881e64c648abe4ad1313f570e98350d1f.json | Bin 72993 -> 0 bytes ...850dfa046ebabf22c41f663ba73e3d730cf95.json | Bin 95743 -> 0 bytes ...828d50a4fa7b3230d23ddfac563877efd61e2.json | Bin 60046 -> 56752 bytes ...f4542eda610924f03cc11a5546eafee13bfde.json | Bin 0 -> 67421 bytes ...1d4e66aec36ada2efbb1072f2196b5b856222.json | Bin 63633 -> 60228 bytes ...cda5177deb7014745c4e797a386e792e55fe7.json | Bin 62013 -> 0 bytes ...f899d86a39c5259bdade02cd2e90c72b20388.json | Bin 88021 -> 0 bytes ...214b0f6f6b7280b0ea686c2e0070f330add82.json | Bin 80559 -> 71121 bytes ...e82bd614dd12d29f8041839df02c578fb7ed2.json | Bin 64030 -> 0 bytes ...badb27060d67cd8420c1101237534133c72e4.json | Bin 92252 -> 0 bytes ...dd268f3555081d2a3a5e112886b1c78b4009f.json | Bin 95487 -> 78702 bytes ...3c4cd53b525ef27be36077437e8b9b8ffadd8.json | Bin 95462 -> 78686 bytes ...a4b98bc0a965fb8b29d1b552d5a29ae192ab9.json | Bin 67524 -> 0 bytes ...84e6f2c2b37a1da002e0a485ad7bc30b764bb.json | Bin 77068 -> 67642 bytes ...bd232dcd96dc9a5c1a50dca162467fc9a8757.json | Bin 0 -> 71528 bytes ...92ff55e2434e36b13595910f1c02c9473b680.json | Bin 78881 -> 0 bytes ...1d98cc81197999226ba2a06e1002b94fa99ba.json | Bin 91509 -> 0 bytes ...e8d08982802ad41ae314ebdd902533315d200.json | Bin 91741 -> 0 bytes ...f8d622dd35b75e8090c88ddc45fd4e669d448.json | Bin 73350 -> 0 bytes ...77aa3058a5e96a54279f3cd7b134ef5efcbb1.json | Bin 95710 -> 78925 bytes ...b57024b9f6fd9df7d3658495623b03cd4dc2f.json | Bin 0 -> 60518 bytes ...b76feb7a8b605c1da4a28fc1fd42e93420169.json | Bin 87831 -> 0 bytes ...a65ca8a14db4b0950279b5edbf16c6ef5572c.json | Bin 84343 -> 0 bytes ...ac9fe0fc7e82040ccd47c874cd988de5a8574.json | Bin 65729 -> 0 bytes ...3b70df05ee0895f634d3fdffa5e9c7fdee578.json | Bin 86114 -> 0 bytes ...011fde307d9d55bce41f8ed2a3f895a8e7c33.json | Bin 0 -> 64084 bytes ...ffaf2f0b3d1a7ca2598153024a58bdea3b343.json | Bin 71637 -> 67668 bytes ...130dcb43dda8bfe725b4edb4b10dd8cdd687c.json | Bin 82623 -> 0 bytes ...1e6062b594012b0f6d26dbb54c090b43170cc.json | Bin 82378 -> 0 bytes ...5d377ddbe6cbdccdff3bb18a89ec8aee7fcec.json | Bin 92216 -> 75452 bytes ...6cf4557623b124ff6f1e0131ae69643535b3d.json | Bin 75128 -> 71147 bytes ...d0f212d0c7bd0a93adca53f17ab079b6315f9.json | Bin 0 -> 75420 bytes ...535066f7babdbf0697172b281e941ef3a648a.json | Bin 65594 -> 0 bytes ...bbee90d7e9017625eb6d18104fda4b8ae43b2.json | Bin 0 -> 74951 bytes ...b64d9a30d277e5438a64f924837c460481679.json | Bin 69502 -> 0 bytes ...a2614e9ae55d61ff889a99923b50dacf52c35.json | Bin 71429 -> 0 bytes ...b01abd3b8c51d22d1933ed9c346335f99840c.json | Bin 0 -> 71475 bytes ...166a7918ca820c560724a79dea163f261bd7f.json | Bin 0 -> 75004 bytes ...c98186f8f457f14160313b070d535fbe9aac9.json | Bin 67938 -> 0 bytes ...fcc750470faf458435db3d7e52a8557e0d52c.json | Bin 69223 -> 0 bytes ...39670997ba13d99baa2a98650a464ff1e0a65.json | Bin 0 -> 63942 bytes ...a822571b9076725566d64e35d36a9cbe991eb.json | Bin 88253 -> 0 bytes ...6cd86056004f8f9f6ff7a8277d1f4da5ebca4.json | Bin 0 -> 60037 bytes ...a3a5accdb36127a2e88a02f40578b6bebc0bc.json | Bin 76841 -> 0 bytes ...f538422c888683a231c769eb7df6a29bea9c9.json | Bin 0 -> 78893 bytes ...1d08723ac43c9d75dfae1ceead2d3b7c4977c.json | Bin 0 -> 63609 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216821 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...2a952aa4f09be27ca526b34c4a2d6f7ec3f76.json | Bin 5004 -> 4758 bytes ...4266c27c9b0d3c1c6b9dc022c7cf69fde2174.json | Bin 2606 -> 2360 bytes ...0092d1597a92997ac79de0ef89f4cde74aefc.json | Bin 5116 -> 4870 bytes ...c12823a7175b930f49aebb8d9844065da5b44.json | Bin 130535 -> 126941 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216821 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...76da7bcf8bb6352f7f5f26cb8af584712e16a.json | Bin 4431 -> 4185 bytes ...49e64e07602f543bda42d5a5d223f0e6102a9.json | Bin 74705 -> 71294 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216821 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...b3f1bccd65e01bb860f7648ce860ce03df202.json | Bin 5057 -> 4811 bytes ...ae85cdc0620cb84d732a686322ae9dd8c5240.json | Bin 5374 -> 5128 bytes ...7de9b6df87c4df053f3032a3fac93ca2985c2.json | Bin 6226 -> 5980 bytes ...12bea6a47c9f7bf30133713b6b5cfec3a4d57.json | Bin 157634 -> 154055 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216821 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...e412662a6acb2d928d56de7a6a67dbf70f80a.json | Bin 6430 -> 6184 bytes ...dbc80a6caf537196a9513dae8967f325ab485.json | Bin 141285 -> 137745 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216821 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...a8707f36bc1837a661ca9a4a3aae3ab30da7a.json | Bin 4533 -> 4287 bytes ...285016c5d0ac679c299447df687e866154090.json | Bin 139140 -> 135501 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216821 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...4ae6d7593e5a08c8e0c9971ad1afc8c3e1702.json | Bin 2718 -> 2472 bytes ...5839e9ea0c40cd94caac5746b19857d52533a.json | Bin 127568 -> 124070 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216821 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216821 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...f6d2d9dcd58c35b6aa9e85398a105dfdeb9c6.json | Bin 87501 -> 58365 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216821 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...e0f17fb3367987f71c5caf9c045ced8633299.json | Bin 69312 -> 58365 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216821 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...9dd012ae92b1038a32d1cbb419087d75cc70a.json | Bin 69438 -> 0 bytes ...259864951786f80811cc7ea9fce3d7f42a718.json | Bin 0 -> 58491 bytes ...f6d2d9dcd58c35b6aa9e85398a105dfdeb9c6.json | Bin 87501 -> 58365 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216821 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...501c1ba166a2dd8f6efb31b0289dc011da983.json | Bin 29144 -> 25775 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...10bbf4178e9af8e87ee326576ac2b384d726d.json | Bin 59874 -> 53112 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216821 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...1ad49d3ae7bc38d217d85b1570274493c4d7e.json | Bin 60242 -> 56948 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216821 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...ce28a227def58e23c39e0384e0cc02fe6360b.json | Bin 95489 -> 78704 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216821 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...6d1c377e5a79c8bbfad2b8607feeb2743c37c.json | Bin 173549 -> 0 bytes ...95ca435fe142e8f54b44eb829c0459d33b288.json | Bin 0 -> 172100 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220166 -> 216821 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...48c03122daf7ab2e77108f4bf44af1ad15eae.json | Bin 29144 -> 25775 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...067bd9ccc29eca3092a5664a5a9ba3bb7e967.json | Bin 226650 -> 219840 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...abbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json | Bin 28905 -> 25536 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...7acebec137640ed9cf550876fa1ec438bbcd0.json | Bin 72256 -> 0 bytes ...984ca19dfa687bcc622265b5e865021b90993.json | Bin 0 -> 75421 bytes ...676f04dc30c79eec5a5df1ab5b8d8671ac38e.json | Bin 89196 -> 0 bytes ...7e037b3446e716bafd2c876290e1b85474480.json | Bin 0 -> 69306 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...67089535588985622579e77969e0ffd68afc7.json | Bin 67106 -> 71264 bytes ...676f04dc30c79eec5a5df1ab5b8d8671ac38e.json | Bin 89196 -> 0 bytes ...7e037b3446e716bafd2c876290e1b85474480.json | Bin 0 -> 69306 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...332bebcab89e518be8ed54e76a7267ec2da52.json | Bin 0 -> 69758 bytes ...fbcae54b0dd1b499fbc91c2c29685e132a339.json | Bin 80006 -> 0 bytes ...676f04dc30c79eec5a5df1ab5b8d8671ac38e.json | Bin 89196 -> 0 bytes ...7e037b3446e716bafd2c876290e1b85474480.json | Bin 0 -> 69306 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...d592c8fe7361bed628d9a36747664c9789bf1.json | Bin 85140 -> 84924 bytes ...676f04dc30c79eec5a5df1ab5b8d8671ac38e.json | Bin 89196 -> 0 bytes ...7e037b3446e716bafd2c876290e1b85474480.json | Bin 0 -> 69306 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...b0b93d9d2e841a5e3d60755f8e7be3b93315b.json | Bin 93498 -> 93354 bytes ...676f04dc30c79eec5a5df1ab5b8d8671ac38e.json | Bin 89196 -> 0 bytes ...7e037b3446e716bafd2c876290e1b85474480.json | Bin 0 -> 69306 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...a1c40d35547373d23f3ba329df2b6d993b374.json | Bin 12549 -> 0 bytes ...71cdde55f94897dcf9d905573b01fe445fbc9.json | Bin 0 -> 12517 bytes ...676f04dc30c79eec5a5df1ab5b8d8671ac38e.json | Bin 42030 -> 0 bytes ...7e037b3446e716bafd2c876290e1b85474480.json | Bin 0 -> 33615 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...676f04dc30c79eec5a5df1ab5b8d8671ac38e.json | Bin 75834 -> 0 bytes ...7e037b3446e716bafd2c876290e1b85474480.json | Bin 0 -> 58938 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...582967dacb80eab9a3ebb1b6fe445e53a0bba.json | Bin 0 -> 48977 bytes ...901b95a32865deb2645934954725fbd1cca03.json | Bin 57449 -> 0 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...f4a20d2e49be7af3ab6fcccac432fbe0f6f8a.json | Bin 0 -> 50331 bytes ...05dac7fab00a65264648889a477f081e30ced.json | Bin 61812 -> 0 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...138f01ebff9836643f8c1b4facad64077f80d.json | Bin 0 -> 77833 bytes ...d40a692960262df24a300d226046c57048de7.json | Bin 100135 -> 0 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...138f01ebff9836643f8c1b4facad64077f80d.json | Bin 0 -> 77833 bytes ...d40a692960262df24a300d226046c57048de7.json | Bin 100135 -> 0 bytes ...c621d8b1e28e45f2c9d73dd377e7b81645c46.json | Bin 0 -> 97908 bytes ...eaa7b41821696e9131d8bec0e3b4c9cbb6ed4.json | Bin 131608 -> 0 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...48c03122daf7ab2e77108f4bf44af1ad15eae.json | Bin 35654 -> 32258 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...9fbd646666cf92a70e4954bdeab26f75f3049.json | Bin 36338 -> 0 bytes ...1b000df8dd766ae79c548073a87d4cb351fdc.json | Bin 0 -> 36306 bytes ...ca1b6ba4883a92f4533995dbfdbc5875d8bef.json | Bin 137846 -> 96590 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...9550f0ea4a6af6f68037e7d50ff4e4de74509.json | Bin 26640 -> 26592 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...106e5eda740be44679cc960ea35f2134af628.json | Bin 32144 -> 33806 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...bf1acc3394d29ac72f662d38e81344496631e.json | Bin 31788 -> 33786 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...9b1a05862cb8d40c088b193b59ca3564210bc.json | Bin 33213 -> 34881 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...22dfc69cc7b123be24b7ad993281979b2a3a2.json | Bin 32146 -> 34144 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...b6b091bede36307dc69b46eb65e967bb84bce.json | Bin 0 -> 49403 bytes ...78d45ac35df7c4a541f2fd79c4e53af000a92.json | Bin 61084 -> 0 bytes ...7ea009e369cadf26d2fd82453d9a75ccd6ae7.json | Bin 0 -> 61262 bytes ...4729771183f61b1ba73796ee966df7ce206e8.json | Bin 60973 -> 0 bytes ...cac0d096683e15280eced19ef5ad75e670062.json | Bin 62839 -> 0 bytes ...f46635ec4cbc5f228d0d6f1af26cedcf8aa24.json | Bin 0 -> 60829 bytes ...695d7ed37115c8c4ab68c65b283eceb16d9dd.json | Bin 0 -> 37346 bytes ...9822a2c4f59abefee6ac70309345adad1c202.json | Bin 60883 -> 0 bytes ...01448ade8c60e56c8d4b739ff8d6808694f33.json | Bin 60688 -> 0 bytes ...21e65356ecde06e41dad1c5f4221f2021ff65.json | Bin 38984 -> 0 bytes ...a0c949e21b06d4ba0ba04902ed9dd3cf9c180.json | Bin 61325 -> 0 bytes ...c362866cbab6d8388743fdcf5d797910561df.json | Bin 60649 -> 57505 bytes ...872937c56537dd54618a39819b4233232d497.json | Bin 0 -> 48952 bytes ...7686a168bd79e8751279ec53efb41381dd431.json | Bin 137922 -> 96666 bytes ...edc3a3ee50e58b0617b9da04faad767a7414e.json | Bin 63317 -> 0 bytes ...1415b05c514461090693b709359fd10719e64.json | Bin 61442 -> 0 bytes ...b414d7808274b04acfe789740e18ecf0991c7.json | Bin 50605 -> 0 bytes ...74bf83d09d43cc787b1c1fce7bd053ae1ebf4.json | Bin 0 -> 60991 bytes ...9700b7aa313794e1367edace0f028d6b61d8d.json | Bin 0 -> 60808 bytes ...ecfc2f026b8a6be6443de638da69f0b4c87b0.json | Bin 62866 -> 0 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...ca1b6ba4883a92f4533995dbfdbc5875d8bef.json | Bin 137846 -> 96590 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - ...e942470ee2b9dff806909798d12c40bc6cf8b.json | Bin 137871 -> 96606 bytes ...ca1b6ba4883a92f4533995dbfdbc5875d8bef.json | Bin 137846 -> 96590 bytes ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 + ...ff1e5767efb0daf93c69cc8294ee246526a09.json | 1 - 353 files changed, 402 insertions(+), 183 deletions(-) create mode 100644 packages/rs-dapi-client/src/executor.rs delete mode 100644 packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json create mode 100644 packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resource_identity_votes_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resource_identity_votes_not_found/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/msg_GetContestedResourceIdentityVotesRequest_3eae9b60bf6fb0140e51ef4cc1c1b4eb361d64607a75a117ebf3096fafb32a41.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/msg_GetContestedResourceIdentityVotesRequest_c6971839077baf47b353678e6254cbe10d36f97230f621ab42a637983b21c58a.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resource_vote_states_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resource_vote_states_ok/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resource_vote_states_with_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resource_vote_states_with_limit/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_40fdb3c49ed1a0b60f507eaff93e9cd544302ca273452d9075620c895b6f7974.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_4698eed49c628d65b930a48286b7b889b486f0341ced46beee35a8693507d319.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_606cb2d93ca22b6a73e58bca36002e4d9a981806b2efa77c35b08bcffe360bc5.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_901f0f04456fd2d03a1d16a56baeb2baad30765e2616aea8a61637690cc28b91.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_b21064f33148c15a425ce722d0412ef8d9ef6fffa83161133f19821857242833.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_b6282218b0c8c33a4f17f60e2f691e659c15d8cbcb740147e01af7b1bd8a5062.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/quorum_pubkey-106-41ef25a6baff2c7a3cf388c77c826c1ffa6fb229b31c0802b1808d2c85dbc248.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_0354293d2bd9574b348ef1fbbcc98cf774b9fe66e8103e4f370811803229f4e8.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_1501210861eb1ce786ba78ba0d7b68db1c1d188ebf01dca2745102e51d0016e4.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_3b4ade5c7a2d0d346627a4ee2424f404a90172ba46f3ce4973a5f789c7f89cfa.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_40ef2688b5170b8889257682591fb6f1f5b483c9e0840abcafe5bcc30b9f0bdd.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_41eaedc5b2d0e43291fbc6f3d9bf78e918d684b0f66257a9c7d33e2b62bfcfe8.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_4b19dc7d21fa9b40046ba30620118f5e2f72b636986d6f0c15928353978bfd83.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_955992f6446147d75ceb7c6df1813ed974a48e2886d61d2f5057005e2666ae7c.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_b4b5361aa4f0450e6537dc5135d6bae7b358c6fa9761cb65680f9e2f54c61f50.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_f4686bfe637dbe76a6de26e085c3fb36ec9234525729613a7a0a3138baff6d6a.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_ff56aa1c3d107ee8f232f889ce6d623ba6f340f6953cc1b450631f9e38394fa6.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_limit/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_00b7bac855f345476da659743b50939881e64c648abe4ad1313f570e98350d1f.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_061d1caf0f2b50525a3e3506457850dfa046ebabf22c41f663ba73e3d730cf95.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_0e929893694b229f677394cbb4df4542eda610924f03cc11a5546eafee13bfde.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_15d5b23b6b2036272bc068779fecda5177deb7014745c4e797a386e792e55fe7.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_1b0ced62edb21c226e57f54549af899d86a39c5259bdade02cd2e90c72b20388.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_1f4401f226caa8a5d77354422e8e82bd614dd12d29f8041839df02c578fb7ed2.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_1f5b3258963ef7c64984f0d15bbbadb27060d67cd8420c1101237534133c72e4.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_2b0bd7604b1c5ccc1f01ff0da46a4b98bc0a965fb8b29d1b552d5a29ae192ab9.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_3df76526b556901d24900733a8fbd232dcd96dc9a5c1a50dca162467fc9a8757.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_4153546f1e76e6a6c20fb42644192ff55e2434e36b13595910f1c02c9473b680.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_43103f757a1b16752bdf92997fe1d98cc81197999226ba2a06e1002b94fa99ba.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_49593e41313ee6da1685f4a59d9e8d08982802ad41ae314ebdd902533315d200.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_4bc3a31c696a234e5ef24e6a1d5f8d622dd35b75e8090c88ddc45fd4e669d448.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_55aba21bd6ab87295c8317bb2b0b57024b9f6fd9df7d3658495623b03cd4dc2f.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_5685b7b4cb0467fc8d4021fb120b76feb7a8b605c1da4a28fc1fd42e93420169.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_5dd4150344158e77182615c11c9a65ca8a14db4b0950279b5edbf16c6ef5572c.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_61164ed4c833bb713ba73b843a1ac9fe0fc7e82040ccd47c874cd988de5a8574.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_6867758e065031acc5e4b6bf5ef3b70df05ee0895f634d3fdffa5e9c7fdee578.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_69ddb327c1fd562d5bd35a74d14011fde307d9d55bce41f8ed2a3f895a8e7c33.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_7e6aba0e36304760488e6c79655130dcb43dda8bfe725b4edb4b10dd8cdd687c.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_84129be05fe87a6227fd33f6a281e6062b594012b0f6d26dbb54c090b43170cc.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_93bdcf7c3ac1449bec170265ec2d0f212d0c7bd0a93adca53f17ab079b6315f9.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_98569ec1918d08eb3547ba4c967535066f7babdbf0697172b281e941ef3a648a.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_987947aa731c95dbdc29a33ebdfbbee90d7e9017625eb6d18104fda4b8ae43b2.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_9a9ab8f7de794f5cbd193c0a79bb64d9a30d277e5438a64f924837c460481679.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_9bbca1d0964fff817f0ae605922a2614e9ae55d61ff889a99923b50dacf52c35.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_a6a78257a69728aadbce86460a8b01abd3b8c51d22d1933ed9c346335f99840c.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_a955bc7d4f7d9e784d03f3bc335166a7918ca820c560724a79dea163f261bd7f.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_adad8ba03f57791b0c73db74cfbc98186f8f457f14160313b070d535fbe9aac9.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_b799ae8be5055118672da926306fcc750470faf458435db3d7e52a8557e0d52c.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_c59f992288b7c02e30f0cd1ecfa39670997ba13d99baa2a98650a464ff1e0a65.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_c9d26c216a8382dee66a3be97b6a822571b9076725566d64e35d36a9cbe991eb.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_cbbacbd6178e4420c11ccd741ce6cd86056004f8f9f6ff7a8277d1f4da5ebca4.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_cbf94dc9a7e25b00b3a6d10a6efa3a5accdb36127a2e88a02f40578b6bebc0bc.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_e081acc2a8d23315915812c7e4bf538422c888683a231c769eb7df6a29bea9c9.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_f775b2ae054095c7a37ae4ccc861d08723ac43c9d75dfae1ceead2d3b7c4977c.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__a39a5f7014a616de3d7002bb4f18772c5b5d3526cb2b3c33566bd64512882669/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__a39a5f7014a616de3d7002bb4f18772c5b5d3526cb2b3c33566bd64512882669/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__c71b4f8d63f8a1357936129a226f99e349e7b21b166609cf59062e27ed68a1ee/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__c71b4f8d63f8a1357936129a226f99e349e7b21b166609cf59062e27ed68a1ee/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__cfe3ebd0f17745be80e4348304fe468f3eb8c2d17e23d310582b0b34f2d5bba7/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__cfe3ebd0f17745be80e4348304fe468f3eb8c2d17e23d310582b0b34f2d5bba7/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__fbed6654145b9fba061d182cac5a3879bc9bacb92dc9ae64ed2a07ca2ec0392f/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__fbed6654145b9fba061d182cac5a3879bc9bacb92dc9ae64ed2a07ca2ec0392f/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/document_list_bug_value_text_decode_base58/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/document_list_bug_value_text_decode_base58/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read/msg_DocumentQuery_23b0993681588ca0c66e960ae019dd012ae92b1038a32d1cbb419087d75cc70a.json create mode 100644 packages/rs-sdk/tests/vectors/document_read/msg_DocumentQuery_5d23e775d0065e9aaec1f155ee4259864951786f80811cc7ea9fce3d7f42a718.json create mode 100644 packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/test_contested_resources_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_contested_resources_ok/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_GetDataContractHistoryRequest_2bd2bfc3193745cf05fb33fd3e56d1c377e5a79c8bbfad2b8607feeb2743c37c.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_GetDataContractHistoryRequest_3a0865545cd724369cc2d2609bb95ca435fe142e8f54b44eb829c0459d33b288.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_GetEpochsInfoRequest_00f51345e161bde17d0b008310d7acebec137640ed9cf550876fa1ec438bbcd0.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_GetEpochsInfoRequest_f2de0b3a0f07be2fcaffc191580984ca19dfa687bcc622265b5e865021b90993.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_GetIdentityRequest_24b7371202615ecd290e0fe7496676f04dc30c79eec5a5df1ab5b8d8671ac38e.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_GetIdentityRequest_24b7371202615ecd290e0fe7496676f04dc30c79eec5a5df1ab5b8d8671ac38e.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetEpochsInfoRequest_7cb414646fac25990a7ec6f920b332bebcab89e518be8ed54e76a7267ec2da52.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetEpochsInfoRequest_cdea72fd4e08834ef8a3e6a0730fbcae54b0dd1b499fbc91c2c29685e132a339.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetIdentityRequest_24b7371202615ecd290e0fe7496676f04dc30c79eec5a5df1ab5b8d8671ac38e.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/msg_GetIdentityRequest_24b7371202615ecd290e0fe7496676f04dc30c79eec5a5df1ab5b8d8671ac38e.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_GetIdentityRequest_24b7371202615ecd290e0fe7496676f04dc30c79eec5a5df1ab5b8d8671ac38e.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json delete mode 100644 packages/rs-sdk/tests/vectors/test_evonode_status/msg_EvoNode_244e3005966550cd3cb2837d3bca1c40d35547373d23f3ba329df2b6d993b374.json create mode 100644 packages/rs-sdk/tests/vectors/test_evonode_status/msg_EvoNode_fbdf15806b1160a9fb482d5663371cdde55f94897dcf9d905573b01fe445fbc9.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_GetIdentityBalanceRequest_24b7371202615ecd290e0fe7496676f04dc30c79eec5a5df1ab5b8d8671ac38e.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_GetIdentityBalanceRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_GetIdentityBalanceAndRevisionRequest_24b7371202615ecd290e0fe7496676f04dc30c79eec5a5df1ab5b8d8671ac38e.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_GetIdentityBalanceAndRevisionRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/msg_GetIdentityContractNonceRequest_5328fe7dfe7856a12c05ca3db34582967dacb80eab9a3ebb1b6fe445e53a0bba.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/msg_GetIdentityContractNonceRequest_815e2b4de88fb56ce7ec833ffe8901b95a32865deb2645934954725fbd1cca03.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_GetIdentityKeysRequest_03fcf46e9be05e694be0ce4f553f4a20d2e49be7af3ab6fcccac432fbe0f6f8a.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_GetIdentityKeysRequest_c9aa65558b4f8ba10bd7509498105dac7fab00a65264648889a477f081e30ced.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/msg_IdentityRequest_c9b7936c475a5143e38568b7474138f01ebff9836643f8c1b4facad64077f80d.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/msg_IdentityRequest_da9cbb7a9f245221fe2a5d7fe5dd40a692960262df24a300d226046c57048de7.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_IdentityRequest_c9b7936c475a5143e38568b7474138f01ebff9836643f8c1b4facad64077f80d.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_IdentityRequest_da9cbb7a9f245221fe2a5d7fe5dd40a692960262df24a300d226046c57048de7.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_IdentityRequest_dd69f82095b51bd0266957d7932c621d8b1e28e45f2c9d73dd377e7b81645c46.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_IdentityRequest_ec8288b622e659eee0ea5c67d54eaa7b41821696e9131d8bec0e3b4c9cbb6ed4.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_not_found/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json delete mode 100644 packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_ok/msg_GetPrefundedSpecializedBalanceRequest_0a917fd6c7841682776fa2800a49fbd646666cf92a70e4954bdeab26f75f3049.json create mode 100644 packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_ok/msg_GetPrefundedSpecializedBalanceRequest_9bd89c809bb48d907c525be2a571b000df8dd766ae79c548073a87d4cb351fdc.json create mode 100644 packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_ok/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_02381273a00d2e9ada5d2a65f02b6b091bede36307dc69b46eb65e967bb84bce.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_0329cf0b8851d09d91160eb04ba78d45ac35df7c4a541f2fd79c4e53af000a92.json create mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_08e1547cbc369ad6c9b70f9df5e7ea009e369cadf26d2fd82453d9a75ccd6ae7.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_0e309af16c3957b15807f1741084729771183f61b1ba73796ee966df7ce206e8.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_142e6c253c01773656823e7299ccac0d096683e15280eced19ef5ad75e670062.json create mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_1c64f28b411c0c2d689236e1780f46635ec4cbc5f228d0d6f1af26cedcf8aa24.json create mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_2d02d9bffa1eaac182493623f86695d7ed37115c8c4ab68c65b283eceb16d9dd.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_2e98e756bbec29c5a8bb6db95209822a2c4f59abefee6ac70309345adad1c202.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_4cb42e1877d46573cade78a050501448ade8c60e56c8d4b739ff8d6808694f33.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_61f016345ec587c57ec95cd35ca21e65356ecde06e41dad1c5f4221f2021ff65.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_62753b0c8caf599658c8a6becb2a0c949e21b06d4ba0ba04902ed9dd3cf9c180.json create mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_86088d93d1bdfa513a66ef126a9872937c56537dd54618a39819b4233232d497.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_9085af05cad5f81e4684b91c4b6edc3a3ee50e58b0617b9da04faad767a7414e.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_a2a3107907325a7d7da45018edd1415b05c514461090693b709359fd10719e64.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_c2737f6ccc2ac5cc79e28d4b29fb414d7808274b04acfe789740e18ecf0991c7.json create mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_de3d9a273ba38a5e8fd9ee2c02b74bf83d09d43cc787b1c1fce7bd053ae1ebf4.json create mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_e63096a8aaea805874e06f0ed5c9700b7aa313794e1367edace0f028d6b61d8d.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_edb3ea19c943e4ccd318d2742a9ecfc2f026b8a6be6443de638da69f0b4c87b0.json create mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_ok/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json create mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_order/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_order/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json diff --git a/packages/rs-dapi-client/src/address_list.rs b/packages/rs-dapi-client/src/address_list.rs index e3da22ab52..0c21ecc0b1 100644 --- a/packages/rs-dapi-client/src/address_list.rs +++ b/packages/rs-dapi-client/src/address_list.rs @@ -1,6 +1,7 @@ //! Subsystem to manage DAPI nodes. use chrono::Utc; +use dapi_grpc::tonic::codegen::http; use dapi_grpc::tonic::transport::Uri; use rand::{rngs::SmallRng, seq::IteratorRandom, SeedableRng}; use std::collections::HashSet; @@ -20,6 +21,16 @@ pub struct Address { uri: Uri, } +impl FromStr for Address { + type Err = AddressListError; + + fn from_str(s: &str) -> Result { + Uri::from_str(s) + .map(Address::from) + .map_err(AddressListError::from) + } +} + impl PartialEq for Address { fn eq(&self, other: &Self) -> bool { self.uri == other.uri @@ -79,9 +90,13 @@ impl Address { #[derive(Debug, thiserror::Error)] #[cfg_attr(feature = "mocks", derive(serde::Serialize, serde::Deserialize))] pub enum AddressListError { - /// Specified address not present in the list + /// Specified address is not present in the list #[error("address {0} not found in the list")] AddressNotFound(#[cfg_attr(feature = "mocks", serde(with = "http_serde::uri"))] Uri), + /// A valid uri is required to create an Address + #[error("unable parse address: {0}")] + #[cfg_attr(feature = "mocks", serde(skip))] + InvalidAddressUri(#[from] http::uri::InvalidUri), } /// A structure to manage DAPI addresses to select from @@ -201,6 +216,7 @@ impl AddressList { } } +// TODO: Must be changed to FromStr impl From<&str> for AddressList { fn from(value: &str) -> Self { let uri_list: Vec = value diff --git a/packages/rs-dapi-client/src/dapi_client.rs b/packages/rs-dapi-client/src/dapi_client.rs index b352cba2c1..20ef3506a6 100644 --- a/packages/rs-dapi-client/src/dapi_client.rs +++ b/packages/rs-dapi-client/src/dapi_client.rs @@ -1,9 +1,10 @@ //! [DapiClient] definition. -use backon::{ExponentialBuilder, Retryable}; +use backon::{ConstantBuilder, Retryable}; use dapi_grpc::mock::Mockable; use dapi_grpc::tonic::async_trait; use std::fmt::Debug; +use std::sync::atomic::AtomicUsize; use std::sync::{Arc, RwLock}; use std::time::Duration; use tracing::Instrument; @@ -12,7 +13,8 @@ use crate::address_list::AddressListError; use crate::connection_pool::ConnectionPool; use crate::{ transport::{TransportClient, TransportRequest}, - Address, AddressList, CanRetry, RequestSettings, + Address, AddressList, CanRetry, DapiRequestExecutor, ExecutionError, ExecutionResponse, + ExecutionResult, RequestSettings, }; /// General DAPI request error type. @@ -20,11 +22,8 @@ use crate::{ #[cfg_attr(feature = "mocks", derive(serde::Serialize, serde::Deserialize))] pub enum DapiClientError { /// The error happened on transport layer - #[error("transport error with {1}: {0}")] - Transport( - #[cfg_attr(feature = "mocks", serde(with = "dapi_grpc::mock::serde_mockable"))] TE, - Address, - ), + #[error("transport error: {0}")] + Transport(#[cfg_attr(feature = "mocks", serde(with = "dapi_grpc::mock::serde_mockable"))] TE), /// There are no valid DAPI addresses to use. #[error("no available addresses to use")] NoAvailableAddresses, @@ -43,7 +42,7 @@ impl CanRetry for DapiClientError { use DapiClientError::*; match self { NoAvailableAddresses => false, - Transport(transport_error, _) => transport_error.can_retry(), + Transport(transport_error) => transport_error.can_retry(), AddressList(_) => false, #[cfg(feature = "mocks")] Mock(_) => false, @@ -73,21 +72,6 @@ impl Mockable for DapiClientError { } } -#[async_trait] -/// DAPI client executor trait. -pub trait DapiRequestExecutor { - /// Execute request using this DAPI client. - async fn execute( - &self, - request: R, - settings: RequestSettings, - ) -> Result::Error>> - where - R: TransportRequest + Mockable, - R::Response: Mockable, - ::Error: Mockable; -} - /// Access point to DAPI. #[derive(Debug, Clone)] pub struct DapiClient { @@ -126,7 +110,7 @@ impl DapiRequestExecutor for DapiClient { &self, request: R, settings: RequestSettings, - ) -> Result::Error>> + ) -> ExecutionResult::Error>> where R: TransportRequest + Mockable, R::Response: Mockable, @@ -140,12 +124,9 @@ impl DapiRequestExecutor for DapiClient { .finalize(); // Setup retry policy: - let retry_settings = ExponentialBuilder::default() + let retry_settings = ConstantBuilder::default() .with_max_times(applied_settings.retries) - // backon doesn't accept 1.0 - .with_factor(1.001) - .with_min_delay(Duration::from_secs(0)) - .with_max_delay(Duration::from_secs(0)); + .with_delay(Duration::from_millis(10)); // Save dump dir for later use, as self is moved into routine #[cfg(feature = "dump")] @@ -153,11 +134,15 @@ impl DapiRequestExecutor for DapiClient { #[cfg(feature = "dump")] let dump_request = request.clone(); + let retries_counter_arc = Arc::new(AtomicUsize::new(0)); + let retries_counter_arc_ref = &retries_counter_arc; + // Setup DAPI request execution routine future. It's a closure that will be called // more once to build new future on each retry. let routine = move || { - // Try to get an address to initialize transport on: + let retries_counter = Arc::clone(retries_counter_arc_ref); + // Try to get an address to initialize transport on: let address_list = self .address_list .read() @@ -192,7 +177,12 @@ impl DapiRequestExecutor for DapiClient { async move { // It stays wrapped in `Result` since we want to return // `impl Future`, not a `Result` itself. - let address = address_result?; + let address = address_result.map_err(|inner| ExecutionError { + inner, + retries: retries_counter.load(std::sync::atomic::Ordering::Acquire), + address: None, + })?; + let pool = self.pool.clone(); let mut transport_client = R::Client::with_uri_and_settings( @@ -200,22 +190,16 @@ impl DapiRequestExecutor for DapiClient { &applied_settings, &pool, ) - .map_err(|e| { - DapiClientError::<::Error>::Transport( - e, - address.clone(), - ) + .map_err(|error| ExecutionError { + inner: DapiClientError::Transport(error), + retries: retries_counter.load(std::sync::atomic::Ordering::Acquire), + address: Some(address.clone()), })?; let response = transport_request .execute_transport(&mut transport_client, &applied_settings) .await - .map_err(|e| { - DapiClientError::<::Error>::Transport( - e, - address.clone(), - ) - }); + .map_err(DapiClientError::Transport); match &response { Ok(_) => { @@ -226,8 +210,14 @@ impl DapiRequestExecutor for DapiClient { .write() .expect("can't get address list for write"); - address_list.unban_address(&address) - .map_err(DapiClientError::<::Error>::AddressList)?; + address_list.unban_address(&address).map_err(|error| { + ExecutionError { + inner: DapiClientError::AddressList(error), + retries: retries_counter + .load(std::sync::atomic::Ordering::Acquire), + address: Some(address.clone()), + } + })?; } tracing::trace!(?response, "received {} response", response_name); @@ -240,8 +230,14 @@ impl DapiRequestExecutor for DapiClient { .write() .expect("can't get address list for write"); - address_list.ban_address(&address) - .map_err(DapiClientError::<::Error>::AddressList)?; + address_list.ban_address(&address).map_err(|error| { + ExecutionError { + inner: DapiClientError::AddressList(error), + retries: retries_counter + .load(std::sync::atomic::Ordering::Acquire), + address: Some(address.clone()), + } + })?; } } else { tracing::trace!(?error, "received error"); @@ -249,7 +245,19 @@ impl DapiRequestExecutor for DapiClient { } }; + let retries = retries_counter.load(std::sync::atomic::Ordering::Acquire); + response + .map(|inner| ExecutionResponse { + inner, + retries, + address: address.clone(), + }) + .map_err(|inner| ExecutionError { + inner, + retries, + address: Some(address), + }) } }; @@ -258,11 +266,14 @@ impl DapiRequestExecutor for DapiClient { let result = routine .retry(retry_settings) .notify(|error, duration| { + let retries_counter = Arc::clone(&retries_counter_arc); + retries_counter.fetch_add(1, std::sync::atomic::Ordering::AcqRel); + tracing::warn!( ?error, "retrying error with sleeping {} secs", duration.as_secs_f32() - ) + ); }) .when(|e| e.can_retry()) .instrument(tracing::info_span!("request routine")) diff --git a/packages/rs-dapi-client/src/executor.rs b/packages/rs-dapi-client/src/executor.rs new file mode 100644 index 0000000000..50913b23c4 --- /dev/null +++ b/packages/rs-dapi-client/src/executor.rs @@ -0,0 +1,66 @@ +use crate::transport::{TransportClient, TransportRequest}; +use crate::{Address, CanRetry, DapiClientError, RequestSettings}; +use dapi_grpc::mock::Mockable; +use dapi_grpc::tonic::async_trait; +use std::fmt::Debug; + +#[async_trait] +/// DAPI client executor trait. +pub trait DapiRequestExecutor { + /// Execute request using this DAPI client. + async fn execute( + &self, + request: R, + settings: RequestSettings, + ) -> ExecutionResult::Error>> + where + R: TransportRequest + Mockable, + R::Response: Mockable, + ::Error: Mockable; +} + +/// Error happened during request execution. +#[derive(Debug, Clone, thiserror::Error, Eq, PartialEq)] +#[error("{inner}")] +pub struct ExecutionError { + /// The cause of error + pub inner: E, + /// How many times the request was retried + pub retries: usize, + /// The address of the node that was used for the request + pub address: Option
, +} + +impl ExecutionError { + /// Unwrap the error cause + pub fn into_inner(self) -> E { + self.inner + } +} + +impl CanRetry for ExecutionError { + fn can_retry(&self) -> bool { + self.inner.can_retry() + } +} + +/// Request execution response. +#[derive(Debug, Clone, Eq, PartialEq)] +pub struct ExecutionResponse { + /// The response from the request + pub inner: R, + /// How many times the request was retried + pub retries: usize, + /// The address of the node that was used for the request + pub address: Address, +} + +impl ExecutionResponse { + /// Unwrap the response + pub fn into_inner(self) -> R { + self.inner + } +} + +/// Result of request execution +pub type ExecutionResult = Result, ExecutionError>; diff --git a/packages/rs-dapi-client/src/lib.rs b/packages/rs-dapi-client/src/lib.rs index 5251363fac..208c2380ac 100644 --- a/packages/rs-dapi-client/src/lib.rs +++ b/packages/rs-dapi-client/src/lib.rs @@ -7,6 +7,7 @@ mod connection_pool; mod dapi_client; #[cfg(feature = "dump")] pub mod dump; +mod executor; #[cfg(feature = "mocks")] pub mod mock; mod request_settings; @@ -16,11 +17,11 @@ pub use address_list::Address; pub use address_list::AddressList; pub use address_list::AddressListError; pub use connection_pool::ConnectionPool; -pub use dapi_client::DapiRequestExecutor; pub use dapi_client::{DapiClient, DapiClientError}; use dapi_grpc::mock::Mockable; #[cfg(feature = "dump")] pub use dump::DumpData; +pub use executor::{DapiRequestExecutor, ExecutionError, ExecutionResponse, ExecutionResult}; use futures::{future::BoxFuture, FutureExt}; pub use request_settings::RequestSettings; @@ -28,14 +29,14 @@ pub use request_settings::RequestSettings; /// /// # Examples /// ``` -/// use rs_dapi_client::{RequestSettings, AddressList, mock::MockDapiClient, DapiClientError, DapiRequest}; +/// use rs_dapi_client::{RequestSettings, AddressList, mock::MockDapiClient, DapiClientError, DapiRequest, ExecutionError}; /// use dapi_grpc::platform::v0::{self as proto}; /// /// # let _ = async { /// let mut client = MockDapiClient::new(); /// let request: proto::GetIdentityRequest = proto::get_identity_request::GetIdentityRequestV0 { id: b"0".to_vec(), prove: true }.into(); /// let response = request.execute(&mut client, RequestSettings::default()).await?; -/// # Ok::<(), DapiClientError<_>>(()) +/// # Ok::<(), ExecutionError>>(()) /// # }; /// ``` pub trait DapiRequest { @@ -49,7 +50,7 @@ pub trait DapiRequest { self, dapi_client: &'c D, settings: RequestSettings, - ) -> BoxFuture<'c, Result>> + ) -> BoxFuture<'c, ExecutionResult>> where Self: 'c; } @@ -64,7 +65,7 @@ impl DapiRequest for T { self, dapi_client: &'c D, settings: RequestSettings, - ) -> BoxFuture<'c, Result>> + ) -> BoxFuture<'c, ExecutionResult>> where Self: 'c, { diff --git a/packages/rs-dapi-client/src/mock.rs b/packages/rs-dapi-client/src/mock.rs index 813546686d..98df667892 100644 --- a/packages/rs-dapi-client/src/mock.rs +++ b/packages/rs-dapi-client/src/mock.rs @@ -13,7 +13,8 @@ use crate::{ transport::{TransportClient, TransportRequest}, - DapiClientError, DapiRequestExecutor, RequestSettings, + DapiClientError, DapiRequestExecutor, ExecutionError, ExecutionResponse, ExecutionResult, + RequestSettings, }; use dapi_grpc::mock::Mockable; use dapi_grpc::tonic::async_trait; @@ -35,9 +36,9 @@ pub struct MockDapiClient { expectations: Expectations, } /// Result of executing a mock request -pub type MockResult = Result< - ::Response, - DapiClientError<<::Client as TransportClient>::Error>, +pub type MockResult = ExecutionResult< + ::Response, + DapiClientError<<::Client as TransportClient>::Error>, >; impl MockDapiClient { @@ -47,16 +48,12 @@ impl MockDapiClient { } /// Add a new expectation for a request - pub fn expect( - &mut self, - request: &R, - response: &MockResult, - ) -> Result<&mut Self, MockError> + pub fn expect(&mut self, request: &R, result: &MockResult) -> Result<&mut Self, MockError> where R: TransportRequest + Mockable, R::Response: Mockable, { - let key = self.expectations.add(request, response)?; + let key = self.expectations.add(request, result)?; tracing::trace!( %key, @@ -77,12 +74,12 @@ impl MockDapiClient { /// /// Panics if the file can't be read or the data can't be parsed. #[cfg(feature = "dump")] - pub fn load>( + pub fn load>( &mut self, file: P, ) -> Result<(T, MockResult), std::io::Error> where - T: Mockable, + T: TransportRequest + Mockable, T::Response: Mockable, { use crate::DumpData; @@ -124,15 +121,20 @@ impl DapiRequestExecutor for MockDapiClient { "mock execute" ); - return if let Some(response) = response { + if let Some(response) = response { response } else { - Err(MockError::MockExpectationNotFound(format!( + let error = MockError::MockExpectationNotFound(format!( "unexpected mock request with key {}, use MockDapiClient::expect(): {:?}", key, request - )) - .into()) - }; + )); + + Err(ExecutionError { + inner: DapiClientError::Mock(error), + retries: 0, + address: None, + }) + } } } @@ -200,9 +202,9 @@ pub enum MockError { #[derive(Debug)] /// Wrapper that encapsulated serialized form of expected response for a request -struct ExpectedResponse(Vec); +struct ExpectedResult(Vec); -impl ExpectedResponse { +impl ExpectedResult { fn serialize(request: &I) -> Self { // We use json because bincode sometimes fail to deserialize Self(request.mock_serialize().expect("encode value")) @@ -217,7 +219,7 @@ impl ExpectedResponse { #[derive(Default, Debug)] /// Requests expected by a mock and their responses. struct Expectations { - expectations: HashMap, + expectations: HashMap, } impl Expectations { @@ -227,10 +229,10 @@ impl Expectations { pub fn add( &mut self, request: &I, - response: &O, + result: &O, ) -> Result { let key = Key::new(request); - let value = ExpectedResponse::serialize(response); + let value = ExpectedResult::serialize(result); if self.expectations.contains_key(&key) { return Err(MockError::MockExpectationConflict(format!( @@ -256,3 +258,35 @@ impl Expectations { (key, response) } } + +impl Mockable for ExecutionResponse { + fn mock_serialize(&self) -> Option> { + R::mock_serialize(&self.inner) + } + + fn mock_deserialize(data: &[u8]) -> Option { + // TODO: We need serialize retries and address too + R::mock_deserialize(data).map(|inner| ExecutionResponse { + inner, + retries: 0, + address: "http://127.0.0.1:9000" + .parse() + .expect("failed to parse address"), + }) + } +} + +impl Mockable for ExecutionError { + fn mock_serialize(&self) -> Option> { + E::mock_serialize(&self.inner) + } + + fn mock_deserialize(data: &[u8]) -> Option { + // TODO: We need serialize retries and address too + E::mock_deserialize(data).map(|inner| ExecutionError { + inner, + retries: 0, + address: None, + }) + } +} diff --git a/packages/rs-dapi-client/src/transport.rs b/packages/rs-dapi-client/src/transport.rs index 600189fc2f..29b3d688a8 100644 --- a/packages/rs-dapi-client/src/transport.rs +++ b/packages/rs-dapi-client/src/transport.rs @@ -48,7 +48,7 @@ pub trait TransportRequest: Clone + Send + Sync + Debug + Mockable { /// Generic way to create a transport client from provided [Uri]. pub trait TransportClient: Send + Sized { /// Error type for the specific client. - type Error: CanRetry + Send + Debug + Mockable; + type Error: std::error::Error + CanRetry + Send + Mockable; /// Build client using node's url. fn with_uri(uri: Uri, pool: &ConnectionPool) -> Result; diff --git a/packages/rs-dapi-client/tests/mock_dapi_client.rs b/packages/rs-dapi-client/tests/mock_dapi_client.rs index f069c4e47a..7e733ae435 100644 --- a/packages/rs-dapi-client/tests/mock_dapi_client.rs +++ b/packages/rs-dapi-client/tests/mock_dapi_client.rs @@ -1,7 +1,9 @@ #[cfg(feature = "mocks")] use { dapi_grpc::platform::v0::{GetIdentityRequest, GetIdentityResponse, Proof}, - rs_dapi_client::{mock::MockDapiClient, DapiRequest, DapiRequestExecutor, RequestSettings}, + rs_dapi_client::{ + mock::MockDapiClient, DapiRequest, DapiRequestExecutor, ExecutionResponse, RequestSettings, + }, }; #[tokio::test] @@ -10,7 +12,7 @@ async fn test_mock_get_identity_dapi_client() { let mut dapi = MockDapiClient::new(); let request = GetIdentityRequest::default(); - let response: GetIdentityResponse = GetIdentityResponse { + let inner: GetIdentityResponse = GetIdentityResponse { version: Some(dapi_grpc::platform::v0::get_identity_response::Version::V0(dapi_grpc::platform::v0::get_identity_response::GetIdentityResponseV0 { result: Some( dapi_grpc::platform::v0::get_identity_response::get_identity_response_v0::Result::Proof(Proof { @@ -21,8 +23,15 @@ async fn test_mock_get_identity_dapi_client() { metadata: Default::default(), })) }; + let execution_response = ExecutionResponse { + inner, + retries: 0, + address: "http://127.0.0.1:9000" + .parse() + .expect("failed to parse address"), + }; - dapi.expect(&request, &Ok(response.clone())) + dapi.expect(&request, &Ok(execution_response.clone())) .expect("expectation added"); let settings = RequestSettings::default(); @@ -31,6 +40,6 @@ async fn test_mock_get_identity_dapi_client() { let result2 = request.execute(&dapi, settings).await.unwrap(); - assert_eq!(result, response); - assert_eq!(result2, response); + assert_eq!(result, execution_response); + assert_eq!(result2, execution_response); } diff --git a/packages/rs-sdk/src/core/transaction.rs b/packages/rs-sdk/src/core/transaction.rs index 39dd85e562..acbbf4164b 100644 --- a/packages/rs-sdk/src/core/transaction.rs +++ b/packages/rs-sdk/src/core/transaction.rs @@ -56,6 +56,9 @@ impl Sdk { }; self.execute(core_transactions_stream, RequestSettings::default()) .await + // TODO: We need better way to handle execution response and errors + .map(|execution_response| execution_response.into_inner()) + .map_err(|execution_error| execution_error.into_inner()) .map_err(|e| Error::DapiClientError(e.to_string())) } @@ -180,7 +183,9 @@ impl Sdk { }, RequestSettings::default(), ) - .await?; + .await // TODO: We need better way to handle execution errors + .map_err(|error| error.into_inner())? + .into_inner(); core_chain_locked_height = height; diff --git a/packages/rs-sdk/src/mock/sdk.rs b/packages/rs-sdk/src/mock/sdk.rs index bc9c392771..c2a180bcda 100644 --- a/packages/rs-sdk/src/mock/sdk.rs +++ b/packages/rs-sdk/src/mock/sdk.rs @@ -1,6 +1,7 @@ //! Mocking mechanisms for Dash Platform SDK. //! //! See [MockDashPlatformSdk] for more details. +use super::MockResponse; use crate::{ platform::{ types::{evonode::EvoNode, identity::IdentityRequest}, @@ -22,13 +23,11 @@ use rs_dapi_client::mock::MockError; use rs_dapi_client::{ mock::{Key, MockDapiClient}, transport::TransportRequest, - DapiClient, DumpData, + DapiClient, DumpData, ExecutionResponse, }; use std::{collections::BTreeMap, path::PathBuf, sync::Arc}; use tokio::sync::{Mutex, OwnedMutexGuard}; -use super::MockResponse; - /// Mechanisms to mock Dash Platform SDK. /// /// This object is returned by [Sdk::mock()](crate::Sdk::mock()) and is used to define mock expectations. @@ -363,7 +362,14 @@ impl MockDashPlatformSdk { // This expectation will work for execute let mut dapi_guard = self.dapi.lock().await; // We don't really care about the response, as it will be mocked by from_proof, so we provide default() - dapi_guard.expect(&grpc_request, &Ok(Default::default()))?; + dapi_guard.expect( + &grpc_request, + &Ok(ExecutionResponse { + inner: Default::default(), + retries: 0, + address: "http://127.0.0.1".parse().expect("failed to parse address"), + }), + )?; Ok(()) } diff --git a/packages/rs-sdk/src/platform/fetch.rs b/packages/rs-sdk/src/platform/fetch.rs index 109140bdb7..1f97bb4426 100644 --- a/packages/rs-sdk/src/platform/fetch.rs +++ b/packages/rs-sdk/src/platform/fetch.rs @@ -124,7 +124,9 @@ where let response = request .clone() .execute(sdk, settings.unwrap_or_default()) - .await?; + .await // TODO: We need better way to handle execution response and errors + .map(|execution_response| execution_response.into_inner()) + .map_err(|execution_error| execution_error.into_inner())?; let object_type = std::any::type_name::().to_string(); tracing::trace!(request = ?request, response = ?response, object_type, "fetched object from platform"); @@ -172,7 +174,9 @@ where let response = request .clone() .execute(sdk, settings.unwrap_or_default()) - .await?; + .await // TODO: We need better way to handle execution response and errors + .map(|execution_response| execution_response.into_inner()) + .map_err(|execution_error| execution_error.into_inner())?; let object_type = std::any::type_name::().to_string(); tracing::trace!(request = ?request, response = ?response, object_type, "fetched object from platform"); diff --git a/packages/rs-sdk/src/platform/fetch_many.rs b/packages/rs-sdk/src/platform/fetch_many.rs index 4ecf6e42cc..a9efb4ebc9 100644 --- a/packages/rs-sdk/src/platform/fetch_many.rs +++ b/packages/rs-sdk/src/platform/fetch_many.rs @@ -146,7 +146,9 @@ where let response = request .clone() .execute(sdk, RequestSettings::default()) - .await?; + .await // TODO: We need better way to handle execution response and errors + .map(|execution_response| execution_response.into_inner()) + .map_err(|execution_error| execution_error.into_inner())?; let object_type = std::any::type_name::().to_string(); tracing::trace!(request = ?request, response = ?response, object_type, "fetched object from platform"); @@ -185,7 +187,7 @@ where /// Fetch multiple objects from Platform with limit. /// - /// Fetches up to `limit` objects matching the `query`. + /// Fetches up to `limit` objects matching the `query`. /// See [FetchMany] and [FetchMany::fetch_many()] for more detailed documentation. /// /// ## Parameters @@ -232,8 +234,11 @@ impl FetchMany for Document { let document_query: DocumentQuery = query.query(sdk.prove())?; let request = document_query.clone(); - let response: GetDocumentsResponse = - request.execute(sdk, RequestSettings::default()).await?; + let response: GetDocumentsResponse = request + .execute(sdk, RequestSettings::default()) + .await // TODO: We need better way to handle execution response and errors + .map(|execution_response| execution_response.into_inner()) + .map_err(|execution_error| execution_error.into_inner())?; tracing::trace!(request=?document_query, response=?response, "fetch multiple documents"); diff --git a/packages/rs-sdk/src/platform/fetch_unproved.rs b/packages/rs-sdk/src/platform/fetch_unproved.rs index 9e89ad163a..2d85dab7a9 100644 --- a/packages/rs-sdk/src/platform/fetch_unproved.rs +++ b/packages/rs-sdk/src/platform/fetch_unproved.rs @@ -74,7 +74,12 @@ where let request: ::Request = query.query(false)?; // Execute the request using the Sdk instance - let response = request.clone().execute(sdk, settings).await?; + let response = request + .clone() + .execute(sdk, settings) + .await // TODO: We need better way to handle execution response and errors + .map(|execution_response| execution_response.into_inner()) + .map_err(|execution_error| execution_error.into_inner())?; // Parse the response into the appropriate type along with metadata let (object, mtd): (Option, platform_proto::ResponseMetadata) = diff --git a/packages/rs-sdk/src/platform/transition/broadcast.rs b/packages/rs-sdk/src/platform/transition/broadcast.rs index 5c050ce8cf..4b06691e1b 100644 --- a/packages/rs-sdk/src/platform/transition/broadcast.rs +++ b/packages/rs-sdk/src/platform/transition/broadcast.rs @@ -24,7 +24,10 @@ impl BroadcastStateTransition for StateTransition { async fn broadcast(&self, sdk: &Sdk) -> Result<(), Error> { let request = self.broadcast_request_for_state_transition()?; - request.execute(sdk, RequestSettings::default()).await?; + request + .execute(sdk, RequestSettings::default()) + .await // TODO: We need better way to handle execution errors + .map_err(|error| error.into_inner())?; // response is empty for a broadcast, result comes from the stream wait for state transition result @@ -41,11 +44,17 @@ impl BroadcastStateTransition for StateTransition { request .clone() .execute(sdk, RequestSettings::default()) - .await?; + .await // TODO: We need better way to handle execution response and errors + .map(|execution_response| execution_response.into_inner()) + .map_err(|execution_error| execution_error.into_inner())?; let request = self.wait_for_state_transition_result_request()?; - let response = request.execute(sdk, RequestSettings::default()).await?; + let response = request + .execute(sdk, RequestSettings::default()) + .await // TODO: We need better way to handle execution response and errors + .map(|execution_response| execution_response.into_inner()) + .map_err(|execution_error| execution_error.into_inner())?; let block_info = block_info_from_metadata(response.metadata()?)?; let proof = response.proof_owned()?; diff --git a/packages/rs-sdk/src/platform/transition/purchase_document.rs b/packages/rs-sdk/src/platform/transition/purchase_document.rs index aa58b63b32..809d5d81d7 100644 --- a/packages/rs-sdk/src/platform/transition/purchase_document.rs +++ b/packages/rs-sdk/src/platform/transition/purchase_document.rs @@ -101,7 +101,8 @@ impl PurchaseDocument for Document { request .clone() .execute(sdk, settings.request_settings) - .await?; + .await // TODO: We need better way to handle execution errors + .map_err(|error| error.into_inner())?; // response is empty for a broadcast, result comes from the stream wait for state transition result @@ -116,7 +117,11 @@ impl PurchaseDocument for Document { ) -> Result { let request = state_transition.wait_for_state_transition_result_request()?; - let response = request.execute(sdk, RequestSettings::default()).await?; + let response = request + .execute(sdk, RequestSettings::default()) + .await // TODO: We need better way to handle execution response and errors + .map(|execution_response| execution_response.into_inner()) + .map_err(|execution_error| execution_error.into_inner())?; let block_info = block_info_from_metadata(response.metadata()?)?; diff --git a/packages/rs-sdk/src/platform/transition/put_contract.rs b/packages/rs-sdk/src/platform/transition/put_contract.rs index fb7e55b5bc..56a8410822 100644 --- a/packages/rs-sdk/src/platform/transition/put_contract.rs +++ b/packages/rs-sdk/src/platform/transition/put_contract.rs @@ -86,7 +86,8 @@ impl PutContract for DataContract { request .clone() .execute(sdk, settings.unwrap_or_default().request_settings) - .await?; + .await // TODO: We need better way to handle execution errors + .map_err(|error| error.into_inner())?; // response is empty for a broadcast, result comes from the stream wait for state transition result @@ -100,7 +101,11 @@ impl PutContract for DataContract { ) -> Result { let request = state_transition.wait_for_state_transition_result_request()?; - let response = request.execute(sdk, RequestSettings::default()).await?; + let response = request + .execute(sdk, RequestSettings::default()) + .await // TODO: We need better way to handle execution response and errors + .map(|execution_response| execution_response.into_inner()) + .map_err(|execution_error| execution_error.into_inner())?; let block_info = block_info_from_metadata(response.metadata()?)?; diff --git a/packages/rs-sdk/src/platform/transition/put_document.rs b/packages/rs-sdk/src/platform/transition/put_document.rs index 7c9fecac3a..feadb98cbc 100644 --- a/packages/rs-sdk/src/platform/transition/put_document.rs +++ b/packages/rs-sdk/src/platform/transition/put_document.rs @@ -95,7 +95,8 @@ impl PutDocument for Document { request .clone() .execute(sdk, settings.request_settings) - .await?; + .await // TODO: We need better way to handle execution errors + .map_err(|error| error.into_inner())?; // response is empty for a broadcast, result comes from the stream wait for state transition result @@ -110,7 +111,11 @@ impl PutDocument for Document { ) -> Result { let request = state_transition.wait_for_state_transition_result_request()?; - let response = request.execute(sdk, RequestSettings::default()).await?; + let response = request + .execute(sdk, RequestSettings::default()) + .await // TODO: We need better way to handle execution response and errors + .map(|execution_response| execution_response.into_inner()) + .map_err(|execution_error| execution_error.into_inner())?; let block_info = block_info_from_metadata(response.metadata()?)?; diff --git a/packages/rs-sdk/src/platform/transition/put_identity.rs b/packages/rs-sdk/src/platform/transition/put_identity.rs index 59422aa6b2..1652f89569 100644 --- a/packages/rs-sdk/src/platform/transition/put_identity.rs +++ b/packages/rs-sdk/src/platform/transition/put_identity.rs @@ -56,7 +56,8 @@ impl PutIdentity for Identity { request .clone() .execute(sdk, RequestSettings::default()) - .await?; + .await // TODO: We need better way to handle execution errors + .map_err(|error| error.into_inner())?; // response is empty for a broadcast, result comes from the stream wait for state transition result @@ -81,12 +82,14 @@ impl PutIdentity for Identity { let response_result = request .clone() .execute(sdk, RequestSettings::default()) - .await; + .await // TODO: We need better way to handle execution response and errors + .map(|execution_response| execution_response.into_inner()) + .map_err(|execution_error| execution_error.into_inner()); match response_result { Ok(_) => {} //todo make this more reliable - Err(DapiClientError::Transport(te, _)) if te.code() == Code::AlreadyExists => { + Err(DapiClientError::Transport(te)) if te.code() == Code::AlreadyExists => { tracing::debug!( ?identity_id, "attempt to create identity that already exists" @@ -101,7 +104,11 @@ impl PutIdentity for Identity { let request = state_transition.wait_for_state_transition_result_request()?; - let response = request.execute(sdk, RequestSettings::default()).await?; + let response = request + .execute(sdk, RequestSettings::default()) + .await // TODO: We need better way to handle execution response and errors + .map(|execution_response| execution_response.into_inner()) + .map_err(|execution_error| execution_error.into_inner())?; let block_info = block_info_from_metadata(response.metadata()?)?; let proof = response.proof_owned()?; diff --git a/packages/rs-sdk/src/platform/transition/top_up_identity.rs b/packages/rs-sdk/src/platform/transition/top_up_identity.rs index 48145234f4..d8595bee56 100644 --- a/packages/rs-sdk/src/platform/transition/top_up_identity.rs +++ b/packages/rs-sdk/src/platform/transition/top_up_identity.rs @@ -47,11 +47,16 @@ impl TopUpIdentity for Identity { request .clone() .execute(sdk, RequestSettings::default()) - .await?; + .await // TODO: We need better way to handle execution errors + .map_err(|error| error.into_inner())?; let request = state_transition.wait_for_state_transition_result_request()?; - let response = request.execute(sdk, RequestSettings::default()).await?; + let response = request + .execute(sdk, RequestSettings::default()) + .await // TODO: We need better way to handle execution response and errors + .map(|execution_response| execution_response.into_inner()) + .map_err(|execution_error| execution_error.into_inner())?; let block_info = block_info_from_metadata(response.metadata()?)?; diff --git a/packages/rs-sdk/src/platform/transition/transfer_document.rs b/packages/rs-sdk/src/platform/transition/transfer_document.rs index 140a6e3166..4bb6996da5 100644 --- a/packages/rs-sdk/src/platform/transition/transfer_document.rs +++ b/packages/rs-sdk/src/platform/transition/transfer_document.rs @@ -96,7 +96,8 @@ impl TransferDocument for Document { request .clone() .execute(sdk, settings.request_settings) - .await?; + .await // TODO: We need better way to handle execution errors + .map_err(|error| error.into_inner())?; // response is empty for a broadcast, result comes from the stream wait for state transition result @@ -111,7 +112,11 @@ impl TransferDocument for Document { ) -> Result { let request = state_transition.wait_for_state_transition_result_request()?; - let response = request.execute(sdk, RequestSettings::default()).await?; + let response = request + .execute(sdk, RequestSettings::default()) + .await // TODO: We need better way to handle execution response and errors + .map(|execution_response| execution_response.into_inner()) + .map_err(|execution_error| execution_error.into_inner())?; let block_info = block_info_from_metadata(response.metadata()?)?; diff --git a/packages/rs-sdk/src/platform/transition/update_price_of_document.rs b/packages/rs-sdk/src/platform/transition/update_price_of_document.rs index 93da9aaf2b..779faf52d0 100644 --- a/packages/rs-sdk/src/platform/transition/update_price_of_document.rs +++ b/packages/rs-sdk/src/platform/transition/update_price_of_document.rs @@ -97,7 +97,8 @@ impl UpdatePriceOfDocument for Document { request .clone() .execute(sdk, settings.request_settings) - .await?; + .await // TODO: We need better way to handle execution errors + .map_err(|error| error.into_inner())?; // response is empty for a broadcast, result comes from the stream wait for state transition result @@ -112,7 +113,11 @@ impl UpdatePriceOfDocument for Document { ) -> Result { let request = state_transition.wait_for_state_transition_result_request()?; - let response = request.execute(sdk, RequestSettings::default()).await?; + let response = request + .execute(sdk, RequestSettings::default()) + .await // TODO: We need better way to handle execution response and errors + .map(|execution_response| execution_response.into_inner()) + .map_err(|execution_error| execution_error.into_inner())?; let block_info = block_info_from_metadata(response.metadata()?)?; diff --git a/packages/rs-sdk/src/platform/transition/vote.rs b/packages/rs-sdk/src/platform/transition/vote.rs index 56864a760c..9a7906ffe4 100644 --- a/packages/rs-sdk/src/platform/transition/vote.rs +++ b/packages/rs-sdk/src/platform/transition/vote.rs @@ -71,7 +71,10 @@ impl PutVote for Vote { )?; let request = masternode_vote_transition.broadcast_request_for_state_transition()?; - request.execute(sdk, settings.request_settings).await?; + request + .execute(sdk, settings.request_settings) + .await // TODO: We need better way to handle execution errors + .map_err(|error| error.into_inner())?; Ok(()) } @@ -106,7 +109,11 @@ impl PutVote for Vote { )?; let request = masternode_vote_transition.broadcast_request_for_state_transition()?; - let response_result = request.execute(sdk, settings.request_settings).await; + let response_result = request + .execute(sdk, settings.request_settings) + .await // TODO: We need better way to handle execution response and errors + .map(|execution_response| execution_response.into_inner()) + .map_err(|execution_error| execution_error.into_inner()); match response_result { Ok(_) => {} @@ -125,7 +132,11 @@ impl PutVote for Vote { } let request = masternode_vote_transition.wait_for_state_transition_result_request()?; - let response = request.execute(sdk, settings.request_settings).await?; + let response = request + .execute(sdk, settings.request_settings) + .await // TODO: We need better way to handle execution response and errors + .map(|execution_response| execution_response.into_inner()) + .map_err(|execution_error| execution_error.into_inner())?; let block_info = block_info_from_metadata(response.metadata()?)?; let proof = response.proof_owned()?; diff --git a/packages/rs-sdk/src/sdk.rs b/packages/rs-sdk/src/sdk.rs index 2b9268f275..466dba051a 100644 --- a/packages/rs-sdk/src/sdk.rs +++ b/packages/rs-sdk/src/sdk.rs @@ -28,7 +28,7 @@ pub use rs_dapi_client::AddressList; pub use rs_dapi_client::RequestSettings; use rs_dapi_client::{ transport::{TransportClient, TransportRequest}, - DapiClient, DapiClientError, DapiRequestExecutor, + DapiClient, DapiClientError, DapiRequestExecutor, ExecutionResult, }; use std::collections::btree_map::Entry; use std::fmt::Debug; @@ -672,7 +672,7 @@ impl DapiRequestExecutor for Sdk { &self, request: R, settings: RequestSettings, - ) -> Result::Error>> { + ) -> ExecutionResult::Error>> { match self.inner { SdkInstance::Dapi { ref dapi, .. } => dapi.execute(request, settings).await, #[cfg(feature = "mocks")] diff --git a/packages/rs-sdk/tests/fetch/broadcast.rs b/packages/rs-sdk/tests/fetch/broadcast.rs index 56e26f457e..1dc45ab701 100644 --- a/packages/rs-sdk/tests/fetch/broadcast.rs +++ b/packages/rs-sdk/tests/fetch/broadcast.rs @@ -33,7 +33,7 @@ mod online { // we add few millis to duration to give chance to the server to time out before we kill request let response = tokio::time::timeout( - TIMEOUT + Duration::from_millis(100), + TIMEOUT + Duration::from_secs(1), request.execute(&sdk, settings), ) .await diff --git a/packages/rs-sdk/tests/fetch/config.rs b/packages/rs-sdk/tests/fetch/config.rs index 1b6efbc615..52556ddb9d 100644 --- a/packages/rs-sdk/tests/fetch/config.rs +++ b/packages/rs-sdk/tests/fetch/config.rs @@ -225,8 +225,8 @@ impl Config { // Next time we need to do it again and update this value :(. This is terrible. // We should automate creation of identity for SDK tests when we have time. Identifier::from_string( - "a1534e47f60be71e823a9dbc9ceb6d3ea9f1ebde7a3773f03e49ef31c7d9c044", - Encoding::Hex, + "G1vdreUUxFAmt3bd2kJmV8idrhPCvRQis4cQfRQayWW2", + Encoding::Base58, ) .unwrap() } @@ -252,7 +252,7 @@ impl Config { /// /// See documentation of [contested_resource_identity_votes_ok](super::contested_resource_identity_votes::contested_resource_identity_votes_ok). fn default_protxhash() -> String { - String::from("d10bf435af7c75f5b07b09486af1212469d69fdc787589548e315776bc1052a1") + String::from("208a6f71a8b68d20485d568d3039124c5b930d893e73a23774081de0be6e30dd") } /// Return ProTxHash of an existing evo node, or None if not set diff --git a/packages/rs-sdk/tests/fetch/contested_resource_identity_votes.rs b/packages/rs-sdk/tests/fetch/contested_resource_identity_votes.rs index e213b6ac2f..f5bb18eb57 100644 --- a/packages/rs-sdk/tests/fetch/contested_resource_identity_votes.rs +++ b/packages/rs-sdk/tests/fetch/contested_resource_identity_votes.rs @@ -67,7 +67,7 @@ async fn contested_resource_identity_votes_not_found() { /// * enter `ProRegTx transaction ID` and `Owner Private Key` from step 1. /// * top up the identity balance using `t - Identity top up` option (1 DASH will be OK). /// * exit Wallet screen using `q - Back to Main` -/// +///t /// 3. Vote for some contested resource using the masternode identity: /// /// * select `csnq`: `c - Contracts` -> `s - Fetch system contract` -> `n - Fetch DPNS contract` -> `q - Back to Contracts ` diff --git a/packages/rs-sdk/tests/fetch/data_contract.rs b/packages/rs-sdk/tests/fetch/data_contract.rs index adddd35cd6..0bdb04ac91 100644 --- a/packages/rs-sdk/tests/fetch/data_contract.rs +++ b/packages/rs-sdk/tests/fetch/data_contract.rs @@ -135,7 +135,7 @@ async fn test_data_contracts_2_nx() { async fn test_data_contract_history_read() { let cfg = Config::new(); let id = Identifier::from_string( - "20d16030541c0494e84064e2e72b5ec620546305849a2f9d5893a5e65072364d", + "d915a19b173d43a2a375132fcc8009c5a9dd9cb63b1a0bdabd69e4c38cbea664", Encoding::Hex, ) .unwrap(); diff --git a/packages/rs-sdk/tests/fetch/epoch.rs b/packages/rs-sdk/tests/fetch/epoch.rs index 0c8f429d7f..f898f2abcc 100644 --- a/packages/rs-sdk/tests/fetch/epoch.rs +++ b/packages/rs-sdk/tests/fetch/epoch.rs @@ -1,8 +1,6 @@ use super::{common::setup_logs, config::Config}; -use dapi_grpc::platform::{ - v0::{get_identity_request::GetIdentityRequestV0, GetIdentityRequest}, - VersionedGrpcResponse, -}; +use dapi_grpc::platform::v0::{get_identity_request::GetIdentityRequestV0, GetIdentityRequest}; +use dapi_grpc::platform::VersionedGrpcResponse; use dash_sdk::{ platform::{ fetch_current_no_parameters::FetchCurrent, Fetch, FetchMany, LimitQuery, @@ -27,7 +25,9 @@ async fn get_current_epoch(sdk: &Sdk, cfg: &Config) -> EpochIndex { let response = sdk .execute(identity_request, RequestSettings::default()) - .await + .await // TODO: We need better way to handle execution response and errors + .map(|execution_response| execution_response.into_inner()) + .map_err(|execution_error| execution_error.into_inner()) .expect("get identity"); response.metadata().expect("metadata").epoch as EpochIndex diff --git a/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/msg_GetContestedResourceVoteStateRequest_aaaa80ce4fdfc75252132a85e6c12bea6a47c9f7bf30133713b6b5cfec3a4d57.json b/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/msg_GetContestedResourceVoteStateRequest_aaaa80ce4fdfc75252132a85e6c12bea6a47c9f7bf30133713b6b5cfec3a4d57.json index 822344f493ef34d65a9bc55fec3e59bbadcb629e..c0abf2658ffc973dffe5f477731a148e5ebbb1ea 100644 GIT binary patch literal 154055 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⩔sa~!iqjTN-kM#vj}iR?{H5- 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 diff --git a/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/msg_GetContestedResourcesRequest_8f71462d5f438e1b12fedf94ad5799af81392b7b0cbb7e86412da37ab13aef4b.json b/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/msg_GetContestedResourcesRequest_8f71462d5f438e1b12fedf94ad5799af81392b7b0cbb7e86412da37ab13aef4b.json index 01c11efc17f5bb335927feb3f588ca8923746bd4..476f7f0c6e3fa9cb5e345d7cf9d2223936a8d8b8 100644 GIT binary patch literal 78688 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 literal 94813 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 diff --git a/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index b0fd7fd2be28484d3236142bfeaf40d55aba1928..d438f5cdd3c70a33082da0d6fb21c942f97f77c8 100644 GIT binary patch delta 2352 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_not_found/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_not_found/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_not_found/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/msg_GetContestedResourceIdentityVotesRequest_3eae9b60bf6fb0140e51ef4cc1c1b4eb361d64607a75a117ebf3096fafb32a41.json b/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/msg_GetContestedResourceIdentityVotesRequest_3eae9b60bf6fb0140e51ef4cc1c1b4eb361d64607a75a117ebf3096fafb32a41.json deleted file mode 100644 index a230d7abfeaed3039dd1770d5641e6230b94406a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47498 zcmeI5-ELb)5`_2KPZ9W<7d#XxiFt{AfFKZzwY(74D+RJ*U}5;(x4!AIbR5~{e1rH- z03GXRe!8lwtNV}v{OQ#%zr6l~`DLEnj`Jj(#~?LAhKXwqHfLUmbk8+ORB_ zt4l7|->f3OT%EL>FFgytf7$u^{mp-G9+IrvKi|K9{NdfZcOR~w|MdRt_5IbG5C6Kp zeS35J?`(Rw|MU8B(}#yQ_YYTZ9wJ`|j?q$NzDE_wl-KZvlPI ze?Pza{OTXCKE3|ue_sFk8`)d7o3mYe?KfauwoCrz>qEZIp9pDT(SCEdWZl=B)?4@a z{f|~Xu8mIXn)A)^B42LXUrYOL;Do1h5+>mi<`yV~ef|^#XDyq<#pcj{m@0TeTZgRw zyWboWSA$#U9uMs&IkiOz7m1X+LQ~eUd`tX<(0_9xqNwbUpw0>EWH`l982@tD{t4P) zJFq`o6gS0p3mu4ur*lFPF&#EJ@UYt?g~V5+wV&iy{ICh&bi@nMk_AMQ+k51E8`211 zL}H2Pa5f~JiE2?nES!KOBzoY)1 z=2u{=l_U|IZ?3>{q%bh508vpHxfTQ+l?e%ABMe1UxQ!p58Q^JvC)>>`iNupDe&BMe z#g%b@{N!}dG);APw>jA-S6JqNgWXg&w`7Y9j20~mge1zqAXx=w3W}4nUT#sSNqSzY zIuza{E>0zNNFt0a0NHqgT3i$<+f49UNZIm}JqIAU#Slx~#SEphY0<_BWvNnkmac|H z@Ymnmu*e8XAXfSW1D4o0!X%)q!eA_D7qSrSyAapqVk^z-g1?67~lYjfK4Sb zc$=uQSX+>tx|^TC@c2j>ZVhUPGN@HBJqtz~Y_aht(Z)jxvX)cQZ9OE4GFT?s2O_rv zRZu8JMTB|z>Z3^w>z1TUJo(C`07RObW!Q4X6m7WW{1lYsR?bVg1y{FRB^^faB;C%g zxxz+e{70K%)2-8aa$)?+rn^K=28XMUESSWV2$gP?VqNg52-Cti+?S8tg0@YT@#Hp2 ziLA}NQKJ%_{$k1p)N;DRU=30F{O0*e-k?ZSN>s+fIp59(6N!k=nA}kp3C#M2%3WO{ zxuO%9EhxnHi0Z22hUvR@C0$f^t}yB2`~bJpV4UA?5hxn57D%utzl~@$3RB(0Gpr2~ z;akiEWVV>Vk_B7c4z+dias$0<$3@bC zn2aD=r4YHEYL!mQdebGjLMntUQY3wg;vpCc`i`!Q(rPFu$ZXeN>(wz4ZT^cGnnq9u1JG3C_rskn#o<_H@TxnD{UkT zesVw_mRPku#2Rbu#M&uN&We^>SPBr84#QGEUnw@{8=K_{$r4+g83;BDk&{7fn-}Yimb!ab6aj9!Dp@m8Vf*U*n1DJzSup39 zFs#+6M014^#>Dz@VdrqSxZ2imC*}P1^f7*m8mCqKc$aD-QfUICY&7F1D?%ze%Ku&U z)supqv1R`%fvGa5D_L8Za1#FzjXozzQew#!su04JvMlH|ji%CJ3!f`IS85BT5w0W_ zwiwM%Jp1UV%rpf>b^x;qk)?q`Ow+{b4P;WFT0>GSXF|K46o*wMr1D$STxOz@Z(${I z%4{jR;Q@oiY15`tLu`mL^62Ge+@=C^qLokgL?!3*4rH8Oo9i-6_5PA<7C%3X+(wiXeN+aU4V z+@(bt$XpRcnJuiBvlAjWz_~)s5&$tG&w8B*%aWWW2q_bqQecRh7;-|CDcHzEaZCE7 zNJyVFTegH@VXg%WT= zny{eceL^bIg$PWQd=?w*Br#3F0I8%~L82~|_mqiQUqBT06o}FlS0w2s9c)Pk4ZUoU zWjJ0MIedIE!jNFevI*X%cszKJCKxlRI`Jf}rk1VJ#*rd0WslY7Y-W{mn#rr=Qdz!C zTz*qoviqPSS&wyv4onVFMAh1s(22=7L!A*-FE?2cC`9Q>dMTx0Lh2}tX~0r)VOy2# zBjmc3?RdJ0%5PzpF>uz0WV0ocgQhE!yisG$SDlNH41}Nt_{2He6)~6^Yx<=$G3!Ga_fs=)>YO$EyPa`Z03_)!wu5>zIjdoZKNy8jQ4CAe#3_>lqU>t(bb(&HSrTqY|YdiTT-eDxXN03y;)zZ z+AWGD@LDb9O&h~1R~W0A38`gG0f$@Zv6T)xrs4*QE;&PTzNw3>SBfGXc^MC6eWEf0 zTb16p;RLcepMGcJ34~IJ2&q^y{fJw}4YNWTUSD!mxh4y?x+7Qfh*VdMqXvb7tQOn% zC(AUHkksO++Dc-|#KtL|sAbx&aU>*>@-z;^mS!^JKoC;9Xnae@ZUYMzTM@xx7<2tJ z@fcA-R77PU^jw%y#lRKhtT!Qb6ef4D6or_AWxafMhO1m8=fH_A#3tWTBPnJ}1{+OR z1_PtUobS}0kPHNL5~9q6R_pZ^qh5$LED=)9HwCB^h%i+AGI-(1iNqZ4#A7-1^gQcp)nO0u5v|xsaw(_jcM47q;^y~=qaXiL2P`| zhy)0xqAPdm3buq*lRgxcmjTkTo370jp-W|44ydUM-5G=0a0T#W&}<>;7PTqxPOQ^W(z^z;-+ExY+r2EAW^mIP|~HJ8XzQncrHaz=J3jes*Vz&2&r(QXI;efwZc~?HEvxLWcRuta|nbg)~V@(v%oi$WIVD5JPXjMLnK} z;k?YdE3B9A6=N?pDzmDrv^yd2&#-hp^5z9WttbQi9a;4 zZFQ^j>S6S%LY3C@l7CZP-CAURh|1K8%|GWWPt6b^JHz% z(mzqVYypm_2}`#v(oQ{1go-HAC)1HqRm37%nL9$VhG2>UZJ1oZl38Ew;oQK^>2YSs zD(j7H28BbNteHk!!f-5EkBwHX)nvUP7HveUW{YK29bQ^>%NH&=?4Os*u8` z_2lqr2ODXFR8Zx5xT`Wd8Q`GKdV`&itX$(EKfg`^;<2kzg{Z(+E*+h0|K7L3qK5YQ z4WHI7qUa;_bD(wN@Vj{Vksdna3W;O&c&+gSbF7}zD`nPv2%;ma94}LLSRX~-4cPBEy03}mB0c& z7NJ}vc{l4jcALk6nZ|rJ^!@*_VaaDiJN|!%U3%NK|@8b!SOtW~ElMM7|WHG!*< z8gSctpZ&AeUi(y=-=2K;-P3osZ{FU$e)aVG?|#eMe&gcd>%6;rar^52?*2c|?_T8F zKg=dIyF4BqzMd{`R&Se#jO)hfj4dS$fw z{`JcFyb3&BtsPd;rpwh2o~=@vrqe3K`X{IL52jVXRUXIlN9W`5>f@W~e6e~nt=_E5 zJ07P6fge9uKYe-k@4Nfp^y=4_FCV`7`sbhD-v05sZ(iKKdH&Pef84%$arf$+OTn+xws1+&};6{`tGt_qWe~dHwQb81Ve=)z7bgfBY|RUcb9t+~s`HBI=U)r0ND zc?t9EaK6r$7xOs!cMN4Vg&psZ}vrdPkb(+6bbnJI(`B(#|soBPA?qZ@ZnfGm) z)&#attN|YjH8=l{$P}FwS(Eewz51iRJ%3bt+HFYWH2RITa1uiLx2$U7+k`zwo_wbY;E3d!_H-tM6OYQRjMFZ&foFby2geo*pX|LaeOGp{3vP*C;=*fx-NqZ@! zF;;}&4n0g2v@6qCxptO^JBA&pzI}_0xge}Z2|VM91=6Eg;qEADcfhAA8b%32T7{6j zg{N1tp$d0oN(Ov!5pgTe6GEbV1KCMF8fDaOvM|@q8%n8#s=mM>h_qc96Cvc#H`0e* z0EECzDZL_>dLGBbEH@<`BArvw0VR2*lFpC4Ohmbw zxg%EO{Gcq?+NLBZXqQ?=ScKzHFTy%kL9D`35|Poh+sv`v+T*RJE<%iEMGGz>DUdav zh@Lcdsd`5gdQ!kEO0&xHlF=>@G7-fh_UO{5Fv@DE2Wh_Uh%_piDb#8eqJf1YvPsH3 z3YREFdkmoX4mdKiHiHo#f)5v8 zOGvK-4xT0?xlT7jCK^Z@Ye-QVGG8ULY-(O5x_6Yrs3!}DQLYWya9Hr_I?yM$;ewZ$ zVvTUqtt`gI>R?Tc%J~EwUNFjyY&6*g5ko4uA>u+3nvxYYZEUuNhDf7?e%#nyI*@g< zUCoMuR-Ka7#h+7DV>=X*Rj-j^ALH(E8NIsfxEy9Qgj6H3?TBmDwb%WX5`=^;A%e3b zioj7UM01)|c&k{%Mf6u+E{%ki?Ydz8C_DBVke|xd!bXgB=*Zts79r+ zibWEmC#KxH@)Cx$7TuKzfu9eIJLGmHtbMW)4QU~I!J9AV1WH2)Ra!`TtE#r)11H{ZZw|-Kt#Oo`1+g{2>~sylhW9g!zib3aE}ov|3cOV=hax_Nwhs z9^vqg5S?+nBaJAEHP?TL9@*m*B0y+} zkd~&;=~0H@<3?SSggZzjh_|uAs2b-(et~0Ylw>trj3ndcCZIP8Qn4<0bKAc1sy6A8 zHYx+9q)L|r^pO~`Jt>iRwz0VW>LPH*m>Sjm=d1`pN~z}yb~>#opVkY5s`{u9MWqnJ@ z4Uw$GrS>vMwGZ6#c|~1fucQ)^mmUIKlA&GS67tfN0tYoJjFlTmQ$o@%B&4ixzchqs zX6?f$?QQ5Jpw~E{t2k%NP_JgH^8iY_k`JZS_Rd*tACS6)iXtO*2^Gbqpp)L>mT9A; zu`MA~ml8&!NZH2B#&J6w?b0slT4F(5XK?P=_Ci`U6|Rg5e6-6_vM_Lgd-I~9V#zqf zR&JL@h?`GJ7Oks`pf>C&M8^TS-6(QjtvyC5))-<$ z0SzQ>)SQNVmvbYq!*i-G% zSRqwWNE8u-g@>X!?QL#BLXu{c5K?<7>xviP8Y1JS zg<}Zfwi)jeRZ=iA4zZ<~CAQcXuejg?NWA*md=nV<2}CZXHzroPYWaafYS9ksI8=(I zQF|s-OOBKY5LqRu+OVec^$NG+X(%OY34&TES0YJ>jstSLQGBgalwyq`nw1E?aWB_( z*@-E(FVW=YpAh)jNW91;DRJSUhe(;_6S@*=%GJ%=gcX?hkQ%9n^N11UcJQYnFACWZ zkqcEMSD4O@w0Eg}GuE|_yzH1Y1u;8?)EE&_ICkhNE5?qyeJ&@;!*o^PTLf97L@hJ8gQ?>MJj5)bfNr>mES_XV+ENzNhAtXer&N32lYgWW4L7}5chl?}? zENV_FO@HX_-F`~{+swS=)>r%BC5aVc$*NVPS4uo&QA-eRG^-Rs(v%4m`y~W2a0gGi z!bCcnSa26aMthA~$x3Q(;XzQSxMZcEWI!;=*T#K--oH0rz=~jYD}q=T(T6mOYL7Bd zO3g>A9{F$yp(2t5fQXDp36&kOZ^?0yQ7XO1YcrjOeFAMSyouqA*Ci^d%!f!+R`E^A^Fn; z6|$gALz=1ut#zERuO_nvc@Cq+BtzBe! zTx@7m3BKkd3~7r(DjC4ck=f^i8acoDP)m~!mfR8q=%SWqYRW2VKy*zA+`ny9qTutF zGGx$$+Eo{5ZcQ) zO{C;s%b0Q| zk`T(kEK130X|K3cIVG#!*08rFq4G9Sx>UZju)0<@(z`pV8>xS~yDr9(dNx*9SJ=gL z*te|GJlYApTOn~OT?A=Dko|ae6jV#JsFB=3I>cnZgZpv8-XB%Y+Y)4v)>!W~$!f>C!3$cmLYE!-)MSZNM>5(x@UH>dM~iG@&x&{34?5 zB9~Ml?Jc9Sm(?XvL`-5#yrKeEAOpgC;2aPM0-E= z<|TA$lsv79OYe9>r-l$UsC^hHDJ{JcWvfdl%@ zavPX`sncKKT;%ASoux7V3TJBr@(ZAwc;-(|I`cq-g z8Z4y#7LxQ=CS;GSqx39=&}RgA2`jNs*6T923p8}t(=v!O$knh}MHXe$>!Oz=Nr{pP z3aYkb-%4fQckPiqeyp>TczF9C5Cc(zf{a_wk7x+7>yj!^&`J;8l(?3fSfcm@Y5CbL zG}@i(zj*Wg`G0Ac66x6g>2S;fTm71-MJDerK0r^$uDj3t7V9%V_~cv5oBZ?R`~Lz% C0VIL| literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 808b4f01189bc76a5960f835750320fe8eb70b21..d438f5cdd3c70a33082da0d6fb21c942f97f77c8 100644 GIT binary patch delta 2559 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/msg_GetContestedResourceVoteStateRequest_8789d5d98ad7f00573a87fd0860dbd43fab2e54a98aa44bc88c049e1cf72f5fb.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/msg_GetContestedResourceVoteStateRequest_8789d5d98ad7f00573a87fd0860dbd43fab2e54a98aa44bc88c049e1cf72f5fb.json index 9f6fdc1a41193148c110a574c39d486357bbe343..36710143726804b9c2e67f0437b5d60f5d502804 100644 GIT binary patch literal 48680 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 I=cmvA0qcSc`~Uy| literal 48725 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_nx_contract/msg_GetContestedResourceVoteStateRequest_f700de7bfd247d4f0193fabc530ac956499cf0081eb632e6d84ef4f9c32d8690.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_nx_contract/msg_GetContestedResourceVoteStateRequest_f700de7bfd247d4f0193fabc530ac956499cf0081eb632e6d84ef4f9c32d8690.json index e9e6c9759de46d0dea22cbfb776dafd0d606559b..9aa61c1d5cd990abd431bd2e2828becb1dd7002a 100644 GIT binary patch delta 18 ZcmeBInyIj1Df8wP%=tX5hDN5bwE#cR1`_}P delta 262 zcmY*UF%AMT3>$9c5s2AC(k8w3G4}~J2E-GXS&`V0_#jTM14xb%IkwY2j`!31wS1n- z`EWCXmWpZ^9b<*6U^vF$q^zA$Z6WavBkW%u78Qymt-l@>C*7wvg^@@mia{5q?gn;> r_ai|{EZVG+r&ky;@(m4M;RfR%39j1Qdg_DcKxh~vwD4y&+IIZ{tuZy; diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_ok/msg_GetContestedResourceVoteStateRequest_aaaa80ce4fdfc75252132a85e6c12bea6a47c9f7bf30133713b6b5cfec3a4d57.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_ok/msg_GetContestedResourceVoteStateRequest_aaaa80ce4fdfc75252132a85e6c12bea6a47c9f7bf30133713b6b5cfec3a4d57.json index 300e476a45efe82d06c6fbbc30d2a237fcb3ba55..c0abf2658ffc973dffe5f477731a148e5ebbb1ea 100644 GIT binary patch literal 154055 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 PAH4Ui{fqqZr=R~1ms`b@ diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_ok/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_ok/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 808b4f01189bc76a5960f835750320fe8eb70b21..d438f5cdd3c70a33082da0d6fb21c942f97f77c8 100644 GIT binary patch delta 2559 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_ok/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_ok/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_ok/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_with_limit/msg_GetContestedResourceVoteStateRequest_7a62b33ce71dec56fbbcb0302eac0041cdc16404006d1b30577292c6ce106cdb.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_with_limit/msg_GetContestedResourceVoteStateRequest_7a62b33ce71dec56fbbcb0302eac0041cdc16404006d1b30577292c6ce106cdb.json index e88e9376ff7b1797ed9c6074ef77ee756e00719f..7be73b810dde2a4336853cd58b582ae2dc458dc7 100644 GIT binary patch literal 136910 zcmeI*UyoJSkp=L1_NPER^T2Jurt>!MqnQs7MTpqU2!%j|v1g*l-+k6Pd%HPc1N(O- z%@F5Ehvs(o{!>+J)vDV2UhKbpb?46AAD_Mc{`sqycYk;1Z~3-AxPS9H-+lY)<(t<} zzkT!M`FHv8@3$cxcJ<)?y_;_?_aE-Qxqkfio5$C0Uthj?wEO1%)$W^bcJr^UcEhe7 zT;2|QxF5B9eYwBeBkyJb(G^iyyvw_T`(dn(^o%z^)Fxj?e2g4>F)1- ze@TkO{Rdau^YGp!Xf}A4OJ6_A>-@R&`wV(`@6qFqdw0@)>cjm0W20`yCaPnbukVEw z@7I-@{q@@=y4It6G3(Lx!)VA`Z^t70uMh8C$F9xYvF`Pw z?I&4vv$C;>rQIuG%D4`{U;Asq{LLpUN(#r8M-Te-lje*VCE`Et_3*80S>n_46N?d> z5%10Py7=hrItfv2dUWs6rGd)pK8aXDmuEBd(N%xak)I0SA0XNKApHe=``lWNYEK>%-ZAu*ZMt1pRzV6~Sqx8uvcy~&(_LHizpOT~( zAf{CxVg7FM0e!K^E;6ONkQYhR?1HiCE=rP%?NY10ao^SbSS29FDofa8tMGgxE>ns{ z9wdo+QOB1xVPLmDzV;`cbz4^bbJm_lz`sn6cGg_RH1}Qc)b%YAtkNKF2TK^$0~9p;U$ws zS`mT=^e|pftxRC0?JN%uBs)@ly^4*zAgqTAoa2fG(xX;k?I>vvz^5u2MhQdeg^;|C zCstCS3U_2m5`0b(aVyWWh3xVfWGD9MF2i?|h0S-aP)aRS^$CX{(r_hBgpfnuNFUk& z2!U%-VntJO2}WL|ThR5Ta5S*lLOUhdVnnH+FCXP0*A_SP0}RNJQW>Kl2?4FU%wn87;fD9R2Nh>}onih*7Jkz(phlvf2~T zlfX`|59~rG1#D4jRf?CSc7c$LC>9xyQ+f&`tA=`z=4*{eprV;Vt$HCESU4h^q|C!{ z*`TD`!AvxrNM*Zxg^Na7B_k({+0jQ9|ISorEf zVkK~JHX+G1yBRXkK+;%4ip-GwDw(BHb1BifqZ~#(nH)yBHe|zL!K>v!PjF)jHZ#Q< z;ij%EgN@a}ngW&e2{>#p%8gVssRa>3a=BY%3Q1^OR@5}GsT#UP0wwh0z#h_pl$&)m zD+=m$T-GUmPEn0*QixS;BV~LBw~kBdb;^O}FsUJ=8iuVSu3mS%)~~oAB&-V&oCCWE z9K}L3r&fixibbY~o@;oIkPsQwEd;&>Ru5%SHYqV9N;;+338{Fz(5YOK@iQq@qY_xf zB8Jh4DScNSVMu+^TA3~Ieqi*F>q^-1u}UKq^7JffYt|a4z`;ju|MiYD_VbjLuC!?=DEiPQlJ?z2sGG5+w~( z5=u#xC<*ApFk*X5BJpfsvHW$4z@5PqsM^0-MF^5fU0<-%Y>f+zszj+Kp(e~-C@&)E zR0872$d2W=ewx}8Ta<#PgQhALvOzxzRHk&66s8O|O-rDH#X1lh3D?Khe#I{3TU_oI zu}Y?NyyQ{G2X48q=#-3CQVGdR4*@R5P_3^EdDNu9L4gWmr30x+NZLt4vI^@=hYq*Fpgk¶=h06C%wfg(?CgJ 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 TCb{LadWVN-oLFh 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 PAH4Ui{fqqZr=R~1ms`b@ diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_with_limit/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_with_limit/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 808b4f01189bc76a5960f835750320fe8eb70b21..d438f5cdd3c70a33082da0d6fb21c942f97f77c8 100644 GIT binary patch delta 2559 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_with_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_with_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_with_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_with_limit/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_with_limit/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_with_limit/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVoteStateRequest_aaaa80ce4fdfc75252132a85e6c12bea6a47c9f7bf30133713b6b5cfec3a4d57.json b/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVoteStateRequest_aaaa80ce4fdfc75252132a85e6c12bea6a47c9f7bf30133713b6b5cfec3a4d57.json index 300e476a45efe82d06c6fbbc30d2a237fcb3ba55..c0abf2658ffc973dffe5f477731a148e5ebbb1ea 100644 GIT binary patch literal 154055 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 PAH4Ui{fqqZr=R~1ms`b@ diff --git a/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_40fdb3c49ed1a0b60f507eaff93e9cd544302ca273452d9075620c895b6f7974.json b/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_40fdb3c49ed1a0b60f507eaff93e9cd544302ca273452d9075620c895b6f7974.json new file mode 100644 index 0000000000000000000000000000000000000000..58eb80149c123484475b2a0400c7f59d04c9353a GIT binary patch literal 80382 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 Dr|tR1 diff --git a/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_606cb2d93ca22b6a73e58bca36002e4d9a981806b2efa77c35b08bcffe360bc5.json b/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_606cb2d93ca22b6a73e58bca36002e4d9a981806b2efa77c35b08bcffe360bc5.json deleted file mode 100644 index b5cd7667fde793a8de866daeb1a8af1dd44a4b70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83812 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 QZ~WlFxArgcufP2Kzip%Zv;Y7A diff --git a/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_901f0f04456fd2d03a1d16a56baeb2baad30765e2616aea8a61637690cc28b91.json b/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_901f0f04456fd2d03a1d16a56baeb2baad30765e2616aea8a61637690cc28b91.json deleted file mode 100644 index 58a98222fb7e5532c135c95b3cbc45dd391a0020..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83786 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_b21064f33148c15a425ce722d0412ef8d9ef6fffa83161133f19821857242833.json b/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_b21064f33148c15a425ce722d0412ef8d9ef6fffa83161133f19821857242833.json new file mode 100644 index 0000000000000000000000000000000000000000..23309411ba313e6a03281acdc4ae6e00ff390420 GIT binary patch literal 80340 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 Hzy0=qG?{3_ literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_b6282218b0c8c33a4f17f60e2f691e659c15d8cbcb740147e01af7b1bd8a5062.json b/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_b6282218b0c8c33a4f17f60e2f691e659c15d8cbcb740147e01af7b1bd8a5062.json new file mode 100644 index 0000000000000000000000000000000000000000..81b9a718d25adc8d9b6b4f7b478b69b85ced715f GIT binary patch literal 85689 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/msg_GetContestedResourcesRequest_25a3f1603510228a22726e0b4c35bce08c84a0cf72b34f6a408982f7babce2c2.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/msg_GetContestedResourcesRequest_25a3f1603510228a22726e0b4c35bce08c84a0cf72b34f6a408982f7babce2c2.json index d672792464ac922480cd785141a4609975b00489..152eb9aa2b623200fb48fc7253b1bb0d17d35438 100644 GIT binary patch literal 60071 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_31d560b1c7927c2052e6d6efe7a00d204f33b4194f3fba7ed0ec5f2387097dac/msg_GetContestedResourcesRequest_219b7c56aec6474f1bb2eb673898fbd24420cbf27187df52fbb489e70b1c898d.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_31d560b1c7927c2052e6d6efe7a00d204f33b4194f3fba7ed0ec5f2387097dac/msg_GetContestedResourcesRequest_219b7c56aec6474f1bb2eb673898fbd24420cbf27187df52fbb489e70b1c898d.json index e49ea35e193e76bf51832c7c446a4e0f5e75cdbb..83bcc8f6ca89d137e072943802185311dce13432 100644 GIT binary patch delta 18 ZcmeBhn&hydfn{?uORqGmp^<59EdW6M1}Xpm delta 262 zcmY*UF%AMT3|sCOe8EG~CcSn;{Norrvi{qUwR63Ij{=*rY-V5fK< p2~uLwjw*S2g%Km)(BKtrFbx&-OgOPRska zJPvm=XsM`%(J@x23Wj40PRiOD)fN)(Fv9-jVNs!2()#OBangNyQy7V4q8M~#>TY1C rcs~-P#G=hAd3uErBj3>A6>cyNlHjV%t*1VC4upm=LJNOZqg`%aR0cJJ diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_465afbed74842189a7651d5ea128874bbcfcb0dc0e4c32ab8ea2d3c8a4d32a03/msg_GetContestedResourcesRequest_6ec2c2e0abfde5adf1d65d2b06ba7401f9ed4ef7493ce9faa08a50e6b4d2c34d.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_465afbed74842189a7651d5ea128874bbcfcb0dc0e4c32ab8ea2d3c8a4d32a03/msg_GetContestedResourcesRequest_6ec2c2e0abfde5adf1d65d2b06ba7401f9ed4ef7493ce9faa08a50e6b4d2c34d.json index ecc26853a49c29334e5980cd8d59b9b8c73e10a6..d180512d4c4cb85a84780526090db9947d690571 100644 GIT binary patch delta 18 ZcmaDW`(1j&bLP#jn7O%F4UJ4=YXMGd2IBw# delta 262 zcmY*UF%AMT3>$7^-~)&scxc+BcXN9S+G+BFA>x@9A@XyqD)| zIUeq+klN4`zQI?B6u7~ilduLO(nDe!l+b^9Sfo%~(z^FZG1A-grZ5u8L^0^f)L~$! rcpM3`#G=otd3uEso^R-|22&`9lHjV(t))JA4upg;LMwmPqFru3f*dxk diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/msg_GetContestedResourcesRequest_80ba1d11caa6442b39ab0f05e7fd84b9984fd04a4ca40a146aea81c3ea5c39ef.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/msg_GetContestedResourcesRequest_80ba1d11caa6442b39ab0f05e7fd84b9984fd04a4ca40a146aea81c3ea5c39ef.json index a95169e68c55090f4d1ed40df4d4038ea90fd211..66b9ef6ec5b37db22d08ce0e4d27f10f92f0f42f 100644 GIT binary patch literal 48327 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 KH~Htg5B~;LHP)N} delta 4169 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_93d82dd3f64ebcd26d544e5e5d2933bfca11e0f2d904628d007ad04a12e66ea1/msg_GetContestedResourcesRequest_45785d2d1a5309b4b29ccfa650f30e457c9e0f5d50a3b8f0f86e1da3420877d7.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_93d82dd3f64ebcd26d544e5e5d2933bfca11e0f2d904628d007ad04a12e66ea1/msg_GetContestedResourcesRequest_45785d2d1a5309b4b29ccfa650f30e457c9e0f5d50a3b8f0f86e1da3420877d7.json index 729ec4712370774873b021ad5b6758963ceb08e2..533bb0c145d4fbd197c247d1b55941aa3739d413 100644 GIT binary patch delta 18 ZcmaDT{915BJ@e)!=5$t8LnG7JS^z}(20j1) delta 262 zcmY*U!3_d2411gy0I`N2Nt^WAVQv97Kmy%LNKC|=C2-PvfaEBVV>|8V{JuQ*<#k`K zr`-%%Dym_0j1{Va;TVIHvL>V2LgF1p*uOk1Diljve?2Nrx*y&YMk1Lg2HluC4eS)p qBSA_m+EFD>uP|cd8ydXA4aPwdT(x8CsSln5p<#^B!k^V>+v5w{RyGL$ diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/msg_GetContestedResourcesRequest_5396ff2dd55051d854e18e406fbbfa6b1eff43954af904bce8f123fed7515132.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/msg_GetContestedResourcesRequest_5396ff2dd55051d854e18e406fbbfa6b1eff43954af904bce8f123fed7515132.json index dbc1e576a813171b37e5c8f55d2d5783e14b440c..3b7eba5cc77c9b657e489a203802ddc2befda612 100644 GIT binary patch literal 50608 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 literal 50539 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 I<)=^o1=y>6TL1t6 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index b0fd7fd2be28484d3236142bfeaf40d55aba1928..d438f5cdd3c70a33082da0d6fb21c942f97f77c8 100644 GIT binary patch delta 2352 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 AJpcdz literal 59999 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index b0fd7fd2be28484d3236142bfeaf40d55aba1928..d438f5cdd3c70a33082da0d6fb21c942f97f77c8 100644 GIT binary patch delta 2352 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 delta 262 zcmY*UF%AMT3|nqu;0K5gcxc+BcX|8V^g6$v%lEMy z4|i2aZD1}#b7>Q(}7<6UoFtAfR qjs#g^(Pz~>y+R4kH*{EoDU?G=aMkD5QXf1ALc$oKl|O6IF1H_Xtu>$k diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/msg_GetContestedResourcesRequest_c8608f7aed7bbe4ced03c9c23f1ce28a227def58e23c39e0384e0cc02fe6360b.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/msg_GetContestedResourcesRequest_c8608f7aed7bbe4ced03c9c23f1ce28a227def58e23c39e0384e0cc02fe6360b.json index 5d8110bf5f19106dc88d21c5b9b3dcc35eb2a287..a2baf750233a8c2c672b4eeb6ffc08bcd1c1d6e7 100644 GIT binary patch literal 78704 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 literal 94838 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index b0fd7fd2be28484d3236142bfeaf40d55aba1928..d438f5cdd3c70a33082da0d6fb21c942f97f77c8 100644 GIT binary patch delta 2352 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_ca7552f3c1737e70f4781f101ec9bf73f52ab260cbde3cddcbb38665da1db8f9/msg_GetContestedResourcesRequest_1935cb975797e6d5dc29cca6923b9c94b8d468da725cc241df1601e630036b97.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_ca7552f3c1737e70f4781f101ec9bf73f52ab260cbde3cddcbb38665da1db8f9/msg_GetContestedResourcesRequest_1935cb975797e6d5dc29cca6923b9c94b8d468da725cc241df1601e630036b97.json index 4e53c65fa78410249dda94d5e9f429bb2ee6ddd3..9a4ae8f8ea3ac501faba7172103b1c2444214a9d 100644 GIT binary patch delta 18 ZcmbPaF~@8}74zm==DFgmhDN5bwE#fY1}Fdk delta 262 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 AI{*Lx diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index b0fd7fd2be28484d3236142bfeaf40d55aba1928..d438f5cdd3c70a33082da0d6fb21c942f97f77c8 100644 GIT binary patch delta 2352 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_0354293d2bd9574b348ef1fbbcc98cf774b9fe66e8103e4f370811803229f4e8.json b/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_0354293d2bd9574b348ef1fbbcc98cf774b9fe66e8103e4f370811803229f4e8.json new file mode 100644 index 0000000000000000000000000000000000000000..60b2e0181f28daed14be3d25267f5ebb3146cc04 GIT binary patch literal 60517 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 literal 95488 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_3b4ade5c7a2d0d346627a4ee2424f404a90172ba46f3ce4973a5f789c7f89cfa.json b/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_3b4ade5c7a2d0d346627a4ee2424f404a90172ba46f3ce4973a5f789c7f89cfa.json deleted file mode 100644 index 07e4176f457d90c95d256b99538c44136f483365..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67937 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 r8PRF`}PJ7<%`O=xUKITNdkU z42>~{05#^Jsw*QhGBT?vjDG#*=;+BW*KgmweslBW+oNCeWxsK9`+2^4`R3;R+pCxF zU%Y;mZ-2Ke>9W(aljGYj4kzcEFD{?oeewMA?(@U5i_I4&r<*UHZT6p@ZkC;%9qyK$ zZ&z(TKb&k%IX&Gz`1I^<`{m|QhtsEbKR9floNgXJW+v5oKfX2;=j^QiO9+0QT541E9Ts3))9y!`Of_09Vi@Bi=T>lZgyKV2tl z`R-3wuWz2*u6lj*>iU0gfBN&)+wAyT*8b{a zpQ+$Z4@XCbP1=u+Ho)?ulMTa1M_WAk;bD{Su06li)%U-{cYX8fchTITAJJaDf3bv` zg+IL6XgO*g3znaLhU2%&;my!`RQ ztLqlu4_80FyIwbZ{Iom;`r+n%etIjfOtb_4?+2KJC2S@$=g^zf>0Q z-+ma6`XE7WU!L&oACH*L3`=jUHrb-OloJdSyK9F0^p{ZAOpeDib1yHJ@8qdVl;t9k_N>s9bzOea_#49dlY1gcSzjcm zrw!`fa0W+V{L@+IchD|QCiaJm!Oh@%3B3?6?w%8h8q>vb9(ZwjoD?>`LE7@2{HWht z1aN=Eheq2hR5Uq#jl5rmv<5IEu|#z5Q49IM&rGwk5o_Sx%Bw%>mzST^R(?NE=aT0o z&Tz5p{Zt$qp&Zh<{xG~^?;*usw3SEIvQg!i3TX5A9{U-M+QW3Yg zSPQ!{UGuQb)NhVRhx%HfY)*?b{*a2zvf(g8V$s+9miv{kIi=4(*uyW*CMt1rL~A9L zd#^r!vnA#A6ap(na>OXyc~-k#p1-25roK=QYx~$hP9pkzIii+>!l+RN2t_4w9S}Gw z38}BY&AokcgJmD^VwdXf zDcOR7wMAorG>I5kNv6Q0p!(#j$1Q}qNzVsW2jNZP;#8=^CPHkXki`>d@t}xoGr_Zv zvgLt2r$BOw5Zk(o8KSeXXyb%fs;xVvYr#T!tPTZx8Q#~IwWgLk2VlwArVQ@@k}Z;y zLDxKrRgGd+t@I?3{3n7}u96M`ULX;$RAL8ji7JcPf^_O${G<%ekCfq7P?sn{O~I^L z5N&je#-BushYZLpr=(jwB#II&JK9G@t^-w2kfI{Oe0cS>NlojvN!fAp#iSGnnwv7L zTy=^TZu|TclyZynQckI>D_2Q}2);?z*)>OKRN_BuhKp`Z=gEcmm8N@$ycwLXzGguZ zH$+IfCB<6ssR(IdeYls8ZmG5<%k|`Cl!C17dr?D)PJfZ|DQcYVYOq2SKY#Ijl6O%g zDiW1=c%QGc!Hz`4XC!y6iv*^=LAe`8AXn`~vZV^q9x=M=ykUCR9!ZDl&JmKnK0m;9 z8jSP%7C^BOt3ZN<{5GOx6jI%dXIdLggtwR-kh?_!OBS@c4YfM?a0BW`ZQR&?5~moC{OP$AudB3ZW(w~I}g zu2SRDFGAEFAkm?W=&dGlLcFN1C}h-WJWCRxIz;D$cMXO_OZ=|kF%PHK)Ad0iZMR!eDMW0x#3-bPmZjVa2!84dqbe4Os$5|e7r4-y#hk%( zA37opPEZuJu(T(4iC=Qp9!=Uv7JPE3Jd{{kA7aH?S7LRF!&yH z0$jRkvnEm1_UZXC0eXJ2AkQDdP^+Ot_XrWjj`j1x&cki-Xj{{rw9j8|AM>ZsI8E`_ zyQqnv(f}hin)xRaAtO8F|5knDrl2!6_OBr@D)V+FwS^r{;+N>^b4N)cmK;Ha5U$9w zO0P7Ukq#~V9^qWkmX=1iLM+`Pn%{Bv;izPqDn&YgsY0+cst{?KwR(Zv6i{nOig6~? z^-XbDB_R#JmFBW1Dtv{N#F5#y=%xpZE>4@4PF-R{l*nT(H*uR0n28o|_l*kY^A*TE zy_)M`nDl-Ln?)f=?pi^ZxIIO&?-cQzdXzN!ihNYZe7a*e#BJ77Nbztj)u0v++*cIc zMg1k7M!5@7XloJSybU&f&0SigK<*Jylx*pGoSiCi0p25UmM9PrdDe3xlqH-c8d4@S zQecSMG310ODcHz^xNZ7SBuyWhZMTGBv5`bohGk1n(K5$hy*2MSMQUoS*Q6A?Xt<{= zskBPT7BBXuX1=2Z1qnDI?XaNaeTP)gg&G)@d=?A#CNWJxfQ+Q8AgeCQd&)%C4Sy5mH>knjfF=~mb#x5ZhMYd2b7MG)pR3SM+ zrx$GsI8=~gOOzyn!0wQ%1wTJvV-+;B(KBW?>vv3mBvQ+D668qdYWXpsz@S;sGt_@H6-#(=@goRftM)N&ea|y z5E@b_#gVMLq&#=5AAy-EjkZEoiMP&Zi4ThI`? zMQ%nzC$y#5qj?Oh>%|NkSjB^Sm+FAxtB&yh>BGmT0 z0jfBwPZB5o@+joY2VdDxFe#H{3dLM+k*L-ZmgZO=7QOX|$7|hm%dS0Q2Ag!rNRL1h z9;H-4&I3tE+D#Ibx`z}0z7@_em` zW?8gXPZJbX#b5baS8}j$<_q7L7bUD=OXS@$KBkRpoI*ySVpxxmnQ%ox*lF>?5_wlb z>Li?v!fnf0YOO~I5W4C2wo7&$`%3Tr6_HbZXZi&@H`NC=%AH5i)`r~ht_8b zqV)lubdzXN9!&>cfi<2ga9VpUI)@P3WO=9vAFsfq!$@7Ow9UJ$uLvKnz|;R28QD&` zjV+`M=gao-3cUGOw7&T7!A0IQ;e>y!h-R6J^sj#fE~_$r5T%r_;Yc*Vk3yrAjZ>(c zvzRDakJvFW%H@TKqVbjH4JLou679)EUCcSdt+dN>k|V?%vbe9vq`0~zu7$IG0~7ci z74Q|r3SV+pV<8~nN=inFDz^zqnsT>9Cwi^cab2IEkOW23y?nqllJ)w=$qQuYP|L7^ zp-!wi@*+iQc9aH%R9$7#kec1MWe9ja?_HnNiy+xZb6Hm7O;nPRqDT_;ML~e$Df7e< zrHNlHy<5hISaeP?mi{FNp=6Cvlqg}TU4slKPB;o&PH8UC)&B$_1+F%gI+6k}SIHoG zPFeu1$LFshQ94o@f|_!@#v>x^mL!4(uz03G$Pqn7645QHbG%{~wO(n5V$~KH)EfE#!R!`wlqGmC_Slrv}LasTKAf_%D3FeM5 zCYnL}t&+)31w#2;WNed6`le)Ul)R||y|*avH`g_md{B4JVxhO@AeJ)X(J3_YAcb_j z*y*Ye0=^>`5tXzOGTt@UiW*z3WnqW>#*IKaPJ!>3z2j_XQ&AMdk4VHuh7ReJR^RxT z?{vdSB(UB)#70I)1cVl^L`eo$oe)c+!$OvaKhWY1Y|>00ZgB~Tqmrrq_2-T7X_QJC zlEx^EKPg#%f*z)8Fos4gfSkN{Sapvb?--@hlj3@~*i=0eC*huwA&07dbZ`x9$7MEH zG%53PO0TDW6r;e}ueZ~Cs$~GPTqG(&f%k>V!(Sx0 z&-eL~yTPg|s=HK#vcAvXk&cK;6tbp6=&GplAqKK;p}@pBskB$f8h><-lYd(VRbS*G z)z^m$OI#EhkJf4QFhoAzTz1?&ms9AL5u&JwDsL_AY>{^$B??Qs5VA{(u0U{{=$3qt zKZjl^r9MBUBng12tj*L6A_{)5s13PF6jn2?Rw+ggQkbNH7aS2O`oO% zMZQLb?x(u#DY1Q_tJNx_W8GtMp81SqP$7Do4z!)DZ(!3RX*|*&3pvuI^o3aI7tE?; zt&#`?DT;1EEv=`B=j;q@#3tz`kq_)FTJ+Bp<7b0+6CeXQd2!*M^s9eTYBlzQ{vL%Zv?!HqbrnFc0G6oLzGCdT|+bOHq!Pd z>FauFADtu#_2}S|z7}A(!lZL$Xmngm3r z@svJ4AKJu|N->ARrxvr+6w%cqf?bNeTXq4_cA!9-k@!dV2F8;TAz4Msv$8>KQ*na+~jooZKtoh3{PLcGohLcZ3LSsqC0Gu>B zhtnjJsZU$v7%XWX7?&>%EZAjB78i>qWq#_*tV?pj`(xwBH+4~LMN7FzRD@#3>si0i z7duXjR2qe>S_)BGeK@!Gg$&(K^L)wOV3n>;&BCHXxD7>w__A(KIwC4jNKqhNd44~{ zK-Mi3m{hBkc7l%qxQQnz?Q1ltqqZ=isH)Jvz8j(vmA))l*Q4YhdD^-I7yO zS^=WnJS1zAT8w4B4;G7hU7`}~eZHdDG5N?59M96E=2>kiCD)Sf7L+41dX`i^KhC?;%dEUF zfboiTRkBds>}32?Z`m>bBtc^JqdTyJDR%Vj#KR#){36b_k|iln_36BL#EyDok%X(s zx>){U$7UP{n_-WHeXS7}JTn&TBKRg<8cNqA!`-rDDu{rUt_V^pv6@fImaffG30Hz* zl@_7MxJ3~By=9(n#J0P%iG1Zlnpay>|FnsnjBfRG^sx4_lf&`8u2oeE(-pFMUh*&H zwdP;@L!v^J&D;Ennmjc_1a^k`cuJ8{n&7EKazrR4$UFLHSP~#35%WZKeU6aZ*dF`w zDLaAnWBT`;V|}fcw#2judw@tfD4q~o6V)>4=+)2L{Z1g zMIl9v>1aq2Re?lQg1u3RXnO?CR&_Q6-sXb-S+!#eFrs!?y0%E2dd5vch-&&U9Vt~J zwu+UIT1p9toKO~zc&aEdb6Q_{FLg10MDH{bQs+iwwd=(_ng|LhS;J|zMM|Ej9viKy z)nvU8+eAlxvPD^?hc_PWr&&*lUMR8(jh66Te&y#@(>l_O;}xkz6q0vHT^lQ|Z#Bsl zomh%G&ljn8OKMj9+0rM$sGL>>ik#|Z6jJz9PY$0t*q{wI1tZtfEwZzd059sS7wip5 znnl;gLms|P3&gQgsg|g~A(xI$PX4*C!J>xc_c#4*O&^_CY@dExGfO~z*Yi9(^CwTb zyv(Q1#xH^TdM&Tk#xH^XDZdYrYfs5d8;~v4Rw$N~^pp_hikxM4dEwbpGKyhf*#*;T z3`IRXQIT!w9U$owVpoq7mYVT=$dpoUkq2$lwx)a#ZAOtu6|WlRDK{8$9JO7br2SL~X{iJ3-zH}uDUvEh*4 p5uNt$JDjGsZGJ~okYV$yaU4$D3BU0Bt1tZEvu~|m|IlXMZ~RHE;Wiv%8=3?$z7d5AUvD zeR%oib$)&saXAtA;j^n}uiw7<_|whphnFAz=jWT3x7R=21hxG3 zr|UPj&+e?=+`hi~@4HWbzJ8Yze~#_H-@g8j>;Js@@!s zo)0G{hZXE6C#%Hr(b=lPCnxKC^5J2HcWp23c=f~Y^1Hcx{kv%Hvmeo3e|Wis8pFT6 zU2!>V9tO*&5AyhJ^ec!SiT;sXev|ioW}mTm7*s-j_2b9aH|@2*UH|z0W*+$T**yLD z@%BSLy<_9Ex9?uxynA{5{#9!8=JvlnpS(Nq^Sigdlm#E&eH@qjl#71)?$dYw_T8_~ z{_^){fBNeoU6LL+KQ6C}(?g&9L+hg#`TUQp?rhVx z!_D`nDPu{}e-6vL4Oh6oPQq-s4fCw2H0%T8fuM*di z?zryN}?2h04!;rD7>vUQ3{t$Nr|4j}`E6Xtc3fsu=Gx^1e;c z8o(Bc)!}2Vmg4^&nWD2IYl6O`S3m08tIup}eILTP;Jn0nc{X$YB4Z92RsS%;re8np znHF zvy7}h`n_?=8gRp`?MKQ-xqj&!F3XWYa66Jjo{N`9`*l^fS*1t2;Ng*W?W3x)K9Z&v zAZAp5!2H$42lT}vUgSu+~ zg(T4|n)qf-7}#yMZ~SR+Qo_(rLW+wvI8`arJEt~hUAhu*Nm){;F_mbvwxm!Oi{?Pq zc>Q8cRm$}P90`;HmykpR%8FD;5~u6;;z>b9UV#&C413b>Mnx#3s;K!bDQ3}*)+4Dc z!d)z|Rm*c3ku9&!yPlF?mn>z^5u2MhQcjg^;|7 zr&cnd3U_2m8hjoRaVyW`LcDwh*-1R=W#n$Mu;k7YN~wjaKH(5VTCTK-5OU}n=|dL) zA#g)Vt>{P|f>9RP7WDcuI9k}a&`n8Pj4BoM&9`!mN+%!d8LxBAA9MDay5NN ztjP6)vaGcYNl?%#HH)wa+o7ij>#Ty9g@q&{qhq&`W4^V=t)@qW7>$YsTtreJYdjG> zDeTO8hZnk2z!jxYWq3(z7YONyVi9{h(z`H_$~+Pm zFGYL@;d4hRfi)LxkVHiY?wCp`7a^FeH49ugi@5Z7<6rcLByI;B=~?T+h!4SsgRd#1 zRssii6OvrJn;{boB#kwsC=BVZl36A-j}o0b%3;)#$zhahLpB^1ygCl_4sIO5Wu{mo z+_aU&*jOE`sZhB-0f!4lxsiz`vmjzfDc41gkc1{>MNJEvsi7`XD4`!0c9#xh+-z5~ zqM%tPWj*5eDXOt;3W=&~q}a!}b6i@lM|LcSX$>LO2y8pznsx1UekBDVVN;0U?C>IR z6bsRuMit&F7C9n%uI1fBLS$532z)K9-jqezWW5*b5q+)xaQ@JGevnf=gQdq?z zfzcgP_O85yAh}0U9^wztK;>n7*dfdl8Y`gM8qsP|(YCn^&DyKBM|p(9 zJ6yEKaYq_n6l=~MTc9l?@HO$MG?n)&%$lSiO;nZG!E;(LQdrqxN{`HOauFcZMMz8C z=kzE;@OGm|l!QA-C5X4M!l)YOA-}*e3nfvFBSw<3xe4g?f>i7g+}yU0ysAyAq=iaD zDXCH=0eu8UY)?oeo-Hhnza9~|V@!o={7Y1XAcfTH3wGMANugDhDm5h3gz1I)B9cxc zAc>6b*!eU!=tqUhk)D#l6l2r06e?J32Vx=NcKgP!*kyc6%5{;b zP7+d7IA7{QG_&?$ zl-4$M63}ZL&{do>WvEsQ)wuzsT#1K5YI&Eawl_$Rgo+{~JrXL)k%CToi&LhBlEOBH zP+d|Og(77eJ)48u;b@h1QP%xj z3L&?*BbzJh#oKFA{LuwQ>9`ODm@Wk0iWs_x7d{d%GKNaj+^7oNnn+z_m`XeMNOGqR zjeSHwrgpuAjd~>Zx}YXD5zHOKr9CUSx4bEr?2tt;6+vIjvDlk5h<5Ur|q zQ+E~W3w)GOh=r@Q#}PBRM??~1;!ll}f>44eU3{gU772AqB9Sx;Q^oJC5e<&l0~l{ z*_SL@E9~y=t)!7O7#dqThNMIH%upXI?H!4#CCZj49a>B_x%OL?n zcQOv8^EDG~0$EwfKK&vgH6HECgd{6pfar2US@?a{fO~sWG^*r|Yrvjb$@J;;j1*I? zVoZn!3lGU$WO}BRL=Bp<9@#-Ep?XQH^uQTc7c$^VT7-M@To~0O`ZO|{Ac>Uc={^zX z*&4W*H5WP3DI=iASi7mMgjC<&N(|g0IMm$@{@X3^W^pTT7q$b40~8@ic}TpC3$dS| z>)=>&-=288b>zOiym%WjU5F-(+_z`Z6r@nS{vx^HB5=zNrtwq;u|%{QWs2Fn_;w4t z@&D6M=TU&5DV*!mpcj!*%5`kX>N^^(e{YtT8tbD!d}=XW2nsV1%3X|&5+X!gd_row zu~cJJ+w|?J^)ojPLKxQn^tiN1M;?x(Tt6w$t!|G*uY_+6EcTL1jh8)yRH748Zn8$j zNWP4Lil7R6fFNzx`h**@f%L{l?(PT52C?K@3Mp6hCOVJ_zJG~rr$8f}R0_ED!f+C_WpYvLb*AJcUdr&; z3rTi(>8>KwZIh0`Hh0sow|f&`)Ke=$q=ijGsY>HFED6cB!H@(W@V307gabkADY^bE ztPUnDY_kqYXw%+TSn7^sK_TJPYlEk-6jB;CJeMZ}t*ze0Ec!;I8a$yRntKxw$z=f% z4TMYyUs163{?o+FrAv;KrcZ>TFU>dzX^Bt@qZ0+MrjSmQBU9cfFn7@*CAEz)aW5&` z^~YKw^lm&6MmiEPp~7Yy;OOMtIPp+O5$a$eQKdu-w?2ZKJq&3cic)+}^WiVM`7GDLTb2nbO(Bza0WS}48YLY~(Jl4M5pG*delf2w@|S!&1% z4Vt5h>RRa^KSZMbKI;nXWhLPgw}+qsC~j%J^@Zyp56 zq7_3)sTb1HW$3qVn**z{df9>F=6Fa#8@#Tv|1Tdwlpaww1#Wv)sflQV8g~;CNi!9x z8T=$-bbetLWZ#f-eZh;aKjlJ(T|>&9Ajw5~LB>#B=$HtxeQHx-YaGp&)vJlNaGB`jqDTDHDkpX_(ctc9+S@{meJEr}~P;z-miK!;02+SHb!DjXD2xGFkOdM6}Y zzni$INA2?xUNtb3{n@Hgt{j;!+S8JY7CCGbajWrC0d5oJJgRPS+|lxB6A7$d!ek+g zcGh4^(I@C7q`F8VB3xgitq2G)ZoUCp#H7Xo!Jd)^0%^UvP?cU>kS3^$Mio62abqr} z<5bl(q!d<_GeI&px+s6M$m2vj(h6hG(jeZm zN8#X}g(46$C2`NG7ZKYXJSh;A#lm*wRqQ$U@XB-Fz8CEXDYdf1!*guFN}_aA5nsds z5?@r58c>B=d0Pe&38_Ro#&NhOgRj9q@lr8dJatq92qLWwzI22XmW+);X*7w1()?z8 zemuQJhx zJ(76nNbTtn^ypK9AV-$hcEOps6BYs56WJaTU3|6=-R$Sl7R4Xp$$*$4A#gnNHxSB2fzK5rd$@uX+W9UVnWnIPcu>i*1YuS?2gfkOR(eR=f+93byNW9cOoI#}6 zMaZoDm&9{%EmYT!9fjJy4h6oXAcc)R_b+ZxB`t-NEJ*88Qt6A5d}C8D51dO^BE~Xz zD5Sc;s7gPj_pXNnhDDlA>5)CtCkRC~%S)ufn;n(S3Age#;@qKf|2@e1+2-BPGP637 z`lqw&Yz(RI$LQ(^J3E~28&)cH!BdG-=^{wug6zlsD6Lnm)wdxF)J=;}lZ>>-iBXAa$GE`-tx@5T z9s1TpL>5Y246Lo84TU{Ey2;o(2DSB4=03_d0+w=wTFey-B{bsqf(r!xPl0~sro58Y z49OIeLd94IU*Su`<`LFE^C4Nk%;}dp{R-zSm(H~_G?uS$w(>Dw0KLe`{K=KBuJYsa z@y$>lzU9H&_-5$;_9am}R)*zZAxTLgNqwb5_Q*O)&rF2w=#qtMD9U=dxReVzWZ2U% zh%{&-kwt0sCZbD{ghata2T4Q*3IIVem3iNlg6#3JPUGJ}ywF<*hESp?NV_$Qh=vfm zN0J2!S_9L>aV!l)h_pSD@?!d#E!5iK;Xixw{p0_n;gA`7>`**rfUUkJYLbcj51%(2 WjvaSj_!jF6A3XTge3O5E`1HS7*kQf^ literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_51c71e845c3f579ad3ced0e35efed11f384144320c099f54b2530f0be42f8664.json b/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_51c71e845c3f579ad3ced0e35efed11f384144320c099f54b2530f0be42f8664.json index 1278507ddd48b4449ddb50289de6cde496f495bf..6579c20b34d8155a849f6be854a874ab8921c002 100644 GIT binary patch literal 63899 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 dK?col`f)gGC;ZCiS6}(X7e89R$sgbU@-K{+A z`^T%zhRbafTmN2db{uXtM_p}fzq(!#`0h7TFW$a?^XZ4X`;V_b{?CthukUYvxC?6e z?hm)`?q58tdUyZ!?!O;?`s3|~?D$L8{_FkQKi~fQ-S>|xfBJa)A=oeLf4=?x)7?*> zvEY#pXJ>~E>}O}2!1AMuO@`0Tw(;bLhYj9cd-cGp?|v8G-Tm9&dGi?k@b>oO>&4Y9 z{Ezo>_x{uO-#>)@=KZJpkNM^UnlIjeczgHZ_3ck@a`wCX|IE)me)x3vu;IrK?|*I* z`_09jU-SE~-~9T`zkKt{i+}sC7k~QeAtVchE|1IW>im#Q94-#|v+u9-KEDqAI*YE( zuU~cD=bN@$uk!OhTJ^9ttRH5+Jx@lPckAXwL#f-}K048}uFvDv z_43VB;bXMpknQhR=Qr_d33r@(bG>{gr!HPL7xA>VlBTTd@{9Uk7uKIV;ZcepzFc4S z_b1&MIZDQVvvu_tT8?;ne{wN$GxEK--Vm=J&q<2v)AjlFp^3`-zLK$|F0aMW>tnyu zl}{z`aHzLgwPZ2YSI_%pl2!+1C{}|{nOc(ndt{2vhOBY=fnNPlzr6X4ZO!lJa4tA6 zeqLX!F@KRUhbaBu^|0aBPV1%tmmww0hL~Tfq0g!Kc_y2_{QT+S`kO;q6c2E$wOyvJ zP;9~a8xxWAFGjv<#l}uq({O*2k*)j-jTN21ivGQcS zZt}Kf>B%bid`qkLNmbcyNzn@st5<)({LSG5`eG3)vZYoiiWF+BV6JLKNpdhN_3EX^ zuHnZk0Wn@#!KPY;=PTl}rC8*JB+)1u__QVr?B>_k{}ebWVdy6=#Y797vXt(fUDHvQ zt^`~{mJqs_QZ!0iLa2#Fb0BIwzgSb2a(;j#fl}b&l88WAkt|8zbbb#{2-5NjoN!~T zCk?MxghH~4n%|US6s>68lH4NP#R5yUJeL;P^m@PRE{UblP8W@;oNQ%2$w`_@h=v>?R9K?A)Q0 zTBzzP9D+#Gl`;`R4t*ni=l~!Du1m=kZOKD0iXzj3o-d7~iH!-Jl*GiyQbC`-%GE3F zfYkI|3~8WB#ZjHE@lptbdosGLR)l`tvSap+AP{LoKa}*+<2g+v@VI0qq8Jmx?G?Q+LFQoF9~BtgTCef@Y~vghf~m-9=bu6vQaZB@r2IyY(F7 z?RuPQxLN^5*QR-Eimy~vakcuc4S&v(K3nQnD{2&sl+ z^N4HIU9bHsAqWW@LIh`r6@jBzi00I*@K&+N7SVG}?;a8&qiRCnYhv|M7G;wbGqR*x zik*;(*9)D>C0V}~g=$n1t60P_x-n($%1ap1ShQEh1U?@aGvvGyc741O4QU`c;4Q;B zfl?Dfl?IYr`4*~<#vW=(L5+0HBk~p2lQXtB`BCM^-l|-k_dnzz{tyjRUgq5nVV-fZ z0;;7Etrit+nM>2`de!zQk8pU0iPkvINW+R^&9P$%v}6Rn1|F5B^nQh2lMtkcsuDYR zP6I{~D>F>#kv>i)0)(0fX{q|09%Tq#H@ZbhxPw%JcoQp(>f$`)7dX~LiC1Hbkz`D6 z0(z|=6}tr|xA~S=wMmvVQ7I@TRk9?Y566h@af!sUiN*HUEdqBIQ=;ns;uRrCF7)Ox`djrTA{j#q*Dt>Afq~_Kl*8DQ*KcTS`J#O*vJO`C{fwcUDBAc*fcGP z3KsJ~EF_#?U;h=mv~LNyCgPQB>3XT7t`FSuyrNsOUP&b+FFgdfI77X@A>^el1rAD7 z7%LMN6M}C=3{AueZ;2IY zLnUf1ssgtLQWI&WQqJ9y*r`IZJ|ZApyH>(R-IDb>pvE^5%pJ|8H7mF`y-AnMkVP;V zLo1xCP*JF|2SE~(%m%^`&8k*YXBDaoe3Vg$g{xhUEoS8&5lI#kf4Vp!2qlQp#aHra zo=~O46A800g*>QrDnu)Ph|<`sYr=KDfk?VmD?-#}c+p`Pp9Uy|J6;3pl0=cfo2wnO zjiz_RK0S2RB}r5fj0vgM5xc=BiR$_BO4@WAgd~=Lt26#Vq4}Tc)^U{bv(TGRu7+bp zDEB(@Nfav(l&BCxxL22C^3hJwtP)YNHmmv6Rt7O7WX>n~m-gdEJ5{nR2s= zQxOZ+>QYQl`AB(k`7hj~KGL2mbgE*cqE*L|C8>zftyszuK1oy7W9&^A!M#H*<@^;6 z&23D`NYlC_-X^hmNgySaMA7pj`w~TSh1ES@O6p0Sp|+)MNGfzs5B0Xv+7YjsqD+ZW zp=FUMKuw(Pbn{oC6dfX1&;^lE*Hjv#luV%Fl1fKnSM`vG9t~U)RsX|Yl4Tu-(4ST- zrpWwHbyH8t)qwJ|(3?WY`C1W0S-4kClPJoH06~e`F{MbejtE#MmG!C>^PUhBifP;y z&%0&3rWJTtA)!z*tR@KG5e3Cgi$m#r%tVtwMpjy%dJ&iEk5*+|l94Y!bU2|X{GK)7 zo-c}emDq6%*pn;iKJA{7V#-w(6XLWOY}!hlV(H>#4k49j$COLf$Qa3&F;EdyVGj_b?V6u(Lne@3eB^dNP&SAq-cm@ps+Z_M zCX^ejRw-!v)4+qB7HML^nYr{p8PDiKjx}RSs_7m?^e$Z!EXLbiDt-SH(@ud#I;j+J z>4o7WXiMj!(rZu2ORSXPSuZ5nVWqQ*P`5=o9GkADvEJ?`KBy;Ggh&&cf>M>nPgvrT zO@ko`KHzP7MF|IjR#S5Rnpka2nAk=glF+2RFR@e|iGp0huGa!jV#%cxYpVnT^cJHXb-vvK?(mm<``LcB_f7;b$8 zq3tGP6#=(IO^K=+r21rxDQVR!@0+zEO|4Prq!bgVIc12>7!eSnZbUp|$4u7tB09k6t3Jn^gisV1Ru;I@%o{I@6R$l|GufT_|U}9PmxP9;FVmeVs zv*-j8K9h+orsk56BhE6@R#?Vs8i<;}`}?|O+C-m&Nuqi_=4!a4xvFEL+a0B}h{6+5 zn@++s=MZT#t_Tq1NgzmabW8l9EnP3q>eo6Y2$lhu#^yD4!XiL>AoC584qwZMh?i-K z{15TMkZI9aT|(fxiv*JdnY04&UE?JRWwH1_l4IqT9w$-9L`6VQt5+#%u`+a6t&9xM zGjO#+bV@9EnHpB+z1o@K;3$Cv4y*1ltB4@1aEK$`P5Xjp7M~d0KpVJb!qd zvhk3Lyg6m#l#Oi$w(n2e*k;4@Stgl^zw|irB#Zmf+m=qE$X|5)$z6n%PvN>SJq zo=AIoioO|&wnDdkzp4j~rpukw?nL;MwO-MaMtmO9=Vqs;=zmBL%YX2d+jlR0>4^k! zD5{U|#HIKj*3o07K7o`iWp$#aP90)P)Z;>JQD809M4k*t6ootGCL>d~=v0Hb9bPel zJJOX{go<@+$HW+(?8vaR)HP$Wr8OdDUK2YiG3g>bPucDRMPosUs8=x|IJQhM_OeSr ztXDd!#jCu8_QVr9x%qtNr|9K5rgUVLwEDTDpk9-BRXi=&`Flk8ERC4LJT2bd7f#tY zWn-Ix?fVlqPTAOIVEf+mndYAzqw;)b(T7Ml?q=qp%yh9Nr!z)Ekf}8$I_&9|te1-_ z4NHxh4o?U;MUN4YZ?)l`jJPWt_*p=`lJILK8IT*gn#g)PKP056l}MF3#kb1 zqL7z9oRm?vr4hL40*L>>YLGU+&rk0a5TajP^4k*?MbDQaN=hlKcDN9)`NziybzXF- zRVPHSRwR%eJSh+qMW~pvMPBWRJ-qVR=L=+qOC<>fuH(nZtyEJH zU&H|dUsRL|P=&g@#R8xAzlUq%K$6$Qg2lX71Bm(cHGwj<2WvD@uOd@O^7*I-SE*lg zi@KDkQEBx-`ig}ls<}-^mPXbs*qB;(qUT+_fIbgm*C&w3$n-SQbdjtf;&lm4bW3DJ zZb_ZNXuW1h>4eqYxl8>=887{45)Nv~sx(*Skn;((ut*?SYe#gc zwHDN5%Zi!;9YazSbu2|q@M#h05V+&w7MHZ{5;&1C>+=#`6~V}|f}ZdN!B|;e)Lasa zcKnnf@g$3v3|QCOA#On*9czZQARJ>6bWxUySW!cUTSZ{=txJhQ z)T3L{Nd@a2TZ*+LY6LRhS@iJ3Q~!?XW|C~F*~4Xiz09vee)a3TzqmQSxy~O~=QsVy zczYSiebs-Wdy|zPn@Hbi%K9TKZidH6j5{5!3n|-1p&eM^S37DtODwWKtjY z;Gj_w?zk65S?Li}#9P#5#^9@Puanb|?|*uFp%-+p$q{wL^AF`047X|LFpHLrNFGnr%TzqKbI75FDu{iM=NL zlGJpGDmDs9?+!$|C00aC+CC(=P3$71K&_BO5Kk0U9?I>)UIM*{qgNxn5V+^ouoM4F z@^FLtezKaE(5Y5(Ta_)*7bwNB#2$WdAEH_tLO$l70DAuZ+NtBdQqX>e8c;Ke>Ie*b-Uw;5%m+ZPvNOMO(#=iYz8s$n_2F9{yp2zW{%;== zwPK}N4i=J>6q4juDrAqWqx7tS&@+NWp&E*^z80Y%GSb^{=I8ZDg9Z{=lu~aXIwXlp zRF_4eo2Z*Cs`<-xD{vfntr{XAd2cysga?eiD! zp1ppVZ~uK;(q$Kq&d+YYIGtY}zPNsR_r=reyU$Ngt`1+EUmU)8a@c=yaaeZo=ybR2 z^0?~o`RV*{%f-d<;EP9h+piBtoh}~V{or(fa&b87bUN(5JREymbA3GMu>R?jy9*v2 zzJGCf*zo9x;uzo4!;aJS;i${Q-A}Lf41E9Ls)sM%ymTCub$mJ|M69_ zmhb-f{PoSl+f}b`UcUO@+n@gQ{B3spEo=Y%=H*|X|L3b8?pFT%?)lr~ep~;`^B>;7 z`uQUj-09)LgVQ1H4;~zVizBhkSSK<*ly1{~f+pH!pt|%^ms??ellf zwotS1zuqL=oA*Eba0~s#oA)>G^3B_9K78}`<*T>Pp8xzJXTQGr@BHlD+xM?-H~jSW z%`YXf-`v9aE&u%OyWhV1x9@&^_#glC@GpNqMP!lCql@k1^6V5QPUolmyPsd>^ZYsW z>nyrFyL#GnA8$Htz0A))x9WCnR6nkHd=^H_asPGNzM44U?wo|#a2w`%p)~BrcR}>5 z)7jONv#af!slq$7Vwp55;j1$|*Mghv5}_FDd?_tvsrhgDO8&K!@Xd?MF10yDgeOuD|2<@p)rN zMcn3MFYL;6&%-fO|8Pb8{BwnJxGmE7Ln;o-hQkbrMPKtn7xnoMTT)(+A+S;;SB%1)XSM6){2g^Q^@)1e+s6TN64CSJidqf|qec}V6qU$z zK;Wn(q!Jrp5K-Yae*8#)rvZMk-5k=_cyh&OT<)-VWWPYZayr^HrMh>w`C^|uU|9oR z>{8vmC0j7CwrDJnCJ_TG$rP9rR8P)&+(M|E^n6ft5Z)v%PK7#bBE%L7Sv-Lj4~ob( z6FdtkTfVaA6i99nVq14HLv%J4ZJZEGwRNX-ZCEIe)uCW7!)tw6YifJu04y2Xl;H&+ z*&<09bj_pK)hK4wN>38Weg}NYFf8V%EFT`CZ#~o z+>~MEs#COZ+w)UU$}P@IxuveITqPYM_$FOv*Ic1diT|(}Zn`y{Cl}&Zn(iU;W^lUt zngvPR5FzQ76l=k!BBX`&a4#R-Qf*6?>&e?F1zB5rQA3GNf06PjYMkzButF4{zj;2% zyC@PBiAp@Y=j&{+kcjw<)JhccqKn#c+9L3KwVqfX=5k_goyIw!n)FeF;yUsWf~be=%wBp3yz zEl&2mA=X$($ykgzoLW!U2ZglVZb_vOvDp%%kRDo=@?1dhQ(qWWu}DHsz)hP~VMdh|E1qh`>SlZ7g z#pZmm*u9=@uJ}eEOV$b*`&YNXjbrq3Fiy_on8accVHTpP^+z|xq+QV?>r{zM>EJRL%TANqbi21*x0{@z^KgImDCm%oWviZtIvg!L@c?23L#vP zWtCoOG$S2a_`SlpqAe|raD`a9MKr(g?88yXG*yap08@ovX;dN7G;8$&xhbI5kQC!g zsOy{Juu4K2ek;voB`SP{mBf+Rw&=)3ccNeWjJ3NIedO`g@It3<*yce$rmOo)Q~UExuETCkt>=4tc7lg zD&&?%g)>sOgkhQO8x=Zdx1=wN4R*amRUnx6K`%)+iw(t=5xSyLWtZkX*rjZHzSzPZ z6=g6ewvT!9=`HbR$vc^U&ks?GB3on>*->By>knjfF=~mb#x5ZhMYd2bHkYG}R3W)S zrx$GsI8=~gOOzynz%Izuf}bC-u?m{m=ovGc^$Qaq2|J6)Dx2Tfz88Y2V%#D^EyJUH z=94&*BF^7NtWnAO(A%U_^BTaZ=(ZwNgKccn+zub0<}$F)U(s|6Q9VDvsjVd4LafG< z^-7V&pX!!}ksNO4Cj~mn<_fHcvMSoEr%9HpiX?)F3Tn|_Ln6SeCmvrNa3|gpIC}rMBeq$xn!h);rjMR*^;Qb1r4EF z?IGy_jJGi@6D74NUVQI%zO!4%juScJkXHUD=XcTgxDdL=`J4LT%3* zpo+8lByr*|k3!CT@Rbb(lQK!BP|WofiE1xlX^!<_(Oa*$f2^Bs*|kT^V3RHx=@n?g zqm(Mhc_0Z%yGf!__mBc9Y9XreN457SPbNjHfW<nl0kHFJ^85!A5 zxs5HP4Cl-C{t@`_w`hIx?}LlHX~GHrS`p1M73rV<5xA_%_(7CXzJ?>w06z+iQZ{a( za?WC+Xuo1%Vw8s$B8tXWnm3sIX-l+|iMp6`hFfWu;*!k~HORiB9yfTE}%gKOqTu~g)a)n?3aPrvq#-rCwq*!-KJQ(h)Qce5Nb|6)#+#@lBSn!U>WhK^$6Mx! zB}x;&T6(vP53%UnVl4ej4noNqp(s(pQo9BjPMmNQxZKiQpsRlaAO)^Al{%6FFIUMR zc}`jYt;h5CkSHA~4M9!0-s2Gwc1sdL16Vv$AmobPB8li0)j2+57qvdp4#lc1pr}IB zSL`qPGB%L0*>%nliuOcc7uJ?k1xB3iRHhz~5ZgSn@&LIg5qfnuA!%h)1W;$b%Hp z^wq3-1`E(v#wPxY$%Z6DQ%`k|BqxespjRY~f)x zSTrf~a!RkKeiWm?+ON0Md#Y^!vs@%9LV?cWRYLvL7(py>~0;p zWS;N&lDomGDyq9wgtETpFQg-)5{2yP5V|U=e29VUTPQGbPAcskvc?~sbjE3M{B@!O6B;a1JrlkzeL{;kM~cKN4r#QAiit z=@oy@mU$Z?=kLkEE0A@F>J`Z~QqSavvJSHk%8mq z_u9B;!F z(wB!{L0uG)lK{zL3rPl*1Y@R}`28*PKt2DA+4cTHOmFEG^7PU3lWTdH9a~r-d2u06 zf&(~B`%x5Q&(nlpug=v&Vmq3V0MPsmR_M5(Z-4`rXi&llMcVK z0j{*Luqxw66{s(HhKG>HMpQVhsVx`Cyuk(n&cG3dX(Q`J9`#t#9uDNxChX<8ys1`6 z|EsMx8j~ZjYg$Z#ueu}>f_cCA_@?5Xje9nZ3>-hd*Ty{?M+T0cn?K96Q}d@$L^?%h z=7oV%9w$2k$c)iRK2NwrQO0I%k+~%^Fg@gsM;;9<*k#Lr&qA}UcxZ%I0Yt^&!2NO#{tfl0MmX(x<@cN&q0gw&#tQVO5#O7k|mmG+8g=@xuF zxQmuh+b*CBAM{2#h_2RA+(3Y+8|lUso#`*KSKCUo@`ib@5Es-NhjM=m$g zEm1Xh0Zv5amZVROPOdNoE?B4z!$af(d6ZtOW4Gu5SN~GJx*(KbPLK;6R zs>F(=7xIDv1#)|_usSH^kuv5cLwiGt0%c1B)22V|=RI6)a6k}lgIYWI9+-$Ex;3Im zPB~n%rgK#Aw&^pju&p}74FPch%ns1auFqQNLR+Z7VHLRzROgH3k)v+ zp)Ijoq&MqXU1)CANj?_FD%sL2a0;!u)I}wvo{uAIAK^t;WmWok8-X;M)`gT3QQCZw zyp!T|e2KrRz%7Nm?V8s{LZYa~6~>hgkSdHo&c_0`G9(mu3`dgQEenr7_`0~aWD82Y z(voWJEy;`6&Vr{Eh|E-t3RB-L3wcC_6BTi_0}*wVUgb(Faa5M{Wt}dXzJ(fzbg6gb zmW5YCp7fQxi*XU^i0bsEzxeff(gZSWoF3)Rll(d5PruIR=htV~SNYfF*>!(1K7AD4 zo}T4DZoJOQF9k6E8^{*R=411ntLrlo;8fEDiE?^N^iRIGNt*i63U+N?3ynTLNwvS3 z9%ZCeiC0jk8}>pWH5cJ(vM#p2%(u71x>Y3ECD?oZrg^K8+#<6`wdX;cfHNEq%F z3&U^(to{%|B3<#LK}~vk5J8CXqW|Q4Bevb8P2@8l(!AQ5`ln6od~~bF zqldMZouAIux>i*wda01r^OAoluRZ^mpGJi$Gat(NQt@Gx+>!KHij>j>PbISXs6k%n zpJ7RW4Eb5&a)pejyZodml4vTT=6Y*}1Z4CO+Y-|v>;WR_Xe*e0jaSt8POgxX2yNzD z1DOx3x1=Eu@GRD-#623)5Q)%RGpCF!v_aQxt3$9i7b4nng|k(gMd+R8b|^&svuc+C zIUyNQ3zn`eQm39khytb2lv_+kN|lJs6%^7)1RH|LsoIcS>PRz=k4V*RE?SVfHdb68olx&?*4asb7j@PP_J*W#O$NVyofe2=r&29ZflvM!ot*!3UxTG7Zoj|j zZ)blu-EJsH0Q>g%<Ef6ikNJX$TiJLhZ!&vOS1vR{@MX*#YNxg2##4lT_#>kii z7Wk=Oa+Ty=*6-N0QYOkuemC^T|6#)^zazTnfA4US-gfvMQ9*{y&&F}OXea!{@2@`b PgO9$of02KE|J(lq)@dv{ diff --git a/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_8f4daadf3e41747492cd381cbbd1cf33dd52735f597de4b4c804effd2600d135.json b/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_8f4daadf3e41747492cd381cbbd1cf33dd52735f597de4b4c804effd2600d135.json index 84e1f32dedfa08ac22488e0f0beffac6538d0a05..0a68301071229eaaea0b3e217b4cd200fd58f67c 100644 GIT binary patch literal 78687 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 MZ|xuQ*Ox#49~t7g1ONa4 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_955992f6446147d75ceb7c6df1813ed974a48e2886d61d2f5057005e2666ae7c.json b/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_955992f6446147d75ceb7c6df1813ed974a48e2886d61d2f5057005e2666ae7c.json new file mode 100644 index 0000000000000000000000000000000000000000..f7da8d4aca5698dfbc6ed240e4a807492403da29 GIT binary patch literal 67582 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 TuY8O3l@IRyYW*Sq{P5`?ZS500 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_b4b5361aa4f0450e6537dc5135d6bae7b358c6fa9761cb65680f9e2f54c61f50.json b/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_b4b5361aa4f0450e6537dc5135d6bae7b358c6fa9761cb65680f9e2f54c61f50.json new file mode 100644 index 0000000000000000000000000000000000000000..55e1a610b2125e12dc8cc5bc96c00038048f9db5 GIT binary patch literal 67592 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 Fe*m>x6;1#E literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_f4686bfe637dbe76a6de26e085c3fb36ec9234525729613a7a0a3138baff6d6a.json b/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_f4686bfe637dbe76a6de26e085c3fb36ec9234525729613a7a0a3138baff6d6a.json deleted file mode 100644 index 81e24ba8f75050ad62859c4ce11f35a193333f44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69501 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 KeUm@F|M*X{t diff --git a/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_ff56aa1c3d107ee8f232f889ce6d623ba6f340f6953cc1b450631f9e38394fa6.json b/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_ff56aa1c3d107ee8f232f889ce6d623ba6f340f6953cc1b450631f9e38394fa6.json deleted file mode 100644 index 0993f06871ca7e2e86fd31e4f5b86f7202fb9255..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71026 zcmeI*TW?iKmIUB_u3usC><1rT0QXzJk7j;AtAsq@ZlSI+B`&2ImH6)yv2$Z@3JT}9 z)h=~STRMR4lbP!hv0|;<2f;7j9UVRS`TFg<*Kcl~{Q2mYeA^$K+&klFX z&bO;JUms33R!&d12cMqZZNJ&HCrh?hKr5 zetvqs*>JXvV(Z`Y&5pz6=BV?H?dKOO0^ff!_2ku?mmhw-zIp%R{r~=S{o>~8$LpY$ zpZ<9D`sT^)s@FHKuK(xu-Jh=BX2*YK?O$$Q{m0dRU;l8o^4W6pN z>xPe?mZu&++`P}bw`_d!=IyKNw=b^Vy-aRi-~2uAy?^`R`gX%lZ{Pe}67+}5X&>|Z z$L~IV_owfEdGcTXc=G4J9#SMJfwR-)b$)yZl82K+{_NKm`8vN2{XUD%k1w8g-RGOO zThH_Uw^rS*P1O!FPmjZha-@G8mhUD`xH~6q*4?^!(opL5(>o`6*5UZ#+405l!>Gtz zwBwNN@8`#t@oNcpoO^k({3NF?UN#r;w6>C_tn2cV`d=5;ckb~hMSKybp4O>*-5EJb z#y{CQzYFc+WMY4EF>*8Vy|~^GFYeAsit5wFaSpsVJr0ERZzOH`N#5!Y7XsYx@uA)p zg_0)LSI_%xl2!+1C>D?IHMJ!FOJs`9hO7zimR^0U-(G%VTl4!loD0s2pUK6t_fv6f zh;m4q`c3y5dyO>yMq7H6EgM#Tt$;Si*X(C$Z0;6se!Kp*+sD`SAr*0p#ah^<>59V^ zsb85$Kl)aoY^;SEznO~7vY{}8V&T{Pmiw8ovC{JocKF5FL?v!av{q8N_ww^sTT)(6 z!Lg=DOpL;v&uZ7p`D@hW)K}_ZZ6BME14Pdk6O|k!MujSYkXJ(25dwQ9E;X?s1|=%F zjUJy#;Aw#Owwn!n^(Q92p>mtW1N{c_z;Lu_N_DSlb8nyA#Ii5 )eE7^jMwMAor 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 YbvSJ&{L1H7UwPxRAFbcykMBSJA6^=vasU7T diff --git a/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 808b4f01189bc76a5960f835750320fe8eb70b21..d438f5cdd3c70a33082da0d6fb21c942f97f77c8 100644 GIT binary patch delta 2559 zcmYjT4Q!O<9nbsGduhQ@ZCBcW>$OTvkN3Uzx%a(0`T_0nRohg0wHt*NQVvEIn1Ck> z(QI)roI0~bYyaB6Fqju3nh0XILRObB&n(8(ZF0_F0zs)`AsY&GiY@~r`#sNlM3W}X z-ShGP|9@Z4JvMR67YA+`E9j*OJKkg`lD1E`me$c#eY2LN_i7sG38R)CTU1ArhNz3l zJ@IDshs|;I=gU(GPc8*#Tg@(>e_5-im&}bJ5q$sK8FR+#OZIEj`(2aH)Y}wpviN$J zVbj>{Cf!)-((|>^k=76m&T&S&j1axP!r|dnnu~RdpV^`b%7i_>`yL}o!{HErS*klU z)*hny`y47%l+Zh~9o~Ii4^i(xR4(wk)rLLlYbH`_7rM#Wl;P0u zBO$8#z~#R`r~C9qo9fY`Xbdai5WSRj>1cx<9 zO&TWsFRY;DhBUs7w0#W<-F7Ta@Afz})hsx-6cXRQ5{*d~c~+<4aDI!1n%@!t&ZQem z#CTa`LkYch68c*QUJDhWaW}aM!$P+-*#H_ADKA?vueVBgX-!+nJpD0=$Cba-yE$GRS*Z$ zwoA1?cchmoyCK424+I7J7mWNyJTlbx_)wqr`=LI4&Bt65hkAw^LNr$G@<`h7M?Vjk z=kGj^7)mXvwj4fu(sgZ!&&ayhJNCY`wK(Bqy^@l)L)Q{teB?Mkl}&7Y@8 zrn33ABuLQ!FdEfRshS`w`_nL&__IqVeiwxj0=3b*OV!0vlk|^6G0MF!_(&UCUR)uQ z$|7V8=g#RKl~%+#{0a0j<-5G1#W+maJwE@bAA5^AtE_dl8lwGKM?ARY$*KU^p+1LS zyi=u{$^V*F)HSaAI`Gw?JloJ+ntsOTlmYRnSl^lu(v1M#ca&edqmB{`A4wzkkO3aO zG9yV7E21(6JkC4>`>WuQF(;+P0M4QH-^S2L(ISHZc%w^A1ZzO2^xLI{u)bL0j-2nhc*uHp1a!@ZE(d_Pug35D)P251!Vsh*U8{_-h#=!Xsz!xB zt_Eb83B2g1;gWgH;^r@ez=x~mK_2pj>HRdsZ!N=JGA{CMC9E$oR&xLMprP=Dwkd$i z;Y*wG1V6n|OLBfQNE*K8fjtpO@y2%TX3X(j5_qLlCmmBNq+Bg7zhWyq_|Qe&mZw6T zKBF%fT?UQ4+U-(ytH~FmnxsX}th$kpwE{z$G&oNA2LtBhPk=r9etWU@{~KiJvvN*j2i%j0(%jfnTRgZXoCvd-98Ik4q)ZS!qOTutQFIoJ(%|?pXoC1*P<}x~Ar=*m_ z{r6}ly}ild;&wgDU)w1_YfQd^w`hFOq>ob$A1&8yeyKd;BNzDUG4=xVFS zQ-9EXZcXaGn(GrekH51OxC$?rR9Ek)R)9^0oaQAT>S)sC!`tx>f%8csMeTECG}sx@ z_=&qpz&(Dv%Lu42=joZO^h%e*hz1U4X!vx*!`%Q|n+vG7!Z%x-449n@Ilof(_|Mls zkW`@qw*yEXhqTXG)V4SVlHUm+-ZL&wAJ+r!zobVrf5_+C#Gh8)nV}JB%_eI!02>fcolPQGv}bB@LH` z+ai8tuNKmqZos?Ff{Fz-x_qw32*n0G^@Z-zq-9~?E{(6Z_~Vx~m(Og3;zu3?xrhBM z|8`z?M3VH{bw!>g4Tbc}8W7Xx^2{DR;*m%6kk%YC`Ai3($$`^fap}d4Fx$;Y%}~C7 zd$CXB)&4Er2Q*V{U3ky?mi;AcDK6r+>EwT0`h0`8U;>|hx-=HOa$D7PU(52ASD~_r zf|lep%XCY)k3X~pDSE0tq(ohy`rzCtcnf1gJanT`*y_dxhlZD$+;}(2@tQ9h zu@rl;CDb%6+LHkD*A&spnx7@1$zp9rHTIi%wbG3Rbt;YU=Sc`JjxLYKI#5k==tk?pV0e`y^Rnn)&^Jt^$T_#p z=P9wbGKQ=2gD090YR}!_@r$#%t?H;booNYZdYeiNi{APa+4WIstXK0&0jChs&B}Oy zRewi2M{@o%M{>^|$!R}3lGEK!xNp1W^XxS(;-plSlo^TCi_C)953|(Y=F`93P&uWl ztJIRiH~*-oMSAhyFU}(`l!yD945WI9Y&y5hmE4V} zu-8#hF}A~42-B+0Sg%7#kMk`?ni1D=${pMk(D}5I5v@*3d7G|;p3sI>05Lba#!tqU z>lr@U3@GSP`8`^gaI8OZHIGk9PTz)^g9yH7Cqy7gk$u;twiSZVxLs zFxfoQ4QCc>Tdzu_1W)?x#8RpBm05(wN~uA@{hjQ`g> zjK8zT@Rb^{tz&Jqz_(Zq{6QBUNSg;g^>}&^WtTjTfJ@VEoL53n+F43+dsD)C6Xni( z?B`)tweo~)GV_6~$vC2FJXE-7(!=q7kaM}J8j&TIdCqp@o@7H(f5L}x({vU2b7iqt zicfWB*<-TBe17`|R^eB{dYt-w^(pKDiz|KjN~|R7CtkeuA30P!jYvJHC#6T~SdW!8 zlvMK@9ojEh#``jmmW)}h0U2s;Ov&K~_~g6TTZI>}AJ<1pEQ-MT1cq~5PYDXZvuK5f zFhidr#c#NxNZvju*BW>(kinrs900{0BTIj)N9_MszqbTm zHjTx{QlNZN?gn?}aaL;4TMc_C0A(jLVdTk=HVyyfSb>PHaEQ$R2fCnlx-wd6M zUlNSN1KW(($8N~jad{FE<7htA8qbmbxi;i}Lysis9-Yh3RBIx}brdFh5}W${bpd(H z)lO$C0Y3~c0L78vG8eCI75}2fWg|!t s|1S^;vP{k!6h#`3`PeEUt!m5C@3Du4ZrWwk(Nwi19&q^nUB>DE15mK3MF0Q* diff --git a/packages/rs-sdk/tests/vectors/contested_resources_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_resources_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resources_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_limit/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/contested_resources_limit/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resources_limit/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_00b7bac855f345476da659743b50939881e64c648abe4ad1313f570e98350d1f.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_00b7bac855f345476da659743b50939881e64c648abe4ad1313f570e98350d1f.json deleted file mode 100644 index c445831dadf8dc7269affa562a7fdd64b481f689..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72993 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_061d1caf0f2b50525a3e3506457850dfa046ebabf22c41f663ba73e3d730cf95.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_061d1caf0f2b50525a3e3506457850dfa046ebabf22c41f663ba73e3d730cf95.json deleted file mode 100644 index fc29731e9ccae0585f9709c92c0fd1f499ab6a57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95743 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 aUmZ?&`?k9;e1-Le5AOYHev^NG`0yVr{0(dX literal 60046 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_0e929893694b229f677394cbb4df4542eda610924f03cc11a5546eafee13bfde.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_0e929893694b229f677394cbb4df4542eda610924f03cc11a5546eafee13bfde.json new file mode 100644 index 0000000000000000000000000000000000000000..a31271612eb7c0a2d6fc3468d2b37d7f050414ea GIT binary patch literal 67421 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 A&Hw-a literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_12a83820f10ece0b180bee7d58c1d4e66aec36ada2efbb1072f2196b5b856222.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_12a83820f10ece0b180bee7d58c1d4e66aec36ada2efbb1072f2196b5b856222.json index 9ebddbd993eaf889db2d105ea7813ff0baa85197..695c2b6b2a5b23ef9ca34d9a71cc9abeb0652e23 100644 GIT binary patch literal 60228 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_1b0ced62edb21c226e57f54549af899d86a39c5259bdade02cd2e90c72b20388.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_1b0ced62edb21c226e57f54549af899d86a39c5259bdade02cd2e90c72b20388.json deleted file mode 100644 index f071276122e14c29bd209460717d810309e47851..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88021 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 L`XPUO`{929>mab% diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_1f4401f226caa8a5d77354422e8e82bd614dd12d29f8041839df02c578fb7ed2.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_1f4401f226caa8a5d77354422e8e82bd614dd12d29f8041839df02c578fb7ed2.json deleted file mode 100644 index 89b1c78f641d26f93d8c397c2654728205e7740a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64030 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 Khy3;9yZ-|*>r(Up diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_247a25c20366e893f60cc0d9321dd268f3555081d2a3a5e112886b1c78b4009f.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_247a25c20366e893f60cc0d9321dd268f3555081d2a3a5e112886b1c78b4009f.json index d118b25e8ad3074ffcc829b6e70d29ee8ad75c96..585f18c147b4f02fc9c17f0fa8e9d8c40d9e1153 100644 GIT binary patch literal 78702 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 literal 95487 zcmeI*QIB6mas}`_^C>Jp&%^x39^12Td5@A0utLbe-UtP3WDH8Q;=AXZ+ZWFzfZe~= z4g&3!#xP@dch#vnb*j4mX7}%(J$m%`hu81E`|9nR$A5YB_x#x3xc=~ce){t5oA>Wt ze);~3uU_T1|GF*dvYRK@S08@3Tt7YhaQEW=hZlGE-(Q~J9)7sKIsEYau>a=fuHJ^)H^^ z8+dZ~{hOzU4Ns0Jj{dzk?6}+=j(U2q{o;1dz~?`idi?6`m*0Q$`px?<-v95nufKTn z@|)MmT7LJNmtVbk{9)BsZ(hCrpAUcf?aO!B@$XstuWw%c+spra{q_CI@7}+Bm)vjb ze|Y)z_piVE84K?D@aWOykoHH94#4t9*M|r{dUV8-KfE0B-L+3Y@apql;Cub%)i1oc zM?buM`TmQ|)hztm+qnDY`>((L0R79i-@kdE-@N_c(c`!8UcG+z#mn!$%;8_X`LF!p z-(G(G-RloqzJ2%hhlcU}yYF9b4*i&a{`lFCpZ&{ce}DWR|NZzcf4zieA<>hY?d$2) zC9$|%U-IvMf1B^~>(ZaI=;_t%i>~|mrsLM9`SXvh`mi>*jT#)a_^YPV}tH)$Q}E+wC_~hxcg5A;*6{y}FBE8{Bd3-R<@}Id${0v52R& zl`v&pmtWWay0HJrCp=0S+{USAb?TGuj2I>2KiPVE4=p_S^!~(R#Ad{MbG;C6@6Sny z>eKC24!pg&N($@W2-@~L`J?{kMt}*6^|o0kX<~i%ygw#rbzp{K@#vGLw&4FVGtJI{ ztbzA|Uj3u~c=r?A8sDF%bIbGQXJWDK{i!$(M7c!hf788UuaV*}+R~$JIk58A3g~cr z&0daSZ0t5~e!KpT+sF6yAr++p#^et|r2 zI@&a)x_7ntWS=}>Sp#0|Qr)$ZE$CQVG!{sch>kVL3BJG=Ub65Rq)gc_vb}Jh0{zNUTU;TXzvdR5m7Uln_g`b*JIluuvY$L&4q% zuk~fEsqM}ISTeS0gcpEhizH=)YaYeUMiHx4dXh-`6T)k(k`4i0AR(|+Vh3;WDvMcy zbn4#pq!FGUDHB^k-9QOya%RthaHCt)|0G&8WI$#*CEcnaVU%E5XdflH4pc!wj0y?! z<<-|FHO<>5W#Q(FNhuH%H;u5ys#CPYw&$myG`2V|#Y$COW0iCW;hS`wU1LJM68&K@ z+<0p|PcB5SG~I*b&ERzPH4BosK|kKvTZHFHvICKfl(fVUT;FO% zrR{p@k~M)0=@ul(zJ+4D$&~RbH7@-kfm#6)9?FQ`Y9b}Xi|UR-MxFYzB@wDacushC zXNa^Ee`TFC)A;~$OoCBh+Tvv28)Aipn2g1k!>RRjeNaf-?Uqyu1vXnE6w*T*rQ8b$ ze(DRoDi-movBD}Ya0zb~a|Y9W$V3{PpeSmI(n{{)zvQkxnz)fH_~cM}Xkcl50xQzG z2Ue#zoE0^;jZ%P6IwVT_`NY_qFEU#b7^QA;MsXcYchVKz2xQ4xA!GmQ7X1(>gR#;h znn}aY21K`1ph%Y*qCT)JwrCSFzc>HLTQou4eo`GXiLHI(R@5MnH>pC@(> zx5cAvO?T3szui9OtlB|YT8qG+D7Jf~5tY}M1Be6m(-6EV{xcjhIGEFr^I)Eud zur$gLX_}RKf!q{OYe&c~PxRz>Aiw3S0MR!quiKbER5-60lkZ@iG>%ZnMEm9!YL>MJox*lhzl3ak- z1kMr#A|%gxPJ~7YXNkI$35^(-KrIY836vCU=s~e<`j8||ABt_aB*G#i@v0G)Ew!R$ zjvu`>@3A5^HP&lVid{HdD_bh9QnJO1y{Vb+XhA^)j!O#?l)Nuc1y!hyQOReqU~dxB z6a>gfx)QSNqP(X}Wc>g_*i#_HtC~pCB^}+83`%&r1

0G;;X-;t~VFHp>s@e1k8M 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 Khy3;B&;JYZ)VSCH diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_2b0bd7604b1c5ccc1f01ff0da46a4b98bc0a965fb8b29d1b552d5a29ae192ab9.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_2b0bd7604b1c5ccc1f01ff0da46a4b98bc0a965fb8b29d1b552d5a29ae192ab9.json deleted file mode 100644 index 3c5d236a43f92e087b06abbc5d290bef28e8062f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67524 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 Y9ZuT`KlA<7XFmAkSL>Vn_05O>0HJLM%>V!Z diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_307328f0782bfb7cdc1e11c92af84e6f2c2b37a1da002e0a485ad7bc30b764bb.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_307328f0782bfb7cdc1e11c92af84e6f2c2b37a1da002e0a485ad7bc30b764bb.json index dbbd1e333e0c01b6ba11e0e7fa059a992eb955c0..5c5b0000fdb0fa2b68021546b8c3edbe2029a3bb 100644 GIT binary patch literal 67642 zcmeI*TW?**l?32<_OBrH%m*G`EHQ8MK1hCmVF(91;j*g!Fa{cc8o3}U5{&e(fzU>cAZr|s-S8s1Vyt{h! z;pLmx`SEwlk}f+vJ2}4n=5TVp`R4M)-8U~T@7^DtUu?cPIo*8oe6#=bbhGUA>~Od2 ze7kD%{&2Ffa(cQw`1I^<`{m}S!|Atozc_3{Io%v}IBa&GZ;surx!fMKS^whsoq@B> z&ri=c8_u>-Z2fz&*>Sks9Cg02{o-Op;QP;}p1pqi>f=w>Hy>Vp`1{Y-FK@1Xx(;gj z=}%X0Zl2w)dUNyo`fsc{uj>xNICm#5@D-h9Y! zFK(0e?CrbP*Y93ly?>SX-`xD)=dHI}et!4%mm>Y)-N$j>r=0rfn@`{T*EhdD`^#US z{pq_yDj_^SJ6&Gq$A`dmI636szQ4%(d>#6I7M&koyy&|7o3>le^ZP$qb-OmDIm~=} z9N0^Q{&QHqn>gX_oVZzc>*h&AsoUS)InlE&j^ozF^212QU9{tn?SIdYFXPt|?l|}I zV);oj53>-;XX9P#k}$ zkP>D?%rDi@eJbA1WYd@5KU`eDIiy8#3&&d9W$FsW7OdZxNZ3)-R>A!(t=b1wWxFLsFF>qb z{Q>hghY#qBMXbn{TA?UXsIh{%sud;4!K~D)=N`L;AFl+&cx45fY89TZh|88@kr$Fg zqiEpMnlP}NUtj-I;G~41pSTngEpWM_sxSa0yvL=weFIC~XO$CKku%PVlgjj^6Iyj~Fs$tr4oQ;JcvqIFAhi*OeU zEYXk{XjGg7-j$%iu&v&s=7lic)fooi`Kzh_G>>VZT4)|0>!zf`$qY#oe@Z?H5 zRN;xs;_VeB28DyL#@VCUjB~6C+Cnefla_ue1YF(|0kXfhrY8b-Kn&Aq?)x=(1W7 z`gO~W**k(jqz(O0(o2uWG?BpLl9`Bl2plTQbxDgz>r`|=NnWX>^Rr$mqFhbg5i4?j zP?oW_E(r>nrA84JVL5acVVzMBqcE35WVG$pbBwp^ajNMSAx6ET1{aYO$m&l-PZGOE zy~7IK6mUeTS7}~S+66)?qF7`-Zs{$Iyc+63ny)<~iHc?lwHk$JVBv^tk}{9L#Yz$1 zLHOJ##j(bs1ro0a!5v*G=^_LZwMKyhXAzegum6kwki_kPBQ&jovT_*Z+K>&01+TUPy}^wwILs7lgqx2sY5+(HG#O~68w3~S~D+(HQ zLe?#QPf?9+QHWO^BV~OSw~tHdb<2+7Fr^`+8jj5)u2FZr_OFB>By0!~oE=sKj$$F2 zQ?J5X#Ufio&o#Y!NQjK834yPP)k|5FOLMmP_bSjr*{aO^NQAw;~5y$Ap zl({P}VMt@qUKtbkd|=Fw^GewD@k%tLf#`s@4Ce$&O$b#QNOI*{s5%;Zs3iq8(lw9B zS6ENZ*y7|zl^=Vna&_MSkcap~G*Ee&cRPf6#Kj7zmPWK%RJ3I-O|$D&+oL?f;TK7)h+mFr`QOIGG3#Y9gei>T`OO zA$Z;B7A4^hQVHTstT3vJ^N?TQSQ8~)jV(r!F}VrowSrXa7M$GXTVB;BS<*zMpp;a} zl7K!OBeusS63-?U+h4Z`+*wSCs{e~ugdn-p^94Jt)`ZZkN|x#pYQk!T>LQX(Eg*r6 z>X`oMr=?A~MJZ@GXsKc&8}y?@WlMKSW6EOFv?MB6%mcBIaDILLSM1WhCFGijSF)w+ zrH;BjaLeu2tzchT1}l* zs4nnPMj;lic0IP3m3u@aSxo%t;)EcSAW9cs$)|Zjl@d=R%)%7%pw_7nt^6TMW3#Ra z*ZBq_=~}G_QJdjKhhcmgpb+kO4XjHNMFMZGcFZ=K-Vyus&{dZtQAIE&q*_Pp2A?FV z=f^8)(`^uvSOTuj_y>jNf2v!@QOeIkZ$h~mjuoNY>&PcjtUyqrLJZ+vU6RR1J4Lff zM8(>y=2Kf4#E_6VpX84>Uu|Ivm_3yNgQ%_>esELf{cF+t@c<;ms0aF6;(d#=!_ zijj&|9ZQy^B1X4jDNFbyO<9kzH(dnx4z-l?S2#4cF(D&O>yCJv#O5V|lvEN$&yVa& z6wMV@_k1a-Cv}F}mbM|O&^sMWO&T@pPw~zY3-35W#{jh>W_X z(io*=0u`53Iug68hdlIX;F75NANGo|n|v|2Gm=6|Z2dP=Sal%Iv(6hh9|iYUs$ zy=t07QC0*9O4N=iMVfU)z&fd{SFM=$gqToFiM(JYKFP^TzlmAac z?MDHEx^T{?MlT|xlxy3P(RUPD|2r)&U96A(@TtXWLQq%(q1a`yQ9^`>lTS#^FP3bK zY@5D4wtnW~AcSH4PmN2NwB=z-%J~U_uDab4y%N6Fv88v8uZIKSgrmJbJx4VfC>d6%$(!{2qRHg9~mbhfoU`T=wc$;2P!hxXGl$^gNRvQy0 zwo!*9G->ZkELBIMAeXS~wZM~Daw!EHp39Sg=2mYpi@p)522W^<#@;|ga#=t`10hnv zR}`$Z|2RH#>JlS`=^dfyOEC^YS|Aj{s6@f5A*2#z%PQ~Wn44&mlH6u7aW5g;`C}{* zde@%_BW;P8P-4>#uyyim9Dm5A2z9U!uaY8$TOUDayUAEZz%5ZzqN)a|J{e<5TJ_5N zX01q5YZN*u#RO_j8KN^r1cay?k~}6HO_W}^kmoglBw4+BoUWb2A8Q^!mKw4`gT|;L z`5!QB_%n^iVgicQ*8uA)@Zl?%nAQYt-#faPP88BCI)Q}GWFm{Hxg_L>v&^&=mhqYf zq9*YEzHXT|(dS^2sGg6x8ZK$B>X_(uM=33$@I=(6lQ7LWMB0oi0t9&y2$CG#5`Sn* z*UPi|wN43wWdNqJd5xX02+$tLd_$ze*YY9aWtt-YL%c9#S~OOd5V-Cl!6ZQ@tw4O& zc!@$;EdGz=Sh=OgNz^e>5fIesRf<}y3>{W0Bg69yT&)nD5({3YhLw4*c4jy@N+5y5 zs(Z{TA_yxSq6sS^)WRa>s5}YWY9!}N8SZIe*!4=1P!VV5RxTpAqu5v6ryD_{XvR=d zYK63PY5L9Ev}0YYR(9Yx?GH(4o!3$J-|`Ve=@Dg9;O4WMp-2ul=@=J^d1pqjqBet~ z#ErHv8U^E(tglOtoYg9Z^t-y0%OEL6%0W6&O=zb`V!d(4kcn7iU#71HqR+h%i<(eI z=|@OePyI2B61b_84iPhd^z*53DIo~ZMOi9hMNQPHA=CO4ouIaIRk@U+6Rc|mx9kXf zzNlHs0<;W%J)hR6`~~IabD=AQJfu=lOW?|l7!oxbfe>kvTk@)KkW1mJ=s@9!OE`fy za8Zx0&r5h!$58gyQk8UN%le`@EwN~l!$uLeE?zRgWulx%)h&)YNN{`fXL@ir} zSBAxMkztZZu5vgtO8?|(N7oJAJRlA<9AMt9lXb4nC+PmrSut;b4>DkiA5Ppg$l*6aRXQ#)vucvI>rXp{ivhkFS zZ3edQpSZEjhUqg+0ug_j^QBXCQj*E1V*rhad8$MHWU(YCiyH#Dl=*YlZHov`!(mfI zlgV-q(nQ4sVcpz@dpL*|4y0?nlJM(TGC;gV6Ahfs*Ql|#)*l5TrKdn-i&!ZNdC3!` zfgLx;FU^YMQcrUEIK1m)I>x;`e_3X92EE{YKgs3_#>BQSOl%HP+f<&`eZnd{xrQw z6oH82O%Go{Bw1FT6bOo9VY~9G%8cnPuLQ(VBakb1DY>%1b^I8)l>%(ki#R~wi;7YK zs!%I$2h|}2N|8Q|9GWJLul}boQKSF2^lAV>B)6zj5t3M1T<52s^p?`%35EHzc>56M zDH~7O*k)k+{)rn;+1O@a``+|f#b0km^POdkWOQN478+@mkN2 z!Zne5fecRTmU%cbvd6A$OvdgASSDiCnZ3g59}@w3+<`2=XKlBssbz z{?L}Lm&dAstoLz(AX}E#{3yG|PFMtJ4`kjYI(#i3y6orC7Wp6INrPBjLg2cK1XFa+ zv?BP5^YuL3-XTZxI-K*xr7YF~Ae5jjEwp$=q7>E%YGvIH;z=#^{2iYm#)LYyqzgm< za~pr6#*APDR?`(jLd80kSfsQYMR>9!!y@Br#$-!tM9RD-c2r{0C7?82`#{lHP$KG8 zObCuu6^y;?5)kW^j%v$L!L*kqTd!z63hCjY|L5A}WQC?@9nSLgJYR==_4~X(xjeqS z$Uo=Dm;KFndlvG)=pQ0pX5~W;jN5D3vZM9`D0QOIypaFJNUU^yq!N*06Nz28JGG^>D!YPKr+HkvUUH-dv^ON;h27D_hzM#jDh{lB6Wm86Z~LRPO$WefwTZ+ng8ib|tYA200!dP7PVpbj_+ zN)lDXLtTO+)r88B^NWb4i?$>RNpBgIzN}kfMZ~1-Lvp+Fil`fs2;vF6%0szbaz&sQ zarCN)kXN2t!%qBP>j;&zAq$;q1)o4y|AkI9fsBm_jv{p=%2uzEC<&xdh)fMZnAfPf zl)xodHL*Nwn76Vgx2X%_VM3t9`enJf(rQX>C5mF57X^|;Y4rs`LOgKO`kcS$GcW{i zmn9)KzQUJ+%_FRTGpX$O3xYy-RN)#E3r`4yCn=3MAr4x3?dCO z8rG}GqLg~K=#V5XkuyP|x-&hX4;1FtH&W^MZF{sHAM4cr9mK=we?Sab3JOwgJwKu$ z#O{_vA?4F8J31w{rPYd8kcJ=Gq|$C(|BE}{KmL=3LoA*4FC9+Pz&0NfHOTn=hxK_l WZM*xzr&wS3#l0V`-{ha~Km9*9J0Oby literal 77068 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_3df76526b556901d24900733a8fbd232dcd96dc9a5c1a50dca162467fc9a8757.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_3df76526b556901d24900733a8fbd232dcd96dc9a5c1a50dca162467fc9a8757.json new file mode 100644 index 0000000000000000000000000000000000000000..5256bddec57ebca846c4130e2800ae8751af850e GIT binary patch literal 71528 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_4153546f1e76e6a6c20fb42644192ff55e2434e36b13595910f1c02c9473b680.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_4153546f1e76e6a6c20fb42644192ff55e2434e36b13595910f1c02c9473b680.json deleted file mode 100644 index b700bfc7fe0b9cf00c80893314d06b46dab8cee3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78881 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 avv!;=S_yyW`PJ|I;G=J?AM)4t@BbIw-^?)p diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_49593e41313ee6da1685f4a59d9e8d08982802ad41ae314ebdd902533315d200.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_49593e41313ee6da1685f4a59d9e8d08982802ad41ae314ebdd902533315d200.json deleted file mode 100644 index 396a405b2a3ee6c1bd3a58e34c29070c2ef20787..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91741 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 RzwwI?{%HRp|N8Qm{{!~+_G|zE diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_4bc3a31c696a234e5ef24e6a1d5f8d622dd35b75e8090c88ddc45fd4e669d448.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_4bc3a31c696a234e5ef24e6a1d5f8d622dd35b75e8090c88ddc45fd4e669d448.json deleted file mode 100644 index f90eb17e1acb907962b23f481cdd3add237e174e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73350 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_5685b7b4cb0467fc8d4021fb120b76feb7a8b605c1da4a28fc1fd42e93420169.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_5685b7b4cb0467fc8d4021fb120b76feb7a8b605c1da4a28fc1fd42e93420169.json deleted file mode 100644 index dedeb51050faa3f2c23f14d7022e71f2610189ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87831 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_61164ed4c833bb713ba73b843a1ac9fe0fc7e82040ccd47c874cd988de5a8574.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_61164ed4c833bb713ba73b843a1ac9fe0fc7e82040ccd47c874cd988de5a8574.json deleted file mode 100644 index 0d8699da07b419e8462c656dd1d25539fdb78874..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65729 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_6867758e065031acc5e4b6bf5ef3b70df05ee0895f634d3fdffa5e9c7fdee578.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_6867758e065031acc5e4b6bf5ef3b70df05ee0895f634d3fdffa5e9c7fdee578.json deleted file mode 100644 index a018630dd120b3fc0d1cf06f147a1af5d96764a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86114 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 Te1!FxUwrgO>ks+IkMI8vDs0Ud diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_69ddb327c1fd562d5bd35a74d14011fde307d9d55bce41f8ed2a3f895a8e7c33.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_69ddb327c1fd562d5bd35a74d14011fde307d9d55bce41f8ed2a3f895a8e7c33.json new file mode 100644 index 0000000000000000000000000000000000000000..c2b8c57a478577d669c5c0c3baba201ae9d6c77a GIT binary patch literal 64084 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_74477b940a401b9daa770791ce4ffaf2f0b3d1a7ca2598153024a58bdea3b343.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_74477b940a401b9daa770791ce4ffaf2f0b3d1a7ca2598153024a58bdea3b343.json index bdfacb50136b7b159e43e8fda00d27213ab3e8ae..4128fc438ea03300e81d998d594dc842a3095b16 100644 GIT binary patch literal 67668 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 GhkpXXA0-F? literal 71637 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 F{sG9d7BK(- diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_7e6aba0e36304760488e6c79655130dcb43dda8bfe725b4edb4b10dd8cdd687c.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_7e6aba0e36304760488e6c79655130dcb43dda8bfe725b4edb4b10dd8cdd687c.json deleted file mode 100644 index 6812e095d8883fcc65320d44b604f95bab415471..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82623 zcmeI*-ELjSl?33q_EQMD<^>ObBr$h$KS&-RFa(Xn42;;6p&w%ghTeUuc5jheku3JN z5egA<04gTM?%iuu)vC369|!*ZhewYd|91W6?N6_79{=gl@Ae<~7&#vyiKRmtM{BU}<`Qhni|Jm7Q+1dHw zZrR0l)#m%d>E@KPv+aY=&hNHgZ60+vdvf=S!zPup&7%&7&F+iMW4CLrwh!8@fA;k5 zfb-4YpIvM=oNu$(#`kQq<8ZZk)WzoPXO}AjKYl#w@vGM_-~V!b^X~b(|NHg&`OS-8 zuESdX_Lmnw-8{Zs_0!F(>;Jv|?XNH1WXGSg_CIf4{nv~CzW(`c<=b~J-h}&Q{ckUR zet-S;6BXR);nAbRhW1B~Hi_j|ryGPHJ=*4zUmiAmckRWku73P1zw4Vy4)^ZK`v-oIQP_aXoL z;fD`D{KpT!KmN<#AOGpEhZIF5e}1-nU7Q@k+~M?)fA;&!e4jsu{+vY@CzsE*6l8$l(6{!D3)D@Loc1ikElK2}F(Q@+1$uJUa=6jcLfIv1XoID^Hq_hWHv zgmOq*`or*=dk<;;&9?HWS~jZuQUPrq-(wG37>nH!%^%m_cKi6gF{C1HxmXLkGF^H2 z$`R>5Un`W&X_3YsLa|vk9A-!?`kLQzzY;d5^!W#S_~rRTC2o#rt)z1A)#pEKNqIei zzzUHZF$#Ac)vlN4uUS`9U#N$*eQZ(=5q-WKQOiML)TojOMI~|_DR5L0Qh|*y2&iBi zKR%bl(*W;nHyipIPmcJC%WW19_M6B9)6u3W)xEmSy?t_%%f7^$yHs~i$rcQ(EgB1? zBw}C%nF5o7>XWk`w@}t4JzrEEly8WOQ=tw^gxEq;7EhqX10u4`1kXasmIwBnCX!PG z*w$Ul5S@)h8z;n4ZQUtcOD@D?btt(P;eCBsYihZ3KrR{E6yY6-WQ&k8;F`~3Ril_y zD?KEV|3vVLRp^k!n@9vKmDs^sqRL{nAf37wKPkfVBW19atP7N6O~I@zh&H-K;}6l| zAtPm$Q|ML?iJ~Nz9qpqc*MTZokfI{Oe0lY?Nlojvr0lr)A}LJ-%}o(jtU5&twtapI zO0mUxDW}xc6|2x8f-mVhyXFXuO8ke-aM7*lJY0xhDcwWlWpKLs%7PF#L`b?N#ai&G z2x(z`xR;M^skVjXdh#+#0c-nS)DY3>FH%0u8mGG&tN_K&Up$}W-7FFniAp@Y&)3;t z2NCfZ;jVR&z|=R0yKw|!)lMW^su1lFqpQvvrg!Z@I#hR#5c>N3B(Bq7oZq)V77MVN zNOB>+jc7RwsqV%zt&I}lEoMi`-6Da71+8w&TAh5j0reyDf#LjW1v_rg0aoOcW<(V+ zj!ttN6pyr`~O$f(nJ780R4MCX+68Vre+@K@DIGo1&JF-eY+rY#Qp-Vkdnq+~3{ zJe*oj*Cz{UyWNsXAz-s5Mj<`4DCJ&2>8HLhs^%h56)UXbCNA)1F*BI%Lr0{+Nfymo zP};*?;ur4Pqe&ZK!6%2xLxH9B0amPa1y-jxoD~(@qLf644nb*sJ}EZO7n|)7h*Gz> zqPUKxJLw+ZNXo)mQ^x+)E&3r&24j^+Jd=i>B@x|HgCdVgRG3JfPmENwnmBq+pHEqj z8-eO7B9RtDS!-$J;l0%8bs*eP3fQ%W;ml9VO+i_RoFr>)UR^I*THQmlNaE5}%bG-0 z+o$Kp1nBu;L7qQ^p;kjg_XrWjj`j1x&cki-Xj{{rw9j8|AM>ZsI8E`_yQqnv(jZ4{ zH1kg;Kn6SH|5knDrl2!6_OBr@D)V+FwS^r{;+N>^b4N*HE;)hab&hFy6FLzAQG_^%7MRLEZm%mZ)m%5>m6s7UE)YIbx&=$q_oeXj8zUf)rbz zga}G@hg>cA`2icNpv*?k$ZXc{m;g!GSxi=0eq;My2&Rg0iU_p`kMfx(agZX;-$txa z$@;)s(y4ik#Hr|(B2|NJY}42dAE4$ka-TnoK|m#I(OyF$&y-G~6pVZcQte#rL6Sm43Zyuab(fUq zj`brjGo{g1$SU#H87+~*Yn48+G}6T}*r@*+BEFlr9iHL7;<+aX=q60WUf5JaMiJt{(N&l{kMv-%`);)h28 zXFmAKhJs0%geeqry+xv0OIVs?eOUC?BaYX)>6Tr4L%rTxeT!hHtPj%C6CALQRgn~dMDdhQD5oKAlS5K2Hs*3OV zT32weaOMl&kQXJaVN2xQGQOsbYn(zxp<-B%keP7Jf^w(D3rgf&38|BCHVU>aXQ{Ow zA&JmUzqeho>)2O}4 zSG2zP--C<1X~GHqS`lTLiuC)x0vA;oKL}FdYd8`O@T1U(vT+KPa~2as>k&I9M!CEY zP&B^Myusj4TcSOgpo=+YxRrKUOmc*nLl*ZHnG{#I#I$tAZPe_tQ>0Z8I8p(Qn!#0f`%%PHjoUHuy*(!|xKQb$tY#VQPv=cEPDdVKyG648;; zkgSR8H69URw}c29z~Y&bLXPMuLPWQy&hd)fto2Ge6sxv?q6$zC*kANzY*NN%*EvTZ zT8Y3etSzYujA$jWZi%Q+w|WYf5;cqY#p2#(7jn%Zf*88wNNMgEW1<&=S)~vDB8Vft*H*N&dahmv!**ngLHWfv2`VooP$j~93(&`&u^PO%ui3HYrhuFvn zi4vj3D^SAVsuMy~LvQBvmRlwME$C`N&` zUvH=PRLcNnTqG*W0`Cizhrd$jF2Sn0mC|U+BEQCiKHn|a-8yv1Jm2RFcLP;bRClQe zWqqH&gN}$w6tdDGa8*?K5(8PcP+;PmRN8CG8h><-lYd(VRbS*G)z^m$N?a5gkJf4Q zFhoAzTz1?&ms9AL5um7uDsL_AY>{^$1qw^MDP)%vT@%4^qFeGs{v3Fvl=}RXk|50M zQ{D3Xp!O6B;a1ODoBfre^f^F$eKN4qKvyd*f!YlrqE%P=)&fg~| zUrAYqs2&ln5u$P@5Ut!1P-0L`0j;2kPxqHTf5?xv;P9U#II1*0@ysTYtGC)R)@kK| zifV6_Es>vP5jUgfhi<2%@CvqFpF}XQ!YkD=5~0Adr3J1vk{VPs<{%k(8rX=9DiPTq zyiod$N^?&iCmtg$>II8{&8X2FES}W3a9tJxkxWN}1)D2&M3sUiBB;P=vA#3;&eyjj zb#6>m?(i{UVaE|sHAdCMr50AKq~cmWazyPbMM@@yi`yIpC?0Q;GPdjzL8!XJ)LtlS zMQKO3ighS=G&hC?N;$2Ho}ZL)$W(22J-#tmD@YOJn1jejdN%%9c#sV7RONZ52eX`1QLa--qNP%i>$(>mYcyjqmq} zcS~|1u5m=^5&H&d8gzAv_Rm(T!|CywxP?aFazW!nh*0w_POOr*41i4 zB49(btgrTht#XZxzKJZQWaC5>OYWB=qFd5=N)@HmL~;b$NO{!WjlH;mg?*(GF9OP= zmN_Y;@(_iDxIH%ephwWd@g|~TmJn1jV&4vYyLPV zLubLaBAvuCT+!5*F#zZA4%IU91$=IiV?vfj*;DXJ+bzjma_PvI!BSpT(er!xB{}W5 zu;gAK<9AV7?t`G)L`7LdQNnduNEXUMcFB!kmB;k!DV1Nd2vAymIJftujT(Y**DRtC zRMcP)6op6h`RE2CBvMGXgbsnLSmjHkyKWKbS~W@OHJBKnq+FB|yx453TiyX`9kqpF z)@`gP@%f+_ltJw>5jn|k%ptg?x)RdY-1U?lpJ#=7b?JaCf%W+)NPB*= z-k~ea8echOM)$M-(h~uAT)chfb425a#ukC?_eX7f z?`UvyoPUjj*ISAt-IMOldH9~|c2dCG2SwF+CW*+D*s;OKX&ssLi1>g3mD`GBU7*4R z&AJ)ai91@1?>!nnzTheaOV-3)Pm#-JA;MF5cFps{wOkDv624tux9Dr4h)S;Wfy?Ih zB$DS#?t5%1H%+=tB&sB$1(=$ZQ?l3!7W+jRPZsnBRfsUwMt?y_n}WpOe1npl(&tOR z&{FMN5pquP@Zu8{iJ`4q^ppTATk1}-zER}}Nu=xZCGzMgu>ztai_^RPl=-eirqL9z zQLZS7$a_laNSj5l)n*aT)KjtrPpMOB`gls8pD*&yL8Yj%yiki-YKq|M5y@SPH=6WB z%&5s61f{{9ro2N`1KW9L*clk=uzsR&#S*0ksV>^lL`$@|kkSoZBB3;oi@*0*Lq`UW z3~mwFet*=)w?X4!&0ofTiX_9vj(LN6Zri$yOdU=#ic^2gc$sSgwa78S%AB0%^Cf+m zdnuQZK9e#(OJt}fIpIaM@#8DO0vqm#i$q0PL{akmH4D6bbeD**iA!my{2EVyk|VkW z=kU(SGKBZ}!regC?r33Q(IL#(;X>Zm_4&y{Y-)r=3h5SvtD?%6NO#>L(zR-m(rYj= zbBsUn5PixW6;U2e@eg5;mV#1uX&t5A>uatZjdjPr6{(*=+0K>hU7NVb}96AJt-v4AO%<=(!RCJgbR$y8fCI3e@-wv zQqTgYkYp&L&eBYyJqe~;(jpO}o+4W9^LGR`Vw=BT;Plw2^eyfPDgQei6^$!uHDt)m zcRK7k7*&A`T7=1Q@wa)8bj10H^A>^a_eX8~3!-8EtmZHMog&G6vSUP{OF>^;$duLL zfwEqK znzqdj!x~cPCSdb?l1DrWtGii9sg}E}rz{ec*kF&4cip^Rg3rSb_e~vFli5XDhx7b- znm>p9>CgH8^y=j5GXJTV|;QE6Jh^D(UH2l!E^Y4|%=;+wOAD zm06lsTT}nEiJgva^vMQ z1yyp#WIZ2GAyP;aJeA1eqcl7=g~)?g2uhO3AYvYP`UR-OMu{{R zxkLB)F)hkn?^O~{<+0=4Pk=?B27`ocL`ypCVvS1Nqg)S>$n;t>Cq{O(!DOw8M^ut~ zxe(D7E1a#`!UFF!wml-YhW=T#%YaPuVoy>U@EIL~iC_oikq$AZwz*eym(jbBj zLF80z2p6jYr;ix!VQ!#vdW3&=H|e zfDL^GO6V)&`I0R~6}$3?s^Lx3(Je`z;EfJm89 zpoUkqNG>b&x+N38Y^fS|yiZB}lBIQ^4ZWI|BDTWd`5KEf8XIOy>0Uu fQIiasUyb8%)=v0^kFdV*i%?d#-}VP*cklDvtGBoB-@SbG z{>7Wu`SIVEC0%xYadvw5&Ef2F^Ud}1`){6K-@iXRyV`tncE0)M*=GOw`DWSq#o>P0 z<#yHP{o!n5<@|hm@cG64_Up}2hx4cRzc_3{Io}+0IBa%bZjRlqx!xYMS^xamy@89( z&(AM68!om{Z2fz_*>Sku9Cf*|{rqZ0;QLRep1gkh>cfvWx9?xP|DT_3UfjO?@g}I{ zr$4@YbNl3O)tlSbH~)S2+n-*(%Z`7|+JC-%{Vy;7{pN@Jl|R3K`7YQm>wkIq!-t!n zKV!i?A5KmV8`w`yHi6|=XPXS4oNVLCFAp2MyY}*qSKogT-_7moFTA;ret7%x{foub zEc}nR8!m^`03r-UrK_z<38rlkKcX# z?w`K<^~t~e*OR~f{g5I_30#~nuglXzkUX3n@@L;)<$b;m{XUB>Pp_VL-RGOOTQBqb zZ>_ppo2ngVo}PvgaDPtRth;sdtfAEHr}s|uti$Qmv(u~Phf$IHXvZPj z|6ZP6$FC*aaqjii@{^ppc-dUU)7na!vaZX|>VI8WfAfGxDdMX*^|Ves=+4MdGXBZd z<$Y+O!NdELi;75rn&0v;6E;?Q{=p8vx|pcMjfvJuD)&Kt{$@+c>nS+a6p4vZ zxbs=V@Dx@#p{(6P2?ERceTjy1{T zm=sh`&U)NJQ5W>Qs5&U#02ie~9u^3Zg@!DeK#NC;NH*g<6DeCBS#ugltVm*8cM(HW zHYRP95KFanr|DW^Asov?iM<)#*O#@XmOBT;lCe!Qyd#io5l}|D=A&5IC}P!04~V2c zA-v`)a7f?{Bm|a9?BFe4Wid;TPTh;1G{f^FWpXP~H&GHbIkTc5+~^kdKR}CyjF6d5 zfm<~sjFMP(w2zWp2dYFtj0y?!^6G1on&xdm*>UqlP#Oq|n`T&Z)hSwX+w)UUnp>Qg zVx_9Cxe6RY_=2vpYfPwDqCYH#3vZ3*!9w&(;T|L}g45Mk6a=_ILgFnk)|^j8NDJ%X zUOu{|+!mCp$;&7OsO@`DLqMm$Ncl8sobD>Hk|;iZ(R`wJqli~TD$($sud~4pAfhvZ zUF#x_scsNC9xVvVj;Z^ zX*mk1?)o#$jRN5>x$uw}^ zWl9BS$?!Z$)<6W2l9m{P>szg;v|TS>mhbETRC$S=}YhrbZ!&y;t+bkszfi&&Y4X3?MNI^m1~FoznLn8l zGSDIYx9S@=1)Z_6e+`0BnYSycEbLGczeJaxJ4zB`i3uu%6Jz^;LyUa3C|U6 zX=x-^7)!SZ=XczF*ejW)nj#&*lp$CeWr#G*O1*?!2&gp#Vw?$eeIZU(iAY0lrMc|! z3LjwwI1<|y-SmLb#c9*hshij&O6akco2boj%t(v3`+9}*`5MT4dKK#-nDl%Jn?*wq z>{>wx+@7M?XGJup8YPXsBp=l=4|fEIa+~$!QZ!skHBpNO?kkG!qW%(1BkYnWl(mp> zUIy#GVwV;vA=gA0C0n{4XQz@}0;4hahGJE(#xRL7{~vshv;h-nHE$N*glS#}ZbDHB;g0-@MbAjGSh2&X-0GpI=;JV6a8`(VTDcC6gs;k}t}+gWKIACJF)8Lbrq!Vx?Z;jMOd3u*~-L z3YD{4(w9XByI#C%Ac*@&FHtv(Es6yZGEuLxOL0%^Qno!`WMTD+5KI)yYhHY6CHgG5 zllb@iBub;m78ym>C=kKw0|{M(TD+>Ti%X3nTL_CqLBldX{g>6b|>FuDdYzfxZGAKpDiajhsZqEy#lC%6Ia^i$D8i$ZO33*@;*xfgc%|wg z1=6S`QT0FUrKr<(sm#%zHe5`R`Jd{h+e&1O@)HP>A_*bqYef`g;a)XOq9`l=%-6am z2McGu@GbMggw<{Fyj#X=TDXQ45(*{5YC>khH42KI7B5*M?TSmCgtJj{+j5p#s|g8& zZu-6Ll3Yi=;=K6NEG?oppQWykS7N1G@TR{LK72ktl1k3Cek833I|?+ z)t@qOntLre4*p*Kx9$-h=aQKlmO^Iw6RRT)1hrG(c|BpTpHp%G-m3YBvfQ;Jp-J0?cCyilTO ze5HAVlRqtqb~2?d;+)}D+GTSR6Cw^-+(%?mT-_4Y!r8u#N%$QV@DaoszF=2jp+J%= zDH%;va~qeWDR)bFqStC2*Y*6kBvBOZE)Yxhbg&p)8Hv;K64SdJ!9c4qA3ZppukVIr;@Q|#u`o?R%(+wpN$9nG&85u57 zAhdW*lpwhBgt8<&Y{+u>BQ5U0Ce8Hm7B?YLR1(!c|GbfWT1ur1iDTr(9|YDPz=!D? zjG$2qASLe|R@Gz2Ge)WOKwJ$MnW|>uBwQ;Qa;WM@2Uo{-TxJuCf-+C1^m^(?5elsR zYCAorS_Uw~B3@AxcwZz8)@F;-XN0v`)i^ zLGtZVPw%kto|5g>f{5?7G zO2|4y)kLty6csy3(TW`AAEL?;u~>P+lP6--q1L@IGa zZSXB{%x@_c30!zpuhOJc=*Wb05OY3yD<~&Fg^W;pd=vEwi>{4^0;iBuYbbz3(fP$C zvv@+t9v5%_2lit&j@j5|VEg{ajbk>p8Q8uzeWnpB;xB_Jd6LC?Cu)zTo0`l><8TWh zZ5l6|o%F=3W@(w#=Ua9IiB|%2w3%(?S4Ln2=-)F+ukW*^lA9ga5<%rps; zFg-5bJ|Q_~tLy%%p;!5FVShog(dd_8NZvQ6XAD>1wX>66&s7gt}Hu zQhIe}$HUAxFEZQe#+xB-NuR}k4rT)Eg+>+(ks=vV@pkFmkG&7E#;Mf zzQ(Rrc6^={=vAeYWO1zLBO&elM7@Jo8Z|z0EP_bI6?DCqFLOaoxtxzB}^CLyXQd2}GvE zjtxFe>&T=gQYHppZYvUX6BR6I*3Gz1H%D5G&pqltKHw?@OVos2t;l7wDMBkeyXO30 zEmwoOgiqJkE&7-!q>}4=(q(gd0?GLjyUJz*kL=KGB3lxO7GP>ttYonj><)ci9>GC@ z2oQ!^Jc<99(qbq5qNt&jo-h4EOSMl$NI6Bro1d^q1Z~}-R+3oRQgxE`^(rPLkgm^5 z=us@!Jb}im;(gUG(VB#QI8rW&bJ4iKhJFg5o9YY>gPc&VTM5#fli*_{O z5-n~@>4q+zP?*QXf2rq4N4Sr0Z!@rcf8@sQY&@>`%h*qzWZ2j-Z&1%|TbKJ(hm(xr z)E_fm=9)k)a!jx?C+B>=q%U(X#WKQYQ08Ze4An#@yr|ZHd?eV!20OwcUQrZbl$^gt zfwzzD5)w9WDGjAx{Yj$4M7Q7^-Z@!@@SZQ&jjY-oEhsEJgc&w02HltBux zj7s|!_!@Ys3B59UBx=&}aBTQCuO2u( z)+>FAJ6y_tr@f-#U!{fwx$#cBT?L~mkU@)ba$LOo(a)_oJXdt4kyP4zY5CyEOC7B`^Eolv=yK6z9h`8Us1>|nbWeEN~3eW zNJpbMKKMO5{Sx0Ve^M-t4}Pa*}aJSHlJQse6u3dD1zxou(zz673vl4k+~4zkk4Xo47$ z^IICE44FJ>{UQq#^_r+@+3YZ^E(LB%Y|bZoM5C~}8-yg$1>y}rsHm#5eL&3Jne@p;~9=Q=ANa^P;zUD285 zaMx!x79s7HrGd^r^XwMwQ;X0s4V1}REchwR2)waRBhuV1pum=NPc%U#AD1fEN)oL4 zTG`PJvrA%6ZZ*AKA1gwwuHSLLlWtP4FvHz~A8vL_8iYb0LSnkwP(+rQD#?{ZQ3MtA z^ehS?!i)No^DVLME)QIprFpeA^{Y+nY;>!qqldMZogGg1b*-{e_)=D?<^_K#uN8m9 zr(Pk;=4F13dUDoS9*iZcq>jYLrbts7=cz;%9i`#1A%q@;Lb4=*3?K}+n2?cnrJoc< zb(+>MiApRKNMn~fbkC1yQS5rJ5`RjM9nXG}SWMJFka8Q+5)Zpry%O~()`KK6y;jT# zksWO?QET8KmBd~wgtW~S&Q@&}N$+%SYa+6S`dPNifLz{EqIO6+iSsB}RJJlu64l%y z9H~A^Y#A#q4Io$$gihs#V6ifA+Qd)~Qv;pTLk!Gn*Nb`-2+2~3By=6buq>&@hN~(y zOWm0|r5_O%m{mG_aMj8unolkbX_C>gT*5~w>lV@Q#-2J-#PNz$-p0@ls%vA#_2CKi z?lx|jSVnr8jj@7Mf$F2W!_KubQ0UZrl1qVDH97f|qSzBfLS9N~9*E9P5_qG|dWpR* zDP1Ewk6)(^#AByYZK4uBsdRX9_K$rGmH}w_{HCAQ^yoZd`}AqeYy$FG&-3ieS5CU_ zXH3t=hd_P2mPc#jL!f`i=Rq>fH@Rs8vZZyE6bmG^l7u-UXS2IJ{Hhgv9+xeB%@4Ry zQq}Z$MY5F;$VA|i#0I`5O5iKvdC8V$6}$5As_sq0(Jcv|(iy}LXvZZX?@jNB0UuQG-l2zv;)}yq)kXA7Opv7oYuT{U(2W|M7nTJn9H+ diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_8c2e50a4e3c6b6bcce52453520e5d377ddbe6cbdccdff3bb18a89ec8aee7fcec.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_8c2e50a4e3c6b6bcce52453520e5d377ddbe6cbdccdff3bb18a89ec8aee7fcec.json index b7f3e9d898565ebde76a5c0973b4adf6abf77a24..73ddbafda853dff3bdabe67a715aabd0f01ed159 100644 GIT binary patch literal 75452 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 MezpFPzrOqUcW4B+=Kufz literal 75128 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 WJK-0;!urB5KKs%7A%A`U@qYn^>#J)3 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_93bdcf7c3ac1449bec170265ec2d0f212d0c7bd0a93adca53f17ab079b6315f9.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_93bdcf7c3ac1449bec170265ec2d0f212d0c7bd0a93adca53f17ab079b6315f9.json new file mode 100644 index 0000000000000000000000000000000000000000..21a882da9564a2231e7b6d85b6bce98e11f7d3a9 GIT binary patch literal 75420 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_98569ec1918d08eb3547ba4c967535066f7babdbf0697172b281e941ef3a648a.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_98569ec1918d08eb3547ba4c967535066f7babdbf0697172b281e941ef3a648a.json deleted file mode 100644 index 33f16b8e2b2df58fd54aab773a6bff48f5d0e51e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65594 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 L`9uEo!~6dO79xjB literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_9a9ab8f7de794f5cbd193c0a79bb64d9a30d277e5438a64f924837c460481679.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_9a9ab8f7de794f5cbd193c0a79bb64d9a30d277e5438a64f924837c460481679.json deleted file mode 100644 index 60b1f041bf9eac7405427d47172f2207f8b4850b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69502 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 IKYsZ5f4Sm;H~;_u diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_9bbca1d0964fff817f0ae605922a2614e9ae55d61ff889a99923b50dacf52c35.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_9bbca1d0964fff817f0ae605922a2614e9ae55d61ff889a99923b50dacf52c35.json deleted file mode 100644 index 2af0811b022ce82a76dc74da0b27fec4bbbedd76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71429 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 Y!{M~;?knG7edU9DzgpkquOB}BFY7S$^#A|> literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_a955bc7d4f7d9e784d03f3bc335166a7918ca820c560724a79dea163f261bd7f.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_a955bc7d4f7d9e784d03f3bc335166a7918ca820c560724a79dea163f261bd7f.json new file mode 100644 index 0000000000000000000000000000000000000000..ecd88b55d0a371175cbf6941f399c4f68f5d1263 GIT binary patch literal 75004 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 Uec@BAFZ|$>Z>?YCj~_n#9qz(#`~Uy| literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_f775b2ae054095c7a37ae4ccc861d08723ac43c9d75dfae1ceead2d3b7c4977c.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_f775b2ae054095c7a37ae4ccc861d08723ac43c9d75dfae1ceead2d3b7c4977c.json new file mode 100644 index 0000000000000000000000000000000000000000..291c3a748cc585a97c27269990c151b27df28c08 GIT binary patch literal 63609 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__1dcc38056f4539944947f843fc5f119ce3058e09a215dcdfdd563c9aca6fc4d3/msg_GetContestedResourceVoteStateRequest_cf751de542a527e565d916c33542a952aa4f09be27ca526b34c4a2d6f7ec3f76.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__1dcc38056f4539944947f843fc5f119ce3058e09a215dcdfdd563c9aca6fc4d3/msg_GetContestedResourceVoteStateRequest_cf751de542a527e565d916c33542a952aa4f09be27ca526b34c4a2d6f7ec3f76.json index cc97903beb5fab6dd314efa7e3236a1d96d5c93a..464dbbe3d1ccaa055a2bf606ef0105618e358dc9 100644 GIT binary patch delta 18 ZcmeBCpQgG&m3gxUa}GbNp^<59EdVr!1s4DS delta 262 zcmY*U!3_d2413%F?0|IQ<44jaz3VW{z?%nR0p84k#DX|!ADrYUkz+gUdwpF#>+(G> zx6{)MS}Llc@8}y;1>Mm*CuI#rwS~lY7-2_wSX3yMwElZkob*1uDU3uiQ4G2>br{$w r9!G+dShQIsPj4`y=NlTl!VShj5?r;p_0$K?fzU8UXyMOlwCm#sv8goT diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__1df65b498b006bfa52a1c425f30183fdd50ed811f9cd65d2384e688409dfe252/msg_GetContestedResourceVoteStateRequest_b893574a2cd12595446c7084d714266c27c9b0d3c1c6b9dc022c7cf69fde2174.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__1df65b498b006bfa52a1c425f30183fdd50ed811f9cd65d2384e688409dfe252/msg_GetContestedResourceVoteStateRequest_b893574a2cd12595446c7084d714266c27c9b0d3c1c6b9dc022c7cf69fde2174.json index da2de8910beb8616c61058e7318aa0087970aa91..152be1365c1d0adbc1820e2198f1a704ec2f590c 100644 GIT binary patch delta 18 ZcmZ1{vO{Qt1pby delta 262 zcmY*U!3_d24EuBf#29`gZPIIpVGtgOjSvzarb9SsA0RnO|Y)h6^bRTzaAAQJ+?Q6kw_+rL06_O13Sg*NRSeX mzN_Zx14hhzLx(rG!8k~QtG>6M`rtVb8pa5%{8@{3xqSh8Sv9Nx diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__27af3929f22f30de9fa0b90a34194699c0d55b6accfc72374026d2d9bc0f9e01/msg_GetContestedResourceVoteStateRequest_c5783e3abe0971640509ed3b5e20092d1597a92997ac79de0ef89f4cde74aefc.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__27af3929f22f30de9fa0b90a34194699c0d55b6accfc72374026d2d9bc0f9e01/msg_GetContestedResourceVoteStateRequest_c5783e3abe0971640509ed3b5e20092d1597a92997ac79de0ef89f4cde74aefc.json index 8d738521a523f5bf618454e30f3392df4eac8653..11d8cd3b5408da65a3b80b5bfde9019e462f31c4 100644 GIT binary patch delta 18 ZcmeyP-ln!;D)Z(U%sKq5hDN5bwE#ti23P<9 delta 262 zcmY*Uu?+$-3@m;Cwt(geJF)Z0Fh2t|1)^gBB=$gJJqphL6d;{t>wI@k?#IvR^<3VM z<$SoAK}$t7jE=EFRWKZ5a8lOJsJ4)JhY|KK4~q)LlGb03ij(fso5DyW6UCqlQ+ES9 s#ru&UB^GT~$`uRyKi5;eDnJ0 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 QfAQWQ?Z3(Y{OPCv0rN-+YybcN literal 130535 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 diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 808b4f01189bc76a5960f835750320fe8eb70b21..d438f5cdd3c70a33082da0d6fb21c942f97f77c8 100644 GIT binary patch delta 2559 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 diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__4d228b5af660c840e140560916dee664696a82c2b75fda103a6490a0a0119fea/msg_GetContestedResourceVoteStateRequest_bd857f0f40a11ccbc620754f0b276da7bcf8bb6352f7f5f26cb8af584712e16a.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__4d228b5af660c840e140560916dee664696a82c2b75fda103a6490a0a0119fea/msg_GetContestedResourceVoteStateRequest_bd857f0f40a11ccbc620754f0b276da7bcf8bb6352f7f5f26cb8af584712e16a.json index 2f16ce90b6d80edd0ce0692d3454b9524173a0f6..6efc5d27aa0934b65319428e74f425fc1f903efb 100644 GIT binary patch delta 18 ZcmX@FbW>r2Jx@9A@XU6=P| zIUb&>klN4`zQI?B6u7~ilduLO(nDe!l+b^9Sfo%~(z^FZG1A-grZ5u8L^0^j)L~$! rcpM3`#G=otd3uEso^R-|22&`9lHjV(t))JA4upg;LMwmPqTL=p4SY2^ diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/msg_GetContestedResourceVoteStateRequest_f7848301c15560f971e007963a349e64e07602f543bda42d5a5d223f0e6102a9.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/msg_GetContestedResourceVoteStateRequest_f7848301c15560f971e007963a349e64e07602f543bda42d5a5d223f0e6102a9.json index 1dde44a113d642e1880586a6341741189a5b4b08..c532e48d646bb6d2372443537f9909df80352a24 100644 GIT binary patch literal 71294 zcmeI*%WhuBl?C7)`zZ*GIpEKWC1#d+qx%7ZKu{#6A%vz3nQ|vE^zK>fREa#49P@mq zTS5{L_(}0nRr|8mUVGR1CHt4}j*g!FeD(gPx9@JA{qE?OeA^$K+YK|K_uss@y#M;}{9^UZ$?58w=d1mvr>kYBXNUV` z=j&CguMa0HE2pRHgHO-yw_mP~I-Gug|BJ&al+)Ewhr??3`Rds9n#=V;tMxCQ-y1kv z{rvQNwc%_X#oE6Ys~v~S)lugw+b=FA0)PBu>e-ujuRr{7b#wdj_HRF4y}Wt#!&Okr zPk(sz_U75$s<$_9uKs%W+aF)O&yN4f+TY*2`OjB>y1M>+<hf9~ zy*TYpy7I9E9uD<3tClRr`t-ctCTVqG3&m>iF;h$OzeJ|!tjHRt@95QE_1nu&Y-@fW z!nxqQ_<3Q^H<@b*l*Jp>cDDL2x zwOyu8DAr(oW+J1^uSPz#Vr8eSX}F(cWc8~r7bmR&H_Y0;rF@k0OXqM|whV&XmIU%# ztUOw;tGvxDJz511x3p>>Rh9LY6ukg3z4{I2uMQv37mHYtEww^Xq)=l8b5$!!l7m^P zSI<3m4L@E9i1Eq_Hq|OTpNPwrVv!e;M5Acnn>Arzw|#y6Pl1yXhJNBwOtio$OX=R( zwK?k2m4Hjg5<(YKibiQm2sN>24n&RT7i-E=&JS=TPzqdJ5)mjXk|hb8&hOy~L0Vpc z6K;(4q~Z07P)Jr$^P5tPq7|)Ml3RqkSYWA^=h7mZUhj9^C9!mUE>Ki}KIaq>1tnCW zf=YUQ5-uU7tjaFIy`aY{3MA_A&4|xDH9>&&^OYD4gf;nx|CeemOKQbC^9YR`O-L=*qG2sNlc6^74*$l zxq77?kea@WAq`ZiII7bbFNH9;C!@=>BJ}H)9kX`?fk+$rp`@1{U(-Yak4t7E>LGBb zEY~G1BCS)=0VR2*lFrY1sfcnlbw{ko`9WF6+PWktXqFm9ScK)!U4(T;L5#v&5|Poi zThB4xuE(jSTZ9<(iW*!*QXs285j{!ljCzL^x+&m@Qm@jyq_hi!R7A1Jdfd`m7Z@dyPR*@E`;KxL z^<;7w<=T)9hXt>;1HHkGEjY{+YlNGovMe@M2Wv`H&L`k-z$iD;(WDnd3@PNA$QF{& zgsiA(V$(I$L=q+RV&LY{GOs3+oBM!I!4O+EN&l{((9HT!(mE8 zNHrYWj<`nM_1eD@f{?HwL~wRk5jcv4XimKfZxxGd5k1%R?ja#EswM=!CRQ(HQ8sBY zBTKra*a@k4z0j##lJ&DFRHKqu#UhT;jVW_iUc!*ZqP;RE@cF=)A-5}G*T*Z-kOray z-ZGpMC^aEeX&}j!Z=vdF?4gzv)JWHMM83g#a>f=XKdSuLTa~NZ{SSGFKSTqSm+fwc zFkf-80;;7Etrit+nM>2`de!zQk8pU0iPkvINW+R^&9P$%v}6Rn1|F5B^nQb0lMtkc zsuDYRP6I{~D>F>#kv>i)0)(0fX{q|09%Tq#H@ZbhxPw%JcoQp(>f$`)7dU33#H+Ez zNHQij0lij`irs>f+xC`MwMmvVQ7I@TRk9?Y566h@af!sUiN*HUEdqBIQ=;ns;uRrC zF7)Ox`diAtx#P=(y0X`kWn3*-}-53Q*KcTS`J#O*vJO`C{fwcUDBAc z*fcGP3KrXeSV*{ief?ML(!M3+nuu4jrR$}Rx;}8r^NMcCdL@;Ryz~&@;tcirhLD%K z6gVhRVXRCbbqPs3Nl0E{f2j%4%&rfkG`FFXfZoLcUBx+FhH|w~oeNOX6@SR3rg!mb zdx3OIs3{UUWOK3}-ddC7k18-q$Al=rG$Hs_#Lz^n z@RnGSHdLbKqAGA}AT^O@D&^cQiJdAm>mvfvwQD78)Gb-B18RH|!Q9bYTC;+C)0=e3 z3|Rz|F|@+D3KfMadk`cs$!s7D(X47UbylIez(*N{Sh(8t*kUI4h)A-S_|wG+K`23# zF20ga^MooTo=BL5Dda(|Qz4rCAxdMjt_j!q1|sR2R)na{@S?*oJ`GR^cf1DHC5a+| zH&;7m8%^(see=*&mn2a|Feap0N9+clB&z4fD{0eh5RzB|uFm)yh30>%TgOq#&q8lP zxf+fYq1@}pCs9lwC{ZDXaIY@OQYQl`AB(k`7hj~KGL2mbgE*cqE*L|C8>zftyszuK1oy7W9&^A!M#H* z<@^bU<~Al|q-os|Z9${mQgn!5K^H_uT~ld{QZj*xODY|SUDZP#dNgoJRQ(ToNtSgS zLVsGVm?HB()lEGmR|Cq=LT?Ho=W9h2W#L{mO`<3(0t6*$$CM(?IwD}5RMx9jZ1;qi zP)y^tc-}4JwON6O6%q<1!!$wojwmR0S{zE}Z6=xoGP2V8)Qh-Of3zy&l8k%-qQePA z;rFZo_x7TwSBV|RfIYdA?$hoWDW+UyF(Do-+$A%S?wL{&HE77XWe2H*>Lsnx1AAOe zNP{bB5$?%zVN|#1)5vIo1X7--`b3;(Y2aYiSY%7PjDViST1_n_r26(!V&E3Rq3W*l zPgmg0;#S@+YzGhrC_<9*ka!ytvVMZDjbn*@d*H3s5&QP^;x%NN5KS1dZ;zrONTPcF zBDr89aLWv){!|7rMKl_vi&?*Tx&m+fe;R5(3J}zVb3QeC5gDai+m?*JqtNgXvdUG*2oyimoZQgRACPgr0trYa6=}LUVP+sKTtM^CEij< zxvH1wKqizMtX3&#`_sUKofc_g!I`=AKpD^ILXI_KN~+C0i0ECqCRmKOyHxuAEvB6U zjdW5e;L;1jNzj(gMWxrCl9yO1!?RvUvcpPe6`^j6bU3!Tn#Ov&oA{ufToEEoYzj(M z8sA}wOEwLLB=~^0=@lg$2wF|a`7^QFm@u)8IwYYf{n|6S$lV{`jLoP+AgN1mN z6fxZT2twOU#wr4CiJB5sHAwZz7*o=!SKc>kMVeZp&`BvKP;<%4ghDAZi+By7d%>&3%Lsn?e7*!uhvAM6I4)nb$+(HUa!6fky zc0!LfBh=)or6jhCQOCx5gFEz)38Zw5R}yBfp#$LyeliNYBzR}PUaU*APKCMr|N=loYC94o})}tiW zN&*+)remT%BanQCSoGo$ILM_PeLpT?`)lAt!mQ6rcvU!d2zA1jbj8YiZ6BdWEU4{e zBk^Q3T#2O_PWa0CppT9rb2jbX_MFMyT@o-2e&{9V`9g9~|6s4<3XuaC??8VYWA?(n!&0He4^*TdHJuN;vJ-&NAW#cXt z`Qj-XPuW;!VEy$IH`dvpA(O>l`a5~jK~zV$te4K-^YMDyk&-&K-zEydcuC9dxG0Xr zgiV;a4$C;*^D$S$C7l@iScXRBAd*B$uF4Y{-E)1Gf!s)&*-wBVPfEO}zb3S~?!r}i zv@!$-u61$^pXEcu%hPo+QR0OmoAWbWqT1OZm{iN86+0f$?C3!|9?^t&6i9$3(ZDDQ zG(Iz|Zi`DbfsbUTSCXi1(aUv42xWLQRt6{PRx@fDgt{d zTO|CN5IEx1o-P@lP$246&W~dx&Peq^t?ecfFS%5>rGLer0wLJVEvh_8lrXA^!u60< zP0^y9+s_{<>Sy6nLslSmIJO|Z-LZephrLrkuv)iAJrJa>RQS@xs0H9qF&QEzMj+b* zSGXq-SgP$8RD&8a)m;P-#}CrvLV!hApk2um1vxgc6Cg?tRsM{%LXQT%V`8COnAT}r zN+ZU=3nFZ6^aGxy2OycOTW-b;UI=21fnYzQGrVcl+^&8ERo=7 z6iZ#0iC`g#8iA9EZb^ET=h=ekZKD)fW0!KixYWQ?t>{u^jjAaVh2*x?w-g}s)-Z&4 zt8->}P9fy(N$P=hMENhuNQ|;ViIj2>0UTZ#YKwXh5KUBwA>62Aflo9iSks(YwUN1W zR0KznB9gglhir1?N~IGJr3cC8 z4&~1lD%GqHokXd+SOlaY2Ww>PAmMff)igFbVm)P4`$(oYST zQpC)fNbJfqs`^|9Wc`Smqmbb$LRyz3u~i{4(I`Z&v%W8KDN&Hh;cVP2Z7k~LpVc>H z0lN7aQEwh&Y686qx0&9N9SsEUq%At7M@%RK)7OL{Grh8Rn&;oEAu${b$c#FDBw&Rw`MiLm;Z!N1C3sqv$ zMeDT&acCNeCB(CZ;lQ%(L?G>b0wD#cU9Kin-xf`v+*U)Rk#@1pHSuakyTSWMy}~U! z^sRx&Eq|s<94maHx`QWFJh}gUEgl7MoPeR@Gc}aR(vyv++jbb-m+6DB6q;F`9 zf|5iP@laQqV52YxsutwTVg^2X%r$;LlCxW z)C^p5RTIm@hV54NGy4Wv>qSp)c+mC!|8uO3|R^aQf@szq9MfY zmP8@t(=9tXCAOt$#Vbg|Pj8{pZe9OBcfNo8R~innblSh^aGD0TdYh<0#_!*(&%1MatZAI*G#RtwR=Jwi=PL?AP*i0?jCXCLeXxv+m* zA(}`?Cit>1t5(&jwa#(6^V2sE9z6W<=FJZ;U*A6b%Y&ctWxsKL_j$hh_Vw-CH_yL) z`|Rb5eEYB4k}kV=bbfaC#p(R=@Wu7h`!Ake-+z93a&`FP{NnJ%lf(Xti^H;uN2mK` zm&a9y&rj!vTP`k+2VXq8-+p~K>U8n={s*T6l#9brr_*8g<>A=ln(O01hxJdN++XnM z@coO+!-hvk6vz0U9(J6r4@X@d?tXf;Gw`<$S3P|3`rCKk-Q2!?_V!=j-#oj0{@qPj z%Xhzf{_^(W-Kv+jFK+(#?x){Bf0G^mnYI6Z`{F;I|NZ9Grz?Ma{_5S$4epFxd3N=*>ptFe+^gC6aL2jVSKD`T>K0{lkw|-2(v)>we%|;S z!v2%bL=^MCN>Gm*)MvvPIZDPq+;w>m?dp7De{wN$GxEKKUWixs=Ojgq>FO*8UR|7p z!p1j}wtXi*>Nht5d_Lk+qb&;+O>W;K@0Uqh1DKImBKquATk?O-OxZbzHSq4_)gSfC z>kn#cem|yj<9UlSx!Cr8D2{_rP8n~0HN0Z)CB=AqRN~=^)=Db(v-w z`D~v&U|9oR>{8vmC0j7CwrDJnl8Avd$rP9rR8P)&+(M{JdOoN+2ycjsQ=tw^gxEqM zizm?Hks`9q1kXasmM`o%1(I7Nv8}t9Avzn2Hcp78+Pc$pZCHrM>QJyZ!)tw6YifJu z04y2XG{Xx(vPDQ4>6%Bet5M9Vl^znweG2reJm!L>t|r@rP*fkO7(H6uQ+zqA0<#&^{`19jJnW6crKX!>g}NYFf7? zW#P#eNhuICH_fo-s#CP&w&$myG`Bb}<(9g-<|=fE;7hvBuDL>^68~W{+;nR?4;SKB zO7{?X8Jw=ZvLM6_5t436u@-zPLRwf4_wvy#)wZx)Pu@l;U~TP14H2FGBIQ%mINjA? zB~g6-=J_P=qDWLED)I21ud~4d5%C$}u62>X)HjH`aRuh8ok+G+A=)EGSDiOZ@7jZO zsP0@L^!5Az*J&`$?^^)HmRJQ6EabNlEu)a?ZamZ4C=uRb79e+v1Qr&wx(&5D`EUd3 zN8|&;`PB**o}iOhkyDxxRm6~!dEnZ^lp4;K;dznlK!lNsmK1{PTdnA{T`yg-SD-?= z1x2!Nq1R)9o@GNQMd$O-X5bw?qiPUG1~gz6BT6W%=-5-sIlRVU4K zK7pK*U=*0PIP7~vtg(=iu^4kWwVtjI3TeCDl1ib(W=o7hdT6th=K_MC`ogG+MWSl1 zu!;*@(woK1V7d=okp?FyidwR?!d>DQ?%JbC8)3mGhsr|}OY4(ZvDQ7YI>q6vsJU&H z0)*(0EbZr$VspOOY_Gs9b&D&C>u9=@uJ}eE3u}dp{i|E_mpB=WRUYw78h$n)x}^q1 z9+jvNNX{olDq01Op40OQ^>`vsT}33)VhFXCMh@>ojXn;9JA!~+dl=6Av|I?vLgXZ< zwRv^DXlZv3MG@fARm+-0RokcYV*+%3SdjCFFw|;@=w2bhSXe(V>>O^3N86h2q&|4 zSaJmwLUKix)$~fE8FXmj_X^JyZE0yFSBRxsMDq*JJ{*-yQ%#W$V5$%-jVeT%X02Wz zmjY@Hp%`aEU0;fmRT9$hTWKyUQQ<4B5JzU)qMIHtx;SlGI&~A9M2S51auc^1fthIW z>Aq3ne7*yjPp@)443pk3VY4U%;jR^g#H|#?+AZQa^(bld75S)+dAegbl-sPQkmBK5 zszEItxKqo#f!bv%y+b)AOR<&1q%xA3sONBYG73ISuEH~Vw!>g8KkQqt1jX_ zWg_bb5W=1UAzk%~kS=s|OBj^&b_uXi`m)$y*Gp6dg1nFPl614!P;89Q6^$ypl=onl zvhDd|3wu<=U{Guy^XAiA;?Kf6nSakuq7+58$SAU-KnCj%WOOlViK@mfAr(co5Eq-v z5hGPduF&a4n*t6Mq}V1(h#;^Fa<$;+2W+f@G8;W3vsu3|0g|w@n5?q=#`e7sOcmo6 z5o$9$%4eR$L5etk8?iyzG+PR(lor=r`6R1LPVP3Ly_05z9^eg2BlEs5&+0Zwft zbW372o~+jtS^TMPc^Jvzc77<(Q8rg#MKr6Ty?UCkTvdb!N>osb_8Jm-rgRFWVBn>c zYUgSX5(o_`DaDbjyQDl9){nr6Tr4LD#vk<(>a<-dbBw1A7gJ>Mr@HBBCALQS2?a@! zK*;%85oKAlS5FfZRmGqAv98I%!kI68%e*LI4_hMdmhmxdT;mop3KheCh0KII3c^l{ zw=9u&C8SQm*(kYfIZLhe3IRe-`hD6ZyN-P&c!{T3+DvagOI@F+6DJ%6F1M5mboD;~NP(+O zrH-V)o2xKLo|6_p>+$?OB%&jwA*hM#JsuHZw}c29z~Y$#Ay@PkA);GU=lF-Y-R@B&PjfDmIjVA)>I0e2id&k+(rlKf@ACZWS z3?0%ft-kRw-|2>vNML>L5E~gG5fECuCrTLHbwXJZ9Tu`2{)HBIV3TJ0NZNqPj~(DC>Lv0v!>RC}gKY(p6FALkwi!LV<~MQfcpyHU8)v zC;zq#s=mlWs;`GjmbfT19<9^pVTgRbxhy<;Znw}=MiNCuRC#M@XN$Z8X`-;S3n9Ct z=n4eKiEhaU`E$}MrPT9NN|Iq-pX!$Lhi(l;P>bjE3M{B@!O6B;a1JrlkzeL{$!+OQ zKN4r#QAiit(<}a*E%P=)&fk-RS0L*U)hog^rl{OWigxZKQHFZcMsArWf>>*cHn*8S zzrk#|g)Mm~MhK-_Ju^VWa44i^2|LBe5-G3-D5y(cY*rP!;F)1iJuMm2ErLC$iNVsL zZ(6VmmySfGb50nPabnzJHWDCmMMWhjS{>fPb|CY^@K%FVAPp?oMOTd~yTq?zJ67hK zg<9F-gFsPa3;H1?ic-{gbnZ%)Qm{nCpj%Myfr&!6I>?{V4XPrUqk^~VX<`}9iH6X` zE=*r?ORosycuNgI%&@u2MMUC|uIR8j-{8Pl6{#Th7SsX|+OqHv7pD^5n=5VQo2Ao0 zQaW$|s2a0HNty0|4Jj@vV^y{^SLCAF&JvGUP$3B2MJ=UN$kQn;WtrJX;Ye}E12mlE zM|*LB5X-W-6yUtwV76Vv#X?=1_L5jBpK>Q!ZTU-L;}y0(R*70_IZ$~H6BE=WIz=tO zyG0d?bu`YmI>P2v$Z=P3r#&h$oWURgX?i0?xusaLOPW_bfvPE@5-B#GTtVse>M#f> za>83}C~G(bwzE(^wb|iQXDLoRstRG*B#pt0a;Erel@kA`WxHa{m#~~0Sm>5#=WfCA zPiLWCfwM}tV80u;%+EG^RAk7pVyO%Bu@FbWEcEwSlVmkMU=W5|iu_aa?R-?2S{_5`Ggh|%dG;5gpBU% z;^Y7Q*Vk-(&BieU$IriN<7+mK8907!{wyuN<}dx7BI%T zboVVHU8^Q3y+mIBpEtCC#TN@ZUU{*QErHyBP6t-*@cnSNc)RCn3UFyjWdwmYS7JMR zdP%g}$c9ePM$|tSa;3R#Vu`*0$M!eqpj*0_%6y~4swt&G&JgFM^$96D$J`p~g^)rw zB{q-=0>0+T;cZD$s@;(P0pp$nCPQs;6Q1puE3hP3LqMW~Hc)Fmpn)Y0Yjr0mCs8omMHuRAvMC!C&e~GM~ zllXPO*57Sy9z_bQfylVh!}a+E4QFA7pYL}ge$rmHL`dY!Y|BzR^`*^f=27okl!%~~ zz-q9xe!+ zS?U%kheAdo+OlcoYY`NDG7Cq-D`YCEMY7akMC%vNfR)-E4+2Y-wfR_$^P2m=81vqLPf!E?>%dSIl zh9uT3k?KO9GQt9#AEI-GY$;xiDq7Mj0)&WL7^S4HTRt&!b&tr83~HgY!-W9JVhf4l zUubzTOw`6u;QR}Ou2)+Q>P_eKxAY42jVN3vgtU99i=xODZ7~s*43o7@#h&v8`-)A) zb~LI0(e$Qf<(4eAf?e?EppcrXLTG&;5abX+Hj>5YoYgr&2xL+CLLF7H;>^7wiKXdL zv|59bc)Ff~*;osTdCx3lw2rV$TH1*d`4vLsM{-&~q4L8as)-GKr z^5;qZobsn%=kxRHv+Jw;b$NE(pNvl*Wr}{EQjrI-kSqz1LBxEbx;|Hk?>1NYkfI3Dwth=gVk02M66=-U zGuN~Tdw>WX6i?-`@Zu*#V4?%##hYQfUUoJYZu6K*1;M3p|IBc)1-t!RLJJUwwM_gc5>F{K= z9xfHp^%T;uCb}Y8!dEGkpIc3zca?E`M5=C+XTqpPP+m{PW5~WDfv`SPCj+8K^trZ4X&qKWQR-vUesAH*c*~Gi>{A{eEB*p5XVlX z+C&8oxpZ`L{`y`*iwggLMOacr1SOmFBc$f7%cI9!x<$j-kvEh{85nc4(ceqGzJN%BQAd}7C ajN^3CPWTJI!uo|DeDtmTi~RMs_x}eh{zwo2 diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 808b4f01189bc76a5960f835750320fe8eb70b21..d438f5cdd3c70a33082da0d6fb21c942f97f77c8 100644 GIT binary patch delta 2559 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 diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__863d867345b51a45ba4ec8326f42701a86224b53737b607521f5711340b8ecea/msg_GetContestedResourceVoteStateRequest_b9a737558f8e65f57294ca0f43cb3f1bccd65e01bb860f7648ce860ce03df202.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__863d867345b51a45ba4ec8326f42701a86224b53737b607521f5711340b8ecea/msg_GetContestedResourceVoteStateRequest_b9a737558f8e65f57294ca0f43cb3f1bccd65e01bb860f7648ce860ce03df202.json index dd707956b4feb03d16e9c21d650ec8332c04dba4..c35357194279d9297a76d32e3cdfee20915ff554 100644 GIT binary patch delta 18 ZcmX@8ep+=y6!Yd-<{W-jLnG7JS^z*)1?vC+ delta 262 zcmY*U!3_d2413%FOo90Lk+ey#o#Z4WX5h^Ou@Vv!@MbBTTpu7gO61s1`#HW(&-3!y zmh0hR1}zoUFgnHxRl#tK!AV&=quN5^9Y)x{JS-{{OIm+DDo(mjZwe!kOcaA|Ox+Fa s6z@lZlvuP`B~Py~V&oedyuuB}K@wcGx%Jcs&w9NTH{$It2YT;7l6 ze7KoGOGPz|jwvc#-5%w<+iweb()?bf`lkU@-!bl_&#h?pQcLO`c r`;j0e7Hw9^(<_V^`Gy9saD#D>1XpctJ@vtJAT*2-TKKaXZM%K}0oyh) diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__90ed25475456fdfd4f2fd676ed5b5f2e9c390cae806202a046fc93153eea6e00/msg_GetContestedResourceVoteStateRequest_6192aa18cf199acc9ca27cbe0377de9b6df87c4df053f3032a3fac93ca2985c2.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__90ed25475456fdfd4f2fd676ed5b5f2e9c390cae806202a046fc93153eea6e00/msg_GetContestedResourceVoteStateRequest_6192aa18cf199acc9ca27cbe0377de9b6df87c4df053f3032a3fac93ca2985c2.json index 8e7ba32ccdab4f7f93cafb065b1b7a62e7529a3d..9d2ab850f1fde9beffd6a12fb8fed7180a7d5044 100644 GIT binary patch delta 18 Zcmca)a7S;0A1&sgz delta 262 zcmY*U!3_d24Ex*$Oo3#bk~ZnJ!`vV|5Gx_E32%nMN&5iFQ6k57+Ry%$r*5x(yIvk< z&{9ziqhlOU6%5B1oRl>g)fN)(Fv9-jVNs!2()#OBangNxQy7V4q8M~z>NK!ZJdXq^ nv1qGGo<3m2$Tu{2g&T~6B)Dp8>!}Z(1EFDz(88b9Xy^S4E3q|L diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__a39a5f7014a616de3d7002bb4f18772c5b5d3526cb2b3c33566bd64512882669/msg_GetContestedResourceVoteStateRequest_aaaa80ce4fdfc75252132a85e6c12bea6a47c9f7bf30133713b6b5cfec3a4d57.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__a39a5f7014a616de3d7002bb4f18772c5b5d3526cb2b3c33566bd64512882669/msg_GetContestedResourceVoteStateRequest_aaaa80ce4fdfc75252132a85e6c12bea6a47c9f7bf30133713b6b5cfec3a4d57.json index 300e476a45efe82d06c6fbbc30d2a237fcb3ba55..c0abf2658ffc973dffe5f477731a148e5ebbb1ea 100644 GIT binary patch literal 154055 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 PAH4Ui{fqqZr=R~1ms`b@ diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__a39a5f7014a616de3d7002bb4f18772c5b5d3526cb2b3c33566bd64512882669/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__a39a5f7014a616de3d7002bb4f18772c5b5d3526cb2b3c33566bd64512882669/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 808b4f01189bc76a5960f835750320fe8eb70b21..d438f5cdd3c70a33082da0d6fb21c942f97f77c8 100644 GIT binary patch delta 2559 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 diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__a39a5f7014a616de3d7002bb4f18772c5b5d3526cb2b3c33566bd64512882669/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__a39a5f7014a616de3d7002bb4f18772c5b5d3526cb2b3c33566bd64512882669/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__a39a5f7014a616de3d7002bb4f18772c5b5d3526cb2b3c33566bd64512882669/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__a39a5f7014a616de3d7002bb4f18772c5b5d3526cb2b3c33566bd64512882669/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__a39a5f7014a616de3d7002bb4f18772c5b5d3526cb2b3c33566bd64512882669/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__a39a5f7014a616de3d7002bb4f18772c5b5d3526cb2b3c33566bd64512882669/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__aabb30e955771841251280c0e6a98257882c3b2ee0b73b4aca838fb78918256b/msg_GetContestedResourceVoteStateRequest_9a43882825cbf3a83a2f623d03ae412662a6acb2d928d56de7a6a67dbf70f80a.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__aabb30e955771841251280c0e6a98257882c3b2ee0b73b4aca838fb78918256b/msg_GetContestedResourceVoteStateRequest_9a43882825cbf3a83a2f623d03ae412662a6acb2d928d56de7a6a67dbf70f80a.json index 9437bd31328f26cbe8453288abe3c44fd61adcc1..61011c88bf3386dea0f99601632959d581e5c4af 100644 GIT binary patch delta 18 ZcmbPdw8CJ6Im>1%mN&wzhDN5bwE#XE1^WO1 delta 262 zcmY*U%MC&?47X|ZMTKHX>#s+}NssMKVI-1?V$hAL%fL?YIufMB mqU|bqy2FT>Z)oreHy8&=aMkwKQy)ABLcEG& diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__c71b4f8d63f8a1357936129a226f99e349e7b21b166609cf59062e27ed68a1ee/msg_GetContestedResourceVoteStateRequest_23a531bedb32082b8e3bb799790dbc80a6caf537196a9513dae8967f325ab485.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__c71b4f8d63f8a1357936129a226f99e349e7b21b166609cf59062e27ed68a1ee/msg_GetContestedResourceVoteStateRequest_23a531bedb32082b8e3bb799790dbc80a6caf537196a9513dae8967f325ab485.json index 81cdce36dd65c782fee86f13f15d5c3c8f192c39..34b4c2d8a9f709c25f001e2e95fdc06f01a800a3 100644 GIT binary patch literal 137745 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 literal 141285 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%0DJQNcRB&3q=Fv=Dh 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 diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__c71b4f8d63f8a1357936129a226f99e349e7b21b166609cf59062e27ed68a1ee/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__c71b4f8d63f8a1357936129a226f99e349e7b21b166609cf59062e27ed68a1ee/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__c71b4f8d63f8a1357936129a226f99e349e7b21b166609cf59062e27ed68a1ee/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__c71b4f8d63f8a1357936129a226f99e349e7b21b166609cf59062e27ed68a1ee/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__c71b4f8d63f8a1357936129a226f99e349e7b21b166609cf59062e27ed68a1ee/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__c71b4f8d63f8a1357936129a226f99e349e7b21b166609cf59062e27ed68a1ee/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__cf2a2febe0a535f130d2eaaaba3f002c094511cae2fd57dfaa6e5ee607cd72b6/msg_GetContestedResourceVoteStateRequest_b620c564a9caf806d2a4053efc7a8707f36bc1837a661ca9a4a3aae3ab30da7a.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__cf2a2febe0a535f130d2eaaaba3f002c094511cae2fd57dfaa6e5ee607cd72b6/msg_GetContestedResourceVoteStateRequest_b620c564a9caf806d2a4053efc7a8707f36bc1837a661ca9a4a3aae3ab30da7a.json index f3c4ba759c0431717d7ab2d375012f0b33d054c1..bcffae1ab768fa62179ab3a0b6e2990bae8ebdbf 100644 GIT binary patch delta 18 Zcmdn0ykBvHH_K)}mV6#oLnG7JS^zxz1+M@A delta 262 zcmY*UF%AMT3|nsG6NuGA(k8w32Pg3cKEcL-_!1Ig=4&{)4j?&7)~MrEfv);I>riB!ElVhNm)Ci+Ct(TM%ceREGiUBT7Nw%PP$KT3L}wB6oYO|-3{y% r??-}^ShQIsPp>dynV)>9C=<^|7?lsLZI`^D}97zRO0^nx%=8Wg2n!_d2LL|1F3DT!qL zYCQxk_lF~yf2z7NBO)WS`i%Db`xp1_efh)lH{ZQ@{p!o#-TQlf+dp`4^XvTXo7b=2 zzIpb|+ovzS%^&}MThe7$4Dxg2&sIz0Bc=KA=c z!}=#*-yZPr@aI>L4jUdGvpB~0`j=-fUVVA9>cy*Xpa1X8-~RR4o9y_{to`>_-~Pw5KR$o?^OZk5 zd-?tI@8046Rtfj+T@HlbyLU(_fA!#i?Y(=)O!AkP1Jhmm=tfaD8QnW*?&l}HbL{1E zz_kxMu>H%Uezy3ifL}y;RM+<4+bDm5|C{IEegATxAGmHL^X0RbFJJ%9(-*J4dHMaf z&!4`0{mq}BfBW>=tNioF@7{)+7q9;N=?|~pK7aZ)EB}_QZ{K|X{D!YAdGq$^vld~P zdhw?h&)?)(e|nvDqiDCn9jk7ayu()lKd9*ZT@f4q?{miGR%t(JA(s4eo_~^64Z5<~ zH~sk2mU#I0uioY_Uw!}b<;@@d_08)aY7RF$e$2ifzxeTsfBWL^U;fvhzx>_rFEP&) z#>1=a^XUF1b>6bNT>9(B`E~xe^!Hix=>Fp;UH9&$=-9DnvdVD`&J>LE>-Q_mh@sQ)cAKkxBTwA*1xz~@k zKgm$?0w<8KK2-+UyZn0sP*{ILK2XgC9-ApX-?k8V@TBR;-ASPX0i z-dpHR@$v0*0#RdneE;#KK;_r{1hGJu&lc$8tNuw>ehk3NrO{^9hGI_NBkykmS_7Do zSP%TzQ5*QbWTxyK#G0UQt_#XQQXk6*LIb3G<59-TBPLVA=g|bMY<`l%Lr>ICSc1olA+H=?R6P1vdsH|X9t)lataoJKX z@l=RxoSZQ7laO*m3!G3&_s*{AtSeU{E-6b2T}%*-(v}o@#O67W zH9o&w6H0l0h$Dki;u4aWKvfZxByoCvAD$GX<&`+m##m1t-l&L$po*SfNHL36v~CHu zNO!rwQmxLVMHXJ~ciknqbbT&RRDeF`lo2H*QlWwhygmt6kWyAvm+)TF6BQ*Acqyb& zR>a_fA0`Xxl>t`9&gyWX*iq{9U2N0^aXnJt8dok*9*qinM@73ppSoxiB?@U4BJw64 ztfWJg?%0$R_`XHVtvb&Ua>^&Loy4Q3jNHu@w%oZxskG45cRGZT!j&=+K@NW-f9L=p z0&Ymbinin>7-f-ZL7y*;qrm0}os{H=fl^7IzREQ!?SRzu-3)1i9cfIznq#z<}3Nf68Q-qFk zA)eEyqFd!6Tg1;5-W3s|qI!hTS77y07H5+dGf>hkqSo0lC0m0LOm+LDi;Zi zZcLfG@)3nJ7wwff0^bje8FJnUyFO8ghcpo#@V4QcNa+zGl_nCbd<#`abC0y7paxv? zjC_Li6pSqnKI;6~TUD#`@kczQACiIE%Y4`o%pERPLbWvF)#9Qpb7`7guihT#5e+XK z(Hh4YX`G^5bM9CIEg7M&iN~c0-cQhLl7bXbU1CA!G++c+nPDoA^l>^OMCcI_Emfb( zqYA<6Mz^R47epnD7g$kL7w09v(6Iw0QH?Dok}uiT}5OUgYWQOTCB zmpbbD&@JyPx+UvXR3h@qLx@W-)a#oMKxa_-4ZE^jdV+-C|gQ8`7L&t0wusUg-Bge z7(kJ;jhfBIc{+;Hl5{PwFs?PYAvT{#v!=vVQK64|SyC1S?sQK#8cLQHN7$0gIfb|66lp^hYA&imwM27{u@t#wt=2sjM(aW|G-J6r!kVHFZ{@ zy1-W%rC7Au_1I!|?U9gVG3lp^lY&TsBwc<5Pm6>qC6P#)r77Y;uTvx1^+S@zX5Ay) z=bMPYwVxtFEy9}*!}v5vA>Q#C*pMWPBwnl*W*dcfCqVW2 ziAvgZ8-xH$#5EZIqR`?`b?Z1v_-yhfmh0hI5vsk8e3HdZ1OXLci1r$iOg`EviYf^e zYqOqDZDj~UQf53U9&f(d=7!Z1%lj5I$&{N_oSIm;){t@pm5-Dsm;a_c>LcyBBBwe= zDq4LkC`m<(ZpBuX^vRmC9&;~TME8PQ%JX+R6x$pjBTeg$bQ@svkwhvg$)eAX?MoKL z3afj*lr)kCLv2gjkW}bO5B0Xv+L5RVQKm$x(5grrphui{y7{Y6iVhhp>B7jUYbuRV zN@h?ANv$Kft9!^xk0vfaHU6lVY+1)4jHlI#5Lx`GZt5wy8W294yeWk|Un`<4i}vbi zl0{V!A_%C3DMgxfOu#y+tXHp?kA##^P7}67-Yw%Z?ZD#{G71&LegyG5vY^~)aU`9u znP?Ko$V%%|FA`GY(W*>HGV+Cp4kwg_-?IkY^F`69k~@w8D_BYQY4?m36INMFjE4&k z$&N_(Oeu*QG-chgAS#i1MXU0_9@itJ!BwTdAo6?od*s@qNNK;j@pL{c4+ZgYgJ-$~cTvE@FW zc&l~fJ`XQmL-r%Y6GraySu_O!s?Xmn7mf(sGJ|P6wLyf4Mx%5w>lf!0c=G>GL+wW) zg1T^?PmNwoMkUv_C8O^swElbAUbKOxp6WCFS`^fv&pU62B6?HL$FgT)KFhL&zoCG3Amq5F`6C1uBDT z>>+}@UGa%FWCH2MM{f6nWusW~t%OvodWjBYBDtYzwSu-kO+4IbktP?MnJW*p@r*7M zSP@fEP4^&@cjcO7G2iY|>-$YiJ0%+Bq*lPC7lo6dZJmosuRSFnIi(8EdJ)OODV#P$K|NRzBLy}Er7n%%up}g#1|t%D!CQF62?v8#Q}X;BSZz!QY_pC? zXwqH-mZ~FJP)OMITHpbeLQ26#=kjKt*y=52^EVRJ&p!C9pI`0uEl0B-s>DqbtUCjfiQe#$R&>Ynye*?pY zztgxYC7@Y-3bH1iHEjyy}Ya6 z>y#+i24EVS_uPq#5bcS~H$-~)UOpteOj8tpgcpTOo5mgz64za1m}JQ070BWCON>R%x!-w^hf$+Qn_ftqt$ptS{K?O- z7{X46c*4#IwXm2uI!_X}8p-pe3|CqhcD;%uQpB0Lm5U566#LHmbR$R>MGP&ar;wL! zO~1HJ2iC=U$^wtm@sNc!cpYUw&sPw`a;1F`%N@wYa4HF3Px7ugW4>K4+Fm&#jgJP% z)PfjPfz5pleW2e};TCd$8YY>4xD$D_8KEcFEd|&vMjspNjqb=pCXmWCQAzIY6bsdg z16!lYL0EuemrBbJ-dY$1)c2#Tb_JAX`Qy6&P?dbKhP2d;H;4d2U$gqOGLazup}g-qkKheWlrV3<_PYNbm?CzOarmFFigGG~0ZJ5Apm05)st|3?Isg0tQU5JkYRXE)LSP%?^MQSyFMF%=V5JBP9qnS` zHXKaqPP$&@k@eJKaA?^TC`UAFS+8=c`voYpg7zb-aY^B>iLSP>4JivH+B-$3M+vNp z!<`UOd1zLNi>adJ!ZtcMS?*cU|swTZE zE^wD4=Hn;r;Vq*rjQUF|n&LrlDp4UTi<<(4w0S;n$q{7x((jrzJ$#rR0;Mgr*hWsG z)twF*a+13??w&Gs%@>inSrVtZhzKcbmD2(dDLo2l6BW^27V<#@&lYgM%@AndTp5Q_ ztx`>Gz9f${UonIRlMi`9o=@u&k_=k*@W`9+6iLvNKa<5ZQY=QOk+X>({+oj1jsE!S zI+ePv)NE~y3UI_DWimX0oF`kVy|anWDCBJ7bN}BsR#f8HU7Rh_Zq6ot^se{)x+n>% zW>C_wc7DYGy9MWjZi$cWXbf&hYd=IGq>R7<+I;Rscr>Q@yVXda zNXh&h>Zgy`qe9OqDY_-KweMQPzD zRYJEYq^E=kDX2a_y9BPT4g=}pzb28@^DY`+U(l=%~MFx^$iwYU?Ah@~(b7>=! z+*?N}aN&K=T~5iC4r8)qrNGlP<%lMd++|cq!4g)@0&ApE;mgcsO*MjM+mMoo_@`Bq zlwK={lEpSLZ0x^v2$)}P&c=7r(# zPj&UPo6}&N>Oh3gZho16k$ZOY_g6a2!yQ6mvowdq#%aLQhi4#Ms2yx}EjM}dK+{(t zC5W;fn`zc7(e1wi>}c8ZQ%XkyWWoA-9=`DYIV|IF+oBL{bbW3;f^9>>A#l(^r1z9u z1SI`N6?es&?Jg2kvWjg0KLqD13)dqD31PKfV`j-EE}@ z9+mZUr^tFW^Ef}-G7F)d-2KrdtviC9>58VO1Sc zUFf$_BwGF1Dlw(tS<}ER?T@lW`)TpVId*ps^!(;dT;Lnjkq8(XP8~&wh)55TBU;hg z6P>sgwagn<%kc_HA(YMYMNj@r7PlA$Z31L3Lunk{LN$0c@##6Cy;8VnC7w-u?#-2n z_H5$sf5&z6vxU2Rr~{u({Dav3Mwd zq9b$*BZVtEq$4uHq8r%y1d}$03|1$i^Cs>#RjjDS^@k0Tg$%JFZir-Fx=mc}AiCb- z*B7TcTLym;QY1mOki}991568PGjQILtffT!e72l?GHb=A(?Haz!eZf=&)Gb4oe3fYnsd zic?ifA(|{b>*a`=r0{UY5Q|4>>9y|2FjY}IWHDtiJcO#L212&^ z&wtG%e5jnMVbPOqG1_Tc8%-mlwW-nN6cT?zl0@2YacVVGG2eM-XxW|=eDH?^#?N3F zUm~89g313Nj!L-o8*PiXbV~{ix$7x1wDkE4fsNSaN3~orWO!~=xe?X)ycdFj`8H-^o;lyfOimqb*7{yzyjQ`Y z{d^m9^V811`il~AzKxmt3H%}2w$%A%eZGzPplwovGvw0^TrCf?UX8Abw1x{C`}eBnE(M!i^U~cTxdk|XtxYS@a^e>VHUS?=S8@A z_5Au4U{auvHlyY(YKdYyySWKUjbBvM#S1@_i@jr~1Lax;V)@i{Nw;`Ji;kWj5mMGF zrv)O;*ST|d{^)@qy5t*@fc*XO(B~jsvm$7Sp!s!v%>$^pV#xNqe=ZKCIlKUPN zsnN?yrPZkNk>0)Y?r>!z@Sc!leWMDA1aDlF#?%Em@_cF>YjjA~7EkI3ovK8nV5f)q zuJ<=u8kGqn@km89m}Eg(QthQ9%kvu#Rp{EZEJP2Vv8Wpd??`o79DZJ@oQt8c_Y6Q); zA%%{+YcYAa_xgEl6d$Q>%T$o3Fl=!+3av7Z^7FO62=hcv>!X=?qi8Z39!4~;oGL$# zs`VRJk^1c^*@E8HT}1bGiso+X!wA{wM&b(Z3U3aQA+~m>tsz@bjXg!W$xtupWI^)@ ziLe?qVkD|gvL1m_&uZ}yR3WVrx(XT4PnhbS&RAL3YHe}%06{|Lw3yZ+jQ-ZMM(gBIq zhmjbFCX(uqQ_A3Z<(&We?_cc7S$WLApOiYaPA5;M5z7)BRZrb&?J}kA9a+lUUi;El z^d|)$Y`Yx}PYT`xQIXji4VcNOHEGJ98wL8>p;al~vO`K1oy9o?hl-WJknV*`rOqu2 zaGea!7wqTBU`d}IVDt*mNkiJ=3PcOlnt7gVQx@+<^v|EQ5$A7m=2cfnw`NCMs-^R_ z%zNgI{l6wYe-hw>_#FS6>&VIEmqA5LpbEzqcinQnmYHu}_yWA}>Nl0yf=*ZlW!l_d z5@Jj0=7h}hl*{WnvbXP z=Ll&i+0u_}sRA|e$U}5a&$lP1r-&+6gpECyeKo4Ua#K@ch$1|?DWHk9_T~AJ1esnX zjjHGtAv%=h2#adrR-35AWC~PHk@D}BOacN|x1=))T-}1XR3wsn89_JLbC*-HCGc`! zTHtH_My@}`f zQXSnAwIf!>pgg>arD_eN`AEuLPlH6(hiEz?iz(}*ym3c2`fTY(UOrcQ5?G@mxi0iR z#A<{@9l2W)7$ve6;X31 zE<&^?G9MB>d@mm&A`=wFAK|$#S?#!CmgtP}7#Oe+mPr*NR12FNo)&M@0#z|tXvK-e z!p|oq=Pp3g2)4g=CDIJGnBtk@m16G}ya9C!in$?4B^D?mVi-GJ+qE6%;aEGgzLty6 zw~mjHmajBEfwaQFIiy=6KUHi-1)T1(o)p!xGeGbzU&%e(<;jC0vy8tXCrq9cpw53@xZpNnl!29i^yd zNwjF}6iHZXuaV#f(X=JPP;+jb%BWMyw$Hq+?YR>dI5Q8!nGcCjDiJ|RxXWTXq7^OE z;~o+c*Ij4=^N?EMix}w1w)m4^t|3)ydNqhqi}CLI5qr1iV=y4IQH-v9i+`MQvhbe& z7H`>q{smc}#t~qPt;oAuQf_EvJw)-=H&hVjMe#CX7XLAe6uhrnr5@}wagIY`~FQP+-@j02!5xL z?sj&=4;sthac^yBH=Mw#A`DQ1Ri`GokDp&syw6_7pVv3U=l7|VC>XP}yuPdToj(Ql z!3wGy`;>0Avv7T&TBaNE7L0j?_C$m<*FD9viA#;>`k=c`{SdL(M28Yyza} zk{U76qmz87IFj#z(ue1lFiTay2&rs?SHPMo5ZP1EWN? z0YFKlUQ>UgpKBt~oU8Y5M-c>({Z7W)4gT10z^1^ZG#ZbjyaG|U)^Rae2&yGw;XhhT z?h;rPrBMkNYMYmjedl{UskB@!E)Vn1*ZJp?fBO6U`oZ=6>&N+@NB6J$H{+KNBlsux zGg)0{<;MaT16bH;YC0__JDZo13pJ$8DCU0>qwB+|j2SCOU{&@Aa)~qrSwFI-V%dS3 zzPHv`5|RL$_2hL83F|joETm*X*FEk2dH!TkZ_|5I7NU#KRuond7*#qBHJxU$bhS4w zQgkYhToTFQlSsOuD5SZosFH|8)xL%zsR+f-n?g=$Q)%z`z(;ykJ5v8??|Lwr)K{Z* zwS_&n++S-})f&wOeo3lzi3+mV)^Bx8tX62rnhZFTBduT1ezx3wQ8st2fG8RRE9vs3 zP>Y!0O+5I0W)qLvDXN&axXZv+x9n=9@xlFD%WBVsDmQS^daXemng+1Mc(yPdShk%A zqyTp!qyV+c^$7L1%@YXQdWbaAE>4Y;q7v0YyOFm7dsMh(!QYyQwC07tN}srHj;MNt zk#50v2}36|`)3QeZrA4{@U~_JD=Lk0H$K`0^oEq-iaOvZC;_UBN4nBCYd+`n#EX1aEkxzS6LrUU;Rgc(SHh>c@V4J!i z9VP_=)-TJ&N~?D{X10 zaAmNN3R$srw4OZ?xj$4TGEr4nXzSe)1q&nldTIu-22CWkD5c&+bV!nrD44Jil;+#g zU}1iJGnIbd&Pwa?wa%jOaQYt<14>~*%B|0jX^619C0R)Mbjw1g#J04b;uWOnr?*gP zM~DCD&iDQwX}F}vUiBv(uF}8`UlTRS?JKnR9b^MW%ZC64cMA0!W87z8cR0b!anC`yT8=-so{?&i#qERp>+ zJc8ux;7I0A_wK4%KUKXCL;d};2M<2~?&Z60UcG(u`R^Y5JwNR)Ji7gHe)iSdH}BuQ z`0D-hS6}Cse}63Lvg^l>9^U@s>d}*npWHmV`^mGLyB}YD`Sju^kFGC%^5w<;>+6eU z*N?C6mOZ&#b@Ah?M;E7DUtd1>`tjZNn~O(XU4L=+8&?;pTwgru>grdD2~&z?>M{_x?b&%b{A)wh3n`R4ue z_ka8A%ja)i{N-g(%dh_B#j7`;->!P~=IfXLd;7b8eeo_k{xfU;{ms|^@#2p!U;lXJ zcQ0Ol`|_I~;D5)22M?|;0Dth{BBlJ+ql?-;cyO6Xe)H-A>8^cp%c$Fo9$awl$0z;Z z*sH6Hy7plgX#e9;KU#drfPaYcl3mAx@1p#N`oDYm&9|>d^;51}%6$If_3O9)^ZeDD zuU>!q^~>k4-+uMymtQ}B@h1QL@tgO-=GB}3e*WFt_b;En&&t1L>-%@#zP!aNOWwVI z{-PobQm_8>>gBsU>rZd9Ziw~}?pSrVuj}T!Z(6}njhz%tNuKTo;-Z|tm}Tb>2m9n{Qk#Q-L8$^#xY+! zj9=72`ae-@{%7F{ch5ksX!<)o) zq&uE_^Yr+YJoSjOwMe8rD`m>ME`QYc8^ZjZPec@Rf104aXi%RFXVfSa|8UlmyVRaO zTG*djjM|KPAE7tJr+3dui5k<>hk4-B>xY4`@r|M#zmnhTFCGN=bi`MUwkVV|IekXn zpQdOHV1;6d=#xhs#s5cSip~XDlin@8`dj_!%?Gx%zCVQX!1;(XwK(>E5XS{kt}?#- zYIRavG8ks%cq%eaY~@XFYDAtP6TRqz=kAz{RPMhXq1xp(%?e(Be@dvdsj~M9P+X_M9e?Q>3uf zUCa=jjY%6PM5$JHTCO7(!m&J*+*{$jzO0%$?i`Ry#x||+Mk3iFpp0^@XEE6*W>uvJ zMDm{yUTYONB=IH^0*ewmcuQ1S%oe0m_u(h4@cKxZ+Dg_flw?i8OcaD0-JD9Lr8N*2VZkT4%tUz^l2Zwt!C%@;vwB4}<}VXalCXsKkG;5shYOqo$e*WS4MDJ#isEAbJ;eEc&1{*-c zX9T-~Y9h&n z{5GWJEJWRnXPFxX!duKn%H1M?1qD^NWvxy=+<^KK`M_{~wStWsbP6kUN;4uw3_6(y z?p>zTaE=PElVm0$h?KO%5L{oiqSJQ0bjcop4Cxjm$=pJ3NTGHT2@hpN zubRjS@uE7jkWr`c93X-^gy)p+42DQc^;gzOGhHtr*CaVgnzlITdqb?T5R*}ic{sJ6 zu1^-ycDp4?p~7ZMj6!;7tCV{Ir5}A^RLw=AYOPSkOGLV;aU)P( zg(T8qC~K8Q9^OlhUI&65rGQ;~7|!~%+!Pdr&`Gk^=GFDWrRg4;MG}{;TGS+}+CDu$ zCP2>*3iA9x47C~pxAtOO7BRq*i2EEw4110f!2|M|iDh zOQn%oVJ_VwoZq)5UaoV(W>J~PI5_(LziQA08jI?;WZ&Wy+&qUVCt5^@ir1wkMESiE~ zR|O$(JEGV-MLee-C5^r$AL>|#JBCBG&3Xzc9r{3klb4 zu<1zo6tk>s;jaxaK!3X;eGT?tus5$=(RtRIO`?hy#_sz(HLfumc3pp>^; zP=@Q$$ivqcml&9AQNFj}TYRZxiJIbzb8c|ETjYpBfLiF5utH90R5&AbODZh0eWOC> z?3VOpvB9pFsG11kKFUkf&0@>qK!lEHRN1AtCwGx;pD(sBqap;8#qn7;pPmwb7Tn4F z`}`D2v&a@1MP?R=VEuuNE=Da;)z~GZW|1v~#o=;)^ALJMC>dkt1P~;eHVhUVw@sGZH0$?)$OA{f7C6Pkv!a<9|&}m z%@L@GR#muHPZN~OiU2`{O4h=?hD4qzokAfP`BF)>bF~La3JobG#gVMLM4lV#M_^`3 zqpgrt;;l1WB8Jy0ePU_uLh`N;&jpbNhU?oOWlN&!7Bqxzk(<%r32kZa;XDS`^vn zDOBSRdnxO*U6MJ*(}s&BviPHJx~;_4s6K%pC6W~Kd{snI7Vg#4B#W}*w|uQ@aZotx z!neu`6K2>FdAE$uvT==5$S9Ny^9Y#FIDjlY`UZt*2RB}qU;7xxMK72n=dY}NC2--r{TieQrCA=Mo5Vb~m@0aRG z#X+hHN(5_#lHs8xN*kry#~}@#2SN`Wv~p*WExqH=`b$=I{}>tBPHP)mhz!?ddtQMr{wrEP`QL*J zy=lTp{Z$b~nMC^AzXG?aGJa4=39sQuG{6s`5oF^Ol5-YQiRKX-6Qf*Ss8BS%(!9aN zU$#VhGLOCQ%RxqJZNl_O!}sv zHY9JXK<{l9_|0{VB_Ha}SuEwPIf$i*A`Yu4Cm z4TTN*jT?b-{KY|j!LHb+n+a5Pb;a&kT^zR{6b*;0(@B3U<{2~06BT@ zu<9Ng?-)htfw&$nHdW8WNw}wE$RX8_4z7W1TxOGtg0fDh^m^(?F$&avy`A1u9RrwQ zk*FvOyf2g<{z{>{q*mpvNTVqW{TdJYe79hC>(C|he4j7ajjAf6x=TqY>-+o-I6^96 z$b>`6RZ`_61~Ru$VB(x4?U}O1AD-jn-oSmUZZtd0uK;xYLis*=82f#b$ZMpR;A%M#%a5k!o=f;E>T0s!?T^_*HDjWPVtv$rdjH%_3XS52;X8qQ;|hSE>}j5)cD!$$ADR z3}JPUKcgFzMKVVv->#>LWjH4qLJPYweaR_3B8cNDH3Tuk)+z@Ph=aPq!}9z{2ga&U z1#_>UHWHyN8<)5^mEhi5X)8Z0od%M^fdfFIPoYe1ZAT%1~cSL z@z*LP{-I?%V$YXQ&J8SZ%iXzKaQxF*s7K(e(kZbMfV0|8-X5tj1*pE`NM-O7Mvlu9&aS89=tcyajP-$eBkT8o$8cM%rkwU5ZaCDE3Xl}0|2zJdPg+fLR z1c6a_M4yjtFhU}RbPJZNwaQ1RJGTgRO-&-bL|*@2H?$;+FBWFL@?s%dl5+pO99Xf# z_ru-d?Vi43qnc)|#HQ2`st#eu42e7;RHya&CAE4^=%)j`es{J(r(`YTP`Rh~BW#g;M-a~p zB}}2j(sS{}f0@VxewOYm-9-g1zn?mZ^#7_F=Fe$)v2vmdRhO|UQ?LKoL zT}k{3#zPu@|1t}u?H=E*6uzUpfFRy40$ggf{``g{SaP28OJY={yFze`g6mbP zBDAWRv1Q932D^d2jnBX-SNmQ(McSpu)R`$tB(mQdW2s&TPRgfq7sodu;fB_$*dQ+XYR74iRU9A zR(Hz^YDhS!bc>|W^>G`r@r~xV#Sl&;LmDw;2v!lvDTH`(zi$mD9#PZaEp6%IgN?-A zzKn7|KRMg_T47@{>9*_!-l}@a+15X03z0x=|7`0kg`ycCT?xBhrLi$vZd?g- z>y&w^^Oa1zr0!;&6eylliN*=J%+5wB@ic{$ltM}hxu(gMp0Y9M#s+0#FBY;sQPn-< zzS%80#2yu1ACj9w)JlTgP%CaxLnsx4_&u|Co+4E27R-IJ7jx+@neFHL4R(p%J6dcc zLemI6KUj!nbu_A4qj3SEekdsvxIiGlO%h7tJta;>wlI2)2A14q%SfN*ReFAHgarNz zd|{Eo4wqiP>0`$%qXg@skgr`tr$r&VgoNd-NTa|hmr^J>qA5hM(!@I_s38agM^$a? z3!Xf1Gejqq+rOceEXoIcJ=fPLXCrg>A}ICGzm2o;_lnNQdY&g&bj* zjHfb+IAJS$yL$X*g|b3 z4ntWti(nz5%VG;j+F~1`*hS;VZysCKBkOgOoTrfPk~N;vM8s$M{4iY0g@3MooI-=j zNSr!Fo1^BQK|*pb&()@4I~r9I5!-34qFFg5i%qZ_i6;xH6#)?)i4Bt5(35{9i~q#q)ba3QGnkZK&=l@$9&9W=&>VhehTn17>^^@MdjR-~=<>BAGhl$1PnJls-rZCzI7~3jI)&&BuT~(Z<(5w~fRB6M0HLBD~x1?6m*+=fWr9F|Z~&WvRYcBP=kj-*?XV)Kf`}vTbOv#`wm${^ zP&!#0ET+km#shgW4ZtZoBzV9|?%n5yJYub7f~?JL~_k zznE@oY`Z`H>!hlBAC}U8%PX3mB4cNtk47}M5LY)|4%ANZ{Xj#Ka-9gSQ|s4>pusI~ z!20CSNqXE)i8j<4T}UFd_+KV#11?{c;(!gpN!t=1o3}jLB4cDAE>Y#0bH0{Yhr8v? zeT~X{zLr^;jZ@gY2~e;oeCKPKwHGFZBej)@tBX@%HQV#G%!)u{Rw2~-QdjO2?0(ej z4$4_eJ^SODqN~mGYl{`F9nHw50{p79K**e5?9TouuSzrrj9UcS0*Fh}C+f}Mq;sBmV> z5ha!Iwp;X1T4GcU3E^&3vSrwsS*{v__<6BjZ+5hpOb^LG1*9Cq$vWh6O{Sd+2O5u5 zvYd(639M}*DlQaDQW$})*J>ngb~kd@R+3!A=VvZbF;jiw5mL2K8?8!P4}R%TX<${G zg<#hzg;zrLt`FNqfaPrt5`!8H(JkF2ZM5rCWZBZ5sO5^82pelYR9^q%>rEV|nkKGW zguQ*fRH-TC`DE-E|GLwbMXEb#dB%q!YNC)J)ykjWC$7Wi&8P+|TFByl1VkQJ!f=!i zrBG7E_sEJ-n zGjd_zqp z;1cWf`6;7llaf`VDE|?rGLzybWQSvGNE_YRuk)>ys(xc?LJ4iUeJyR&Ucm{5T???ptOR~T% zMLZuduCC80D7m-1KKvKNq;uXtKlKOf2YapI9!h6IqMtOdjUKm-xSExdFg8L?G6ZE< zBr0mq=M8lEt1BHW+XZM~z$;Z15$Q>9st0BlZlU#kKF)6=B=YBO!Ey~XaeGRIrEw&% z^)6%5rWucJWVDzP3{2=qEg)V@N(M2#u172GmdKgjSy5GK@d?4AX;W2c@d?2_K%kAL zs+8+S*4J_oyPksfvJ=>dZGB!%`=gFlfLW`$}e*0P5u$rqnzSRNN;h&(`5Kf6Fl*kdym$Z|cMXH3Ci+VnB>3li! zsaIb4doK$g-U!BZ(y+j*P#Gmy&n$EzO723!CN9$0c^i;I$q`K)$D#A(4E$y3|0;hx zfc#md2mLFyFBb}v=h+cNZz6Kz9w^N zhfIPX+>k=``NE0~y0%KeLUokDB#{P&4Byzoj7kdV2E@Ro5IV^bwGLrmj}Rax+#-q| z5qhZfl(%}n3!NnKQ7GzS8(0);f;(AkBoe_&?(+xrD6}_3d;I5 z{QRSL3zw{-kQZ@^LUsuWCp`o^=2E%V9#Odw zd^mDUEF_UQl7&R^$G&8EX#75hkE}`5Jw<%1B{~L`^;3F;`bMl+%Y}btsaarK8HwA( z6&umqGto)zJ2r)LU=vRw(jU7enw8wM*rtLFe@+%+>CHOp(LX^NS|Twt3tK2h{45jV z07M=NW-v|eK^%V^QbL-vku9x~fZHR&f0~NZ;Dr1QDGo^zPIti0-curcfv@)(YQCdZ zl1QUUd8so-%alc)FNim!=!g;ze2O?8F$*P$cZ)Zm@=83Ug~}GGaCs<4G?9=>y2Fqy zGzgpkQ^4<-dIVK9>dQwMGO-gZRIN=sR40M!`V>mkH@HDtnni4cJmI`@uD#n2 z5bOqM>6IQ~M~l%qrXqx~*)kZoZfNrq(p|DXc)os0rLFBgZleR+dF5P_QsMKCUq6%< z&{On2rM)ZyM}ag8+_KJdVyr2Gv_OkxUYg9&0^;D;Q)HwW>uIFv7Mv9cTw8oXuxMOF zY+8Ima1Rh@zt|9dg@)Mm6m>9nq(&tS+?bK_d^J5S*NNbI_y2VwNa~;q_+ao()ng)UEt@NndMrow-{yY`jh*@Uv3j-t!HOkCWF2*(yLHC{OpV$?R2&J z^emA>tBO5qo^p1^b!o(-@C#piJAL3z9;>!l(9h1eh&YXBv^Xf_OHz>@v7#vFHlcHJ zx}?y18cv*N`Tv(NTe?fW#OyasNkmSmc}nh`s|kywpdqEUav5xu5|WT=UR&@RpY~$S zo!|==64Ji@xRkaoPMhbK9^whza(veBq-t>3I483f6ZyzT znpay>|7jC@G`iInqldMZJ-T|h*R{$@No!I}bYHEAye9tIA3}U&+4^`svtFDv4$Mr!79#2c8B~9=ok;6yHhf4(X3!*T)f4NE6;9)cw&JV;1|Dtrh>q)LS?X%V}I zL{2D+M?BOhTP4Nr&;`&*=kyQ*tJ?KqoAorxI;aUapRfTFs%mb>Pa4(2uad zs?x&;S4}?gdw8QgXG%N;-(GAmU1g47D#$Z3g(Plt?u#itEXfX!@#l&)E*~QPft{2TY3iw zd{WrJ*Fs5^ig-S$OTvkN3Uzx%a(0`T_0nRohg0wHt*NQVvEIn1Ck> z(QI)roI0~bYyaB6Fqju3nh0XILRObB&n(8(ZF0_F0zs)`AsY&GiY@~r`#sNlM3W}X z-ShGP|9@Z4JvMR67YA+`E9j*OJKkg`lD1E`me$c#eY2LN_i7sG38R)CTU1ArhNz3l zJ@IDshs|;I=gU(GPc8*#Tg@(>e_5-im&}bJ5q$sK8FR+#OZIEj`(2aH)Y}wpviN$J zVbj>{Cf!)-((|>^k=76m&T&S&j1axP!r|dnnu~RdpV^`b%7i_>`yL}o!{HErS*klU z)*hny`y47%l+Zh~9o~Ii4^i(xR4(wk)rLLlYbH`_7rM#Wl;P0u zBO$8#z~#R`r~C9qo9fY`Xbdai5WSRj>1cx<9 zO&TWsFRY;DhBUs7w0#W<-F7Ta@Afz})hsx-6cXRQ5{*d~c~+<4aDI!1n%@!t&ZQem z#CTa`LkYch68c*QUJDhWaW}aM!$P+-*#H_ADKA?vueVBgX-!+nJpD0=$Cba-yE$GRS*Z$ zwoA1?cchmoyCK424+I7J7mWNyJTlbx_)wqr`=LI4&Bt65hkAw^LNr$G@<`h7M?Vjk z=kGj^7)mXvwj4fu(sgZ!&&ayhJNCY`wK(Bqy^@l)L)Q{teB?Mkl}&7Y@8 zrn33ABuLQ!FdEfRshS`w`_nL&__IqVeiwxj0=3b*OV!0vlk|^6G0MF!_(&UCUR)uQ z$|7V8=g#RKl~%+#{0a0j<-5G1#W+maJwE@bAA5^AtE_dl8lwGKM?ARY$*KU^p+1LS zyi=u{$^V*F)HSaAI`Gw?JloJ+ntsOTlmYRnSl^lu(v1M#ca&edqmB{`A4wzkkO3aO zG9yV7E21(6JkC4>`>WuQF(;+P0M4QH-^S2L(ISHZc%w^A1ZzO2^xLI{u)bL0j-2nhc*uHp1a!@ZE(d_Pug35D)P251!Vsh*U8{_-h#=!Xsz!xB zt_Eb83B2g1;gWgH;^r@ez=x~mK_2pj>HRdsZ!N=JGA{CMC9E$oR&xLMprP=Dwkd$i z;Y*wG1V6n|OLBfQNE*K8fjtpO@y2%TX3X(j5_qLlCmmBNq+Bg7zhWyq_|Qe&mZw6T zKBF%fT?UQ4+U-(ytH~FmnxsX}th$kpwE{z$G&oNA2LtBhPk=r9etWU@{~KiJvvN*j2i%j0(%jfnTRgZXoCvd-98Ik4q)ZS!qOTutQFIoJ(%|?pXoC1*P<}x~Ar=*m_ z{r6}ly}ild;&wgDU)w1_YfQd^w`hFOq>ob$A1&8yeyKd;BNzDUG4=xVFS zQ-9EXZcXaGn(GrekH51OxC$?rR9Ek)R)9^0oaQAT>S)sC!`tx>f%8csMeTECG}sx@ z_=&qpz&(Dv%Lu42=joZO^h%e*hz1U4X!vx*!`%Q|n+vG7!Z%x-449n@Ilof(_|Mls zkW`@qw*yEXhqTXG)V4SVlHUm+-ZL&wAJ+r!zobVrf5_+C#Gh8)nV}JB%_eI!02>fcolPQGv}bB@LH` z+ai8tuNKmqZos?Ff{Fz-x_qw32*n0G^@Z-zq-9~?E{(6Z_~Vx~m(Og3;zu3?xrhBM z|8`z?M3VH{bw!>g4Tbc}8W7Xx^2{DR;*m%6kk%YC`Ai3($$`^fap}d4Fx$;Y%}~C7 zd$CXB)&4Er2Q*V{U3ky?mi;AcDK6r+>EwT0`h0`8U;>|hx-=HOa$D7PU(52ASD~_r zf|lep%XCY)k3X~pDSE0tq(ohy`rzCtcnf1gJanT`*y_dxhlZD$+;}(2@tQ9h zu@rl;CDb%6+LHkD*A&spnx7@1$zp9rHTIi%wbG3Rbt;YU=Sc`JjxLYKI#5k==tk?pV0e`y^Rnn)&^Jt^$T_#p z=P9wbGKQ=2gD090YR}!_@r$#%t?H;booNYZdYeiNi{APa+4WIstXK0&0jChs&B}Oy zRewi2M{@o%M{>^|$!R}3lGEK!xNp1W^XxS(;-plSlo^TCi_C)953|(Y=F`93P&uWl ztJIRiH~*-oMSAhyFU}(`l!yD945WI9Y&y5hmE4V} zu-8#hF}A~42-B+0Sg%7#kMk`?ni1D=${pMk(D}5I5v@*3d7G|;p3sI>05Lba#!tqU z>lr@U3@GSP`8`^gaI8OZHIGk9PTz)^g9yH7Cqy7gk$u;twiSZVxLs zFxfoQ4QCc>Tdzu_1W)?x#8RpBm05(wN~uA@{hjQ`g> zjK8zT@Rb^{tz&Jqz_(Zq{6QBUNSg;g^>}&^WtTjTfJ@VEoL53n+F43+dsD)C6Xni( z?B`)tweo~)GV_6~$vC2FJXE-7(!=q7kaM}J8j&TIdCqp@o@7H(f5L}x({vU2b7iqt zicfWB*<-TBe17`|R^eB{dYt-w^(pKDiz|KjN~|R7CtkeuA30P!jYvJHC#6T~SdW!8 zlvMK@9ojEh#``jmmW)}h0U2s;Ov&K~_~g6TTZI>}AJ<1pEQ-MT1cq~5PYDXZvuK5f zFhidr#c#NxNZvju*BW>(kinrs900{0BTIj)N9_MszqbTm zHjTx{QlNZN?gn?}aaL;4TMc_C0A(jLVdTk=HVyyfSb>PHaEQ$R2fCnlx-wd6M zUlNSN1KW(($8N~jad{FE<7htA8qbmbxi;i}Lysis9-Yh3RBIx}brdFh5}W${bpd(H z)lO$C0Y3~c0L78vG8eCI75}2fWg|!t s|1S^;vP{k!6h#`3`PeEUt!m5C@3Du4ZrWwk(Nwi19&q^nUB>DE15mK3MF0Q* diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__cfe3ebd0f17745be80e4348304fe468f3eb8c2d17e23d310582b0b34f2d5bba7/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__cfe3ebd0f17745be80e4348304fe468f3eb8c2d17e23d310582b0b34f2d5bba7/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__cfe3ebd0f17745be80e4348304fe468f3eb8c2d17e23d310582b0b34f2d5bba7/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__cfe3ebd0f17745be80e4348304fe468f3eb8c2d17e23d310582b0b34f2d5bba7/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__cfe3ebd0f17745be80e4348304fe468f3eb8c2d17e23d310582b0b34f2d5bba7/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__cfe3ebd0f17745be80e4348304fe468f3eb8c2d17e23d310582b0b34f2d5bba7/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__d7532a56162a82dafbbe07d40821db2e8768e2e6a880e7a66018fcd90fa35c71/msg_GetContestedResourceVoteStateRequest_3fede5825779667ef492c2ca1744ae6d7593e5a08c8e0c9971ad1afc8c3e1702.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__d7532a56162a82dafbbe07d40821db2e8768e2e6a880e7a66018fcd90fa35c71/msg_GetContestedResourceVoteStateRequest_3fede5825779667ef492c2ca1744ae6d7593e5a08c8e0c9971ad1afc8c3e1702.json index dd1f75831ef4714990d2db114e629a9c000db583..365e4d3cc5544acc30ef0d0961d83f5149815fa5 100644 GIT binary patch delta 18 ZcmbOyxY0T09`ym=zAAWqr`NRARYw$r|j&(r(7eSEtf z9%j%|Q4K!eJ5&YU;Lb@|lTqy=e%< pK}sz8s*|VT{nipVerW`xnyrH3I+u diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__fbed6654145b9fba061d182cac5a3879bc9bacb92dc9ae64ed2a07ca2ec0392f/msg_GetContestedResourceVoteStateRequest_e1399ef22320c9690b1c8e548975839e9ea0c40cd94caac5746b19857d52533a.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__fbed6654145b9fba061d182cac5a3879bc9bacb92dc9ae64ed2a07ca2ec0392f/msg_GetContestedResourceVoteStateRequest_e1399ef22320c9690b1c8e548975839e9ea0c40cd94caac5746b19857d52533a.json index 1877ca2ee6422825372b011f2d0fea6772226549..35850d8b944cdbae2b4380b8d1dbde6fc553ffbf 100644 GIT binary patch literal 124070 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 z

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 diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__fbed6654145b9fba061d182cac5a3879bc9bacb92dc9ae64ed2a07ca2ec0392f/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__fbed6654145b9fba061d182cac5a3879bc9bacb92dc9ae64ed2a07ca2ec0392f/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__fbed6654145b9fba061d182cac5a3879bc9bacb92dc9ae64ed2a07ca2ec0392f/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__fbed6654145b9fba061d182cac5a3879bc9bacb92dc9ae64ed2a07ca2ec0392f/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__fbed6654145b9fba061d182cac5a3879bc9bacb92dc9ae64ed2a07ca2ec0392f/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__fbed6654145b9fba061d182cac5a3879bc9bacb92dc9ae64ed2a07ca2ec0392f/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_list_bug_value_text_decode_base58/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_list_bug_value_text_decode_base58/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 808b4f01189bc76a5960f835750320fe8eb70b21..d438f5cdd3c70a33082da0d6fb21c942f97f77c8 100644 GIT binary patch delta 2559 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 diff --git a/packages/rs-sdk/tests/vectors/document_list_bug_value_text_decode_base58/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/document_list_bug_value_text_decode_base58/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_list_bug_value_text_decode_base58/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_list_bug_value_text_decode_base58/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/document_list_bug_value_text_decode_base58/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/document_list_bug_value_text_decode_base58/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/msg_DocumentQuery_86beaec40825e436c6a9467bd1af6d2d9dcd58c35b6aa9e85398a105dfdeb9c6.json b/packages/rs-sdk/tests/vectors/document_list_document_query/msg_DocumentQuery_86beaec40825e436c6a9467bd1af6d2d9dcd58c35b6aa9e85398a105dfdeb9c6.json index a17354f7d71e497625b9450ec046022cc9df9b96..c4f3d801d33384707e54b547bec04bec0dd83b43 100644 GIT binary patch delta 3813 zcmbtXTX0j?6`k8&OCbl(v>BffTaQ^JX~8z%gc=)JX)Lburf3z zv?Udj%s?;?M;kbWVo;h7AW*E}3Db`fG|lt{@z{h6oe3p&J7t;_Cnz(7ex#VLeXeBM z{&vP-OZS{}_g;Igwf7k~m2>y^Ur%0{KB3C+R~uCU!zOP>5#62Mp#|uL3#GI>er@>wqOz6exjI87OZv&=j&&SruIKE{?o&7#Cr7i~OkQsjMI4o%j|Y2>gkzFQ~pwnanTx;!7jqI8E&@~Ak@-@@V>)ek+@ROH{4~L|q*b8#W%_HHB_j`Oy8LuL_H%|wh7{OR{wspqtMT>~ zK8l=oQD3lH=!-2vwiReLb@Uq4yx3-JWY0XHJ9xyWLZaL^0VvMSOIZ$Atg{MXd25GWC)01UWgYLO~@4qb1nprO$mYMJGg?-kRGc)Mjyr3h2^>&eHNQGb^BBeDR&;&az02c5vLfmED$@f?hl$s9>v2gH1wS zU#wVZs}c;XHu!|WCZ7X9-Y*bPJJ9$hl=H8eEYv2M%Tb2?E(e)Ni;Lcg<4eHI{|1tZ zTK!Y!E_aQGSVki!1jEpuzqZ^((J%f(b=bft2$_BaP>2_ntN1I&3`(B^gmcRAS*MmU zhXX*5t7tL7dSlr&l`@orOjz1oK`hvRRFKC9P|U2%z0~q+kmkIb8b4L4jzi@Tw+xlC z2E8Wr9CStHpr^rVQC zXU%5M_~ztcA+H(Ox2O)mI@y8c>jkyXSJ}~HKjL`d2PZ5NM|JwvyUK9rdB2dc8NkRh z6aOXgmvWnyg+Oe>DTgAc5WGVU%tijKvz&c}EjC$QmP|dOd8ziQO=A$WQRn5|W z$I+R3g6ycq2~NmV ze%V>iJPr8i)a3w|GQc8)In6&941L;$K_j#*D?Y&C9i1CnHmU4W*VJ)*kO)?F6p#bO$2AC~s zxI)p+rrJ3$+h$8f+0HrS!T|EvuT$F^bcK2!g*P*;-1JnHA%`B-g0kV;$R|1s6=cpC z@@gumq*rj9@!f9Onuqr^w4sp2I*4J*>r)`-#G5)L0b-A(Q|cbvV4Y5h1CE)77HCEW z1oZ{w-c*zr4k4~nnTkm=>_s7&5KmR9Zo@2MZ$#L@ zdMXxWV5+9v6UQ1r1?6V3cM;Vk@buvfJ{b%DU!wGfU-vwKm0tPPlZb2NaE^Q_2zr9! z+0wGjp#zinz$bHaG=F@#p-S}eY(f3?aABvwa;OGm+%^TLa93@W%9E*YrQ_u3W+&dl zT8+6N_i)p9+60bY6{HELY^vGA6A4EmGl!otHU%r3Mq!TEis9vvgzb0J zO#w+eE~6wlFki68C{s~f*q9VNB;@v)JQoNI2+BO-A;-7T4cQa~U0hZr3#;$}jaD^2 zb|*%;W$}2_TpXQR&l-4@!)mTt`VM0JNQE=l1mUR(rA%d-ZicYm5Hh+1+&}?w5(s}J z##DCG-J>S$?EnXAaheDP==K&9!@;WUUV55+*1bE9xxd-G}h0aGhT!ZDj6QwhQXC`g@1B zeS- zq2way^jAI_vmNtQQ|`{80HN0et4V~q@s#q`HxxJtCattV0AiVizQ6j zwFCus#%47n$lx=WtvnYnXIvbgbDWnrHi`y=Aw6$B8rDuh_e@`AsC7*J=5ah1_P_+y}*h67Ul-2pVhW zdZ24M9@BUn!*znK5GLk#%nM}2?28t%$5s>iq-rn4yO;(#H6C|<^OTcVk9j#Dl$9hf zc{oG=xWy>TPtQS^oK=gg#0HzSVNfsHPxMBR7UD7zJH$=bMz05w=rGrIp)c-q@W@(( zb0!!Ad~v_o8lW9KEv@IeI0ekmQ{g|`=DzP&RLV4Ir&;ykQZx<1AHUxWje=x1+_>~* zh-1it2JJX>VP_|E$AVk^Jg(caWWH7il{0UjWl;a!B=dBJ; z(ER1VWXSDzH8!-MMrcYTm63r0D$O7}hmsC=6=bh&M_&3E=y0FI-A~YB4A(ph9DCf7 dxnT@)e3`-YV(LL$MeoPI(yvXE^-Hzw{|40OlTrWx delta 6915 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 diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_list_drive_query/msg_DocumentQuery_e731a9066a60d9cee4097f419bbe0f17fb3367987f71c5caf9c045ced8633299.json b/packages/rs-sdk/tests/vectors/document_list_drive_query/msg_DocumentQuery_e731a9066a60d9cee4097f419bbe0f17fb3367987f71c5caf9c045ced8633299.json index 1bdafe4e9b4b3139be7e8452340493f71488eb6f..f6df12477a2bdbe9a7fa4d9ddb63ed4d6188727d 100644 GIT binary patch delta 3941 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 diff --git a/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read/msg_DocumentQuery_23b0993681588ca0c66e960ae019dd012ae92b1038a32d1cbb419087d75cc70a.json b/packages/rs-sdk/tests/vectors/document_read/msg_DocumentQuery_23b0993681588ca0c66e960ae019dd012ae92b1038a32d1cbb419087d75cc70a.json deleted file mode 100644 index 243ee061f602f53a2067883dc5458269be6c7428..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69438 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 delta 6915 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 diff --git a/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read_no_contract/msg_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json b/packages/rs-sdk/tests/vectors/document_read_no_contract/msg_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json index b52ddadb11031e5c97ae76979c79e6b58121be9c..d52913259fee890a09926a902a9314c27d1d9822 100644 GIT binary patch delta 1988 zcmYjS+iw(A9L~aYrlo~mwp>~$yKRMbmzkZjJ3G6jQhKwCu`RB&G&Vq6D;Jxzr9#9A z7%}?hgR$R(HdMJpQSm~PlHh|vAMgPYix7uf(|d-yfC65lO)A&|nUvi0a)973k55(8NS?=QA1G$R7LZb~WwN*G|44OhedOdgL^dH7#0AW9gtNkvfx;)Gz4Q#58Vs6yL zXw=47o`t^#Y+N4ZvsMFN)YzCAv9NBNjbjxC$_E_`giTy>obiN-)}Vuv!5p}@gJZ=8 z?mi{t*Rc^BbG-TJQXARL2F|W^aIn_Hjs_2l69Qs)4yJOW_-wmSuf4sMliN)ch8)Zc z7&u(x;=qu=91-M49ekMQDx`0XxfmD_I9=souED_1Wj1wl@+dwKV!C5#hlT8O z7E*PZPIrZaZ-;q-qT#|QjA4JDhk}TQBe@A|Yt+~`cDf48-Z~%EPsDJshyX@&aIHU% zq5K4j@(g@hE6~`dI9}+oac{kW`)vYyHrbd+3o2TVyRMBeIq%uzB1}m};tp;!3-mwf zDx8z~E_n$BXCzKlc_!RAFB?%d#38AS1w90JX+$?O2^{07$bNl%VoM5Vssw6Ac_m+; zCGxRU8YMk0zHD+Z#j}G24q3`k2CB(0Rn9Xs_jtd9)BIlAQr_l{$1U87I1nT)6+J{n zC8AKhJsvmVG(@STiI-i0EbT8EvQboHBD87)u4jB4=!o-g4sNfFVY?-mg%l2UNUcru zRi0N@ZR`{nqp>@;dedjBMhghTz`6R!^gaI>bKxI`(wctI@}|k0kaUHKqa{(LY1a3s ztHn%t_^3yt>)c5Kei}2jKmo~I9ws~zny5}Fn5o?!%Bo~?P0Xep$>ft-hjzu0+9DL< zcY7JVE(5QYL^#gE*>-K`g<_6S<72qQSjy1_)wGm}IyG1|G(xGp$oJ7)o8YtN zU~JwAXFi4wb43kkd_@Jp&u`-twUE2Bq(Az9$I5ecsxPkN;Ec}Ekz5~t4)8j)R(ds0 zGc(fgy>(tdAh6qoyPT;>k`6C@y4#`O7H;%>Oh`XIpTH|JlPZhOI92}IVak0A4_a*O z55_Sn)OCS0nnN+=i5w8#p*?I3Q9KV@%} zjinBn%1p-J!EH81Q%0bDpPXairN<==si(HDHRJ@Of<7`#@?0{BYiSSXyO*@M!S;Ou zms@ox9(l3(jIqvEBvrZEt5t69l-TH8pH#&&mNIaM%{a)WkbK|kB?8sCy0B!v!YnVj z;v+AN1;I%GK88CKoQs_N1(QF4@cInh6^xQyxzBX}P)AO4IIQfu(HZ zYiupKxYsi#^7|v|+23sFD+$gkPGWYMOS`nMT4xV=<(j6%c7k5W_5Nw$b=<2SluINatj zU}Cvm6N<-nsZZM&4=34+Bu)W-de*@Zdr?-j3erLqSeRu?{J@I6#VpC}7DkvUY9YcZ gyJ!l@0<$p8l*mNHR!Hp?WFyTV+j%ZF8eTm94}+_zJpcdz delta 2362 zcmY*aeP~s680OC7IlJytx7^fy-fg;jcRqgS>+b4wn~KiO%}wXNQq(pn3rRB#43gP| z%z@aR{6}k!pn@_SEa(rBtUm$`=1PUg$cZ3ixRha*2KBz@cc=8n<(&JTbKc+kKF{+$ z@3~8%pKganM^eJJ?pN!6Tz64gR*K6hyA+T9;#Rl}J+q22ohU{2P6Z#%(o2QzJGz(9 zeR@NF7DRkM2#RD1emhH9gXlRu# z*kj}I1`8k0=|g6XjsCEM$%Z%z{TTXd6{IY8us3dCvRlP|-9Yv_4JZ2quB7SoTtm?& z9ogj?o;+t^p>LwM)4@nw!Jn%HFNufKI?~p?k_v*DSBQ zgZ~=LY=P-kfr1QyiPb7@H(A)WW*mgDcgu9uRRde8t&C{K6`91GMxUj z&%1>#&K5fuu%Dc z&E1TV1~rq4BcT*^TlmJcaWoQ#zttelQ*qCW1q@8~Q1Y1M{k}$+v?!RreumW4id{HJC=%#rxS39YP zm2#+?j~^e33wHDT$809|%)Qf!D~7%yjY-N@GUI0~`nK+ikpG;LPB| zaKo^ocqc+YI6PP?Zq&yDx^}H{@NU!#Bq9BW>66-ApJCv^s&j#N)#TcksNgY@+C628 zz#3Requn0PM_gR$70L0>Uax}bn26i>D~oZ6qlBv9MvrWFX&{%4m8znJ)FVY`;n!jtduoVk^2PgU>58D8f(Hqc(9y6vQ=mmi z>77XE7+mr+X^1#%bb=9MTKmavh8-!9sY<5W!w4b6##utf$=ub`9^w5loks&sC6D$* zabuZ_V{1(;EOPO!N`jWY6sRuD5)q_48|S;M0Y;1V?1QoLOuTkaLg%&ztK27%tiBG^Xdl}2z9$JugE z(l~H!{k1C2meaGOgX}2K@T$Q~5xn&5Ws`=fEEk2V*_x{SjfBLp`*^k?neFCv7=Vv z!2n|8cuP|NDcFfwCWb|A3>)JjHr2$^%lD)DVOO27OBT{=4NMukMjvp!gr;~Qg!zDgmH5KSEdrLCLgg;2IBiH zb^ekb4<$!jh3E290yC{3{_OOWdfU>=;XKx`|p9`XTz2JR9%~AFh z-y+btR8c?@Dph5p39!$0 zO$_9BlHt2MWch}kIG?L7wtJ!E*|UFay?=qL;Hn)*MlKTgJZT|SX=3`Pas&aCPZa1m z;kV_Lrn1^%GfxL(fhBxNd?IHU4dA@U^v~HT{9RO4v#^dp;^}c5TLhasLoize#4gr3 zDuBjTo?Q{awtPZOXnMwwg>(JH3SS{U_$7%BMY`Tn=+}H`6Gfi5ILL{axb>!u;|+r1 z2qD~~%P)VH^87fGVI%J~6F21G4b*=+j_8=E_iZ(hn(;1Q6KHFE?D~+t^Ui(cVdx2- zFQIFc-3de=WhZS0O4?1&)U8Q-aKvyv#m|M(ous4VAp?Xezz`~kMoTIHsh1HHDBmWV`_!U|OpZ$)Xgl)za z&FJ=5sI8ZR5Z4VXuMiksL?*p48?8^-Nd7Skhq@fx5jN&FP@Oc78DCH->%YV8(V}f$ z{r6c&rz3O$p`?_t6v>^Ue>%8#BAttNaGm!dw0ZKw_PF*ih&UA30i;`D$b5&I? zK56psz~6kVIYz*gOgyZ%^(ARg2v&=$=5y<#LS5vM$O%@j`00fAhmUUV|icQqHKf>Uh~+`hoLU^M5}O0mg=B(@KTyDug!an#ZnAof2%*GC~iGQIzvCBvW#nkP2<#abSN$toix{s#fb^CsdPux zvyDNb?2h256+yb9K;`qI?IvE$>djrc*;-F;E*aHuti-qTBO8a40(*G;kYzrq-y$}2 z(n7}P*Y63meE3l_3eS%+qkLF{OZem+@!;%%RE%w$ih9d3e=;b zgTYMPWnQN?x|kFvkx80C1SLbvx=TT&x5F$@hNoPw!G-$3^V6gi7Giru3p~3bBW#D$2&0&hq=}^W zKq>nDjMI2Dgqw2jROzdqiMkFJZ4jKCKtaBq-nwHM0^0CN+6-RuoK%C|N3_BoMpp0Q zEINGLZit{{o0C{f!K&SfuL>C)fsY2ZP<6paPl<;u4L;<;ky%-r#_2Y=NYeu)ubFg< zT(uv`J!@mo!(t&#!sIyu>ntfmts}Y4t}7DUJ0GkFCU)tY22fmb|CMV(yv)In`+{mX zaxa#{>}C{8f4{9)^(dEn*<$?y5>BQo)4%JorM3&%-tihM2iJy(NB@%Kat93lQ&bZ7FQ&Kt=397f2@>J>MRS^rhV|;AoULiLq z`452Z-v3EB(#sPI!E5^!{tDoI+Kev{ti$|WDo@Ui>$YCR6B7&+^$66{iSjmvC@I!M zMpiKxHTmU#JPvmRjlhIrlB75MKJT`bJNB`AN66K@$v3% f*>V6wpJW@Z7D9ZVZ4~k!w7w>)Pv46LU$6fkgIUVv delta 4466 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 diff --git a/packages/rs-sdk/tests/vectors/document_read_no_document/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_read_no_document/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 808b4f01189bc76a5960f835750320fe8eb70b21..d438f5cdd3c70a33082da0d6fb21c942f97f77c8 100644 GIT binary patch delta 2559 zcmYjT4Q!O<9nbsGduhQ@ZCBcW>$OTvkN3Uzx%a(0`T_0nRohg0wHt*NQVvEIn1Ck> z(QI)roI0~bYyaB6Fqju3nh0XILRObB&n(8(ZF0_F0zs)`AsY&GiY@~r`#sNlM3W}X z-ShGP|9@Z4JvMR67YA+`E9j*OJKkg`lD1E`me$c#eY2LN_i7sG38R)CTU1ArhNz3l zJ@IDshs|;I=gU(GPc8*#Tg@(>e_5-im&}bJ5q$sK8FR+#OZIEj`(2aH)Y}wpviN$J zVbj>{Cf!)-((|>^k=76m&T&S&j1axP!r|dnnu~RdpV^`b%7i_>`yL}o!{HErS*klU z)*hny`y47%l+Zh~9o~Ii4^i(xR4(wk)rLLlYbH`_7rM#Wl;P0u zBO$8#z~#R`r~C9qo9fY`Xbdai5WSRj>1cx<9 zO&TWsFRY;DhBUs7w0#W<-F7Ta@Afz})hsx-6cXRQ5{*d~c~+<4aDI!1n%@!t&ZQem z#CTa`LkYch68c*QUJDhWaW}aM!$P+-*#H_ADKA?vueVBgX-!+nJpD0=$Cba-yE$GRS*Z$ zwoA1?cchmoyCK424+I7J7mWNyJTlbx_)wqr`=LI4&Bt65hkAw^LNr$G@<`h7M?Vjk z=kGj^7)mXvwj4fu(sgZ!&&ayhJNCY`wK(Bqy^@l)L)Q{teB?Mkl}&7Y@8 zrn33ABuLQ!FdEfRshS`w`_nL&__IqVeiwxj0=3b*OV!0vlk|^6G0MF!_(&UCUR)uQ z$|7V8=g#RKl~%+#{0a0j<-5G1#W+maJwE@bAA5^AtE_dl8lwGKM?ARY$*KU^p+1LS zyi=u{$^V*F)HSaAI`Gw?JloJ+ntsOTlmYRnSl^lu(v1M#ca&edqmB{`A4wzkkO3aO zG9yV7E21(6JkC4>`>WuQF(;+P0M4QH-^S2L(ISHZc%w^A1ZzO2^xLI{u)bL0j-2nhc*uHp1a!@ZE(d_Pug35D)P251!Vsh*U8{_-h#=!Xsz!xB zt_Eb83B2g1;gWgH;^r@ez=x~mK_2pj>HRdsZ!N=JGA{CMC9E$oR&xLMprP=Dwkd$i z;Y*wG1V6n|OLBfQNE*K8fjtpO@y2%TX3X(j5_qLlCmmBNq+Bg7zhWyq_|Qe&mZw6T zKBF%fT?UQ4+U-(ytH~FmnxsX}th$kpwE{z$G&oNA2LtBhPk=r9etWU@{~KiJvvN*j2i%j0(%jfnTRgZXoCvd-98Ik4q)ZS!qOTutQFIoJ(%|?pXoC1*P<}x~Ar=*m_ z{r6}ly}ild;&wgDU)w1_YfQd^w`hFOq>ob$A1&8yeyKd;BNzDUG4=xVFS zQ-9EXZcXaGn(GrekH51OxC$?rR9Ek)R)9^0oaQAT>S)sC!`tx>f%8csMeTECG}sx@ z_=&qpz&(Dv%Lu42=joZO^h%e*hz1U4X!vx*!`%Q|n+vG7!Z%x-449n@Ilof(_|Mls zkW`@qw*yEXhqTXG)V4SVlHUm+-ZL&wAJ+r!zobVrf5_+C#Gh8)nV}JB%_eI!02>fcolPQGv}bB@LH` z+ai8tuNKmqZos?Ff{Fz-x_qw32*n0G^@Z-zq-9~?E{(6Z_~Vx~m(Og3;zu3?xrhBM z|8`z?M3VH{bw!>g4Tbc}8W7Xx^2{DR;*m%6kk%YC`Ai3($$`^fap}d4Fx$;Y%}~C7 zd$CXB)&4Er2Q*V{U3ky?mi;AcDK6r+>EwT0`h0`8U;>|hx-=HOa$D7PU(52ASD~_r zf|lep%XCY)k3X~pDSE0tq(ohy`rzCtcnf1gJanT`*y_dxhlZD$+;}(2@tQ9h zu@rl;CDb%6+LHkD*A&spnx7@1$zp9rHTIi%wbG3Rbt;YU=Sc`JjxLYKI#5k==tk?pV0e`y^Rnn)&^Jt^$T_#p z=P9wbGKQ=2gD090YR}!_@r$#%t?H;booNYZdYeiNi{APa+4WIstXK0&0jChs&B}Oy zRewi2M{@o%M{>^|$!R}3lGEK!xNp1W^XxS(;-plSlo^TCi_C)953|(Y=F`93P&uWl ztJIRiH~*-oMSAhyFU}(`l!yD945WI9Y&y5hmE4V} zu-8#hF}A~42-B+0Sg%7#kMk`?ni1D=${pMk(D}5I5v@*3d7G|;p3sI>05Lba#!tqU z>lr@U3@GSP`8`^gaI8OZHIGk9PTz)^g9yH7Cqy7gk$u;twiSZVxLs zFxfoQ4QCc>Tdzu_1W)?x#8RpBm05(wN~uA@{hjQ`g> zjK8zT@Rb^{tz&Jqz_(Zq{6QBUNSg;g^>}&^WtTjTfJ@VEoL53n+F43+dsD)C6Xni( z?B`)tweo~)GV_6~$vC2FJXE-7(!=q7kaM}J8j&TIdCqp@o@7H(f5L}x({vU2b7iqt zicfWB*<-TBe17`|R^eB{dYt-w^(pKDiz|KjN~|R7CtkeuA30P!jYvJHC#6T~SdW!8 zlvMK@9ojEh#``jmmW)}h0U2s;Ov&K~_~g6TTZI>}AJ<1pEQ-MT1cq~5PYDXZvuK5f zFhidr#c#NxNZvju*BW>(kinrs900{0BTIj)N9_MszqbTm zHjTx{QlNZN?gn?}aaL;4TMc_C0A(jLVdTk=HVyyfSb>PHaEQ$R2fCnlx-wd6M zUlNSN1KW(($8N~jad{FE<7htA8qbmbxi;i}Lysis9-Yh3RBIx}brdFh5}W${bpd(H z)lO$C0Y3~c0L78vG8eCI75}2fWg|!t s|1S^;vP{k!6h#`3`PeEUt!m5C@3Du4ZrWwk(Nwi19&q^nUB>DE15mK3MF0Q* diff --git a/packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/msg_GetContestedResourceVotersForIdentityRequest_365e8cc19afcc569d90d85a2a371ad49d3ae7bc38d217d85b1570274493c4d7e.json b/packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/msg_GetContestedResourceVotersForIdentityRequest_365e8cc19afcc569d90d85a2a371ad49d3ae7bc38d217d85b1570274493c4d7e.json index 7a88bd92e080365a56c825e125f1202b9b181424..a700fae23a4a1cb706b7c5939ba259c98eea03d8 100644 GIT binary patch literal 56948 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 literal 60242 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 O@!pTtZ}QhSKmQLJC6K59 diff --git a/packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 808b4f01189bc76a5960f835750320fe8eb70b21..d438f5cdd3c70a33082da0d6fb21c942f97f77c8 100644 GIT binary patch delta 2559 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 diff --git a/packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_contested_resources_ok/msg_GetContestedResourcesRequest_c8608f7aed7bbe4ced03c9c23f1ce28a227def58e23c39e0384e0cc02fe6360b.json b/packages/rs-sdk/tests/vectors/test_contested_resources_ok/msg_GetContestedResourcesRequest_c8608f7aed7bbe4ced03c9c23f1ce28a227def58e23c39e0384e0cc02fe6360b.json index b689eb30423e876d884def8b357bdf1146883df2..a2baf750233a8c2c672b4eeb6ffc08bcd1c1d6e7 100644 GIT binary patch literal 78704 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 literal 95489 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 diff --git a/packages/rs-sdk/tests/vectors/test_contested_resources_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_contested_resources_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_contested_resources_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_contested_resources_ok/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/test_contested_resources_ok/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/test_contested_resources_ok/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_GetDataContractHistoryRequest_2bd2bfc3193745cf05fb33fd3e56d1c377e5a79c8bbfad2b8607feeb2743c37c.json b/packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_GetDataContractHistoryRequest_2bd2bfc3193745cf05fb33fd3e56d1c377e5a79c8bbfad2b8607feeb2743c37c.json deleted file mode 100644 index a3e90897235f49e34e7609e52e745afede0046c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173549 zcmeI*+m2nwktX1|_EQ+T<^_ufN$i)H2WT`J4U8Kw#@!y+>b^1j?(_dE(_~4M$ovAm z3q^7RC5ng4l@akDB697b^ta#r{`cSg_aFZ9*FXOGKfn8@-~TPY>~Fk$|MUFnkN+pX z`seFU`lqj7y?FogS1;dv_{F>LKm7d7j~{;icaOKfdvy5YGad){?omQ-KRoB*@%o3ikDmJGhexa4KKjLv zk4}5|*{bg!J^0n@M>+lY=;sd)j}Cc!;156S^8d>}4*u>>fBcU>{uGe@^S}P|r}w}4 z=YRkAzy9H)-~H=P|Mr)k{`KE}`q%&XYc_oM@bbI&8~)#4{`}v6$Z!7im;d_1b;RHE zczF0RzkbNS`}4Q?dH#9mue0dQ zi?=^^-Oo2Y-Wt$9x$6DeuxuUk{fl=$`_3B<{Lb|R~&X4GN390Kt3@X%>#oO1CcpBhm+s&g2H=bDjCtU8);wOWnO;gleH+a>? zMeq$0-yk0Iu;mTz7+5_71=3u^c2*)5m-H@bj;O5U7qXTA*C0%%G%5+K{JiGt^HaKBSh|m(EohZJVqixU(khhlL>wpFhUz-0wRkem}QEPZ}*kwm&aR2Q|fnTLb|N8y%!(c0#Vcpk%1QU!5^FVvO7wn~zC zvC9!s+ipqXnn=neX1Lfs;i2Txb}S$^D)l!px5guI7lrjjo`AQ=g~hq;)CsYwC9Uwb zA<+?`pQyVe4{%EIa6^Y2qHD51dXVUvb(~yMs2sFepy5n_5N;64B_5`{w-C@*GvdPP z5pf&Au8D*jq*ENTOK%k&T0x(`)GeObU6S}(U+Ny8vUx)4OL^spCXODmK|jwT>X1g? zkW{S#MB`7&Ql+&;;qEDfo%AEJ{Z0`Q$>z4|E;kDSx*-K?@+g0Y)7gVOEvV7@i%zZB zu_Bta6iOd{9!Z48Lhxn>@q`k29U<~>{3L&zX9^ZlqFYiWk@Mbyrqo&qS9?kjA8gSf zGop|!%V5c)3X1S#S6FPYQRPdd+Vxsqr%G~RO-WRp`PG&Mi;_^PTI`Tf8*a&ZZK2wB z%fL_4l8A>{kLB9A9Ji#xO)eTZVphn*NP`k7=vPMowv&b8T-5jpxGQ**lD;a5dyvzH zu2dq_9X))p)Z$M(iUJNfWp%Wma!6q0fmb4?ARWEJCBeFIWDC(ru~7OY9_mCobYc80 zQ3emGY8I2}?IXnS+k*tP9x;e2I+F6%z0-e5N6A9gCy|v4Gzf(cZ?zP^*7H2gR_3_- z-*B;@SxzdA!+cRn*@Bj`wiv8&6-^{ACy-V0n0TL0aI98KUN^Xu;pfqHmGFd`!nMV6 zPkHHxc%vY$##j=DRD$^IrcYH`jH0NTNU{*BcS}f!Te@D@zSj4kW7{khwVNzW;U%Kb z%WT<-g}}09!j|MBiR=pFmI+%(CKQh_s@xzC$$EKTvFRsUN({7-Zb6{SioBVmSy8y! zkODDb5g=s!`AT%=H4k9V}S1#C^{eC(BpXMdeLZ92XN9Yinhf_RFA++ z>?uJ|WWLu+KdPXlUoC4HjfLYEWo68*6dqWL*&{3H2?UHcGt@CLZbCbu*_E9Z@<3ZqiZc zB+lP>1h{5Rbj^B-f3+d;*wSx(9p8-VW)xMbs_vI6QDK8x;1-gXettx2bzUg#zi}H9 zQPxY!Em6iHIYO&y^$Cjvf(8?yWlOm#`ECQ(sv^T1mGp>46)s64tySnjI>lzUxIs3) z6A?G)mXsF}2}!8J%_UKZy4MyyMQsN^7id(e7*d5a)g$!dGk@i{a0j!^5jasS1mOsr z4U)q7!yAmu23;>6()IBWkzTjxTz7GgY^SG$P97N5_Iz>8S%Bm9R|_Mo>*Qj9HB8|~ z7E}GJO?tk9tMM<^5o%7knk3C0i7HahSaD2De5pzM%og5OByHC`cS^% zk5VX6rAippIgtvPu&5;si^!w01#Pxmz2JaE(qE+4_XvG=9jrysK}{#9W{p_u5!{l} z>xm%_M4oSq$`QiA#U-;Qyw8?SNb*W4yNN;cS{^z zNM6*)PS+8#C6Ezn&0-Lh4t0y+q@!?8)+dpb%X!0P`0(Q=i=UFE#WZK$?#Z_cLt^Hx zef&nT?nIG9cRE5`hF}aQ_rSJw9!cey`Dc(XdH&@yWPojRQlf2`)O-_Fu%>33Evc1A zhMHruNb`~w*_R%abrwtf4ar|etX;%I%UY+P3pnOEzTV7uX>OFX9wDcw?skPG z_x2;v-8#ZZyQre4q)?K`&Rxp8b0Hg9jq;dUswuNsv6?}$*`iayK1JrPZgH%wPy+Ev zp+BCZj9q)BOfPK)RT@egYh^%Cvs=EQU1`zj7`t6q^$qNO6D(X5$%PC@)lH1e!~6VW zAb32Z3yxc*b!xxX<@wxsof0Nb)P7TVuJWv|kGWUj-~`w!HjXre#r7phVP~OR2GYRV zP6BhP_Y}{CJZ*u(oS)?)%3>!cXGSM)m4t+(3tOBIS=7@KJjP$*p%pA5QI!Tmasv}Z z=sUNaMd*DyxaFlyr!1W?Qz8-?-j{U>YDsTbOl4{MyBNjd1J$!zkfnQzptiS&6;ul} zVGg+W3@5-ZTyEtOp(d2rEOLjTt3*#3&DDB=YOOREpJcc*9=o4ftJcSeBz<-fiC8gd zZO_nNRBj_7P+^zcCR?;q>jg6n?v|6)PW)JIi?losjGBATx^-Y~Wr>Q$>0PlW;QTBX znV^chfI>V`C#Oh?8jS?B_6cVB+yy0j+GrG?vK{e^!rqQa?) zk5!q<8?oIRsqNlJpwHgO_B<1#9?Ua?E!YuCKRG3R@TQF24kL=FC{RS*GLQz=b`scZ zZ17yZ%@K%rlEt*X)D_;6llS4IQ+#1Qc&jrJ5z>3oUm|UNgM?9SEC>$#oAo`y6Cp;? zyQv`%be;K8{X&_h8?eLY1p#cRnNCTnP8K z!3QcBblbf}=dr<6NM2U7q5F$08Yz2(8h*A6q=B`a1U8t;M!9e!9()uy%Z0|L;I5#Y zk1OBORj6eQk?yk=y%VOP@qQcnT;tRGcx<1XpB7gR(zzxLh4?eLblhjH&r$A~fAX%R zBF5J9g@L+h=;DfxNaUTL#l6Cg30|$myQ9EQrjQd3Q>Gw|S zb+G}h^MG6TeWLp;Y74k32zyYsD1tL`=!m*Zr~5?rN%}2Q>c})Q z1a_*?DGd(?+S^TZZDbORHDVdhT9%RX59+D9Yhe0~IwNk7do=OEbvRq3@#(0eDHx;V z4aTaEGJI$qI>>+v;Tg1a9;EK1#kdqx$?o zf5{f?-L-vk{=xUZC8|5A4s31UX|!c%2=|tBfL+xplWlc+Yu%x=x2H)|Ys;;Nmhmaw zc--{6cn#0TTPA|a6@Yk>#fnI%=#%H5R+C=ihzxQWv>WDdKpEtMUTRY%@?>&*#VNN8 zktzi^1|n?7s46Ils*7_9Vz+jg|HK?_oJ%V#{XL(bixB9eGorMQO>Z*A$1H1MeCQdo?N5})|S zz{#<<)--$zNqb_mBLlRkwBw7e*(z`P$?Rap7D^P~XW0`?o@y5{F`>lvJy-Ok(+y4$ z>kHgk+pmBjyA2)ppsr6(QIcfKK(Nvrhk?yJ*>lk@+;Kt)Kg&f{YymYfj?@*T_=vp@!Fp@Z4v0E$6 z#m5-(y;fL;H^RCP*LOiF(S4j2L`o{v)N>uD33^)GDq)KxUDQC7w*wTC#eL%a+$_5P zjyyVN;3EXp{EdDCl+gs5ESi5s2AF*pwRJ&G)U3M{bgNRU<3?aeXmVVOWThf7{UAq)(_MDL$ zOt5w{Y~5~2bz+o?$lOfn6x3wPz|G27hm43(1H5$>X#1tyeVqI4xp(`R3)8gbC^RtQ z(qPcKu^h_1WFbAVTSf-1Zq`$9BrrH+HrrXtmVp7@$2n`hVTe$d4Bp8x*BKK=yg(URuVkOIR z7!4AdbrZkw9QAcvE0iG%^m9*(71(7Bzt5rZ1nV2?dN9{DDjoixz-?y#IR#9FJm=Po z+6>YD68Hum4UqE>{yOKKREOV%B3*AWkVrc;gnLW+?RP%!uO4+yfv-BfweIqKIbwU7 zZ@Kl*vZ?Mo>_)lB>ErX8pUU*1UR6`)R z_2J=$x=oW6#xD9%iMqwHwnE|cYGrZWVrm7d( zmH?^u%`}@`bc&j7qmryivlB+i1X8s=zpknfsPo?%0`=I&k1Q&y2QRYl6f2Z=78GVn zlr4i()Ru83UxD!um{afrHG@N2TQ zCPs~>UpiuAAyKU@+$Cc;IvPFCmNx>0oTrNwk%6CIy@uP_?Wg(>jC<45uq&XbYb7vj z&Gt?hc`_-izoXWai}=7CWPr)@^@zzdGD?I<)kKg{LqSn_-4%!BmE3bgPdOeDwXo*u zQqNMtxil=Pl&FEZ4O*ep3b2vgKbScEkLnCwy^1^+$$8WX{jlq0JxP1=A(4xs0+(`4 z)O~J!YL#dj<^XP$M2YA5u|oMkue{VJQ3X#a&z^P6)fOuB6BEeXYjZVX(fB2vRa+WP z_LhM(u(rFr0!MQnoZ`9Y44=TrW1Gb+moL`I6*%&!a!F7g%x06en5f)5sZihSHLV|B zs1rVoNOOv`*KGxu3mrk94NZoY@SJ=pw|IQpL;3EKQfEmDIBKfrG^+J=>%eB6Mf`Im zGB7vdNl%&OLTr3aSCXWBZ)ETPvdkxbvKcrat!x>Xq0R~4awAKv$aP5?m69}KeR!Xb z)17i-lUy5UPJ5kywU2~d6Ah%sx;lZ- zT=xyX6^yHsu`930*e3%#_Tu3{>pZUvg|t>EF}J}SRsR$PZO@S{gQy1BSygp9l?kUM zy+2*Y#(Ai#ff3M>x66-kMH>X@NWDol9RRmj?52e8yYYq`By{ zgSYt`xsrq! z(&i=2G?`BF9a#rewNr#!4b^J%Tm(3r4TMg;t;^N8Sq!G%93fHdQ;=Fs1al$w^4v9e zjo>K^vYsF~(%?W-%#(|d=kF^9nrgX(id~F6Ox6Q48PuvAmiEy^RJo&E2JiHkU9()U zFN9!FVd4obR$U0gOV@li1#Qvbg{9HXfDA;rJfF0qqfusNdULLJ(GuN^nI%JHB1SQZ zUuGwA;1*wuv5V6bq@Lx2y!91kO&1L91hsMI7(n&SK+w+*~P7+CVN6*jV%X1(kbq{P? z=aE#NnSTcPlILGOLk8H+ClUk?K;n*>*a{jL;7h@TVLlP73fHVq?i6nQDre=(L$;8D1|6OzMru1;0V!_vx_D) zG)yym%~y!pWWyrea_u_j>N)MTP1nZtz^H;|firZk5)l{aW`lJ<;Te z+JDaSB&)1&u4@svYc3S1Xu_iL%dFV-gU*{R18GPb8U{9VKhK3cZGl1_ySDVljv-(C^=&TVIbi70~SSaizL2~$TV z9ORytc9f+Vzr`pPAJ`s8J!o=@SV6Tw6Xt+>Px4m8vXCMC8OkjTw0wmUrFWk14l}U& z3B3ioVJ_Z-bVvrb*LQJPA0v`ap2UiY)}EogsNA0M`=2W4c!aKR=mj(L|1Br0#*fe6 zSxDC1GLQz=b`qFd*(?{nfDAZ4%jJH-eD&hv|3JOj{{4a}>b_qvKjzyney5FIu4&Kf zf+;tq*l8M&$!&1SN&^z3YgE}HgUbD?_zMny{L9JsiomIGin7p^D6v^|zbeYCNWRw! zA3t18Qr~(Rk)&fTBGI5e(c1m0_-mu!FMO<6WYX44lMm;UtD?vui4bFV;>U7Zq*W0$ zs(~~x@t)%Ew40Hp@40Y``6{l8RNG+3@Ck6F3tHSX@8j;V&GIlXuvr@a}< zp3)<3c~4Z8krpOCFKu^H|N97Ztj*^+0^O9c%e{F9&`IMy0?CV)-BQIiH;#jGPEIKm zN(#MS zg?{mt^;ds6Xq|MMUOq++v#nK3X>UQtDE;J=Bu+gvQ4wQz7RNoM>vP2YDx?+jX2hHy z^shik;}c$m%9i6og;dO|b{L|4P_!5F+>6&?jfPv}V1J zt3p-Iq|p1U^{d0xFMjhrYe56btc9QR5@WTe>>hESwWQ0ptKMg=&pQ9NG;3*_+qy$5 z(AP)9cPY;8rb7zKlyx7pep^AC9&~TQ*UmMuTi#Z73ir-Jy7-DZ3r*&8o1G!CHGM=?8Bj+E~Q+3zC z^c!_XEospBIQ?`zX?!~BXbQ$C>36M6P|z#q(*PGn-PoYMj+;fLr#3?L#&6r}5Tzu% zy{!#KyA~GT4%Iibd8ykxzwg;wHgevw(_FZ)!9x2>wz#vI^Uq$G+(~sXqYgZcwhRs7 z-jWWm)0R}7QcD`>4sCXOnnbm>+{qw>+9G_CRq%Iz0~%`wc3d* z=qSMOkf^AJKyd5BQzCVnCOfc>!C;T4SfO;JABf2B_=-ghO{z4MHr9%OX#4|(DxJb} z`4pp3A>wO2S;5X-5ZtGDE(2;&@0;f$Lxq}cqdIPUSxnTOFiNOiwdyOB+jmukKoxOo z2vi7-A6Zl)sX?KWGgr~W`+N~*OO!2xQ`E|ECSQSZi^(ZB{k{mD4F-(55Fz)QfIfnQ zc``bs(2MzZJ^3>+M4ntAgdw!JY3BK^yKcmKs)!ocpydsm>Iu>h;sW}l(Fhz&5(*wa zAsXI9Zj9Pw;tFH6>!q+NCFRod`^>TQCPs~>Upk^FU}4vmrx=Z%XUiLbLeA60!jmF0 zXlK_hZfCcj>SwtOEQmQAP}H@83%2GsFo1$Q;h87#Q#_ZSXv#(0I|${H=j#!ZX=IcL zk*bLxqlSW#Nn*V0B<%?nE{X~q-KVi|sp6>FE#6rgoAzQ2Y(UykE(3FWo?Vilr^O`+x&e{u z-pE)@qS=8NmL8(YQEbR3uwMZN~G#KwdRD&y}=RC~EY1ajM_6 zpOochw6Tya!|4vq)2gb|skS71$uncPwwNfIJ^8Dlhai4aMd#sUt(A`ke+>rbR=?=S z6AmWQQ=a8e)VrbD<{*)5$=C6Wy~;&`Ri}+-s`-B7Q!vf0vb?3t+t`PpB;g>altm3=CMq0z@ia62rGcoV)79 zzhS0i7IH3q5h7JF9zlhwgkyI~lGN%@7uWwDuBW8!DoL_Sa^D)!Tyl!Ys<|Y0$t8=a z2X#GGxLXF_r!jcf7eZpW+8o7Fm@282fL;U@bezxUqImN4$#ygioVFmhtn+Q!_+}I}#tO4=rhe zCza=jl$27w=2Jr?Qh6KD2UOR_itED@>fJiAH0y*URPUB(mdu>slVFrin}HIK_TSc1 zJvsH%!3J%x3R+knch$~Lf+_p_TGL18727{PtvM|~KI{20JM&MT^sb*V{jfd+>g%<IH^(*&zEdzRk14< zK7Tb(_ELGn!-1LNMABNJGgcrf!%#(X*~*o^UQkf%Jq0#VpAo(4_dC2wZ+r9^QIou0?R?@hs)twYgun6; S*021*&wgwFBLDiAzyE*4N3Spd diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_GetDataContractHistoryRequest_3a0865545cd724369cc2d2609bb95ca435fe142e8f54b44eb829c0459d33b288.json b/packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_GetDataContractHistoryRequest_3a0865545cd724369cc2d2609bb95ca435fe142e8f54b44eb829c0459d33b288.json new file mode 100644 index 0000000000000000000000000000000000000000..90d1adc3ffd59ae7280a2a42659ee0a4fb2134f8 GIT binary patch literal 172100 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/test_data_contract_read/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 808b4f01189bc76a5960f835750320fe8eb70b21..d438f5cdd3c70a33082da0d6fb21c942f97f77c8 100644 GIT binary patch delta 2559 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 diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/msg_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/msg_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json index 5bd4cd1d7899d037456b04da7e71f871ea8ffc0f..ea8920d5a0002c2c4358e1e56d6db2a12c571830 100644 GIT binary patch delta 1988 zcmYjS+iw(A9L~aYrlo~mwp>~$yKRMbmzkZjJ3G6jQhKwCu`RB&G&Vq6D;Jxzr9#9A z7%}?hgR$R(HdMJpQSm~PlHh|vAMgPYix7uf(|d-yfC65lO)A&|nUvi0a)973k55(8NS?=QA1G$R7LZb~WwN*G|44OhedOdgL^dH7#0AW9gtNkvfx;)Gz4Q#58Vs6yL zXw=47o`t^#Y+N4ZvsMFN)YzCAv9NBNjbjxC$_E_`giTy>obiN-)}Vuv!5p}@gJZ=8 z?mi{t*Rc^BbG-TJQXARL2F|W^aIn_Hjs_2l69Qs)4yJOW_-wmSuf4sMliN)ch8)Zc z7&u(x;=qu=91-M49ekMQDx`0XxfmD_I9=souED_1Wj1wl@+dwKV!C5#hlT8O z7E*PZPIrZaZ-;q-qT#|QjA4JDhk}TQBe@A|Yt+~`cDf48-Z~%EPsDJshyX@&aIHU% zq5K4j@(g@hE6~`dI9}+oac{kW`)vYyHrbd+3o2TVyRMBeIq%uzB1}m};tp;!3-mwf zDx8z~E_n$BXCzKlc_!RAFB?%d#38AS1w90JX+$?O2^{07$bNl%VoM5Vssw6Ac_m+; zCGxRU8YMk0zHD+Z#j}G24q3`k2CB(0Rn9Xs_jtd9)BIlAQr_l{$1U87I1nT)6+J{n zC8AKhJsvmVG(@STiI-i0EbT8EvQboHBD87)u4jB4=!o-g4sNfFVY?-mg%l2UNUcru zRi0N@ZR`{nqp>@;dedjBMhghTz`6R!^gaI>bKxI`(wctI@}|k0kaUHKqa{(LY1a3s ztHn%t_^3yt>)c5Kei}2jKmo~I9ws~zny5}Fn5o?!%Bo~?P0Xep$>ft-hjzu0+9DL< zcY7JVE(5QYL^#gE*>-K`g<_6S<72qQSjy1_)wGm}IyG1|G(xGp$oJ7)o8YtN zU~JwAXFi4wb43kkd_@Jp&u`-twUE2Bq(Az9$I5ecsxPkN;Ec}Ekz5~t4)8j)R(ds0 zGc(fgy>(tdAh6qoyPT;>k`6C@y4#`O7H;%>Oh`XIpTH|JlPZhOI92}IVak0A4_a*O z55_Sn)OCS0nnN+=i5w8#p*?I3Q9KV@%} zjinBn%1p-J!EH81Q%0bDpPXairN<==si(HDHRJ@Of<7`#@?0{BYiSSXyO*@M!S;Ou zms@ox9(l3(jIqvEBvrZEt5t69l-TH8pH#&&mNIaM%{a)WkbK|kB?8sCy0B!v!YnVj z;v+AN1;I%GK88CKoQs_N1(QF4@cInh6^xQyxzBX}P)AO4IIQfu(HZ zYiupKxYsi#^7|v|+23sFD+$gkPGWYMOS`nMT4xV=<(j6%c7k5W_5Nw$b=<2SluINatj zU}Cvm6N<-nsZZM&4=34+Bu)W-de*@Zdr?-j3erLqSeRu?{J@I6#VpC}7DkvUY9YcZ gyJ!l@0<$p8l*mNHR!Hp?WFyTV+j%ZF8eTm94}+_zJpcdz delta 2362 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 diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/msg_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json b/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/msg_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json index 66d946dbd8bdb2b064a696b9cb72b2efa958a5cd..2d48314a41cd1a703526fe3bcbb8250b6a074b7f 100644 GIT binary patch delta 1957 zcmY*aTWl0n7|yn{Gqk0p?SjzK?e4bPvh7^X&Y9h9OKBHMisaVe9sch|J013~--F^p!2?IB}OpKS?7;|+T zikrynG7ub~u~rQ~Jn!IYl|aW54YJe0WU+?Y9TpyM4dSM0<5ZrGmR^CTTE}1WaINsi znukqnbOgqSbX*J9;`S;vKinv>Fd>ks)bU9}4X$lgv+y0^ zSJ+)FDzGu$ClOvI@s{D@b})hV^=f`!Itj1E#?1wScnD&;KY{(ZE}~TT)oQB0Pu0a- zT_;?jN((P6cW^c(W;v92Xq$)i4TLk1>uO{z(8`La;wx-Alo z!!De9Ypw`%^zd0hyjV%kS`97BB^pLezmBtQDP(sF)QymKyEM!&e&Xi!q(qlv;aanU z1b-K!B|Ac zQCs+uOconxBe{<^lRegX80!t2t`b|v2|k_q=T&hcnMm!} zzz9d8q;t^0vQ6hu5RrI)yO>z2B_S{1;l$G}>YpT&kVzY9V=g6oqrizK1znI) zltC>v+k_=>g{rd4#J|}*S|w4^|9=5%4O&i&ozAn#Bkcbqv;k{2V~Qzel`-y1%YeY2 z-!=CaocBoWx?V)GKlu1=UvNqo`e_*Q<2Qgt!c*Z1oc7TJZHjm%1V zSefUdp_H>B$#p5bLiuHUe+{OvCT;rs{@p2voA)Tu+Xe;h)CtU&Vr8BvE!k?o70?7UDo}t zn~g+iFEYjlrIuf3VM0ajQj*Z`)Nr{^oy9R`OuGx2b%|-}RvcB*XbyDDYOuZ0;i=;k_{TY>y%@AwLE z3hmW%tk4STKg=s@H`f>E`sUAskbQb_J>N$`ywhdl&DD~e^oV$4-?dj*SeH`4_%Oom zH~o(H+ZGG^sT*>4&h8{pQ=~_CnpzpVMxDr=f9qQHE;}U_Y*+8x=`Y0jwo*tBIYGRd M8>0&778`r_AHjr>fB*mh delta 2356 zcmY*bTTEP46wQS@_d=nif|a7Y254c1`#AUBnE^UFmTH?0PztHEJOZUujq%Ic4_~Qm z)c8uQ$kH@g)Fwthd=(|}5z|VvjUSrEL=)p97Bw}g@xg~*YFgJhXK3~7aPFLQ_S$=` zy*3M<80UX5=H4<&11H_#q%%&0pe~MYjoZu=x7e3$#_dH7FgxRTwMfK;lMbC!r<3Nd z`ilCJPOFciaJ{xTk2O~};gRC0;*j5rlInTOoHbC?8sNvYkH%6Hueoxy@n%Ng@UV-r zejo3Y?nT3f0ISD*EF>(Htr2KXxmYMMQI!obnKLn6pHTN7Z0G$R6E96gSX|-oj0JCy zXD{9Juzx7TbiyS3|NPFk_C^`}Rqd$w8>f6s*O^#aEB7XPMg-m2pjwP=t4fg=UJ|GHfCD|?wAVk zc}IYOb_>Pa_wNu)G(s{d^y5~!5n!+;!0|vRC{N|MHVDjZ(5Ws%8cztmYGHGXzqOdS zxKl%K3|tKGtVHm7cM^*mENmNfutanhYFPq>#9^6J7_ay7ePcV0Wn;*WdumO$x>(9F zv*dr?Bid$SxM57-Vug9DY4gNu!079Q(O zC=Au>h#_HPvfjbmCKLIgBnBE{=)1||YN3uaE^e~1a>~I(lZR7z7th8+o=xGaJ+cNi z@}YytP7@#O78tA)IPInJ?GW?UInR_!rcJUmg1N0WE?g&{3g&0yFO(O4NaF9>2q)?# z8zy$t__(9rEXYC1QnDg&O^XkwJWw?psB$4%Ge%}+B84|H1k0k_vP&1~qd`soXsL@Y zLP5Y8Y#AdUp7|%zXMP{nG|OWD*+eNY;5o`=h#He<=Yj~|tM;mCDlk`Iq|2_vGWLOj8mH%0js+9WsH4IZ}LJSBTi&?BU^~C+dH7@E{tCF1o9^^_$Mh4wCrqQ!f;K?n5 z46@nCzGP4`Z*BH5UMDbJZ6ZcIx*#qdUn`JE>ArY%o%|ja*i%U%=Oy8{S@XZ99**MED>OI9ZxWb_1eK#}{$9I>brinzOc`2GA3u${R9g%a z)R9)D*0DDzu%psb{y15&3e&!c{bfE@?=f+Jx|{HIbG*>uL(mnDt(P=dU<^ZGUo4>g z3oPXsVdZXB@rzW>z(@*bt`hJP`u27?l6p*|lk+ab$zcb-c11Y4*~4Mq(%7;VzK&gX zC#k)b5s6V&Tk6llXFLBtNPeO2p0)$z=v)iLeV%h-ev_-XoZYNvh16xP!o#jEt>;;C zzlAlI4S$|J@^Rjy30%%`DW4+BI6LjrHrWlOxDX|AXe8nd8%Nu;4yv*dmgw)xb6|BC zF+zmbf>kQS{Ibad4whj(sOvResx^j&R%wl?ND| y+HcNY&1qPeaJu%=H*9>_FX#jDcIrhcEGtmk=%c(W!r7G)tWnaedSTt(qyGY>Tp3sZ diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_GetEpochsInfoRequest_00f51345e161bde17d0b008310d7acebec137640ed9cf550876fa1ec438bbcd0.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_GetEpochsInfoRequest_00f51345e161bde17d0b008310d7acebec137640ed9cf550876fa1ec438bbcd0.json deleted file mode 100644 index bb2962a8d17e7dcb897e14767004071e8afa2d45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72256 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 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_GetEpochsInfoRequest_f2de0b3a0f07be2fcaffc191580984ca19dfa687bcc622265b5e865021b90993.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_GetEpochsInfoRequest_f2de0b3a0f07be2fcaffc191580984ca19dfa687bcc622265b5e865021b90993.json new file mode 100644 index 0000000000000000000000000000000000000000..4e3e7308edcceb55d05056f1788907a729ce512d GIT binary patch literal 75421 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 T|JlVa{KI?ST3_UkKm71d7QW`u literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_GetIdentityRequest_24b7371202615ecd290e0fe7496676f04dc30c79eec5a5df1ab5b8d8671ac38e.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_GetIdentityRequest_24b7371202615ecd290e0fe7496676f04dc30c79eec5a5df1ab5b8d8671ac38e.json deleted file mode 100644 index 5ba648577897ce9dfbba7214733baa8e528782bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89196 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 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json new file mode 100644 index 0000000000000000000000000000000000000000..866c0f5b249c26e540aeccc351a6264bff01a525 GIT binary patch literal 69306 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 TnUAnO^NUY@biB!5-@gA3GtEU< literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json index 9a75187088b1a514e95bd190b46f9b403e79a6e5..8ad4af10d199a2b44bdb0722f08e0bea84860c86 100644 GIT binary patch literal 71264 zcmeI&%WhuB5d`3@{S=1RT=1tzOY}?R0fHbf93?SgNP%Q~WBA=uH8YkdM>6M|Sbz`& z_;n#Qm+q?S>OP11>9fy2|Ki8zuU>!q^2HZleg0Fv>^H98{5@a2{{HJ%-~Z+Lzg~Xx zk9_;Z58r)vHJ0U{zIpk>i|_Nz%bV|f{ra2dFaG-Ni@)c)fBX8o*U#Vl%fDW|{PB6d z`~9mQo{#-M=l7pK`}wm!eD>29fBfecU;XKF^W^Gsef8vKd~UBUmuLC%H*2r&*EL^W-9OD=ug4#k@zur&Z_i1X4Yy%lHLT`$9Z_f!tjp^>{?oy!g_kMy{ zpvz|jdUweMR0c16l*vkytN$?5Y9&e=<{c9*8wTzmZq}sbAjz zqPF7uE}ett5$E0Y%K5#Dx!gonABr&FF9f5Gns60T!8{P=`)cT2DZYzj;mf~2UR=LA zq($+Dj#b-L>Z0NyS--mCzF&X1Rvz3_)qDtw2g|0(6xLA!`&+8V?ely1PH{a5jMook z)K|8nO4hw46}G*lS&u^8-!dipxUoFUedh9LW&dhRKz_7BA8vU%tYtg*={Ng{Ppo2B z`&(+l#GunxPo=qxLsuzkP*QOF>Dp4r?Tjt{3@L z8;MG`R7C!*(PD3*%omfRvOpzDJzI&G_4ZYkrmeu&T*$(BbS za2`$w<7s1`j>Vu{QEZd=qmNAwqFM~fEh{iG|6qlrSBE6{6d;8Zrxl=@b*e+IC>=T= zX}`c0){v3{IZv(-bM6&Vdd6~8bYthYBE-|`G_ zDoA(-91z zO{|#r6_$mC+^pflC^HpX(aL%d90|23s+PPQyCw(aLZ8L z=9c(Bjsfj5f>=RDb#+T_k@nXuI=ANveXPSuB!A=T2z?TN&(Dh*p}Q`gN{Z86?hMx0<@!r4&l90NmP`Gj`TxUW}ydum@G(&0am8;>hPf0QR@5E zr#4ce6TfJqDIeHKh)`hDUZwhGBK>{a+b4adkk}4(wDxiBP|=}?q~=CC*Pr@n>1922 z%*aC^D$D8n1d%_U^a|zrAdy*6BHHR!hR?1Sth%1)n;s(7nkxz~iFUM%{pyZLPMj)? zOCs|YgDYH!<@SnHhioZ>m`Jw>9U2c1ht1-EXmcBU-$I>^3bR8m7G~Fzo{yBK%87j$ zN$5DQX4#WQjx%BE)u zM7d=ta69qYuT_5CCFys4JV)r8iO`nZQZpCCR$!7#0~;6ZtLwx+Q?QcAjEeerw;Vh{ z#}*{8MT#I?Qifmv;VCew-=tpzWJ{y+7YNnlLHe{MY9X&qC6X6mA8atx1Y-{RN-A4q z05A%0wqK>BDWsHy<#`Jfg~XGhwpu_RXz-~Wq3jUV)Pf{#g^(1;{Su6JJ&eDNl|q{C zszhX$pjxYpY3MCkPrjt0O;mwPtg<3ZB2uTbe^Da6C4tE;+0tDy<*xokEiX=}0@fOt zW1HO4tfjvcs6-{aN4kb>&Zh#&df~1qq|B*0unQMbomE7!lQruyDLpbb9aN+iiq8t9a&ol^oh* zZ@~$?TcSFxxHytX$K|L{yBYhQ#SV!p-x@mC_N1eC& zB;_icsvD>Mi4TR8E!x)Smi|sJ62mp+J_kQ)TTwV&5rvDK3U98Ekh(=l&lOS>Eg}hN z8WhpjEOLw3V9(DuDii6tMG9)(!XySRQEvmoKFc9RBnWS%C|Gqp`FVySq;Jx}wm@oE zlv3cxb?L@|a6e@|yzAp>N<`)&LN!h(&e^EMb2RIER6Y_CS6t4g@=1k?Dw1-umWu0o zoi?#Z8xLxUQ%I+ftV?v}E|F`orP)Kd&fKN(BqRmat*NsF23FgbAt#G%y~Y!4RUW9Q z$^#8>mZ}9N?$q;LR7Qlb+<4S#@L^}BoZq2T(Vg0Zl87jQt_1BB+pV3Boi!4TPyw zdrLf4NNF9B)F&f?a2XuA?AzK(L;`EpNnaY}yoJ=#M5xkbapOtjmMv8jqD1)?)eHuL zYEz*85_6{YsaAn#u`FA{a(CgD1CbY7^#o~TGYew8{;6gdd5Gt9@pP*FN0LM(K=u4I zSxF>xm-qdUVg+=5bW3$KMMzGY($g7RN410Ynyl5M(kq3F(w)F?%haJUevpek9wrgd zNpmM1(qix3wZWtymOiVMMA9yUiPUV-(z`_qP()b8<_g+^gZh+*B_3c8{G5O~m|Nmh zYHkssI!~lax{9LoiXSW&xtB@ovI%!A7EDl^f^bvzI5w_frC<94z zSMwok5Url|Jm&iYy|)i~uFd?@||L-@xwReNH~Egzgf3hD6weHNq3IY~wus}twbj7qO+0t7ga%C`q=@zM0D(&gaq>yH<^oauJ z`KBoCs?(Xppm-`6a#GK1?lMkveX397(JdJr)y$>9*A>|Ks9)3rrHI<@)ix#N;A!!P z0*Xf{uEEAIwdm-IbUHbI`HX10!lnwvPFIx%C{by*XyIV3H6#(D`hk`J}Zv0l@!S`e{nQq>YW^%ABn z6E2!0*A_{?TSUgCK3mjSWIY{T?$l2XbeJuIYEcTRqL4*|cEhOsV3-lcwV>D;Vx(dV z(|q>dLsm{iL=+|Qv_k3pG#bKRNSZ*^>B; z=z%KxOm3m5atpcf%d~;Xz5^(3tca^Hi6|D z$A^VxAyL&6WPP%z&IPDRgl_3B6$w^HugDhZ`w?Mmfe@?t2wXf3&XB};nmBb>T8z_j z>pJmh{2`7|4a?+dr>JVzuq>vZ3szO^$OWE9CL;uIt~i)3u==8tN=0m;>cSVrwNOGh ziOVFpvJiNiwXCl}=}a|9-xoT6h>Mp75lj+1N)96f}azS~X%)7+zWv4xep+|rsAta=4*sR(7jIJhEP z+6B}Z+)Qd#;#bW@{U-&5BWrIV()GncfD#5f5>q^Ao(omFVmKkW`pKX^{gxVsj?`x!_ha&*VM+gT$h!J0d|YN z;)ud=`f4K5D61v$*a;NXT@w!@(vq5Wu+=)sF4@vt1m3oL#VYWU)Pq$%v?X+l4x4qd z5TKa8WKAN}l!rWsi>9E>0{cse%SUuxE;3Pw2&ZTb-XuJF%ri z;-W-f;<0uXu1QNdpQ<==N*`A_MdSi(>B~p@c)19DBHCWzxrA;;OdC2z)x-}Nk%nFm zQEUgi`!!nzb;8%`$oV3wDuhtV`K0p$qQ%o1KNdwv~aa z*7qZgdw;Q=EXY{*L2-Vh1PP7F3zZdNLW}Dj`m`9#QCF>5k$TGG$Lw@%%v=M-C^uYutcUjrip$@+YV#E2Hn_C)GFLuyncs-)1*r!a?*goG)R0ao!o zbcFNdg(5ed2!IKuP9o+rokX|PNd*7iB2hIFlG&&Z3TY8XS%^)|6igT+YfU^?P#^Dl z!S-ah&7?{X)LBnNWUinY4CnI}5yg}9#hklX>UtHaOlv1waJs9)1C(fK7KP=WcLJoP z$Xn`^gw*&ErJg^4+HXMR4qtgqV3`XU)pA8YpTYzpwQpi0<%mTPbi6nMlgJ4ZTHNL$ zuq>OR;7775^+2jybbVQq0%=GwH<^nH*ZAz0VQ-OoIqMlxQHV&B+dIffYCQj2!raK8Kiz%d5#6b$k1!tY2J9tV;E;>-9l*mJrj?8#u zAV~pBH6q+MGzx}Jw#8He0tl77#Vk1YWOZG^#5^RTiW6%52L&ij(rHJkwN5n?ktv$Z z4WD+)avo}=(Ub^$ncT8fIb}WmM7UQ7BVF(RSFpL0PLc&V!0a9L*gK^qjbLI$yjSqr z3qpt3LeCGpcuTh+!W}c{mV-W++|jbCUfELh%5YWEBNeR?F^8TXtfW91RV+xdN) z-5wQ|qA04As=7xKQTIq`3l~j9%{fy2lrB)9 z(v&5z!X;O9u{c}L597jMiJO|)uAY40^9kY!ZBa_nWa&mn7Ni{kFu}2q z48aCSu^RF*ikTKug6fSH3C;}r3TYvv(MaQ<$a}uD06Ltij86WaUu*+R9+RnWO0h>C zG~ZI>Jv>8&8hGYy5^ZkLpMT-V-LW=_NS%f1vGS}fJ>nX6PSDd7Wqmwl8P%nu@ zS5{NgtMmJ|y*H|;S1PN+iC|T_>HMhIU(A*cY9ILivp|V%*LqDnxyx8mMalX_H+xk=lH8S_ihJ->&;`>Ce_AN!X zv?|uoE%;87JvQeH*A40HnNi&%q>IicR>q))G^d?yH)wOw(#s^Nja#osX$Y{Dx?C|! z!?x&Pkod=31av2B0k(2FQlQ!nt*61G5N&I~XY0c84 zTDBDhEAw{bj?#25b=-)8Ya}TC1whP7TcIXF{5#PR7JH&DR^2uT>2wf z^rzyY1jwhcm=x6kN#6-jnkfev*xDm#JqB~R{@{P1ng6xseseI(Fmrj5Ur+Pvl3)Eg zf4{!Jy1&aGw^#T5m-*Kxd4_$~d+)RIu>fWmtGD9R)G1M(=@$EB;Bz*UTgquh3uKBC z=@kbLIFfi|XNXz=DHbGSPa&1MsK_^qdi>|QrcA<^ zldy!;D=@0ckBo83PZP=eWa7dfOQQ`|VBQN!R103&QumO$hzM0A6`_b^nRA=U@7S~2 zk@~B>>v}e+FK6p&3%kBtoi(d~M^+a;)mLg=M5#VFjyfh*E3~)~xm}8w)*om;Thz0? zD4RRFOBIcQm2`QUZxIu`i6^;BB27GMr>J7y;w}?g-LllU{hF9i*>F^R0r(_2ed|oTMqoK ziQwa!23GpCps>bgHJN&cPH6V8C5lmZeLezjdyQa4rBSKRk9GllLP{5)4mb-+fGXpW zF42){LTAYNWklhkEy+UQt)kMGbxUp$Gimz}Y?rP`x)F&mp2X`sgzdnJNH60URT-hE z99!c~;$L+{eLwl;BXa63c_x-Eo$*9Yy#f{6VO2s}Sc$WBORkVanuXZZG=zPRYDh_3 zu<8||PZB@DHg!QdObP_7KP(q3t)^frS(NL1D3JiAx($QGc<83}!xJnEe7c-Er^Z+M z()jWU>-T&~mT6%8P^Uk_xz5o!J56K!2xk|7`~c`#cIH=3y1&m~pU$5Q_2pY$yv?5s z{dYekYQ;)hnkpoGOG)sR3JDpzAia6tj@Gjhp?3s0gjHB*>)kTo+IQ-;o|-|dK}N$y z6zk>zJz9^ibsGPH@NoK{6az|OLCUS?$23IP-I6TO z&?*n@l-QOUSZ?tO()44SRNAfU-?{UB_`ftJo3^|6 T{1odw|M1SY)))EX&p-bgiPh8> literal 67106 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 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_GetIdentityRequest_24b7371202615ecd290e0fe7496676f04dc30c79eec5a5df1ab5b8d8671ac38e.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_GetIdentityRequest_24b7371202615ecd290e0fe7496676f04dc30c79eec5a5df1ab5b8d8671ac38e.json deleted file mode 100644 index 5ba648577897ce9dfbba7214733baa8e528782bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89196 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 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json new file mode 100644 index 0000000000000000000000000000000000000000..866c0f5b249c26e540aeccc351a6264bff01a525 GIT binary patch literal 69306 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 TnUAnO^NUY@biB!5-@gA3GtEU< literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetEpochsInfoRequest_7cb414646fac25990a7ec6f920b332bebcab89e518be8ed54e76a7267ec2da52.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetEpochsInfoRequest_7cb414646fac25990a7ec6f920b332bebcab89e518be8ed54e76a7267ec2da52.json new file mode 100644 index 0000000000000000000000000000000000000000..2811750699f46e812f7d6955ac1faa489ba5b31d GIT binary patch literal 69758 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 KZ}P|A-~Jb;{I(VV literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetEpochsInfoRequest_cdea72fd4e08834ef8a3e6a0730fbcae54b0dd1b499fbc91c2c29685e132a339.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetEpochsInfoRequest_cdea72fd4e08834ef8a3e6a0730fbcae54b0dd1b499fbc91c2c29685e132a339.json deleted file mode 100644 index 7e140b09a55755dc32bf1f10e13bd826503a93b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80006 zcmeI)-EJMn5d`2|>nRLf^MZ#WZPPE22MB_|aD>DNU>ow!jp27s)yznuVv(G0VO=Cy z;OK|s%uaVzb#?EaBmMf~v(H}s^7_q>-+uqy%dbBBHDC4{*YEzGuYUaL>o-6B?e!1e zfAi0L`*L$N7Uc)ueE;)zKlNMhzVr2u-@N|r@85p+k9_y1H$T6A_k$naeE-Yq_06&U zxBULwi{D=S>BX-v|NO6)U;X8B^Xlqyef8>Qyl$^9moM}6C4ctsclmpMUHWwv-Co^& z*>xXodbssAKYwb~yS3N%>zL24?!U-iug4#k@zur^-d`tSHr$4J-BcR(=kJ5)wJuk8 zUtHadZ{BwK+id4W9{zrNb)UFKy7RjCcjG&`>WH#fB+{N0n6j?RuN!|uSU-6tqTBnc zy9D)lgL*ccNktHUd)Dpy)b6e~_6LiJ&BS|z-W2cNUndYXrn{?L@b2a+6gIvI+W1a> z)Nc*}JRfnCI>l4b^u-_(t9Vb{-|Hxzg1iD{gBSV z^N2H8jJ+R`%jG7J^gOYRS@7Ev8?sw-z8jnKpyTz5*cBTQq>;Cn#rSi|N z#|V9J{pphjvPel;R4Kt{>-#}qcduHt`zaLF)buOcQj<`ihLKQUDZJR@{+3C4U22=b z$++bbyMES`9x{@|C5wiXrl46w@Xz*<2T?VJ(SQuAFrw-btPbQpYq04c=~jkGTxx_C zH|q>0T2QIkO(xmHKd9Iwe`FzwM{I%(FkfN)WsAbGvsTGu{ zM6tyxTuTv6`u6E=);WcWA~vguj{#YuBDZNsY06TqD|ca}O-?PKY|MLFp+;Uo5={2Q<+Yk=Xd>YkP)l zNJ&A=x$)0k+oyEkQPKmHY?+A@Tv3P$o)aH*lQY!SMY;`1;Z1djSy7FL0z$R%AMm$q z5tQmwl(IPCQiT>#S`1mVPIrP&Qh*kp!Xe)iWTu`enEl0;CKqvX_{@SndLf`b!263MuQQOICyw&m>OoFNQ*l>&Qvmpma;()p>H)L~;r- zjyEGM3a!3~Tnk)#Rkb=0(6#iOOJ7;I845WK$61Ew+;Nl=^69jtR!d_;3KkQo zClDivib6^XGGLSorB8?`s!3T;np>3aoDIj| z>nLix_C2tPhyuGf3PjuNDMClH5E~(s5=>LjDQoI{yUkS|2ab?ZU5Oxl#TG@iFQ;By zv{7LY(Yb!C1O2~rOUhHOs#rDqS8b%G|HATI6yYi4=_SaKTaq*pQX{?_X`&3 zXgpG_3s}jbM-0;Uv*>!EyX%83)@*kn<3!)YDyLZDsSbq~ogrp*0N(v98h=6(ODsxx zp%ip@LO8HRcnn-Bm9<5kgvypgBHT6j z?K>$(Mzq>UWWBmQrD=;(Vszh^dWpRdO@d5mLN99kdPI6O6(e51dJu6Y7-j+Is{*Ti zLGO;yNE;H)0No;HRbYka3OigAciEy*jV&bFCPIk^SV}zWvDdUtr4baR15;}Pqr?-H ztZ!85P*ULKf($T6pw4>}A@r>*NVlG~p)~7)x_{&(DRgn}Oi_g0g{Ke~9Vw-hXc$o8 z(J;_Eto?yXN@g;(e{sS@+1w9fN`+hVIUqgwKj_wfHv8Z^6IEiZmaAjxIUqg2{P!%Z z|J?E%koNxL({^xi^~n1ikaqu5*>gbJ6yg8nfYefw8IOjCPdiY_^h?uqyQd6bgbB4~ zUK}>Hm7fFEldZfI;7!drP(g2!=LrQ??%eA?=M$$V_!wXKPhE~Yoy+~TNT{sQha0m#S>p$ON*SJFw=gN>F<(*nAIx1GU=@YD z@7XO$M-Z+F$jp!<%81lOql%kpB2rC_YWqXB5xEA_6hwr*zJ%1pYE9!g4`iL{R@U%= zTUjP|Rjno-(stHUJb8NpRaY$usx42=+P5q@iDK6l%H+0P?8p(Oext?96Y77bUo(VPDDO1 zwJJn6h2%n5#mOo0*&ikMYEMFH3Xz{AUWMmHicL94;wvg)uv@V1<`$OL{*V@wQXSI1 z8&V8Mx8P?ISRt`ZqFaX?t&6Ouq7WgKGAV~pR@SIzp=Y)ysw9S?L35v4RqMzu4NS4! zF1JYp38P!mDJ1JI&K9B@$G^I3wg|8(Pwscf-HJ-EYF(i7SL&#cZXr4*gEA^F(lM|~ zQEaMk`Av7=(gEy%<_oeQHgln_(JlH!F=Zm&zM_&Xm3?xjd0wvHkTQVL^~1Oxp=CI; zmQ!j$sF3PV5)W2|OQP!fhy*K_{Y08nQx;p$qG-w)Fw_!tKF7(nbu?c4Gf5MP)FqKg zH^I9Uf;y}xXke)h1zDwzgL-q<$w6)edVSQ%3Q0~`(h@qVE1It|Gb9%|V&yK0tlTlM z`l0Gd)LvH?znVa?OQ#76ya&dfN>Lj@${cI3SP2~*5~i^4x2>ZC#K}Cdv{Q)AVd`d*J7I%s~6xb3MF0_K&X`7DZ()H1m*jm%iF0HsAE zrIjwdb)BMt=@GJ?ilXsH=cL0tdC+{rxQHrsM~!b~p-~;U1;D^svr&}TRB~xL()Z_j z+R~76$|nwNo?`x!+YNGEosotm(h(CVtC4X^HtzdXuxeR}S2r-K++a)V6OzIkGm#ml zS&O+f<%EQ~t)GynX5w;6L&8=&a{+|}TeY~Dk2pzPT12Y~q>Cq6CA!zg_?rSLR-cDN zdnBaDo3whYzfe045d={}lIxd(phVV`ki<87eM(`vF>0xb)e6PHrot(g!W-)lMylAc zYu}x^KD>@6D3ULu^rJ#C!r7u~Nv&CtJ zh=wF7(8VhxF^~qM>w}L_)+3@K5k@J?OHk@5NJN3nF6Az#h&*~k5|M#9@KWxLhu{r; z6wd&P>N@eOb(C=$0;fn^imcwyfs6-U(p4GP+@(6E)J-HI9iQ};!SOPw2)4a`{0h}u zS5$bh@m27eh#XM{Lx;>2-4a_6XUJkYf-kPlHc~L|;?GnX=;xImLRwTMq`98@a(kaB zyeXiZ8dd5jjOfE{vFIsUK1E574kfDQ?$RxT>QveYGz;;lW}S!6;yG&zIa_oq1$D$} zaVqANGZJI<6<9&3z@k%iOWLK033Q8n?b*DWaZiV#b+ zj1wJUTt%X#6ho6Eh`YL_48xOXGAO!!i%8$C^Cuy}lOSzWsPL}OE*T86rMU|oJwlpA zqmsdfDzuSE?M!@#h=nSZ!y!*LphiU#*UeoAm7J0mDW0k88&#@F;O&+KCR?Ht67AGU zekbWt9W{l}Avd8+AKrmB-(X9?YNx=Ec&H1iaWf)r*er3^>t|*b?h0&T6LansH|H7K zzHZkk;?muMZ$+(BWHhP{g~uKt*QbkXF!eO)k_|rE5U1^yupqsgvq*L8EmA}-EVL-b z+_JCOZV`_vPmcy=*kooF5*!rk|vJWS_+9OC<(9?Rp^tb zrl`0JejYq7YEU56ZMQ%(g49z0f zrz}R-GoVrq(kz-qUYe3{i<8k zsHgFgSEuRA`eKzk8Z7p15wBjS$d-mQVlx-YpevdzDF^OrLOqo*b_Bcl0E)IWYYl0h zf;vg%s!lYKeR)hpkvysmoubnR1*H%{>z86RswkGC%Hr6FI*C|rJp_%tqScUciWtIy zoBdTy+qowmDvA~nrJ#K|A{RHC`I4NLXvzQ4$&0FV@S-YNH{SylAvXd&VoopHS}L&G zjI#bf%gcO7^bNRpY9*Zyxaf$&OW4wl0Ld@GOC+?IYLg2`(p12!XS{v|ptMHGx+PIb z>uFU|y`;X-j<|bfX3(r-suWe$i?EAQx|IM`g)-eFNs^kG|XMbA#X*%ua2;&|P1 z-c#?jl47N|?PsUno&e8#>Zk8n^ud?iQ&Z zu{t~THdZmKzRphlxL@f#*FKnpeA^1$ot>TfaZcyBRY=cH{TxbXr>2TN@2TOD#o4LP zPW_1g^sW4Hj{wytPe)_^&kFT^^VT@y)8$oueUV?6{OZ^F`}O_R{ayaJy}IvD=3igs z{rWHaUeA423j5Uk+uCx=Adi2$WjwP2z_TSESD*nhv}Q8V2bD7UtVFhF+OEfc@Y^l< zK&*V!q}XPcFp}X!k06n>#KMJyw6NN&i&5IMkh5`LSKX4Az}xF1yj`DDL|R>++$EQu zBA;66`lwM5?iTE%-E!a`n?#TZSMQ$0mh~N?VkH7z(xNP4R+NH2tI72Z*mjp^J}@B7 ztF5WO+QhDBxB7hcu=cX+%hj>2RaFYoRi%2K{=0{1Eiq&24~Ys@#@CmM531yjQT={A zEfI07Wr|cH!$-;FnnL73ECeM_H!vqn0awI&`>k#i<0 z5pA);*{UrJ6R)kIe^%`>AeTV`DvL2BGv`30Q_m0~MOFHcj+80^Tg56+35lFg7SDKy zi=sr0b-0JQfzIh^d5CJ)i+i*pDC@8$jd&43o~a%it*X_Gy0iWj`4Jb0DqVbP)ygNH zPa#cflA^1Y@KMUzA|Bq{Q%A};-Xc}EIp~1YwXx#*=!AN=PAn5%R%2=wr2^GQb%&j6 zDNy88&!><=v3hdwl%hD2MN%H6v`<85CrP|nXT9X!kfd33eQf8`*J%^++^JLxRMH`r zj!v%s*vDYG9UAZ7^xc|XI*-`izFV^kK;G;5GCT7tSGwl zK{Cx3+_VANQf&odp`@n-FjwR*y5kLno{~`v1IsR`_Bg3}dZHrR(tCi=C%}fj0wpMw z@w{Y9QN^x2qiT5DPanD^=@Y!s;Q=$niKJMeGqymq3?miEr6dk>G=#C(dkSiJsYP;G z)a#Z^{IaELJn%dv7D28O-evvDT`OgytmM6+$3NI`$$LaM{k+3XdfS8dh??YhwDZJ! ZRF|7}!jHU#^^qTZ@U8Vl{`l)}{|5JePkjIY diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetIdentityRequest_24b7371202615ecd290e0fe7496676f04dc30c79eec5a5df1ab5b8d8671ac38e.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetIdentityRequest_24b7371202615ecd290e0fe7496676f04dc30c79eec5a5df1ab5b8d8671ac38e.json deleted file mode 100644 index 5ba648577897ce9dfbba7214733baa8e528782bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89196 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 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json new file mode 100644 index 0000000000000000000000000000000000000000..866c0f5b249c26e540aeccc351a6264bff01a525 GIT binary patch literal 69306 zcmeI*&2C)B6$Id{^%REITyRK^B>E-t0ETz*!Uzxt&dQP7=eMI z#38%;{8XJfr|%fnPp`iE>h-_B`|%&&|M0ihUw`#e-u4H#AHUDL@Bfl_-;Ce%w|95< zH&1Wgp1yxL{o?-i^oz^&>CNSGIlXx}ExSBC{o>8(sLT1R%ftDsH>WLkx2Lo2-aMUk zefRYJ$=$an6Q>oI+w+_I)0_Lpr*rNeP6qDo?w)>gxjosqezN6h(doyRhm(nSr(fKE zlBct|%k{|rw;xV?{r4Y#`1f~#>7PIT>$~yG_xbbvtM{+|^y;VAfBx(1ufMqjw#)6! z{oQyy+*~g2^8S*)`~5ZF=PTG;y6E91Nz2ktH=Vb}>o2bQxc2t(F!Sc-@om1n9e-WM zyM+^;&WW3Kw{G4xl)C-q$%&qIy@^}b@xzBM{}AmwwW)x)}0AOGXBBV!&7KE;`#l_#mvpj_i()-UZ2iM zit5w#=6Y$O@_k>)SW=hQaP)fDpLFGO3A|kDZB~se#`@uT-zI5wV1;5e_?)Sc{9htd zbWUWA(;w;8U-j+d2evi8pTaqC9)4bLkC;Epn9E&g^=lsH=S{(=qXt}tlrSe^ey)Z- zrQ)ZVZ2I#1FO}eV`~1E>q$obZanyFJ?SSG8*3V2l_WiHd%E?+;^J}R%Et?{fw3fM{ z*zy)yJj?xs4v!~Gm3xYs*ALn?isk&wl(u}Aw=|`r%GbBddU#&7&aux}o|TQCZAp@! zE&ubDw?nsS892EfhOelVYJEG_ffVO4M6iKd4SMRjh^TjUrYk z3IU=dU*>8dAm^!N=WvvobmL^sh zPARHCN{nm~tZO1bNXXri+ZKuQB%y3MVka5ImQfR7Aek6aLnJ)XCA{qxtd8N^gQ8e&RBJKOtST`Gg+V+6ZeYDW!yjA~kvVcJa0KW|pLF?J8R1(j8(lSq zB$hgs&O!wk zB^^6Aid}d}z|FegEgLniSRg$bNK6pPC!-X;SP?i{7hh5= zZdHSr5G(%!*@-`DWyWr@Fk&a3)G?(Ns(J%KMCw(_LY?sYM`C6m3-!b%9V#n4n8%Z*I4G7IofQ!3P4}B2;XyLPd$ai038!_ppLnYQmwf z&@Fe61`-LP8WESw|9B$UB|jU%QgW0V1v(5AWjnUW#n7^fTs`P5KpY_mi#95#Voq5K z5ZGReUD~nC3EdJNN@*V%rgS9`s_V$6%oPneGDs$7*N`ZhtF%{itRNyA6NuJex2Toi zuHnZDQ6;ep=S!`PK(Y%ZtA@m}La(!^x)f^3mg^T+&3PmbK8Lcv{OF6`@;nj7eQ!6tq4-kPcMAf`vrgEun{0cSFc7 zBuU2rY;)vQqed(`{9xdRY- z=z4_11R+u2`6&vbQ$vUq(Ze#9I{v_dysAsFLStLjOZ%%oC_B|0F_GLhy;6PMl6h6F zEO(g-8eyIF=>Npdc#hZbW;IP*NO)jDy$`R7MNPYyRQCoDB(qj-k$o*sAzmR4SkflS zZQ*Ly6CdKg;)~O4qYfp+3h8RkPt?M?ZV}*G{(3*k7E!#Kh!jitcS?~c3PE(3=!7m! zEKDc;u39UUsEx-sH~~&ZkykTU<<)wp+iDPSeo9;D(GcR2gm7#jjY?^Z7X*^^5=aGS zRL8oB13s;Bl&Kc1kUx^(#pf|x5hzb;|RP(4=}q-H^fM*%1~S=<+?nRA;vOZ=fJ zWnME;2U>A56_iNncjDNwWnEy?DFln2kGYyIv1Z0G>GdUH5+%7R4@I3?q@;c%GEocx zf;Y6lMTN>!BBC)i-8^zc&R z>O;6Y+F|LnE<_M!q6qFXJn0q3>JlNC!)g6Sq7s56s!}ioVOWDkIvx) zbk~p9x=ZCofFtZ8{&dB_XQ7>BM3alMn!viQ34A)#Ex|%Gw(Ie(wCPytNHd)9mA#2Y zG^erPdfp;D@8Jmn3*0mcd3Z1iv1=froLOH%*svlD;dYOu(U1l1<~A=$RNK8MVSzw~ zlm7R78OsS`u7#OT$xrhy{&&49fBZpKG^--x&FXwD4+b^y#}nGMf3Py37eNG(>aKN7 zQbwfx;|cBQUmiLB@#0_nq@_JxI?9@W1ZWccAvo(U(cx1BjClVaPiUilNvsr61$J3o zlTs`HOl4C31uhLjTF1j6(-WbW75!xx!cqhdit++D@piHARlaB^e}&2-a-bt}}nqtDwK|MYVw= zuV&eDdQ(%RKcVh;K|7dil;R~)k^jvSRv)EQi*7xQ8s_@Rm5b%(ZrPY@5qT^?SdWni zO8db9@hS?hoa`3je5N2&p<+SB8-PXhTknx;$?Z-QAuW0} z)4N`J4MbX7vBRis{Y>LHPE2974y{U;Qf9Gq;KOTr2|oT`9M{$ug^Bbyh@ zM(Bq+L$#*0KvkymL$xTnDswL_wqU6v$YLJ$^zfwdWgZ;8AkQVn--#RTYs6K-B~`Cu zPlr8f{nTN73~S$%$*ppM^JlwrMq-J&TgJ?@UL%S{*UP|DmvlzT`BE~)LM~Z+(Fk_A z!wL`+Zes{O&8y%iw?e|X1-LOtOFg=Y5-Dg1Avs2&B(D`wv#w9x=SBE(0oQ7o;uPBO!pbu4WNGoG0QFIfD{)u-z>|}!G1?fkre#ybCRh+&?Rh;!A zEHx3fs9eV-(YjhuIgLvKL`_8TB=#y^$c$F9o&=|@iYh&U_&}~v6m(Jh@=&5s-WI+j zN_bf8LPF(XtPn})+7$*;mL>x+gpH^-NK1@5>PSjS8CZryLx{Ar7#}_tg~aRFHCOAO zOeJcSbU}eoE(E`m!Az=>Vk|ACg!ynnU!b(ELgjt)1|S zGMO!S@2fnbi8>~+_xy}NG?XS+_&~4el{Vcd(j5emnn-#jkXng8h-0;a1NPivJp!le z1`Jl}b$wP^PXQ!Ybve3nX!ek%~ z{M|yOC&W|#nMITwTAZ}VpsO&g3(<}Oqc)mk>BE!R5s3C7q^M{)>>(Flu~NNCYs1_0 zj$@G^<*Hu5X9Fdzlfpj`5zxCO4VM%?{u6?su7q5dk|@!EoX@Qpy=p5bmqruez;Ti( z5cm+UTasbwK7k`I*-{hwsm+G|;GA5q@DW6-gK)=(y_(prPY5Cl*#eC(iw8q&OGrpo z(l~@p4Vli*;MEnPgav~H#AC4_nvhQD-0#EO#K>1W))=W;Zn6oouEq81+%X#E6^ z)Dle`^bY)?K139pxj~wZ#(TqXYl$^Cg(PnjfrRnD(V_!zS#mR(W^&5}f++EstBFLz7iixe``2zB#doo-0eMYgC{cnO;D z5owz%iDH`IT!reQIaEgtVFL@S)>=XMx&>>zQ?b-|HD~Z@9rPA#93!@;ln6dtUw?w2 zxO8lh8$`EYZr8Kg!=;Xj8VS?{T3S-i7iHc^X+sth2VDh)dX>7vE%A!B7#4Ac%3-uf z?y5>x{ahx^1sPZ@h=EgTq%ID)$uXoy=_C`*hD+UoB*~VNR&y2El=(lgo2DgKgt$KC zh^!?9GO^JqP(4x?=2D^%6iN>TTAL%S7Y&c|m*@T!(Z|JXRG#tf~G<_c(kM5UP~JSXt$Ost|VD9TSP2 zn3E_Z@ElI-8$xj3NYpaog)bpU31mIjuSi@OJKDiIZySZETvIA_(eoFJdi*=H1&)X@ zMg?-ICeW+WPw5@{X&^d$rs$L&8>2#+nlR)@uWSiJs4i4C54e@L5$86Q_Kq*Sq-V7w z^{c(>b~dRuvvswF-Cl0?nw3gj@KoYdx(HHyG+TeL^t(Q4L;{>5ru7@##~CnDY|QVP zt5(2xt#^iL!mfHaXcY7alE`Gein7u@FXF9Jvp4EGCgVooaQ$xON*Nv?%9i#zTCX*T zL(@zwA)YM^2bS&5K&p3QzZ`T(A$^;&K-Dw{uH`YgSm<06uQu8Z4ruiXw^T+ny$M8Q z;YgP_*3uBKS{hj6vzjW`%eZ%O49V(`n)8)?KP6C4cRGzlBIS5$x^eLE`T-L zf|5klO12OjA+5w-6Mji*x@2Hz6q4RD3K8j+SfQHrnWVWT>V_nOc%sPpmfMjl0=frCrC{?2>$iMJmf>l9sMC*dZgX_bPSY44;jHp89{|0}&V1#h$A0kic78I{hi`fC zHa{8q?>;1I#mXQuSx8b+NRnTvkR4e^={W+SX9S5tH56sNTpa0w3YqJv8AKX1kjSEx zdIQlRNn9dlqJ!0)<@?M;VSRlgm44rmg4W|>o%+8)ywF=4hESp?NVzqNh=vfmTM`8d zS{>8Cu`NwRh_v03^kVqwEmYd!;cwmfe*HgbxTMG4^}lquO9MN7Ow=Ib_ZRE)a@ThE TnUAnO^NUY@biB!5-@gA3GtEU< literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/msg_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json b/packages/rs-sdk/tests/vectors/test_epoch_list/msg_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json index 476c2a5fd64511c482ddc8c6bd95fd2db5b61b58..7d0727eda91aafc4c65eeae18c0df6f0eb8afd39 100644 GIT binary patch literal 84924 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 Tx3GTY2OoWFeUZQZ{m1_W;Mww* literal 85140 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%0AQPq1e-m)M1zlEp+{hZ9M> zA>{~hjLC>a73-F%X`)0?Ee1u0D-l&=;F4T=N}>`{ntsedD!q$ykmeFU5!ad^=b(LK zk50%OnnluAW5jyzDf;MdRIX`K=|G*RsPgxh~_3rI~`Rd(dP&IHh*sFJ6z5D*|Q+{>(bC%Zs>)tK%|JA#1b@I`#+xYS%P$r^o zx$e7PJYSmyDmJdpf8BR)VB0${d>Sxs3HcW9>fLh3aou-c_uU^hn$AM!{&s1Ju~0FwXdl3dE@oW{CZ}-SBX{E^~`(|D-;zylA^`E-IEtdSMUBqr~dHU zt9M_$`$JXS{-g@QJKU>xlT8&ad=}c~b-nMVVe)$4{oLcM=INK40HI-90_#uUB_Z{muOHW#;_XeT?~(m76n3UdoIc1fCz{-oHnTTQ)l-BMQAU znzbx16i#xNe;d>5=V`o#lz$sTxB7PWu=cY1hr6?`RaJ^!DrEJ%@Gs@H_(y&k z6{^g-Xs$06A5_U5Nsom{Ax-d9BEv^5<%9lt@D@>6s9bY|3=T_vQWPPYil|(VW=IO0 zJ;b)ev?%u^Lb^&T*ly;{I`L>-hX`%vqk-%PR$$W*DDf=Ts8qL8Bm!^EoESN1gRa|F zhvZ%^M6|OmXiJ-g>M+d({j+M90XZQVPzRQ-EmEhRq!0xPP^Ay)NU0LAEma9=62XSB zU8*x48dr*va+fXS20Ew5nGw~l7uzfmly!t8je8M6D5=NdW6=^l8m0BG^dsT|QKgGd zty=lS^C_eOksT2&g$q2TTg1bgd+JD=3*I7Cw>juQ>e^UweRN`t7^`W*%WBLiG~E$> zRCg$+8Xy{o_TTcQo*X=-C{D5n1*4SqZLqVGaM7%>A2lRt7F{0(zkHoG5zn1UwQwaJ z^3Ukx{-668EHl=4f77=$y>uS2y?tA=3qaoWyw1-2$(5e^j_JGk5~z>Y@@Q?o1p24E z50cxSf}1uVTdJ)?rxof3tl$E?2`t(0+c*r}V7yb7RFVfp?-Vrs)@o48W a@2DPLv=e^h71l?7@!pTtH~H&7e)~U54jcgh diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/msg_GetIdentityRequest_24b7371202615ecd290e0fe7496676f04dc30c79eec5a5df1ab5b8d8671ac38e.json b/packages/rs-sdk/tests/vectors/test_epoch_list/msg_GetIdentityRequest_24b7371202615ecd290e0fe7496676f04dc30c79eec5a5df1ab5b8d8671ac38e.json deleted file mode 100644 index 5ba648577897ce9dfbba7214733baa8e528782bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89196 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 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json b/packages/rs-sdk/tests/vectors/test_epoch_list/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json new file mode 100644 index 0000000000000000000000000000000000000000..866c0f5b249c26e540aeccc351a6264bff01a525 GIT binary patch literal 69306 zcmeI*&2C)B6$Id{^%REITyRK^B>E-t0ETz*!Uzxt&dQP7=eMI z#38%;{8XJfr|%fnPp`iE>h-_B`|%&&|M0ihUw`#e-u4H#AHUDL@Bfl_-;Ce%w|95< zH&1Wgp1yxL{o?-i^oz^&>CNSGIlXx}ExSBC{o>8(sLT1R%ftDsH>WLkx2Lo2-aMUk zefRYJ$=$an6Q>oI+w+_I)0_Lpr*rNeP6qDo?w)>gxjosqezN6h(doyRhm(nSr(fKE zlBct|%k{|rw;xV?{r4Y#`1f~#>7PIT>$~yG_xbbvtM{+|^y;VAfBx(1ufMqjw#)6! z{oQyy+*~g2^8S*)`~5ZF=PTG;y6E91Nz2ktH=Vb}>o2bQxc2t(F!Sc-@om1n9e-WM zyM+^;&WW3Kw{G4xl)C-q$%&qIy@^}b@xzBM{}AmwwW)x)}0AOGXBBV!&7KE;`#l_#mvpj_i()-UZ2iM zit5w#=6Y$O@_k>)SW=hQaP)fDpLFGO3A|kDZB~se#`@uT-zI5wV1;5e_?)Sc{9htd zbWUWA(;w;8U-j+d2evi8pTaqC9)4bLkC;Epn9E&g^=lsH=S{(=qXt}tlrSe^ey)Z- zrQ)ZVZ2I#1FO}eV`~1E>q$obZanyFJ?SSG8*3V2l_WiHd%E?+;^J}R%Et?{fw3fM{ z*zy)yJj?xs4v!~Gm3xYs*ALn?isk&wl(u}Aw=|`r%GbBddU#&7&aux}o|TQCZAp@! zE&ubDw?nsS892EfhOelVYJEG_ffVO4M6iKd4SMRjh^TjUrYk z3IU=dU*>8dAm^!N=WvvobmL^sh zPARHCN{nm~tZO1bNXXri+ZKuQB%y3MVka5ImQfR7Aek6aLnJ)XCA{qxtd8N^gQ8e&RBJKOtST`Gg+V+6ZeYDW!yjA~kvVcJa0KW|pLF?J8R1(j8(lSq zB$hgs&O!wk zB^^6Aid}d}z|FegEgLniSRg$bNK6pPC!-X;SP?i{7hh5= zZdHSr5G(%!*@-`DWyWr@Fk&a3)G?(Ns(J%KMCw(_LY?sYM`C6m3-!b%9V#n4n8%Z*I4G7IofQ!3P4}B2;XyLPd$ai038!_ppLnYQmwf z&@Fe61`-LP8WESw|9B$UB|jU%QgW0V1v(5AWjnUW#n7^fTs`P5KpY_mi#95#Voq5K z5ZGReUD~nC3EdJNN@*V%rgS9`s_V$6%oPneGDs$7*N`ZhtF%{itRNyA6NuJex2Toi zuHnZDQ6;ep=S!`PK(Y%ZtA@m}La(!^x)f^3mg^T+&3PmbK8Lcv{OF6`@;nj7eQ!6tq4-kPcMAf`vrgEun{0cSFc7 zBuU2rY;)vQqed(`{9xdRY- z=z4_11R+u2`6&vbQ$vUq(Ze#9I{v_dysAsFLStLjOZ%%oC_B|0F_GLhy;6PMl6h6F zEO(g-8eyIF=>Npdc#hZbW;IP*NO)jDy$`R7MNPYyRQCoDB(qj-k$o*sAzmR4SkflS zZQ*Ly6CdKg;)~O4qYfp+3h8RkPt?M?ZV}*G{(3*k7E!#Kh!jitcS?~c3PE(3=!7m! zEKDc;u39UUsEx-sH~~&ZkykTU<<)wp+iDPSeo9;D(GcR2gm7#jjY?^Z7X*^^5=aGS zRL8oB13s;Bl&Kc1kUx^(#pf|x5hzb;|RP(4=}q-H^fM*%1~S=<+?nRA;vOZ=fJ zWnME;2U>A56_iNncjDNwWnEy?DFln2kGYyIv1Z0G>GdUH5+%7R4@I3?q@;c%GEocx zf;Y6lMTN>!BBC)i-8^zc&R z>O;6Y+F|LnE<_M!q6qFXJn0q3>JlNC!)g6Sq7s56s!}ioVOWDkIvx) zbk~p9x=ZCofFtZ8{&dB_XQ7>BM3alMn!viQ34A)#Ex|%Gw(Ie(wCPytNHd)9mA#2Y zG^erPdfp;D@8Jmn3*0mcd3Z1iv1=froLOH%*svlD;dYOu(U1l1<~A=$RNK8MVSzw~ zlm7R78OsS`u7#OT$xrhy{&&49fBZpKG^--x&FXwD4+b^y#}nGMf3Py37eNG(>aKN7 zQbwfx;|cBQUmiLB@#0_nq@_JxI?9@W1ZWccAvo(U(cx1BjClVaPiUilNvsr61$J3o zlTs`HOl4C31uhLjTF1j6(-WbW75!xx!cqhdit++D@piHARlaB^e}&2-a-bt}}nqtDwK|MYVw= zuV&eDdQ(%RKcVh;K|7dil;R~)k^jvSRv)EQi*7xQ8s_@Rm5b%(ZrPY@5qT^?SdWni zO8db9@hS?hoa`3je5N2&p<+SB8-PXhTknx;$?Z-QAuW0} z)4N`J4MbX7vBRis{Y>LHPE2974y{U;Qf9Gq;KOTr2|oT`9M{$ug^Bbyh@ zM(Bq+L$#*0KvkymL$xTnDswL_wqU6v$YLJ$^zfwdWgZ;8AkQVn--#RTYs6K-B~`Cu zPlr8f{nTN73~S$%$*ppM^JlwrMq-J&TgJ?@UL%S{*UP|DmvlzT`BE~)LM~Z+(Fk_A z!wL`+Zes{O&8y%iw?e|X1-LOtOFg=Y5-Dg1Avs2&B(D`wv#w9x=SBE(0oQ7o;uPBO!pbu4WNGoG0QFIfD{)u-z>|}!G1?fkre#ybCRh+&?Rh;!A zEHx3fs9eV-(YjhuIgLvKL`_8TB=#y^$c$F9o&=|@iYh&U_&}~v6m(Jh@=&5s-WI+j zN_bf8LPF(XtPn})+7$*;mL>x+gpH^-NK1@5>PSjS8CZryLx{Ar7#}_tg~aRFHCOAO zOeJcSbU}eoE(E`m!Az=>Vk|ACg!ynnU!b(ELgjt)1|S zGMO!S@2fnbi8>~+_xy}NG?XS+_&~4el{Vcd(j5emnn-#jkXng8h-0;a1NPivJp!le z1`Jl}b$wP^PXQ!Ybve3nX!ek%~ z{M|yOC&W|#nMITwTAZ}VpsO&g3(<}Oqc)mk>BE!R5s3C7q^M{)>>(Flu~NNCYs1_0 zj$@G^<*Hu5X9Fdzlfpj`5zxCO4VM%?{u6?su7q5dk|@!EoX@Qpy=p5bmqruez;Ti( z5cm+UTasbwK7k`I*-{hwsm+G|;GA5q@DW6-gK)=(y_(prPY5Cl*#eC(iw8q&OGrpo z(l~@p4Vli*;MEnPgav~H#AC4_nvhQD-0#EO#K>1W))=W;Zn6oouEq81+%X#E6^ z)Dle`^bY)?K139pxj~wZ#(TqXYl$^Cg(PnjfrRnD(V_!zS#mR(W^&5}f++EstBFLz7iixe``2zB#doo-0eMYgC{cnO;D z5owz%iDH`IT!reQIaEgtVFL@S)>=XMx&>>zQ?b-|HD~Z@9rPA#93!@;ln6dtUw?w2 zxO8lh8$`EYZr8Kg!=;Xj8VS?{T3S-i7iHc^X+sth2VDh)dX>7vE%A!B7#4Ac%3-uf z?y5>x{ahx^1sPZ@h=EgTq%ID)$uXoy=_C`*hD+UoB*~VNR&y2El=(lgo2DgKgt$KC zh^!?9GO^JqP(4x?=2D^%6iN>TTAL%S7Y&c|m*@T!(Z|JXRG#tf~G<_c(kM5UP~JSXt$Ost|VD9TSP2 zn3E_Z@ElI-8$xj3NYpaog)bpU31mIjuSi@OJKDiIZySZETvIA_(eoFJdi*=H1&)X@ zMg?-ICeW+WPw5@{X&^d$rs$L&8>2#+nlR)@uWSiJs4i4C54e@L5$86Q_Kq*Sq-V7w z^{c(>b~dRuvvswF-Cl0?nw3gj@KoYdx(HHyG+TeL^t(Q4L;{>5ru7@##~CnDY|QVP zt5(2xt#^iL!mfHaXcY7alE`Gein7u@FXF9Jvp4EGCgVooaQ$xON*Nv?%9i#zTCX*T zL(@zwA)YM^2bS&5K&p3QzZ`T(A$^;&K-Dw{uH`YgSm<06uQu8Z4ruiXw^T+ny$M8Q z;YgP_*3uBKS{hj6vzjW`%eZ%O49V(`n)8)?KP6C4cRGzlBIS5$x^eLE`T-L zf|5klO12OjA+5w-6Mji*x@2Hz6q4RD3K8j+SfQHrnWVWT>V_nOc%sPpmfMjl0=frCrC{?2>$iMJmf>l9sMC*dZgX_bPSY44;jHp89{|0}&V1#h$A0kic78I{hi`fC zHa{8q?>;1I#mXQuSx8b+NRnTvkR4e^={W+SX9S5tH56sNTpa0w3YqJv8AKX1kjSEx zdIQlRNn9dlqJ!0)<@?M;VSRlgm44rmg4W|>o%+8)ywF=4hESp?NVzqNh=vfmTM`8d zS{>8Cu`NwRh_v03^kVqwEmYd!;cwmfe*HgbxTMG4^}lquO9MN7Ow=Ib_ZRE)a@ThE TnUAnO^NUY@biB!5-@gA3GtEU< literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json index f61518a9d44161daf1fb427b341082021abf8f0d..3ee4461b99d35190744edec7fff93216e3e24423 100644 GIT binary patch literal 93354 zcmeI*(Qcf_kpXcR&90ryqX$ z&v$?M{@ee_k1vm}?~YaZlW)KO>vuopXRqG>-@U(`z(5M_wY^EeYoj*>zn-fORL_my?>l$zP@{Wn=kK=|6Gpm7M}3ibK+**t(*4^ zrEY)yn-hK3!(H5ZIDYu1%YTh_JmmWKH+PTm>j-x|_wnKQNuGLmSuEmdZ3U*R>+<{h zUl-<|-0(ldo8_?>&3dL&hmZ<~$k2BNkT#+?Szo%FK zsNX*R%C_SBVLFdIAAUaE&zPTO%;i;R^(hbY^FnacQ3EbRN|-BRK378@Qt?A13t#^H zc5yvfqI%aK`sWTPV$$DbqvEP5XR<7)nHJ^gwYS|E(!g`dz`j+x>`T2eLN^xB| z#_JDeR9BY0O4PNI3R~XNsE?d0S^34jp-tzX4mgU%o-mC{c zu!>x*Z>b1V20eY%RB|aKIe4-jMcE!rND|kv9adyZtt5PbYi2|U-`MjCRhDC^V*y#W z$ojf;F%xqO#g5gaxzG>_Yzl;cdW-7=EY?(Wt-M7>@$)mqQTsb)zjcO}OF>DZPS%JX zT`%-2H{z9SDVJz{q=rzQslA zXgYL2(td$0tS%)4Ql6L)ajpp|Jh z267~Q-K&8W=RL7g4Q8=WcLqYo)zqL&cS@4v!cY>~q%2o3sZ${G>dZRX?8zc5b_fc4 z!xovT$`(8=mcuwRbW03Taf%n8IKs#E}A$c!V;uQs=BmKcElh6}-m?(&f0am8; z^6*5lBh}ZdPi3Tuj{m}qhI~Rsk_ZJh?NzF81k&G^wSA<|7!ujRj@CY|9V$E&l2qJ? z=lZUnmR{CV#|%9LqGmaLpCIz%Nlj?3PXsawN=RGY%JA9sf>qa3`i6!`wZ=r@CDI-( zW4*dVk~2z`j7uQHioum!h~(BpszbIkgBVD+NIKLXNE|kc6N$EbVNnw@ao*O)8L7>t z6$kRUMf>#$zNO8njvdMmTvE{pRs!!xAF1n^ElIixxCWluSB1$eB#JQu*NkVDkS(#2 z44PveNKJ@W#a7{siLhM;gC2@$j>;TJ8APC}Br$J^SZPnG?h{3!rB@!3 zxZ$C7@SFmvvPrcz-J%|emz1;491^`=tt~x4wa-t~Qcb0Y(5WU)44)_3YaEmG#j*KX zZsN`OiCCg<#FGRPE6ZLLVa$j=T%WI0ZwMz2(OQ5(RhJkH)Nq- zQ93s%$$&8fA*`a(C^XIEg&Ykg@D2iJJMZ4qPndnnv_m;Sd+wP+fX z7}zbYQKb{=GbOrSg@GE#Q5wcT6p%WWUL&&5ExJC_j>I0uGHC-ZWiTeN_cd@bkzAZO zZIP@E6VwG#fTB@@A^F{Sm~@a=2_#A-vDdK^Rz!cAZagq*na4yWP9^$;GK7i(Z_|Ng z-i%P0=lQ}bs=hjN0;QybY8)>o>s6FTN~2rwI4}bjY-=SMKjD~eN%+J=EZ81`B=BOD z^|GZ{9c8;Ni8CW2yfu*yC5}~m2-_3v^?95P^d5x7S9>m~?Wb$;EAx}8WxJe8}o zo?wad6sau^GAb`R#!J<=esRzWm>NQpC0^0us+KUVA?M|iLd2LRgiGCmvsPWg2G`n5 z1{JX!6Hx2wn22y=7ZZ&_)=#WtOP`N@p<9sc(~4#U%eLu|E%B-^>4~i=A$+ktF$78j zRhLp1-9kMbXSt%PAuRjThbIK7yJjJ~B>~9d%jxx|5EMw%4W;(5XE!PS04{lPkutpYtL8IJ33#<=}FgX?rfHjDW&&a zGD#|ow4Pv5NihufJhtbtPase&-R}=Bi%h3Vy|K@GWU{4;QL(#azdyJ(?iSm9-}MPK zct4d<^9ud;`-9YxX-d&tkSDab^A$~!`~Ae{3a#~mpG&dHGtZ|nIFgvYCO4TUI*x^~ z@4NPW*K@V=zC(>KdT!eD)%y4vWyni3yxnKtcip05QQe=vx`k3_Z+tIx6u9*cQO-89 z5d5=F$6v>iG2_;Hq=>=6qY#-gS z@1vxsS;6+av<`3BnAe_{UhM2c84RVMDxHy(swvx_S6?Q1(JbNxp!h&Rg%r{LbwNc$U(txrMZ53AGieAOpwqzDVaNU#L+b-;OXn6~e)UX-j< zs3mvbU!e+Bxb$!L=TLlNnA!8yEvkp@1vavv8IfVBGPVD`g_T@{=UPqs-&?o^Z0Y^G zov);hh#M@JI$zPCvgfPkSehK^x!#78JYNXbN=Zk+5wR{&er54~e~_wvW>CBNp0CzE zgI!TYw(t3h&a?dHnzW(5xwhx4=Q`2##Z*z!uJOB^uPE1_dtS2VON$)GtMw`)So-kg z$&eTC`>0#RxbLHkez|8*h2Qs4>%-4+lwQxso|o3K>gc}ze%~!Ur0Nd+I?TvDaI=tI zq9Ok>^HO8S!Ec@3MfFI>`j+~WkJQR_M7PkJ@^LB8mm#O=CKEzGjkgz@^l`)^1-2zA zpm-x-knAsQ57(KvAeQer0&0&D{b_v9!sD^#}BiZXEAqR6qLfl!eKE2+DI z6{(-9S$Qi!)ul*{kVH$PCc;~}E$kM&B0dqwaBN)@KKJ_Mdfk~5SJw4k65aKYS@Eh{ zaDAnNitcEpM5kFqA~>a=OexU;m4XDWN?UlPjz|g`vgEF)W{apz*Nb3QH^`-o5X7aZ zCE=MY%lbNVqUd5pTJTJSj8DTc!z#H$6HTAcqyAt~%-994W+c=_$BefjEq)fIUM25} za5PF}tyVgU2q*V`A6T z<7b5Wdmtwct&t0Jjt1$+JAAvsnnC(0aq<%~rT8(S8i^qKF9<-jNZK z-w2~xL2AviRW=4L8AO{z)vM3Bp14uxwe;e=3@|ZKO^`viGNllqI8)Stv@daqDRk5| zw4|^U6F1f7a~5e`5^kvaoe3e0RVLLYIwQ2uwG3ZIb#h5WDLTpi;P_EsBYF}@w_s=K zmh^g2*Gd7c$HWy|r3W&qsG58OUW|&Uv(0-sTDm;;UyA9U1vPS6mnT4iDi? zypp`PatYf!p9&=F<@pUEs0yhXFQU{$APG6w%hzZPSq0%B2Dwy-Vu*_3L>(QPK-h*J z)dZ=F5eRK536pdz*gB>>ISj$20p4Q_wooA55|E{Ay9Fo1Zoy$`CPff#AO~Rp;XyEA zeqw1jvZY={>yXAOL^FIsEDBE@At8|bW^52@sa&@P<@rrqw#Z0EHQu@qV$`1#<9$j= zvRo??a@Ioy$&(eIQaX4N}TcjJmuP6Lm?dwJt@SC~-%@X4g8;XX2!0hb&mS$LK{$ zl2TH*l0nUgOa%$q(vkJ_{Gfzq6UxFMIhio=NB_x_mJflc3M0%3lH`1m$LA~A>Qd^9 zO6=5NTv3w3Y)=$L>Uts4?4i_s5(05)3_>T8E>=nsoFBRc>*5SgQc4m?J1J!_A<+6` zoFftzC{^#clwA^du{|=fE)JSLt&ZUm$wEU&!HSa9ii(e(Eby36nG(sRP8wFw`hgEI zwz3v0GX7D@sN(8BO(v;m66D>iZ~jZ6yIC*)yT0WfGB)c~>UXog{%7_-^>uYDFPRvd zi`}f(*j}u5vwl%LceDOfZT4T|4}a3EX;RwF`bEA4)heF9<BH ztQUaV&65fv%aOn`((W;6#HbooAs?~isW`+ zKHjj~&HC8}bp69#Rmo@A`i7l!uKfYCYqUT9`m>*`>FQbD>*Y7C_BA;4Ec}~y{kW#S z+qgeqc1sB>hAHrMhNrp6`tcs6eJ=N(_8NRPYk8Zy#{qepm=+iO<;>1`Tb#+3kb$m! z1|RHZDSX(U245-U-K_UD_ySL6rPBrAZq|#R8`;<3w-~76Z!K)O-;HKXBjs+^AKzy_ z`AP8H&H4!@&wg8=_Q`s^TK7MSvX0em*1K6h*M+M&Id96_^wg{~Sl+x>d|W(WhV7Tv z`SmuxF8S5(^Y#7X-Qz?4^XBfce=@#&ovWd5?jo~~S-F<_c@D(`vbMGfxL%m#SS<&c z#L^2E`Lss2s0o~GYeE9=-Kne}QF9dZxBo_u7GQfHA|@KeXTH@e3GtJe@oIhQ?(-Lm z`Vb{1M(~M0;!;hZSEU~bV@yPLgt1LD{vUrTI7*M0PzGjT5Qa>6WlIAQuiB>&+mcX7 zQijAzn@W4f3oq$e?MVIA-gQ5k)YqeRwT0bZ?#?x{g~}2z7&11CiD|;S$H1KJjYsglfE7G7S-X51!EMU${hdyFM?0 zx4lNNqS9#Y#!I_^o{-W7r~{tjp*F!*6DmW}-Ha$)v?T>7@Rm_Ij_8(Hp_=uXq}UR5 zLlP>D6f6#711m~;Gmc)>3T51}wcLsS0jG6@%Gr>GPPKw}x7B~4Q%#6CcYPSBQ3NYd zwpxh^38YboOihw6Yt#%}u&RmUvH_Iv1h%OQ;$cD{VEwRMthAaExJ1!ht8xY?`iqx0-EjpHqxRX*kopl`A> zzw)HVzVY;Syff6xw_Lo9cZU9NZxXd)r7aB>o*68pLe9uKO3w_0?g+vXnW#!El=W^2 zgC!$#JvDl>-``;HW}97eA_o}AHL3aKmGitAAkPe z_kaK4yT9b^%l+G%V^n_f-4Flx{^z{+=HZ<`{q)`Y@Bi)p-e@@>AqD>&8?ZYb){y1 z{hJY8>vD7V&CT8M=DQC6;O$uC@$c_$?qk>C?pXK!?szAw9#$5MSlYb;Q^s}pZSAiK z^Cwp_{Ufd6@98l6XEje8ID>W}*E z{Rg%c-;cw2#QCr@SR8Yopv&b=An8I+{H$~8|B*!Xw)7}l9 zTN=i3$q^b{uhW=lLM78vrI)>~GAIv~>WAvmF7aCRZQbQbC&>#krt51IJcGK0Bwe{g zC1cb|&7fE%j4f7)wItC9-+H*~b#|eoh|H?vM}w?Zk=oRx6lKZQ>AOUvMO;%O@Cp^{ z$l=R6Tp8a8O6S%o$HC5ap&Zd1BoZb8GhTTZmn9Z$DufprRc4+ zQpuwev1qmmorDAffK^8y<>onRnpRISofiV`BvD^R*i+!skN!U0Wq zMM13n2 zo)8eKwf}^^Ws0Cwr6QL_2`4KwiBe)nqP4pdeBuI>_#_VLo**;$OvbDaHaAJA1?>~1 zvs3hdMzFuyU{jB@6Jp6MMhbqiTXuQH!AB(}DJzGuJMCdgAZiX`AUY+QATrV^czM!r z$9M6iiF3S2C8&h8eqpat$4Ooy{vx>(D5@`MJjkSsmnvBjl074EdcHUqVzCaLL=75l zalAZ_@9Ic)p@`#Qq)DOK7m{m&Yt0H)(x(j#Sr7O0ns^?d5<7Q%-Ku(#Y?5$yiUNh% zXZGV&z!WG_^7xBUSa+esP*!LgoRDP-R*Kd;3|w~+V9O;G=LRC0sj{hzO;RXahc6WO zGYI2xa%3wJY)+A?(F1}ae8Q1Tk)SlQ#EZ#BtgsED>{7xjRwvrL5Lhx%BN!LBYIrAE z7esiAt$01CzMivY%;PJ=BP?bA5!`WHyZ1}i>cRH$f#N+j*s!Q zOC3q6rM4jni;h$iC?c_nOo|KAU^EsQJ_$rojmv`4n4;nCE(Da6Bnw&cS}d8|*1U`I zOQ36#c2n5`9ci&3aYmVqJqdIXTYg+suLUSweBF}Di{?H$Yl#+nBv^_}{iVbY->``BXv}MZTs?5x&Fcy`(R%MFkxM7ucLLykwo}hXXka&wtZ?Ou(v;}HHw}`As zQ*pwo#^S^S+z7j5dJPN0qS7@iv#9wD!czCUerf?CT)5PCZFp3&5Zg9L(!iVpsuD+S zo)Yw0Hg3gZjqWo`yu(E+lCq{d%YdQtftpO6;dt zmwVVPG*2neSzk_bJ!7Ka5G#t$k#y7{ut_2U4FS1)LX(BqWkt52sG&*SB07T^q3L<1 zaGz)o!dSv8?SvG&dO>IW02@Zp7MU{gg36F=!J;8jUw@HHG+sk66^3*&=P40^xdp{5 zkcvqeOel@<GF2yA>9n50l_ zvx{iXBrW>R42)HBhAO;KDiPaEsZ|n@?jnwN@UhE!c65uJH!+AU0ip@RDvf*LLWIj< z$y^>E>WbrCUtE|Gq%E-MH{wwqWjjiAQ5vu1&aIgqJrTm!7wloW%ki=t$rM3s?m|>d zP$Uf%E2UzwCF-K86aF-~g-?*Lnk}=mtd{X4dR?3>p}`5LayYFu<)a`|f{lW;>_wAZ z?5WVnc#3T8SMkAeP(COnWPHG>3nDx9TE=&M>~b@O13^laEI^`We63n1Y9vUASCv4M zlFJr|aE~M!@0zMD!o9(5QzZPTM!6dLN#Hu=L=zI7kzGdKor$>YQeP0Ul1gesgP7DH zK}cR?3Ti^9h+$LNWXfa<8HVh#1QY>jAePmso<^WV4V0@i-Yh{+36>%woGHzAkM!st z;-3HG#)o%iP6^XaoKuwiG=3_HNL;;^@hws$J4f3_DOQtqkMx0-pRn}d+j5V%x_hL> z|4rk_h}|PC{^ujnoHjhD37w+FE6O8NDkCaZ*dwu0QNq4ce+~ocTaT0 zxs0b~qs=V^S_b!COU}8}Qw0_pPq1`x@ze(I9_*S3Q)HVUIoIqS>_t@hsJMHu7x5g& zfpTv@`@06z%usz^wtFzDLAwVNxTrI+;_})(m2`tzNohR6vU{p0Z;&3|Y=IW$H(sV``+pK zQc^Gp&)ri!59R~O3uy`m9WeLbM6>Um=m2=4W2g1$gCbHH zwM?|KQ=3GC4}o3(U=p>OFPzF~wLRva6hp_@t zqY%2Ht~OOEaL0+vNUObWx;QbZj_bK^WVez$hDp$;Qc=(kcqxcY)v!yhxhjV0yNplj zQT8>0iMUcX*`ZS?79##6P!z8z_!MGbfL67EiE?cX2M zPO0z;V=E()5p6!TYNVe;lR92@Y3-B3RIdY+9y-$HDsR(BlOulWuOnj?#W6(|YezSd z2BRSBBZ(aA^yq;n!FnNV9N5y7IzC>@5owQvHw>x_rEaWRH^~D*RBs@XfRY`Z5-~Z^ zPfEnQOR_`sq$I&?(pI6db5gbaR!0QhGmfi-zUFx1QbVRCBmK4zqy4$yU#{X5a)FHz ze9BBwq&l0#6h4q{4>D5$D){7bf*UWej5do=!CFm3z{^sR;$oFps8y<9ctxDmIX}E>w-6b+8Q(BdTR8yd2 z%CL$_f_l!5q_2}~t)OWIPxeXQQlPSnOzHS!t3J6h2Y2zsKdome%!7ON(`X_u_;j%1^C(l*w##cNBS$6^Aju}B~gs56xXPZk!711p=7N=FP# zc9Z5~tGrIsMp;V37*A!iQ$la4q%n!D5~(zb;yq0LO?(B_$^~W3YZpY93l4E0LX--u z-wTyXn48Icqw6_eP%7(wl8AWXhruE&samU~MvS0SM7o6%J_Jq>Nn_IviQ_%p$oT06 zg)beTZV@U{u^7}v@vL59d!r?(TgaW*gm-yL*QZ#dgo%vQ9?6T>9#433y2Vogv(83m zC_RsO*_4Fr1dC)!*6&L)uD>}dRDJPnc>>}m9 zyplN9Dp{WvS7WMaCj>_WmnhJ24 z7fn5FU?Nk(D`Qk*f#=+KUB?kyb0Jm*B>}diO8CU8K`O2Sdix!Ck?pNbBnts5Q^fZf zL=lIq&sgd8-I3<%NV{m!pRzaNAnY1b*3Xr^xYpKCUAq@NYBix^mGH1AC2jRklUN`R zRZMhzy+C+}@5Ye8CGa)@1>1Tdn$U>L`f<5l%N8Af7D|%XLkywg(!q0! zTDXKHFOkHB+CyHT@;Azvq8XuHWPS4DsCoueii;%a%xia?BOZ8#B-N-)q14OzLaJ_Y zg1Vy+EI%OYF5-A1VkIV3m{7_g6g9an$QHw8%BDGmfKsZ*aq*(5ae^Ky{_4e0D$Vgz zj!=u92+kL!M%)oLmM57adetc^)I)els}pw_U#xPX!DR0g^j)Xaq{B8-q4Y4q$p+=b zxhA2f6vm2RiyuJIlzOcuja`r@$z0`$I3fxuHUuIw&Y55Hx-=R;>zS$*K&F zjHr@`;m5Hv}vCS?~9gqoyVjBHx=J@!yiG>OQC^s6*JBo{Rsfgn0f(n`r_UXT|- zRVsK<6|d{>iHwkgK(`p(%QBY=tQMn;KT-11A5!=Zxb(zf5kKIfEebDTD+hrtF4CbH zWR|OFX!=O5DePr6t{>)5I(Lge6bd09c$XxO_>%Q4(L^Ncbwp2C+9`OZD5@#D+M;0D zs$r2b*(HN1d?%WLZh@lFh*KqsdQ0OpP$H{l1V!)%wMf7RwaAxFiB&@2x*u_nOz+@q zq?r{xp-ey0Bpa`W*HB6!Zd1C?-HVD5Qt6px*KU;AeeSl}kzQI5t}rTx_qqESAuX7x-Eu-Ky{XpA zU~N2VKdxW<#oq~$+@y8NuHDa2?(zS7vTL_VrRv_U-BMY4@QgS}rgw0XT`y_%xOB9* z*=U_DEs^`qd_jU5zTfqoxjc8*D zx%*msK&>FPXBC7rfzqMv+Wlm`e*EUH-Me-_=ELV-mm&MJYE*~=mwfK72=CfW2=C|J zYbOqROz`TpTasee?$4$8lXrIQ-nIJ^N__I|uHAgkyleNqGheH%OfBs3{!ME4xU@85 ze(%q_^{W^dw?D(pv75d%qW}=r0J!;1-vBDnK3=W=h7JN$Nr_jRn;c zC9=TcL(lFKN9gkE2p_{s>YXj}Qn=zfb@FkXK0ShrYAjAXO;)c@+=0jzLuL)ABLOLV z4R>A&SHdT}D%)j?nuN;JEr?V@c_bp;BIAjTGPn_67IVVCE5{NES(8ZW7Y!y$IylIS zF&&@uL_9l1SXYQ-e630`k|`q*XiDKqN!7}t8m?Fkkx>Q;RwL+jUy`T@BUar=*x2xi zRh3H7jo~<{-w*`zB0!~ZpU5e~Dm)ZT?h`=jJ(7SlKK7iThg71jFX0Y8Y?AiaN4+pc zNvb9z%!RltQER$kl3EBb3)U5BCZ?>vEA=OroS%QYD>X5&1qch4wkTQ?o6fsZFWy7$ zN`389Ns)*u?a`1!YV1mV4cIm(|4x-UA-?)d@P4sD&9UP0Hov~fuSj>msquTzfhZk_g>l9*COhy-CL-(93_o{rF2 zFXWWN#c-VXJXM8`3^`Rv%Crs&P#uq_m^vP;7W3lJgzlo}+)T+!e2-zZP2lbL?4pRp zcOiUtksHpAM}#{iW$Ofi6)wD=54=4+(HT~$60F3FMqGoASGyHnIi{6PIffGtTU}a2 zUU*6IYH8}P7O~q=t-c;LthMa+a&xX~m6hUFiL9EJ_)B`t_+xx(6|&5#Xx1l9)ypdJ zw-70$F`lwKTd2!%A@raq1SN4~(9Z&wEkt)G{Uj+;1}TZEJx4JlN9wy=)OCx97Wp1W zBphTcOq3a9;X{KsyxT;cfAeNAHmjLFBTt)Y|@a!&W#n7RnC-0=AgdD%*ljsq6IxlfAnjhbLRaml~GP z>y!{oro@-hm`@28<_)EU+Up#*PI^X^I-}2ob$4~mx z%lpg2=Wjkfefj#s$D6Nj)?A<8fBC`X_6JWl-#k6uEV}*X<>uJS%ZHm)AHVv^%_Y~T zmz!meuV21-fBo|H<^9bMuFp5Ie6|02z1?&B&CBgAmz!^{&o{~3Uisk$uItmy_0Kn7 zUtVv%xn6EFe!U6h{l~?^pFXAZ?mvG1>)(C~S^xF(fB!Uo_-p?A>kq&F@Gn37^6p>% z^6n3Ryj-6iE{_jS*YSCNxLiKw`%C`cuV3)9u#h{QP^XKCcZ2 z^P2Y$uOIT|dkN_MnU}3UC&=qdwJa0 zA1o#|6YmjvQ+)YyP9SPbFAq8J<@yi`8{Y(N{7rt;zZ?R1JK{^DEejP*ZeNl2+kn;p zb|jXF-n?pn|669t&W%`;-e-CBNB#EoliG^!*K`h^N1VZ8?EQvZF4sWPgTC>z?rHv` zh?;HXQMKHt@>>P;wGJ;|!C34@G{0Yex7+8}jUg5BnTu7}mFeQ)mZ^WZ;PwbBF@TCU{(vK8&hLjxcy1vV3Vkvw7Tfe_syG}2+7YPZBY_LKd?q^;17$NO%A#I!# zk;uDzC4L&i&}u3?328wpw%iml9BKi$ReVyUj2J18TgX-8Yb;l*Caa){2@@xup1)9}CNKHXp*W%aFPUU(qNZ?e^d>tZ{UvC+|;-KnoU{ZP~ZlH`z z&yhK5AuOKL#M5EX(kIA-Fb#w&5n*I*>3{bVZ2zSBOkOsbm``zTf)24)Iqyx`e|yyV?h=HH>&Mw>fy;+NbmXaY8tD& zPwl5rNG0X2Pbmq}MJZcE=h?zD+YC&AZD7&4$YTa(1(?BGODQg`aE)Au_Y;JpcFhHU zGh0&dEp9zQqdG_=TZEKWia5hkBbr-Dlv^rz#VT}2;!OnKU?_uCh+0raciA$HuJyj% z4vMY%4|1^|%wj>b(JdN(h(`Y`cPgiBktWqd;t7(=>T9$mxr?G2Rk9#Ojqc2FB`O&a z7hHEHr3jCL3M^iTN01y zmgFRhwWyn{4j37R#bc)`2+x+AW=$c{;pnT)7agM|fb#~c6s@)PlBt6lN`yqfCS|dg z<#@Cub|mtiSyNOcB5hQn>K2{ohTD@!`Y0`QG^z}B#5g8i-*ES6VDuV+7EfSl5Xy)m zbk~z5q)CKbk?Izm_X-`fqFB8GpAk-MQ-H0_YS!A>M-lBeJ7YOQ5(-Fl(_P77EcjXb z5`R^i^-^nH9Mh96)AK3uK5B{Zng~A79av@Mt?*_G4NfBw-jX7ciM?LeHn%Z zG^B8i?svad(tIWU6CuTFuoYITByTMTQk@n~szCTXsI{JtKGyYG(IJjHY0f|JF~o{H zJ@0|CHkN!a*JqV$~70k%sJ(R3^o_h`C04V&tfGmB-U^U zC@PA0;89C5|4+U|oTN}l(~P8rbwbET6x)6ztTmpbd=Qn62T6n!p7Vu^!kgShf!z{O z3A_a=yC{()j{ezOv}uGe1_GmqxU;J~vRzy%0 zkE+`wFd`yb#;*P5(sEEOC4G#l6-0F!Md1}qT->AU4{Qyk!cir0G4rA%I&3_;#SJq$ zw=A%lnnh|{s;M;_1u9lp9gT`~o z+MuYiUJXj+ho!x;Anr&NVOffF)wNvF6oRVAyNmM?dGwZWLAhkT*6D$06)Q?1FMRZT zL}>v_b(A?uCKm2@XiZH)2j&>8avg|7E5gPeP|$Y`;0rvk+HiqXlwZJxM+*rI-z^!&hS!~$M+` z2lmIFPjbrn`8aWuNUsR6lKTl(XDv?{PYO+h5I*RVflI2do}i6b>A~FYp;#QFi<7>#aSrpqm3{st@4e1q0TsjwLJy5lA zCGJGrWj&1qNtsZcDM(0*I|4Q$ms0H&Q51~?DLs{kly*V__dXDY;1gts<>DD35uO50 z52yG^JUHbpaAe@=mV-&`Ah4*KfXaF;|Ky_O9Qveo3Rl)kMa+tZ3Q9SP0@wKxQWz&} zdqu33t_V;>x70=BIrtR``s%!e9v^Dm${kKYjVhv*PS-6sLUjE>B1)oH>wX<2>;1(g zPI^Qk4L)=QwrTDx0h8iMg=P>%miY>F%et%duM&Y<>V9HPy&_vwtD*bg7NKJ{qqgtu z_X(x%pa0}i;3~-C43&y9G6c3yVnd4mOPQq1EsLYMh=z)qj|_M%!*nIt(v-7HD>t_g z;|Gs;VGyI*m&dGeT3^w|MYrps3dAiXB3s1Ynn-r(s1snNGK$r?U!(XLIL-gOUh(1LdFs) z%G6ZXlA*WQMv4^DED)iiiR+X#Yef3a%0(*?rKLLDZz3yxp_>$|9z~JgX>paaUBZOM zLR-#nrQ{DQp6FcB<5|WBCP(r-NoX8C4GN=3`ay;qCK8D>bO3uTS8iL)lxmMbno@1+t4RP*Te^0P#X9vh9xR#WZieR3uboDfw&>mxwUi5FNARVzrJ@$<|sei+44=`DHau&pkgy1H@jc9{ed$)+a?njsz$b|$DoLa!8B>z7I!Qd|i}rej7}Ux_+FTjTEQf~Q z9zj?Qc+EcvsJt1|tk32Xyak&3oCl;W>V({RBdn1LXK_Bn#VjSNJ|Fd48p4H^QnOBJ zNL^4xtn;zDPZ-YxC=WQqwJn}4X?rLl>noo7CsQXS@kf?-Lz|12BEK6ZM2#s*5~P!P zHlsq$TciI4pT8S8)4Pn;IVg(8Qb&Z+jEYR74KW|#F1K`EqTvS}xP6VdOGqP;eFJP3 z)Sx3*G1#7eFp~M3hqiSpr9rn%4wwiXUQ`EG#+}Ho=SP9KWd^2EQ7LIub9}Y-I&~;h zT;YmHXtu-x?-gF-`&=xb$kxbkXtDYRz8t7f@pWQNL%> zG@UH6Y4<0~(!*sGA$Ck!1fWnuG2d@-Os~bd=f|&7S&9INY7%b-;oGyDYjt*CxN+()Wsx*5h6Xg%lgKXekWV169lSP zXiXhdZloxUueoOny^xu3NiM6b2;sCg61=VtgV`eeqFGQ1aZwRT&sRSbh!)o*4?15K zQ_C}&NX!)T|J{k}ewauXql&)Y;(JeAC*4HtE2b?D+zJ|2Pn|k;XO0&Ki_*kY8`aUv z0cvwiBna<6wW-x-efm3HL4^~Pa)mIivs}jj38}%1NdQpAhFc*GdB7F^Oi}q!o6hiwLm_8) zR!JY&%XUX7GI4m(o8>z-BM|lc`Pt55Dw8B(EX1`$603@-Z$=e(MZJg~+)zmBU1cq= z%cz^Hr9`gy+9Xjm5%Kv&AJ%CvlJ2%{!O|<~YJFJXD=XYF<1#BODY0y zrA1}#&APxQ5maMcT`FUh6~YEEsjEpLMDCtHJIw4NoL52 zfL*#3c~rFdNOd%E^y+R&`W{#|k})O`;<4u^Hgv5Mb4U|Gft42(Ob}K-k*Ji80(F2b zX5Cw)*voj-C|kN-YJ`YeB1DU876=r%Xo(B3bVY1|P?|1ETTAQlEmDoLa~3S8ZS-Ik<2%I=2D`O7(J>GMH_O(LRCcGl<`rt zQAypcL|h&en9k}GTdJdAW$V+yg}xp>>cVu3U8af0K(v&w3)IuFG1U-Ay0KX?sEI8z zvTuN)TT(6&;ZB^q=S#{tywjRQRc*Lv)essLDzJ*ez_Q+QCoXic*lfb4$g8E`;~~*4 zJwHV%EHp5D=&NXlZp{X>MFT^RS|H0UYJ=+vD%eSiP~Tf3Fzm=BMFQ(B@i(&c*n$qv z_%xcRs$of_KvD4ypcr0kXD!BqX(5vvb&y!740|nh)s;^p+6yYhgLk7$<*j|w>;^f^D zx`n=Vi_p=QghiKIf|Yq1PU%e~TgWzNZzY|0?uBc7c(Rh|qEZnXEF(i;`%yKEba2u< zlBg|aNs&m;3?}P~QrfF*NmSjXm780L@nB1pPQ*#@^axPOe0uB_pei-c5di;CC*GEPWynT2Cn`!hJBG=W701}l@(Fj&o0;6P>{BkJ zrFQ*6Z^B`?DN{AcV#=5CkBWvzfr{o9VS#NkLM0W=kYvk=kjVW;NK~E;3CpMF4}}AL zIN@}b5R+LUDHonN&pA3>Pddo`GI~kNYw6`9wm<2%mUm$L8WJWxMWVW*#$DTt&7yQG zDk<~Qku9S329{mqpAiXmu|CMiT-1;-aqt{`u~ya+560i2OLdzoq!+KKL{ycBc*x3K zw$wvJfinx<5{s6}xlv&j4NSHaEBqx?ufUEr3$}Od{~Lx;u>0#9Rkld)=oWk$UAIV? zH>#r=p-Sv68M(z0n@hHc>=P1QQMC){=Zr`e4M{AkB2i!uhOyit=1{CgAG8`lphzAK zNzP|f(+H$J_57Hdpqee@A?pf^s&#kZ(z-=;o`FZ`JE+zg2w{aGar}wrU`9eBIO}QV z%7u?fB*NAO*=FW#X_U**=!&E))!i#(eciy{b_Uhj0**SQ!|GfbYZHm*Nbbc7Z|N4P z?zvt?(p^}ye8o0*2}bAVY9qT2=#y$%(iI&R*oZ{1ZFMN)ctxX%dc|@Z6=gBYT%R3M z=4#Oy3zZSMqCjDpcS}BcOAwYsW?=i4I15B4F})?WU^)^1Y||IfR_BRFs_Be4YT`30 zA}(68EU<}_nYSEB+o1r3t>D~oz06Kw_VW1fbp77vb<;)DE-z2{^C5pO`P1+7_2cWq z>r4Lk{P5bJ%rBpU@W)>Inw4(_FvDAJAnmWZ#b=Ff3H69!Yy6;_?Pl3`Qx*1!z(JO73IHKZ_+hAHA95B zBgIpE6w(AwC6X&N<%9kilq8W!vO9jQJ7wu(jW8j>2qcB#&Ic(hmUuwSI; zD5N?wqT2Q19`!WJI;`O|n~=;i)nlVowVJFKU|T`as%%kI>F~y*{WR-|=mC*cXtac{ zQYt^Un%0prj*mz!qJVrLb#1J;zSSgKbYf}NIbWpSEvZ>DbD~dzQ8_IIN<4Kl3MqK1 zCkIa*Y|sWZD4FY+2J zY8b!2>2GU#be@eq{kCQofc&oKV|M0GPI~R{m_E#30`>J;Uaiev0{xHtK1d#W3U1nf zY^k;au~5=m0+=gu7v1sltG8qn!@#m@|DnB3s-B*x$hPzuAoK~a%i{#4GMDRvl3cCPX diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json new file mode 100644 index 0000000000000000000000000000000000000000..866c0f5b249c26e540aeccc351a6264bff01a525 GIT binary patch literal 69306 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 TnUAnO^NUY@biB!5-@gA3GtEU< literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_evonode_status/msg_EvoNode_244e3005966550cd3cb2837d3bca1c40d35547373d23f3ba329df2b6d993b374.json b/packages/rs-sdk/tests/vectors/test_evonode_status/msg_EvoNode_244e3005966550cd3cb2837d3bca1c40d35547373d23f3ba329df2b6d993b374.json deleted file mode 100644 index 6eafe3314ea97f2673a8c9d30b73ea1b912ded8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12549 zcmcJV+iv4V5JdC5pP^^M7A4X)^%MDkAXwxEWD&y&68mYf|DHPCBZ<0BjpYUC6}1}n zbXQkjhBIFmzy9*_`M1B{US1cQWyiOdKYstLuV0=Qo0qre=Wg-#@0Z19@#pL7KmTp+ z@7Lp9|1jQ-%e#K{u<3_keZTnj>4#5W7eD^B*!}JA>^1EaajxOO=LXJFfEVC*QG_DM~`14g1 z@iw}MmnArMF0Y{m252-(c@ttPxQJQuy)FmD@v$3~RSdXAP)2$jWw6v(T9VP$b2(zY zkxVUB6;y_43}EYAJavmo|y*h+3~q4QwT@_GruaNJh;e$Rayo6fYc*?`m15EsenyF6j1b= z2nbcrUxfaX?Js4NY6}^_qODIY5ys4ak*M6k($<8_r&hq_2A4WgQvn5nqQHyUW-9vD z+2zH_>u1}mN{2@ST5@`AMXlGPb`j**Sx`yp#?M~doD(erecwK)#$8?fnHu^u%g3sv=la55t|as zZbq?OTunc_+A38|qgp~3xO`w6J5m>iV1mfwEVEG9jyMJjVJghUb-%S7xm*FVzEERs zP5laBKRYzVuHufVRzdXkn2=O75n!-t zv>y&?75w-WTpn}GFvkVDY;Apb(bH5lX+W~Raj{WN{U5gIz{@JBo`DQDIT@{mpY%w) zem>VoFN(2CI@`IIF4|VZP5yR|m)bU%*3z6~mkpZLqwETIQzx&%UJF;q=ILy@81{-1 zp3EF+YU?v6b?{RqICyD|1Q>DWFte!Phlb}hbnsB+kDkKE1Lvp~;*tk_vQJ}8#*>$EB>+O3KK z7@KyepPP649lJP@D3MIaz;oSI)hmfh*(*d0cryJ8Q-t9(+ao+UPaAcv9GA;`bjeea ze3sqBQ+cUu@{jScgon4YL#_41!(`xz;TeoOkoI83O)u-d_3K^Zg=LjsW7EXI?KmtK zUwB`jMLp5Z&H%#;LA6&VIxlK|wD5Evv6!Gc&PzX4*Zn%Jc7nwDDYTWLWl+4V(p=oc za-`mFKw8L}nJhnXyZ%~3G#@4)l_8U+2g>TLgf7rNv&1C{AN_FfU*(HFe*X49^`u&g diff --git a/packages/rs-sdk/tests/vectors/test_evonode_status/msg_EvoNode_fbdf15806b1160a9fb482d5663371cdde55f94897dcf9d905573b01fe445fbc9.json b/packages/rs-sdk/tests/vectors/test_evonode_status/msg_EvoNode_fbdf15806b1160a9fb482d5663371cdde55f94897dcf9d905573b01fe445fbc9.json new file mode 100644 index 0000000000000000000000000000000000000000..ddf9cb236289b9f0a37f75381e450751357bb53f GIT binary patch literal 12517 zcmcJV-EQMX4265WkKt<}v24qZ{1SbDqFD3~=%PVd6v@?M-@WG}N49Lsnxjn$II(O~ z9P*GnoYBnJ)vv$2eE#k4x0lz|aozCg<&WP#>*JT_)$!%+`MFuW{rhEgT>bg_`p@z4 zv0XoO`-jb@e`wdc<7T(pKCZrf`r*^p)sKIzjz6`VZPTus?IvEkrfr|}xz#(@ov!uQ z@>xQ=rh7u}@}}{vJN-Tvi5Qb#nZ4 zzbXX&lje0p%yi3l@%M%A!1ufIO%EM_1+XxXKJ4C76Nhl=M z*K9K+xxhiYT!6yEO=;pv9zfUu0jE3;050DtakdAnD%DJX3@~*HD9fxV~rdra~OBI}w4OKE2+KaE5c-d;P!3=~MSy7f+PB)ina8Z-1T$WJV=ou}OS|!r3MrgIZ)G-R+}9TKjFG04QP zBW#H2j8matYer4*E}{ri*l*MF%hV}Jy-bFbUuJ>@jkq?5piBdnFh9I!CX8kvrlhd4 zlUD98QtR@$)SAJSQ(i*>E3d7SE%9_C~x2G0trPkyQMZudoW2ZFxHrSer!HW>~ zlA)xTui36NG)t{l!w8$lNzr|~jh4_~Xa zLEq7)3mqm~P(Hk7KPI1q{U1vXKvV4O+C<)KE|M%Sys12LN3CM#X-2Y&X3qFEf%B3F z5L7`n?GRDZ+RzLX9uB_dgx7^a-uW#A2rqdk0B&aOEShWif%C0ZEqJB^f|9}Otq9w$`K=0Im+&)$ zq9#IUNwhJX!!TC8W=dKHaH7H%4~x&SJmjZygvv>~ODxJRm%bz!;{acUeWma!$gDf1 z;1mdE9M`A9s+5DBBq>W+{)QuKY|`;LH|x$jbO^*bM2!{+H!+W@#w7;|ta3cSVfYOR zB^2Y}=lw&lv3MMvrNt)h+z-2lxBAA37fxz4l@MQ_oP$ZhW5T7;U`SADS$`*x@L;sF ziC^D6#9e>DW|&x_ouo*|fp3u`rCQtAgT?SeZpog{nT7<~aV=AgvB{RQefusa6Rg!HpNL+AtG14Bjd|0^Nzia>myFv%Cxa6blTEC#5As4h0e3?o%%h=G;(l zL>W}>4EAJ1qu?)VXPiZowNNeZJ84m;+T8dL8_5enbv8!LKxC*9-c{2rB!Ztc(E{pC4=jsRIb^5A& J(A&@7{sYu-Q}F-* literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_GetIdentityBalanceRequest_24b7371202615ecd290e0fe7496676f04dc30c79eec5a5df1ab5b8d8671ac38e.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_GetIdentityBalanceRequest_24b7371202615ecd290e0fe7496676f04dc30c79eec5a5df1ab5b8d8671ac38e.json deleted file mode 100644 index d8dff0972b79c909c388f5c621a362c4fd1beeb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42030 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 t<^R~Q@fp!|W71ujZM)BiOpX-vG9<6SM#T diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_GetIdentityBalanceRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_GetIdentityBalanceRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json new file mode 100644 index 0000000000000000000000000000000000000000..1a3bd55df0eb95eaafcbff291f58f225aa99bf5b GIT binary patch literal 33615 zcmchg&5n~t5Jj`*DbTFF@aM5-FfWk@K_mF;Nr#b#QjyBMt9q(*Z=kB9q)dB|L((^ z!1U+)zuvSbKjr^V&pti->DkA-pMSl3`DzPn+kSU{Xt(2T+g{}HmY>`|<$nGJn~g=s zU5b{a*G8jhqW_I0Z#2 z{@K^@l3KR7ZJ%0HZK~cabW%KB_DP9|>9jj-6e{<*rD7>vZY|K$f#0z5Rspw-XtSzS zG2VORJWSCDV1{BiyydDD|KG@f&Op`#{X{RG;^Fx-+o8c35DJKdQwP(tHOqUCZxEa!Bv$qy<;_fK-vZPtcr$F zh9P8ONKWFZm6=e$9hou>-c5|S!SlE`BSEs44;a^rak8*$HT>q=JDJYVav_ zN}B5U@#E4=7n_3=FVX}T9(s3HNg|OT)gvY(7k?r#*rh%T$tumU+yLk>(9EW8 zVl>B9RdTh{+W^s1Ff3Z=AjDi%DL}~a3U(RC=A3{@cxYO?S6G!RiI`(&1kH`4l0oGn z3`y=L3)Z(k37PLfOr$JeBF~52L~5iNs1u7LH6{RbeMwHl$F? zn4l*XzL*#nWGxRcU?1 z#KedI?Hq2aOHpq^VDhSgz;ZKz;YH=14wdv!?W2MR1vP~;AWZNSN79dE{huGqD**Fd zwNEHyMi1>Q`NNzt3Q4;e7oF8cWH3?0XkDWkp|~M{3z1|iT&d&!=mr1bDA|<5hN(*j!(~magg~BEg<7EvC;8w4V)HGC5)L4L_b8Q-5vZ=>$@-*V5RZ%b)?jf+Wk`rgNT|F-rc~BRS?ymTDHkcJ z0j@LLo*QL@Cu?p-KN$fkDpMu0w%0f+_-t;1C!U3lONmrdH#*HX5m9Acn5kMOih-RQ zrd*iFsAz3fs~~6)CvmeLdfU^WgpVqD!9kOafKXMloMeCMpz^ z35#2m=Do1qq(D?*_>b<0c(Ek+^mE+EK}dy^c&7iZ2^8#Wo?#1rF7BhXXu1U z1Xh}$PG)MO8^#4vw$Q2y?r=%D$UIfpmF6oK%|wwZDS(C2*cvV>m$aT*@8=hZgzbt{ z@sgWtb3iws)OyEWD+~5SvCtjG#_0xugc-zU7K252C`}L_HOo>fgSZ1uUe0G8xnQJ* z&=jgT9%Xp5j4eEsQ{dvq)FmY zCagEZi@sh^za}8_>Jj>pyTU?F;YwsaBvqx}J_b8RyaFP`OO>WYqlct=ryU)g2pB;o zev^XhwNNgUFzusP-fny-cs`W8eMUQv`GE3#D0+Q9Iv;`F zKKg(7uzB%e;H{_Vtmy^;8u?NH=!cWCvv6cpNKV@o7s*{QCs~-pv$vjJciA&bpR7lCfs2togeX$~OiWu#vphC)G8x{1k^j>c6o|MfFx8-fTFjQ`Qe}tJ?3@83EyPm!-rp6ePX1jbjh8k8@>Vl^w4$`F{ zl`qW_kDLjtj~XepOB1X03*47yz+{n-6#X%gwW0&s&7Eihy1Js02Ms_^?nduPJj$w~ zig+7!soGi-tjxI#IJ|z-xuy+!F2;mer`FpZl!vA&tU^2{8V=dED+f}0O)RGzDO-Ij zSy0_n2QG7AM2{;*C8~vSBM)dqB~8!-H9jg4BMVSh21aX`sEQ{Fk?JPodKz~YhmeyO z^zD0%kVGTYtk2Dqmsw+KwIDknXsW~%FjbU!HcaBeBtjNOroh4o2q7hLQ!8Aw7aIi07iycn zP&`Zus<8fInOfOyO5!F9u(ryXLRsDhL4|nWR_n8W(`UgDd36a1<=_Lph#TL}`yF2- z%i*cLsl!`1`)oaY5$-G>^NqTEPwdqf9JhCdc=7G&JC6U`n?!W18J5LDB_%+T`kD?| zk##9OJrQ+9mn^J?N?C`Ctz4o*YP}i;kp`PcWYM%biP%Gu2}uPL9YlAguV)H{`SoOK z<~@^Dt(PzB5dQ-4LT@`T3?)Fpv>RDOGz_sZNfuJj2+Srf$5J7pNQ+6zE7Q+xQLP;w ve(%Zm^*?FI*RF4ee3?1lOh3L&M3Ra7oBhexynk^(f8mL%U-bw1@%q!>IBeD- literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_GetIdentityBalanceAndRevisionRequest_24b7371202615ecd290e0fe7496676f04dc30c79eec5a5df1ab5b8d8671ac38e.json b/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_GetIdentityBalanceAndRevisionRequest_24b7371202615ecd290e0fe7496676f04dc30c79eec5a5df1ab5b8d8671ac38e.json deleted file mode 100644 index 3a8d1cbcc09f086cfa3facf9f3e0ea4690f8eb01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75834 zcmeI(O^#g05d>hbc?yB+Sxoo*kfTfZ0D^YbLNH(%vaOB4yF21lk@IMgocao$jbWfE zO>^oeGa@oFU$^x8oA17R``b^y{^RFg{`U6!?|#qQ{>AO5pY!hLzvSHy$8Y-E%j4zd z)0_8q&p*F=fBN~f=6e75{EN%^7k8&OcekfS=Qj_hV=oWyPOIL3_M6is*Sm+)vfHQU zH;>onpD&N6UtI4`v3$1wdOhzszj-*{ayh-Z-k*{=U-|9?*Y)mn{r&0Z%hT!2^>WVm z=@iQ2`^mzOA5(h!_g{bc?Wd6S&tL!b)A7p>`R9i>AKv`w&F^pj{MWbN|8Tk9-CS;O z?ykq{{^oLdpZAyiyFWkV=llsrmoB=$3HDj~`KI&M`~3b}t3Is_2jiN@o2PgA@%H%F z<#@Mn!t*%^v*9+(+osa6AD@HhS(lrr6X5f8<-V`66 z&k010>ER{^K3s1?VdER19eyIR6}3Z*QD5u%r~ zE=qAA1?q4qyX9K%UEfm0=9X{N`-zCrMhD}TOL~D6MMIJ-8d5rrW|7=qY*MH6n?f!^ zsl;b>3t_d9dr3bkcU>pFMa?0JOO4Rt#*?W>3o4bK5n#D&6B6rCr9KK!)ZXeqe_Ky^ z%1P>iAkF#f!Dyz|CIX|>GGYF@X$~V&yOUxeB&!+iJ1Jg|pX@s1l0THP;d0CVFt!j@ z9RsL%;}1Ae=KQ{>gvSz(o^C&d)7kYfT)Vwz@@ZtrMwq z$;qHdi{0ih1Ow{$gm&FPic%6sk(3Kzyv`$B6x*DS3dwpZ+eSt7jp~!?==md;<;k-t z&=qJ_8zD6Xab1gFM?014#vp-HLGyKpRDQkX_=EQIl5 zm5#j8{?MhHi*5<;Qd1l4rs=1t36BL?1l*{WtEq=4YazYo$E#_q@;HxO5uIlX&uk+w0k(lf=OT|0m=$0KZ!M*`w8C}dLcH%F9JOmM_|0rd!B27P2^!T# zBH1FOv{J+wrW(=QN}}9S!7EmwLlSQy_z8wGScRwsWptM%mMG zL>t|r@rP*i&vK`7$`)x-O(dQmxy-&sTavpds!=5iQq<9%8LmVnBjSYXl}RbWXl}I; zLAX~)7Ll&4AC|7z;=ELm#MKq6)QG6Jr0eXOD>N$cA8kxSw`PgqLj0<|Rp=ffFN5n{ zBP&OGE zwOK0{nz(k5q;QC8y{`?0*!svx=<5|oN4IFr1}oIzde%X8ghX2skLi}=B#X7Eo2(8P z8HUAUhbjoqmYZfxA<^OJtIZc3qa}dz2CEdUwf2&!gBnVNM8GCxv6tz1v?X>V@*Y`J zR3##9RHEt@o#+m?Cz13~TIgt08S02}OuW9~?$N;LV+2|}fTckwBZ|;nPnM7d5q3qY zTXfzlbkK@o^$L7O*s)Ckwl=F-YiB=-Xua7P%Mp@LK&l(=N)BVekJ^{`tJ18OTI=GN zo@^POPl@+YON7@%@PTf_Dl2b=H(O|MIuhY6DI%HJ3s(@viHL{r+>-G?d6fRxL~w}e zme{7`u3fuVr0Yq`n~A7-#;;UeD3xkn5^3U+#m4!aa3rKj2QeO$^a?q@A<24WdA&b& zb`lAd-&l?Kzb@{C{A%ad#Ke*6VCqQd`L!1jTlvE8%ZTENbHh|4Br+f)51v=2)`S(*7MQFx?U?f#8D^B`5QilSaE0EFpVTmCXfp9 zEKK2!Z9|eGszTBxi1E0`@q%$QrI(AS0CNS7D?R_H5eO`EAlg)=h&tiK)tsdTmk2D_ zDoR8(6F-6H1QY?qYlR-tep0|j+drO8uYL|Ifqo|U& zSVu$37U51OoN}i=Fc_3lopfyEPVnaZHKV$RJX zQq+P<;-ub4D_f+IH86c*O-N#%y&`a7BHbl$)qG_Aj7qSo2qke!Iq|gm2&Lpp@lX*B zH&Bt|q*}S^6=>-tdZQ?Ei)drWH5b9mIpl;4HW$(PUh7}aVkRym)^G?YDvEgER!cJf zPrgK)q)^SCXg!`^{ByomL{Jrvs@o(mA|hLk zUF*%I<)B(h`WRI!i0U+o!Yi7%xJTD-*cwWOqe|jp=0!<#*m!h{8)kHFSzt9ai`2MO zQ)@N~RIIQ%8Wrh0iD>S@R?KZS3+XR~H##Rv*J@Q~!=h;L#C1>=;)-gtK~ZJB8kEWp zOM7NP+>t86vJ~m8Yq_E+1XYoD7w0AN=q=%ba>;tF(+$xoR+K_M@X_-Tr3oz6QRXO_ zSh(MzH8lktm}9WYbs!RvSFTdm&En{)Fgjx0_55HfTn}s^BsqKsq6m*zzzT|$Q5#b0 z8x&LdG+#=2Xq&cREmRe_rNYzxo-NX^8`a(?;^^N&lq8d)P5m>`p=j$j~6;I1VZ&72< z=Q+eU+Ct$K2HX0j#OC=@4&5R;9P7!lDs_Ai;9iN3KZE5gPeP|$Y?Qhrvk*!6{C}N+uU&j$+z;8c!Ez`l57e7B#cr( z=f_>8PJ4d%l{(c?F!9&@qzgByaG_gLbVB#Yo#CY}kDs43B%&L?6)M*%5A2UUpX8MD z^K#-SkzNsCCHEby_FA4Wo)nr0A-vHg1D8}^JwY3>(t%kQC~3i_jTjm#*3PFPS<-9+ z5~eBx5nEwLlWA=xB)!EuU9Pa)L$NqU7bkszm$DuvMpNRTql_%Kt==Mv>J`IXm#^rS zRFH@~TZ)y4WWptN+M-6rTTlvDwurlq+(}o3SK3Ok^6{xWB8lx30$1lixuU=-gUMZ< zyqa~^ixlS;Dv*tkmd`hBgaYxjS$FC=IHe55f~{#q;7FswYy3j-$k%FN6g8C(u@=fC zg;qgAqVnJPlq1AZ$^#`yq*>rN%IkxzWKnGMFi3TpHl$Z1ap_!~^?|C5D{&{{F6(I| zNXmrjNI^oH+!3%5xs+T;=w6* zf+GV@w`@#e8-YdD1XR{*`6m}G=g=p$Q@FBTDq>VLR8Y!U6gbb9kis}&+bd$NbVYz7 zx}`1}&&F3I=&R!vdVHvLD|a{rHL8eKI$gKm2+{Q$i71I)t?PA^tk)NpIO!3EH2BaJ z*rvI&1Wbx26`Da5S>`LyE$gn*ze)sdsr!jF^@?m!t%mN6TZE3$jM~1JKTjxq|Nl=e z1+IcD&QPf+BZt7&No+{*e<_ocxn;367tv5r^N|6sWtgrcTbgoqY31e?V%#6`8Wozu zx;#dW)B1`wF1lP7RUmF@%Go0R)#4(^{ zC>GZ%@{&ZdUUTo3P>KFPjEqE>cZ{l8q*72SGq&{-4p1oIK66Q#Oh(99B1JLAx|R&R z#Wqr;kVb(B9Zg)PtWhJB)eowZ^_V3)jB*!q}cOw z5n1$};FF7h981@zk_(riPq3w4%BucDBu0(0eyGvRAvGxG(<@Txs$S6{#S@kZBCXcu z8@WnRG=7~BqHuw_;pN`VZOmoJaV{^D<_lE{^u9hnU^1|42{SSYsa42h;$KZt41QP&&Ph{ z3SHbDEj^viZ~XoNSFezi$1Oy$v5+ZLBvIu@qSQB|3cRANStfQBQfCqzzmr09U#|Ko zkLC46H3NfW-7QH(=C?^7)@d&ixaKWbdL>;Z~N1*utSOr+1pTO_K6l$Rjf zD|7&eUm?6D(R)V`SZ@RZR8QUr2~$`Peh|&2L|q0wst`pRa>YbdMBbF~QM6G>-OWT? z9u%0)>H}M5ll4U@?NzoUs_xRt%`L=uu%${T;v{%_1Sn-bJ$8#wFy$>-jB=nN zs^Q2?OSRK@Vzcz%6Ku0ZLaMe!MeG0>C#1QI!m+G#1r^Q)N@EKuFj$$Ka!a-l<54)( z^{^(nqKqVQxn+_lyw~|fw<9Xvl7f{kS=&LZM()&AgY8bUpt3y#oY)|+jYb*sks2xK zV$u5SQ!d0Ax_+ZK;V|5kshVUl<;(a-MTbX$ipCaUfo(HFB^8a3WXq0_$o-Cxs5~1I zmQT+=6b|&^gwt6Zti;vqA4*-{S?1rBU^ODtL@=SGEDG%(pxtnf>yUV$BL6m0KW|8E$Mf?Z$VsIo0)d*E$Z^_6lme};OMP#3l=!&XcNZ)5fvS>(RSrv%_yD^OA7BPon zb@V~25d@0l(U9bPMm3E<+EdSuxe2P-LLM@&z^Gbx8!oL|ROcCZguabxt$`3$7!t>y zc+mf=C?tZj9%imw_?SeAv@XatGjB_yoQ6hMBxR}YULou22L5ShP^~TCs6#re&ZV(7 zk$8^eUaatzZjtI9>s2J(g*D4pEOVD&Y6voRRvX#1L7!C9l&C=kdYPTV?B(|6?)t6Q)1r%} zU0&|;=Ux6>@~7|f^X=2k(?kAsfAiGej34iU@cUl+l$9?9Fv3fyJ37Q?jb0Jz5yRH_ zMk^Oh?&K~S?)e*^SEOvk-->N6B7aMl!7I!hM!S@dCRU4eaTHfwI*m+4l3kK}&qsK> zKDYQ(NxAeE>6=|2H44Jrl26aHrXpaaK7vHJ>L+3;EEVmxVO&WMu#`fK7yT#a8?fyz z-|AfLFN+dtvubPVpEj}E(XAdw4{I;Gz1-||t*TP=QX#A7g?}lpl7GBx3`tZ{E6RVf zUZiVyYK91LM~bKTD5MFVN+efk${YPNC`lqiekP1uA-+4bM@12$ZT$gMa-l><53wyV zEy`UVbnx-FCW^jWU=gUnAORKYARTtGMkVf1u7^l!?k}{F@d(naW9G!jMjJeaIKwug zlHALMh<4NkZK<=V4%1xFKdW|Z0S45DrE81Sspk+O0af~tj#M83+fqgD8j>_7T0G*R zaiu6JciBR2pmTbh8By(evCVoKWgXUVnoUTCl6q{ks#cTr0&KMrt;!Zfl@1?TrHV*A z7SaKcT@fvX3zE~=A|Bq{Q%A};J|eY!W68CrP|nXT9X!kffz{eHeWGI&C7JJC$mIN;>49 z(aG)0&oA;ZSU(Eu_c#5vrbp-5=;OCFs{rJ?p7+_AKRM~C-!Z)#Ujp^xwS2TTz6AQO zd>mZ~u_CV?gWSOmFBc$f7vcde9#vXZ9w_5ZNplJAJF?U&c|w$pb+O)_YH ZGmgu(o$w2vJ$~UApZ(Q*lYjmA;osWS96|s9 diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_GetIdentityBalanceAndRevisionRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json b/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_GetIdentityBalanceAndRevisionRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json new file mode 100644 index 0000000000000000000000000000000000000000..c8e84fe0b6afdacd8430fd2336e10d1554bd930d GIT binary patch literal 58938 zcmeI*%WfRU83o|1^%REITyTb@B>E-t0ETz*!Uzxt&Shih-E&S=OKjSbSYO4;A}}zN zIAm4-mvi~6dwluj)i>X~{`U_*|KrD>{`UIYZ+^+!{^0iG_j&i@U-Is|@tgkkdcC`O zdh_=5{r%||cekfsTppg@TrQW>oBPwU%l*?Y-kdIVIbZ8?f4s;?o0j}5U({C=frx*{`_m9ox;jVwan9hVE9sdyP{;9NF;^qD6#q7=O_ei}ZK0I9~ zEox2=HxHLKD&O~&j-_>ZjYJ=={Yh88)WFN7*=E(~Vxk|J_idWi1Xd{4fG>p_&HpVj zMdw7;B>j1Bx?PzY6i#_n+6wDOy?cxmKK(O_NDm%iK_G zc?&I`a{o#fPbN#sJyp%?2klzLa(`w^E8pcUZRt??`j)AOmtE^z`>f?f+xXR%H2FpO zpSQdnzO`KYG_&=>XRqRg>s#vZgkW42;j3X&O3~ev-g2YL_83k;T;9?Up(<0b|e<6EZ5S+(q!Et>zmcZLL6JDc2tvMp(V7j5ePNvEv_F_CruS=p?a%G6skgi zD9M+(S_mk48riuxTFrXqU$@LT=BShLBEhsY$a#kPc^zBU!JT9ld^6(|vW`V+)Sh>} zc-L~8?6bFR?|QFd6rwUc3{+)7T;$O8=@r43#p4bP3LkI~51Uw|Eu&=Cu7|*~Q9z_B zs#a3pKrn?+Z(F$9LS~%ycI&*s^IE9bMumz}`((Rj)hKuf?0Scu{K2jt=aGC$s^~(f z*e%hlsHt#dsL7Ti%8O5^PF~#;ow#DN!gkd{wO1)z*j}en%?1wPZSx69lqWRQMsFGM zIYHJ(?O1Q^ouCVdWjnQZJhLQkPYK$qz(;Japkkp?co*j-JZT}q_GYyuTdKWTg}qpN zLU0r;pT~zDs#AhkXyFhGrIwZ$A+6-oEzZDJAtWpVaW*vs9Y_L%_-C<Yu3ZD-5R= zH6JBLwg}b@5g?@GZpqyine!x}Y&mKt8^n>(5MdyN7*<0hJlZ9^?G{u=c`IrP4{d$! zP~`e8A*9;qEfQYm#RQ#X#Tu8Bq#h3nw5YW}OFr$7=#&jD`G^*J{md^aSr7k7Nm$pE z(j^*pa{Ys%C^yntLbR(&3_@WL&wv|Pub<%$u8PSVy%jhDbgfUOe4~u=t(J|cnm|%Z z6U$^F0mk_yM0F8F6qL+v5>(oY$MV*mC?cymq2ON7lNA+$gS8=21tGZMhpB?5KvL3U z=Z4sYhXmZz1#j8VxMG3yXdwwfB%h2@_!33ns4gT#s}Pd6@bpS1RN;(Y?o0U#LL4lGfE5vE(=+!c5SbV)QqvA+LFlrkG)}5J>=8)TK zKc|GH@IoehDF1^RH7Z;5kU0t=_zDMcPwg>P6Lx#kDuok#S)93`2*x3$mcU&E)mQP8 zi%Bg4k*esZlBx@Ydcp)#DL~+O zEp{2la!%-$@KB_EbeP(eLP*!KO*vPz5&lY45#Fa0!`rz2uZ%pLHe~=JsSvKo$n-{P)J5kpO+p;3CKHGXh!{gP zB!tNgAa;m^DYdJjou(w*(Dm9MXikJoE;R7fVj-VMM(*4@K?vN9^*YodWZjaklFByh zbYlxOb_$ucBqeQBw5&plXi;E%HZ&4S@{NiJ6val%jy@=z4_1 z3?WtE^&<+RQ%gt`@xwBfCjP*JvT90+LdUkOm+{wp(01xM5+c2AdqsWSlJlxYS)MXA zG{QRTG5?93@f>f%+tmzlA>n}q%|5(UENVK%MBN)ekjP4q&79jjS&|Q(Qs!+Y z`al&Yr-BkG^G*^wwyYa$CWT

tnBGO6-|QOlEyam_|vj%0qFdij>@sOeT&YKu{)u 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 RSfBae(T}z_`QwN8{{zmNCI0{b literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/msg_GetIdentityContractNonceRequest_815e2b4de88fb56ce7ec833ffe8901b95a32865deb2645934954725fbd1cca03.json b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/msg_GetIdentityContractNonceRequest_815e2b4de88fb56ce7ec833ffe8901b95a32865deb2645934954725fbd1cca03.json deleted file mode 100644 index 57897bf779e280366ab135396490287bd8c0409d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57449 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_GetIdentityKeysRequest_c9aa65558b4f8ba10bd7509498105dac7fab00a65264648889a477f081e30ced.json b/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_GetIdentityKeysRequest_c9aa65558b4f8ba10bd7509498105dac7fab00a65264648889a477f081e30ced.json deleted file mode 100644 index 6cdcab983daa881803d7e29a51e4a979ec6bdba3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61812 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 diff --git a/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_read/msg_IdentityRequest_c9b7936c475a5143e38568b7474138f01ebff9836643f8c1b4facad64077f80d.json b/packages/rs-sdk/tests/vectors/test_identity_read/msg_IdentityRequest_c9b7936c475a5143e38568b7474138f01ebff9836643f8c1b4facad64077f80d.json new file mode 100644 index 0000000000000000000000000000000000000000..4b7c2724f6d3c8406437d7081a77ff18889ce26b GIT binary patch literal 77833 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 X|L{}aKm740esJ|y>zn-X-P`{FW1fuX literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_identity_read/msg_IdentityRequest_da9cbb7a9f245221fe2a5d7fe5dd40a692960262df24a300d226046c57048de7.json b/packages/rs-sdk/tests/vectors/test_identity_read/msg_IdentityRequest_da9cbb7a9f245221fe2a5d7fe5dd40a692960262df24a300d226046c57048de7.json deleted file mode 100644 index 973d06ba4c7e06a1a8ff96f1d5d37cef433dd74a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100135 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 X|L{}aKm740esJ|y>zn-X-P`{FW1fuX literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_IdentityRequest_da9cbb7a9f245221fe2a5d7fe5dd40a692960262df24a300d226046c57048de7.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_IdentityRequest_da9cbb7a9f245221fe2a5d7fe5dd40a692960262df24a300d226046c57048de7.json deleted file mode 100644 index 973d06ba4c7e06a1a8ff96f1d5d37cef433dd74a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100135 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_IdentityRequest_ec8288b622e659eee0ea5c67d54eaa7b41821696e9131d8bec0e3b4c9cbb6ed4.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_IdentityRequest_ec8288b622e659eee0ea5c67d54eaa7b41821696e9131d8bec0e3b4c9cbb6ed4.json deleted file mode 100644 index abe3c317df40098448c6249f0e3ed7c24c83d1d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131608 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 diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_not_found/msg_GetPrefundedSpecializedBalanceRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json b/packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_not_found/msg_GetPrefundedSpecializedBalanceRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json index e0f0b7f4df5f55da8e1d29522449aa264deb10c8..1028ba197e94c6b286f2a64aba03b983fd7653cb 100644 GIT binary patch literal 32258 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 C?$loZ literal 35654 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 literal 137846 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 LX+GiGuXq0f$^W;x literal 26640 zcmcJY%}!%S5QVemDG+Nfe8FbM^AdT0C`%Smq)bGT*&yCM=c{huG8o)n3rkD}+x=6g z&Z$#nHn*F@m;Ab|zm|G6u)@na36pRMa|;y0zI_RTwU*8P%VuA1?il`rwk@*$?{0HQ zTm`qSd)U`IS+$}h7m1X;lBSGf_?Gwyp?`8BqTOM$Pf)i6buyerMKb=h*X{+{emgKf zxoEj*`L57`xPMtEDI%u*CJXMbH=&UDTGHyBe8ih2fYT8#L<*?)xVn{_ibI}VMnRXu5O#QUQf!D{-z1b(ycsCVq1~-XC zU*l6wD`B+@>o0Ec{mnonuC}07Qn@Gf`O}n?*R2SQ6qzkr;f`mO@n-#w`aR9Bz_wNr zB3R#Sf#pbHU{nF3qB3%A5Oh=~BoZ58s6-{V@#7lR zm>*w#G^t_TLdwLIuOtN^(%fu@ZLT;)o7}Q~3d-hIo|m!m zB0BxWlnc+d}4wPGqK_ z5ZfbKR~L#9HZ9s%?F%yuP zVgd^bwz?f^>*UQ1R6kNa(45~|!Ne7G5^Lm?W~3^j$;o-(+{KhNoXYUHNIDS12%=RA zk>jaW>9mYDU6L)NLYN{&(x<50mQ6WbrN&LaNTOzdM2F^xPBkeflozTUg*oaFPm$=V zW4Oy$$Xy<)l)|;~TOj+J223%DWw7Ep3M>(h6VZt?yD%l9GF_nWGR!#RVpKv1aq>&b)~t%o!KHG;ku^Sakda= zl7sQ&eST3rLi^0NiMPZkKV_B2i(`2%cO8xD-4!VoV#-CoWQodI#UD3oPoQ zzyODl^aaC6pJH}lePh>fVIWVSh@w=VLLns*M|XgjM3JR1Vl6HTu?))lFg?Q(3mw7o zm?;JeJepHbORw4jQer^{J2hoV%=)TEqQ(H1_6{9pN|(LKa4Qqrs>rbEZty6_tI8FF zRX&x9Od%-oxWNjbIy9PlBapiWz!eb}$*o%4u2(NhrMxMFR z9>2j8HtNYTt7n;r$4#`>BWntyvkqS;I#FM#^a*cF=QW4M2|sZf3yQQV8&cY|a*R5W zDn>Yv%Po}g_I6-JBHKE<#CdE3%`AhR^~0mZl3h$$fhC?`un?7O7BdGYdFO$s4TY4e2mwNsluq2>yg=k67XEQ=1oEia#{5=f{$@e#Wi#<>kp)s%vq5 zZ1mD4X6l|=G3C|yw^slWzEqj(qFI0NtWghcNmi9R2K9J6q{yZ;!K)G}A9au?`lq~L zZSosW6yvjnIXHCrnWDg_)%Z$OVpBlCqOK3JzPWXmYN7vRM02sNU5sCqF9@#grqvG8QkJgT#zMuys5enaB3cR;au=o;4+ned z$TBW3k5rjm6GUR@;C(QB+6hXB-1Py9|q4~rvNdeH|(lZnG!h4KckcF=iUb6dz(B2yuQa_ z>D43EM-z}|v-8mLSC7iCFM+td_WZQ`Px(H`T=tOMv;i{(Z6(Eq5_ZWA5wFP6?AFaM zcF9pp29{Z(+GC5>(-W1lEqe_R`b=U&ABi$qg7N&ADP&c4rb0SASKJvk*m3r diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json index 5d2c7891797e05204f971a3de22d10b512edd0d2..912fff5298e94fe86708cfbddfe491f2bc709cd8 100644 GIT binary patch literal 33806 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 W@!GEUnFjrtHy*vTp776)AO8mfToAVa literal 31788 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 diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/msg_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/msg_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json index 3b399bc398bfeb57fde1b2c5394cc015bc8a5126..7c8fcbc37f6fd33db3956140826aa5f4f9f4eb9c 100644 GIT binary patch literal 34881 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 L(R#x_-+lNU3z5qb literal 33213 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 AL;wH) diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/msg_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/msg_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json index b1065b770a7a9a7726aeac12ef608c4015aebeef..156a7955a639d678191450ae260f338727d32b13 100644 GIT binary patch literal 34144 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 literal 32146 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 E0TB7aSO5S3 diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_02381273a00d2e9ada5d2a65f02b6b091bede36307dc69b46eb65e967bb84bce.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_02381273a00d2e9ada5d2a65f02b6b091bede36307dc69b46eb65e967bb84bce.json new file mode 100644 index 0000000000000000000000000000000000000000..203681b3b021eb285e53b4da6ed0019dc17d5eea GIT binary patch literal 49403 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 J{`vcde*-bTwQB$X literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_0329cf0b8851d09d91160eb04ba78d45ac35df7c4a541f2fd79c4e53af000a92.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_0329cf0b8851d09d91160eb04ba78d45ac35df7c4a541f2fd79c4e53af000a92.json deleted file mode 100644 index b06a885243ee86eb129f8557113f3afae2c9671d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61084 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_0e309af16c3957b15807f1741084729771183f61b1ba73796ee966df7ce206e8.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_0e309af16c3957b15807f1741084729771183f61b1ba73796ee966df7ce206e8.json deleted file mode 100644 index ec7ffa5bea19f264b2edb8d60b69bea2ddfc38c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60973 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 diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_1c64f28b411c0c2d689236e1780f46635ec4cbc5f228d0d6f1af26cedcf8aa24.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_1c64f28b411c0c2d689236e1780f46635ec4cbc5f228d0d6f1af26cedcf8aa24.json new file mode 100644 index 0000000000000000000000000000000000000000..86d3f08e51753977d5b66ef9578a2b84794c237d GIT binary patch literal 60829 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 b()&&aUe4R@zS5w-^2UQ-tv}?ie}DQvvZcmw literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_2e98e756bbec29c5a8bb6db95209822a2c4f59abefee6ac70309345adad1c202.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_2e98e756bbec29c5a8bb6db95209822a2c4f59abefee6ac70309345adad1c202.json deleted file mode 100644 index 2efaa4da15238eaee5dfd281509ee78c679fa6c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60883 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 RVSVNopZsWklfVA?{=Wdc5zYVr diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_61f016345ec587c57ec95cd35ca21e65356ecde06e41dad1c5f4221f2021ff65.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_61f016345ec587c57ec95cd35ca21e65356ecde06e41dad1c5f4221f2021ff65.json deleted file mode 100644 index 319bc61225fdc32c1bc61ff773b0d10443a6da10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38984 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 diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_62753b0c8caf599658c8a6becb2a0c949e21b06d4ba0ba04902ed9dd3cf9c180.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_62753b0c8caf599658c8a6becb2a0c949e21b06d4ba0ba04902ed9dd3cf9c180.json deleted file mode 100644 index 4ec9e25724c1f4333ae31c0616c2eca61bdd3c6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61325 zcmeI*-Hw&l(FEWea}^fH`(XAk1B`DX7Z633W#b41!-V_y1L)JQNCXueeuQPpI`j==H(BsAAkA9FZs4VxVZf~-@SSJ^^b4Adi(PG z7hk=6{oN0De)aJ$zkicoou6G^Up~8deszBG^x||JcO3cAA>X|E>Dw3IX7zVpzk2gx zE_(NV_2U<>zx~{Gx4$|ryS#XQc|Je8es+=nd%rzF-L881`u3`~KmPRFn_j*A{^i@m zaru7p;~&2J?#+w-==D#pUfurm>o?!z%$KkKm0$Fr+h6?W#~*%vF@JdE@h<;;_vqcD zzdicp@!$Xb_{)EsFQ1&w7pEte$Ls2JK0nX*=ltETuk&^OocnziU7fC6cpsrR#p@5}1fs@teaeB?m#0wJ_y%alPx7n&@DRZL5uY1v zS*U1o`;5Hb2DApSBC$kt?^Or*zh$QE+!1TiyOmde)o*X!tF8EcOy|M#5ofSC_I^Sx z=gUCSgFf-Q?rHu<5jES&qiVUM%1;&0$2vTJ1Y@x~qWOIN-Q7OEZVai2TP|i{SEiGP zyG;G+ikp7_sqB7pPo(i#D1NheNG$qV-*Uea?%dMz&vy9rlZ8sWb46<QqLzcgs8J;mib~`&0VUyw`2&S(8tPUmjBD~j^wWf||4#*{An*zn1?kj%_(>67A1Q;aWL=;nYYJwvAlm2_jXy+- zhm4e2PN7>pB#M$;Hrhu;t^-xFAVo!ld3p7Gpo_vf_z}ns$HAHm!iLn?<4`QHh85e4Pz8 zh=|V!cdd&AroKVkjVlnVb|TqQg=mi$U3J|sy=xEBp}KR0(AV>mxK4v{e%}IF9KdQK z$%XtjqU9{4x*N~3HcEuIn2nUXMFI;8THThlI{9z|>PO@Q!}-+;HlCmZtjH>p z$vklHVM-0>KzLmwGZA5=q9ujk`c^ACZP!be>=mexZb6aEErji1Q>Lrbxb%wvwUbD6 zC?k5SiJTB0RA&}4>NK8%M5qqYIpsTpA<+{4syb<=>i{w)$x+g@#bMtYVvU8AjK!G4 zsr7VyvXHjhEvXa&Hd|s8(nE_P)X2Gf1$iZnRMqFD<{ zJKQCH;jTTJv=J73a;Q8MSXv)o#abt@I>q6vsMr>zBtmouO7nbDY|a;(?G=bpx45FX zj+Q&=j&CGoVXY}+|LPX~5GRAN$|Igh!_Se3ZmB_$M+wXO zx{64o#ZcB-8accVHTpOZ?kEN9+QV?xr{$)gEJRL{wKlJ=7cEWq&@7U;bk(vZQPuY8 z{Fnfp9~R{NAq=$|BDz0bqQRL45q>8gY+PVX%TE!B+)#EYV$qEbz>BklrJxL7A5+({8Ne&sHMhosyq z5|wP}da0wX58aY@w`9GFibO8)kkxcCHb>4BRktot%9LaBBvXw=Ta#~YC2}25N<|l|!B^oY7NCeR|pLJLF_^UlB;aNK>*YpC}GK{+LuIGM? zBBYRxB63A@kI1PnA03CX=oQoiu~Z{hQtV`$M1F8#S!cSC>b5$H{HP=2G*uNv8+1if zB-$HRz{Ck_O(BVsymP+Tc(XvaX;jo!vR=xESm4DteHEYhqzHo+Z`3|iag0mI?c(4= z`ia*`9|<^xRP>|v+bd!(l6Wc0E=in`0`eN|vckz2YYw;+!ol92^9phM@B#V8HllEek8R_jC8cnVgfn3_WR zY%0raNmCqopx|HdqYc`kMY`;M4JOD-vfZN3_>m~qPH&N^RoAzt$oaJwS|5sYg>=Tr zg{X9H!NQ5>Q>~S5$$fGmqMfEBxwnWU@vg_lUD09|RM%CA_&{5{tS=GxfY~i-m4gTw zx@KU~BPekNsws=YTM?qwnXhh%EsOkmOSn*lY&cuCh_lU7m0Y^zc&!g<6J+gW88xLh z^%jzfkj~sG-9kY!HSqtGgG4=F_|-;F6>5$TQ z<`!|40vngmTfzw5(u<^`Lm$C4&ZjL+JX4JfW^)VjxPfr6qFj=`x<{hwi%7{WflIbD zcb!;ri>r&^8oBda6jwnbDvy*44zz_g=Zkj*D9U1DC3ZTuP~tq;Nm+i&D=Cn?+XBR(8h;E& zp27;Ow(>+JMfyKzF=aWq3sy~BN<-z>cmkAM(Jd)h@yxoPOfNlOxErXdqPj~(DC>JZ zy1@vE6w)mSS4EYVxcb~8(k17l#SI4KF}Yawz^<1OJ&O|+bk(e<^K*DYLdrM`beo*t zQB$m7ZV{~J7BY~)E2UcQq|w`A8B|J{fYVw?vM7x15|1SFgWNSh0iTQdJ~tTn288np|7NqE$e!sTLvMdzWvfH^bJD^i62iwH~K*9nyh93E3K-E%Df>p)h#HJL3cavvUJ-+ zHL5%?(iM3RQ2b}=R-B>dYc(YctfuN*5^qQ$QQ(bJktJ4CsP;0BiI)+{g1BfGAVVN6 z{q_Fyx)qFOA$3$?phvYL!nkx~lT+kPa>^(xifa6Sz5l%S|7Lp1V_ktEPUKfE@Oimg z;{4QH{(Ap;jqX_*T223F?>`r%bS3Sl_)cj(EnBG3$2lLGyIip`K}oe1Uh)4aS^=tC z()gr>bvUz1QBEcuVB8KX!v8x)j^@l-8yjg4vtH-YOC$ioWe-J_T zeP+>orMTB><(3H-)_dnkA*CV-Vggsz>lNi)pR*!hib}E`A|X+&FP;TX!5^YszhZ;3 zfJv5HmR%TJdKlG|tJcxRLl#cC1Fnaz3+he7ri$456GWUXbw{3qb*G}LZZ!pbK(0GU zwH6{#V9&>SwOeFBDyrF{lU~*fedR(DZ&dhr(mJA$hGGS);UQ2INtr^*_@T{Ch_iAK zVVAGqNm~S&lDq6h4F(IXTQbW@{92pECs9c`@6>XxAW4X0Hy(A=#6u;v(Qr40c41*^ zTTq=_#PJI3Awtu67{Ob5k(6EsGl6TIPg|O}zd_M05?F58KsZ>@ElFR?d<15sdiTui15+PxX;Z1Tc!g)zxlN2iO*px;k>nB#i z$V^<}9fDk*z$+2~DvKMKIvW*i&KIB>f1;xCSi2I&(|&;vS^TMPvHcuw=Z6A)9LN<| z5vsioMZ$7b5h4hvWG!4bB(f${MLVg~&Zvd{ci92DSSM#hbzUJr%|tMFYLVlLxY;^Z zDyMk`)HTj6d4*s+Cf zq0-CwcKAlo5oJh0@kt7*y^SXYA(~pYy5FB|eJNOOiyfJSEE02FNb0?jZ}ey^feu#$ z(ebQ7iMIqYk5QrJmJp$VC3o4lS_XN$m?$Jzwnt-_mIoDIAJQ-fU_2Bqb-F zY#|5B`3HULbhpHEi@XIifl^VWzhmvsi4Bq9e*S)&gymn{t}j4LVYa?1NcBqw}^YW$g&$(;gh9@B`6L`7LdQF8vwLRm=e^t^dI ze}NUC{F+68((1#O*QrLvxf+6S*DL}QDrztY*y0sEe}j&chA5=BAY8>NFOlxtLV-~= zJ>24()A_#t;jf!TvBg5qPx9wk{+#ot-{oa$h#6!E+Q|&kKT5Q zH(W?aO(9q<*2SUTMun41x8x=8R)h#|*XI_IR@ZM>x4tKd2se>5>kR=b^${e()!9ir zoTU=1B#S96%0j1o@6>_FfNghaYxtd)G_SU%{%I4t7~SgW=wa<;7w6Mn*QzQ7=?Ymr zFZ@e+P5!k%Bq~(d`usSvCQr=}A?}#0*W)Qf3Tc9;DnEQw+em>T7J`x_GKg3Qs_S!w z`0kGVWYCZzD%VFdq(qtvKJC@CDEA~HbWl9aI`N3k2YtnA`7MxciFEarGz3aKi!~~7 zkC6pk(X8?PfRw5N)sQrCea1~xBHChwvsGJ|D@6UXYR48}e!F4mWX_{t(b?(=(r8K_ z(veanV5?XOsil;V)DXm@stw_yD9QTD`>2a`=SF~y*{WR+-q+v}|q0th)l~Vb+)wGV3aePFoZUgd$)U~nV z`sjpuw@xh0Iw6VFyCpS?Qi1A|U{p?1fg&gEzr|BMIe6+|gErU-8eA`T)y_`BMYGO& z$-N=rBUl-H_&RMOo;#IlflB)1($UGqANw{~)Np)$(@$%9blzfn|7p!C0Qs!vd3NSc zPP*x5OwY!LKz(~HZ>^0Ff&P%sgY=OvZ9ukETY*?8DTM*d6}gJ;`;WsqKx1H4*m||c zP}I|tJK2^#1B5;Sc6ywkRL1j?EkzZ(@~HEMw@gR3Bz=N6I@~Z*oJfilI%5k&%P>-r zTuS0$j)pK6dv8GvPqj!clX~5fiC?x@Wxof2?l$Cro^!b0-aL#8$ om;Lt+m+5VHJ|k+9LGyRxIA69Ce&X}1PyFJeAI)#_*FWF=7yqe>&;S4c diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_6324f0ce91119010ab60300a78dc362866cbab6d8388743fdcf5d797910561df.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_6324f0ce91119010ab60300a78dc362866cbab6d8388743fdcf5d797910561df.json index aa5a28ec90c97eedcec1b3628004e4f080c05b93..8e8d48d74a8c3fb0051dc0d1e2e2299bd0d4618f 100644 GIT binary patch literal 57505 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 literal 60649 zcmeI&-*Q#g(FE{Z^As+w&xMYV0Qn{I0I8JAW#beT3@O0Aaq;fy-fIC;jIH%sg>vPu z4xbTPf2MnSdS>sF-yVJQ&EsERynXlb&FjbCe)C&?>_1$5`g?wQ_x}60@4tKh^5+-d zy?p)CoBZnaFRxymj-~nai`PHi`QtbPCXmlyMb4XZa`VgA|C$GVTK=E6 zZ+?Ao`}7aFalU+VI$xZgTppjR)A{^7KcDm8{{1?C&!2OD z&Z4W+_4BT~yXp4UtNi}YR()D~aWk)Zdb)X*zg`^wIUheQobdUagxPQ#=0%}2?5CfD z=vn8}^|RCU@sC$s{t@js!y=W{|)W4b=&!0XFXQrP$g zX~)0hSN+FB0QX0HZnVupMU&fS`ThW}2N_Vhy}c^6IbpCD6JO#ROlH~slb=ze!kr16JT{BH4(SoF2N<$fjHx~1oz?eOa- z3zc~5iq=Xh_g;Pe&z6+eQwXdS$rYn;*IDg)Ie()5BhB9eJ6cH+(evesS`G@MMin3w zmB@8K;HV^|5*uLrUx9uuvYWL&08#_xiHd)bY##STeRL z!y7=dMUpb;T1PR}C}!14PZG(0B6#I0=@8%r5&=skcJP*{vY0JMr|!c~%JBL~8Eyr2 zi4xQl%*=vlqgyooBw9RVKxR25-RdDxlwjFt9~HR{R6#+CiU{-Z>T8o))@_rr@#Kq1 zDG)R_WmviD6fNBL{1lXOi}O-$sjDkjNrwo&N!QsmS7=n?KWv7FZcXROh4_`Gdx*Rl zT&})mK@vAaNV+A(TJWg|X<acqxB0eLzYh5HT^$p71xB|IqCz35yi1vulRo4yEyY@&rRClhB z^!5Az*J&`$?^^)HL97A^7V_JOmQhG`H=bo}G!fonHXwJ41ePplbsK7R^5F*5kH`mx z^Q#qXJVA$8kyDxxRm6~!dEnl|lp4;#@VZDQ5XneIOA5jDtyXl}u9q&^D^MZbf+Cq) zh}*-aOjoIK=@%ht2S{`%BYLZeoDd&WCkh#L8qbkLs1DIN;hn*dXo-JSoix*R0-2Lw z6qvR++4qK6V<9DDG3Ib;JzXCZ(ssKgl|sa3ON>H#Xj#g00l`mwVN}H;QI#vK;sO_X zvzRlO?n76k!3m0@7M6B$m-r=j?a`!-WWgtg%0r2z^&wWQbrP#n9L|c$ZCMHsN{6sC z&nLy^e6iVHfh={4D~juAxs&erMj%Vp3K{!Xx9FER8H`mP@k|vtLsHe z(>)YLfJ;|x)+DOhKAj&Ep!1UjIe!R4t%efaD?}I@>(_;y!)@_sTg#oa=Q~~wN%(9J zrS)p^D(N_+RAuAWK6RMzI;%D9R1Iol!{=N6I)Nu00>4=Dk#17O#y4c%Xh`WHM;kj8L%$g6Od4i`1$5%FF>_ zU4hwRd?Npi2jyq+9Ch6*q~#U0WMQg8il`{!9whIL#)0GC1hULkYJrF<>L^@1v$>Fp z>-mzqRuCqx9;+ek-6Gae>y!RfVn=nXr#oGhxW(zc<)EdyF@bndR8&-|X?B#m5S3i4 zCnC9%B5M4ay9^!zxmP4A+0yk=M_r$E3-E5qdKDFkT;d_C>0)e-j1*P3E>S{CGMGve zdQyRAr!rWnjn^HghVJR2}IE=A|Z*Yx8RU4ZlMl1u&7rPT|HcY_wZoXibGSK^vbl*EjZh^ zRLSZODUt`aIs`>UC9S!lq6QRCplTiIrjW3d3gP&y55pUEF?B0k^%jvw*9W^yCL?{8 z!6-^mXjD;%prFO=N-{+>aqCaG83v@>8hKuTNS3qs!TC=)VDAo)4JU6RB+)~zw55Rs ziza0~<0%J{)5go3jYh8%2#(hE8R^>1LQrTHvWu!un-R*dC_mfUD2pE(h*UKLV63*Rj%?8>CP<_7*&%juAC@wn1%8mR*9c@CQWo+*XGG1#qqRt z+jmtA?eP`TTzUmQ{&&kpONs}Q2!}|7;Rbe)yw2E!uhNqBxuPG$-gb#|&cL#cJ%YC} zGTaLA6gZu)EY0=8QYn(jc~Hvjd*gXwh(ydpp8|>{WvlRU3voqVrtwFC(wL~|a{hYl zOfol|R^snth~#Udu@;ClVxm+#OXFWI0m@gI#KU(USmLOX->D)^aaxIJwLb6I8Awn_ zR9&n+5$DX(o7qN2h*?3pB`;(&?-8VIi4RcoEq0xm!xdRUuGo0@OCto%nMq%JoTRTh z3=n@p??y5!QF}uQ76j5Ql0jPBkRn12Nfn}x2{>f-DGw7D$lXP`US6z+*Pzx9|LfiI zI#;P3)W&d|9XUyn()sm#(Q4gN6jc*QMN{VrvAIIruTc?-n39}7QD_zpPloCXaA_+l zzoH0Haz(e`Akhhm22^}m+K@sNDr#iVav@jrd~|~m5?2$_Rj%?8>CP=w=2T6xIILRm zX}$_}<9TPJju2ueU_xLR7bGI9s-ejn7gQEZuT^ z)_dzDSq8Rl!3Vdog`%RxZA{9o=&Gy=MJ*+&Q=EYtPvj(`?RtVRv_#E9iy{U>=O?5z zBXQVVs)%ff zmFbHt!QPM#`0Lo`dQo7pt0y0I0a5AXiJm`lN9oi4Ska22dOo?C43I+@77wPZS71n> zhXjL?+lYsJyXRwfDF4TIU91*TC|b%{!QiqEn7I63ID<{0 zw?(a{dQ3IzS8Sl>LW@=fMMFXqEr$?`B98)1gvTvpVgpMJeAzc9{N?rB9l~uG79Dnd z9woFn`Y2mNmLzIa)k!|m>FNp8wt`yH-FT!8)f32YM!G2^ETze+*SHc@9ST=nuc8fh zX@4Vq6jc?aC^V`lL{L!C_2dvs>DHnqccQ}&4`;l2QJ^WyL``)X-%zc_lf}xKxB#KV z4d)l^(+woBZc&A2=G3TU{p3nAGJz|-1N(ZrPe@eSN2yW^8`#$;mI4=|dVZpk8c(is z3xtI6Bz~pH;@7DlU7q+!3iSCpS71dn%c8vw*n*;}(6{tKExB$;WKA;rm7Fvq=||l% zKFba;ZZXuz>bydTnkW!Ewa9UW`Tz}?^9rnsW?brGkE`q=kLtq_O(1(Bk?JdO}Uc2q|%3Xsx= zj;E4dZljq@j7*w8<67bmvlzuoOD2{~hcTk)csAjxkA$c&b4#jB0}FQ9lEuxqCS_et zd8;E{p-(i8KeH=&MTm`PDHj>12}Kko=T8)xg)%6*V#l+~O5IetY)BGkcXWBhU$-%qP9rnJ0*IcA^o#X?;9F%C;iO7D-=q7$80lb>s4Y z-NmBzh7>Faq+7(LX>mh}2sI>CND?7L1%mam4G&4F(r7C2R~X~7t|d7?fe1ogfC2H(=KoiKGNTm8EYT+u7sbG7B>rl(K+)^%(+ZL?kZiCpdg>IqJ%lUTr zM$w7W?s#Azs0VI5DM+Gstm&ay!j`v_h-GW-R3j-PN!N>{>Su|GLzWyYgpOF`sK*lr z0dFm5ejp*`mLx(03wGJkz>;xI%DSBX`j+|f^yI!zvyi!3vyff%Om{rvtWQ}gzoNjm z3f-ceJ(GhPf*4vu3Q^Qkl7;NTEwsMpqZ^EnNFm*lbO>GLDj$*V+#=E?=X}7$H>dN( zJ>`6}$X+b;{3L&#<H~r1{>yz}&=e_qPEAIoY)W3H zU_{2z357G^q+EO$r~t89NCwC}Kn!Qi_YbYr|O5aPbNvYUV;k60R2O;^>vV z1t*zq$w#nPgvp~~$t_Y=jcUWX^}Qc5T;OTe8v<6kB1ojGej=8_QVCarVoHlp=(L~l z5B(<;8L{myU$J?$HT6%M*v05pPe%`HFS|IO_PSP8DNI+$>Uqh(l-JBZ=BH7i%GPJ| ziJClBzcv@VrAR4F@Koi8k7^rHgOBzI$Vh}GE?0=}?$}QT4Jo2}&(RDCNU`I)mYNn} z4-nFo#8cFXM|57uAy%f>Zi#gD7X0e3ENN8Y9s>nkQPlW8Acm<#H6#VD&$x+7L|d+K zwraC*g{Xg4?J^)YgCdeHR!i3wsZ-A(LW-*C!*rzjh}bGtiAqT1gtB_NwIoz_>`j9L6HhNN(uTGjzdKqq6B+Gl4jBM$>77+X@N-62X-peZV4Rn&*%Io-_cs0hrr*}|=)7Y4_-)N90r{@yd3NScPP*xLOwY!bKz+TIS8L--ps(_MkWBL> zH*G++R9m4~Qqo&Om@9IX-Qx>|-jY!a1IsR`_Sm9&dZHrR(r19APl!$WN|dnFjOQa; z$|`o{5mm$MtL1xMVt@JqwCW{#qr(j|#fhX`p)--NJ&iRh$viO_{E)nnm^<}|NQV@YxM+F diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_86088d93d1bdfa513a66ef126a9872937c56537dd54618a39819b4233232d497.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_86088d93d1bdfa513a66ef126a9872937c56537dd54618a39819b4233232d497.json new file mode 100644 index 0000000000000000000000000000000000000000..26825615f9b57b56c4501e745bfcce6574e089f4 GIT binary patch literal 48952 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 literal 137922 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 ZPnzJldd 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 diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_c2737f6ccc2ac5cc79e28d4b29fb414d7808274b04acfe789740e18ecf0991c7.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_c2737f6ccc2ac5cc79e28d4b29fb414d7808274b04acfe789740e18ecf0991c7.json deleted file mode 100644 index 6635850ad051257aa8ae5c9b98c1d08de685c02b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50605 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_edb3ea19c943e4ccd318d2742a9ecfc2f026b8a6be6443de638da69f0b4c87b0.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_edb3ea19c943e4ccd318d2742a9ecfc2f026b8a6be6443de638da69f0b4c87b0.json deleted file mode 100644 index d3dc6481cee463b2bf98793b4e37c069bbd58894..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62866 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 bu=%@jTyEM4KT-Xk_`^rPT0i8U|9k&$^m4C6 diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json new file mode 100644 index 0000000000..c4e9f022e8 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json @@ -0,0 +1 @@ +8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json deleted file mode 100644 index 9d31d601d5..0000000000 --- a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/quorum_pubkey-106-74bc78bfed100cb1c7da3b1aeeaff1e5767efb0daf93c69cc8294ee246526a09.json +++ /dev/null @@ -1 +0,0 @@ -8fdaad8ac39e23c5b9e773184f5f54523f4bc7b1ed68a66b43c011ecfe8c6f3c38b5e8bae650b2b4434f4ff9f15e7417 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_ok/msg_GetVotePollsByEndDateRequest_90f99444544de47f7e78de44bcaca1b6ba4883a92f4533995dbfdbc5875d8bef.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_ok/msg_GetVotePollsByEndDateRequest_90f99444544de47f7e78de44bcaca1b6ba4883a92f4533995dbfdbc5875d8bef.json index a6610834d7143f5e8188b51f01e61df39be0bcd1..2cb13b8d747800c0ac71ba294710342efc669ba2 100644 GIT binary patch literal 96590 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 literal 137846 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 diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_order/msg_GetVotePollsByEndDateRequest_90f99444544de47f7e78de44bcaca1b6ba4883a92f4533995dbfdbc5875d8bef.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_order/msg_GetVotePollsByEndDateRequest_90f99444544de47f7e78de44bcaca1b6ba4883a92f4533995dbfdbc5875d8bef.json index a6610834d7143f5e8188b51f01e61df39be0bcd1..2cb13b8d747800c0ac71ba294710342efc669ba2 100644 GIT binary patch literal 96590 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 literal 137846 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 Date: Mon, 28 Oct 2024 15:32:30 +0100 Subject: [PATCH 81/90] feat(sdk): sdk-level retry logic for `fetch` and `fetch_many` (#2266) Co-authored-by: Ivan Shumkov --- Cargo.lock | 1 + packages/rs-dapi-client/Cargo.toml | 3 +- packages/rs-dapi-client/src/executor.rs | 94 +++++++- packages/rs-dapi-client/src/lib.rs | 4 +- packages/rs-dapi-client/src/mock.rs | 25 ++ .../rs-dapi-client/src/request_settings.rs | 3 +- packages/rs-sdk/Cargo.toml | 2 +- packages/rs-sdk/src/core/transaction.rs | 9 +- packages/rs-sdk/src/error.rs | 13 +- packages/rs-sdk/src/platform/fetch.rs | 77 ++++--- packages/rs-sdk/src/platform/fetch_many.rs | 103 ++++++--- .../rs-sdk/src/platform/fetch_unproved.rs | 48 ++-- .../src/platform/transition/broadcast.rs | 16 +- .../platform/transition/purchase_document.rs | 11 +- .../src/platform/transition/put_contract.rs | 9 +- .../src/platform/transition/put_document.rs | 11 +- .../src/platform/transition/put_identity.rs | 15 +- .../platform/transition/top_up_identity.rs | 11 +- .../platform/transition/transfer_document.rs | 9 +- .../transition/update_price_of_document.rs | 11 +- .../rs-sdk/src/platform/transition/vote.rs | 16 +- packages/rs-sdk/src/sdk.rs | 6 + packages/rs-sdk/src/sync.rs | 213 +++++++++++++++++- packages/rs-sdk/tests/fetch/epoch.rs | 7 +- 24 files changed, 549 insertions(+), 168 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a6d1c8fd71..8f0f966db1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1110,6 +1110,7 @@ version = "1.4.1" dependencies = [ "arc-swap", "async-trait", + "backon", "base64 0.22.1", "bip37-bloom-filter", "chrono", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index f3682130fc..e8ffd41a9c 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -5,7 +5,6 @@ edition = "2021" [features] default = ["mocks", "offline-testing"] -tokio-sleep = ["backon/tokio-sleep"] mocks = [ "dep:sha2", "dep:hex", @@ -20,7 +19,7 @@ dump = ["mocks"] offline-testing = [] [dependencies] -backon = { version = "1.2"} +backon = { version = "1.2", features = ["tokio-sleep"] } dapi-grpc = { path = "../dapi-grpc", features = [ "core", "platform", diff --git a/packages/rs-dapi-client/src/executor.rs b/packages/rs-dapi-client/src/executor.rs index 50913b23c4..17f7aa7d12 100644 --- a/packages/rs-dapi-client/src/executor.rs +++ b/packages/rs-dapi-client/src/executor.rs @@ -19,6 +19,21 @@ pub trait DapiRequestExecutor { ::Error: Mockable; } +/// Unwrap wrapped types +pub trait IntoInner { + /// Unwrap the inner type. + /// + /// This function returns inner type, dropping additional context information. + /// It is lossy operation, so it should be used with caution. + fn into_inner(self) -> T; +} + +/// Convert inner type without loosing additional context information of the wrapper. +pub trait InnerInto { + /// Convert inner type without loosing additional context information of the wrapper. + fn inner_into(self) -> T; +} + /// Error happened during request execution. #[derive(Debug, Clone, thiserror::Error, Eq, PartialEq)] #[error("{inner}")] @@ -31,10 +46,27 @@ pub struct ExecutionError { pub address: Option

, } -impl ExecutionError { +impl InnerInto> for ExecutionError +where + F: Into, +{ + /// Convert inner error type without loosing retries and address + fn inner_into(self) -> ExecutionError { + ExecutionError { + inner: self.inner.into(), + retries: self.retries, + address: self.address, + } + } +} + +impl IntoInner for ExecutionError +where + E: Into, +{ /// Unwrap the error cause - pub fn into_inner(self) -> E { - self.inner + fn into_inner(self) -> I { + self.inner.into() } } @@ -55,12 +87,62 @@ pub struct ExecutionResponse { pub address: Address, } -impl ExecutionResponse { +#[cfg(feature = "mocks")] +impl Default for ExecutionResponse { + fn default() -> Self { + Self { + retries: Default::default(), + address: "http://127.0.0.1".parse().expect("create mock address"), + inner: Default::default(), + } + } +} + +impl IntoInner for ExecutionResponse +where + R: Into, +{ /// Unwrap the response - pub fn into_inner(self) -> R { - self.inner + fn into_inner(self) -> I { + self.inner.into() + } +} + +impl InnerInto> for ExecutionResponse +where + F: Into, +{ + /// Convert inner response type without loosing retries and address + fn inner_into(self) -> ExecutionResponse { + ExecutionResponse { + inner: self.inner.into(), + retries: self.retries, + address: self.address, + } } } /// Result of request execution pub type ExecutionResult = Result, ExecutionError>; + +impl IntoInner> for ExecutionResult { + fn into_inner(self) -> Result { + match self { + Ok(response) => Ok(response.into_inner()), + Err(error) => Err(error.into_inner()), + } + } +} + +impl InnerInto> for ExecutionResult +where + F: Into, + FE: Into, +{ + fn inner_into(self) -> ExecutionResult { + match self { + Ok(response) => Ok(response.inner_into()), + Err(error) => Err(error.inner_into()), + } + } +} diff --git a/packages/rs-dapi-client/src/lib.rs b/packages/rs-dapi-client/src/lib.rs index 208c2380ac..9d04d2251a 100644 --- a/packages/rs-dapi-client/src/lib.rs +++ b/packages/rs-dapi-client/src/lib.rs @@ -21,7 +21,9 @@ pub use dapi_client::{DapiClient, DapiClientError}; use dapi_grpc::mock::Mockable; #[cfg(feature = "dump")] pub use dump::DumpData; -pub use executor::{DapiRequestExecutor, ExecutionError, ExecutionResponse, ExecutionResult}; +pub use executor::{ + DapiRequestExecutor, ExecutionError, ExecutionResponse, ExecutionResult, InnerInto, IntoInner, +}; use futures::{future::BoxFuture, FutureExt}; pub use request_settings::RequestSettings; diff --git a/packages/rs-dapi-client/src/mock.rs b/packages/rs-dapi-client/src/mock.rs index 98df667892..968468d8b6 100644 --- a/packages/rs-dapi-client/src/mock.rs +++ b/packages/rs-dapi-client/src/mock.rs @@ -290,3 +290,28 @@ impl Mockable for ExecutionError { }) } } + +/// Create full wrapping object from inner type, using defaults for +/// fields that cannot be derived from the inner type. +pub trait FromInner +where + Self: Default, +{ + /// Create full wrapping object from inner type, using defaults for + /// fields that cannot be derived from the inner type. + /// + /// Note this is imprecise conversion and should be avoided outside of tests. + fn from_inner(inner: R) -> Self; +} + +impl FromInner for ExecutionResponse +where + Self: Default, +{ + fn from_inner(inner: R) -> Self { + Self { + inner, + ..Default::default() + } + } +} diff --git a/packages/rs-dapi-client/src/request_settings.rs b/packages/rs-dapi-client/src/request_settings.rs index 7c900a7829..21a1f69b38 100644 --- a/packages/rs-dapi-client/src/request_settings.rs +++ b/packages/rs-dapi-client/src/request_settings.rs @@ -21,7 +21,8 @@ pub struct RequestSettings { pub connect_timeout: Option, /// Timeout for a request. pub timeout: Option, - /// Number of retries until returning the last error. + /// Number of retries in case of failed requests. If max retries reached, the last error is returned. + /// 1 means one request and one retry in case of error, etc. pub retries: Option, /// Ban DAPI address if node not responded or responded with error. pub ban_failed_address: Option, diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 98f5dd4c02..cbb5e7fe93 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" [dependencies] arc-swap = { version = "1.7.1" } +backon = { version = "1.2", features = ["tokio-sleep"] } chrono = { version = "0.4.38" } dpp = { path = "../rs-dpp", default-features = false, features = [ "dash-sdk-features", @@ -57,7 +58,6 @@ test-case = { version = "3.3.1" } [features] default = ["mocks", "offline-testing"] -tokio-sleep = ["rs-dapi-client/tokio-sleep"] mocks = [ "dep:serde", diff --git a/packages/rs-sdk/src/core/transaction.rs b/packages/rs-sdk/src/core/transaction.rs index acbbf4164b..a71a6f664c 100644 --- a/packages/rs-sdk/src/core/transaction.rs +++ b/packages/rs-sdk/src/core/transaction.rs @@ -12,7 +12,7 @@ use dpp::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProo use dpp::identity::state_transition::asset_lock_proof::InstantAssetLockProof; use dpp::prelude::AssetLockProof; -use rs_dapi_client::{DapiRequestExecutor, RequestSettings}; +use rs_dapi_client::{DapiRequestExecutor, IntoInner, RequestSettings}; use std::time::Duration; use tokio::time::{sleep, timeout}; @@ -56,9 +56,7 @@ impl Sdk { }; self.execute(core_transactions_stream, RequestSettings::default()) .await - // TODO: We need better way to handle execution response and errors - .map(|execution_response| execution_response.into_inner()) - .map_err(|execution_error| execution_error.into_inner()) + .into_inner() .map_err(|e| Error::DapiClientError(e.to_string())) } @@ -184,8 +182,7 @@ impl Sdk { RequestSettings::default(), ) .await // TODO: We need better way to handle execution errors - .map_err(|error| error.into_inner())? - .into_inner(); + .into_inner()?; core_chain_locked_height = height; diff --git a/packages/rs-sdk/src/error.rs b/packages/rs-sdk/src/error.rs index e55bda4742..223c7dc00e 100644 --- a/packages/rs-sdk/src/error.rs +++ b/packages/rs-sdk/src/error.rs @@ -5,11 +5,12 @@ use std::time::Duration; use dapi_grpc::mock::Mockable; use dpp::version::PlatformVersionError; use dpp::ProtocolError; -use rs_dapi_client::{CanRetry, DapiClientError}; +use rs_dapi_client::{CanRetry, DapiClientError, ExecutionError}; pub use drive_proof_verifier::error::ContextProviderError; /// Error type for the SDK +// TODO: Propagate server address and retry information so that the user can retrieve it #[derive(Debug, thiserror::Error)] pub enum Error { /// SDK is not configured properly @@ -85,6 +86,16 @@ impl From for Error { } } +impl From> for Error +where + ExecutionError: ToString, +{ + fn from(value: ExecutionError) -> Self { + // TODO: Improve error handling + Self::DapiClientError(value.to_string()) + } +} + impl CanRetry for Error { fn can_retry(&self) -> bool { matches!(self, Error::StaleNode(..) | Error::TimeoutReached(_, _)) diff --git a/packages/rs-sdk/src/platform/fetch.rs b/packages/rs-sdk/src/platform/fetch.rs index 1f97bb4426..80564fbdf2 100644 --- a/packages/rs-sdk/src/platform/fetch.rs +++ b/packages/rs-sdk/src/platform/fetch.rs @@ -9,6 +9,7 @@ //! traits. The associated [Fetch::Request]` type needs to implement [TransportRequest]. use crate::mock::MockResponse; +use crate::sync::retry; use crate::{error::Error, platform::query::Query, Sdk}; use dapi_grpc::platform::v0::{self as platform_proto, Proof, ResponseMetadata}; use dpp::voting::votes::Vote; @@ -18,6 +19,7 @@ use dpp::{ }; use drive_proof_verifier::FromProof; use rs_dapi_client::{transport::TransportRequest, DapiRequest, RequestSettings}; +use rs_dapi_client::{ExecutionError, ExecutionResponse, InnerInto, IntoInner}; use std::fmt::Debug; use super::types::identity::IdentityRequest; @@ -119,25 +121,9 @@ where query: Q, settings: Option, ) -> Result<(Option, ResponseMetadata), Error> { - let request = query.query(sdk.prove())?; - - let response = request - .clone() - .execute(sdk, settings.unwrap_or_default()) - .await // TODO: We need better way to handle execution response and errors - .map(|execution_response| execution_response.into_inner()) - .map_err(|execution_error| execution_error.into_inner())?; - - let object_type = std::any::type_name::().to_string(); - tracing::trace!(request = ?request, response = ?response, object_type, "fetched object from platform"); - - let (object, response_metadata): (Option, ResponseMetadata) = - sdk.parse_proof_with_metadata(request, response).await?; - - match object { - Some(item) => Ok((item.into(), response_metadata)), - None => Ok((None, response_metadata)), - } + Self::fetch_with_metadata_and_proof(sdk, query, settings) + .await + .map(|(object, metadata, _)| (object, metadata)) } /// Fetch single object from Platform with metadata and underlying proof. @@ -169,26 +155,47 @@ where query: Q, settings: Option, ) -> Result<(Option, ResponseMetadata, Proof), Error> { - let request = query.query(sdk.prove())?; + let request: &::Request = &query.query(sdk.prove())?; + + let fut = |settings: RequestSettings| async move { + let ExecutionResponse { + address, + retries, + inner: response, + } = request + .clone() + .execute(sdk, settings) + .await + .map_err(|execution_error| execution_error.inner_into())?; + + let object_type = std::any::type_name::().to_string(); + tracing::trace!(request = ?request, response = ?response, ?address, retries, object_type, "fetched object from platform"); - let response = request - .clone() - .execute(sdk, settings.unwrap_or_default()) - .await // TODO: We need better way to handle execution response and errors - .map(|execution_response| execution_response.into_inner()) - .map_err(|execution_error| execution_error.into_inner())?; + let (object, response_metadata, proof): (Option, ResponseMetadata, Proof) = sdk + .parse_proof_with_metadata_and_proof(request.clone(), response) + .await + .map_err(|e| ExecutionError { + inner: e, + address: Some(address.clone()), + retries, + })?; - let object_type = std::any::type_name::().to_string(); - tracing::trace!(request = ?request, response = ?response, object_type, "fetched object from platform"); + match object { + Some(item) => Ok((item.into(), response_metadata, proof)), + None => Ok((None, response_metadata, proof)), + } + .map(|x| ExecutionResponse { + inner: x, + address, + retries, + }) + }; - let (object, response_metadata, proof): (Option, ResponseMetadata, Proof) = sdk - .parse_proof_with_metadata_and_proof(request, response) - .await?; + let settings = sdk + .dapi_client_settings + .override_by(settings.unwrap_or_default()); - match object { - Some(item) => Ok((item.into(), response_metadata, proof)), - None => Ok((None, response_metadata, proof)), - } + retry(settings, fut).await.into_inner() } /// Fetch single object from Platform. diff --git a/packages/rs-sdk/src/platform/fetch_many.rs b/packages/rs-sdk/src/platform/fetch_many.rs index a9efb4ebc9..4653835557 100644 --- a/packages/rs-sdk/src/platform/fetch_many.rs +++ b/packages/rs-sdk/src/platform/fetch_many.rs @@ -4,21 +4,22 @@ //! //! ## Traits //! - `[FetchMany]`: An async trait that fetches multiple items of a specific type from Platform. + use super::LimitQuery; use crate::{ error::Error, mock::MockResponse, platform::{document_query::DocumentQuery, query::Query}, + sync::retry, Sdk, }; use dapi_grpc::platform::v0::{ GetContestedResourceIdentityVotesRequest, GetContestedResourceVoteStateRequest, GetContestedResourceVotersForIdentityRequest, GetContestedResourcesRequest, - GetDataContractsRequest, GetDocumentsResponse, GetEpochsInfoRequest, - GetEvonodesProposedEpochBlocksByIdsRequest, GetEvonodesProposedEpochBlocksByRangeRequest, - GetIdentitiesBalancesRequest, GetIdentityKeysRequest, GetPathElementsRequest, - GetProtocolVersionUpgradeStateRequest, GetProtocolVersionUpgradeVoteStatusRequest, - GetVotePollsByEndDateRequest, + GetDataContractsRequest, GetEpochsInfoRequest, GetEvonodesProposedEpochBlocksByIdsRequest, + GetEvonodesProposedEpochBlocksByRangeRequest, GetIdentitiesBalancesRequest, + GetIdentityKeysRequest, GetPathElementsRequest, GetProtocolVersionUpgradeStateRequest, + GetProtocolVersionUpgradeVoteStatusRequest, GetVotePollsByEndDateRequest, }; use dashcore_rpc::dashcore::ProTxHash; use dpp::data_contract::DataContract; @@ -40,7 +41,10 @@ use drive_proof_verifier::types::{ ProtocolVersionUpgrades, ResourceVotesByIdentity, VotePollsGroupedByTimestamp, Voter, Voters, }; use drive_proof_verifier::{types::Documents, FromProof}; -use rs_dapi_client::{transport::TransportRequest, DapiRequest, RequestSettings}; +use rs_dapi_client::{ + transport::TransportRequest, DapiRequest, ExecutionError, ExecutionResponse, InnerInto, + IntoInner, RequestSettings, +}; /// Fetch multiple objects from Platform. /// @@ -141,24 +145,41 @@ where sdk: &Sdk, query: Q, ) -> Result { - let request = query.query(sdk.prove())?; + let request = &query.query(sdk.prove())?; + let closure = |settings: RequestSettings| async move { + let ExecutionResponse { + address, + retries, + inner: response, + } = request + .clone() + .execute(sdk, settings) + .await + .map_err(|e| e.inner_into())?; - let response = request - .clone() - .execute(sdk, RequestSettings::default()) - .await // TODO: We need better way to handle execution response and errors - .map(|execution_response| execution_response.into_inner()) - .map_err(|execution_error| execution_error.into_inner())?; + let object_type = std::any::type_name::().to_string(); + tracing::trace!(request = ?request, response = ?response, ?address, retries, object_type, "fetched object from platform"); - let object_type = std::any::type_name::().to_string(); - tracing::trace!(request = ?request, response = ?response, object_type, "fetched object from platform"); + sdk.parse_proof::<>::Request, O>(request.clone(), response) + .await + .map(|o| ExecutionResponse { + inner: o, + retries, + address: address.clone(), + }) + .map_err(|e| ExecutionError { + inner: e, + retries, + address: Some(address), + }) + }; - let object: O = sdk - .parse_proof::<>::Request, O>(request, response) - .await? - .unwrap_or_default(); + let settings = sdk.dapi_client_settings; - Ok(object) + retry(settings, closure) + .await + .into_inner() + .map(|o| o.unwrap_or_default()) } /// Fetch multiple objects from Platform by their identifiers. @@ -231,24 +252,38 @@ impl FetchMany for Document { sdk: &Sdk, query: Q, ) -> Result { - let document_query: DocumentQuery = query.query(sdk.prove())?; + let document_query: &DocumentQuery = &query.query(sdk.prove())?; + + retry(sdk.dapi_client_settings, |settings| async move { + let request = document_query.clone(); - let request = document_query.clone(); - let response: GetDocumentsResponse = request - .execute(sdk, RequestSettings::default()) - .await // TODO: We need better way to handle execution response and errors - .map(|execution_response| execution_response.into_inner()) - .map_err(|execution_error| execution_error.into_inner())?; + let ExecutionResponse { + address, + retries, + inner: response, + } = request.execute(sdk, settings).await.map_err(|e| e.inner_into())?; - tracing::trace!(request=?document_query, response=?response, "fetch multiple documents"); + tracing::trace!(request=?document_query, response=?response, ?address, retries, "fetch multiple documents"); - // let object: Option> = sdk - let documents: Documents = sdk - .parse_proof::(document_query, response) - .await? - .unwrap_or_default(); + // let object: Option> = sdk + let documents = sdk + .parse_proof::(document_query.clone(), response) + .await + .map_err(|e| ExecutionError { + inner: e, + retries, + address: Some(address.clone()), + })? + .unwrap_or_default(); - Ok(documents) + Ok(ExecutionResponse { + inner: documents, + retries, + address, + }) + }) + .await + .into_inner() } } diff --git a/packages/rs-sdk/src/platform/fetch_unproved.rs b/packages/rs-sdk/src/platform/fetch_unproved.rs index 2d85dab7a9..ac3a682f81 100644 --- a/packages/rs-sdk/src/platform/fetch_unproved.rs +++ b/packages/rs-sdk/src/platform/fetch_unproved.rs @@ -1,7 +1,7 @@ use super::{types::evonode::EvoNode, Query}; -use crate::error::Error; use crate::mock::MockResponse; use crate::Sdk; +use crate::{error::Error, sync::retry}; use dapi_grpc::platform::v0::{ self as platform_proto, GetStatusRequest, GetStatusResponse, ResponseMetadata, }; @@ -9,6 +9,7 @@ use dpp::{dashcore::Network, version::PlatformVersion}; use drive_proof_verifier::types::EvoNodeStatus; use drive_proof_verifier::unproved::FromUnproved; use rs_dapi_client::{transport::TransportRequest, DapiRequest, RequestSettings}; +use rs_dapi_client::{ExecutionError, ExecutionResponse, InnerInto, IntoInner}; use std::fmt::Debug; #[async_trait::async_trait] @@ -71,21 +72,42 @@ where >, { // Default implementation - let request: ::Request = query.query(false)?; + let request: &::Request = &query.query(false)?; + let closure = move |local_settings: RequestSettings| async move { + // Execute the request using the Sdk instance + let ExecutionResponse { + inner: response, + address, + retries, + } = request + .clone() + .execute(sdk, local_settings) + .await + .map_err(|e| e.inner_into())?; - // Execute the request using the Sdk instance - let response = request - .clone() - .execute(sdk, settings) - .await // TODO: We need better way to handle execution response and errors - .map(|execution_response| execution_response.into_inner()) - .map_err(|execution_error| execution_error.into_inner())?; + // Parse the response into the appropriate type along with metadata + let (object, metadata): (Option, platform_proto::ResponseMetadata) = + Self::maybe_from_unproved_with_metadata( + request.clone(), + response, + sdk.network, + sdk.version(), + ) + .map_err(|e| ExecutionError { + inner: e.into(), + address: Some(address.clone()), + retries, + })?; - // Parse the response into the appropriate type along with metadata - let (object, mtd): (Option, platform_proto::ResponseMetadata) = - Self::maybe_from_unproved_with_metadata(request, response, sdk.network, sdk.version())?; + Ok(ExecutionResponse { + inner: (object, metadata), + address, + retries, + }) + }; - Ok((object, mtd)) + let settings = sdk.dapi_client_settings.override_by(settings); + retry(settings, closure).await.into_inner() } } diff --git a/packages/rs-sdk/src/platform/transition/broadcast.rs b/packages/rs-sdk/src/platform/transition/broadcast.rs index 4b06691e1b..7e4c6488c1 100644 --- a/packages/rs-sdk/src/platform/transition/broadcast.rs +++ b/packages/rs-sdk/src/platform/transition/broadcast.rs @@ -7,7 +7,7 @@ use dpp::state_transition::StateTransition; use drive::drive::Drive; use drive_proof_verifier::error::ContextProviderError; use drive_proof_verifier::DataContractProvider; -use rs_dapi_client::{DapiRequest, RequestSettings}; +use rs_dapi_client::{DapiRequest, IntoInner, RequestSettings}; #[async_trait::async_trait] pub trait BroadcastStateTransition { @@ -27,7 +27,7 @@ impl BroadcastStateTransition for StateTransition { request .execute(sdk, RequestSettings::default()) .await // TODO: We need better way to handle execution errors - .map_err(|error| error.into_inner())?; + .into_inner()?; // response is empty for a broadcast, result comes from the stream wait for state transition result @@ -40,21 +40,19 @@ impl BroadcastStateTransition for StateTransition { _time_out_ms: Option, ) -> Result { let request = self.broadcast_request_for_state_transition()?; - + // TODO: Implement retry logic request .clone() .execute(sdk, RequestSettings::default()) - .await // TODO: We need better way to handle execution response and errors - .map(|execution_response| execution_response.into_inner()) - .map_err(|execution_error| execution_error.into_inner())?; + .await + .into_inner()?; let request = self.wait_for_state_transition_result_request()?; let response = request .execute(sdk, RequestSettings::default()) - .await // TODO: We need better way to handle execution response and errors - .map(|execution_response| execution_response.into_inner()) - .map_err(|execution_error| execution_error.into_inner())?; + .await + .into_inner()?; let block_info = block_info_from_metadata(response.metadata()?)?; let proof = response.proof_owned()?; diff --git a/packages/rs-sdk/src/platform/transition/purchase_document.rs b/packages/rs-sdk/src/platform/transition/purchase_document.rs index 809d5d81d7..1ede5c247e 100644 --- a/packages/rs-sdk/src/platform/transition/purchase_document.rs +++ b/packages/rs-sdk/src/platform/transition/purchase_document.rs @@ -19,7 +19,7 @@ use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; use dpp::state_transition::proof_result::StateTransitionProofResult; use dpp::state_transition::StateTransition; use drive::drive::Drive; -use rs_dapi_client::{DapiRequest, RequestSettings}; +use rs_dapi_client::{DapiRequest, IntoInner, RequestSettings}; #[async_trait::async_trait] /// A trait for purchasing a document on Platform @@ -102,7 +102,7 @@ impl PurchaseDocument for Document { .clone() .execute(sdk, settings.request_settings) .await // TODO: We need better way to handle execution errors - .map_err(|error| error.into_inner())?; + .into_inner()?; // response is empty for a broadcast, result comes from the stream wait for state transition result @@ -116,12 +116,11 @@ impl PurchaseDocument for Document { data_contract: Arc, ) -> Result { let request = state_transition.wait_for_state_transition_result_request()?; - + // TODO: Implement retry logic let response = request .execute(sdk, RequestSettings::default()) - .await // TODO: We need better way to handle execution response and errors - .map(|execution_response| execution_response.into_inner()) - .map_err(|execution_error| execution_error.into_inner())?; + .await + .into_inner()?; let block_info = block_info_from_metadata(response.metadata()?)?; diff --git a/packages/rs-sdk/src/platform/transition/put_contract.rs b/packages/rs-sdk/src/platform/transition/put_contract.rs index 56a8410822..a8f07b0b31 100644 --- a/packages/rs-sdk/src/platform/transition/put_contract.rs +++ b/packages/rs-sdk/src/platform/transition/put_contract.rs @@ -18,7 +18,7 @@ use dpp::state_transition::StateTransition; use drive::drive::Drive; use drive_proof_verifier::error::ContextProviderError; use drive_proof_verifier::DataContractProvider; -use rs_dapi_client::{DapiRequest, RequestSettings}; +use rs_dapi_client::{DapiRequest, IntoInner, RequestSettings}; #[async_trait::async_trait] /// A trait for putting a contract to platform @@ -87,7 +87,7 @@ impl PutContract for DataContract { .clone() .execute(sdk, settings.unwrap_or_default().request_settings) .await // TODO: We need better way to handle execution errors - .map_err(|error| error.into_inner())?; + .into_inner()?; // response is empty for a broadcast, result comes from the stream wait for state transition result @@ -103,9 +103,8 @@ impl PutContract for DataContract { let response = request .execute(sdk, RequestSettings::default()) - .await // TODO: We need better way to handle execution response and errors - .map(|execution_response| execution_response.into_inner()) - .map_err(|execution_error| execution_error.into_inner())?; + .await + .into_inner()?; let block_info = block_info_from_metadata(response.metadata()?)?; diff --git a/packages/rs-sdk/src/platform/transition/put_document.rs b/packages/rs-sdk/src/platform/transition/put_document.rs index feadb98cbc..806e640d93 100644 --- a/packages/rs-sdk/src/platform/transition/put_document.rs +++ b/packages/rs-sdk/src/platform/transition/put_document.rs @@ -17,7 +17,7 @@ use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; use dpp::state_transition::proof_result::StateTransitionProofResult; use dpp::state_transition::StateTransition; use drive::drive::Drive; -use rs_dapi_client::{DapiRequest, RequestSettings}; +use rs_dapi_client::{DapiRequest, IntoInner, RequestSettings}; #[async_trait::async_trait] /// A trait for putting a document to platform @@ -96,7 +96,7 @@ impl PutDocument for Document { .clone() .execute(sdk, settings.request_settings) .await // TODO: We need better way to handle execution errors - .map_err(|error| error.into_inner())?; + .into_inner()?; // response is empty for a broadcast, result comes from the stream wait for state transition result @@ -110,12 +110,11 @@ impl PutDocument for Document { data_contract: Arc, ) -> Result { let request = state_transition.wait_for_state_transition_result_request()?; - + // TODO: Implement retry logic let response = request .execute(sdk, RequestSettings::default()) - .await // TODO: We need better way to handle execution response and errors - .map(|execution_response| execution_response.into_inner()) - .map_err(|execution_error| execution_error.into_inner())?; + .await + .into_inner()?; let block_info = block_info_from_metadata(response.metadata()?)?; diff --git a/packages/rs-sdk/src/platform/transition/put_identity.rs b/packages/rs-sdk/src/platform/transition/put_identity.rs index 1652f89569..e755b3a888 100644 --- a/packages/rs-sdk/src/platform/transition/put_identity.rs +++ b/packages/rs-sdk/src/platform/transition/put_identity.rs @@ -14,7 +14,7 @@ use drive_proof_verifier::DataContractProvider; use crate::platform::block_info_from_metadata::block_info_from_metadata; use dpp::state_transition::proof_result::StateTransitionProofResult; use drive::drive::Drive; -use rs_dapi_client::{DapiClientError, DapiRequest, RequestSettings}; +use rs_dapi_client::{DapiClientError, DapiRequest, IntoInner, RequestSettings}; #[async_trait::async_trait] /// A trait for putting an identity to platform @@ -57,7 +57,7 @@ impl PutIdentity for Identity { .clone() .execute(sdk, RequestSettings::default()) .await // TODO: We need better way to handle execution errors - .map_err(|error| error.into_inner())?; + .into_inner()?; // response is empty for a broadcast, result comes from the stream wait for state transition result @@ -82,9 +82,8 @@ impl PutIdentity for Identity { let response_result = request .clone() .execute(sdk, RequestSettings::default()) - .await // TODO: We need better way to handle execution response and errors - .map(|execution_response| execution_response.into_inner()) - .map_err(|execution_error| execution_error.into_inner()); + .await + .into_inner(); match response_result { Ok(_) => {} @@ -103,12 +102,12 @@ impl PutIdentity for Identity { } let request = state_transition.wait_for_state_transition_result_request()?; + // TODO: Implement retry logic let response = request .execute(sdk, RequestSettings::default()) - .await // TODO: We need better way to handle execution response and errors - .map(|execution_response| execution_response.into_inner()) - .map_err(|execution_error| execution_error.into_inner())?; + .await + .into_inner()?; let block_info = block_info_from_metadata(response.metadata()?)?; let proof = response.proof_owned()?; diff --git a/packages/rs-sdk/src/platform/transition/top_up_identity.rs b/packages/rs-sdk/src/platform/transition/top_up_identity.rs index d8595bee56..c43d8a9f19 100644 --- a/packages/rs-sdk/src/platform/transition/top_up_identity.rs +++ b/packages/rs-sdk/src/platform/transition/top_up_identity.rs @@ -11,7 +11,7 @@ use dpp::state_transition::proof_result::StateTransitionProofResult; use drive::drive::Drive; use drive_proof_verifier::error::ContextProviderError; use drive_proof_verifier::DataContractProvider; -use rs_dapi_client::{DapiRequest, RequestSettings}; +use rs_dapi_client::{DapiRequest, IntoInner, RequestSettings}; #[async_trait::async_trait] pub trait TopUpIdentity { @@ -48,15 +48,14 @@ impl TopUpIdentity for Identity { .clone() .execute(sdk, RequestSettings::default()) .await // TODO: We need better way to handle execution errors - .map_err(|error| error.into_inner())?; + .into_inner()?; let request = state_transition.wait_for_state_transition_result_request()?; - + // TODO: Implement retry logic in wait for state transition result let response = request .execute(sdk, RequestSettings::default()) - .await // TODO: We need better way to handle execution response and errors - .map(|execution_response| execution_response.into_inner()) - .map_err(|execution_error| execution_error.into_inner())?; + .await + .into_inner()?; let block_info = block_info_from_metadata(response.metadata()?)?; diff --git a/packages/rs-sdk/src/platform/transition/transfer_document.rs b/packages/rs-sdk/src/platform/transition/transfer_document.rs index 4bb6996da5..a64c76cb95 100644 --- a/packages/rs-sdk/src/platform/transition/transfer_document.rs +++ b/packages/rs-sdk/src/platform/transition/transfer_document.rs @@ -18,7 +18,7 @@ use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; use dpp::state_transition::proof_result::StateTransitionProofResult; use dpp::state_transition::StateTransition; use drive::drive::Drive; -use rs_dapi_client::{DapiRequest, RequestSettings}; +use rs_dapi_client::{DapiRequest, IntoInner, RequestSettings}; #[async_trait::async_trait] /// A trait for transferring a document on Platform @@ -97,7 +97,7 @@ impl TransferDocument for Document { .clone() .execute(sdk, settings.request_settings) .await // TODO: We need better way to handle execution errors - .map_err(|error| error.into_inner())?; + .into_inner()?; // response is empty for a broadcast, result comes from the stream wait for state transition result @@ -114,9 +114,8 @@ impl TransferDocument for Document { let response = request .execute(sdk, RequestSettings::default()) - .await // TODO: We need better way to handle execution response and errors - .map(|execution_response| execution_response.into_inner()) - .map_err(|execution_error| execution_error.into_inner())?; + .await + .into_inner()?; let block_info = block_info_from_metadata(response.metadata()?)?; diff --git a/packages/rs-sdk/src/platform/transition/update_price_of_document.rs b/packages/rs-sdk/src/platform/transition/update_price_of_document.rs index 779faf52d0..0f331cde5d 100644 --- a/packages/rs-sdk/src/platform/transition/update_price_of_document.rs +++ b/packages/rs-sdk/src/platform/transition/update_price_of_document.rs @@ -18,7 +18,7 @@ use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; use dpp::state_transition::proof_result::StateTransitionProofResult; use dpp::state_transition::StateTransition; use drive::drive::Drive; -use rs_dapi_client::{DapiRequest, RequestSettings}; +use rs_dapi_client::{DapiRequest, IntoInner, RequestSettings}; #[async_trait::async_trait] /// A trait for updating the price of a document on Platform @@ -98,7 +98,7 @@ impl UpdatePriceOfDocument for Document { .clone() .execute(sdk, settings.request_settings) .await // TODO: We need better way to handle execution errors - .map_err(|error| error.into_inner())?; + .into_inner()?; // response is empty for a broadcast, result comes from the stream wait for state transition result @@ -112,12 +112,11 @@ impl UpdatePriceOfDocument for Document { data_contract: Arc, ) -> Result { let request = state_transition.wait_for_state_transition_result_request()?; - + // TODO: Implement retry logic let response = request .execute(sdk, RequestSettings::default()) - .await // TODO: We need better way to handle execution response and errors - .map(|execution_response| execution_response.into_inner()) - .map_err(|execution_error| execution_error.into_inner())?; + .await + .into_inner()?; let block_info = block_info_from_metadata(response.metadata()?)?; diff --git a/packages/rs-sdk/src/platform/transition/vote.rs b/packages/rs-sdk/src/platform/transition/vote.rs index 9a7906ffe4..5666b8b42d 100644 --- a/packages/rs-sdk/src/platform/transition/vote.rs +++ b/packages/rs-sdk/src/platform/transition/vote.rs @@ -17,7 +17,7 @@ use dpp::voting::votes::resource_vote::accessors::v0::ResourceVoteGettersV0; use dpp::voting::votes::Vote; use drive::drive::Drive; use drive_proof_verifier::{error::ContextProviderError, DataContractProvider}; -use rs_dapi_client::DapiRequest; +use rs_dapi_client::{DapiRequest, IntoInner}; #[async_trait::async_trait] /// A trait for putting a vote on platform @@ -74,7 +74,7 @@ impl PutVote for Vote { request .execute(sdk, settings.request_settings) .await // TODO: We need better way to handle execution errors - .map_err(|error| error.into_inner())?; + .into_inner()?; Ok(()) } @@ -108,12 +108,11 @@ impl PutVote for Vote { None, )?; let request = masternode_vote_transition.broadcast_request_for_state_transition()?; - + // TODO: Implement retry logic let response_result = request .execute(sdk, settings.request_settings) - .await // TODO: We need better way to handle execution response and errors - .map(|execution_response| execution_response.into_inner()) - .map_err(|execution_error| execution_error.into_inner()); + .await + .into_inner(); match response_result { Ok(_) => {} @@ -134,9 +133,8 @@ impl PutVote for Vote { let request = masternode_vote_transition.wait_for_state_transition_result_request()?; let response = request .execute(sdk, settings.request_settings) - .await // TODO: We need better way to handle execution response and errors - .map(|execution_response| execution_response.into_inner()) - .map_err(|execution_error| execution_error.into_inner())?; + .await + .into_inner()?; let block_info = block_info_from_metadata(response.metadata()?)?; let proof = response.proof_owned()?; diff --git a/packages/rs-sdk/src/sdk.rs b/packages/rs-sdk/src/sdk.rs index 466dba051a..cf9e0630ee 100644 --- a/packages/rs-sdk/src/sdk.rs +++ b/packages/rs-sdk/src/sdk.rs @@ -119,6 +119,9 @@ pub struct Sdk { /// Cancellation token; once cancelled, all pending requests should be aborted. pub(crate) cancel_token: CancellationToken, + /// Global settings of dapi client + pub(crate) dapi_client_settings: RequestSettings, + #[cfg(feature = "mocks")] dump_dir: Option, } @@ -134,6 +137,7 @@ impl Clone for Sdk { metadata_last_seen_height: Arc::clone(&self.metadata_last_seen_height), metadata_height_tolerance: self.metadata_height_tolerance, metadata_time_tolerance_ms: self.metadata_time_tolerance_ms, + dapi_client_settings: self.dapi_client_settings, #[cfg(feature = "mocks")] dump_dir: self.dump_dir.clone(), } @@ -958,6 +962,7 @@ impl SdkBuilder { #[allow(unused_mut)] // needs to be mutable for #[cfg(feature = "mocks")] let mut sdk= Sdk{ network: self.network, + dapi_client_settings: self.settings, inner:SdkInstance::Dapi { dapi, version:self.version }, proofs:self.proofs, context_provider: ArcSwapOption::new( self.context_provider.map(Arc::new)), @@ -1020,6 +1025,7 @@ impl SdkBuilder { let mock_sdk = Arc::new(Mutex::new(mock_sdk)); let sdk= Sdk { network: self.network, + dapi_client_settings: self.settings, inner:SdkInstance::Mock { mock:mock_sdk.clone(), dapi, diff --git a/packages/rs-sdk/src/sync.rs b/packages/rs-sdk/src/sync.rs index d3c066e8cb..38a878e174 100644 --- a/packages/rs-sdk/src/sync.rs +++ b/packages/rs-sdk/src/sync.rs @@ -3,10 +3,16 @@ //! This is a workaround for an issue in tokio, where you cannot call `block_on` from sync call that is called //! inside a tokio runtime. This module spawns async futures in active tokio runtime, and retrieves the result //! using a channel. -use drive_proof_verifier::error::ContextProviderError; -use std::{future::Future, sync::mpsc::SendError}; -use tokio::runtime::TryCurrentError; +use arc_swap::ArcSwap; +use drive_proof_verifier::error::ContextProviderError; +use rs_dapi_client::{CanRetry, ExecutionResult, RequestSettings}; +use std::{ + fmt::Debug, + future::Future, + sync::{mpsc::SendError, Arc}, +}; +use tokio::{runtime::TryCurrentError, sync::Mutex}; #[derive(Debug, thiserror::Error)] pub enum AsyncError { /// Not running inside tokio runtime @@ -88,10 +94,149 @@ async fn worker( Ok(()) } +/// Retry the provided closure. +/// +/// This function is used to retry async code. It takes into account number of retries already executed by lower +/// layers and stops retrying once the maximum number of retries is reached. +/// +/// The `settings` should contain maximum number of retries that should be executed. In case of failure, total number of +/// requests sent is expected to be at least `settings.retries + 1` (initial request + `retries` configured in settings). +/// The actual number of requests sent can be higher, as the lower layers can retry the request multiple times. +/// +/// `future_factory_fn` should be a `FnMut()` closure that returns a future that should be retried. +/// It takes [`RequestSettings`] as an argument and returns [`ExecutionResult`]. +/// Retry mechanism can change [`RequestSettings`] between invocations of the `future_factory_fn` closure +/// to limit the number of retries for lower layers. +/// +/// ## Parameters +/// +/// - `settings` - global settings with any request-specific settings overrides applied. +/// - `future_factory_fn` - closure that returns a future that should be retried. It should take [`RequestSettings`] as +/// an argument and return [`ExecutionResult`]. +/// +/// ## Returns +/// +/// Returns future that resolves to [`ExecutionResult`]. +/// +/// ## Example +/// +/// ```rust +/// # use dash_sdk::RequestSettings; +/// # use dash_sdk::error::{Error,StaleNodeError}; +/// # use rs_dapi_client::{ExecutionResult, ExecutionError}; +/// async fn retry_test_function(settings: RequestSettings) -> ExecutionResult<(), dash_sdk::Error> { +/// // do something +/// Err(ExecutionError { +/// inner: Error::StaleNode(StaleNodeError::Height{ +/// expected_height: 10, +/// received_height: 3, +/// tolerance_blocks: 1, +/// }), +/// retries: 0, +/// address: None, +/// }) +/// } +/// #[tokio::main] +/// async fn main() { +/// let global_settings = RequestSettings::default(); +/// dash_sdk::sync::retry(global_settings, retry_test_function).await.expect_err("should fail"); +/// } +/// ``` +/// +/// ## Troubleshooting +/// +/// Compiler error: `no method named retry found for closure`: +/// - ensure returned value is [`ExecutionResult`]., +/// - consider adding `.await` at the end of the closure. +/// +/// +/// ## See also +/// +/// - [`::backon`] crate that is used by this function. +pub async fn retry( + settings: RequestSettings, + future_factory_fn: FutureFactoryFn, +) -> ExecutionResult +where + Fut: Future>, + FutureFactoryFn: FnMut(RequestSettings) -> Fut, + E: CanRetry + Debug, +{ + let max_retries = settings.retries.unwrap_or_default(); + + let backoff_strategy = backon::ConstantBuilder::default() + .with_delay(std::time::Duration::from_millis(10)) // we use different server, so no real delay needed, just to avoid spamming + .with_max_times(max_retries); + + let mut retries: usize = 0; + + // Settings must be modified inside `when()` closure, so we need to use `ArcSwap` to allow mutable access to settings. + let settings = ArcSwap::new(Arc::new(settings)); + + // Closure below needs to be FnMut, so we need mutable future_factory_fn. In order to achieve that, + // we use Arc>> pattern, to NOT move `future_factory_fn` directly into closure (as this breaks FnMut), + // while still allowing mutable access to it. + let inner_fn = Arc::new(Mutex::new(future_factory_fn)); + + let closure_settings = &settings; + // backon also support [backon::RetryableWithContext], but it doesn't pass the context to `when()` call. + // As we need to modify the settings inside `when()`, context doesn't solve our problem and we have to implement + // our own "context-like" logic using the closure below and `ArcSwap` for settings. + let closure = move || { + let inner_fn = inner_fn.clone(); + async move { + let settings = closure_settings.load_full().clone(); + let mut func = inner_fn.lock().await; + (*func)(*settings).await + } + }; + + let result= ::backon::Retryable::retry(closure,backoff_strategy) + .when(|e| { + if e.can_retry() { + // requests sent for current execution attempt; + let requests_sent = e.retries + 1; + + // requests sent in all preceeding attempts; user expects `settings.retries +1` + retries += requests_sent; + let all_requests_sent = retries; + + if all_requests_sent <=max_retries { // we account for for initial request + tracing::warn!(retry = all_requests_sent, max_retries, error=?e, "retrying request"); + let new_settings = RequestSettings { + retries: Some(max_retries - all_requests_sent), // limit num of retries for lower layer + ..**settings.load() + }; + settings.store(Arc::new(new_settings)); + true + } else { + tracing::error!(retry = all_requests_sent, max_retries, error=?e, "no more retries left, giving up"); + false + } + } else { + false + } + }) + .notify(|error, duration| { + tracing::warn!(?duration, ?error, "request failed, retrying"); + }) + .await; + + result.map_err(|mut e| { + e.retries = retries; + e + }) +} + #[cfg(test)] mod test { use super::*; - use std::future::Future; + use http::Uri; + use rs_dapi_client::ExecutionError; + use std::{ + future::Future, + sync::atomic::{AtomicUsize, Ordering}, + }; use tokio::{ runtime::Builder, sync::mpsc::{self, Receiver}, @@ -168,4 +313,64 @@ mod test { assert_eq!(result.unwrap(), "Success"); } } + + #[derive(Debug)] + enum MockError { + Generic, + } + impl CanRetry for MockError { + fn can_retry(&self) -> bool { + true + } + } + + async fn retry_test_function( + settings: RequestSettings, + counter: Arc, + ) -> ExecutionResult<(), MockError> { + // num or retries increases with each call + let retries = counter.load(Ordering::Relaxed); + let retries = if settings.retries.unwrap_or_default() < retries { + settings.retries.unwrap_or_default() + } else { + retries + }; + + // we sent 1 initial request plus `retries` retries + counter.fetch_add(1 + retries, Ordering::Relaxed); + + Err(ExecutionError { + inner: MockError::Generic, + retries, + address: Some(Uri::from_static("http://localhost").into()), + }) + } + + #[test_case::test_matrix([1,2,3,5,7,8,10,11,23,49, usize::MAX])] + #[tokio::test] + async fn test_retry(expected_requests: usize) { + for _ in 0..1 { + let counter = Arc::new(AtomicUsize::new(0)); + + // we retry 5 times, and expect 5 retries + 1 initial request + let mut global_settings = RequestSettings::default(); + global_settings.retries = Some(expected_requests - 1); + + let closure = |s| { + let counter = counter.clone(); + retry_test_function(s, counter) + }; + + retry(global_settings, closure) + .await + .expect_err("should fail"); + + assert_eq!( + counter.load(Ordering::Relaxed), + expected_requests, + "test failed for expected {} requests", + expected_requests + ); + } + } } diff --git a/packages/rs-sdk/tests/fetch/epoch.rs b/packages/rs-sdk/tests/fetch/epoch.rs index f898f2abcc..7a2d4c3bed 100644 --- a/packages/rs-sdk/tests/fetch/epoch.rs +++ b/packages/rs-sdk/tests/fetch/epoch.rs @@ -12,7 +12,7 @@ use dpp::block::epoch::EpochIndex; use dpp::block::extended_epoch_info::v0::ExtendedEpochInfoV0Getters; use dpp::block::extended_epoch_info::ExtendedEpochInfo; use drive_proof_verifier::types::ExtendedEpochInfos; -use rs_dapi_client::{DapiRequestExecutor, RequestSettings}; +use rs_dapi_client::{DapiRequestExecutor, IntoInner, RequestSettings}; /// Get current epoch index from DAPI response metadata async fn get_current_epoch(sdk: &Sdk, cfg: &Config) -> EpochIndex { @@ -25,9 +25,8 @@ async fn get_current_epoch(sdk: &Sdk, cfg: &Config) -> EpochIndex { let response = sdk .execute(identity_request, RequestSettings::default()) - .await // TODO: We need better way to handle execution response and errors - .map(|execution_response| execution_response.into_inner()) - .map_err(|execution_error| execution_error.into_inner()) + .await + .into_inner() .expect("get identity"); response.metadata().expect("metadata").epoch as EpochIndex From 90980d97e04f59e27d0c76c3109c311a9caf41e3 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 29 Oct 2024 19:21:11 +0700 Subject: [PATCH 82/90] feat(sdk)!: return consensus errors from broadcast methods (#2274) Co-authored-by: Lukasz Klimek <842586+lklimek@users.noreply.github.com> --- .../createGrpcErrorFromDriveResponse.js | 19 ++++++-- .../createGrpcErrorFromDriveResponse.spec.js | 20 ++++---- .../GrpcTransport/createGrpcTransportError.js | 8 +++- .../createGrpcTransportError.spec.js | 9 ++-- packages/rs-dapi-client/src/dapi_client.rs | 34 +++++++------ packages/rs-dapi-client/src/executor.rs | 7 ++- packages/rs-dapi-client/src/lib.rs | 11 ++--- packages/rs-dapi-client/src/mock.rs | 10 ++-- packages/rs-dapi-client/src/transport.rs | 45 +++++++++++++++--- packages/rs-dapi-client/src/transport/grpc.rs | 17 +++---- packages/rs-sdk/src/error.rs | 32 +++++++++---- packages/rs-sdk/src/platform/delegate.rs | 4 +- .../rs-sdk/src/platform/document_query.rs | 4 +- .../identities_contract_keys_query.rs | 4 +- .../src/platform/transition/put_identity.rs | 5 +- packages/rs-sdk/src/platform/types/evonode.rs | 7 +-- .../rs-sdk/src/platform/types/identity.rs | 1 + packages/rs-sdk/src/sdk.rs | 8 ++-- packages/rs-sdk/tests/fetch/config.rs | 4 +- .../contested_resource_identity_votes.rs | 2 +- .../fetch/contested_resource_vote_state.rs | 7 +-- packages/rs-sdk/tests/fetch/data_contract.rs | 2 +- ...12bea6a47c9f7bf30133713b6b5cfec3a4d57.json | Bin 154055 -> 154811 bytes ...799af81392b7b0cbb7e86412da37ab13aef4b.json | Bin 78688 -> 79030 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...6557d0524384797bb450e22f41f66743d5d11.json | Bin 37184 -> 37214 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...9a380d88e7caeeb4cc3ab0cf2bb04e2f096af.json | Bin 0 -> 47486 bytes ...4cbe10d36f97230f621ab42a637983b21c58a.json | Bin 47439 -> 0 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...dbd43fab2e54a98aa44bc88c049e1cf72f5fb.json | Bin 48680 -> 48713 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...ac956499cf0081eb632e6d84ef4f9c32d8690.json | Bin 4121 -> 10589 bytes ...12bea6a47c9f7bf30133713b6b5cfec3a4d57.json | Bin 154055 -> 154811 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...c0041cdc16404006d1b30577292c6ce106cdb.json | Bin 136910 -> 137570 bytes ...12bea6a47c9f7bf30133713b6b5cfec3a4d57.json | Bin 154055 -> 154811 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...12bea6a47c9f7bf30133713b6b5cfec3a4d57.json | Bin 154055 -> 154811 bytes ...57c0a880092ca161c0d1ad05fb5658e88fd2e.json | Bin 0 -> 85938 bytes ...e9cd544302ca273452d9075620c895b6f7974.json | Bin 80382 -> 0 bytes ...e218ef824e28209f3b797076903b13efe884b.json | Bin 0 -> 80588 bytes ...12ef8d9ef6fffa83161133f19821857242833.json | Bin 80340 -> 0 bytes ...91e659c15d8cbcb740147e01af7b1bd8a5062.json | Bin 85689 -> 0 bytes ...b2eb86d71a154bb1d8373a11a1564258a40ab.json | Bin 0 -> 80645 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...5bce08c84a0cf72b34f6a408982f7babce2c2.json | Bin 60071 -> 60248 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...cf0ed3b40564b35e3ce17ee02d5b15e9bede1.json | Bin 3757 -> 9001 bytes .../.gitkeep | 0 ...b5b7e0a1d712a09c40d5721f622bf53c53155.json | 1 - ...06732ed93fe23ffa9b35f6c92d6ef34732aff.json | Bin 77301 -> 0 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 242762 -> 0 bytes ...e6bfae60312e2f833b302a62be93e181e7a0e.json | 1 - ...8fbd24420cbf27187df52fbb489e70b1c898d.json | Bin 8210 -> 22418 bytes ...0353cf7adee1c4b04dc8689afc26031b9b010.json | Bin 8118 -> 22326 bytes ...a7401f9ed4ef7493ce9faa08a50e6b4d2c34d.json | Bin 3575 -> 8819 bytes ...d84b9984fd04a4ca40a146aea81c3ea5c39ef.json | Bin 48327 -> 48360 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...5a0fc6bf7035276b9ae4be55fb15774eb54e7.json | Bin 5608 -> 15082 bytes ...30e457c9e0f5d50a3b8f0f86e1da3420877d7.json | Bin 2283 -> 5151 bytes ...bfa6b1eff43954af904bce8f123fed7515132.json | Bin 50608 -> 50782 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...f67620695a23f63dc7376bd4a509e93335ce9.json | Bin 56714 -> 56714 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...c301f2326c1e59739fe07fb863facb5f2b5a8.json | Bin 3762 -> 9006 bytes ...ce28a227def58e23c39e0384e0cc02fe6360b.json | Bin 78704 -> 79046 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...51b74928ffdfac56bc589d217525ce101d35b.json | Bin 6736 -> 18532 bytes ...b9c94b8d468da725cc241df1601e630036b97.json | Bin 6940 -> 19132 bytes ...d5387b9cca48a3062a4db8bf0341a839f2bae.json | Bin 60008 -> 60056 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - .../.gitkeep | 0 ...b38482a11c7731ba150ddc1812e3310013c7a.json | Bin 1029 -> 0 bytes ...1a7310d759b9fe67594f3899f1e0485c383f1.json | Bin 2171 -> 4823 bytes ...98cf774b9fe66e8103e4f370811803229f4e8.json | Bin 60517 -> 0 bytes ...6e3dbf9ca8dadcb275c2c28a6dee9e033e292.json | Bin 0 -> 68122 bytes ...55774151848b669401ef44deadc605b0d278f.json | Bin 0 -> 60702 bytes ...649a7d9108f9b96fc074e1da61f0fa19d3b5b.json | Bin 78703 -> 79045 bytes ...18f5e2f72b636986d6f0c15928353978bfd83.json | Bin 63941 -> 0 bytes ...ed11f384144320c099f54b2530f0be42f8664.json | Bin 63899 -> 64085 bytes ...1f4a723908b4ee33c4612727d101cf58f3394.json | Bin 67222 -> 67366 bytes ...d724c98cd0e3653d01d091232c8053d0c6ecb.json | Bin 0 -> 68114 bytes ...1cf33dd52735f597de4b4c804effd2600d135.json | Bin 78687 -> 79029 bytes ...13ed974a48e2886d61d2f5057005e2666ae7c.json | Bin 67582 -> 0 bytes ...6bae7b358c6fa9761cb65680f9e2f54c61f50.json | Bin 67592 -> 0 bytes ...3abc50fc58895d65ce023d46e2c6ded39d257.json | Bin 0 -> 64086 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...a72db1958762a26a6d156f618978402b1fe4d.json | Bin 0 -> 75416 bytes ...828d50a4fa7b3230d23ddfac563877efd61e2.json | Bin 56752 -> 60703 bytes ...f4542eda610924f03cc11a5546eafee13bfde.json | Bin 67421 -> 0 bytes ...1d4e66aec36ada2efbb1072f2196b5b856222.json | Bin 60228 -> 64302 bytes ...637ba87f58b1be40e677b000fec75c2af2319.json | Bin 0 -> 79205 bytes ...f1400abf368ef25742ac1e4ec0350cc98334d.json | Bin 0 -> 75732 bytes ...214b0f6f6b7280b0ea686c2e0070f330add82.json | Bin 71121 -> 0 bytes ...dd268f3555081d2a3a5e112886b1c78b4009f.json | Bin 78702 -> 79044 bytes ...3549f6e73f467779e83ef5729423f6ae43ac5.json | Bin 0 -> 60202 bytes ...3c4cd53b525ef27be36077437e8b9b8ffadd8.json | Bin 78686 -> 79028 bytes ...84e6f2c2b37a1da002e0a485ad7bc30b764bb.json | Bin 67642 -> 0 bytes ...bd232dcd96dc9a5c1a50dca162467fc9a8757.json | Bin 71528 -> 0 bytes ...66c773b6b6433a3502423706160e543a24f13.json | Bin 0 -> 56708 bytes ...77aa3058a5e96a54279f3cd7b134ef5efcbb1.json | Bin 78925 -> 75460 bytes ...b57024b9f6fd9df7d3658495623b03cd4dc2f.json | Bin 60518 -> 0 bytes ...a4d5675d8b383091c3b9bff1366f82a3aa07b.json | Bin 0 -> 79223 bytes ...6ab5e43d4fb9c927bcab551e0c65be65c95c1.json | Bin 0 -> 71476 bytes ...011fde307d9d55bce41f8ed2a3f895a8e7c33.json | Bin 64084 -> 0 bytes ...0f9bf0a059ad2788d4630751cfb714a5a9762.json | Bin 0 -> 64087 bytes ...ffaf2f0b3d1a7ca2598153024a58bdea3b343.json | Bin 67668 -> 0 bytes ...b235f0c1d8085680124a1ddf9d72502e1835b.json | Bin 0 -> 71925 bytes ...5d377ddbe6cbdccdff3bb18a89ec8aee7fcec.json | Bin 75452 -> 71951 bytes ...048daa8fc887b7fd9431b5b3ebc18bf6c7d42.json | Bin 0 -> 71526 bytes ...9cf6980b6b126a73dd990b05887c3ec391b0a.json | Bin 0 -> 67979 bytes ...6cf4557623b124ff6f1e0131ae69643535b3d.json | Bin 71147 -> 0 bytes ...d0f212d0c7bd0a93adca53f17ab079b6315f9.json | Bin 75420 -> 0 bytes ...bbee90d7e9017625eb6d18104fda4b8ae43b2.json | Bin 74951 -> 0 bytes ...10aa19eaf0c52fbcfada86b8600e9c659753a.json | Bin 0 -> 60055 bytes ...b01abd3b8c51d22d1933ed9c346335f99840c.json | Bin 71475 -> 0 bytes ...166a7918ca820c560724a79dea163f261bd7f.json | Bin 75004 -> 0 bytes ...4e1905758178dce3e8085da8dbd0cce4053b7.json | Bin 0 -> 75699 bytes ...39670997ba13d99baa2a98650a464ff1e0a65.json | Bin 63942 -> 0 bytes ...b2d43564f484a6e44b32dc721c425cf3a7b8d.json | Bin 0 -> 68029 bytes ...6cd86056004f8f9f6ff7a8277d1f4da5ebca4.json | Bin 60037 -> 0 bytes ...f538422c888683a231c769eb7df6a29bea9c9.json | Bin 78893 -> 0 bytes ...46b1a606a8ccb267440005793b49521c7849b.json | Bin 0 -> 63564 bytes ...1d08723ac43c9d75dfae1ceead2d3b7c4977c.json | Bin 63609 -> 0 bytes ...3b54536f53a4438de3ef85f387b058c226005.json | Bin 0 -> 67581 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...2a952aa4f09be27ca526b34c4a2d6f7ec3f76.json | Bin 4758 -> 12756 bytes ...4266c27c9b0d3c1c6b9dc022c7cf69fde2174.json | Bin 2360 -> 5012 bytes ...0092d1597a92997ac79de0ef89f4cde74aefc.json | Bin 4870 -> 12868 bytes ...c12823a7175b930f49aebb8d9844065da5b44.json | Bin 126941 -> 127487 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...76da7bcf8bb6352f7f5f26cb8af584712e16a.json | Bin 4185 -> 10473 bytes ...49e64e07602f543bda42d5a5d223f0e6102a9.json | Bin 71294 -> 71489 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...b3f1bccd65e01bb860f7648ce860ce03df202.json | Bin 4811 -> 12809 bytes ...ae85cdc0620cb84d732a686322ae9dd8c5240.json | Bin 5128 -> 13126 bytes ...7de9b6df87c4df053f3032a3fac93ca2985c2.json | Bin 5980 -> 15886 bytes ...12bea6a47c9f7bf30133713b6b5cfec3a4d57.json | Bin 154055 -> 154811 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...e412662a6acb2d928d56de7a6a67dbf70f80a.json | Bin 6184 -> 16486 bytes ...dbc80a6caf537196a9513dae8967f325ab485.json | Bin 137745 -> 138357 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...a8707f36bc1837a661ca9a4a3aae3ab30da7a.json | Bin 4287 -> 10755 bytes ...285016c5d0ac679c299447df687e866154090.json | Bin 135501 -> 136107 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...4ae6d7593e5a08c8e0c9971ad1afc8c3e1702.json | Bin 2472 -> 5340 bytes ...5839e9ea0c40cd94caac5746b19857d52533a.json | Bin 124070 -> 124610 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...f6d2d9dcd58c35b6aa9e85398a105dfdeb9c6.json | Bin 58365 -> 74580 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...e0f17fb3367987f71c5caf9c045ced8633299.json | Bin 58365 -> 67599 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...288fcadcf4f0c2959c0a632bbd06e28bc3d95.json | Bin 0 -> 67725 bytes ...259864951786f80811cc7ea9fce3d7f42a718.json | Bin 58491 -> 0 bytes ...f6d2d9dcd58c35b6aa9e85398a105dfdeb9c6.json | Bin 58365 -> 74580 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...501c1ba166a2dd8f6efb31b0289dc011da983.json | Bin 25775 -> 27458 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...10bbf4178e9af8e87ee326576ac2b384d726d.json | Bin 53112 -> 58170 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...1ad49d3ae7bc38d217d85b1570274493c4d7e.json | Bin 56948 -> 56948 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...ce28a227def58e23c39e0384e0cc02fe6360b.json | Bin 78704 -> 79046 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...96e8a6cdbd49b7bb7a3ac9cb6ab3035676772.json | Bin 0 -> 172047 bytes ...95ca435fe142e8f54b44eb829c0459d33b288.json | Bin 172100 -> 0 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 216821 -> 220178 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...48c03122daf7ab2e77108f4bf44af1ad15eae.json | Bin 25775 -> 27458 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...067bd9ccc29eca3092a5664a5a9ba3bb7e967.json | Bin 219840 -> 224976 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...abbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json | Bin 25536 -> 27219 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...add01a7428085ffdcf1e11cccf19c48c5f7a1.json | Bin 0 -> 72221 bytes ...984ca19dfa687bcc622265b5e865021b90993.json | Bin 75421 -> 0 bytes ...77667b9a9edd07833d77c1af884ca8a9849ca.json | Bin 0 -> 79601 bytes ...7e037b3446e716bafd2c876290e1b85474480.json | Bin 69306 -> 0 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...67089535588985622579e77969e0ffd68afc7.json | Bin 71264 -> 74816 bytes ...77667b9a9edd07833d77c1af884ca8a9849ca.json | Bin 0 -> 79601 bytes ...7e037b3446e716bafd2c876290e1b85474480.json | Bin 69306 -> 0 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...332bebcab89e518be8ed54e76a7267ec2da52.json | Bin 69758 -> 0 bytes ...0208d6c0094fc5f5e03f668d261ae4931e0c9.json | Bin 0 -> 76613 bytes ...77667b9a9edd07833d77c1af884ca8a9849ca.json | Bin 0 -> 79601 bytes ...7e037b3446e716bafd2c876290e1b85474480.json | Bin 69306 -> 0 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...d592c8fe7361bed628d9a36747664c9789bf1.json | Bin 84924 -> 85047 bytes ...77667b9a9edd07833d77c1af884ca8a9849ca.json | Bin 0 -> 79601 bytes ...7e037b3446e716bafd2c876290e1b85474480.json | Bin 69306 -> 0 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...b0b93d9d2e841a5e3d60755f8e7be3b93315b.json | Bin 93354 -> 93309 bytes ...77667b9a9edd07833d77c1af884ca8a9849ca.json | Bin 0 -> 79601 bytes ...7e037b3446e716bafd2c876290e1b85474480.json | Bin 69306 -> 0 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...71cdde55f94897dcf9d905573b01fe445fbc9.json | Bin 12517 -> 12517 bytes ...77667b9a9edd07833d77c1af884ca8a9849ca.json | Bin 0 -> 38744 bytes ...7e037b3446e716bafd2c876290e1b85474480.json | Bin 33615 -> 0 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...77667b9a9edd07833d77c1af884ca8a9849ca.json | Bin 0 -> 69236 bytes ...7e037b3446e716bafd2c876290e1b85474480.json | Bin 58938 -> 0 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...582967dacb80eab9a3ebb1b6fe445e53a0bba.json | Bin 48977 -> 0 bytes ...05a8592f3f01c08c7d529932075643c32dbc3.json | Bin 0 -> 54184 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...f4a20d2e49be7af3ab6fcccac432fbe0f6f8a.json | Bin 50331 -> 0 bytes ...9a3893c42d439056187c53b775ddc1bf1888d.json | Bin 0 -> 55514 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...138f01ebff9836643f8c1b4facad64077f80d.json | Bin 77833 -> 0 bytes ...720adf6dca7b1503f65c559f3b70b7c58293f.json | Bin 0 -> 89376 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...5a4a303a60215ac4143afd63720bbb6d8c496.json | Bin 0 -> 117061 bytes ...138f01ebff9836643f8c1b4facad64077f80d.json | Bin 77833 -> 0 bytes ...720adf6dca7b1503f65c559f3b70b7c58293f.json | Bin 0 -> 89376 bytes ...c621d8b1e28e45f2c9d73dd377e7b81645c46.json | Bin 97908 -> 0 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...48c03122daf7ab2e77108f4bf44af1ad15eae.json | Bin 32258 -> 33887 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...14ad6a0b47b50c5fd84a4e094fbf06ff040b1.json | Bin 0 -> 32870 bytes ...1b000df8dd766ae79c548073a87d4cb351fdc.json | Bin 36306 -> 0 bytes ...ca1b6ba4883a92f4533995dbfdbc5875d8bef.json | Bin 96590 -> 96869 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...9550f0ea4a6af6f68037e7d50ff4e4de74509.json | Bin 26592 -> 26619 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...106e5eda740be44679cc960ea35f2134af628.json | Bin 33806 -> 33848 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...bf1acc3394d29ac72f662d38e81344496631e.json | Bin 33786 -> 33825 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...9b1a05862cb8d40c088b193b59ca3564210bc.json | Bin 34881 -> 34902 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...22dfc69cc7b123be24b7ad993281979b2a3a2.json | Bin 34144 -> 34183 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...b6b091bede36307dc69b46eb65e967bb84bce.json | Bin 49403 -> 0 bytes ...7ea009e369cadf26d2fd82453d9a75ccd6ae7.json | Bin 61262 -> 0 bytes ...4ef834e6bbb89d21b2f08163de5106d9db335.json | Bin 0 -> 49457 bytes ...4df85a544ca7ab40bb4fc7a1bd8e8ade47e62.json | Bin 0 -> 61081 bytes ...f46635ec4cbc5f228d0d6f1af26cedcf8aa24.json | Bin 60829 -> 0 bytes ...695d7ed37115c8c4ab68c65b283eceb16d9dd.json | Bin 37346 -> 0 bytes ...59525067352d9440afaca1db61fb1f51e83ae.json | Bin 0 -> 61445 bytes ...c61d0223027f3bca7edc99237362654f2bfb0.json | Bin 0 -> 60988 bytes ...c362866cbab6d8388743fdcf5d797910561df.json | Bin 57505 -> 57619 bytes ...872937c56537dd54618a39819b4233232d497.json | Bin 48952 -> 0 bytes ...e36aa98b6acdcb910a746650383c174e884e8.json | Bin 0 -> 61039 bytes ...7686a168bd79e8751279ec53efb41381dd431.json | Bin 96666 -> 96945 bytes ...0daadb7e1a4cc0c58c52450dd44d5ca462e4a.json | Bin 0 -> 49024 bytes ...74bf83d09d43cc787b1c1fce7bd053ae1ebf4.json | Bin 60991 -> 0 bytes ...9700b7aa313794e1367edace0f028d6b61d8d.json | Bin 60808 -> 0 bytes ...df8382ca43f73cf9e63aa985c1add075d0264.json | Bin 0 -> 37361 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...ca1b6ba4883a92f4533995dbfdbc5875d8bef.json | Bin 96590 -> 96869 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - ...e942470ee2b9dff806909798d12c40bc6cf8b.json | Bin 96606 -> 96885 bytes ...ca1b6ba4883a92f4533995dbfdbc5875d8bef.json | Bin 96590 -> 96869 bytes ...90a48ac0d1d60e249d031b5ad79e3e46e3fca.json | 1 + ...c6e1c1f190ed37d4da4d0346ac6803822fbef.json | 1 - 340 files changed, 213 insertions(+), 159 deletions(-) create mode 100644 packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resource_identity_votes_not_found/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resource_identity_votes_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/msg_GetContestedResourceIdentityVotesRequest_8f3fcd0f5c5546dc3acb53577269a380d88e7caeeb4cc3ab0cf2bb04e2f096af.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/msg_GetContestedResourceIdentityVotesRequest_c6971839077baf47b353678e6254cbe10d36f97230f621ab42a637983b21c58a.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resource_vote_states_ok/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resource_vote_states_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resource_vote_states_with_limit/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resource_vote_states_with_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_10110ee14ae9da0bda6aaa8191c57c0a880092ca161c0d1ad05fb5658e88fd2e.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_40fdb3c49ed1a0b60f507eaff93e9cd544302ca273452d9075620c895b6f7974.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_6c371f39cd63a4a0dfb9a9fa47de218ef824e28209f3b797076903b13efe884b.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_b21064f33148c15a425ce722d0412ef8d9ef6fffa83161133f19821857242833.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_b6282218b0c8c33a4f17f60e2f691e659c15d8cbcb740147e01af7b1bd8a5062.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_e42a431aedd97fe3f9057f50e68b2eb86d71a154bb1d8373a11a1564258a40ab.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_2dd27fc692c7bf9389f3b48c73a4d2538a4eb72d54c01cc4620b16b06eb31f4c/.gitkeep delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_2dd27fc692c7bf9389f3b48c73a4d2538a4eb72d54c01cc4620b16b06eb31f4c/data_contract-e668c659af66aee1e72c186dde7b5b7e0a1d712a09c40d5721f622bf53c53155.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_2dd27fc692c7bf9389f3b48c73a4d2538a4eb72d54c01cc4620b16b06eb31f4c/msg_GetContestedResourcesRequest_e49260f4b2b31f8b6dafa5d51dd06732ed93fe23ffa9b35f6c92d6ef34732aff.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_2dd27fc692c7bf9389f3b48c73a4d2538a4eb72d54c01cc4620b16b06eb31f4c/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_2dd27fc692c7bf9389f3b48c73a4d2538a4eb72d54c01cc4620b16b06eb31f4c/quorum_pubkey-106-24de77bd1f67e0c3e20a399b6a3e6bfae60312e2f833b302a62be93e181e7a0e.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_d838e1005b493d45e2b6b39712f4aa144f22b4daa1470657c0ab97ffd4f04455/.gitkeep delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_fields_d838e1005b493d45e2b6b39712f4aa144f22b4daa1470657c0ab97ffd4f04455/msg_GetContestedResourcesRequest_6c409367beedcc384cfd90f36b1b38482a11c7731ba150ddc1812e3310013c7a.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_0354293d2bd9574b348ef1fbbcc98cf774b9fe66e8103e4f370811803229f4e8.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_13743b3cba702fc90e3618172a46e3dbf9ca8dadcb275c2c28a6dee9e033e292.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_1dbad85f242dfc488bf6a736c3c55774151848b669401ef44deadc605b0d278f.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_4b19dc7d21fa9b40046ba30620118f5e2f72b636986d6f0c15928353978bfd83.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_81cdd94e16c4b296934dfa5bae8d724c98cd0e3653d01d091232c8053d0c6ecb.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_955992f6446147d75ceb7c6df1813ed974a48e2886d61d2f5057005e2666ae7c.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_b4b5361aa4f0450e6537dc5135d6bae7b358c6fa9761cb65680f9e2f54c61f50.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_db80e293e51ffd1cd840ffc18853abc50fc58895d65ce023d46e2c6ded39d257.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_limit/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_015a1d2bbc282c8e87eae9748ffa72db1958762a26a6d156f618978402b1fe4d.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_0e929893694b229f677394cbb4df4542eda610924f03cc11a5546eafee13bfde.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_17549c499ab1bade46e96fe67bc637ba87f58b1be40e677b000fec75c2af2319.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_1ef94b2835536781d5c37af2990f1400abf368ef25742ac1e4ec0350cc98334d.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_1f269e8f7c30fc23f85f4aa8c46214b0f6f6b7280b0ea686c2e0070f330add82.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_26832b1a90d093f54c3a5eae4903549f6e73f467779e83ef5729423f6ae43ac5.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_307328f0782bfb7cdc1e11c92af84e6f2c2b37a1da002e0a485ad7bc30b764bb.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_3df76526b556901d24900733a8fbd232dcd96dc9a5c1a50dca162467fc9a8757.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_4135759e5ad1ee131eb82fb9c0b66c773b6b6433a3502423706160e543a24f13.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_55aba21bd6ab87295c8317bb2b0b57024b9f6fd9df7d3658495623b03cd4dc2f.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_5878e49ba83fdab3110c674b3ffa4d5675d8b383091c3b9bff1366f82a3aa07b.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_5ebeb7c01fffe047c9a91d9b3086ab5e43d4fb9c927bcab551e0c65be65c95c1.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_69ddb327c1fd562d5bd35a74d14011fde307d9d55bce41f8ed2a3f895a8e7c33.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_6c085c067c576e2a1457a8e78370f9bf0a059ad2788d4630751cfb714a5a9762.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_74477b940a401b9daa770791ce4ffaf2f0b3d1a7ca2598153024a58bdea3b343.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_774f59e620022defe8cede5a337b235f0c1d8085680124a1ddf9d72502e1835b.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_8f0699751716034f3fa7c28223c048daa8fc887b7fd9431b5b3ebc18bf6c7d42.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_91ed87367df512745f96a66d3309cf6980b6b126a73dd990b05887c3ec391b0a.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_926a2ab53948280066d8d01e7126cf4557623b124ff6f1e0131ae69643535b3d.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_93bdcf7c3ac1449bec170265ec2d0f212d0c7bd0a93adca53f17ab079b6315f9.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_987947aa731c95dbdc29a33ebdfbbee90d7e9017625eb6d18104fda4b8ae43b2.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_a4cecc3159e93091689acd02e9b10aa19eaf0c52fbcfada86b8600e9c659753a.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_a6a78257a69728aadbce86460a8b01abd3b8c51d22d1933ed9c346335f99840c.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_a955bc7d4f7d9e784d03f3bc335166a7918ca820c560724a79dea163f261bd7f.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_bd96b3514f2c3f1d32c725db2754e1905758178dce3e8085da8dbd0cce4053b7.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_c59f992288b7c02e30f0cd1ecfa39670997ba13d99baa2a98650a464ff1e0a65.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_c99e89c75ebdb8c051fa31ddc93b2d43564f484a6e44b32dc721c425cf3a7b8d.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_cbbacbd6178e4420c11ccd741ce6cd86056004f8f9f6ff7a8277d1f4da5ebca4.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_e081acc2a8d23315915812c7e4bf538422c888683a231c769eb7df6a29bea9c9.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_f3cacf6ef5a1f01d07c3cb41c1b46b1a606a8ccb267440005793b49521c7849b.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_f775b2ae054095c7a37ae4ccc861d08723ac43c9d75dfae1ceead2d3b7c4977c.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_fe0d0995c36b430a2a76d1215f53b54536f53a4438de3ef85f387b058c226005.json create mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_resources_start_at_value/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__a39a5f7014a616de3d7002bb4f18772c5b5d3526cb2b3c33566bd64512882669/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__a39a5f7014a616de3d7002bb4f18772c5b5d3526cb2b3c33566bd64512882669/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__c71b4f8d63f8a1357936129a226f99e349e7b21b166609cf59062e27ed68a1ee/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__c71b4f8d63f8a1357936129a226f99e349e7b21b166609cf59062e27ed68a1ee/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__cfe3ebd0f17745be80e4348304fe468f3eb8c2d17e23d310582b0b34f2d5bba7/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__cfe3ebd0f17745be80e4348304fe468f3eb8c2d17e23d310582b0b34f2d5bba7/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__fbed6654145b9fba061d182cac5a3879bc9bacb92dc9ae64ed2a07ca2ec0392f/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__fbed6654145b9fba061d182cac5a3879bc9bacb92dc9ae64ed2a07ca2ec0392f/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/document_list_bug_value_text_decode_base58/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/document_list_bug_value_text_decode_base58/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/document_read/msg_DocumentQuery_54e14af5c2e8a36e3c337f1e7f9288fcadcf4f0c2959c0a632bbd06e28bc3d95.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read/msg_DocumentQuery_5d23e775d0065e9aaec1f155ee4259864951786f80811cc7ea9fce3d7f42a718.json create mode 100644 packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/test_contested_resources_ok/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_contested_resources_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_GetDataContractHistoryRequest_05485e622b540237cadaa7fda2a96e8a6cdbd49b7bb7a3ac9cb6ab3035676772.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_GetDataContractHistoryRequest_3a0865545cd724369cc2d2609bb95ca435fe142e8f54b44eb829c0459d33b288.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_GetEpochsInfoRequest_f2de0b3a0f07be2fcaffc191580984ca19dfa687bcc622265b5e865021b90993.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_GetIdentityRequest_10ade8322ef670cd19d1a472a5477667b9a9edd07833d77c1af884ca8a9849ca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_GetIdentityRequest_10ade8322ef670cd19d1a472a5477667b9a9edd07833d77c1af884ca8a9849ca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetEpochsInfoRequest_7cb414646fac25990a7ec6f920b332bebcab89e518be8ed54e76a7267ec2da52.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetEpochsInfoRequest_f93cf4e7bd56819a2b255d14c3b0208d6c0094fc5f5e03f668d261ae4931e0c9.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetIdentityRequest_10ade8322ef670cd19d1a472a5477667b9a9edd07833d77c1af884ca8a9849ca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/msg_GetIdentityRequest_10ade8322ef670cd19d1a472a5477667b9a9edd07833d77c1af884ca8a9849ca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_GetIdentityRequest_10ade8322ef670cd19d1a472a5477667b9a9edd07833d77c1af884ca8a9849ca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_GetIdentityBalanceRequest_10ade8322ef670cd19d1a472a5477667b9a9edd07833d77c1af884ca8a9849ca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_GetIdentityBalanceRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_GetIdentityBalanceAndRevisionRequest_10ade8322ef670cd19d1a472a5477667b9a9edd07833d77c1af884ca8a9849ca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_GetIdentityBalanceAndRevisionRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/msg_GetIdentityContractNonceRequest_5328fe7dfe7856a12c05ca3db34582967dacb80eab9a3ebb1b6fe445e53a0bba.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/msg_GetIdentityContractNonceRequest_72462a05bc5903192201b038d5605a8592f3f01c08c7d529932075643c32dbc3.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_GetIdentityKeysRequest_03fcf46e9be05e694be0ce4f553f4a20d2e49be7af3ab6fcccac432fbe0f6f8a.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_GetIdentityKeysRequest_bb682ae3f9e50aac47abec860399a3893c42d439056187c53b775ddc1bf1888d.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/msg_IdentityRequest_c9b7936c475a5143e38568b7474138f01ebff9836643f8c1b4facad64077f80d.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/msg_IdentityRequest_d44a1cbdbdc341bf6b93e30b722720adf6dca7b1503f65c559f3b70b7c58293f.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_IdentityRequest_3dbae0092e7945775a61bd84d655a4a303a60215ac4143afd63720bbb6d8c496.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_IdentityRequest_c9b7936c475a5143e38568b7474138f01ebff9836643f8c1b4facad64077f80d.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_IdentityRequest_d44a1cbdbdc341bf6b93e30b722720adf6dca7b1503f65c559f3b70b7c58293f.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_IdentityRequest_dd69f82095b51bd0266957d7932c621d8b1e28e45f2c9d73dd377e7b81645c46.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_not_found/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_ok/msg_GetPrefundedSpecializedBalanceRequest_025257146b516a8c29cad26800714ad6a0b47b50c5fd84a4e094fbf06ff040b1.json delete mode 100644 packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_ok/msg_GetPrefundedSpecializedBalanceRequest_9bd89c809bb48d907c525be2a571b000df8dd766ae79c548073a87d4cb351fdc.json create mode 100644 packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_ok/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_02381273a00d2e9ada5d2a65f02b6b091bede36307dc69b46eb65e967bb84bce.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_08e1547cbc369ad6c9b70f9df5e7ea009e369cadf26d2fd82453d9a75ccd6ae7.json create mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_0cb9ee36247bc1ceaf62016370f4ef834e6bbb89d21b2f08163de5106d9db335.json create mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_0dde395b4b415889954d709f63d4df85a544ca7ab40bb4fc7a1bd8e8ade47e62.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_1c64f28b411c0c2d689236e1780f46635ec4cbc5f228d0d6f1af26cedcf8aa24.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_2d02d9bffa1eaac182493623f86695d7ed37115c8c4ab68c65b283eceb16d9dd.json create mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_5712787e7fb90c195d81acfdc0659525067352d9440afaca1db61fb1f51e83ae.json create mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_5a13e820a6f3aa36accabe630aac61d0223027f3bca7edc99237362654f2bfb0.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_86088d93d1bdfa513a66ef126a9872937c56537dd54618a39819b4233232d497.json create mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_86adcaba8608771c706d272e516e36aa98b6acdcb910a746650383c174e884e8.json create mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_8dd8d6620ba68bceb5a65a1c2b80daadb7e1a4cc0c58c52450dd44d5ca462e4a.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_de3d9a273ba38a5e8fd9ee2c02b74bf83d09d43cc787b1c1fce7bd053ae1ebf4.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_e63096a8aaea805874e06f0ed5c9700b7aa313794e1367edace0f028d6b61d8d.json create mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_f1f82e9e31d7112f92816896406df8382ca43f73cf9e63aa985c1add075d0264.json create mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_ok/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json create mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_order/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json delete mode 100644 packages/rs-sdk/tests/vectors/vote_polls_by_ts_order/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json diff --git a/packages/dapi/lib/grpcServer/handlers/createGrpcErrorFromDriveResponse.js b/packages/dapi/lib/grpcServer/handlers/createGrpcErrorFromDriveResponse.js index b6e7032f85..a156d9c266 100644 --- a/packages/dapi/lib/grpcServer/handlers/createGrpcErrorFromDriveResponse.js +++ b/packages/dapi/lib/grpcServer/handlers/createGrpcErrorFromDriveResponse.js @@ -64,6 +64,9 @@ async function createGrpcErrorFromDriveResponse(code, info) { const message = decodedInfo.message; const data = decodedInfo.data || {}; + const serializedConsensusError = data.serializedError; + delete data.serializedError; + // gRPC error codes if (code <= 16) { const CommonErrorClass = COMMON_ERROR_CLASSES[code.toString()]; @@ -111,9 +114,15 @@ async function createGrpcErrorFromDriveResponse(code, info) { // DPP errors if (code >= 10000 && code < 50000) { + const consensusMetadata = { + ...createRawMetadata(data), + code, + 'dash-serialized-consensus-error-bin': Buffer.from(serializedConsensusError), + }; + let consensusError; try { - consensusError = deserializeConsensusError(data.serializedError || []); + consensusError = deserializeConsensusError(serializedConsensusError); } catch (e) { logger.error({ err: e, @@ -128,7 +137,7 @@ async function createGrpcErrorFromDriveResponse(code, info) { if (code >= 10000 && code < 20000) { return new InvalidArgumentGrpcError( consensusError.message, - { code, ...createRawMetadata(data) }, + consensusMetadata, ); } @@ -137,7 +146,7 @@ async function createGrpcErrorFromDriveResponse(code, info) { return new GrpcError( GrpcErrorCodes.UNAUTHENTICATED, consensusError.message, - { code, ...createRawMetadata(data) }, + consensusMetadata, ); } @@ -145,7 +154,7 @@ async function createGrpcErrorFromDriveResponse(code, info) { if (code >= 30000 && code < 40000) { return new FailedPreconditionGrpcError( consensusError.message, - { code, ...createRawMetadata(data) }, + consensusMetadata, ); } @@ -153,7 +162,7 @@ async function createGrpcErrorFromDriveResponse(code, info) { if (code >= 40000 && code < 50000) { return new InvalidArgumentGrpcError( consensusError.message, - { code, ...createRawMetadata(data) }, + consensusMetadata, ); } } diff --git a/packages/dapi/test/unit/grpcServer/handlers/createGrpcErrorFromDriveResponse.spec.js b/packages/dapi/test/unit/grpcServer/handlers/createGrpcErrorFromDriveResponse.spec.js index 48a4c32e78..563d23a045 100644 --- a/packages/dapi/test/unit/grpcServer/handlers/createGrpcErrorFromDriveResponse.spec.js +++ b/packages/dapi/test/unit/grpcServer/handlers/createGrpcErrorFromDriveResponse.spec.js @@ -69,7 +69,8 @@ describe('createGrpcErrorFromDriveResponse', () => { it('should throw basic consensus error if error code = 10000', async () => { const consensusError = new ProtocolVersionParsingError('test'); - const data = { serializedError: consensusError.serialize() }; + const serializedError = consensusError.serialize(); + const data = { serializedError }; info = { data }; const error = await createGrpcErrorFromDriveResponse(10000, cbor.encode(info).toString('base64')); @@ -78,7 +79,7 @@ describe('createGrpcErrorFromDriveResponse', () => { expect(error.message).to.be.equals(consensusError.message); expect(error.getRawMetadata()).to.deep.equal({ code: 10000, - 'drive-error-data-bin': cbor.encode(data), + 'dash-serialized-consensus-error-bin': serializedError, }); }); @@ -87,7 +88,8 @@ describe('createGrpcErrorFromDriveResponse', () => { const consensusError = new IdentityNotFoundError(id); - const data = { serializedError: consensusError.serialize() }; + const serializedError = consensusError.serialize(); + const data = { serializedError }; info = { data }; const error = await createGrpcErrorFromDriveResponse( @@ -100,14 +102,15 @@ describe('createGrpcErrorFromDriveResponse', () => { expect(error.getCode()).to.equal(GrpcErrorCodes.UNAUTHENTICATED); expect(error.getRawMetadata()).to.deep.equal({ code: 20000, - 'drive-error-data-bin': cbor.encode(data), + 'dash-serialized-consensus-error-bin': serializedError, }); }); it('should throw fee consensus error if error code = 30000', async () => { const consensusError = new BalanceIsNotEnoughError(BigInt(20), BigInt(10)); - const data = { serializedError: consensusError.serialize() }; + const serializedError = consensusError.serialize(); + const data = { serializedError }; info = { data }; const error = await createGrpcErrorFromDriveResponse(30000, cbor.encode(info).toString('base64')); @@ -115,7 +118,7 @@ describe('createGrpcErrorFromDriveResponse', () => { expect(error).to.be.an.instanceOf(FailedPreconditionGrpcError); expect(error.getRawMetadata()).to.deep.equal({ code: 30000, - 'drive-error-data-bin': cbor.encode(data), + 'dash-serialized-consensus-error-bin': serializedError, }); }); @@ -124,7 +127,8 @@ describe('createGrpcErrorFromDriveResponse', () => { const consensusError = new DataContractAlreadyPresentError(dataContractId); - const data = { serializedError: consensusError.serialize() }; + const serializedError = consensusError.serialize(); + const data = { serializedError }; info = { data }; const error = await createGrpcErrorFromDriveResponse( @@ -135,7 +139,7 @@ describe('createGrpcErrorFromDriveResponse', () => { expect(error).to.be.an.instanceOf(InvalidArgumentGrpcError); expect(error.getRawMetadata()).to.deep.equal({ code: 40000, - 'drive-error-data-bin': cbor.encode(data), + 'dash-serialized-consensus-error-bin': serializedError, }); }); diff --git a/packages/js-dapi-client/lib/transport/GrpcTransport/createGrpcTransportError.js b/packages/js-dapi-client/lib/transport/GrpcTransport/createGrpcTransportError.js index 103c37bb39..e5cae56b75 100644 --- a/packages/js-dapi-client/lib/transport/GrpcTransport/createGrpcTransportError.js +++ b/packages/js-dapi-client/lib/transport/GrpcTransport/createGrpcTransportError.js @@ -119,7 +119,13 @@ async function createGrpcTransportError(grpcError, dapiAddress) { // DPP consensus errors if (code >= 10000 && code < 50000) { - const consensusError = deserializeConsensusError(data.serializedError || []); + const consensusErrorString = metadata['dash-serialized-consensus-error-bin']; + if (!consensusErrorString) { + throw new Error(`Can't deserialize consensus error ${code}: serialized data is missing`); + } + + const consensusErrorBytes = Buffer.from(consensusErrorString, 'base64'); + const consensusError = deserializeConsensusError(consensusErrorBytes); delete data.serializedError; diff --git a/packages/js-dapi-client/test/unit/transport/GrpcTransport/createGrpcTransportError.spec.js b/packages/js-dapi-client/test/unit/transport/GrpcTransport/createGrpcTransportError.spec.js index 13205f6e0c..b3731276d1 100644 --- a/packages/js-dapi-client/test/unit/transport/GrpcTransport/createGrpcTransportError.spec.js +++ b/packages/js-dapi-client/test/unit/transport/GrpcTransport/createGrpcTransportError.spec.js @@ -155,17 +155,14 @@ describe('createGrpcTransportError', () => { it('should return InvalidRequestDPPError', async () => { // grpc-js expects Buffer - let driveErrorDataBin = cbor.encode({ - serializedError: new ProtocolVersionParsingError('test').serialize(), - ...errorData, - }); + let serializedError = new ProtocolVersionParsingError('test').serialize(); // and grpc-web expects string // TODO: remove when we switch to single grpc implementation for both Node and Web if (typeof window !== 'undefined') { - driveErrorDataBin = driveErrorDataBin.toString('base64'); + serializedError = serializedError.toString('base64'); } - metadata.set('drive-error-data-bin', driveErrorDataBin); + metadata.set('dash-serialized-consensus-error-bin', serializedError); const grpcError = new GrpcError( 10001, diff --git a/packages/rs-dapi-client/src/dapi_client.rs b/packages/rs-dapi-client/src/dapi_client.rs index 20ef3506a6..579c62e015 100644 --- a/packages/rs-dapi-client/src/dapi_client.rs +++ b/packages/rs-dapi-client/src/dapi_client.rs @@ -11,19 +11,23 @@ use tracing::Instrument; use crate::address_list::AddressListError; use crate::connection_pool::ConnectionPool; +use crate::transport::TransportError; use crate::{ transport::{TransportClient, TransportRequest}, - Address, AddressList, CanRetry, DapiRequestExecutor, ExecutionError, ExecutionResponse, - ExecutionResult, RequestSettings, + AddressList, CanRetry, DapiRequestExecutor, ExecutionError, ExecutionResponse, ExecutionResult, + RequestSettings, }; /// General DAPI request error type. #[derive(Debug, thiserror::Error)] #[cfg_attr(feature = "mocks", derive(serde::Serialize, serde::Deserialize))] -pub enum DapiClientError { +pub enum DapiClientError { /// The error happened on transport layer #[error("transport error: {0}")] - Transport(#[cfg_attr(feature = "mocks", serde(with = "dapi_grpc::mock::serde_mockable"))] TE), + Transport( + #[cfg_attr(feature = "mocks", serde(with = "dapi_grpc::mock::serde_mockable"))] + TransportError, + ), /// There are no valid DAPI addresses to use. #[error("no available addresses to use")] NoAvailableAddresses, @@ -37,7 +41,7 @@ pub enum DapiClientError { Mock(#[from] crate::mock::MockError), } -impl CanRetry for DapiClientError { +impl CanRetry for DapiClientError { fn can_retry(&self) -> bool { use DapiClientError::*; match self { @@ -50,17 +54,10 @@ impl CanRetry for DapiClientError { } } -#[cfg(feature = "mocks")] -#[derive(serde::Serialize, serde::Deserialize)] -struct TransportErrorData { - transport_error: Vec, - address: Address, -} - /// Serialization of [DapiClientError]. /// /// We need to do manual serialization because of the generic type parameter which doesn't support serde derive. -impl Mockable for DapiClientError { +impl Mockable for DapiClientError { #[cfg(feature = "mocks")] fn mock_serialize(&self) -> Option> { Some(serde_json::to_vec(self).expect("serialize DAPI client error")) @@ -110,11 +107,11 @@ impl DapiRequestExecutor for DapiClient { &self, request: R, settings: RequestSettings, - ) -> ExecutionResult::Error>> + ) -> ExecutionResult where R: TransportRequest + Mockable, R::Response: Mockable, - ::Error: Mockable, + TransportError: Mockable, { // Join settings of different sources to get final version of the settings for this execution: let applied_settings = self @@ -148,9 +145,10 @@ impl DapiRequestExecutor for DapiClient { .read() .expect("can't get address list for read"); - let address_result = address_list.get_live_address().cloned().ok_or( - DapiClientError::<::Error>::NoAvailableAddresses, - ); + let address_result = address_list + .get_live_address() + .cloned() + .ok_or(DapiClientError::NoAvailableAddresses); drop(address_list); diff --git a/packages/rs-dapi-client/src/executor.rs b/packages/rs-dapi-client/src/executor.rs index 17f7aa7d12..e1b5dca2f9 100644 --- a/packages/rs-dapi-client/src/executor.rs +++ b/packages/rs-dapi-client/src/executor.rs @@ -1,4 +1,4 @@ -use crate::transport::{TransportClient, TransportRequest}; +use crate::transport::TransportRequest; use crate::{Address, CanRetry, DapiClientError, RequestSettings}; use dapi_grpc::mock::Mockable; use dapi_grpc::tonic::async_trait; @@ -12,11 +12,10 @@ pub trait DapiRequestExecutor { &self, request: R, settings: RequestSettings, - ) -> ExecutionResult::Error>> + ) -> ExecutionResult where R: TransportRequest + Mockable, - R::Response: Mockable, - ::Error: Mockable; + R::Response: Mockable; } /// Unwrap wrapped types diff --git a/packages/rs-dapi-client/src/lib.rs b/packages/rs-dapi-client/src/lib.rs index 9d04d2251a..2ce4a9da43 100644 --- a/packages/rs-dapi-client/src/lib.rs +++ b/packages/rs-dapi-client/src/lib.rs @@ -18,7 +18,6 @@ pub use address_list::AddressList; pub use address_list::AddressListError; pub use connection_pool::ConnectionPool; pub use dapi_client::{DapiClient, DapiClientError}; -use dapi_grpc::mock::Mockable; #[cfg(feature = "dump")] pub use dump::DumpData; pub use executor::{ @@ -38,21 +37,19 @@ pub use request_settings::RequestSettings; /// let mut client = MockDapiClient::new(); /// let request: proto::GetIdentityRequest = proto::get_identity_request::GetIdentityRequestV0 { id: b"0".to_vec(), prove: true }.into(); /// let response = request.execute(&mut client, RequestSettings::default()).await?; -/// # Ok::<(), ExecutionError>>(()) +/// # Ok::<(), ExecutionError>(()) /// # }; /// ``` pub trait DapiRequest { /// Response from DAPI for this specific request. type Response; - /// An error type for the transport this request uses. - type TransportError: Mockable; /// Executes the request. fn execute<'c, D: DapiRequestExecutor>( self, dapi_client: &'c D, settings: RequestSettings, - ) -> BoxFuture<'c, ExecutionResult>> + ) -> BoxFuture<'c, ExecutionResult> where Self: 'c; } @@ -61,13 +58,11 @@ pub trait DapiRequest { impl DapiRequest for T { type Response = T::Response; - type TransportError = ::Error; - fn execute<'c, D: DapiRequestExecutor>( self, dapi_client: &'c D, settings: RequestSettings, - ) -> BoxFuture<'c, ExecutionResult>> + ) -> BoxFuture<'c, ExecutionResult> where Self: 'c, { diff --git a/packages/rs-dapi-client/src/mock.rs b/packages/rs-dapi-client/src/mock.rs index 968468d8b6..3031e47d54 100644 --- a/packages/rs-dapi-client/src/mock.rs +++ b/packages/rs-dapi-client/src/mock.rs @@ -12,9 +12,8 @@ //! See `tests/mock_dapi_client.rs` for an example. use crate::{ - transport::{TransportClient, TransportRequest}, - DapiClientError, DapiRequestExecutor, ExecutionError, ExecutionResponse, ExecutionResult, - RequestSettings, + transport::TransportRequest, DapiClientError, DapiRequestExecutor, ExecutionError, + ExecutionResponse, ExecutionResult, RequestSettings, }; use dapi_grpc::mock::Mockable; use dapi_grpc::tonic::async_trait; @@ -36,10 +35,7 @@ pub struct MockDapiClient { expectations: Expectations, } /// Result of executing a mock request -pub type MockResult = ExecutionResult< - ::Response, - DapiClientError<<::Client as TransportClient>::Error>, ->; +pub type MockResult = ExecutionResult<::Response, DapiClientError>; impl MockDapiClient { /// Create a new mock client diff --git a/packages/rs-dapi-client/src/transport.rs b/packages/rs-dapi-client/src/transport.rs index 29b3d688a8..26c394ff03 100644 --- a/packages/rs-dapi-client/src/transport.rs +++ b/packages/rs-dapi-client/src/transport.rs @@ -42,21 +42,54 @@ pub trait TransportRequest: Clone + Send + Sync + Debug + Mockable { self, client: &'c mut Self::Client, settings: &AppliedRequestSettings, - ) -> BoxFuture<'c, Result::Error>>; + ) -> BoxFuture<'c, Result>; +} + +/// Transport error type. +#[derive(Debug, thiserror::Error)] +#[cfg_attr(feature = "mocks", derive(serde::Serialize, serde::Deserialize))] +pub enum TransportError { + /// gRPC error + #[error("grpc error: {0}")] + Grpc( + #[from] + #[cfg_attr(feature = "mocks", serde(with = "dapi_grpc::mock::serde_mockable"))] + dapi_grpc::tonic::Status, + ), +} + +impl CanRetry for TransportError { + fn can_retry(&self) -> bool { + match self { + TransportError::Grpc(status) => status.can_retry(), + } + } +} + +/// Serialization of [TransportError]. +/// +/// We need to do manual serialization because of the generic type parameter which doesn't support serde derive. +impl Mockable for TransportError { + #[cfg(feature = "mocks")] + fn mock_serialize(&self) -> Option> { + Some(serde_json::to_vec(self).expect("serialize Transport error")) + } + + #[cfg(feature = "mocks")] + fn mock_deserialize(data: &[u8]) -> Option { + Some(serde_json::from_slice(data).expect("deserialize Transport error")) + } } /// Generic way to create a transport client from provided [Uri]. pub trait TransportClient: Send + Sized { - /// Error type for the specific client. - type Error: std::error::Error + CanRetry + Send + Mockable; - /// Build client using node's url. - fn with_uri(uri: Uri, pool: &ConnectionPool) -> Result; + fn with_uri(uri: Uri, pool: &ConnectionPool) -> Result; /// Build client using node's url and [AppliedRequestSettings]. fn with_uri_and_settings( uri: Uri, settings: &AppliedRequestSettings, pool: &ConnectionPool, - ) -> Result; + ) -> Result; } diff --git a/packages/rs-dapi-client/src/transport/grpc.rs b/packages/rs-dapi-client/src/transport/grpc.rs index fc98d63296..fb1f08c842 100644 --- a/packages/rs-dapi-client/src/transport/grpc.rs +++ b/packages/rs-dapi-client/src/transport/grpc.rs @@ -2,7 +2,7 @@ use std::time::Duration; -use super::{CanRetry, TransportClient, TransportRequest}; +use super::{CanRetry, TransportClient, TransportError, TransportRequest}; use crate::connection_pool::{ConnectionPool, PoolPrefix}; use crate::{request_settings::AppliedRequestSettings, RequestSettings}; use dapi_grpc::core::v0::core_client::CoreClient; @@ -39,9 +39,7 @@ fn create_channel( } impl TransportClient for PlatformGrpcClient { - type Error = dapi_grpc::tonic::Status; - - fn with_uri(uri: Uri, pool: &ConnectionPool) -> Result { + fn with_uri(uri: Uri, pool: &ConnectionPool) -> Result { Ok(pool .get_or_create(PoolPrefix::Platform, &uri, None, || { match create_channel(uri.clone(), None) { @@ -59,7 +57,7 @@ impl TransportClient for PlatformGrpcClient { uri: Uri, settings: &AppliedRequestSettings, pool: &ConnectionPool, - ) -> Result { + ) -> Result { Ok(pool .get_or_create( PoolPrefix::Platform, @@ -78,9 +76,7 @@ impl TransportClient for PlatformGrpcClient { } impl TransportClient for CoreGrpcClient { - type Error = dapi_grpc::tonic::Status; - - fn with_uri(uri: Uri, pool: &ConnectionPool) -> Result { + fn with_uri(uri: Uri, pool: &ConnectionPool) -> Result { Ok(pool .get_or_create(PoolPrefix::Core, &uri, None, || { match create_channel(uri.clone(), None) { @@ -98,7 +94,7 @@ impl TransportClient for CoreGrpcClient { uri: Uri, settings: &AppliedRequestSettings, pool: &ConnectionPool, - ) -> Result { + ) -> Result { Ok(pool .get_or_create( PoolPrefix::Core, @@ -155,7 +151,7 @@ macro_rules! impl_transport_request_grpc { self, client: &'c mut Self::Client, settings: &AppliedRequestSettings, - ) -> BoxFuture<'c, Result::Error>> + ) -> BoxFuture<'c, Result> { let mut grpc_request = self.into_request(); @@ -165,6 +161,7 @@ macro_rules! impl_transport_request_grpc { client .$($method)+(grpc_request) + .map_err(TransportError::Grpc) .map_ok(|response| response.into_inner()) .boxed() } diff --git a/packages/rs-sdk/src/error.rs b/packages/rs-sdk/src/error.rs index 223c7dc00e..2d0ba29a2b 100644 --- a/packages/rs-sdk/src/error.rs +++ b/packages/rs-sdk/src/error.rs @@ -1,13 +1,13 @@ //! Definitions of errors -use std::fmt::Debug; -use std::time::Duration; - -use dapi_grpc::mock::Mockable; +use dpp::consensus::ConsensusError; +use dpp::serialization::PlatformDeserializable; use dpp::version::PlatformVersionError; use dpp::ProtocolError; -use rs_dapi_client::{CanRetry, DapiClientError, ExecutionError}; - pub use drive_proof_verifier::error::ContextProviderError; +use rs_dapi_client::transport::TransportError; +use rs_dapi_client::{CanRetry, DapiClientError, ExecutionError}; +use std::fmt::Debug; +use std::time::Duration; /// Error type for the SDK // TODO: Propagate server address and retry information so that the user can retrieve it @@ -74,8 +74,24 @@ pub enum Error { StaleNode(#[from] StaleNodeError), } -impl From> for Error { - fn from(value: DapiClientError) -> Self { +// TODO: Decompose DapiClientError to more specific errors like connection, node error instead of DAPI client error +impl From for Error { + fn from(value: DapiClientError) -> Self { + if let DapiClientError::Transport(TransportError::Grpc(status)) = &value { + if let Some(consensus_error_value) = status + .metadata() + .get_bin("dash-serialized-consensus-error-bin") + { + return ConsensusError::deserialize_from_bytes( + consensus_error_value.as_encoded_bytes(), + ) + .map(|consensus_error| { + Self::Protocol(ProtocolError::ConsensusError(Box::new(consensus_error))) + }) + .unwrap_or_else(Self::Protocol); + } + } + Self::DapiClientError(format!("{:?}", value)) } } diff --git a/packages/rs-sdk/src/platform/delegate.rs b/packages/rs-sdk/src/platform/delegate.rs index 9b77b751e6..63f250e59e 100644 --- a/packages/rs-sdk/src/platform/delegate.rs +++ b/packages/rs-sdk/src/platform/delegate.rs @@ -43,11 +43,11 @@ macro_rules! delegate_transport_request_variant { self, client: &'c mut Self::Client, settings: &$crate::platform::dapi::transport::AppliedRequestSettings, - ) -> $crate::platform::dapi::transport::BoxFuture<'c, Result::Error>> { + ) -> $crate::platform::dapi::transport::BoxFuture<'c, Result> { use futures::FutureExt; use $request::*; - let settings =settings.clone(); + let settings = settings.clone(); // We need to build new async box because we have to map response to the $response type match self {$( diff --git a/packages/rs-sdk/src/platform/document_query.rs b/packages/rs-sdk/src/platform/document_query.rs index c8136cf0f1..1da50d73f8 100644 --- a/packages/rs-sdk/src/platform/document_query.rs +++ b/packages/rs-sdk/src/platform/document_query.rs @@ -24,7 +24,7 @@ use dpp::{ use drive::query::{DriveDocumentQuery, InternalClauses, OrderClause, WhereClause, WhereOperator}; use drive_proof_verifier::{types::Documents, ContextProvider, FromProof}; use rs_dapi_client::transport::{ - AppliedRequestSettings, BoxFuture, TransportClient, TransportRequest, + AppliedRequestSettings, BoxFuture, TransportError, TransportRequest, }; use super::fetch::Fetch; @@ -148,7 +148,7 @@ impl TransportRequest for DocumentQuery { self, client: &'c mut Self::Client, settings: &AppliedRequestSettings, - ) -> BoxFuture<'c, Result::Error>> { + ) -> BoxFuture<'c, Result> { let request: GetDocumentsRequest = self .try_into() .expect("DocumentQuery should always be valid"); diff --git a/packages/rs-sdk/src/platform/identities_contract_keys_query.rs b/packages/rs-sdk/src/platform/identities_contract_keys_query.rs index 15570d23a7..e761cecce9 100644 --- a/packages/rs-sdk/src/platform/identities_contract_keys_query.rs +++ b/packages/rs-sdk/src/platform/identities_contract_keys_query.rs @@ -3,7 +3,7 @@ use dapi_grpc::platform::v0::get_identities_contract_keys_request::Version::V0; use dapi_grpc::platform::v0::GetIdentitiesContractKeysRequest; use dpp::identity::Purpose; use rs_dapi_client::transport::{ - AppliedRequestSettings, BoxFuture, TransportClient, TransportRequest, + AppliedRequestSettings, BoxFuture, TransportError, TransportRequest, }; use crate::platform::Identifier; @@ -81,7 +81,7 @@ impl TransportRequest for IdentitiesContractKeysQuery { self, client: &'c mut Self::Client, settings: &AppliedRequestSettings, - ) -> BoxFuture<'c, Result::Error>> { + ) -> BoxFuture<'c, Result> { let request: GetIdentitiesContractKeysRequest = self .try_into() .expect("IdentitiesContractKeysQuery should always be valid"); diff --git a/packages/rs-sdk/src/platform/transition/put_identity.rs b/packages/rs-sdk/src/platform/transition/put_identity.rs index e755b3a888..30276a06a0 100644 --- a/packages/rs-sdk/src/platform/transition/put_identity.rs +++ b/packages/rs-sdk/src/platform/transition/put_identity.rs @@ -14,6 +14,7 @@ use drive_proof_verifier::DataContractProvider; use crate::platform::block_info_from_metadata::block_info_from_metadata; use dpp::state_transition::proof_result::StateTransitionProofResult; use drive::drive::Drive; +use rs_dapi_client::transport::TransportError; use rs_dapi_client::{DapiClientError, DapiRequest, IntoInner, RequestSettings}; #[async_trait::async_trait] @@ -88,7 +89,9 @@ impl PutIdentity for Identity { match response_result { Ok(_) => {} //todo make this more reliable - Err(DapiClientError::Transport(te)) if te.code() == Code::AlreadyExists => { + Err(DapiClientError::Transport(TransportError::Grpc(te))) + if te.code() == Code::AlreadyExists => + { tracing::debug!( ?identity_id, "attempt to create identity that already exists" diff --git a/packages/rs-sdk/src/platform/types/evonode.rs b/packages/rs-sdk/src/platform/types/evonode.rs index af0fee4210..70bbabee61 100644 --- a/packages/rs-sdk/src/platform/types/evonode.rs +++ b/packages/rs-sdk/src/platform/types/evonode.rs @@ -8,7 +8,7 @@ pub use drive_proof_verifier::types::EvoNodeStatus; use futures::future::BoxFuture; use futures::{FutureExt, TryFutureExt}; use rs_dapi_client::transport::{ - AppliedRequestSettings, PlatformGrpcClient, TransportClient, TransportRequest, + AppliedRequestSettings, PlatformGrpcClient, TransportClient, TransportError, TransportRequest, }; use rs_dapi_client::{Address, ConnectionPool, RequestSettings}; #[cfg(feature = "mocks")] @@ -35,7 +35,7 @@ use std::fmt::Debug; pub struct EvoNode(Address); impl EvoNode { - /// Creates a new `EvoNode` with the given address. + /// Creates a new `EvoNode` with the given address. pub fn new(address: Address) -> Self { Self(address) } @@ -66,7 +66,7 @@ impl TransportRequest for EvoNode { self, _client: &'c mut Self::Client, settings: &AppliedRequestSettings, - ) -> BoxFuture<'c, Result::Error>> { + ) -> BoxFuture<'c, Result> { let uri = self.0.uri(); // As this is single node connection case, we create a new connection pool with space for a single connection // and we drop it after use. @@ -98,6 +98,7 @@ impl TransportRequest for EvoNode { async move { let response = client .get_status(grpc_request) + .map_err(TransportError::Grpc) .map_ok(|response| response.into_inner()) .await; diff --git a/packages/rs-sdk/src/platform/types/identity.rs b/packages/rs-sdk/src/platform/types/identity.rs index 632e3bd5e4..4b7b7754d0 100644 --- a/packages/rs-sdk/src/platform/types/identity.rs +++ b/packages/rs-sdk/src/platform/types/identity.rs @@ -22,6 +22,7 @@ use dapi_grpc::platform::v0::{ GetIdentityRequest, ResponseMetadata, }; use dpp::prelude::Identity; +use rs_dapi_client::transport::TransportError; // Create enum [IdentityRequest] and [IdentityResponse] that will wrap all possible // request/response types for [Identity] object. diff --git a/packages/rs-sdk/src/sdk.rs b/packages/rs-sdk/src/sdk.rs index cf9e0630ee..3fd570e206 100644 --- a/packages/rs-sdk/src/sdk.rs +++ b/packages/rs-sdk/src/sdk.rs @@ -27,8 +27,7 @@ use rs_dapi_client::mock::MockDapiClient; pub use rs_dapi_client::AddressList; pub use rs_dapi_client::RequestSettings; use rs_dapi_client::{ - transport::{TransportClient, TransportRequest}, - DapiClient, DapiClientError, DapiRequestExecutor, ExecutionResult, + transport::TransportRequest, DapiClient, DapiClientError, DapiRequestExecutor, ExecutionResult, }; use std::collections::btree_map::Entry; use std::fmt::Debug; @@ -83,7 +82,7 @@ pub type LastQueryTimestamp = u64; /// /// See tests/ for examples of using the SDK. pub struct Sdk { - /// The network that the sdk is configured for (Dash (mainnet), Testnet, Devnet, Regtest) + /// The network that the sdk is configured for (Dash (mainnet), Testnet, Devnet, Regtest) pub network: Network, inner: SdkInstance, /// Use proofs when retrieving data from Platform. @@ -422,6 +421,7 @@ impl Sdk { } } + // TODO: Move to a separate struct /// Updates or fetches the nonce for a given identity and contract pair from a cache, /// querying Platform if the cached value is stale or absent. Optionally /// increments the nonce before storing it, based on the provided settings. @@ -676,7 +676,7 @@ impl DapiRequestExecutor for Sdk { &self, request: R, settings: RequestSettings, - ) -> ExecutionResult::Error>> { + ) -> ExecutionResult { match self.inner { SdkInstance::Dapi { ref dapi, .. } => dapi.execute(request, settings).await, #[cfg(feature = "mocks")] diff --git a/packages/rs-sdk/tests/fetch/config.rs b/packages/rs-sdk/tests/fetch/config.rs index 52556ddb9d..c2f8edbc4e 100644 --- a/packages/rs-sdk/tests/fetch/config.rs +++ b/packages/rs-sdk/tests/fetch/config.rs @@ -225,7 +225,7 @@ impl Config { // Next time we need to do it again and update this value :(. This is terrible. // We should automate creation of identity for SDK tests when we have time. Identifier::from_string( - "G1vdreUUxFAmt3bd2kJmV8idrhPCvRQis4cQfRQayWW2", + "G5z3hwiLUnRDGrLEgcqM9sX8wWEuNGHQqvioERgdZ2Tq", Encoding::Base58, ) .unwrap() @@ -252,7 +252,7 @@ impl Config { /// /// See documentation of [contested_resource_identity_votes_ok](super::contested_resource_identity_votes::contested_resource_identity_votes_ok). fn default_protxhash() -> String { - String::from("208a6f71a8b68d20485d568d3039124c5b930d893e73a23774081de0be6e30dd") + String::from("069dcb6e829988af0edb245f30d3b1297a47081854a78c3cdea9fddb8fbd07eb") } /// Return ProTxHash of an existing evo node, or None if not set diff --git a/packages/rs-sdk/tests/fetch/contested_resource_identity_votes.rs b/packages/rs-sdk/tests/fetch/contested_resource_identity_votes.rs index f5bb18eb57..e213b6ac2f 100644 --- a/packages/rs-sdk/tests/fetch/contested_resource_identity_votes.rs +++ b/packages/rs-sdk/tests/fetch/contested_resource_identity_votes.rs @@ -67,7 +67,7 @@ async fn contested_resource_identity_votes_not_found() { /// * enter `ProRegTx transaction ID` and `Owner Private Key` from step 1. /// * top up the identity balance using `t - Identity top up` option (1 DASH will be OK). /// * exit Wallet screen using `q - Back to Main` -///t +/// /// 3. Vote for some contested resource using the masternode identity: /// /// * select `csnq`: `c - Contracts` -> `s - Fetch system contract` -> `n - Fetch DPNS contract` -> `q - Back to Contracts ` diff --git a/packages/rs-sdk/tests/fetch/contested_resource_vote_state.rs b/packages/rs-sdk/tests/fetch/contested_resource_vote_state.rs index fef6138902..6c0bd2f7c4 100644 --- a/packages/rs-sdk/tests/fetch/contested_resource_vote_state.rs +++ b/packages/rs-sdk/tests/fetch/contested_resource_vote_state.rs @@ -107,9 +107,10 @@ async fn contested_resource_vote_states_nx_contract() { if let dash_sdk::error::Error::DapiClientError(e) = result { assert!( e.contains( - "Transport(Status { code: InvalidArgument, message: \"contract not found error" + "Transport(Grpc(Status { code: InvalidArgument, message: \"contract not found error" ), - "we should get contract not found error" + "we should get contract not found error, got: {:?}", + e, ); } else { panic!("expected 'contract not found' transport error"); @@ -267,7 +268,7 @@ async fn contested_resource_vote_states_with_limit_PLAN_674() { assert_eq!( contenders.contenders.len(), limit as usize, - "number of contenders for {:?} should must be at least {}", + "number of contenders for {:?} should must be {}", label, limit ); diff --git a/packages/rs-sdk/tests/fetch/data_contract.rs b/packages/rs-sdk/tests/fetch/data_contract.rs index 0bdb04ac91..41ef33138e 100644 --- a/packages/rs-sdk/tests/fetch/data_contract.rs +++ b/packages/rs-sdk/tests/fetch/data_contract.rs @@ -135,7 +135,7 @@ async fn test_data_contracts_2_nx() { async fn test_data_contract_history_read() { let cfg = Config::new(); let id = Identifier::from_string( - "d915a19b173d43a2a375132fcc8009c5a9dd9cb63b1a0bdabd69e4c38cbea664", + "eacc9ceb6c11ee1ae82afb5590d78d686f43bc0f0e0cd65de1e23c150e41f97f", Encoding::Hex, ) .unwrap(); diff --git a/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/msg_GetContestedResourceVoteStateRequest_aaaa80ce4fdfc75252132a85e6c12bea6a47c9f7bf30133713b6b5cfec3a4d57.json b/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/msg_GetContestedResourceVoteStateRequest_aaaa80ce4fdfc75252132a85e6c12bea6a47c9f7bf30133713b6b5cfec3a4d57.json index c0abf2658ffc973dffe5f477731a148e5ebbb1ea..7ec5d3867602f3b3408c87d4a20e82510381a4ae 100644 GIT binary patch literal 154811 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 P;(LEIf5<=n`0f7!V`Z=s literal 154055 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 diff --git a/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index d438f5cdd3c70a33082da0d6fb21c942f97f77c8..e64b73d8a77bdd2ae7413c918f513e44a6315072 100644 GIT binary patch delta 2865 zcmY*bYiu0V71lg<7H?!{gQ0d}XJZFHSTnP8XJ#LMZR}(n2goKiL~Wo-$W|y&Dj_ye zTO1M;qg0@zO0axVA0m`?`>QP~5E0Y@5{ZGJl!nMbNTyLBwxCo%aWPFQRSl|p&b_-a z{k1bY_s%`%d!6~$@#^tcs!vSm)yXb9CG1qnPWg5Kzuw*q|IvS_WkCF@4GtPHfFrH& zj?uY1m640mye<{kd`lOiyr;)JZ+W~RfH%T*cw)0*o{WbkG$`zFp?KJYV%~=0LIzeP zZHTs*@TUeBhrg?t5c|Y|XvD?414E3T2}3UD;HsB3A1Brsf|qI@?5cI)LahatTo+?$ z`uoEc`3U~L+SOBOSetX<$gKjOp4MG#x>2{_gB1bHt@e0t&d2@h4IiGVNkeGBgNHp= zR%Rio~3*cy@dblTRL!mp2udXp{oY|&%B8Ufs5B3A&pOaOPq16+Dp7t|7bL?AF7$Jzp%_YD`1 zOzUB|Cm~6~ExhIZPXnC$f#%?trwKTo7g+2vLeLcV@RkADT^RanZEz2GF#3?M4lFJN zaLNkfwiMyl(?N$Rq&#SPNbu5u|J}R@lun2SSesS62PA9y)gE$$^GQ3U4D&)H@_n}!}(gxh5ok^q#s`r1jTz? z7{0-TealsoTnt9n5Ou>F3G&IDA+$8UkuyB}piM~-SSyTSzK>Y^9(B#_?C+!{TQ*Vk z6=vj`Ydr)?MOZleqLv1|P2glbU7T_h$(AjkeBjE`+FP24Q=S+!TGm zWao6?<=-kckouivyVYgOD1>n#)uqpEA6LWVY}a-4zc9c;ZHS2jS{)E;yS~})&VM->!Um7hs@6RVSH{a z38zw2(=#MuZtX8C1k;MMx092&uIjCX`o2zT_P$#M{JY)d0D#8qqQ`Vfk7GSzJ z4SV9RT2hv}A|r*Oj6g4|gv@oHojXLLg64t`vmF8+kNIT@UVk~mOo--)0p8!Wgkp0+ zTEc>%SVHMo1*yXh2*K;&1T~U^e3gJl1_hkENwAGbZ3BugC2}S*1lYjZNlH;jz2L5P z0<-U`2d6Cy&b14ee~hwe14)pz_V$+&OCs=zUY`u+9vI0!HImi-IFi-v&!O;j0B?Tj zL2<^{Q%QVc8-*A*R-&M0XD)q|)V0%usTy0E<7~GwHDxRg-A$7n5$8#(AkB9zB#4U_atDf+zb;rZR9W6nT5C7`)#H7-pW zKZBQ-37oz{PbvXFaZL{tH_@EZ-199og~$~YtGH>SvKpIRg#)D?wN6^8G=_h($yY0T z1I|D;I*no_1-zK2n53)};NC2ELurtNQV~LFp*f(Rf+)6Kw}xiyQ29ABtPamCLD7Y8@?}<{$43^pyOrppTd|%=a++G_U7K z)hk?1H4`U)NAr?}h{GAfp-&WC`<0%Q39iT%%p)HzRQUDN!8C1^d#2X7*he9avxoHz z4y~svLiBp6HfL5^2FRg08a3l44E^4Q#@_qY_?Y~LrYpPfVn)5MnM~IfkgCbrVf;l0 zSw`9Ku6kEeI&~9$R9I-|X#SnxDC5!nK%KFj=v`!AMMh&U*?hN2Ux;OG*;v?M{6@tF zwwKjNgF_Y=@%SvJO8vg;e@oOnjCejPB_Ho93;&o+sW=nDj|PbYqph4sTjFYbNF7q7 z;e|ibZ2pAw6zVMv#8{y_2@Rj9w9k4DMqVvXs_GGPaepRF(H+nM0ymdu Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/check_mn_voting_prerequisities/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_not_found/msg_GetContestedResourceIdentityVotesRequest_e000a8dfb1f42155770acb028f56557d0524384797bb450e22f41f66743d5d11.json b/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_not_found/msg_GetContestedResourceIdentityVotesRequest_e000a8dfb1f42155770acb028f56557d0524384797bb450e22f41f66743d5d11.json index 765fde12877f710aabee6c5a0c66188cea660d74..40ddedbff5e27ae27c7fb04c5da0a204e3165f18 100644 GIT binary patch literal 37214 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 K_9oxn-~S7t8IWE8 literal 37184 zcmeI5-EI?U7DeZpr$D*(MI2(l{Sxy4tyYAZFp4IVv_cwbgn0K}tG*&}XhLe00L{fn z?hrfQsq?e<+2@qql0QCs{`}~}`OW)_>#L(*o`2-2FC5?f&a;cR=U2BExBor6c+1Pb zPDea;vfFL`|KxwI1~VeReTL@f^5Q=iw*Ytb=jG+yi`Vboy+8l^t2b}YZ_eJl|NZ>x z?Zwri`3nJAQW#XL2kB#3D=D$1<(dph;b}#(-WH3wQk;%R$oF={jFJ%w(HyZh@?v)rQ{5r4D6PlH+~vCDIxSLA>qOXPgP=iW3@PI>6(Be<&uJjQ;9}vmlSj{X->#G zUSF(JmAF2@C4s8I5mFHWSwWRb;_3QcoD|B)6S%^SaXx9dQ6&_pYSes78ndvYs|mG@ zaEnE3Re4@Uq~-1NPOFlO=edDO4cPY_5via+mDEs_w{OA{vb2@#D!2;wH~=QM~*F*&&|lW#ryuVah#Es7kG<>N6Y#5z9rJ6haPtOZwmf zPzY>D)GC?qCRoaXZJ}Pj3=Rv6i@GTl7o$pozW7$osOkhvL%)k*TBzu_)TeX4DTTqk zvbxM(3jH)$v3ny3iL}r!O1kv;kuFG_keUnBqrg#R*^p`z)jlmcP)V*-rt5RQbc9@` z?-DDxJ}8&9){qJcwMu3Ii()%ym9SJZNicvAVN^1*5=?Jmld^GVcEJZccBWZq}5flo|EYvcKqJhGJY$jzM zi5D*-zJl=FQI^2Wr8WprB?MPYCCZf$Bp{dP!50Ug zDNw5dNA9Lb^4i@QvZ8@WV;fQ_jM86{xlHOjO6uIH9FBT2b2!R%LlzDfyc`Gh4sMvl zWk#$c+-WQ0aAP%Cr$TZ41YBG&w<=6eTLx$a0>;&hgTEnygq3X^ldv5!iCXYu28x^NSP;2~7dP zS>dI?Ar?h*j0)aXEHEj0Udy|NgppCYDDYX>dQ*n7l@T+lR87RLkSd=qbdpQu{M-~( zqbO{}g22)p6MGkr!Vq(*vl18a{eiJVE>}X&6IIa=6R8W{w45hUbWx~cBGjszr0y_x zs8t$jlxsO6KjC}|rX8j}Rr%v=tz2CmKjcaLNi?YPvOH`E^8*i8Kx=ED)kQ^Z^D;C& zU$q_ODI8wm!XA%1((qET&bh}Huw@E-CXPy{^8SQbLkgvdREZTlPYVWxEjx_#V2&pj z08w2)+SGlW9x^1}ZfH_TxPnv#aSK}*}t1?f>kY5GNh;p zvzOEtNO~FpBr>{V@kc+lcB*ZZ0^6asY8+&PeyLEHXjKLihnuERD6m)##6-g7=Z(K& z$M`NO>w>6?iRVinc^L#qbg|FmZ!Twd`z^)JIv-jUN~BZWOCzA_HsU&?E7@q+ruUpykF2#uhBZ4nZy^ z!pHfPI~rR^B?@>cf-v*2XpXgI3o0ZrDqNJ@%>^%Uu{WydMZ#AcS8x)2i%=R^Nq-F? z3spp<+(D3U8#L6Xx`+$2JY2P^wM4+WGOFG%!i}PeVo|s>7b>|x63L=4N+pSUwE{uC zEavU3hZR0Z6(uw=go`Km%p#5_v8!3f1_wJOy^v})iKH_3;$_YGQY)}a@ksJMVzi1` z*I60*sH)AhR4l)~$wI%9uO=lbS&`1iJ7TY2R)QSQ*wc~=#!6AkLAhjNFO-mU5tlkg zd;v}uv|CL)x=7q^hoh(pK?y!}nJg`ptmg#_7xC@`D<6y3fN>s2$;86Oz~pKvm+3Ql zN-nj+wHMUkQm8fUSyM*G3J@@ytQ*$p`gMO>aVtd1HHCtj#G~(u3)>-bTQ7a4Cof_h zT^Lmo%)||L^)e7i)<@YtjUN~BjS;Mp2_dznn-bB>Vp$fuQrmWMnlu8DuJ7Ri#PWOx z)`hNegT78xjf<#RR6zr{qBeGPq@PidNa+hFQ8_=mhzy)_Sq!>fP|l*Xnt*%JC`{_j zxKWkdO&rZBRGg!#pwJ-E%a6u=fbP%5xQieX8bQ>g=mUjHxx3w!kc_8fJ>tnJK*dCo zIQyRbwxj*RnuGq3r=$;4VEl3Y!pL14nGzH4ACHhjaea)~Nb6X+o;4JzEB;hwENLR4c|!T+oav zny3kdx=JpI6j_+dRRR;f5*03FZ|QMOU}G5{gD0+C>8+Zy1`hU?^4d_PR;e|_Zah-T zEWf2nV!?8iCg3U_O5Fqpq>akpC@&IcLs70|LKdaGvx{nim(;U;C$YAPx{xHbMqkE8 ztrF-W9;4DrLcG_uVOQd}Tj54jPE#&)(hK@rOw|8ECtVaZ@H`AGA0+0)q=8 z^Z7IkkcOHFvRGQ(MCy`MLQ27ag1VE2Upa54W!}3|r1SA@ot4Cc-gRIUN{B*fH?u%A z3b8dIi_$)$RypxFmS!)dT$*q`rq66itql*q_vCy0e`(kvl9l`!N)`V=^Xc~O&E4beY4(nz6^=X%f)t>X`_q*lz{9(Q0xY}@j^}J@c zEYBa7%axPo>p$#v&#Nw1e^{Tia^q_Cez{m3x}2}#yI8&7tt~7Ut0;EsEPNH;a=y;b z)oRbm;%G9#uo2N}59^X7XUcY&~{&@d*bN$Et`}c6*`u6VK{a=s&O8#f{NvW?pp&rWdG`EhgDZVrddfn9vejxPb%IqUD| zn62sXpr$+b=vlCkY?E(zVBhekDa6-0f!{v%!;1h zs-&;kxGd{TCVh>?-!H`V_Ie*5D2*pLdWDCq9f}{AIL72RBJYZ^vUZw@tHr5E_g!~2tqzYfm*V_5Gg5pj6Rb~d4Tq5R`(|Z$OUP=Xuu zLS>Z_b%`ZW28+M4(dXMz+weAiREQVbt39)k%(st ztj`7`55i6AWFt3s>NMfxJzD%;x^TbZ&8Y*TBvDnHr>vKK?HZ^4tCrb*xMD4Li znH%^ja7B`AQ6}18sCYY*E4(r_sCtK5T)>UToAt7^vjw`I9C}wnMb?}A!~|W*bl98^ z$(2{o)vTWh9IhG-486&fQV$7VOsEPXu?-GKD%8Wk7Zawx^z|n%E7v5n>O_{z`EiNn zVtLLM6L?Ih^}a3=h-{JL+z9>PhB-ee1qfS5s)))f!`KLvRS$b%V(ACN)f7RBjEMl@ zxe=GFmAP@nmY&L0i`|hBo|{rlZV`X8CDp_h#ajt_ydn@o^?21B8<&MSE7@hryw-=t z!xu8yLfNX0Nk^XW%9!ZsQn(X^rB+i#l`9+@UmpoISg6HGk?As7KT#S;uC?OzP!)I} znA1;L<56`Z?8)$ilCZ^=hLyz9D`O?pHPu(_aw<9@Ba)4YLPgyKK?TnFS`6hD&Yy`w zDUa22NsqKk$@6q2=~YN*#fnlgvJexjS6!fDH&zn6Ss$+;l|g(WSEBJv`LD#5{HS=t zKnYw@L?9C~XtuyuZGu<~))l+c5JE7$Px+I?wxSqkRBhq=_?EcDoS+g#5t)mocm)qt zi-A#QeN3R7l2HyjS*?*8lcmC10a0+Pc|Kd{N=E;)-XyleExVGHoz7dU|K{4K0&ygf z_vJ8=>QivYkjJGU&NR&tTa@~lK;-d)M0+|S3IhI)FCN2|8tUxd`nkHA4E#PQO z#47_L>&JQ3g%J?V-EwPUf`@iXvIN_083MPdsYzk9a5HC0#KT*orJ8~A5-$vqV@wdV zQR9^@a6|QIj>QfjtV=SAUbBj~Fv@sE_t$}Q1+8*hjl&>ryMGu(YgU2d6}zmA$XjFy z#Lic~`&al%*k|<32J(~Ft9adFh+!B`{_`^9f#PZoAMV<=K{&Tfz33bc$EXrg=s0H# zly$xUhys^2p7x}gKIhYG42MHVMY9%y@~Q*zGbxmICeIHRs&R11Y!XY<$&z6dAHV&rG_ywHetfxm<$t$nO&7jnG@9E$c|Df=wxIk zyq!}j3mkz+AbL#=cQFS9L_$N1jKm-4VFvGP0d9jxqM-VeEKEqKgrf&Cjs+doBq~uC z6~|40g(;<+uUvxR61WTr)}=WsN)zN=){wlaV;l=QtjaCxl^ReEwp5AQXjIWpc@=s< zDpjhqJcS*J0*i4Vz|Krx@!w)McMYzxBuhJt1#S~~wy@rk%8)$t7zVDmq_$YKNyuPr zvNS=D3Pj0Z7;bar2h?CKt)OX25PF7f!A`JU%0dFSR{^Fp5;z5@0%t-nRGeVDf;;}3 z>W)8ZJ<2aNP^kwM=Q@j=RZw^|&qim!xbA=&fIt7`R^LgPl9(5eUgn_Kb zA|126BUa>{)od|^kPNfM)TWIhwXcMCLK0gOafsVKOIA%UNLJ|}rc_fJ#>7Og8BbB> z1Vg06OY1k)oh_I!b(c{}t#1%06nY@4BCvw888w)wyGoa`k}Y=LGYE#^G%r)#4nEmm zhd#WJ4Wa6`sEk*;iMB-D->aSI}bT9GxgK2iAV zrs%)o32>;WOV$kGl{$42DwoKT(S(_ngrFJmpJ5owhc$^(*VK}J@gLGE6Mjof z0Eca?!*^379TscmM&l15L}?Xi@rsvfO!mTxncSRT3{<(&UCe51WyvrwQOLUJ3^ciN zMZtJx#wQL}D1?5pPP3k(P@M%VOi_g12Dq$82TZ5vft%`9E>)JSOJGebVpfsUHU4Oq z5HypeN^HIl%WM{-fzrwZ;+RlYEDr;^QF5Inn^Gek9R*WFic7&uaa(3GwWD+xXI^d| zN`^SZYoarC9g-N_Q_&`b2%zjNsSBxQ@X%3_qO&I2cr&iC@yD33S#rd9xp_FOLBSQwCUn%MzC*VsCX!=&mE2w7=}+WgpiGuVn}QaH@>KW!p;l&k^)W%`QYIjhykxGxT~T03=!`WzBF?f&y>g{sWTDDjZ3*b6gQqTxxTRm%E6NG|qy?y!fmh}#Or;bQvR(ma7Kca*GIf2Y z7ONb}HX1T3XY3fzCK(4)LsnO@6iGY3B~etR><$F3(%Y?=3xw1@FXLF&Q^N|7bD zMa{CblB0;%Autu{hT9V133?j^m<${pu#UB&81K9@2+E=>1oM5EW?gT%9Q@;*~)#aG1-AWXU8piK0^&K?@cpgqUC;xBU()Ch!R>$*l>z=gP+J9}2{f zb<9$i+$yRw9vC<#F2R7qxdhcw9#wsnHLWy{d8 zJ^m|Fkyt~jgdoS-Y(adamGQ>J`9Ev1$)rjI)2nJ9c6#gNHu ztyf!WdQphP%EUk-$E1k?MwMjF$0gNbCblT*LK0OPOjD{^a6T`!MUIh4DHDPb|B1TD z`LYX4(5XseoFU0AFEb(ZEhb$FoR?`;AnqizK-`{g8K!5YBjqc-YgM1u;5yzBQ2&z%~5Qi-)kh!OtN-bn>PnKj??13wpY@J6bYv+|h z1h}mxq2DHuoNwwrQGkdcNw&y=u3J&LqN^xgHMZ;6A-q&pl`E*2UT4ZYxsp7=C2Jyy zGCb*Bh;WR=WtRcH$F3ZMy~eAKh^eVWVG!(5+e*iZDZ|vDEfBVtVKZ<{AP5^R=mc&+ zk7Jmy88#pm6_xg;3>AW0AR0J=g*xBf1vkzlKUO&rHd%Asc~>KSuM( zrwTdT1_*;f*27pyKWm~Kb9D!uBpivw=(C+UbH4A|scysDSby^CDN}?)!HF8@ek<{v5nRG=ARZYpphf5I$HPYLw2J2G0Y(M!p#oQZ%1npT)p4{ZN z8;@!TqCL48Wg^dguGq;JCmr*=>9QUO<(?b&+vg!b_=naEs5Pq16yQ^B9^>{Wjf~* zz8Os%9CCV#Kaf`WLzWno6c$rJI1@BKiCsu&wy-#iGMW&q<*=JAvN{5XL9m-p%F{p} z?Kbr&gK|@8b!SOtW~ElMM7|WHG!*< z8gSctpZ&AeUi(y=-=2K;-P3osZ{FU$e)aVG?|#eMe&gcd>%6;rar^52?*2c|?_T8F zKg=dIyF4BqzMd{`R&Se#jO)hfj4dS$fw z{`JcFyb3&BtsPd;rpwh2o~=@vrqe3K`X{IL52jVXRUXIlN9W`5>f@W~e6e~nt=_E5 zJ07P6fge9uKYe-k@4Nfp^y=4_FCV`7`sbhD-v05sZ(iKKdH&Pef84%$arf$+OTn+xws1+&};6{`tGt_qWe~dHwQb81Ve=)z7bgfBY|RUcb9t+~s`HBI=U)r0ND zc?t9EaK6r$7xOs!cMN4Vg&psZ}vrdPkb(+6bbnJI(`B(#|soBPA?qZ@ZnfGm) z)&#attN|YjH8=l{$P}FwS(Eewz51iRJ%3bt+HFYWH2RITa1uiLx2$U7+k`zwo_wbY;E3d!_H-tM6OYQRjMFZ&foFby2geo*pX|LaeOGp{3vP*C;=*fx-NqZ@! zF;;}&4n0g2v@6qCxptO^JBA&pzI}_0xge}Z2|VM91=6Eg;qEADcfhAA8b%32T7{6j zg{N1tp$d0oN(Ov!5pgTe6GEbV1KCMF8fDaOvM|@q8%n8#s=mM>h_qc96Cvc#H`0e* z0EECzDZL_>dLGBbEH@<`BArvw0VR2*lFpC4Ohmbw zxg%EO{Gcq?+NLBZXqQ?=ScKzHFTy%kL9D`35|Poh+sv`v+T*RJE<%iEMGGz>DUdav zh@Lcdsd`5gdQ!kEO0&xHlF=>@G7-fh_UO{5Fv@DE2Wh_Uh%_piDb#8eqJf1YvPsH3 z3YREFdkmoX4mdKiHiHo#f)5v8 zOGvK-4xT0?xlT7jCK^Z@Ye-QVGG8ULY-(O5x_6Yrs3!}DQLYWya9Hr_I?yM$;ewZ$ zVvTUqtt`gI>R?Tc%J~EwUNFjyY&6*g5ko4uA>u+3nvxYYZEUuNhDf7?e%#nyI*@g< zUCoMuR-Ka7#h+7DV>=X*Rj-j^ALH(E8NIsfxEy9Qgj6H3?TBmDwb%WX5`=^;A%e3b zioj7UM01)|c&k{%Mf6u+E{%ki?Ydz8C_DBVke|xd!bXgB=*Zts79r+ zibWEmC#KxH@)Cx$7TuKzfu9eIJLGmHtbMW)4QU~I!J9AV1WH2)Ra!`TtE#r)11H{ZZw|-Kt#Oo`1+g{2>~sylhW9g!zib3aE}ov|3cOV=hax_Nwhs z9^vqg5S?+nBaJAEHP?TL9@*m*B0y+} zkd~&;=~0H@<3?SSggZzjh_|uAs2b-(et~0Ylw>trj3ndcCZIP8Qn4<0bKAc1sy6A8 zHYx+9q)L|r^pO~`Jt>iRwz0VW>LPH*m>Sjm=d1`pN~z}yb~>#opVkY5s`{u9MWqnJ@ z4Uw$GrS>vMwGZ6#c|~1fucQ)^mmUIKlA&GS67tfN0tYoJjFlTmQ$o@%B&4ixzchqs zX6?f$?QQ5Jpw~E{t2k%NP_JgH^8iY_k`JZS_Rd*tACS6)iXtO*2^Gbqpp)L>mT9A; zu`MA~ml8&!NZH2B#&J6w?b0slT4F(5XK?P=_Ci`U6|Rg5e6-6_vM_Lgd-I~9V#zqf zR&JL@h?`GJ7Oks`pf>C&M8^TS-6(QjtvyC5))-<$ z0SzQ>)SQNVmvbYq!*i-G% zSRqwWNE8u-g@>X!?QL#BLXu{c5K?<7>xviP8Y1JS zg<}Zfwi)jeRZ=iA4zZ<~CAQcXuejg?NWA*md=nV<2}CZXHzroPYWaafYS9ksI8=(I zQF|s-OOBKY5LqRu+OVec^$NG+X(%OY34&TES0YJ>jstSLQGBgalwyq`nw1E?aWB_( z*@-E(FVW=YpAh)jNW91;DRJSUhe(;_6S@*=%GJ%=gcX?hkQ%9n^N11UcJQYnFACWZ zkqcEMSD4O@w0Eg}GuE|_yzH1Y1u;8?)EE&_ICkhNE5?qyeJ&@;!*o^PTLf97L@hJ8gQ?>MJj5)bfNr>mES_XV+ENzNhAtXer&N32lYgWW4L7}5chl?}? zENV_FO@HX_-F`~{+swS=)>r%BC5aVc$*NVPS4uo&QA-eRG^-Rs(v%4m`y~W2a0gGi z!bCcnSa26aMthA~$x3Q(;XzQSxMZcEWI!;=*T#K--oH0rz=~jYD}q=T(T6mOYL7Bd zO3g>A9{F$yp(2t5fQXDp36&kOZ^?0yQ7XO1YcrjOeFAMSyouqA*Ci^d%!f!+R`E^A^Fn; z6|$gALz=1ut#zERuO_nvc@Cq+BtzBe! zTx@7m3BKkd3~7r(DjC4ck=f^i8acoDP)m~!mfR8q=%SWqYRW2VKy*zA+`ny9qTutF zGGx$$+Eo{5ZcQ) zO{C;s%b0Q| zk`T(kEK130X|K3cIVG#!*08rFq4G9Sx>UZju)0<@(z`pV8>xS~yDr9(dNx*9SJ=gL z*te|GJlYApTOn~OT?A=Dko|ae6jV#JsFB=3I>cnZgZpv8-XB%Y+Y)4v)>!W~$!f>C!3$cmLYE!-)MSZNM>5(x@UH>dM~iG@&x&{34?5 zB9~Ml?Jc9Sm(?XvL`-5#yrKeEAOpgC;2aPM0-E= z<|TA$lsv79OYe9>r-l$UsC^hHDJ{JcWvfdl%@ zavPX`sncKKT;%ASoux7V3TJBr@(ZAwc;-(|I`cq-g z8Z4y#7LxQ=CS;GSqx39=&}RgA2`jNs*6T923p8}t(=v!O$knh}MHXe$>!Oz=Nr{pP z3aYkb-%4fQckPiqeyp>TczF9C5Cc(zf{a_wk7x+7>yj!^&`J;8l(?3fSfcm@Y5CbL zG}@i(zj*Wg`G0Ac66x6g>2S;fTm71-MJDerK0r^$uDj3t7V9%V_~cv5oBZ?R`~Lz% C0VIL| diff --git a/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index d438f5cdd3c70a33082da0d6fb21c942f97f77c8..e64b73d8a77bdd2ae7413c918f513e44a6315072 100644 GIT binary patch delta 2865 zcmY*bYiu0V71lg<7H?!{gQ0d}XJZFHSTnP8XJ#LMZR}(n2goKiL~Wo-$W|y&Dj_ye zTO1M;qg0@zO0axVA0m`?`>QP~5E0Y@5{ZGJl!nMbNTyLBwxCo%aWPFQRSl|p&b_-a z{k1bY_s%`%d!6~$@#^tcs!vSm)yXb9CG1qnPWg5Kzuw*q|IvS_WkCF@4GtPHfFrH& zj?uY1m640mye<{kd`lOiyr;)JZ+W~RfH%T*cw)0*o{WbkG$`zFp?KJYV%~=0LIzeP zZHTs*@TUeBhrg?t5c|Y|XvD?414E3T2}3UD;HsB3A1Brsf|qI@?5cI)LahatTo+?$ z`uoEc`3U~L+SOBOSetX<$gKjOp4MG#x>2{_gB1bHt@e0t&d2@h4IiGVNkeGBgNHp= zR%Rio~3*cy@dblTRL!mp2udXp{oY|&%B8Ufs5B3A&pOaOPq16+Dp7t|7bL?AF7$Jzp%_YD`1 zOzUB|Cm~6~ExhIZPXnC$f#%?trwKTo7g+2vLeLcV@RkADT^RanZEz2GF#3?M4lFJN zaLNkfwiMyl(?N$Rq&#SPNbu5u|J}R@lun2SSesS62PA9y)gE$$^GQ3U4D&)H@_n}!}(gxh5ok^q#s`r1jTz? z7{0-TealsoTnt9n5Ou>F3G&IDA+$8UkuyB}piM~-SSyTSzK>Y^9(B#_?C+!{TQ*Vk z6=vj`Ydr)?MOZleqLv1|P2glbU7T_h$(AjkeBjE`+FP24Q=S+!TGm zWao6?<=-kckouivyVYgOD1>n#)uqpEA6LWVY}a-4zc9c;ZHS2jS{)E;yS~})&VM->!Um7hs@6RVSH{a z38zw2(=#MuZtX8C1k;MMx092&uIjCX`o2zT_P$#M{JY)d0D#8qqQ`Vfk7GSzJ z4SV9RT2hv}A|r*Oj6g4|gv@oHojXLLg64t`vmF8+kNIT@UVk~mOo--)0p8!Wgkp0+ zTEc>%SVHMo1*yXh2*K;&1T~U^e3gJl1_hkENwAGbZ3BugC2}S*1lYjZNlH;jz2L5P z0<-U`2d6Cy&b14ee~hwe14)pz_V$+&OCs=zUY`u+9vI0!HImi-IFi-v&!O;j0B?Tj zL2<^{Q%QVc8-*A*R-&M0XD)q|)V0%usTy0E<7~GwHDxRg-A$7n5$8#(AkB9zB#4U_atDf+zb;rZR9W6nT5C7`)#H7-pW zKZBQ-37oz{PbvXFaZL{tH_@EZ-199og~$~YtGH>SvKpIRg#)D?wN6^8G=_h($yY0T z1I|D;I*no_1-zK2n53)};NC2ELurtNQV~LFp*f(Rf+)6Kw}xiyQ29ABtPamCLD7Y8@?}<{$43^pyOrppTd|%=a++G_U7K z)hk?1H4`U)NAr?}h{GAfp-&WC`<0%Q39iT%%p)HzRQUDN!8C1^d#2X7*he9avxoHz z4y~svLiBp6HfL5^2FRg08a3l44E^4Q#@_qY_?Y~LrYpPfVn)5MnM~IfkgCbrVf;l0 zSw`9Ku6kEeI&~9$R9I-|X#SnxDC5!nK%KFj=v`!AMMh&U*?hN2Ux;OG*;v?M{6@tF zwwKjNgF_Y=@%SvJO8vg;e@oOnjCejPB_Ho93;&o+sW=nDj|PbYqph4sTjFYbNF7q7 z;e|ibZ2pAw6zVMv#8{y_2@Rj9w9k4DMqVvXs_GGPaepRF(H+nM0ymdu Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/msg_GetContestedResourceVoteStateRequest_8789d5d98ad7f00573a87fd0860dbd43fab2e54a98aa44bc88c049e1cf72f5fb.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/msg_GetContestedResourceVoteStateRequest_8789d5d98ad7f00573a87fd0860dbd43fab2e54a98aa44bc88c049e1cf72f5fb.json index 36710143726804b9c2e67f0437b5d60f5d502804..fe272aba2c05668f02d45afd26d2eb647e0b8bcf 100644 GIT binary patch literal 48713 zcmeI5O;4Q36@|0*uRyF>^xJ@;XP14H{D9F2F?LUc27`sc$;k45&v~i}y1*WHJ(XC> z!V>nlp+4?C=iGDe+l@4zUL719e%#)DxVpVL{ORCRUh<9A)4%iT&F#(o-Q}D6i>tT! z_RnPr%ht!Mqo)_k>ZE(IIp4iF-|YUqoSk+rR_pG?S+{?^?v|~Om))|HepUDHW!2rX zUiSyDk9XTQ-BHW>_3j5tm&&?3YFWD7C*86AnoWODxBmQWcfoP@{q;$=;keJDkMF$O zv241dPP)6#Pa6ZjJYIG9_V&%gyY0>W#r+@ew-+~;@3vtr-+gy^b#wT%>gwk0_TNuG zeSdkE9e>Z-zuvt4+vTs@>z6A(US29^IZk@ z%|9PwU>?KHS{D z{O0?++mFbN6HC0G^Y`ahpI`mu)u+RM{C@b;&r8ZN2m}+pPL7r+Cu!!t{QETj&YzHq zYVzaLbJjiI)Neh>&%d?mX>EY5*StOoa#rf| zbaixkdURScjAiW-uIKcBpB!xxTFJN`y*Vx4$-yO1;7G7s7o@U|5x|Jh0@2>93jSY`13{f+liria_z^ERkD3GG=ZqGrOPqlt(ka^? ztE7|5lFs<25t2Ul009Xj5;W7v^J|sV9nZB(k0kKr=le_S#UYf&6CJI>5o@F38&{+S zeyd!%d-f}_TTDep|EW$8`UgvsFxtmqD~`7)(Cku_T+<7`RmGr8Bm^0$*>Zb_LB>k7Cc5_?P1mmn)YC-+pYks@1? zi>+L-5|ybz)jQPUO5Aw9te2(D zmdJJQ(Ay0atT*^@MY@vdu$&)}tEeJZvwkM=Xw`Ti@(xzYJtTcxp(-fA7CM}$;vR-R zt}y+jt>61t*^AJ+Q&2MJ6H=Os)p@p<#JNJP_jN%cvPF(-1NlW8=6oOx5w?z05!I-S zVlgP|9`?b+$}b96Q$!##S3rc<1|iv7=EfCUdJ3zOyAxq_Zb}twWBz6f)s!ttw~}D{?*{Y72jyw^SxuU_Pcuy8qTE!I=Rtao;Jr-)X zP>X@cbQ#u9ltwJq-s1gG6*v^k`KPRLT-_Ku2v0akw%F3JmRSAD+=6sX^;LB_7oD&X zsYbF;SrFIbBIcg$S)#rId^Lqfw~)J8 zPgD_=VSEBB(fFp~S7sZ0RK6%s5(h*{WWol`mMB(Vkz5SdHFxJBNx}3!6%W9cq8L|H z-IBk@w-8e11O-%z$UHO=RdlFYOcZ6-b48p}D#~#us}-v;C{?Z%5tVK=&$A_6$@o9( z4X}-F*_EvAG~HVNH_tvb5hoJ)zFe-L`V<{9<#8(@nBqBNi*i2$zAXe1v$4lYkkWu! zOq#)577LnDU>eP|%2MZ-vBAmMzDt=aj0<7E2GvG{s>G7Dq8qLgn4&{YK6WZj;?{e~ zB2gK5XA-ZaVMyl|+uf>kRj1BmVtkLNGMt!#VoMp!l&wLfNrYQ6m`TlJK1#qPk%{zG zVB|74ahY7WB?2>}DOg#xghz7)Q5h1meq2}07(=3Yx7=Pap+ma`l%jT9hN0Wk)TA+5 zx-(}=#?h_uQmsJwh=)St7z2Yg>qKP>+(;eIvD}3S8PkJ#%WKg>F50P8lzzZsbp4CP*F7^zNds} zXYzcwP>myx%m&zG4N68)NnxgIn8atIs*D>~uh?pl$hT6_)x-#zfx+?^b*W)2h)rB! zcm&}jVrEwr5_5t&Jhr2pDsnQmgKp=X$`Y4EBoVEqhP#*}B0`FX7#ks;$iocYYzf_l z5wb}2DO;GZP)SEiWSon1SOXMUS1FEP5iU$AalQ&E3YWw&B-oJVZc&~f-(^MQwK~SR zNQYI}X1#KQl!GnRWNkdE%1=dwJR&Mps%d$Oy8sm~#)$}bX8Iz2%iY{FxI#&mHi`}1 zCULf8y%m)aIr11Lu4+kbv2H`k;o6`yA&;7fvOyGXvGM~dT+3VHY03~9!nR;1)Glp- z#O+gnDGd@&0jk6^As8u6s9n)b{HD5zN3DNwAH!O;l`&dn>nOy{y~3kGwAvGFSSajZDs0LA%lpJ(UHjun#rK+GvlElxNBr0E0Cwv_ep~WDqrjG*={RRX$mqUB>oV zFMY=LFGU=|sEP|jk~p|l+KX0AQ3I*bDz&55=TX|MC!UNPN=VVFVSy{MMH0ak)|X5c zL>2B#(ILNJYog*7`Q}Co%pi;vNDo~tEa~TiSDj{<5r@B=O{_$`(_J3;7BSDBz1Fb0p z3e&7tl2%o3#Z1^Ha)PN}!wy`*Q9X{TG*#2CQ2f>`RPJUm6sM2K;b9V6D(d>oGnS;1lDpf(rRinHAP6Nk>N5Y3nMDB z@MTUxO)z2}LmDGSkVvJ}yMQZP7BpQJIpI93zdK0P!*7t24eQ zDQj047Frf6ceB_@!WfYTf7lY;$qJ1+BMnDVXDa8AMk^cqj)IPlOi}P(@uk#V~hh+jfee zWJJhfWdeyuvVfdaNChR;iJ&i7nOoQ*KR95Ee|wEvOsC+Mv@i>@Y?KtZQhUY^rIXN+ zFPX)-jaM#Q^+^MnsXobdy~1UkER3AEB62cYz&44PYJzAf54+xK$ts+zGo+a@Tggx5 z>lWKWHVsILb9}LeE;*_+CuW#pyyGdrk^M~olLF_W3Iu;r*-re?o3Z%OMK6m7*&>8%amse%!q1+`gA(ghN|^V zz-5Y>!N$Pb7%?@)mV{*HMz+M3%`J*?o^usS;Ue6b6o|);b8^Vc6+on#UACCSAwpus zmPp+cAc@2oB;5pNwg6OOvudv(n+M^>i`hb8(tkkAP&rZQ7^y|H=07J#8-7y%c^q+`ALTb~Hd(nZfcgtLO3YAc3ppVfS=M?H z&xwi0_L0OR*`!k&4U>iMJ{8{a+-K-0)~y)f7FmyMsXb!cDAE(nV`i>UB+_$@ZN<>)^Qf>q`*w4!^$&$r)eqdsRH15){ zRc;}BJ6Fi+r(%MYNu)BUwzS+8BcWT0Bq7Q5m>Uuc|58_!1K4phkN8 z)L=s@kL`OuPBHI|#V^WdIec=%+iv-&CP|b}Zbp@u&wb9bGkVM>IXu+=a%=| z>IXvq-Dg9!HeB-yfBBLIXH`XDxy5wZw#5WSdBo#Xc|^Nvy?jfEtn;PHBNeOG=lpoC zY5!mw{n{c#PGAb!9rigG?r1>S6 zVIrCc&6cJp;|bg%hus#Kf_LK0ofM#Qox4!~g&Q literal 48680 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 I=cmvA0qcSc`~Uy| diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index d438f5cdd3c70a33082da0d6fb21c942f97f77c8..e64b73d8a77bdd2ae7413c918f513e44a6315072 100644 GIT binary patch delta 2865 zcmY*bYiu0V71lg<7H?!{gQ0d}XJZFHSTnP8XJ#LMZR}(n2goKiL~Wo-$W|y&Dj_ye zTO1M;qg0@zO0axVA0m`?`>QP~5E0Y@5{ZGJl!nMbNTyLBwxCo%aWPFQRSl|p&b_-a z{k1bY_s%`%d!6~$@#^tcs!vSm)yXb9CG1qnPWg5Kzuw*q|IvS_WkCF@4GtPHfFrH& zj?uY1m640mye<{kd`lOiyr;)JZ+W~RfH%T*cw)0*o{WbkG$`zFp?KJYV%~=0LIzeP zZHTs*@TUeBhrg?t5c|Y|XvD?414E3T2}3UD;HsB3A1Brsf|qI@?5cI)LahatTo+?$ z`uoEc`3U~L+SOBOSetX<$gKjOp4MG#x>2{_gB1bHt@e0t&d2@h4IiGVNkeGBgNHp= zR%Rio~3*cy@dblTRL!mp2udXp{oY|&%B8Ufs5B3A&pOaOPq16+Dp7t|7bL?AF7$Jzp%_YD`1 zOzUB|Cm~6~ExhIZPXnC$f#%?trwKTo7g+2vLeLcV@RkADT^RanZEz2GF#3?M4lFJN zaLNkfwiMyl(?N$Rq&#SPNbu5u|J}R@lun2SSesS62PA9y)gE$$^GQ3U4D&)H@_n}!}(gxh5ok^q#s`r1jTz? z7{0-TealsoTnt9n5Ou>F3G&IDA+$8UkuyB}piM~-SSyTSzK>Y^9(B#_?C+!{TQ*Vk z6=vj`Ydr)?MOZleqLv1|P2glbU7T_h$(AjkeBjE`+FP24Q=S+!TGm zWao6?<=-kckouivyVYgOD1>n#)uqpEA6LWVY}a-4zc9c;ZHS2jS{)E;yS~})&VM->!Um7hs@6RVSH{a z38zw2(=#MuZtX8C1k;MMx092&uIjCX`o2zT_P$#M{JY)d0D#8qqQ`Vfk7GSzJ z4SV9RT2hv}A|r*Oj6g4|gv@oHojXLLg64t`vmF8+kNIT@UVk~mOo--)0p8!Wgkp0+ zTEc>%SVHMo1*yXh2*K;&1T~U^e3gJl1_hkENwAGbZ3BugC2}S*1lYjZNlH;jz2L5P z0<-U`2d6Cy&b14ee~hwe14)pz_V$+&OCs=zUY`u+9vI0!HImi-IFi-v&!O;j0B?Tj zL2<^{Q%QVc8-*A*R-&M0XD)q|)V0%usTy0E<7~GwHDxRg-A$7n5$8#(AkB9zB#4U_atDf+zb;rZR9W6nT5C7`)#H7-pW zKZBQ-37oz{PbvXFaZL{tH_@EZ-199og~$~YtGH>SvKpIRg#)D?wN6^8G=_h($yY0T z1I|D;I*no_1-zK2n53)};NC2ELurtNQV~LFp*f(Rf+)6Kw}xiyQ29ABtPamCLD7Y8@?}<{$43^pyOrppTd|%=a++G_U7K z)hk?1H4`U)NAr?}h{GAfp-&WC`<0%Q39iT%%p)HzRQUDN!8C1^d#2X7*he9avxoHz z4y~svLiBp6HfL5^2FRg08a3l44E^4Q#@_qY_?Y~LrYpPfVn)5MnM~IfkgCbrVf;l0 zSw`9Ku6kEeI&~9$R9I-|X#SnxDC5!nK%KFj=v`!AMMh&U*?hN2Ux;OG*;v?M{6@tF zwwKjNgF_Y=@%SvJO8vg;e@oOnjCejPB_Ho93;&o+sW=nDj|PbYqph4sTjFYbNF7q7 z;e|ibZ2pAw6zVMv#8{y_2@Rj9w9k4DMqVvXs_GGPaepRF(H+nM0ymdu Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_nx_contract/msg_GetContestedResourceVoteStateRequest_f700de7bfd247d4f0193fabc530ac956499cf0081eb632e6d84ef4f9c32d8690.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_nx_contract/msg_GetContestedResourceVoteStateRequest_f700de7bfd247d4f0193fabc530ac956499cf0081eb632e6d84ef4f9c32d8690.json index 9aa61c1d5cd990abd431bd2e2828becb1dd7002a..6d4f3e9c524f9e2dfb681dcef6ae6ae291831238 100644 GIT binary patch literal 10589 zcmeHN!ET#C5bfDtVR7bQY?Iiz_0U_@ABZAEY*L{Th%j~=MgI2=Ec?7+@Ce8jyHXC0 z*86s5-n@M*kmPMLojQjo-^E$#+)dx;YdJB)n7(bYw8+Cv5yV@XzOR;)%jUlCetx+& z4eA|v&|Bkdv(5fFN{gU)eTjlJe2!=rY4$mcQwOW!bQ}Ev`V!_8@q^ZWO}F2}$0%v8 zJcP+U+P(9`$r;nBx6+wQr!37c-fU)mUEiADJkQXR(#)1{*aPb@lzb- zl)1o=~l4plf-!fyx_eejFljG#edEOUH|rd z$inq+YDmRWRJ~^5E>{&qgDPzasX~~caFyAB=nN=X5u^rykhyiBGMkVhMl%=)YgAvf zxC=w28!;rUh^i4)OKQ^43F}VVTCVlskeNqyA(bKY$5+}<#{a~)ikYXfX3y3eaFD8)g>V}nJfcRhC~67va-q6J@r3Y(kdQ;L-?`(9_RIRFaOFY6dMz$g7kRl*U7~m`Yzi9u zAC1lT3u*`u*AOCH)@&fp_X`jw4@ijOkTyWS8^`t6>ca4{8bW#Y7Es@A=!U2+M)MAf zzBqa7?$r#X$Ab~>=4hF_7Z6tikPsz6z0QqcwIHuRUVsGh9MZM=UFJGUGJsms%c5j# zZX2N%@6EKKA#Ui?kMYLuaHoHuEcET5A&8&RB^@@ zv>wYmA)>e%`l{@A<3Pe*wYo&9HGTUUMuXSFWj^LvZGhA7Ky1As zaF+e`adEQik=#Ye9Jd8di%tO83?8u7_P7(*RrzkRR|yFTXCK!GCuw4^Q{yh^fgQkK_~&TUW=Q}dSB2`ATL0I8XVHK`aMc z!5ONV)^h`$j(NaxA8PVr9C}cL(*PuB$bEUDz@Ptp0{zs|$ Y-IM;$sv=Jz^h-;+Sk?>IoBI#Pzus;8rT_o{ literal 4121 zcmeHK%Z{5c6zw`+5wZ3H^Oz*F>!Q1=KQM|A1D*<%Ktv$zD9XS07>5%V8ep=jsz`Bk zZQpzDxewdPX|Y^7M^zoNvT&Z4CrtH%OBu7IEb1yw>L^RG{L-puH7^XsWAd-%;8Kxo zR~jcRlV+!iI;!9IDk|cgLKU&Pi?hO^R#v3y7kBq@1&eRc{amD9<5!jUHIH%LsKX!q zaP5rcQm#8>-6?@Rk*;e`H!FK4rIk;>xB)wCJBX}OhbA|1fr!`PIB}krKclQj@+MVL zUM4?O8pQ?1>!C)}S@AtOmbHp%XuiX=t{O#as8n?n>vl&DvbRiCz@qJ#L7oQd<=Sx*N&o9#Rg&&A@AfyZg!k5y;2r)biiJ`Ziv{JYh z8!3W~2wf3Ez={;1*9t2UuC##N%g4xT5#U1^yS9}t!l!n{Z>_N9b$}hRMq69pKx;va zmk@@XQzL^0ZUTBVJPn93ymF>@FgL`o(%J&*B9IS+HbBjAD3~Ptb;|@ef&*VPr_gf& z9k)#samWxtn}loX>@5=xt%eMtOs7U*Eg-bDyCM(Gu`(H;ZAD+h0J-%c8tk7rROyty zxMGB1GHvoy9toLS6z&Meb~-|}*AliB!*heqRb5d0SC}Nxg-4p<;VFN$&X!& zIn72L3L_QdmJw#s_|MK4&&9~a*oEA`a_#EybWdg;R#g5_<~ypFw+T3`Af0wP{U_i) zsyLpvt_%Aup!Xpkrp{arBb;F7Z9a2C?se2ms;uDP7QJ4T zfU+-Gn-~+`Gq-iqxv gSQ%vqx63qr2I(C?-CL))@$_E|Uu=9Ky>NT}4dTBfN&o-= diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_ok/msg_GetContestedResourceVoteStateRequest_aaaa80ce4fdfc75252132a85e6c12bea6a47c9f7bf30133713b6b5cfec3a4d57.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_ok/msg_GetContestedResourceVoteStateRequest_aaaa80ce4fdfc75252132a85e6c12bea6a47c9f7bf30133713b6b5cfec3a4d57.json index c0abf2658ffc973dffe5f477731a148e5ebbb1ea..7ec5d3867602f3b3408c87d4a20e82510381a4ae 100644 GIT binary patch literal 154811 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 P;(LEIf5<=n`0f7!V`Z=s literal 154055 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 Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_ok/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_ok/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_ok/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_with_limit/msg_GetContestedResourceVoteStateRequest_7a62b33ce71dec56fbbcb0302eac0041cdc16404006d1b30577292c6ce106cdb.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_with_limit/msg_GetContestedResourceVoteStateRequest_7a62b33ce71dec56fbbcb0302eac0041cdc16404006d1b30577292c6ce106cdb.json index 7be73b810dde2a4336853cd58b582ae2dc458dc7..0034a48f9423223587ac4c5da451667b913362cd 100644 GIT binary patch literal 137570 zcmeI*-;P#Cb_MWU`za9DT<|qu({q>mD0zU<2r)K^&@eE<;AAxNyJxLa$IZdm?)p{I z79Jm|!QD`G_Mf%(+Pms}w*T?Py?gh+d-3+$mv3I*|HHk1vzvyev?1`Uj()M>0h6}e0~3B)yvo4y!fA+zx~_ux7qRUS^KZAzxlW4e}3`m$1A^k{_6dU zZ$HBS0~7AuyBq+&ckd8V{_5c&xA*QHBgtQ04oG+H;~PfZM0D@KxgT5l$n52E$ZH>V zK>JfuKU#cbz$acF*|k0RgO{J=|Lu!!-@h8!Pr7a>bN~6PS8x9N*~`~ozk2`8i)XLi zeEpXf-#mN%I=}w>?Ym&}^7Vf``|i!V7th{h<=?aQ-P`vsZt%*Ix9^@kZxIHmm;d?l z#oIjVKi_2C>-Vo--K_ii&HLByKC=6_w{N~H1^T$n+3)lF_g{Sf#lL*ptFe-1<0w|4XZG)+VdN%$Ed{wq=gF71yED?1r2k;+@rUU0 zpk(~kh?nZw2W_~qv4qaQrpXfR>14i}43C)Ri8`(yG} z2WE(t6y0iS%m1g~6rclT6W$HU`d9t&`UlQ6#UCTOLB08zbc8zF_MaflCEe<0J#6^3 z(-bt|lBAqD(DSD%>0>rtF2_tZeH)8^z7UVw$M^LirEvqtUg0I{4#h8+NL%`)ayeML zor#CVt;q2I)^a>-DcKv!Pr$It*I{w%>(=5ru8%Wc!Sn0POz|B|WPNLEI)tu&v{{+n zQnE@Eg@D#a1`x8MK)^+E#HEqdl&B>(i4rVI*P)BkSk$qQ@F6%BxXG)UNVgS47>+Q6 zLdar*JBiJglMLjJ81C$Za&_w$I|YW z(Dl}#_b^m+z2v7R(v_sc_W2<>c@?_K`jx=LRi$@wMe2d@wdkmVlGqInBURKx;HwGg zFZ=pikCjIfsyZc0^8C7#=At~$774s2Xua1(1Hl$K&yCVA+>qyw(vDYVg^Fl+C5){= zse0(aMCliX(-e^uiHQQ?+^9=xWo=y1(xY5$u^S1)b1Bv4HsUW^T20wPyhYIKRRR&J z*Q?F3`GQ@u(p^&KV|{5nJ#cnQ%9c82I`V>7Vq#Ah;hrdzTAM0TuHxAI`bwx^L5rIr z=`vlvP#Te3wc>h61zrf&^b>2msxHFb3@<22wrFXnBo4h2E2XYf-(Z)i=z@$O8yf{h zy$J#Zp69a|;+8yrB??j=)pMjr+a>b6T?xG^30168N+Jt2k@eICM(kpxvCH~;6;cV} z3%P>Ex8y&GZSq6$mVpRdQI8p+bYnt&K^(>&iT=}MyiT`!5<;l{3{ zva|D6^7A-pj>AtB>HokmseK&TN_kTS)yR`C16zv&iEBh&Vut8)kBj#Zt~t zGKDjHWzqAuvB7Apx0Ep@`cg4Wq=Xbbk&!Cuqv;XdHsLcK&e>MCU8-{v&)6_7#28K<;=w#cPX03}JZk-!B;th^u}0bl27fVQx#ka1N(q zq=XD~%o%}lJRbl`fn$xgJyFxo^V4gD!zCoqYzu+B+JU%B3bmc#^NR&FjvSdKv5C4_ z5=JG2m98OyuXr^O7gZm*Ws=}kYI(IVf@WY)9K$Xe#*(oG6M|zioIqrDC6_uU(8D7; zq*S4k$WD2?rc?@C0zn}5nwsun21JMy4G|fsKcR;V-rW+o1(8OP>LXcLkWhqU4`d#T zbXZALqaIY8HxVqPl=^&fDGW#8IwYt|YgR}T@RqeCAJs9BMLI0yHtR_ZQVv?GiCQ#j z(2u+-Jwhrf)wDdqE{O^j^FRbUnZD}3Vz+h%rz~MnT7=qk*RYDez1PLd6BP z6WsM*s=NNs`Y1nYAgMUuDy;?STupwOi;P2~d{~pyk7$+{$}duoz&Q|2uhdQx zD_o*NpvBFMvI0*xXuj`;L>_13aubvMg5Or5YRY=QF3+&M8udy3q%bBRQ{u! zDXU}4^a*7_C!5=FTfFL)s5j9&fnbJJH)s;uLzqsi1*>DKv_e9v1G7B5{6XQWKbaO( z0H{jieOBLj1R)k z=c><_MD_XcilUCRN@CTYtk)Eo|EX@8)gx<^pFofl3Cel?f~FO_>7J5#kD@3m^iY$i zg?n|0G!til3ap^87Xn$yAS#1&O(be6pDfNUk^Qbmozeb9z||S5xTFYyE7rula8-)B zDHX1^c4&Q$(z3q(WaJO=JrKQ4^|55=FfVc2abuUvev6)e2s2?2bu>D+Nfx z;n=+FH|mszSZTUc$#KAL6rq-CT0kUmP9O`76$x)xO!w;omn=zXR1l~xB>&AMIkP37 z@Y=a5UNuF?y%wExikdhNchkHb>S0Bpy*t#}zQ{_qkPL<-+A?B7)k6ghsay6^)KPva zbM&XxiYYSxQ{B{p&%@p1|9nA5f&f7StrS8FQ`Qrusp^%?bz3~IGvjMofk$$v$F(Y@ zYIYNZ?}&n8m&JuReFTSx#oUUb#zfOAx$5{$B8(sY>Cr}>Ke9w2H0n(F(jDSbrCva< z6%_DpN%-Q}9*aHkk~{7L&A&P64L zVBIT6>5qLrjgBNrNV$$QI0072L|0dI4R@zN+)t@%Mx{>!k1i$m2SZo2i@Y= zYqcVsqE^zvG|AW~Tj0d@j3304z>zPEVqV4v7FK;IAS=~}SPv5xb)pbD)kNqdTbkPh zBGpu&ksi8Uxugtl)EUxb%qIF#ytY^iSsDWLt;0XlBss=({MLZ=}%-Ail6h-|P5|$nm!Wfe% zOPfoS*d0D{46j6LLMAuL>fJ4FAy8VV_GNKn)Q0%mA2zf>EA65E2@ML?0^xmBs1?89 z;z}Ico1f1Yh=(8i*vmn*w_D~zh`vc;m3Te;V)^S>*p4i7Lb>FlMXgACDhf#2J|7u4 zOeoK@o~F=R!G_)~$(T+`aZL3G#biKF85_7T$HGae#68J6JZSilEGd>fb_Av4gj9VO zCy={St%W&%VQ80-M}a`d5r?Emvb5KrVwbX&Kw41vmSm5eVv)rxI|~;PsUs}a>Y<$d zo2BqpB(&9<0R#I~9Yc~R729!?RBP!HP|90L?~aJfOWhKeguUI8ZYx#@@s4DarLDjz zg!+S%OtDagBt_C;;}r#7ATU?m5~@o9)~iq*;jUw{rHP7f%J%psRvL?Msbi==%@}dm zE4@N0u{Xo>1B_6;PmX|yh6HHsHAO+=)%PzO&{XD>)rOGjlPGq^5|tjNWirtdZ zkSz<0s+GVY@O8^VhfN^D+rqIKn(qRA{+6`)Ev<2lU3kL04M~JodzSPZ6f3$Vh>IRl zSE48HC`*>QB`6F1b}J}5*+uXTE5txmwwm}AF3F{cRBTn5q5Q*YDQ80JTzveO2hVJr z**Iq4`2ER^GaJVY9KSbxmKMJ-#Ljn?P69c0;k`spIi4RNNzps8+M8Km=FQgI-u@y?6{ES0E=f5QK^#8I*tAp{C(^P>Ewf%b7p?a;6s)aOH!Lhm*@8Wy zi04bF-t~HR$d;s6#Js!`S>Qy)B^87)kVw1noT{l^lDv{qty(xE8K$>((X@qZrw?r=Gu{Ok1GGtXz9j~O_A|C{6njVLnXwNuE$J8(|lz|fOF zlf@ajXjIdL^!8P{bJEg*Q?@h&9UbwI($P!DhR_Vh;N~{FgwMl-Uf%XSkxqu^X9$&J zSuavkD9_IjPX1rORJC$c#1|Ybc@h5}U`4eGw=k;CL>W{Zk|=x`RH2hVnkc*?*kh+y zWHG&kTmWK4Jmo&5ST8h!04;*E1E=&z@1VL^iX}WZD`{sGJANdl58oyeng*L;s`1p3 zz|j=NE4qZ)qA;(v0=M*T;;FGTT@rp>LY_2TNR@8M5G(aN9Gj=g&J!ZAv@_DHIoEM}_Xpj)ptxaYC!dcuNws~$R}OWG`PKKXEKdZz9-f5mk2`Q-B<1Iv7F z%b33*6xQ_=Mk4`vB2Oka?rw2UrZR>ZG-J$@?%dXY-c`<%e`HvOrDhmMxNbS`D&^GK zjGcFt(=@IulZ>lsop+UUm%xL!g<~GOwXe6{v`7;NuO({3m920m!-Du=2-RS>oChwM%9^qBz%|eO^T2gm->f*~ghGdujf6Dz z4BlE(SZmOCdf*D3a6Tl-{mm^tuT_up=g)oLQPU@!mdvkknm)TcR&=41xoAvZ?b_3A z>+JH@Db6l`cKKh-0F5_%tty{HYH8z@(Y}Q=N7N?q(k$15A%@JoEGG0;P4ZKJay2SZ z6t#GT9l7gew5|#HOlG5?LvFf zh3a_;NY%F$ELkZQV;7xOeUwtrTedQ-_4%nOk?3v_wij_kkZU|q%iPis^nD725c-MU z(hx;Y{!A8^V^a8Mh+U^7S85_#B=C;k zG#e+k+2TCmiCUs)ZnedXKxD?N6=ZLzsBFi{Fjy!Y&6Q01BXB}+&lOQCyz(-iFQ{S> z6M}fRDB_U?p>7WXR80%Y7KR83t2sG5Dnk%!01joasBKuA2|__-HpHg$xD&4x7nB9H zo!$f-23~&>xWvA1kwCg7;Y%Q0pIGz^9$ZL3VnTQ|q9CsZ)yc|UAS6?XVgV6NZ|=BA zsTA=|89)|X2?K<6vFN!lq}XMPjD=lKS>3WkU97xK-~u<_XKp4)N$Qg1)*hZvIqwuf`OO<4QG_;8TX^M3Hd_ zPu6^P7;~2-s&It2GOBe;ViyFvC0A`S-q$5f*Ju{gR2*G+{(w0Gr(Cs~BvH+h9+MXm zrApunw$14}JZt@wk9ZOO}lrH5Zpt(_rq-Y?cF4oQ?; zTnw)$kR}Q*1NYb|7Fo=)gWBGZvjyR{Mj-JvpFvqtWrhV#`;_a5y`@$^> z&YwLFpp~YJ2tO_^=+H5a+?1I^YZg!(LQ#-o9~N7cp@iFz2~V3 zVN{(7)+!E>cPyxO1i2_^qRz|D+epHWAGAI%Kc}f!nK~~&Z>#PO|L5iB zOqRB0!Cmb4cKMm2JI_ti8r9KgOv2M!Dr@+rsatY9InPbgNglY+l-neq=cf4#_GXIepOLs;EdJz3nAWY^c!VRjy6w9Iek!8tJY~pRdf5^5y_ zbRSZkku5vBFkRIUk;-}{oNwUbQbX2{ql_&iCMlD!Q4riKOA*1V#bSXa-^!BMyME#1 zj$25zddeVDMcYLci?xuj5QOJqVyA~}saFzpO>D|zG7>9D+7Uik$rhVNMuruX^E4_M zEAGj&axCkmBh&yi}jQ+@L4h^g=$F>L`&tPDt5U&%!Us}+=^6~~5e)4ijLhv(VEPAA8Obe#y!cmK~5L8=ZK zo_9LQu(6V&g=$S*&?G5~|7oJOVb$+C<_jk&J+Eu#(={e)f^W|-_SRnOVN1$-Z5cgN z%l&6#iDP&(pmRb`2XRa?HgKU^j>d9c*UZmI=XK3(Q+G+2jx0@ikWdS%)ggVe1%-#E zy*e~QFKeL+VJ==e4FplZ6Dgx7miNRTe(XgnQlpX$*~}Uy@L@6PsF805w9fhJ-u?6tqFN8Ua!I{38Y>j8#~Ep;0s=b zic%x240zmVqVh%XrDi3B0UwJ`0uirjC5{n-;h_Z5M8zwmZmh_Kk|I8@&s0IwU+S~; zBa2a6YIghuJv2s31Q-wTlgXfvAN{gd!kK2NH z;oe4w`8L$?PtQBTsFEG>#IB#B}FBbJV@2^q7Lkbz4B>*?}o zKJl2=Eg3AOD0ZM_eAS{T$v4L!SN;OAbd`y^F5ys}Eo0YwAYG3))k72d`!rP=h=5+N z@LHx~E9vceA=P4HMbl~`1ukASWYMUa2z3REx+GZF1V)_@$V9QD5VmH)iHcGY7NaG} zmgK5m({(i9gZ09V6`;c<#9A2}VpO2S3Nt+FB;!iCs;Hs(7Yku{i4nTWXxA;VB7rYh zsq%{~*TlkH=SRyLQpZqin_DWt$eO@W#5IJd6S)+s>xUt?f+Z`(V(cO%OuFbYa4TEN zSg9x`8c1qN%TOx4{v(1!s=WZQi6X=b6UBOIXlE@A z*236&B|Wr(hknBIkzV3?(}fxC`mI^dgEF=d8|#>`cMn9^I80Ew8VHWEBUeV1h#@LZ zV?iZpAY!E^P^I^DE#N4Q?N($12rvmm(F?3iyO+PI_b7j9D{+ZTSXK$I6N0%uazb$Y&x3sWeQPb( zu%As8u+l~-@VHS*VEHV_QMagL@k&IX^CxwL?fG;vZK5z;CxY|M@$*EGs)Od|olbX6 zavvV5fpXZV#s4%>n>zV*(|qA1rBPQ!LCQAEn&EC(% ze@JG)5)mkcL}bqX_~~i)(?8iMM?jqYQF$m**&;go@NuAp*IPMG%AAnJ{gNTAa|MAOe-geNinHEEowRR- zBZ-nI>QbV>Ejo~QAk^3chalc4GQh}|G9=X@j%ncaDpqh#Sh;oxf)dDZ%-E3GsaMdCz7yCsMV927M@*%pi1C`<1yMlO65?GT1axGID%9}82yB>!1o zTI!aCl36<#%GtBAP~nf}D{ZSJ5!}-gNhspK%^OG^=W2o1NypVy&a8 zEY1)yqSdm##LJ{1Dc!j$bywoi`V9gaX7)g+B4P#Ape`k2Vr8U@8)$G8D}-Q2vZ#Rw z6qR;DhVoHQ0s$#T=&coj=Z@wxL=r14I#pxT4MJgODNzC&N==;a6NS3Xm>{yRC#4Ok za6L&u5!Vo+d*o6CK|kiP6)ah4ZpSV`utz89t$Tlwj74_HL<33X>Vb~LD*hvaM5>1H zE4)vn5U5#)6(r^uY>6tYYd+(WG}h){*4KpIpCk&jQesQsU9Vl6)+Yq)l0=MVRR@oe zRWE;aY#`2~8o@VWA!*W+h~CJ>r3LjoGR^-a#k9S0qD}g^6*>##}L<(lSyWz%cK1ID!(rI)t~eI!|MmvPx6n) z53c(+ESe=8vd`SD+XAZH4JDknm=0C8AEQB(~ukZy?;$5k65xl?17^dnM^Adr^E6_PU^Xw(MDZt=?(3Y@a4 zj>U>}*?o&R78BJtDvxlN*5j4Xo?a@CR4lDeVly#F`)_W;U)_?}WlLjMX~-6AQHiBr z(=y%XCwv)A3=W*$>Q6{Z{v=Bol?aO^Ak0LXA7WP$%9boHqeK&mH4eMog4Izt1i{?| zDbEJ_Y_}P&Qj)9x=a)o3|G|b!UKU;T^A1<(XNQ+X3AOzG#rnKlwfpsR5I_3*iNE;h MkM!MqnQs7MTpqU2!%j|v1g*l-+k6Pd%HPc1N(O- z%@F5Ehvs(o{!>+J)vDV2UhKbpb?46AAD_Mc{`sqycYk;1Z~3-AxPS9H-+lY)<(t<} zzkT!M`FHv8@3$cxcJ<)?y_;_?_aE-Qxqkfio5$C0Uthj?wEO1%)$W^bcJr^UcEhe7 zT;2|QxF5B9eYwBeBkyJb(G^iyyvw_T`(dn(^o%z^)Fxj?e2g4>F)1- ze@TkO{Rdau^YGp!Xf}A4OJ6_A>-@R&`wV(`@6qFqdw0@)>cjm0W20`yCaPnbukVEw z@7I-@{q@@=y4It6G3(Lx!)VA`Z^t70uMh8C$F9xYvF`Pw z?I&4vv$C;>rQIuG%D4`{U;Asq{LLpUN(#r8M-Te-lje*VCE`Et_3*80S>n_46N?d> z5%10Py7=hrItfv2dUWs6rGd)pK8aXDmuEBd(N%xak)I0SA0XNKApHe=``lWNYEK>%-ZAu*ZMt1pRzV6~Sqx8uvcy~&(_LHizpOT~( zAf{CxVg7FM0e!K^E;6ONkQYhR?1HiCE=rP%?NY10ao^SbSS29FDofa8tMGgxE>ns{ z9wdo+QOB1xVPLmDzV;`cbz4^bbJm_lz`sn6cGg_RH1}Qc)b%YAtkNKF2TK^$0~9p;U$ws zS`mT=^e|pftxRC0?JN%uBs)@ly^4*zAgqTAoa2fG(xX;k?I>vvz^5u2MhQdeg^;|C zCstCS3U_2m5`0b(aVyWWh3xVfWGD9MF2i?|h0S-aP)aRS^$CX{(r_hBgpfnuNFUk& z2!U%-VntJO2}WL|ThR5Ta5S*lLOUhdVnnH+FCXP0*A_SP0}RNJQW>Kl2?4FU%wn87;fD9R2Nh>}onih*7Jkz(phlvf2~T zlfX`|59~rG1#D4jRf?CSc7c$LC>9xyQ+f&`tA=`z=4*{eprV;Vt$HCESU4h^q|C!{ z*`TD`!AvxrNM*Zxg^Na7B_k({+0jQ9|ISorEf zVkK~JHX+G1yBRXkK+;%4ip-GwDw(BHb1BifqZ~#(nH)yBHe|zL!K>v!PjF)jHZ#Q< z;ij%EgN@a}ngW&e2{>#p%8gVssRa>3a=BY%3Q1^OR@5}GsT#UP0wwh0z#h_pl$&)m zD+=m$T-GUmPEn0*QixS;BV~LBw~kBdb;^O}FsUJ=8iuVSu3mS%)~~oAB&-V&oCCWE z9K}L3r&fixibbY~o@;oIkPsQwEd;&>Ru5%SHYqV9N;;+338{Fz(5YOK@iQq@qY_xf zB8Jh4DScNSVMu+^TA3~Ieqi*F>q^-1u}UKq^7JffYt|a4z`;ju|MiYD_VbjLuC!?=DEiPQlJ?z2sGG5+w~( z5=u#xC<*ApFk*X5BJpfsvHW$4z@5PqsM^0-MF^5fU0<-%Y>f+zszj+Kp(e~-C@&)E zR0872$d2W=ewx}8Ta<#PgQhALvOzxzRHk&66s8O|O-rDH#X1lh3D?Khe#I{3TU_oI zu}Y?NyyQ{G2X48q=#-3CQVGdR4*@R5P_3^EdDNu9L4gWmr30x+NZLt4vI^@=hYq*Fpgk¶=h06C%wfg(?CgJ z>q4k5E{s5tvW=Y0#C13tr9;#;!-BZx;1;oUN9r{>u8azNRLkPBFmS@XTxiHy8XRIP zw@V@9_BygzSr>1vN$^J&7^Sm?D8Sr8@U4j97TJZTWEUwzC29_;0=GKSEmBM+ojWDI zQ-)@IL_n%`cL^JHO2%u08rwuL4-}W?tl-}8CS1}(7QsXeci~utib9nm2$GnjHxPzs zR5hF0t59CxRYoBeu68_@n8`gNk_;yPbZ}e{N)V-suf)?Vp-hP-;$~qAc~I+Ah$erC z(pap!h3kABk#Nmjgs6@1ro+%a4NwSoJO<7 zqm`mjC8A<(R`aQ>3}T4O98a>xi?5csA@zjvoPr{mbhC_85ewF8QnsMrg=xaOZyq>qns^9U@rJ z1(A{0lo}(IOrT*D6qD~+!D~(USh)K0avoa=0%NHQpoRAlO&Khv9Cq=D_@7M+$iIr5JR?kQ= z#VUgd@nGR5*%qmuNhMK(x~x+UkV>dt(keZ$#&ruRa3w9mJ$WvS>J+_=j3$U9<$1DC z#CfI$HfHrjrnJfk=ozfp)Ko&Mucs0Nw+Rkqca1-fz{}!R-fnCM5C3*PW5R1R1kaATI(Sb}TH(0Gw(DJ8_2RlvD_<}ui z>47qy)`bjf#FSLaHHhe4y2e@bx3g6GeiPkJfkry16maT=;Us8V<)YMUP01s>l;IgK zBss84dljK>lXMuioK0iAolU$^Ppk-$1~v($Dvj^3#3btmLlV5;ZFofq2ZEMUvi=OL z7A6dAy$(sJ(>@kh%8qzJCSlcUf+w(KQW7>imz#mcR!=dTz7eSgPiTtzUPnZ7SwKVs z!BfIl6s);_J2rFZ;v>1~6`|-$G7dtTBjm!!M8T^rBok%Ily@@Bw`h@)*k&+sFD~2q zqb(77*PaL?O^KLLU{emTbaHPTd&r~+b+8bt5+a6MuOPJCq^%<0Hm@mARfA-ov@s>E zTIF@KyGT*17uqRh3)Gx4M0<<~2vIjAxlK44C_Qi?&$|VZWLkAQRXdB{RzH9&HDrYb z^-)FgH_&YOoyKi30mbTbfb|*p@ENvP)&wr!2dbEM6jChOfrQVrMFvxGiOUgZ>1iu0 z<5>oxTj2S9PFdcf_h1sJu8*-ACTXl{nCNy}DNUmAMAW98F!eb^+O#VI1X&UY5*(cp zduU3>%U%7JR}e#TrF;;|ZOBD%N(moN^sYFgza1~! zKC(p$A2pE41rewQHs>|efxcITQ%C_Sm?ZwePUz8MgqmEnl)!c{>ev`>aEBh!ft0SX zN_=mnIFPN_u+^$;gb6riDYY!ZTL~k>>PQ|++l&vvgv0ecTZsO2%7GS?GI2P9zSl71 ziUZe&c>r}0Tx32B3~MHO7mc$CEM62}F&X_)BGa3o*B7dgg4$j-5>H0K6<-?RxUZZK`e;}qtSO&zAcjp} zgfL+jZBc@0$9sUonId)YbEK6ddqcFI8UpdiJ5`<%51WJnEqQd%uvjHYQM!tR)~Z8y zFBUFx;ee(sbBWB>;|w8n4t{WT@8&t9aTAKXIHPe!V;_P2>ysP%Xi$^M;xF}`ENLUE zEnLP+W$*fUylqQKmD*1eg&k#LMlvY*FHcANfyO(->b98FE$~WqS|x$%6g^z0g;0h^W2JGT zYBjx#$_)evpUxxW4gQNIe8>aqfHz_1PRb;G{Q%ii)l zv62W|9^n-?72>KT>5P;WszK-A{XNeajWZhi2<%^<+&H7LkHG#laif)sdM6S8mK7O) zdxOcx#sm+)w`Vyu746v$oL;d9o4ZKQ(2(Y=L}VDg&o?g)H8NbGfq6%3sLf zRztazqkyzs$s@;sj+cAUj!zRsTVybG7vaF6t4oEr4U>pbopOFc zWA`!6y%LVsbVexa&QEA8i*^s@^a+PeaMp_gEk4tSj)dnYG(MU;4Jp2f*_t9Xab_IV zpixr@=n$30kST$WJ_ph*4t(fh%vu(} zu?xx6M1upN+=%wy@34k+p;l@ zy&g-k2kRE+CFJ7&eLIMx|D+Z)ClqQa^~f)W_uh)om4zJl+R2}nkn3lk^Ahsi~%?UUP3N5b(nz7K1%Qd*ipx*^cEs<$C!U)MD}2C zngw!W+(bwfCX+S|=PB8OSRwVUUen@3kuXr%f=&mGZPZe@I^ocgiiNwoBm&eP;1+e9 z)(;8EYo*fxAd-4y(nczRyC~$5dOEOMuXIg~z)i*Uz`IoU!q4$5<#djc}Nqo zK8=q_5>;C~^rm=9&7zgRkipdxOh(8Nz4kea_+slQIa{To1l;tN`FR%cxKE&@e-8A^TTH8@OPrwSl(0*>;_jk|WQv>}>U;h%1%+3Sei<)t z^!P(jiv4RID!vviM?D zbOc9uO?;4A2~=Z6`bHs&Jt#Z%T7WA9X*_DwAjW!#Y7e^HDI{x~n3IN-*r*1zN?L^m zD!WKS(kaN0PQi=xPC;Md2>ISTN`edS(|3$;!pnwff~RPrRrOseS`n03HN2Q34KJR9 z>NVvEifv7bBch*{O_F*Q9C8*}v@V!r#_bK({MEWy^hM-59tl=i4-TE6%Cxy`Y2O6Uh3)0Q-WZq2WozOCoJ#= zbvOcoCQ+K{LqMbk$rjCMExYM{5x6=c{f6aov_f16Wb1g*%3sLfCZj}~0#d@~k;2jO zl!F*o*)X$3GCOGRwffgSkVBOR| zXAxh=cc`~CAIfd$_~qp@CA9lF`%x zC9nhp_1GI-$%QJI*i&w&>(f*7HVbrbbA%W;up?hOIEIP)8O)j-9?}-+U{MWhe2htn zM+D0g;duk=GS!@=9M=yU#0%7fL6UXq)^Rz5=y(GzsVdwf={N`P{|V9=jWZhi2<%^< z+&H7LkHG%5)$Uy2OL3uML6+EHX{u|pj$b~|(aJWMdbac8^uu>hBRfXlr9Ee9DL`bf z@@-C8rktKbyFOkr50f-jH4IMy%?QfP9GB=$ApJS@|0IUzyPuy*x};w6Zaj442`j8H z1!%n4Fs{ntGku77=f&wqxx`u&)=@5Jyq;~NtGO;9#nU$j@p3Q3Q$;OTquX*76GbHv z9#-iTwrU_qj%-tE-g@y3;>0Vg5rrdCCZy_=I3iQZTMd+quSv-!s?>2IkHogS=v`=H ztBz1$li=ia>=BobgeX|c6=kEkRqgep=#*%J)VofJ?_wD1Gc}ef{<1i=xaZ(^ZZpm} z@A{&X8z(pR5!k=}&2uBQZ@na?s#;-{Dxc!DZix*RxogX(`~jW>7frV>+15>O&KSHf&kGikZ*I!GUeLL3l?1;V>L`7Ms>=0vAJtP_C;sB z*3Lh2p;M{@a=z$zxw4yiN@usB9#WOUrTR`MzMPWWk##Ac#b^2u5a-3_$8$%jTjPJA z0O{E_yPOxBA4P5G-b`l^jUuSmtwG$opjJky??s$+>Acun{^uc@vy&uJS$dhKN+L&| zHnGC<+Cy|gS!;;Si_Ha%s&o*MFt3kP3bH4IMaN2vxIo+v_d-{lf~O%(2Rc)a_EiJb zUepgpHGb2iFxvJ*^LSaj4C}G1M4Ac?b zIB>dAsfjOm1}x}f)_PIKEj0C-cceB-rvpG}AF`3k1U6IhP+PlUM^rD|QYkW+ycimi zuV9rHi+}uMCdJ3PAdyO1*#-*%${D|tX$+-5oVyVD(;$f>Ex6dVnhWUfdJdittp4}& zPY6Es2F-0}0oAYOZ{$TzI-L@fCGqDj(zMJeYS^%Cy;Z|^z=!YJglM=<1lN_hH*8eX zH-_9cf|MOS?kzKRFp$dPkq|`_G+T31B#zMF-;CD=Tn=J#VPdR1Z(}}Hsq=}i9y#^+ zEOIoPf#vj{_Gs}vaEp835 za4|1J#q+(1PsOTlmq>fuY~2!;l-x8VCds9@Esg~%XALtZ4NUB(b9Xd0v*co}7YH;S zWxVzrNS`<^;T=SxByC`&xP;r(b=2{sgOt2Z30=jiP6@AwB6iXPLbzIH^?1%fqCSa6AU>!ouQ&bW~cBZ(kQ({OoieV^9 zb+fU>+A-nKx_Msbewg9&zngIYi1Rx4yw3eFuX+Idat^SexAa|6Z!p)&l4$G6$@e;*-a~4Ar)blN zzSo7c6XN@{iqg>2N~u+=@<_)raTltLa2bdPE)xPGg*PfnZR!Cyvc4Rn4#FW`n?1=R zRI1WL&LbV~H(F|y5hM0UM%0*iL0nSqr6SAvwTCkFShp-dm)rU=fDl`iKaR-dQUjG; zBuP638PX|uPVW@-C618qMFb1w^c^GIS}9X%7|KqmC0o=H?Ye^?%0dy89H~{QVv_0g znsNliwk8FR+bc1fERYK{xbczfHcut;WQGk6MuAn@QC?s3i(($jX?!@7%o0vkPXdcG2)=mQ<7OqNO2IBwXDh zk5rRHII$w0)NAB?%c#VvxW{oxE9OZM$3Us(*Nf<<@=9{HQN=eP%8>0@PusbRNLKp| zqAsRJW2=D`87adz@mY`3gj;q|Ai4!b6%P~z8Uw4!8T)S)xY{FmT?jITxV>qtRi&U7 zMlIjXPOC%;CO1SgI|Ugs=t1G?ltfs3DM@I25Q%^Y?$dYKB~uR6%I4HE?zKu=;!HvD zOafA@4&+E3`6oMamLBUsOP-ow%F5JYnS&$isakE-M@?e&4lOk$^@{$4;KOf`_aAbe z5PUd3CFfRXKukuiQ4jNlL7>+TtuLZ2Go&QZ8Ju0PsW@U7!hPUSseQ|VaGeOQC+wGr zU_oDQVDt#kvMy!uNQe$(Yc5YnHf8WkqJMm^4LCfE5bHX4D|YKd?f4vW&uf_vw;XNB z&TE;E#%F$Dcw83Yr9m4N5rN5AY&?3XM|JAaNqjl4WlVNZ3D0Yp|NsB6A?E2iAM}1w z?S^BdB3YIXDYcU3m{04EDSBo^V%PCp!_qFFVY~#YE`*{2cUc{mg?>jEGTsr^(+%+o zKikvZgRmAL8ddFWj=j-LAkwI*W3lcUf{Xpm$%* z<)EM;!i=VZQj?bNrERdNP?<^ji?=cBKE@0JNXM4|*+SB)VIL16wQaQScnv!sDF@!` z40gggjc~anDW+N6zCu*1fmN3yq{0yG@oEySpOA{ntug}f2obfBog#`c#?ux}2O&~j zj#W}YIv#f^*0{ykWnBu48)*`>sn{B-b$e=mwvd97DSc#0yBA7|coBLC&uM*IIWxU8~dZje7qEiIu5Gh-jRR>PBu}VayfyyqD z{+)vTf2X7}O1L@&eQALZ--`&U!Sr2r$&`eb4a0g`YN1v2T^fTTc*{A`@TO^$Ot05e zS@2^RH7Puirp~fSQjapIln@prlEjBb=0N&H1jOa;f_dF32ht(LBYMXwNuOGkEo4d^ zCj>)OY0P3$AB7_>NXCs_jJok!|3zV9OR);uMKCJ@sYept+JkrgiIwisDM>>SsA3@q z)+DXnNkB2FULe~$C2$~ni-`K7eMqPh_hlE7g*u+~MM*j(Y{ys`g1Go6KW1~isKz-5 zT^{7mH~DkPpMIa$_pk3=KgwSZ?_Kvd+OWU+9j zCIwcd!GUgHw+K0rT;fnqK4HL3&US6sIIN|dC)4SJYK*guqek{6BAVp4A( zPGDjrK3h`QjTu^1`YF9bKVtak9H`ky(kVSs3Wel_BVChN)hSAi!^OQ~UnPpld|Aw)VQ-4L;N;|cZt4Hvb6gS`^o7EOs2rADbf9<2g; zLP~Q*74Q%bOI?B^*@ViF^^1sxi>Aa232#Z5x~x;Oi-<|fhs1XBil`fsP--M$u^Ah& zBG8LCTGd?$agVKGC-x^e%_CIKx-4|+F41S1QvDY?bqi!{wjh&ctVG#5C0>go^+IH7 zl6+aCYEm4RSapl-vH_IvKx~s2#KX8if%U_3W2M;?$Hj|corfGrpd^**MGz#!12>J& z`kOujL-2H27qIZv@rYZlu>PKxWXZJcO`X1lb3aRG?G%meEu2*t^9Io4%*>yxbbXzd z-;8&Ldij=%xAD%<|LskpW~`K@!NMbrg=EMPSx4!aj?jq?o3IiKWxZ3vU_oS#r(zIk zkk+tPMHVI1J4Kr$F^P-`3e_DdelotEO1*DorSW*JbC7u0{SS!OqgoUs-MW56Lx|le z@j}w4Qw~&0EK742&meU_wS`i{Tu!zDXi^^*=)DPX&|iRxtR{%C$)u3GMX TH5`7 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 P;(LEIf5<=n`0f7!V`Z=s literal 154055 zcmeI*-;P$-kp=L%_ER8VbHUeu4Y`~9(aZxx5h6Ajp%92L_DmG{-Dj<{PnrX^yZ3KT z8WH7`R@L6;!~Xjh_wIf9!;81yy?pcf%irDmd%o>oJh=Wk-+lAu^}Dyv zzj^oU<+u6k-)}=Y?CRlz``6!G9y~gH^YqF4Z=O7T|MlhT$A@noTphmo`Y`|M>M-o; z;pP3XN5@fzuP+Y{yIfrz7ruJ@>LWl8B zzJ9;K!^7WSJvvNyc=Y0E-;=|P%hSVBj}Ci3dAuX=hktDK<+pFX`Tj32UcYrpRXfBWKpuYda2=WjFPKQs2e19 z7vFt=|9d9fyLUMNe(&DFrTpl@A-4DK9X-hpF9)PM_R%$?u06VU;M~VMeX#B2a)@ge zJD~m3tv(ujWWZ0XJhE$B_`Q`siT~Rd-+ljTL_guWrp%YmU%h(sKhIvi{^r&9-@bVE z>diNQe(~+I=dbhYkKeruHZNcQ_p=|~ynFHNT}J*bQ{TP){>3$38S?hsv*%61AocQ3 zFJHXPT7PSsakKZw{Qlz?KYsCVU;O>c|N8Tn zzx(|qS&|4myxN{e_b&mo@w;65_2YbUwMfJGS}i zeuz=3^p8N3KPFaqzfR1oxi#}aU8&h$y^-Je)S*8qv+mtx+wd`_hz8>PXN9ooq_;5ns{9wdo+QOBn>VPH2uzV;`cbz4^bbJm_lz`sn6cGg_RH1}Qc)b%YAtkNKF2TK^$0~9p z;U$wsS`mT^dKfRLRwl60c9w?=$&OT?uVN!F2J4)IG_*6y1C}Bvw z5R%vN#7Zhu;f_p6g6~sA+{*K8A-jA6*@->6%kbS~Ve_3Ulu`>-eTPF3X}FRmLdcAN-H20eHTM&sFHD%r@O!8 z!r-2?F8eM*zfM``y(0)j+RzUrz4W-tE#i1gvMr(>0*A_SP0}RNJQW>Kl2?4FU%wn87;fD9R2Nh>}onih*7Jkz(phl zvf2~Tlfdp?FYH1m1#D4jRf?CSc7c$LC>9xyQ+f&`tA=`z=4*{eprV;Vt$HCESU4h^ zq|C!{*`Rtt)^SO_PFZLUlNv&*Vc0z4>UGC!{fY}h!nzQ_ zS=dG3C>EkQwJN+-EHXv(T*JFULS$685cnEcJ(NY+q{NIU>6Bt8q~h^Hr*cWg?@6H= zmB1<%F^o=3>AUg>L+Xpx%4~u61EYtWSHg~uRiYtvL>s)VIVVuMg;1rABvw9!vZKC- zT9QyBT=R&0g7IXG4NiPi`LVVtSLf{yd5Awm1C^I~vqP9W9ISw9YDB9=MVsbQG&^3k zJ<1~-Uf7~Jjy=-YMX_ezF$J130$&}EN>g}0L9K}kl0;RB1)fubk-$n1Q+lM1(-r|j zw+Lw|`8W$Q>iBe5MP1tv# zyojVz35X*jJEmX#G_@(VC+ba6ngaPL-ipZB*w3lyJo!GO6L+teQ`dP6-u7Mmi-_lqm(B^cJg3 z10{j23!%EWFakx&HgYx-=iz9SmZ)on1#!*6En@SI)N68F85Q`bmc?aZ;12h6p&@5! zaEPtkE`^ZW^T=jpUA(y_!5>**l+G5S0Q(k#Z$%8Z$Syo3yGR)-QFBlgxYdzvkzy+8 z+$r&$GBo2O0#dcROW3GWGF}_h*d~IxP+Xd`f_uZ8a7hnY1QRjbg<};e3RPARBr!>E zAPmu{YBsf3p}fGWj6y72?RYFPJNJl4GMM<&!Er$-L6k1O5>K;)G9{LXn}sRlL9J6E z+WAA2#$w$qT<7bEglpeLh}sBmIt=a80EKYJV_;1ZFXDJ(wb0vWc!%%PO;=5lKo!Ak zA=x^7H~1t_T|ZVynQnoQz!GpZ#$Obg{mE`^M=3rVy$R)NIA(-$uPvW=u>(PY3NeIx zHAy-jtrU$a5fyW@nonhA5JOz%c#=I{e6`FCsV9{8DJYUjH_JE`v0$wxWeZ9lNl#Ay zjeAr_T62X?Rg7e`>R6&A88NCAOIh3}Y07x?z2PFb7t~VL-{H{MW(#R)ns>z81U8R2 zQc{T*T|crfUNlyi-SerWmed$3TUv%BLsx33mzCy@Sk(}vOOy;Pi$nps#d)TiKME!3 z5W#{jh>X0Z)EKE`0u_@~I^w&khg^EpaS2rI4|_?LwH-oxnynZjvp?BQH6=#_iqA%G zav|$$Migb?UNud;C@TU41!|#7kzySYuu3Z9RV(H#Atn^lm@Srf%6O&~cjJS*I+JN~m7aDm}2qbqgtQB`w0e^IRC!DS8_jO%O-Q z^JJfh^PU>mnAI1V(kdgMXRu~dQwga)pGpkeCODMcHU2yTPm5c5yRjWW9H0nE%0uF9 zwvh2V=vp{7-{&1~whrIt!;8m|eGAcq;rqN7bwL8v^*70dEdsanU}{fg5JN<*QL32L zi}MIP`TsQ3dK4h23TJ&P^dd4!xt1+yeMh48_i1_QV7>aoTZ?@QL1A}&FE;>UK)>O88d8GG2V?;H?iKm1xD3 zL)M5G$(J!u5maFh5TxxIpKwDukRE*GbU#owh{fMhNV%$q=s+fv8?06-X!%pegPkU6 ze8HZ%^gtO;>q3S#VoIv%8btIiUE?hJ+gU1ozlv_BKqH-03OMz`a1ykwa#8BFrsR=b z%J7UAk}T}fUPY+eBprrLXVVyOXA^JK6DvZbflWfGO5+=rm}K2xNP-u<4X-HSK+tkZ z*53oGg$V;&uR{{*wATVl*%2?uB&>Q(@C24jO2UTcax>7_>M3T^HzL*G2~APo>xf7$ z3y5eScuM$+f;IQ=#%2y(d?Yu$A{2c|#z9DPgj^VzD0tO{WTH&j<(&-kEn1``wi!&^ zi_5nDXiJ3NwI{+zQz9l5*pve-o!lG89x^FH9W2DEgoxqRD+nz&X{!jh&1(u&)gaj? zZA?k4R(aj*E>hI$g?38W0yU=$(H z8nQxz`lurLD`+Xjs+BKFM9Ttsjo*>~Kh z3qibS#86VY3u)iUZe&c>r}0Tx32B3~MHO7mc$CEM62}F&-7wLg;YfZ5U-aM*ILM@h zx*wCU{MB(HVaDeXUKNf7p^p0!uI#cu^DXr71+~3wB%X|dE50ysPDXi$^M;xF}` zENLUEEnLP+W$*fUylqQKmD*1egi3WO6pz+SIx-BMk3%ruut&%`>iXN`hLMX$d zvC=qEwc5RwMyOMw1C&Qw88s4yRCxrBj!$+hOcD3Hg}@Q3R;pxpLXN0aSwDu6I3v{u zwdS{ozhqM3miiTY3WQ*{Pf_JbpoCEk6pn|eYKS)FoL_&0sJ{!B>aqf{VAzKEykVc` zWp8<&SV@E}kMN3{3USqvbVkYw)u40m@t)_5#u<%c1dd;y+&H6gjKJ}0;zlbM^-d!G zEh{qq?go>OjR_up@6K{+D%!IxoL;d9+jo(kp&`v#iO4W~p%d0!w_%B`^y-61gdm+V z7;6cpfhEY63DYN$vpYR%d%nIqT+Wq`p+2K=M&lTPpb zopOFc5Nd;ouAN{7VRF)=@Sl{;LH~VT6|9*Iuf3r(6}*o8d7|T*_t9X zanCraL8GP+&><>~$Ge5y3n{*9j<;A#nJXNK$UdHSNo=Jv%;0{gL#6~i`W#5NSoqMz zm^CecV;7RC9T8%q%4Ygfm1W&xAqSIFcp_+hktrn!jbF&7HDwSuniu1l=3&K+vMJd| z3BG_GeQJwZ@$(h=hgF-PJO>}o2xm0TXdEMO{QBg^ax|z4Q=HFB$RjBE`n-hvC?G%m zwroseug6mC!MeqH2|4+H-wq<_KdA-H358lpJ@U)py|*HCWg*ACcJk*Xlw z-vyLmSSHT<-d#pvnwQz(K7o?{InYmUv0Eiw;tq;V3A>~#?k+FXvD%R*=09O+~21N73)ia zEWQ{O9l;S^6Cb2j0@YZNzEOx`56Vux7U0T28jl(^h%q0c+Ji243d!0g=A};bp@#!BaHRs`@S!tq4l28eYti zh8NF4^_p@7#kMBJ5z$Y}CP}>t4mpb~niotm^T{jCvhl3uzntk*S#~v`J|yv{22U4H zL%5JTSnQf^a`QmlR|S?rl<`aucjRB&Nhw>XRV*Hfo>-NPL=4-J%> zl#HepD1jv)sK?&uN-k8v#GZ0HU7wzsw^^Wjnm#O9~<+y&>AYPy*43f-Kw~oshM8^{fO;zC@Nyj<(_)n0|Xq?eF zM&S7M$&E7_#|Rw1w%VNwd?_we<;fBoEKPN7*74H^I$GHVQ_pr@oc{71)X0v}cTu-f zPL5}u4_lk6KvP=jIW#V`N0k)llr-DgpPz3(ZzLg|L`uB#;&eLi!c{s)M-43L3{tBG zg5=0HrRL4+Ob{nt;U{G3c%)27)hTgArj)lDC>dXql1+kmUC1M`?JgmS+($LG>Ielk z2~J+e9&vdkM8R6FC>zyyAyMs=XoA$cPKobg80)iiymz{|39^`duKdB(#~Hdq6LoUq zyP(y$pxM$bu22==IL z*!0kcmvwb{>!ys8K|z4%7Ra}K$~5KL%nKG>A7eF4B1Uye3=@4QB1ufj&G1AI4$^O% z7~-K-JO4yRr&I^X-;9?lyFE_{f}tLGP^#~A;>#(?9hsK`T6|9*0^+>bJoMzp9&CKg zTC`Ark_*VvUJ#MuX^lHCHs{M?5ce*ql~L+@5hq>38d2$plnJRiCBDm)dV%dCjju_; zVxde(Y`e>Ov3a9xHbm#e=8YlR>kEp1M4-|!uTBebJw8n!IqV+o~k+7PqM5604Gsybfat@dY5#q>)J*saA@e z99YT_7X&*D`U~s!LXu4t5TZv+5<#djd59rdpT@@|I@xWqNl~J~4XK2Ph)R}F7;W%q zV z5mz%MUSMFm3&LGEl(#uyEf_|K#P^ixyN_6X7xx?9KqKyV%0j!ST~NYB5l(C=%{L`s zM3T7_D{?_Qhln}399h6@(q6Y*3eY6!8BhJvdCZ*ruaOW6TT(*_OZw!TBJ}Iv1>IOU z-Kf-T;!Ltxo{w4c*CXdK^R`Q>h7`N6PRT=U?S>suy>LtI&R{ANT|e0>*_7gFviYxn z%%u2GI#a=-m2I#Ppq%k!X$+-5+;<`Jr$G`&lD{>Hth&3wV)+Td?0-L>@H!!wYw### zsD3qnBQJ8&>6D<1*mV~| zD3LN=yMk0wD)EgiUX{d`eb#)$aEm%FNylEFFa775-lj(2rUU7D8#AM6_|o6h=FSd) zO-wmKlt1$-aaO|_=8Wni5YzFhkkR62H5@f`p66#Zyp88=F#Ni;v+!EL1nR7YlWjxV zZ_*I0hO{^qtP)Qep3xxDQM#gh=YbVzNleBtva$GK>-ncFSSq`8!HJHWjd{FgT+lIDv5wt!stw^{ds`> z=|6?O{+m#%N+Pfhq2?(ni6T3@xXn{yNVH^kbMX9d-F$@4>)hK8y!&g8h4Lr8Zc`&U zE~lFergO*8kS54HJ${29u9Ip=r+^BwrrW}SS3a!LQweoweu7)+X7SEp&mD3+SZoQu@RZ5rJ-jI-}={;RT&5cdJC2GG)w~4{se$??K@m2}P&ZAR-5!!k2bJe6J&V z6!o;K_zSgaRUV1ej=P7;KwP*?i0_o_QBi7B7vRYHR5;e)5UB}s7Kea8s5R?3u81!X7fr7h}+cHKcxVpT6NM`~57m}GjrrW`@Btx0j@ z?n+D+PgKPP8r=9ucAKYUwwOUS7o)%`?I^FW`6bTQavDD}OE_6Q30SgAqnfg-%}i89 z^0&KWipXOf$t;3<+hzXPHGH@6(K>25HV_GsT~Rf>*+{BMchS<2Dagj|BGsgzdl?Vrn$D8d#x6 z8J;b~MSluj7f=A8i1+9%^{4}}!-x)5ZF0NpA2sv@X`QS+}thE*a3 zJ2yl#I|UiiDd&-saMZ%5E%BBhmLunpbMEu2)J9T*)5<28qyRKn6s$rKU8QQZRUeAX zz6+^0zRTDZkFuDeN`p@b?jmzf2yXja%3WuHUOUtt(Uy#_uweRh7d#}c7&dI1Zz}vy z8Q=LX2*Y(E2<`o6i6CVMotV0E=p-_`aC5Sft;q{&9%S&Z#%lx4Z*t}nry<=MOPW$H z(H#QbkJTh8MtbNzuVt=3ntsC<=d}z;*~la63VL@ZS5ieJYJeS7vqN^NCSZG0!{|V_ z^?_G-oO-gfM*;+=0RZjI9Uwn7Tl zSr*T-ctamMepG!yIhayp3L0rquDg zjF2gxV!Q;ZE`*{2_fS9M>HEp;Pym@hGjg3tL_IoVVy>}DkmwXSzMPzwN_k?kO~mmsn{B-d3$Pq zwvd97DSc#0dq_%(coBLC&uM*I8Q%r05F2YQ>*|Q7)HoF-N}K_%DMlzn$Asj*j1MJ9 z^h#;bin!b<0(7TDkwl7%8fDF}N<^lC$}W=ror3*;r=&7UxH=^f7GGK*XnewjYOwn* zyJSkj%Z6b+Ew#|9`c7;Nf_I!F4R4x8$@F?nIfCz-YEpP2O`T|M%{QF&7@c* zwiK(dT?Dftka{HHtvz_>pIGTGosu*Zfhrb)U`^86odgt<>IJgBQvwIFw}_}O+J}TH zabI>Js@L(XFWJ#4VLQgk5R}EsSjyIfG>^F4@zh9Ue1N7cGMK!M%NurdqR*5*bleN~ z#IRaLbX}-@7^`6tRpd^IVdTgr(G;ulN|ddsN>zhMo1UB)E0&aXQA?cC)Rrk7zfgz? zf$4Kg4rgvfOdOEYNA=(J(+EC=)A$sAe`PJPqEu z1n64DX_`;blv{gkn36|lQ&OD~M7VVNS?+9?S#2~JE(kj1b@ zSgrCyR(%mr;(}_zfF25Nq7|{w$s|o- zC>4lANwCXc+M*dP-Q#W&0@qn60`noY#1}Hq$~O3u#9U1(*{EOIs_n`yBJZ}oRDn;! ze6xR~{E5OZ{8Pkb{rL@|K!u~Z5blYvcS_O?rL4PXEm$yY*f#w_Cq>zQxdt* z!Nl#QE3DE9>sRS2hGl(X_<1b@)IG0dexXku|80Tl2Hu&6tJDNGwYO&;wV~lAAm_Er zjX)2PQQ$gDTk+|RT19f6KV`L;9e%>%XEmIMc$BuY8s3@KBn2H9 zO@Yss6muw_)$rE;B?aX&ort%yjA@0|M11cPtuQT$cEuz*BxbOj#bOUt_JwYT z4sN3dGZzvfId^vpjcR~MvqW6oN)`ED(M$C~UuqR0o;RW5NW-=838?Uj+RL1ngy*#? z;gWM%r!4Fes!0FPT{O)lP+dQPqgE zgh3ENq*~K%fj-wnq&?57x3MB;v|T-<$~5Wnc8{<)Z*FhIqUjkdq)%&lW|ou{%Vp9E zG9zX$6rhC;O+T8hH4ZzvkvN1xA=Z;ftP&y(t8@xmwY4Zj*ODY%1T|Xt0iK?8q^l_$ zkuph*PTATgI4Q&nNvN(b<7*P03cE!f(fsZb>Pls4Y}FCLf;Bewh|4P>3f9WNt!mHH zsX#;%q|xe>_%4Q(QG)fL2Y4ZkXcoWR_U~VwPBJZri_63O`Z~WZ`PJ|9^@FGPpFYkX zkM2M1PsW!IL-;56(^fsr$lDAUH{>z36+u+4p;L5{ya7m(r6y$~;Xucy^dM5a1!iTf z631H1aT2=Z< z(diaTM|;B}NvHJ4AyG(PM^X)iA$xdbN|jTr3JFOKcDR+d*`-CLwd00IYE~;!f3 zn!61SdMVT-rtl_E_?h%N9=6M?s*1O$%ZRN`+1WUK?Oixrzni&|hPy8^rQxFSnuFLh zjldG(nZj^j+BQnskm4Cpt6W`HeH*es*|Z5Y$w+gY7!|7)$_+MXwF;*!=vy6;(p>7I zVNDHD-N6$=WMmW7wGIv;rT4ESicoia9tm%AR${dvJ4H~dfJCWLO%=eLUEpD-5FE)S z@x6}tA*n@EgtuNuc+044p;NMph)K(b#I}LmlmVy}l2B@RGd5yHpciqps=E;49$Ujs z>@Uf~jl`BTAubD@x=T*0GNt-2O4u!sv6U$?X^)jCTc>0Taim^|Ozk9}hOZ{Yafwy8 z*e)A@Bnz=kUJwuC0tMC&%Z-(0QydpBinS_d0;RkSf`oYBrtw*S(`R4^o-Rv5EPRD8 z;+89{f954wGHrXQ(^ohTvUJu?(b!($%B+d_9$V-^xnk@mgn*c-Z|9i07kP6eQicendlv-6`=x(x+1vDkYYseHYIl zbw9O*QoDKmPp*8w{E>!BcDm{(9j;Qq4zG#oWbD2%KQC7;cR%wA>t}xO!C&p)QP~5E0Y@5{ZGJl!nMbNTyLBwxCo%aWPFQRSl|p&b_-a z{k1bY_s%`%d!6~$@#^tcs!vSm)yXb9CG1qnPWg5Kzuw*q|IvS_WkCF@4GtPHfFrH& zj?uY1m640mye<{kd`lOiyr;)JZ+W~RfH%T*cw)0*o{WbkG$`zFp?KJYV%~=0LIzeP zZHTs*@TUeBhrg?t5c|Y|XvD?414E3T2}3UD;HsB3A1Brsf|qI@?5cI)LahatTo+?$ z`uoEc`3U~L+SOBOSetX<$gKjOp4MG#x>2{_gB1bHt@e0t&d2@h4IiGVNkeGBgNHp= zR%Rio~3*cy@dblTRL!mp2udXp{oY|&%B8Ufs5B3A&pOaOPq16+Dp7t|7bL?AF7$Jzp%_YD`1 zOzUB|Cm~6~ExhIZPXnC$f#%?trwKTo7g+2vLeLcV@RkADT^RanZEz2GF#3?M4lFJN zaLNkfwiMyl(?N$Rq&#SPNbu5u|J}R@lun2SSesS62PA9y)gE$$^GQ3U4D&)H@_n}!}(gxh5ok^q#s`r1jTz? z7{0-TealsoTnt9n5Ou>F3G&IDA+$8UkuyB}piM~-SSyTSzK>Y^9(B#_?C+!{TQ*Vk z6=vj`Ydr)?MOZleqLv1|P2glbU7T_h$(AjkeBjE`+FP24Q=S+!TGm zWao6?<=-kckouivyVYgOD1>n#)uqpEA6LWVY}a-4zc9c;ZHS2jS{)E;yS~})&VM->!Um7hs@6RVSH{a z38zw2(=#MuZtX8C1k;MMx092&uIjCX`o2zT_P$#M{JY)d0D#8qqQ`Vfk7GSzJ z4SV9RT2hv}A|r*Oj6g4|gv@oHojXLLg64t`vmF8+kNIT@UVk~mOo--)0p8!Wgkp0+ zTEc>%SVHMo1*yXh2*K;&1T~U^e3gJl1_hkENwAGbZ3BugC2}S*1lYjZNlH;jz2L5P z0<-U`2d6Cy&b14ee~hwe14)pz_V$+&OCs=zUY`u+9vI0!HImi-IFi-v&!O;j0B?Tj zL2<^{Q%QVc8-*A*R-&M0XD)q|)V0%usTy0E<7~GwHDxRg-A$7n5$8#(AkB9zB#4U_atDf+zb;rZR9W6nT5C7`)#H7-pW zKZBQ-37oz{PbvXFaZL{tH_@EZ-199og~$~YtGH>SvKpIRg#)D?wN6^8G=_h($yY0T z1I|D;I*no_1-zK2n53)};NC2ELurtNQV~LFp*f(Rf+)6Kw}xiyQ29ABtPamCLD7Y8@?}<{$43^pyOrppTd|%=a++G_U7K z)hk?1H4`U)NAr?}h{GAfp-&WC`<0%Q39iT%%p)HzRQUDN!8C1^d#2X7*he9avxoHz z4y~svLiBp6HfL5^2FRg08a3l44E^4Q#@_qY_?Y~LrYpPfVn)5MnM~IfkgCbrVf;l0 zSw`9Ku6kEeI&~9$R9I-|X#SnxDC5!nK%KFj=v`!AMMh&U*?hN2Ux;OG*;v?M{6@tF zwwKjNgF_Y=@%SvJO8vg;e@oOnjCejPB_Ho93;&o+sW=nDj|PbYqph4sTjFYbNF7q7 z;e|ibZ2pAw6zVMv#8{y_2@Rj9w9k4DMqVvXs_GGPaepRF(H+nM0ymdu Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_with_limit/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_with_limit/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_with_limit/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_with_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_with_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_with_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVoteStateRequest_aaaa80ce4fdfc75252132a85e6c12bea6a47c9f7bf30133713b6b5cfec3a4d57.json b/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVoteStateRequest_aaaa80ce4fdfc75252132a85e6c12bea6a47c9f7bf30133713b6b5cfec3a4d57.json index c0abf2658ffc973dffe5f477731a148e5ebbb1ea..7ec5d3867602f3b3408c87d4a20e82510381a4ae 100644 GIT binary patch literal 154811 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 P;(LEIf5<=n`0f7!V`Z=s literal 154055 zcmeI*-;P$-kp=L%_ER8VbHUeu4Y`~9(aZxx5h6Ajp%92L_DmG{-Dj<{PnrX^yZ3KT z8WH7`R@L6;!~Xjh_wIf9!;81yy?pcf%irDmd%o>oJh=Wk-+lAu^}Dyv zzj^oU<+u6k-)}=Y?CRlz``6!G9y~gH^YqF4Z=O7T|MlhT$A@noTphmo`Y`|M>M-o; z;pP3XN5@fzuP+Y{yIfrz7ruJ@>LWl8B zzJ9;K!^7WSJvvNyc=Y0E-;=|P%hSVBj}Ci3dAuX=hktDK<+pFX`Tj32UcYrpRXfBWKpuYda2=WjFPKQs2e19 z7vFt=|9d9fyLUMNe(&DFrTpl@A-4DK9X-hpF9)PM_R%$?u06VU;M~VMeX#B2a)@ge zJD~m3tv(ujWWZ0XJhE$B_`Q`siT~Rd-+ljTL_guWrp%YmU%h(sKhIvi{^r&9-@bVE z>diNQe(~+I=dbhYkKeruHZNcQ_p=|~ynFHNT}J*bQ{TP){>3$38S?hsv*%61AocQ3 zFJHXPT7PSsakKZw{Qlz?KYsCVU;O>c|N8Tn zzx(|qS&|4myxN{e_b&mo@w;65_2YbUwMfJGS}i zeuz=3^p8N3KPFaqzfR1oxi#}aU8&h$y^-Je)S*8qv+mtx+wd`_hz8>PXN9ooq_;5ns{9wdo+QOBn>VPH2uzV;`cbz4^bbJm_lz`sn6cGg_RH1}Qc)b%YAtkNKF2TK^$0~9p z;U$wsS`mT^dKfRLRwl60c9w?=$&OT?uVN!F2J4)IG_*6y1C}Bvw z5R%vN#7Zhu;f_p6g6~sA+{*K8A-jA6*@->6%kbS~Ve_3Ulu`>-eTPF3X}FRmLdcAN-H20eHTM&sFHD%r@O!8 z!r-2?F8eM*zfM``y(0)j+RzUrz4W-tE#i1gvMr(>0*A_SP0}RNJQW>Kl2?4FU%wn87;fD9R2Nh>}onih*7Jkz(phl zvf2~Tlfdp?FYH1m1#D4jRf?CSc7c$LC>9xyQ+f&`tA=`z=4*{eprV;Vt$HCESU4h^ zq|C!{*`Rtt)^SO_PFZLUlNv&*Vc0z4>UGC!{fY}h!nzQ_ zS=dG3C>EkQwJN+-EHXv(T*JFULS$685cnEcJ(NY+q{NIU>6Bt8q~h^Hr*cWg?@6H= zmB1<%F^o=3>AUg>L+Xpx%4~u61EYtWSHg~uRiYtvL>s)VIVVuMg;1rABvw9!vZKC- zT9QyBT=R&0g7IXG4NiPi`LVVtSLf{yd5Awm1C^I~vqP9W9ISw9YDB9=MVsbQG&^3k zJ<1~-Uf7~Jjy=-YMX_ezF$J130$&}EN>g}0L9K}kl0;RB1)fubk-$n1Q+lM1(-r|j zw+Lw|`8W$Q>iBe5MP1tv# zyojVz35X*jJEmX#G_@(VC+ba6ngaPL-ipZB*w3lyJo!GO6L+teQ`dP6-u7Mmi-_lqm(B^cJg3 z10{j23!%EWFakx&HgYx-=iz9SmZ)on1#!*6En@SI)N68F85Q`bmc?aZ;12h6p&@5! zaEPtkE`^ZW^T=jpUA(y_!5>**l+G5S0Q(k#Z$%8Z$Syo3yGR)-QFBlgxYdzvkzy+8 z+$r&$GBo2O0#dcROW3GWGF}_h*d~IxP+Xd`f_uZ8a7hnY1QRjbg<};e3RPARBr!>E zAPmu{YBsf3p}fGWj6y72?RYFPJNJl4GMM<&!Er$-L6k1O5>K;)G9{LXn}sRlL9J6E z+WAA2#$w$qT<7bEglpeLh}sBmIt=a80EKYJV_;1ZFXDJ(wb0vWc!%%PO;=5lKo!Ak zA=x^7H~1t_T|ZVynQnoQz!GpZ#$Obg{mE`^M=3rVy$R)NIA(-$uPvW=u>(PY3NeIx zHAy-jtrU$a5fyW@nonhA5JOz%c#=I{e6`FCsV9{8DJYUjH_JE`v0$wxWeZ9lNl#Ay zjeAr_T62X?Rg7e`>R6&A88NCAOIh3}Y07x?z2PFb7t~VL-{H{MW(#R)ns>z81U8R2 zQc{T*T|crfUNlyi-SerWmed$3TUv%BLsx33mzCy@Sk(}vOOy;Pi$nps#d)TiKME!3 z5W#{jh>X0Z)EKE`0u_@~I^w&khg^EpaS2rI4|_?LwH-oxnynZjvp?BQH6=#_iqA%G zav|$$Migb?UNud;C@TU41!|#7kzySYuu3Z9RV(H#Atn^lm@Srf%6O&~cjJS*I+JN~m7aDm}2qbqgtQB`w0e^IRC!DS8_jO%O-Q z^JJfh^PU>mnAI1V(kdgMXRu~dQwga)pGpkeCODMcHU2yTPm5c5yRjWW9H0nE%0uF9 zwvh2V=vp{7-{&1~whrIt!;8m|eGAcq;rqN7bwL8v^*70dEdsanU}{fg5JN<*QL32L zi}MIP`TsQ3dK4h23TJ&P^dd4!xt1+yeMh48_i1_QV7>aoTZ?@QL1A}&FE;>UK)>O88d8GG2V?;H?iKm1xD3 zL)M5G$(J!u5maFh5TxxIpKwDukRE*GbU#owh{fMhNV%$q=s+fv8?06-X!%pegPkU6 ze8HZ%^gtO;>q3S#VoIv%8btIiUE?hJ+gU1ozlv_BKqH-03OMz`a1ykwa#8BFrsR=b z%J7UAk}T}fUPY+eBprrLXVVyOXA^JK6DvZbflWfGO5+=rm}K2xNP-u<4X-HSK+tkZ z*53oGg$V;&uR{{*wATVl*%2?uB&>Q(@C24jO2UTcax>7_>M3T^HzL*G2~APo>xf7$ z3y5eScuM$+f;IQ=#%2y(d?Yu$A{2c|#z9DPgj^VzD0tO{WTH&j<(&-kEn1``wi!&^ zi_5nDXiJ3NwI{+zQz9l5*pve-o!lG89x^FH9W2DEgoxqRD+nz&X{!jh&1(u&)gaj? zZA?k4R(aj*E>hI$g?38W0yU=$(H z8nQxz`lurLD`+Xjs+BKFM9Ttsjo*>~Kh z3qibS#86VY3u)iUZe&c>r}0Tx32B3~MHO7mc$CEM62}F&-7wLg;YfZ5U-aM*ILM@h zx*wCU{MB(HVaDeXUKNf7p^p0!uI#cu^DXr71+~3wB%X|dE50ysPDXi$^M;xF}` zENLUEEnLP+W$*fUylqQKmD*1egi3WO6pz+SIx-BMk3%ruut&%`>iXN`hLMX$d zvC=qEwc5RwMyOMw1C&Qw88s4yRCxrBj!$+hOcD3Hg}@Q3R;pxpLXN0aSwDu6I3v{u zwdS{ozhqM3miiTY3WQ*{Pf_JbpoCEk6pn|eYKS)FoL_&0sJ{!B>aqf{VAzKEykVc` zWp8<&SV@E}kMN3{3USqvbVkYw)u40m@t)_5#u<%c1dd;y+&H6gjKJ}0;zlbM^-d!G zEh{qq?go>OjR_up@6K{+D%!IxoL;d9+jo(kp&`v#iO4W~p%d0!w_%B`^y-61gdm+V z7;6cpfhEY63DYN$vpYR%d%nIqT+Wq`p+2K=M&lTPpb zopOFc5Nd;ouAN{7VRF)=@Sl{;LH~VT6|9*Iuf3r(6}*o8d7|T*_t9X zanCraL8GP+&><>~$Ge5y3n{*9j<;A#nJXNK$UdHSNo=Jv%;0{gL#6~i`W#5NSoqMz zm^CecV;7RC9T8%q%4Ygfm1W&xAqSIFcp_+hktrn!jbF&7HDwSuniu1l=3&K+vMJd| z3BG_GeQJwZ@$(h=hgF-PJO>}o2xm0TXdEMO{QBg^ax|z4Q=HFB$RjBE`n-hvC?G%m zwroseug6mC!MeqH2|4+H-wq<_KdA-H358lpJ@U)py|*HCWg*ACcJk*Xlw z-vyLmSSHT<-d#pvnwQz(K7o?{InYmUv0Eiw;tq;V3A>~#?k+FXvD%R*=09O+~21N73)ia zEWQ{O9l;S^6Cb2j0@YZNzEOx`56Vux7U0T28jl(^h%q0c+Ji243d!0g=A};bp@#!BaHRs`@S!tq4l28eYti zh8NF4^_p@7#kMBJ5z$Y}CP}>t4mpb~niotm^T{jCvhl3uzntk*S#~v`J|yv{22U4H zL%5JTSnQf^a`QmlR|S?rl<`aucjRB&Nhw>XRV*Hfo>-NPL=4-J%> zl#HepD1jv)sK?&uN-k8v#GZ0HU7wzsw^^Wjnm#O9~<+y&>AYPy*43f-Kw~oshM8^{fO;zC@Nyj<(_)n0|Xq?eF zM&S7M$&E7_#|Rw1w%VNwd?_we<;fBoEKPN7*74H^I$GHVQ_pr@oc{71)X0v}cTu-f zPL5}u4_lk6KvP=jIW#V`N0k)llr-DgpPz3(ZzLg|L`uB#;&eLi!c{s)M-43L3{tBG zg5=0HrRL4+Ob{nt;U{G3c%)27)hTgArj)lDC>dXql1+kmUC1M`?JgmS+($LG>Ielk z2~J+e9&vdkM8R6FC>zyyAyMs=XoA$cPKobg80)iiymz{|39^`duKdB(#~Hdq6LoUq zyP(y$pxM$bu22==IL z*!0kcmvwb{>!ys8K|z4%7Ra}K$~5KL%nKG>A7eF4B1Uye3=@4QB1ufj&G1AI4$^O% z7~-K-JO4yRr&I^X-;9?lyFE_{f}tLGP^#~A;>#(?9hsK`T6|9*0^+>bJoMzp9&CKg zTC`Ark_*VvUJ#MuX^lHCHs{M?5ce*ql~L+@5hq>38d2$plnJRiCBDm)dV%dCjju_; zVxde(Y`e>Ov3a9xHbm#e=8YlR>kEp1M4-|!uTBebJw8n!IqV+o~k+7PqM5604Gsybfat@dY5#q>)J*saA@e z99YT_7X&*D`U~s!LXu4t5TZv+5<#djd59rdpT@@|I@xWqNl~J~4XK2Ph)R}F7;W%q zV z5mz%MUSMFm3&LGEl(#uyEf_|K#P^ixyN_6X7xx?9KqKyV%0j!ST~NYB5l(C=%{L`s zM3T7_D{?_Qhln}399h6@(q6Y*3eY6!8BhJvdCZ*ruaOW6TT(*_OZw!TBJ}Iv1>IOU z-Kf-T;!Ltxo{w4c*CXdK^R`Q>h7`N6PRT=U?S>suy>LtI&R{ANT|e0>*_7gFviYxn z%%u2GI#a=-m2I#Ppq%k!X$+-5+;<`Jr$G`&lD{>Hth&3wV)+Td?0-L>@H!!wYw### zsD3qnBQJ8&>6D<1*mV~| zD3LN=yMk0wD)EgiUX{d`eb#)$aEm%FNylEFFa775-lj(2rUU7D8#AM6_|o6h=FSd) zO-wmKlt1$-aaO|_=8Wni5YzFhkkR62H5@f`p66#Zyp88=F#Ni;v+!EL1nR7YlWjxV zZ_*I0hO{^qtP)Qep3xxDQM#gh=YbVzNleBtva$GK>-ncFSSq`8!HJHWjd{FgT+lIDv5wt!stw^{ds`> z=|6?O{+m#%N+Pfhq2?(ni6T3@xXn{yNVH^kbMX9d-F$@4>)hK8y!&g8h4Lr8Zc`&U zE~lFergO*8kS54HJ${29u9Ip=r+^BwrrW}SS3a!LQweoweu7)+X7SEp&mD3+SZoQu@RZ5rJ-jI-}={;RT&5cdJC2GG)w~4{se$??K@m2}P&ZAR-5!!k2bJe6J&V z6!o;K_zSgaRUV1ej=P7;KwP*?i0_o_QBi7B7vRYHR5;e)5UB}s7Kea8s5R?3u81!X7fr7h}+cHKcxVpT6NM`~57m}GjrrW`@Btx0j@ z?n+D+PgKPP8r=9ucAKYUwwOUS7o)%`?I^FW`6bTQavDD}OE_6Q30SgAqnfg-%}i89 z^0&KWipXOf$t;3<+hzXPHGH@6(K>25HV_GsT~Rf>*+{BMchS<2Dagj|BGsgzdl?Vrn$D8d#x6 z8J;b~MSluj7f=A8i1+9%^{4}}!-x)5ZF0NpA2sv@X`QS+}thE*a3 zJ2yl#I|UiiDd&-saMZ%5E%BBhmLunpbMEu2)J9T*)5<28qyRKn6s$rKU8QQZRUeAX zz6+^0zRTDZkFuDeN`p@b?jmzf2yXja%3WuHUOUtt(Uy#_uweRh7d#}c7&dI1Zz}vy z8Q=LX2*Y(E2<`o6i6CVMotV0E=p-_`aC5Sft;q{&9%S&Z#%lx4Z*t}nry<=MOPW$H z(H#QbkJTh8MtbNzuVt=3ntsC<=d}z;*~la63VL@ZS5ieJYJeS7vqN^NCSZG0!{|V_ z^?_G-oO-gfM*;+=0RZjI9Uwn7Tl zSr*T-ctamMepG!yIhayp3L0rquDg zjF2gxV!Q;ZE`*{2_fS9M>HEp;Pym@hGjg3tL_IoVVy>}DkmwXSzMPzwN_k?kO~mmsn{B-d3$Pq zwvd97DSc#0dq_%(coBLC&uM*I8Q%r05F2YQ>*|Q7)HoF-N}K_%DMlzn$Asj*j1MJ9 z^h#;bin!b<0(7TDkwl7%8fDF}N<^lC$}W=ror3*;r=&7UxH=^f7GGK*XnewjYOwn* zyJSkj%Z6b+Ew#|9`c7;Nf_I!F4R4x8$@F?nIfCz-YEpP2O`T|M%{QF&7@c* zwiK(dT?Dftka{HHtvz_>pIGTGosu*Zfhrb)U`^86odgt<>IJgBQvwIFw}_}O+J}TH zabI>Js@L(XFWJ#4VLQgk5R}EsSjyIfG>^F4@zh9Ue1N7cGMK!M%NurdqR*5*bleN~ z#IRaLbX}-@7^`6tRpd^IVdTgr(G;ulN|ddsN>zhMo1UB)E0&aXQA?cC)Rrk7zfgz? zf$4Kg4rgvfOdOEYNA=(J(+EC=)A$sAe`PJPqEu z1n64DX_`;blv{gkn36|lQ&OD~M7VVNS?+9?S#2~JE(kj1b@ zSgrCyR(%mr;(}_zfF25Nq7|{w$s|o- zC>4lANwCXc+M*dP-Q#W&0@qn60`noY#1}Hq$~O3u#9U1(*{EOIs_n`yBJZ}oRDn;! ze6xR~{E5OZ{8Pkb{rL@|K!u~Z5blYvcS_O?rL4PXEm$yY*f#w_Cq>zQxdt* z!Nl#QE3DE9>sRS2hGl(X_<1b@)IG0dexXku|80Tl2Hu&6tJDNGwYO&;wV~lAAm_Er zjX)2PQQ$gDTk+|RT19f6KV`L;9e%>%XEmIMc$BuY8s3@KBn2H9 zO@Yss6muw_)$rE;B?aX&ort%yjA@0|M11cPtuQT$cEuz*BxbOj#bOUt_JwYT z4sN3dGZzvfId^vpjcR~MvqW6oN)`ED(M$C~UuqR0o;RW5NW-=838?Uj+RL1ngy*#? z;gWM%r!4Fes!0FPT{O)lP+dQPqgE zgh3ENq*~K%fj-wnq&?57x3MB;v|T-<$~5Wnc8{<)Z*FhIqUjkdq)%&lW|ou{%Vp9E zG9zX$6rhC;O+T8hH4ZzvkvN1xA=Z;ftP&y(t8@xmwY4Zj*ODY%1T|Xt0iK?8q^l_$ zkuph*PTATgI4Q&nNvN(b<7*P03cE!f(fsZb>Pls4Y}FCLf;Bewh|4P>3f9WNt!mHH zsX#;%q|xe>_%4Q(QG)fL2Y4ZkXcoWR_U~VwPBJZri_63O`Z~WZ`PJ|9^@FGPpFYkX zkM2M1PsW!IL-;56(^fsr$lDAUH{>z36+u+4p;L5{ya7m(r6y$~;Xucy^dM5a1!iTf z631H1aT2=Z< z(diaTM|;B}NvHJ4AyG(PM^X)iA$xdbN|jTr3JFOKcDR+d*`-CLwd00IYE~;!f3 zn!61SdMVT-rtl_E_?h%N9=6M?s*1O$%ZRN`+1WUK?Oixrzni&|hPy8^rQxFSnuFLh zjldG(nZj^j+BQnskm4Cpt6W`HeH*es*|Z5Y$w+gY7!|7)$_+MXwF;*!=vy6;(p>7I zVNDHD-N6$=WMmW7wGIv;rT4ESicoia9tm%AR${dvJ4H~dfJCWLO%=eLUEpD-5FE)S z@x6}tA*n@EgtuNuc+044p;NMph)K(b#I}LmlmVy}l2B@RGd5yHpciqps=E;49$Ujs z>@Uf~jl`BTAubD@x=T*0GNt-2O4u!sv6U$?X^)jCTc>0Taim^|Ozk9}hOZ{Yafwy8 z*e)A@Bnz=kUJwuC0tMC&%Z-(0QydpBinS_d0;RkSf`oYBrtw*S(`R4^o-Rv5EPRD8 z;+89{f954wGHrXQ(^ohTvUJu?(b!($%B+d_9$V-^xnk@mgn*c-Z|9i07kP6eQicendlv-6`=x(x+1vDkYYseHYIl zbw9O*QoDKmPp*8w{E>!BcDm{(9j;Qq4zG#oWbD2%KQC7;cR%wA>t}xO!C&p)w-TI5;=EsKS&;6FfbI069};>LzayMhTlDFb(P7MWtsg| zMnMK3K-;2J)%&mxd-qQb=I5`TJ$wGs?fW0zzPo$=r)NLs+y2Jc{jc-gH}CE~ynp@8 zhp*qh$#4I4JJMt47iTZ-zd4;cd@UpCIWx^HPrJr@4or*yW6`DUw`=T?{B}pd;Q&Q zP|NRr_xkPK^ZQe8@7~=0*ZrS<|N4Dy{AhMUjO^;x4%94)9Y`4y#3)L{2!R` z?Ad7t__JrblJZAqyWT!~wyz|Ac-kS|vzPaby07Tjj&r|_^ikN;Y1h|2Y=`!zp?-6C z&wx*|+_P(Y@I#iL^uKbs{o%vwAn+T(oL=r4bGq8K<@{>*CogwZ?1gl`E9Z2%>)XZd z!s*qXHW$18eDo(byX&Vt9ZxTJO#29(j}pG#C4apO@{zu8c8AXQ{&2pp{j?YRX|I{{ zJvlD-dF|D-$8rDM^Ick}y=G3Yu0H`Sc)kDd_3J_wA-w(j+uQeFzrFkWyAb~F$8W#A zm(4fte!Tne+uwZm{!Na*{^6V3yEkv|{v&_<;r)-d_jkU3|L&)1u)nzl{w4qZ<*Q%5 z`j@YMe*SO&`TS3RJ;kHKzl-zj>+;1Zaw>aIr~djXzs^6WexE~^FRre8?&C}QtC#un zKRR`PHnbjLUcQJdE7blc4b6WJJmKLvNweuT&9j!$v|m0vBF_o{0q5%K#Z_+Q+ur!K z;PIUOzb{|hB(<&L@#yfizmo@ViMAa{w&BvLoZJ4eB{YlqCyyl6j9xXJtCx?bGuo7< z{~GJ^p}IUM9e=cmT*on_oHC7JrQB2KAO_+7aq(*MEmJb&$_y z*zy~vEoi|dNjbBl=kF=$V>X^n`%bof8;d_L#QpX0>*f$?+`};yUb0Ro{vbs5fT&780I8Vu72oYKTl*L4@H5 zL#TutCb-kse2G*Ss_qp;yjL>%r1p_m{%urDl*s%ruiCCqQKO`MY%=+IYmah;ioKFr zRJn4#&kuo7>Bq4s3fBf-t9C3ZbAfLZ-t>r96k=Np>G>r~8>f=m z&g8B7zr6d5LX0H%xm-e2eFO)VeB26}%;q_8h1^e?uR?&F#U2Mh!~r_oGShPuOF2W$ z6wXX#(et;p!Dy_XQYM7BQ0-T`I)NZ1ZdDW9#X5-*9Ju-DR-D4sds{`alJ>3?KBOU_ zH;PWTL0y{E*-XUunpKt)5mc{iiy7Hkp_D=zC5styzUD&&-U?YLpAu^=Ya5r;(kLOA ztfuXivL!f5h-M`q=KOJ9O=Ap*@@ct-Sm2>vX_vxwm0{o(O)VOu!ks-65if7WOPPWA zidTl<8dC(d>SUz?7pm8D6uSVSDPa{;v&7plO0vrI=fd*_O}!n1LlD>LUq)p#Q{l-f zx70@PBeE8v`;|}sQ9c>_ioavM1c8{EIy}V;h!80rA~w=|LJwKIdnIrSBCR6oBU@OoP=sR^avY0H zSZP$N9#lLYB3Ou&`g}?$3`gL)Bxp)&QOFbUQ`VAvsN*;mnXuH`oF_Mk98{{QT0Cmd zkFqK~LMoDKMjm08Mg@!GKmv4L9(@0FZaQVGdRkHf$XF3}Zr zo0c4`rArI+7=@4xmf_kfUr>uRMv149ADeqw$Q@$EkLBv!XrQ`JR5>gae?gw zck>r@Hy=75=SL4D_lV+bvf!>#Ey(0*^D|sz9UAgsPtH7|U1B)DSV0QsLbSc2oiq+NK7V3 zyQ(FpOXOf!LQ_f=Vqd+IC_<-I0gZYYZx_WLLer_ELtFHARze3rOD30&tszDHG*75Y+>s)c(^ zi98c`fEuizFoi%-vWUte-4LmoCAQ!5=rcOM2)HIgic5L}J zeyff&Bud+*PL2z9s|dB!(*h!ya|&4)tVnpn;_$pKaOsjrqlQ4bkp8!ml+4zA!fSF> zvTBQvdlj8biiUW4xjW3;;T|Rmo!z0<_C-;8g={b+(UFl5>K)yxot z@2G-mm&1iPa|D-%#omgeCPdpSz3Tc+CX9dir>{2h{Lv*Up;c$Ym+6p{YV`toqo9HJ zO3IhSW-UUk$wtvsQ;J3o%e++xsal20yn0MX^*tv{T zfXl=!4Q_z-G4a(E-$Te|2ti?1LAA?aql6d{H~+9D+LNgpV@Eoi$=IpP zpYt(3lD}&tip!i~;jJW%qLgxe`#L`Of^scU#FE3>+eV=f!A@MI+}IYXhgjmO{LTWFaz8G-H zr*fctLcEv&iF!(2@wl2{mDtzgcMCld$!9lP1$7_uu zlcG^F!nDaaC@XMcd)5!)N#MvAR&m_M2NtG2G>{ebA=V>=Rh=q?P7M({$(8mtg@~F8 zG}1%QE0>hvtvXAZtl30As@D#ykYxZ7IgcOa)}=-&b76V#HdYcFS7<Zy zuC=h|FD&g+@(>7=9CJvEq)StSid|$Yg;Y@ZQ<7Ob)gp)4b{0N}h>lRI^+S30Z`L-ie6pOTChmguT6zX)93(@vdalrA^>eLi52* zrdTLL(ju9#$%+au5ZJ3;3Dre_%_>w!xSN<|J4PIKrPoNM z_ICLA0wYxKlVc#_Apu%vO;ON#_2(}e&?Ix}YD9N{;?lxUPGTy(AV`J85L85X zW%P;=>6K7jq)`x)7+GlEXhy?EGn?i)Qg<}hJdVS!O`VdIl}NQtOXs6&grM__xP<4+iu6ZN z=#>RgpbhHa<3@$9gxwISV9~CQ_8xvOUcn;psSo&T2z(k4Zb)O>qV!f8+mVV(5w&Q= zjZ-!G4AQS$3d*9>b``hBTqzt1UpyA!&=5dBAyWI9deM^=h#5uJp~b`oNyKd!h%f)+ z$hi(_yN*{Ku8LvS4TMykMEWunsfvQ8P9;hi73?rdv5?wF6l-rnY)%Cl*A53kDLhs5 zJeh4$65DLa^!|k<(8F74N*2YXSS3b>5jt(9CsTD)VTItkc0)uF#Ek`pXT#B6g@Hoy zGB964+SV@Tiyb*_9xja?`54@JWy3BV_oe2OmXeN=47DgIt05;V5fKwlOF;RwtC0f^ zJ0j`=aJ{ln2#$$Hi3dvU$;#mNkBhrVh!3=i*sNUX5=A=7^XYtan)xfzOBF3#q}0OG zUJ-2JBe)|CdcJzH(kY7p0iE*;EtTD=D5MIRr#+8Z4XkZgNJ^#O;dh)KPSx`KvM%(N zDuEtG#=wWm!_!zlZW=L0^2TBz>Mr6>V_iD-G}b@o9{b-fufFJ5 zmrrGNjp@i6x;VTEG(-lgWYrM4B`adjXYl!oNLT95xCQa~^h!hEZd{$xZk*ocip;*2 zpr0dcJUQVYs z=EBIxPuT?V!nXz_po?lCIn?*d`_`clQ=|PQD@=#n8oZ17V`7q2Vgn{Bi2lGvk56 zs6ap{^hHS(Dh|-9b*~Fom3#Q{U9&=K>J^OA-imw7UTN(?9Cg${nwU~Iq#|2>`jC*` z_|h%`eXd3VdSxpirlw@d^op>3#XrT|rT}#u>xYD?8h6elc6{)4c1sEMe|dhp6e7tL zoiYuP639Td)sY#S@v4lCtBWo=#J4#P2u2jt-UX>9C8?r_==hVy76mFf<69TDU@awg zLlAdriy}So*j~XkvRq1Hv=i!VO=E+FsBab`X1kz^M#0*9C7^39p^8Gku+KvXp?pfzlB8HrFeOB84wR(MdOZCGho%+iY(MBJ(^^H@(I41V<6q z64pM1A@yy}PldO)p18LUl7&Nl>pj8M5@lnx6iyywX`);>3rNkPPDS9S3iUB!3v4lmM9Hoy&W z+dyzcPKHo>a~O4P3`u(z+)sHP>7~6w-JDP1WFrGXz0xS+47CMeV+k+kTSY(-lJrWb zs8LdgAkr>{it?^B5+hChe>hxEmNKo4@o?gsG9i4UnXeZ7pC+? zv^gm!a$5*7_;Y-Rsbe6k8zQ%mLb-K3tA+@l)da8*ok7hiLL<8RZqpFb+nJSIS=moy zrRj{IE=5O#^}?7|2MgA^JVX@vQcp-?;t3OOa^px3|8_y8Az5|OC4^iV8egEIQDsZ) zxbswcM8yHRsDqxLE}hOE`SkeaAQ|#G{OKb9yvjeP{L}CA>$95|H&^-3<%^sC$@t|( zBz)btH#zxO0^M7>TcG3As&5PKZ5K&C&sVB1T#*t=5@ARV6AFEPz63Z$p)Jh>A!)cS`g~nP zoldPqqRjS+`OGWQuBN0^*F|oCc=q_nkeStq)PFj=&c={>IYw7U*xBjD!mvswViNRH zTN_4*X3NDOo7lm5zWr3WRfyA)=@r}{W)$jG%$Rt!v7KuV;n7*CSLIb^oyfesLY^cg4beu?Dm3QrqV!fF2+pci>4_pTtOivexgyJE;aEU0Y*f%wxPaco5<)vH zAPy>$_g034pnt?@&yTqY5X=pAPK0a$;+m~6ylxOKNg=(mVCmV!B(Xt1W_ScHX2{Q1 z#=1wfw?x`tr#_(X#CX2g#R>%OFwmqOItkF3U)I%}m*Fx?7K3d*;`!+(m0VT?2tlFe z!&s!Bh8T(29u+zv9Ib_H4R_8y-=}ufExc`%Bqlr=R}91~Int|!$O5TZ;d@paHOi-z zTb%@{HM5d-)eK2fNX4X7bD))8-x@TfjEw%k=d#6$OUlYSkpz0VIDWi>H4 zaC>V$AuZ*TE@f3BES7+<5E*`mU2KQ0tobtn>^ZtE@^USl|4~tT2`Td9bJe_y?{m#7poj>^Kx8^tb&)S~is$z#^n z8489$;E>`^Rqda(_S(DpNcPX)oSeM)>E^?a@7~|O_{+)9`L;heyZbudy?KB8@x$vk zA78zDn;-vmS<+?4^Rv^tZw_Y{n{TeK?!URZzW@60@^bUd*>UsD%gz4dakK1rez;$D zv0b(K`f#?fay)JiKAzuizup{mIDUKoi^C?A zKVED$oNuGp`ggV2ak$Dg%r|)lWKfe0-zdzi(x_$lqO;F2E zzkmJi_Ql<*ceihE{^#zuKfL~s9si!S|9boO-(LUc&3B)#{OR>~pKgA9fd4%cPEHOR zz)wy#A>~(Ro7|q9Y$M4p4;!Sr_Tr9FcM+XzIQO}w2WAh4OSws$oM<)dP1oQC)6=+7{bk z3+BsBPOh%LfGbFS`1tB|!Ac3d`}@0_53kxVMUgY<`x9VvH*Frk9ZXIj4xqMK0oTt$Wb!>tF4Rs&~n7%`;&{2o00Fu^@ezP ze@;?VpDs@?4^33Q?kgEf>hf9~y*&0OUHMo74~Kf2RZA9Qef7NGCTVqGhGI4Nn5iZC zUm{aQQX0?)^?e?La_zwGZUEwelzk_D>in@nuhzUjBI}O<>I6@ z;D%ZATgpc{zjO|lWy>JAZAl<6#mb}gy2;y`rAMpa;g(kIqpGsqlA;$NReWk+UBi!80%E+ff=#sw&sW4{OR>lcNup6S@M%pL z*v+r6|0!@%!q87#iis9DWhvb|yQZTqT?x2^EFp9;rD&A4gisTU=0MbVezB%3<@^9g z0;RykB@uzLB3Y8a>HHp^5TxZ5IN`=vPa0mY2!&)7HNPpvC|c3FCAmeoiv^Zyc`hxo z>GgisT@p*z=K@6q=yOgHQBXn^DyXE_C*cxO%Bt)V+zWcVqCk>fa%q$mA-F>i69x6k zBv!`G@^DA7Bh}}-*r*G_dW66=u2>*F>J|2ml6D7ts-j_(Fr-lk$s2fbB^|18N2a8} z*DWG$<#|kqm9HQ>@kgzU*i9Ce*ttU~wNTYpI0TWVD`g^t9QsE3&;dXQT$hq7+LDK0 z6h)>5Jzp9}6B`pcDT#@ZrGh?vm8)0U0jcS`7}7wMilaJRDKs zqSUK2FDdN;Ar(<9vL3he7DiqT^&rjH9+5;vGlg1>LNu^&L^es8N8neLZj|C! zW6=VMSA^h>u9S2Uf{9wAz=5-fOO4n6MSn=*cEFLEwHl205PaD98bWd1fgmB8C)lO=Js6XhK%hG_mO#Y9fge`f*}+=|I}eyqXmSjXELg7Qd&c z#?z*~lM0;MK|Dh(vL@-0*yjXl(of*R?XN8~H4CueMN z@}tU+y;Zq7?|;Zc{2>~syv(~D!aU((1yoBTS}iKtGMA>=^{VYr9^vo~6RmNak%kq; znq$WjXvqkC4LmAM>HP}5CLu@>RV8-toCb^}R%V#eBYm7q1PC<|(o*#~J<1TgZgh*1 za0jUb@g`On)x~+pFL11h60gP;zxC77 zrre?wv>dclv5^h>QKGV?yQDE?v1wWo6)fg~SV%a(zWytAY2OlZO~fnN()ChDT_3pR zc}2Hmy^=~uUU~>{afW(*L&!^A3LKQEFjgjzx`d=%Nl0E{f2j%4%&rfkG`FFXfZoLc zUBx+FhH|w~oeNOX6@SR3rg!mbzCgMqR1_KMmQYc)6m-&C>@rQ1B(@=h>Jq|86e-)N z*=(GLqgmQTU2`mmYYi?Ln-8Q>Q{c*|z(>6-AqxXnxThNp1xt%VY~^+-gxsD-HYe-h ztu;yhr~;#OOo#%kCIsJ#7@CL`-V!U)hDy|2R0VDgq$bi#rJTDZu~UU+eMCUIcCCbs zx+Uv%K#gxAm^+$FYgTY?dXp}hA&X!#hE_ONp`uV_4}v5nnGJ*?npLf)&MH(F_$Z?g z3s<`yTg=KmB9bg7{&aCd5K0iGi?8It>Y-=XQ4NtTn)#HQ0{f)lPFdoC{ZDXaIY@O@t)uouA@{#i7@?W?|eWX2C=v2i>MXQb_ zOHvV|Td|ZSe3GWD$Jm=Lf_sNr%K0lCn%kI=k*0M=yiH>Bl0Zr-iK6F6_9cqu3afj* zl+=?tLv2gjkW}cN9_nqSwIg0NMVS(%LdzmifSP!|)6HLnQgn!5K^H_uT~ld{QZj*x zODY|SUDZP#dNgoJRQ(ToNtSgSLVsGVm?HB()lEGmR|Cq=LT?Ho=W9h2W#L{mO`<3( z0t6*$$CM(?IwD}5RMx9j%zHviD5h~+JnxqAnpWUpg@i)Mu$mxzM-&u0Ee@sgHWN(( z8Chw4>P1|tKU$S>Nk+Z^(cy%m@O##Pd%h^@Rbt06U{9{3`?PyTiYZrFOo#^ycgako zd#02`4H~j;*+D9ydP%GFz#dl<(%?#3gnQ+=FsfVhX=F4(0x8c^eIm|lY2aYiSY%7P zjDViST1_n_r22d*F>s6EP<7Y&=PU5ExRtjH+X2J@ijbr{B;Lk^tY1Ob#<9dcA9$;E z#6F*1yoRhML=#5r^HDSeNmS2YBo|BsZkfTkx|OEZOQ063ay`~<)w@D(H}mwSWO5DYakT6EH+Ar5OMMesrki{jgf8Bx2M+6 zTpWZjtpBNTDU-H5Y)LskA<$K~TcTIOw>p;f5=$2^a|o$KJEmN+M#f0KjDd=v3VVPc zZP)yS8#00P;v={FfwDm?@s>i$RlP(9GNIgHwMs$Tp9UW6v`7;R&dj9;%6LW>a;zCs zQcd?DqIc<7-J?r5A>ipe>z?O0PX7FR@aFXT6YQhn3DMLfsbW zaBRAo#(KM(_@JI#5h6`&3QAQP-(iVMHVuX(_<*Bnol~yIu=Ci6xg(u;IBp8E9_x7PIIZk!tXSwrK1PL?o95L^Kd0C45D}TKiAq zGp8;wQkdQmioO)%AfyFCA&g2Cyc$9(QMRn|PL8>WHYv$%78CapvYkK15}|kfi7?WZ zhzTV&?EqUR&&KhGT#8T!3-Kx`Vz~7YgtnWERRr7;H6^NQkm{2$rleJ`yl>WuG_^*d zlTu8e=9D2iV?;oRx*^F^!qG(Og$sFJ6G)QPtEcJOIsB>S0c5EmD>P_~Dw2PKVZ)zk zJQWjAtiA?VUx5!_!NjyCaQoiT#dM;OX3+^Gd?piFOwA=BN1SD*t+0&OG!Qj`_xE+n zw23|klSK7=%++v7b5+Mgw>wH{5rrqBHl2iN&LPrfToEA1lR%K<=$80HTe@DJ)vt9* z5G(^Qjm>N9ghhb%K;|1F9ln+i5iipe`5)qiA=9FbqcqyQC668~T)^k_3eO|Du>V!If1Y^*o9Ll2oiO4oQLvA0v~s8$@< z>QxM30ghctEz9uI!pN}(k{6Y2)`wui;l>^lqCefTV+5s29D!i$bqqN<4|?^DhL(sM zIg|5geF|1m+T<)*g^;rzC9zf#xB$00Ci*i1$!CZ~FAjl&T-wq1;}W*N22Lc*`n-f! zg=2?MCwxg)tgNs35qiXe+FmviPe#L)SeoI4ubdD1=vXtXC7*U6j;*l>VZtslQG)5j zyMx2oB7N{{l$8{FQ#4;10`aIjRh|+LhlBzxb+ps5cqK(qx{8F>t6k4tEL{}B4o#cp z61lC{8A9rL@%i!e?)99FyHwupC$>ePOlCI8nD+qn1Ia zTcQJ0M@t(u5{6WH2^?LY>e#VG!mkN|BVO(4lHmyjqF&|vI7Z@(R3FruH<5VBrNS-! zEB+J+!EW86%9BJ1qnapO4_Va|Ey_86{zy?j3zr(Q0u{+JJY%kz|mriQf2p`?qQoy6biH}d8a#Ztc!!4 z08x6V@@K3SdNlAI6ARtKv`&ZGVBiIjyjpl=Thdi&B8uRsrbT82zLmPjLmePnP*mf= zf_T0lPFAS&nk5wfR=3hA*h$nYcG6W_t+7Img|VXN4O~dO$EDB}t99fmpXYg4#}>(@ zEj5J7Q$(a@hhw%S61@Wy5-a~(G0hbP9{rTu=5Q*gCRVc~{*QP|DiK2-n=>R(flCOj zZW0{4NEU*WgAlJp9f1;!8b!)LgyHCz(Mb+(3l<`^7N~YG*rG=MWU;96T04}Ya7mvV zFZ3fWnSv#1A?hdxO;k(})@wP4^sR7^6ePD{poCv5W7o7`s)?+pT(yoU>M&M9u0IMy zN{?JxNKRIYLSE8V26pqEF6VcP48WbqHCJhNB0CijlFhgz{j|=E{x#3=oKK93OOjPP zJoKh~N{^tE{~(K7zgUb=BhO8I^A|+7f9Y%cb(Kn0S8BFOMFlwgkun*YK+2OXdwPeq zv&8b;#2+K!9w45Z_}u>{tUP~i;*T-V1WFoK^Ph1-1h89hPFU3pWqHhy&`%S%1Ts1c zjlrW?=uB7v5m1I>N!onu&G2YU^ONVYo?_|z9O$P_tX|2KxPqcvl3|&OYef+my^>FW9*qIcNvN~|>S7?SYU zEkebbNRlNMa%pF-LP*S2qKK_|$qG*>kSy*?2wW;spNdNqb!w34kw*&hET}b(T$<1S z4q}9*MAVwV2SLLtLoE>G$*llUqJ|j4jXH)8sZ^r1>5q!wC{jeykw>m*O9f5ZWplej z4X}yVid0_%UmTmSsa2pv25Ul<6U%UT#g!{9skx$oEy^ZJyJCU7T?>R9OVkoe8Aa=N ziB*MHsN3mC8f8N07D;b%JCAtPK(f@u<28*Pi*v+WQdBNsFRT7*`%WWM(Zmj3mE_p>6N?3s_D9r8;KGwcZDPJ7USU-86PHAwx+MjLErznBsAW9} z8s3ZJxltn0ArLhGQafEN@s4DgOG7XzifqYxp(|0MQPbhWA52tC5Z28tJ^@(azY-Q21v@#L<6VuQ%4lF(rE_}DLry&Ar(nqQOL^$76fe(1e(b^aqSRrsV1Jd@P;0S z_a#M9!J+kW$!|LKYI^jg#T`ne;&OOU-oZU;7PX>MkfM_;wFOg)^y$5HrG6LbkoC<{ zxI|H_It6QW39rnJ08NEgDFy^hI4vilT=V^=1v<9Cqt<#dllPY%b!bfz9 z2wTei;wu?PZPuXIkROBr>fnkpb9n}32!E727j7MEMNjW=#1 zHeQF@gM`&3TkO)9yh0w1 zUGwR!3GDUVqC;a4k=SD*1g6+muZWFaR!XgUm6zz%io2&P8v*yYBhH^YJnthkW$=e0_F(dVQHcE>5reoAKp&8qih$ zga6lA`IrOaUwD-*J9>&vGDBOUNYf)+9Sb?7Ub;S*3Ul_DNbLHIO9F4b$odiWo z6g~{hb1GrTAT4d_9Z5_q=QAm1sAkrN}ZVfx} zza$SgsP8AMc?q3rCAU@CQvDY?)r6=)*LzcLu0+{tB~eQtjY4FqScrhEflIDxVtLpA zB;S$S)CKV{Ay8udvfNy0H6?I~qFAePCQ(vKjUosV;(?pi=ln&VfgyOiYzR9>krZqm zVf`~7lI04$ys6W-aL#gc&Q8-<-olyXW8MI|%FcY`r0c%%^m4p2)Q4|*@HXBV`v1L2 z)QXj6Iao+iQb>|tsgOOgj?%LRLN~fZp&E*^z80Y%GSb^{=AYU`8Z?l|qLg|A(IH7( zB4?t5)t%}53>4_JB z)p6C~>(lwc%EiU;;ET(L?YD=cP8Tm8esDU3a&b87bUN(5Ivjgkb9+4Ku>R)dgMrJ# z_b;vv8!nGg9R0gF>^R*Xj=DP7zPa8J_}g!$p1*$k-G?9U?%#j={y%@b`}Y3T4|hQ= z-~Hj$oBQV6o*hEUkIoOdefI1aNq%@bAl zKAifABd42#@t23~r<+4oZ*IQ8EO5Ph|Lvx-@X00CD?CnhJVfPzkc)UH~;X> zFVFww-=F{Gucst4^t-&+URP(QR8ygAE?Xd{^ZYvXeHLAvB`;a}>89h>;Pj`fKCTU` zhnW{=smd~^f21z*$HWN_=fusrTQ|=eO5J|(a750EW?i43U0+L%^cyqMrh_f}9Ol4h{pErbhvH#=|r|Qwmx^w;Fad$?VlJwtfT|GpX zgOc$_BWgxQhDO#m?;GXy!%=&plBLsj=5R4@Uu=$E{^s#Ug9(duxLA}rvA#Rsx5--_ zm?2tH^r)#V|6hVrfDV*RcppjDANB3+Z=7q2KSgwddh;{s2z9pYzeAc+^Y<$0Q#PJX$4oYT8;k$A5Rco(*YzQ#@ez)_!b{d2ia#+C<^QvCIaqs~ ziHF6l$ngKsay)D)*&E95z_82LVR7s0(c(I;k25df{5msJd<*u11v7ozSKM7&$l`Xu(@SbjGu#!AY3npaI%sHj#FJ|>y;ys@Wpg^JyhShR9w zea{bpvC`+UC<-?QU!!&`TIK@Z2)ynQugJtU7}EJGxe9_(gVZ}{@c?c<-mb^e?v~K? z(V_P+RCK-MrzX;sq{H_7kes{LKveg!Gqv z{iD~)BMDWVk|jC6E~U9B&$C4WuL)Z3blaERlB-r+52?Tl!J2+zjaSu0*qh-6CCL^o4VA>9S7N2qmFgSpG8J8r5oBYdpr|)N zpulrJiy>~w`72S7@~EC8J=!jj=j}@9RY|B~l~NK}sEMqnE-+#jD~(;&*Q=095MRg@ zG`=PONo<%|}C6%3> zx2peg_Zfj0N$|N`Otkt44h(r-3hKV|_{)6QV+uU&-nY1Xbb|HNjo1;~2q#laEft30$?eQN$}r?@HjKGz9co z(e5^=OPxBCiRfOv%5WkD)h*j#MzU5YC6HRlV1}Hp_z;1&Ko-I$#~RDp#3ixRN(d&S zX>+A)365f-UI~a%BfpcFXPc-s>-{hXg(BOERviDp{}<2la{?V6*&(G0 zokVuZ+cl+9;1UP|vDege7c(G2q-co9Nc{;tWbp2mz%7V0ic}xT!h(b%9D5-1Sfs;B zq8jy};=GAqA*Iyw$)zwHf$NZ+!A=VWWAC~NM3qO12?!tTU2ct za9oPI>J#87^bf&|WiXnLh~npoiy z6#^}8W|S3pyCHv?ncyqQTwquY1)Xee!)@`ZTcX}X?*xJwR^6aUY!6{Nu@Pt3&FYag%1?1ey9GKk6`T@#6#$|sAnOJu+6QD?M&5pZ>eDlREP;EFYIFI<(PZc2r# ztsPpQtF)}IKN&fQNa3oWP!rjLK-7fll0;Fjf}Ipy>6hG!SG9r%9UGAoNJJiF9LVI_pwY|tnw~!2mB-%1!Le)bB4XIo9Qq)m?Ds%Lw z)ru)H|5M%6f}bvTlmGaFjsyXM23jeE7N)ExN>kMP`rD}E) zgzt!gVwc5*IDG_%hsE5AqQ*qiE4k|UO(Kkc`KMPKIe%n{LTJ>P@TEJ%rAobkUMncz z-IDOdu{{={*3L$$sk)RJnJ)82A*5;)Ugj;R1w`Z;vLhmdELFC8hjaxCNpHP!YEiD5 zTXbo71yOH_YObbvRTHUPL9lQvP!Vg8a@7!U&YVwCi6JR%eq7lW+F1*nfP12n_ABl$Z<;FHp%?DoL6^1lw znYZ`E3VhuXuP9N0TiVBNf;w8}D8Zs8k}C~-pYkj=CC#f_#%sEN4J#CKHCce$O^9^tQAq5i(^ms7 z{XJP90mVHEQ+KCrOrLjhT-KE!&Mu&5J-(5WUuC)v{6CJ?En z0*&<0^~xn>c%#mcCSx|ykK(n(TFBCXh@A6_IdzGV!d#ePHsPHQp&04k1dtGVKDx9^ zmJDy%(!`2mV+%FtjxkbM4II}u1d*Vc!1-<8BKNGiwDDw~S2|-*qAKhQ^w7j=`@q&* zAhLyK?_4dBQLQHFn|oadJ>nAe*#@3KaI9(|b0@5=&9ke<5M%K_QGWiL$i0 zM2X$uBggQONKMG(Mp^xOi(3ek7OH(&+!(bX{{J5~v_UKFq5TOB3f2PQeN?Cwf563+ zIJh@IpDz#(|Ki794x+u?G9N*W{AU&q3BWSJAnB_AznMcPwQK+^VnWZ*EN zJkNTXLTd#ZdbcEFIw{35)gKg-0X=1G;KCdWC#4eiB?y#^J#l&u8Pg2GQp_Sh*FS?V_JGakOGMy zXc6I-kt;%^TS9dyje;1*NJ4X?q3X!tv>rofFB9wjce?}6XtD5BD~tOr1zj$(Jet-^pLs| zoxGzgS?ZRcEcDy0pzLH9!8fcB16A2-;(y^GxfGF#ttvB=e^@Q$Oh`Q~KK{ppPuY0N z#xVoOub;T_l#OEsj$fNTON(C^V&^+cCxKkM@VP{9Io)6abN4C5Tw2O2v1W?Gifw~hrDeLxY%&`M>K2){v31M0wq2s6Sb$GQbCK0RN< z&ocpJejP(lvffG|@v^!5+JR56;{=#rE}5yauMj7>|WaUw07)H3U}bJ2QlL&4fgb;H84lr7jJ zig;c^^{&^uL$)NnBIf0l$O0!SE~y}dfkfJk=TuGYlH`??YL%AOr>+r#_AlZRt}iQ+ zA3>p87K#F8P#Yg7Ds(06Mv)2@&FV<+^u2fmi@>Kk;MWj%8W3(sVwl4CMyuT6&Z&X9UCMOwP7H> z{>PE~IHc*Ck2+ix!K@kxsoIJ3GL=%53fk*btdvo~4y_amiG5hH^v1-dR8ZrZ;UFl1 zCyK5ov5iY2n+=)nUl;-%-bfR&R9u2pVze2d(zf)ZtBxov5WH*GL@I)~vB2<5IGU?4 zP)J?|<|U+U?6SVtk<#XHN$l{);Leo|voxOsL|p)`TNVPrHc>0lK#4tG8QlK3xPye~K%f2H&iMFW>o zYT!w)6l~!mxKkQ*zG|}4DT4t4o%IVTmD#B%Bns)LU5{Q3tgTsyOQqlR9jA*EwVYqp zh2FAdn4o^zE$J5$OB@?73qP??T?{L-We;CuXF+gi%bqK&j^ZvgI|66Ne3&Q1+cIRd zYZNHXZnxNp9`y<*?GX!EDalc4 zhGP_aw_tVm3LuU}%@o9xUc)C42ad9(QIL$pL~uuTHNzN7w}?J;JvOEWf?k?yB%fwr*C!U?VYh7J{PlP>q9CsZ)wTBxfROETISN%hU7l=^wZowkz7_k_4Mg^W-kz# z%~~CzU^^mGgGKPEr$6@ZI2XJ0Xwt){o<1ofB++u=YQLaKZ?rHnp{&TmPrA)zKoZ4h zIcL3yMrSZ0b`}pS)6&=ViJH6`6^G+W>y+SAhUi2QDHeJ+QOc-6T1nJy#oGiSSS$FE zU#CY+SJ)_9$`E0Dqey?0T=jgSda@*%P?r`G<-F3w)-e&QL`~~^ezvHjr^YqCVxnH* z`uS^n@&Wv~ zYC?E5q9Cv8Qg9I~dw~d!J%0faP4Ck!?6Ddg49xF9!lzr<U7sS7Ufcmy>ol@P3>+GzRu*PRG0{?ra?%!5+QK2{cRk*A3%8hP)OjHfjZuTQ zavh@^YqON*B|}Bem-Txc3CXjiyC|`lK?f=_`*PXfH2?|ulCZT2_&Rd*&!@) zI7PkCRihrlDB?!xH{FSBu@p{y*7fsl%gN*hC8RtgaU;-&K9elOADaKOo=PvJEtzk1 zV>MN#QhmbV-HO(@1YUmD~6GR-X|iio=K!Aepj{Y&F*imx&Y2cd)8Vnk^Ft+O>m{JrCB)eo>>6XM!h@@08y}96%Ecg6)rLvQl1l8Zbni06;D4Cz_zNd48`bv~NZi_yB;!p=`;3(cy)Mv5jo=k|HE_J^GX zLWBX4d6g(c=}Vk!A+F)Wi9NTZ7TDWs0=wcKILYKz$E2)#?1V^2h$M+i>J`r^K}1Nh zBO-x!ORUJ2iZStOV>`zl!lSZMuBr@?NfDps3VG68p@}AnMxikmB%JwAw-QKp3Fv$5 z6UXWmc7bk5fr}Vsi|M&C)-|fR z74=xT=jojo*B6LLfxw+8th7TX0lHE~SvnxjG|grl*DKCh^ackNcU@U~HeRKk<7#XwABm0ZNf6s7H?vI4=RP;t znO`~Swx2h>93KevnOmN>jSqzWd!G%B+9262etDt5DXZ#OtjGYpZxP30q8dl#5$@7@ zd?d7|m&zj*OY4)^ObpWgo7?bLwK6fG@)4Iu-h$I9fd;>+)a@3Y@p9}oAFUfa`iv_A<-ZI v#fDQpEV}65ceqGDJA7D_P|NQ>tGEQyOWb=zg)ln`R%)#XMZ{QHE;Wav)k|U?)!H)AKt(I z{==)cZ}Q{6E=#)Xcz$+z`{r)*@Gj>FaFsEdv5mzOI7fBR(W*_(IYfBf!`|{_XXDUjOj<%3ogp@bUWRd-&fm;pF77 z0sQ1-6HqQ{F3*4wH&Zqsu(Y~ndwY_fXTB>eg2sKfTG z!^I}mhv%Cu$1OtJs<_;wcjNAhjfu^Q!`b%D`R2{}hOzg^f4@@CHa0HrZTUpo0CV^4 z;bLQAt1?@`IBaVz>HGq&Aoc#ktJei9CGhs|Z?E6KdVBNtccJ>t#~*(9WG*WB@#e$l zKYaK8O_sm@`TOgeH*atLE5H8m{^RxSo}b>o`=!;_A1;P}%h%t&`|Z1b`R>lA zwnY0^N+N$voN#we+^oBG^Q@uN?dNw#^sLL%xOKVwF!FsD?Koun_2Tp@el6jSbFVI! zpXAiV%jP1U)>hJ#bzL6T3>VhlJm68(GrnA&_v?f1j2tE7pKM*+g_a{8-k)5I+>CrL zt~bQXyK|DF`gD1Ed1#{YeP78~QkU1_=;g6L>B@%^csSJCtXi@d>#OH|o21o&8H&~5 zL#CGGe~C=d*^o6(-_onU>f5VNY-@h+!@1zR_<4D@#{9dCIb=lmhaNWk+G*W1;4-9y z*%0&hYUn-{?`N{<%kRHdg4^xm`}&ZgxP@b_?N-|g#TKm3Ok@`L-N;w1*jOuTYU-1W zY<~6S;-od;hFSAl%11fBbPktg%OJRINgyx8%7gW~$=jNx2dm)zmR9Y9sV?Oy;m0chFhoP})CFNZLf{%#ERY`c3VTOMy8}K|(J)FF(kO)F4LrG$ z4pq1#Q&QmT77@4dJSN1-H;|q9qgF=jCJRgK+@X|OsOl>mf=JVqG7&-!eItG703Zae zOUV^&$wM%TBGZDNFO8##jR~EU#Kg!_L7%?L)hq3Q)bw2pX`o8QQJt>wQV4^4GPHMshiYQl8cf^XE zACzURtxJM}W~otxMOY5qMObGP#3;-q5gBc}^&I2vdYo#yMTk+asKG@f1+w}R(UZik zQSY!qHw7F~>Q$PTly-rTiYOLYk6U^RBd>;fkmhTTNTQ;dLajz28dx|Yo21MmaIsRv zcMv`|N^z{QXo18lLU2b{O1cQaM6FTaz*)ql#_Rv0KO}KG;7H9{4MuzjK5TpqA-NJb zxSEjUTHOqpXdr2uo~#^3xi)0OVZp2IKyPqk3l1~I8sVm? zEQ^iR!I~14^9eW{Fv^W|H0cEqLkhVjvV|lxAuDQ{*mMmwkwgjoII+8QAnj&e&5D9X zose~l-&0g$TNL6|$4FV9#qHx#dfl>PI812>sfJ_oh-=hcul*|_2nicP1ZRg8fumT6 z=G3e3RYC_;^V)arMWs?>&vZPyzosf#x3!Ta(S-%#AYE%-dSi~{9 zF=g(`OBm8vv{%LiJ|7q} z+t5is@8W>2;+!r+xmu{s1t{r?Kjc!=yLdHUAl(uwii~tis3=C2B6J0=EWI6KSSW&fSvOsY0_p zA|PG6R>DTzlJz>E#y1hn9nGaRE4VkkNteu!MKBpdE1auPQK+&9K@yY92Eq`{s#a5H z6{-t-lu?L(P0>$1}KC(UIXirM3KOos~xkArgy|XJ#^J2NmLPx38~f*yTK=k z>iO|X+H@O)B$j}yGyXxL`Jd|6ag_42(3?=MhGRu2_d4=P6e|#vs1QTASC?e+(N58< z5>c@>tNGMc1~DXL&L{cf%~#vpka|LS-GU;Sa`fQJy+bYK{1pz(ZA{2W)4C(xCb4-*ASIPV(eoqw z5=C=`)jeNI>PelUwxw-IDs)c|^|sR55wDt}Oo>vVWsxXAO+4M{=C492Iz+Ib3nHVg zsWe6@nLx!Qm5#)&>LCw38n`5?{)fFJ%Q_CBKdn|wk@=tMrk;|k0p(|*H-(V%wIYhL zaIcysQIr({f)cf3N|9zA5wK1w>s2e}Js~C()3`03cguK9EAX&FLZM_>O%T2#3W}W; zhtm0&i6()Jth7G$A}-Y*t;)D0BVT~%a6(b|J!`-{UljE!vEvx9Cs)#a+C3x1l&dTz z#Dj&qWG2!*Q%a%+4OzGBAeB(Pq*Z!gkE;o3a3w9mz4BZb)h+roGMXTPl;^2F5$Clu za4>5uvZY-{K+j^Wrj`;?eZG_!xJ7WNy6gPY6?j_Q%G-tQ0O9~eNKzgWZ(~B%ub^w= zSYn?Kywy5lpHDAdLsk=_2_yFTC>nw!s^>3~3nl`$%wXzIWe`(Dqfxq;^^2z~@Z^8f zQ2SAUpe~&AsnLtbDCOF=Wb_?{*00m@(#87d51(4BCIp2w5Q<$E8zn@DIQfLs{9?(* z$hPU*W9w%w4ni2#|J1mYNn0Maq@14+=&IW-(JSFw9m{%&rHhw2gjAv(Q!ZH}VSSiD^UP!XT zN@o?JZi{p{HeF3)z1>ZGP*1K1ktQ|;r7De|u*4;s2162jz}xhS5)K5drsVuJvD%n0 zv5h(;p-FpRVyQY31-XP>uLYjOl1nMr@LZk@G`D(-S@exaHF!c>H1-A}lFI@j8VHdR zzM^2Q{m1c{Qtygc6%}fUT2f+)w^~o4h(yCY9 zH)}J$`G9~A|OQFkmNDpXrlDOg*>kbB+2U4<8veb|j8Z<@~ z$v?rc;m}z=v;OVpCr`?_V?M4y96qIy2&YPh7is$-(t9i_C0!V^)OPQoU(1JxmuZUp5Ani~Y0+3+Lg2cK1d{}rv;y&6 z<0T4ZvG_ldW960}CsD^lMLVb?23LPeaJTe*nfj$&VNpKb(+q8UR; zsTI=FrRg_s(~fnqTG@f)v_B-FbzVo=KjtHdA-U2%2;~msA~>aluP1s}oH5?67jEw{ zk;X>@WNJYKs)@~g4RxTORpAy=fC?swf3OpJv>Bl$S1l#6U5q+5)*IZRhfE-)YrK-! z+bMQbD-LY+Du%EC$1bIoWq4^}I@pKrr??hMb%S zz4}H&OT>+w$@#QC1uH3Sa+a(@$XSn)SStx!fLk3C{TYGeE5xD~hrmHD?dbb)3EN)- zClY3TUc#%wu|ud6zN9Nw*4O+9Jz_y^FB^#`qv1*{&2Yk3&If&TtQpplPdgCD)>wov zVHcSw!F1x?!QpI?KKL!lN{YQHnlBB3c+{OLPl<;^LV=b#+UZ!llA~szw~$Vq=TrA za9J;%z31cgwj(8VYQIesg7K1;-EmPIiwT=Ba~+m(y60oAhD$mz_OT3&%0VQFl3bN1 zG`i>dECacbHnX1qL7tR&PybA4y6(bNdbBbG2d;H;4PVQLh?l49Vxq(gL#FeyxASlt$vY62h0u3kx^xF2?ARjV*Mz_kul97w@PqNO%$$&tZIrD<(xl%q^MtoOAT3p*x}fM_`G9(%!j?@ zc}hdmMR24pq$?G^tfv-$L&eGvF;NoAdWE~{ltf{vwqH;UN(c@4F@Y}kuuUim1=^Lo z)15fh#lcR1C_Pm9Gu8?{8u*Thg>GS5r$cQp@PbHQExfWV>8dmlMQ~KpBC`VDN?qik z4v;M<+B8h>PSRu#4SkdzaE~MS#Qs|1+I&zh- z^E|9$i{#Rl8bakMB2u%%G20S}-T?}UmH(@l=86K3eoAh0I2BYAt638NN4zDKh#`;7 z84{?#C4^Qt2@YN)3qi_3h}WWyK#4|;B4r@LaCD65)Ig?*(L@Ol4LQw4vQ!g9q#d6Q zM3OylXQOExPM~P~d6g!o^gdmLV;=rfsx8s%+D-;XXb%`N? zmwus>!a)p42t-#bq5|h5M6*PKqfw0Uj7$UzNz@3OqUe^SS9zW-MA`&`_XTz-=Zi}X zJk=^nJ4&NGnQwfVC?vNvu@oSgAjHEci#j}~5OVh<^}sr!{1;^;Mp>amN;!xC4zCQg zMLh_JCMs$pf>Xx=pJ-07ra7}}BXjAf2#z8}By-ou6>VvYkwBW;9cmEvVjxs~4SaD7 z1ZN18$Y4$20H$R)WRojbDxKgiJxDfpD1Ww4sb+oXBudrAA|MSpSR-Qx3FjGD6Dd7$ zY~3>7xYGqBQ9U1XHC)nMwJt<8arVTpgoXzm+0`de292Dnud7V=5*TJA(*0j)d~rraxpEEbn+i$af?yf z6D4HSpy^f0mTGW_14$w_riT2~#OMAyuuasC5&fx&Z~nKF+y6b(_@3Hph2^PHSNLIleb;dujhnQE>C^k6|=H45b6APL>$=nm3E$(_ZpPN@?2qGow%ip2k( zA7YS+ES63&AR}TltK&62`xUqpkvO()nKsdKkVN%-%++v7b5+MsK$LG#?`h^uFfYopuij1pr_*yX?vf@RsVXTcY7qO-qIwj!EeVVoF7{tkd&?Ds{Y9OG73X3e8@w- zsV!6|D@ww72rNIO;dq0v7{wE6J(Q3(1z`(S)2h89aos`%lJ(fl^%mBU7gaP)F5*L5 z${%7yyrP-v>Bc(Wp`LE6U%gaTH)t{(bt==#svg?DpKh!V0Y?p@(iee6;8-w4_e}Jp zyVdO-4G1q*wW9x+TzedTk`RuvbCcr=U&|GMN`~8f@^X zX5mQBl6jz87FnL3Quf^x=FhK7!2;DrYqnNGUFj^%tx&xt1Pj*K_(OC;S*!o}q-BIm zS?!i+f;>p6I<*YvNT%sJSf(mAA3drgHb6fEnH4v#-*#+L8LF zz3Xf=spq40wS}D>PWLsda!mv~cq(x!T?8pkH}wZgzv~kexIuk?$ePfpR&raFE!BTf!kR$F#ss;v=1P>UTN1Sd(kMixR+3LkdR0d_iS^5Jz0zt*Zl#)vwJK)>L~|Pi3Gu*9>laNhIPi8kcutM4@I~D6 z2PX2 zQ7cy3(qJLww~!>iQXzX}9i?Xtgl=?+LMEyb3uV1qmUMxJj`h?GA`KcyWKl}Jf#{GV zE|D`qLDiPlH&W^M?X0vOAM5NSUg)h2Lnu)cq}&=sL_>((Er|jJt&VBn*p>z&MA~ji zdNKU;7Ao!V@SolJ{_#I)IHboO`!5}iX<(a=i5g`5{_1dgIJVvW&Zk(v^NV{wTHoZa Hzy0=qG?{3_ diff --git a/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_b6282218b0c8c33a4f17f60e2f691e659c15d8cbcb740147e01af7b1bd8a5062.json b/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetContestedResourceVotersForIdentityRequest_b6282218b0c8c33a4f17f60e2f691e659c15d8cbcb740147e01af7b1bd8a5062.json deleted file mode 100644 index 81b9a718d25adc8d9b6b4f7b478b69b85ced715f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85689 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 Cy`<&< literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index d438f5cdd3c70a33082da0d6fb21c942f97f77c8..e64b73d8a77bdd2ae7413c918f513e44a6315072 100644 GIT binary patch delta 2865 zcmY*bYiu0V71lg<7H?!{gQ0d}XJZFHSTnP8XJ#LMZR}(n2goKiL~Wo-$W|y&Dj_ye zTO1M;qg0@zO0axVA0m`?`>QP~5E0Y@5{ZGJl!nMbNTyLBwxCo%aWPFQRSl|p&b_-a z{k1bY_s%`%d!6~$@#^tcs!vSm)yXb9CG1qnPWg5Kzuw*q|IvS_WkCF@4GtPHfFrH& zj?uY1m640mye<{kd`lOiyr;)JZ+W~RfH%T*cw)0*o{WbkG$`zFp?KJYV%~=0LIzeP zZHTs*@TUeBhrg?t5c|Y|XvD?414E3T2}3UD;HsB3A1Brsf|qI@?5cI)LahatTo+?$ z`uoEc`3U~L+SOBOSetX<$gKjOp4MG#x>2{_gB1bHt@e0t&d2@h4IiGVNkeGBgNHp= zR%Rio~3*cy@dblTRL!mp2udXp{oY|&%B8Ufs5B3A&pOaOPq16+Dp7t|7bL?AF7$Jzp%_YD`1 zOzUB|Cm~6~ExhIZPXnC$f#%?trwKTo7g+2vLeLcV@RkADT^RanZEz2GF#3?M4lFJN zaLNkfwiMyl(?N$Rq&#SPNbu5u|J}R@lun2SSesS62PA9y)gE$$^GQ3U4D&)H@_n}!}(gxh5ok^q#s`r1jTz? z7{0-TealsoTnt9n5Ou>F3G&IDA+$8UkuyB}piM~-SSyTSzK>Y^9(B#_?C+!{TQ*Vk z6=vj`Ydr)?MOZleqLv1|P2glbU7T_h$(AjkeBjE`+FP24Q=S+!TGm zWao6?<=-kckouivyVYgOD1>n#)uqpEA6LWVY}a-4zc9c;ZHS2jS{)E;yS~})&VM->!Um7hs@6RVSH{a z38zw2(=#MuZtX8C1k;MMx092&uIjCX`o2zT_P$#M{JY)d0D#8qqQ`Vfk7GSzJ z4SV9RT2hv}A|r*Oj6g4|gv@oHojXLLg64t`vmF8+kNIT@UVk~mOo--)0p8!Wgkp0+ zTEc>%SVHMo1*yXh2*K;&1T~U^e3gJl1_hkENwAGbZ3BugC2}S*1lYjZNlH;jz2L5P z0<-U`2d6Cy&b14ee~hwe14)pz_V$+&OCs=zUY`u+9vI0!HImi-IFi-v&!O;j0B?Tj zL2<^{Q%QVc8-*A*R-&M0XD)q|)V0%usTy0E<7~GwHDxRg-A$7n5$8#(AkB9zB#4U_atDf+zb;rZR9W6nT5C7`)#H7-pW zKZBQ-37oz{PbvXFaZL{tH_@EZ-199og~$~YtGH>SvKpIRg#)D?wN6^8G=_h($yY0T z1I|D;I*no_1-zK2n53)};NC2ELurtNQV~LFp*f(Rf+)6Kw}xiyQ29ABtPamCLD7Y8@?}<{$43^pyOrppTd|%=a++G_U7K z)hk?1H4`U)NAr?}h{GAfp-&WC`<0%Q39iT%%p)HzRQUDN!8C1^d#2X7*he9avxoHz z4y~svLiBp6HfL5^2FRg08a3l44E^4Q#@_qY_?Y~LrYpPfVn)5MnM~IfkgCbrVf;l0 zSw`9Ku6kEeI&~9$R9I-|X#SnxDC5!nK%KFj=v`!AMMh&U*?hN2Ux;OG*;v?M{6@tF zwwKjNgF_Y=@%SvJO8vg;e@oOnjCejPB_Ho93;&o+sW=nDj|PbYqph4sTjFYbNF7q7 z;e|ibZ2pAw6zVMv#8{y_2@Rj9w9k4DMqVvXs_GGPaepRF(H+nM0ymdu Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resource_voters_for_existing_contestant/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/msg_GetContestedResourcesRequest_25a3f1603510228a22726e0b4c35bce08c84a0cf72b34f6a408982f7babce2c2.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/msg_GetContestedResourcesRequest_25a3f1603510228a22726e0b4c35bce08c84a0cf72b34f6a408982f7babce2c2.json index 152eb9aa2b623200fb48fc7253b1bb0d17d35438..f95cd41ab5625798f7e8f7a2f0298623b10c26d0 100644 GIT binary patch literal 60248 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 VyWeM;^=E$Y$sesR@{jL-`6unBq=*0j literal 60071 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 Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resources_fields_0760ac4854fc8db803bbcbab8709f390bd31511a05e29cd3f170b48ca6b87584/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_26378250faa97706848b4fee6ed2f2cb0ab194082b611404c4c28b595d5cecdf/msg_GetContestedResourcesRequest_77c7328647f3785936dfb2c48dbcf0ed3b40564b35e3ce17ee02d5b15e9bede1.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_26378250faa97706848b4fee6ed2f2cb0ab194082b611404c4c28b595d5cecdf/msg_GetContestedResourcesRequest_77c7328647f3785936dfb2c48dbcf0ed3b40564b35e3ce17ee02d5b15e9bede1.json index a88d06ea35cf15707a8a5983e3558451d569a8e7..5b702bb92b6b9f169aafd3e6c8f3f0eaaeab4472 100644 GIT binary patch literal 9001 zcmd5>&5oNe5bilofpX@64Q$BXdg!g{3#?WVP1q_@maGU_wOZxfJH~hzm~@0wHpyWl z+w=R)e70fvm<7T7y{Hb`eK~&&K45AVA{@hPy)Wx3U)QVc29}>16{Du(D8z}15;9q4 z-6UIfW3@=hB+_KEAof}lH65!?EumUutRfOcYwB3Xo%xcuQu?72C;~+jS4t7^jXuombHNM*ltE9gBluK^LzmH%yAO=-3hj zijX1*dK0BcML;tmeS)bXbTHGtGVNUu&`KFkq*#q(ObrnPgwvqXPmHwOL?$#b(?Oa& zY1}s*K+-*36%7y$rhULe<$QJBI2R#cekW{{e7STVn#&@8s&s8Lvi>7s8Ehv`Er zvbJE=>cnA^H6j=^ZjHzW!WA&Lo{1=hG$1Pw*#U~s^Vxy*Ohq;^SiymyV{w7`nN+n8!_T&@~7CIF_vGelfmWUbDf0Nv4q2ijC! z=9PEJ-|sfZ8VXyF<3cMz#G8Uvm&FpSyka3Y1Oj;BLWlfzK#>s3D|w-Yj%@9zHS+jE ztHGU1&v``g`8&lgd7&DD2q9kqmyiaE?BHy_1kQ7j!{v9{U=gm#USWT6T%T7c`x0@s z@{>2^3bC+IcUwb&qE6&@0^EeXyu6saKpR2C9gbEq(BZ!db@OLz%+M?OF;;@ZshWam2o43&-8RMT6u(Ci ztcFl|LF84aF|h=Pf`~WeKVu1yy<&|y0laXb!)rb|@@hD;UGn4ruQ~j7K!*r$s&k%~ z7h~BFS9uog{s;1TxW;hai@kzFS3|$k2Ag{)?BzT}$d?t0lMNm6O@yM$VsVGql*wOw zrowes1b~e%Jeb{oQ#b*TQG#e{Tz*%;m<&1Dkl5_YWB0}9GF&_sW+;dzk2QI}gygx% kMu)?2P+ok|0FnFn+g@bw?YL$zXQXmjVj8NHDH5^!i_;vF$~w*+fzvp^hy{dQ?AHZe z+f_`eOGWL7YC|W$iNlb&x-UfTdh~a(%2zPt99vEYVcftoY3=%&r{CC|E}PZ`E}b4> zfv>i}cHQQMxb=c!{yXd7#?x9ME*3p}kiR?fF{1jDQ?uqoMNjF;cne_r{tRLq^VvC3 ztaq^cqB&iLLwY~s0&lEE`wQAhP(FH(()${3&iODI+PivxbZ7Ind;cq!5HD48BRd~` imt^X>ag}iF`NE3Nj)UQvPBD8*O*iK&@Ir=K()tD*y2t(i diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_2dd27fc692c7bf9389f3b48c73a4d2538a4eb72d54c01cc4620b16b06eb31f4c/.gitkeep b/packages/rs-sdk/tests/vectors/contested_resources_fields_2dd27fc692c7bf9389f3b48c73a4d2538a4eb72d54c01cc4620b16b06eb31f4c/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_2dd27fc692c7bf9389f3b48c73a4d2538a4eb72d54c01cc4620b16b06eb31f4c/data_contract-e668c659af66aee1e72c186dde7b5b7e0a1d712a09c40d5721f622bf53c53155.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_2dd27fc692c7bf9389f3b48c73a4d2538a4eb72d54c01cc4620b16b06eb31f4c/data_contract-e668c659af66aee1e72c186dde7b5b7e0a1d712a09c40d5721f622bf53c53155.json deleted file mode 100644 index e67826094c..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resources_fields_2dd27fc692c7bf9389f3b48c73a4d2538a4eb72d54c01cc4620b16b06eb31f4c/data_contract-e668c659af66aee1e72c186dde7b5b7e0a1d712a09c40d5721f622bf53c53155.json +++ /dev/null @@ -1 +0,0 @@ -{"$format_version":"0","id":"GWRSAVFMjXx8HpQFaNJMqBV7MBgMK4br5UESsB4S31Ec","config":{"$format_version":"0","canBeDeleted":false,"readonly":false,"keepsHistory":false,"documentsKeepHistoryContractDefault":false,"documentsMutableContractDefault":true,"documentsCanBeDeletedContractDefault":true,"requiresIdentityEncryptionBoundedKey":null,"requiresIdentityDecryptionBoundedKey":null},"version":1,"ownerId":"4EfA9Jrvv3nnCFdSf7fad59851iiTRZ6Wcu6YVJ4iSeF","schemaDefs":null,"documentSchemas":{"domain":{"type":"object","documentsMutable":false,"canBeDeleted":false,"indices":[{"name":"parentNameAndLabel","properties":[{"normalizedParentDomainName":"asc"},{"normalizedLabel":"asc"}],"unique":true,"contested":{"fieldMatches":[{"field":"normalizedLabel","regexPattern":"^[a-zA-Z01]{3,19}$"}],"resolution":0,"description":"If the normalized label part of this index is less than 20 characters (all alphabet a-z and 0 and 1) then this index is non unique while contest resolution takes place."}},{"name":"dashIdentityId","properties":[{"records.dashUniqueIdentityId":"asc"}],"unique":true},{"name":"dashAlias","properties":[{"records.dashAliasIdentityId":"asc"}]}],"properties":{"label":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]$","minLength":3,"maxLength":63,"position":0,"description":"Domain label. e.g. 'Bob'."},"normalizedLabel":{"type":"string","pattern":"^[a-hj-km-np-z0-9][a-hj-km-np-z0-9-]{0,61}[a-hj-km-np-z0-9]$","maxLength":63,"position":1,"description":"Domain label converted to lowercase for case-insensitive uniqueness validation. \"o\", \"i\" and \"l\" replaced with \"0\" and \"1\" to mitigate homograph attack. e.g. 'b0b'","$comment":"Must be equal to the label in lowercase. \"o\", \"i\" and \"l\" must be replaced with \"0\" and \"1\"."},"parentDomainName":{"type":"string","pattern":"^$|^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]$","minLength":0,"maxLength":63,"position":2,"description":"A full parent domain name. e.g. 'dash'."},"normalizedParentDomainName":{"type":"string","pattern":"^$|^[a-hj-km-np-z0-9][a-hj-km-np-z0-9-\\.]{0,61}[a-hj-km-np-z0-9]$","minLength":0,"maxLength":63,"position":3,"description":"A parent domain name in lowercase for case-insensitive uniqueness validation. \"o\", \"i\" and \"l\" replaced with \"0\" and \"1\" to mitigate homograph attack. e.g. 'dash'","$comment":"Must either be equal to an existing domain or empty to create a top level domain. \"o\", \"i\" and \"l\" must be replaced with \"0\" and \"1\". Only the data contract owner can create top level domains."},"preorderSalt":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":4,"description":"Salt used in the preorder document"},"records":{"type":"object","properties":{"dashUniqueIdentityId":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":0,"contentMediaType":"application/x.dash.dpp.identifier","description":"Identity ID to be used to create the primary name the Identity","$comment":"Must be equal to the document owner"},"dashAliasIdentityId":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":1,"contentMediaType":"application/x.dash.dpp.identifier","description":"Identity ID to be used to create alias names for the Identity","$comment":"Must be equal to the document owner"}},"minProperties":1,"maxProperties":1,"position":5,"additionalProperties":false,"$comment":"Constraint with max and min properties ensure that only one identity record is used - either a `dashUniqueIdentityId` or a `dashAliasIdentityId`"},"subdomainRules":{"type":"object","properties":{"allowSubdomains":{"type":"boolean","description":"This option defines who can create subdomains: true - anyone; false - only the domain owner","$comment":"Only the domain owner is allowed to create subdomains for non top-level domains","position":0}},"position":6,"description":"Subdomain rules allow domain owners to define rules for subdomains","additionalProperties":false,"required":["allowSubdomains"]}},"required":["label","normalizedLabel","normalizedParentDomainName","preorderSalt","records","subdomainRules"],"additionalProperties":false,"$comment":"In order to register a domain you need to create a preorder. The preorder step is needed to prevent man-in-the-middle attacks. normalizedLabel + '.' + normalizedParentDomain must not be longer than 253 chars length as defined by RFC 1035. Domain documents are immutable: modification and deletion are restricted"},"preorder":{"type":"object","documentsMutable":false,"canBeDeleted":true,"indices":[{"name":"saltedHash","properties":[{"saltedDomainHash":"asc"}],"unique":true}],"properties":{"saltedDomainHash":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":0,"description":"Double sha-256 of the concatenation of a 32 byte random salt and a normalized domain name"}},"required":["saltedDomainHash"],"additionalProperties":false,"$comment":"Preorder documents are immutable: modification and deletion are restricted"}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_2dd27fc692c7bf9389f3b48c73a4d2538a4eb72d54c01cc4620b16b06eb31f4c/msg_GetContestedResourcesRequest_e49260f4b2b31f8b6dafa5d51dd06732ed93fe23ffa9b35f6c92d6ef34732aff.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_2dd27fc692c7bf9389f3b48c73a4d2538a4eb72d54c01cc4620b16b06eb31f4c/msg_GetContestedResourcesRequest_e49260f4b2b31f8b6dafa5d51dd06732ed93fe23ffa9b35f6c92d6ef34732aff.json deleted file mode 100644 index 829ff691419d1446d834956db4d7870cfbb84f34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77301 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 OKKrlrm;CeN$NvGOfI__h diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_2dd27fc692c7bf9389f3b48c73a4d2538a4eb72d54c01cc4620b16b06eb31f4c/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_2dd27fc692c7bf9389f3b48c73a4d2538a4eb72d54c01cc4620b16b06eb31f4c/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json deleted file mode 100644 index 22611d5e7e06cb5dcaefe89f102d948cef0899ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242762 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 C{|s^f diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_2dd27fc692c7bf9389f3b48c73a4d2538a4eb72d54c01cc4620b16b06eb31f4c/quorum_pubkey-106-24de77bd1f67e0c3e20a399b6a3e6bfae60312e2f833b302a62be93e181e7a0e.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_2dd27fc692c7bf9389f3b48c73a4d2538a4eb72d54c01cc4620b16b06eb31f4c/quorum_pubkey-106-24de77bd1f67e0c3e20a399b6a3e6bfae60312e2f833b302a62be93e181e7a0e.json deleted file mode 100644 index 37a791a5b2..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resources_fields_2dd27fc692c7bf9389f3b48c73a4d2538a4eb72d54c01cc4620b16b06eb31f4c/quorum_pubkey-106-24de77bd1f67e0c3e20a399b6a3e6bfae60312e2f833b302a62be93e181e7a0e.json +++ /dev/null @@ -1 +0,0 @@ -a245c69b35145a4a4e1ed00b63fc64b6563d4def0cf87be3fe12e49ea6dc6821b2456cd849db635df51f7d466cf7ac6e \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_31d560b1c7927c2052e6d6efe7a00d204f33b4194f3fba7ed0ec5f2387097dac/msg_GetContestedResourcesRequest_219b7c56aec6474f1bb2eb673898fbd24420cbf27187df52fbb489e70b1c898d.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_31d560b1c7927c2052e6d6efe7a00d204f33b4194f3fba7ed0ec5f2387097dac/msg_GetContestedResourcesRequest_219b7c56aec6474f1bb2eb673898fbd24420cbf27187df52fbb489e70b1c898d.json index 83bcc8f6ca89d137e072943802185311dce13432..1cdf75c58b10a030aff81023bc140353bf627f24 100644 GIT binary patch literal 22418 zcmeHP!EPc)5Y5?NfjD!Z2e4spIph}Q2UaVK7&fwm2Mc2>k>!6+LDO%_Jf<`~G|gz` z!>)#@uBunBUf1-@DtW)@_4;qi&CBDu?0@UM%g^17A+F`u!@AsV<`3KZ$A#SfzF)Fi zR*Z%N{BXmu`Z1eUKc=(l+TBgmk71#H+$sN}P|J#utCo%RDs}CKDoau5z{RL?pQ%u; zxUCFMl~Sls&MEJ)3ai)5bRe~UdRHYFsr$uPIgE4_8sAiTxS0wyR=KB>LkE6@RQ<*J z;q_@*Ztu7MJumOe`O{LmCU>9ak7XaL9?Qk@Us#{#8}ax{*8W~D{+$24TvaPyw)2hj ze!u>0zIt80d{RNBhhERAw)c9fFfk1k!@ZuaM~qJOd$)EBU7@a?Qr>ZhQ8$P(Q#^-}h_2z27%W7XDmI!^+py3eA65 zzn0tMo9oSDxw)UeJV^M*@*gq(oUdM%aC+XX-*!^kZeEvrNFVa|$IZvhZ#VD#KQ^2G zx9?8&n&^2t9ym81NROTHxofU-h5T{yXJ@+IEt*URqIS{pWH^|}h1_w2NwL3}?C#5* z-QTicfAerX+%LErOzu9rj0Th2gUS1f*I~_QFrMyBa7!1;D=2*j<3R|1(hC^ zqvLp!#PL-Ce3LcEE*H{7UAuM
    uFSQJvMvPv>N zV)ndv`Q6JIx-)cp1oq#bwedxvVg5`bP|RQ2C`FRR{h}!}@zA9p>t#4;L#H;K_;Z9_ z8?&BR7^l!Iiis~wWpj%p(k*_0D#9X?9udSyw>d&|HL{?nhScelSs*0fWU;`A!i%q} z=o&TYlbJI>wQMEvUe;uKkDQphY@sah;=dq|Vw=Q;?w~}8k0Z=Q6B1P)S+tmQ`4SaT znneax)L=F@JAUQwmR!jtYt8~crfdp+pRK$}6${#qwF=!0DYZjeuo06fHIngl_~WN4 zJn~Rr!?_K*ybpruZt0`jw_0lzRAq1Cz=YfSb$B|%|ZswZpp;;nNOMi ztOZD;ptgX`cFdnCehOaSNpA91)+X17J!cjX%|e=p2ydYo8NY{-X_W~q#*|=ke)1Rf z%IHk@neIIT`|r=%*rQ?oOr1UEPtBb=#Ws)8O}}kDgDAZmND4BD_J}crA8(P{dS+ou z|9IE#^T#Z7II!lD>%0!h{ue%1-oS(xdIOML{EAnjAi)nR1+l>kYYgx8r7|xlB(SL# zN?&hnnm_Q^bjU$-5U@M6fs5rL5 zt8W7&akZTSr77ck^&XMx7RI|}!&W;8pMthCqaxc$waWVD?(go}3dI(B3i8RDqXBY*aZ#5^3)7E8;PXD7@Ngas6bF=-8SF zCxSIn5=Z^Y99ufXA|~%xCRLXVrQFx#;f#_fHV;2tJlo$QKmGpZpm@UL>3M#=%&${^ z_2+zlar5lvI{&(QcGEu@-#*U_|ElNSWaVQ4jF4E6dP7V|!po2rwB5vmI$Y^)u^{yFb+Ab;#Tf0v>%rvnG<~YZF=6BCW6@5rt$ivC!w|ONi4s zxsd9|qh1#+J!wx>xXY=z$SD(EF`v0boTMS;OS(@Or;%)uc=344ke=0!)L-pg7o$nN z7_F- z_0n8s%3`pMM?Ak3Bq>+hAwpQ_`Y0CVr$>yytnMNwq@%frKd-orckNa;lGwmRCrw<{ zp2jLz^@t3R8WrBN3e=X1NkyFmr8T1xxN3$}Q`q1R3pK5$;$n#iJ0i^wxvL0eOBPpA;tAy%huv<$ z>L?w;;5>qyXCwV+w;3O$1gn4YheUt;7aLCbu;{Wq@-qEw_hC^|t-k-XK2MkJe!tVN Rf9DT=^IP+W{Ojvq{s+Yhk>mgX literal 78702 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_26832b1a90d093f54c3a5eae4903549f6e73f467779e83ef5729423f6ae43ac5.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_26832b1a90d093f54c3a5eae4903549f6e73f467779e83ef5729423f6ae43ac5.json new file mode 100644 index 0000000000000000000000000000000000000000..bda5419540eed3d6509f7df7a99793109452e234 GIT binary patch literal 60202 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­=(aC;Y>5M@@wXjdfLxI)y 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 R{l*V|^{x3P|M>Qo{{~F@j&=Y5 literal 78686 zcmeI*-ELjSkpObEHQU;A7maNFa$s5~7Z2aOxPEwlcz(6{=Ing)&GXIr^Ye|_`NiSE z>~d?hd4D+D>~em-een6k!}9CRqYmfaKK$aa3FUnAsKa5i`f~HwtD_>&>GsH+#RhS`ql}x2>MNe*5af54U&kU%vm_kGC)HZhp88 zYWe98H*fBq-CMo6dwu)A_rLw|=3Q3&DYpN4_xg`Ff4Tks!Sbi~H}8V|V*m5a_aAP5 z`iKP&d^kBdY+ye**#wqfoozCFavzT3OkpLp{S{qXkY{maGG z82NTB4*fnx zm#0@RYWMM??b6Hq{!3Q(wxRvl=G)Vxv`OxN4$F5FPk4Av+^oBG^Q@uN?Qb8P=(Da) zy##mLRb_u_g(yn1*}QdFO=POlD4RNnWMj3sq>EskED z_b0V{EP;nZy^Yn9#q7R%-fxq%Ixs`AZur<%OY%QOrs!)+Vc{C*7Q zg7e~M%522^S;ib9_5akvhTnZ!Hx0N9DPcCm{9FxvOvR5g+4SZ2j~CZJJfuZ&564>D zW$FsW7Oa2RBAWi$$XBh{>{He>+}~tm^Q%vdlh%M6X3Z}tALaR_bGR%^2ElDf0(maG zJX)`tyscS!v1tnCW zf=YUQ5-uU7tjaFIy`aY{3MAWJ(HrT_WOEo@Wc$?R9K z?A)Q0TBzzP9D+#Gl`;`R4t*ni=l~!Du1m=kEy*PqMUiPipD&H0iOm)|DajTiO9g%U zC|9qv15(p>F{FVi6-RZt#!Dd#?#bw~?jrQ-k{z>m1c68!`k|zk9#6SN0*_0!Mbty! zP+6`^T0~l>q613uN+mr%_EHh$YU++yk>>|x8Efm3prBc56k!pTLst>j83i#4b4f%- z+ipF_cx#VSO_vBU>J>G(h@?PPeA`Khf%H#*>G6!YCF&q+*pFcOtD6|X)24cu{u~&qVjwK4hM{KBOOh8LBx z5}J?|HBD@~hHjBW3H>;+yL2G!W?s#Tf<~Q?b%~!-RAXBd;#J2;v5#^4xRhR(>=+JH z8bYe!*gWDIb?vo(B?KX1Lx|w)*hSzd7NR-zD!f%JvPAS;)4PX+$f#~1@HMe|D2uX5 ziy2wcCB;ri#r8s{a!KshqEL-WVik)xMkl7sU3m#Z8jJSIY=QR!V}_hp!rI3x(U1nB z1Ku*66DZw6sM0`^D_=s@(bz*RDX5XIc|^W~Jvn2>$&V^O_EzQUy#FB&@rP)j@-pvs z2=j!-3aFMwv|3cOWiCy#_Nwhs9^vqgEn4F^BaK}YYmOaDpd};lHSnl3rS~iJnuH)l zRF&Ala~d#`Seao;kMwccB0%UCAuUy()1wT*<3^V#33rf65N~3IQ8msbzre93O1v6N zj3i@n6VSU0Qn5>La+_~?Rhwi<6P1EeQYA|Q`f!Zc9+yZwn^n>Cmk#uSS31n2q^hZA}ZOSc5LCZl)6&u;0A0;YFx=I>T zj7`&$s9-S<#6rS(`}(igrF~1t-6CGelG;lh)jn{`eMOhVUP&b+FFgdfI77X@A>^el z1rAD77%LM;#UFC1>0P{< zFOV(?6-7q6Bvh0o1)cO3yG#=$iERj>x`Z$iManj6HVfzBXqI+S*BlGtT7yf*<^yTe z6u2@f@KG;I$il!C?&(HD!IE)^t=uk!klXXf=E?f-)|w=LRDn@CTZjUzTL``tG29}% z@RIBzZKy=eK~><^K)OYmsg!eBhQJ2JC2h{i`g1Mu)v}OhOrZ?%5 z8L|i_W4H_FDpVAz>_L#kB(s4qM6;^Z)LDh<0 zOL_hZhvqh0$Vk(=Bi<&lc}XB8l|<3!NA@L(<_fEOzLeCHIzw$s+mKY~o*wFLrL`ko zHAR^cr9#UhQGjl7Jk!k|g;I2gU_lo|MqN{Bj8Zazic2aTiCxu0EL$jb}|m7^Dz@m0vTD!KJ_9l)gP_OxFjQAfaq{S zQTRD)z&&3S^(wLB7_cW-(tX-JBgK@f7!%^b!d&)T}D8Uu~t({38_9`N(|g0I8@zr z{&)nQ7PsAriezPbTR7}$0P9M|I<+WQGlQ>oaa-c7m-oQwQb4hI|{8|r{$%_ zdi9657V8#*!Wsz0F2+U)5h6}LAvJF-*%;Y2eS2#C%)vnj!}^~ZmojO~!g` zc1iR~_*TbaFR|2knL|h=+A-yjH8Mu>WeijVRoDXrX}jhp+>i;R2Ol}z50njJiMJF| zuIeE=kO}1mt5pix{xtAlr$w4raAqz&P{uR5kYml5l4`mK5xq;-1dH)@l}g|5V%jOt zNGFv7F1;|E1a0YDRC?_xdC4wic4#%deY1rG@#0T}{iV$gHQ&6hX z_z6o~vS~0R!3*A|SCnudXf-9zUlXg12@~6>LlT;__a&C9BTScq3i z5yP!l5ZZ1sRuOPZ)Rd^IL8?#2n37h#^1j(!q^UIuos_Z#YEBuVGe!i2s2h?zB^*tZ z9=MR_-2zFndi6A2I}d-Vc>q~z$O;V_ql)D3VA$|Gji+J)iq+Qu>nrf#D{L{X3EaMS zbTOSMq*-(V37=_;7*lge$Ps6mX)7$_H4Q|!!1MdMWO|FjDyh%<957ZKc1>?`imjUZ7pV<;)zg|u{O`pw(4V>Q-YcHlVe4@qd9*HQNW zY%K*uFn60i5ceYT+bgIGJ4zCzNl#WKdG+(;0EKj7g8%21sBf}!&YsO?r zYedR?&HGq8Pss zS2*xwSFa@e?ve};Z*hyBAn5raAw{ip+5tpLk6cYrHGPJ%BnqFh}Zn%HA0;iU1~X#{SaiK#2SSJ-p(bgSVfOej?PFF z-6Fan&9Q+84hnqf@)UccNdJ;_)v;t)aPJbT>+n`?jrx52m~upsucl6jV0V!~cJQP? zP!yqJ$`*MQdu4BV<*`3093=?_uH(nZtyEJHU&H|dUsRL|P=&g@l>#Sjka4*kWhQan zai{v!Taf=@oz8O8CsWgk2!(h;FddDz7ahlJ9J8^_!1n!-8^>&HGq8Pc`b>kOPl+_c zbnKx+LF{$1%9)F{h%t5Qap01Xvi*0wq-A$x634OyO<5g`B~g7o=4!Y^<9CKVUa5rYFi^}Su(sbES6z_ zNg}z*!!~FzXV4eizZONh&@$bN<*S3$#;GH0kTFwNOFer z#ElX|^7%X2LdvHUO*zcBEirCB=bs!h)59f9qRr8Gd*yP>#xWb)3~b*Yx$$q64bx{8 ze>s_wCo%3zCZ*cTX#$Dkv6j*6@_@Ro;7eu{IPgr zPnUk9P6>i6Szhy_>>4`>$no~|i?x%KR$vjhu9CJw^Nig&|{tpj|RWg1?gmpVvzz; z7X&_TD~n_EUg;Li>W;v3112)kEvTP{y83*nzN!K8yc$K-m**=tB!s3^Q>6aSU$Wsm zR_Dc;*f*J?05#4o)TYN0b!_-HpQ~NB$5cLh(nVZ7-tK-fRZ_7ZjsLAKxQ=ii;ofFo z`~G*&4V_Y8*3FbC{hd7Nyr;*~*yEw2gQ!e>HKtCz93Lo4V{q!%>5-;`7LL2?lIbma zu8~Cb`IxKWlIE(8$x)&t41x$EP0IlAOE*Xj^Bx@5;KdX`A|-9q44W5+wUj+zv^dX?v6 zzf-CYYR%834Ov_&+?dspP_Rn~T_R$*YJxCoESXOfm0lixchQC?(gszcE{zik zIhILAL~_p-iCvjSs*>&|_6=cIr=CZ=@WmxbY=uRp%0?kV6#Kr&CDg7;kkm!9G+ETk zOx}4Cj%Ws=_QQSC_m)82J9n$)+Wb+v_^9ZvT(E0wz7sl=&t2@ARf*)MfW6;q<& zU0sWq)Nu#*@$g;s@}g|)s4gu6REvU6fBympjrx<=C6ERlWhJj7-l8rex4NXOWIQh% zuHRZ#Yb;cWNf+5`4F+zh!I4-(JWCi3EZa^5%3D2F`r&}}ZP5hEZEIEN(S z{^3cUzXJ{ey@*r6Cbvs^fh3+=!%qB9a>@-<&W0>>>Mqe|S<)F#=+rGl4Qd|-ic4#* zMA^C|TSy>{LS(8~h=8ntORl=ba@hbR-;vwY1@SN;P-6YC++1ljC2)zNSgUd-QOesO zNQeh+vd{AqHNk%C_ zJn6b0JUt(u4E6FY7jNT}q5s>5M6FmELGvHe$R4kC>i-Vnh2GjQ zgc3zT%B@jEG=$h)k|X-(OZD}Avr0tTV7sF3)q0$Zy|J9xEpZ}GHLwf9ao8oyI i*ydxR1{uG91;j*g!Fa{cc8o3}U5{&e(fzU>cAZr|s-S8s1Vyt{h! z;pLmx`SEwlk}f+vJ2}4n=5TVp`R4M)-8U~T@7^DtUu?cPIo*8oe6#=bbhGUA>~Od2 ze7kD%{&2Ffa(cQw`1I^<`{m}S!|Atozc_3{Io%v}IBa&GZ;surx!fMKS^whsoq@B> z&ri=c8_u>-Z2fz&*>Sks9Cg02{o-Op;QP;}p1pqi>f=w>Hy>Vp`1{Y-FK@1Xx(;gj z=}%X0Zl2w)dUNyo`fsc{uj>xNICm#5@D-h9Y! zFK(0e?CrbP*Y93ly?>SX-`xD)=dHI}et!4%mm>Y)-N$j>r=0rfn@`{T*EhdD`^#US z{pq_yDj_^SJ6&Gq$A`dmI636szQ4%(d>#6I7M&koyy&|7o3>le^ZP$qb-OmDIm~=} z9N0^Q{&QHqn>gX_oVZzc>*h&AsoUS)InlE&j^ozF^212QU9{tn?SIdYFXPt|?l|}I zV);oj53>-;XX9P#k}$ zkP>D?%rDi@eJbA1WYd@5KU`eDIiy8#3&&d9W$FsW7OdZxNZ3)-R>A!(t=b1wWxFLsFF>qb z{Q>hghY#qBMXbn{TA?UXsIh{%sud;4!K~D)=N`L;AFl+&cx45fY89TZh|88@kr$Fg zqiEpMnlP}NUtj-I;G~41pSTngEpWM_sxSa0yvL=weFIC~XO$CKku%PVlgjj^6Iyj~Fs$tr4oQ;JcvqIFAhi*OeU zEYXk{XjGg7-j$%iu&v&s=7lic)fooi`Kzh_G>>VZT4)|0>!zf`$qY#oe@Z?H5 zRN;xs;_VeB28DyL#@VCUjB~6C+Cnefla_ue1YF(|0kXfhrY8b-Kn&Aq?)x=(1W7 z`gO~W**k(jqz(O0(o2uWG?BpLl9`Bl2plTQbxDgz>r`|=NnWX>^Rr$mqFhbg5i4?j zP?oW_E(r>nrA84JVL5acVVzMBqcE35WVG$pbBwp^ajNMSAx6ET1{aYO$m&l-PZGOE zy~7IK6mUeTS7}~S+66)?qF7`-Zs{$Iyc+63ny)<~iHc?lwHk$JVBv^tk}{9L#Yz$1 zLHOJ##j(bs1ro0a!5v*G=^_LZwMKyhXAzegum6kwki_kPBQ&jovT_*Z+K>&01+TUPy}^wwILs7lgqx2sY5+(HG#O~68w3~S~D+(HQ zLe?#QPf?9+QHWO^BV~OSw~tHdb<2+7Fr^`+8jj5)u2FZr_OFB>By0!~oE=sKj$$F2 zQ?J5X#Ufio&o#Y!NQjK834yPP)k|5FOLMmP_bSjr*{aO^NQAw;~5y$Ap zl({P}VMt@qUKtbkd|=Fw^GewD@k%tLf#`s@4Ce$&O$b#QNOI*{s5%;Zs3iq8(lw9B zS6ENZ*y7|zl^=Vna&_MSkcap~G*Ee&cRPf6#Kj7zmPWK%RJ3I-O|$D&+oL?f;TK7)h+mFr`QOIGG3#Y9gei>T`OO zA$Z;B7A4^hQVHTstT3vJ^N?TQSQ8~)jV(r!F}VrowSrXa7M$GXTVB;BS<*zMpp;a} zl7K!OBeusS63-?U+h4Z`+*wSCs{e~ugdn-p^94Jt)`ZZkN|x#pYQk!T>LQX(Eg*r6 z>X`oMr=?A~MJZ@GXsKc&8}y?@WlMKSW6EOFv?MB6%mcBIaDILLSM1WhCFGijSF)w+ zrH;BjaLeu2tzchT1}l* zs4nnPMj;lic0IP3m3u@aSxo%t;)EcSAW9cs$)|Zjl@d=R%)%7%pw_7nt^6TMW3#Ra z*ZBq_=~}G_QJdjKhhcmgpb+kO4XjHNMFMZGcFZ=K-Vyus&{dZtQAIE&q*_Pp2A?FV z=f^8)(`^uvSOTuj_y>jNf2v!@QOeIkZ$h~mjuoNY>&PcjtUyqrLJZ+vU6RR1J4Lff zM8(>y=2Kf4#E_6VpX84>Uu|Ivm_3yNgQ%_>esELf{cF+t@c<;ms0aF6;(d#=!_ zijj&|9ZQy^B1X4jDNFbyO<9kzH(dnx4z-l?S2#4cF(D&O>yCJv#O5V|lvEN$&yVa& z6wMV@_k1a-Cv}F}mbM|O&^sMWO&T@pPw~zY3-35W#{jh>W_X z(io*=0u`53Iug68hdlIX;F75NANGo|n|v|2Gm=6|Z2dP=Sal%Iv(6hh9|iYUs$ zy=t07QC0*9O4N=iMVfU)z&fd{SFM=$gqToFiM(JYKFP^TzlmAac z?MDHEx^T{?MlT|xlxy3P(RUPD|2r)&U96A(@TtXWLQq%(q1a`yQ9^`>lTS#^FP3bK zY@5D4wtnW~AcSH4PmN2NwB=z-%J~U_uDab4y%N6Fv88v8uZIKSgrmJbJx4VfC>d6%$(!{2qRHg9~mbhfoU`T=wc$;2P!hxXGl$^gNRvQy0 zwo!*9G->ZkELBIMAeXS~wZM~Daw!EHp39Sg=2mYpi@p)522W^<#@;|ga#=t`10hnv zR}`$Z|2RH#>JlS`=^dfyOEC^YS|Aj{s6@f5A*2#z%PQ~Wn44&mlH6u7aW5g;`C}{* zde@%_BW;P8P-4>#uyyim9Dm5A2z9U!uaY8$TOUDayUAEZz%5ZzqN)a|J{e<5TJ_5N zX01q5YZN*u#RO_j8KN^r1cay?k~}6HO_W}^kmoglBw4+BoUWb2A8Q^!mKw4`gT|;L z`5!QB_%n^iVgicQ*8uA)@Zl?%nAQYt-#faPP88BCI)Q}GWFm{Hxg_L>v&^&=mhqYf zq9*YEzHXT|(dS^2sGg6x8ZK$B>X_(uM=33$@I=(6lQ7LWMB0oi0t9&y2$CG#5`Sn* z*UPi|wN43wWdNqJd5xX02+$tLd_$ze*YY9aWtt-YL%c9#S~OOd5V-Cl!6ZQ@tw4O& zc!@$;EdGz=Sh=OgNz^e>5fIesRf<}y3>{W0Bg69yT&)nD5({3YhLw4*c4jy@N+5y5 zs(Z{TA_yxSq6sS^)WRa>s5}YWY9!}N8SZIe*!4=1P!VV5RxTpAqu5v6ryD_{XvR=d zYK63PY5L9Ev}0YYR(9Yx?GH(4o!3$J-|`Ve=@Dg9;O4WMp-2ul=@=J^d1pqjqBet~ z#ErHv8U^E(tglOtoYg9Z^t-y0%OEL6%0W6&O=zb`V!d(4kcn7iU#71HqR+h%i<(eI z=|@OePyI2B61b_84iPhd^z*53DIo~ZMOi9hMNQPHA=CO4ouIaIRk@U+6Rc|mx9kXf zzNlHs0<;W%J)hR6`~~IabD=AQJfu=lOW?|l7!oxbfe>kvTk@)KkW1mJ=s@9!OE`fy za8Zx0&r5h!$58gyQk8UN%le`@EwN~l!$uLeE?zRgWulx%)h&)YNN{`fXL@ir} zSBAxMkztZZu5vgtO8?|(N7oJAJRlA<9AMt9lXb4nC+PmrSut;b4>DkiA5Ppg$l*6aRXQ#)vucvI>rXp{ivhkFS zZ3edQpSZEjhUqg+0ug_j^QBXCQj*E1V*rhad8$MHWU(YCiyH#Dl=*YlZHov`!(mfI zlgV-q(nQ4sVcpz@dpL*|4y0?nlJM(TGC;gV6Ahfs*Ql|#)*l5TrKdn-i&!ZNdC3!` zfgLx;FU^YMQcrUEIK1m)I>x;`e_3X92EE{YKgs3_#>BQSOl%HP+f<&`eZnd{xrQw z6oH82O%Go{Bw1FT6bOo9VY~9G%8cnPuLQ(VBakb1DY>%1b^I8)l>%(ki#R~wi;7YK zs!%I$2h|}2N|8Q|9GWJLul}boQKSF2^lAV>B)6zj5t3M1T<52s^p?`%35EHzc>56M zDH~7O*k)k+{)rn;+1O@a``+|f#b0km^POdkWOQN478+@mkN2 z!Zne5fecRTmU%cbvd6A$OvdgASSDiCnZ3g59}@w3+<`2=XKlBssbz z{?L}Lm&dAstoLz(AX}E#{3yG|PFMtJ4`kjYI(#i3y6orC7Wp6INrPBjLg2cK1XFa+ zv?BP5^YuL3-XTZxI-K*xr7YF~Ae5jjEwp$=q7>E%YGvIH;z=#^{2iYm#)LYyqzgm< za~pr6#*APDR?`(jLd80kSfsQYMR>9!!y@Br#$-!tM9RD-c2r{0C7?82`#{lHP$KG8 zObCuu6^y;?5)kW^j%v$L!L*kqTd!z63hCjY|L5A}WQC?@9nSLgJYR==_4~X(xjeqS z$Uo=Dm;KFndlvG)=pQ0pX5~W;jN5D3vZM9`D0QOIypaFJNUU^yq!N*06Nz28JGG^>D!YPKr+HkvUUH-dv^ON;h27D_hzM#jDh{lB6Wm86Z~LRPO$WefwTZ+ng8ib|tYA200!dP7PVpbj_+ zN)lDXLtTO+)r88B^NWb4i?$>RNpBgIzN}kfMZ~1-Lvp+Fil`fs2;vF6%0szbaz&sQ zarCN)kXN2t!%qBP>j;&zAq$;q1)o4y|AkI9fsBm_jv{p=%2uzEC<&xdh)fMZnAfPf zl)xodHL*Nwn76Vgx2X%_VM3t9`enJf(rQX>C5mF57X^|;Y4rs`LOgKO`kcS$GcW{i zmn9)KzQUJ+%_FRTGpX$O3xYy-RN)#E3r`4yCn=3MAr4x3?dCO z8rG}GqLg~K=#V5XkuyP|x-&hX4;1FtH&W^MZF{sHAM4cr9mK=we?Sab3JOwgJwKu$ z#O{_vA?4F8J31w{rPYd8kcJ=Gq|$C(|BE}{KmL=3LoA*4FC9+Pz&0NfHOTn=hxK_l WZM*xzr&wS3#l0V`-{ha~Km9*9J0Oby diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_3df76526b556901d24900733a8fbd232dcd96dc9a5c1a50dca162467fc9a8757.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_3df76526b556901d24900733a8fbd232dcd96dc9a5c1a50dca162467fc9a8757.json deleted file mode 100644 index 5256bddec57ebca846c4130e2800ae8751af850e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71528 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_4135759e5ad1ee131eb82fb9c0b66c773b6b6433a3502423706160e543a24f13.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_4135759e5ad1ee131eb82fb9c0b66c773b6b6433a3502423706160e543a24f13.json new file mode 100644 index 0000000000000000000000000000000000000000..d3f3f844881320bbcfb37a26359fac09027d69f2 GIT binary patch literal 56708 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

    gGbV5y)*Z6b> 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 literal 78925 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_5878e49ba83fdab3110c674b3ffa4d5675d8b383091c3b9bff1366f82a3aa07b.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_5878e49ba83fdab3110c674b3ffa4d5675d8b383091c3b9bff1366f82a3aa07b.json new file mode 100644 index 0000000000000000000000000000000000000000..2b55bd20ab8988642ea70bef88b09419c5d37d55 GIT binary patch literal 79223 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 IU*CTCZ|q33egFUf literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_5ebeb7c01fffe047c9a91d9b3086ab5e43d4fb9c927bcab551e0c65be65c95c1.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_5ebeb7c01fffe047c9a91d9b3086ab5e43d4fb9c927bcab551e0c65be65c95c1.json new file mode 100644 index 0000000000000000000000000000000000000000..6e39af906ed1c52660a191248c500734841b1ebb GIT binary patch literal 71476 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 VPk;X5>vw+f)nDyDDAl2_wR0A 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_6c085c067c576e2a1457a8e78370f9bf0a059ad2788d4630751cfb714a5a9762.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_6c085c067c576e2a1457a8e78370f9bf0a059ad2788d4630751cfb714a5a9762.json new file mode 100644 index 0000000000000000000000000000000000000000..6d4e77dc222153833e44350da70c848646139d85 GIT binary patch literal 64087 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_74477b940a401b9daa770791ce4ffaf2f0b3d1a7ca2598153024a58bdea3b343.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_74477b940a401b9daa770791ce4ffaf2f0b3d1a7ca2598153024a58bdea3b343.json deleted file mode 100644 index 4128fc438ea03300e81d998d594dc842a3095b16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67668 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 GhkpXXA0-F? diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_774f59e620022defe8cede5a337b235f0c1d8085680124a1ddf9d72502e1835b.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_774f59e620022defe8cede5a337b235f0c1d8085680124a1ddf9d72502e1835b.json new file mode 100644 index 0000000000000000000000000000000000000000..4843ae677364da89744f4d53b2a1dfca603bfe9d GIT binary patch literal 71925 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_8c2e50a4e3c6b6bcce52453520e5d377ddbe6cbdccdff3bb18a89ec8aee7fcec.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_8c2e50a4e3c6b6bcce52453520e5d377ddbe6cbdccdff3bb18a89ec8aee7fcec.json index 73ddbafda853dff3bdabe67a715aabd0f01ed159..111b9257916933b35152e2cbdadad3d61af8fcd2 100644 GIT binary patch literal 71951 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 UXZf3t-}%K?KbkM{&-b7I7cx=)d;kCd literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_91ed87367df512745f96a66d3309cf6980b6b126a73dd990b05887c3ec391b0a.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_91ed87367df512745f96a66d3309cf6980b6b126a73dd990b05887c3ec391b0a.json new file mode 100644 index 0000000000000000000000000000000000000000..853bcea5bc17e78dc1f235854b423c7878c52ba1 GIT binary patch literal 67979 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 MezpFPzrOqUcW4B+=Kufz diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_93bdcf7c3ac1449bec170265ec2d0f212d0c7bd0a93adca53f17ab079b6315f9.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_93bdcf7c3ac1449bec170265ec2d0f212d0c7bd0a93adca53f17ab079b6315f9.json deleted file mode 100644 index 21a882da9564a2231e7b6d85b6bce98e11f7d3a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75420 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_987947aa731c95dbdc29a33ebdfbbee90d7e9017625eb6d18104fda4b8ae43b2.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_987947aa731c95dbdc29a33ebdfbbee90d7e9017625eb6d18104fda4b8ae43b2.json deleted file mode 100644 index ed0cd41c1932607cf44ba8a47666ac5e968d948e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74951 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 L`9uEo!~6dO79xjB diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_a4cecc3159e93091689acd02e9b10aa19eaf0c52fbcfada86b8600e9c659753a.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_a4cecc3159e93091689acd02e9b10aa19eaf0c52fbcfada86b8600e9c659753a.json new file mode 100644 index 0000000000000000000000000000000000000000..520388ac9b709fe1bb0797c3e12eb1ee55365aaa GIT binary patch literal 60055 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 H{l|X;VG@F1 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_a6a78257a69728aadbce86460a8b01abd3b8c51d22d1933ed9c346335f99840c.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_a6a78257a69728aadbce86460a8b01abd3b8c51d22d1933ed9c346335f99840c.json deleted file mode 100644 index 0519966a559e13933e10edc793a455e5b882d611..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71475 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 Y!{M~;?knG7edU9DzgpkquOB}BFY7S$^#A|> diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_a955bc7d4f7d9e784d03f3bc335166a7918ca820c560724a79dea163f261bd7f.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_a955bc7d4f7d9e784d03f3bc335166a7918ca820c560724a79dea163f261bd7f.json deleted file mode 100644 index ecd88b55d0a371175cbf6941f399c4f68f5d1263..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75004 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_c59f992288b7c02e30f0cd1ecfa39670997ba13d99baa2a98650a464ff1e0a65.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_c59f992288b7c02e30f0cd1ecfa39670997ba13d99baa2a98650a464ff1e0a65.json deleted file mode 100644 index 32a6e1298efd23a078cc32b94ef630950471bc3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63942 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 DQ{`vm literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_cbbacbd6178e4420c11ccd741ce6cd86056004f8f9f6ff7a8277d1f4da5ebca4.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_cbbacbd6178e4420c11ccd741ce6cd86056004f8f9f6ff7a8277d1f4da5ebca4.json deleted file mode 100644 index 05f1e9e47d3ce2a53723ee18c72064de04ac2461..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60037 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 Uec@BAFZ|$>Z>?YCj~_n#9qz(#`~Uy| diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_f3cacf6ef5a1f01d07c3cb41c1b46b1a606a8ccb267440005793b49521c7849b.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_f3cacf6ef5a1f01d07c3cb41c1b46b1a606a8ccb267440005793b49521c7849b.json new file mode 100644 index 0000000000000000000000000000000000000000..95b52536f6bca649691f0859336bd6c644182bf7 GIT binary patch literal 63564 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 a=i#*7uYV8XH?QCM!Gk}V-{iONKm8N7!y7^X literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_f775b2ae054095c7a37ae4ccc861d08723ac43c9d75dfae1ceead2d3b7c4977c.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_f775b2ae054095c7a37ae4ccc861d08723ac43c9d75dfae1ceead2d3b7c4977c.json deleted file mode 100644 index 291c3a748cc585a97c27269990c151b27df28c08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63609 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 EH_Jg2EdT%j literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index d438f5cdd3c70a33082da0d6fb21c942f97f77c8..e64b73d8a77bdd2ae7413c918f513e44a6315072 100644 GIT binary patch delta 2865 zcmY*bYiu0V71lg<7H?!{gQ0d}XJZFHSTnP8XJ#LMZR}(n2goKiL~Wo-$W|y&Dj_ye zTO1M;qg0@zO0axVA0m`?`>QP~5E0Y@5{ZGJl!nMbNTyLBwxCo%aWPFQRSl|p&b_-a z{k1bY_s%`%d!6~$@#^tcs!vSm)yXb9CG1qnPWg5Kzuw*q|IvS_WkCF@4GtPHfFrH& zj?uY1m640mye<{kd`lOiyr;)JZ+W~RfH%T*cw)0*o{WbkG$`zFp?KJYV%~=0LIzeP zZHTs*@TUeBhrg?t5c|Y|XvD?414E3T2}3UD;HsB3A1Brsf|qI@?5cI)LahatTo+?$ z`uoEc`3U~L+SOBOSetX<$gKjOp4MG#x>2{_gB1bHt@e0t&d2@h4IiGVNkeGBgNHp= zR%Rio~3*cy@dblTRL!mp2udXp{oY|&%B8Ufs5B3A&pOaOPq16+Dp7t|7bL?AF7$Jzp%_YD`1 zOzUB|Cm~6~ExhIZPXnC$f#%?trwKTo7g+2vLeLcV@RkADT^RanZEz2GF#3?M4lFJN zaLNkfwiMyl(?N$Rq&#SPNbu5u|J}R@lun2SSesS62PA9y)gE$$^GQ3U4D&)H@_n}!}(gxh5ok^q#s`r1jTz? z7{0-TealsoTnt9n5Ou>F3G&IDA+$8UkuyB}piM~-SSyTSzK>Y^9(B#_?C+!{TQ*Vk z6=vj`Ydr)?MOZleqLv1|P2glbU7T_h$(AjkeBjE`+FP24Q=S+!TGm zWao6?<=-kckouivyVYgOD1>n#)uqpEA6LWVY}a-4zc9c;ZHS2jS{)E;yS~})&VM->!Um7hs@6RVSH{a z38zw2(=#MuZtX8C1k;MMx092&uIjCX`o2zT_P$#M{JY)d0D#8qqQ`Vfk7GSzJ z4SV9RT2hv}A|r*Oj6g4|gv@oHojXLLg64t`vmF8+kNIT@UVk~mOo--)0p8!Wgkp0+ zTEc>%SVHMo1*yXh2*K;&1T~U^e3gJl1_hkENwAGbZ3BugC2}S*1lYjZNlH;jz2L5P z0<-U`2d6Cy&b14ee~hwe14)pz_V$+&OCs=zUY`u+9vI0!HImi-IFi-v&!O;j0B?Tj zL2<^{Q%QVc8-*A*R-&M0XD)q|)V0%usTy0E<7~GwHDxRg-A$7n5$8#(AkB9zB#4U_atDf+zb;rZR9W6nT5C7`)#H7-pW zKZBQ-37oz{PbvXFaZL{tH_@EZ-199og~$~YtGH>SvKpIRg#)D?wN6^8G=_h($yY0T z1I|D;I*no_1-zK2n53)};NC2ELurtNQV~LFp*f(Rf+)6Kw}xiyQ29ABtPamCLD7Y8@?}<{$43^pyOrppTd|%=a++G_U7K z)hk?1H4`U)NAr?}h{GAfp-&WC`<0%Q39iT%%p)HzRQUDN!8C1^d#2X7*he9avxoHz z4y~svLiBp6HfL5^2FRg08a3l44E^4Q#@_qY_?Y~LrYpPfVn)5MnM~IfkgCbrVf;l0 zSw`9Ku6kEeI&~9$R9I-|X#SnxDC5!nK%KFj=v`!AMMh&U*?hN2Ux;OG*;v?M{6@tF zwwKjNgF_Y=@%SvJO8vg;e@oOnjCejPB_Ho93;&o+sW=nDj|PbYqph4sTjFYbNF7q7 z;e|ibZ2pAw6zVMv#8{y_2@Rj9w9k4DMqVvXs_GGPaepRF(H+nM0ymdu Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__1dcc38056f4539944947f843fc5f119ce3058e09a215dcdfdd563c9aca6fc4d3/msg_GetContestedResourceVoteStateRequest_cf751de542a527e565d916c33542a952aa4f09be27ca526b34c4a2d6f7ec3f76.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__1dcc38056f4539944947f843fc5f119ce3058e09a215dcdfdd563c9aca6fc4d3/msg_GetContestedResourceVoteStateRequest_cf751de542a527e565d916c33542a952aa4f09be27ca526b34c4a2d6f7ec3f76.json index 464dbbe3d1ccaa055a2bf606ef0105618e358dc9..2525a12580ff7b13fafd396c5a57c6a19942f239 100644 GIT binary patch literal 12756 zcmeHN!EWO=5bZf%5%{cwDO<6T9d0J-AIaQ5jpR;4Rz^Y?;$o~QQlGSAKC$0UxJp7S;%ZvWXx2!njuWkJ=k?Q>Q zRMW=xdC=RwlW(@gu57Mv%$ z@$$T26D6DfnyjMase`O7S#@hx(RzD^XmEDhLN*X)$lQ8nP(n0_6+w0Y2%ZNA)-#7J zF`B_ZS!45}#bX#+-H0J+MO2wpCn=}l9Cn!wrQGQwA@0X!q053yd+BgL79u}33y>eP z2GMCiMdZ12b4Rsbce#eoIH9hp0nRj#%A;F)xzl3XV>G}T7fXYnkK#~v?=7*AAju*b zPKzal8pCi}EGe(sDcwh$H9+{H$Yw)}N*aKqP=Ka6oHLff&?_(WhH?UU zD?8v;fb8p-Lr_DKhgI(~iAKU;q(j8=l2@Sthmt%XuUKQOWGpbe4*hy@wBH#alpXN4 z0VFj~A>-U&gGG*lD70X)9+yL@zK8^e|pqr^XY_hxZpR!d6%ggVy zfe3SU@AU@oBd@4229h*jWe0;77}-&A literal 4758 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 YYtx~BFFy~+gp{X)biIg8l0AL=2izsGYXATM literal 4870 zcmbVP!ET#C5bfDtfqdrRT_DD}_0U_@ABZAEY*L{Rh%j~=MgI3bSo4_f+88Xw(XjJo z=FOW~oO~@jZ+Xn>eO{HzNAC-d?ZJvRp0-ul)akZK@*R$!I!FuC!OG`@T7}|a6AusZ zX0X*d5)Uga9@ZjWYXQ@N8epMB30tj16|H4r9Sq?ckxJ=@!J$MeTBK4+M28}+#B5|D zfsfZifk2$=Py__B3&}4Q5o#k+g`##GohR_zms;+s?cqHuo22>t$dWRB&oDKdzNdM) zBq}d=* z)Q5~p08%$e+O9V=$Y1lUMy}TixbjdG#BHlX+1Q64b#-j@Z8LU!PxyUWoEF~}U&|kL zy?lI9SU?Op4t=FUAMGnFTidr%8XtvE>w0KGQS4&{FyLtAM=)@r{784k+K<+)0q^<8 z*s&kthc>)2D)6I+?j-1<;L?4tTj%R zG|X^Wg5fY`wPWR(NVQ*y^NwAl!7-7K+cI4=MleihVWg^7o{8=Bstyx0B`}L_QL#K@ z`_qSC-Hlm8kzlJ+xLAuWQbn`aOi;yjlPfy03nLxD7iUU&tyv(7G^~vxXK64GyI?}P zXfQJyWE5T3#>94DSh8H?LmDi>6T`>NgA?;kph4+ouHW!V8L58l{ez-pcyk1xYGEc) zonC@`s0Iv6%!wFAS+amLU%Ae=!riOq z?!1eUCwI{p{$?W|j*?W-n*6qsMQ4rj+KW-%6jr~l9lmWw+POwU_GQsD?sOby; Uw|0HuwT7<=jBFG5N=MJ9e{xT>hX4Qo diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/msg_GetContestedResourceVoteStateRequest_71f48f72373e5db9721e095e8cdc12823a7175b930f49aebb8d9844065da5b44.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/msg_GetContestedResourceVoteStateRequest_71f48f72373e5db9721e095e8cdc12823a7175b930f49aebb8d9844065da5b44.json index 72cfcb2fd042758caeb3d75a60d41c2ee8ddd53e..860426250099d7e88b40466629ed477fc037bcfb 100644 GIT binary patch literal 127487 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 QfAQWQ?Z3(Y{OPCv0rN-+YybcN diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index d438f5cdd3c70a33082da0d6fb21c942f97f77c8..e64b73d8a77bdd2ae7413c918f513e44a6315072 100644 GIT binary patch delta 2865 zcmY*bYiu0V71lg<7H?!{gQ0d}XJZFHSTnP8XJ#LMZR}(n2goKiL~Wo-$W|y&Dj_ye zTO1M;qg0@zO0axVA0m`?`>QP~5E0Y@5{ZGJl!nMbNTyLBwxCo%aWPFQRSl|p&b_-a z{k1bY_s%`%d!6~$@#^tcs!vSm)yXb9CG1qnPWg5Kzuw*q|IvS_WkCF@4GtPHfFrH& zj?uY1m640mye<{kd`lOiyr;)JZ+W~RfH%T*cw)0*o{WbkG$`zFp?KJYV%~=0LIzeP zZHTs*@TUeBhrg?t5c|Y|XvD?414E3T2}3UD;HsB3A1Brsf|qI@?5cI)LahatTo+?$ z`uoEc`3U~L+SOBOSetX<$gKjOp4MG#x>2{_gB1bHt@e0t&d2@h4IiGVNkeGBgNHp= zR%Rio~3*cy@dblTRL!mp2udXp{oY|&%B8Ufs5B3A&pOaOPq16+Dp7t|7bL?AF7$Jzp%_YD`1 zOzUB|Cm~6~ExhIZPXnC$f#%?trwKTo7g+2vLeLcV@RkADT^RanZEz2GF#3?M4lFJN zaLNkfwiMyl(?N$Rq&#SPNbu5u|J}R@lun2SSesS62PA9y)gE$$^GQ3U4D&)H@_n}!}(gxh5ok^q#s`r1jTz? z7{0-TealsoTnt9n5Ou>F3G&IDA+$8UkuyB}piM~-SSyTSzK>Y^9(B#_?C+!{TQ*Vk z6=vj`Ydr)?MOZleqLv1|P2glbU7T_h$(AjkeBjE`+FP24Q=S+!TGm zWao6?<=-kckouivyVYgOD1>n#)uqpEA6LWVY}a-4zc9c;ZHS2jS{)E;yS~})&VM->!Um7hs@6RVSH{a z38zw2(=#MuZtX8C1k;MMx092&uIjCX`o2zT_P$#M{JY)d0D#8qqQ`Vfk7GSzJ z4SV9RT2hv}A|r*Oj6g4|gv@oHojXLLg64t`vmF8+kNIT@UVk~mOo--)0p8!Wgkp0+ zTEc>%SVHMo1*yXh2*K;&1T~U^e3gJl1_hkENwAGbZ3BugC2}S*1lYjZNlH;jz2L5P z0<-U`2d6Cy&b14ee~hwe14)pz_V$+&OCs=zUY`u+9vI0!HImi-IFi-v&!O;j0B?Tj zL2<^{Q%QVc8-*A*R-&M0XD)q|)V0%usTy0E<7~GwHDxRg-A$7n5$8#(AkB9zB#4U_atDf+zb;rZR9W6nT5C7`)#H7-pW zKZBQ-37oz{PbvXFaZL{tH_@EZ-199og~$~YtGH>SvKpIRg#)D?wN6^8G=_h($yY0T z1I|D;I*no_1-zK2n53)};NC2ELurtNQV~LFp*f(Rf+)6Kw}xiyQ29ABtPamCLD7Y8@?}<{$43^pyOrppTd|%=a++G_U7K z)hk?1H4`U)NAr?}h{GAfp-&WC`<0%Q39iT%%p)HzRQUDN!8C1^d#2X7*he9avxoHz z4y~svLiBp6HfL5^2FRg08a3l44E^4Q#@_qY_?Y~LrYpPfVn)5MnM~IfkgCbrVf;l0 zSw`9Ku6kEeI&~9$R9I-|X#SnxDC5!nK%KFj=v`!AMMh&U*?hN2Ux;OG*;v?M{6@tF zwwKjNgF_Y=@%SvJO8vg;e@oOnjCejPB_Ho93;&o+sW=nDj|PbYqph4sTjFYbNF7q7 z;e|ibZ2pAw6zVMv#8{y_2@Rj9w9k4DMqVvXs_GGPaepRF(H+nM0ymdu Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__4d228b5af660c840e140560916dee664696a82c2b75fda103a6490a0a0119fea/msg_GetContestedResourceVoteStateRequest_bd857f0f40a11ccbc620754f0b276da7bcf8bb6352f7f5f26cb8af584712e16a.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__4d228b5af660c840e140560916dee664696a82c2b75fda103a6490a0a0119fea/msg_GetContestedResourceVoteStateRequest_bd857f0f40a11ccbc620754f0b276da7bcf8bb6352f7f5f26cb8af584712e16a.json index 6efc5d27aa0934b65319428e74f425fc1f903efb..6c485aedbce72c7a9643b8d19da6809957c45823 100644 GIT binary patch literal 10473 zcmds7!EU2S5Z!aW0{P6rjUl$@wuiZ`_6J5I#MsQrS`S17XJ-`U-?yOYM}>kC^s>ol z4vw0xs#mXGRkt0>&v!wvdCIHDOId6_1kd!?Y;3Wnr&C$fRd%Y=%bB)6wJwcYwA+Sw zFx!|t91s1&;n=UuK4A~rh&}9Cd=xRaXlHu2n0v9c*|IEA#DSw-AAV#|Cc5tphLsXA zC}UW3%wW0CkpnUR!@f_jWBXCe0(QI#&hNk?%#lIGEcYSlI`G-0+MLVN?OR^dY5n6N zPmAnZPF>p+-vcr`Q(fdOl^>TmJZJ2Ks3T0>hdf z1gtDFZJEA7z^fsnVcl+gV@wsQ3fSBYGrdY{4AZs&V;z^N2F`p61WP_)EpX3L^q|Tg zZ&%v^k_%(A$*$M(pY&3kuD5fZUdz+p`8mxBdVP7UvrBO){z{+9I!|lz{6V30b<5E& za;fSxYYrlH>hkrHSA_MoB){Tzy~6KQ-ims-`B0Tl%_KC4E#DXV`*Qbk_uJj`=3`ZD zK72BCRA?LzacE2&Qj-h`(saj|h+c+Xjp@E|N)90nD~)2Z4HH_>jtP^fT_nvu?KFSM zq227(+ty(pCi~YRyD+)$Og5IHI-gw_A6gSFTG+;96JdwKEiyADM1xq7$u3|5^60`M zbCV@TJ6I?_wk~p>!_ewR3`r}Z%Az_+ISmKcRXSF3r;jvo99xAh3o0Fy!*Q&MaBLMI zKgS2zX+cfowexUCb=Y_5!*`relWKr7Eu`|8mO<_0Y-fxX@Nv0%lLSPRVv^H~C?%Jl zN#?>F4tl|bk|r>efG{m$2pWTl;>!EwlFB33>UGInbJXywOOaQhu~sf~ z-%==rp<-Gj6qHxSMls1;Rw%jw(9g71F2BKkm!?SNL1Xpl{YjdF0{_1cOBhip zFHC;JrT{7?nF}Jk@|>vYT%LgP oUulJ*6@fwq=L_>pCil~z?k$OaS=0hj2u&1`JnljhC7)mZ1+3-VApigX delta 891 zcmbVKzfaph6jqRZ$&pkLCr+#*j;^Q@rgAAse1RagN*yaPz?^QdF;^^%Y>00|D&kLQ zHdtt~At6=j*8U0Ix>uFBcjp5m(WR1QKfn8ay}SFh^HYA=^|m%rwUK67nvL9J>&-ON z&qJ+OvsCp`)i=c;RYT0;_O9y?eX}5?xrSn8)xb%OQd?_NrCd`JdyjQC!Y6MPUs(-r z{G~HL!g*4~kMbhkvJltNg8tTU!7BLUzc;YUd1lrQL>*I)LrIH05QOEpNjR9_J@c6< zw;@Fmx?}-v zylOtpzxgNJZBhfDlS;m^MUSF(2s>Vg6CN1+RaE5B`h#9+fRf+#^ySDfi9{*GnxywE z7I^m}z^UZ=@1qbJxD(QQ61DTAs9;|-^lH6B9d`gB#$rk1)+BZHaU^AI%bLdJMn=fx z(!hF$WRLlycoVmAqtrLHWUh>@Fdb(eQD#a*v@sKy#vI>P?7&gS-lo-;0!J&9Q6n_{ jd)dxLBCkk*JeINEBFHS3_$|8_R{{&AjB`riF6rI_pX}<0 diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/msg_GetContestedResourceVoteStateRequest_f7848301c15560f971e007963a349e64e07602f543bda42d5a5d223f0e6102a9.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/msg_GetContestedResourceVoteStateRequest_f7848301c15560f971e007963a349e64e07602f543bda42d5a5d223f0e6102a9.json index c532e48d646bb6d2372443537f9909df80352a24..1bdf34fd449184b81ebdefaf2e383c34add2b838 100644 GIT binary patch literal 71489 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 literal 71294 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 Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__863d867345b51a45ba4ec8326f42701a86224b53737b607521f5711340b8ecea/msg_GetContestedResourceVoteStateRequest_b9a737558f8e65f57294ca0f43cb3f1bccd65e01bb860f7648ce860ce03df202.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__863d867345b51a45ba4ec8326f42701a86224b53737b607521f5711340b8ecea/msg_GetContestedResourceVoteStateRequest_b9a737558f8e65f57294ca0f43cb3f1bccd65e01bb860f7648ce860ce03df202.json index c35357194279d9297a76d32e3cdfee20915ff554..29d0ad38334ce09f3a2c1cf18cff33d33b26624f 100644 GIT binary patch literal 12809 zcmeHN!EW0)5bZf%Vfd_rDO<7K+aC6|*dHhYLABMws3Hf7oZTYGzwgKtpQjpmAj*X5 z!yX(^e4Lp#Z-x||)}|=KhNIjv6)z4Oi#OGSy$PvP7iyU{&HT@EQ^4~v*RteJfrvt{wpT$Zi)DmFF?7A20k<9K;7-!fMwe!KvN zr4ln&#xUy@bIaFkxg)lIv%UmaviW$$43<0#&Tqpk%$B)YvDllWt-zBDHQyh1r{}z^ z)B5L2o|f5jPF17X=j>36%s_kU$y^P;=*Eh|p>>o4`cbi!NIP5loC07JLDDl`gWvs<*6vJZg)JDb$9ZmI=(d`H6G7=Kj`Pj z!^gv?hxhrPRW<+o#ZVVfr8cX`m{mm8Fw`-|B=m{tW9ZXBkIkZF6Hy(hO35NhXh1V2 zO5*b%Y36CB`AG}TlkIqMUa*dm^{*z&D0yrlYfDz`nq{=woFN*V-8PU7gc&loo*9%7 z4Pr%*9RPyo-huVZAxn&AFi_UmylC+dhE_LXNLmq9X4Oi{X*h>%rhO^5`bdcTv03P{ zAk$7d+>eFGkIe$)hpa(#8c-2=?%do_?bcnc;WJLCt7?EV4W#numQL=p*!CC=u*SvG zAn2nwl-+wvEF?&>NQUELNuh=?92ZN<>vl?e6x^N{ih@>`LP;7(S>^?YvdVyzSkfV4 zDKsSHgzD}}-o2q?b+_m3vF@bV#Ovm=&83E@@{|oAg>nrLz9_QU(4vwCASo1}aSo@9 zr7-l$3%#M70A6{);groL)c_48FDaC3(eA4suPqF2Kj)QZb2NgzQxHojrPL5sQYb)* zl>#X=Ld9|#wg=o#%9pcby6M_5$eK;-_QufNrS@oRr3IvANN=Yqo z4=-QpRmo5x56G*^0Y54MN#y}4 z4izYPEQO(0EcAwQCHBe-4yQbABttZt{bg)#m8DS5>Rzt;zjvEEHMA?1R31C!n!FPq zL~^H~MU|eH@ zhBVuq)XOU`r+iP96$om`X0uiSPc}zGdlPwmtpIst6G;d(kf05UYdi*_juhSD1j^qi zlw=5p3M7?>mE2#hC_UW^t5C7vP+=%zpsI$FY|)KJ83p0FG(KtQc{+XYqnrT8Ak(Fq4R404WPGs$HkJH2pW3b z9FVds3LqJ42ox$W#8MarkENt6V+G%^D5bo#JE-R#1)(Njh*(Ndq=t^X_61y$9}>%p z1{{uyCG&zq1qvQZN!cqFx>q^pz4C&?dw74*_1o)fg=^8C{RIdKhWhRx$K@AZ+l3Wvyltzpsnczf;Etb%cT+xUoKZ1i)V*ko$U{WA%|#G z)Juz^`jh14wm9svq^P!U*)B;-JTLnO)bsLpa;%yxX@LBMYf~RGmIFxLBxyUNC?tQ) zvl_8pE8xmQQ4qJS4rOC6e$>^m6{(Hb@jc=9X>nS7TYPyx>e_pJQkWuiDh_?6LLc2w zm>8uZJQ|O}({4SqpeXjyM|3G#`4J4PC_mDjvG${NYhd^MW9--u@k1NC(kt+zhi)b4 zys)MFfPLgPS}cMiS{KA*iQw2LH8yBOQNIYsj;9G?90$(K4(5g!vUgRqG>qXA;}#9X z>1Yh(xdp=%C|8VPa;47&VOxE$WnmD%lW`zM3>iv{<<4B=R7t}$mnrBDV^%pi^d3s0WFMF)rvE*oL<$TgC+%f(G4nwXKa3Y_p7rpt0@v}Rf;X< z;ufi*SWG6U;<(8XomhpDj^K+urMy-z;6)nNM3J*J7>89bAh&2RG7F>^x30B`<-o9H zxyXk!n1U;Yj~fRo=1!nN>1K}KaHWi7zjps1DH+~u0jOG-iBzYjARnp$!xD2MhF+E| z;LI!6nU?eSLSig;X1~<9c?W;Gm{R%sI2$#_>*_IMHxgB);p)@J8FY3rtYSi(+kBu8 zQ_x`KDdRVbkJGq&&N4Xj{u#MsdNC(`N?5xwCLT|wu-x6F=gz!~kt=u682)A>AGVTI zQJVZ($)vMddF^79CxzMXD~GquNIBPN$hs^V?iRW;GDx#d0X1|vb8CbTF*I&U$I;@s zK!G>CqzEP#+^yp&G30C!lNfH%xI+XvKUSQ%r_$;v^?`Bo6aZtn%Sw$JQ{qT3R}IFo zl%H6s(FZgvcbRlb1lhYnmXS$oBfWaznqq|%aX-B z#)Fxs>|wn+Kdjd0u~}y9VV{au;5j2d@JT*)+|)Ya<8(k17BUL+3v7CJ{487 zX?{Hyn<{@QsB1L)l<%t7 z4UZyL5}D?V+bH6dkkPPCw`)@<3Kd06bNx&o(i+2fZG*9H%T&F^Tmb?lSJx@9A4=9q z39E;4ZqBhqZ|maaSlZ4~DNUY3V{Hv4K@9(Tp2JZyg!yG>rv&$pL``o6DzY+esd zv1w@KFLG__V*xGDlDgUC?FJ_m?7#1enqqxF(7NhamRPqv9IK{3`CK1fTZOd|Pk7(y z_xr>9!>5P0*`IYi`~1bw79^Rk(%6_ZCIJ{CyY0L&3H=!QX-$vqqHGn@CLoDt^Ejgc z&6qe#PJ^tSrkh_h{ zOc}u-RAjOPm=O8mz((dK3yfwkP}bPGXz>t)mN!C3ToF{})lte}xPV=ymrCyVktQC; zR-w~^N_*w-IMzgQY!v`MWDT;@fSSl_=k5+_zwdGlpK(N8WdoRLAeo0+dbQJHt1%j2 zjmxE(z>gA8s`r*$D3EB82*>4;L=8bWE|;X&?Ue2)xVxZ_nFv-HF)5>*l=8C5Pzplmd`MIRS)kiWD0pDq+ARiGpcd zz$tSn2)*ipHk1>!$x-9PMXD5M>8kHZVyJ(G+QdS15@N3Fx(n0Db};j?0CTz3Osa7tVRb1ccXG zNs_pSmoI5mB2>V`-s$;mn<1|dF8TR6AM7T&BuWsM-;py44CYIAC)jk z=3!C-DyHDM6og*6pbh0p>{S;6PI=l$gbXP7Lk^vQyYfAXPWJv)i zFkrHSaJw>?*w7T^=AbYy>q5Xg5t~w%1do0xB}-2u z4!v#;C|NcICYfu9DO6p^r63HRODS3A3cg{7w9<=>;0T8_MRGW#E=li@TnZZ!1_F-D zr36$=!E-4kd*y;QlylyzE(E-X_ZMBiy*^eriE5uyP++Lf4w7EL@B$BEE837IbOVjh1m4|%)Y5wCTIF1qncN|d?Oup!?Ehk=t4`o z0&sd7BYB!2=mMoicT8%ATxe|9AD9du;P-7DiP47)rH>KLT+>uZLl2iJ7!F}kIR?&5 zs>4d0ckCh!j){Eil4+ta;X^>fM|Rb~nOV-z)p3G41!mDNDwbzze}?d@yRm2}(%GmK zCg!4vR8cH86I5~B?#6UogU{5B#I91X`!nE-eYSmA#SEO= ze9#}Jpg`m~>$ixHHMo1uGC1@8nYd(zX3lz*uy!rXJf2Kpgxg2Y-g(Dy*?P8QCh1u^bhqui{IoD{&x(ph&3DcQaq(!HIJ+wK~G{J{H6mGT- z)QeH7UOXuKG*!#ev8$F%^eQ!WBNZi0wc~VLna`9fm)=)^Q>CQJ zm2=8^qTK2=Gwn#NpFUIp#%eyDD1))CLgzPC7H+0oO;qe@cIv?A5Nfd6E)S1+v7hgM ze9h;@;xU)5$?W4|T@0{lU99r&K#T9maiWetFE)q#=}p(G{wIl3ZB7zZh(II7Xp-ps z1$3&v<=P2!ggO$Xw0fjBVVzTKmd;d@~6Ybb1rm2D1*gj zv;8(-7t76ImCrZZ<-hrAz9{79@29mRkH>sp<@f8|>)l^>FN2S}-QdF~C!0eA zIGqfgn+&B%P6#Qx<6J5~PJT-0zFd?|hayiAUp5+MGLRWJ%+li^E9YgV{4EQPlc(|M zxZq)!J-js;53~CdN3tK?iU>12vMA2P*fjh6xiT205MU3;?&z`EF;5Kb^R~4 zv(FTRUWVd?4d(x_{N!ui?;u;*vM4;$pGGP*)!pm=LSo z@#QO(cM6<5AVUC#RUC&#ECb?Lo{e*#EL9(Q8MkG22sVt8Im6JDJ_LXaISoKv)dh!r z#xj_1RTs2j2%uG6aCjpZv#y9jmko!%BT->j_Hk5(SpT8R(v`AlrKl#c4D}iiA1R@g z?|cbF8h-FguiuE(`Q_H=a;v6XDF7o47C>AqaA-JW2+e)pXG&c122rTXc=+}pfF@~h zQ;fO*8H#FE7c%Tq07mi#6i1Z7h5^OJ;^ZOhRwtWb1qhA%^qfxQt~~2Lw6~85qzufM$r^@2#EI=Aj67@YGP$LG}7oQR#0!d_YSav zesDMd@-q#ubFkv$3lPTwy>Vfz>{rl}uDfzK{JC7wcV!V%db` z+dWgRQ`GI=0dAxzpqGUW$Pe`Kg;sWT=ph!%1`uaxqyZ~V9#E@TO{_T9t##QbnUil) z@};JTS|Z*%h*h75IkN#p8EhC3I|PT9h>{(2v+q;>c=fjG7h2i108W3qs}I9r z^^B6aE;#IJS7Lt|4-SUn*npK$vH>w0S32Yq01mr~1$qsK24t{dByU*7#bSq{u0HSB zeOyyLKlb0H#Bpf!%YZmm=O;juk~zaZ1%M1W4M0p3AXYCR!=V9n9?QtERV--3c-(MZ mKDr$8wf~gF-48b+{AY*!Gv+atn8>b_FQ#YXp-Z#RuRj4d{pq~` literal 5980 zcmdT|U2mH}5bSe)1@bcwK0acc_x_5gLat3Ks}4j2r>&y=_YRyHrgsM8CaPK~j+Wcq z+1c4W+sVsK5GhDlkaypzVAZXuqa-Jd@##I9@g3L zkgW&XtWtScM)I(d{3w#JC^kb_qETX-rBsO`1&-n&eJxNXx*Z%wT8RY87|BiqR%6x* zB=Om5C=knelt@CXT`0dyGR#__5~-b~rwM%OOD%TQ_V`egP2T)`Eb?;mP+)2}ec0^F z1*7)muJ}Q3`6K8KT>tata4epFoBA;SATToKAdp7jT8g4Up#0%9GT$~f;U2M%KsL>- z^jleDM9mgVX6%=8f_3g5OWmmscwp(NUKdZtgVh{zaZwhV!=d_~@5}AsxGVBQwf$D? z@=b}?=cfh}*_U7Q=c+0429ZCJ+SJE_Q$k4HDVWRsl`=SQcmkM#^@o-?=wmO!L zd-zya&+Y76#E$PPe!t$l-h8-uS$wSP#ofKZ<-h`FNoY(GVn_ypw9_#r!pq>*x^CN` zGz+nwSiW=_rZ8|~!ZhlPRhX_?1K!h*wX-n64{dlgD-P4!?j-KA;EH;{9=S!!1RQ7` zh^>+$u`gcMVy8|?Ok$Ln{Lt#5=_}gnm@HhM_ z8h*MK<#3$~;>YO8#r;81yYn=VKGvX*tS8)riM1IMN^zJ@z%f4H?95$p-m4b*(733o z(y&=`s3OZL;p5DV8I$hqx01*-#-`&_{r9iKwSrRw8vSluajmc$P)5JW_%x=kC)dWI zp*VCgcx-T}MOWX>>D!L(4`YaI4L_YUG@V)FIKvkhKZad6I5T&Q=`{QjM5f`#*mQq7 zJb^K1xEJ5YprJz*$o8{<24XD3nIhP}bSQoLu)P!H`}7kHR_C~t^MrgcE+WO>{9fL9I?=q{`|v{$PS5;nw|`{8;NLP7ft<&7<7^l2`}IjnkdHsXu`y{ng|fkL`JED(wfarC zLMSadR>BwjKb?gml=e;+RUKEueQzO-3Pr$+L(%IwF>V6V@EOuI(S?mcQKr-I(|O{@ z5XZTvRD;IbYq1>~me0&Rv|0XJ3K^>5lsM~}6Eh~AE{Vm#f1ElEac$fGjK$$P4o#GP Gdi@1h!hh!g diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__a39a5f7014a616de3d7002bb4f18772c5b5d3526cb2b3c33566bd64512882669/msg_GetContestedResourceVoteStateRequest_aaaa80ce4fdfc75252132a85e6c12bea6a47c9f7bf30133713b6b5cfec3a4d57.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__a39a5f7014a616de3d7002bb4f18772c5b5d3526cb2b3c33566bd64512882669/msg_GetContestedResourceVoteStateRequest_aaaa80ce4fdfc75252132a85e6c12bea6a47c9f7bf30133713b6b5cfec3a4d57.json index c0abf2658ffc973dffe5f477731a148e5ebbb1ea..7ec5d3867602f3b3408c87d4a20e82510381a4ae 100644 GIT binary patch literal 154811 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 P;(LEIf5<=n`0f7!V`Z=s literal 154055 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 Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__a39a5f7014a616de3d7002bb4f18772c5b5d3526cb2b3c33566bd64512882669/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__a39a5f7014a616de3d7002bb4f18772c5b5d3526cb2b3c33566bd64512882669/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__a39a5f7014a616de3d7002bb4f18772c5b5d3526cb2b3c33566bd64512882669/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__a39a5f7014a616de3d7002bb4f18772c5b5d3526cb2b3c33566bd64512882669/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__a39a5f7014a616de3d7002bb4f18772c5b5d3526cb2b3c33566bd64512882669/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__a39a5f7014a616de3d7002bb4f18772c5b5d3526cb2b3c33566bd64512882669/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__aabb30e955771841251280c0e6a98257882c3b2ee0b73b4aca838fb78918256b/msg_GetContestedResourceVoteStateRequest_9a43882825cbf3a83a2f623d03ae412662a6acb2d928d56de7a6a67dbf70f80a.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__aabb30e955771841251280c0e6a98257882c3b2ee0b73b4aca838fb78918256b/msg_GetContestedResourceVoteStateRequest_9a43882825cbf3a83a2f623d03ae412662a6acb2d928d56de7a6a67dbf70f80a.json index 61011c88bf3386dea0f99601632959d581e5c4af..adcf11ac7e5d5a6d3a91785ec78356e29262fe49 100644 GIT binary patch literal 16486 zcmd^GO>^Q#5Y5@Yg5u195y*zU=dizFYl|YFO{ie8g@rdRm;ZZO4D;01GaZdk1j!!k z5_&V;uV23zjr{R?Hy8|`v;EU%mk&P;UgcwXV~lJ0wA$sxez__Zo3-5javV|)OD5wH zKDhBzeVEUx53_l7?H*F~VVtNB4{CmrsA0*(Rl}xwl)83fl_g1Z;AB!wpQ}(Vxvv1H zN=Z~G=hW<}3aiJ=bs#l<_E065sQbxOO_=B^G{2de;pQsTROOzfrw)7#sfO#_>hPH5 z#iDrmo-Oj_VBSv&D9|`ZHTEmbrZW_Ebn;Hu>+1=UtI43K{t#Q;Yo} zL$74WzE~{F1z5J|+a}vftZzFRmmjuUj9cvvc~QUleZPAy9Z*I*@_m!^ z^<{Or*|^IgS0Ba>xjxwEAyhjJjk^4ENA?!>2IoSTuWJCP!F2&TM_x=)+l}Q8lt+P0 z)Ict_C?IBtTucMAm^`4UTuo+iE{M=)msu!~H=uLmd+stfC3Ly_eS_6Nt`=(<=GQxb zVE{CRl?TLX0Alh@pw4p{4BO>00vaWEl`9ya*9Ql^r&Q;|o2?7RHclx z@G*$uI`WD=X3S312pM!I}MF~84&04%FEW&=eEoY z`!oQW!ZZM}P=MG`fQ*0!)Ojw0VN@=7!#FHO)rEk4n$1wdfTDzg0gQnEMWMo~>|?78 zxqhO<(uKB(a#WLChId zp}E(6rnDn(2!*Sc51M^$i*}| z&xL@70k|$OJP+OOF50AIZVF}@(0MiLe`JVX&D*~yGy<|W(3B{PVwMpwY7s#w!%>EY z#w=E&T`rUyRTosf?$I%j?_+(n%XJl@*fxQD+%x4eN8Roj;6|DPd5s-_mpNK#>`^GN ztCJoxG-#kMCJ%@$3W#$7GG=iuh|uRAWiT`#Cf}rF778V|cz3vw7oXTOz$HS-3cA_% z6twdH>Rw|xu(8qQZdZz!E$Y|<8cZJjGL|0CLO`wy0lPAQ4=5!Y4-SS5hJcK^+Ci+w zg}FL+6xRiL4e|!W0a3C+-k8-c7Y7V=^?AnbNA(YFsd$i!+6|qT|T>P^0mKd$Jq}jB6&>s6!P!A#|xPvt5TjF M^U261>DRZv0sp#QPyhe` literal 6184 zcmdT|O>dh(5bfE&0{P6r%SViJ?;*b-iV(F)i%KBE*liT~zxTnK$8^_TV<$aSN~&S! z&6_tLi`~4>Ja4|wn{827^Ly_dkKMt7HlEgX)i&9>O^XeVAA3j#3&MrZ2epXA!zvjc zlGSLdWh@>Rfp}Po_#hClAXFnPk|<%Tg~$>Fk~j#*@Rgua!QJRkqLe^TDJ7yKK`SvU zNhI*ea!e44^B@udp{zpcOGJcP393lsPU7PPo`zKOO}*Z|Xn`YWwcqNg31n6#bB0L$rHD&=PN#G^{9_f5XtmAdn27uRK;m1X@aEvj|7 z+vI6kuYcy7G^_CYZQEilMfE-1*KMA*K)xZgZFV_l1xVATS$6@u5j_`q1Fq*9xN29H z#I5UH)tZN|O}+0npkwUy9`NsBc9?ycz0bck&HVmR;fi1llgL*p@-ZZZhIG?WD!{M8 zZ|Az}Kyl(@NwI?Q!jEC#MEP;h8%sZ4b_Tr1A8jXogdf`Q%Bawf@A{LlkAf>02nXhl zEfM5k>q&H$7=c4lZ9_&J4~Gcsb!rkFIBI5gDA&S}y|1E^F$gVTPHC_xZu&v8T(8ZjOit#bxc8n;>okJi~b@yOoK{X!M} z8n`fEreE$Z>^9NQ0H~ga&1t!`O|QQia6mT;MV0eiB0&G;FCnabS$PChnMynj#hA zjTEvRx@b70o-0T0p}{k;95U0eWzhAJ6jPQ2n9scq*EXD$($L+2u<6$dU^HKTAG2kU z5H7pn?6V<5^3X-F&7(2MMb}Wy=e)<{`cV&a@nn!OehsrRtb$QjNo6<2eT$u|GCuVhZjd zuO|)GMH&C@^TNnAWlSggeA6CY@qU&`&o|0^_x`7|;85&J=`wDd><`z*Sbk#A7XGb( zggTd_WAb`B#!W&Rw^gCTk(A*y$jm12#Kw?k%3WqS4Kh#3MGOtif8MBZ;vHicJt`!;q5oqSC22gdG_?fH&35^`1<s|^~LVT7mvMM^X&3L z7weyX{lUPai$A}4e6iutWfYhGJ-yg*{p{jVk1uRLeKHaF-A|^z{PyiP-~aLDoA=M( z|M^cZpTBwW$Cp7ZfBMH4uikulyXw`OZ(sh;?ce_C#k=hI_pJTbH{br-i~oH2`j;zz zc=7uCm*4#i{|`)f@ZkCa@COerLdsuVUF7z`gUd+rm)93ackSa_M%_mA;DU3%wDdEx z*Vh+$?ZYn6{@Bzn7GE;pBQG!6bv*ckmmlT--OKO3e?79Fblpfw_o51(XL zzU_{m0v^w~{QdF6XL0R_cs%;qljBeF;KR|TBhJ=bGL>~*e$^1_#r&H)oT^7(*PSO{ z-R;guQ__@Kdp z#X4LpN}X7r&iC8otq!aZEh)Ow)RF&>!6`r&ludZIBSzMRv1CNzO}U+Lf1b!tSoOSStW`>KR3p4 z1&#%7@~S4%Z3PjABMhMsvY6mbV)Kzw-H5td5byy}rWBJ{v7%M6BWnML1p`uzz z_?TqU^TwXa6)JX1V$sT#^?iN_jFrBQMNxQa@HJ}3qGc}djlk<3@rq0wgCRYCCs#pG zYLI#dEgrzF$J_N-+T9Ym-Z}JM3>953`KgI?CF!tzen?JUg|4!GC-87p>787WdLVo) zI;x-~_JG4k74;DKYC`(UTz}`W@{)wAPRWuyzb>V@D9^J+0%MI=RHqChw|>XKU78&|aSC|5`9M#Au1O0~I- z_{)}7Q??Lq5%hYMK!ob`>TqnmVE3$amz4QfUm7nDoZXVLrH+}7yy2CYnCT+i6NOUi zP({jB99v&s2^B18aZ@B+rt3FKBa*9DTo0+h3&Ea#VvSeTMcA9+4JFAIEe(~#p;uz1 z)RpQR>@pSIkP&2KqoAk{L7>3%d=^98lIQP4LCT|gj`V1|M4q=Rp;slLid9NUWT7Uq zp1Qz@U92>ASzoV0DnWcBSJ3#j{3o$Zekk5D5P@ro63B)O%9b#eO(Yhy$TPh#e`9^z9yoa$SA`OtF=-iSsGXq5Cd+S z=es3cN%X(#C9xB3>`E#-leen>a`qX47)kJ6E+$%i1P6w^E(LYw&>Yx8>LD>u@l!ky_E85)#b*WQlG7;UYR~b&Ept|K4%t+P>r36wd8O)IL6(1t- z5y(dP(_ZTg)tz?ZMmA*;Gu45mcn)|!@w;y zwJD4Wcjin)yu1}HWd`CAuMEL4rU+`(@k$F^s9w!c>;iAfm;x1 z6sbOvg$)TsIA$R0Sfs;Bq8jy};<|}oA*IyklS^SZ0@ooyUD~rknt->gCHbh1bu7|h zDYscqYLIf!QccvNQG+!A=V zWWAC~NM3p@12?!tTU2cta!Gpq%>!FH5|2Ck<7 zDUAl60;Iq*AqW*W*iLZQf2r>JL+hjbsDY#&sW|H_IIFZ4q;oa-X)ZDjjq+hlPCueq zVko~zK?3JMG`&(gO{{Q<3V{|kGs+4)-H<=cOz@RtZm_OVOa3bqBBwJ7k{6ZJWGPi6 zUUhhoiCVeQhf`Ii#H52Xs~U2$L<)u>)TKlr^3^S|Lcpcs z2t>q~MH@s71XTW`oGGhg%kl|jLnoWta9h0UmZ&$;JAq(^RX1o7n;|SG)`HbBRazk- z)qz$&RlB~g8TyrQTht&&*vC+jsu=6|Z2X7$J#vq-lHhW3O&>$YT;g8BF)4ZpaLr>%t9b58AN4}u8BlV<&(wPC9>c3s59EX2)H^! z6_*qtaK)Oq7p_WCH>JYW)()-DQCim5pNt$tq;OSGsEKSrAZkK&NusD%!A^><^h<8V zt6IU!jp>+VxKe;59FDEaexpulh?S;Gl^h4`MiFYMrUgV2=LE9RSds9C#d5zcaLJOC zMg@WDLh|2Ck~2s039rdj@v138?zQNoQ`E$HxLfA!P!B5#?cJf)@gXbSLNXYVXv>HR zRSy+3q;AO1*$yD=6UIlJLc`8H-SBvQcWPE~Q46%e+wtsTzfsc?)U-5jloTM1+u~ z%2Dr-u3#bQtyfMh%2jiVE)B0B>LXFj)iSSYB9$u$7LE-nVhvKR8UoIl>nSQRB&E%d zE89jpYk?DR=UG?^uzeZ30Ie^>&$IC2c_cOE0@5;ER>HzfWsd%|T2Z6S|MM(-@jo>A z`2Qz3{-pg5=b{orunI%X6Sd+Bs)%Jm{xj7*3LRDV!R2K1D%feUjioRmtON!H;(!;fT1 zvCP;Jl#UZp^9FyN0xuAlt8NL^r2y+ysE%;gG1<~Y#W!Vpd=o2; z#kbTk)SqUIIP8^PA(hyh;q?JVsNN?>Ktw|VwDy{!pz-Samjh@jbINK%NcBk+ld;65 zjiwyOwDf`?1rkBfBEl^rSA41gyuv;)sctOdJLhxOt5RnSg@TCBts92BT^va0q9ER4rK%ajkZGB5?Tw@oWFmFQ=;nmEN zo`YgVw*+y~L+VQOn zq|U{c|MK9OjWZjU8MyrV=cVECfO-Bl-?0f@@Hs{ieYw%N*ikF%i>R42GKQHz0dNo@=qoculV2E zNkxlj%tD~3N9_<0*`jpyEke5vq5+o*l9!=@l_AuS6C&QE^EHAq*ta9z3UNYL_Ihq*SZ4v_5r> z5VU_0mvDVqk^Be>-Lg>>D1+MgI8mW1VK<6YuxM6CdY8||J6Hrh)d4?-z->UdA&G5@ zl3Ph^TPhAkl%gFqPSm6`NWXF^C`+9-t2jMoOW{!XqOk~vngIF#pKYEbK^qhOin>xQU&^&lb7>$$B}e^Qr0(VWV!Sj_ECk+S;-uhA8%<@9UPvLX{h@ z@SQ?AFQ7MFu_A2jdeOIJ9p)ASaYIf8j=Ci4X%ONXr~IFb zFaFmsM%^=YXX-98@V7ZipA`KJ^Gsc`&4QX&x~fjy`g1Ac_(Ou0C^D_-p(#U%%y^@* zQhK{MUSTX*Z&rc`#qKj{`EA zD2PavZprBh@5+eq4LlM=8K(JG^s3H;A@cl@RoYV2Qsd+p9^UI!e$a?a9Ac$dTi~K0 zeAXCT6%)-;;Fc}*N;+mu42G{O;jz9XS>6&WH6(S~=Vur8rmBHf2lB9i;MG&N1Q)&N z@SntMx=5)8l#;Q53v&!5bS7CGYv39_zBHM!OY3YPnP;ekvsh?fYEfmyA53flZ|uwU z-rFz%P!raHrYCG=sE1C@+zAu1(yaKmOc%@W=iRE;U*!42HP%@_N7ftKc8AU3c&7-H(3x)aA* zdMNl^PbQ?Uo2XzxgODCcgi8}RG0`mvS$gOcK(SIfQQOi^lq?C#jXG*3SO;Yap(cCxOKaDlsLa0z^vASJ0w zWI|-B!AeCCWc1|EWO22Qw2?SGI7tLU?XCYLiDyq=KKPfSDK4p(E!=zJ28E>3994Yi>3F?t40oN$D5Ficz6tLMOdIAR}>!Es9Y=&U%sYn!rXstt?C5 zY!l>Fut;ukT&chke991=C^8Po$l63HqXuauQPYZyYTc691;K97x6d2t8VA5-DvmB} zw-7l8Nv>K=lBi}$G@*&zNR;!6s5_!2vCr8+a zx(+(gmV`i2)I?-T8rfK{v5)ZAtGmxnscuNLG75RyKsK&lf{V1jTEVv)GhL)_2lP~f z0~aDpW5LO1CK;jBV{+vknP11~TI^VFC5#;;A=ogMsS*?0k{7LOVpZrAh$w@KLlULf zWs3yTMBzDNR)@q=E14>#(rIz~6!lG{(|Q*$h$V+jJI=u7OrD=KlICytPgQeVGC=Z& zc8Q5*HRRMPlM<_m1fr*^v}~euL`wX!7ku8%&boZ=Q6 z3^L3Usc?cS3PQp{5T0)cuWYGT5_P>gl*hOcD@fWAK3U0@4Ms62=V?@ET-*-{T8DD3 zmyXaaDDsmnVx{A#6w8cVMwAAU;ekpxi$zFV@-my%A3?k!L?Wc#n^+0CCKQOINU}6c z(0DnwNFYtr{hvnT7*wBR$)*>1vVsKxhCG<_S;$f~B?HPux1`pnaKaxNAWsNB`J(@X z;P&6%`uK}~&MMFrPzqtYtk#i4XK}2c9PKz3L!uZ}Jd&g1`PoJ4t?4=uTu<-ki6B*n zPLie5eUp5nTJ^u0B4cOs`417b0q1ue>xDA}S-ICiRDkQ*O%6Ww>b$POmeiXBJ+lWF z>|z-b)JoZ&%B7#zieoa3%o$HPmi6LTX?b4PEdF?Q5R^$Tq$0$pM9``8yslZU!KOFW zAp?e$(!D*oy@rS<6lz+|w;RhW8nUb`YKBGp3(EO+Lo#-@OPyibo@nCDVv#sjt+QRO z%^{O>jUrwtbz?;?loauGHJ}Qj{!*W%A6bm@ zWO9QNqD_RTRra38+w*w4K3bo*!7@9w(jy}@Lg19rdQTN=n>&xUpZo!v{8UM^Dm}MA z1Z(OVhY7|mvm9MbjQIh1+t?`+z;~XhMHqrb-dfQpIbTz+nfLtk*>8`i&_x1uj+^ zvS?J{4s`{KYK~xC6Qbl z=2pbHvL7flAFOf!iiRVoh zX1ME*X1xx|*g|ZqW5V7Uh_G>(pma459A!tYNZi5`Vq;AtU8p1tMD(pDP^D+OHgFWj zrWM)JSfm|Hs%VBcCaCiSy7FcreN*AavK5Y0O{OuG!C`0J}KD*PAyDkdvYUbgaBRi0&9^{X^k37 zkEoTDKW)J|&9X{(oe(Vk5DsOP7M~E@0|czJ5egirT9t_1h8%T^Iu@^lft^38BOK4C zlW7x$={gZyZ;qcQf>a%P3sE}VH_3f?h)Wa*EuKa6_aC(Z=hsc^g)`JuQP??OocA+# zo!W}Uc|Rkk`({i}H+b#PE=+=R{)B)anDo-%{gJ49_Q#L^Gp!&0$-Kanca+(p8eS~U_ZMq7 zU7Fh__A~5{G&jo2luk_=Z%!5>&ZTRv#YCT5N5|~6u2J10S?cpQejI3n9*JG%gfbAV zB)4>hSbq|}Ad>a#SoGm|IO>)pN~l|xj$P&$4&)6)V-FmHc%z6{vZV~kYcg?c=Ohv< zc$>X5Rt0nkr0J4eb-mUgl4P2ozOOGXM-(c&kvMss+CYN1z@ayORIRXB#9vu@e=&05 zqi9FIsDxWt_zJ#k$w%^EnuV6SWus*F4u)D~RQSp8QOoPxE=dIU%AJJJdo39POOgRP z-F{?lly1_Z6Cr9=kJ$+lt6GOyBHidXDnx3${)31$A$3>c(fR`dZqPo#R@tPr4btj_ znRJnrf)X5MjxsG{6|T1~zje=JE{$oEsxJbFHQwBgT~t$%aT-^~TqmHHiejRH zY@AGm?V8&rR>Z9#Bx>o8-4ZI26{-tyrp;YE(O{cTr9@nk##)zTee=P7bZj8LevFz{2)+>ur8kSQu8kpa2|G(kqC6jM zLa3YcCUDlwjqCJS5oM?>2pdaySzlfy!$OitMYWPZ1d(PbRMguE3WTU0r6S;x)q}e0 zHC{0k8R>dKq2f;=$N!j+-d%2Fy`a`C#fku@f!Ch|F0s!o5=gfkyju21Yz7u}MK z(F`0D!mAMlc{Qj`R=VYYemz}%{stnN-b}*6d7|!w50ylfFp08BFI__zG8mZO0lS!> ztU5iK+XOCfCrcFgFhNREmpr%3^W}4QCj=TJMVZZQ5@cE&CS=}_v=gSK0rHujpEHHj zS6#{$LAG0PwCb99GT;?-Pv10HrY91yk5iJW zao1CM4lB}$H1G|2&n*&2w|Gl!EJBi+NXFz0QWJPi?6s$OHP0+!rCSc@LCN#{4MZf6 zruV$1xogZG49xFRejPiior(sD43S~fz7(d4Sl6G;@z=?4``_Lv zD>4lG#?D+vYxQZa!dncayp>6{h=+%=rCG`@iM<7wK+sBe5h8;4hD$`k zK40OMBTOJLC10NXEX?>UwMiF2^kiEs*(;7nt#xPy$tf-MhpI2@sr1gP-SuJ#k-~qW zQx_k7cAX?$9}rO=hQzH~QC^KG$g8@Pc0=qvx_}Wl&)+~q(|ca+-gP517?|IIgqag$ zRVHxsYN_$ogib6@ztkE5R|qKTaq1x~w4#%!L(NFaIPf8uGSC)5VQkm? zIkdabtHw@lkxug zQGR`$U)TB7@ALK5vxm=~fPaozD*R!m=%YpGCjFT3*BPipNvV{(S zF2D5$(bR#boX6G~&XmTI+p(Uu6z&a$Oiz@H)0#L8t=HF%2n&dPzRKyw7NTxQLZyN8 zQc0MP0H-K4rRgAY7TBnZK40da($9N(V-YJez0y7B7D-oK%7>^P$weL(#H+hohV-m< zr2cB}x*ARDtI@jJ!mh3#ZZxX`8!1}soX3g3bVG<{%IRJ$j*(Z1LX^J5$rcI(&#W`I zq!!rQYXZCC44h>0sAE#r89N~oxJ4~$0te?lU+TUlf{2i$TY`uLKCQ@>iZSu(U^~Yi z!lSZMu0qAiq?CDcg*<7l&_oj@JZViGpY`difnB*IpVQWweBwM7(Zz32rD(DGZK(Avlp&7;+3FyX?1WpL%{!HK~uju)DgCfop0##0g zYy;w!wnR}iz(A&eD3>yciDUH&yFj<3z(owRWnDQ(q9}^`gBn!?MLl-Td3q+s^-WZy zK;TXkR@$MH09`4gtY*CcH$#@9s6V3l$tQ(eZU+cKq3gp~N)&4N@T$KrPb~E+bV4|~ zOZ0h1ZM6N6b?4_E*#ut|= z4m8s1sX<*jj_r58PLaE@kl=Wi(>FK0cFU`p1aZ8%S*?$}_j#I~`IRR<>-(m!#|xp} zx#hlXyb$`oy&D>}L9$!?@K6fG@)4Iu-h$I9fd;}HBFH6Bz6p>x%z*8N%ZSK*l?YfMK}F{?*s{?z`8o-oAPE z-P@-xzR!>UxDDyBiwF1bU43)9|M2Xa%O~%@d2;#w>(k>$XW!hvIQ!=D+5C%(vtbtx zPVa|3JRf!T_38fEE*BT)3tv2VKmGD-snf-`?|*SRbLHY}snh9f_QSJf&&OPzFLXBk z$>aAMJUILL#ly1+56-jML@WQV-Aee)4EX;7`A7b@%(%-@W_c`Kz~2-~Rn? z&!4_}_QUg_mY@Fc?8U3QSEF9M`u_R#aT-e9nMhS$WQ`ZQ=J;{wn@&p8xpn<%oX5bw!!G&tATK{Xb7%y!!6tyYHVr zefj#kzdrx|>9be)^XDJm2AdbJ{`=`quirj@`Zgo~o~eI%_VUN)SAb>Ao3~G&H46jP zi@&^h{w9n4<#h(WdiV0>)wu6ozkBue;~)O*&Fh~^gST(qJ>LxeIe-8B&ClQb+c*EX z`(J;(`-eZCk|qhkgNyBXc<&TM8^F`4Uq8y%`E%;`8T9bpqbD8r;iU7a5A*x$MqQ0f zWXCq&-U~CzmHs2x-i zOWZs^u^6!#@!m|Yi;v!~lMvOWNB16`8mN5TClO2N@@$4ay68_j@}>ZuPPI0pwkT%z z-SU2$pw)mGigm-Aw%UUKYh;Sf8ChfW6}|eaetY=~+Zx{w;oNZE?0j^8_xY2IIi*&8 z*222qeVR9QxC|*_&WQP`9Qu%oA4am_%kOVau8$UJQe45Y=XRO8Lvaq)M_Z&QebVz? zE6(;QYwGSVGII8-Uk^@L18$f#Kc#$>^-Je)S*8qv+mtx+Sa!KFU(e#UN9o2a_;5V@Iy)$dt>(Z5gi_79d2UCbf zYKsfqV$&S(8rLt@6s4>m;7FhpxR@j&P*x;L;yA6}#p8mMyaFfO7~@I9YZal8sG{aK zr07L6TBjto2zRl-R4vb?L^ix$?>b9->G&L=C;`3CDIy9=s6q*q@Omd)LP}bdU4nZ- zk5%MI!b>KNv?2r-^e|pftxRC0?JN%$k{zi&U&TgV5Z1#5&T+*8=~1h&c9gUW@TrQ1 zQNoaVAtbNkiIr5S!X25C1mCBKxRvMGLU#EAvJ-oBm*Km~!sa_yD5Vyv`VNO6(r_hB zgpfnuNFUk&2!U%-VntJO2}WL|ThR5Ta5S*lLOUhdVnnH+PaoxKl~zD1`YwjlP$lCi zPj`RGg~2^(UG`msex0(=dq)t6w4onLdg*bSTg360WLrc%1P+zunxsjjc`7=fB(GG` z`WY`7QLZNMh!t5sC`(&glLQ5gQoRU^FdaIJuudz8UYJQDGFoMo0(#ba8p;7!N%%fO@Ye#1RORPg(NgCD{30pR1MuCffD+0 zV3%|tcn*B%lw&i0v_n#Iu3L^4BQ>cLr0SYX4>xAxI{5eZfw%H7+!&5~Z4i zny~Lec@asc5)em5c1*weX=+n!Q3{$4nyOgH2K^{dnbKKOm@?QjErALa^FVAQoF8BN z6}yygak*Q>Dw)#pl1CjMxaGd0Q!-vjB_uCB1h^POwZ1OoQIi4(1uBe{4x}a_X?GHm zRajrTg=l8Shfx~a&`Ch=;DD~;oGL@H+NjP6DB+4dWKzSsSv8*^of0aFjC4w1^0$G;gTM*2qt2<3&$!{6soKs zNMe%SKp3J?)og07LV1B#8HHH5+VNOocJ2|8WH9lkgX4lwf+$^lC7xypWlAg&Hw#n9 zgIcFTwDX53jm5fKxX#xR3D>@h5VaBBbQs#F0Se)c$H1B-Uc~XnYN5B$@DAUno35H9 zfhvO8Lb7%EZtzKV!>KX$`+J9 zlAfIY8~3P=wB`z(su;;=)v-iLGGbIKma@1{(v65E*$*sWDQ?1S%$}bi{X654rTH;}WRaANGo)V3kzHt5(cgLQE*8Fl|&8dvQAkbl~BE;ReE5J>lRYrN?L?_=eaPdQ}i}6 znjnsp=gB@1=RGyBF{>{!rBy~i&tT1_rV>(pK9v}_O>ii?Yy5Epo))+Ac4Iq$I6x7S zl!wIIY$4-!(6w-EzRx?}Y#qMOhZm0_`xc@J!}obF>VgES>u-_^TLf3*PW5R1R1kaATI(Sb}TH(0Gw(DJ8_ z2RlvD_<}ui>47qy)`bjf#FSLiHHhe4y2e@bx3g6GeiPkJfkry16maT=;Us8V<)YMU zP01s>l;IgKBw5&{y^2t`NjeOh&ZaTm&L-ZdCsu?=1Dk|WmBu$LG0D2YkOVJy8(vYu zfuQA-tiK0V3lj#mUWX*qX|DyAvLjxQNm%uo;0Y|5l!Oh>>8 z#N~*y^t2V0@k|5JE%5xlPnq7L_h1sJu8*-ACTXl{nCNy}DNUmAMAW98F!eb^+O#VI z1X&UY5*(cpduU3>%U%7Rrv$;)08`t%`%YK{Xm@13AkyM{`VjHbO_BW}UKlbh8oNmd zTxXGBk|2{-Ailf5M4=28`$upr-BRPk>ugaG5Y%c_l3I2dI;^{l2+uQc--YNDU+^$B zcA2+oF~Y%790?qj-J@3#LD=CCP1q5k5*9H><%#2#BUxY4aHWJ{)hkItMeLcIxrpFG zvhTQ07lL@vh@qr(7t+$L=r?ZDhIO#+vVh~XJtUzuUR&9(^9o`}u9Oc#xed7pPATEz ziQW}w^ta=M+bdh7@KFPqTo8e3U~^tW9q79%oI(mv!6fkyc0!L9Bh=)or3AKvQOCx3 zgFEz)4y1IARpNUq#X`1X!&a-Z5hmc6rPQ(rZzYTjt0Q?RZ8JUu6Ast+Y$5v7DGMzq zW#VuIeXn82$$8MLZ`8Cz+{l=$PveuY64C}|iz>LB@hFMiC5{VlyJ4a~!;$)&yeb?ELLK)dT-jxR=3D6D3u=4WNIV$@SA1!N*N>?jGaNt-c$M8LUhW8Y_(xRjb`=X@oi@IzV}}l~E&MNR>z6==fyE!W418TL>JnYNbksC*+7)mGxs7 zi8E4tP-}jR_)8`gZmD0fr$7jH`xI541WFjyK;d|Zs)lG&&iVC6i2Ap1sV*xJ3x;io z&l~o2UiOyfiIqlp8jh~7vMCwS#Yt+UvQQa12A^N`9ML$UaUOy5uMch<(KwI5`Pama zQC#Lrur5yHZ*OpF+`NyYpwpDwvt0X%cIkS6#Wt+X;lf!U$0h0<#x8Wo@=lC8pL#9r z`XCY^NCyqZT7qd{39=S*IeDcIrvUCuCQR{I#NBmhpZh&RYCC!9c}-KevC_8{IaXvA z9WF9nF0s3Q&Mz{h<3%C&ErcYU5)f$@$)K(uENJ~wzzs_6q1 zn3DGel7_=^PQ&0RyVMK(h~}bUOQ2BKR0&cJhg~{F#uI$3?Uduk;N$ahXAxLF;@w^& zcdUGXavp*6ufGy*aPygREdA=Jt@BMq%6B4TRdRIE(z*2k_b3)!@$3<5{X_~ieHS#q`0s~@A=o?D7<>~%lKsC zd?5~e6s6d&9SHWQjZ&s)U<0=>q`L$N5|d4QC|unIi+HDmR|Lv1Ox$m*Mg*p*((wth zpl?)k1V?!1+1~L;tzsd8?G_ZG*n_guEmT8jJZe7pv#>?vbKr2Sryb!4QiFN z3OhHnvqFXpdQiAJ1$}8D6W^OhNpQivR>gPOB~#M4(v+11PtioH>O1Ag!m%B5q~XQO z%z8~Zf?`{f!V}R?JEutMHG{}mEE80=zJ|e?zgjnozKDFsBf(aZUD#NAMB*BvctO=U zX-?yhYJTnA$hdGTF|Yy_xNt)xWoN7~WYB~20)08EISK4h&9APhulb_X{i>?@^ig+L z15y4uOAVebo`w*6&UV7ulVpnAJdpZTU@1fyFH%|5@HVpX32+kFF=bvZ+7ciNR^PLD zP?MIRE(c|7ZW~_VM#tyWBeAVXu}zx50S8U#E~(n$ey#G)qI4D!IIWsSSPv=Ti8`+A z#Y5tVEhJQcAckN9mQi?zP!~kc&3?QWZQgCE2O-UP5si4-TE6%Cxy`Y2Ph zp6+={5CpRAnOBe9cfta1P=_P)CTZ7EH6tKWgQT%(Mr+xPNeEn%TKWykW$iSuZI}mF zBY8_JHyI_`;qbgABL_>H`9hPlr5w!oqliy_!0agE^E^C?__Y_#M-e|wCY@B+*1n^N zUrW4P)pEnX9TVnjP)l>BP%D)hDy@;CyqiSDH{Bh%FnVU{*0R2yI>{s~SZz+WBMf2P zE`?g41eSmh1z2z)#*;necDg=2HE*-#13Mfc1`h1Vmwgw4BXA2M4Oe(bTcm?UHL&q9 zCg*fSusji-*KsUHd#otO^}`17LJt%Pm%vdk?BT3QqY5YRNkH;1csf0)& zo(Gr0XoDkMDWKBu@cLmU<)d(>nX;fNkqAO|Qx(7~Rv|N0=*r~H_j#)dG*yszO>(V3 zgc#Df)!!5~;%cVE3#lOcE>aN&7MvG3lr0!Wh{X4l>D!N3eV4QiD2=nY-zf|2qIN+E z7ezR+r82!K2_ursrC5;*+Brnb$>qobW|Q{1 zW)g2Rn3VZAX5RGrrf+bDj8j{?wIW3I%9_;f45l(MWYff4i^aeGF_YqBxh7IcE8AeH z=H*QIPueY%LFgxqGjrlwfd$)hw#(X|RRJps`BtN{5Kw;kyYsdaDB94SXR>gCR%ho;Wf~Zv6TwCK`{gm}}2M zGa1Jvyd`$-D5Pa=U@0A<`Ofi*$E8V}&7u9-J5GOGr+>7ZEI!yYCp`)=HUD z!%%igE!m=u#COV(=)ZtoFM^=tNUcg0lT5GIlp`p%H7SnVUWv)#iK@6jgBu^oZu6AP z7Bk4^ViZ`V9p&{kzr@*EPUA;r2`8&30ZVpiRHLYxzfl#*-|mtrs9l{!aBsWJx8K8e z8y~GBIo&`cM0Q2h@Ma^aCf!9#L#7}byNgtlAd*-SPwF*tzGYNmwev*Msx^^#lJOWQ z)%hM@ z#&24@#+Dpm|bxEBtU z+P5r(>p*axz+WeV1%0}K(IY@R4JnH&AzH}R^z(9-p}~6+{p)*ez~NzpSl7W@v70Aq z$LFATT+3YFk{zD}xHdlf2ZoPp8M!d&y}@xUGhb4VYnjQFC&7L6e(=QX&E+GD~+&t)w~T)B0lyDf#GiWl9~-%LtkBCB{pj>cYaS?YJ!T zTVcq6LuFiUq4kEUg`2PzAoj+9rmVearVyollJNyPYEP&IXxXAD=<7du(ZFvd7B2s( zW5m0!Ku{DkM3~W3P->F&Z!lO?sLZ7Nm5XKaF=h}zI=%$R7Lr!Ae>{ZLwh`c!@e7i& z@Wwyb3F|b%<&vZr-(bgOQLQ4bE=Nd(A==~BBw9Zq6_;CO1mY1QY9l*E6l091Et(EO zq`Dldq=Ixj?ozCAi?PeR6c{(sBxqBSDJbCGLJG>jf~K^4p`?fxp@;CC*0+`MUBC*l z9Wu($n50&zC{f}Ja7{5nAvz``_hoz&Swydt7Of}*nIb@U%5eoMjaeg1f*F#~_#lF6 zP+lD$*q*xyT*#4zH%+5tdJ(6};z!XsB266?QyOf76Sa}9ti%@092!fq*(uRX>`&VG zNnUrCg=?h{k4iwS(r{%9nZg}!h$@X)6DN!m#x6$P@K*ng!o*hDE~MJkOu}1x z@XkN6YSoinIwe(11gcmFf;CB6otl&c6q7n72_*=2N&v_%G!*Kv7EjrkjfjNc#ZoXN0SMRZ-LeHg1@ z5>@0*iDBf(CeakD@=BDgN+^16q}A5}Vo8Y?wZth+ZJE;X3x${<2xQx1d55*TK)WOJ zCeh-1`VbK5pveAYv~&@>NeEnLQCl9MGad~C6oN9974g^1meNBK*O=!pDCFVwF`Fi&LU)MHBQS5a9aO zqhd&lR|=nmw8X$Zq*GL3G9|47c6V**g;6yuQzTnEB|(-{s!0j57}f}@Res2-FCrsx zK{a7O4+)Ye#VRFa*rim7FLe6LctNDGIu4kV?+%hsf<+l}955$iOQc0%C-n$wl|d1l z0W?i%)j)A>o=U6J)ZU(XS=)UlEU;%Df-`RtMX5j}N`hSm(-zHW=^l5J5V+35;xZpn zYVD|+(8@OWi^N<_D%q%C+N$l!F48vG`q<|K%|gr!?r$^+J$f(2+r&C*NGryN9ymqzdN0z-mQda zAzO3Y5Jzb6Z^mn?M?GHQQGK3B`@u@q?-V*!ZH*$i(80v*r7Nt`3F}wsDu!i!VtDU4 z1&gkau^J|66|P~F*FhwKl30~j(t*SUDv?Io<67o3P5AkLYh_mtIj}V2QX@z}j%%4~ zvDh=3a%W92r#os&{8D0i<;WdrS11aLM}qQ*0(U%-IpdF)6q6U}M>U+!i=!G|E0WcX z<0ZwlA=>}zmlCDD^!yHAQc!2Bo%7ZsLD|xpm;y&NH_b417fm-Riy2HNr8G!oFH!O0 zkiK^b=Y`ds0wTcjr$cQ5i*TN^D!YkoPdpY5GtxC8S zG*)*BRU~I?n5MY|s_Q4V3yw>UG-rh*O(>O-Y=OL`ElQ8{a$=P#)qG_kPc8C_l+;kN z#0C@eVVC5HfgYaZq3pP@GH@&;eQFClt@!5eQ6=q zlSr%*A`Po_3R^W06uOoqm`6S65wEaDjEtky=#)4jU2DD2K*{);gr~w$BPh1r1utjX z52zy)Sk>6rLv#wzGQJ@S*3!Cn%2u_hUZ=~VMytETcQLGtlC$cd2Y7+9dAg}xzno-R z-n^V1>$Ipt5k&)4@a?_EC1KOWw@>~F@G4?_4S_tI8fX5>u91x07b zuOv%N3Jrt<9iP&JNbwe!m9X-kBI%%U!Rh-^Pxpl2xUj7LmvfF+7gs1V>mT>69MXLK&E9C|2#^l_{-jVpZ!J z#~~SpYE*{s|1gvE_f<&DqRFAb~m*L zYeL6IjYxo##58_^`vuC((s1`hrnJ`4c+J7UEhHI%CB!p@;lQ+AX-M&ms8y~mtG*3cplsTNnq(w! z8>3>?Lb<^PtybZb1%0a{cwAG%ni`r=nB#j6N?mIa3?ZfWuOy04kBUa&ZQCfZT9BQ1 zJ)a$W6_6-3s;L5)vkN@z6oMn!B)-=XKP0tiO2beuB)kiVbV_y+F=_db*fy|vh`J$( zC{Mho@=$E!xSp%@sFE$V@Ip>`Yz;e!YDpe$pmNq_p;LFsX;r4QA`6|m1v0iWB_{2$ z5@qX@Y$1-+3z4Z}Ap%m9;<&`BTWpsNK=OsyCNGGGae)Hshvmjfvnh^?7sXnYGl5dx z20=nRaMSp#zv(kD1W%VGVWue6BW}6E`e$B}^<_?9>hu-P{VbieQ#7_$IJ11r3!o>N znLky)SaV$#%5h87;B)sT;Y73=yc=*q*e4qbF!znfPqDAo{ j1?=oKQJsw4*XHNxqUG)rudqJxiw}OZf0KXw>F56gg&+vP diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__c71b4f8d63f8a1357936129a226f99e349e7b21b166609cf59062e27ed68a1ee/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__c71b4f8d63f8a1357936129a226f99e349e7b21b166609cf59062e27ed68a1ee/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index d438f5cdd3c70a33082da0d6fb21c942f97f77c8..e64b73d8a77bdd2ae7413c918f513e44a6315072 100644 GIT binary patch delta 2865 zcmY*bYiu0V71lg<7H?!{gQ0d}XJZFHSTnP8XJ#LMZR}(n2goKiL~Wo-$W|y&Dj_ye zTO1M;qg0@zO0axVA0m`?`>QP~5E0Y@5{ZGJl!nMbNTyLBwxCo%aWPFQRSl|p&b_-a z{k1bY_s%`%d!6~$@#^tcs!vSm)yXb9CG1qnPWg5Kzuw*q|IvS_WkCF@4GtPHfFrH& zj?uY1m640mye<{kd`lOiyr;)JZ+W~RfH%T*cw)0*o{WbkG$`zFp?KJYV%~=0LIzeP zZHTs*@TUeBhrg?t5c|Y|XvD?414E3T2}3UD;HsB3A1Brsf|qI@?5cI)LahatTo+?$ z`uoEc`3U~L+SOBOSetX<$gKjOp4MG#x>2{_gB1bHt@e0t&d2@h4IiGVNkeGBgNHp= zR%Rio~3*cy@dblTRL!mp2udXp{oY|&%B8Ufs5B3A&pOaOPq16+Dp7t|7bL?AF7$Jzp%_YD`1 zOzUB|Cm~6~ExhIZPXnC$f#%?trwKTo7g+2vLeLcV@RkADT^RanZEz2GF#3?M4lFJN zaLNkfwiMyl(?N$Rq&#SPNbu5u|J}R@lun2SSesS62PA9y)gE$$^GQ3U4D&)H@_n}!}(gxh5ok^q#s`r1jTz? z7{0-TealsoTnt9n5Ou>F3G&IDA+$8UkuyB}piM~-SSyTSzK>Y^9(B#_?C+!{TQ*Vk z6=vj`Ydr)?MOZleqLv1|P2glbU7T_h$(AjkeBjE`+FP24Q=S+!TGm zWao6?<=-kckouivyVYgOD1>n#)uqpEA6LWVY}a-4zc9c;ZHS2jS{)E;yS~})&VM->!Um7hs@6RVSH{a z38zw2(=#MuZtX8C1k;MMx092&uIjCX`o2zT_P$#M{JY)d0D#8qqQ`Vfk7GSzJ z4SV9RT2hv}A|r*Oj6g4|gv@oHojXLLg64t`vmF8+kNIT@UVk~mOo--)0p8!Wgkp0+ zTEc>%SVHMo1*yXh2*K;&1T~U^e3gJl1_hkENwAGbZ3BugC2}S*1lYjZNlH;jz2L5P z0<-U`2d6Cy&b14ee~hwe14)pz_V$+&OCs=zUY`u+9vI0!HImi-IFi-v&!O;j0B?Tj zL2<^{Q%QVc8-*A*R-&M0XD)q|)V0%usTy0E<7~GwHDxRg-A$7n5$8#(AkB9zB#4U_atDf+zb;rZR9W6nT5C7`)#H7-pW zKZBQ-37oz{PbvXFaZL{tH_@EZ-199og~$~YtGH>SvKpIRg#)D?wN6^8G=_h($yY0T z1I|D;I*no_1-zK2n53)};NC2ELurtNQV~LFp*f(Rf+)6Kw}xiyQ29ABtPamCLD7Y8@?}<{$43^pyOrppTd|%=a++G_U7K z)hk?1H4`U)NAr?}h{GAfp-&WC`<0%Q39iT%%p)HzRQUDN!8C1^d#2X7*he9avxoHz z4y~svLiBp6HfL5^2FRg08a3l44E^4Q#@_qY_?Y~LrYpPfVn)5MnM~IfkgCbrVf;l0 zSw`9Ku6kEeI&~9$R9I-|X#SnxDC5!nK%KFj=v`!AMMh&U*?hN2Ux;OG*;v?M{6@tF zwwKjNgF_Y=@%SvJO8vg;e@oOnjCejPB_Ho93;&o+sW=nDj|PbYqph4sTjFYbNF7q7 z;e|ibZ2pAw6zVMv#8{y_2@Rj9w9k4DMqVvXs_GGPaepRF(H+nM0ymdu Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__c71b4f8d63f8a1357936129a226f99e349e7b21b166609cf59062e27ed68a1ee/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__c71b4f8d63f8a1357936129a226f99e349e7b21b166609cf59062e27ed68a1ee/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__c71b4f8d63f8a1357936129a226f99e349e7b21b166609cf59062e27ed68a1ee/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__c71b4f8d63f8a1357936129a226f99e349e7b21b166609cf59062e27ed68a1ee/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__c71b4f8d63f8a1357936129a226f99e349e7b21b166609cf59062e27ed68a1ee/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__c71b4f8d63f8a1357936129a226f99e349e7b21b166609cf59062e27ed68a1ee/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__cf2a2febe0a535f130d2eaaaba3f002c094511cae2fd57dfaa6e5ee607cd72b6/msg_GetContestedResourceVoteStateRequest_b620c564a9caf806d2a4053efc7a8707f36bc1837a661ca9a4a3aae3ab30da7a.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__cf2a2febe0a535f130d2eaaaba3f002c094511cae2fd57dfaa6e5ee607cd72b6/msg_GetContestedResourceVoteStateRequest_b620c564a9caf806d2a4053efc7a8707f36bc1837a661ca9a4a3aae3ab30da7a.json index bcffae1ab768fa62179ab3a0b6e2990bae8ebdbf..29e72952177dca4d688e1faa5a213f9a21baf56c 100644 GIT binary patch literal 10755 zcmeHN!ET#C5bfDtVfoB~wM`P|)_oEF>Ka@*~WpmGSJ}<6~ zgQ_EsrZuxoy57BnN$%%wuc4m=FClf2W?zCRnPF9wY{EaVz6Ke2{Ghd8lg;vs^iz z>v%Mv8RdBMa^My7G*f)jf^xDNyXAsg$GbgsSvcNJWzxRnRjpY#%e&GGD5CRIOPDGhp)!9P&;mq?~#;Yz`TL87~ zfWBj3=V}v>i%kP-3@A?W-OvqDZ$|qLi@G@Y!PRRJN{VFTJK~ zUHxG2T-fGgo;Do300SIy@G$X!g2@Qr_&1QD-VnLi1Q;;s!N&z)>KaVgXo_$P5SZ^* z7v~Ul@z;vMIYdAX1Eyi?qQ3L3C*(p?xED-9zXk_CcrLCe2tfavsd1zzKu2nqDH8z4MMJ70J{=J@mFco#lgeG znTP58)~o;H63>|!G@dp>E^dO@1n`212W(SUr=xOk0ia~wO2LG>`mrGpC71@!#l<#w zUEojvFPH>2xXI+|_Ec%S8g6Yc=|SWE;^5(RSw#T`N2q5S&ka;M<^jufXuywg=z$Fm z115n(u0we7fS`ATXHmf52=xrKx5dPswz^5 z#`escHy<97<77JZ4yxRzMeaRKk67vrpE6eKBCpD1UB&4J+s}=PRtus?JQn|24$c*M zX-ng6igmqJc@Nih!NePP|(EXZkz9+9L>uMg7tXBK0 zezU#fkbnd~E7L2KwGSyudt(|n!P8x?28`dw|}B**i*uTYyb{}~^OO2rj4 zKVVvwwW2jt$|_Fur9`FDw^WtDdMlup*I7orby4S4cXL-32i*l4vEh5d_i1vPe3=}* zZ)NE{JLr)sZs5Bk|~?xmJpnVkJem5|J+=2-uM#3L0S{qJ(t1gfq6xbhNl5Bh8NEC z4(5g!b{bniodxoN&;+O%_63uKzaE(Y9XRksa|#_7(D9o@5r+&RG)cIm&OS2X(5lZ6 z%5-W3)&fFPy9;vP96N&n+E(<{50FQnqQU+dLzPbHi#tZ>C(|ZRWk<+7qHsqzwo?by zPD|KU3};Zswi@pXi82!a0xqC^a~=Hy<;VSUrln}EX#(rK&HeFfY{71#6DxUk;^^xo&g)S2Pn;M`A3 zpEFyOINY)M+@>-7{&IwD^BEIzr=vzvWd(av^fD>|We-@J7!%$xw{_@Z5XZKnSK*bHU+{1is6CDtQ2xi^394sf@vekP??m@1E{G18hk~XTC{J zO18J_2ytL$&syERdac<%kpKGGy?dX3|MKm(-@JMK`ETz1HQ)9Z9(?$DzWeIU>vwNo zeD&`6H(%$Me|s$HvWJfz-2d>+&4b6MZ=OB<_|4O2AAf%H<&)Dl4<4Sr`SP^?;ltCi zhmUSPE_-}lb^7_ugVQMwAD$ol@X^QZ&rXlJdHBW0-?%xY^6>Pio14?_$EU}h*E~Bv z=(PUnmmd#!bo%v&k53yOowGQ{_w=;m=Go~{k56YmeKHyN-TR|H|N6~W-~H+3>vzxJ z{pHUupTBVsyfBo{mKm6{WU%btZf6v-~ef{;nz4-mhS3h0( z{fk%Mz5Mn^{C`x!y?Zw&!tdQXrIg=#aKiT9y>lk{&6^X`UHkZhqCRAF@1(h(p7f(* zZ*ESw_F*Tse}2?Y7M~UHvnbE%Iv)Hn%Aeu?_T{(Vy&C8Tt`Cy={KczRZ~p7~H?O~X z_1)JmpTBzZ)gNDe{rtu2{PX*7--VlRUjOIw@87(8`TSj0{v})Az5VXx2fni8?YrkM zT7+Thn?HQ>@@<~=hc{U_iuNenvFhWJAMusIPb#{;D`Mk+zh+!MD($@%V#z<{`Ms=a z(3Q>H^uzlt@$m0nzsqmF{_fSQ55M^5w{O0$IegghL-zgf*$<1{wo!me=R)W<8u;b!)=%kno7g|;^QOothniu2lt;mx&I`)@@;p#Pk21%{Nv;M z&l1{^@p$yJC&#bk!AGElBf<8#AeD7p{-7x|iupUY1l5SXY&cK8xILT!Q$T-z*5i-a zFs%HN=2+Sh4u>+9CyI!7f)^ZA6|L8bn zc}vAAS(E}=9~(f*$^sD=%aM=uy2DyCtnpavy=^N0VYsNtrL}s&GY$dP>qqkjc-Rdn#9?*e%IL zD_7R{`4KQy`Z^b7;i=KrteuONxzINfZ+N6DI^q}%>G?ZYg+Zx7>K(Lr5VxLh*JEjS zOXPa%(0dvxx?b?<5$Q_OVf*}uoT7?cW&KX#(W=TjSdn`meJwhwpa6T&VWNtA2z@<5 z`paB@>$UPMLUpI0B+qY1X)dbsY>~u!1g-bFXd>7m*R@gkMH}+`QQC>hPN5zo z^+t6BwqCG%r*xN;`B+~WFAtpElCq_anU1^>l^ikQBHojQO6zb%!YYBSudjs)7qqw# zNtfyRjnata>M8DrRN$px&p)xo>*`|cMR>zWvPDZnEphmjoKopZ^$m5Ii*DEmsBg?4 zwlj6B{x5f*k%)-|-^=BQRv*!UDX&{WgE>40wvhV?_*w`Mv)JPxh%`Wpn`SV_VyR{b zOwr7&EPDPiHkgd{EoF`n7pnaVs*?z+#3O5>yIdzQq5~%%or;sVdT+BxR08i#;-fT# z^q!*KZAh0obtV(>y+)PcL<*`~j=_vb`P$+LLlhqT`z7N6X|)eu?%LWQENrP4#&9`D z0%Wjb!3dS(`9M$#9BaJoiJE?%pI##xt{_QfM+y|xB;qb5)OLo?FBjA}a%C1^lXX!N zMJ0uut|5un%fr@Gy9DkUz7AQ7{smb;h{5h2Ax#6}uVR9I@9hR`odUAu5gO+Nt7LOY8 zqo^v6h>A)zEswYhP~l>oh;S#5|(xq8@eU&ZpnHTm599ZSSD_0iMFWQ zH05wDC~e4NBtkY=g)3G*pq6VqC7woxFcH>*-B3H)LKD|pfRsiPPXSWmnGi&Z8)_%I z8^2U{7MxXD3(~m?ewvGnL!*4ylhcoAmKe@2R*=Lw5rtQ3r@)Gq zs1Rszkx^CP?S|qhGT~Ri+)!P!7W``zVy80;vKO_}pp>eSs5(5zM6KHB!>KA$V$wm1 zs-_&2$iXm$hLkMCzPcr+5OHZel!aE1sG{-5F^Fg!!w8&7ftVPpXhW!>fXaWAGod=R zEZZk=%>$Mp0wW;#xb((<&%fks*)772fQU&ZTXu4CV;2@gewitonQb zs?SeUly$6CfYo@iULmshQ{6PH$JPj+P!NcOm{jNu!(f&omH5jV6K!n7VYtmk{Dn(sLMXRkH zTA!=5tZzISIY>y+s<6-_vIU9g5$a2lMWYILQgoGHu$8EK3clQ!feFI30uUm%1gZvp(@6@~WhNbC5bQ@Vw0Fe1^Gkt5VS)X-46RWD^7=ch8qcv`Ip zk;R|trWSl%?iT;g7jz^D5j4azF2(61I6Q1(D~_5Y3a?<*@taH-|L{+*HuC&|5~a|rGvP~jNJzDMA-$)dfp<&N zm%wH&BCV-Lsi}sP8d)y$W+9?#7GCBps0~Ks8ZsFXK~^e9y#rj~Lf~ywE-k{U*kVW{ zD#-c(s#q=Ssz;=9g~8IXAw{e~!m26YoVgBBg&~j@A9uEmcGdzX;;y@}6kz)@b^%&n zgs`1F5h^7H>c!SO5YcQ_YS7{Ya5IZA)* z^J#P>Q$opgq`?WWJ|@1p<9kTiJVIEQSy1k>*d!rF#NaPmqCJ_=7&FpxBx9yBf6i-s z6o1D^EG~0~jax~8qL8xw_*!p#VY!wl#gfH}ZBL;i!kxHEwQ&qo>xtKRMIp^v=Isfr z(AO=Aihv5;(mv)9)X_3W2^T#gSZU%L1skkr#!G9KsJN9U1+ngyYPc3`>G>rhA&ER1 z621xPmSY!`UZN5O8bngmeR4XNG_P(MU(5Y#oI)wrlZCi>gjmPSLUOO1?u@v^({iAA zBD|OY74_&8%iLAl+9`sPh_H*v1QHLjP&rXZ2TIh5N?)*&Q@RB|IOrCCz1CBtQ}mRy zFa;SKWec3tp7Dcp5<2pQS*+Xm;KHg84P>YKkn3@TWt}WUPCX)Wk}btHiAXh-Xq1Pp zS1qZ+n{|dX8M8@#l&>w;LY4+Z;#^4bjBc{YU~^GP++xvU~4WB*+R2- zu9m2%R+IG2Sr;OYghYL|i6;>ptC|Q!74sCVSg{ANlttqg5mp|Q!WfeXr6VK)cG5?I z;VY3IA(I=SdUuOk2m}k&zASEz+7SQ#hYfAeDtl;uB7>5(A$T7ZdWyf`;z}IaTc6K2 zgol6dW0r$>Z?~+c5PuV3Rd~JpV)^S>*p4i7Lbc?hMNg6TR2ERQeLgC19HBbTdYVFe z3O4j^31T`aB{20LG?PI+AvSnnjYX4Ei4$ZU9yI+}mK4j(9ZBgpAywbSN#yQaYh%ve z7}_P}Q6P|V%pnj7O0x!)yOgaY(t^TINoMYpi!5f_*?19=I>J(|AIjaoC`Gqop{>>o z7}%#87>Y!t*p8#3+Jj3-scr?{$%xEL-I9<*z1@;-E2j|S9mxo#qrfSJ#)Fegxln}! zBI&S+iV`moh*h^l>QaD>DpE(f8<=b

    D^|p4jA+=Hgo#82V2UBMp0{*GMJzBD_Ap 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 B#QgvO literal 135501 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 Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__cfe3ebd0f17745be80e4348304fe468f3eb8c2d17e23d310582b0b34f2d5bba7/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__cfe3ebd0f17745be80e4348304fe468f3eb8c2d17e23d310582b0b34f2d5bba7/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__cfe3ebd0f17745be80e4348304fe468f3eb8c2d17e23d310582b0b34f2d5bba7/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__cfe3ebd0f17745be80e4348304fe468f3eb8c2d17e23d310582b0b34f2d5bba7/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__cfe3ebd0f17745be80e4348304fe468f3eb8c2d17e23d310582b0b34f2d5bba7/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__cfe3ebd0f17745be80e4348304fe468f3eb8c2d17e23d310582b0b34f2d5bba7/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__d7532a56162a82dafbbe07d40821db2e8768e2e6a880e7a66018fcd90fa35c71/msg_GetContestedResourceVoteStateRequest_3fede5825779667ef492c2ca1744ae6d7593e5a08c8e0c9971ad1afc8c3e1702.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__d7532a56162a82dafbbe07d40821db2e8768e2e6a880e7a66018fcd90fa35c71/msg_GetContestedResourceVoteStateRequest_3fede5825779667ef492c2ca1744ae6d7593e5a08c8e0c9971ad1afc8c3e1702.json index 365e4d3cc5544acc30ef0d0961d83f5149815fa5..c794b9ff5aa807774c1f437159f8569877fbb384 100644 GIT binary patch literal 5340 zcmd^DO>dh(5bfE&0&(WRE@0!_dg!g{ABZAEY*L{Th%mT~BLDY3SQsV@p*C?URXx~R z_RYL`^RY|fmz8DN$D}-@MQ-0%FL-P=Tw3F4SL9V0@2V)>WBax>Y0R|eI`p7ipFM2D z;UU}(Yqbg3gR9xYhWTsF%(SNlGoM?rwQ^Y$tvRvw2KOzaQhGfAilw3%l~T;xXSCdA z%ZZqMxETU?Y+w7#!Q)wQeIfHuTSn!x*kRCh;I0p4?~7ginB-MdJwGK;9zQ1N8g?J! zG`Gnr&G*SKLZ9Li9^YX5Ip2Sc?~`n7d5p6!gr3A=jwY4ms2|&d< z-PrmxQIwIzW^NqmRam81T^lmiZ5e80%qKvo4=P3d%j8gJrurxsjf@>vu&v32EI-!2Sq^zR2IfUp``j93ixE>1F z<#m>k-L9zf3Y+U7@Tj!*Q&}9FF=!}T!6$s5R;Sgc)r!;g41Gr_-$9oY zD$=w^DUFZ9r-9auQ4l(qRLo)EIsq2gQBI)SMbPYHr}>6KyV=hy6(F-9h?plAhM7Y~7h?!m6Xfq3A;?EQts*_Al6qF{DZ_Ilb?THLe&Jf9+V~4t`{;>*pm~ zN&T8Bl!WLM$gv@aj@3B>(94)enILm9o;gwEC2rB-2utxahi|1!moS$>DPN0_WXOII z^w$(l-8MrFFX}RhpUG<(B&)G3RzEgFg6B-{J7dj=m(a|x5%f|IcxtLnH@)AbA`Jnkm!_;S97amXy)Y#>A_Q#LHMTqSu;U ziX|1k6O!W3A(WM;loy=JE54-qeoY+nbMlha=n1?3?Brh#lUEAGT0}Sz>yLyVP{Ros zeKqFFyC~($?%rO;oWhGP^PX@bF9S`M*BnOqS0xz(>VFXE-ZJ<-p(Vt9f`7yiZtFQp H2Y096;%5N; delta 416 zcmZ9G!Ae3w6ov`z9q+_|)43y|hPV(*nHK6ydfV6=6oNa!$LKLE{!Po4t;$CTdW{yX z#D$AqK^_U4uX>jwdq*+O%u_o2zg-mi8UZlewwu|z8&EQGBTrOh`OXIsdcX(ZWU-D+;a@ zcP2qQ3A26oHj;doz=p3_2*PRHV0!Ie;yzE8##pMOpPdstmd^2-NN7!*RmPjCegQW( BaNGa@ diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__fbed6654145b9fba061d182cac5a3879bc9bacb92dc9ae64ed2a07ca2ec0392f/msg_GetContestedResourceVoteStateRequest_e1399ef22320c9690b1c8e548975839e9ea0c40cd94caac5746b19857d52533a.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__fbed6654145b9fba061d182cac5a3879bc9bacb92dc9ae64ed2a07ca2ec0392f/msg_GetContestedResourceVoteStateRequest_e1399ef22320c9690b1c8e548975839e9ea0c40cd94caac5746b19857d52533a.json index 35850d8b944cdbae2b4380b8d1dbde6fc553ffbf..8dd21af3512fb65040dd73939db6b99f55525049 100644 GIT binary patch literal 124610 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 A0{{R3 literal 124070 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 Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__fbed6654145b9fba061d182cac5a3879bc9bacb92dc9ae64ed2a07ca2ec0392f/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__fbed6654145b9fba061d182cac5a3879bc9bacb92dc9ae64ed2a07ca2ec0392f/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__fbed6654145b9fba061d182cac5a3879bc9bacb92dc9ae64ed2a07ca2ec0392f/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__fbed6654145b9fba061d182cac5a3879bc9bacb92dc9ae64ed2a07ca2ec0392f/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__fbed6654145b9fba061d182cac5a3879bc9bacb92dc9ae64ed2a07ca2ec0392f/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__fbed6654145b9fba061d182cac5a3879bc9bacb92dc9ae64ed2a07ca2ec0392f/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_list_bug_value_text_decode_base58/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_list_bug_value_text_decode_base58/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index d438f5cdd3c70a33082da0d6fb21c942f97f77c8..e64b73d8a77bdd2ae7413c918f513e44a6315072 100644 GIT binary patch delta 2865 zcmY*bYiu0V71lg<7H?!{gQ0d}XJZFHSTnP8XJ#LMZR}(n2goKiL~Wo-$W|y&Dj_ye zTO1M;qg0@zO0axVA0m`?`>QP~5E0Y@5{ZGJl!nMbNTyLBwxCo%aWPFQRSl|p&b_-a z{k1bY_s%`%d!6~$@#^tcs!vSm)yXb9CG1qnPWg5Kzuw*q|IvS_WkCF@4GtPHfFrH& zj?uY1m640mye<{kd`lOiyr;)JZ+W~RfH%T*cw)0*o{WbkG$`zFp?KJYV%~=0LIzeP zZHTs*@TUeBhrg?t5c|Y|XvD?414E3T2}3UD;HsB3A1Brsf|qI@?5cI)LahatTo+?$ z`uoEc`3U~L+SOBOSetX<$gKjOp4MG#x>2{_gB1bHt@e0t&d2@h4IiGVNkeGBgNHp= zR%Rio~3*cy@dblTRL!mp2udXp{oY|&%B8Ufs5B3A&pOaOPq16+Dp7t|7bL?AF7$Jzp%_YD`1 zOzUB|Cm~6~ExhIZPXnC$f#%?trwKTo7g+2vLeLcV@RkADT^RanZEz2GF#3?M4lFJN zaLNkfwiMyl(?N$Rq&#SPNbu5u|J}R@lun2SSesS62PA9y)gE$$^GQ3U4D&)H@_n}!}(gxh5ok^q#s`r1jTz? z7{0-TealsoTnt9n5Ou>F3G&IDA+$8UkuyB}piM~-SSyTSzK>Y^9(B#_?C+!{TQ*Vk z6=vj`Ydr)?MOZleqLv1|P2glbU7T_h$(AjkeBjE`+FP24Q=S+!TGm zWao6?<=-kckouivyVYgOD1>n#)uqpEA6LWVY}a-4zc9c;ZHS2jS{)E;yS~})&VM->!Um7hs@6RVSH{a z38zw2(=#MuZtX8C1k;MMx092&uIjCX`o2zT_P$#M{JY)d0D#8qqQ`Vfk7GSzJ z4SV9RT2hv}A|r*Oj6g4|gv@oHojXLLg64t`vmF8+kNIT@UVk~mOo--)0p8!Wgkp0+ zTEc>%SVHMo1*yXh2*K;&1T~U^e3gJl1_hkENwAGbZ3BugC2}S*1lYjZNlH;jz2L5P z0<-U`2d6Cy&b14ee~hwe14)pz_V$+&OCs=zUY`u+9vI0!HImi-IFi-v&!O;j0B?Tj zL2<^{Q%QVc8-*A*R-&M0XD)q|)V0%usTy0E<7~GwHDxRg-A$7n5$8#(AkB9zB#4U_atDf+zb;rZR9W6nT5C7`)#H7-pW zKZBQ-37oz{PbvXFaZL{tH_@EZ-199og~$~YtGH>SvKpIRg#)D?wN6^8G=_h($yY0T z1I|D;I*no_1-zK2n53)};NC2ELurtNQV~LFp*f(Rf+)6Kw}xiyQ29ABtPamCLD7Y8@?}<{$43^pyOrppTd|%=a++G_U7K z)hk?1H4`U)NAr?}h{GAfp-&WC`<0%Q39iT%%p)HzRQUDN!8C1^d#2X7*he9avxoHz z4y~svLiBp6HfL5^2FRg08a3l44E^4Q#@_qY_?Y~LrYpPfVn)5MnM~IfkgCbrVf;l0 zSw`9Ku6kEeI&~9$R9I-|X#SnxDC5!nK%KFj=v`!AMMh&U*?hN2Ux;OG*;v?M{6@tF zwwKjNgF_Y=@%SvJO8vg;e@oOnjCejPB_Ho93;&o+sW=nDj|PbYqph4sTjFYbNF7q7 z;e|ibZ2pAw6zVMv#8{y_2@Rj9w9k4DMqVvXs_GGPaepRF(H+nM0ymdu Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/document_list_bug_value_text_decode_base58/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/document_list_bug_value_text_decode_base58/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_list_bug_value_text_decode_base58/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_list_bug_value_text_decode_base58/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/document_list_bug_value_text_decode_base58/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/document_list_bug_value_text_decode_base58/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/msg_DocumentQuery_86beaec40825e436c6a9467bd1af6d2d9dcd58c35b6aa9e85398a105dfdeb9c6.json b/packages/rs-sdk/tests/vectors/document_list_document_query/msg_DocumentQuery_86beaec40825e436c6a9467bd1af6d2d9dcd58c35b6aa9e85398a105dfdeb9c6.json index c4f3d801d33384707e54b547bec04bec0dd83b43..9b918fc102cd93edbb0459df25c419dd25e6ed56 100644 GIT binary patch delta 5289 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 delta 3436 zcmbtXYitzP71ogP48|0%AO!@**hV46n%SA%*|iH1#o#EVC18_6X&o>Rrv&82S(KPZ z!o$3&46NlZ$xTv%S2f}h;&{PP#6!SJq@fa!I*68rm}J|4fCPetTIbc`e)o=-^nWE= zYt7z!=A83A&hf?f_5YlCAbDYA|7g^T{Md??pm5Yf=$E%xFR`K?{$4%?@w|Nev7|^e z_1AR#H7_zOGF}~xSW*6XykkYfe8QXEhAY4FuqKTs{lKZRY25CMqAdMbgk*EGU*=7-F@lIS5SP%?T0lV2)-XeZs_+Y71{) z452&a;nZ>uCm*pzV7L}W*>gH$6vI6hMl5Jz=tk@C*h?moD?R?|IJnD2qSiz8mM}X1 zVWaz!jyq>8Bnu5(wL&5`kngU2I*hd!U35k~{+jr9k);j>riW$mwya7dhcPktRUNVI z9!{rN{50L~NbG9|4Sd(Ou#KsngR+>8_W5BX8g+bAVqGFe>Z2^}-0&Oy@!KWJTJ81WSIY&5agu~50x#JOWEW~GT!Uswn{ zVT!Nv*s{^HLx^=4=#dvEuzdh(M zU@6S!J$(8vX4Pn5-sECFGmteYgzGD#D7#UtV5w+x#Qx#zVB&y@iQ6r>b9I!Danb%8 z1}W6Vf#KxEj+$R16?ZXjY*54oOVA=Aj40>nn0!xc?34LP-hE?)e0ZC0nfXruW}J!F@Z6jnADFna7#S#ZocMp zG)(y_t9dM$JCwDT#f*-;r-}`v?%ExzXXk2)>`5<##$_3)NW!UZC=8m5Ek#yih9#PG z&BV@S<0N=ExY$N|gCUj==GzjEfiG9sDBD9p95GS$6RVF}Q86@!k_@~YR!Y3r?jKIC zk_QZhPVz(uy|09^p_(WY^%3R%nb?~Sb>O05PDl!9ks@xKf=FHF>mPRRlQwmgf+1m3 zi;RwV%?kna-eiObL0GEenW#^?cC-q8^q%kZOVmA+-p|~k#I5FyCDqO=plc< zgeQzPFM>-!4=p6G>{VqerJgdxq#-hm6SSAPo+@$1)L)`=LX~2B`mm&#B5g<2i{dBC=2T3my6;W zeo5-&7dmh*gvdP)3T-mvwGc zG>}bTF*jT_AnsI<4-e^>PWi6;Q&=p}wTSFOM=HK68_9Dv9(*=}4}M1VQv9Z0l@($hWZ4B&TLG<93cPP#e4SZK-v8Sb&A5x^C zhEq!9n@r$xn8r^C(-$&-%Z(cq5v*XrqnzyY(e_Yom)7x@7XY$SvUI zhAF0aY%nXRo^0dOv?J0(wGxT5uLZe8WJcF#8$1H*cm4D%5|r`jS%}xnLBZeVp*tBu zSKD01R{mq+1L4R~(NU4UHU#y1f{N=h+q$RyntNr#zk3p$9}?HkWmd-jf9|f`JT}x( z_Vqveqx-ZYplSQL|CC_&+p=e#EU*-9k4vH$SWw{N<}^=@T}kS6m-HVwj^%g=i&QR& zdw+0rH<(C~_P4ik?p`D@s|{3rY~#tvvK|B3(GXVsj>_ZCBC-Ab&P<(LMV1pG$!Z<8#xYC{smKP#Ayc7 z=Fg6nk?F`B*_k)Rf)TYC1~`o+spjrg*mGI)GaPh-qo%e5mG3d$p;Ej^viTFxMXTfD z_IhTv+6A#!#(F418j&@9tx9a?w&T-4!~-O*M7MpukEDCHSmhy?uY}{FshGm!GWPjO zsenkImIFUgE3K04rSVEnIJk?0?u0L;b!mU6UT{^O zBSmT~eB4IweYI4qlB;vFkUK1~IJqyQXy!zPSGFn>6gvVulv&d%NSA*f^Ta0usI{hI zZeK)1qS1$(Ps=-{em;^wfhRof?jCNv79x2lLzTOdA1huqu1M@C(kzi2sqG_yILFw= zmPu-af1j7^WzI)FA0!U`f^0~zLNo}1dw&Od)Hh~1eOJ%s%ENIZ*NcaS>=)u%64S^W34ocS-_ ChI~T+ diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_list_document_query/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index d438f5cdd3c70a33082da0d6fb21c942f97f77c8..e64b73d8a77bdd2ae7413c918f513e44a6315072 100644 GIT binary patch delta 2865 zcmY*bYiu0V71lg<7H?!{gQ0d}XJZFHSTnP8XJ#LMZR}(n2goKiL~Wo-$W|y&Dj_ye zTO1M;qg0@zO0axVA0m`?`>QP~5E0Y@5{ZGJl!nMbNTyLBwxCo%aWPFQRSl|p&b_-a z{k1bY_s%`%d!6~$@#^tcs!vSm)yXb9CG1qnPWg5Kzuw*q|IvS_WkCF@4GtPHfFrH& zj?uY1m640mye<{kd`lOiyr;)JZ+W~RfH%T*cw)0*o{WbkG$`zFp?KJYV%~=0LIzeP zZHTs*@TUeBhrg?t5c|Y|XvD?414E3T2}3UD;HsB3A1Brsf|qI@?5cI)LahatTo+?$ z`uoEc`3U~L+SOBOSetX<$gKjOp4MG#x>2{_gB1bHt@e0t&d2@h4IiGVNkeGBgNHp= zR%Rio~3*cy@dblTRL!mp2udXp{oY|&%B8Ufs5B3A&pOaOPq16+Dp7t|7bL?AF7$Jzp%_YD`1 zOzUB|Cm~6~ExhIZPXnC$f#%?trwKTo7g+2vLeLcV@RkADT^RanZEz2GF#3?M4lFJN zaLNkfwiMyl(?N$Rq&#SPNbu5u|J}R@lun2SSesS62PA9y)gE$$^GQ3U4D&)H@_n}!}(gxh5ok^q#s`r1jTz? z7{0-TealsoTnt9n5Ou>F3G&IDA+$8UkuyB}piM~-SSyTSzK>Y^9(B#_?C+!{TQ*Vk z6=vj`Ydr)?MOZleqLv1|P2glbU7T_h$(AjkeBjE`+FP24Q=S+!TGm zWao6?<=-kckouivyVYgOD1>n#)uqpEA6LWVY}a-4zc9c;ZHS2jS{)E;yS~})&VM->!Um7hs@6RVSH{a z38zw2(=#MuZtX8C1k;MMx092&uIjCX`o2zT_P$#M{JY)d0D#8qqQ`Vfk7GSzJ z4SV9RT2hv}A|r*Oj6g4|gv@oHojXLLg64t`vmF8+kNIT@UVk~mOo--)0p8!Wgkp0+ zTEc>%SVHMo1*yXh2*K;&1T~U^e3gJl1_hkENwAGbZ3BugC2}S*1lYjZNlH;jz2L5P z0<-U`2d6Cy&b14ee~hwe14)pz_V$+&OCs=zUY`u+9vI0!HImi-IFi-v&!O;j0B?Tj zL2<^{Q%QVc8-*A*R-&M0XD)q|)V0%usTy0E<7~GwHDxRg-A$7n5$8#(AkB9zB#4U_atDf+zb;rZR9W6nT5C7`)#H7-pW zKZBQ-37oz{PbvXFaZL{tH_@EZ-199og~$~YtGH>SvKpIRg#)D?wN6^8G=_h($yY0T z1I|D;I*no_1-zK2n53)};NC2ELurtNQV~LFp*f(Rf+)6Kw}xiyQ29ABtPamCLD7Y8@?}<{$43^pyOrppTd|%=a++G_U7K z)hk?1H4`U)NAr?}h{GAfp-&WC`<0%Q39iT%%p)HzRQUDN!8C1^d#2X7*he9avxoHz z4y~svLiBp6HfL5^2FRg08a3l44E^4Q#@_qY_?Y~LrYpPfVn)5MnM~IfkgCbrVf;l0 zSw`9Ku6kEeI&~9$R9I-|X#SnxDC5!nK%KFj=v`!AMMh&U*?hN2Ux;OG*;v?M{6@tF zwwKjNgF_Y=@%SvJO8vg;e@oOnjCejPB_Ho93;&o+sW=nDj|PbYqph4sTjFYbNF7q7 z;e|ibZ2pAw6zVMv#8{y_2@Rj9w9k4DMqVvXs_GGPaepRF(H+nM0ymdu Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_list_drive_query/msg_DocumentQuery_e731a9066a60d9cee4097f419bbe0f17fb3367987f71c5caf9c045ced8633299.json b/packages/rs-sdk/tests/vectors/document_list_drive_query/msg_DocumentQuery_e731a9066a60d9cee4097f419bbe0f17fb3367987f71c5caf9c045ced8633299.json index f6df12477a2bdbe9a7fa4d9ddb63ed4d6188727d..d07952dd0f8fb0885678283b6a324c7e0e349502 100644 GIT binary patch delta 5341 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 Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read/msg_DocumentQuery_54e14af5c2e8a36e3c337f1e7f9288fcadcf4f0c2959c0a632bbd06e28bc3d95.json b/packages/rs-sdk/tests/vectors/document_read/msg_DocumentQuery_54e14af5c2e8a36e3c337f1e7f9288fcadcf4f0c2959c0a632bbd06e28bc3d95.json new file mode 100644 index 0000000000000000000000000000000000000000..6978981ec00805027d770994688710e266084cbf GIT binary patch literal 67725 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 Uemnk8`*u87`zXE9U#~v=4R-ul<^TWy literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/document_read/msg_DocumentQuery_5d23e775d0065e9aaec1f155ee4259864951786f80811cc7ea9fce3d7f42a718.json b/packages/rs-sdk/tests/vectors/document_read/msg_DocumentQuery_5d23e775d0065e9aaec1f155ee4259864951786f80811cc7ea9fce3d7f42a718.json deleted file mode 100644 index 3269f42806db27769943bf6c5cdbc6c94557dd88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58491 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 delta 3436 zcmbtXYitzP71ogP48|0%AO!@**hV46n%SA%*|iH1#o#EVC18_6X&o>Rrv&82S(KPZ z!o$3&46NlZ$xTv%S2f}h;&{PP#6!SJq@fa!I*68rm}J|4fCPetTIbc`e)o=-^nWE= zYt7z!=A83A&hf?f_5YlCAbDYA|7g^T{Md??pm5Yf=$E%xFR`K?{$4%?@w|Nev7|^e z_1AR#H7_zOGF}~xSW*6XykkYfe8QXEhAY4FuqKTs{lKZRY25CMqAdMbgk*EGU*=7-F@lIS5SP%?T0lV2)-XeZs_+Y71{) z452&a;nZ>uCm*pzV7L}W*>gH$6vI6hMl5Jz=tk@C*h?moD?R?|IJnD2qSiz8mM}X1 zVWaz!jyq>8Bnu5(wL&5`kngU2I*hd!U35k~{+jr9k);j>riW$mwya7dhcPktRUNVI z9!{rN{50L~NbG9|4Sd(Ou#KsngR+>8_W5BX8g+bAVqGFe>Z2^}-0&Oy@!KWJTJ81WSIY&5agu~50x#JOWEW~GT!Uswn{ zVT!Nv*s{^HLx^=4=#dvEuzdh(M zU@6S!J$(8vX4Pn5-sECFGmteYgzGD#D7#UtV5w+x#Qx#zVB&y@iQ6r>b9I!Danb%8 z1}W6Vf#KxEj+$R16?ZXjY*54oOVA=Aj40>nn0!xc?34LP-hE?)e0ZC0nfXruW}J!F@Z6jnADFna7#S#ZocMp zG)(y_t9dM$JCwDT#f*-;r-}`v?%ExzXXk2)>`5<##$_3)NW!UZC=8m5Ek#yih9#PG z&BV@S<0N=ExY$N|gCUj==GzjEfiG9sDBD9p95GS$6RVF}Q86@!k_@~YR!Y3r?jKIC zk_QZhPVz(uy|09^p_(WY^%3R%nb?~Sb>O05PDl!9ks@xKf=FHF>mPRRlQwmgf+1m3 zi;RwV%?kna-eiObL0GEenW#^?cC-q8^q%kZOVmA+-p|~k#I5FyCDqO=plc< zgeQzPFM>-!4=p6G>{VqerJgdxq#-hm6SSAPo+@$1)L)`=LX~2B`mm&#B5g<2i{dBC=2T3my6;W zeo5-&7dmh*gvdP)3T-mvwGc zG>}bTF*jT_AnsI<4-e^>PWi6;Q&=p}wTSFOM=HK68_9Dv9(*=}4}M1VQv9Z0l@($hWZ4B&TLG<93cPP#e4SZK-v8Sb&A5x^C zhEq!9n@r$xn8r^C(-$&-%Z(cq5v*XrqnzyY(e_Yom)7x@7XY$SvUI zhAF0aY%nXRo^0dOv?J0(wGxT5uLZe8WJcF#8$1H*cm4D%5|r`jS%}xnLBZeVp*tBu zSKD01R{mq+1L4R~(NU4UHU#y1f{N=h+q$RyntNr#zk3p$9}?HkWmd-jf9|f`JT}x( z_Vqveqx-ZYplSQL|CC_&+p=e#EU*-9k4vH$SWw{N<}^=@T}kS6m-HVwj^%g=i&QR& zdw+0rH<(C~_P4ik?p`D@s|{3rY~#tvvK|B3(GXVsj>_ZCBC-Ab&P<(LMV1pG$!Z<8#xYC{smKP#Ayc7 z=Fg6nk?F`B*_k)Rf)TYC1~`o+spjrg*mGI)GaPh-qo%e5mG3d$p;Ej^viTFxMXTfD z_IhTv+6A#!#(F418j&@9tx9a?w&T-4!~-O*M7MpukEDCHSmhy?uY}{FshGm!GWPjO zsenkImIFUgE3K04rSVEnIJk?0?u0L;b!mU6UT{^O zBSmT~eB4IweYI4qlB;vFkUK1~IJqyQXy!zPSGFn>6gvVulv&d%NSA*f^Ta0usI{hI zZeK)1qS1$(Ps=-{em;^wfhRof?jCNv79x2lLzTOdA1huqu1M@C(kzi2sqG_yILFw= zmPu-af1j7^WzI)FA0!U`f^0~zLNo}1dw&Od)Hh~1eOJ%s%ENIZ*NcaS>=)u%64S^W34ocS-_ ChI~T+ diff --git a/packages/rs-sdk/tests/vectors/document_read/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_read/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index d438f5cdd3c70a33082da0d6fb21c942f97f77c8..e64b73d8a77bdd2ae7413c918f513e44a6315072 100644 GIT binary patch delta 2865 zcmY*bYiu0V71lg<7H?!{gQ0d}XJZFHSTnP8XJ#LMZR}(n2goKiL~Wo-$W|y&Dj_ye zTO1M;qg0@zO0axVA0m`?`>QP~5E0Y@5{ZGJl!nMbNTyLBwxCo%aWPFQRSl|p&b_-a z{k1bY_s%`%d!6~$@#^tcs!vSm)yXb9CG1qnPWg5Kzuw*q|IvS_WkCF@4GtPHfFrH& zj?uY1m640mye<{kd`lOiyr;)JZ+W~RfH%T*cw)0*o{WbkG$`zFp?KJYV%~=0LIzeP zZHTs*@TUeBhrg?t5c|Y|XvD?414E3T2}3UD;HsB3A1Brsf|qI@?5cI)LahatTo+?$ z`uoEc`3U~L+SOBOSetX<$gKjOp4MG#x>2{_gB1bHt@e0t&d2@h4IiGVNkeGBgNHp= zR%Rio~3*cy@dblTRL!mp2udXp{oY|&%B8Ufs5B3A&pOaOPq16+Dp7t|7bL?AF7$Jzp%_YD`1 zOzUB|Cm~6~ExhIZPXnC$f#%?trwKTo7g+2vLeLcV@RkADT^RanZEz2GF#3?M4lFJN zaLNkfwiMyl(?N$Rq&#SPNbu5u|J}R@lun2SSesS62PA9y)gE$$^GQ3U4D&)H@_n}!}(gxh5ok^q#s`r1jTz? z7{0-TealsoTnt9n5Ou>F3G&IDA+$8UkuyB}piM~-SSyTSzK>Y^9(B#_?C+!{TQ*Vk z6=vj`Ydr)?MOZleqLv1|P2glbU7T_h$(AjkeBjE`+FP24Q=S+!TGm zWao6?<=-kckouivyVYgOD1>n#)uqpEA6LWVY}a-4zc9c;ZHS2jS{)E;yS~})&VM->!Um7hs@6RVSH{a z38zw2(=#MuZtX8C1k;MMx092&uIjCX`o2zT_P$#M{JY)d0D#8qqQ`Vfk7GSzJ z4SV9RT2hv}A|r*Oj6g4|gv@oHojXLLg64t`vmF8+kNIT@UVk~mOo--)0p8!Wgkp0+ zTEc>%SVHMo1*yXh2*K;&1T~U^e3gJl1_hkENwAGbZ3BugC2}S*1lYjZNlH;jz2L5P z0<-U`2d6Cy&b14ee~hwe14)pz_V$+&OCs=zUY`u+9vI0!HImi-IFi-v&!O;j0B?Tj zL2<^{Q%QVc8-*A*R-&M0XD)q|)V0%usTy0E<7~GwHDxRg-A$7n5$8#(AkB9zB#4U_atDf+zb;rZR9W6nT5C7`)#H7-pW zKZBQ-37oz{PbvXFaZL{tH_@EZ-199og~$~YtGH>SvKpIRg#)D?wN6^8G=_h($yY0T z1I|D;I*no_1-zK2n53)};NC2ELurtNQV~LFp*f(Rf+)6Kw}xiyQ29ABtPamCLD7Y8@?}<{$43^pyOrppTd|%=a++G_U7K z)hk?1H4`U)NAr?}h{GAfp-&WC`<0%Q39iT%%p)HzRQUDN!8C1^d#2X7*he9avxoHz z4y~svLiBp6HfL5^2FRg08a3l44E^4Q#@_qY_?Y~LrYpPfVn)5MnM~IfkgCbrVf;l0 zSw`9Ku6kEeI&~9$R9I-|X#SnxDC5!nK%KFj=v`!AMMh&U*?hN2Ux;OG*;v?M{6@tF zwwKjNgF_Y=@%SvJO8vg;e@oOnjCejPB_Ho93;&o+sW=nDj|PbYqph4sTjFYbNF7q7 z;e|ibZ2pAw6zVMv#8{y_2@Rj9w9k4DMqVvXs_GGPaepRF(H+nM0ymdu Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read_no_contract/msg_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json b/packages/rs-sdk/tests/vectors/document_read_no_contract/msg_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json index d52913259fee890a09926a902a9314c27d1d9822..06d6b9f4eb60bbd3375cff825ab84803703a4d41 100644 GIT binary patch delta 2113 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 diff --git a/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read_no_document/msg_DocumentQuery_20d68bd71dd4309389f14aed5d610bbf4178e9af8e87ee326576ac2b384d726d.json b/packages/rs-sdk/tests/vectors/document_read_no_document/msg_DocumentQuery_20d68bd71dd4309389f14aed5d610bbf4178e9af8e87ee326576ac2b384d726d.json index 24fdec43f5957f4c1bd88839716b4acb4f3ee9f2..0a87c8d25644bcc0996b081ed46993cd87227492 100644 GIT binary patch delta 4198 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 diff --git a/packages/rs-sdk/tests/vectors/document_read_no_document/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_read_no_document/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index d438f5cdd3c70a33082da0d6fb21c942f97f77c8..e64b73d8a77bdd2ae7413c918f513e44a6315072 100644 GIT binary patch delta 2865 zcmY*bYiu0V71lg<7H?!{gQ0d}XJZFHSTnP8XJ#LMZR}(n2goKiL~Wo-$W|y&Dj_ye zTO1M;qg0@zO0axVA0m`?`>QP~5E0Y@5{ZGJl!nMbNTyLBwxCo%aWPFQRSl|p&b_-a z{k1bY_s%`%d!6~$@#^tcs!vSm)yXb9CG1qnPWg5Kzuw*q|IvS_WkCF@4GtPHfFrH& zj?uY1m640mye<{kd`lOiyr;)JZ+W~RfH%T*cw)0*o{WbkG$`zFp?KJYV%~=0LIzeP zZHTs*@TUeBhrg?t5c|Y|XvD?414E3T2}3UD;HsB3A1Brsf|qI@?5cI)LahatTo+?$ z`uoEc`3U~L+SOBOSetX<$gKjOp4MG#x>2{_gB1bHt@e0t&d2@h4IiGVNkeGBgNHp= zR%Rio~3*cy@dblTRL!mp2udXp{oY|&%B8Ufs5B3A&pOaOPq16+Dp7t|7bL?AF7$Jzp%_YD`1 zOzUB|Cm~6~ExhIZPXnC$f#%?trwKTo7g+2vLeLcV@RkADT^RanZEz2GF#3?M4lFJN zaLNkfwiMyl(?N$Rq&#SPNbu5u|J}R@lun2SSesS62PA9y)gE$$^GQ3U4D&)H@_n}!}(gxh5ok^q#s`r1jTz? z7{0-TealsoTnt9n5Ou>F3G&IDA+$8UkuyB}piM~-SSyTSzK>Y^9(B#_?C+!{TQ*Vk z6=vj`Ydr)?MOZleqLv1|P2glbU7T_h$(AjkeBjE`+FP24Q=S+!TGm zWao6?<=-kckouivyVYgOD1>n#)uqpEA6LWVY}a-4zc9c;ZHS2jS{)E;yS~})&VM->!Um7hs@6RVSH{a z38zw2(=#MuZtX8C1k;MMx092&uIjCX`o2zT_P$#M{JY)d0D#8qqQ`Vfk7GSzJ z4SV9RT2hv}A|r*Oj6g4|gv@oHojXLLg64t`vmF8+kNIT@UVk~mOo--)0p8!Wgkp0+ zTEc>%SVHMo1*yXh2*K;&1T~U^e3gJl1_hkENwAGbZ3BugC2}S*1lYjZNlH;jz2L5P z0<-U`2d6Cy&b14ee~hwe14)pz_V$+&OCs=zUY`u+9vI0!HImi-IFi-v&!O;j0B?Tj zL2<^{Q%QVc8-*A*R-&M0XD)q|)V0%usTy0E<7~GwHDxRg-A$7n5$8#(AkB9zB#4U_atDf+zb;rZR9W6nT5C7`)#H7-pW zKZBQ-37oz{PbvXFaZL{tH_@EZ-199og~$~YtGH>SvKpIRg#)D?wN6^8G=_h($yY0T z1I|D;I*no_1-zK2n53)};NC2ELurtNQV~LFp*f(Rf+)6Kw}xiyQ29ABtPamCLD7Y8@?}<{$43^pyOrppTd|%=a++G_U7K z)hk?1H4`U)NAr?}h{GAfp-&WC`<0%Q39iT%%p)HzRQUDN!8C1^d#2X7*he9avxoHz z4y~svLiBp6HfL5^2FRg08a3l44E^4Q#@_qY_?Y~LrYpPfVn)5MnM~IfkgCbrVf;l0 zSw`9Ku6kEeI&~9$R9I-|X#SnxDC5!nK%KFj=v`!AMMh&U*?hN2Ux;OG*;v?M{6@tF zwwKjNgF_Y=@%SvJO8vg;e@oOnjCejPB_Ho93;&o+sW=nDj|PbYqph4sTjFYbNF7q7 z;e|ibZ2pAw6zVMv#8{y_2@Rj9w9k4DMqVvXs_GGPaepRF(H+nM0ymdu Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/msg_GetContestedResourceVotersForIdentityRequest_365e8cc19afcc569d90d85a2a371ad49d3ae7bc38d217d85b1570274493c4d7e.json b/packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/msg_GetContestedResourceVotersForIdentityRequest_365e8cc19afcc569d90d85a2a371ad49d3ae7bc38d217d85b1570274493c4d7e.json index a700fae23a4a1cb706b7c5939ba259c98eea03d8..3d8f0402e565c2fca102b024099cb388996e823d 100644 GIT binary patch literal 56948 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 literal 56948 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 diff --git a/packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index d438f5cdd3c70a33082da0d6fb21c942f97f77c8..e64b73d8a77bdd2ae7413c918f513e44a6315072 100644 GIT binary patch delta 2865 zcmY*bYiu0V71lg<7H?!{gQ0d}XJZFHSTnP8XJ#LMZR}(n2goKiL~Wo-$W|y&Dj_ye zTO1M;qg0@zO0axVA0m`?`>QP~5E0Y@5{ZGJl!nMbNTyLBwxCo%aWPFQRSl|p&b_-a z{k1bY_s%`%d!6~$@#^tcs!vSm)yXb9CG1qnPWg5Kzuw*q|IvS_WkCF@4GtPHfFrH& zj?uY1m640mye<{kd`lOiyr;)JZ+W~RfH%T*cw)0*o{WbkG$`zFp?KJYV%~=0LIzeP zZHTs*@TUeBhrg?t5c|Y|XvD?414E3T2}3UD;HsB3A1Brsf|qI@?5cI)LahatTo+?$ z`uoEc`3U~L+SOBOSetX<$gKjOp4MG#x>2{_gB1bHt@e0t&d2@h4IiGVNkeGBgNHp= zR%Rio~3*cy@dblTRL!mp2udXp{oY|&%B8Ufs5B3A&pOaOPq16+Dp7t|7bL?AF7$Jzp%_YD`1 zOzUB|Cm~6~ExhIZPXnC$f#%?trwKTo7g+2vLeLcV@RkADT^RanZEz2GF#3?M4lFJN zaLNkfwiMyl(?N$Rq&#SPNbu5u|J}R@lun2SSesS62PA9y)gE$$^GQ3U4D&)H@_n}!}(gxh5ok^q#s`r1jTz? z7{0-TealsoTnt9n5Ou>F3G&IDA+$8UkuyB}piM~-SSyTSzK>Y^9(B#_?C+!{TQ*Vk z6=vj`Ydr)?MOZleqLv1|P2glbU7T_h$(AjkeBjE`+FP24Q=S+!TGm zWao6?<=-kckouivyVYgOD1>n#)uqpEA6LWVY}a-4zc9c;ZHS2jS{)E;yS~})&VM->!Um7hs@6RVSH{a z38zw2(=#MuZtX8C1k;MMx092&uIjCX`o2zT_P$#M{JY)d0D#8qqQ`Vfk7GSzJ z4SV9RT2hv}A|r*Oj6g4|gv@oHojXLLg64t`vmF8+kNIT@UVk~mOo--)0p8!Wgkp0+ zTEc>%SVHMo1*yXh2*K;&1T~U^e3gJl1_hkENwAGbZ3BugC2}S*1lYjZNlH;jz2L5P z0<-U`2d6Cy&b14ee~hwe14)pz_V$+&OCs=zUY`u+9vI0!HImi-IFi-v&!O;j0B?Tj zL2<^{Q%QVc8-*A*R-&M0XD)q|)V0%usTy0E<7~GwHDxRg-A$7n5$8#(AkB9zB#4U_atDf+zb;rZR9W6nT5C7`)#H7-pW zKZBQ-37oz{PbvXFaZL{tH_@EZ-199og~$~YtGH>SvKpIRg#)D?wN6^8G=_h($yY0T z1I|D;I*no_1-zK2n53)};NC2ELurtNQV~LFp*f(Rf+)6Kw}xiyQ29ABtPamCLD7Y8@?}<{$43^pyOrppTd|%=a++G_U7K z)hk?1H4`U)NAr?}h{GAfp-&WC`<0%Q39iT%%p)HzRQUDN!8C1^d#2X7*he9avxoHz z4y~svLiBp6HfL5^2FRg08a3l44E^4Q#@_qY_?Y~LrYpPfVn)5MnM~IfkgCbrVf;l0 zSw`9Ku6kEeI&~9$R9I-|X#SnxDC5!nK%KFj=v`!AMMh&U*?hN2Ux;OG*;v?M{6@tF zwwKjNgF_Y=@%SvJO8vg;e@oOnjCejPB_Ho93;&o+sW=nDj|PbYqph4sTjFYbNF7q7 z;e|ibZ2pAw6zVMv#8{y_2@Rj9w9k4DMqVvXs_GGPaepRF(H+nM0ymdu Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_contested_resources_ok/msg_GetContestedResourcesRequest_c8608f7aed7bbe4ced03c9c23f1ce28a227def58e23c39e0384e0cc02fe6360b.json b/packages/rs-sdk/tests/vectors/test_contested_resources_ok/msg_GetContestedResourcesRequest_c8608f7aed7bbe4ced03c9c23f1ce28a227def58e23c39e0384e0cc02fe6360b.json index a2baf750233a8c2c672b4eeb6ffc08bcd1c1d6e7..46ce3e849c46ef015e85012851e749c82f8c6033 100644 GIT binary patch literal 79046 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 diff --git a/packages/rs-sdk/tests/vectors/test_contested_resources_ok/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/test_contested_resources_ok/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index d438f5cdd3c70a33082da0d6fb21c942f97f77c8..e64b73d8a77bdd2ae7413c918f513e44a6315072 100644 GIT binary patch delta 2865 zcmY*bYiu0V71lg<7H?!{gQ0d}XJZFHSTnP8XJ#LMZR}(n2goKiL~Wo-$W|y&Dj_ye zTO1M;qg0@zO0axVA0m`?`>QP~5E0Y@5{ZGJl!nMbNTyLBwxCo%aWPFQRSl|p&b_-a z{k1bY_s%`%d!6~$@#^tcs!vSm)yXb9CG1qnPWg5Kzuw*q|IvS_WkCF@4GtPHfFrH& zj?uY1m640mye<{kd`lOiyr;)JZ+W~RfH%T*cw)0*o{WbkG$`zFp?KJYV%~=0LIzeP zZHTs*@TUeBhrg?t5c|Y|XvD?414E3T2}3UD;HsB3A1Brsf|qI@?5cI)LahatTo+?$ z`uoEc`3U~L+SOBOSetX<$gKjOp4MG#x>2{_gB1bHt@e0t&d2@h4IiGVNkeGBgNHp= zR%Rio~3*cy@dblTRL!mp2udXp{oY|&%B8Ufs5B3A&pOaOPq16+Dp7t|7bL?AF7$Jzp%_YD`1 zOzUB|Cm~6~ExhIZPXnC$f#%?trwKTo7g+2vLeLcV@RkADT^RanZEz2GF#3?M4lFJN zaLNkfwiMyl(?N$Rq&#SPNbu5u|J}R@lun2SSesS62PA9y)gE$$^GQ3U4D&)H@_n}!}(gxh5ok^q#s`r1jTz? z7{0-TealsoTnt9n5Ou>F3G&IDA+$8UkuyB}piM~-SSyTSzK>Y^9(B#_?C+!{TQ*Vk z6=vj`Ydr)?MOZleqLv1|P2glbU7T_h$(AjkeBjE`+FP24Q=S+!TGm zWao6?<=-kckouivyVYgOD1>n#)uqpEA6LWVY}a-4zc9c;ZHS2jS{)E;yS~})&VM->!Um7hs@6RVSH{a z38zw2(=#MuZtX8C1k;MMx092&uIjCX`o2zT_P$#M{JY)d0D#8qqQ`Vfk7GSzJ z4SV9RT2hv}A|r*Oj6g4|gv@oHojXLLg64t`vmF8+kNIT@UVk~mOo--)0p8!Wgkp0+ zTEc>%SVHMo1*yXh2*K;&1T~U^e3gJl1_hkENwAGbZ3BugC2}S*1lYjZNlH;jz2L5P z0<-U`2d6Cy&b14ee~hwe14)pz_V$+&OCs=zUY`u+9vI0!HImi-IFi-v&!O;j0B?Tj zL2<^{Q%QVc8-*A*R-&M0XD)q|)V0%usTy0E<7~GwHDxRg-A$7n5$8#(AkB9zB#4U_atDf+zb;rZR9W6nT5C7`)#H7-pW zKZBQ-37oz{PbvXFaZL{tH_@EZ-199og~$~YtGH>SvKpIRg#)D?wN6^8G=_h($yY0T z1I|D;I*no_1-zK2n53)};NC2ELurtNQV~LFp*f(Rf+)6Kw}xiyQ29ABtPamCLD7Y8@?}<{$43^pyOrppTd|%=a++G_U7K z)hk?1H4`U)NAr?}h{GAfp-&WC`<0%Q39iT%%p)HzRQUDN!8C1^d#2X7*he9avxoHz z4y~svLiBp6HfL5^2FRg08a3l44E^4Q#@_qY_?Y~LrYpPfVn)5MnM~IfkgCbrVf;l0 zSw`9Ku6kEeI&~9$R9I-|X#SnxDC5!nK%KFj=v`!AMMh&U*?hN2Ux;OG*;v?M{6@tF zwwKjNgF_Y=@%SvJO8vg;e@oOnjCejPB_Ho93;&o+sW=nDj|PbYqph4sTjFYbNF7q7 z;e|ibZ2pAw6zVMv#8{y_2@Rj9w9k4DMqVvXs_GGPaepRF(H+nM0ymdu Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/test_contested_resources_ok/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/test_contested_resources_ok/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_contested_resources_ok/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_contested_resources_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_contested_resources_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/test_contested_resources_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_GetDataContractHistoryRequest_05485e622b540237cadaa7fda2a96e8a6cdbd49b7bb7a3ac9cb6ab3035676772.json b/packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_GetDataContractHistoryRequest_05485e622b540237cadaa7fda2a96e8a6cdbd49b7bb7a3ac9cb6ab3035676772.json new file mode 100644 index 0000000000000000000000000000000000000000..ef8726a337ac56feaba311591de2ace0da6dd980 GIT binary patch literal 172047 zcmeI*%Z?t&aRp$n^%TOaxnT1$GxSUN0SrMfU>OiBTZT0DM$o(aoXQ-sXL#xQ!u}gg zb^#oUO=ea`#JNOd{Y~m`zxnNNzx$s*{N=BI{PTZ)_m98*TfXdXynO%beD%kF%~$_? z{7L`x)$2DeK78@=-WPXozrXh?bxzV`>OezE=4hgEOx{rc70 zyAOZx=m}d-cNx;dej(=68Sk-~7XG{`TEJ{rh+S_|JE*Ucb0|`Qr7f%07KfBiPU&VQ-wT^GH1 z@%G2A`{kzlTi@i*zqIQ8+L!P4G2g#<_d|a9^7x;-D@?%cjz>zyAa-P_}L^57%TmLtLTxKt|Zy8LBR zXcYTT9tf%t{m^hCvIoOiXr$;rpY`TLc6m@L{_rDGkyW8p^&|Rb`S!!3cA-+GyW^QF z#C-Yv5$NlmBR*(w;=~4AEJ~f6zJu?Vsapd$L$s9W!K04)e+*6mx<}ch_nu_^qkj4B zXU?_6zeMza`iL{-2z8F_pCHX$9O1JOHvOK{5;WnGq@1}&&rd1omu$R?GkvIJ%XhH& z^FqA8ef_#IL>lkm*a|OMHxyqu;$4sYMCRKu?w$596Ynn$zXERf+vv_cUlvzi4~pwv zJQd>)7|a>*-8-VHkG3S=x38^4C97niStp*i4?5_tQVt3PTr5XYSXGTgt*|MSV9^G$ ze39S_3132BEw4n?+|z9Zk&1%gh%P9FET-qDu=ycU9c0}th5RP%qfxi zXuqV=j$Kw3+9(V$$-uUWl}hpe=6uM8B5k$59pt2bo^`FI6du zMpG@L2?EpMpBxbs42Z+$&wEs>ByQRD2}!pkD#5y^1Pkg` zK|wriSwRt$9#_&L&zp-R()FP_og#_%`Num9OFVE0&vzE+QQbwh6F6jjpC2kxZC6Oj zlR;xT+TVFlnn;u=xoEpgxmq#tt6gElz2@K*Hob?yVnJ295S}ejs#@UOL$su=r=YN> zDPdsgA%ZQ#sZfJ1kRu4_n6qF})~P=a+#_4GDf_geM}V6RUijbuS?(oep=%gkMTjVR zN^%h_s%{~9k2uU9%BzgRS1}DKqEMda6e-kBoNOEmyN-auy1H`&6>5>tY%>fLo;T}Y zp

    #5Udx&tz`!blxl#mBT}M}TzQVtC>F@uI-9`P#!8KNB~EuGY)Op=;iJZ_4+j&# z_nAcsiATYg3}lit&#ZfjAf>Z(lI@n8+Djm#62-eHCwB@3fU1YP^T-Fh- z)%ik&eqsg5ni$^ol5$Iw(N1)#Rkiw1apLyt@^ZTV4L(FAg{D4I(kfc(c_acXI@+8S z7JE=r&?JixBc2szZaU)r4p|YOnhYh7w z(kV`lz|I~ZDCMp{;6CpgT`xdXL@AW$^rmA#8?HD&^F?B7cPI)OjAi&~RN;ox?|kk( zLKz+dl#rTuPLY1C^e+8~u2|K^pLt0bQUjOfUdA498+M28Y>N(xIU+w0aYbZTSPZ0F z@-9~e6&{9=r_EspChS#b*wAZ*wN@b{WpRMs*iP4~pbH!|H`GX547GdFY_Y}}evuGL zBq*miT>osLBZ6cyeAEU7sT)kuG-jc9)zo>oQDTN5pE2q)Lel@!4DG6hz0c&ympl~!T}w|8WLWkc2l5{ zZ=_%9(M^OTjQ8a}KYAq9q_Bcrj#zME_EHyHiSC>K#vP!Xj`VPSP}t?sDR z#@h#3h=?{E*hJ35U3w>L38`)-@$`rRLqb9v*E>&2BE>FSlvFof57=QEm$V{*-=OZt*!ba?X-G!X*9UQZ$Qq-lB%gqWK z%}(NxUe=T|iBWC+_S!523yx<%C-uX)F8SMJ}_`v_LL3e!a7+wDGpC@sxN=M5j^MTcoo@4&?j+ znp&{BG4<=#2TfydL99z}wed7ZwT_5XT56x4W~ZmbaEKxCOp$ggj9s`}@UF2>IW3Ly z7T+BuYhrsBAA}@6xw^HGjE6~d+-E#am z4}I68r6d=s@Ma^;!^)FGRuokdZ(w3UT`zF7P^X>27E>_;ai&cTMvn+rv6zOJXs1Xe zYuY0DYBAaO7CGsT;1Xz+(p5$NRZaRAZ4t>7HDZyV)`z1INbh}q>T_Q58axhW4F-pe zQsVlc>fHZ%LE+ZfEPYKF(j%0ygPTaAl7YV|96SN4XT9G<2JEdfOQ(y#&2W-PDomYa zR;%+ilIJ6-3LhbUeNgq)eo#eI)(sbnDlH6pGA)({O)-;TtJVn6r$N#;E;T2)6~FIlgu_GcZuZ-0vB(n}3C*(NTz*QT@)98N{$P2zk?;E+Ui z;tFDN5tnW+Aag^35Zo&8l!%h;`XuWpP>K3{$Jz=d5I3In} z;7})TVTFX|Q6i$ga#VZ|R#5z95n4e@ByO|UV__SZC}Qves##zn2DiL&oOI!oNLpBr z5Uih;b|msexq)v}J$nkWbZ-&V_7<^%YJsfg+n4~qa=DdDgql!dvq6P388SFPLd?x16jt+^6NX9YZb-dy9;qYfFE= zbzn~QL`CEDPG4Khfb+9lWP<7(D4@{Xs7_9i6gBcFT6|qFMcvm0^UEzbfBJP_Fhx66 zalB5pv^YL~PiAQ`?dz&|iq$s;PKCpLK`2pfr|)>mI`UOP(#LmT*H!V0-v>_93lm8? z=E93uF)_)o$lnb%Hks1R>Q!zdAy8qPZzgTLly$upD#Ny%QU}l@r0wp+1?y~45p~Nz z8kqPbFh_8f3x8HM;QTBXX)(oJK{-vWulK6hnglP=-NeZwA_1#WWs8{YHST_m1^g|#>%U|<%d~Hgc=fmjptigLucCfITh&`A9o!FN`udC3n zD$wpD4U}8e>I>%;JrKfm75dt*LiqU(F;;s@*GClBRp_*4cg1kZN;BeFZZKg6N*bT= zD%9Lh7wTDEg*GevGi8?EHEW&wmjh=yC9{2Qw;|=K6;odeT(j0ggHRZtfjLD-I|$x zw>N>(6>l!hLSM1^+dpbCJXGIa4y|fVQ3N0BhI?Dy4s27l3_go5V`*;8Kg!`ZwSkl< zsy;sq!OvXEL(he%t0C29F(fkt9Z(0Jb_m?YgMsag3_)u<8$xc)b|aOjyNVEo(Bdsp zdj8;}^8uH#MMQT^biewJi;ur#BI!JUkTsrbqI>9#M{ul2y|&$=2#yT=5vBt2w8=&I zn&?jQ@S5mO6pHA&)vdSGYobd9@I5U#6-{*dl7SdPi#MIz`MVM8NhR8W={M?(TGF8L zar&9zWsKKRM^hk@Oj@KG)Z+k`A?JEme4-_V-o%i~f#{8YMWV08Wa!%NabsI+RBBLz z$vlNsvsJfwdLJdtgEoq=TwAt-x z64fT*jTtgNr5i=9y8@@TOazrll3q|}u_7{fSC&F~t@NJQL;Q!kSAyha&&kSx6#vMMWf<)miuUwc5F(tg_2K z?8ATSL!FA?))zIJY}aS<5ju78+I6}wcZ>V86-qwOT`BbE( zqQob@F>rDd)BQ3n|bnpy+XwW3KM>oi?rjKgMxAz zLG3RZiK^SUcRA;IpudgYD&x&$oY2|NFaD+ob+E**6I8tA#&dg3BY_EadyD4cZXA-B z=bTsEHM)QPQ>5biD6g|fZe^)c?wa23&i!@ci6P&fB)x-(%}%nwwzA!iqPlKUpLd)0 zf0<$z_PR-(?qUNfc1vU{cbv7QKWkueir%Ei*sq(^dzF3i7n?|fTf9KLPr01)Av2_D z{1IASkC0LPX~}Kyxs_~rg!*5?IXlG4HTDsJQ{ekmR#LM&> zpo}I^`3x?|PI5iv=HtYTFM!QAT}%-ixdFG=oFW5f6TzDW&s}s)^N$_Na~VSP{cYh! zt62=8sMaZpUExDpNK`~!>cR;|Q!x4oR~HHt{|0Vgo9a0uH<)0pfgR>%8ealAJ<}Q@ zBJIjS7($E7ji5%)cQkZwU??G?EWm@W>6QYj5@W zY|xFTyXrDS6QH&j3C7$^rka&0X=gz&sHe^zIU=@ZsLdGYU60d`nUkO6oTCUDqkM=R zOk9(JUx6EVTDHi$g>U0pQR%6T5WTN|IP2Uuf7WMGSZ!YFHnV?DL3Hud7}b&v`b)NG zqgO0uZ%Yu1=Six8r_q+dMXx0EY4&PKpS$e5|9!qe4|IppuIG%l+?pXPu)!(aC>NPs zfzw+ig31*@Mwc!QD5pbe3el`jo`YIVdW|D8$c6l8fzIp-D1%(kOYQwU@`T|_zIa5| zQ(-G8zs(U4;RXq?4_`k{YjBdqVAxA-Z(OULxPqQsWZnx8iHd3n1h+msC8A`z9$%g; z6sSbq;s#}f5{Op{{h350jdG=|SZI}o(#Bd55F6{$g;+v;YpcB->v1rDQe3D zUrJ#`cg-cI-1K`~bv9UYmsr_C#Z?;UbDpbQ28Y|U|C z00nt6DJ;d4`ix{dflmmZ=j#!ZY2@~;u!$g}hJvEe*h? zIy8zix2l6T1_P1i6r@%Y!CdGF`fO-2w5TsdeK_P$z6)!cU-w#QA9=x@`YzxBb!sXJAU%xFz5ho- zKKF}VSh*PuwhX5`oTH3>GFmr&9Ds-1L&a%}dA1)0g|s|l%M8!-5THvxq3cp;f0h)w zUMHMXRT9}pJiWkrH}t>j#1&3?wZb?=l`4`*c&m+g=xjbcYI#Y6z2wrR7z^9rqYlk_ zuq6z^-lX%t`j3)u*UFuQZ!rfbH+99Ri3GSwBDT;YyjJ8qLj(txN|`(#A@RqN?JN;y z`>5Tt0#9;m7^Khki`}-hN|C){ApjMb9G(`h6ry*EM>|MQS+zP%t&U{Upw|%-V^sJ; z5-nHSx_Bcc-aFmbOs7GwsjjJGUR*l&uW&y(E)C}4Wi_XLX8VT7b6FWFdhAYvQ+gJr zZ)y@-))q|7ixzJP&?<-hT}reAlWTjo3}%(6=@HV$v9kFwa zZ!{sSA%xs%n?GjJD&b_?T*z&3rtR}@M$zUQy@+F|S2TV~Ss-it`Djd@zlcFwDxcTP z*an7Pq@AmQ30-%&h_0!ySp7aiK1nP?X#Ie+`QR9_XjICpgD22UvOY(M`novdjRe*$ z>&N-YIoB)URh}OYBpd7&N5pE2q-sb~*p8<1=A_bC)IATx+Cl=%VzkiG<8(+|CA_M) zMB4HKTy_y-r9@OuTTGRwnCZ#1n8KjN6h=Ug0L4Q>lA(E?R!4c5zK8zLM@50iEepHpB>M5y`1lGhw9mV<}3H5^R5{);D zL?v4qRg^AGa3#VOcIY|%BtjtO-a+f5ain74up@#Xwc5oi75G7Tqhg$gNFpR;E~)eq zylz41ZLUhzdrJ;F-2p4TF!uJR^awd6+|VZ5^dy zFg!8mL4gq5G=U6~&6XzXC{T&|e8<`fMIM`Y){oN$QW4=WoRo=pgDMTBjkTi0C%%CS z+J!oe-CnQ0fxT~ng^MD&P)AmE6Jzsm@&O)KL~#SFv`!rdc#=KQ@0N4KpI%vNnnm(Pw`y%0y5zIESKwo`Rc{T|85(J=(=E%BCZSO$9((M@8~B5ItA7C z#lTGt-hk}+gDEJcEk@V+WQzztxQ8QO)=%ht zT@^po`rq?b-+CF5e1;@eOtf}g6~D-bMU09%@^poEBlX)VM-3fZC}>Xv~t zF!4!Xv+I@T!YyWC{(=_3@uUSKa60a) zaMZo85$Iz*{_1zCO=-K2(GKDmgL!7K1v^6NC#U2RbW_IGCncWktI6VYYuj6VZ0JTk zMFUIjgHt@0$Kd=dms^fNMBOZ=^$Hw$R39$7&==;~<{Ho79)Xk?_IH`Gc41X?Nrd3Q zzv{lri-{1Up4*_+l8Sp%F*l1&KVRj!`QYz4*};_9vrh_;*wq@s*DaSqKY!cWjG}HE ztmXUYw1FyDNuiThUc{e)5U#hupXcZMJKeTc!D4Sg$0+^elwO7K^BrRB&f;`W*^1U1 z$6$&}VX?MZuj-z7{wSB{c@-iA)ye7M<%Ybj>BC8KF_j(%%P+`ZoS?YLBDMDSQ(>2k3k$%g9HrzLE+~ZTa5#Krz+lf^4 z9;S+*iAxr@EFE0izBc za%06SUJIpL20R&^QXEg;db;?){rnbVh+c1nA>^4W(}C^=^|TTl5KLO$fPrp1oPH1& z&?k*X=*=Xd;IGddUw-2Ms_E0;K$ya+H7S>#-e-=bH!*57{n8Od0SmjfJl~c#0)?EX zi-jjeWH3e^yUzFeeah{p`dKb|sY!*I!vRHIE4W~5w%1e06P|ezzrHRT6m~Wb%K#I4 zC_^UG$S4saRTDu*4FyHzbypmgS8~r0J>~R>sD(9GmwJ{G&ZS{Vr9=(PZO{s(9|2$^ z>q|wsTCSAUJ+w-VN}YDV5J~)T?x8&DgnrodvYw^c6HcHo=)-w>Gfe)-TTc}n$F!EUW2HI4K#@$v)=s}Bj zvfAJd?AQUMqz!EJ9(%wjekn0ZztlZ_BQ`0?la)?g{|LY(163)ul#1{A&B2p(WQp~UHWP8YnFJDvxnBU>viR<--pAA zBnwRhhbVR0*qWOE(Aj)?)bf%=_mWGO;@MkD&3ZKsl5H4*y(uK5E};ISBrMP<*lxir z)+zm&%8TX`HK~(SP+|)`LfXfwl^ro-yG*JZK^h}(pZFq45kZpBmKlPi*#YQ#%Z&xH zE9?Xwq)(u%^arPOqq0S4pXZaq)8d`Aj+Zm8Yi(tJnOL8m<1H^a~Q1Hmwa*voU*;57oeM@c@~GBM9bxU?o6HwW|E z5h%u!SfaFmrab6PqgoB#2@DXSCbH9i1a<`!XO}7^JrUlA5Km|^np+u&!|ILF40*Wb z`5Z?E$bS4GFr_kV{@IdYTOmteda=sOD4e(JW+()m6Pkq|K{ngxCwIKj6iTt0u1Bgg zDmkLk)6e6akn0p8WXF4w)oY_-Yb)@D9!&L^iKwF?xdu}uMm$@DSA{RR$Ze~a8aZMj z4U~C~C7!fS3>d^0P z;W%EcXkfKF?N-M@=X0q&3ht>DNwUvZst>kE3MGj!B#Q}!K0iMMI7Oi)%_Kw8a9#BI zgF#WSsPvSvtGr@98xbj26IZIoawYc-;>(9yhV-mQ_-?^o+;3wwF@V$iIL z5>8&VVT5RxT)JWdJK4{V|9{J7L0vRl%N9x`gSNQKt}VF*_Vylu>aSvwxFoW4Oj~yD zga}TxJtF=siDV14xE>Kige2V(L?rQjifn0DAzmGzbM7HLIxE#`+oZ_6wL+e>R(M1U zCG%`Gb^JI#oi&kc5zu$;6j<0RGg=pC`VdVu3n}l;TBnbkA~LK7RUp|SO@4@A*r=c< zaRI%7hY)vTB1vQrjOG#>H% z)RR&!D*}X|(Dh*~(oc_Af!Q1tIw2g*g={U@sgAsBSKY$fW|6>zCu@s=n8qr#>Jb?r zH7dMkwNNX4d8@!qg4EhkNx5ojR;_bIbd-^?}g;?X#h!4f4d|mmg?w%BlvI zQ)GbNTO_a?QI8{eguApJUkUBK6fJfT?Qu-h%Dj=~`b?jy)~ z4$#kboA)1D{6Bw4^!aaWxXXt{uloHCuhP%%eOQ!K%kMAh^X^r<-zWYLPCxMnzxb{F KMgHe^fB#<&W|Oc0 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_GetDataContractHistoryRequest_3a0865545cd724369cc2d2609bb95ca435fe142e8f54b44eb829c0459d33b288.json b/packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_GetDataContractHistoryRequest_3a0865545cd724369cc2d2609bb95ca435fe142e8f54b44eb829c0459d33b288.json deleted file mode 100644 index 90d1adc3ffd59ae7280a2a42659ee0a4fb2134f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172100 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 diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/test_data_contract_read/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index d438f5cdd3c70a33082da0d6fb21c942f97f77c8..e64b73d8a77bdd2ae7413c918f513e44a6315072 100644 GIT binary patch delta 2865 zcmY*bYiu0V71lg<7H?!{gQ0d}XJZFHSTnP8XJ#LMZR}(n2goKiL~Wo-$W|y&Dj_ye zTO1M;qg0@zO0axVA0m`?`>QP~5E0Y@5{ZGJl!nMbNTyLBwxCo%aWPFQRSl|p&b_-a z{k1bY_s%`%d!6~$@#^tcs!vSm)yXb9CG1qnPWg5Kzuw*q|IvS_WkCF@4GtPHfFrH& zj?uY1m640mye<{kd`lOiyr;)JZ+W~RfH%T*cw)0*o{WbkG$`zFp?KJYV%~=0LIzeP zZHTs*@TUeBhrg?t5c|Y|XvD?414E3T2}3UD;HsB3A1Brsf|qI@?5cI)LahatTo+?$ z`uoEc`3U~L+SOBOSetX<$gKjOp4MG#x>2{_gB1bHt@e0t&d2@h4IiGVNkeGBgNHp= zR%Rio~3*cy@dblTRL!mp2udXp{oY|&%B8Ufs5B3A&pOaOPq16+Dp7t|7bL?AF7$Jzp%_YD`1 zOzUB|Cm~6~ExhIZPXnC$f#%?trwKTo7g+2vLeLcV@RkADT^RanZEz2GF#3?M4lFJN zaLNkfwiMyl(?N$Rq&#SPNbu5u|J}R@lun2SSesS62PA9y)gE$$^GQ3U4D&)H@_n}!}(gxh5ok^q#s`r1jTz? z7{0-TealsoTnt9n5Ou>F3G&IDA+$8UkuyB}piM~-SSyTSzK>Y^9(B#_?C+!{TQ*Vk z6=vj`Ydr)?MOZleqLv1|P2glbU7T_h$(AjkeBjE`+FP24Q=S+!TGm zWao6?<=-kckouivyVYgOD1>n#)uqpEA6LWVY}a-4zc9c;ZHS2jS{)E;yS~})&VM->!Um7hs@6RVSH{a z38zw2(=#MuZtX8C1k;MMx092&uIjCX`o2zT_P$#M{JY)d0D#8qqQ`Vfk7GSzJ z4SV9RT2hv}A|r*Oj6g4|gv@oHojXLLg64t`vmF8+kNIT@UVk~mOo--)0p8!Wgkp0+ zTEc>%SVHMo1*yXh2*K;&1T~U^e3gJl1_hkENwAGbZ3BugC2}S*1lYjZNlH;jz2L5P z0<-U`2d6Cy&b14ee~hwe14)pz_V$+&OCs=zUY`u+9vI0!HImi-IFi-v&!O;j0B?Tj zL2<^{Q%QVc8-*A*R-&M0XD)q|)V0%usTy0E<7~GwHDxRg-A$7n5$8#(AkB9zB#4U_atDf+zb;rZR9W6nT5C7`)#H7-pW zKZBQ-37oz{PbvXFaZL{tH_@EZ-199og~$~YtGH>SvKpIRg#)D?wN6^8G=_h($yY0T z1I|D;I*no_1-zK2n53)};NC2ELurtNQV~LFp*f(Rf+)6Kw}xiyQ29ABtPamCLD7Y8@?}<{$43^pyOrppTd|%=a++G_U7K z)hk?1H4`U)NAr?}h{GAfp-&WC`<0%Q39iT%%p)HzRQUDN!8C1^d#2X7*he9avxoHz z4y~svLiBp6HfL5^2FRg08a3l44E^4Q#@_qY_?Y~LrYpPfVn)5MnM~IfkgCbrVf;l0 zSw`9Ku6kEeI&~9$R9I-|X#SnxDC5!nK%KFj=v`!AMMh&U*?hN2Ux;OG*;v?M{6@tF zwwKjNgF_Y=@%SvJO8vg;e@oOnjCejPB_Ho93;&o+sW=nDj|PbYqph4sTjFYbNF7q7 z;e|ibZ2pAw6zVMv#8{y_2@Rj9w9k4DMqVvXs_GGPaepRF(H+nM0ymdu Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/msg_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/msg_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json index ea8920d5a0002c2c4358e1e56d6db2a12c571830..655bf9694fd5653f98ee197c1d4b7331b983bf68 100644 GIT binary patch delta 2113 zcmYjSU2GIp6wa1mW=kn7EVPwwYq#4%cRRE9&fJ;ZZ7gj875ax;OUt$>3oRNGi5LW< z4`>M_5HO_hNhF9sjK~8qG^tS{29d-EGy#o5MANv5iHR5*h>{Tg^xTeJ57+bk7;-E4-lX*$TSAYIJzOBlwURq)y>j;1vh)((pzCxM;{d2)hk^c2T2 z(xM{SA9HKy!vY&Z%zfUs+Q89-ipI4D`jjw6t=YH~9vtr~?b48rYWOMPHC9E{av2TH zRAGLnH_DC}$HWQ-9#>(j-0dQ<(7;%QiZA>ekN0partwE;><? zNJAi~qdP(k(Mf+)$U+veYa-BTxy1a|sONED7!A;@8IGEA6?F{;ZZ0Mjv}pLd+`yA{ zR$)e@iP-l-T#_qE?3l~2z@ZYPf(Ic3AJ3pBR~MR(=7$(SU%1vzFWbc6;o5@A_^wv>Ug`DP@_pkI`sTRw9BvI;7lV=19K^pZ66#qa6xe7 zI;ayuBu-s?Lkg)OQA(Lh*~OTF>Zm&YtFu$Zm9BzIOf=79INeIz$2DXcxVt#r0k`g78d&U=xUv(=jFm(pvyWr`lts9WJ-8Oeh|`$DixdCn_a2kNL(>a~o<25V|+T3oVhjc%4fxunTwYFYnfQG#d z5_kzFha;>-#Fcm`VBi+Og3HnNjG}Le59}&knlCLz~wKf{i4LbuT$hDuf&>$fNeWV^w z_Ofx!jp9R<2~7Ua)l#veDN1p|lN?gg?Fn+L&T&1BsU>jwu;r>t_I0mBpe8HuNyJ7=Sm1@Fl74U9!%BID zByofY$YliGPxPLYDEG;`N;>Qwxy>Whv-JHE*{m;_SIUoW!L}g9H>Li}B|HzQykKOW zzG6sdZ1)->DU+?oDu_`!{0yn&NMHUAtCkU7up+~jE=ng$rml*Es)3Wex|_a%c0=Jh zaV+mmd2jVr7<9C}Yi0SX^#-Vygh*gW?ENZGDkypei_C>HJF&6EcKey zM$e4%&y{b)9l7Gaw=Jgt)!L`J@RwelUo!o-b~1nyLpnxxTbSw4@o}?-6MJ;r-pSvj zg;zG}C~vTEw_V3bmxV{`gj%~$YC<#`C{79dn>8`BRL8c;sCqY5EO4;h#^f#ow~I_n z=4(jh+8E{Up;`yu=0(P$8cuZyj4b6gF7Hk|_^ygqZgsK9iQ-V3GqzR3@s&1y3&l_o z5g0EKc(}vCH+ig-x79TXq{14Gc-Hh+!5fBJ{2(SDYItK%uvB}tL=&I!ursX!RS^?Y z3v|4c7sK|=0%tbaC|GXb_q{BW<=%-oc&8_dTNyEHhc9!-N^@+rfgO7VChPo?Z|)Sh z*=$QC&y-pyh|MkA>b5Ht0==cO0uQ4!ZgG(Aw2|5p!-jT2lU&@%Sopr* zmL3F>V^0m?*c!oO+*xyc$A*(8MeDrMLYBrnQ5qowIryQ|QYHQoqKQ2@xV)i(jnJ_^ zW#jIEhLh~GY*xN0FwM)(vfMYbE=GdB!4HG=O8Ud#R*dHAG*vPra5h5|)5i3rng@$z zWz%a`eWK%{AuYC%AET%F1`d_Yk>bqrlIZUAkQOXhLR02oJQ_tNM2Oh(KZi_Yvk6=w zE&g+XyTbN6WR5jzm?*KZzCoaQmjkg{$C1Sm{u<~Tq(q+LuSM}orGIH;_^3IGrw3VE+Q6k66W7u){FSx+90-*6 z6G0cNdf3c_h6M?eofnGU(>*r!b;+3cjP-Vsx0s7}!z5t~8@AnK_&jv5k+eF{i0Xwk ztlPxl?ty?ulA;*pzMq?H+{ zZ}kc)b(ub2*)Ru)N+HiY#nw$%45GyMz;Y&Tqo)#<2{{}b(j6UPp8a-E@OA?d?Sfbw z_8O_mfIL^KlygI(Z4~%CtS%NT;+}9Yx!Z?&!jUv3ICzKlI5-vb>ps?GVR(hBW=W7^ zwzqVSIRh8iW2s)MzMiH&K9ghgC>iu)W#XT-i^Ge>W2$|&8t`>oP%CwD6z@yRnPs3t zu+~)`S>gX}2Cgy%(!23qpGoP*xrir0QP0nDQe0z4G9ec~)yU2WcF$2ma|xNeTxl!D zu9dJOVFM$Uq(qKrHT)j8`j(!cmGUcbpV!Lr#@D%lBwi@C zXUCsxR1Dz(KXhIFmJ<6b=hA~&Ok`M&C!?66KpF4wCV`6#z|jpcJm=Ul&$WFj;Yx2s q``q}7sO|R)ZB*5JxVScsaB4Px+&{>VhwT5NJi##-(;EL*@Wp@a(2P0& diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json index e880237917376198f0dbad411815807c8fb31cc7..82950e1e00d63eed17719b7947f1a49e53234c13 100644 GIT binary patch delta 2977 zcmY*beQZ@{8PEB+=Q3DnM_aKirKN?Hw&&dUJ?GqWFKY|jJCSv?tnFxkVz!ngCEHM_ zOPJ9J)?mOtBy@cu&k$H|vS477a9yj0IHe{MXPC4ZYScx0(XfcFq%O{x!B(H=J-4^< zzxLes<9UA1@8g~PQPK3Di?Ug*DE^2YNIMAZz_WdDtJlE0+Ot{`()S*Q=k?XN_62<% zyryrc2$E`5f)@t9&HvILGQVk+@f*wK1wLp?R*qZd_cZ7p5|I0Y2?tNxmz-Uzn#8ZpexY7!?=ZyI+V{CZT?_18cxgjBk4g%8;; z#xT`t`0z|roZ4zw`0Id<;Wl@opCZ&hX`uR78KB4JF@>Vs5+cKyF6x=zTsk z3d^6gp{qp}h6D1yj8hZ_RyRU_uLYleJ_aW{36HPPh%z3{pHaLMFI+iQZYe4#;%q+c z;P4<#pBF7#CBc~p>!2}G$xBR-dz$db2ZWyeAfZ;1P+h}~Vwb8UxF!S^e~TzJQzR9G zu65euPuJ~P!F$!<@$K!@(bQ=*Y{(>CD6aD0&8867?imT!N<8SQkSNjw&dOc1n)%sK zAI_f$fpcSeTup|X<7@MHj&=yf2?h=de7wi-aWX|rz57r&^RYFCgLA9&eCKuu;P;m~ z3zJk#;IAgW+DF&k^d!zD3^BURCn%%v$B2VN)0(e1jVaHN<9FhH)?#b&dEHiBUyrK! zLRGue5;SoE{lD};ZZdJ;4O+s7WwtnQa;wC5x6n+3mPg+6^C55n_}3V)_q7V zvtj6>Pv?YO>8i2tatBFtI9b>xaOyvL6J|GQ?s%qkKk1dYd!6npNQkS*(gyq!wLwCS zt8zbXl(77BK3R@xtF%nA`w$YhJ`P~!W#tE8H@V0oQ9G_wu!Fd1Z7(b-_Mx-X#r`Kq zGcT5szTPTf$SioTJ;tLVoieK5oN+-+#PDk$>d&a6CWVQ29$kPYshrMaZz_nByuifw z+ck%rjy$k}gt?hqV)K!3TJ$0B13sK>AYIi&p?aw@TBSA~RCvtCkPr(h4J~%4wcny9T43{BV@T`CVXcn^ zOZ57?#Hkm_PU!ff9X-c8dbFQ(^yq7E!O(3J#3zCy0*+NsBWcZpwe@*@5@yHP7ug@$ z<^!5?AR-tbKvHF??^d+hlyzSz$xb z|0iu8Sb??AY9?-dlDk~u;-=k3{>Z~iLmMWVFsUq-D7l>=62)O;!pGXbXdbH}Ho8Y( z{ zk>W;vuf<7I4%0C_C0C?E$ieR<==^L;n5g83yq2lcqyM#4(^ zF@PQpf>`nSz3qlga}$GV>f)agv*zl+!pq4Bz&g-L4x9FVM^oR6C||i z3ZFe4KfBA|P>qHpr{KHqOK9(rN^-EX*+FqN-^7j|gieunV72QxGJprl$#lvDjI}0U zI!UQaqbKsI@QA>n!!BH`6!i2k;Xsn&>bE-8@~DwO3cL`Vu37=_cs`8w#$owC!{KGN zgj_gOC1GS%`4!%yh*!q>W;(MzHuQU@CGQw*yCo{X$;rz7mlN9UMMS zxc@4k11Z&5mvawmdF}1{-D2tCYljJbu`AO&j+$D0?hP6TvT0tkAp3hv}c1 zc=a{i#@JQ$GE<#;N|nE&jQ7?py@wmabtk-BeP%d9M&U1;1H%&E@$0S1>-#FJ*^$p*mQb<|}F< z93`CB7M6d3q{(2;H-zqb-&cC3DCQK;M0}99Y(4Pt%O`XX|JF+cA+yK({NO7*YDGt! rquaw)pT@_GRxhu&>E(6VmT*r=(SifztXP%QFw|P;%f@wkj5GfOm;4hb delta 2483 zcmZ8jYitx%6wW+4E059zBcK-gz!uu>?99$=m$qQHCVEj(321i6@x~>u(2^H5~zQam>`R&!624|7?Ec~0zz!5=iEDO(WJ?AXYQPP&iA^L zyp-DWMQS3UJXTm32p0tkBQU7uz-48%62bObEf-qUsqkTXHYC)dN#SC#CLAcFKbIB< z3LUybuk;x|MnYcg^W^?bl&j)WzMav;g+?s|IYC5)>7n;)xI>3gnXa>-ZHP7F22h=*rRY z=qf6bxTvGGQ_Y9g&*ZYUr+8TeZe^G-W2r5wC$`8QN^326kn3XQA}s{F^K9t4VqxNn zqT}9`+9S1S7RYD_VCEgg#k57X#!F!t> z*mo@qX=f#6N9LN4HfX@nW*c)>@erh?tpzq@<-5=`!R4DSw2dLM22^jDQCSY&UqTeK z_L|PQxUrW2xt>a0>-(ywD* zgJO0}F2vTLq)+0U>8RGe9@WOaQ9NN(?~axJq_JQ~9VbK3KH7kPd=?~QI%fW?SluPD z?^2+=g?PR~`^VjprbXu_KNADqEOxkQ`Quiem~vPq^wwxKB8Tcd5@N#{c&VOT!PuD7 zZTOnJR?%<3U?o>z)sR5nGw~uSA&6HQaA>wEuB#`TqRXRm^E($1$6aDRszOeY({srq zE36@H2cUEw39p(geu^xEi9$k_^*m*?1Mwn8SO=)GJ7=gCyfH=+g2@oA`ac@mOJZ-8 z#FS$tF}3(Al%?xf)2vayB`NrD0sX^aQL~7qO8yq%&gDL7D@lpjN(8Ph=goZZ%fdj% zX&n=%RTH{PWX9ZOH^+-~Y+R`kZw5?UZ{eP5EesWJ4h@_qbbNam5lV<)=Xi3t|3^~d z?ZZK`subD>ew&Ljr6I7ZNZtEsu31J1GO8WuuOsUFRTu7!4}(25fW0qi7vS>d2=tWd z>m*Z%JbRV|vpjUh5>lj?fR1s#g4F~^dVwUMgZ?lPiHhV7pC__4rsycXLkw$U& zy645#Ud6$_Z=uR-#DS58QHE}A7IrH2BAGhxo8Y_wmdg!WfywMY%x`0E9li1UGhLgM75 zx14C}M4NJjT%;33doo6L#=g&$uuQK+9kmyyL%@GkhuceOZ(^NNRd%P&r20`EGitpX ze~)LC>5QdlO>rSB)q#OZSM-2Q)zrve&)Yb#+(UB3G3Ak0*vp6KQ0v#4y^7I!cBey# zo?OY!mI=$GhS8o&wOATEi6R`$1qnI|rePMPhYpzzj5}*`BnycSXDtgxW}N61&Q$W% z2dkS*?$5@GRB9q~2Zh~W3jVN83z4jsPbKBDLrn|r6@}njj(2*{8fYsBqMx_%USM|% z$Mb>eqD|A|V1wr1<4puB$0kw8rq=O52Qx1H@?T8b#+cy0LJvtm(RnUxTp~z?U6uvW z4(U1)H$6A7S~!#z#;3~w5WGE;Zx3nEfVnodRm8rQv%I>In>(4IyhM)>JTd>?JReNw#Cumze)g;{E`pk`G({@56-6- zQ#I9-YaRz*Btk SNy6nw1fJJk!1C9$ZT|ww5|T;) diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/msg_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json b/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/msg_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json index 2d48314a41cd1a703526fe3bcbb8250b6a074b7f..cc41d9f1a1b16195ebc561f3378248767c1f1915 100644 GIT binary patch delta 2087 zcmY*aX>3$g7|p<&_qtkWA!E}{+v&ozo%iP5_im>PEdx|3U9^;?1*$DA3PDXsqmj4~ zNl-DGNW;+pT5J=eQ4kqzL`)1car?n)Koepj6@>(12qqdM80z=kTOt0Mf$W+FJ0a{u!cO?MgcpwB$H1mQ9gell!=p2b(A-^t{WI$G6Lo4+E$>T6 zn}5<5F@2_R=1J4z4HAL0(70*589+g~i|c6;&-DtFq#H=x14 zUA4A7=3<~;?~A!I;2~1%V~5bISKD2D6&IMOGI6mt4%)q|-oschh||leF%h!xdA^U_ zZh@(JHE8ekF>BDk)@&ai+X4k8HFV+fd=IH+18v<^RMNtt^#V^8xablVK3rUdRIY)B zK7oxhBbeyR!G)6E@xHA4EKD|AxRkIJ&Ul(e)ZUxGuXY@Z?v=Q<)Wt;D#FC)EikOFO z9VU)j0-{TxllV;#-|?74zpKw4aP;Su8W+P!564<)kL%%Z%vRdWj0$4t6Ig*%tA$gQ zK6Vzx@XRWK9qj^RjY0fT>fm~tfi2w*&NS-#R>s7xCSSpvic0hqx%jChhOgtiEY<&` zbLo4#iT)NZAn`Nlbgj(BWVwY+{SJW@c(*{}N)3@(3ti(~V{Un8f=90^H*3bZ>71 z3EghMuF-;L77Bbu=tp}rh6^QC3d@C(wY)D-4^O&;P>hd63iGCys&S%6U?=IyzI(e) zBB#K|7u7;h8f|j0VVm?H1{~+j~ zX|4@HcKfB*Q8^4RvPl~fvW`VJF-n++rt`u&?x|#(^PK_%WWO6#0<}$2**m?*$FOSz z1R@!wn0mm5*|r96%wpth{vgFjD5U=-_vyPNHmr6K&X-{0Dp!Rqj1X(BWE?HNuckzH zrjIUS`+Aa{re_2n2U&0#exydo%|G=Wy;3sRL?`1IRUla!fl=8n-=d)A?Q zXb`^CA+VvJSka!Bi{m&;^@s(Ypx_-{LpZ4B9$u%=KULtsT%uL~yUWMJ{Txhow?I5u ziCoyBSMxrtIjRY71L%E_^wl` zSBK?)o(#?sjhKSpr}@;_3~k$e%N%?oB@V9AC<3Iw)a^Jrc#)cX$m17K;>Zdc;Z{%C zyNqHrNK-npR##+oUTc$BnoaEJDY->#Pf#Zg(W`i~P~V-5#OX;faX#o6^n~AWd&NU< F{R^nS%Mt(p delta 1799 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 F`8PmbhzZ$JJ%U-ldK@BW^zzWwe`-+cGSw_ktt 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 T|JlVa{KI?ST3_UkKm71d7QW`u diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_GetIdentityRequest_10ade8322ef670cd19d1a472a5477667b9a9edd07833d77c1af884ca8a9849ca.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_GetIdentityRequest_10ade8322ef670cd19d1a472a5477667b9a9edd07833d77c1af884ca8a9849ca.json new file mode 100644 index 0000000000000000000000000000000000000000..c3b77e7974e9d518c0f8393e7e08672dfb1a573a GIT binary patch literal 79601 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json deleted file mode 100644 index 866c0f5b249c26e540aeccc351a6264bff01a525..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69306 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 TnUAnO^NUY@biB!5-@gA3GtEU< diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json index 8ad4af10d199a2b44bdb0722f08e0bea84860c86..de6e2c5282bde2622a5de15dc6c68729346fa1a5 100644 GIT binary patch literal 74816 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 T{1odw|M1SY)))EX&p-bgiPh8> diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_GetIdentityRequest_10ade8322ef670cd19d1a472a5477667b9a9edd07833d77c1af884ca8a9849ca.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_GetIdentityRequest_10ade8322ef670cd19d1a472a5477667b9a9edd07833d77c1af884ca8a9849ca.json new file mode 100644 index 0000000000000000000000000000000000000000..c3b77e7974e9d518c0f8393e7e08672dfb1a573a GIT binary patch literal 79601 zcmeI*&u(5vb_DRO{S=1QT<{}BiJX_n0}N&tF9rcJfs@R}@Vie{cT2pQvBmy%LLdkN zP!ehNpHrvm)H(Nl0{qJlKmPdPuRs0#AAkPKzkT?_kH6%{{)hXo-{+@4|4V-Qr!RMX`1hax^4Fij)qno{Uq6k%{58M-`oph3{L>G= zeE8>o{qToB-U9e`fA{z>zCPaFZqNDomOuObQ@+oyTYt`?k9UbZOTXQ8-I`o}ch%Rm z_b=<3Pj@e$^X>ikBUI+6jT2taNtg|{Vcr)?!~XPoM9%v7a`$w9_w;m^T=&QB_yTyI zbN&6}-Ah6ni09ESPvgJj;1OukkzjjWGL>~*eqRWUV*SkvL8+dO?t`y5XTv5f2ul=ZM@N4jvWMbWww2&HVN&t5~y`2p_o%P!y|L~9*kQ8ZBqr0Eji zE4>IL&P>=V5-EzJj!nsyt{3;{;iPj3hJ_>*VPT_6D>*Uk{lzs#JiK0kY0rAv(x}uS zhsgu**%T1_LE%?*BI$Vr6>_&=p>@l63fa$Cw}cnzj4Lo{*4ff@k>^h;#VxD(0Y~9e zV7($qmcV+x!p}G)#j>y?DcUU9$s;Xlk!fC-*Z?Q5n=cbsA=^gXV8XSULlULjWs5j= z6BWnS^hSh)g%+oj!Z_*N{jCLy9ibwTs9N9$=7v|)c4Y3NkTgq8k(74Nk6bBBxkB(( z;aC)n2jwwup`z%PQGNTibAY9cU>`4b5#hp4Bu+o{Ekyk!k>D>@6N8CIs-x#)Z|WNf5n&S5FRF3PYUD(y zHA`cFp(`p6yro+X-uA@YL?PuuZ6tmu?YKY=-gcs~xB3ps9Hq6d+m%>NR3KnArM=RY zCQ2v#Y>}vx?kYAS)LbPhkvcgWEv~|~g{2}CZ|W|@?K@}IOMZ$1{eKZhQAMt@zELUg zXjNNGt{^Kw`jRNCpb$6c*r&Ve;~w6=?TUz&daJrqxRdjXI`3Ol=h-6F*DGj!;)$WD z&foPxDcX?pXK8aCQ4ysmP_Z>A&1!}y0nYM^!o~b`4lEH7IYAg!KtLwlB=TiAT6&bL zf!#zHMM~)Twj50k1pMU&y}4y52BK> zc9BB72Zc&&xFY2$f$guag$frW4~~RvO$GxlYN-N)nG%zPS7rwf{yHQlDzV~5h02`k z75jt_dY(N(w6QWw+6(+N`u}|nQ!F@RXG>=TGL1n!4I$+{v8l$gUIObC8P1VPh9A!q zAPc)T7ko=rXBOE9f;FSWgNbd)i`SjZ^GZZgBw3oGrKk0^MLI|m701@}2D@PCEomi^ zF*=_XHxikhnpLcbZb?=J?^3LKj);5#AvX|~m;7+f>@JjF=q3i6TUD%NsqR7R)4nCK ziNBCVPR(jWPPbr+az&#O1(t}^g-$O?uWacpM8}NEb=wSVKT9^MG(K^j<~9rxiMd6p zsZr$?0)p>3J05Ijsk%*;2m<|ZhCR|u^L0-{bn6;8xO7%_7xislMO$I1_TcQYKrk?Lq}vrF4$ zbV8&^dK*vD2Atg)VIm#}1F5P<^F-#j#G_ZV52Bu%B~nGISoB{N$@&D-T%oFKcLKcUAIuC1j7$|BsR~ix5uwo6^ag_X zYR|_9#@>SN-7Ud_fmJG0hB)$7SHyVE7YMC!Iv-PXlF}5cIw97@bmGXrqw~;$Z4H@IZV&(Ai#!t`O7*Fr;1);2M=QixQn% zs7uD3q<6PMQ65b!p-4!wekOKbev1goQtFzrG_63dh&&{>m6Kdi;GquR(yoI9LUtA&%P^SPTQKe6^)D%%Q>BNN-R4LHX z!?C|tr1Zr6N!}Aeem89-Dl(i9ClDGHPDF(;zvPWa`R=Mduc>&73dQx6Gfkr11;Ui#URu ztV*Zo6&X}e3MC<*n+;+5KIA;ggcNY|tA8j?iST%pf&y^@(FS%`&4m^C2xZfO`sI++Ozl}|8jdGQE$fm@TmuPW| zridsouu~XlIEg>3?MGF9g@T#Y{qws%Pj;xHZV}=t)SyNnofxH5TSWL|(Uu{zM}Ztf z70=Pqrl?d@Ib2#&6N?WZ&8pDd^M&hrGK#jPCs{3OY+eRALJ})zJaKQzYJ?|OEO}#( zU~TJ@DV9$mGA6dEx|%2`sws6-Z%_>CK`P$zibc~KrxMLG;{!OLo6WNh%DkN7bD|bVnC%r3)d}!4P3nM|3`rG9)L;aJl=V7)rV8*0sOcTN z?+4Z^q}J9IxoH1WA?%nlw^Sfm%qUdqGq>WX1(J3nwy>~^db6c9MSX2{PnktqAY!u% z2$ofgU4ZnKG*D7w1TQ2`%L270n9w0LwHOrA3qf@ybTikQ)vzYo2n!X4D6sE>B&F4o zK4QmqNPANos_@*RTVlCFcTohsY+37tk-3F#IpBTWf*IQ{@SdN;rTRK1Nj$Ydm2S9G zE>g3kUYsWbnNg$wMTA`}sB4?FUQ={nAY_A41qmgR7 zNdN8m_*6o8Yhn?GI6zT^JJCkBq*J(WC>O;dfvxlk{F5z7mx!wA!UvN^m0cpOxxO2> zAD6mCNG$0ZQgS6%G$eGA+6ax=X?aLrqUskVHYg-lA+Bl{APp&IA_da)<`xl2rK?xW z5qdja)s@t2QK0`+gw)O=DnUKzW07FT+*e>J9;F0ZaCGeXAzBn07I;Vq3sQO|n%0j* znKpugP^aS10~?Q^=;F{Jx0Jhs;Xk{`J+eOVMd!-k!cI{oBs82lEq09pR}b-)v0va- z$bqeq)I)a~A8pBc;clWZ)OiIY3S5dpF1l;GYI23DFkTBE)k{lXTrol?Z9cZsv3J@tGb-&g^fD87u1&gTg1xVKiyB1M0CZ*ad zL{}39MKz^Px2yu8E*2CAjA(lGfm#_4edr{Wt^f}a8C?mG*0@yDk}h3=1vRr|D9}b)eUjLs&X;f5w~?g{ z8NUsC$06IH(H+qD?<$MWRhSG*n1qrIVY|Xiq$lJl4`8Jw;)HEGZ1B zsm44s48f#EB%YQntPDj5^u?)4oV0++0*%~L zdzz>M(ZI4rET!ocKU@lw_i~|++Sx&_3L&>ht^%AAHGwnf?g`u!W*-sfDHfcRx+UqA zN}R<@l~^7JoPCSv`Xrg^9cPAxoix9_xRFa%7hb9HZjto|#HGM#-e^csAhDK4gTt6c zRp9xeb{62Yel&dpo{%(GSuciA)XA;ru(`!6O1jMIS>G*m%Rwur(vTL@;Bz=-RkYOe zLo}we`NWRj^|&PpCy^J6EhI~4m0}bm)1rViZe!2qz@_hD!zi3=cZ;gSICydh5D)#OS2^Fr_W~?+js9S zmMi)iLC#+xk(}}w3Yk^73*AaY+Liz>kko~gUQpf+X2X>dZgpE#9+wi@X4-x9FgiEjU87$H^2lb4B7T5HZ!2D3V7iQ76oqt8I@81X4&* zBqX%K>QH8-phM=q?x8LLwCTkydSS_>!=-_Kl`(dnAmdhWtmU>ETj?7WuoKY!x91A%L{F zb|=Gw@gf$n>ixhX)K2qgEL#eBbWf@~PAvX2fSxb8DujbK4?Z&WB5{VryEHg{s}nzw zH()cQeYy)dL%7h96md_-Eei$JU_?cwq1KVo6C#>e>ZBo>;>Sm)1fy=*I;D^@_T)>- zp;?Odgy^MMp|4v4MA}x?8{Kj^Mbh9&NSK*@uOR&p#%5cLmk)op!HIH0i>)Z$PkwT8 z9Yf?ti)SIkVL-7d9EtzHC`yxDL5|vZhNgeY{pPue z%@;Xj5+x0;jOPmRnQ(2~4HWw#Z2ajvLid4gPkOX=H%)9rtEET8IT0+sbWd^Say@$P zzC5}qSCI96-)fRC5|Dt6!O6q zDbEw4BUItKxzdWudd%%f`HUjn*U8KkHPd3xBfOB_EeE4xc1gx+fTEKwo?rVlm@ZF- zhNEMfqj~p9XS?#))q2+U72~s%}M5-6FXv9TZQ1%lU_ z8S}~rrfUk=0?Pm(PwNMatf;mvC{3LFr{@O+S(ZLB;0uR_lq;0(m=%diQ3r+iVRar9 zVs4ekHqp%zmR`3+9;jGFT^6u6HCHmLHzd6xxzhReV2hwA9RZF}CB0Uy*q9oXP8awf z(DSKOQ%72QnAN%sg%mdsu1j>}gl^E`R;sn!WsBMfHp*hj7cmm-vcA#MSG=kDCx?R{M!`+e@j6B4L;Z}zLX_mw}ivk&}M@dM% zA_XfQvs-e@0Ugq0Yi=T{MkOeU8mmd^Zb*SZ15ct-TS%fv=OT}mDjgm-7={1_k}Cvq zLn5M;g2bOIM60ui@;jiOw}=82c;kuoM1E_F0O^+KT!3_aGAugmmSjvkr&oxsCJKsb zN}X=$mO(v8B`6LU(e&yo3uSx&2h_2hNLPS|2x=K^F`|&E!2AvGdt( z207nR?4NHeM5xIU6?H03X2_l&$TEGEg+atV>Zw3VZ08daIlfn%^3%HONFY(oTbL12 zIB|#bK;qwLxnMItX!)RGJBTU;{`#(NCUsQc!di2c^Ci7{#i~<5(RiY8G#o0T);0Ct z$V2FEPm%MdX!k|lp$gX`BFZE`O}?nK`6Rv)Oe9ApHn+$u+NdH7$r7>L z^L6}oD`r!Ytd`}V5EE;mr4~dUbp8y9h{*XN8p=5kD1IE4no<;AeI6^wAfrRpvBi$a ze#;k1u69cKNug2Uhq4357Kg7Y(igBiO9TShFNB7Khm-28$|4D>%0y1^=Y=Qwy^u#-9fV|OR=KO&N==k zpV}X)=$UdERT>yY6%^w16;8I0)-uV8yR6)jTVQYR6lz;cCVSV){w zG@S%EF^I2+t1CJm-%GJJ)H#u|1BzSPqVT#wv?M^f<-pQ2iAi8neys2mxR@cIuZne# zYHr0nPM-7hnHblXyI6tH9TZmDk&_Ue{$*LsdTA~TvKVaR5zkLP339a^B7}vmk77}N zdc_RP=BUUC=_nSmwQ#5X)Vp@8TXb6#2~2b{w-||Otdgrb(5wye#PXLfG&ogN1IsNkK(8$lSgxqYQF%nW zv>smxt@KiPq+)4(5}S!3MM72;{pyxrmo3Gv){rgOqN0<2ZDa5GQKO6|Mh8xBjVGd| zc#@@zO2owx5q3q!Xyh)oLtC=AiV{yK*EsBU3sy(z5C+#3RP!Hsv literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json deleted file mode 100644 index 866c0f5b249c26e540aeccc351a6264bff01a525..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69306 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 TnUAnO^NUY@biB!5-@gA3GtEU< diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetEpochsInfoRequest_7cb414646fac25990a7ec6f920b332bebcab89e518be8ed54e76a7267ec2da52.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetEpochsInfoRequest_7cb414646fac25990a7ec6f920b332bebcab89e518be8ed54e76a7267ec2da52.json deleted file mode 100644 index 2811750699f46e812f7d6955ac1faa489ba5b31d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69758 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 KZ}P|A-~Jb;{I(VV diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetEpochsInfoRequest_f93cf4e7bd56819a2b255d14c3b0208d6c0094fc5f5e03f668d261ae4931e0c9.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetEpochsInfoRequest_f93cf4e7bd56819a2b255d14c3b0208d6c0094fc5f5e03f668d261ae4931e0c9.json new file mode 100644 index 0000000000000000000000000000000000000000..d48cd3dc6f8276f523a795febdbe7dfc88509410 GIT binary patch literal 76613 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json deleted file mode 100644 index 866c0f5b249c26e540aeccc351a6264bff01a525..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69306 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 TnUAnO^NUY@biB!5-@gA3GtEU< diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/msg_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json b/packages/rs-sdk/tests/vectors/test_epoch_list/msg_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json index 7d0727eda91aafc4c65eeae18c0df6f0eb8afd39..2567948bb1faae7f94e15aaeac6343e83fb955a4 100644 GIT binary patch literal 85047 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 Tx3GTY2OoWFeUZQZ{m1_W;Mww* diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/msg_GetIdentityRequest_10ade8322ef670cd19d1a472a5477667b9a9edd07833d77c1af884ca8a9849ca.json b/packages/rs-sdk/tests/vectors/test_epoch_list/msg_GetIdentityRequest_10ade8322ef670cd19d1a472a5477667b9a9edd07833d77c1af884ca8a9849ca.json new file mode 100644 index 0000000000000000000000000000000000000000..c3b77e7974e9d518c0f8393e7e08672dfb1a573a GIT binary patch literal 79601 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json b/packages/rs-sdk/tests/vectors/test_epoch_list/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json deleted file mode 100644 index 866c0f5b249c26e540aeccc351a6264bff01a525..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69306 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 TnUAnO^NUY@biB!5-@gA3GtEU< diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json index 3ee4461b99d35190744edec7fff93216e3e24423..13568b0d05d887e0210ae9475446de6a9d536eb2 100644 GIT binary patch literal 93309 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 wefWb7r#vir)z3S;NXcR&90ryqX$ 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_GetIdentityRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json deleted file mode 100644 index 866c0f5b249c26e540aeccc351a6264bff01a525..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69306 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 TnUAnO^NUY@biB!5-@gA3GtEU< diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_evonode_status/msg_EvoNode_fbdf15806b1160a9fb482d5663371cdde55f94897dcf9d905573b01fe445fbc9.json b/packages/rs-sdk/tests/vectors/test_evonode_status/msg_EvoNode_fbdf15806b1160a9fb482d5663371cdde55f94897dcf9d905573b01fe445fbc9.json index ddf9cb236289b9f0a37f75381e450751357bb53f..e51843cf30447914599ac4af65de1f69fcf39d58 100644 GIT binary patch delta 1340 zcmZ8hO=ui-6lb>cmF-T*?k1bvO~&11X6NHSv)ifJN!o)FgrX>FQ%Ut`5yXR{@mP!Y z;7yT`pBF9CSfsQ>WNV-Y^^k)U1hKp3peONC@R(LSR3Y)b|4ie@VP~0{H}Czv-v7?I zJLd+UXi9>WQh;?w#i$cv%ZqTn)kV9a;gaiP;CHbzp;Fb2TBs~yR1EkYyH<#6O&vP4}X?AR(Es|zK??M{Hrii%@XA=T*k!sA{#?zsW=x@g6iFNU(>N-~X2MaN%r z9n{Cp;{ADnt7c5S1m3oE95f^4IPSXH+^5PR-sl)uH9d(d#i$wK^idTzYaafrL^xv# zLNjX8{Dz8U+s7}yiPe^y*E3sN7dfjDp{Pv=d~OMB*L>`^Lc(d_$&OGSrm3OQ=PT)< zn0aqm z0hT8;yjhqb=R91VdYOD>HHY-wZqd&O;M!y&mEf-1HK8oXWc;D~hh#z$MT0sOkOv_% zS+2*pQ2hs8j1TP)uZk<3SKnC<jwEk;_S&G@? z5*Y6h9{8b+M}FSP`oZv>N^ zg{zD@RWb3%^Nk1(<^on^Aso--u|Mo!*UR%uXHnvV69F#F`nbP1!Y`dIbn};SyB1)V zJw9KQnejTqLiIT7N@L7gJ$-jz_3_<&fG=vH5#y2*V52MWo10{+n-7;l_SkMpyzY9L zIL6&dV4TrSjdl{Y=?d&L1CkYpZAL7ahk%^OXyIv6= zR|tERfP46JA;gc4g~xTD>CN^Dfk~4WRqFftY ziJ9&|6){Gsz_{f^@EniBk74J$YcZx$`+&Y09H=m+xY<#1@>t-Wdl*` za{@*FEy|owuB`J)?;)tVt%mIcT45!h;M?X*OfK0c`q@TJ*Kr@D}hV@caSm~+uy zTE@ABi#V>@*l2i~(WosF=Sg-?th7pxhj_mxNR@?$c^@}x7PhK>dhX+Z*8G{#hh-b@ zSx<=%vEAycYSh5cSQU{@)Zu=SzCOOD8hO!Z2)ftZv#l$maj zq&wt!$}v?|vPf+piSw4q#UHd4R`+|aWXqIUguH9W2pt#@9K}o#l|3uM?=5*EPyepn2gD^kLRLSag?j! Khp2>m(c*ua%7wQ8 diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_GetIdentityBalanceRequest_10ade8322ef670cd19d1a472a5477667b9a9edd07833d77c1af884ca8a9849ca.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_GetIdentityBalanceRequest_10ade8322ef670cd19d1a472a5477667b9a9edd07833d77c1af884ca8a9849ca.json new file mode 100644 index 0000000000000000000000000000000000000000..8c3a7fa4d5cc5d0f9563b93462c1b31c0123d924 GIT binary patch literal 38744 zcmd6w%Z?n!5k1{`QZzKmPCsm;S@;$KSd7^>1ALG~V&u%jN#&JHdQm=Hm)ePfrERP^ zL*(*t1bX)&;$ee@9SvA5v<|!P!FvgB2C!l@D0+3P!Tx}82F^whWixCRneWXCZnnceW?D@G&`qYivc4SiehKs+Ph{x&kcVi$m zKFYCYxMtm@_{tVk=dY#9VYk886N=0KxpAV44Rz1e}5}5G&!=((LnpuG8c>=4= zr9L(x-;3={`P7Vvr{)MgDYfp*dA(-W2T7;XV)7kGa#T@ycWg@SS)ii*kUJ?Tx7D$QC96joAMe66 z29S%L)B=+i`6@+hVN}I|3PE1f(+l*LDejWwm{E1#%D{5A8WqL4R35oS!6YKPlx#Ap zk%Iw9e9oCGCoClhv7QSV6BfDmY+BaZ@t{blQM-0sAJh<4LekyRrERZAi;1 zD0KDGn6kdbjK4xKBNC8W$*04UaHG_uq}cPQ$fx~c@0MW-PRS0r9SK-o_bGurER)V5hKG#J)bwz#70N!*; zIS~>pl~N-L`dtxjro(#1ofw}MUmvVqg&b=U%#K9Q(+2+!^% z`yx>(BnO{(96s zW*p-qw`bC)0v}wZW-9h`4}0s;k&OytXO6xjO@dG24UP$wnq5CdC`YQv@rFySOKRA> zVn1~XLdO%`K5Myt?!GOKs@yVu-AgVG@T48%X)&d1xC@X=V6Ir?8sd6y^MWI)&hE>*q7+9psDP(R6 zi~~UG1w9S-sMZyXy}W zt_ra?nce9?f)I5JxGFa_JH2&ELE#nvk6S=*%f8r{Ch$gYe1@DGAJw3yUS!p3ld1 z-~>c&OYdu};tdiuWkk3gEg9?42PC!CzfB)J%$4zAibo`2jTO`%Vv@iDV<$>NTqWUhTS z#ZTiX$*U_yN~YdnRHZ{z6nj+F-f)|u;&z~9ToOVE+_|TC5TZ`0kWXyEl;ps8GSnNX z9boT%@J?Hp5qPiU5kjZZr#&b&^){bfN>T^}di#`64OqXUSYN-XfKeefB{dmW&XBHO z9X>MXgaZ??o=-|1S!xPV0;ihQlO+ARL^XHGiX?}p{u|E&#Gky4#7SlOiH`LkS|#X@ z@2qAej|5&+6FBP^dg~TeOI`(q@!;^1N1`rCWL~HKi#>|mcCNC%LX?6pISKFVSw#gM zUP2N=lC1C}`NgFMlk_4OESHMdoKnuBMujm7OG#zdugC9RigQsatg137N)a>B$c18$ zwEhe!3Bmfd_4WUo2ZR)VJS<6RG@f-nW>AA1E2I^>l%rIB)hk*KavDD*T1tE*V~bj` z%XnQuUx?|c5E00FA{bI!Jh`rA8J0*{N#tpKKlxX^tkorpV#{tBC0O)#@jv6bM?q2;s3O^@34y z+mxt+l-8#`JughXayy{?B9JqVo%ELCqvE_uB@uYFIwd#yP!VsxZO^hf`N!V%@ynuT z8?)bR*KaajZ&s>ADO&8D;|s59f6&pB^3oLzEJX#1)J1U(Q$(HJ}bDIiG?Cow5 zv)^<9cmXmMOjCC3NfG3(HHrFNfVh5XaiTzxViKpINCCd@Ql?mpldp#889RoLl{Imt zuPBox&E+ckM6Ti%5>Hy7=WXBOv!R(AsV1r)uUO!! zs|<`?$^m+xQUYTOYg|eXyqm_yM?yQjDLu&8G#+9(F_0vwRFQ;r3fRjOvDebTl-Q#1 ziLYhsu8$kb(WJ={PjAM9X;VC~#8D|}aY~4`1;^;99c3p?VX%%WH9@W8Vb>`!JCvg+ zxNngv&k%jJ+suzr;OZNHNc83Z*swj`Y?qDhcA=jgJ}d&N{{CuyZWp`X&E1Il`13Pw NeDY8G1%Lhg{!fD|qHq8J literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_GetIdentityBalanceRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_GetIdentityBalanceRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json deleted file mode 100644 index 1a3bd55df0eb95eaafcbff291f58f225aa99bf5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33615 zcmchg&5n~t5Jj`*DbTFF@aM5-FfWk@K_mF;Nr#b#QjyBMt9q(*Z=kB9q)dB|L((^ z!1U+)zuvSbKjr^V&pti->DkA-pMSl3`DzPn+kSU{Xt(2T+g{}HmY>`|<$nGJn~g=s zU5b{a*G8jhqW_I0Z#2 z{@K^@l3KR7ZJ%0HZK~cabW%KB_DP9|>9jj-6e{<*rD7>vZY|K$f#0z5Rspw-XtSzS zG2VORJWSCDV1{BiyydDD|KG@f&Op`#{X{RG;^Fx-+o8c35DJKdQwP(tHOqUCZxEa!Bv$qy<;_fK-vZPtcr$F zh9P8ONKWFZm6=e$9hou>-c5|S!SlE`BSEs44;a^rak8*$HT>q=JDJYVav_ zN}B5U@#E4=7n_3=FVX}T9(s3HNg|OT)gvY(7k?r#*rh%T$tumU+yLk>(9EW8 zVl>B9RdTh{+W^s1Ff3Z=AjDi%DL}~a3U(RC=A3{@cxYO?S6G!RiI`(&1kH`4l0oGn z3`y=L3)Z(k37PLfOr$JeBF~52L~5iNs1u7LH6{RbeMwHl$F? zn4l*XzL*#nWGxRcU?1 z#KedI?Hq2aOHpq^VDhSgz;ZKz;YH=14wdv!?W2MR1vP~;AWZNSN79dE{huGqD**Fd zwNEHyMi1>Q`NNzt3Q4;e7oF8cWH3?0XkDWkp|~M{3z1|iT&d&!=mr1bDA|<5hN(*j!(~magg~BEg<7EvC;8w4V)HGC5)L4L_b8Q-5vZ=>$@-*V5RZ%b)?jf+Wk`rgNT|F-rc~BRS?ymTDHkcJ z0j@LLo*QL@Cu?p-KN$fkDpMu0w%0f+_-t;1C!U3lONmrdH#*HX5m9Acn5kMOih-RQ zrd*iFsAz3fs~~6)CvmeLdfU^WgpVqD!9kOafKXMloMeCMpz^ z35#2m=Do1qq(D?*_>b<0c(Ek+^mE+EK}dy^c&7iZ2^8#Wo?#1rF7BhXXu1U z1Xh}$PG)MO8^#4vw$Q2y?r=%D$UIfpmF6oK%|wwZDS(C2*cvV>m$aT*@8=hZgzbt{ z@sgWtb3iws)OyEWD+~5SvCtjG#_0xugc-zU7K252C`}L_HOo>fgSZ1uUe0G8xnQJ* z&=jgT9%Xp5j4eEsQ{dvq)FmY zCagEZi@sh^za}8_>Jj>pyTU?F;YwsaBvqx}J_b8RyaFP`OO>WYqlct=ryU)g2pB;o zev^XhwNNgUFzusP-fny-cs`W8eMUQv`GE3#D0+Q9Iv;`F zKKg(7uzB%e;H{_Vtmy^;8u?NH=!cWCvv6cpNKV@o7s*{QCs~-pv$vjJciA&bpR7lCfs2togeX$~OiWu#vphC)G8x{1k^j>c6o|MfFx8-fTFjQ`Qe}tJ?3@83EyPm!-rp6ePX1jbjh8k8@>Vl^w4$`F{ zl`qW_kDLjtj~XepOB1X03*47yz+{n-6#X%gwW0&s&7Eihy1Js02Ms_^?nduPJj$w~ zig+7!soGi-tjxI#IJ|z-xuy+!F2;mer`FpZl!vA&tU^2{8V=dED+f}0O)RGzDO-Ij zSy0_n2QG7AM2{;*C8~vSBM)dqB~8!-H9jg4BMVSh21aX`sEQ{Fk?JPodKz~YhmeyO z^zD0%kVGTYtk2Dqmsw+KwIDknXsW~%FjbU!HcaBeBtjNOroh4o2q7hLQ!8Aw7aIi07iycn zP&`Zus<8fInOfOyO5!F9u(ryXLRsDhL4|nWR_n8W(`UgDd36a1<=_Lph#TL}`yF2- z%i*cLsl!`1`)oaY5$-G>^NqTEPwdqf9JhCdc=7G&JC6U`n?!W18J5LDB_%+T`kD?| zk##9OJrQ+9mn^J?N?C`Ctz4o*YP}i;kp`PcWYM%biP%Gu2}uPL9YlAguV)H{`SoOK z<~@^Dt(PzB5dQ-4LT@`T3?)Fpv>RDOGz_sZNfuJj2+Srf$5J7pNQ+6zE7Q+xQLP;w ve(%Zm^*?FI*RF4ee3?1lOh3L&M3Ra7oBhexynk^(f8mL%U-bw1@%q!>IBeD- diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_GetIdentityBalanceAndRevisionRequest_10ade8322ef670cd19d1a472a5477667b9a9edd07833d77c1af884ca8a9849ca.json b/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_GetIdentityBalanceAndRevisionRequest_10ade8322ef670cd19d1a472a5477667b9a9edd07833d77c1af884ca8a9849ca.json new file mode 100644 index 0000000000000000000000000000000000000000..550c9f33c113a4b214ee4223d298792b97934b1d GIT binary patch literal 69236 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_GetIdentityBalanceAndRevisionRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json b/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_GetIdentityBalanceAndRevisionRequest_6e4d0c3029f969b210ad39b96dd7e037b3446e716bafd2c876290e1b85474480.json deleted file mode 100644 index c8e84fe0b6afdacd8430fd2336e10d1554bd930d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58938 zcmeI*%WfRU83o|1^%REITyTb@B>E-t0ETz*!Uzxt&Shih-E&S=OKjSbSYO4;A}}zN zIAm4-mvi~6dwluj)i>X~{`U_*|KrD>{`UIYZ+^+!{^0iG_j&i@U-Is|@tgkkdcC`O zdh_=5{r%||cekfsTppg@TrQW>oBPwU%l*?Y-kdIVIbZ8?f4s;?o0j}5U({C=frx*{`_m9ox;jVwan9hVE9sdyP{;9NF;^qD6#q7=O_ei}ZK0I9~ zEox2=HxHLKD&O~&j-_>ZjYJ=={Yh88)WFN7*=E(~Vxk|J_idWi1Xd{4fG>p_&HpVj zMdw7;B>j1Bx?PzY6i#_n+6wDOy?cxmKK(O_NDm%iK_G zc?&I`a{o#fPbN#sJyp%?2klzLa(`w^E8pcUZRt??`j)AOmtE^z`>f?f+xXR%H2FpO zpSQdnzO`KYG_&=>XRqRg>s#vZgkW42;j3X&O3~ev-g2YL_83k;T;9?Up(<0b|e<6EZ5S+(q!Et>zmcZLL6JDc2tvMp(V7j5ePNvEv_F_CruS=p?a%G6skgi zD9M+(S_mk48riuxTFrXqU$@LT=BShLBEhsY$a#kPc^zBU!JT9ld^6(|vW`V+)Sh>} zc-L~8?6bFR?|QFd6rwUc3{+)7T;$O8=@r43#p4bP3LkI~51Uw|Eu&=Cu7|*~Q9z_B zs#a3pKrn?+Z(F$9LS~%ycI&*s^IE9bMumz}`((Rj)hKuf?0Scu{K2jt=aGC$s^~(f z*e%hlsHt#dsL7Ti%8O5^PF~#;ow#DN!gkd{wO1)z*j}en%?1wPZSx69lqWRQMsFGM zIYHJ(?O1Q^ouCVdWjnQZJhLQkPYK$qz(;Japkkp?co*j-JZT}q_GYyuTdKWTg}qpN zLU0r;pT~zDs#AhkXyFhGrIwZ$A+6-oEzZDJAtWpVaW*vs9Y_L%_-C<Yu3ZD-5R= zH6JBLwg}b@5g?@GZpqyine!x}Y&mKt8^n>(5MdyN7*<0hJlZ9^?G{u=c`IrP4{d$! zP~`e8A*9;qEfQYm#RQ#X#Tu8Bq#h3nw5YW}OFr$7=#&jD`G^*J{md^aSr7k7Nm$pE z(j^*pa{Ys%C^yntLbR(&3_@WL&wv|Pub<%$u8PSVy%jhDbgfUOe4~u=t(J|cnm|%Z z6U$^F0mk_yM0F8F6qL+v5>(oY$MV*mC?cymq2ON7lNA+$gS8=21tGZMhpB?5KvL3U z=Z4sYhXmZz1#j8VxMG3yXdwwfB%h2@_!33ns4gT#s}Pd6@bpS1RN;(Y?o0U#LL4lGfE5vE(=+!c5SbV)QqvA+LFlrkG)}5J>=8)TK zKc|GH@IoehDF1^RH7Z;5kU0t=_zDMcPwg>P6Lx#kDuok#S)93`2*x3$mcU&E)mQP8 zi%Bg4k*esZlBx@Ydcp)#DL~+O zEp{2la!%-$@KB_EbeP(eLP*!KO*vPz5&lY45#Fa0!`rz2uZ%pLHe~=JsSvKo$n-{P)J5kpO+p;3CKHGXh!{gP zB!tNgAa;m^DYdJjou(w*(Dm9MXikJoE;R7fVj-VMM(*4@K?vN9^*YodWZjaklFByh zbYlxOb_$ucBqeQBw5&plXi;E%HZ&4S@{NiJ6val%jy@=z4_1 z3?WtE^&<+RQ%gt`@xwBfCjP*JvT90+LdUkOm+{wp(01xM5+c2AdqsWSlJlxYS)MXA zG{QRTG5?93@f>f%+tmzlA>n}q%|5(UENVK%MBN)ekjP4q&79jjS&|Q(Qs!+Y z`al&Yr-BkG^G*^wwyYa$CWT

    tnBGO6-|QOlEyam_|vj%0qFdij>@sOeT&YKu{)u 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 RSfBae(T}z_`QwN8{{zmNCI0{b diff --git a/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/msg_GetIdentityContractNonceRequest_72462a05bc5903192201b038d5605a8592f3f01c08c7d529932075643c32dbc3.json b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/msg_GetIdentityContractNonceRequest_72462a05bc5903192201b038d5605a8592f3f01c08c7d529932075643c32dbc3.json new file mode 100644 index 0000000000000000000000000000000000000000..882ce2404bf806b39b07f3b18ea3f9d0d8bd075e GIT binary patch literal 54184 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 diff --git a/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_GetIdentityKeysRequest_bb682ae3f9e50aac47abec860399a3893c42d439056187c53b775ddc1bf1888d.json b/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_GetIdentityKeysRequest_bb682ae3f9e50aac47abec860399a3893c42d439056187c53b775ddc1bf1888d.json new file mode 100644 index 0000000000000000000000000000000000000000..06e88739984e45851e43e64d09d2879d036e0f49 GIT binary patch literal 55514 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 X|L{}aKm740esJ|y>zn-X-P`{FW1fuX diff --git a/packages/rs-sdk/tests/vectors/test_identity_read/msg_IdentityRequest_d44a1cbdbdc341bf6b93e30b722720adf6dca7b1503f65c559f3b70b7c58293f.json b/packages/rs-sdk/tests/vectors/test_identity_read/msg_IdentityRequest_d44a1cbdbdc341bf6b93e30b722720adf6dca7b1503f65c559f3b70b7c58293f.json new file mode 100644 index 0000000000000000000000000000000000000000..5180bb5f342d49b2917b875735b049a6dad36750 GIT binary patch literal 89376 zcmeI2&2F665k#}rQwUmfF*6iJ(k~EXl?O1qvld1GJ8&EWfuVO#o!eK^jBQy{N67#I z0?r+s_Oo}(JwDvzI^rPw?F;m+qd8U^xaSYdiB-IU-C=&#h>5)_>b>?`2NE$ z@JolY@ACb3-{$+T*B>Y3<;&CQ_1)RG_fHq!-JgH=csT#=bpL$*?eY0|{_W}h&H1RP7>xA8(BtDpcb65N zPUj_@F3W#F7-)`%yZh7ndVTkJ%(wX`qj=$jyQ_cB$DfwMfr7#hU_m2qKK`Km#MjSv4~M&lhr5iIZ;5!1<@}uA{`>Xa zbILq|#3XorSih1VzlsLo6i(70m_NrKKhO@f?BDrJY1H*dQ4epfEo!EoX}-_+`eUd0 zahb%G-F@K6p2q5gjvqe$zztn+JFcHR<>uQrtLXdp)i0`CotNU75zvOKyAi$(l9X`` zB?H=(3D;bHJ2VD&M)9=zfr$JT-#)+RC7@qUdQo6i8)!nT75+&|;fbHA7C^`eC_n&_ z;MEzCe^0=_$J^ua9ARKxtpBtN{Pu^;uTW0}^P6RPm*}=p0n_W?1w9j z>pUuU=ZZ|aE6w{X9k3+hm3Hx~z~C8zm9UU8c)A`BbvjhAzS=rjJz{*x70c`KOgd9x z4+!}8WZqF%?$0xxIMJc;zBLAY{k3pjWO4--OXkGZvkOU_T9xPkQ#A;rJuG_=s=@3L zfebY3MF%Fa%|4K*-oZ#D6x5d|3E3;ow4<00f%`?%hG5+)5q_n{lqeBMozBD8da7ZW zrKXV4wgZQIu}nH)AOtE=6S$uFT2u+l9Q(b$OYM)71OlnpRzrZ^&r#EA(}5#OC0)kR zmr5=NP7cLhj2js>M7QkZ_6bGB0g!d9Mi5wp1J7$B$+2>+P+oZAtSMl+i6^k%FMyf- z;sy~)iylQt1RJ&p1zFd{BGfK}W__I)i?&>q4g>73Q&FTt5*T|+Ay*_IkW9KB4YZ>~ zM}>-DlTnC{z@_xo0CkT{P~9yc(^GmQBSt@7Z36{uX7mD_J;YuY?ihfjdC(TKuy1B2 zV@*-DzeWyneBpM#G1;>{n6RbK1(N;If_b{_oX4WRH2~>dm)3$wA2<^i$Pf}C^jBFh zNz!@{DrzthugrEVt(vvvXD!ukH^I8q{yy)iOfq+FlezTP^GnI55+i(riu$ z5eS&>c`AW@osKG~Ae44^rp{hO!f!>stEaP z>vJ*}crIiNrNhkL9Oy1N8^eQtTM9%$yAgzAY;~qd# zXTLb8Q?Y%b95Mq=t(4huJ-hZS1d{_!&YS-QucJrx6q7*iB4J#MHsTnAGpW{bHBo)3 zq{~B)B7g)ZuHHAek#Q?hy?14g^nyxjX0fJ1H3F=rcVPeY^C4_ zX1};W1ev}^GG-O_sES-7gxdPs68x3o2n_x`8e0X<{d)QA289>(4B2E>w>q(k%%O^y zJ5z8f=#j+1L{!d|egx?YKzdq&f8--FDj1WFI(t4dxaiK^av4M)NJcTfsnco!e9HF# z)R~3edmvND+{NgVvDYkhCZlLjy>I6+O=vm3(HkktCF%M*ITgBeY5HC zslxn~L&7l!ODNqBok66v-v7y^9`?zoHV%R5QI!hWgyhw!3_k^1lB;hGZxOi^j2`@0 zgmY=7yWxo#H-Wh^1W(eSh*Ab9%mMP}OKdLdnG_i^_jY8ui`;s4QQI1KeSK+vR_}#) zp6UfoYtDsKk)#VOuFihhL6T$?H$dF7zg6%AMKDGnx=WFL)Qq4d^B$Z)GJYbE93yh+ zLa=@c(6UblEE&2oOknAKkBp1e?F6OFGl(Fgc2Xp9Nmf)o8t0&1Gw*Vyg_nVG%iRx)7a$yB3k=gtGfw7sdNadUyGeB&BzItg-cg{?7M(43Wn$;sH>MqRSDRO07^-};zy?55= z+tm-4Ic(IWLAB0o1)ix;*k->$wh&aHgHepkKrz%()|b9A>$Xm~(T{BKZ*viqCvn9_ z0{d}8{$QdS#UGH>B+J1_vu7a6@5MV-N zcTPkzh2HsTFsrjSrHxFlhyF-Q90`Kkky1bUvCvva zDKF#emAmKO6Nc6tKYOZ3o;dt7>z-Yi8r16f%=^P0d^qV|p~L_MlZRbSJIUw*vl@D; z&|Sdk19wzE!3h)@HD`84g=%Xok=;e?J*5fh zF~QhHl!H;5n6T*ZO3*lc^~j@|7<>O5L|~S9k3WHZI>G$iT7PMfOFbJ3G_clCtM?ze z%fx$j5tvP9z01vx9{W=FAbN0oU?A_-n_T#>=EPe+l; z&9E}@Ad^+DhMqe45+g`=J)RjiI_evw$QW8LKn9VFJtzl}MAQP)uq)jOOrmb(&s5lV zM@YukXJq2~fh)1X!4eg4dIh<;Z)8NBDN%65K*X-g)RaU z)lYo7GnnLsVbAByOf@@V%T-QyLDB_g=)Jd)F@sPdk_vLVQ&BDcsJrJR{=8IR(g|ug z3krbZY@0>Ut6MV}B-3CoRp-oTEwJ>+>_8<|!08(#D#$pg2G!miNZ0dox)XJdh(yLM zK(Uw8ot~f@gnL!u*pi_uH$x6REE$~G2wb*3$C!8mMR)E=VIdhgv<{CJ0!vR7-XZj` zOgiCa6zS3hnVYO;T3bVJM*vBb-;z$)q*JmTBu#h9%20Yg0x-#!4Q#D!v#UQ=nYdEW z$hNIBfCx;;mDy?Cxdz>-6Y~^8NQL68>W>GJ1@Ob<-k-%TFwpgz(ScA?T@=>qmtK}S z>hhw*zC!FmL?vX^*%nD_?(Kv+wA`(Wr>UjcqJa$KEs7)@JiUK1?tX>M)WoCBFxi1g zgRayB_U6VQddJ>;?%(}p=weN4JZUW%dprY+0CQlGgt3k!m)dN@-UI1TU6KT55WVWh zE`;it{%W%|D55eB;WO%L+Q6nBJM7V44=iUvo6))>goiR ze2E1eSVYu1bqp*i(&3q?-j2W|Q|MXE6jVA0(?1y{ia?Q3pDsdr{i39)Bog@doFrFB zqQD1vb>|SJ0;3%vAA0PkfC}_Qtz3mV?JGp8?R%U-2uMYUoVcdk-<~ z^o9LD%MGTF#+6RRz2OvBgOHA5K0T{hAL_4I-^hG!q9D0^``Sp@Up8D5OVVK09+gx+l9{L=+j#I<`1+hGuFCDYad-Ff+E=Gy_-IH1H--Ikfs5z`Qc%7x!h(LgW3P0=zN}}6z zbdxMbcRgrgpdv)xu>$AbthVQ9vvTI27a)D$xUuwA_b8$MA`s*5@nl2kH&OPmBx&zX zn=}3TmhS`OY~o$6I?(|nFNON?1x9(#sK6P4FiFTMq}Oj`)Eb%hgJT5!3B>vneP!07 zwb+7)n#)`inZSJYas$aQxnBwdDr5*ugZ(0Ae1a-{B2gPn2}1S^5t9-;6bLY#eoe?k z;_T^ZAaD~QVxR)F+k~Wjfq)1Zxv@Ul*J}}J&jivb%VM~FI&zhLQQ=wvCNNt=6dCjH z*9}F+DEixJH|UVL;ohgts6aU33N+)(Ao|ra%ryISn5HHenh9h)omI|Fo@s>4S1DfBv9MWnc#})pizqUmO^Yb^S}$jYx)}lp(o;9^jx8s?wczyL zq~j9dFd2&Pov)(}%udlpCPpNS~ar3;?@1Lhut3+%fiU0_k^G6>@j zYRL{PW)SM(OJ3BmK6hCu{CNu}94ubc^8}KF&%H&D=!8Eo@tnBM%G4P^sreEU3^IKb zWKNH6c_m7iQWkoT=Y~ZGx&~8f4{1U~gG`~{=?4F>D;6Qtrw9fVv1o_CQV>XLmq=h= zsv*gmf;o^xc^N@4>6uJa>QuB$lw9b`ky>P^Q@t96D!mpqGW{$F%%v)PESgp6P+#95 zv+KQ`?$q4z%)Us{#UlE9fWTx_crrfmppo&p`>O8_Oq6CFRRA-si6by|I#UXmLP0&j zFb9z+UbO6}HnF7Z0g=njjVyho$e#Zr)%?50WHR=AcCb)knB0?j2lfpTxNNgUhN#;v zFVgk=obH6ZkBCG@0vBysNXexq*xL)pxNXwQfm{og8j~1cnrQ8Hw}2TOh9ZvE}wqq64fKQ>vY1&6hxhQ z5bM<~TgzJ-QDFw>0v#YaT>|@wySthwvCbl#tZB8WMLHB0CiiL$NrWw8Le8q880epxekdi|Pj*G>(V6`_t#Yo~z+zD;@9i&tv{M<{!S#{~w<3o*(j` z*LTnS&iwCv9Oj7vp7STKD`pCY1LgW-`XQ>|TZ-&YO_HOx9b z9PjkvWvVg7>LOSthTCkYWQNmkdrB2`raN&XgtG}0oXs;q?{Iqx!mHFRLptR;C^E40 z4bI#};6_GFFjR5wm~GQHNUnZq(_JRm(~Q7Ou!m)5>;qXEf}e{p5}8OzdB4CDe#XLk zdjU_yH1JgE0JCQr%3WXW4NHRw>hTmpWvY+KI9BMlEwW6xHj$>92_5fv3EGP`tBs<|^mOEo@v6lR-=yPLsYDY#0n1-eVA zJ<}%8j6TOhk01K+eyUrd`j9MsH5j#a-6-Ef6!XTORQOxcO24~Xc;Y3Y51}Fj(0yBF@ zf+y;+fk34`#@Ek%rxPBy2-9uL`9Lvv{ue(&{q$d9I_9I)6MwVml-+#xQEDJSGgo-Q b@x(s=N%Hvi=}(ya_|Jdt^I!e?m%sZ8 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_IdentityRequest_c9b7936c475a5143e38568b7474138f01ebff9836643f8c1b4facad64077f80d.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_IdentityRequest_c9b7936c475a5143e38568b7474138f01ebff9836643f8c1b4facad64077f80d.json deleted file mode 100644 index 4b7c2724f6d3c8406437d7081a77ff18889ce26b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77833 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 X|L{}aKm740esJ|y>zn-X-P`{FW1fuX diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_IdentityRequest_d44a1cbdbdc341bf6b93e30b722720adf6dca7b1503f65c559f3b70b7c58293f.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_IdentityRequest_d44a1cbdbdc341bf6b93e30b722720adf6dca7b1503f65c559f3b70b7c58293f.json new file mode 100644 index 0000000000000000000000000000000000000000..5180bb5f342d49b2917b875735b049a6dad36750 GIT binary patch literal 89376 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 diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_not_found/msg_GetPrefundedSpecializedBalanceRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json b/packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_not_found/msg_GetPrefundedSpecializedBalanceRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json index 1028ba197e94c6b286f2a64aba03b983fd7653cb..eb28f8260fb8d41b9e61878d65014a09dab9cdd8 100644 GIT binary patch literal 33887 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 MKdmSE@yq8w0Vt0NTL1t6 literal 32258 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 C?$loZ diff --git a/packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_not_found/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_not_found/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_not_found/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_not_found/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_ok/msg_GetPrefundedSpecializedBalanceRequest_025257146b516a8c29cad26800714ad6a0b47b50c5fd84a4e094fbf06ff040b1.json b/packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_ok/msg_GetPrefundedSpecializedBalanceRequest_025257146b516a8c29cad26800714ad6a0b47b50c5fd84a4e094fbf06ff040b1.json new file mode 100644 index 0000000000000000000000000000000000000000..06e4faba10afdba3800990e230d59ec71b6d92d0 GIT binary patch literal 32870 zcmeI5%Z?k@6-6`FR|p#SfYse>iT;UvfZ{`2c^|9bP&>yJG37pLdPJp1(@Jo|Zl#aEZ*ba#F7 zc6xk2J%0B%J-N&?&eJRR=j*6<^W*EUm&fJ$n=}IxDV5e`_t2P`f{2UUQW}Fmnp8xJmWIWcsqghB9i-Q(DF1*zhCBnHwJ$B z9MGG8fB5b9_Yn2p5C40=zW9khKfU_&>Tj<;zWMt<-~9CRa{q7#cMtdL&*R+!8fLL9 zK0fo9|A0$^A0F?{?;Q7X(meH%*S|IDdF<)3ZS!<@dCSAo`q#2P+p)rR9l|tR!$b#S zzOc&k5P^Pi7*P&G0hOJC0GZ&-K@R5%FM?LZ1-9DXtd zqu5@#5tI?VHJtO)?QjMgfc|-}$7^;h1mZU{5|M$>Kz)tgEYH`aHlRRhS=SsP^7Ls9 z^x<>Fs|s zT(NFcd}9mz>09M8?RHy<(_ky|WNCgCy=m}pr#kqIW^d|e+Qq6w?B5`C8vGoRzCy)_ z@fY;5`RX*0PItTN=kd5i4T&vo`rNdIiL=WAtR6z*?gCad7eulj+f`KRYX1~`_@)U@ zSgBhapGpo=a5*R#Jl{M6}W)tT1Q}2q7tZ> zh;YR%gf}LFnWrh^n6MvPv&N=U9WlPRhl?kjN6`vVnPSSwqfF6i64wx2*59<3iURp1 zLnEF&r_`ysjjC+n_!<@Km#p0a?qU(aU1}~P@tS+pq3f62RbUx^IEw?j>^B_gE27FM zp^f4;qJ(IpqMVgHGoEcsp>VC+5K^*bvc}fxp@l>$yzElVFt%@Vk6mm`3A!zGH|}D8 z%=nkcld4mib+A<#t45zsdQM9IVS|-!JzZ2}iZfUmT#l8HnkEyH!)ePD-6oz1w<$$D z^-QS#$s)OW)iYSt_R6h*{%OcS-?P zM~x}C#i2Vh$qS={s&X{abBf4^s2aBG8zSLc#Q0*HhD5(B z=WP{Own&f~&)P3q%7q10QTmr59q>#P8=c(5i{T`Bn?)}o6`qO+VH9jh*{C8=xwOmr z0!8yG3g57e{lzSb+qg?TnhtnlV7fsfF&30rl!7Jk?Pve{7o?C%sVaoJC<>|hT6cvt zAx-g6bfy1p_$O6BaT(7R3a_xXP1&sq$0s+7~&ls0>y}rQ943L^a>q84vV#&T=Jj8x|rjZmC?$c(JO9qt)UYqavCWMEY_Ct!KZ) z#SmehQbox4V&mDJ4zvkwl0;{Q>r{Pte6I`XE0J>Q12Wr~;HzNW73%@%2j)YEQX!{IDdE!Eeq5$D*-{|F7>%0oRgg6#l~WplA@vUB0jBJt zgc8g3+9c_dl%tc#0vCzp0$Dkg-ZbQtP#SVdM2ua6agjK16?j!(xh3WLU{$bn3XLQA z3|piu2IHkYi7g?;4yCSADb@QMjE`BU+meNsmc==bC}h>)e%%g*q{K}DT}A2c4{3N{ z(|J*NDu*-}7?Urd=UQtOb|jiYO8KV2)#ojiQjf|eb}MDftWuJrUidTU8CCQxk}yV8 z$sV18{9<5@@y>{(7n3&&+Gx@VTa+GJLsC(tfo?>UDQ*!D;oFpQwj6d+JtgT$Xaq!8B(f8bwy0Q`kCPLZ{eMZ%{JHkiVf`Qny8^2}qQ zB}ohuC?RQ;X*`FAiV{&p11IqVTH5b08h9~$SsqeF7ZB_ zyTpq%vtU+9|A63OBuOh3l#EB+nsvIk2BK~w`wLtOqS-nH=d4*oMQMhmn#>}OZz$ok zrS25QUw3YIeqssSRgqJA#X1x%*9b+lR(CqI494S?lpz&eIry(Tx6}X2|K|_D;WyF^ z9T8YtSfOuhQKcJfr^wZ0OTMXmh8w3Tsn&kn;C9HT-V5d)NUCwwLwkv*1s@M=Y9Lhy zhud<6WzE)8dO3X=e?OuFX`*=Br8Eu`C$J(UfvVU-M}jK~)sRvO&{5(MC8pG@B_tKaRY_5lTti>ct#T@f zyEvXxqB4=%xr#hoKLQ)dVN_7Ob~|7-jWsSViuQyE11u=1r8J(wF(ic-wP#da8x33B ztaz;0GNoMZIlgRR)(5UAagTzPyHxjJ$^mmecC)3ZOUALOHq1_ z61mXEBdUrdg%oYU^=ISddaL3Sn?!!S(qm#8noA zls=wH1I3oC)e`H+j#CpkqSyg%F`tc*0+)&NQ~V0XQz>mEp1yC-vN`#mz3chgGe#S; z-z?X!cG%ynWGUW+tNlSR2IQqH8raT$zP|Zj7RBim4pWlW;?0Q-+vFCpx4T8G{w?uh z7=yv=F_jVMuAYQ{mqc8@)V=V+ND;}#NRi^UOPQh>Cta;-&$-9zX%i_}sVjP2DRZ}o zIuWb5g+LXZSX1jyJNPrDkiO-f0z8?QCeG61uo4n)f9}E#z#n+LpsvetA-lVdfEP6 z-_Jn=>w7uAbK`Bd>5D-3Dv@s#^?Nd3e8=nhhLHE%p1l8?!Nlr~? zW<2hV8&TDQ`qR7j?{EJ6@bN#t|M9PzU*3P>(qG)Y{>;_y|KRG^@s95^W*Y-zWjbUKW#4VUp5yTdm97G`Ej%6d2{Z==GfE2#*gLY;j-m< zbL{f8d1G0&XKlTD+`MsGHs(*4W0%wBsMFoXmE~o-V;kZ9cK;iHH#?R$u|KR3{PxB2 z&A&hX@#hDS`tQg8eHd?k=I_t%KEM0hyH7WN|L4swzb>cyTVlhSuZP=ZdEt8DUw?k& zXZ|c+v*_XW@x^s-H*L2*@cv(|dR62x_M_Py8U!< z!m}Q4aqDsX^1|xni!`xrys7`Xu)cG}BbbOU zkN5t4)t#9mGXBNZ!zDD1xW1oU%-qa;57!Ox@p29+(x=DU$HhePvoA76>Ua%DA5Z?q zmDduuEPBhTkwvVpo_k5sbYKs~Gnjsy zufJa_8#}V*d#Ttgn<7J6%`6n#y`?VRRa_g#^7_FHb!B%5MolGAVY|1y7UKRbld{)^ zWgGj9v$3FFDf8aA$$kqNWif}@(!>6Vumquy8ll@T;xFQXR z`*S<3lr35z{F1H}kwSQDgcnrV9gB{UMMQY6vEl0!fK_j_XNm ztSPasyp4>?=QG8n_BUp~{S22&WT`|AYKb1MFZ7cecvZH@rL-QYNm)fR%S2&5hji=* z!t)u5OGUT^E2Ravp4>*IwYrNH5l`y}2^%78xq5@Moe;*|#(p?f1d9oCOW?7+x~o`O z9ZTX*t|I92FcF>tOfI3cB~eCAbrcgOwhl z>`V)#LuuteA4C`nVQ@@C6&D;ruL6XvpV*#m*WfXW- zOe7S3-ePqov9yW?nJN5{qVa=_pO+k+0n=13#5-PLhGhMLtQN9aU!}nbS&7<2u_c*c za$tS2LSkK?wnT*_iX_6Te3c3^SHN9F(nPVVbW(FQ*_$3Q#nLnUI9(eH2o|asNJ*Ch zQmSKhsqjjd0KINOY$J%KH#JA7RoHkC!CJYoIj&`uCNvfoQdxuL=A|}*49tX9gzHLb8Qz)j#q`b^gp%tAjw zuNj6UDUdq-j?u172nV8|ei+o@<2?AlFTd0W<- zRkoy>jXXD{^+PCHc5jiYSUS58!`VUq|1f=$O%$(O&+Jju(m=ZG*LF`74US506efP=yXH1(eny1cCIn*}GO^|S74E{rS*^*6 zi)&(gmlun4Gg#XS>yw7WvA^CjtAV|=_qUY>F~P>R?nqWyLHQI2JRcoMvRqN4cFMHh z7Nf?nu9hdYQwqU~?rkDrmmtueIB&QGlnW5hJ0*5XeWf22+UkfX4irVyd`;9`RYt`J zfT{-|rlBqh&O|T>;G80A^?`VdqE?^lYwS@rZFLjjaS|ZVW zQ%Xy@wMfg!P4Sp6(%~p-X|-~o&a1_r=6t{FNljL^S0$+fXVC;XjEuw@C#4DE)k+;x zajX!D#W}aYk%eck%UnNsPq848bvW-Q6!z2Sd;-t z>8K{~Ds?olC@#q;np$C$3?-1BzbMoa3qY^9$GK&uE44pk@9aW9lZ0v_by(6hXuqG0!hx`tVuV^pYNYp$G{6{m zRiVhn$&;4b-8JsvksfY|ljLe8!98lQB3?){h>Y0>LW-slxzeTO6C9 zBwncu#e{lwV0b7stBGM{e;{HJ(`&BceZh1LL&-7ITehqOPTer}Xak8gqE|>n@@iON zV@MY~IgqQ;+Vp1>WAJJc5{~T_VaqD5rxm7q7S1nNtnigecS}rcTOWbG`du*Ro$3mR zi(g8^m*R}?2=dx5$l*(Q=J)gX6+Gjsr#4@96uyjRva8VER3Fpf(to8rhAIc5wj41* z?3HOHa1Kv%sUc902NJbkAEq{z5>T;g$rlNl^hok+A4#f3N=sdM{?4Kv|0jQeOT-{Q zqbT+ZyC$Mn(y!9HKc@w_hDGd9CJGakf!v7{hOFr=TU5^CmE&t9i6pGN#fnYk%J-L* zo@I0LkG<>l>k4NZQ+Jljm$Rj2RizF*(`X~4NLPXs6KVaZ$(@1ibi;Bkw)%D5pMUB9i|QdVm$ zWsAKot*^=_;!0dR`^H_L`Eb1F|E6=_Zmc zQ16iF0z zcUnI*p}`UFE)5|zJ_ASGo__2@GAeC+sN+XCcO1Pm$r(@}OZ(f>L}CAWBQ5>j&YIT8$2tdz2fb^kp$pb>lA|4z33*{q}rG80gQoR%uog~GG$1#H-hdy5id(r%cj`%)l7S3 zped1J)ys^G$jE&EuOGko^2@LO{`UJH-hKD}tKWV3WB%CxaQpH1`O^;{{`CEaKYn=k zm$!d>_x_vj@>lQw_U*Sf*U|j-+xP$d+kg4(yT82q@Q*jX`{tV;-u}~n{nHQsl}EjM z|K}Y4@crN3ehl!}@4x%|+w~u>pg-lGKYj7j7yt3ak6-=%f4=(NAMRefyt%u*dHLe{ zd3AGl_jUe!mw)&7_xXK(-Sy8o^y=pR>z@1drN>uaf_nlhZW}a&BL4g_V)VM z-Swx9C;al9q}gOCEeB+Hxe>hD)V#uE%c+p;@fIc_OK1^rq?DzkWKMVIxKVIo7LR(B(m?_>+iQ zk*UyB{mQ;5?|*sJDpaa;cRh1b%pYH0iN5?f<4Xn`5u0$isB{v2CEq`$ZcSiEXerT? zp|1M>GdU&bkz@n!qsaPK{o}*Wnrn%F&FDq-m1oKk>0H-8A)31v_rINC;Wti8P{0*Q zHSx$&@0&wf<0Bob!z~XHGCR%pC`8V;x3(el{L3rK_LYiNP$=r; zqm-2eA}*FA5T>eWQ7dc;C0talA77}ZDC98(Ww3Q}eI?@*eA%}_X6gEH7 zst2fh1sU&^j6T6WiRGUr#Y9P)Z|kb%ibym{;A4@=&x<{sD^l#0VA0N%^L>5>Gq^n$x3>VW(OS};`Z_OJhpbPM6ORRy^ofPo|pPG zM5dBV*giiZr>r7ZIe!8?S``nhyi+T352UXlsDo12iw+Z2+(YPV2$?VI{FAShk432N zlq$*dn^K00>O5Bjctg;6?~4M#5xK98$}ifG=eMLGLi>oCXtEN;)}Yiq^uCGxYMC#4zN^IX2&Z6{| zwE3K`jJIE8dL?a36EhR}AS(&6%0;{fg-YvkMXFU2+dp3m6)xy-OC(dK=MP#Vma9?R z52?XR!I^(zkJr`3*jwQPC&?9U4YkDaD~VF+O81Sr%ta4u1l3p+g!(cB0-ooy8RC^Z z{{#g&kNP>vqvH~F-l>FHRfK9*X(h3RhRAuE0)t(m6uX>nRuPpjeo!kId`J0{*`_{( zw+ck!TA~0sutB*J#d3&X5v~Wjc}O70?4x{I*sCe_6*X7#&;2V+DSHAHDorFWP0cDg zq!ANE$@zwebE2Y*JM7k4jZ|s4CL)Gz+UI*EQ%U^4=cTZVZk$SLJ4?6f|MKoLKujd~ zxm-fD`-l#Nyl(|f=JFi4LhdKU*G7Px#U6(s(f}PU%+ws4rJA8)ie^@4(etmh!DOtT zQYM7BQ0-T$x`?1oyigO}($uvY4UfYd$343&;U{N~~DUHZH-^C=r;frmdB#B|J)qW+f!% z{JyT1F@{9>v|K|R=uoe;N>RJEVd$2gIy6S5J9{QFUfqh9vI6lHuL{96rVJ|TWTg!* zQm^MIcOgPkLKLfKNw-myWR>a9!1D%8wVlBsjO+BTqB5EZc(TeZwGsS?tUz?X^65YD z$=FZ)O@Tb~dBSUlBMeb^>R$>F?|w>2rt%hp>J@i#YKIkq`g*K@3@vXc2wXSY(w7k? zS(WaC&o*UnudD=nv%>e~UO9LNjI_&Y5(|A2r41`Ux*CZmsQg;nC<>>B+D@|CS4a=%CHLSxSNkHiCOVwN zs8+Q#!M^AaMfHmKbIn-_)%-7!5QCIbpHC^JBapb0J>)D3bvJ&L7cNGGz(ov)YMb*S zzqW(6YEX-(jr=I9$|Ir@Tgzc{<`ha=yWGjUVe?n+&R+DWN`Rxy8Nd^@&Do4vgFgp%NFf#=8ifFj?!A@*dW!z9nn@>6yQ)*!; zrExi$I0r6wU_rSeKvubQu4U*5_F+7+NbTXBc?^6}dlSoIDT!4oG)ht{Qe*O=^CNg= z5I6jymg& ze5k?63|m+vV!t?~?H)d8hj=n}(0=}@jOj=1Vta)vO;M(pFnbXt6Bm-9(=rBvUO_uG zvQkg=QptzKBTi+S&xW86pJpUUpp9rsU0S5Ss<*6#LRqimMP8x=h530<$Qo%apZt@& z`XPRq)prfqx0}yZ*nQ*e`FO7oF;VtIRDOvfj#>q($Wtrbi(--@+R{NN0z8b16}PrY zNpv+=h{1@8bk*~SqR$r;?BNFrxpcU%+vFeA1bj&yrAsO8AFf=<0C94ufw!LeqIb~L z8580I9V>}~*o#GLJFQKF9zW||ibeUg^~Ba1B^ATL)KV%6*ajMm@BA9`nf9`i; zucXM5Sf7uBpe`*y7Iq}1qgl3v9@ZgCot1pBu+@q5dkZU&mqNBXy~(6RQl$x@4b`?4 zAT1QWelF~UMGlkgRI8|s<}dzPZKxB*)wStD9Ay==6)Onp{vZ*A;zURXwT)bb4z=Yz zT&lFHD#K#jiFB)*m~x>aZ&itfGXp%>jxt$@ivaOHGVDo76%~&{TPx%0IoN%jV(K9? zUt|_1L>ojlgkA}D;+>|X7B>0Q6_v;K;?c_Bd>@uce!U_P$}bJOOL)|DmQPGTBua-( zmiVGdH7TdkBNa~^SbV-$aDb*$tXUGmm!Dn{iVGwvJ-|-Ac{CcB#K@c44H;27Dk`;i zoNg7B4$w?PGVLfNRaM{9(U2&?PSYwOa)lU=LWGg@1*Oz(N^PZ9y%GlHN=aAL(%>}& z9i|8VnGqlxX|qDz?tiY;&l5-(>anShXuGP=cEEZzL`td@;NVV_2GZK%`aL1o2{S9D zj~XQgf+DQ6r285riD8r)i0nK=Jyk4Mnwtn_otMOVB}K-e#_(h80%T!FQfk!F^*v03 zKwax#TZl!7*PTpEB_bt~Dvb!Wq1v{@oe#~`9fU;=lkHTiBJUC{#0Bj7*?w`bseu!A z8K62dc4#S1p`?SRN_3^%2^W3%WwZMWQnSkc0V3t<6q62WN@$pa!m^6UbsnM3HmfXe zxbswyGWBXuvb~gaa*r`I@`PNG^Ccppl0vn%k-7j`bVv_QtrSa1NBF@`>MfS|iBzoR z62UL*Qm$r2(iL0alBx(%OXQiA1XX67S+59$N)A=3&QI;xZC}JjhfVo$RLP{W55GEj zLzeVoqohPMdB?iRB@zOGocM4C7HKt%P%jAN78dDlBS=0Cp%9`d$*S5QJJs>wc=sJL zNc*G0ONq1{u0W93!Ph7uLgZKL(ETlPq7dPlw2><1`P8A&>b1pLZHe)8kPIyDh!7{w zUrj9#TB7~e-ryyc#V(rs!F!pjA`nb_$x5uIYp}3ZQxz6ksB|b1fmYuTICgsl+uD`0rMHBUb)F0@qQdj0LmU%@kYPtDMe12pp4s`E*vyMyFODdtuPxD@q@4n7j0Y-mje_tIWTiJsfiuf5Uamn#QcM1G1z z{WgXm3{Hhf=e-hFSLv$d9so&JGC0a0mbaEGn^?^govO7xXe%+pW~IQV6St>8LqzQ= zMckAo3SlW7!eG^&Emz8=%UeaOwt!y-6@{z{)8mv?xkzoP0WXn|+6e`FRPrHPLwWDN z9u8loy6fGCuLy)Z-0CyEBi2NY(cMORnGT!yvs+3g(_ehWUx({OGEG`iHHxwN?a{Eb zO{$2Hd^9wWVDEW^9|miB8YO*%@Vj`BH3dtkmneNcxxw%*lWUbrfn@#)kl~%nh32MH ze#u^3qH2`$OThS&n_K;%{!L;s=qCitreZ+>_sYTlTcUO+=bH}}>Hxw%cP**p!}3cL zNqtIL@=@FQ_s7mJZeD)&r-j9dxjIhG8KY!Yk^-AmCak=F^~%A79VwCxs&sY2#yy0N zGA`ZSLS=Qq?&~TdJ>H>@g=%7Ri|9zXWKXEMA?cN(gy{2Qxj2zY?ONLwRzy_@2P`2!+Ir6~^8Cygfgmx4HkI83h` zC>%dQDr(;)YD!YB9-ctk3e5SIOWb3wP{Z~LR;(UNQ$EgrKz(kBxpjm^E%G|nE2*&X zNX}o82z_lRIv?WDY^grg2GvuNp-L`clc7l^NdrwrTjr7(8Rl8Xr6al(6cwS^ zRJ&UhlIKfGMWOFFR|rjPzm?Qu3qh(%&o5=vaWWw4_IbEmDY@7PtxvQ~O&#H(C$~`O z$pu2h1qj-BE36}RNRcM$h9<+MDarXox-hbUYk3Fz_RFst;I!(=u-H#25TsD8ZFD6) zUb>~QnorJai7bB{D|xs*|B^RBXb9{G)n13Guv}Gy2${bXhG?%TiDyztE9^`b9WGZp zz_7le7;3EQ0HH$l%D~_Djhv?uIU&>sNKPvR_C*;Fb^+e=t`kyY2RCgXXCjgATd1X0 zf&4Gfp|)*nEAL-yYvDq;J1Fd2p(xaPdA>dTpy{N8l!DeL5M)@ak|GeRlH_v&IVF{< zo>vLiIkxd_H|`=tRh7&~LcD0{+YPRZ%}U=puJh^u1Al)q_W3>;Lm#_{P>kbsVmA`$-<7LghcB49v0(e*GfKE z*y=>Qu7%avr$qR8YN3?7ToE8GR2*B&8|=b39X8vMG`N^44%J_hp~kPhAWf_Hh1p&a z2o;Y^qLq@4m25a#7c>f32~vE?yewxQ(E8*&u@*ZeRVS-VcByKC<2TH7>`1P zk(2!-^hvEsdi+YRlypTc4PNea>K*uJMu3qPL<-~%&1VtVcl_pst87Xd6tp+adBxs9(%pT&PnLwx2JFbg zL9DaB*ux9X?k1-GgHvfyNwf9hg#qntTp=U+K;?k@;J#CNbJr5(0tryeOpQ z%B~_;62e3)ked(Eo#ZK>hEND0PO|EzK_;KIL8^3sci+k?)cmOMQX*}KD-a}h@c(;+ z2r6t)$m(8IL{1bUT$46Zr97WH^vcSvq_)I(I*2@9J0j=h`Kze~0@WwaZwN5~dVU?_ z*^*!FED|c-gO9@SW6w}brcny8qZbe&ZlY+DPM>bSkS*)TVS;_fTt7o?HlBn|~ zDM_JL2wANMI}D>hkV5tO0WLjWx<$8|PtHH@B9ZQNxDK^#TU+7+Yg;aG=Pv{)>{N-OQ0wLS z_V9zI6Q@0qcOa+-9=s_C(VP#OMpbc!8V9|~qlq2N)@@JjIwV|kFT}@C;mwB>e!X^4 zl)9_>7|Aum8ciwr8xbK+AXIqz2}7|jFNt7};x3-GsYFnyUrHHy}PvO*{PS@JDup+9}fVcox ziWEiU5f6da5PCA@JSwFtl1wTOFp~`WWQTih$yn(Xflwc&`Xrxxg{>`y_Co#G{tap} zqM+6*_$rj=H!*31wxsT6R}{m3;E=eew6@WSVDEW^-wFqdMmbnKGEcQfLcR1zpHFQ& zyo>*=aw(95X2(t$i=zs+vlK|AA}wDv%K0T=TqJUuth-uH$=8OwXf$q z-+Zu83_*H!xV93>^Q&0GOAjBzkt@ZEZz5F@x<@I~5uk+{AO~(B@~%JUM;Pq+7>*c7 zC#Gg4=NIY1$O5kA9qilAS&>MgD#e75-FvX_+iagNh3fN@m5i9uErr#5a$ZYh`RgYJ z8Cz7JP>>P{%XvO^P$@(0)zbvUgs_D(s6~4^OsS+5b|#Asm#ZE2+ijv4>d0Hx_!UAt zyjKSPww2|4=rG`yo9$m|Un}s0@JUhZ0{oy>Ef+O-)&nW;Nv*OMN%t+(Qma6wU7{ge zhuXH?QHcxGVYv|Q4hlP0C<=|>Jl`IE&~)OoC-M#i^}vHS1tFT%V1vTgg_xI|7`(pn`pQS+fD3eou_O`FLP^*=P06&OQc?9bJ;wnO1vm)Uge0h4wd!M^< zA=)nLpdc^Gl`trUYLr|Nlj&|Ox~f;}P)kZeU-P*{VszvR?fKfRQHU^JA}F6!m54|a z#ly*PurJ!D2|;p7RaG8o3Iwk5Xq6%l0y2hxiFE`>lmS9pC5f#(S48-%PKA}Kgz7hgEqAXLB9=v>o z2$}UoEnL@T$(m3VopjPW(+gD99?m=>)L7LOLJGBjAa-4B5+!c4Z?Nrak<*~iz9{3; z7iYC9c2Q#ox9p84wL%>hIM%AKJkPJgW+l>XZHWuiVYv|Q4hlP0CK!068(h{k=WwmS~As%i;dWI+yj*+EX{u z2$kA1`6q;IHEmDbNGA$eHv&IshjqnQ2%14HSFngkdLT0`iknwQim%4!gD zgP=HIM9Z5+LNw2er&i+sJ)E``;30x`?8u3^%N0VA^HkNVO7zBE-3GYOtqb{tFc(cq z)O}>pQc_AgNbhcMUcUI;&%>q*Wg_3b%&#~3b(dfLbAEsOaPx4Vf4#bS=-IN z1xTN-drBA)kt{|8c&{XiTG2X|7XOwU&jX>Ba20$B#4TFNFSiH-bR4jBq*(wm6WSyNIezCW$-1XnuEM1r<+KJ+8s$IKTm$0BA<=*JDh%(({FD2v0J{X z35e^Pn_VU5d!Mg!Gr#hrhkoDmX1);WXKwktZN3otzkN3}y+NK>{_=wcr>bgVi6RU1 zx*~~HRq;4#k7$?9<3~cPywo1)SUR7=W@C`?-`YmMdL`K9O0laoFp3gSDA%~`_6l}K=@3P&5ac|;jzHRd|Ic3% x{r3OZaF;KOUUWvj$UJ-WWl^A3-=FQzyBD2)pZK3IKJgd7`cLZ*`PYB`^uIYL*uVe) literal 96590 zcmeI)+m2q>aRlI8>nQ|X&&3SM5jB2^JU|c_MnVNdWXh0e-w1m5RPA1(hO$VmZ$%^c zLcmXohjr+#s;=(6f7(BM_W9>u{NvSk-@pF$%@=?A{D=Iue{lQm*ZJM|Z~yY$+dsd3 z{nuB2e*Na_Z}V4g{{GE3H`mhq^{Y4k{o%j-=Jj7+zy0NoZ@>Qf`&a+;r+@kWzjD;; zH~*96Z@>Hdt9KXt?YnRP@oN3yb?J}!`Nz+G{OsR8`{9d!|KBhE^dEQ6p5NTv-aLPH zeO}z$-F=nc-{rsk^?iPwA9wwI7QMK+|ElZW-}HFvi~Rk^R=rz$`>?M0^5)@XetCQS z=kEI5#tA>4lQ0`@!@O-O4g1TVgXmfJHwo+h`okAp{!_Md$m5@1+&m<%E8RKw;r{xQ zoO(rBED~w&3QSqo<+qK$A*{doL_{wh8q59j{`|>shKeBm(_JrqPAx}#dVjDOYzFTu z^rm?K^ErX2G2P$X-xa9*x}P8x=<>M&y?@p}>B>(5cz4%mv+6=Ix39?i+kn;pb|lsd zKXugw{y#HQb{>f}LBEq%|Ej-z_(^TW_kB7qp07CXZ&%L0s+hZHk=2JH%%2y6tB#s* z6;i=G66UYf(ECz+AIZX(zyEY`{o;@o#XCAyZC9y_ipOOA;);j<{=>EM=$@+PLr^?g zHYO8TLvEC{zomMV^DF0QS+>LRq9xa|>eCTT~=>c1xpr>A7qAiAqRJR93L5R?+!lT(*>pd{88s zMHAolgyC*~edAAolM_aM5>l>cffGvU-r2RCb>&LLC1pvWiwUABZAqb5T%H42b$C$hDE0j=Hg!QXbHMshil|mocchA(AC_gT zZAij`qSP#+A}ojQBCazEVip#Xn2fgFMvnP*Jx(>w{b9 zNdZTcMwR9zrClPVBFaV9!QB>m|87bHi%r$x znt;mrL>vwn)kZp+^n#cnrQ9pBg)B5FD{BgDx`tj6phSKQ?2!+o-R!$rSGeJLSKQ^hq5@Ew3tCjx0E{(6|WaLRZFsd6@_|KfK@IM7(Fp%?#f3L z(pnRvp z9DLOIFFDyQ+YhP@2G6hXq^^4fekqoax`nhFZ6mN*Pg`a^^_O-@iK^?#W^te`*B2f8 za#~r70fsos8bfLp2Z^I@drRoRM%i65v=m-!`okbqN25xCP+*8~yCj}ZQf~^u3McLC zqGnXa@rou+HJO-*eDN*qN1Ww)kh?C z@^B|}QR7$c@U={@NK}MU)=M4r{Ln3lcT3i*s7T}z4_QqYCvtHo&Quyo?P9w%P}n4c zoLpK(ISLDUlHLTtXoJb)(+AH#W&K~lk}HIWIt_x zRh}|v=1CR;Y_CXB$Q3<5AH_-)r6crMrI4 zKO{Q5M8wU6yDX+FDm?cktDOVGq*^A^i-f4wCio|n#0VR&s5TNCb#_d=+LJ3PB#kP$ zr{d(6E{>s*b>s@o{R(U!-j%zQYOzA+A9xKe{k|qo!7>3hBz$nLp{eKitKbHvq~r9v zau?FW9r<~$@B-;An0srA8s$}nJalO;`W`^CF17)RjF)C3V#jW zEkbbr6858V=ZQ%68Xl#cd6@rnX_@bo11GTgBagR0P1MdhPvPwv#M zaz(Zf<57q((m_!|D!gjoSD72U(XD1J=2q^snI8COT7V2c2a4LCAKH&d7~-+395h*? zcqpSQvKWiH@)ne`etpQsQ*jblqmm+38}Ipu)r6#2H84sfA`DQ1Ri!BXA}NrKvoDci zv7rPR3Vw*DE%lA3w$@N~efHffi8OaI5H#?HL|PS;R{03sVaa0T(m8x%9YmpY^)AYU{xX59S(pR zx(%xUi*)oBWTad0&2!-u9rlXwuFfgd(JSy(Ot%~~iE^4zr8<^Kqy}>f z)92DX$sKEOq)TdFaET?BN2h+jW(yRF7CUL_7TtC|indb_U6IA=QDH$)8lw9%wM*>C z)drQ`!S}g{)r6#2Wp1%Vykk~Z^bmpX7EH96i%7B3xvIK9-aK#DU7L{@a)m@iCx@@{ z5xUzQ(sIZZ64DZ$P}W=I ziV3N^_H&o>`zBBhr^Q6s$uMy69G9vmiC!g7Jz`NTa;+B$3zc_#RTD`ImZ(O1`@%~K zCxePUHU_9GeG05|pu&X+*NVjonnie*Ev;60-tQIZL3Bk(r1g1ECDN@(@YPmzm_(%W zcKs8py;md`dE>FR2!l*_M5rODLP7+!m<-G^{GWJ8N)_i=a1T73%K=qX)lr3d#Z^K? z@p!UQaMkrb5z7Q5u(f4-c1pQ%`5;yklFGG#i2+uG0ZOo{uE?5jlrqukRDjJr$UONx z5Z@r*n>r;5vgP_v5jA%*kPz*O?1w~$uksPPI|5Pssc4*&JJKL=O@s`SYMHzu-XeNv z_p+uDH0LzKyv8D_+j z!qF{RFGC}Z>xGC8PYQ_#fvUR-*Tpv4!*VViTF!||(r;ivKyv9~xuS{F`I@!L>41oo zo)VEQLU&on2d%Ga-#4hs5a{8q)2U=J9zxYr10i|fz}#T+A;sqX0Ig3*GzHP&2f}j| zsk}*bb%28`M0l%wbPHP9$eSvn!XUcG2L!H0g+zqV^h;)OdrE zq)_@IUE%_Poy7M=tLv>1sEUFQZ4qZCrV5KsfW1OO8V@%}6P2j6C2-Y(NkVU-2{45w zg}G3bLTkz~F^Ot!vD!=`az%*~dD!A{Jkdr`I(V6xtf@#toNz}JtQ2(IiUSJ~wE_Wl z`MhYOiDW{{2(dqJBnttySKz-7>G}C6Rx$}Rs?bMQjHe0dYB<9naFLMkjeQdj@<1m}G-Pm2*odWEcCSP3I5afNpTxu1AK5}>M+T!Afy3Z&-? zP>mlAB;4f|kO#(7!$gS40Nc65!*jTuf61Ft=oMHIWm&Y>tf@_mZ4yvAYU&7qs%YV8 zbGgc4U)!YsXQ#?rP+eDuhj+^r7$rip*<7JMz==nMSQlkHxo>;;8CKb41)j!D6UdoJ z&}kK`q)fBKA+}hy9lgXEv;ezaxNFu2B8-j5EmV4yD;<7NbmFv1!3c@9ckrY@D2eKp zDxMl8t(_yEsl2xh_Jr&G!!tNZXQZmh;(lam>UwGJU7x9muE0m;T+#9ul&0MJ^EMH^ zBBmk2SX;KQX!jAIdOl(`At_c3OboM(Xq`qU;xvG%qtgz~x1G90B5#gFTm1NiSu58N(-QI{i&ydge2N9%J5~N9Uf%- zi85EPw(*r?g(|`ut1%YRCX$G@ywIUm6Oct7Eh2m~_MK%k>st=M+ufs+q(k-^c1r}hr5bh3uoh@_=wcwm@hhsBh%8-KM zlN3~YsR&HOP*PPS1rh3~qCZnVIsob*F!aoSO+zDWGd__5sX{xq>(fWp)9aM1&x9sJ zU>B1W=egiWendpCNL@={Ys+>WwbKbuJs+`}kVsM8lEB2%Dnjk2(TUhpQZU;j(Wbcz z5fn-A3^=+a@z9p8r^lkHQ=%YSu8(z!6Yeqzbht0PJi^Me% z8f?V(2!C=^DuL!0F$h@{%=A&1vUh2<_zRFe3*MI57jR2v9x91(c+c`*MXl9 z_2?v(iZDn{RsWQtu*0LJAfx#ny!gVGoUK-6S%JEowj$g%+Y+5ygzHx8Rj~WFbbUw> z8%anUm1NOiLb@=r5?6R9_iaWRk^of(bA^m~le^I;K=u5q*T5B_TYx3v8ceDcA*y2c zSxa?OW5xbeiUX0P(0+#%q1ro{K=6x@%$ll!(CoMDw+q{cRGf%gO}Y>`bIu}aERu!qb41olXYBczwP@(Y2koXD(-4$~wf?+KM6Za|h+@~4?JL@|1gM^m zSWQTZRRa^7EhB2P(Ft|NKfdgKcJuthpZW$p;7pwo1=(_asE8sAGmt;N?EWyz5x}Zw zB(A&2Fva)CE67o4GHi~~r;JGyOwK3ew+}i^6w=hA)z^6Sc9Uw>K2|k%8XKe!*6VQ0 zJL#L)aVkH3%QRewu2RJZxm!^r5r2Ekx{V!4;)OR))1;HYn_apkY9|l5uAnUk4_xJ) z3JTvm6exZ99J8g6QXNvZHMeXL`l_fTBC~7PKe5_-MRLJJx`o<@ES{`6BvlALK=rwU zhS&oS!RKqTwV=8_`|XtmtrWFX5Cy*^D)BVgxTTkyxn)!*s;IUD6pg!+2w^+7NbW^A z9|>%clJK?_RnOF@Wc?yt7+Hxcyy%$+Hr~L{Ho2w*sBsUn<&b?DKHezt3f?KS>Gakqz-l0gO`bJlTRZ^yc9g$G~T2YB~J9>#T zD7IZM+#LWrTj&-ly_|1{9~2!?cHn_YK|S!`NkND{v8Ja+Dd#`+727`9sYWOxNq5T9 zaXstl_0bG+GBtI?BK$K*9|+s0lxkH1YgA$aZ4Clc&qu5#BvMqj{PE55N59>pz7Ra4 zBHdCSAYaXTnPln%`oNVf*T)9MK#Ig+%(+9SPBi!gG&Fxc~PW~ieoN@w2`OZk@z zeSL>7zS?>O+ZB>BE^?YHII1CiyUZ&Rd}69}CGjSbE%H#%Eh$(PNv;qQSMEYew#=@5 zBVD(Ut0#S&B8pgwS90l=l! zaN-dm)>;*^N~Ei=m=xQt7w(!h0y|si7An2U zRZ=)9I-=~r1CxS!;K7puq4dQ4=tQX6S&mS(@;u;re*(w1Ra7-K78#k!mvpNvwshVO*IgbM?w-qXfQKk?E{tbrHBG4 zp=yVV@aW{ga(DZ&|4)GYuf-oWZx6P2&-3GDe%$3pf1h99KHNOq=RYrQ9{M-)%jbD6 z_^S6lWaXy*Ge`b~~Vx(I#4Uu{;ozU!G zOBC0gjz;jdW(BJQ+bM(F&myY}=o3=90M_h*4!ecuNHt0B6_r0EwP}j+HVc9GfRS#= zEn+5ZAA)Uxy_^B06_JSZB#Sx^VVlJDxk?{Za>WHNB<|Q6cYhe?5e^@rtR zrPY+gC5v*c&KaPjl$u2tB*sHGt>9Q$gi%LD_mRDH68rN4iyL!wQKwo8Ne&nQwe)05jz8UJvx4d|pZ-)MVUlO%qrCE*&3Exr@e5FE8 zY#ps02 x^L_ZAG~A`fK5J8amIn6dYoaEZxIbE-chB1He&t)NU-^so{%HLs|M|}!{}1;+p`8E# diff --git a/packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_ok/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_ok/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_ok/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/test_prefunded_specialized_balance_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/msg_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/msg_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json index b3a52820d98893398a0ac9588992a619152fc27f..80e2902e5aa83b8e0f5ae7c45a41ded3b2aa0538 100644 GIT binary patch literal 26619 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 j)Pp~partHusmkxK_NRX^ zS3g~Sy8ik1>$krgZeH#V``yc%<#D?^9NzH!z;}N>@-zPqK4;MF?)b)Wk0+f^z2)~` z8+AW+f12C8+MQnW<9_*eSe~s|;b9%ZG+e{n3&pTsJp|!e#~ooEmltmx{u%99x)6^K>yRR2I_{1K6UEOy$QY^Pu>^X&@fAm2O5ovOw2WG^$nG<8pOQ2K zSR*kvytLJl{Qoi|J7;1g=zDqjE1#Y|tIhmArgPzWiSxLhn4eV4;Rabf7a^~kf~AfG ztU?sbnJ}NKp~q5uoJrHi?=KhE7mHXF_jJtKR;iPUbF#kJ;^gz^YvpVoRr6db&V~(> zA+3;$ver*gk7a%3jF!ukA@DW@Ag{|V7wh#bS2If&tKjhztM;O+oKKyEv`C#pgsQMH1lT8qvn<7J9m@Q5O*CI)&Uuy5%C4syZ(% z()9Lz=d6Oo@mxTq0_^7;8L6Zol~hoqx1WR+WGO4vRd|Bgo? zfzK($+|)T+lwE#+?GR7hWngc%uwc&}s!A)m`lO>UV!9}kBFN!y$sarb6agC&xk^)b z6D*3kef6cBQPmEZntnIKbfBW*Qk_n`3Bu4`Il9bUiu|0i z;p~keB+(+jXz9x1du{=6LTX#!9)*r-%Z5~osMcxmfhuyXGOf?}QW0vEx=X5HeONBX zT0<%<)GUbt6~%IJR^pnYU_{YEDkf9gu8~K)j*q7rrxalrRcdgUWTDJ>Fuju4iF(5> z=}I9UQH+Y_RZ3eTN=3*8vPoWRyA1l<N;bTO0b#ZzH^ua!%&o9%6vbwvPp zZxe7owdO5qNOYWXI8+S%9jAJ}5_K^XD{C~7ROwYw8|cHb;t|enyBdY4=};ROEK{T- z_DuszTMP#Ix*EG3C!X7#5>0rF&m?wINOHiA6jQEXFzV1UFQl7WP?t8ONa7iQDXA^G z1-U9xbV}jk2aI1Y4D++Pf{eVDLv`lpW+C|G-eqvoa4N&f&iZV$u9314Ysc~|>nlRu zRVWo_MHgK;zN~LZ-O4I(qe=$LfwrJ9tF=cI_tx-v6e3J4C<iGfLX$`x%Z z_ER9FEd)-w$}xCODI#%;Sm1;AU`;@%hJZp!BQvo8sp@5X+@;cy$H$9Sxj>3Zy6CV} z)7T<0nBtK*4iz<|c-`t2B}+4^RO3J>I@kYWNJdqrFgRCtF`Np)cw$K6t*A+CA#QSA z-2)&+wC)mZZ2&g|tB>>oFP=8HDCycjqPtXQtK;Jpw;jKtE_BZc2p7E^vDu}&#jHBqa}rwvYSpO`8%rI?##C4h;I?(Z=++L#Bj!^0hwQnMm?$?D*fl%zAD)|Dt_i!^?z<5V#U4L3?| zM-iv-8?+zaW8PMjVvp`(5o{nm9n#}L!+18lla1O_RG4>hmyz2#WvX%Yb(M5<|F&{V zSxqcuioGt4uQiBnOAU_1CdQeP>4;^!kNoRl4RgBv4JW6_Pnk84MG?e;y z)Gko3kmv%b18&lx(oJ+wP0<-xUq))W(iBjX^r|TOa-G61#Y}7;CAU*oNxFz6l?DYH z4`U-&iF6r{QMpTEyyv!YSK=o*)=_j$As0Eh3;tZD=>J7dZV?sB7Ad5etKw`<0d)Z) ziegh!1%1^HtgP9{Lx+UmrsU# z^X>k|`2X)iA}hAErJ=$t2a8f6TWmdA&jga*BZ!AEg%xexDJZxwGRLQ8fHjn(p;2Lr zrPQ5L4@o7Y6bvlrJE{4V@ggn#-p-oF$G3Gh3NN1i2gU2NDhs9DTp!aY!gdNMO8Gct zL#K>wY3|Z1sKTeWq|&yozj5b#{=YQ%hf{9&3mE=6lk<;>1WDXqtxx|p$de8FiC;W= LX+GiGuXq0f$^W;x diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json index 912fff5298e94fe86708cfbddfe491f2bc709cd8..60a871c5ca586c68bb6acb94b28ee72d53791ed3 100644 GIT binary patch literal 33848 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 KCw%+)^M3%&p%_;H literal 33786 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 W@!GEUnFjrtHy*vTp776)AO8mfToAVa diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/msg_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/msg_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json index 7c8fcbc37f6fd33db3956140826aa5f4f9f4eb9c..0ff2528fc31d47d8c46edaa9a4b59932d458f1ec 100644 GIT binary patch literal 34902 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 literal 34881 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 L(R#x_-+lNU3z5qb diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/msg_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/msg_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json index 156a7955a639d678191450ae260f338727d32b13..f46dd956d7df5713ae1aec33575e0fff00a937cd 100644 GIT binary patch literal 34183 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 W9fDu@)cP;{;nA6(?tgxJ|LWgw-@Lm2 zy!q|ddlG*DAD;c~+54-%|Lf|9ACEULu8)W77dPW^dwo29&+{Yy`umCB`S0j+2HjqtzIWW? zN#|2<`TN&KJ&Zlvt!=)$zI(~9hw;yGJln9sr*#O^a1HYy6vO`RQxL9ox+bjCc=6WZ zAJNW5&VSxs-x1eZSiQ;!3WQ^4D7=fN{e8rKM5_misEu%&j z*?mRsQ<7!?TO{U&m$n+o|8Hhw=S-{w{U9&@VAPR-RfvK)6Xxe?=&=+ZXVUcX_shlgr$sD^2Rc@5tJFosIaz<&;?Cz^u9dTW zRLz%CaW-t43~7a2l(l_|dMxWJXS7_VOo6v40C`z9(Vt7tK z9oLuZlqJ@OxMWb3I6^8Wpeo2x0iM=(aUhhICvim^bA0k}qe?80)#&-AG@`Jg>lAVu z>6VLFs_MM7NYmT zldIC9q#K(m1-_;fb5rMRQFi$YY=?O2E)#pRg@HYHs4A`K>WhxTi0PtCiXf-IC4cY$ zPy}p9 zFuju4g?h&>=}I9UQH+Y_RZ3eTN=3*81jLSu7!@IvYFed~qMEi)N!-Ev z*yu?~oHY`*DCRa9Pil7xkD@Cfpx)H`dVwryZ7-;jsH9jUiNa__7c;qCJQe0stz3%T zZ120QD+0iKn}GYNHE&TvqT`gqpxCfW)z~P zL+xO&Op%V*Hw`RpF&X6NX6$yHcy4z}G~qculh{ci$pJf3Ou2%=s6)%VkZx{4UD}W$ ziDv+&q_*f5oEYh$3-kJap~YRVxa|!+1%rQ|PKCu*FC^gb-Ef-5O?D9~43;1zz2itR{t+ z*mwieDYS{wyqrR=O8;8B>?o+BE2E;O3W;kF&>gS2V-cgkbpnz2a*hNz24o8aOpHWpkSYo9r9b6ms;9lKm@&3ICxdh)R3I=|(rcE$Qfjt&4qchX3*4N1u8yymJ#g~)r$XnqS9Fj#hxbQnntPTj@=Y&xHe#4RMTRFkL&{Ln$- zF=@}WA-almq=IsB5>;yuk(491iA9Zx!5z|Ni_$v`DJg`$oFMcRX+E2;lH_i>be&SN zREr`(c+$c0n`$SK8}GoNoD_^{XG&~C=Cep>j!&vKFv>p$#`p}s9zSA+b>k!tZXzXx z0J%Cqg-in~MBwwuA>}%)Pf819?KjHRn+Das3Tr|}NM#Glp$JLH?6RZhmR;mJZedi3 zzNC%XZHIe%g5BKRj2}hC6R&iXDJrl6hq$Ek7*9x1Svkerm?~j3*Nt6Zv0vh0itVhp zioK>BHQgd!T+FD1lj?!+2qE29~CHo+;-ax4?Ci zA5Q6(DGNy9T?R{f%@SBj&9>4=hneDL4dzpZ(d?)QK#lECeo?Z@FI7)GjBh6&1Uc*| zwP~jmAdZje5__S;Eq0uOQvFVsNOGMHnRbaTvA8J4GU-TO!IZVp=Hr}d92rZ}lK0|x z3~n{Pi$v9%qKb!1`+L!q<7;)KgBk0W0-r>;>(Cwdqu{zkrDEA7y7a1!?K;PDQ-Mzf z7GqDPnuL^A)&#bvrRcea(PR*hE*C$i{ca<7r>!DkhY)|Dt_i!^@JajF=Fh8raVrijz{9olEg(-)=Kqr0f+7?`A|i?evpFdhu4 z01})!&9Eq};05asYI2J=YM`j&>6dXhs#M=m|x-^xA7mu2N|z_4%k>pk5)-1yWz$r9-8g=%AXSGqApl)O4jOpeX58 zQCyDHDeO|r#P(5gyL6SLi%3#w^uyT9RU%!+V^r>v81K1l+?DuAj&&5BQ^-Y5?t(v; zDf)krlUqc^vPBAM<*GQFQ$SsSh@#lk68UD2G9-YPT)D-#*$|v?M{cQ$q(dO2#P*A2 zb5*Me;01+T^GHBQR4FA5oMTlPDIAAR}tcxT9)Zx7#p{lC3QWW|=YG*!6gU{NY$kF7`RSwPY~ zf_Mm1SkcyJdTBl3pPxSb2L_ow6#xJL diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_02381273a00d2e9ada5d2a65f02b6b091bede36307dc69b46eb65e967bb84bce.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_02381273a00d2e9ada5d2a65f02b6b091bede36307dc69b46eb65e967bb84bce.json deleted file mode 100644 index 203681b3b021eb285e53b4da6ed0019dc17d5eea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49403 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 J{`vcde*-bTwQB$X diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_08e1547cbc369ad6c9b70f9df5e7ea009e369cadf26d2fd82453d9a75ccd6ae7.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_08e1547cbc369ad6c9b70f9df5e7ea009e369cadf26d2fd82453d9a75ccd6ae7.json deleted file mode 100644 index 347c7e4bbd613207f7578e1c82deaced1689e242..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61262 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 diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_0cb9ee36247bc1ceaf62016370f4ef834e6bbb89d21b2f08163de5106d9db335.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_0cb9ee36247bc1ceaf62016370f4ef834e6bbb89d21b2f08163de5106d9db335.json new file mode 100644 index 0000000000000000000000000000000000000000..0372ec584a4930b5541193315a08b2542e12f501 GIT binary patch literal 49457 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_1c64f28b411c0c2d689236e1780f46635ec4cbc5f228d0d6f1af26cedcf8aa24.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_1c64f28b411c0c2d689236e1780f46635ec4cbc5f228d0d6f1af26cedcf8aa24.json deleted file mode 100644 index 86d3f08e51753977d5b66ef9578a2b84794c237d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60829 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 b()&&aUe4R@zS5w-^2UQ-tv}?ie}DQvvZcmw diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_5712787e7fb90c195d81acfdc0659525067352d9440afaca1db61fb1f51e83ae.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_5712787e7fb90c195d81acfdc0659525067352d9440afaca1db61fb1f51e83ae.json new file mode 100644 index 0000000000000000000000000000000000000000..f669830c8ae432e4256d87ac54587df0ef8bc4d4 GIT binary patch literal 61445 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_6324f0ce91119010ab60300a78dc362866cbab6d8388743fdcf5d797910561df.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_6324f0ce91119010ab60300a78dc362866cbab6d8388743fdcf5d797910561df.json index 8e8d48d74a8c3fb0051dc0d1e2e2299bd0d4618f..2ec9c6f452a75ecabc3c058f14af87e7d02297f5 100644 GIT binary patch literal 57619 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 diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_86088d93d1bdfa513a66ef126a9872937c56537dd54618a39819b4233232d497.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_86088d93d1bdfa513a66ef126a9872937c56537dd54618a39819b4233232d497.json deleted file mode 100644 index 26825615f9b57b56c4501e745bfcce6574e089f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48952 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 BRF41v literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_8af1fe2b83fc914ad833914a6f47686a168bd79e8751279ec53efb41381dd431.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_8af1fe2b83fc914ad833914a6f47686a168bd79e8751279ec53efb41381dd431.json index 62b177ebe48add9637faed7524a0b187eae3f416..a9482783b70f06beedcf118167984b66cac29130 100644 GIT binary patch literal 96945 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 literal 96666 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 diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_8dd8d6620ba68bceb5a65a1c2b80daadb7e1a4cc0c58c52450dd44d5ca462e4a.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_8dd8d6620ba68bceb5a65a1c2b80daadb7e1a4cc0c58c52450dd44d5ca462e4a.json new file mode 100644 index 0000000000000000000000000000000000000000..ce2797542019b61cc3dbb27ab344f4485c11f658 GIT binary patch literal 49024 zcmeI*(QcK;6$Rj4^Ar)+zVNXz#(9Z8KvhLiLMl`O6_DISynEN08O)&t{D0F%%0-$3 z*m!34UVE**_Wb7{^|wdgeDnC%=WpJ=c>U_}x8MAhZ~GUQ_h09`x9`4x^X|KMFMfXh z-HTU0y*~TVr$7ApZGLpRy}rE4e^0NUUfo@c7rUT|T=yoo;V#FY~_-+mqA%su!=m9_i(apI^L78do1SKYsnwPj8?1 zuU`G~^5y;Ce*gA|ocZF_KUT{3Kls<1*S|hL$MHUB-amT(=r50cd;HgbKK}M^r>pCW z)8)nW)p$L*IGvv5`&0hx*Ejh(zfS!=i=JHEJnOnoH=S>NlAnKV)&1JbyA|f?#ocYb zyc~a=#&-u!_;^mzY`RVJvQV1#(~n8ytS5IDH<~lpP$=t&EP3B1RorTEy_SRttU4K2I9Nto~3JOJ?e3Y`X zK*Ysz1j4LpTGR@gLJ1d@>-5FLTr{zW@DdVhc_pic$h4IvVmi_n1R;xw?i4mJY1IwX z-GYpFOGckypNZvnlVYNz%@6CU<%&o&O5kIW$Dohwr8mSEA&mGwP80+yaq##1Gt zuc)1iwz<$Zfs;tOg+h#rA?bFfR>?|wkY)!hp2Qu;+x6Jm-4eMzcy85TSiUO*FF-#nzzIJ@mmu#pZ#YS|Xltk?PQQ{Um9BK(RF}EvhK-;ai-J%OLm=QepUn`rpcYS*4Z478)Y!X$nm25~bK>eY1+Fgz=49!Qk7VzOMXATr77i}K!r*Z$wO1KiVkVS zL{YN7A>y2LAs z3DNE&IuP=4D`+yqb6^X(pA=sk0df|5oCJ{uXmMet=GZLN3>8x}vpS2;AJ+zxvA#>0 z5aL3$U#aRMf;w@aCc4XY5+geB=A*ab09WrViex3_-2pyZLr8BFoo-XQG^ukl5#MW8 zxtvHtb<4Pzk*$?V0n#YBn4#utJ|y4)WCK1WRxEorF2T|$5tv*}TPsydc$5&$N=VH5 zQ=mz6^M^`RR~^V%Alf7R@&eq z^?HtS7a}wzM6r67bQ?uUR+;_`JWtS6+c`Ldah?8ER7NuaPgdEbHiB=F6^P!ieELuL zWb8Zsra*q@^@P_JM;M~;)V~xU-s34HnaW!Xs$1O2sU21b>g#C*WN3LpLEw6`Eqxhb zl2z&6cyCh%_sUAJH!FNz?v{;bz(@aLlo65;?Ff_DOB?xA|VDTrJheIr6Z8IoqNb$6zXn#D=%D35ds%69I9>B zi~QOS+NwbbOifkJh4da;hlL5d{KK7%f(U>t5j%|q*kQH!5;*hqxc%vQS$J5Vy~d>JdT`vYXU&czc5eSr08eFFQ(yeTn zJ!@I%jVLI@Mv4NRGfhE?E$ZQ)$LB@q+xTQn`$7~o3uPh<7uwo!51C>u)ZxefLcr@; z4G^!g9h6eo+N|_x>k}XpBJ#_6Dy*EpQ`l)xGAvdfk>SKPRe_nsBC5K9qQHC0#?`By zCb}&Ou}zv3p}-E0T#02g=&=21fMww~lIg91WP)-WZKT&skt?v|+~x^ILFp}Sfd zfsWs5GJP2P1`ujeAMQmRUy@ptj`)nW_C`ac!W;0#0}Eeo?>_Zrl;hIsdNiMI(OQX_ z^nCTJp?1CpCJGIj+%pA;wk;9S)*%1P`n>e290d~Bv0RZ;XP>6D_b??Ws=&Cq0ug6h zAq0EfLr@fgKeia^IRylGAZS);I@&S~iU!T}9PVy$kHxsuDqAR}hDbvR>2!Xzf$!zE zyJdV=9whQ%YZRhY8bFRu$*k{7#=ROyv&uvChN2{^Mxm)eT%fjFQraTJmn9M5QDvs} z=@x;|UUoekSGDziE=z%Y_{oSC6It3>q_Jv1{AxCoS?=s~Y}*>IG-DG>e~EtTKcwe8 z&C#qGDQS60r9~YSa;;hnN}<*k@vd?wx=LZWwz(e)ea&Ywa=5A27SSPhtBz*96-Ti| zM4Bk0fvgYvqJ5eWBqzMvmuS6-%>hTi=N1AowlE|9o?DBomV3A_Dsnm8ZLSXn} zeVV@*V6BO6GRZ$7)RtYbjUpbXz$?@M7wl_`cuu#ZVFgIn2fH|Pw_sB=gmm{rL0L_y zQ!TKVC!|~EgU?}7$oV_DguXTutq*a^wbZ99;QHeoL6uy3_}#{Cd-JdcnvAy0 zkQo_fl}TdA0FtgO3SA$uQA%=tn>UaTvq1W3<(1+LXcT|^O8YVOr2B1I8%76(`t$wd zWB>Q)t!+pblPPzitBy_;6~oTc5WZWh#(PpV2pq>19;WH`CL3U}?( zgdjQL1*Syjj)cIwi-2cwwh)l9MHA}?kSG&~S+2~l<{#jqLz|Cr1G>LS@@q`Umg3!* zN0~3eS{BpAz7%MoCJ+(%iXvRM!g&dUixg_uc!*{t>lf+zs5P+Dh*{W=U+~b`%3!j> zHzllLbG{U+wM|xZ4c4iI`Sgy8C9?d}-83cR`Ba}!kP-=mjuq?(o~j!UUm=1D71Y9Y zZI-M_N;*x0dS~`Re?RO1Gm4?cs;&@Hs09QED~-q*B5roPR_$w%(+YuoQO1?QtjAg< zgf)1s2Xq73s8#Mo(tWKG)+&&xVJCxJ+hiql^y($fpgQb&;cla_a|=bG*30>J_(sza zWgGGi1ogm;Cj}vz-7NWtVJ=n3-D7F*kI97q(IzeM!&AH0EzuIOmc@NZ2Q?oOp590^ zc1aS+KOu0MbUm>!qmXqY@Qrp@TLehA;C-O$gGEHrEvXpkHX%e;69r{8rA|>+gOD2p z#Rel<-drR^^K|Q2^ojqcP<%tvXWP7EEDD(lY+}dF_RoKXb@0O-vS<-1nSX?OdMM$$ zgDw=2oUZfhHos2!)$jB5<=w^IP5yXtao3;BFR$}(@$BOI>f$adA4(w0@**9!0kcIs zq0c)~=XM9#TJpgs;^redDe8EF_Bg(ilPI&i$8BMUj@VA%2qRseAt-l@ZW)1&W9bv9 z@SYGvV$T=LErg9N0-;hDBC?oR==pgGamqqVnkO=94eyJdk5?B3vZL5pUNN7=h?J|q zRqC-^)L}`ye0XHY%<4qyug(bW-ldAisbR%IzxbZ~Oc`G)hMik>Aud^?-# zEh~I*sc^D|w1#)aRaM?*F=QsN%3z1()0D65=KNMixC0d zEr}vqYR06ip?1cO&tU~3wW>43CdGUj0(H__VTcw=bkd$0uj99~0?8I3ePO4>qN^17 zu<>?r7?GYT3MubGt(~4IB(1ojHb}O}kl$o5YE;q#Tu5(X3857h5~mbRCjm|j;y(?j zuIT)jn-Ia;z&oi@rt7PRw6-X`ZV)XAkZ#$q^xVWGu_?bII_zxSk_HzuGQ zT$PB6Eg~#Lh97bl+o3I4Tt$f|lxw`~b_;e#=@1522y&i5`q61KKT1ih{?8v0efb|Y uobqAORsX%iRp!~*hed%}eSft-Pgk9O{nriu@%qdUKKZNlP5$`%`+oymP;7+& literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_de3d9a273ba38a5e8fd9ee2c02b74bf83d09d43cc787b1c1fce7bd053ae1ebf4.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_de3d9a273ba38a5e8fd9ee2c02b74bf83d09d43cc787b1c1fce7bd053ae1ebf4.json deleted file mode 100644 index dff12a5aef82c4f443f37813f4f6bc3c38cfad5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60991 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 diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_f1f82e9e31d7112f92816896406df8382ca43f73cf9e63aa985c1add075d0264.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_f1f82e9e31d7112f92816896406df8382ca43f73cf9e63aa985c1add075d0264.json new file mode 100644 index 0000000000000000000000000000000000000000..586068b1ce6449ad21f4958b346d5d471ea8c1fa GIT binary patch literal 37361 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 OKX~y^{hR#p+vC3qc*t%5 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_ok/msg_GetVotePollsByEndDateRequest_90f99444544de47f7e78de44bcaca1b6ba4883a92f4533995dbfdbc5875d8bef.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_ok/msg_GetVotePollsByEndDateRequest_90f99444544de47f7e78de44bcaca1b6ba4883a92f4533995dbfdbc5875d8bef.json index 2cb13b8d747800c0ac71ba294710342efc669ba2..cce948bda87798ddd679144dc61de456b005391f 100644 GIT binary patch literal 96869 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 literal 96590 zcmeI)+m2q>aRlI8>nQ|X&&3SM5jB2^JU|c_MnVNdWXh0e-w1m5RPA1(hO$VmZ$%^c zLcmXohjr+#s;=(6f7(BM_W9>u{NvSk-@pF$%@=?A{D=Iue{lQm*ZJM|Z~yY$+dsd3 z{nuB2e*Na_Z}V4g{{GE3H`mhq^{Y4k{o%j-=Jj7+zy0NoZ@>Qf`&a+;r+@kWzjD;; zH~*96Z@>Hdt9KXt?YnRP@oN3yb?J}!`Nz+G{OsR8`{9d!|KBhE^dEQ6p5NTv-aLPH zeO}z$-F=nc-{rsk^?iPwA9wwI7QMK+|ElZW-}HFvi~Rk^R=rz$`>?M0^5)@XetCQS z=kEI5#tA>4lQ0`@!@O-O4g1TVgXmfJHwo+h`okAp{!_Md$m5@1+&m<%E8RKw;r{xQ zoO(rBED~w&3QSqo<+qK$A*{doL_{wh8q59j{`|>shKeBm(_JrqPAx}#dVjDOYzFTu z^rm?K^ErX2G2P$X-xa9*x}P8x=<>M&y?@p}>B>(5cz4%mv+6=Ix39?i+kn;pb|lsd zKXugw{y#HQb{>f}LBEq%|Ej-z_(^TW_kB7qp07CXZ&%L0s+hZHk=2JH%%2y6tB#s* z6;i=G66UYf(ECz+AIZX(zyEY`{o;@o#XCAyZC9y_ipOOA;);j<{=>EM=$@+PLr^?g zHYO8TLvEC{zomMV^DF0QS+>LRq9xa|>eCTT~=>c1xpr>A7qAiAqRJR93L5R?+!lT(*>pd{88s zMHAolgyC*~edAAolM_aM5>l>cffGvU-r2RCb>&LLC1pvWiwUABZAqb5T%H42b$C$hDE0j=Hg!QXbHMshil|mocchA(AC_gT zZAij`qSP#+A}ojQBCazEVip#Xn2fgFMvnP*Jx(>w{b9 zNdZTcMwR9zrClPVBFaV9!QB>m|87bHi%r$x znt;mrL>vwn)kZp+^n#cnrQ9pBg)B5FD{BgDx`tj6phSKQ?2!+o-R!$rSGeJLSKQ^hq5@Ew3tCjx0E{(6|WaLRZFsd6@_|KfK@IM7(Fp%?#f3L z(pnRvp z9DLOIFFDyQ+YhP@2G6hXq^^4fekqoax`nhFZ6mN*Pg`a^^_O-@iK^?#W^te`*B2f8 za#~r70fsos8bfLp2Z^I@drRoRM%i65v=m-!`okbqN25xCP+*8~yCj}ZQf~^u3McLC zqGnXa@rou+HJO-*eDN*qN1Ww)kh?C z@^B|}QR7$c@U={@NK}MU)=M4r{Ln3lcT3i*s7T}z4_QqYCvtHo&Quyo?P9w%P}n4c zoLpK(ISLDUlHLTtXoJb)(+AH#W&K~lk}HIWIt_x zRh}|v=1CR;Y_CXB$Q3<5AH_-)r6crMrI4 zKO{Q5M8wU6yDX+FDm?cktDOVGq*^A^i-f4wCio|n#0VR&s5TNCb#_d=+LJ3PB#kP$ zr{d(6E{>s*b>s@o{R(U!-j%zQYOzA+A9xKe{k|qo!7>3hBz$nLp{eKitKbHvq~r9v zau?FW9r<~$@B-;An0srA8s$}nJalO;`W`^CF17)RjF)C3V#jW zEkbbr6858V=ZQ%68Xl#cd6@rnX_@bo11GTgBagR0P1MdhPvPwv#M zaz(Zf<57q((m_!|D!gjoSD72U(XD1J=2q^snI8COT7V2c2a4LCAKH&d7~-+395h*? zcqpSQvKWiH@)ne`etpQsQ*jblqmm+38}Ipu)r6#2H84sfA`DQ1Ri!BXA}NrKvoDci zv7rPR3Vw*DE%lA3w$@N~efHffi8OaI5H#?HL|PS;R{03sVaa0T(m8x%9YmpY^)AYU{xX59S(pR zx(%xUi*)oBWTad0&2!-u9rlXwuFfgd(JSy(Ot%~~iE^4zr8<^Kqy}>f z)92DX$sKEOq)TdFaET?BN2h+jW(yRF7CUL_7TtC|indb_U6IA=QDH$)8lw9%wM*>C z)drQ`!S}g{)r6#2Wp1%Vykk~Z^bmpX7EH96i%7B3xvIK9-aK#DU7L{@a)m@iCx@@{ z5xUzQ(sIZZ64DZ$P}W=I ziV3N^_H&o>`zBBhr^Q6s$uMy69G9vmiC!g7Jz`NTa;+B$3zc_#RTD`ImZ(O1`@%~K zCxePUHU_9GeG05|pu&X+*NVjonnie*Ev;60-tQIZL3Bk(r1g1ECDN@(@YPmzm_(%W zcKs8py;md`dE>FR2!l*_M5rODLP7+!m<-G^{GWJ8N)_i=a1T73%K=qX)lr3d#Z^K? z@p!UQaMkrb5z7Q5u(f4-c1pQ%`5;yklFGG#i2+uG0ZOo{uE?5jlrqukRDjJr$UONx z5Z@r*n>r;5vgP_v5jA%*kPz*O?1w~$uksPPI|5Pssc4*&JJKL=O@s`SYMHzu-XeNv z_p+uDH0LzKyv8D_+j z!qF{RFGC}Z>xGC8PYQ_#fvUR-*Tpv4!*VViTF!||(r;ivKyv9~xuS{F`I@!L>41oo zo)VEQLU&on2d%Ga-#4hs5a{8q)2U=J9zxYr10i|fz}#T+A;sqX0Ig3*GzHP&2f}j| zsk}*bb%28`M0l%wbPHP9$eSvn!XUcG2L!H0g+zqV^h;)OdrE zq)_@IUE%_Poy7M=tLv>1sEUFQZ4qZCrV5KsfW1OO8V@%}6P2j6C2-Y(NkVU-2{45w zg}G3bLTkz~F^Ot!vD!=`az%*~dD!A{Jkdr`I(V6xtf@#toNz}JtQ2(IiUSJ~wE_Wl z`MhYOiDW{{2(dqJBnttySKz-7>G}C6Rx$}Rs?bMQjHe0dYB<9naFLMkjeQdj@<1m}G-Pm2*odWEcCSP3I5afNpTxu1AK5}>M+T!Afy3Z&-? zP>mlAB;4f|kO#(7!$gS40Nc65!*jTuf61Ft=oMHIWm&Y>tf@_mZ4yvAYU&7qs%YV8 zbGgc4U)!YsXQ#?rP+eDuhj+^r7$rip*<7JMz==nMSQlkHxo>;;8CKb41)j!D6UdoJ z&}kK`q)fBKA+}hy9lgXEv;ezaxNFu2B8-j5EmV4yD;<7NbmFv1!3c@9ckrY@D2eKp zDxMl8t(_yEsl2xh_Jr&G!!tNZXQZmh;(lam>UwGJU7x9muE0m;T+#9ul&0MJ^EMH^ zBBmk2SX;KQX!jAIdOl(`At_c3OboM(Xq`qU;xvG%qtgz~x1G90B5#gFTm1NiSu58N(-QI{i&ydge2N9%J5~N9Uf%- zi85EPw(*r?g(|`ut1%YRCX$G@ywIUm6Oct7Eh2m~_MK%k>st=M+ufs+q(k-^c1r}hr5bh3uoh@_=wcwm@hhsBh%8-KM zlN3~YsR&HOP*PPS1rh3~qCZnVIsob*F!aoSO+zDWGd__5sX{xq>(fWp)9aM1&x9sJ zU>B1W=egiWendpCNL@={Ys+>WwbKbuJs+`}kVsM8lEB2%Dnjk2(TUhpQZU;j(Wbcz z5fn-A3^=+a@z9p8r^lkHQ=%YSu8(z!6Yeqzbht0PJi^Me% z8f?V(2!C=^DuL!0F$h@{%=A&1vUh2<_zRFe3*MI57jR2v9x91(c+c`*MXl9 z_2?v(iZDn{RsWQtu*0LJAfx#ny!gVGoUK-6S%JEowj$g%+Y+5ygzHx8Rj~WFbbUw> z8%anUm1NOiLb@=r5?6R9_iaWRk^of(bA^m~le^I;K=u5q*T5B_TYx3v8ceDcA*y2c zSxa?OW5xbeiUX0P(0+#%q1ro{K=6x@%$ll!(CoMDw+q{cRGf%gO}Y>`bIu}aERu!qb41olXYBczwP@(Y2koXD(-4$~wf?+KM6Za|h+@~4?JL@|1gM^m zSWQTZRRa^7EhB2P(Ft|NKfdgKcJuthpZW$p;7pwo1=(_asE8sAGmt;N?EWyz5x}Zw zB(A&2Fva)CE67o4GHi~~r;JGyOwK3ew+}i^6w=hA)z^6Sc9Uw>K2|k%8XKe!*6VQ0 zJL#L)aVkH3%QRewu2RJZxm!^r5r2Ekx{V!4;)OR))1;HYn_apkY9|l5uAnUk4_xJ) z3JTvm6exZ99J8g6QXNvZHMeXL`l_fTBC~7PKe5_-MRLJJx`o<@ES{`6BvlALK=rwU zhS&oS!RKqTwV=8_`|XtmtrWFX5Cy*^D)BVgxTTkyxn)!*s;IUD6pg!+2w^+7NbW^A z9|>%clJK?_RnOF@Wc?yt7+Hxcyy%$+Hr~L{Ho2w*sBsUn<&b?DKHezt3f?KS>Gakqz-l0gO`bJlTRZ^yc9g$G~T2YB~J9>#T zD7IZM+#LWrTj&-ly_|1{9~2!?cHn_YK|S!`NkND{v8Ja+Dd#`+727`9sYWOxNq5T9 zaXstl_0bG+GBtI?BK$K*9|+s0lxkH1YgA$aZ4Clc&qu5#BvMqj{PE55N59>pz7Ra4 zBHdCSAYaXTnPln%`oNVf*T)9MK#Ig+%(+9SPBi!gG&Fxc~PW~ieoN@w2`OZk@z zeSL>7zS?>O+ZB>BE^?YHII1CiyUZ&Rd}69}CGjSbE%H#%Eh$(PNv;qQSMEYew#=@5 zBVD(Ut0#S&B8pgwS90l=l! zaN-dm)>;*^N~Ei=m=xQt7w(!h0y|si7An2U zRZ=)9I-=~r1CxS!;K7puq4dQ4=tQX6S&mS(@;u;re*(w1Ra7-K78#k!mvpNvwshVO*IgbM?w-qXfQKk?E{tbrHBG4 zp=yVV@aW{ga(DZ&|4)GYuf-oWZx6P2&-3GDe%$3pf1h99KHNOq=RYrQ9{M-)%jbD6 z_^S6lWaXy*Ge`b~~Vx(I#4Uu{;ozU!G zOBC0gjz;jdW(BJQ+bM(F&myY}=o3=90M_h*4!ecuNHt0B6_r0EwP}j+HVc9GfRS#= zEn+5ZAA)Uxy_^B06_JSZB#Sx^VVlJDxk?{Za>WHNB<|Q6cYhe?5e^@rtR zrPY+gC5v*c&KaPjl$u2tB*sHGt>9Q$gi%LD_mRDH68rN4iyL!wQKwo8Ne&nQwe)05jz8UJvx4d|pZ-)MVUlO%qrCE*&3Exr@e5FE8 zY#ps02 x^L_ZAG~A`fK5J8amIn6dYoaEZxIbE-chB1He&t)NU-^so{%HLs|M|}!{}1;+p`8E# diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_ok/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_ok/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_ok/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_ok/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_order/msg_GetVotePollsByEndDateRequest_4959b488e99ae1bd41af47fdecce942470ee2b9dff806909798d12c40bc6cf8b.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_order/msg_GetVotePollsByEndDateRequest_4959b488e99ae1bd41af47fdecce942470ee2b9dff806909798d12c40bc6cf8b.json index 874ce3fb7d51ae5a9e0feb20f9bd4fb89d82271e..2827b35ca390f16f29f80eb22f1df54980ff92a3 100644 GIT binary patch literal 96885 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 literal 96606 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 literal 96590 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 diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_order/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_order/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_order/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_order/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_order/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_order/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file From 244f5f902d6220de9fa3f6e7e60cf4c8c22ed524 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Tue, 29 Oct 2024 19:38:54 +0700 Subject: [PATCH 83/90] feat(sdk): added transfer transition to rs-sdk (#2289) --- .../methods/mod.rs | 54 ++++++++++++- .../methods/v0/mod.rs | 24 ++++++ .../v0/v0_methods.rs | 78 ++++++++++++++++++- .../mod.rs | 1 + .../v1.rs | 1 + .../v2.rs | 1 + packages/rs-sdk/src/platform/transition.rs | 1 + .../src/platform/transition/transfer.rs | 67 ++++++++++++++++ 8 files changed, 224 insertions(+), 3 deletions(-) create mode 100644 packages/rs-sdk/src/platform/transition/transfer.rs diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/methods/mod.rs index 2bea2328d7..43790f371d 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/methods/mod.rs @@ -1,7 +1,57 @@ mod v0; - pub use v0::*; use crate::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; +#[cfg(feature = "state-transition-signing")] +use crate::{ + identity::{signer::Signer, Identity, IdentityPublicKey}, + prelude::{IdentityNonce, UserFeeIncrease}, + state_transition::{ + identity_credit_transfer_transition::v0::IdentityCreditTransferTransitionV0, + StateTransition, + }, + ProtocolError, +}; +#[cfg(feature = "state-transition-signing")] +use platform_value::Identifier; +#[cfg(feature = "state-transition-signing")] +use platform_version::version::{FeatureVersion, PlatformVersion}; -impl IdentityCreditTransferTransitionMethodsV0 for IdentityCreditTransferTransition {} +impl IdentityCreditTransferTransitionMethodsV0 for IdentityCreditTransferTransition { + #[cfg(feature = "state-transition-signing")] + fn try_from_identity( + identity: &Identity, + to_identity_with_identifier: Identifier, + amount: u64, + user_fee_increase: UserFeeIncrease, + signer: S, + signing_withdrawal_key_to_use: Option<&IdentityPublicKey>, + nonce: IdentityNonce, + platform_version: &PlatformVersion, + version: Option, + ) -> Result { + match version.unwrap_or( + platform_version + .dpp + .state_transition_conversion_versions + .identity_to_identity_transfer_transition, + ) { + 0 => Ok(IdentityCreditTransferTransitionV0::try_from_identity( + identity, + to_identity_with_identifier, + amount, + user_fee_increase, + signer, + signing_withdrawal_key_to_use, + nonce, + platform_version, + version, + )?), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "IdentityCreditTransferTransition::try_from_identity".to_string(), + known_versions: vec![0], + received: version, + }), + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/methods/v0/mod.rs index caa6ad6560..eeb7104420 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/methods/v0/mod.rs @@ -1,6 +1,30 @@ +#[cfg(feature = "state-transition-signing")] +use crate::{ + identity::{signer::Signer, Identity, IdentityPublicKey}, + prelude::{IdentityNonce, UserFeeIncrease}, + state_transition::StateTransition, + ProtocolError, +}; +use platform_value::Identifier; +#[cfg(feature = "state-transition-signing")] +use platform_version::version::{FeatureVersion, PlatformVersion}; + use crate::state_transition::StateTransitionType; pub trait IdentityCreditTransferTransitionMethodsV0 { + #[cfg(feature = "state-transition-signing")] + fn try_from_identity( + identity: &Identity, + to_identity_with_identifier: Identifier, + amount: u64, + user_fee_increase: UserFeeIncrease, + signer: S, + signing_withdrawal_key_to_use: Option<&IdentityPublicKey>, + nonce: IdentityNonce, + platform_version: &PlatformVersion, + version: Option, + ) -> Result; + /// Get State Transition Type fn get_type() -> StateTransitionType { StateTransitionType::IdentityCreditTransfer diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/v0_methods.rs index 0060a25a2c..e04e061f67 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/v0_methods.rs @@ -1,4 +1,80 @@ +#[cfg(feature = "state-transition-signing")] +use crate::{ + identity::{ + accessors::IdentityGettersV0, signer::Signer, Identity, IdentityPublicKey, KeyType, + Purpose, SecurityLevel, + }, + prelude::{IdentityNonce, UserFeeIncrease}, + state_transition::StateTransition, + ProtocolError, +}; +use platform_value::Identifier; + use crate::state_transition::identity_credit_transfer_transition::methods::IdentityCreditTransferTransitionMethodsV0; use crate::state_transition::identity_credit_transfer_transition::v0::IdentityCreditTransferTransitionV0; +use crate::state_transition::GetDataContractSecurityLevelRequirementFn; +#[cfg(feature = "state-transition-signing")] +use platform_version::version::{FeatureVersion, PlatformVersion}; + +impl IdentityCreditTransferTransitionMethodsV0 for IdentityCreditTransferTransitionV0 { + #[cfg(feature = "state-transition-signing")] + fn try_from_identity( + identity: &Identity, + to_identity_with_identifier: Identifier, + amount: u64, + user_fee_increase: UserFeeIncrease, + signer: S, + signing_withdrawal_key_to_use: Option<&IdentityPublicKey>, + nonce: IdentityNonce, + _platform_version: &PlatformVersion, + _version: Option, + ) -> Result { + let mut transition: StateTransition = IdentityCreditTransferTransitionV0 { + identity_id: identity.id(), + recipient_id: to_identity_with_identifier, + amount, + nonce, + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + + let identity_public_key = match signing_withdrawal_key_to_use { + Some(key) => { + if signer.can_sign_with(key) { + key + } else { + return Err( + ProtocolError::DesiredKeyWithTypePurposeSecurityLevelMissing( + "specified transfer public key cannot be used for signing".to_string(), + ), + ); + } + } + None => { + let key = identity + .get_first_public_key_matching( + Purpose::TRANSFER, + SecurityLevel::full_range().into(), + KeyType::all_key_types().into(), + true, + ) + .ok_or_else(|| { + ProtocolError::DesiredKeyWithTypePurposeSecurityLevelMissing( + "no transfer public key".to_string(), + ) + })?; + key + } + }; + + transition.sign_external( + identity_public_key, + &signer, + None::, + )?; -impl IdentityCreditTransferTransitionMethodsV0 for IdentityCreditTransferTransitionV0 {} + Ok(transition) + } +} diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/mod.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/mod.rs index 4c2e0a22a3..74d2b39661 100644 --- a/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/mod.rs +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/mod.rs @@ -7,6 +7,7 @@ pub mod v2; pub struct DPPStateTransitionConversionVersions { pub identity_to_identity_create_transition: FeatureVersion, pub identity_to_identity_top_up_transition: FeatureVersion, + pub identity_to_identity_transfer_transition: FeatureVersion, pub identity_to_identity_withdrawal_transition: FeatureVersion, pub identity_to_identity_create_transition_with_signer: FeatureVersion, } diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/v1.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/v1.rs index d465374250..a6ce094346 100644 --- a/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/v1.rs +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/v1.rs @@ -4,6 +4,7 @@ pub const STATE_TRANSITION_CONVERSION_VERSIONS_V1: DPPStateTransitionConversionV DPPStateTransitionConversionVersions { identity_to_identity_create_transition: 0, identity_to_identity_top_up_transition: 0, + identity_to_identity_transfer_transition: 0, identity_to_identity_withdrawal_transition: 0, identity_to_identity_create_transition_with_signer: 0, }; diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/v2.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/v2.rs index 17fd17bd94..fb38e3ebd7 100644 --- a/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/v2.rs +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_conversion_versions/v2.rs @@ -4,6 +4,7 @@ pub const STATE_TRANSITION_CONVERSION_VERSIONS_V2: DPPStateTransitionConversionV DPPStateTransitionConversionVersions { identity_to_identity_create_transition: 0, identity_to_identity_top_up_transition: 0, + identity_to_identity_transfer_transition: 0, identity_to_identity_withdrawal_transition: 1, identity_to_identity_create_transition_with_signer: 0, }; diff --git a/packages/rs-sdk/src/platform/transition.rs b/packages/rs-sdk/src/platform/transition.rs index 490bc40090..6bd51a3b2e 100644 --- a/packages/rs-sdk/src/platform/transition.rs +++ b/packages/rs-sdk/src/platform/transition.rs @@ -9,6 +9,7 @@ pub mod put_document; pub mod put_identity; pub mod put_settings; pub mod top_up_identity; +pub mod transfer; pub mod transfer_document; mod txid; pub mod update_price_of_document; diff --git a/packages/rs-sdk/src/platform/transition/transfer.rs b/packages/rs-sdk/src/platform/transition/transfer.rs new file mode 100644 index 0000000000..bf330a1024 --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/transfer.rs @@ -0,0 +1,67 @@ +use dpp::identifier::Identifier; +use dpp::identity::accessors::IdentityGettersV0; + +use crate::platform::transition::broadcast::BroadcastStateTransition; +use crate::platform::transition::put_settings::PutSettings; +use crate::{Error, Sdk}; +use dpp::identity::signer::Signer; +use dpp::identity::{Identity, IdentityPublicKey}; +use dpp::state_transition::identity_credit_transfer_transition::methods::IdentityCreditTransferTransitionMethodsV0; +use dpp::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; +use dpp::state_transition::proof_result::StateTransitionProofResult; + +#[async_trait::async_trait] +pub trait TransferToIdentity { + /// Function to transfer credits from an identity to another identity. Returns the final + /// identity balance. + /// + /// If signing_transfer_key_to_use is not set, we will try to use one in the signer that is + /// available for the transfer. + async fn transfer_credits( + &self, + sdk: &Sdk, + to_identity_id: Identifier, + amount: u64, + signing_transfer_key_to_use: Option<&IdentityPublicKey>, + signer: S, + settings: Option, + ) -> Result; +} + +#[async_trait::async_trait] +impl TransferToIdentity for Identity { + async fn transfer_credits( + &self, + sdk: &Sdk, + to_identity_id: Identifier, + amount: u64, + signing_transfer_key_to_use: Option<&IdentityPublicKey>, + signer: S, + settings: Option, + ) -> Result { + let new_identity_nonce = sdk.get_identity_nonce(self.id(), true, settings).await?; + let user_fee_increase = settings.and_then(|settings| settings.user_fee_increase); + let state_transition = IdentityCreditTransferTransition::try_from_identity( + self, + to_identity_id, + amount, + user_fee_increase.unwrap_or_default(), + signer, + signing_transfer_key_to_use, + new_identity_nonce, + sdk.version(), + None, + )?; + + let result = state_transition.broadcast_and_wait(sdk, None).await?; + + match result { + StateTransitionProofResult::VerifiedPartialIdentity(identity) => { + identity.balance.ok_or(Error::DapiClientError( + "expected an identity balance after transfer".to_string(), + )) + } + _ => Err(Error::DapiClientError("proved a non identity".to_string())), + } + } +} From 7c040e8f165d0c3bb005130520200d33e585add3 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Wed, 30 Oct 2024 16:58:28 +0700 Subject: [PATCH 84/90] fix(platform)!: rotate always to top quorum (#2290) Co-authored-by: Ivan Shumkov --- .../block_end/validator_set_update/mod.rs | 8 +- .../block_end/validator_set_update/v2/mod.rs | 221 ++++++++++++++++++ .../drive_abci_method_versions/mod.rs | 1 + .../drive_abci_method_versions/v4.rs | 121 ++++++++++ .../rs-platform-version/src/version/mod.rs | 5 +- .../src/version/protocol_version.rs | 12 +- .../rs-platform-version/src/version/v5.rs | 64 +++++ 7 files changed, 426 insertions(+), 6 deletions(-) create mode 100644 packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v2/mod.rs create mode 100644 packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v4.rs create mode 100644 packages/rs-platform-version/src/version/v5.rs diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/mod.rs index af0e181b66..25922cdf19 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/mod.rs @@ -1,5 +1,6 @@ mod v0; mod v1; +mod v2; use crate::error::execution::ExecutionError; use crate::error::Error; @@ -58,9 +59,14 @@ where platform_state, block_execution_context, ), + 2 => self.validator_set_update_v2( + proposer_pro_tx_hash, + platform_state, + block_execution_context, + ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "validator_set_update".to_string(), - known_versions: vec![0, 1], + known_versions: vec![0, 1, 2], received: version, })), } diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v2/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v2/mod.rs new file mode 100644 index 0000000000..6fc9f86b7d --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v2/mod.rs @@ -0,0 +1,221 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::execution::types::block_execution_context::v0::{ + BlockExecutionContextV0Getters, BlockExecutionContextV0MutableGetters, +}; +use crate::execution::types::block_execution_context::BlockExecutionContext; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::platform_types::platform_state::PlatformState; +use crate::platform_types::validator_set::v0::ValidatorSetV0Getters; +use crate::rpc::core::CoreRPCLike; +use itertools::Itertools; + +use crate::platform_types::validator_set::ValidatorSetExt; +use dpp::dashcore::hashes::Hash; +use tenderdash_abci::proto::abci::ValidatorSetUpdate; + +impl Platform +where + C: CoreRPCLike, +{ + /// We need to validate against the platform state for rotation and not the block execution + /// context state + /// We introduced v1 because the end quorums could be rotating out, giving a small advantage + /// to proposers with a smaller pro_tx_hash + /// To understand this imagine we have proposers + /// `a b c d e f g h i j k` in quorum 24 + /// c is the current proposer + /// Quorum 24 no longer is valid + /// We jump to quorum 0. + /// a b and c just got paid, but the rest did not. + #[inline(always)] + pub(super) fn validator_set_update_v2( + &self, + proposer_pro_tx_hash: [u8; 32], + platform_state: &PlatformState, + block_execution_context: &mut BlockExecutionContext, + ) -> Result, Error> { + let mut perform_rotation = false; + + if let Some(validator_set) = block_execution_context + .block_platform_state() + .validator_sets() + .get(&platform_state.current_validator_set_quorum_hash()) + { + if let Some((last_member_pro_tx_hash, _)) = validator_set.members().last_key_value() { + // we should also perform a rotation if the validator set went through all quorum members + // this means we are at the last member of the quorum + if last_member_pro_tx_hash.as_byte_array() == &proposer_pro_tx_hash { + tracing::debug!( + method = "validator_set_update_v2", + "rotation: quorum finished as we hit last member {} of quorum {}. All known quorums are: [{}]. quorum rotation expected", + hex::encode(proposer_pro_tx_hash), + hex::encode(platform_state.current_validator_set_quorum_hash().as_byte_array()), + block_execution_context + .block_platform_state() + .validator_sets() + .keys() + .map(hex::encode).collect::>().join(" | "), + ); + perform_rotation = true; + } + } else { + // the validator set has no members, very weird, but let's just perform a rotation + tracing::debug!( + method = "validator_set_update_v2", + "rotation: validator set has no members", + ); + perform_rotation = true; + } + + // We should also perform a rotation if there are more than one quorum in the system + // and that the new proposer is on the same quorum and the last proposer but is before + // them in the list of proposers. + // This only works if Tenderdash goes through proposers properly + if &platform_state.last_committed_quorum_hash() + == platform_state + .current_validator_set_quorum_hash() + .as_byte_array() + && platform_state.last_committed_block_proposer_pro_tx_hash() > proposer_pro_tx_hash + && platform_state.validator_sets().len() > 1 + { + // 1 - We haven't changed quorums + // 2 - The new proposer is before the old proposer + // 3 - There are more than one quorum in the system + tracing::debug!( + method = "validator_set_update_v2", + "rotation: quorum finished as we hit last an earlier member {} than last block proposer {} for quorum {}. All known quorums are: [{}]. quorum rotation expected", + hex::encode(proposer_pro_tx_hash), + hex::encode(block_execution_context.block_platform_state().last_committed_block_proposer_pro_tx_hash()), + hex::encode(platform_state.current_validator_set_quorum_hash().as_byte_array()), + block_execution_context + .block_platform_state() + .validator_sets() + .keys() + .map(hex::encode).collect::>().join(" | "), + ); + perform_rotation = true; + } + } else { + // we also need to perform a rotation if the validator set is being removed + tracing::debug!( + method = "validator_set_update_v2", + "rotation: new quorums not containing current quorum current {:?}, {}. quorum rotation expected", + block_execution_context + .block_platform_state() + .validator_sets() + .keys() + .map(|quorum_hash| format!("{}", quorum_hash)), + &platform_state.current_validator_set_quorum_hash() + ); + perform_rotation = true; + } + + //todo: (maybe) perform a rotation if quorum health is low + + if perform_rotation { + // get the index of the previous quorum + let mut index = platform_state + .validator_sets() + .get_index_of(&platform_state.current_validator_set_quorum_hash()) + .ok_or(Error::Execution(ExecutionError::CorruptedCachedState( + format!("perform_rotation: current validator set quorum hash {} not in current known validator sets [{}] processing block {}", platform_state.current_validator_set_quorum_hash(), platform_state + .validator_sets().keys().map(|quorum_hash| quorum_hash.to_string()).join(" | "), + platform_state.last_committed_block_height() + 1, + ))))?; + // we should rotate the quorum + let quorum_count = platform_state.validator_sets().len(); + match quorum_count { + 0 => Err(Error::Execution(ExecutionError::CorruptedCachedState( + "no current quorums".to_string(), + ))), + 1 => Ok(None), // no rotation as we are the only quorum + count => { + let start_index = index; + let oldest_quorum_index_we_can_go_to = if count > 10 { + // if we have a lot of quorums (like on testnet and mainnet) + // we shouldn't start using the last ones as they could cycle out + count - 2 + } else { + count + }; + index = if index + 1 >= oldest_quorum_index_we_can_go_to { + 0 + } else { + index + 1 + }; + // We can't just take the next item because it might no longer be in the state + for _i in 0..oldest_quorum_index_we_can_go_to { + let (quorum_hash, _) = platform_state + .validator_sets() + .get_index(index) + .expect("expected next validator set"); + + // We still have it in the state + if let Some(new_validator_set) = block_execution_context + .block_platform_state() + .validator_sets() + .get(quorum_hash) + { + tracing::debug!( + method = "validator_set_update_v2", + "rotation: to new quorum: {} with {} members", + &quorum_hash, + new_validator_set.members().len() + ); + let validator_set_update = new_validator_set.to_update(); + block_execution_context + .block_platform_state_mut() + .set_next_validator_set_quorum_hash(Some(*quorum_hash)); + return Ok(Some(validator_set_update)); + } + index = (index + 1) % oldest_quorum_index_we_can_go_to; + if index == start_index { + break; + } + } + // All quorums changed + if let Some((quorum_hash, new_validator_set)) = block_execution_context + .block_platform_state() + .validator_sets() + .first() + { + tracing::debug!( + method = "validator_set_update_v2", + "rotation: all quorums changed, rotation to new quorum: {}", + &quorum_hash + ); + let validator_set_update = new_validator_set.to_update(); + let new_quorum_hash = *quorum_hash; + block_execution_context + .block_platform_state_mut() + .set_next_validator_set_quorum_hash(Some(new_quorum_hash)); + return Ok(Some(validator_set_update)); + } + tracing::debug!("no new quorums to choose from"); + Ok(None) + } + } + } else { + let current_validator_set = block_execution_context + .block_platform_state() + .current_validator_set()?; + if current_validator_set != platform_state.current_validator_set()? { + // Something changed, for example the IP of a validator changed, or someone's ban status + + tracing::debug!( + method = "validator_set_update_v2", + "validator set update without rotation" + ); + Ok(Some(current_validator_set.to_update())) + } else { + tracing::debug!( + method = "validator_set_update_v2", + "no validator set update", + ); + Ok(None) + } + } + } +} diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/mod.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/mod.rs index 5f6dacf380..48caab4b3c 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/mod.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/mod.rs @@ -3,6 +3,7 @@ use versioned_feature_core::{FeatureVersion, OptionalFeatureVersion}; pub mod v1; pub mod v2; pub mod v3; +pub mod v4; #[derive(Clone, Debug, Default)] pub struct DriveAbciMethodVersions { diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v4.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v4.rs new file mode 100644 index 0000000000..bedfb591c3 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v4.rs @@ -0,0 +1,121 @@ +use crate::version::drive_abci_versions::drive_abci_method_versions::{ + DriveAbciBlockEndMethodVersions, DriveAbciBlockFeeProcessingMethodVersions, + DriveAbciBlockStartMethodVersions, DriveAbciCoreBasedUpdatesMethodVersions, + DriveAbciCoreChainLockMethodVersionsAndConstants, DriveAbciCoreInstantSendLockMethodVersions, + DriveAbciEngineMethodVersions, DriveAbciEpochMethodVersions, + DriveAbciFeePoolInwardsDistributionMethodVersions, + DriveAbciFeePoolOutwardsDistributionMethodVersions, + DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, + DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, + DriveAbciPlatformStateStorageMethodVersions, DriveAbciProtocolUpgradeMethodVersions, + DriveAbciStateTransitionProcessingMethodVersions, DriveAbciVotingMethodVersions, +}; + +pub const DRIVE_ABCI_METHOD_VERSIONS_V4: DriveAbciMethodVersions = DriveAbciMethodVersions { + engine: DriveAbciEngineMethodVersions { + init_chain: 0, + check_tx: 0, + run_block_proposal: 0, + finalize_block_proposal: 0, + consensus_params_update: 1, + }, + initialization: DriveAbciInitializationMethodVersions { + initial_core_height_and_time: 0, + create_genesis_state: 0, + }, + core_based_updates: DriveAbciCoreBasedUpdatesMethodVersions { + update_core_info: 0, + update_masternode_list: 0, + update_quorum_info: 0, + masternode_updates: DriveAbciMasternodeIdentitiesUpdatesMethodVersions { + get_voter_identity_key: 0, + get_operator_identity_keys: 0, + get_owner_identity_withdrawal_key: 0, + get_owner_identity_owner_key: 0, + get_voter_identifier_from_masternode_list_item: 0, + get_operator_identifier_from_masternode_list_item: 0, + create_operator_identity: 0, + create_owner_identity: 1, + create_voter_identity: 0, + disable_identity_keys: 0, + update_masternode_identities: 0, + update_operator_identity: 0, + update_owner_withdrawal_address: 1, + update_voter_identity: 0, + }, + }, + protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { + check_for_desired_protocol_upgrade: 1, + upgrade_protocol_version_on_epoch_change: 0, + perform_events_on_first_block_of_protocol_change: Some(0), + protocol_version_upgrade_percentage_needed: 67, + }, + block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { + add_process_epoch_change_operations: 0, + process_block_fees: 0, + }, + core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants { + choose_quorum: 0, + verify_chain_lock: 0, + verify_chain_lock_locally: 0, + verify_chain_lock_through_core: 0, + make_sure_core_is_synced_to_chain_lock: 0, + recent_block_count_amount: 2, + }, + core_instant_send_lock: DriveAbciCoreInstantSendLockMethodVersions { + verify_recent_signature_locally: 0, + }, + fee_pool_inwards_distribution: DriveAbciFeePoolInwardsDistributionMethodVersions { + add_distribute_block_fees_into_pools_operations: 0, + add_distribute_storage_fee_to_epochs_operations: 0, + }, + fee_pool_outwards_distribution: DriveAbciFeePoolOutwardsDistributionMethodVersions { + add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations: 0, + add_epoch_pool_to_proposers_payout_operations: 0, + find_oldest_epoch_needing_payment: 0, + fetch_reward_shares_list_for_masternode: 0, + }, + withdrawals: DriveAbciIdentityCreditWithdrawalMethodVersions { + build_untied_withdrawal_transactions_from_documents: 0, + dequeue_and_build_unsigned_withdrawal_transactions: 0, + fetch_transactions_block_inclusion_status: 0, + pool_withdrawals_into_transactions_queue: 0, + update_broadcasted_withdrawal_statuses: 0, + rebroadcast_expired_withdrawal_documents: 0, + append_signatures_and_broadcast_withdrawal_transactions: 0, + cleanup_expired_locks_of_withdrawal_amounts: 0, + }, + voting: DriveAbciVotingMethodVersions { + keep_record_of_finished_contested_resource_vote_poll: 0, + clean_up_after_vote_poll_end: 0, + clean_up_after_contested_resources_vote_poll_end: 0, + check_for_ended_vote_polls: 0, + tally_votes_for_contested_document_resource_vote_poll: 0, + award_document_to_winner: 0, + delay_vote_poll: 0, + run_dao_platform_events: 0, + remove_votes_for_removed_masternodes: 0, + }, + state_transition_processing: DriveAbciStateTransitionProcessingMethodVersions { + execute_event: 0, + process_raw_state_transitions: 0, + decode_raw_state_transitions: 0, + validate_fees_of_event: 0, + }, + epoch: DriveAbciEpochMethodVersions { + gather_epoch_info: 0, + get_genesis_time: 0, + }, + block_start: DriveAbciBlockStartMethodVersions { + clear_drive_block_cache: 0, + }, + block_end: DriveAbciBlockEndMethodVersions { + update_state_cache: 0, + update_drive_cache: 0, + validator_set_update: 2, + }, + platform_state_storage: DriveAbciPlatformStateStorageMethodVersions { + fetch_platform_state: 0, + store_platform_state: 0, + }, +}; diff --git a/packages/rs-platform-version/src/version/mod.rs b/packages/rs-platform-version/src/version/mod.rs index 489aa21cc4..5c9f2d2942 100644 --- a/packages/rs-platform-version/src/version/mod.rs +++ b/packages/rs-platform-version/src/version/mod.rs @@ -1,5 +1,5 @@ mod protocol_version; -use crate::version::v4::PROTOCOL_VERSION_4; +use crate::version::v5::PROTOCOL_VERSION_5; pub use protocol_version::*; mod consensus_versions; @@ -16,8 +16,9 @@ pub mod v1; pub mod v2; pub mod v3; pub mod v4; +pub mod v5; pub type ProtocolVersion = u32; -pub const LATEST_VERSION: ProtocolVersion = PROTOCOL_VERSION_4; +pub const LATEST_VERSION: ProtocolVersion = PROTOCOL_VERSION_5; pub const INITIAL_PROTOCOL_VERSION: ProtocolVersion = 1; diff --git a/packages/rs-platform-version/src/version/protocol_version.rs b/packages/rs-platform-version/src/version/protocol_version.rs index dc408cc613..67f1b96754 100644 --- a/packages/rs-platform-version/src/version/protocol_version.rs +++ b/packages/rs-platform-version/src/version/protocol_version.rs @@ -19,6 +19,7 @@ use crate::version::system_limits::SystemLimits; use crate::version::v2::PLATFORM_V2; use crate::version::v3::PLATFORM_V3; use crate::version::v4::PLATFORM_V4; +use crate::version::v5::PLATFORM_V5; use crate::version::ProtocolVersion; pub use versioned_feature_core::*; @@ -34,8 +35,13 @@ pub struct PlatformVersion { pub system_limits: SystemLimits, } -pub const PLATFORM_VERSIONS: &[PlatformVersion] = - &[PLATFORM_V1, PLATFORM_V2, PLATFORM_V3, PLATFORM_V4]; +pub const PLATFORM_VERSIONS: &[PlatformVersion] = &[ + PLATFORM_V1, + PLATFORM_V2, + PLATFORM_V3, + PLATFORM_V4, + PLATFORM_V5, +]; #[cfg(feature = "mock-versions")] // We use OnceLock to be able to modify the version mocks @@ -43,7 +49,7 @@ pub static PLATFORM_TEST_VERSIONS: OnceLock> = OnceLock::ne #[cfg(feature = "mock-versions")] const DEFAULT_PLATFORM_TEST_VERSIONS: &[PlatformVersion] = &[TEST_PLATFORM_V2, TEST_PLATFORM_V3]; -pub const LATEST_PLATFORM_VERSION: &PlatformVersion = &PLATFORM_V4; +pub const LATEST_PLATFORM_VERSION: &PlatformVersion = &PLATFORM_V5; pub const DESIRED_PLATFORM_VERSION: &PlatformVersion = LATEST_PLATFORM_VERSION; diff --git a/packages/rs-platform-version/src/version/v5.rs b/packages/rs-platform-version/src/version/v5.rs new file mode 100644 index 0000000000..988531b3d0 --- /dev/null +++ b/packages/rs-platform-version/src/version/v5.rs @@ -0,0 +1,64 @@ +use crate::version::consensus_versions::ConsensusVersions; +use crate::version::dpp_versions::dpp_asset_lock_versions::v1::DPP_ASSET_LOCK_VERSIONS_V1; +use crate::version::dpp_versions::dpp_contract_versions::v1::CONTRACT_VERSIONS_V1; +use crate::version::dpp_versions::dpp_costs_versions::v1::DPP_COSTS_VERSIONS_V1; +use crate::version::dpp_versions::dpp_document_versions::v1::DOCUMENT_VERSIONS_V1; +use crate::version::dpp_versions::dpp_factory_versions::v1::DPP_FACTORY_VERSIONS_V1; +use crate::version::dpp_versions::dpp_identity_versions::v1::IDENTITY_VERSIONS_V1; +use crate::version::dpp_versions::dpp_method_versions::v1::DPP_METHOD_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_conversion_versions::v2::STATE_TRANSITION_CONVERSION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_state_transition_method_versions::v1::STATE_TRANSITION_METHOD_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_serialization_versions::v1::STATE_TRANSITION_SERIALIZATION_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_versions::v2::STATE_TRANSITION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_validation_versions::v2::DPP_VALIDATION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_voting_versions::v2::VOTING_VERSION_V2; +use crate::version::dpp_versions::DPPVersion; +use crate::version::drive_abci_versions::drive_abci_method_versions::v4::DRIVE_ABCI_METHOD_VERSIONS_V4; +use crate::version::drive_abci_versions::drive_abci_query_versions::v1::DRIVE_ABCI_QUERY_VERSIONS_V1; +use crate::version::drive_abci_versions::drive_abci_structure_versions::v1::DRIVE_ABCI_STRUCTURE_VERSIONS_V1; +use crate::version::drive_abci_versions::drive_abci_validation_versions::v3::DRIVE_ABCI_VALIDATION_VERSIONS_V3; +use crate::version::drive_abci_versions::drive_abci_withdrawal_constants::v2::DRIVE_ABCI_WITHDRAWAL_CONSTANTS_V2; +use crate::version::drive_abci_versions::DriveAbciVersion; +use crate::version::drive_versions::v2::DRIVE_VERSION_V2; +use crate::version::fee::v1::FEE_VERSION1; +use crate::version::protocol_version::PlatformVersion; +use crate::version::system_data_contract_versions::v1::SYSTEM_DATA_CONTRACT_VERSIONS_V1; +use crate::version::system_limits::v1::SYSTEM_LIMITS_V1; +use crate::version::ProtocolVersion; + +pub const PROTOCOL_VERSION_5: ProtocolVersion = 5; + +/// This version added a fix to withdrawals so we would rotate to first quorum always. + +pub const PLATFORM_V5: PlatformVersion = PlatformVersion { + protocol_version: PROTOCOL_VERSION_5, + drive: DRIVE_VERSION_V2, + drive_abci: DriveAbciVersion { + structs: DRIVE_ABCI_STRUCTURE_VERSIONS_V1, + methods: DRIVE_ABCI_METHOD_VERSIONS_V4, // changed to v4 + validation_and_processing: DRIVE_ABCI_VALIDATION_VERSIONS_V3, + withdrawal_constants: DRIVE_ABCI_WITHDRAWAL_CONSTANTS_V2, + query: DRIVE_ABCI_QUERY_VERSIONS_V1, + }, + dpp: DPPVersion { + costs: DPP_COSTS_VERSIONS_V1, + validation: DPP_VALIDATION_VERSIONS_V2, + state_transition_serialization_versions: STATE_TRANSITION_SERIALIZATION_VERSIONS_V1, + state_transition_conversion_versions: STATE_TRANSITION_CONVERSION_VERSIONS_V2, + state_transition_method_versions: STATE_TRANSITION_METHOD_VERSIONS_V1, + state_transitions: STATE_TRANSITION_VERSIONS_V2, + contract_versions: CONTRACT_VERSIONS_V1, + document_versions: DOCUMENT_VERSIONS_V1, + identity_versions: IDENTITY_VERSIONS_V1, + voting_versions: VOTING_VERSION_V2, + asset_lock_versions: DPP_ASSET_LOCK_VERSIONS_V1, + methods: DPP_METHOD_VERSIONS_V1, + factory_versions: DPP_FACTORY_VERSIONS_V1, + }, + system_data_contracts: SYSTEM_DATA_CONTRACT_VERSIONS_V1, + fee_version: FEE_VERSION1, + system_limits: SYSTEM_LIMITS_V1, + consensus: ConsensusVersions { + tenderdash_consensus_version: 1, + }, +}; From 5d82ecac0ce45485725cdfc5919f941a04ffc856 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Wed, 30 Oct 2024 18:05:36 +0700 Subject: [PATCH 85/90] chore(release): update changelog and bump version to 1.5.0-rc.1 (#2291) --- CHANGELOG.md | 43 ++++++++++++++++ Cargo.lock | 50 +++++++++---------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/check-features/Cargo.toml | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- .../configs/getConfigFileMigrationsFactory.js | 3 ++ packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 45 files changed, 113 insertions(+), 67 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f90a4979b3..cdd50af756 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,46 @@ +## [1.5.0-rc.1](https://github.com/dashpay/platform/compare/v1.4.1...v1.5.0-rc.1) (2024-10-30) + + +### ⚠ BREAKING CHANGES + +* **sdk:** return consensus errors from broadcast methods (#2274) +* **sdk:** provide request execution information (#2259) +* **sdk:** wrong order of objects returned by Drive (#2207) + +### Features + +* **dashmate:** add protocol version to the status command ([#2255](https://github.com/dashpay/platform/issues/2255)) +* **sdk:** added transfer transition to rs-sdk ([#2289](https://github.com/dashpay/platform/issues/2289)) +* **sdk:** detect stale nodes ([#2254](https://github.com/dashpay/platform/issues/2254)) +* **sdk:** provide request execution information ([#2259](https://github.com/dashpay/platform/issues/2259)) +* **sdk:** return consensus errors from broadcast methods ([#2274](https://github.com/dashpay/platform/issues/2274)) +* **sdk:** sdk-level retry logic for `fetch` and `fetch_many` ([#2266](https://github.com/dashpay/platform/issues/2266)) + + +### Bug Fixes + +* **dapi:** invalid state transition failed with already in chain error ([#2270](https://github.com/dashpay/platform/issues/2270)) +* **dashmate:** invalid drive status check ([#2248](https://github.com/dashpay/platform/issues/2248)) +* **dashmate:** invalid platform version in the status command ([#2249](https://github.com/dashpay/platform/issues/2249)) +* document query start to support pagination ([#2284](https://github.com/dashpay/platform/issues/2284)) +* **sdk:** `AddressListError` is private ([#2278](https://github.com/dashpay/platform/issues/2278)) +* **sdk:** opposite retry trigger ([#2265](https://github.com/dashpay/platform/issues/2265)) +* **sdk:** wrong order of objects returned by Drive ([#2207](https://github.com/dashpay/platform/issues/2207)) +* seed nodes aren't responding ([#2276](https://github.com/dashpay/platform/issues/2276)) + + +### Miscellaneous Chores + +* add partial eq to document query ([#2253](https://github.com/dashpay/platform/issues/2253)) +* **dashmate:** report port check errors ([#2245](https://github.com/dashpay/platform/issues/2245)) +* move BLS Sigs import to Rust Dash Core ([#2252](https://github.com/dashpay/platform/issues/2252)) +* update to latest rust dash core with x11 optional ([#2251](https://github.com/dashpay/platform/issues/2251)) + + +### Code Refactoring + +* platform version refactoring into sub versions ([#2269](https://github.com/dashpay/platform/issues/2269)) + ### [1.4.1](https://github.com/dashpay/platform/compare/v1.4.0...v1.4.1) (2024-10-12) diff --git a/Cargo.lock b/Cargo.lock index 8f0f966db1..f88a4fcab4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -676,7 +676,7 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "check-features" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "toml", ] @@ -1045,7 +1045,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1061,7 +1061,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "dapi-grpc", "heck 0.5.0", @@ -1106,7 +1106,7 @@ dependencies = [ [[package]] name = "dash-sdk" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "arc-swap", "async-trait", @@ -1212,7 +1212,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "platform-value", "platform-version", @@ -1222,7 +1222,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1353,7 +1353,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "platform-value", "platform-version", @@ -1363,7 +1363,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "anyhow", "assert_matches", @@ -1413,7 +1413,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "arc-swap", "assert_matches", @@ -1454,7 +1454,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "arc-swap", "assert_matches", @@ -1508,7 +1508,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "bincode", "dapi-grpc", @@ -1730,7 +1730,7 @@ checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "feature-flags-contract" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "platform-value", "platform-version", @@ -2595,7 +2595,7 @@ dependencies = [ [[package]] name = "json-schema-compatibility-validator" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "assert_matches", "json-patch", @@ -2753,7 +2753,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "platform-value", "platform-version", @@ -3333,7 +3333,7 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "platform-serialization" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "bincode", "platform-version", @@ -3341,7 +3341,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -3351,7 +3351,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "base64 0.22.1", "bincode", @@ -3372,7 +3372,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "quote", "syn 2.0.75", @@ -3380,7 +3380,7 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "bincode", "grovedb-version", @@ -3391,7 +3391,7 @@ dependencies = [ [[package]] name = "platform-versioning" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "proc-macro2", "quote", @@ -3877,7 +3877,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "backon", "chrono", @@ -4333,7 +4333,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "base64 0.22.1", "bincode", @@ -4399,7 +4399,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "bincode", "dpp", @@ -5318,7 +5318,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "anyhow", "async-trait", @@ -5620,7 +5620,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.4.1" +version = "1.5.0-rc.1" dependencies = [ "num_enum 0.5.11", "platform-value", diff --git a/package.json b/package.json index c1a993ced1..922ed4e1fb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.4.1", + "version": "1.5.0-rc.1", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index 1e6befe213..c852ab77a3 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.4.1", + "version": "1.5.0-rc.1", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/check-features/Cargo.toml b/packages/check-features/Cargo.toml index de43293845..c838ae9295 100644 --- a/packages/check-features/Cargo.toml +++ b/packages/check-features/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "check-features" -version = "1.4.1" +version = "1.5.0-rc.1" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index 14aa3139be..be3b39b848 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.4.1" +version = "1.5.0-rc.1" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index 2fd2bf508a..b1bbf0d65d 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.4.1", + "version": "1.5.0-rc.1", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index a6f52bdc50..fa58af27d9 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.4.1", + "version": "1.5.0-rc.1", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index de71743fa0..3ce1b85e8e 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "2.4.1", + "version": "2.5.0-rc.1", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/configs/getConfigFileMigrationsFactory.js b/packages/dashmate/configs/getConfigFileMigrationsFactory.js index 862f3abee3..3e503e3124 100644 --- a/packages/dashmate/configs/getConfigFileMigrationsFactory.js +++ b/packages/dashmate/configs/getConfigFileMigrationsFactory.js @@ -1029,6 +1029,9 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) if (options.network === NETWORK_TESTNET && name !== 'base') { options.platform.drive.tenderdash.p2p.seeds = testnet.get('platform.drive.tenderdash.p2p.seeds'); } + + options.platform.drive.abci.docker.image = 'dashpay/drive:1-rc'; + options.platform.dapi.api.docker.image = 'dashpay/dapi:1-rc'; }); return configFile; }, diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index 6620a2fc3f..e665842008 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.4.1", + "version": "1.5.0-rc.1", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index 35a591d48c..fe77dd7902 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.4.1" +version = "1.5.0-rc.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index 74bdc33f77..f75f2bd096 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.4.1", + "version": "1.5.0-rc.1", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index 21b309f881..af8b3a30d0 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.4.1" +version = "1.5.0-rc.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 0841354e40..6dd1403245 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.4.1" +version = "1.5.0-rc.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index 98701984c1..192af93cbd 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.4.1", + "version": "1.5.0-rc.1", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index 0a52c83f22..2dcd36de3a 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.4.1" +version = "1.5.0-rc.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index 2c46c68e82..9f7016dc7f 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.4.1", + "version": "1.5.0-rc.1", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index a3d72af982..6477a3a3d7 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.4.1", + "version": "1.5.0-rc.1", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index 5f232ba903..48ef281b2b 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.4.1", + "version": "4.5.0-rc.1", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index ee51714414..8c4a817245 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.4.1", + "version": "1.5.0-rc.1", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index e7b8c4a298..042f3d5019 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.4.1" +version = "1.5.0-rc.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index 8682f46915..ed3c4e3d9d 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.4.1", + "version": "1.5.0-rc.1", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index 8655c8deac..bb92b21b78 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.4.1", + "version": "1.5.0-rc.1", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index e8ffd41a9c..5591f7610d 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.4.1" +version = "1.5.0-rc.1" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index 8df0883193..7cb8cc73d3 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.4.1" +version = "1.5.0-rc.1" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 591a86701d..5f66794e38 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.4.1" +version = "1.5.0-rc.1" edition = "2021" rust-version.workspace = true authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 7e8346fe95..892457b17c 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.4.1" +version = "1.5.0-rc.1" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index f46f844629..81fe019cc8 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.4.1" +version = "1.5.0-rc.1" edition = "2021" rust-version.workspace = true diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index ef9f1c4570..2db16fe0c9 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.4.1" +version = "1.5.0-rc.1" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-json-schema-compatibility-validator/Cargo.toml b/packages/rs-json-schema-compatibility-validator/Cargo.toml index 1bf215ed99..5add650213 100644 --- a/packages/rs-json-schema-compatibility-validator/Cargo.toml +++ b/packages/rs-json-schema-compatibility-validator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "json-schema-compatibility-validator" -version = "1.4.1" +version = "1.5.0-rc.1" edition = "2021" rust-version.workspace = true authors = ["Ivan Shumkov "] diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index 7f8296f4b4..8141f4d7f7 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.4.1" +version = "1.5.0-rc.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index b6c39cd79d..62c812b2ce 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.4.1" +version = "1.5.0-rc.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index ad17e9d567..25e5a0e8d8 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.4.1" +version = "1.5.0-rc.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index 15a35ffb22..6ce24dc659 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.4.1" +version = "1.5.0-rc.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 4113302c47..904b398f7f 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Versioning library for Platform" -version = "1.4.1" +version = "1.5.0-rc.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index 69916cbdee..f2d15da3b6 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.4.1" +version = "1.5.0-rc.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index cbb5e7fe93..ba1f021ecd 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dash-sdk" -version = "1.4.1" +version = "1.5.0-rc.1" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index 12bb07870d..f9e29d35b4 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.4.1" +version = "1.5.0-rc.1" edition = "2021" rust-version.workspace = true diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index 437d73457c..6b45b6d958 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.4.1" +version = "1.5.0-rc.1" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 9536e860ec..7ef4d54e99 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.4.1", + "version": "8.5.0-rc.1", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index e9bc972494..902d46b986 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.4.1" +version = "1.5.0-rc.1" edition = "2021" rust-version.workspace = true authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index 7821b424df..282458b0ba 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.4.1", + "version": "1.5.0-rc.1", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index 3f776fd03c..9b24e5390c 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.4.1" +version = "1.5.0-rc.1" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index 89cfc8ebd1..60f5570b15 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.4.1", + "version": "1.5.0-rc.1", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From 453b30c55cda49539ed9b3a8a8924d810b0cc9a6 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 31 Oct 2024 22:43:25 +0700 Subject: [PATCH 86/90] fix(dashmate): zero ssl certificate draft not saved (#2297) --- .../ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js | 7 +++++++ .../src/ssl/zerossl/validateZeroSslCertificateFactory.js | 8 ++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js index ca679233d0..76aed5e6fc 100644 --- a/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js @@ -18,6 +18,8 @@ import { ERRORS } from '../../../../ssl/zerossl/validateZeroSslCertificateFactor * @param {VerificationServer} verificationServer * @param {HomeDir} homeDir * @param {validateZeroSslCertificate} validateZeroSslCertificate + * @param {ConfigFileJsonRepository} configFileRepository + * @param {ConfigFile} configFile * @return {obtainZeroSSLCertificateTask} */ export default function obtainZeroSSLCertificateTaskFactory( @@ -32,6 +34,8 @@ export default function obtainZeroSSLCertificateTaskFactory( verificationServer, homeDir, validateZeroSslCertificate, + configFileRepository, + configFile, ) { /** * @typedef {obtainZeroSSLCertificateTask} @@ -141,6 +145,9 @@ export default function obtainZeroSSLCertificateTaskFactory( config.set('platform.gateway.ssl.enabled', true); config.set('platform.gateway.ssl.provider', 'zerossl'); config.set('platform.gateway.ssl.providerConfigs.zerossl.id', ctx.certificate.id); + + // Save config file + configFileRepository.write(configFile); }, }, { diff --git a/packages/dashmate/src/ssl/zerossl/validateZeroSslCertificateFactory.js b/packages/dashmate/src/ssl/zerossl/validateZeroSslCertificateFactory.js index 20b221216c..53f3da5b56 100644 --- a/packages/dashmate/src/ssl/zerossl/validateZeroSslCertificateFactory.js +++ b/packages/dashmate/src/ssl/zerossl/validateZeroSslCertificateFactory.js @@ -104,10 +104,7 @@ export default function validateZeroSslCertificateFactory(homeDir, getCertificat } if (['pending_validation', 'draft'].includes(data.certificate.status)) { - // Certificate is already created, so we just need to pass validation - // and download certificate file - - // We need to download new certificate bundle + // We need to validate and download new certificate bundle data.isBundleFilePresent = false; return { @@ -116,6 +113,9 @@ export default function validateZeroSslCertificateFactory(homeDir, getCertificat }; } + // Certificate is already created at this point, so we just need to pass validation + // and download certificate file + if (data.certificate.status !== 'issued' || data.isExpiresSoon) { // Certificate is going to expire soon, or current certificate is not valid // we need to obtain a new one From d1ba61d4734c5c5e666318f35941b9782e6583eb Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 1 Nov 2024 01:10:58 +0700 Subject: [PATCH 87/90] fix(dashmate): cleanup zerossl certs command (#2298) --- packages/dashmate/src/commands/ssl/cleanup.js | 58 +++++++++++ packages/dashmate/src/commands/ssl/obtain.js | 2 +- packages/dashmate/src/createDIContainer.js | 5 + .../scheduleRenewZeroSslCertificateFactory.js | 2 +- .../cleanupZeroSSLCertificatesTaskFactory.js | 98 +++++++++++++++++++ .../obtainZeroSSLCertificateTaskFactory.js | 4 +- .../src/ssl/zerossl/cancelCertificate.js | 2 +- .../src/ssl/zerossl/listCertificates.js | 10 +- 8 files changed, 174 insertions(+), 7 deletions(-) create mode 100644 packages/dashmate/src/commands/ssl/cleanup.js create mode 100644 packages/dashmate/src/listr/tasks/ssl/zerossl/cleanupZeroSSLCertificatesTaskFactory.js diff --git a/packages/dashmate/src/commands/ssl/cleanup.js b/packages/dashmate/src/commands/ssl/cleanup.js new file mode 100644 index 0000000000..eaef76cf49 --- /dev/null +++ b/packages/dashmate/src/commands/ssl/cleanup.js @@ -0,0 +1,58 @@ +import { Listr } from 'listr2'; +import { Flags } from '@oclif/core'; +import ConfigBaseCommand from '../../oclif/command/ConfigBaseCommand.js'; +import MuteOneLineError from '../../oclif/errors/MuteOneLineError.js'; + +export default class CleanupCommand extends ConfigBaseCommand { + static description = `Cleanup Zero SSL certificate + +Cancel all drafted or pending validation certificates on ZeroSSL +`; + + static flags = { + ...ConfigBaseCommand.flags, + verbose: Flags.boolean({ char: 'v', description: 'use verbose mode for output', default: false }), + }; + + /** + * @param {Object} args + * @param {Object} flags + * @param {boolean} flags.verbose + * @param {Config} config + * @param {cleanupZeroSSLCertificatesTask} cleanupZeroSSLCertificatesTask + * @return {Promise} + */ + async runWithDependencies( + args, + { + verbose: isVerbose, + }, + config, + cleanupZeroSSLCertificatesTask, + ) { + const tasks = new Listr( + [ + { + title: 'Cleanup ZeroSSL certificate', + task: () => cleanupZeroSSLCertificatesTask(config), + }, + ], + { + renderer: isVerbose ? 'verbose' : 'default', + rendererOptions: { + showTimer: isVerbose, + clearOutput: false, + collapse: false, + showSubtasks: true, + removeEmptyLines: false, + }, + }, + ); + + try { + await tasks.run(); + } catch (e) { + throw new MuteOneLineError(e); + } + } +} diff --git a/packages/dashmate/src/commands/ssl/obtain.js b/packages/dashmate/src/commands/ssl/obtain.js index cc39f1a47a..4dbfcd3561 100644 --- a/packages/dashmate/src/commands/ssl/obtain.js +++ b/packages/dashmate/src/commands/ssl/obtain.js @@ -45,7 +45,7 @@ Certificate will be renewed if it is about to expire (see 'expiration-days' flag [ { title: 'Obtain ZeroSSL certificate', - task: async () => obtainZeroSSLCertificateTask(config), + task: () => obtainZeroSSLCertificateTask(config), }, ], { diff --git a/packages/dashmate/src/createDIContainer.js b/packages/dashmate/src/createDIContainer.js index 9f3b861623..3b2e657d2b 100644 --- a/packages/dashmate/src/createDIContainer.js +++ b/packages/dashmate/src/createDIContainer.js @@ -23,6 +23,9 @@ import analyseSystemResourcesFactory from './doctor/analyse/analyseSystemResourc import analyseSamplesFactory from './doctor/analyseSamplesFactory.js'; import archiveSamples from './doctor/archiveSamples.js'; import unarchiveSamplesFactory from './doctor/unarchiveSamplesFactory.js'; +import cleanupZeroSSLCertificatesTaskFactory + from './listr/tasks/ssl/zerossl/cleanupZeroSSLCertificatesTaskFactory.js'; +import cancelCertificate from './ssl/zerossl/cancelCertificate.js'; import renderTemplateFactory from './templates/renderTemplateFactory.js'; import renderServiceTemplatesFactory from './templates/renderServiceTemplatesFactory.js'; @@ -206,6 +209,7 @@ export default async function createDIContainer(options = {}) { downloadCertificate: asValue(downloadCertificate), getCertificate: asValue(getCertificate), listCertificates: asValue(listCertificates), + cancelCertificate: asValue(cancelCertificate), createSelfSignedCertificate: asValue(createSelfSignedCertificate), verificationServer: asClass(VerificationServer).singleton(), }); @@ -299,6 +303,7 @@ export default async function createDIContainer(options = {}) { enableCoreQuorumsTask: asFunction(enableCoreQuorumsTaskFactory).singleton(), registerMasternodeGuideTask: asFunction(registerMasternodeGuideTaskFactory).singleton(), obtainZeroSSLCertificateTask: asFunction(obtainZeroSSLCertificateTaskFactory).singleton(), + cleanupZeroSSLCertificatesTask: asFunction(cleanupZeroSSLCertificatesTaskFactory).singleton(), obtainSelfSignedCertificateTask: asFunction(obtainSelfSignedCertificateTaskFactory).singleton(), saveCertificateTask: asFunction(saveCertificateTaskFactory), reindexNodeTask: asFunction(reindexNodeTaskFactory).singleton(), diff --git a/packages/dashmate/src/helper/scheduleRenewZeroSslCertificateFactory.js b/packages/dashmate/src/helper/scheduleRenewZeroSslCertificateFactory.js index c403c2bef3..8d741511dd 100644 --- a/packages/dashmate/src/helper/scheduleRenewZeroSslCertificateFactory.js +++ b/packages/dashmate/src/helper/scheduleRenewZeroSslCertificateFactory.js @@ -51,7 +51,7 @@ export default function scheduleRenewZeroSslCertificateFactory( } const job = new CronJob(expiresAt, async () => { - const tasks = await obtainZeroSSLCertificateTask(config); + const tasks = obtainZeroSSLCertificateTask(config); await tasks.run({ expirationDays: Certificate.EXPIRATION_LIMIT_DAYS, diff --git a/packages/dashmate/src/listr/tasks/ssl/zerossl/cleanupZeroSSLCertificatesTaskFactory.js b/packages/dashmate/src/listr/tasks/ssl/zerossl/cleanupZeroSSLCertificatesTaskFactory.js new file mode 100644 index 0000000000..f38d62562d --- /dev/null +++ b/packages/dashmate/src/listr/tasks/ssl/zerossl/cleanupZeroSSLCertificatesTaskFactory.js @@ -0,0 +1,98 @@ +import chalk from 'chalk'; +import { Listr } from 'listr2'; +import { Observable } from 'rxjs'; +import wait from '../../../../util/wait.js'; + +/** + * @param {listCertificates} listCertificates + * @param {cancelCertificate} cancelCertificate + * @return {cleanupZeroSSLCertificatesTask} + */ +export default function cleanupZeroSSLCertificatesTaskFactory( + listCertificates, + cancelCertificate, +) { + /** + * @typedef {cleanupZeroSSLCertificatesTask} + * @param {Config} config + * @return {Listr} + */ + function cleanupZeroSSLCertificatesTask(config) { + const apiKey = config.get('platform.gateway.ssl.providerConfigs.zerossl.apiKey', true); + + return new Listr([ + { + title: 'Collect drafted and pending validation certificates', + // Skips the check if force flag is set + task: async (ctx, task) => { + ctx.certificates = []; + + let certificatesPerRequest = []; + let page = 1; + + // Fetch all certificates in draft or pending validation status + // with pagination + do { + certificatesPerRequest = await listCertificates(apiKey, ['draft', 'pending_validation'], page); + + ctx.certificates = ctx.certificates.concat(certificatesPerRequest); + + page += 1; + + // eslint-disable-next-line no-param-reassign + task.output = `Found ${ctx.certificates.length} certificates`; + } while (certificatesPerRequest.length === 1000); + + ctx.total = ctx.certificates.length; + }, + }, + { + title: 'Cancel certificates', + skip: (ctx) => ctx.certificates.length === 0, + task: async (ctx, task) => { + // eslint-disable-next-line no-param-reassign + task.title = `Cancel ${ctx.certificates.length} certificates`; + ctx.canceled = 0; + ctx.errored = 0; + return new Observable(async (observer) => { + for (const certificate of ctx.certificates) { + try { + await cancelCertificate(apiKey, certificate.id); + + ctx.canceled += 1; + } catch (e) { + ctx.errored += 1; + + if (process.env.DEBUG) { + // eslint-disable-next-line no-console + console.warn(e); + } + } + + observer.next(chalk`{green ${ctx.canceled}} / {red ${ctx.errored}} / ${ctx.total}`); + + await wait(100); + } + + if (ctx.errored > 0) { + observer.error(new Error('Some certificates were not canceled. Please try again.')); + } else { + observer.complete(); + } + + return this; + }); + }, + options: { + persistentOutput: true, + }, + }, + ], { + rendererOptions: { + showErrorMessage: true, + }, + }); + } + + return cleanupZeroSSLCertificatesTask; +} diff --git a/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js index 76aed5e6fc..71d7b7809b 100644 --- a/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js @@ -40,9 +40,9 @@ export default function obtainZeroSSLCertificateTaskFactory( /** * @typedef {obtainZeroSSLCertificateTask} * @param {Config} config - * @return {Promise} + * @return {Listr} */ - async function obtainZeroSSLCertificateTask(config) { + function obtainZeroSSLCertificateTask(config) { return new Listr([ { title: 'Check if certificate already exists and not expiring soon', diff --git a/packages/dashmate/src/ssl/zerossl/cancelCertificate.js b/packages/dashmate/src/ssl/zerossl/cancelCertificate.js index 5a4e131674..2d8f9dfa9b 100644 --- a/packages/dashmate/src/ssl/zerossl/cancelCertificate.js +++ b/packages/dashmate/src/ssl/zerossl/cancelCertificate.js @@ -1,4 +1,4 @@ -import requestApi from './requestApi'; +import requestApi from './requestApi.js'; /** * Get ZeroSSL certificate diff --git a/packages/dashmate/src/ssl/zerossl/listCertificates.js b/packages/dashmate/src/ssl/zerossl/listCertificates.js index 63dad29283..f7530cee4c 100644 --- a/packages/dashmate/src/ssl/zerossl/listCertificates.js +++ b/packages/dashmate/src/ssl/zerossl/listCertificates.js @@ -8,12 +8,18 @@ import Certificate from './Certificate.js'; * @param {string} apiKey * @param {String[]} [statuses] - possible values: draft, pending_validation, issued, cancelled, * revoked, expired. + * @param {number} [page] * @param {string} [search] * @return {Promise} */ -export default async function listCertificates(apiKey, statuses = [], search = undefined) { - let url = `https://api.zerossl.com/certificates?access_key=${apiKey}&limit=1000`; +export default async function listCertificates( + apiKey, + statuses = [], + page = 1, + search = undefined, +) { + let url = `https://api.zerossl.com/certificates?access_key=${apiKey}&limit=1000&page=${page}`; if (statuses.length > 0) { url += `&statuses=${statuses.join(',')}`; From 65e72dd60d72c5f786d28dc8768867db94f21938 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 1 Nov 2024 01:19:18 +0700 Subject: [PATCH 88/90] fix(dashmate): invalid mount path from helper (#2296) --- packages/dashmate/docker-compose.yml | 3 ++- packages/dashmate/docker/entrypoint.sh | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/dashmate/docker-compose.yml b/packages/dashmate/docker-compose.yml index 67aae0bfa9..fb4cb02b0f 100644 --- a/packages/dashmate/docker-compose.yml +++ b/packages/dashmate/docker-compose.yml @@ -17,13 +17,14 @@ services: environment: - LOCAL_UID=${LOCAL_UID:?err} - LOCAL_GID=${LOCAL_GID:?err} + - DASHMATE_HOME_DIR=${DASHMATE_HOME_DIR:?err} ports: - 127.0.0.1:${DASHMATE_HELPER_API_PORT:?err}:${DASHMATE_HELPER_API_PORT:?err} command: yarn workspace dashmate helper ${CONFIG_NAME:?err} expose: - ${DASHMATE_HELPER_API_PORT:?err} volumes: - - ${DASHMATE_HOME_DIR:?err}:/home/dashmate/.dashmate + - ${DASHMATE_HOME_DIR:?err}:${DASHMATE_HOME_DIR:?err} - /var/run/docker.sock:/var/run/docker.sock core: diff --git a/packages/dashmate/docker/entrypoint.sh b/packages/dashmate/docker/entrypoint.sh index 773f337a2f..852dcb4095 100755 --- a/packages/dashmate/docker/entrypoint.sh +++ b/packages/dashmate/docker/entrypoint.sh @@ -31,4 +31,4 @@ fi echo "Starting with UID: $USER_ID, GID: $GROUP_ID, USER: $USERNAME, GROUP: $GROUP" -exec su - $USERNAME -c "cd /platform;DASHMATE_HELPER=1 DASHMATE_HOME_DIR=/home/dashmate/.dashmate $*" +exec su $USERNAME -c "cd /platform;DASHMATE_HELPER=1 DASHMATE_HOME_DIR=$DASHMATE_HOME_DIR $*" From bacbd6dd494da1fbe2abd436fec77fd334051679 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 1 Nov 2024 01:25:51 +0700 Subject: [PATCH 89/90] chore(release): update changelog and bump version to 1.5.0-rc.2 (#2299) --- CHANGELOG.md | 14 ++++++ Cargo.lock | 50 +++++++++---------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/check-features/Cargo.toml | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 44 files changed, 81 insertions(+), 67 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cdd50af756..edd8ad7715 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +## [1.5.0-rc.2](https://github.com/dashpay/platform/compare/v1.5.0-rc.1...v1.5.0-rc.2) (2024-10-31) + + +### ⚠ BREAKING CHANGES + +* **platform:** rotate always to top quorum (#2290) + +### Bug Fixes + +* **dashmate:** cleanup zerossl certs command ([#2298](https://github.com/dashpay/platform/issues/2298)) +* **dashmate:** invalid mount path from helper ([#2296](https://github.com/dashpay/platform/issues/2296)) +* **dashmate:** zero ssl certificate draft not saved ([#2297](https://github.com/dashpay/platform/issues/2297)) +* **platform:** rotate always to top quorum ([#2290](https://github.com/dashpay/platform/issues/2290)) + ## [1.5.0-rc.1](https://github.com/dashpay/platform/compare/v1.4.1...v1.5.0-rc.1) (2024-10-30) diff --git a/Cargo.lock b/Cargo.lock index f88a4fcab4..190f4afaf0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -676,7 +676,7 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "check-features" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "toml", ] @@ -1045,7 +1045,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1061,7 +1061,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "dapi-grpc", "heck 0.5.0", @@ -1106,7 +1106,7 @@ dependencies = [ [[package]] name = "dash-sdk" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "arc-swap", "async-trait", @@ -1212,7 +1212,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "platform-value", "platform-version", @@ -1222,7 +1222,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1353,7 +1353,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "platform-value", "platform-version", @@ -1363,7 +1363,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "anyhow", "assert_matches", @@ -1413,7 +1413,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "arc-swap", "assert_matches", @@ -1454,7 +1454,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "arc-swap", "assert_matches", @@ -1508,7 +1508,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "bincode", "dapi-grpc", @@ -1730,7 +1730,7 @@ checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "feature-flags-contract" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "platform-value", "platform-version", @@ -2595,7 +2595,7 @@ dependencies = [ [[package]] name = "json-schema-compatibility-validator" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "assert_matches", "json-patch", @@ -2753,7 +2753,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "platform-value", "platform-version", @@ -3333,7 +3333,7 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "platform-serialization" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "bincode", "platform-version", @@ -3341,7 +3341,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "proc-macro2", "quote", @@ -3351,7 +3351,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "base64 0.22.1", "bincode", @@ -3372,7 +3372,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "quote", "syn 2.0.75", @@ -3380,7 +3380,7 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "bincode", "grovedb-version", @@ -3391,7 +3391,7 @@ dependencies = [ [[package]] name = "platform-versioning" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "proc-macro2", "quote", @@ -3877,7 +3877,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "backon", "chrono", @@ -4333,7 +4333,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "base64 0.22.1", "bincode", @@ -4399,7 +4399,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "bincode", "dpp", @@ -5318,7 +5318,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "anyhow", "async-trait", @@ -5620,7 +5620,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" dependencies = [ "num_enum 0.5.11", "platform-value", diff --git a/package.json b/package.json index 922ed4e1fb..70a7eaf635 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.5.0-rc.1", + "version": "1.5.0-rc.2", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index c852ab77a3..2ea83ce305 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.5.0-rc.1", + "version": "1.5.0-rc.2", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/check-features/Cargo.toml b/packages/check-features/Cargo.toml index c838ae9295..e9d885fe03 100644 --- a/packages/check-features/Cargo.toml +++ b/packages/check-features/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "check-features" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index be3b39b848..ee62898ad6 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index b1bbf0d65d..e96a1afaa9 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.5.0-rc.1", + "version": "1.5.0-rc.2", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index fa58af27d9..3486189004 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.5.0-rc.1", + "version": "1.5.0-rc.2", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index 3ce1b85e8e..bb46c30000 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "2.5.0-rc.1", + "version": "2.5.0-rc.2", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index e665842008..a458821921 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.5.0-rc.1", + "version": "1.5.0-rc.2", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index fe77dd7902..764b533ee3 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index f75f2bd096..928a5528e9 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.5.0-rc.1", + "version": "1.5.0-rc.2", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index af8b3a30d0..c378c67743 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 6dd1403245..88ed597f30 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index 192af93cbd..53230afb11 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.5.0-rc.1", + "version": "1.5.0-rc.2", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index 2dcd36de3a..a69a79d54c 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index 9f7016dc7f..45d7b15868 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.5.0-rc.1", + "version": "1.5.0-rc.2", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index 6477a3a3d7..841efeb132 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.5.0-rc.1", + "version": "1.5.0-rc.2", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index 48ef281b2b..747224eaab 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.5.0-rc.1", + "version": "4.5.0-rc.2", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index 8c4a817245..5cf67e5b62 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.5.0-rc.1", + "version": "1.5.0-rc.2", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index 042f3d5019..1cb070c6f0 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index ed3c4e3d9d..b0b9fc1aeb 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.5.0-rc.1", + "version": "1.5.0-rc.2", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index bb92b21b78..47f8ea81ae 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.5.0-rc.1", + "version": "1.5.0-rc.2", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index 5591f7610d..0150e899ba 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index 7cb8cc73d3..7ba8373114 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 5f66794e38..0d7dfcea04 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" edition = "2021" rust-version.workspace = true authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 892457b17c..425ab5308b 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 81fe019cc8..8351826d7c 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" edition = "2021" rust-version.workspace = true diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 2db16fe0c9..c5a0d6b955 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-json-schema-compatibility-validator/Cargo.toml b/packages/rs-json-schema-compatibility-validator/Cargo.toml index 5add650213..723c94abcc 100644 --- a/packages/rs-json-schema-compatibility-validator/Cargo.toml +++ b/packages/rs-json-schema-compatibility-validator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "json-schema-compatibility-validator" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" edition = "2021" rust-version.workspace = true authors = ["Ivan Shumkov "] diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index 8141f4d7f7..720db0a15d 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index 62c812b2ce..90a697e1b9 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index 25e5a0e8d8..0aa49a41c0 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index 6ce24dc659..afdb2f348f 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 904b398f7f..3830a7921b 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Versioning library for Platform" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index f2d15da3b6..ee150dafea 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index ba1f021ecd..67fc8bfeee 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dash-sdk" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index f9e29d35b4..bfd533e8ab 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" edition = "2021" rust-version.workspace = true diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index 6b45b6d958..b63983ab88 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 7ef4d54e99..0796343efb 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.5.0-rc.1", + "version": "8.5.0-rc.2", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index 902d46b986..7452aa8db8 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" edition = "2021" rust-version.workspace = true authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index 282458b0ba..6113ed7844 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.5.0-rc.1", + "version": "1.5.0-rc.2", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index 9b24e5390c..238ed3dbd7 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.5.0-rc.1" +version = "1.5.0-rc.2" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index 60f5570b15..2c17b7c9c5 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.5.0-rc.1", + "version": "1.5.0-rc.2", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From 8aa624e3e93e327ed01f8fd703ee7f3ef8c124a8 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 1 Nov 2024 08:36:15 +0700 Subject: [PATCH 90/90] chore(release): update changelog and bump version to 1.5.0 (#2300) --- CHANGELOG.md | 52 +++++++++++++++++++ Cargo.lock | 50 +++++++++--------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/check-features/Cargo.toml | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- .../configs/getConfigFileMigrationsFactory.js | 3 -- packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 45 files changed, 119 insertions(+), 70 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index edd8ad7715..006635d44e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,53 @@ +## [1.5.0](https://github.com/dashpay/platform/compare/v1.4.1...v1.5.0) (2024-11-01) + +### ⚠ BREAKING CHANGES + +* **drive:** rotate always to top quorum. This is a breaking change requiring a HF. (#2290) +* **sdk:** SDK methods which broadcasting transactions will return `SdkError::Protocol(ProtocolError::Consensus(..))` instead of `DapiClientError(String)` in case of validation errors. (#2274) +* **sdk:** serialized consensus error moved to a separate gRPC header `dash-serialized-consensus-error-bin` (#2274) +* **sdk:** `DapiRequestExecutor::execute` and `DapiRequest::execute` now returns `ExecutionResult` (#2259) +* **sdk:** returned objects are `IndexMap/IndexSet` instead of previous `BTreeMap` (#2207) + + +### Features + +* **dashmate:** add protocol version to the status command ([#2255](https://github.com/dashpay/platform/issues/2255)) +* **sdk:** added transfer transition to rs-sdk ([#2289](https://github.com/dashpay/platform/issues/2289)) +* **sdk:** detect stale nodes ([#2254](https://github.com/dashpay/platform/issues/2254)) +* **sdk:** provide request execution information ([#2259](https://github.com/dashpay/platform/issues/2259)) +* **sdk:** return consensus errors from broadcast methods ([#2274](https://github.com/dashpay/platform/issues/2274)) +* **sdk:** sdk-level retry logic for `fetch` and `fetch_many` ([#2266](https://github.com/dashpay/platform/issues/2266)) +* **dashmate:** cleanup zerossl certs command ([#2298](https://github.com/dashpay/platform/issues/2298)) + + +### Bug Fixes + +* **dashmate:** invalid mount path from helper ([#2296](https://github.com/dashpay/platform/issues/2296)) +* **dashmate:** zero ssl certificate draft not saved ([#2297](https://github.com/dashpay/platform/issues/2297)) +* **platform:** rotate always to top quorum ([#2290](https://github.com/dashpay/platform/issues/2290)) +* **dapi:** invalid state transition failed with already in chain error ([#2270](https://github.com/dashpay/platform/issues/2270)) +* **dashmate:** invalid drive status check ([#2248](https://github.com/dashpay/platform/issues/2248)) +* **dashmate:** invalid platform version in the status command ([#2249](https://github.com/dashpay/platform/issues/2249)) +* document query start to support pagination ([#2284](https://github.com/dashpay/platform/issues/2284)) +* **sdk:** `AddressListError` is private ([#2278](https://github.com/dashpay/platform/issues/2278)) +* **sdk:** opposite retry trigger ([#2265](https://github.com/dashpay/platform/issues/2265)) +* **sdk:** wrong order of objects returned by Drive ([#2207](https://github.com/dashpay/platform/issues/2207)) +* seed nodes aren't responding ([#2276](https://github.com/dashpay/platform/issues/2276)) + + +### Code Refactoring + +* platform version refactoring into sub versions ([#2269](https://github.com/dashpay/platform/issues/2269)) + + +### Miscellaneous Chores + +* add partial eq to document query ([#2253](https://github.com/dashpay/platform/issues/2253)) +* **dashmate:** report port check errors ([#2245](https://github.com/dashpay/platform/issues/2245)) +* move BLS Sigs import to Rust Dash Core ([#2252](https://github.com/dashpay/platform/issues/2252)) +* update to latest rust dash core with x11 optional ([#2251](https://github.com/dashpay/platform/issues/2251)) + + ## [1.5.0-rc.2](https://github.com/dashpay/platform/compare/v1.5.0-rc.1...v1.5.0-rc.2) (2024-10-31) @@ -12,6 +62,7 @@ * **dashmate:** zero ssl certificate draft not saved ([#2297](https://github.com/dashpay/platform/issues/2297)) * **platform:** rotate always to top quorum ([#2290](https://github.com/dashpay/platform/issues/2290)) + ## [1.5.0-rc.1](https://github.com/dashpay/platform/compare/v1.4.1...v1.5.0-rc.1) (2024-10-30) @@ -55,6 +106,7 @@ * platform version refactoring into sub versions ([#2269](https://github.com/dashpay/platform/issues/2269)) + ### [1.4.1](https://github.com/dashpay/platform/compare/v1.4.0...v1.4.1) (2024-10-12) diff --git a/Cargo.lock b/Cargo.lock index 190f4afaf0..c59d07d2b4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -676,7 +676,7 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "check-features" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "toml", ] @@ -1045,7 +1045,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1061,7 +1061,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "dapi-grpc", "heck 0.5.0", @@ -1106,7 +1106,7 @@ dependencies = [ [[package]] name = "dash-sdk" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "arc-swap", "async-trait", @@ -1212,7 +1212,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "platform-value", "platform-version", @@ -1222,7 +1222,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1353,7 +1353,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "platform-value", "platform-version", @@ -1363,7 +1363,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "anyhow", "assert_matches", @@ -1413,7 +1413,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "arc-swap", "assert_matches", @@ -1454,7 +1454,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "arc-swap", "assert_matches", @@ -1508,7 +1508,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "bincode", "dapi-grpc", @@ -1730,7 +1730,7 @@ checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "feature-flags-contract" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "platform-value", "platform-version", @@ -2595,7 +2595,7 @@ dependencies = [ [[package]] name = "json-schema-compatibility-validator" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "assert_matches", "json-patch", @@ -2753,7 +2753,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "platform-value", "platform-version", @@ -3333,7 +3333,7 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "platform-serialization" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "bincode", "platform-version", @@ -3341,7 +3341,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "proc-macro2", "quote", @@ -3351,7 +3351,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "base64 0.22.1", "bincode", @@ -3372,7 +3372,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "quote", "syn 2.0.75", @@ -3380,7 +3380,7 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "bincode", "grovedb-version", @@ -3391,7 +3391,7 @@ dependencies = [ [[package]] name = "platform-versioning" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "proc-macro2", "quote", @@ -3877,7 +3877,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "backon", "chrono", @@ -4333,7 +4333,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "base64 0.22.1", "bincode", @@ -4399,7 +4399,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "bincode", "dpp", @@ -5318,7 +5318,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "anyhow", "async-trait", @@ -5620,7 +5620,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.5.0-rc.2" +version = "1.5.0" dependencies = [ "num_enum 0.5.11", "platform-value", diff --git a/package.json b/package.json index 70a7eaf635..bb50d240c5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.5.0-rc.2", + "version": "1.5.0", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index 2ea83ce305..9fd607c221 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.5.0-rc.2", + "version": "1.5.0", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/check-features/Cargo.toml b/packages/check-features/Cargo.toml index e9d885fe03..59befe3fe4 100644 --- a/packages/check-features/Cargo.toml +++ b/packages/check-features/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "check-features" -version = "1.5.0-rc.2" +version = "1.5.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index ee62898ad6..611b01a94e 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.5.0-rc.2" +version = "1.5.0" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index e96a1afaa9..e2481688bd 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.5.0-rc.2", + "version": "1.5.0", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index 3486189004..79d23a958e 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.5.0-rc.2", + "version": "1.5.0", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index bb46c30000..9769bf2791 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "2.5.0-rc.2", + "version": "2.5.0", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/configs/getConfigFileMigrationsFactory.js b/packages/dashmate/configs/getConfigFileMigrationsFactory.js index 3e503e3124..862f3abee3 100644 --- a/packages/dashmate/configs/getConfigFileMigrationsFactory.js +++ b/packages/dashmate/configs/getConfigFileMigrationsFactory.js @@ -1029,9 +1029,6 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) if (options.network === NETWORK_TESTNET && name !== 'base') { options.platform.drive.tenderdash.p2p.seeds = testnet.get('platform.drive.tenderdash.p2p.seeds'); } - - options.platform.drive.abci.docker.image = 'dashpay/drive:1-rc'; - options.platform.dapi.api.docker.image = 'dashpay/dapi:1-rc'; }); return configFile; }, diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index a458821921..4ef6feac3f 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.5.0-rc.2", + "version": "1.5.0", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index 764b533ee3..234be65b39 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.5.0-rc.2" +version = "1.5.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index 928a5528e9..02f96b5e84 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.5.0-rc.2", + "version": "1.5.0", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index c378c67743..248f8886e2 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.5.0-rc.2" +version = "1.5.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 88ed597f30..a50b3b6786 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.5.0-rc.2" +version = "1.5.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index 53230afb11..ea08d1101a 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.5.0-rc.2", + "version": "1.5.0", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index a69a79d54c..a4bd7a3d1b 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.5.0-rc.2" +version = "1.5.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index 45d7b15868..6258be19c7 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.5.0-rc.2", + "version": "1.5.0", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index 841efeb132..d957664bd9 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.5.0-rc.2", + "version": "1.5.0", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index 747224eaab..975bb90107 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.5.0-rc.2", + "version": "4.5.0", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index 5cf67e5b62..8c7b895f09 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.5.0-rc.2", + "version": "1.5.0", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index 1cb070c6f0..71dc15cc61 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.5.0-rc.2" +version = "1.5.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index b0b9fc1aeb..3f1899f461 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.5.0-rc.2", + "version": "1.5.0", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index 47f8ea81ae..5497d529f0 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.5.0-rc.2", + "version": "1.5.0", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index 0150e899ba..28cd8936b9 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.5.0-rc.2" +version = "1.5.0" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index 7ba8373114..ce2aef48c4 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.5.0-rc.2" +version = "1.5.0" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 0d7dfcea04..ff377de748 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.5.0-rc.2" +version = "1.5.0" edition = "2021" rust-version.workspace = true authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 425ab5308b..b1762b8706 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.5.0-rc.2" +version = "1.5.0" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 8351826d7c..3eaa9f3bdf 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.5.0-rc.2" +version = "1.5.0" edition = "2021" rust-version.workspace = true diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index c5a0d6b955..340ca3a9ee 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.5.0-rc.2" +version = "1.5.0" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-json-schema-compatibility-validator/Cargo.toml b/packages/rs-json-schema-compatibility-validator/Cargo.toml index 723c94abcc..6e1d43be34 100644 --- a/packages/rs-json-schema-compatibility-validator/Cargo.toml +++ b/packages/rs-json-schema-compatibility-validator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "json-schema-compatibility-validator" -version = "1.5.0-rc.2" +version = "1.5.0" edition = "2021" rust-version.workspace = true authors = ["Ivan Shumkov "] diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index 720db0a15d..27d6cba787 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.5.0-rc.2" +version = "1.5.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index 90a697e1b9..fc4679a3fb 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.5.0-rc.2" +version = "1.5.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index 0aa49a41c0..b3145a3a40 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.5.0-rc.2" +version = "1.5.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index afdb2f348f..d31603fbc7 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.5.0-rc.2" +version = "1.5.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 3830a7921b..fecc94f775 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Versioning library for Platform" -version = "1.5.0-rc.2" +version = "1.5.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index ee150dafea..4a0f8f5a6d 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.5.0-rc.2" +version = "1.5.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 67fc8bfeee..ed45b0d813 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dash-sdk" -version = "1.5.0-rc.2" +version = "1.5.0" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index bfd533e8ab..080f921ba7 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.5.0-rc.2" +version = "1.5.0" edition = "2021" rust-version.workspace = true diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index b63983ab88..e3666a076e 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.5.0-rc.2" +version = "1.5.0" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 0796343efb..73bc0575e7 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.5.0-rc.2", + "version": "8.5.0", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index 7452aa8db8..d4c7a4eebb 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.5.0-rc.2" +version = "1.5.0" edition = "2021" rust-version.workspace = true authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index 6113ed7844..95b70a9681 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.5.0-rc.2", + "version": "1.5.0", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index 238ed3dbd7..eaef26229c 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.5.0-rc.2" +version = "1.5.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index 2c17b7c9c5..e6031b8ab6 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.5.0-rc.2", + "version": "1.5.0", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "",

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 RWLL_^z{O;g<+C3j{{!S%ydD4m literal 8118 zcmeHM!EV|>5bZf%VR80>HFhw)_0U_@ABZC4f>R+86B&qFMfvxRz4-ZM7S?N0^-x7h zqVevVnKy4{7o)t~MA78AtoNH;HTfL9$YZlGg)L93U3I97)nU0=%ko_dX<*508souC zQ+inB{X@R!Z8Oj4VVcmxocxo7V9Ct%u#{0`n<-^U5)PcqdiMo|GRbYfVW^aZLK#Ee zDTQUsf&&pgpZ5u7w4S8oFyktiUrruoL7`I0ooA;G+;^!a>)q=3SXPJS;rCOytcu4{ zx+bfS#ip77wW-$SFYG=QwRn6N?3Zf&t@u%Hd*uF5)YAJF|6FX3<^IhS^z#r!hT0xQ zRG4f{N#Q8sdSug3zZ-0dxk6nLO`gv5Cap1~ZWD}p?xs>;o&$#^&sZC{XX$jItk#ZZ zsAXa`Ee^|8Pys&dMAYiI-J(IO-LX38#a+EF>t(TDN%&3mQ??(9?Y@N5Q@wj`+I^^x zWlQN*{=VM4-h8@wnS8D5$>%#G=RsyJPh(@!So&b3=B5G0B=T$Ix7oUFKv^EkM9REn z(>N1DR!p2Ftuc?Yd1J`#>Bri6oXQVu*=4U;oZYr7v(`(tk}hBuxrvrjaEaCiu~{;4 z?2=krXk=NpD2^>p8^k*HoRM9aTVj&Et)ijP5j#~1VvJE>U?g(OK`5OJY@KyS94n@a zkvP*ZIURuqP*0z9f5 z8(9>S+2f&whGMjnIiQAe=Sq=cFb;dEO0gw;?17b)QI$fUOJZ`0caA7h!0?o#a-l#m zl&T`2J>A@QPh@Pt03X)~#{|-_f=d(h?S{_kTp%(Vm&6ndwqT%S$crtkC=53R;7+lia?liK_=5zu zNkvTM&LSX%XZ%3^Ql$texs>u_$4?y)MCPW1(D2OIrE*46^?fozRSykR0Yl9XYWH^# zT~^A&ouxzVZZ2$j_y7Z=o9EM^7OJY`k*ezXajS4=j4>eZG7NcngBRj-1&%ndEV!#P zBEuM!;u6CU5g3CwFs`6+T`xjtoW&@`fRP!)YwC67*vRfdlNF4OWZ~CBWEaCGb=?_* z6oYZt>(czV%8xy0A2%)QjP7_oE79fuRLU}|un?h;G7?h*VJBvBkN(rdW;6GsKR>3QS zJq;`n`V7vzo1ItC?kmJR8%OnYl;9i?aV$gG>Pqh44+q8MfL*29{TxPr@o_P{;!+LC zg~>#Lm*Wicac?AM*hx41jf}lKe6BnAAvB-{^tr0b`hMoRKttUvE{0bIY4FMYE2mPj zD-oDaH)F$mP)y8Pxy) diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_465afbed74842189a7651d5ea128874bbcfcb0dc0e4c32ab8ea2d3c8a4d32a03/msg_GetContestedResourcesRequest_6ec2c2e0abfde5adf1d65d2b06ba7401f9ed4ef7493ce9faa08a50e6b4d2c34d.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_465afbed74842189a7651d5ea128874bbcfcb0dc0e4c32ab8ea2d3c8a4d32a03/msg_GetContestedResourcesRequest_6ec2c2e0abfde5adf1d65d2b06ba7401f9ed4ef7493ce9faa08a50e6b4d2c34d.json index d180512d4c4cb85a84780526090db9947d690571..24e24adc17210bf5dee5abe484845ab63ae0ccc5 100644 GIT binary patch literal 8819 zcmd5>O>dh(5bfE&0{P5=T_DD}_0U_@KM+M0wMk{k!4bw$tH}So1IrF$#u>2$+ZAR-sb zq`gR%?OH8jauH~9u^|3h6EhvE)-0k{WUT^{MQa*ZhpqdPgi`vU1r(v8Nhqa=cSOQc znCASC-bA`T&CLF-G1hgy$&P^Ja+zP5i)cgO5-HU;fGc%C9{_dG%j zpnxdsd6W-;iuAj(jc~4>8NV#w^s7dbX2Y~v>ec9;r8_I^4ADXvMwYZ()tW#>FMH4> zKkjxm5!^V(yzFl7i%nLn(!&~fZ1X<=zoffEhE8wA{=Mp0Ssb%E{Ruu#v(xO`>|_3; zDCUn(3Pu{nCW(BdA|IqwFus+BN@@60@K-?(l~J7dFjO!yap1?WfF0$>x?aT9KI~MV zU{G&1>!3DR`0?W0CG_Km1~R_j)!2l7l++L`>aZ1L65$TGo5%!;p$w=BAhSRSBVSyY z$P_Y#!45728^a5X`&4Ljg9V9a~ry2h5A$ttQi(ud7PFGcQ7_H1`D*Yxmt(^v|aA9paJ>x z_Q~Z`1_tE0Y=zxkK!pM%1Vl)va2UjkAC}AVYR(pzAKuF8=i(U9(9!+?ljn!qYye)pZw>fGk+uh#eNAh&mqgp?X*D= zZaKZe{l$4*Pbl*x;-d1SH{}MoP^igjD2%9u+)jYIOfQ!gixwze=lJgRZM~DZ+nuS*p?u7wA6YB2o*jS-c@qN66fMYcU z%Mbzz&}5rp?-aLJ5mZA^UVxm0>XSCRcDWiY!8H?AX1^{k+;l*tFP2mH86D2@n^KyFx^r?^!8xA)6<+1(6XBaP@ x3o8_$(Q}R7FQIr2ne1>FcI3q`8UWcJf13vx{B~S71zey7@IYUNzS8mY=|4wuo4o)4 delta 707 zcmcgqJxc>Y5GA@M z?6j8PV!4IKy6=#{h&OT1_Hff^E)f4MG!E;vDw&f-U@S!Tj<~=x^KeFYEGi@ub;7&Y z;aiyUwIa{VGXYH=L-Vo3gEEgZyMoHnd`wwCvj=#pl8noBBhz7A=x&f)S9>3ue7lg% zanuv|U?JwADahq>|GBb?ivN;sRMb{}^~N>9lxa)$al%&d6?#QKiwPFZnecL4-9IDh Uv}sf9cIbVxK4~nYfxf!^0o$&@?EnA( diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/msg_GetContestedResourcesRequest_80ba1d11caa6442b39ab0f05e7fd84b9984fd04a4ca40a146aea81c3ea5c39ef.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/msg_GetContestedResourcesRequest_80ba1d11caa6442b39ab0f05e7fd84b9984fd04a4ca40a146aea81c3ea5c39ef.json index 66b9ef6ec5b37db22d08ce0e4d27f10f92f0f42f..75cb49e82452f70c1621f5b1c7c03f2b34066cc4 100644 GIT binary patch literal 48360 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 delta 4092 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 Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_8ae090a1b1351d43a2df073800c78374b4bab6d7f26b2f163436712312233554/msg_GetContestedResourcesRequest_ad9ea5e65a5302d37eee711c9465a0fc6bf7035276b9ae4be55fb15774eb54e7.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_8ae090a1b1351d43a2df073800c78374b4bab6d7f26b2f163436712312233554/msg_GetContestedResourcesRequest_ad9ea5e65a5302d37eee711c9465a0fc6bf7035276b9ae4be55fb15774eb54e7.json index f552fd671f424708aaa2118aed87f0d5c3203cae..f7be9162889540d9ac229d0f7fd50066f8c6f7ac 100644 GIT binary patch literal 15082 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 QFoz3Y9ji1}N&a~H14D8_>i_@% diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_93d82dd3f64ebcd26d544e5e5d2933bfca11e0f2d904628d007ad04a12e66ea1/msg_GetContestedResourcesRequest_45785d2d1a5309b4b29ccfa650f30e457c9e0f5d50a3b8f0f86e1da3420877d7.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_93d82dd3f64ebcd26d544e5e5d2933bfca11e0f2d904628d007ad04a12e66ea1/msg_GetContestedResourcesRequest_45785d2d1a5309b4b29ccfa650f30e457c9e0f5d50a3b8f0f86e1da3420877d7.json index 533bb0c145d4fbd197c247d1b55941aa3739d413..31b39936140e54bd6a62378ccae9a5f86a690558 100644 GIT binary patch literal 5151 zcmd^DO>dh(5bfE&0&(WRF074n>!G)*e;|r1YLm*64H3pxE6e}A50)J!9zrp3Dpft$ zTK3Jydo#0(lk?2;{8LsQwngqgcxOD;8zHUnv@Y_hOxM+FyTSHjV^W*xC=BR9g)w_r zCf!4_?AB^w*h8qC{`cX|-yo!tl8O-Tb)Qk@R(O%qwipjfp6)UzD4y zT&0IK;&1aGz@O9IAtSGsvN+Y1tjc57aJu08GP}$^&CdRpvh*Jw6-Ev1OyWSPIDkZj zv8uHxrSVbt)X=;(GD(1Dqm?EM3>Mf?fzi#v)ce?}zhTg9w(GDlSOjMA+9e9iyoIbU zyjq(mh?54wq6u3=HWBT>-9~1R0S&MMWETWc9Sby(Yv=Bc>UH0x4c~Ev zdb1kD84Fo?nwBf=Ft#&>1=+Y<9V7!%m#s0VN-sIR@5^;vF;4#8xvo3-k-6@#OSY2w zHBcxC(J7E)Ll7OSF$3Ue^hhSiUW_9rioC=v+8tp@p62i^$#e;G8YKB%0f~m}7eRlG zVc%`j)$pb+6ZrvM(;!)mX}R3kbOOgr?>lo1keATFuo3i6H|4E&3g+-8T~rNuDhZkp z5EuT{OB_2kAQpFj>-|5+few)z0D|OkAZVaa0|5u1X}Kf~Hyb^#HX<)`(TLt_dMTG= z_)bWY9}`eko+M8=m3MqexqkH=^D(+)HC({6THTw0XMx E24isG)Bpeg delta 440 zcmbQQ@mg@hRAwu49aD216B8X1OBjN%Ep$wP2+jt|n&_As>X;gV8OA!MW|IZk#Y15t zAng`NMgjGLwLpwDHHH~wsRLmHEj2ZT2?8}5BG@LDlXo#|PX5ozIoXt7XmUO)&*Xco z9Fv!`3c%UctV)xYvV!D9Cokp|oW#O8IYd}yax90?WC3<*FfQOyocxYm1R@2}DKy!Z zg=ew@FB@1_2QNRWZgeFeOF1Wp3PTMSo-6~j#DX8B3!6zoK=<-Y&IHQcV`ZD1#UeM^ tfrSm|MjQ^nFg=*fe)0l#xMdf3RVM#q6PkR0gA+{4uy8N|!-Y{q4gdk1Z(INX diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/msg_GetContestedResourcesRequest_5396ff2dd55051d854e18e406fbbfa6b1eff43954af904bce8f123fed7515132.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/msg_GetContestedResourcesRequest_5396ff2dd55051d854e18e406fbbfa6b1eff43954af904bce8f123fed7515132.json index 3b7eba5cc77c9b657e489a203802ddc2befda612..cd92b9b9abf9dca03372caec243431149a5f8860 100644 GIT binary patch literal 50782 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 SZysNH;fr7OC;8`>PyYc1xT_=p literal 50608 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index d438f5cdd3c70a33082da0d6fb21c942f97f77c8..e64b73d8a77bdd2ae7413c918f513e44a6315072 100644 GIT binary patch delta 2865 zcmY*bYiu0V71lg<7H?!{gQ0d}XJZFHSTnP8XJ#LMZR}(n2goKiL~Wo-$W|y&Dj_ye zTO1M;qg0@zO0axVA0m`?`>QP~5E0Y@5{ZGJl!nMbNTyLBwxCo%aWPFQRSl|p&b_-a z{k1bY_s%`%d!6~$@#^tcs!vSm)yXb9CG1qnPWg5Kzuw*q|IvS_WkCF@4GtPHfFrH& zj?uY1m640mye<{kd`lOiyr;)JZ+W~RfH%T*cw)0*o{WbkG$`zFp?KJYV%~=0LIzeP zZHTs*@TUeBhrg?t5c|Y|XvD?414E3T2}3UD;HsB3A1Brsf|qI@?5cI)LahatTo+?$ z`uoEc`3U~L+SOBOSetX<$gKjOp4MG#x>2{_gB1bHt@e0t&d2@h4IiGVNkeGBgNHp= zR%Rio~3*cy@dblTRL!mp2udXp{oY|&%B8Ufs5B3A&pOaOPq16+Dp7t|7bL?AF7$Jzp%_YD`1 zOzUB|Cm~6~ExhIZPXnC$f#%?trwKTo7g+2vLeLcV@RkADT^RanZEz2GF#3?M4lFJN zaLNkfwiMyl(?N$Rq&#SPNbu5u|J}R@lun2SSesS62PA9y)gE$$^GQ3U4D&)H@_n}!}(gxh5ok^q#s`r1jTz? z7{0-TealsoTnt9n5Ou>F3G&IDA+$8UkuyB}piM~-SSyTSzK>Y^9(B#_?C+!{TQ*Vk z6=vj`Ydr)?MOZleqLv1|P2glbU7T_h$(AjkeBjE`+FP24Q=S+!TGm zWao6?<=-kckouivyVYgOD1>n#)uqpEA6LWVY}a-4zc9c;ZHS2jS{)E;yS~})&VM->!Um7hs@6RVSH{a z38zw2(=#MuZtX8C1k;MMx092&uIjCX`o2zT_P$#M{JY)d0D#8qqQ`Vfk7GSzJ z4SV9RT2hv}A|r*Oj6g4|gv@oHojXLLg64t`vmF8+kNIT@UVk~mOo--)0p8!Wgkp0+ zTEc>%SVHMo1*yXh2*K;&1T~U^e3gJl1_hkENwAGbZ3BugC2}S*1lYjZNlH;jz2L5P z0<-U`2d6Cy&b14ee~hwe14)pz_V$+&OCs=zUY`u+9vI0!HImi-IFi-v&!O;j0B?Tj zL2<^{Q%QVc8-*A*R-&M0XD)q|)V0%usTy0E<7~GwHDxRg-A$7n5$8#(AkB9zB#4U_atDf+zb;rZR9W6nT5C7`)#H7-pW zKZBQ-37oz{PbvXFaZL{tH_@EZ-199og~$~YtGH>SvKpIRg#)D?wN6^8G=_h($yY0T z1I|D;I*no_1-zK2n53)};NC2ELurtNQV~LFp*f(Rf+)6Kw}xiyQ29ABtPamCLD7Y8@?}<{$43^pyOrppTd|%=a++G_U7K z)hk?1H4`U)NAr?}h{GAfp-&WC`<0%Q39iT%%p)HzRQUDN!8C1^d#2X7*he9avxoHz z4y~svLiBp6HfL5^2FRg08a3l44E^4Q#@_qY_?Y~LrYpPfVn)5MnM~IfkgCbrVf;l0 zSw`9Ku6kEeI&~9$R9I-|X#SnxDC5!nK%KFj=v`!AMMh&U*?hN2Ux;OG*;v?M{6@tF zwwKjNgF_Y=@%SvJO8vg;e@oOnjCejPB_Ho93;&o+sW=nDj|PbYqph4sTjFYbNF7q7 z;e|ibZ2pAw6zVMv#8{y_2@Rj9w9k4DMqVvXs_GGPaepRF(H+nM0ymdu Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resources_fields_948b5a301af5fc73db7fed418a4fe90f64952b4ddd6b03a7f21d029dc110af50/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/msg_GetContestedResourcesRequest_f06ea270a508a9d9c386b8da170f67620695a23f63dc7376bd4a509e93335ce9.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/msg_GetContestedResourcesRequest_f06ea270a508a9d9c386b8da170f67620695a23f63dc7376bd4a509e93335ce9.json index c8db476a81a368114be9d1a6c192f0b8cad13315..a0e087bdda23b6efde8bd0f93554df77a5ea6ddc 100644 GIT binary patch literal 56714 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 AJpcdz diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index d438f5cdd3c70a33082da0d6fb21c942f97f77c8..e64b73d8a77bdd2ae7413c918f513e44a6315072 100644 GIT binary patch delta 2865 zcmY*bYiu0V71lg<7H?!{gQ0d}XJZFHSTnP8XJ#LMZR}(n2goKiL~Wo-$W|y&Dj_ye zTO1M;qg0@zO0axVA0m`?`>QP~5E0Y@5{ZGJl!nMbNTyLBwxCo%aWPFQRSl|p&b_-a z{k1bY_s%`%d!6~$@#^tcs!vSm)yXb9CG1qnPWg5Kzuw*q|IvS_WkCF@4GtPHfFrH& zj?uY1m640mye<{kd`lOiyr;)JZ+W~RfH%T*cw)0*o{WbkG$`zFp?KJYV%~=0LIzeP zZHTs*@TUeBhrg?t5c|Y|XvD?414E3T2}3UD;HsB3A1Brsf|qI@?5cI)LahatTo+?$ z`uoEc`3U~L+SOBOSetX<$gKjOp4MG#x>2{_gB1bHt@e0t&d2@h4IiGVNkeGBgNHp= zR%Rio~3*cy@dblTRL!mp2udXp{oY|&%B8Ufs5B3A&pOaOPq16+Dp7t|7bL?AF7$Jzp%_YD`1 zOzUB|Cm~6~ExhIZPXnC$f#%?trwKTo7g+2vLeLcV@RkADT^RanZEz2GF#3?M4lFJN zaLNkfwiMyl(?N$Rq&#SPNbu5u|J}R@lun2SSesS62PA9y)gE$$^GQ3U4D&)H@_n}!}(gxh5ok^q#s`r1jTz? z7{0-TealsoTnt9n5Ou>F3G&IDA+$8UkuyB}piM~-SSyTSzK>Y^9(B#_?C+!{TQ*Vk z6=vj`Ydr)?MOZleqLv1|P2glbU7T_h$(AjkeBjE`+FP24Q=S+!TGm zWao6?<=-kckouivyVYgOD1>n#)uqpEA6LWVY}a-4zc9c;ZHS2jS{)E;yS~})&VM->!Um7hs@6RVSH{a z38zw2(=#MuZtX8C1k;MMx092&uIjCX`o2zT_P$#M{JY)d0D#8qqQ`Vfk7GSzJ z4SV9RT2hv}A|r*Oj6g4|gv@oHojXLLg64t`vmF8+kNIT@UVk~mOo--)0p8!Wgkp0+ zTEc>%SVHMo1*yXh2*K;&1T~U^e3gJl1_hkENwAGbZ3BugC2}S*1lYjZNlH;jz2L5P z0<-U`2d6Cy&b14ee~hwe14)pz_V$+&OCs=zUY`u+9vI0!HImi-IFi-v&!O;j0B?Tj zL2<^{Q%QVc8-*A*R-&M0XD)q|)V0%usTy0E<7~GwHDxRg-A$7n5$8#(AkB9zB#4U_atDf+zb;rZR9W6nT5C7`)#H7-pW zKZBQ-37oz{PbvXFaZL{tH_@EZ-199og~$~YtGH>SvKpIRg#)D?wN6^8G=_h($yY0T z1I|D;I*no_1-zK2n53)};NC2ELurtNQV~LFp*f(Rf+)6Kw}xiyQ29ABtPamCLD7Y8@?}<{$43^pyOrppTd|%=a++G_U7K z)hk?1H4`U)NAr?}h{GAfp-&WC`<0%Q39iT%%p)HzRQUDN!8C1^d#2X7*he9avxoHz z4y~svLiBp6HfL5^2FRg08a3l44E^4Q#@_qY_?Y~LrYpPfVn)5MnM~IfkgCbrVf;l0 zSw`9Ku6kEeI&~9$R9I-|X#SnxDC5!nK%KFj=v`!AMMh&U*?hN2Ux;OG*;v?M{6@tF zwwKjNgF_Y=@%SvJO8vg;e@oOnjCejPB_Ho93;&o+sW=nDj|PbYqph4sTjFYbNF7q7 z;e|ibZ2pAw6zVMv#8{y_2@Rj9w9k4DMqVvXs_GGPaepRF(H+nM0ymdu Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_afc96196b7f1e6f82927d852558ac6e2327f8c74d931d667fbe120136ceb5437/msg_GetContestedResourcesRequest_533d36b545633f42c839ba9038ec301f2326c1e59739fe07fb863facb5f2b5a8.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_afc96196b7f1e6f82927d852558ac6e2327f8c74d931d667fbe120136ceb5437/msg_GetContestedResourcesRequest_533d36b545633f42c839ba9038ec301f2326c1e59739fe07fb863facb5f2b5a8.json index 74bd5ae988fd533d8f8910abc0adc0dc5f324f86..893e829a3c3dfb86be9d8e6e8b039613d13cbcb9 100644 GIT binary patch literal 9006 zcmd5>O>dh(5bfE&0{P5=T_DD}_0U_@KM+M0wMk{kh6v-RRpkHPfn|p=<4jpfY#(AR z`{wJt85SJB&pdDbmX(KXk#7u{(GmEGdS*w6#(V7O>Q zeY(x(Xtm8Z*>6N&(-J&>fbG|O^F95U?K;atm6p)^#{Mnc9kavP6m;|8d5W~%^9V73 z0-~_zQ9b}F((l?f!nt~8{IYyArW!>whZJ-~{&g9WzSqT`F;R-l6hnKi!MUwIj})A% z&=aLcpl{p@6$%QPj;7VBX(x#JQb0@d<8FuJu`Z5z)!!`2O;)bb!x~z!&3^&>lI{)} zI=z;~TRm)5dCZ#hC-^+gPO~qw_xZQ7oIgG(xEo>OlgL*p@?i>UHS6{(rQuJ(UkyFf zMsec9{Q%P*2Yw6-*inA0n?+pj!%qDP2F+%>4jO}nA1}^bLO*_JA>#{Ptxf1hNdv*6 z30p%Z5$=GyiAG7E$-^2LRTOd(Sk?BGJMF}%QdNQFi>s1US*Qi)e9DJ{bW zY?)r7-0H(28pp7ZWkIGrIy8=fAdX>y#SgK;?680)Qts5$s1Mb^nqk3} z$7$(t2V*m1us|D|tAltz+vPqB8jw%#kX%k>U_hSBR@mml`O^U*A(vC}f`)e3+EZ)b@r7Q!XD&VGk;UiVDQ?9J zY6uWgz5*|y41~<$V!wo$=aA*)cG{o_*PLGA{^GnoPbl*x;-d1CH{}YsP^i1rP#94Q zxt#zvnO-h07B7sA0P%oBS}AzlHrGv>!jBYe3V*bryj&>33n3&p)dNvzCFdm+j}Q-t zH4CpI+zSJKB-G8{v9Us@;)i$%0jFvTmLUWbpu25~y;Iy?MNkbvc>!_~YDg|2paAiv z{AVtKvQw@hCx8<#40z2~N3Mn)wlQxG@HK}&9WWpgoa&tC@?tKN;wtZ=-Ty#7kJpfy zcbZ-ypw-arw87@y$@KC$M9SlY;=_gk`Avk-xLiCSHf8cJK2!0!s{w!;UwARQ|EBN( zz=;x|sd>3Q0)|w`hYbgt{qorT;xmpH&xI8V(B!!$@0UKERtF<0mL}*Nb=&L_B#Dzrd?G zh$r(8Uc??}Cp)aU3IkI!-Bn%PeSi44{_y1O45b>%G?nSd9)mNP@|ocg-n|tBfjI3+ z)h_}CnX_5K3aLREbEZ=EGn1-U;8d&c;+rDeQj6~puW=P){}@+{Pl6h*{i=hvap3Qv zxfo*{ggDw-;<&&Kb#iXV?*=aX0pFp=Rx-TAiIZ%^CW+u8A*R&ETcSnG|CE|Ir+swU zkP+|9Vt>tO4&j-NZq{{SYgCr&E%b5eug=M~?8spVoRPpsE5awO{c_A$bcMX7<+|IF zwMeBI)SNc{bw;M|uZmulHDj08&F83dDh{^s`7@j(T1%VWz#Z?&EL1O+&}b(=7FNqp diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/msg_GetContestedResourcesRequest_c8608f7aed7bbe4ced03c9c23f1ce28a227def58e23c39e0384e0cc02fe6360b.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/msg_GetContestedResourcesRequest_c8608f7aed7bbe4ced03c9c23f1ce28a227def58e23c39e0384e0cc02fe6360b.json index a2baf750233a8c2c672b4eeb6ffc08bcd1c1d6e7..46ce3e849c46ef015e85012851e749c82f8c6033 100644 GIT binary patch literal 79046 zcmeI*!ERnhb_C$8{S<=MT=1tzNt|8wLGl0tLr^SEV2n%|vScJM{O+l`-4?GS+q_?A zv`G8|lub(Ax6i4nQ|I*kHRGSYdh+Dyk9Y5X`1alX)4x3VDL?i%E{I<{`b4L4=aE8@cMnY-`4;5 z`t8TNAAY5R2R%G_a@x`U{ZNc>nQk3+dBQDQKK7Px*Jh zzsdLcb?VPqbbWF2vg>}mX}|S4fBr|SKCO-N$1%?@f@*Q@zfRjv2cGcooP^nM8|GzG zY1q#ng2=O?yqn95o12T9?8=Yb@k_$vIs1QJU)(0NE#vX%+neoo^58Ad!jWKmT#(AT zF28IFjbi@EBSAHy7Y*m;`QzaXm;(AQXI(#Jmj?y$M>8rS1EGQX7Jak4d3e+WDkz<{ zXO0l_6|=4Y*uXIyrp?-yefp12`hIK=kNQ8~&e@Q-XGqO?sb1)<5cx zx4&qv5dWIdjp{AVz!B+e+kZner+EJFM%eUwP9bQ*6-hO-ljm<$(y!HcI_;4xe4C1Y zzYzD^$M=mPrSXZ5S>YAyq~Z^bh`Ik!x$I7RT#38It;p#A(Q@2vso0y!Z_qI9Yqz-d z^=NVJ*C&`4@cagIr1*A6WPNMva0*@jY&+%fmWoxfC zO^P`sWqw#!g)36jQ<6S{On%d$xw5{`kASh#k8@ELUK)MP+PP?%3wE{uSG`{6kschWRHE1#l)8srOjLeRI870ONRB8Gu8oGIr>u=D zT6%=lmb-~CI+s!{wlRO%(rU^U(k+tSsFH|Cy-{s}9WU6mQ@Tsae5|jG4-cH(lCq_a znU1^=l^ikQBHojQN^5gP!YY9sUtbFqE@*Kfk}lKr3#Adu)l=LLslZFYntx)A*VVKp1Z7hSLsRAaNCtT#iT#PfVML)?<*uVg{aqkfL^XuCw6 zw<}>(6``6{N=a;?M`S&9fswnM(%fZzql&16@dd1)@h!zqW*dAc-zpG^D?~|T!3JeZ z6w5~>7vXy3ZXS{pr1w!g1$HZnT8*GIxF#Y7-89d4OS+Qyf7c7JlWy!vYCBW6>i=^08Ht!k@V#7)X!Q{tnDTKe zXfT`Sz!q{p0bdINVitQG1d#@4anlUuSS-~Hfhn4ql||3r#s-tIzNO3&;zG4wL3I*A zmAGY1beHP{Ms(ohqf>DbSMO~WiAvyINqm%skls_YyAA15r_N*|zSpQSoJc`+%Ql#i zt(8hiq^D#sL(SKGNWfbn3+Yo}&1G%kl3aR91SX?tu~M~!M>(QV35i*MTvyW=L!!Jb z*CQ5ms9TCs)UIV1x}~NTjZx{&oQaHAx8kL&K)m8rAvngALCrc*X@QH>>p99@h|rKQ zi&?Xz+bBw+O84i)bAu*qN8=F2wfk35Y0Z>)qRK9{5qw3~M0CFL?myBeV_)$%P2>x& zr+jU3gdqwK{{52ifVA3&AMV=PAS`UD7sl{#js(bH$AS?m$Mb=p6gbv++Y>eYJU_ig zG+aTF%(fILs!7C`lu+9lKEGU097J+vmR1BenhyCQtI<5q$nJT>yV%! zt(`)ifNxnV@=+bfxk!g4Y_p!+AmyN?nykg6hWse1$|ItpQccSv?gCV}I8H>klj*DR zD|c&ma6$=7yNV6nl6bddy^2aiUU?iQZfJ?NsM|EKdmKyr^%oOKqQRay(u zxe9)oi;P2~eAtuIk7$+{&M#Jw#5oa#S8Augik7GlXmOEIRp9N0;wduWSHN6QU9%Sa zYZPLqGYhg8wbP)Ks*$KVJjg_?+UUcnDpO+8L5ixT9F)kxFolMcEX2OLC8rQ^X+4yM zR*dm@*77*({3UH*E~gXFTx8&jXjHN zZ7WZ!pkPIYJQ7!Uvr9UcwyiRlBgDps;E!X~=L=AMexjnRW32+L#*_65k;R|trdd6< zM)-t+KqM^Z`3s&_?hf~q%zKnYRiT%fWG&ijNaUF~1Jq!Jg;@x6N(NCGq=N7Wdh{9XUqoDkp^6JcNL;xl?M16n)P+>E+S;M@xk}6W#*>kQgcPj`3q2xRkcb|k zz9d;Rs&FSoSNR27iK?gI%Z(YBAY3az5stu)+kUf7X~-#sOPw4C>}C;Zsi%cRGUp_+ z&{$FM#>L@&UE+e0ltvAK>O$}@k`&AaKJhiRDp3_8)Lx5DIz^8-U+xa;cDRQXh4$`9 zYx|;8x`k{oBGHzSBh)?A&``QnFJ&F)r!vQQTCE6?#h>b?7JRPJDiIu4B@)39Hl?@`7}C`DWT*#(%=MG9}{0)@jaw$ z9w98uEGTzbY?2ToV(<@JqCJ_=7&Fr0NXATM{+!qNDE^L-SX|}|3%8O0MImMV_I14R zh2>hJ6iXH>wmpT82zTNt)y6hZ9Z$T*D++1WGH*{{g}!b{R0LG$mi94^ppKR~O1S6| z!AcWfDA-^{GhSM=M8&N)hc?vvBG zq5CDUcv=n=PlOi}prRg~;xKpBwswl3BqHo$ zGJ(W{EL2Vu(uNXsqS6^lBBve^Imwn{n?$6VN;Jwt*Q=IP;mtZjnvB^bKg!n@YavSm zB5@vH%+MuAN^@a`*^Kvi3gt-uCV-^S=VM6IvSfJ6mI5n*jV;umJH|+5HE~?u6vTph z1kP`Bi`=ss(x#K+y3!egfU2=C$U}kE_JOUrL}Uxi-nm+$qFPPTH)malJQ5Q1*(RPu zaI9(~6jjVquwun-z)}{CUqo1WPzqyAB9yj}2-ry<1%|IgdW1}FgzA@D+(IB&sP<)X zbJT|Te}CA}2CcG(_9rqZSqp;qQK6^!3ofq2p}pht`GWB9FMiB&5by1l<0-`71XvYb zFTYs+Iu^Dg%bZXx`DoEoq&<}d6m6f63LHnM&ar zURYz%q*USrS%(KrKb9rMGIK{#I!;K{cX1N=a;~*7=PwNHlJY1JNIB*Zhyl6w(8KER07`{Wpicu0uWUQ-q{U;O-K zYJ-5HQo=4%U?~{IXLEz&su=OCuplG-JOwLG6=-rzzaye$u~8gjp@&OV5+>)x`~NA& z8I3afV7w~V$ms$ie~A|mNGn)FJU2zdl{5j zORobxA|nS*O+7^tUpS?6yCgob68gF&jN_ZA?$W?iy1|yDuAf=sOO>Xa`!aD@Qb{)RdN?sJ-zEwgpye+}|zKeCQNPL0|G<*IUyP3nPt^ zvL2-;+L(zbT&W{fY(yn>5z(4FHm9;C9(c7W=$;lVZymDPYRTQ`wSfZj{w(#~o)h&k5L=-Mc;rvGTv;R{X(!hD~pX#O7neH>) zdj$61|G(FUj!(y5y7GjngIsQEI5l-hmMtrHsO{zjD2 z!}G$u7=f)$q~7~NLtJYr^uWwK#o;ox6Mo|5d<)e+Y`AYn)om8}_dKLm@J!*%D$QG5WZ!vk}o3vt! zj!|sm`BDx&1&7ZnHZ5Dac3U>NW!BS7m^z~M-iE@pmFmWYp_DBPjH7O60TLZKBJhft zS65hoh82pu^r5pU<4rk0iL*83po+k*_)d^uqp>7~3(PC3k+)^ST49|=IRBxZo zbf4+oBe4Jetc_(f%%5o})z>4`DKZS?GAL74=Lej!0#3HjDUFKmYncROkSkxpLbJ}$ zOVfLZlN5SHMh+bRdXtjG7f$JvC5cb0G!3`C-p$`NW4sA;l`YgpP$R@k!QUtOKK}+O;_fRsohn(i9>p3Mq9*1{jDWq{>OA znuuIIbI1uiAFZZVfHvDL!a`F>o1jh+A~ccIsclm%Y=7vxcFleo|wlqm6Wgt=%!qUs}y7IQ9Nq9RJO z$e@ZE%;sjtul(JTE4gINS>VT%O~LQ8l{cwkLEEubp}Qfac4!MWVlt&hGQJLf{8WWU z9tvz2*DXfl`7^~&!RtH8P2S4d0$Ym^uj}8$5Z5Z*;#v(R5D7}-2<9%>N+Ja+j;-+O z+W<*iZKptK%J^QrN2I!i@ow3$)egd^pzX}4$aYe#vc9?dySuhRv4x(3Jofn{#mz>T zk@%H-Fw{g+w&GWFiwJU7x**)Bq_PrK;3X0pRZfvantS|;cnl*7ueMrTKN%!CwkE=f zV2zZ-QNJ?BmJYFq$vc)w)g?nI_ceJqqa=#W!%vqN`&;Da-`^e-Pk1~%%dZ#tb;_^) zobNAhFK%!0uj`B3{>k|ES!Vc`J@+;%9}8fF#DdftVnPyLhP0sVCLYw`N_UF|$!9vv zB7sTbEx=SRI(AQyEv4K2p(d|G=5`S9=o6YXkvw0U$ifzBg%yb?B#ViKK0jYVoX*LG zR6ic|x@hT1d#b`+PR&J5nedAF%q`+14JlvJeZn}6WRt|p$6JQ!-y_0^h@@L^f|#ceRxxAJ)uwjNJ%UGPC9I}RN|_fc z)JZ}jC&>{7iu%Kt3v?RFE+Kv9PJu zgHfZBp2UUp2DX5(mmzs?%a9n%1ySfI7xes?n-D?4lmc~5q-=rWsED!%q?$;#;49A_ zkx5Lr?iTC<-I4+qGt8Fbx9vV(73&^VY)P~W_dLB5D-gO1ER}ZTBt%C`hHBPJ zbD1fN!8RW8{8o^pTy2L4VWI1zSd^b0F#@x?i=2>-<|6*Q;x^v3Tir-v0~4JzaaDU7 zt6-wEwLzX({_=$e zr>bgTIYqkc+#-SHhoMLH7@67y?IP4}_5^Ll0vHhX4CS+`J~QEVY^6 zou=S+7f`f{WM-a6#EEnAmJI#$&66ijf4q73{`K42r+<3#Q@-sFPVe65yO(coKfJqs z`QgRuSNZW@mnB_xc7A$t_s!w-V)M<_^ZRd}U){eyJiFX{b9%P<=GkWd+1X~<+4TuZXzStbQU30ZPXtVzLvwH*Q zo1dRuY&M*4quBcQe6!4Qch_Fr@#?$J;=8$h^_e&K(GPF0KfG96 z&BDLEjk~uW-@LgC{pH(_w;z7}!?*8V-Mo8o{r+W+e|`I3`Sstf-@L!M+w{Y`w?8(K zAKrbuSzP)#|NZ%!pTGIHZ+?3Em;ZkHr@tOTw9x4MY(KAB z=;Gw^dDnfqX}k3zzyGaOcWcA^VdmSDWVLzjABW|;i4*S6iJNt|Zk{%jy8Z3F6Fuwl zByL?UKTIXwM>`JL{`cbKDt;~Dj&rXrm!IU+#mnX*p4L{hZ1-=)Z46DvKZ^D=lwQGs{=C>tHFm%Ey@2JnWD2HYn;BLSAW%SuYO@$^ZO~B z3(kw5m#1sYUu4W7YX5gVZ1}a)x@o{=NC~qc=9g;dQ!0L%$)+#Af4I1Qbx4ci4vw|9 z%hVN$Em*%Y5n2CY3)-R>7xRTD1?V%63bNUVvD=`VHo94j<4Li&&8@wL(#(P-6viRVzx8gITFp z&pdVwKVAul@yZG|)haw+5tl8+A}=I~M$y2hHDO>kzrOybz)1;1KXEB0THutWbnon% zj=FRu;1aTg(8ZLZQQ8thO)Q!NQRDf=nzEGh0~`sI0vDG=1j>qJNdl+ydw4>SmRI0} z8)H3bc)cPNl2z3FrWB)SMeCO27U3=ySgPf@w8*B{`(1ZQEM1=q6cwP)IYmT4300_| zl3t&LOGqiJvP*C;=<$jINqWhpQC5WD4n0g1)GL!%89U3v9mS4RpYLL$E(q%p0@t`= zf%K?X*gHzv9q_4&hEc+hMj<3`;K`MAsKOnYk^*11h`5#KF(FpIg6zZ}wK8HiSy*D{ z4yDvWRbSx{M4GOYi4bz=8|gy_03mQ)O0H;29)eL6nHKbXX&g;#Oz5N}CPtPD`t((< zUTFuUrte}%163-H>U52lLKxhW(PgzF^y`)#vv&l6NE`a0q?aC#X(EBgB{LEA5I9tp z>yj3c)~V=#lDtw$=V!fCM7f%}BUa@6pe$o;T@n;DON}Bd!gA;?!aAcMMqw_A$Y|TG z=NNC-<5bfvLX3Jv4K5-nkky}vo+NgSdWRLdDd31wuhP7vvSoA914&~IDRM*Vt7Mi=&8PQph!tEhM1{ zSy9u(rfaB)BuePViQT0GX*cs~RunYqgsfZqo}wDtq7bh-M#}muZXcJ@>y{nEVM;?t zH5{8qT%+!K?OzE&NZ1e}I6JHe9K}L3r(T7(ibb}Fo@;vdkPsPF69QiotCzAUo3xmb zCEZf&gjBp<=u|Gr`n4!jqmo#~B976GDRWm|!jQ(Iy)q{7`M{VV=asPQfqkmSm@P<1r+P)iDGq-!3Ludtq+vBk-cDnIsCI0aEsbcksA$Vvnr7Flwnuq{!#hm0#&Jd(RupTF9ZR4kBk(ows5GVbEA*O#AVpM_ z*uireFp^lAVM>qmaWWAg)I>;2)#vmmL-4xMElR>2q!PrNSYcEb=OMqqu_j8q8e5Dc zV{#MFYXzy;EjYQ&x4f!NvZRShK`E({B>{anMr@BuB%Vzyw!dx>xU-lNRsR>S2tjhG z=L>dPtqGx7l`PdI)P&Uv)kP$oT0jCB)iM3iPfMF}i&D^X&{D-lHt0u*%9ieu#+1dT zX-QPDmh%pFFLfz! zP@=+EnLz3il6EB_d4>I@CPXv4K8(`bhE4){7YB3|=X4p$)k1YHKuK5pA(xuo#jE)O z>6TDYWTaa{McGo&NpG>sG*Ob+h7hVt2qRIXY@=qgaUPClX%}_Pu^_HBxMXZTkVZ{` zE29D*^|FL43|!%!ZZs4uEe^4j+oce4dmh=GtcSPOB>AHXjM6b73b2|Gd@EvTB35`y ztVkOwQFBohxHXWPNHdjk?v}((6`J)C0qNSc5;p3Vtk(fGzKLM&XfCZ;!M*8Cx@3kd zg2@@S5@ec~k|5Ue*qm-Y8-h^^B z94kV(*O5=6Sb?BKg&4xUx+Ig2c8X?|h>EpY&8N09h#?_!KFJ?%zS`!7)Dz0<78J>p zn^l~OSg=-?VuH#?%9G1~;U4vo_FSP;6(bd`I+iR+MT~C6QkL*Znz9~aZ@LKX9cn4( zuW)E?V?sun)*bOSiOov_DXAoio*&tlD4Hv*?)g$uPwEV{Ep0W_X(io*=0u`53Iug68hdlIX;F75NANGo|n| zv|2Gm=6|Z2dP=Sal%Iv(6hh9|iYUs$y=t07QC0*9O4N=iMVfU)z&fd{SFM=$gqToF zLdsRW zL6&0M-tJQA`$J4S1sdt3 zQoyAbhLfNzor_AZJtZ%(Qif-}kYtCI&MHFP7U^(ox|+s%yPNo+o?H7EERT@8G ziAy#Oh9vlax9Jrn90*!X$@yzywJ~908+AxRllH#EQgtK>atXU$3p|M>mr}6dxjY$Y zZuJ(k=o^u0@PxK#>Mxm2ZOrYkJAv$A3K!~~_$z#INMCpYK zd0rDplGUrn>DoE`vE~6}sUa&gXpAb7e}G}bpJ_Z66Hu(a23TK#4`0E=v?g%--qFQ$ zqL60M2_$?b6Io2nB_T(gWu~pLjMp>}HG%i{b<4DgJ_nOT^?c0La7lAj$3(X~N@)>= zC!#i;glWzp(q>!{Ajp$IkmTr=_(NN|UY^yjbxIH{12B!vYwUzYfc8M<8zLRPmJbmx z(-iq1;)Nm8qOrP!z;zc1CJ8cW1>(ELOBBjt@qZ-8$}K%kqK=7*fS^{dQq*E)=&)KD z8J=h0YK7>OSnx76tjv40GsD4A0tp;e-D6e}L0I7sO;{1378Wr_ypFQJ%SRBU zN0d!~v%2uhi#a1hS5FS*v=#!i zJfR+UTzr0Za`!rB<1Q6>bIisu8`}(Q-ygZL&4%f-wD^j@^mp zm!D6t#ZIQ03?6-AAdKpk6DY?1K8TY_VaU23)& z4o@f$^(yC!SnZ(tpcd#Mx)lFO3FA*mNToEkh#0Pk5=PZAX_O=&BWkPGUC%uK=}nNJ zsqAB|LDi)2>2L{?Fg-5b-lvY)IA&v;f$jSvH~yuvVfsvyfKGkVDLP-}CBskG%jDDb znfk~?7E23@iH>AC_2EcX6B*aVv31M*JATjK5jeS&M9KO=A=*+=BBEwJJtA9xqb-S|iX>KcG9*(I4SuN$9JK0~1`-jV z(vDZ!R+jM$9(SOLW_3s4c>*RfQWF$-sH^8o^#y3gI@LkdhvROiLeS1~OY$!GIBtnQw599m2ABM&PU*&!Ez4_O&02KFC!(Lt)!X)0;>kU3t!MKBI4)Df?Q zgk@mVPq3)Kl8G#qsis*G=XBzdaAyZhD1@4<5bWsR2mZR@Q2_o)|4V#KjI~U`U+84io&8W zeEv2hi;WE7Cml|Oe_XtoZ;2tt#oLR(F&oEhY%{QZ|A*&>=`&3N5r3NVrBigWlF5fh z#9UIypDdQ-WN|~lsWtiJEqEKU;VMx}7fwp+KPDl?dc-BUZPl5)q$qkm zt&dBRRXbc1pp?k%lG+49+;T=@H(nIjMj?S$DuorR=n=};CTb$OkzLc*-oh6+DDb7r zQ|zN0bW1ZVxHlH6>mW`=l=JbU$+{Gh2oX_UITMjy8h9`2-P6&42 zB+_Q~6ClWwK#=68Q306-;|+vh|AAqmUjR`bQS7 zCMz^*d^pe7vwR)$)$jBE^y=j5GJjm0T=h5O?Rm)my#IdCRaQRaz_{v`EjwyIfKn$K z%?tTojKoUUM=B91Hj&ts{}Ol(-y?cE5;fiEs}c!85}Wm0zcLP$w}ZMA1!-MUs#-c( z)XU!%E?tQjOWz@vY9iQ)SEZlQd)LDO>pLkrrAOvW9h}l|g&}KtWlLM3c-3x;Bq`j= z+gNE+x&OE4whuz@-b>GFN9tF5*Xd|d-;UPR7Iu0#+1IR+JQD2Ssl=&t5u`Ce>&N^k zsFr9^BNE^gF|FUheViE-_q_@3Baz&+4 zs*jg;0lAA5i?E$K;3z0bRIP-%1V^d~l_BR-_b=ROnldmn3Q6y3Lbt?PWKGf+)IHx%}XQyc_AK}ach7@cpIM#{r^5BYQ;)h8Z4yz7Lw#wDrAqWqx7tS(2Xup$V63Q zp{#eyk}lBDv7VYiq(K9TEJ~?25FL`lC2}SxsM^x{Mk@WjZI9ODW1XGE3%#{r2qlVw zlv|^SXb7>pB~hTD)iDhm+tNUUNZTz*FNUAqLZuxZ{-ZnJ-~THOhxFL9{!NFoG_cLb gL=7^2|K{_C!&%$i7e2-M!Y@Ag(fUpP`0nTb0|XIJX8-^I diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index d438f5cdd3c70a33082da0d6fb21c942f97f77c8..e64b73d8a77bdd2ae7413c918f513e44a6315072 100644 GIT binary patch delta 2865 zcmY*bYiu0V71lg<7H?!{gQ0d}XJZFHSTnP8XJ#LMZR}(n2goKiL~Wo-$W|y&Dj_ye zTO1M;qg0@zO0axVA0m`?`>QP~5E0Y@5{ZGJl!nMbNTyLBwxCo%aWPFQRSl|p&b_-a z{k1bY_s%`%d!6~$@#^tcs!vSm)yXb9CG1qnPWg5Kzuw*q|IvS_WkCF@4GtPHfFrH& zj?uY1m640mye<{kd`lOiyr;)JZ+W~RfH%T*cw)0*o{WbkG$`zFp?KJYV%~=0LIzeP zZHTs*@TUeBhrg?t5c|Y|XvD?414E3T2}3UD;HsB3A1Brsf|qI@?5cI)LahatTo+?$ z`uoEc`3U~L+SOBOSetX<$gKjOp4MG#x>2{_gB1bHt@e0t&d2@h4IiGVNkeGBgNHp= zR%Rio~3*cy@dblTRL!mp2udXp{oY|&%B8Ufs5B3A&pOaOPq16+Dp7t|7bL?AF7$Jzp%_YD`1 zOzUB|Cm~6~ExhIZPXnC$f#%?trwKTo7g+2vLeLcV@RkADT^RanZEz2GF#3?M4lFJN zaLNkfwiMyl(?N$Rq&#SPNbu5u|J}R@lun2SSesS62PA9y)gE$$^GQ3U4D&)H@_n}!}(gxh5ok^q#s`r1jTz? z7{0-TealsoTnt9n5Ou>F3G&IDA+$8UkuyB}piM~-SSyTSzK>Y^9(B#_?C+!{TQ*Vk z6=vj`Ydr)?MOZleqLv1|P2glbU7T_h$(AjkeBjE`+FP24Q=S+!TGm zWao6?<=-kckouivyVYgOD1>n#)uqpEA6LWVY}a-4zc9c;ZHS2jS{)E;yS~})&VM->!Um7hs@6RVSH{a z38zw2(=#MuZtX8C1k;MMx092&uIjCX`o2zT_P$#M{JY)d0D#8qqQ`Vfk7GSzJ z4SV9RT2hv}A|r*Oj6g4|gv@oHojXLLg64t`vmF8+kNIT@UVk~mOo--)0p8!Wgkp0+ zTEc>%SVHMo1*yXh2*K;&1T~U^e3gJl1_hkENwAGbZ3BugC2}S*1lYjZNlH;jz2L5P z0<-U`2d6Cy&b14ee~hwe14)pz_V$+&OCs=zUY`u+9vI0!HImi-IFi-v&!O;j0B?Tj zL2<^{Q%QVc8-*A*R-&M0XD)q|)V0%usTy0E<7~GwHDxRg-A$7n5$8#(AkB9zB#4U_atDf+zb;rZR9W6nT5C7`)#H7-pW zKZBQ-37oz{PbvXFaZL{tH_@EZ-199og~$~YtGH>SvKpIRg#)D?wN6^8G=_h($yY0T z1I|D;I*no_1-zK2n53)};NC2ELurtNQV~LFp*f(Rf+)6Kw}xiyQ29ABtPamCLD7Y8@?}<{$43^pyOrppTd|%=a++G_U7K z)hk?1H4`U)NAr?}h{GAfp-&WC`<0%Q39iT%%p)HzRQUDN!8C1^d#2X7*he9avxoHz z4y~svLiBp6HfL5^2FRg08a3l44E^4Q#@_qY_?Y~LrYpPfVn)5MnM~IfkgCbrVf;l0 zSw`9Ku6kEeI&~9$R9I-|X#SnxDC5!nK%KFj=v`!AMMh&U*?hN2Ux;OG*;v?M{6@tF zwwKjNgF_Y=@%SvJO8vg;e@oOnjCejPB_Ho93;&o+sW=nDj|PbYqph4sTjFYbNF7q7 z;e|ibZ2pAw6zVMv#8{y_2@Rj9w9k4DMqVvXs_GGPaepRF(H+nM0ymdu Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resources_fields_b7df460e812b958de6e703d8ea325df9aab3448d0409ece3f0baf1d26629e44f/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_c1b9b8bbe62a89fc36d21db697688ddf4d34adb509daae02524ac41b312105a4/msg_GetContestedResourcesRequest_f063860c9156f1eb609f8f0cccf51b74928ffdfac56bc589d217525ce101d35b.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_c1b9b8bbe62a89fc36d21db697688ddf4d34adb509daae02524ac41b312105a4/msg_GetContestedResourcesRequest_f063860c9156f1eb609f8f0cccf51b74928ffdfac56bc589d217525ce101d35b.json index 250f475abd3a2f7bd3c8f04ba991d6777b555deb..2b45b862edae0bb835548112aa89a67b36f2e2b5 100644 GIT binary patch literal 18532 zcmeHP&2HjI7~FH70&(Vm4NhS0`xK)HA;PR8C1ylOG^;4@z8`M7+(SXh-8hajn?s_e ztG~bcs@n}jdA%A8hA->w)BUC#ejB{n%l*U{V|%sQl)LS6wOicZ+4T2n$$nWr8ISNH z8&885^I833Hm}FoO%c2p=fR7cz&_7|W%(qlmrcV}!8jWSQSv-=oKI@=dEhF`uWKL+ zO34FPSr%AN1GnLtdFUuuKf9>|OoI7*8W>E%D#H9`fkieCTup=6v*OT!TOVq8w^=xV$fiSao0Ct$zV6e+{aM8h_d?x7P7$)ywkXdHwWT?`std z23gST!5}EdpmD(KU=UVeU>06XtA4=8xG zc`kRylbh|`db?OYt<3#>`H#UrmJd&B82#LCUiS3uw$JM-r8oQicJ+4k*VXIr@9lQ@ z?R#eWvL4Q+qb!?_tisH+v@b2oa{I~bXAfQP7ZtOSb=dk>j7NnHY$h8Oc{M2Z^ER{p zZ40W&!+2aRxEU2Uzne@(#q|Mlwq|u$GZ{^16=Z|T?H+Q0Fk|MaxX6GIYFIhQ^hp8dx1D4b$)r50#!O`M?iDp&wU;rUjKAl@t1L zkoj>{Ao(V15ZwmW#IW|z+^2fncU}|Dc%sg-ft+o?%tI|lwcBE+F&kiwk5xnL(0BQ` ziqIjew@Iw1G~h5T7S{!b0%|>$C^;$?L<^}mX(dYLSa8U)0VHCvL&Op#Gvvi~ysa)5 z8+X~q>O$B))`@c-M5S>k>T=H=J6l*A91C6kSOI_yt_#q)MFF5Q8QJkSyR2OFy*x)n(F;Rfh)Z1k& zkzrI_Ut&A?OcC@llqPI2|A!r4O*Rp82&*Xd!ipXGro`P+deW4%A(g4sY#G zZilp{a4e+3{Q|_XT5pOkSzWPOzxIfd1;lKCC}AZa(Ui7gfnMQIKxxSftF&0`(AU+) z1;)pUJHA|{_D+G52P6a_tkO6Xu>{1i92=)TS*kzs61Qb`2sT8?oS|<@7XmVm^AV+rP?>Vh_e0HW%G!=7Bs+9C>F77jlnQGQo;aa8(P|D(&&g|dlKRFhajy#nGR z#kcZerBv{>L!IAjRT{n%$pTJnM@)FmFi9SERF z8r&377a*aisJf70mjV#U3n+~!!G?g+VsY{icGSrxtN@{L@BdXxf8SPkHcni71cXh* zT?VUNZU@#O(h$ejx#T#^Wa2!QKChUcOFo}x`k=BB_(K zvK3-61m;;AfZU)(%|~q_Brg;tI22aQMp`To6;&5l?eba4MET^q*k5U}K7=TijZZ%A znR1z;`g;fHNmD>C3mcFdgvS?J+18|<5)TfB(%68NC|N+v#)S^~1c1Y~Vu4=aP(XqWk-V@ySS!0 ze)Qj^q;V+vB_NK~`U%jaWX`Zl0U$$80}vAhh}8>7I22Ipu|$SZv7im{xQVI@4%>d* zs4G@NhWaD!ujiNX1I-JuG32-T=RSMS*Y)-MvcD>6qz$nv1;oc!>qp9E!d3?nC*LHN zV1soChiS3cq2I7w2ph?B8i3la>%`Xt?-nag8=m=2|4i#Mimg{Cz{wA|-c3>MtG6ct zXzLR*XhYm!qfQ&YE7e|Rhi=C1jYt1H1ZpwJm26K>7sCEONi{GNd!E`MFrSRFytsY) E51v8lS^xk5 literal 6736 zcmeHLU2obz5bQI*!s6KvoIiredw)d~Ap}l^L`-B%lq%xCckILC=^ZvEiK z-PzgMwJ~|01i|z*FAv*&F})AoaakYCXyaSHuF?2W|3UXB|nNJEQ(DRmS~jNW+qjlNP(lcOJ4|-iS9awkyavsGDfl!fz_CW z0!e%}?+V0n9wm|xYZuBdlMJ&Es6=XK>3IT=ZK>&Izdk+6A0Ord-D+ z+@?pbtGw8FY`UH;+f}t}s3P!b54y#1w`0TW{jsRr!+p8Q%jN2@2K=`80r%5tcgUIa zQtn@C`Kt1mHd_wnBFxfagzmC)B?81HCiU%Kx;s3 zl@y6>QEP)nnzn~XYR!;{;!fu{Z=Ajv=5`m9@}j zBV$L5IFwFfoOHpl;&eLG1!H{6kd7s2kUVi_&2T?Pm3$=qOdi#nxnJp`S%aY%Ad|E0 z;wCYDh6L1EZ~<;AK@IJVMiE#-4X4CK*O(Yb4dVRCb}(G0<*ynF+fl>cUMqsX;WyFn z)3qpv>)arIjGkQG9~8AaPXp!c7=hn?9iwhv@|D;{(pl+!g1mYLO3(tEwsu zn>B_ivYZk=&d8WP={|o~5}8KdbbP9R|Lt(A;1q#IyBjy$R@e_X6X`unPxgT?VlI#hvdKMQCe#xfi!g6&I((x!LYJ3zioKht1!j$1hoXh@gSpyIF=M?k8U zAwLf<0tWM(t6TDc0wTR3H?Fq8z>T6JYcVxL()alEQxg_tX zX9DHDst-yyF=*U=$%4V}G8BQF`*!1E7hn7Oq$SA5pJ3mZG@U}(V7UBFiOgE6MphVx?xkw}Ta10I>MqhGRf`+b5+w!Pwp-^LJI8T6qH6}3{491DCDwQAT l^d_o(69hhADx8*8L+ir7h?|!2Ia~iLI}R6dXrlD-^b3|d7Ha?i diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_ca7552f3c1737e70f4781f101ec9bf73f52ab260cbde3cddcbb38665da1db8f9/msg_GetContestedResourcesRequest_1935cb975797e6d5dc29cca6923b9c94b8d468da725cc241df1601e630036b97.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_ca7552f3c1737e70f4781f101ec9bf73f52ab260cbde3cddcbb38665da1db8f9/msg_GetContestedResourcesRequest_1935cb975797e6d5dc29cca6923b9c94b8d468da725cc241df1601e630036b97.json index 9a4ae8f8ea3ac501faba7172103b1c2444214a9d..2f7f95e70f0a1892cb2cd297962dc1976d53a545 100644 GIT binary patch literal 19132 zcmeHP!EPE!6x_4F0&(WR42%uA?;+n1Sr#&67s-JLu(grpf8Pg9*K{bToo?C#&gKwn znCgD7UcKs`9-QR$rqk)Z%vS69a?$?%0W>N8-}BT>!KfIDa$Z$IjEen-lytL zmygfiW{b_k=EwKh!(#GnW?i$p-zM`#7o+Bj>Fl2xovi=2DV@_Dg2yt!OWXRC+F`q9GA7k?T2b@H^HVbb^2@?|UHX7xPVQF^nV zZ#Qo@f84xw|6HxQpS~34GVA1M*ei-*&nhg;QQOjrqO?DS{n=%vto@ilZ#ddPcCib)gy098iASQ+Fl03q_x3l}+r95K6t3o*vkWrLeAbh;Ts)5@p@v-XmPGI% z>%&kO$5o+aL8S-fgmD~Xaaq0;QWzQu_j>-ko!s<<0iIO=N0U+;hkF7WM|`LYFUV0I0!r0XjwA zOmeUr+Z`y60-LCTTx?N5%n-Sl24*pNKvB7x%;H=Sq0KI{P#`a$Q{-FjGB?F{Isd-F zY9Lp_T88<<9Y7cWO=0B$u^NDwd=n^pF2OJ@mk20I&Xvm>pw$Nly{FXY!>g?e#uld( z(Mqlh$|Eu!9Js@~sEcDuj{^b{G=!rB#JL1RKtd=Em`2{^!h3GG5g}k&F4izD7u4WZ z0?IBFlZP5nUB)aCFb&Gx6tx^U7nHwjQ@o?%$Tw*UciHFKe_51qrEsn$3|nZ5FIgSh zvmc}{yBwgrXbLNjSyAL6uLvk0kxP&lv(j>LKwnq>n3HJ(!SBh`tg%5$C;V$0w_>ElI54WPrQB6710D=Y^AT1X( z6ag7Rb1(Z$Nh2?WLS5qF+kyd_(BP(sx&R4BMb!m{Z5lw37f_l|LJa|>SG&NXWoaZH80Tr!|E4Mo2M#JRHX0H{lp%naK!02ne2 zKr9rXsJbw#&0KSy{GH? z{rs|n-@dta!9u|sVpR%=eVBbq0YgEaA#ZH85i$8Dxr7=_0|C==aX{47!aq;~d8Pp< zcU?z*P4I5H;=JLNZ}m;;Bbx21c7UT_aJ`$O^1Js+43O&^Gk8OsV54>$zbe&Q=78>w leeZFwi^47VlF%NSE`|M%H@gd)V$W0C1jd72QC9bF{{pX4UhMz? literal 6940 zcmeHL!EV|>5bc?-usHj`8atTWd&oCL5wgH(k%)wVSK#kyH-H#mOmLfWuoK8yLFW~q2s z=H?+^8e1(g@i0ro!$RaIi3m&P%7mpdO4w>9sw9a7PUa?kDWFtxXB^y;|zSMNHUmst}s#!JfujQ&LUP??2 zr!U2}nlfrzZOUK9TO58qY>>2V-XAt5>d+K5=HA7=6}w}3_+taiE<}+MBab2>3a**x zZWKu^a4IqDHa6u>JvrLSYU8jm$~D`fS#?wq_`C<*>bToc_IiJ;8vAfxZ_0XA9M*u} zRzKi=E_R2KNw4+(t!-jcAIpx?3ICoZr^&a;$Mkz$PwyWUwhWWZ(^#oAhC+pnYNaWa z;8)?db=|c=Ssr7~m|`}IGZ;8gah7z(BF+}A0q^-o+j*Sghc>)2YaVBJ-O0Smf-C6( zd*l`^7vMnaKy;N1iG5LRgGQG1he+&rY7m`hII}vKYhtM0sc32R#Lh}dOvYHj7h^OI z0sS!q)LmsQ$n4r^h!KaalQCAhz|qYyeWnXWxMZ}BC1{X5ac13cZ=*^+BK=Gr)w{Wm zsOZ+f7XxH+)+z#6ttZOcb zQ3Z94(f}YYk>?5%kOr0Vga&C0#kh?MQ6Xb=E#O#lzZgRrG+e4Y@x)lV0(VSjg-``~ ztAvz87Yz^9AvtmnEu26(M5f`=pzAXwLY4$EUwa*{Z8(+E(A@yB@N0!&G+%xmb7>F| zF1O+AvqeMV(8XXEN5`NRUA>&Id5_8UBOlh{Nl(Lk40B_sf>~ElWjYPF1d(aDF*@Cy z4o_f&40rTBhEZBnfvlIG26yACyDW#&_t0#whkQS#Tkhc3Z6-gVW%$2|yhPWI!1L#i zowqgtCD^eWCMcW05;TacN5EQQ%7bH)+O4)+ENba;V*qI31n!uYgY?npT%~kbH%|74Yhx`xW6&0US3p2r z%hNG=Jw4+lAdTBp=yViiIt?PT2|RIQh!b*`nNEYqA+;DoL*sb5%Avr}S?()E#<+Yu zR4p13hb{tIIC4oCJSqp|`Lc4d%$xuJ{$LhX!?^&`7;U(mDOa5%@RS&uI{^dtFa!s? zBtPV^1P!@1z2u;6;f{sSu-*WHx3cf5`3BhSY9BNHv6+%#cyNX$C~u`DS@ux7@I`kg R8O(7j!EHH@RgyiOegn=lKM?=` diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/msg_GetContestedResourcesRequest_7dd3b1061a019dac5fa1f385b8bd5387b9cca48a3062a4db8bf0341a839f2bae.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/msg_GetContestedResourcesRequest_7dd3b1061a019dac5fa1f385b8bd5387b9cca48a3062a4db8bf0341a839f2bae.json index 9e878a72aca27bb2dabcdb06592e55db6d82323e..44352f58b79a9b903e5d86cede8e165edbf5fbed 100644 GIT binary patch literal 60056 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 literal 60008 zcmeI*TW?&)l?C8=_OB51%m;Rpw8XsSJxG3lVF(sLl+}~;r~8sojM|qE)nZH z6AFXCKucn?t7>1?+H3DRZ6v>a_vq2%U$5W1efj$4@t+?3mbd-I>Fv*X_x$zEyEj+Q z-#vTzBESA&S<+?4v(uB?H;2>n&6~@ocW<6v-u--daql6$FsZbmz$#w$M5exIBY^WZjL$}HoMO^$8OhLZV%e5fBNLkz}e>a z$MemGvuzYx|DJAk94>9Z(jW6>c6jF-K~84?&?jjU)KM6_3Hig+p^%! z-u2Ck&py4S#T{E7JvwYik$0OMJbJW^@9Xc*HX!7bEpUCi0r;~|KiPWv@!I2t0@-@H zp@_Y0C)vH^qp1*#7^X}7MzJBxK z`pvVex6hORmpA{DkAJ#)_4fL9(=Tsc|61hVy?KAV82vqe|Nh!IP~X>{G2~YXmgy8FP?VY$D6iW&-3}$R^6^msSY#Wp9J>9 z>FM%M_>gxKC)}MAH|uWQJZ&g-`}?~ide+5B+`3qP8R@u-b{w+(`~2iGel6jSb1yHJ z-{jQA%jP1U)>hJ#bzOd1|Lel~$vqyWa^uUzS^vJ*ospwt{DZCYyU=pP{ri)Pk(-h4 z#r1}Gad%EqRG%(RE)Gppe(oz7OX~7k9KAU9H(hyO0uP6Jn^j8|V}13!Z05gBqrScTz_#Z1V>lO_7e6mf*Os-cgm_;DtizI=XvaeZ<~i{ciJwYJOD6^bobpO{D=`eNj(R&4B)H4XQJjBGyo zd~wnmaKo(mE#;$}Upj}&vSkq5wj_`zV&&d?-Q;b}(!Evi@s?KYy{fX^lA;$NR_k{}ebWVdy6=#Y797vXt(fUDHvQt^`~{mJqs_QZ!0iLa2#Fb0BIwzgSb2 za(;j#fl}b&l88WAkt|8zbbb#{2-5NjoN!~TCk?MxghH~4n%|US6s>68lH4NP#R5yU zJeL;P^m@PRE{UblP8W@;oNQ$~Tam_@h=v>?R9K?A)Q0TBzzP9D+#Gl`;`R4t*ni=l~!Du1m=k zZOKD0iXzj3o-d7~iH!-Jl*GiyQbC`-%GE3FfYkI|3~8WB#ZjHE@lptbdosGLR)l`t zvSap+AP{LoKa}*+;~`BX@VI0qq8Jmx?G?Q+LFQoF9~B ztgTCef@Y~vghf~m-9=bu6vQaZB@r2IyY(F7?RuPQx zLN^5*QR-Eimy~vakcuc4S&v(K3nQnD{2&sl+^N4HIU9bHsAqWW@LIh`r6@jBzi00I* z@K&+N7SVG}?;a8&qiRCnYhv|M7G;wbGqR*xik*;(*9)D>C0V}~g=$n1t60P_x-n($ z%1ap1ShQEh1U?@aGvvGyc741O4QU`c;4Q;Bfl?Dfl?IYr`4*~<#vW=(L5+0HBk~Q_ zlQXtB`BCM^-l|-k_dnzz{tyjRUgq5nVIFX?0;;7Etrit+nM>2`de!zQk8pU0iPkvI zNW+R^&9P$%v}6Rn1|F5B^nQb0lMtkcsuDYRP6I{~D>F>#kv>i)0)(0fX{q|09%Tq# zH@ZbhxPw%JcoQp(>f$`)7dX~LiC1Hbkz`D60(z|=6}tr|xA~S=wMmvVQ7I@TRk9?Y z566h@af!sUiN*HUEdqBIQ=;ns;uRrCF7)Ox`djrTA{j#q*Dt>Afq~_ zzxruuQ*KcTS`J#O*vJO`C{fwcUDBAc*fcGP3KsJ~EF_#?U;h=mv~LNyCgPQB>3XT7 zt`FSuyrNsOUP&b+FFgdfI77X@A>^el1rAD77%LMN6M}C=3{AueZ;2IYLnUf1ssgtLQWI&WQqJ9y*r`IZJ|ZAp zyH>(R-IDb>pvE^5%pJ|8H7mF`y-AnMkVP;VLo1xCP*JF|2SE~(%m%^`&8k*YXBDao ze3Vg$g{xhUEoS8&5lI#kf4Vp!2qlQp#aHrao=~O46A800g*>QrDnu)Ph|<`sYr=KD zfk?VmD?-#}c+p`Pp9Uy|J6;3pl0=cfo2wnOjiz_RK0S2RB}r5fj0vgM5xc=BiR$_B zO4@WAgd~=Lt26#Zq4}Tc)^U{bv(TGRu7+bpDEB(@Nfav(l&BCxxL22C^3hJwtP)YN zHmmv6Rt7O7WX>n~m-gdEJ5{nR2s=QxOZ+>QYQl`AB(k`7hj~KGL2mbgE*c zqE*L|C8>zftyszuK1oy7W9&^A!M#H*<@^;6&23D`NYlC_-X^hmNgySaMA7pj`w~TS zh1ES@O6p0Sp|+)MNGfzs5B0Xv+7YjsqD+ZWp=FUMKu!E{r<=bDrRWgBf-Z=Rx~9?? zrDOsXmsC0uyQ+sg^l0FcsQMrFk}T^ug#NTzF-7Kos+)RBt_GB!h29iG&ew`4%EG;B znnY1n1PDshjwwZ&bwt2AsjOG6nD>O3P)y^tc-}4JHLbwI3JHahVKqVcjwmR0S{zE} zYbKfmGP2V8)Qh-Of3zy&l8k%-qQePA;rFZo_k2;*tHh3Dz@A)5_i6Wx6jQFUm=F&Z z?vj~E_e?2?8Z>0xvV&AY^^#WUfjzD!q`{T62=~f!VN|#1)5vIo1X7--`b3=9(!jy2 zvB;Ko838?uwVGN=NcH(rV&E3Rq3W*le_Vm5#jU(u*bX2LP=qAqA@MdQWc>=dHjX9s z`M_JPBlh|9;x%M7A(}8^pO2y;NTPcFBDr89aLWv){!|7rMKl_vi&?+;;|e_a|7ocG zC_qpb&iT~nMP!t6ZCf(>jza6-)AG{A`sfdzTC64ng*6b0T^1W9M2I-~gw*_E$;QaG z>Dxo=XD$vx7}o#PxRgm-9=4>MpAhJ(+bz*6;aeTcdWofrmpOz~q8(E%StDa4U&cU1 zP=!4}khW`n!VQ@~dhwCl{Xp3umUv4c<*Hty1DQ~6uv(>{?N0*_c3Px~1!v~c17$p; z3pv(|DXFG=5YfAIO|Temcd7LKM@%~f8tJ4`z@-<4lb|h~i%PFOB`>j3hG)HyWQUc` zDni{B>2Pein#Ov&oA{ufToEEoYzj(M8oyzQOEwLLB=~^0=@lg$2wF|a`D4ghO)7qmk)QA^oC5Ncc=9vY7fyLXJMmSX*HkuW2A^ z0Il3kO(3Y;3 z$MtKS5(LW(Oq25(J7E!^J&^f^NQbZGL&VEKMgE6)VaT*-tS%vN-9>^)f=pV0_^$C1 zg|b-uAIY(DOOKPNW1=D;sMV_!wODCwx|NaPc?Palh)#(G?^DCdyjMFj92_N(z+u%r zW)%^H6%Nsa6%lG-5pz_Y1a38w^Q8>;v@q;?B}u3lP^R^E%`GDMZOX72LrH1)q@_#K zZ{DUewkDaZ?7(r_ACk~IucPe$&qojo(1tZBA>q3tMflAB8v*z5UajRrSY)O`9oRQo z%!`0ZQ~W1cPL|q_P|52Rb;-!Sw6KBQe3lwTCJMP<)I>-qQPfIIpoS;6WJPm3ykZ1* zq$}a?s17Q?W$@mUVNuaFW3r_+A~%Sd*infoE8%cK-v^4uf)Y`$VnQmVWrDG{QUt_$ zrH{Xsv5ja?l~|V&g_Ko7wyV}4i3nY>NZCFld_8=DV_xLzRa8q6$1Q|KLl}}ZJw>m9 zO92iORvjS;Ra3GmaPJ6Qd0P{SBI%XfR(5347^I@u>y=c~2xLAAI=q4=DH`$GvzHxD z8h1RTnntQc6S*X?AOA>lSrs$0VFB>Q%6iL^Ze39F=ALe%7fzK%Xbo8i-0dr56#e zOMyd7bW3DJ9`;rSX}z`>rIQLsrULaJWxV~%XB(2i0+&G4G2uqIG+z$!gosz?35A?b z>%$^}V67d|rB%jd%Zi%xyVWr%iaM5}Cit|70tdMi(U6-|qmD~TZ&be~Dlg$x9g8e0 z=s0c0%KDOFyRm4JQ-;KoEM77I%CLCF;uiGLu@X{CK4l`sI5JFxDUHQM(;E@bkTaPK^&S!VhQnV zVK}gC_Y9_vg+HA1*)boa7{;1EK=jdsCc!b-QfMBUg4I?2(^z92;M@} zv6hB-HF!dZjA}CWEkhwPN_)78-s(gh|Tdwh5}5$wpZT1i16 z54(lnNHt09C6!;2nl70V8-=8I2O?{FMNHa0B)3iMBBVgAkVFtq6jdI|?ZRFHy@;b% zBfSu~=aw1)`CpQUfz9~618HbSq>IbehW$RD;2Uw)=_%aKPo|-|VL7PEj zQA)jm=#V5XkuyP|x-)&B87R!JZ=}-i+gWKnKGxYuywF=4hESp?NVzqNh=vfmTM`8d zS{>8Cu`LZmh_v03^kVqwEmYd!;lI1{{pQP~5E0Y@5{ZGJl!nMbNTyLBwxCo%aWPFQRSl|p&b_-a z{k1bY_s%`%d!6~$@#^tcs!vSm)yXb9CG1qnPWg5Kzuw*q|IvS_WkCF@4GtPHfFrH& zj?uY1m640mye<{kd`lOiyr;)JZ+W~RfH%T*cw)0*o{WbkG$`zFp?KJYV%~=0LIzeP zZHTs*@TUeBhrg?t5c|Y|XvD?414E3T2}3UD;HsB3A1Brsf|qI@?5cI)LahatTo+?$ z`uoEc`3U~L+SOBOSetX<$gKjOp4MG#x>2{_gB1bHt@e0t&d2@h4IiGVNkeGBgNHp= zR%Rio~3*cy@dblTRL!mp2udXp{oY|&%B8Ufs5B3A&pOaOPq16+Dp7t|7bL?AF7$Jzp%_YD`1 zOzUB|Cm~6~ExhIZPXnC$f#%?trwKTo7g+2vLeLcV@RkADT^RanZEz2GF#3?M4lFJN zaLNkfwiMyl(?N$Rq&#SPNbu5u|J}R@lun2SSesS62PA9y)gE$$^GQ3U4D&)H@_n}!}(gxh5ok^q#s`r1jTz? z7{0-TealsoTnt9n5Ou>F3G&IDA+$8UkuyB}piM~-SSyTSzK>Y^9(B#_?C+!{TQ*Vk z6=vj`Ydr)?MOZleqLv1|P2glbU7T_h$(AjkeBjE`+FP24Q=S+!TGm zWao6?<=-kckouivyVYgOD1>n#)uqpEA6LWVY}a-4zc9c;ZHS2jS{)E;yS~})&VM->!Um7hs@6RVSH{a z38zw2(=#MuZtX8C1k;MMx092&uIjCX`o2zT_P$#M{JY)d0D#8qqQ`Vfk7GSzJ z4SV9RT2hv}A|r*Oj6g4|gv@oHojXLLg64t`vmF8+kNIT@UVk~mOo--)0p8!Wgkp0+ zTEc>%SVHMo1*yXh2*K;&1T~U^e3gJl1_hkENwAGbZ3BugC2}S*1lYjZNlH;jz2L5P z0<-U`2d6Cy&b14ee~hwe14)pz_V$+&OCs=zUY`u+9vI0!HImi-IFi-v&!O;j0B?Tj zL2<^{Q%QVc8-*A*R-&M0XD)q|)V0%usTy0E<7~GwHDxRg-A$7n5$8#(AkB9zB#4U_atDf+zb;rZR9W6nT5C7`)#H7-pW zKZBQ-37oz{PbvXFaZL{tH_@EZ-199og~$~YtGH>SvKpIRg#)D?wN6^8G=_h($yY0T z1I|D;I*no_1-zK2n53)};NC2ELurtNQV~LFp*f(Rf+)6Kw}xiyQ29ABtPamCLD7Y8@?}<{$43^pyOrppTd|%=a++G_U7K z)hk?1H4`U)NAr?}h{GAfp-&WC`<0%Q39iT%%p)HzRQUDN!8C1^d#2X7*he9avxoHz z4y~svLiBp6HfL5^2FRg08a3l44E^4Q#@_qY_?Y~LrYpPfVn)5MnM~IfkgCbrVf;l0 zSw`9Ku6kEeI&~9$R9I-|X#SnxDC5!nK%KFj=v`!AMMh&U*?hN2Ux;OG*;v?M{6@tF zwwKjNgF_Y=@%SvJO8vg;e@oOnjCejPB_Ho93;&o+sW=nDj|PbYqph4sTjFYbNF7q7 z;e|ibZ2pAw6zVMv#8{y_2@Rj9w9k4DMqVvXs_GGPaepRF(H+nM0ymdu Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_d838e1005b493d45e2b6b39712f4aa144f22b4daa1470657c0ab97ffd4f04455/.gitkeep b/packages/rs-sdk/tests/vectors/contested_resources_fields_d838e1005b493d45e2b6b39712f4aa144f22b4daa1470657c0ab97ffd4f04455/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_d838e1005b493d45e2b6b39712f4aa144f22b4daa1470657c0ab97ffd4f04455/msg_GetContestedResourcesRequest_6c409367beedcc384cfd90f36b1b38482a11c7731ba150ddc1812e3310013c7a.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_d838e1005b493d45e2b6b39712f4aa144f22b4daa1470657c0ab97ffd4f04455/msg_GetContestedResourcesRequest_6c409367beedcc384cfd90f36b1b38482a11c7731ba150ddc1812e3310013c7a.json deleted file mode 100644 index 69bf65c5aef6556e60f25ed17a23ce6383a299ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1029 zcmZWo&2ED*4BnZih&XeILt3D>9d?`c0#$`FNGBv3st~G874JSLZ4*~LAZ&l1|D9{b zSbouV9ww9T*cDZ8;88}cn~bxnbM4Thc^@dACQ4pJ1-K+iQzxZvk_^>`C|nSwBK|@U znkXUBBxMm9ILRUe4J^v!-jGlrwg~{ziXfo?h_@tRDW{=<2*0jUf|A&UBn~C*g4S0P z4`@gzNpjbl`vwk=RCzyj%Sjv8y1%n-jXG)E8d^_kFnMGRrq{m_Ju8bIU&wto{ipiY zV`9!uS=@c#U(~qh`RNMMJun7j?TnGe5aMLQjM07&1hQ|>mGQ0)Fa2rLzf_aDzg4ST z8%jmuaU!>j*L))c^r;WLXL1~j@l?WNXwTjlyBn8Y`$ysIqVN3m!Nzy97>A%)#xWWv z+iTmZxx+RF^MmkFjkAvU*-jU~uo!X0xNEj%Z`n2fur}ZA@nWjF0DxkOTce9&fU)*Kn9Z^b@&kW|56^-e|k^M5&!@I diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_f7abf9d04f5e79fc1bbc2cc010a229ec4b04185dc80580e7e8dd783b45c4eac6/msg_GetContestedResourcesRequest_676e45023cbf73697f012bc5ac51a7310d759b9fe67594f3899f1e0485c383f1.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_f7abf9d04f5e79fc1bbc2cc010a229ec4b04185dc80580e7e8dd783b45c4eac6/msg_GetContestedResourcesRequest_676e45023cbf73697f012bc5ac51a7310d759b9fe67594f3899f1e0485c383f1.json index deec23d8ed56e592a2a29004289d6ada1530339c..c4ade09b1a6e51e0944470bf114685dfd734f247 100644 GIT binary patch literal 4823 zcmd5NlasIETj%*nUlu@9|HyZ!J$noTK-Z{UzR?)#=?7wDVwDg0G0!fgibZ}_6`vb^Z;RXF%i?N(%X9nXRbb4}%FuU&@Ew#VFj8e*LP-1x z{FTtMGzvlojYb;-*9ow|j&K55ErN0%JLNA7s?B=sRt764SiN`goM2f)+8186jpz7b z1z}NzEg_wVcHpifGbjKJumYqP1X1MPg^tW2O$C_HmJ!4pqO_QsI%z)HoZ49cWmpQ$UYjHTXg16NAZS`$ z0|5u1X}Lbu@V++@2|m~Kl7=S32cc;~naWei|Lrj!Bb2E|bBKoC%jT6rxh4hd$@R~G zPq-?3Xf$fv_fKHsH5Bl!yZ31Ud+O4;dgaxJkv>adLsjU552*Q=t=}^E7On!~KEX!> M(nX#lWU#*d1z3Bbr~m)} delta 425 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_1dbad85f242dfc488bf6a736c3c55774151848b669401ef44deadc605b0d278f.json b/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_1dbad85f242dfc488bf6a736c3c55774151848b669401ef44deadc605b0d278f.json new file mode 100644 index 0000000000000000000000000000000000000000..60d16671cad35307b1149ce2a1e652e23c03cb78 GIT binary patch literal 60702 zcmeI*OK%;=6$Id{{VNEqx!~nPBE8E#NPd7}2#mx8LS)L&!$@H0zo%-tMUE`noNp2> zf)Kcpc**WQr%u&*^jtyu`J1DoCqLc1efR3k?UQehe$Lx|O&x9^|7|JRQ<&u_1PxCv|d?hn_m zZlBz(dUgBq=AU;z{qg#3cKkVO|9JcIPuG9Fd40d~-TUje;eJ{F)Aj2QH}5`E!Mz@i zjt(o@kB(Nr@}rYggpZEac=E%;itnyHzth$CU*NmBeffnq_vnYW*YBS%u4dui-mJ77 zHID_$Pd~%)OYc8}ayYCQtAi^Yed+!$7O%DS1@g6SmxJ$-f8y$MrvvH5>klt)nu~wC ze*NxdZut0VdGhtc?fd-nPOVSgynT7|_WAX@7m3}g+rQ^$@85p7x!dsL+c!T|B>m=c z+Qv(x2uetZbi4Z`8juP^d-ejWNgi_VWPF1zmY zP3x`a`T6gyx?7v*3^PxUqnK)_eL@MjL{G<@-#r(+wPSvAlb?4&g z!|seQCFq}Qo!_I&L5cW-h#HX*p%L}P`=Y$KKWYXlQ93MV4j1$G>Eh_wCyy5yY_M2| z%SELV>(lwZP2B3h7NI3X51Lxy|0OvkXeHUeyAxS|)VEikG}jP+&geq*;%CAU=`7oS zMKp)>v)}Zv@N1_bDBy~unpw&7*D~pIH69M@NH%kYH>3%`hPGTS6eFfLirUMX8BqzZhk$OTCrQ`m@E#<}DSgpeO~jK4kzYD+@$iN{+ZRqM8)7z$Q?_Mddo`;$|-DSVVXNj)iXW zswUEHg%PGB3LywtOmru(c}c47K;13Kc(D##|3ztS;Q9Bn+bD?hluY05`GO-MXbpD=Lg+a+d>K(Lr z5Vsv~*JEmTOXT|C(7PHcx?bW_6X{CQVS9c=PF_W>vVITnXjSE%SW)#r`kHiyTN^*W(N^?=2XNv%@30m)YQ6ShNw`-&Fi#Fu^k=pUf ztWXjSuSBseP+C3oVxsbk!fA>~h{QyRaBb8jwX$zq(bS_@E!a(j(Yd5*W1HeHTbfPT zLb^rL>s5e=)a%va*!G0oXQjI&&Byx6c=N#7ElFGInCZwnyb=>LT*P}&sI-={RP zsLQJ8jxvI3EDA!s6a)gE^SKz}mYlx_1yvrc=O~Z1OVoM05_(k;YOzWxNm;0gtfww8 zu#1&qm-Y23q7ue;#0nbUF8`_6CO(9>3Pj=>q5#=Z24zbW%O-+FxE|Q8h6IB2KJur5 zU6NwEqQ;i|zI{tw%A7!fN)pMXsa{2g)MBD2Szi;WoTw<{4zsnTMxr#hCL#viG|zWS zx{}oYu9v`0y0I&1*_pc4`Y(5%0mMXt&*fsG*++CBg zg;D9woQaHAw^B=4fq2EMLU4>JgNiy{X@ZN?TXU4V5TPz1ikY*d+bBxBO7~~rxj|EG zN8=F2wfk35Y0U&YUS*e-5qv~eAUa=p_aE@7ue!VrZg{(Z@KKw9nL zo4d9)2yQCe$gLk)tZegS- zl6_Pbc9c-0V*=UEMLMhms;Gw)x0?tTl1e?FT#CYxxDE;G(mpFx6Ywc(MLx1)I~VD& z6x*z)YLIl$R1IpWQA2*@Rpk*;QL3ip5qAkxxY$laxRdFt{wsI;?%)(9OzkQ*bPMoq z$$Ax)h`jRHOx(~CZP98|$l+R|v_l>P2$jJqTw~<}YPm)$scBRYW`s3icc>l9LV@co zKvJW?lYj&~6M{%_huVqm`Y+jCe`tLwKh{919?3ZCEI6w)7o>AF_-QUO4vqBTnw)+_ zv&5+UQVIf`foOOocN$pH5+wpHZe&yyc)KBg8kz7b!Q7#`qL%o#P)IqQD5$(>IZc$3 zHR4r=2bri<8$Fz|GASkX<66 zkeKSgEQeP=Sh(s>rUfnXI<4X4Tz*qgv1k{Fglk$6?2Yh_q{g1bxwfRIWl&;81$hA1 z@Mf2EE^S+7Feapo55aGbRnM0|_5656s8d=cu>J_%Q=5X zO)GbsdrIa#LQz%dr6#CFdv%FwCe8pYu)@Mj1hSGrR0ipq2x>~7EY2<|`(2N9M*9~L zS7#{W5+Wq7T$A>qRY~fGRJ7XMq4l{+%li70k%NR3tqKb@ku69>O=w*b6!j|HNzzq* ziLH25EBJ6@IwlcrDL@ep$F`UKqE2dvm4-_zIS$xG5ou{n3yD;m17t^IMZp^voBMT% zOOzxvS`a8NB>s&gIkN(TWLY>M_X^#FhTQNlDf3lle@Z;rfuN5rd-4giX*u)~znrf7ss!Pd{&1qf~BC4YBG;c!fU_`DV zlMxYQrLyEZgezP~cmfgQa7K6fp-WR)v6b=JpU( z7!uOP$1B^8cGd(Z;vVn9l7Q{Y*ac{P75;b^-gqBLPI&=o8g8zHrJK?m{b{yhjWYiq z@4~D9(B#YiPjGyv{SN1%3PZT=BS-0vJ)cHLDoQB1jx;y{wvI_%-Bb6FvS~tCm?#Ll zEH+6!a~E{S$BMPtlJn>`sbmDT4w#z*mYjKt)!%CO^Bl0cD5S--rtH@>jkk|@cN z#TwgMArs+Fs!Fx73{=~JxA2NWidyFF8CapOTjCW3Ds)Txm?o&BWsVXqY9g^x;5!mF zv7#9-ty#R{Rvrjax|^!uT4GD*mx#C|@~BJrB&1uGU66Y5N)%`zlBDj*>0Hvhx@EjJ z_pf1vAh#w9anpp9j)_9BS59AzxcJj_Ab%pf6ah-=(J3}_S8Z#jNR&i`T}(wF{vZpL z6S=fRi8@i~ORU67x8Mf{-QtheYDGFlt)zu%kg-uV!Ab2IKS(E`BQHd;y^IeoEc>v4 z?8!dldYCZOK_POgiO5N|G`0aE*;JxY9=cw&qzW(U3~4fEll%y;E!ISq21MfAzL-N7 zj0AJX46_v8?GVb5{!IXZ(DTuyS+Zn!%a#UK92;AxL3fOi%qnnPUkFlyY69oCxkc_- zb!pMbc3tU=L4j&v-yshTthNtq%_SmRX!g$45*5{KlD;|fLgW#bsLvL7fZ$kFAmmkw zr^JdCy9Aa{)PE6S>~Px6;j}yQRM4CByXh> zc{ET_prl@lTST~HO|`?k6Om@IpN@<8#mu# zW@;$osM~3U=!l7gSBiOcML@_O;kp!{Gjoeti9)3KPb*la$^sD~i<_rdnYYWkc(><5 zCIRu}>&4{pv%S9ygqq06fm2hh2=En_HG+e>1icPjkUPQDekK~a)4o!HqDdY6g8nq+4 zlTDNw!5+ux&c2i#f?pHjRq4?6su0m_dHmA}SB5JPD~qbqvGmk`U1- z1-O{#`k27%>n>6hcBRHv?0KDgpsaKq0`A^F|-{^N(%8FuZYB+?^TYs$YhnniHJ63VWH>eMO%=C#wUIGYZms( zFXv;s*&(N55i2vi(nRJK30GZGsi)+k4ol+6!!1L4Ry$IEwRfG2CiQf*uC}m~!|{%0 zl}NM{ZS0)Ozt*h%VX8ocFeoywf`Yne@;F;aYxs9?W^AciU~jJp?265p0GEC>7^E!| zJ24UwqDWf51xU}=IVFsUNG2l!yjx;LwzL?Nt`^c6`;Mm$607PeWm1YyV}&|ttk6UQ zB|2$NEwAmwFP zD=%L@yfs;Z8~ ziVVlfE`% z@A*-qj3!10PH*)mq9uP4rHo3%#V#VuM4BIRm$E}!vbc(pnozEB*zFd~j?y6vP7_pl z7SgwNoAFUfV)bACkm$GnV#6UH7M-?7o~ECzJ}e5<>ic)|^Kjbk*S`nxi`TFG;InVd KH~HiHkN*bOclula literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_37c394b62a91dfe665432198561649a7d9108f9b96fc074e1da61f0fa19d3b5b.json b/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_37c394b62a91dfe665432198561649a7d9108f9b96fc074e1da61f0fa19d3b5b.json index bebee81a75a8778fe65a0d9f0ed18a8f30d5698d..6cf6526e7788919ad2fba603dd1ebd3af38d3e34 100644 GIT binary patch literal 79045 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 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_4b19dc7d21fa9b40046ba30620118f5e2f72b636986d6f0c15928353978bfd83.json b/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_4b19dc7d21fa9b40046ba30620118f5e2f72b636986d6f0c15928353978bfd83.json deleted file mode 100644 index 91d68a5b909c98eb41bb31fdd33d628d0bbf1f93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63941 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 WjvaSj_!jF6A3XTge3O5E`1HS7*kQf^ diff --git a/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_51c71e845c3f579ad3ced0e35efed11f384144320c099f54b2530f0be42f8664.json b/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_51c71e845c3f579ad3ced0e35efed11f384144320c099f54b2530f0be42f8664.json index 6579c20b34d8155a849f6be854a874ab8921c002..001e737c21a7a6427e9c9764bb8e8444be30f81d 100644 GIT binary patch literal 64085 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 literal 67222 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 z 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 U_xnt<{>%?P`PO`sKfe3$4@4b!HUIzs literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_8f4daadf3e41747492cd381cbbd1cf33dd52735f597de4b4c804effd2600d135.json b/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_8f4daadf3e41747492cd381cbbd1cf33dd52735f597de4b4c804effd2600d135.json index 0a68301071229eaaea0b3e217b4cd200fd58f67c..065e6df12c5607093dd0cf535b46530511e431ec 100644 GIT binary patch literal 79029 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 TuY8O3l@IRyYW*Sq{P5`?ZS500 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_b4b5361aa4f0450e6537dc5135d6bae7b358c6fa9761cb65680f9e2f54c61f50.json b/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_b4b5361aa4f0450e6537dc5135d6bae7b358c6fa9761cb65680f9e2f54c61f50.json deleted file mode 100644 index 55e1a610b2125e12dc8cc5bc96c00038048f9db5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67592 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 Fe*m>x6;1#E diff --git a/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_db80e293e51ffd1cd840ffc18853abc50fc58895d65ce023d46e2c6ded39d257.json b/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetContestedResourcesRequest_db80e293e51ffd1cd840ffc18853abc50fc58895d65ce023d46e2c6ded39d257.json new file mode 100644 index 0000000000000000000000000000000000000000..9c32b4369b290ad5db1629929bd0ceffda046bb6 GIT binary patch literal 64086 zcmeI*TW?j#b_L)(_pd-a`@!26z~?RRQSt+hT8My8)H>a!#if;~#edHjs|tH@`r`Ul z!b2jY4S3sCH7{e#F=wrf;Meb-JbC)d?Ys9syuEw+mnXmGZNG7T|8?HIetY-f-K*Ch zUjFbV-~Q{iq{}WY&(H4PoX)RyZ*E>Zym@i+@b&5W_3q92#qQ1X-TsS<-Li|z)5Ef> z{i@y9r}Leai;Mli7ncv)Z+1tWE}lL7;Is?nVt3T(wA+2PJ9fY3W`EFb{fp-h1}=Bs zzqs0MxZFpv_wU7S$LVHw)YZ=Ri|dKN_n%EYee?G9$DeNRKD_+!Uq9czynFT2ZBWa1 ze|q)9-P8M3Kis{!{m=WK{`~4)cKmDB{`1|Ne|h!qw?96teE;FqyI{Yq|K-(>A8+4( z!GZ@qJb7~3!T#jQF0lOQe3#)TPxkTTho>FhU3+!UtM7jk-|gL--+1#7{qXkHhnJhH zS@^fNJ1&RKW5M>*FXH$|?{^8WM?2{Ic85*hN^D1S-dbTT2l{_*3R+t%LS zUj6v~c5e9ed3oydAPQ_{@dT5{^hTyR84B)@?v{kot*;h>HL&G`}K9c&aYG7XVKN!^^30i za?^h6Ret_wtM1pPjE9+LXQ4~h2XBrx9dWkilBulg^7DpJFXm4kajG6YuRGVz z9(QM?DM|lq>*^u89F&Yd8c{PcGBmQjdEY3nAC8)dN|sLBnZw1reYQDz`Pt)*1`8JJ zaIq+LVtqQ_x5--_SRqy z-yzK@4eSp+Z1}a)6g1$Hq@3B&^Y<$0OE#WP`%E@{8;k$A5ck{1*YzQ#aSz9=@RD^x z@h2wIss5~7cGeze;%;#(GW>tE9Cuqv_J;C1FiiQ{EpB~1T3q|}appOkUuRZ|Z)YOw zTU*N^bp7RKWqC`yS|1re$ch317s(NqMpjdzme?dpuqa)JE-qtH$3nt$a4c|> zS2dAtD~K>0VF-ng#RPW}o0pX8fvCF$5$~3?K8bxemfwwvv63=h=2g=bDyo%)k4Yvy zZ|tdDp<=fr7Oh-a-}6IYtn_s(ioy$nuTeV|Epvfy1YY-uS7c%v4C(wMxe9_(gVZ}{ z@c?c;-mb^e?v~K?(V=%YRCK-MrzX;sq{H_7kes{%a&GC zwh(U-^m>&*gzEKbb8Nj}k6Gz1Df6+uG+rJ!yCr2y9Wx#IfLCH-ri*Y-6iTg46)9J7 zY<+ztRIs4MO_6k&u0K#3kzBRndPoIc2#)C|)_7H2guNL)pd{I%rJ<5I^h&Ihx>9|E zU8bT3WCYpRC@AVp5Ge4R&tiyMa{iGhNO@GxksfWA$n$n3^r|FOu}Ue4EYw8SQx_Pq zi+4lWC5Ru$6*Rs>{*%}yKNN2nh`=>P3FLqb%9b#eO(Yh`E#-leen>a`zd57)kKCTuik32o4N+T?*>Vra7>M)K8MHg#bQ_JPv?} z1GKndCg)fzo`Vm;N+uIaROKE zZ4~iJ(t9NEQ5phzt!Q@})TK_H$wYLoUS&9ug6fuSFe6zjloCj-WH3X{SA2-TTObF* zC&wDgv58A!sg)2+M$_g>*%BPZM7UgCEE>y4PD0TrtUBW14%@S|JDDf)Yp99YgnsPfD zhaj%qzl=(2roiJ>cBzcuBeDjf^Obl15k3j~5q;A@zVdpC*A|Bu!tmt3FBuPrt37f)9#mX65iF#XdOo=nh9htt64a$*R!9@@DQihSs$(6CbXdx5 z){`2f9JEvuwP@6!A9+=Jgj7_jX?cWQ5)~}gfe3aoebs-(?${livV^5w#s+Q)yj!wf zNhKsNJ(htRT%s+iHVrvgOO_7MV+2AnScYq^d_XPMXeF9Pf-p0z1$%()C<_f-Zvj#o z4Lk)%foDPxDjr}v!Cn8Qy6X?EkMg4il6s`#th3;((pr$t)#RtS$T&30hc!9VFi2fW|S5k~1L? z5n~n|AZj3>@*m|)Ssh!JZzu*J%wW=i(bhMbT~`lCEh*VsC~I6gBoNuC=W^t%8y(666uMrZ>B! zb7|Wuf-xa7J_x^_tDY~3>iO}CqK>pmV%49l*A$umscxFpBWskOK#&v($~pglrWL#8 zo|1Wwq9`l$Qj@5Kdv%F46K8-5te`LpfvjW@l|i~D5;c`i7H5~pe%GVUX#XPM>I_v} zQiQ-2YvNwGDn;Ft3Rhb@v_4m9SzmuLauAWiRY9R9vIT*t3DqTuqFx0%DZ0`xxfQQ! z1s`rq$0Wm*0wm#ZY+d#nbxK35G+nCXIAAx5P)ju}Ad)yIkOPes32#^|_v-?eEJe<%u9{nPX?O)uZ;5KImU&eZsa!#@a2%i_)*$7oA>f?3o}v;%Qri5u zvK?q=EpP(v+g(@+uzeZ30Ie^>zukow?<1)x7m$|WvJw_}&K-~?D56J0%`dkEPyAt=l!D0W$Fln^1} zngBw~{1^T*~_GwchxGawSoUC5tt;wL&I> zov2E=u?d`5du`9Q=QzT15!Y(Eeh(Cxz=|nDVS)xu< z_>wEJ(k=MGLAUthwOWx*Q7dU-nq+L0EpTFc#t-62;K&Q3SeNmEg;gI4$dT$ptcMAU zI#CFnY9e%!EzNBLk!mW?NDp1FTvCQN>I`WzW)uA=UR$h%EDearxxScFml!F`12fDf zyz3zpBmJ8I5<<^Mm!@RN@Rlu2tT;BdP=oFmBbC*_aeYG&391R4-{uy%XVs;RC+ob@ z8G{m4VLw0*O{}&LY|RBCTWI#q)e;%iYLdP=>q6)em#EJ+@C1TmRRbZfBA${fX6%+& zilY7t2}=(OVT?(XrOhQu?1YaT!$%@DA(Is zCp0Kn2MF(@Laq1%F0RDEz4iJ00P*lIe#~+Z?d_KJ5Tb9ASS4OBzgYe{7PceHoKPl{k~E!-Iw& z$&zB3u_GuQC#34TIDvdU)jBZe9~jytOAik}S;{RP0i=5=aXQKP8#5Q!KKW zW#_@T&D-zmj&47V@s*WK^l#1;*N~&Y&5>U!pN$*5N=A~|lOTyl6 zNw*a%gm_0X%F$qh*qWtA2amnQ1y$TRodPx**k=e2#sD>*LF+m!5pmV7@W!xf{k|O2O)*OKtp(_5-th%x+RX$L??@96jE{B5)&Q;VYj}x{)DcCbt+<6VR}B^hMJs_rDZFs#^Zb| zIvhvawxp=*64JXBBqj{yt;f}+WfYD8r)rO)(T0)~(U3fPkO*wCQ+h;~Xygc;T$(iS z20~tCa1!;K{hdgwca{U!vB%2sWm0!GSk|P^f{;tyC3G6tQJoUd^(Sg}pspo~N=IIptE{KeZczx_ zbt#%mTkug8(Y2n8*K!e+ODQ5vY!KHi*yv{<1>3<*{M(Xu1t` zi#|k32r`J)#2CVt0~zZX1sqX&{+NZ99h(`}AvrfGc_L9O8CP(^?DQ^A>T1QWc&&XR z{02Q;D+Vsiv2aoxn@L6}IefjfZJcE2^%;mh_E*)y4;G6>cp_7AZ$0v;ye34o>P)Ck zB19Jo`4YeEQIQspU)fLO0Ekj5Uu z6OKVd)2po(*G~j7S52=5f;CbQNBzniTR21_Chk}!4PS;*?rU;5XGs{F!%vU>_YF6T z%XV2vVQowD7d>CvQ|X6+9AWH8uZYh?MAFs3mFkh)10bG1 z-ZG?TwIlUcd)N7BQqM-~Y709*ogHXaMJZCW*g3Zke=3j&(M&lFP;rdB!r8pU$rcJE zlcT81%q^(}_V${<>Yss2AlXtwvSr3jjWlqpCPlx|D{66#B8Uh{x&CxVxoznQD`(SorbbYK%cRbV_~m&H4%}T$`(p**C%SN z^z4!{Yz=CGWQ#QU!f^n>uu(xz-~xIbJCI@Nwu6eKy)8pRFc(CDqgc@S5jO#XoN0bk zIT5l05Law5r5Z?3s1@Z>CNXhr&@aEQ--f#-1ukO9=PP4fqncYH?SXrq-idL2fru0c z+$kk1?a)bp4qYv)Suf3HhAc%PYSu*4iJJu*N3r4KQ%ENv$_tQ5RS$o`dmR% zwehaq>K5KMiZ~`b8Cwj*G*-z~O=N&nukfDLM2+y}sRAnrQfqo8>8cn~O(7NIQpJHr zdc8HMOWU>m(T`K)*;qfr>1R3pDtH z*`Y02Tt->vw+e#kc00{PF##{|2a{eHH)! literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resources_limit/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index d438f5cdd3c70a33082da0d6fb21c942f97f77c8..e64b73d8a77bdd2ae7413c918f513e44a6315072 100644 GIT binary patch delta 2865 zcmY*bYiu0V71lg<7H?!{gQ0d}XJZFHSTnP8XJ#LMZR}(n2goKiL~Wo-$W|y&Dj_ye zTO1M;qg0@zO0axVA0m`?`>QP~5E0Y@5{ZGJl!nMbNTyLBwxCo%aWPFQRSl|p&b_-a z{k1bY_s%`%d!6~$@#^tcs!vSm)yXb9CG1qnPWg5Kzuw*q|IvS_WkCF@4GtPHfFrH& zj?uY1m640mye<{kd`lOiyr;)JZ+W~RfH%T*cw)0*o{WbkG$`zFp?KJYV%~=0LIzeP zZHTs*@TUeBhrg?t5c|Y|XvD?414E3T2}3UD;HsB3A1Brsf|qI@?5cI)LahatTo+?$ z`uoEc`3U~L+SOBOSetX<$gKjOp4MG#x>2{_gB1bHt@e0t&d2@h4IiGVNkeGBgNHp= zR%Rio~3*cy@dblTRL!mp2udXp{oY|&%B8Ufs5B3A&pOaOPq16+Dp7t|7bL?AF7$Jzp%_YD`1 zOzUB|Cm~6~ExhIZPXnC$f#%?trwKTo7g+2vLeLcV@RkADT^RanZEz2GF#3?M4lFJN zaLNkfwiMyl(?N$Rq&#SPNbu5u|J}R@lun2SSesS62PA9y)gE$$^GQ3U4D&)H@_n}!}(gxh5ok^q#s`r1jTz? z7{0-TealsoTnt9n5Ou>F3G&IDA+$8UkuyB}piM~-SSyTSzK>Y^9(B#_?C+!{TQ*Vk z6=vj`Ydr)?MOZleqLv1|P2glbU7T_h$(AjkeBjE`+FP24Q=S+!TGm zWao6?<=-kckouivyVYgOD1>n#)uqpEA6LWVY}a-4zc9c;ZHS2jS{)E;yS~})&VM->!Um7hs@6RVSH{a z38zw2(=#MuZtX8C1k;MMx092&uIjCX`o2zT_P$#M{JY)d0D#8qqQ`Vfk7GSzJ z4SV9RT2hv}A|r*Oj6g4|gv@oHojXLLg64t`vmF8+kNIT@UVk~mOo--)0p8!Wgkp0+ zTEc>%SVHMo1*yXh2*K;&1T~U^e3gJl1_hkENwAGbZ3BugC2}S*1lYjZNlH;jz2L5P z0<-U`2d6Cy&b14ee~hwe14)pz_V$+&OCs=zUY`u+9vI0!HImi-IFi-v&!O;j0B?Tj zL2<^{Q%QVc8-*A*R-&M0XD)q|)V0%usTy0E<7~GwHDxRg-A$7n5$8#(AkB9zB#4U_atDf+zb;rZR9W6nT5C7`)#H7-pW zKZBQ-37oz{PbvXFaZL{tH_@EZ-199og~$~YtGH>SvKpIRg#)D?wN6^8G=_h($yY0T z1I|D;I*no_1-zK2n53)};NC2ELurtNQV~LFp*f(Rf+)6Kw}xiyQ29ABtPamCLD7Y8@?}<{$43^pyOrppTd|%=a++G_U7K z)hk?1H4`U)NAr?}h{GAfp-&WC`<0%Q39iT%%p)HzRQUDN!8C1^d#2X7*he9avxoHz z4y~svLiBp6HfL5^2FRg08a3l44E^4Q#@_qY_?Y~LrYpPfVn)5MnM~IfkgCbrVf;l0 zSw`9Ku6kEeI&~9$R9I-|X#SnxDC5!nK%KFj=v`!AMMh&U*?hN2Ux;OG*;v?M{6@tF zwwKjNgF_Y=@%SvJO8vg;e@oOnjCejPB_Ho93;&o+sW=nDj|PbYqph4sTjFYbNF7q7 z;e|ibZ2pAw6zVMv#8{y_2@Rj9w9k4DMqVvXs_GGPaepRF(H+nM0ymdu Z82tP@+^+P61*@x?**i9Vf3xxI{{W)UuhRek delta 2572 zcmYjT4{TM{8PEOG_n?oiEgfiW%33I}w)eh!?!E85mbTId#nM_@9<2!M4|^e51~SXT z#VlE(c9LZ_&RG2-pIg9Gg)I>%mBtL+m^DUSmd(BdoFmSZxQt+c`HarRRB^v^&TBCt zDes(n&i%gMzwbVIw(P%0%O+>c(qz&}v^vR@6H;YOJ$-5JHBvMZUqks4o5rl$cqnJA zq#3KVIHv3#e=%p8}Tc(;zeq(TU(28(+r{z*bx`c1E zT5+n_9--6S4i6Lz{78q~+G&M6w%zb3UvAUCt34Xo6s0#E!GGIkIb5;JuxWIKPzQ6% z1zjlj=+YvaX1n!?Tq#aGYjfd#Q}Fctrc2|qAw5&0cDW^O1yok=a<D5t}GS{M9 z+Jc+&cUm?bkLg$N;Z{o+A=kGX0guHjm#+<39*cS-$|E0}jk=EAy&jFP!^#VWOOx*i zDvUNx?I?R7s<%5gd+I-YcfTcMPXSH$+UUih>}yfZm6(lYGGyZ-HlB-xbfF=n{R19< zP=ng?HA42qZ7r5Z2WI_w$XtmB4`;CYw89t7 zANOf&P8V>g3G1_h`&&$p3XeodTyVLy4L?RUg*RU+@z0eeX>wH)y0m3;T=47gp98OEZ|YCSr(!R4`~aP4@5P0L?`O-fxVD-Ain7?nA-iK&6cH4!fC zGhEKCH+%)fRCQldghsySDi?D8hWT|ccE}yT8l{Qb1U+<*gxIFr6S@zeC*>(P-C(s~ zSL5)90T@Dhd_@n;u8k~M{2Coj?=vFQv0AN4!D{zTk9u7D3)GY8fI)HK@Gd~6cmkO; zCm@0MAOS+x6@F^a@@aoVpnZ%`@Hl0@vR!4 zsihv*8OW-ck6h4k@Kc|^N+bQg{Y?XXWhCDl!P&n$J$}2(O3b_U zWl2%gxLI}2Um!g>KMj9pKS5$<{%JNM@)Gc2zKvCjn$ z^+Tn&5t-xf@pQD01U6Myc~tRZn`du@+hpXJ7h&a&)xLZ+o%^YvW?#@76SABrKeY$N zoj!=-(l~QHj$h6YvPza3I>6)=xM)Gi#X+g!Rnl1uZYAmNlP*108Bpf3jS%!`X0?#o zp|_V51Afk#9|2s*yz7!QEIwDt^~|xT#qv`QpE(5xi%X3Vs}q z!HjVh5958Iqwwaow1Of^4|D=cJqSD%_|lbHIsJFYK-N~5!H#<){LyBsQCDmxeLm8K zXCJE!DTWV)=RZ%-*q;^X0o}eV#ksvQ12KrC_9!+0bo94_*0J?J1787ZIspbrj2+-( z=cdSp@3MXe1q#lbg%*%5YJx44EA1(14k&j#uIBIcajjoDD!vwxN17AVyfxH%-CDp_ z{!@ov{R{$}cTf|(w@T2dz6G^NCS~i&nT(GBWo?K42$@N3AB*`sw+R@(?kM?VUw&%v W{tP&8k6|V(0^E=uJW+JbTmJ``WQVu_ diff --git a/packages/rs-sdk/tests/vectors/contested_resources_limit/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json b/packages/rs-sdk/tests/vectors/contested_resources_limit/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json new file mode 100644 index 0000000000..f40d52a617 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/contested_resources_limit/quorum_pubkey-106-029045172fbebcf97290db8879490a48ac0d1d60e249d031b5ad79e3e46e3fca.json @@ -0,0 +1 @@ +90e4366ffd8062dfcd46717d137c9c6c8c312c2622f508c6f3e713f256b7786c3ed8382b2f5fa9710fe592b668a4313a \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json b/packages/rs-sdk/tests/vectors/contested_resources_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json deleted file mode 100644 index c4e9f022e8..0000000000 --- a/packages/rs-sdk/tests/vectors/contested_resources_limit/quorum_pubkey-106-6599ea71a00d9d0e4aa310f02e0c6e1c1f190ed37d4da4d0346ac6803822fbef.json +++ /dev/null @@ -1 +0,0 @@ -8ad1742ae817e3bbe5adc760829015590aa35b24fff627f12d77038bd6612dec2c150f938e9e57e647d23d577ae381ba \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_015a1d2bbc282c8e87eae9748ffa72db1958762a26a6d156f618978402b1fe4d.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_015a1d2bbc282c8e87eae9748ffa72db1958762a26a6d156f618978402b1fe4d.json new file mode 100644 index 0000000000000000000000000000000000000000..da4168c6a6770e892c6e0f9196cc36f5bffbfdc6 GIT binary patch literal 75416 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 YaMtekjlX~KjbD86NArjL>-$fC2NV|H^8f$< literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_09540b24c4d98960527f45bc20e828d50a4fa7b3230d23ddfac563877efd61e2.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_09540b24c4d98960527f45bc20e828d50a4fa7b3230d23ddfac563877efd61e2.json index b11fa24e8d7fd4f85a29a6ec6d386334e9d07ecc..6cbf5c1a05fd1ac7445dc16a74ee2a6dd3ed89ea 100644 GIT binary patch literal 60703 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 aUmZ?&`?k9;e1-Le5AOYHev^NG`0yVr{0(dX diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_0e929893694b229f677394cbb4df4542eda610924f03cc11a5546eafee13bfde.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_0e929893694b229f677394cbb4df4542eda610924f03cc11a5546eafee13bfde.json deleted file mode 100644 index a31271612eb7c0a2d6fc3468d2b37d7f050414ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67421 zcmeI*OK)69mIUBg`&STJbHU=n61|)Kp!)|HhQN{71EFoo(8HL4q5nP+H&f)Ltv2s> zyD2mb0wt@+%FOeKIB`zi65wCIIXZgw%k{hWZ{FTK`|jx1{McWd+`i9GuioB#cz5;c z!^=0X^Xu=IC0%xUc5;0C!{Ow7^~2?hyB}U$-n~COzgYcna=QBA`D*{^>1x^O+2L;4 z`Fhpr{o!O~<@9uY@afsz_RG~#htqHGJ~*sGIb9ufIIMP`uZ~@>xm+K#TL0qtoq@B} z?@!NH8_w2Ito?hj+HtsC9d*94{o-OG@WW?Q&tAWM_3@|cn-4EP{NK;lFK@1Xx(;gj z?N3*4Zl2w)dUNyo`hRaf{rT!$cKju4|MTYce_j3e^^bQe-+#Dz7wnhyzg+$J@%sHe z7TodS=;*M5{pe^FSUx&gW%%f59ZxWA$Jf`bwGZz;UeEQPKCezW ze!TgR4=-*He)jg=>+5$fuin2(ZrjUa_XmVK7I2a z-~9UQuYZ5`-S>x7NowHiba|a09|Gm!F!Swk(pZx8ufy`wh7<12iJNt|Zk{xhy8Z2)6FuwVIBs1mzl@CBMLP~z|M&d( zGJY-Lj&mPRNnWMj3sq>EskEC_BUPmPy!E!dYe^C7Gr&S z-XD{+Ia9;dOosF2k$e2S~)j#yG z;nz;o+FSlfD@F)QXjz zvZmpFmXXy*zh9iR2HY@f`PaOIHFeAxj8dOeq?rEg{sz zqB#&Xo?omfOF2Klkw7VMaY;m=tVot5a5}$-Cj@DE1x~mz){}`3+PU2N0^VLd|N8dofk9`y=)M@hQ_K2^~$N*K~8 zgyao8xsnc5xFb_i;B$+JTX`N6V&yByPW(|TBX*O8C3fymN-b3N35Oukbfrv$kVD@{ zA36XCf$LIoMO*R^jH1Z2pyx~DXkueRCnYg4vQ*GFU*+nRc0g+SE`~HvrQ)bgXS@`` z;GT>w(~8iqTXxLe5dq613uN+q42^->Y# zYU++yk@JJHjJ0)1P|z$jim(XFp}Pp{jDi@2xg;W^ZMU9dyj_n|O}7X!>J>G(h@?PP zeD|A!95v5+Gc}Zy(2&sr-k@dKxw=nW*s0V4j_J|}Znkm$36rzEJBeF@# zJOURhMSKV0bE6c;8jBW4ydng5bfu(=5KPn>1rD4=Txz`jFZx3gw*!vUtkqz|hv37; z*AS8`frG0FNv_q+kckG8#u`%OhSXQdES;KLiS`}kFzU(VFv_(d8x9LzZ3lXT8(VOg zDb@%#O=VeZtPa+csGLv0;eb(Yq@zhMh!|4HHIXeOp$S=0)5NB0sEH&>=*NlOr2}a< z+tsWnXw(T=xA;9pHMT_|UUiI=^;z6LE~VEkJBGuQhLCDFwjFVey6d%nB?KX1Lx|w) zup)323(=f<72YZq*&=$b>D@y@WK>NEd`+xg%A#!2Vn&v9OR*DD@p_?Cxg_gnQK&{G zv5G|;qZ?D^uDpaHjYWH9OyKi@F+*-w!mf{3q9F}L2fSrCCs1lasM0`^E8jxZ(bz*R zDX5XI?TCDZ_2i5#PJUGRv9~H$xBDOR5PygUDlgmJ4q+Z~u>z{45v>*#ZJA5c?0VJq zD35S>hl$oW&Pc5)E8CIW<- z2x+PMoE~KeUN^c$Nw|Ylf_M`vjOyY%#j=DZ@%kzqE$$BM~ki7H|;NlGR`i78~x)eAlQDLl1Aaw~zJ4r}hVSlL! z(af$7qcpdnlYrjE0bRv8U50YCP@M}<(iMNmrKWfBYI}inOQ0VWeHgrIN{#hXed}( z9AYcCOCjX;c4Tw19^P7$pKz%(KFR>aUmtnijtkv3GK=AtTaYalg|W-8^} zEs32fH0vV*(zR7gty3YI z{2@wXv#tr(`355CnpT9U&G4ebFg^`X2zR^&)+LD|fj3t>W*bfKh<)?WRhJ}DMKC6$ zT1V^#pCqd1$17>mZ4i=J0gJ*qFE)PVr^FQsjUoRNXVQ|^2eL6wz(nog!0^iBAIftic=8_*6LDBQ29uCa``XZ zqdwA}D|D)2q@q>Fk|n8#(XCj@5&)?@5V7s0(lE#>?PhvqgWWTa``5pR>&yd;p4 zN}}lbk$s7xxx(t+UP|goouRg+ZAdC~PY?CB(%KQPnxagJQlVv$C_qg--RZVpg;I2g zU_lo|MqN{Bj8Zazic2aTiCxu09(puzNmTt0dr6jc972Cut(YS7Kh;e=C07H=&q8ks zA?IsF6lLLFHBF)@D*^;1YR8l!%{n4romAGVR&4i#m{3gPws_txL$jc3K=t=W8aK1TwPH`qYcKRDZN8vdqyNrOI#ac}*C8YZHQexm1!J+D|^G{dc&Ei(xE^G%72Pi_4@{o8N z6S97Su8m`feS6@o))D*m^x`#Snh;GGv2Tx}AxNTn{vx?xB5=zLrv6k0F-0^QrHfg= zc)9{_{C^s1KMD}kg>ybNdJ!3=T-%n6zN66k-_7#U#ro(EpIS^4g2D`hVwc562@xVr zJ|VSzv1DUp+w|?R^)nX-Aq?w(YFx^sEe~5#&QAz*)$Nw(mGG^OWxd4G#mgK*D$$N9 zm#mR7k}qSRBB;V1AV}LaKjDT47qy(S;mq#*|c>dl1pPbWN}rZ+EHm{VArM0*!Q1Dd5rz!%5JV&PAoyo|2bX zDZ{f~NV3C9XBDAti*z`)xthj$yPNo+o?H7EERT{rxiAy#Oh9vlax9Jrn90*!X z$@w#}+L$o0jXETuNqb*nsX7t`xrAM>1)ju`ODWj!T%HUxw|a|N^o>Y0ctTq=_68!7 z%K{=A2$2%LqF}B4$MKm{ml!Eb?+8U-ig6Iq0-+E_B??{*A(bdwro5A5ZlX;}a+}4( zy@YJ%kFiAPU4J5sv?XFfiA_7e*2%MR{2`Yj)WJf$N{Se6eFUNHCSw%=w?s{esv4yF zWQ-|k)hq9twIWTeQRt);6R0_5h|U-h5Tb5K@|bWmQF`G*p4SADWP0^DT|0+A);xeL zHDrYbjZsDNPcUrwGmXb$0*ckw0P8F8;VYQftO?w{cXTnGD5P0*0tuhVL>5zXNyrgr znQ1F55`6H%K^!Zha)X)~?}5adZ9 zNOE*b{GlyfFVE^{oe~7g08C@^jGeFu&>qP4hDe9c@*(17nj-&0yf9?5XiS$7xb7ms zBta&vKzwJsM4>De|3`AH+|uJD>X@hq2x|2zMJ-l_4y%=s;q45ZR)|iC1us*>%66}I zW;i%XAc4cGd(0{#2ony`goy~Xu!uP-PXf0Z$@x--ds-NFy^XC~eO=0WfsD?diXr{3F6A;viji`VPE-@xDUw)k+?3cZj_k|y z)j;&QH)2r}$|(H`DeI{}M!E%V>ZC)&%%4CYS)D~8Ko@1Hh>4o0Q$wcpDLO%Ia#gvM zq7$rZ1-I-7eEVd=QWl_P@ay@sK13Cio6ks}K+yFF!A@?((2lwj(k8d0euaZvN}@yu zny9!WQ_w_E)T0RICA_K?l>Kf=_>!({nJ=2t7D8^X**caoB%WmPl7a13W|^oSqUzSl zj*?G@6~|^QLKv;ArZ<&Blj;r*XA5cFS12n2LKZirc%85E2n02uDb0E*y_!&!UQCei zs)>3PJrr@H0dH2E(obDVVt2GB^(t^kqMF;>i=|GxMZaNmst?e&w}2Ulu)VlbdJ*xu zgeJNLAEveMQ?t+~`AR1h5S`NFzs_t~FN69N1l9ipf{q35?F{F`6EZ~|;HVsMeS;0X zkxmWaF{7}8bN}lv_ja&zMo0EG@=T+%kT`bAzjFAw?rRCDZTTl#bxJuMC_9TS(gNcd>!n(P| zryLUwq-(vB@M|R*Al{;h22SUPgcP;XX$KJah`1@u7P-`POI~sz9oWG=Xb}W^rn=+K zn5&RfQ?NFA#3i|H)tS7cD0)7vk4tptrNgBbN{O@;Y7+=?%NdE?WC|r_6cTtlm$0I> zraFdgq9!5&*(EpGK2)T@M^Q`cqZ}w*MI;#(+`ENjKfI+P%K7*-bwttdHzQJYLIi6? z0@=Zn0zpwMY*$|Gi9K_X$Ns2rlq6J8I)04YN&yz}MI0dTWvrzFRH0VhmVrbC^J}q89gn7!wQ#RHaSigVb##1)d z8CbtJeWv*#;!lH|bc(p$7hPDgo<^Ewu}B&mnx4~ z1^m1^>(YSeLGrLTiD6rcwe(h z@<{4}rxK^qMUch>tzYVxP%Y7-MkK%~Vp_k0`#zt>C8B?c>@rzKqgoVnnFkvMr8oX0 zc9F>j9=4NL5pPkKkz3u;T{4#y4%hEiu9Ve`MYgop(R!^x9GXUA3Gr-UIIwK@45X9MI|&ZrP!44Mb#Nrb`?ve4@H74Xp8Q2^)#M z3r{+B(OpD@x)Pd~q_+hnxuVi2cH>1Mrwd4yibc8rb-+6Tcbn)R8axh3j`B!YONs3cNums}C(MI5~v=>?K_ZVfx}f7THyXG0b` z)k^ePwsgi5I@N@zLDz?Y;?m5OC|kG0gapzkM5c;`2*?ava#a({!v-Mvj@+g$h=&P* z66=@c=1Qw6flCy{T9q@2Qr-qZLOgKO`kcS$GcW{imn9)KzQUKrmq%Ft%78p~HWTlttTfL>&0{^X>~%e;L)z8UJnw>)?o-wge8UlO%qrCAOZl9UvZ zjaiL>8sg8;A}`;u1L%6skL$2lRo$ z_VtZa`h72Pr~Q`>r)glTuZbFD{QkrGJe;=Oec@ZIFMM$CSM!Jb^~0zC2a9*~ A&Hw-a diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_12a83820f10ece0b180bee7d58c1d4e66aec36ada2efbb1072f2196b5b856222.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_12a83820f10ece0b180bee7d58c1d4e66aec36ada2efbb1072f2196b5b856222.json index 695c2b6b2a5b23ef9ca34d9a71cc9abeb0652e23..a729e7083110a2989bd0a56f4fbecafe2ade2734 100644 GIT binary patch literal 64302 zcmeI*%WfXm5d`3@{S<`OT=3^bBE8E#NFE?C1V&;4AvR^ml99mByQgZ-h#Xn6INwRM z2uy&ocsZBus_N>V|EHl}zBxL2^7GA`pI*Jbee&(mFZr_HIJx^gU%hyJ`}WQCi?`2T zz09}&x-99k)3cM~yDttW=bJCCF7Lm%yt@DV@a$sq#mVXBi)Wktr>C1`r)P)zW#`*f zo6ip?n_Es#w+Ek|-EY6z9CbK-djEsNCY968QHR53_xa}7?V79YL7VlL&+acc+kF4@ ze6!(fo5eQ1%gv6%)#j-4&E1z5D+Awsxa!Hv*Dv1vaC7_i`P+a0c=P=B`iGmamhb*> z{p$9~-Ktl&FK_;J_tPJ*-(<(1v-Xd-FaLD?x0~2#;QP!!aP@J}N$JJ+?_S=t z7T>;kceAd4|6z5?_1*2;{P5xq@F%a|yu5ky{Q9RC!S2=VKh~XhJAQog`sa$|?zs0k z^!+#Qzxl&AzdZTNKc9U2*F%aZX`G!dALqx1FkKK1hkkyM&-3Tdue0d<_~NqbKHjw5 zdY+$uY1Q4@pfj#{dK|@6L;WlG=C2(m+@F&$8*alqX(|o->HQHoD^(T5E-sEQvMXP9 z$A^T+Ioto9A73T3CF61Q)y49i9J~ZtI1+5H3sPCvZ7k6{fz#_sE2rP6{RJ|hI zRv2MAq7X_Ui;3<4n-3|~iLAQ?8Sj>~KFNIqmj9X*b4$v6x2_6Tq^P$feFT~Oyt$`x zMT*^$T(oj!eb0}8vC{W*Q5G(ZzGm%Qw9JLRk$A%+UC|ZGU`XfBU=;?X2B~+@;z8X0 ze7hb?yIUgH2Z!FxP|@{*Pp?QH3M%h~?@n?uS(1rC`oKvBvA_V(dkD!b!44OG7Pj_?6sJ=}Pqtb(xD! z*a)hzSy0xCAyDEupUn`rm_Y>8s|isT|(kKD~el7jR;il@LXMX_H| zV@v+Ke@jEkoIpUOh~%NEQALN;VxlNn-z(yrs3_wOtF=}mC=ITOh(R~a^WBoJB>vy^ z0_;jRb|tl)Rk!N@^6WDbF_GZwa=D__M|5Dy`>mkCES>{f$o&L-Ed+>J>~Ro88lc5Z zGniwsR5JvoXlAV}I)51(Ovd^uWv&nxs{IP8D-l$QOV&hpxlUk22TndZ6(@1^-e!@g z1m2m%M`;M@y+ym*kS=xVOeW%cjVi;56jZk?gBjUcsgy)|O9nI4e9eahyd*M_J_XiX z<|Z!5rME<2GMW}ERZDo3D;kxMnDzU0wHjkclvm63iU}R+mZB83YZ-=asi{e0RJt=~ zBIDJqcquCoAMvUX9AnC$W}T?Cz(wly9OW)VXh@jFTC=3vC`zJA_vgg(1WnkE#vzPr z_phSTnkn%_m0fBh_!3zY(fP`||45&Vea7E3k*~a-^0mbghA2Gv_d~`5(rORi-L=vUoNO| z@ADcT4CNMw&&ck8EMW zLXnO&k^Nkx!wOK%dPs5q72!fkspnHjQ8*IUAwff$yM;UfUuCVxM|JGyA{~~n&3bZ! zl!KOPvKEgT@}sCKkBEv&H7$?03sB)=KM~%#JeTyRa7GK z%40WiLrb(p-KHsrYe8v39wQO5!75y_@&UD6<1O(tGK3XjE!YXQqb)RXeF~7$XyPeA zN<0&SNO3~#M0ewt>TW!=KF*IGNbZq}v(AFEN^3znSHVwnk#T604|{U@5zP|A`Nay7 zI47d;O6?R_(GnE`EiN*u3Vgbuc#2H;6)-1M*Q^Eq8im;Dng!X5+G$Wq)kstw9%Q0c zZS-)e%9NONkfN$72PJYaOraqq3$d?m$t^@&S`THR6(p)?{BaB-8pkjKXQe<)j8!xt z)KEa>KgyX<9b0xkp-lK>v5mGRs&0vUlf07%BCNhalh~TVZeT509aE(h5>p+Rdm@*77*({3UH*LsWOUW6x#8haMk+ESiYLBWa)c_gmzW|wp>ZChn9 zSBQ-d!SBba=L=9hKT%QEu~q?Ar3$l_0R)2tp_BYZ+ZAQF~y{)DHMyWKq{^B!eU zRp>)avKH+%B=St00cx=N7Wdh{9XUqoDkp^6JcNL;xl z?M16n)P+>E+S;M@d6bs*jVB`q2`O3?7J5atAQ8PneMz!tRN+pFuJQ}E5>;=(7dO_x z1mRi%if{zB-}akzN<(fbTk=1~q%>*>R2PDO zk)&W2@QJTgs}fZqLhZHaq*L^Y$A`P!x*hIeMWMYr(po;~mTn;%j7YR)nVDWbvoEsRchi-0l3w7jz^D5j49t5T|Fy@L21Sy1k>xD=<4;P5bstvG6~D7=DI$8R!W{NB}$=LXTq26 zkdSKiLV9mO1MilkFM+MOh_qHUN=-GS)X45KZx$k|X5nStf|_7N9z#|}M39xrQttp) zxDa?7l}n4TDz+HXhzhb^fGSqIb=50Uxx!%Sn2;jYAYs)MaL(KhQH3Fp79V%EiFVck zC*mHTg{1)7m$3`b`YQbKS$OC3NNUOrq-D6<2}?JXImXj!MUS%hAD@Lc|DegI|DNFZ zPWv6sMHPl{-IpAtKlXeY9m$kXavf=K0<4dTug>@$Qnp?pEUZ~j?y}eB%UYl%`US*+Oh7P=zbiK|o_ z%Rse1@fxovq*=?ny#g!rbxWcmphCB_kM#=bXqlsgi(V0|H1Uao4OTScr8P@b+{%-J zSa(Y`Tnn~zeu+p(B9DfIuY`2VvI|NtQHcT#A}Q*goX#c9t6Rp$?*27yp_J>%Lfm?V zSjU=$Zc;^0mcU$kKpFock9ubjgv@oS0!25M@@ z)z~NGp}=bUz}8$MvV~^vJX)fnT20b7*SZjSBqZvyO+1O#fn{kr7Rl1 zh_LdY6vmiDC@moouq%BO7``OZD`avbRKMQh76QRSwJ(dCqc+6<|6xNLw8|dZpU9wO zO$gpch2G*XaB(FL?d_k>CxnN;__3CQcyG7tPa*y$z^d^2@QdZIV_`e8%n8+!j~2Z} z+EZCT(e`{);J89{p7k_^_7-gD-4eufQc7UzKWHX{dO~dQ!WxSvr4m<=b$HP9V_8xx zYwk!&#|f$WE>0p}&$TAz{E4AmQXT~YDaRZFk)X8JpmLY8l|))l_%6wsJLMva*>)yg zh)5k_sn!qW*}o`7w_>5K)(jZfry3ZFM5Wk{qoSIFOGv411>ThrnU}gHA&GjsCEZqT zA;vqB5lTyeQwog-Cz*1g3JFBgVG|W4ULp{yZi&>T02@`Lj&wIL*;1eqo2osr$t}&r zw=^*HpCU#Y_DZjjO72B?{{SOW@5wO`@sJR$y{0T^zWDyjstp0kP(>B(=d0kPt_7d9 z7D%NN?S7)DqYX+VR)fIieA+UwGOpt@DI(NT10!?Jvl7)^4yW~)Lc64JSKXo&boLO4 zMrl|n5zHXW5-AP1rTRN7D2;^>&vh8BcU39{_jY!Bm2TJ;c zm0NU67$;z**VD;WQCJp~x+N@&{MK90c4h(_vF#tC(Ah@rIs-FYQbcOD>dgBcqdq3( zY+fOlJf6J$e;6Opctm51!1nV;ZTzm#Fn^X7KQYAa?<}1J^4KL)P`Bvof$3lJfY2-Q z2q{~}dS+ose?MG39|xfoVVnc|f`*R1nU-brZD8R=Uv*4icuSp-1iw&Elk?z(1T)g7 zz`6w=e0sj7pUD}O-@uTRtf#8ir|(Kjo=O^z)<|?BQ*mExQKM5L!ZnT4qXw0`U@M6P zrL1RolRM=ii^+DX4TUJ?N%0KNQ8UagacN^MeOcmZ%OJT1)vsATR{lXU`AYmXy;QWA z###uJ^{5>pB3o3hzQyG2Z?UOk6x;ZcltUTB;j@ZOOQmrlEt}jj>$P*ydT&GF+Ddid z!cfW<>=9)=A0qXx*Jp=p3A|$F)fL$S$wRmvTBTstEqY57g63J2gu4b77KjL0+|e4H zdH;i3gWvz!b$m=B`FfZJ=S(h;1beD*%D$cTe+f9rKYqDMeU7W zur07!BHcnMXfUBb>%z6f!bqc}tVijIHrAq0xRSdnHlmWc2puMmC`w-r z4ZPZvae8SfO;mTPiAp26CopCpA65YcV%!50#Xj}&05DclJWm4`S_ zAT?B%F3BMY5k)D9OV(YVE3o>yixh=jso3hX2?2##Iz066P+aX)PG+RTS^hlBpF{ri z>wJE4b$oS^zs`@Z`jheLS<3wKI1igwS@}=^$}i_*yP1$vbCFwCc%_M~TLi9#ln?Q%S}y9aB%VCnGNfmw-@#e2CAYxd-Yc*x zwqlaF^sB)jZCP_CMj}EKN&QG@Lk%_5A5NV)|Fy7d;qDqV$iwUExaPrT|NSXEcC zNim;dg*s{D!Yc}t=%h8ZeC(gjnn<1*y3Skx;sS{H{Asi|fm@UB^FrRNrsR%%cS zBwM7(Pcj%aD(OjFNN-@dLJ<}chZIdGNt_tOS5>PkI$wX;P_=Bof$=Uo)cjyHem{hJ3y%);+4&ihImF=jk&st}l170--xuSZPO2LUj6< zp_=v5T-KDuU>lEke(k)np<9P8*d2xckd02 z+8|FXfB8UzQ&lyv+#&Sei6@k6 z9Co_}tD|%XgXIeI8ER X{rY(mi>XenlW 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_1f269e8f7c30fc23f85f4aa8c46214b0f6f6b7280b0ea686c2e0070f330add82.json b/packages/rs-sdk/tests/vectors/contested_resources_start_at_value/msg_GetContestedResourcesRequest_1f269e8f7c30fc23f85f4aa8c46214b0f6f6b7280b0ea686c2e0070f330add82.json deleted file mode 100644 index 04b06861f6f2abb43c6e43ce2abe850596613bbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71121 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 bH=j2gPTTIj@GaICKDhU*`9uEt?$bX2)q0wt2tK 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