diff --git a/Cargo.lock b/Cargo.lock index 5ae44c93b5..98221b1b89 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1664,6 +1664,7 @@ dependencies = [ "itertools 0.11.0", "moka", "nohash-hasher", + "once_cell", "parking_lot", "platform-version", "rand", @@ -3727,6 +3728,7 @@ dependencies = [ name = "platform-version" version = "1.0.0-dev.16" dependencies = [ + "bincode 2.0.0-rc.3", "grovedb-version", "thiserror", "versioned-feature-core", diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 90657ded71..e3f922cb6a 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -73,6 +73,7 @@ tokio = { version = "1.17", features = ["full"] } pretty_assertions = { version = "1.3.0" } dpp = { path = ".", features = ["all_features_without_client"] } assert_matches = "1.5.0" +once_cell = "1.7" [features] default = ["platform-value", "state-transitions"] diff --git a/packages/rs-dpp/src/fee/default_costs/mod.rs b/packages/rs-dpp/src/fee/default_costs/mod.rs index a91d072f59..9af68bb143 100644 --- a/packages/rs-dpp/src/fee/default_costs/mod.rs +++ b/packages/rs-dpp/src/fee/default_costs/mod.rs @@ -32,13 +32,16 @@ //! Fee costs for Known Platform operations //! -use crate::block::epoch::Epoch; -use crate::block::epoch::EpochIndex; -use lazy_static::lazy_static; -use std::collections::HashMap; +use crate::block::epoch::{Epoch, EpochIndex}; +use crate::fee::Credits; +use platform_version::version::fee::FeeVersion; +use platform_version::version::PlatformVersion; +use std::collections::BTreeMap; pub mod constants; +pub type CachedEpochIndexFeeVersions = BTreeMap; + /// A Known Cost Item is an item that changes costs depending on the Epoch #[derive(Eq, PartialEq, Copy, Clone, Hash)] pub enum KnownCostItem { @@ -57,10 +60,10 @@ pub enum KnownCostItem { FetchIdentityBalanceProcessingCost, /// The cost for fetching an identity key FetchSingleIdentityKeyProcessingCost, - /// The cost for a Double SHA256 operation - DoubleSHA256, - /// The cost for a Single SHA256 operation - SingleSHA256, + /// The cost for a Single SHA256 operation, with a specific size + SingleSHA256(usize), + /// The cost for a Blake3 operation, with a specific size + Blake3(usize), /// The cost for a EcdsaSecp256k1 signature verification VerifySignatureEcdsaSecp256k1, /// The cost for a BLS12_381 signature verification @@ -73,58 +76,104 @@ pub enum KnownCostItem { VerifySignatureEddsa25519Hash160, } -const EPOCH_COST_UPDATE_VERSIONS: [u16; 1] = [0]; +impl KnownCostItem { + #[inline] + pub fn lookup_cost(&self, fee_version: &FeeVersion) -> Credits { + match self { + KnownCostItem::StorageDiskUsageCreditPerByte => { + fee_version.storage.storage_disk_usage_credit_per_byte + } + KnownCostItem::StorageProcessingCreditPerByte => { + fee_version.storage.storage_processing_credit_per_byte + } + KnownCostItem::StorageLoadCreditPerByte => { + fee_version.storage.storage_load_credit_per_byte + } + KnownCostItem::NonStorageLoadCreditPerByte => { + fee_version.storage.non_storage_load_credit_per_byte + } + KnownCostItem::StorageSeekCost => fee_version.storage.storage_seek_cost, + KnownCostItem::FetchIdentityBalanceProcessingCost => { + fee_version + .processing + .fetch_identity_balance_processing_cost + } + KnownCostItem::FetchSingleIdentityKeyProcessingCost => { + fee_version + .processing + .fetch_single_identity_key_processing_cost + } + KnownCostItem::Blake3(size) => { + fee_version.hashing.blake3_base + + fee_version.hashing.blake3_per_block * *size as u64 + } + KnownCostItem::SingleSHA256(size) => { + fee_version.hashing.single_sha256_base + + fee_version.hashing.sha256_per_block * *size as u64 + } + KnownCostItem::VerifySignatureEcdsaSecp256k1 => { + fee_version.signature.verify_signature_ecdsa_secp256k1 + } + KnownCostItem::VerifySignatureBLS12_381 => { + fee_version.signature.verify_signature_bls12_381 + } + KnownCostItem::VerifySignatureEcdsaHash160 => { + fee_version.signature.verify_signature_ecdsa_hash160 + } + KnownCostItem::VerifySignatureBip13ScriptHash => { + fee_version.signature.verify_signature_bip13_script_hash + } + KnownCostItem::VerifySignatureEddsa25519Hash160 => { + fee_version.signature.verify_signature_eddsa25519_hash160 + } + } + } -lazy_static! { - static ref EPOCH_COSTS: HashMap> = HashMap::from([( - 0, - HashMap::from([ - (KnownCostItem::StorageDiskUsageCreditPerByte, 27000u64), - (KnownCostItem::StorageProcessingCreditPerByte, 400u64), - (KnownCostItem::StorageLoadCreditPerByte, 400u64), - (KnownCostItem::NonStorageLoadCreditPerByte, 30u64), - (KnownCostItem::StorageSeekCost, 4000u64), - (KnownCostItem::FetchIdentityBalanceProcessingCost, 10000u64), - ( - KnownCostItem::FetchSingleIdentityKeyProcessingCost, - 10000u64 - ), - (KnownCostItem::DoubleSHA256, 800u64), - (KnownCostItem::SingleSHA256, 500u64), - (KnownCostItem::VerifySignatureEcdsaSecp256k1, 3000u64), - (KnownCostItem::VerifySignatureBLS12_381, 6000u64), - (KnownCostItem::VerifySignatureEcdsaHash160, 4000u64), - (KnownCostItem::VerifySignatureBip13ScriptHash, 6000u64), - (KnownCostItem::VerifySignatureEddsa25519Hash160, 3000u64), - ]) - )]); + pub fn lookup_cost_on_epoch( + &self, + epoch: &T, + cached_fee_version: &CachedEpochIndexFeeVersions, + ) -> Credits { + let version = epoch.active_fee_version(cached_fee_version); + self.lookup_cost(&version) + } } /// Costs for Epochs pub trait EpochCosts { - //todo: should just have a static lookup table /// Get the closest epoch in the past that has a cost table /// This is where the base costs last changed - fn get_closest_epoch_index_cost_update_version(&self) -> EpochIndex; + fn active_fee_version(&self, cached_fee_version: &CachedEpochIndexFeeVersions) -> FeeVersion; /// Get the cost for the known cost item - fn cost_for_known_cost_item(&self, cost_item: KnownCostItem) -> u64; + fn cost_for_known_cost_item( + &self, + cached_fee_version: &CachedEpochIndexFeeVersions, + cost_item: KnownCostItem, + ) -> Credits; } impl EpochCosts for Epoch { - //todo: should just have a static lookup table - /// Get the closest epoch in the past that has a cost table - /// This is where the base costs last changed - fn get_closest_epoch_index_cost_update_version(&self) -> EpochIndex { - match EPOCH_COST_UPDATE_VERSIONS.binary_search(&self.index) { - Ok(_) => self.index, - Err(pos) => EPOCH_COST_UPDATE_VERSIONS[pos - 1], + /// Get the active fee version for an epoch + fn active_fee_version(&self, cached_fee_version: &CachedEpochIndexFeeVersions) -> 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(); } + // 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() } /// Get the cost for the known cost item - fn cost_for_known_cost_item(&self, cost_item: KnownCostItem) -> u64 { - let epoch = self.get_closest_epoch_index_cost_update_version(); - let specific_epoch_costs = EPOCH_COSTS.get(&epoch).unwrap(); - *specific_epoch_costs.get(&cost_item).unwrap() + fn cost_for_known_cost_item( + &self, + cached_fee_version: &CachedEpochIndexFeeVersions, + cost_item: KnownCostItem, + ) -> Credits { + cost_item.lookup_cost_on_epoch(self, cached_fee_version) } } diff --git a/packages/rs-dpp/src/fee/fee_result/refunds.rs b/packages/rs-dpp/src/fee/fee_result/refunds.rs index 8e7ad0bad6..b1ea624bfc 100644 --- a/packages/rs-dpp/src/fee/fee_result/refunds.rs +++ b/packages/rs-dpp/src/fee/fee_result/refunds.rs @@ -4,8 +4,8 @@ //! use crate::block::epoch::{Epoch, EpochIndex}; -use crate::fee::default_costs::EpochCosts; use crate::fee::default_costs::KnownCostItem::StorageDiskUsageCreditPerByte; +use crate::fee::default_costs::{CachedEpochIndexFeeVersions, EpochCosts}; use crate::fee::epoch::distribution::calculate_storage_fee_refund_amount_and_leftovers; use crate::fee::epoch::{BytesPerEpoch, CreditsPerEpoch}; use crate::fee::Credits; @@ -38,6 +38,7 @@ impl FeeRefunds { storage_removal: I, current_epoch_index: EpochIndex, epochs_per_era: u16, + previous_fee_versions: &CachedEpochIndexFeeVersions, ) -> Result where I: IntoIterator, @@ -56,7 +57,7 @@ impl FeeRefunds { // TODO We should use multipliers let credits: Credits = (bytes as Credits) - .checked_mul(Epoch::new(current_epoch_index)?.cost_for_known_cost_item(StorageDiskUsageCreditPerByte)) + .checked_mul(Epoch::new(current_epoch_index)?.cost_for_known_cost_item(previous_fee_versions, StorageDiskUsageCreditPerByte)) .ok_or(ProtocolError::Overflow("storage written bytes cost overflow"))?; let (amount, _) = calculate_storage_fee_refund_amount_and_leftovers( @@ -180,6 +181,11 @@ impl IntoIterator for FeeRefunds { #[cfg(test)] mod tests { use super::*; + 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())])); mod from_storage_removal { use super::*; @@ -194,8 +200,13 @@ mod tests { let storage_removal = BytesPerEpochByIdentifier::from_iter([(identity_id, bytes_per_epoch)]); - let fee_refunds = FeeRefunds::from_storage_removal(storage_removal, 3, 20) - .expect("should create fee refunds"); + let fee_refunds = FeeRefunds::from_storage_removal( + storage_removal, + 3, + 20, + &EPOCH_CHANGE_FEE_VERSION_TEST, + ) + .expect("should create fee refunds"); let credits_per_epoch = fee_refunds.get(&identity_id).expect("should exists"); diff --git a/packages/rs-dpp/src/lib.rs b/packages/rs-dpp/src/lib.rs index 2c14ea5a1e..e0318774ce 100644 --- a/packages/rs-dpp/src/lib.rs +++ b/packages/rs-dpp/src/lib.rs @@ -57,6 +57,7 @@ pub use async_trait; pub use bls::*; pub mod prelude { + pub use crate::data_contract::DataContract; #[cfg(feature = "extended-document")] pub use crate::document::ExtendedDocument; 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 20b73a6784..2f6c46e88a 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 @@ -69,6 +69,7 @@ where state_read_guard.last_block_info(), transaction, platform_ref.state.current_platform_version()?, + platform_ref.state.previous_fee_versions(), ) } else { Ok(UnpaidConsensusExecutionError( @@ -177,6 +178,7 @@ where platform_ref.state.last_block_info(), None, platform_version, + platform_ref.state.previous_fee_versions(), )?; let (estimated_fee_result, errors) = validation_result.into_data_and_errors()?; @@ -475,7 +477,7 @@ mod tests { ) .expect("expected to process state transition"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 3055480); + assert_eq!(processing_result.aggregated_fees().processing_fee, 3085850); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised let check_result = platform .check_tx( @@ -677,7 +679,7 @@ mod tests { // We have one invalid paid for state transition assert_eq!(processing_result.invalid_paid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 905380); + assert_eq!(processing_result.aggregated_fees().processing_fee, 909400); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised let check_result = platform .check_tx( @@ -829,7 +831,7 @@ mod tests { // since a fee multiplier of 100 means 100% more of 1 (gives 2) assert_eq!( processing_result.aggregated_fees().processing_fee, - 3055480 * 2 + 3085850 * 2 // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised ); let check_result = platform @@ -1087,7 +1089,7 @@ mod tests { ) .expect("expected to process state transition"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 3055480); + assert_eq!(processing_result.aggregated_fees().processing_fee, 3085850); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised platform .drive @@ -1171,8 +1173,8 @@ mod tests { assert_eq!( update_processing_result.aggregated_fees().processing_fee, - 7420280 - ); + 7446290 + ); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised let check_result = platform .check_tx( @@ -1293,7 +1295,7 @@ mod tests { ) .expect("expected to process state transition"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 3055480); + assert_eq!(processing_result.aggregated_fees().processing_fee, 3085850); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised platform .drive @@ -1413,7 +1415,7 @@ mod tests { // We have one invalid paid for state transition assert_eq!(processing_result.invalid_paid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1231050); + assert_eq!(processing_result.aggregated_fees().processing_fee, 1238700); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised let check_result = platform .check_tx( 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 2bdee87ea9..6be7c8719f 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 @@ -348,6 +348,9 @@ where block_fees_v0.into(), transaction, platform_version, + block_execution_context + .block_platform_state() + .previous_fee_versions(), )?; tracing::debug!(block_fees = ?processed_block_fees, "block fees are processed"); diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/v0/mod.rs index ce47ba6fbf..4cfe580422 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/v0/mod.rs @@ -171,6 +171,7 @@ mod tests { use crate::platform_types::platform_state::PlatformState; use dpp::block::block_info::BlockInfo; use dpp::fee::epoch::CreditsPerEpoch; + use drive::drive::defaults::INITIAL_PROTOCOL_VERSION; /// Process and validate an epoch change @@ -211,6 +212,7 @@ mod tests { &BlockInfo::default(), Some(transaction), platform_version, + None, ) .expect("should apply batch"); } @@ -285,6 +287,7 @@ mod tests { &BlockInfo::default(), Some(transaction), platform_version, + None, ) .expect("should apply batch"); diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/mod.rs index 7ab4cbe08d..ac29ae5cdf 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/mod.rs @@ -1,5 +1,6 @@ mod v0; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::version::PlatformVersion; use drive::grovedb::Transaction; @@ -40,6 +41,7 @@ impl Platform { block_fees: BlockFees, transaction: &Transaction, platform_version: &PlatformVersion, + previous_fee_versions: &CachedEpochIndexFeeVersions, ) -> Result { match platform_version .drive_abci @@ -52,6 +54,7 @@ impl Platform { block_fees, transaction, platform_version, + previous_fee_versions, ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "process_block_fees".to_string(), diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/v0/mod.rs index d6df6c8301..01581e4e25 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/v0/mod.rs @@ -36,6 +36,7 @@ use std::option::Option::None; use dpp::block::epoch::Epoch; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::version::PlatformVersion; use drive::drive::batch::DriveOperation; use drive::drive::Drive; @@ -53,6 +54,7 @@ use crate::execution::types::block_state_info::v0::{ use crate::execution::types::processed_block_fees_outcome; use crate::platform_types::epoch_info::v0::EpochInfoV0Getters; use crate::platform_types::platform::Platform; + use drive::fee_pools::epochs::operations_factory::EpochOperations; /// From the Dash Improvement Proposal: @@ -80,6 +82,7 @@ impl Platform { block_fees: BlockFees, transaction: &Transaction, platform_version: &PlatformVersion, + previous_fee_versions: &CachedEpochIndexFeeVersions, ) -> Result { let epoch_info = block_execution_context.epoch_info(); let block_info = block_execution_context.block_state_info(); @@ -180,6 +183,7 @@ impl Platform { &block_info.to_block_info(epoch_info.try_into()?), Some(transaction), platform_version, + Some(previous_fee_versions), )?; let outcome = processed_block_fees_outcome::v0::ProcessedBlockFeesOutcome { @@ -233,6 +237,7 @@ mod tests { use crate::execution::types::block_state_info::v0::BlockStateInfoV0; 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 dpp::fee::epoch::{perpetual_storage_epochs, CreditsPerEpoch, GENESIS_EPOCH_INDEX}; use drive::drive::defaults::INITIAL_PROTOCOL_VERSION; @@ -296,12 +301,17 @@ mod tests { proposer_results: None, }; + let block_execution_context_clone = block_execution_context.clone(); + let previous_fee_versions = block_execution_context_clone + .block_platform_state() + .previous_fee_versions(); let storage_fee_distribution_outcome = platform .process_block_fees_v0( &block_execution_context.into(), block_fees.clone(), transaction, platform_version, + previous_fee_versions, ) .expect("should process block fees"); diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_masternode_identities/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_masternode_identities/v0/mod.rs index 938804b9a4..5069def96a 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_masternode_identities/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_masternode_identities/v0/mod.rs @@ -13,6 +13,8 @@ use dpp::version::PlatformVersion; use drive::drive::batch::DriveOperation::IdentityOperation; use drive::drive::batch::IdentityOperationType::AddNewIdentity; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; + use drive::grovedb::Transaction; use std::collections::BTreeMap; use tracing::Level; @@ -134,12 +136,14 @@ where } } + let previous_fee_verions = platform_state.map(|state| state.previous_fee_versions()); self.drive.apply_drive_operations( drive_operations, true, block_info, Some(transaction), platform_version, + previous_fee_verions, )?; let height = block_info.height; diff --git a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_inwards_distribution/add_distribute_block_fees_into_pools_operations/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_inwards_distribution/add_distribute_block_fees_into_pools_operations/v0/mod.rs index e1641df9af..9c6abb7461 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_inwards_distribution/add_distribute_block_fees_into_pools_operations/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_inwards_distribution/add_distribute_block_fees_into_pools_operations/v0/mod.rs @@ -75,6 +75,7 @@ impl Platform { mod tests { use super::*; use dpp::block::block_info::BlockInfo; + use drive::drive::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; use crate::test::helpers::setup::TestPlatformBuilder; @@ -126,6 +127,7 @@ mod tests { &BlockInfo::default(), Some(&transaction), platform_version, + None, ) .expect("should apply batch"); @@ -194,6 +196,7 @@ mod tests { &BlockInfo::default(), Some(&transaction), platform_version, + None, ) .expect("should apply batch"); diff --git a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_inwards_distribution/add_distribute_storage_fee_to_epochs_operations/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_inwards_distribution/add_distribute_storage_fee_to_epochs_operations/v0/mod.rs index 72e282faeb..3cc13a1a67 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_inwards_distribution/add_distribute_storage_fee_to_epochs_operations/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_inwards_distribution/add_distribute_storage_fee_to_epochs_operations/v0/mod.rs @@ -85,6 +85,7 @@ mod tests { perpetual_storage_epochs, CreditsPerEpoch, SignedCreditsPerEpoch, GENESIS_EPOCH_INDEX, }; use dpp::fee::Credits; + use drive::drive::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; use drive::drive::batch::DriveOperation; use drive::drive::config::DriveConfig; @@ -197,6 +198,7 @@ mod tests { &BlockInfo::default(), Some(&transaction), platform_version, + None, ) .expect("should apply batch"); diff --git a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations/v0/mod.rs index d56373613f..b3c2d63b32 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations/v0/mod.rs @@ -9,6 +9,7 @@ use drive::fee_pools::epochs::operations_factory::EpochOperations; use drive::fee_pools::update_unpaid_epoch_index_operation; use crate::execution::types::unpaid_epoch::v0::UnpaidEpochV0Getters; + use drive::grovedb::Transaction; impl Platform { @@ -203,6 +204,7 @@ mod tests { &BlockInfo::default(), Some(&transaction), platform_version, + None, ) .expect("should apply batch"); diff --git a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_epoch_pool_to_proposers_payout_operations/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_epoch_pool_to_proposers_payout_operations/mod.rs index 3c4ed23591..19699ac8f5 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_epoch_pool_to_proposers_payout_operations/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_epoch_pool_to_proposers_payout_operations/mod.rs @@ -2,7 +2,9 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::types::unpaid_epoch::UnpaidEpoch; use crate::platform_types::platform::Platform; + use dpp::fee::Credits; + use dpp::version::PlatformVersion; use drive::drive::batch::DriveOperation; use drive::grovedb::Transaction; diff --git a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_epoch_pool_to_proposers_payout_operations/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_epoch_pool_to_proposers_payout_operations/v0/mod.rs index f28709bc11..6963488b41 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_epoch_pool_to_proposers_payout_operations/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_epoch_pool_to_proposers_payout_operations/v0/mod.rs @@ -9,6 +9,7 @@ use dpp::block::epoch::Epoch; use dpp::document::DocumentV0Getters; use dpp::fee::Credits; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; + use dpp::version::PlatformVersion; use dpp::ProtocolError; use drive::drive::batch::DriveOperation; @@ -185,6 +186,7 @@ mod tests { use dpp::block::block_info::BlockInfo; use dpp::identity::accessors::IdentityGettersV0; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; + use drive::common::test_utils::identities::create_test_masternode_identities_and_add_them_as_epoch_block_proposers; use drive::drive::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; use drive::drive::batch::GroveDbOpBatch; @@ -292,6 +294,7 @@ mod tests { &BlockInfo::default(), Some(&transaction), platform_version, + None, ) .expect("should apply batch"); diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index e3566c7ed9..b801b3c726 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -165,6 +165,7 @@ impl Platform { &block_info, transaction, platform_version, + None, // No previous_fee_versions needed for genesis state creation )?; Ok(()) 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 addca1eb2c..98fe4cc90a 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 @@ -82,6 +82,26 @@ impl Platform { .clear_version_information(Some(transaction), &platform_version.drive) .map_err(Error::Drive)?; + let previous_fee_versions_map = block_platform_state.previous_fee_versions_mut(); + + let platform_version = PlatformVersion::get(current_block_protocol_version)?; + // 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 { + previous_fee_versions_map.insert( + epoch_info.current_epoch_index(), + platform_version.fee_version.clone(), + ); + } + // 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(), + ); + } + // We clean voting counter cache only on finalize block because: // 1. The voting counter global cache uses for querying of voting information in Drive queries // 2. There might be multiple rounds so on the next round we will lose all previous epoch vote_choices diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/mod.rs index 99952972dd..e2aa2dab96 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/mod.rs @@ -5,9 +5,11 @@ use crate::error::Error; use crate::execution::types::execution_event::ExecutionEvent; use crate::platform_types::event_execution_result::EventExecutionResult; use crate::platform_types::platform::Platform; + use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; use dpp::consensus::ConsensusError; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::version::PlatformVersion; use drive::grovedb::Transaction; @@ -42,6 +44,7 @@ where block_info: &BlockInfo, transaction: &Transaction, platform_version: &PlatformVersion, + previous_fee_versions: &CachedEpochIndexFeeVersions, ) -> Result { match platform_version .drive_abci @@ -55,6 +58,7 @@ where block_info, transaction, platform_version, + previous_fee_versions, ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "execute_event".to_string(), diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs index af1a185e84..26afe3f245 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs @@ -7,9 +7,11 @@ use crate::platform_types::event_execution_result::EventExecutionResult::{ UnsuccessfulPaidExecution, }; use crate::platform_types::platform::Platform; + use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; use dpp::consensus::ConsensusError; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::fee::fee_result::FeeResult; use dpp::version::PlatformVersion; use drive::drive::identity::update::apply_balance_change_outcome::ApplyBalanceChangeOutcomeV0Methods; @@ -48,6 +50,7 @@ where block_info: &BlockInfo, transaction: &Transaction, platform_version: &PlatformVersion, + previous_fee_versions: &CachedEpochIndexFeeVersions, ) -> Result { let maybe_fee_validation_result = match event { ExecutionEvent::PaidFromAssetLock { .. } | ExecutionEvent::Paid { .. } => { @@ -56,6 +59,7 @@ where block_info, Some(transaction), platform_version, + previous_fee_versions, )?) } ExecutionEvent::PaidFromAssetLockWithoutIdentity { .. } @@ -90,6 +94,7 @@ where block_info, Some(transaction), platform_version, + Some(previous_fee_versions), ) .map_err(Error::Drive)?; @@ -139,6 +144,7 @@ where block_info, Some(transaction), platform_version, + Some(previous_fee_versions), ) .map_err(Error::Drive)?; @@ -167,6 +173,7 @@ where block_info, Some(transaction), platform_version, + Some(previous_fee_versions), ) .map_err(Error::Drive)?; @@ -186,6 +193,7 @@ where block_info, Some(transaction), platform_version, + Some(previous_fee_versions), ) .map_err(Error::Drive)?; Ok(SuccessfulFreeExecution) diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs index 276a2ec540..67330b5539 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs @@ -5,9 +5,6 @@ use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; use dpp::consensus::codes::ErrorWithCode; use dpp::fee::fee_result::FeeResult; -use dpp::util::hash::hash_single; -use dpp::validation::ConsensusValidationResult; -use std::time::Instant; use crate::execution::types::execution_event::ExecutionEvent; use crate::execution::types::state_transition_container::v0::{ @@ -17,11 +14,16 @@ use crate::execution::types::state_transition_container::v0::{ use crate::execution::validation::state_transition::processor::process_state_transition; use crate::metrics::state_transition_execution_histogram; use crate::platform_types::event_execution_result::EventExecutionResult; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::state_transitions_processing_result::{ StateTransitionExecutionResult, StateTransitionsProcessingResult, }; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; +use dpp::util::hash::hash_single; +use dpp::validation::ConsensusValidationResult; use dpp::version::PlatformVersion; use drive::grovedb::Transaction; +use std::time::Instant; #[derive(Debug)] struct StateTransitionAwareError<'t> { @@ -116,6 +118,7 @@ where block_info, transaction, platform_version, + platform_ref.state.previous_fee_versions(), ) .unwrap_or_else(error_to_internal_error_execution_result) }) @@ -200,6 +203,7 @@ where block_info: &BlockInfo, transaction: &Transaction, platform_version: &PlatformVersion, + previous_fee_versions: &CachedEpochIndexFeeVersions, ) -> Result> { // State Transition is invalid if !validation_result.is_valid() { @@ -253,6 +257,7 @@ where block_info, transaction, platform_version, + previous_fee_versions, ) .map_err(|error| StateTransitionAwareError { error, @@ -344,6 +349,7 @@ where block_info, transaction, platform_version, + previous_fee_versions, ) .map_err(|error| StateTransitionAwareError { error, diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/mod.rs index ff62581d7c..b3dff47371 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/mod.rs @@ -7,6 +7,7 @@ use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::fee::fee_result::FeeResult; use dpp::prelude::ConsensusValidationResult; use dpp::version::PlatformVersion; @@ -41,6 +42,7 @@ where block_info: &BlockInfo, transaction: TransactionArg, platform_version: &PlatformVersion, + previous_fee_versions: &CachedEpochIndexFeeVersions, ) -> Result, Error> { match platform_version .drive_abci @@ -48,7 +50,13 @@ where .state_transition_processing .validate_fees_of_event { - 0 => self.validate_fees_of_event_v0(event, block_info, transaction, platform_version), + 0 => self.validate_fees_of_event_v0( + event, + block_info, + transaction, + platform_version, + previous_fee_versions, + ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "validate_fees_of_event".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs index 5f9000326f..04e8f0f503 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs @@ -7,6 +7,7 @@ use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; use dpp::consensus::state::identity::IdentityInsufficientBalanceError; use dpp::consensus::state::state_error::StateError; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::fee::fee_result::FeeResult; use dpp::prelude::ConsensusValidationResult; @@ -41,6 +42,7 @@ where block_info: &BlockInfo, transaction: TransactionArg, platform_version: &PlatformVersion, + previous_fee_versions: &CachedEpochIndexFeeVersions, ) -> Result, Error> { match event { ExecutionEvent::PaidFromAssetLock { @@ -62,6 +64,7 @@ where block_info, transaction, platform_version, + Some(previous_fee_versions), ) .map_err(Error::Drive)?; @@ -115,6 +118,7 @@ where block_info, transaction, platform_version, + Some(previous_fee_versions), ) .map_err(Error::Drive)?; diff --git a/packages/rs-drive-abci/src/execution/platform_events/voting/award_document_to_winner/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/voting/award_document_to_winner/v0/mod.rs index c6e9698c0d..03abd09cd6 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/voting/award_document_to_winner/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/voting/award_document_to_winner/v0/mod.rs @@ -48,6 +48,7 @@ where true, transaction, platform_version, + None, )?; Ok(()) } diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/mod.rs index b67a25a1b3..851c2081c4 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/mod.rs @@ -1,9 +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::block::block_info::BlockInfo; + use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; 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 9659528dc2..ab33957241 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 @@ -25,6 +25,7 @@ use crate::{ rpc::core::CoreRPCLike, }; use dpp::errors::ProtocolError; + use drive::drive::config::DEFAULT_QUERY_LIMIT; const WITHDRAWAL_TRANSACTIONS_QUERY_LIMIT: u16 = 16; @@ -108,6 +109,7 @@ where block_info, transaction, platform_version, + None, )?; Ok(UnsignedWithdrawalTxs::from_vec( 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 5d79a1c601..910445fe32 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 @@ -1,6 +1,7 @@ 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; 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 d65b4138f5..2915c929a9 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 @@ -3,6 +3,7 @@ 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; @@ -131,6 +132,7 @@ where block_info, transaction, platform_version, + None, )?; Ok(()) diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/mod.rs index af76346763..6d5cade8e6 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/mod.rs @@ -1,8 +1,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::version::PlatformVersion; use drive::grovedb::Transaction; 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 97b5a922ba..7af1aed652 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 @@ -5,6 +5,7 @@ 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 itertools::Itertools; @@ -155,6 +156,7 @@ where block_info, transaction.into(), platform_version, + None, )?; Ok(()) 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 d802596ae8..4024224e2e 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 @@ -106,7 +106,7 @@ impl ValidationOperation { .processing_fee .checked_add( platform_version.fee_version.hashing.single_sha256_base - + platform_version.fee_version.hashing.single_sha256_per_block + + platform_version.fee_version.hashing.sha256_per_block * (*block_count as u64), ) .ok_or(ExecutionError::Overflow( @@ -117,8 +117,8 @@ impl ValidationOperation { fee_result.processing_fee = fee_result .processing_fee .checked_add( - platform_version.fee_version.hashing.double_sha256_base - + platform_version.fee_version.hashing.double_sha256_per_block + platform_version.fee_version.hashing.single_sha256_base + + platform_version.fee_version.hashing.sha256_per_block * (*block_count as u64), ) .ok_or(ExecutionError::Overflow( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs index 93b86034d6..051c716a8e 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs @@ -306,6 +306,7 @@ mod tests { true, None, platform_version, + None, ) .expect("expected to insert a document successfully"); 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 7609cc2a16..d473a2beb6 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 @@ -1374,7 +1374,8 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 3810570); + assert_eq!(processing_result.aggregated_fees().processing_fee, 3837600); + // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised } #[test] @@ -1514,7 +1515,8 @@ mod tests { assert_eq!(processing_result.valid_count(), 0); - assert_eq!(processing_result.aggregated_fees().processing_fee, 102690); + assert_eq!(processing_result.aggregated_fees().processing_fee, 103200); + // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised } #[test] @@ -1693,7 +1695,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 0); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1253950); + assert_eq!(processing_result.aggregated_fees().processing_fee, 1261600); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised let query_sender_results = platform .drive @@ -1797,7 +1799,8 @@ mod tests { assert_eq!(processing_result.valid_count(), 0); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1244470); + assert_eq!(processing_result.aggregated_fees().processing_fee, 1252800); + // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised } } @@ -1936,7 +1939,8 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 5588830); + assert_eq!(processing_result.aggregated_fees().processing_fee, 5612800); + // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised } #[test] @@ -2098,7 +2102,8 @@ mod tests { assert_eq!(processing_result.valid_count(), 0); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1253950); + assert_eq!(processing_result.aggregated_fees().processing_fee, 1261600); + // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised } #[test] @@ -2260,7 +2265,8 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 9945520); + assert_eq!(processing_result.aggregated_fees().processing_fee, 9993800); + // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised } #[test] @@ -2403,7 +2409,8 @@ mod tests { assert_eq!(processing_result.valid_count(), 0); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1507670); + assert_eq!(processing_result.aggregated_fees().processing_fee, 1516000); + // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised } #[test] @@ -2492,7 +2499,8 @@ mod tests { assert_eq!(processing_result.valid_count(), 0); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1244470); + assert_eq!(processing_result.aggregated_fees().processing_fee, 1252800); + // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised } } @@ -2652,7 +2660,8 @@ mod tests { assert_eq!(processing_result.aggregated_fees().storage_fee, 0); // There is no storage fee, as there are no indexes that will change - assert_eq!(processing_result.aggregated_fees().processing_fee, 4926670); + assert_eq!(processing_result.aggregated_fees().processing_fee, 4972400); + // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised } #[test] @@ -2843,7 +2852,7 @@ mod tests { Some(14992395) ); - assert_eq!(processing_result.aggregated_fees().processing_fee, 8622720); + assert_eq!(processing_result.aggregated_fees().processing_fee, 8691400); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised let query_sender_results = platform .drive @@ -3035,7 +3044,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 0); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1253950); + assert_eq!(processing_result.aggregated_fees().processing_fee, 1261600); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised let query_sender_results = platform .drive @@ -3185,7 +3194,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 0); - assert_eq!(processing_result.aggregated_fees().processing_fee, 25090); + assert_eq!(processing_result.aggregated_fees().processing_fee, 25600); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised let query_sender_results = platform .drive @@ -3380,7 +3389,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 9549440); + assert_eq!(processing_result.aggregated_fees().processing_fee, 9622200); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised let query_sender_results = platform .drive @@ -3447,7 +3456,8 @@ mod tests { assert_eq!(processing_result.valid_count(), 0); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1107610); + assert_eq!(processing_result.aggregated_fees().processing_fee, 1115600); + // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised } } @@ -3783,7 +3793,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 6075290); + assert_eq!(processing_result.aggregated_fees().processing_fee, 6133600); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised let query_sender_results = platform .drive @@ -3904,11 +3914,11 @@ mod tests { .change(), &BalanceChange::RemoveFromBalance { required_removed_balance: 123579000, - desired_removed_balance: 127933560, + desired_removed_balance: 127991300, // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised } ); - let original_creation_cost = 127933560; + let original_creation_cost = 127991300; // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised platform .drive @@ -4035,7 +4045,7 @@ mod tests { None ); - assert_eq!(processing_result.aggregated_fees().processing_fee, 6075290); + assert_eq!(processing_result.aggregated_fees().processing_fee, 6133600); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised let seller_balance = platform .drive @@ -4046,8 +4056,8 @@ mod tests { // the seller should have received 0.1 and already had 0.1 minus the processing fee and storage fee assert_eq!( seller_balance, - dash_to_credits!(0.1) - 6075290 - 216000 - original_creation_cost - ); + dash_to_credits!(0.1) - original_creation_cost - 6349600 + ); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised let query_sender_results = platform .drive @@ -4141,7 +4151,7 @@ mod tests { assert_eq!(processing_result.aggregated_fees().storage_fee, 64611000); - assert_eq!(processing_result.aggregated_fees().processing_fee, 10134040); + assert_eq!(processing_result.aggregated_fees().processing_fee, 10210200); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised assert_eq!( processing_result @@ -4175,8 +4185,8 @@ mod tests { // the seller should have received 0.1 and already had 0.1 minus the processing fee and storage fee assert_eq!( seller_balance, - dash_to_credits!(0.2) - 6075290 - 216000 - original_creation_cost + 22704503 - ); + dash_to_credits!(0.2) - original_creation_cost + 16354903 + ); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised let buyers_balance = platform .drive @@ -4185,7 +4195,7 @@ mod tests { .expect("expected that purchaser exists"); // the buyer payed 0.1, but also storage and processing fees - assert_eq!(buyers_balance, dash_to_credits!(0.9) - 10134040 - 64611000); + assert_eq!(buyers_balance, dash_to_credits!(0.9) - 74821200); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised } #[test] @@ -5051,7 +5061,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 6075290); + assert_eq!(processing_result.aggregated_fees().processing_fee, 6133600); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised let query_sender_results = platform .drive @@ -5280,7 +5290,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 0); - assert_eq!(processing_result.aggregated_fees().processing_fee, 25090); + assert_eq!(processing_result.aggregated_fees().processing_fee, 25600); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised let sender_documents_sql_string = format!("select * from card where $ownerId == '{}'", identity.id()); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/fetch_contender.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/fetch_contender.rs index afafbe85b1..8398f39b98 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/fetch_contender.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/fetch_contender.rs @@ -39,6 +39,7 @@ pub(crate) fn fetch_contender( &block_info.epoch, drive.config.epochs_per_era, platform_version, + None, )?; match result.contenders.pop() { None => Ok((None, fee)), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs index d47b157d64..32ad5e8de8 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs @@ -306,7 +306,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 2633590); + assert_eq!(processing_result.aggregated_fees().processing_fee, 2658800); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised platform .drive @@ -321,7 +321,7 @@ mod tests { .expect("expected to get identity balance") .expect("expected there to be an identity balance for this identity"); - assert_eq!(identity_balance, 99916096410); + assert_eq!(identity_balance, 99916071200); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised } #[test] @@ -462,7 +462,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 0); - assert_eq!(processing_result.aggregated_fees().processing_fee, 10013800); // 10000000 penalty + 13800 processing + assert_eq!(processing_result.aggregated_fees().processing_fee, 10013000); // 10000000 penalty + 13800 processing platform .drive @@ -524,7 +524,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 3237030); + assert_eq!(processing_result.aggregated_fees().processing_fee, 3263600); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised platform .drive @@ -539,7 +539,7 @@ mod tests { .expect("expected to get identity balance") .expect("expected there to be an identity balance for this identity"); - assert_eq!(identity_balance, 99911230170); // The identity balance is smaller than if there hadn't been any issue + assert_eq!(identity_balance, 99911204400); // The identity balance is smaller than if there hadn't been any issue // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised } #[test] @@ -691,7 +691,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 0); - assert_eq!(processing_result.aggregated_fees().processing_fee, 10013800); // 10000000 penalty + 13800 processing + assert_eq!(processing_result.aggregated_fees().processing_fee, 10013000); // 10000000 penalty + 13800 processing platform .drive @@ -916,7 +916,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 0); - assert_eq!(processing_result.aggregated_fees().processing_fee, 10013800); // 10000000 penalty + 13800 processing + assert_eq!(processing_result.aggregated_fees().processing_fee, 10013000); // 10000000 penalty + 13800 processing platform .drive @@ -1129,7 +1129,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 0); - assert_eq!(processing_result.aggregated_fees().processing_fee, 10013800); // 10000000 penalty + 13800 processing + assert_eq!(processing_result.aggregated_fees().processing_fee, 10013000); // 10000000 penalty + 13800 processing platform .drive @@ -1214,7 +1214,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 3237030); + assert_eq!(processing_result.aggregated_fees().processing_fee, 3263600); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised platform .drive @@ -1229,6 +1229,6 @@ mod tests { .expect("expected to get identity balance") .expect("expected there to be an identity balance for this identity"); - assert_eq!(identity_balance, 99911230170); // The identity balance is smaller than if there hadn't been any issue + assert_eq!(identity_balance, 99911204400); // The identity balance is smaller than if there hadn't been any issue // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs index b2ad730817..0efe7ffd38 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs @@ -225,7 +225,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1213500); + assert_eq!(processing_result.aggregated_fees().processing_fee, 1219900); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised platform .drive @@ -244,6 +244,6 @@ mod tests { .expect("expected to get identity balance") .expect("expected there to be an identity balance for this identity"); - assert_eq!(identity_balance, 149992981500); // about 0.5 Dash starting balance + 1 Dash asset lock top up + assert_eq!(identity_balance, 149992975100); // about 0.5 Dash starting balance + 1 Dash asset lock top up // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised } } 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 eb43d199e7..942d632f58 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 @@ -24,6 +24,7 @@ use crate::config::PlatformConfig; use crate::error::execution::ExecutionError; use crate::platform_types::signature_verification_quorum_set::SignatureVerificationQuorumSet; use dpp::block::block_info::BlockInfo; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::util::hash::hash_double; use std::collections::BTreeMap; @@ -516,4 +517,16 @@ impl PlatformStateV0Methods for PlatformState { } } } + + fn previous_fee_versions(&self) -> &CachedEpochIndexFeeVersions { + match self { + PlatformState::V0(v0) => v0.previous_fee_versions(), + } + } + + fn previous_fee_versions_mut(&mut self) -> &mut CachedEpochIndexFeeVersions { + match self { + PlatformState::V0(v0) => v0.previous_fee_versions_mut(), + } + } } 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 0f2d565ee8..555bcbe96f 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 @@ -23,6 +23,7 @@ use crate::config::PlatformConfig; use crate::platform_types::signature_verification_quorum_set::{ SignatureVerificationQuorumSet, SignatureVerificationQuorumSetForSaving, }; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use itertools::Itertools; use std::collections::BTreeMap; use std::fmt::{Debug, Formatter}; @@ -58,6 +59,9 @@ pub struct PlatformStateV0 { /// current HPMN masternode list pub hpmn_masternode_list: BTreeMap, + + /// previous Fee Versions + pub previous_fee_versions: CachedEpochIndexFeeVersions, } impl Debug for PlatformStateV0 { @@ -143,6 +147,9 @@ pub struct PlatformStateForSavingV0 { /// current HPMN masternode list pub hpmn_masternode_list: BTreeMap, + + /// previous FeeVersions + pub previous_fee_versions: CachedEpochIndexFeeVersions, } impl TryFrom for PlatformStateForSavingV0 { @@ -189,6 +196,7 @@ impl TryFrom for PlatformStateForSavingV0 { )) }) .collect::, Error>>()?, + previous_fee_versions: value.previous_fee_versions, }) } } @@ -223,6 +231,7 @@ 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, } } } @@ -254,6 +263,7 @@ impl PlatformStateV0 { full_masternode_list: Default::default(), hpmn_masternode_list: Default::default(), genesis_block_info: None, + previous_fee_versions: Default::default(), }; Ok(state) @@ -408,6 +418,12 @@ pub trait PlatformStateV0Methods { /// The last block id hash fn last_committed_block_id_hash(&self) -> [u8; 32]; + /// Returns reference to the previous feeversions + fn previous_fee_versions(&self) -> &CachedEpochIndexFeeVersions; + + /// Returns a mutable reference to the previous feeversions + fn previous_fee_versions_mut(&mut self) -> &mut CachedEpochIndexFeeVersions; + /// The changes in the full masternode list between two platform states fn full_masternode_list_changes(&self, previous: &Self) -> MasternodeListChanges where @@ -712,6 +728,16 @@ impl PlatformStateV0Methods for PlatformStateV0 { .unwrap_or_default() } + /// Returns a reference to the previous feeversions + fn previous_fee_versions(&self) -> &CachedEpochIndexFeeVersions { + &self.previous_fee_versions + } + + /// Returns a mutable reference to the previous feeversions + fn previous_fee_versions_mut(&mut self) -> &mut CachedEpochIndexFeeVersions { + &mut self.previous_fee_versions + } + fn full_masternode_list_changes(&self, previous: &PlatformStateV0) -> MasternodeListChanges { let mut new_masternodes = Vec::new(); let mut removed_masternodes = Vec::new(); diff --git a/packages/rs-drive-abci/src/query/mod.rs b/packages/rs-drive-abci/src/query/mod.rs index 1e46effafb..af0ae1389c 100644 --- a/packages/rs-drive-abci/src/query/mod.rs +++ b/packages/rs-drive-abci/src/query/mod.rs @@ -27,6 +27,7 @@ mod tests { use crate::test::helpers::setup::{TempPlatform, TestPlatformBuilder}; use dpp::block::block_info::BlockInfo; use dpp::data_contract::DataContract; + use drive::drive::batch::DataContractOperationType; use drive::drive::batch::DriveOperation::DataContractOperation; use platform_version::version::PlatformVersion; @@ -73,7 +74,14 @@ mod tests { platform .drive - .apply_drive_operations(vec![operation], true, &block_info, None, platform_version) + .apply_drive_operations( + vec![operation], + true, + &block_info, + None, + platform_version, + None, + ) .expect("expected to apply drive operations"); } diff --git a/packages/rs-drive-abci/src/test/helpers/fee_pools.rs b/packages/rs-drive-abci/src/test/helpers/fee_pools.rs index d076988490..0dfa5e1734 100644 --- a/packages/rs-drive-abci/src/test/helpers/fee_pools.rs +++ b/packages/rs-drive-abci/src/test/helpers/fee_pools.rs @@ -115,6 +115,7 @@ fn create_test_mn_share_document( true, transaction, platform_version, + None, ) .expect("expected to insert a document successfully"); diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 3471026ed4..c20a2963d3 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -526,7 +526,7 @@ mod tests { .expect("expected to fetch balances") .expect("expected to have an identity to get balance from"); - assert_eq!(balance, 99864759120) + assert_eq!(balance, 99864716400) // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised } #[test] @@ -1193,7 +1193,7 @@ mod tests { .unwrap() .unwrap() ), - "3a1756d12483a31c585d741281d2f882857943f1f7eb02d9bb47bc406a391c33".to_string() + "8183eede440c002da02009166bef1e624afdb796852c755fa9abb7c22526c6bf".to_string() ) } @@ -1914,7 +1914,7 @@ mod tests { .unwrap() .unwrap() ), - "4437143051f651e86e0c279ef0ccc0adf3d36a42f9db03b76829681ddbca3e4a".to_string() + "10aa07e5e7c2fbe521a8ddd937be9cb68e9abe0f69bac4fef1442d447a1b7c6a".to_string() ) } @@ -2049,7 +2049,7 @@ mod tests { .unwrap() .unwrap() ), - "bba2902bc71ce45f72b46661458203334e9ffd347347b0ccb252955011d6b355".to_string() + "2ca45a7e73e8f7126b2192bb738c619746acdbef84ef3c3e1a1131be69e44f40".to_string() ) } diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index 62572aa5b5..85faccb8ae 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -73,7 +73,9 @@ use dpp::voting::votes::Vote; use drive_abci::abci::app::FullAbciApplication; use drive_abci::platform_types::platform_state::v0::PlatformStateV0Methods; use drive_abci::config::PlatformConfig; -use drive_abci::platform_types::signature_verification_quorum_set::{QuorumConfig, Quorums, SigningQuorum}; +use drive_abci::platform_types::signature_verification_quorum_set::{ + QuorumConfig, Quorums, SigningQuorum, +}; use drive_abci::platform_types::withdrawal::unsigned_withdrawal_txs::v0::UnsignedWithdrawalTxs; use crate::strategy::CoreHeightIncrease::NoCoreHeightIncrease; diff --git a/packages/rs-drive-proof-verifier/src/proof.rs b/packages/rs-drive-proof-verifier/src/proof.rs index 429174c087..63d76226da 100644 --- a/packages/rs-drive-proof-verifier/src/proof.rs +++ b/packages/rs-drive-proof-verifier/src/proof.rs @@ -2,6 +2,8 @@ use crate::from_request::TryFromRequest; use crate::provider::DataContractProvider; use crate::{types, types::*, ContextProvider, Error}; use dapi_grpc::platform::v0::get_identities_contract_keys_request::GetIdentitiesContractKeysRequestV0; +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_path_elements_request::GetPathElementsRequestV0; use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_request::{ self, GetProtocolVersionUpgradeVoteStatusRequestV0, @@ -24,13 +26,17 @@ use dapi_grpc::platform::{ VersionedGrpcResponse, }; use dpp::block::block_info::BlockInfo; +use dpp::block::block_info::BlockInfo; use dpp::block::epoch::{EpochIndex, MAX_EPOCH}; use dpp::block::extended_epoch_info::ExtendedEpochInfo; use dpp::dashcore::hashes::Hash; use dpp::dashcore::ProTxHash; use dpp::document::{Document, DocumentV0Getters}; use dpp::identity::identities_contract_keys::IdentitiesContractKeys; +use dpp::identity::identities_contract_keys::IdentitiesContractKeys; +use dpp::identity::Purpose; use dpp::identity::Purpose; +use dpp::platform_value; use dpp::platform_value::{self}; use dpp::prelude::{DataContract, Identifier, Identity}; use dpp::serialization::PlatformDeserializable; @@ -1201,7 +1207,7 @@ impl FromProof for IdentitiesContrac contract_id, document_type_name, purposes, - prove: _, + .. } = v0; let identifiers = identities_ids .into_iter() diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 0d9715e262..94ef1b86ee 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -74,6 +74,7 @@ dpp = { path = "../rs-dpp", features = [ "factories", "data-contract-json-conversion", ], default-features = false } +once_cell = "1.7" serde_json = { version = "1.0", features = ["preserve_order"] } [[bench]] diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/contract.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/contract.rs index b74eedd04c..c3baa30f2f 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/contract.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/contract.rs @@ -11,6 +11,7 @@ use crate::drive::batch::drive_op_batch::finalize_task::{ }; use crate::error::drive::DriveError; use dpp::data_contract::accessors::v0::DataContractV0Getters; + use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/drive_methods/apply_drive_operations/mod.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/drive_methods/apply_drive_operations/mod.rs index b4040eb7b0..c4a00b0457 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/drive_methods/apply_drive_operations/mod.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/drive_methods/apply_drive_operations/mod.rs @@ -7,9 +7,9 @@ use crate::error::{drive::DriveError, Error}; use dpp::block::block_info::BlockInfo; -use grovedb::TransactionArg; - +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::fee::fee_result::FeeResult; +use grovedb::TransactionArg; use dpp::version::PlatformVersion; @@ -39,6 +39,7 @@ impl Drive { block_info: &BlockInfo, transaction: TransactionArg, platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result { match platform_version .drive @@ -52,6 +53,7 @@ impl Drive { block_info, transaction, platform_version, + previous_fee_versions, ), version => Err(Error::Drive(DriveError::UnknownVersionMismatch { method: "apply_drive_operations".to_string(), diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/drive_methods/apply_drive_operations/v0/mod.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/drive_methods/apply_drive_operations/v0/mod.rs index bceb686403..acf9ebf3cb 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/drive_methods/apply_drive_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/drive_methods/apply_drive_operations/v0/mod.rs @@ -16,6 +16,7 @@ use grovedb::batch::KeyInfoPath; use crate::drive::batch::drive_op_batch::finalize_task::{ DriveOperationFinalizationTasks, DriveOperationFinalizeTask, }; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use std::collections::HashMap; impl Drive { @@ -43,6 +44,7 @@ impl Drive { block_info: &BlockInfo, transaction: TransactionArg, platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result { if operations.is_empty() { return Ok(FeeResult::default()); @@ -91,6 +93,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + previous_fee_versions, ) } } diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs index fec99b46fc..f234c122b5 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs @@ -35,6 +35,7 @@ use crate::drive::batch::drive_op_batch::finalize_task::{ DriveOperationFinalizationTasks, DriveOperationFinalizeTask, }; use crate::error::drive::DriveError; + use std::collections::{BTreeMap, HashMap}; /// A converter that will get Drive Operations from High Level Operations @@ -284,6 +285,7 @@ mod tests { &BlockInfo::default(), Some(&db_transaction), platform_version, + None, ) .expect("expected to insert contract and document"); @@ -403,6 +405,7 @@ mod tests { &BlockInfo::default(), Some(&db_transaction), platform_version, + None, ) .expect("expected to be able to insert documents"); @@ -514,6 +517,7 @@ mod tests { &BlockInfo::default(), Some(&db_transaction), platform_version, + None, ) .expect("expected to be able to insert documents"); @@ -645,6 +649,7 @@ mod tests { &BlockInfo::default(), Some(&db_transaction), platform_version, + None, ) .expect("expected to be able to insert documents"); @@ -753,6 +758,7 @@ mod tests { &BlockInfo::default(), Some(&db_transaction), platform_version, + None, ) .expect("expected to be able to insert documents"); @@ -813,6 +819,7 @@ mod tests { &BlockInfo::default(), Some(&db_transaction), platform_version, + None, ) .expect("expected to be able to update documents"); @@ -966,6 +973,7 @@ mod tests { &BlockInfo::default(), Some(&db_transaction), platform_version, + None, ) .expect("expected to be able to insert documents"); @@ -1019,6 +1027,7 @@ mod tests { &BlockInfo::default(), Some(&db_transaction), platform_version, + None, ) .expect("expected to be able to update documents"); diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/system.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/system.rs index ef0d61f204..f2ac99ba67 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/system.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/system.rs @@ -7,6 +7,7 @@ use dpp::fee::Credits; use dpp::platform_value::Bytes36; use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; + use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/withdrawals.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/withdrawals.rs index d7ec21a09f..cc1569f0b4 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/withdrawals.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/withdrawals.rs @@ -1,10 +1,5 @@ use std::collections::HashMap; -use dpp::block::block_info::BlockInfo; -use dpp::version::PlatformVersion; -use grovedb::Element; -use grovedb::{batch::KeyInfoPath, EstimatedLayerInformation, TransactionArg}; - use crate::drive::grove_operations::BatchDeleteApplyType; use crate::drive::identity::withdrawals::paths::{ get_withdrawal_root_path_vec, get_withdrawal_transactions_queue_path, @@ -15,6 +10,11 @@ use crate::drive::identity::withdrawals::{ }; use crate::drive::object_size_info::PathKeyElementInfo; use crate::{drive::Drive, error::Error, fee::op::LowLevelDriveOperation}; +use dpp::block::block_info::BlockInfo; + +use dpp::version::PlatformVersion; +use grovedb::Element; +use grovedb::{batch::KeyInfoPath, EstimatedLayerInformation, TransactionArg}; use super::DriveLowLevelOperationConverter; diff --git a/packages/rs-drive/src/drive/contract/apply/apply_contract_with_serialization/v0/mod.rs b/packages/rs-drive/src/drive/contract/apply/apply_contract_with_serialization/v0/mod.rs index 1b1c360608..617adf9344 100644 --- a/packages/rs-drive/src/drive/contract/apply/apply_contract_with_serialization/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/apply/apply_contract_with_serialization/v0/mod.rs @@ -61,12 +61,14 @@ impl Drive { &platform_version.drive, )?; cost_operations.push(CalculatedCostOperation(fetch_cost)); + let fees = Drive::calculate_fee( None, Some(cost_operations), &block_info.epoch, self.config.epochs_per_era, platform_version, + None, )?; Ok(fees) } diff --git a/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract/v0/mod.rs b/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract/v0/mod.rs index 350a7bf590..7f93c74703 100644 --- a/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract/v0/mod.rs @@ -94,7 +94,8 @@ impl Drive { Some(vec![drive_operation]), epoch, self.config.epochs_per_era, - platform_version + platform_version, + None, ) )) } else { @@ -149,7 +150,8 @@ impl Drive { Some(vec![drive_operation]), epoch, self.config.epochs_per_era, - platform_version + platform_version, + None, ) )) } else { 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 7bf0855d80..3f35b41193 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 @@ -213,6 +213,7 @@ mod tests { true, Some(&transaction), platform_version, + None, ) .expect("should update contract"); @@ -276,7 +277,7 @@ mod tests { assert_eq!( result.0, Some(FeeResult { - processing_fee: 4060, + processing_fee: 4400, // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised ..Default::default() }) ); diff --git a/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/v0/mod.rs b/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/v0/mod.rs index 11440501e0..817bd0e217 100644 --- a/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/v0/mod.rs @@ -100,6 +100,7 @@ impl Drive { epoch, self.config.epochs_per_era, platform_version, + None, ) .map(Some) })?; @@ -155,6 +156,7 @@ impl Drive { epoch, self.config.epochs_per_era, platform_version, + None, )?; let updated_contract_fetch_info = Arc::new(DataContractFetchInfo { diff --git a/packages/rs-drive/src/drive/contract/insert/insert_contract/v0/mod.rs b/packages/rs-drive/src/drive/contract/insert/insert_contract/v0/mod.rs index c538f96996..0b6bb6f804 100644 --- a/packages/rs-drive/src/drive/contract/insert/insert_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/insert/insert_contract/v0/mod.rs @@ -79,6 +79,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + None, ) } diff --git a/packages/rs-drive/src/drive/contract/mod.rs b/packages/rs-drive/src/drive/contract/mod.rs index 7d67d4d28c..ffdfa72754 100644 --- a/packages/rs-drive/src/drive/contract/mod.rs +++ b/packages/rs-drive/src/drive/contract/mod.rs @@ -292,6 +292,7 @@ mod tests { true, None, platform_version, + None, ) .expect("expected to insert a document successfully"); } @@ -494,6 +495,7 @@ mod tests { false, None, platform_version, + None, ) .expect("expected to apply contract successfully"); } diff --git a/packages/rs-drive/src/drive/contract/update/update_contract/mod.rs b/packages/rs-drive/src/drive/contract/update/update_contract/mod.rs index 9b7b67048b..7f39ab6bf8 100644 --- a/packages/rs-drive/src/drive/contract/update/update_contract/mod.rs +++ b/packages/rs-drive/src/drive/contract/update/update_contract/mod.rs @@ -8,6 +8,7 @@ use dpp::block::block_info::BlockInfo; use dpp::data_contract::DataContract; use dpp::fee::fee_result::FeeResult; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; @@ -46,6 +47,7 @@ impl Drive { apply: bool, transaction: TransactionArg, platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result { match platform_version .drive @@ -54,9 +56,14 @@ impl Drive { .update .update_contract { - 0 => { - self.update_contract_v0(contract, block_info, apply, transaction, platform_version) - } + 0 => self.update_contract_v0( + contract, + block_info, + apply, + transaction, + platform_version, + previous_fee_versions, + ), version => Err(Error::Drive(DriveError::UnknownVersionMismatch { method: "update_contract".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive/src/drive/contract/update/update_contract/v0/mod.rs b/packages/rs-drive/src/drive/contract/update/update_contract/v0/mod.rs index 8f27edffc9..017a3d7993 100644 --- a/packages/rs-drive/src/drive/contract/update/update_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/update/update_contract/v0/mod.rs @@ -16,6 +16,7 @@ use dpp::fee::fee_result::FeeResult; use dpp::data_contract::document_type::methods::DocumentTypeV0Methods; use dpp::serialization::PlatformSerializableWithPlatformVersion; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; @@ -53,6 +54,7 @@ impl Drive { apply: bool, transaction: TransactionArg, platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result { if !apply { return self.insert_contract( @@ -132,6 +134,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + previous_fee_versions, ) } diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/get_epochs_infos/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/get_epochs_infos/v0/mod.rs index 3fa8a0c9e7..d9d4eb4ef5 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/get_epochs_infos/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/get_epochs_infos/v0/mod.rs @@ -28,6 +28,7 @@ impl Drive { transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { + // TODO: We should avoid magic numbers. For now we are good since count refers to the number of epochs to fetch and 16383 is large enough. if count > 16383 { return Err(Error::Query(QuerySyntaxError::InvalidLimit(format!( "get_epochs_infos_v0 count too high {}", diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/get_epochs_protocol_versions/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/get_epochs_protocol_versions/mod.rs new file mode 100644 index 0000000000..de7a2652ab --- /dev/null +++ b/packages/rs-drive/src/drive/credit_pools/epochs/get_epochs_protocol_versions/mod.rs @@ -0,0 +1,45 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use std::collections::BTreeMap; + +use dpp::block::epoch::EpochIndex; +use dpp::util::deserializer::ProtocolVersion; +use grovedb::TransactionArg; + +use dpp::version::PlatformVersion; + +impl Drive { + /// Get multiple epoch protocol versions starting at a given epoch index + pub fn get_epochs_protocol_versions( + &self, + start_epoch_index: u16, + count: Option, + ascending: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result, Error> { + match platform_version + .drive + .methods + .credit_pools + .epochs + .get_epochs_protocol_versions + { + 0 => self.get_epochs_protocol_versions_v0( + start_epoch_index, + count, + ascending, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "get_epochs_protocol_versions".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/get_epochs_protocol_versions/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/get_epochs_protocol_versions/v0/mod.rs new file mode 100644 index 0000000000..420924fe8d --- /dev/null +++ b/packages/rs-drive/src/drive/credit_pools/epochs/get_epochs_protocol_versions/v0/mod.rs @@ -0,0 +1,116 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use dpp::block::epoch::{EpochIndex, EPOCH_KEY_OFFSET}; +use dpp::util::deserializer::ProtocolVersion; +use dpp::ProtocolError; +use grovedb::query_result_type::{QueryResultElement, QueryResultType}; +use grovedb::{Element, PathQuery, Query, SizedQuery, TransactionArg}; +use std::collections::BTreeMap; + +use crate::drive::credit_pools::pools_vec_path; +use crate::error::query::QuerySyntaxError; +use crate::fee_pools::epochs::epoch_key_constants::KEY_PROTOCOL_VERSION; +use crate::query::QueryItem; +use dpp::version::PlatformVersion; + +impl Drive { + pub(super) fn get_epochs_protocol_versions_v0( + &self, + start_epoch_index: u16, + count: Option, + ascending: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result, Error> { + if let Some(count) = count { + // TODO: We should avoid magic numbers. For now we are good since count refers to the number of epochs to fetch and 16383 is large enough. + if count > 16383 { + return Err(Error::Query(QuerySyntaxError::InvalidLimit(format!( + "get_epochs_protocol_versions_v0 count too high {}", + count + )))); + } + } + let index_with_offset = start_epoch_index + .checked_add(EPOCH_KEY_OFFSET) + .ok_or(ProtocolError::Overflow("stored epoch index too high"))?; + let mut query = if ascending { + Query::new_single_query_item(QueryItem::RangeFrom( + index_with_offset.to_be_bytes().to_vec().., + )) + } else { + Query::new_single_query_item(QueryItem::RangeToInclusive( + ..=index_with_offset.to_be_bytes().to_vec(), + )) + }; + query.left_to_right = ascending; + query.set_subquery_path(vec![KEY_PROTOCOL_VERSION.to_vec()]); + let path_query = PathQuery::new( + pools_vec_path(), + // The multiplier must be equal to requested keys count + SizedQuery::new(query, count, None), + ); + + let results = self + .grove_get_path_query( + &path_query, + transaction, + QueryResultType::QueryPathKeyElementTrioResultType, + &mut vec![], + &platform_version.drive, + )? + .0; + + let mut map: BTreeMap = BTreeMap::default(); + + for result_item in results.elements.into_iter() { + if let QueryResultElement::PathKeyElementTrioResultItem(( + mut path, + _, + protocol_version_element, + )) = result_item + { + let Some(epoch_index_vec) = path.pop() else { + return Err(Error::Drive(DriveError::CorruptedDriveState( + "path must be bigger than empty".to_string(), + ))); + }; + + let epoch_index_bytes: [u8; 32] = + epoch_index_vec.as_slice().try_into().map_err(|_| { + Error::Drive(DriveError::CorruptedSerialization( + "extended epoch info: item has an invalid length".to_string(), + )) + })?; + let epoch_index = + EpochIndex::from_be_bytes([epoch_index_bytes[0], epoch_index_bytes[1]]) + .checked_sub(EPOCH_KEY_OFFSET) + .ok_or(Error::Drive(DriveError::CorruptedSerialization( + "epoch bytes on disk too small, should be over epoch key offset" + .to_string(), + )))?; + + let Element::Item(encoded_protocol_version, _) = protocol_version_element else { + return Err(Error::Drive(DriveError::UnexpectedElementType( + "protocol version must be an item", + ))); + }; + + let protocol_version_bytes: [u8; 4] = encoded_protocol_version + .as_slice() + .try_into() + .map_err(|_| { + Error::Drive(DriveError::CorruptedSerialization( + "protocol version must be 4 bytes for a u32".to_string(), + )) + })?; + + let protocol_version = u32::from_be_bytes(protocol_version_bytes); + + map.insert(epoch_index, protocol_version); + } + } + Ok(map) + } +} diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/mod.rs index 7d5449e645..572ef00d67 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/mod.rs @@ -39,6 +39,7 @@ use platform_version::version::PlatformVersion; pub mod credit_distribution_pools; mod get_epochs_infos; +mod get_epochs_protocol_versions; pub mod proposers; mod prove_epochs_infos; pub mod start_block; diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/prove_epochs_infos/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/prove_epochs_infos/v0/mod.rs index 327e9fa6c2..9fa275c9ee 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/prove_epochs_infos/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/prove_epochs_infos/v0/mod.rs @@ -25,6 +25,7 @@ impl Drive { transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { + // TODO: We should avoid magic numbers. For now we are good since count refers to the number of epochs to fetch and 16383 is large enough. if count > 16383 { return Err(Error::Query(QuerySyntaxError::InvalidLimit(format!( "get_epochs_infos_v0 count too high {}", 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 d3b0912b6a..c61ec41b0b 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 @@ -100,6 +100,7 @@ mod tests { &BlockInfo::default(), Some(&transaction), platform_version, + None, ) .expect("should apply batch"); 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 677550dc6e..7fb03c8715 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 @@ -112,6 +112,7 @@ mod tests { &BlockInfo::default(), Some(&transaction), platform_version, + None, ) .expect("should apply batch"); diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract/mod.rs index fe1d9b0b46..9aa5ecc8a6 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract/mod.rs @@ -10,6 +10,7 @@ use dpp::fee::fee_result::FeeResult; use dpp::version::PlatformVersion; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::identifier::Identifier; use grovedb::TransactionArg; @@ -38,6 +39,7 @@ impl Drive { apply: bool, transaction: TransactionArg, platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result { match platform_version .drive @@ -54,6 +56,7 @@ impl Drive { apply, transaction, platform_version, + previous_fee_versions, ), version => Err(Error::Drive(DriveError::UnknownVersionMismatch { method: "delete_document_for_contract".to_string(), diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract/v0/mod.rs index a9f3180a43..d15faeebb2 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract/v0/mod.rs @@ -5,6 +5,7 @@ use dpp::block::block_info::BlockInfo; use dpp::data_contract::DataContract; use dpp::fee::fee_result::FeeResult; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::identifier::Identifier; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; @@ -23,6 +24,7 @@ impl Drive { apply: bool, transaction: TransactionArg, platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result { let mut drive_operations: Vec = vec![]; let estimated_costs_only_with_layer_info = if apply { @@ -45,6 +47,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + previous_fee_versions, )?; Ok(fees) } diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id/mod.rs index 5305f991ac..7d13b03033 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id/mod.rs @@ -2,9 +2,9 @@ mod v0; use grovedb::TransactionArg; -use dpp::block::block_info::BlockInfo; - use crate::drive::Drive; +use dpp::block::block_info::BlockInfo; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use crate::error::drive::DriveError; @@ -12,7 +12,6 @@ use crate::error::Error; use dpp::fee::fee_result::FeeResult; use dpp::identifier::Identifier; - use dpp::version::PlatformVersion; impl Drive { @@ -41,6 +40,7 @@ impl Drive { apply: bool, transaction: TransactionArg, platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result { match platform_version .drive @@ -57,6 +57,7 @@ impl Drive { apply, transaction, platform_version, + previous_fee_versions, ), version => Err(Error::Drive(DriveError::UnknownVersionMismatch { method: "delete_document_for_contract_id".to_string(), diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id/v0/mod.rs index e7439154c8..08e82357de 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id/v0/mod.rs @@ -4,17 +4,16 @@ use grovedb::{EstimatedLayerInformation, TransactionArg}; use std::collections::HashMap; -use dpp::block::block_info::BlockInfo; - use crate::drive::Drive; use crate::error::document::DocumentError; +use dpp::block::block_info::BlockInfo; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use crate::error::Error; use crate::fee::op::LowLevelDriveOperation; use dpp::fee::fee_result::FeeResult; use dpp::identifier::Identifier; - use dpp::version::PlatformVersion; impl Drive { @@ -30,6 +29,7 @@ impl Drive { apply: bool, transaction: TransactionArg, platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result { let mut drive_operations: Vec = vec![]; let estimated_costs_only_with_layer_info = if apply { @@ -60,13 +60,13 @@ impl Drive { &mut drive_operations, platform_version, )?; - let fees = Drive::calculate_fee( None, Some(drive_operations), &block_info.epoch, self.config.epochs_per_era, platform_version, + previous_fee_versions, )?; Ok(fees) diff --git a/packages/rs-drive/src/drive/document/delete/mod.rs b/packages/rs-drive/src/drive/document/delete/mod.rs index 89c007e59f..462f225385 100644 --- a/packages/rs-drive/src/drive/document/delete/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/mod.rs @@ -52,7 +52,9 @@ mod tests { use dpp::block::block_info::BlockInfo; use rand::Rng; + use once_cell::sync::Lazy; use std::borrow::Cow; + use std::collections::BTreeMap; use std::option::Option::None; use tempfile::TempDir; @@ -69,13 +71,16 @@ mod tests { use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::document::serialization_traits::DocumentPlatformConversionMethodsV0; use dpp::document::Document; - use dpp::fee::default_costs::EpochCosts; use dpp::fee::default_costs::KnownCostItem::StorageDiskUsageCreditPerByte; + use dpp::fee::default_costs::{CachedEpochIndexFeeVersions, EpochCosts}; use dpp::tests::json_document::{json_document_to_contract, json_document_to_document}; use crate::tests::helpers::setup::setup_drive_with_initial_state_structure; use dpp::version::PlatformVersion; + static EPOCH_CHANGE_FEE_VERSION_TEST: Lazy = + Lazy::new(|| BTreeMap::from([(0, PlatformVersion::first().fee_version.clone())])); + #[test] fn test_add_and_remove_family_one_document_no_transaction() { let tmp_dir = TempDir::new().unwrap(); @@ -126,6 +131,7 @@ mod tests { true, None, platform_version, + None, ) .expect("expected to insert a document successfully"); @@ -161,6 +167,7 @@ mod tests { true, None, platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("expected to be able to delete the document"); @@ -217,6 +224,7 @@ mod tests { true, Some(&db_transaction), platform_version, + None, ) .expect("expected to insert a document successfully"); @@ -260,6 +268,7 @@ mod tests { true, Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("expected to be able to delete the document"); @@ -355,6 +364,7 @@ mod tests { true, Some(&db_transaction), platform_version, + None, ) .expect("expected to insert a document successfully"); @@ -389,6 +399,7 @@ mod tests { true, Some(&db_transaction), platform_version, + None, ) .expect("expected to insert a document successfully"); @@ -427,6 +438,7 @@ mod tests { true, Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("expected to be able to delete the document"); @@ -465,6 +477,7 @@ mod tests { true, Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("expected to be able to delete the document"); @@ -532,6 +545,7 @@ mod tests { true, Some(&db_transaction), platform_version, + None, ) .expect("expected to insert a document successfully"); @@ -562,6 +576,7 @@ mod tests { true, Some(&db_transaction), platform_version, + None, ) .expect("expected to insert a document successfully"); @@ -600,6 +615,7 @@ mod tests { true, Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("expected to be able to delete the document"); @@ -630,6 +646,7 @@ mod tests { true, Some(&db_transaction), platform_version, + None, ) .expect("expected to insert a document successfully"); @@ -652,6 +669,7 @@ mod tests { true, Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("expected to be able to delete the document"); @@ -671,6 +689,7 @@ mod tests { true, Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("expected to be able to delete the document"); @@ -728,6 +747,7 @@ mod tests { true, None, platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("expected to insert a document successfully"); @@ -747,6 +767,7 @@ mod tests { true, None, platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("expected to be able to delete the document"); } @@ -800,13 +821,15 @@ mod tests { true, Some(&db_transaction), platform_version, + None, ) .expect("expected to insert a document successfully"); let added_bytes = fee_result.storage_fee - / Epoch::new(0) - .unwrap() - .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); + / Epoch::new(0).unwrap().cost_for_known_cost_item( + &EPOCH_CHANGE_FEE_VERSION_TEST, + StorageDiskUsageCreditPerByte, + ); // We added 1559 bytes assert_eq!(added_bytes, 1559); @@ -827,6 +850,7 @@ mod tests { true, Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("expected to be able to delete the document"); @@ -839,9 +863,10 @@ mod tests { assert_eq!(*removed_credits, 41881536); let refund_equivalent_bytes = removed_credits.to_unsigned() - / Epoch::new(0) - .unwrap() - .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); + / Epoch::new(0).unwrap().cost_for_known_cost_item( + &EPOCH_CHANGE_FEE_VERSION_TEST, + StorageDiskUsageCreditPerByte, + ); assert!(added_bytes > refund_equivalent_bytes); assert_eq!(refund_equivalent_bytes, 1551); // we refunded 1551 instead of 1559 @@ -896,13 +921,15 @@ mod tests { true, Some(&db_transaction), platform_version, + None, ) .expect("expected to insert a document successfully"); let added_bytes = fee_result.storage_fee - / Epoch::new(0) - .unwrap() - .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); + / Epoch::new(0).unwrap().cost_for_known_cost_item( + &EPOCH_CHANGE_FEE_VERSION_TEST, + StorageDiskUsageCreditPerByte, + ); // We added 1558 bytes assert_eq!(added_bytes, 1559); @@ -923,11 +950,12 @@ mod tests { false, Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("expected to be able to delete the document"); assert!(fee_result.fee_refunds.0.is_empty()); assert_eq!(fee_result.storage_fee, 0); - assert_eq!(fee_result.processing_fee, 145470580); + assert_eq!(fee_result.processing_fee, 145463600); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised } } diff --git a/packages/rs-drive/src/drive/document/insert/add_document/v0/mod.rs b/packages/rs-drive/src/drive/document/insert/add_document/v0/mod.rs index 703c0bd710..9a3cd04a3f 100644 --- a/packages/rs-drive/src/drive/document/insert/add_document/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/add_document/v0/mod.rs @@ -64,6 +64,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + None, )?; Ok(fees) } diff --git a/packages/rs-drive/src/drive/document/insert/add_document_for_contract/mod.rs b/packages/rs-drive/src/drive/document/insert/add_document_for_contract/mod.rs index c01d6d9a81..f589456b3e 100644 --- a/packages/rs-drive/src/drive/document/insert/add_document_for_contract/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/add_document_for_contract/mod.rs @@ -9,6 +9,7 @@ use crate::error::Error; use dpp::block::block_info::BlockInfo; use dpp::fee::fee_result::FeeResult; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::version::PlatformVersion; use grovedb::TransactionArg; @@ -34,6 +35,7 @@ impl Drive { apply: bool, transaction: TransactionArg, platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result { match platform_version .drive @@ -49,6 +51,7 @@ impl Drive { apply, transaction, platform_version, + previous_fee_versions, ), version => Err(Error::Drive(DriveError::UnknownVersionMismatch { method: "add_document_for_contract".to_string(), diff --git a/packages/rs-drive/src/drive/document/insert/add_document_for_contract/v0/mod.rs b/packages/rs-drive/src/drive/document/insert/add_document_for_contract/v0/mod.rs index 8039295db6..e1c52bf315 100644 --- a/packages/rs-drive/src/drive/document/insert/add_document_for_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/add_document_for_contract/v0/mod.rs @@ -6,6 +6,7 @@ use crate::fee::op::LowLevelDriveOperation; use dpp::block::block_info::BlockInfo; use dpp::fee::fee_result::FeeResult; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::version::PlatformVersion; use grovedb::TransactionArg; @@ -20,6 +21,7 @@ impl Drive { apply: bool, transaction: TransactionArg, platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result { let mut drive_operations: Vec = vec![]; self.add_document_for_contract_apply_and_add_to_operations( @@ -38,6 +40,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + previous_fee_versions, )?; Ok(fees) } diff --git a/packages/rs-drive/src/drive/document/insert/mod.rs b/packages/rs-drive/src/drive/document/insert/mod.rs index f6e0afe93c..11f95238fe 100644 --- a/packages/rs-drive/src/drive/document/insert/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/mod.rs @@ -83,18 +83,23 @@ mod tests { use crate::drive::flags::StorageFlags; use crate::drive::object_size_info::{DocumentAndContractInfo, OwnedDocumentInfo}; use crate::fee::op::LowLevelDriveOperation; + use once_cell::sync::Lazy; + use std::collections::BTreeMap; use dpp::block::epoch::Epoch; use dpp::data_contract::accessors::v0::DataContractV0Getters; use crate::drive::object_size_info::DocumentInfo::DocumentRefInfo; use crate::tests::helpers::setup::setup_drive_with_initial_state_structure; - use dpp::fee::default_costs::EpochCosts; use dpp::fee::default_costs::KnownCostItem::StorageDiskUsageCreditPerByte; + 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::PlatformVersion; + static EPOCH_CHANGE_FEE_VERSION_TEST: Lazy = + Lazy::new(|| BTreeMap::from([(0, PlatformVersion::first().fee_version.clone())])); + #[test] fn test_add_dashpay_documents_no_transaction() { let (drive, dashpay) = setup_dashpay("add", true); @@ -133,6 +138,7 @@ mod tests { true, None, platform_version, + None, ) .expect("expected to insert a document successfully"); @@ -154,6 +160,7 @@ mod tests { true, None, platform_version, + None, ) .expect_err("expected not to be able to insert same document twice"); @@ -175,6 +182,7 @@ mod tests { true, None, platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("expected to override a document successfully"); } @@ -226,6 +234,7 @@ mod tests { true, Some(&db_transaction), platform_version, + None, ) .expect("expected to insert a document successfully"); @@ -247,6 +256,7 @@ mod tests { true, Some(&db_transaction), platform_version, + None, ) .expect_err("expected not to be able to insert same document twice"); @@ -268,6 +278,7 @@ mod tests { true, Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("expected to override a document successfully"); } @@ -319,6 +330,7 @@ mod tests { true, Some(&db_transaction), platform_version, + None, ) .expect("expected to insert a document successfully"); @@ -326,10 +338,11 @@ mod tests { fee_result, FeeResult { storage_fee: 3058 - * Epoch::new(0) - .unwrap() - .cost_for_known_cost_item(StorageDiskUsageCreditPerByte), - processing_fee: 2317270, + * Epoch::new(0).unwrap().cost_for_known_cost_item( + &EPOCH_CHANGE_FEE_VERSION_TEST, + StorageDiskUsageCreditPerByte, + ), + processing_fee: 2356200, // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised ..Default::default() } ); @@ -382,6 +395,7 @@ mod tests { true, Some(&db_transaction), platform_version, + None, ) .expect("expected to insert a document successfully"); @@ -389,10 +403,11 @@ mod tests { fee_result, FeeResult { storage_fee: 1305 - * Epoch::new(0) - .unwrap() - .cost_for_known_cost_item(StorageDiskUsageCreditPerByte), - processing_fee: 1482010, + * Epoch::new(0).unwrap().cost_for_known_cost_item( + &EPOCH_CHANGE_FEE_VERSION_TEST, + StorageDiskUsageCreditPerByte, + ), + processing_fee: 1500200, // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised ..Default::default() } ); @@ -450,15 +465,17 @@ mod tests { false, Some(&db_transaction), platform_version, + None, ) .expect("expected to insert a document successfully"); let added_bytes = storage_fee - / Epoch::new(0) - .unwrap() - .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); + / Epoch::new(0).unwrap().cost_for_known_cost_item( + &EPOCH_CHANGE_FEE_VERSION_TEST, + StorageDiskUsageCreditPerByte, + ); assert_eq!(1305, added_bytes); - assert_eq!(144784800, processing_fee); + assert_eq!(144859600, processing_fee); // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised } #[test] @@ -508,6 +525,7 @@ mod tests { false, Some(&db_transaction), platform_version, + None, ) .expect("expected to insert a document successfully"); @@ -529,6 +547,7 @@ mod tests { true, Some(&db_transaction), platform_version, + None, ) .expect("expected to insert a document successfully"); @@ -674,6 +693,7 @@ mod tests { true, Some(&db_transaction), platform_version, + None, ) .expect("expected to insert a document successfully"); @@ -681,10 +701,11 @@ mod tests { fee_result, FeeResult { storage_fee: 1761 - * Epoch::new(0) - .unwrap() - .cost_for_known_cost_item(StorageDiskUsageCreditPerByte), - processing_fee: 2069390, + * Epoch::new(0).unwrap().cost_for_known_cost_item( + &EPOCH_CHANGE_FEE_VERSION_TEST, + StorageDiskUsageCreditPerByte, + ), + processing_fee: 2095400, // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised ..Default::default() } ); @@ -750,6 +771,7 @@ mod tests { true, None, platform_version, + None, ) .expect("expected to insert a document successfully"); @@ -771,6 +793,7 @@ mod tests { true, None, platform_version, + None, ) .expect("expected to insert a document successfully"); @@ -792,6 +815,7 @@ mod tests { true, None, platform_version, + None, ) .expect("expected to insert a document successfully"); } @@ -842,6 +866,7 @@ mod tests { true, None, platform_version, + None, ) .expect("expected to insert a document successfully"); @@ -863,6 +888,7 @@ mod tests { true, None, platform_version, + None, ) .expect_err( "expected not to be able to insert document with already existing unique index", diff --git a/packages/rs-drive/src/drive/document/insert_contested/add_contested_document/v0/mod.rs b/packages/rs-drive/src/drive/document/insert_contested/add_contested_document/v0/mod.rs index c1ed51f720..327f8d4d88 100644 --- a/packages/rs-drive/src/drive/document/insert_contested/add_contested_document/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/insert_contested/add_contested_document/v0/mod.rs @@ -74,6 +74,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + None, )?; Ok(fees) } diff --git a/packages/rs-drive/src/drive/document/insert_contested/add_contested_document_for_contract/v0/mod.rs b/packages/rs-drive/src/drive/document/insert_contested/add_contested_document_for_contract/v0/mod.rs index 2de89935b6..1ce148b2bf 100644 --- a/packages/rs-drive/src/drive/document/insert_contested/add_contested_document_for_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/insert_contested/add_contested_document_for_contract/v0/mod.rs @@ -44,6 +44,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + None, )?; Ok(fees) } diff --git a/packages/rs-drive/src/drive/document/insert_contested/mod.rs b/packages/rs-drive/src/drive/document/insert_contested/mod.rs index 966c82ebc7..95165ed115 100644 --- a/packages/rs-drive/src/drive/document/insert_contested/mod.rs +++ b/packages/rs-drive/src/drive/document/insert_contested/mod.rs @@ -104,6 +104,7 @@ mod tests { true, None, platform_version, + None, ) .expect("expected to insert a document successfully"); @@ -125,6 +126,7 @@ mod tests { true, None, platform_version, + None, ) .expect_err( "expected not to be able to insert document with already existing unique index", diff --git a/packages/rs-drive/src/drive/document/query/mod.rs b/packages/rs-drive/src/drive/document/query/mod.rs index 60c0b0353a..b6ef6f74bb 100644 --- a/packages/rs-drive/src/drive/document/query/mod.rs +++ b/packages/rs-drive/src/drive/document/query/mod.rs @@ -139,6 +139,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + None, )?; fee_result.processing_fee } else { @@ -192,6 +193,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + None, )?; fee_result.processing_fee } else { @@ -230,6 +232,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + None, )?; fee_result.processing_fee } else { @@ -286,6 +289,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + None, )?; fee_result.processing_fee } else { @@ -344,6 +348,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + None, )?; fee_result.processing_fee } else { @@ -433,6 +438,7 @@ impl Drive { epoch, self.config.epochs_per_era, platform_version, + None, )?; fee_result.processing_fee } else { diff --git a/packages/rs-drive/src/drive/document/query/query_contested_documents_vote_state/v0/mod.rs b/packages/rs-drive/src/drive/document/query/query_contested_documents_vote_state/v0/mod.rs index e6a996bf62..05f3d2f467 100644 --- a/packages/rs-drive/src/drive/document/query/query_contested_documents_vote_state/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/query/query_contested_documents_vote_state/v0/mod.rs @@ -81,6 +81,7 @@ impl Drive { epoch, self.config.epochs_per_era, platform_version, + None, )?; fee_result.processing_fee } else { diff --git a/packages/rs-drive/src/drive/document/query/query_documents/v0/mod.rs b/packages/rs-drive/src/drive/document/query/query_documents/v0/mod.rs index 0dcd0d79f0..02db2c882d 100644 --- a/packages/rs-drive/src/drive/document/query/query_documents/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/query/query_documents/v0/mod.rs @@ -102,6 +102,7 @@ impl Drive { epoch, self.config.epochs_per_era, platform_version, + None, )?; fee_result.processing_fee } else { diff --git a/packages/rs-drive/src/drive/document/update/mod.rs b/packages/rs-drive/src/drive/document/update/mod.rs index 74b4681b63..d232f03be1 100644 --- a/packages/rs-drive/src/drive/document/update/mod.rs +++ b/packages/rs-drive/src/drive/document/update/mod.rs @@ -54,13 +54,13 @@ mod update_document_with_serialization_for_contract; #[cfg(test)] mod tests { + use dpp::data_contract::{DataContract, DataContractFactory}; use grovedb::TransactionArg; use std::borrow::Cow; + use std::collections::BTreeMap; use std::default::Default; use std::option::Option::None; - use dpp::data_contract::{DataContract, DataContractFactory}; - use dpp::platform_value::{platform_value, Identifier, Value}; use dpp::block::block_info::BlockInfo; @@ -89,13 +89,17 @@ mod tests { }; use dpp::document::specialized_document_factory::SpecializedDocumentFactory; use dpp::document::{Document, DocumentV0Getters, DocumentV0Setters}; - use dpp::fee::default_costs::EpochCosts; use dpp::fee::default_costs::KnownCostItem::StorageDiskUsageCreditPerByte; + use dpp::fee::default_costs::{CachedEpochIndexFeeVersions, EpochCosts}; use dpp::fee::fee_result::FeeResult; use dpp::platform_value; use dpp::tests::json_document::json_document_to_document; + 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())])); + #[test] fn test_create_and_update_document_same_transaction() { let (drive, contract) = setup_dashpay("", true); @@ -141,6 +145,7 @@ mod tests { true, Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("should create alice profile"); @@ -170,6 +175,7 @@ mod tests { true, Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("should update alice profile"); } @@ -217,6 +223,7 @@ mod tests { true, None, platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("should create alice profile"); @@ -258,6 +265,7 @@ mod tests { true, None, platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("should update alice profile"); @@ -313,6 +321,7 @@ mod tests { true, Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("should create alice profile"); @@ -362,6 +371,7 @@ mod tests { true, Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("should update alice profile"); @@ -423,6 +433,7 @@ mod tests { true, Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("should create alice profile"); @@ -463,6 +474,7 @@ mod tests { true, Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("expected to delete document"); @@ -509,6 +521,7 @@ mod tests { true, Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("should update alice profile"); @@ -622,6 +635,7 @@ mod tests { true, None, platform_version, + None, ) .expect("should add document"); @@ -656,6 +670,7 @@ mod tests { StorageFlags::optional_default_as_cow(), None, platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("should update document"); @@ -677,6 +692,7 @@ mod tests { true, None, platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("should delete document"); } @@ -728,6 +744,7 @@ mod tests { true, Some(&db_transaction), platform_version, + None, ) .expect("expected to insert a document successfully"); @@ -742,6 +759,7 @@ mod tests { StorageFlags::optional_default_as_cow(), Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect_err("expected not to be able to update a non mutable document"); @@ -763,6 +781,7 @@ mod tests { true, Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect_err("expected not to be able to override a non mutable document"); } @@ -822,6 +841,7 @@ mod tests { true, Some(&db_transaction), platform_version, + None, ) .expect("expected to insert a document successfully"); @@ -836,6 +856,7 @@ mod tests { StorageFlags::optional_default_as_cow(), Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("expected to update a document with history successfully"); } @@ -917,9 +938,10 @@ mod tests { platform_version, ); let original_bytes = original_fees.storage_fee - / Epoch::new(0) - .unwrap() - .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); + / Epoch::new(0).unwrap().cost_for_known_cost_item( + &EPOCH_CHANGE_FEE_VERSION_TEST, + StorageDiskUsageCreditPerByte, + ); let expected_added_bytes = if using_history { //Explanation for 1237 @@ -1084,9 +1106,10 @@ mod tests { assert_eq!(*removed_credits, 25940733); let refund_equivalent_bytes = removed_credits.to_unsigned() - / Epoch::new(0) - .unwrap() - .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); + / Epoch::new(0).unwrap().cost_for_known_cost_item( + &EPOCH_CHANGE_FEE_VERSION_TEST, + StorageDiskUsageCreditPerByte, + ); assert!(expected_added_bytes > refund_equivalent_bytes); assert_eq!(refund_equivalent_bytes, 960); // we refunded 960 instead of 963 @@ -1103,9 +1126,10 @@ mod tests { ); let original_bytes = original_fees.storage_fee - / Epoch::new(0) - .unwrap() - .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); + / Epoch::new(0).unwrap().cost_for_known_cost_item( + &EPOCH_CHANGE_FEE_VERSION_TEST, + StorageDiskUsageCreditPerByte, + ); assert_eq!(original_bytes, expected_added_bytes); } @@ -1123,9 +1147,10 @@ mod tests { // we both add and remove bytes // this is because trees are added because of indexes, and also removed let added_bytes = update_fees.storage_fee - / Epoch::new(0) - .unwrap() - .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); + / Epoch::new(0).unwrap().cost_for_known_cost_item( + &EPOCH_CHANGE_FEE_VERSION_TEST, + StorageDiskUsageCreditPerByte, + ); let expected_added_bytes = if using_history { 313 } else { 1 }; assert_eq!(added_bytes, expected_added_bytes); @@ -1194,9 +1219,10 @@ mod tests { platform_version, ); let original_bytes = original_fees.storage_fee - / Epoch::new(0) - .unwrap() - .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); + / Epoch::new(0).unwrap().cost_for_known_cost_item( + &EPOCH_CHANGE_FEE_VERSION_TEST, + StorageDiskUsageCreditPerByte, + ); let expected_added_bytes = if using_history { 1238 } else { 962 }; assert_eq!(original_bytes, expected_added_bytes); if !using_history { @@ -1219,9 +1245,10 @@ mod tests { assert_eq!(*removed_credits, 25940733); let refund_equivalent_bytes = removed_credits.to_unsigned() - / Epoch::new(0) - .unwrap() - .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); + / Epoch::new(0).unwrap().cost_for_known_cost_item( + &EPOCH_CHANGE_FEE_VERSION_TEST, + StorageDiskUsageCreditPerByte, + ); assert!(expected_added_bytes > refund_equivalent_bytes); assert_eq!(refund_equivalent_bytes, 960); // we refunded 960 instead of 1012 @@ -1238,9 +1265,10 @@ mod tests { ); let original_bytes = original_fees.storage_fee - / Epoch::new(0) - .unwrap() - .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); + / Epoch::new(0).unwrap().cost_for_known_cost_item( + &EPOCH_CHANGE_FEE_VERSION_TEST, + StorageDiskUsageCreditPerByte, + ); assert_eq!(original_bytes, expected_added_bytes); } @@ -1258,9 +1286,10 @@ mod tests { // we both add and remove bytes // this is because trees are added because of indexes, and also removed let added_bytes = update_fees.storage_fee - / Epoch::new(0) - .unwrap() - .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); + / Epoch::new(0).unwrap().cost_for_known_cost_item( + &EPOCH_CHANGE_FEE_VERSION_TEST, + StorageDiskUsageCreditPerByte, + ); let removed_credits = update_fees .fee_refunds @@ -1276,9 +1305,10 @@ mod tests { let expected_removed_credits = if using_history { 16286655 } else { 16232643 }; assert_eq!(*removed_credits, expected_removed_credits); let refund_equivalent_bytes = removed_credits.to_unsigned() - / Epoch::new(0) - .unwrap() - .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); + / Epoch::new(0).unwrap().cost_for_known_cost_item( + &EPOCH_CHANGE_FEE_VERSION_TEST, + StorageDiskUsageCreditPerByte, + ); assert!(expected_added_bytes > refund_equivalent_bytes); let expected_remove_bytes = if using_history { 603 } else { 601 }; @@ -1388,9 +1418,10 @@ mod tests { platform_version, ); let original_bytes = original_fees.storage_fee - / Epoch::new(0) - .unwrap() - .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); + / Epoch::new(0).unwrap().cost_for_known_cost_item( + &EPOCH_CHANGE_FEE_VERSION_TEST, + StorageDiskUsageCreditPerByte, + ); let expected_added_bytes = if using_history { //Explanation for 1237 @@ -1547,9 +1578,10 @@ mod tests { // we both add and remove bytes // this is because trees are added because of indexes, and also removed let added_bytes = update_fees.storage_fee - / Epoch::new(0) - .unwrap() - .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); + / Epoch::new(0).unwrap().cost_for_known_cost_item( + &EPOCH_CHANGE_FEE_VERSION_TEST, + StorageDiskUsageCreditPerByte, + ); let expected_added_bytes = if using_history { 1239 } else { 963 }; assert_eq!(added_bytes, expected_added_bytes); @@ -1627,6 +1659,7 @@ mod tests { apply, transaction, platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("expected to add document") } @@ -1648,6 +1681,7 @@ mod tests { true, transaction, platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("expected to remove person") } @@ -1894,6 +1928,7 @@ mod tests { true, None, platform_version, + None, ) .expect("should create document"); @@ -1916,6 +1951,7 @@ mod tests { storage_flags, None, platform_version, + None, ) .expect("should update document"); diff --git a/packages/rs-drive/src/drive/document/update/update_document_for_contract/mod.rs b/packages/rs-drive/src/drive/document/update/update_document_for_contract/mod.rs index ada6c71acf..e8d8810c74 100644 --- a/packages/rs-drive/src/drive/document/update/update_document_for_contract/mod.rs +++ b/packages/rs-drive/src/drive/document/update/update_document_for_contract/mod.rs @@ -14,6 +14,7 @@ use dpp::fee::fee_result::FeeResult; use dpp::version::PlatformVersion; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use grovedb::TransactionArg; use std::borrow::Cow; @@ -45,6 +46,7 @@ impl Drive { storage_flags: Option>, transaction: TransactionArg, platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result { match platform_version .drive @@ -63,6 +65,7 @@ impl Drive { storage_flags, transaction, platform_version, + previous_fee_versions, ), version => Err(Error::Drive(DriveError::UnknownVersionMismatch { method: "update_document_for_contract".to_string(), diff --git a/packages/rs-drive/src/drive/document/update/update_document_for_contract/v0/mod.rs b/packages/rs-drive/src/drive/document/update/update_document_for_contract/v0/mod.rs index 3b4fc7562a..1e1389151a 100644 --- a/packages/rs-drive/src/drive/document/update/update_document_for_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/update/update_document_for_contract/v0/mod.rs @@ -8,6 +8,7 @@ use dpp::block::block_info::BlockInfo; use dpp::data_contract::document_type::DocumentTypeRef; use dpp::data_contract::DataContract; use dpp::document::Document; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::fee::fee_result::FeeResult; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; @@ -29,6 +30,7 @@ impl Drive { storage_flags: Option>, transaction: TransactionArg, platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result { let mut drive_operations: Vec = vec![]; let estimated_costs_only_with_layer_info = if apply { @@ -60,6 +62,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + previous_fee_versions, )?; Ok(fees) } diff --git a/packages/rs-drive/src/drive/document/update/update_document_for_contract_id/mod.rs b/packages/rs-drive/src/drive/document/update/update_document_for_contract_id/mod.rs index a81ac41b2b..93a9141560 100644 --- a/packages/rs-drive/src/drive/document/update/update_document_for_contract_id/mod.rs +++ b/packages/rs-drive/src/drive/document/update/update_document_for_contract_id/mod.rs @@ -12,6 +12,7 @@ use dpp::fee::fee_result::FeeResult; use dpp::version::PlatformVersion; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use grovedb::TransactionArg; use std::borrow::Cow; @@ -43,6 +44,7 @@ impl Drive { storage_flags: Option>, transaction: TransactionArg, platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result { match platform_version .drive @@ -61,6 +63,7 @@ impl Drive { storage_flags, transaction, platform_version, + previous_fee_versions, ), version => Err(Error::Drive(DriveError::UnknownVersionMismatch { method: "update_document_for_contract_id".to_string(), diff --git a/packages/rs-drive/src/drive/document/update/update_document_for_contract_id/v0/mod.rs b/packages/rs-drive/src/drive/document/update/update_document_for_contract_id/v0/mod.rs index ec10219dc2..3467dab072 100644 --- a/packages/rs-drive/src/drive/document/update/update_document_for_contract_id/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/update/update_document_for_contract_id/v0/mod.rs @@ -10,6 +10,7 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::document::serialization_traits::DocumentPlatformConversionMethodsV0; use dpp::document::Document; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::fee::fee_result::FeeResult; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; @@ -31,6 +32,7 @@ impl Drive { storage_flags: Option>, transaction: TransactionArg, platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result { let mut drive_operations: Vec = vec![]; let estimated_costs_only_with_layer_info = if apply { @@ -74,13 +76,13 @@ impl Drive { &mut drive_operations, platform_version, )?; - let fees = Drive::calculate_fee( None, Some(drive_operations), &block_info.epoch, self.config.epochs_per_era, platform_version, + previous_fee_versions, )?; Ok(fees) diff --git a/packages/rs-drive/src/drive/document/update/update_document_with_serialization_for_contract/mod.rs b/packages/rs-drive/src/drive/document/update/update_document_with_serialization_for_contract/mod.rs index 0eb574f2ee..b531cb2beb 100644 --- a/packages/rs-drive/src/drive/document/update/update_document_with_serialization_for_contract/mod.rs +++ b/packages/rs-drive/src/drive/document/update/update_document_with_serialization_for_contract/mod.rs @@ -13,6 +13,7 @@ use dpp::fee::fee_result::FeeResult; use dpp::version::PlatformVersion; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use grovedb::TransactionArg; use std::borrow::Cow; @@ -46,6 +47,7 @@ impl Drive { storage_flags: Option>, transaction: TransactionArg, platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result { match platform_version .drive @@ -65,6 +67,7 @@ impl Drive { storage_flags, transaction, platform_version, + previous_fee_versions, ), version => Err(Error::Drive(DriveError::UnknownVersionMismatch { method: "update_document_with_serialization_for_contract".to_string(), diff --git a/packages/rs-drive/src/drive/document/update/update_document_with_serialization_for_contract/v0/mod.rs b/packages/rs-drive/src/drive/document/update/update_document_with_serialization_for_contract/v0/mod.rs index 18f02688a3..55b9bb1894 100644 --- a/packages/rs-drive/src/drive/document/update/update_document_with_serialization_for_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/update/update_document_with_serialization_for_contract/v0/mod.rs @@ -10,6 +10,7 @@ use dpp::data_contract::DataContract; use dpp::document::Document; use dpp::fee::fee_result::FeeResult; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; @@ -31,6 +32,7 @@ impl Drive { storage_flags: Option>, transaction: TransactionArg, platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result { let mut drive_operations: Vec = vec![]; let estimated_costs_only_with_layer_info = if apply { @@ -65,6 +67,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + previous_fee_versions, )?; Ok(fees) } diff --git a/packages/rs-drive/src/drive/fee/calculate_fee/mod.rs b/packages/rs-drive/src/drive/fee/calculate_fee/mod.rs index e0a41ceee8..cd4cb51657 100644 --- a/packages/rs-drive/src/drive/fee/calculate_fee/mod.rs +++ b/packages/rs-drive/src/drive/fee/calculate_fee/mod.rs @@ -3,6 +3,7 @@ use crate::error::drive::DriveError; use crate::error::Error; use crate::fee::op::{BaseOp, LowLevelDriveOperation}; use dpp::block::epoch::Epoch; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::fee::fee_result::FeeResult; use dpp::version::PlatformVersion; use enum_map::EnumMap; @@ -35,9 +36,17 @@ impl Drive { epoch: &Epoch, epochs_per_era: u16, platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result { match platform_version.drive.methods.fees.calculate_fee { - 0 => Self::calculate_fee_v0(base_operations, drive_operations, epoch, epochs_per_era), + 0 => Self::calculate_fee_v0( + base_operations, + drive_operations, + epoch, + epochs_per_era, + &platform_version.fee_version, + previous_fee_versions, + ), version => Err(Error::Drive(DriveError::UnknownVersionMismatch { method: "Drive::calculate_fee".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive/src/drive/fee/calculate_fee/v0/mod.rs b/packages/rs-drive/src/drive/fee/calculate_fee/v0/mod.rs index 94e0b8edca..508729fcfe 100644 --- a/packages/rs-drive/src/drive/fee/calculate_fee/v0/mod.rs +++ b/packages/rs-drive/src/drive/fee/calculate_fee/v0/mod.rs @@ -5,7 +5,9 @@ use crate::fee::op::{BaseOp, LowLevelDriveOperation}; use dpp::block::epoch::Epoch; use dpp::fee::fee_result::FeeResult; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use enum_map::EnumMap; +use platform_version::version::fee::FeeVersion; impl Drive { /// Calculates fees for the given operations. Returns the storage and processing costs. @@ -15,6 +17,8 @@ impl Drive { drive_operations: Option>, epoch: &Epoch, epochs_per_era: u16, + fee_version: &FeeVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result { let mut aggregate_fee_result = FeeResult::default(); if let Some(base_operations) = base_operations { @@ -31,9 +35,13 @@ impl Drive { if let Some(drive_operations) = drive_operations { // println!("{:#?}", drive_operations); - for drive_fee_result in - LowLevelDriveOperation::consume_to_fees(drive_operations, epoch, epochs_per_era)? - { + for drive_fee_result in LowLevelDriveOperation::consume_to_fees( + drive_operations, + epoch, + epochs_per_era, + fee_version, + previous_fee_versions, + )? { aggregate_fee_result.checked_add_assign(drive_fee_result)?; } } diff --git a/packages/rs-drive/src/drive/identity/balance/update.rs b/packages/rs-drive/src/drive/identity/balance/update.rs index 1cb8f3802e..0f6644182d 100644 --- a/packages/rs-drive/src/drive/identity/balance/update.rs +++ b/packages/rs-drive/src/drive/identity/balance/update.rs @@ -62,7 +62,7 @@ mod tests { assert_eq!( fee_result, FeeResult { - processing_fee: 517620, + processing_fee: 520000, // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised removed_bytes_from_system: 0, ..Default::default() } @@ -157,7 +157,7 @@ mod tests { fee_result, FeeResult { storage_fee: 0, - processing_fee: 1205880, + processing_fee: 1212000, // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised removed_bytes_from_system: 0, ..Default::default() } @@ -239,7 +239,7 @@ mod tests { fee_result, FeeResult { storage_fee: 0, - processing_fee: 879150, + processing_fee: 883400, // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised removed_bytes_from_system: 0, ..Default::default() } @@ -302,7 +302,7 @@ mod tests { assert_eq!( fee_result, FeeResult { - processing_fee: 9751440, + processing_fee: 9780000, // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised ..Default::default() } ); @@ -371,13 +371,14 @@ mod tests { true, Some(&db_transaction), platform_version, + None, ) .expect("expected to add to identity balance"); assert_eq!( fee_result, FeeResult { - processing_fee: 517620, + processing_fee: 520000, // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised removed_bytes_from_system: 0, ..Default::default() } @@ -429,6 +430,7 @@ mod tests { false, None, platform_version, + None, ) .expect("expected to add to identity balance"); @@ -443,7 +445,7 @@ mod tests { assert_eq!( fee_result, FeeResult { - processing_fee: 5418770, + processing_fee: 5432200, // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised ..Default::default() } ); diff --git a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/v0/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/v0/mod.rs index a1e0ca636a..6da40c2efd 100644 --- a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/v0/mod.rs @@ -112,6 +112,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + None, )?; Ok((value, fees)) } diff --git a/packages/rs-drive/src/drive/identity/fetch/balance/fetch_identity_balance/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/balance/fetch_identity_balance/v0/mod.rs index 0ce12abf78..b64fc80df9 100644 --- a/packages/rs-drive/src/drive/identity/fetch/balance/fetch_identity_balance/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/balance/fetch_identity_balance/v0/mod.rs @@ -57,6 +57,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + None, )?; Ok((value, fees)) } diff --git a/packages/rs-drive/src/drive/identity/fetch/balance/fetch_identity_balance_include_debt/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/balance/fetch_identity_balance_include_debt/v0/mod.rs index 34bb3a9ae4..65da1a2283 100644 --- a/packages/rs-drive/src/drive/identity/fetch/balance/fetch_identity_balance_include_debt/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/balance/fetch_identity_balance_include_debt/v0/mod.rs @@ -54,6 +54,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + None, )?; Ok((value, fees)) } diff --git a/packages/rs-drive/src/drive/identity/fetch/full_identity/fetch_full_identity/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/full_identity/fetch_full_identity/v0/mod.rs index be13b98efd..65177cae1c 100644 --- a/packages/rs-drive/src/drive/identity/fetch/full_identity/fetch_full_identity/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/full_identity/fetch_full_identity/v0/mod.rs @@ -33,6 +33,7 @@ impl Drive { epoch, self.config.epochs_per_era, platform_version, + None, )?; Ok((maybe_identity, fee)) } diff --git a/packages/rs-drive/src/drive/identity/fetch/nonce/fetch_identity_nonce/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/nonce/fetch_identity_nonce/v0/mod.rs index 79f32b45ea..da803bbdd6 100644 --- a/packages/rs-drive/src/drive/identity/fetch/nonce/fetch_identity_nonce/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/nonce/fetch_identity_nonce/v0/mod.rs @@ -106,6 +106,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + None, )?; Ok((value, fees)) } diff --git a/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_balance_with_keys/mod.rs b/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_balance_with_keys/mod.rs index 00e4e65a21..6e0c95fe66 100644 --- a/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_balance_with_keys/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_balance_with_keys/mod.rs @@ -3,7 +3,6 @@ use crate::drive::identity::key::fetch::IdentityKeysRequest; use crate::drive::Drive; use crate::error::drive::DriveError; use crate::error::Error; -use dpp::block::epoch::Epoch; use dpp::fee::fee_result::FeeResult; use dpp::identity::PartialIdentity; use dpp::version::PlatformVersion; @@ -66,7 +65,6 @@ impl Drive { /// /// - `identity_key_request`: A request containing information about the identity whose balance and keys need to be fetched. /// - `apply`: Whether to apply the operation or just fetch an estimation. - /// - `epoch`: Current epoch for cost estimation. /// - `transaction`: A transaction argument for the database. /// - `platform_version`: The platform version being used. /// @@ -82,7 +80,6 @@ impl Drive { &self, identity_key_request: IdentityKeysRequest, apply: bool, - epoch: &Epoch, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result<(Option, FeeResult), Error> { @@ -97,7 +94,6 @@ impl Drive { 0 => self.fetch_identity_balance_with_keys_with_cost_v0( identity_key_request, apply, - epoch, transaction, platform_version, ), diff --git a/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_balance_with_keys/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_balance_with_keys/v0/mod.rs index 5524071534..9cdf384750 100644 --- a/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_balance_with_keys/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_balance_with_keys/v0/mod.rs @@ -5,15 +5,11 @@ use crate::drive::identity::key::fetch::{ use crate::drive::Drive; use crate::error::Error; -use dpp::block::epoch::Epoch; -use dpp::fee::default_costs::KnownCostItem::FetchIdentityBalanceProcessingCost; use dpp::fee::fee_result::FeeResult; use dpp::identifier::Identifier; use dpp::identity::PartialIdentity; use grovedb::TransactionArg; -use dpp::fee::default_costs::EpochCosts; - use dpp::version::PlatformVersion; use std::collections::{BTreeMap, BTreeSet}; @@ -74,13 +70,15 @@ impl Drive { &self, identity_key_request: IdentityKeysRequest, apply: bool, - epoch: &Epoch, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result<(Option, FeeResult), Error> { - let balance_cost = epoch.cost_for_known_cost_item(FetchIdentityBalanceProcessingCost); + let balance_cost = platform_version + .fee_version + .processing + .fetch_identity_balance_processing_cost; if !apply { - let keys_cost = identity_key_request.processing_cost(epoch)?; + let keys_cost = identity_key_request.processing_cost(platform_version)?; return Ok(( None, FeeResult::new_from_processing_fee(balance_cost + keys_cost), @@ -97,7 +95,7 @@ impl Drive { return Ok((None, FeeResult::new_from_processing_fee(balance_cost))); }; - let keys_cost = identity_key_request.processing_cost(epoch)?; + let keys_cost = identity_key_request.processing_cost(platform_version)?; let loaded_public_keys = self.fetch_identity_keys::( identity_key_request, diff --git a/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_with_balance/mod.rs b/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_with_balance/mod.rs index f6ba139647..d9c96c8bd9 100644 --- a/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_with_balance/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_with_balance/mod.rs @@ -3,7 +3,6 @@ mod v0; use crate::drive::Drive; use crate::error::drive::DriveError; use crate::error::Error; -use dpp::block::epoch::Epoch; use dpp::fee::fee_result::FeeResult; use dpp::identity::PartialIdentity; @@ -63,7 +62,6 @@ impl Drive { /// /// - `identity_id`: A 32-byte array representing the ID of the identity. /// - `apply`: A boolean to determine if the balance should be applied or just estimated. - /// - `epoch`: The current epoch for fee calculations. /// - `transaction`: A transaction argument for the database. /// - `platform_version`: The platform version being used. /// @@ -79,7 +77,6 @@ impl Drive { &self, identity_id: [u8; 32], apply: bool, - epoch: &Epoch, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result<(Option, FeeResult), Error> { @@ -94,7 +91,6 @@ impl Drive { 0 => self.fetch_identity_with_balance_with_cost_v0( identity_id, apply, - epoch, transaction, platform_version, ), diff --git a/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_with_balance/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_with_balance/v0/mod.rs index f7d87d2ba1..9337e68761 100644 --- a/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_with_balance/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_with_balance/v0/mod.rs @@ -1,15 +1,11 @@ use crate::drive::Drive; use crate::error::Error; use crate::fee::op::LowLevelDriveOperation; -use dpp::block::epoch::Epoch; -use dpp::fee::default_costs::KnownCostItem::FetchIdentityBalanceProcessingCost; use dpp::fee::fee_result::FeeResult; use dpp::identifier::Identifier; use dpp::identity::PartialIdentity; use grovedb::TransactionArg; -use dpp::fee::default_costs::EpochCosts; - use dpp::version::PlatformVersion; impl Drive { @@ -46,11 +42,13 @@ impl Drive { &self, identity_id: [u8; 32], apply: bool, - epoch: &Epoch, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result<(Option, FeeResult), Error> { - let balance_cost = epoch.cost_for_known_cost_item(FetchIdentityBalanceProcessingCost); + let balance_cost = platform_version + .fee_version + .processing + .fetch_identity_balance_processing_cost; if !apply { return Ok((None, FeeResult::new_from_processing_fee(balance_cost))); } diff --git a/packages/rs-drive/src/drive/identity/fetch/revision/fetch_identity_revision/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/revision/fetch_identity_revision/v0/mod.rs index c8d354b3c6..fa6fa71763 100644 --- a/packages/rs-drive/src/drive/identity/fetch/revision/fetch_identity_revision/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/revision/fetch_identity_revision/v0/mod.rs @@ -106,6 +106,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + None, )?; Ok((value, fees)) } 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 3818d9e3a3..8ba723cba3 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 @@ -51,6 +51,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + None, )?; Ok(fees) } 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 f8c9772650..b734ed0efa 100644 --- a/packages/rs-drive/src/drive/identity/key/fetch/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/fetch/mod.rs @@ -31,11 +31,7 @@ use { use { crate::error::{drive::DriveError, fee::FeeError, identity::IdentityError, Error}, dpp::{ - block::epoch::Epoch, - fee::{ - default_costs::{EpochCosts, KnownCostItem::FetchSingleIdentityKeyProcessingCost}, - Credits, - }, + fee::Credits, identity::{IdentityPublicKey, SecurityLevel}, serialization::PlatformDeserializable, version::PlatformVersion, @@ -653,18 +649,25 @@ pub struct IdentityKeysRequest { impl IdentityKeysRequest { #[cfg(feature = "server")] /// Gets the processing cost of an identity keys request - pub fn processing_cost(&self, epoch: &Epoch) -> Result { + pub fn processing_cost(&self, platform_version: &PlatformVersion) -> Result { match &self.request_type { AllKeys => Err(Error::Fee(FeeError::OperationNotAllowed( "You can not get costs for requesting all keys", ))), SpecificKeys(keys) => Ok(keys.len() as u64 - * epoch.cost_for_known_cost_item(FetchSingleIdentityKeyProcessingCost)), + * platform_version + .fee_version + .processing + .fetch_single_identity_key_processing_cost), SearchKey(_search) => todo!(), ContractBoundKey(_, _, key_kind) | ContractDocumentTypeBoundKey(_, _, _, key_kind) => { match key_kind { CurrentKeyOfKindRequest => { - Ok(epoch.cost_for_known_cost_item(FetchSingleIdentityKeyProcessingCost)) + // not accessible + Ok(platform_version + .fee_version + .processing + .fetch_single_identity_key_processing_cost) } AllKeysOfKindRequest => Err(Error::Fee(FeeError::OperationNotAllowed( "You can not get costs for an all keys of kind request", diff --git a/packages/rs-drive/src/drive/identity/update/methods/add_new_non_unique_keys_to_identity/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/add_new_non_unique_keys_to_identity/v0/mod.rs index 12c3c5922f..dfc3347ada 100644 --- a/packages/rs-drive/src/drive/identity/update/methods/add_new_non_unique_keys_to_identity/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/methods/add_new_non_unique_keys_to_identity/v0/mod.rs @@ -51,6 +51,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + None, )?; Ok(fees) } diff --git a/packages/rs-drive/src/drive/identity/update/methods/add_new_unique_keys_to_identity/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/add_new_unique_keys_to_identity/v0/mod.rs index 76251a5d54..5f16a5edf8 100644 --- a/packages/rs-drive/src/drive/identity/update/methods/add_new_unique_keys_to_identity/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/methods/add_new_unique_keys_to_identity/v0/mod.rs @@ -51,6 +51,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + None, )?; Ok(fees) } diff --git a/packages/rs-drive/src/drive/identity/update/methods/add_to_identity_balance/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/add_to_identity_balance/v0/mod.rs index e655606a07..7bd3af7104 100644 --- a/packages/rs-drive/src/drive/identity/update/methods/add_to_identity_balance/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/methods/add_to_identity_balance/v0/mod.rs @@ -46,13 +46,13 @@ impl Drive { &mut drive_operations, &platform_version.drive, )?; - let fees = Drive::calculate_fee( None, Some(drive_operations), &block_info.epoch, self.config.epochs_per_era, platform_version, + None, )?; Ok(fees) diff --git a/packages/rs-drive/src/drive/identity/update/methods/disable_identity_keys/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/disable_identity_keys/v0/mod.rs index 63c70f3362..3928008896 100644 --- a/packages/rs-drive/src/drive/identity/update/methods/disable_identity_keys/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/methods/disable_identity_keys/v0/mod.rs @@ -58,13 +58,13 @@ impl Drive { &mut drive_operations, &platform_version.drive, )?; - let fees = Drive::calculate_fee( None, Some(drive_operations), &block_info.epoch, self.config.epochs_per_era, platform_version, + None, // TODO: Does disable mean delete? Check if previous_fee_versions are required in this case )?; Ok(fees) diff --git a/packages/rs-drive/src/drive/identity/update/methods/merge_identity_nonce/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/merge_identity_nonce/v0/mod.rs index c5073ac634..09cea21f77 100644 --- a/packages/rs-drive/src/drive/identity/update/methods/merge_identity_nonce/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/methods/merge_identity_nonce/v0/mod.rs @@ -57,13 +57,13 @@ impl Drive { &mut drive_operations, &platform_version.drive, )?; - let fees = Drive::calculate_fee( None, Some(drive_operations), &block_info.epoch, self.config.epochs_per_era, platform_version, + None, )?; Some(fees) diff --git a/packages/rs-drive/src/drive/identity/update/methods/remove_from_identity_balance/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/remove_from_identity_balance/mod.rs index afb4c69d6e..5c551a2741 100644 --- a/packages/rs-drive/src/drive/identity/update/methods/remove_from_identity_balance/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/methods/remove_from_identity_balance/mod.rs @@ -8,6 +8,7 @@ use dpp::block::block_info::BlockInfo; use dpp::fee::fee_result::FeeResult; use dpp::fee::Credits; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; @@ -36,6 +37,7 @@ impl Drive { apply: bool, transaction: TransactionArg, platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result { match platform_version .drive @@ -51,6 +53,7 @@ impl Drive { apply, transaction, platform_version, + previous_fee_versions, ), version => Err(Error::Drive(DriveError::UnknownVersionMismatch { method: "remove_from_identity_balance".to_string(), diff --git a/packages/rs-drive/src/drive/identity/update/methods/remove_from_identity_balance/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/remove_from_identity_balance/v0/mod.rs index 0c9286db79..9740837f1d 100644 --- a/packages/rs-drive/src/drive/identity/update/methods/remove_from_identity_balance/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/methods/remove_from_identity_balance/v0/mod.rs @@ -8,6 +8,7 @@ use dpp::block::block_info::BlockInfo; use dpp::fee::fee_result::FeeResult; use dpp::fee::Credits; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; @@ -23,6 +24,7 @@ impl Drive { apply: bool, transaction: TransactionArg, platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result { let mut estimated_costs_only_with_layer_info = if apply { None::> @@ -46,13 +48,13 @@ impl Drive { &mut drive_operations, &platform_version.drive, )?; - let fees = Drive::calculate_fee( None, Some(drive_operations), &block_info.epoch, self.config.epochs_per_era, platform_version, + previous_fee_versions, )?; Ok(fees) } diff --git a/packages/rs-drive/src/drive/identity/update/methods/update_identity_revision/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/update_identity_revision/mod.rs index 2adb07a9a5..200fb75735 100644 --- a/packages/rs-drive/src/drive/identity/update/methods/update_identity_revision/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/methods/update_identity_revision/mod.rs @@ -13,6 +13,7 @@ use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use std::collections::HashMap; impl Drive { @@ -38,6 +39,7 @@ impl Drive { apply: bool, transaction: TransactionArg, platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result { match platform_version .drive @@ -53,6 +55,7 @@ impl Drive { apply, transaction, platform_version, + previous_fee_versions, ), version => Err(Error::Drive(DriveError::UnknownVersionMismatch { method: "update_identity_revision".to_string(), diff --git a/packages/rs-drive/src/drive/identity/update/methods/update_identity_revision/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/update_identity_revision/v0/mod.rs index 58a55021f7..1427d07d25 100644 --- a/packages/rs-drive/src/drive/identity/update/methods/update_identity_revision/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/methods/update_identity_revision/v0/mod.rs @@ -13,6 +13,7 @@ use dpp::prelude::Revision; use dpp::version::PlatformVersion; use grovedb::{EstimatedLayerInformation, TransactionArg}; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use std::collections::HashMap; impl Drive { @@ -27,6 +28,7 @@ impl Drive { apply: bool, transaction: TransactionArg, platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result { // TODO: In case of dry run we will get less because we replace the same bytes @@ -52,13 +54,13 @@ impl Drive { &mut drive_operations, &platform_version.drive, )?; - let fees = Drive::calculate_fee( None, Some(drive_operations), &block_info.epoch, self.config.epochs_per_era, platform_version, + previous_fee_versions, )?; Ok(fees) diff --git a/packages/rs-drive/src/drive/identity/update/mod.rs b/packages/rs-drive/src/drive/identity/update/mod.rs index a2579726e6..d1e47df22d 100644 --- a/packages/rs-drive/src/drive/identity/update/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/mod.rs @@ -61,7 +61,7 @@ mod tests { fee_result, FeeResult { storage_fee: 14202000, - processing_fee: 2434150, + processing_fee: 2448600, // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised ..Default::default() } ); @@ -121,7 +121,7 @@ mod tests { fee_result, FeeResult { storage_fee: 347382000, - processing_fee: 9344910, + processing_fee: 9429400, // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised ..Default::default() } ); @@ -182,7 +182,7 @@ mod tests { fee_result, FeeResult { storage_fee: 17145000, - processing_fee: 12012160, + processing_fee: 12051600, // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised ..Default::default() } ); @@ -255,7 +255,7 @@ mod tests { fee_result, FeeResult { storage_fee: 513000, - processing_fee: 1452800, + processing_fee: 1459600, // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised ..Default::default() } ); @@ -320,7 +320,7 @@ mod tests { fee_result, FeeResult { storage_fee: 486000, - processing_fee: 5432130, + processing_fee: 5451000, // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised ..Default::default() } ); @@ -418,6 +418,7 @@ mod tests { true, Some(&db_transaction), platform_version, + None, ) .expect("should update revision"); @@ -425,7 +426,7 @@ mod tests { fee_result, FeeResult { storage_fee: 0, - processing_fee: 648660, + processing_fee: 652400, // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised removed_bytes_from_system: 0, ..Default::default() } @@ -471,6 +472,7 @@ mod tests { false, None, platform_version, + None, ) .expect("should estimate the revision update"); @@ -486,7 +488,7 @@ mod tests { fee_result, FeeResult { storage_fee: 0, - processing_fee: 4217750, + processing_fee: 4232200, // TODO: Readjust this test when FeeHashingVersion blake3_base, sha256_ripe_md160_base, blake3_per_block values are finalised removed_bytes_from_system: 0, ..Default::default() } 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 d1882c72d7..3a0ccc9c37 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 @@ -7,6 +7,7 @@ pub mod fetch_next_withdrawal_transaction_index; mod tests { use dpp::block::block_info::BlockInfo; use dpp::block::epoch::Epoch; + use dpp::version::PlatformVersion; use crate::tests::helpers::setup::setup_drive_with_initial_state_structure; @@ -45,6 +46,7 @@ mod tests { &block_info, Some(&transaction), platform_version, + None, ) .expect("to apply drive ops"); 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 b404dc9088..02a014304a 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 @@ -14,6 +14,7 @@ mod tests { }; use dpp::block::block_info::BlockInfo; use dpp::block::epoch::Epoch; + use dpp::version::PlatformVersion; #[test] @@ -52,6 +53,7 @@ mod tests { &block_info, Some(&transaction), platform_version, + None, ) .expect("to apply batch"); @@ -73,6 +75,7 @@ mod tests { &block_info, Some(&transaction), platform_version, + None, ) .expect("to apply batch"); @@ -96,6 +99,7 @@ mod tests { &block_info, Some(&transaction), platform_version, + None, ) .expect("to apply batch"); diff --git a/packages/rs-drive/src/drive/prefunded_specialized_balances/fetch/single_balance/v0/mod.rs b/packages/rs-drive/src/drive/prefunded_specialized_balances/fetch/single_balance/v0/mod.rs index 9ed5965c45..6b1850aa27 100644 --- a/packages/rs-drive/src/drive/prefunded_specialized_balances/fetch/single_balance/v0/mod.rs +++ b/packages/rs-drive/src/drive/prefunded_specialized_balances/fetch/single_balance/v0/mod.rs @@ -56,6 +56,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + None, )?; Ok((value, fees)) } diff --git a/packages/rs-drive/src/drive/votes/fetch/fetch_contested_document_vote_poll_stored_info/v0/mod.rs b/packages/rs-drive/src/drive/votes/fetch/fetch_contested_document_vote_poll_stored_info/v0/mod.rs index a571a7996a..f0fbad7183 100644 --- a/packages/rs-drive/src/drive/votes/fetch/fetch_contested_document_vote_poll_stored_info/v0/mod.rs +++ b/packages/rs-drive/src/drive/votes/fetch/fetch_contested_document_vote_poll_stored_info/v0/mod.rs @@ -45,6 +45,7 @@ impl Drive { epoch, self.config.epochs_per_era, platform_version, + None, ) }) .transpose()?; diff --git a/packages/rs-drive/src/drive/votes/insert/contested_resource/individual_vote/register_contested_resource_identity_vote/v0/mod.rs b/packages/rs-drive/src/drive/votes/insert/contested_resource/individual_vote/register_contested_resource_identity_vote/v0/mod.rs index 5e0fe3ac00..b3f39261ee 100644 --- a/packages/rs-drive/src/drive/votes/insert/contested_resource/individual_vote/register_contested_resource_identity_vote/v0/mod.rs +++ b/packages/rs-drive/src/drive/votes/insert/contested_resource/individual_vote/register_contested_resource_identity_vote/v0/mod.rs @@ -56,6 +56,7 @@ impl Drive { &block_info.epoch, self.config.epochs_per_era, platform_version, + None, )?; Ok(fees) } diff --git a/packages/rs-drive/src/fee/op.rs b/packages/rs-drive/src/fee/op.rs index ac2d94315a..a90ffe7192 100644 --- a/packages/rs-drive/src/fee/op.rs +++ b/packages/rs-drive/src/fee/op.rs @@ -22,13 +22,11 @@ use crate::fee::op::LowLevelDriveOperation::{ CalculatedCostOperation, FunctionOperation, GroveOperation, PreCalculatedFeeResult, }; use dpp::block::epoch::Epoch; -use dpp::fee::default_costs::EpochCosts; -use dpp::fee::default_costs::KnownCostItem::{ - StorageDiskUsageCreditPerByte, StorageLoadCreditPerByte, StorageProcessingCreditPerByte, - StorageSeekCost, -}; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::fee::fee_result::refunds::FeeRefunds; use dpp::fee::fee_result::FeeResult; +use dpp::fee::Credits; +use platform_version::version::fee::FeeVersion; /// Base ops #[derive(Debug, Enum)] @@ -141,13 +139,23 @@ impl HashFunction { } } - //todo: put real costs in - fn base_cost(&self, _epoch: &Epoch) -> u64 { + fn block_cost(&self, fee_version: &FeeVersion) -> u64 { + match self { + HashFunction::Sha256 => fee_version.hashing.sha256_per_block, + HashFunction::Sha256_2 => fee_version.hashing.sha256_per_block, + HashFunction::Blake3 => fee_version.hashing.blake3_per_block, + HashFunction::Sha256RipeMD160 => fee_version.hashing.sha256_per_block, + } + } + + fn base_cost(&self, fee_version: &FeeVersion) -> u64 { match self { - HashFunction::Sha256 => 30, - HashFunction::Sha256_2 => 30, - HashFunction::Blake3 => 30, - HashFunction::Sha256RipeMD160 => 30, + HashFunction::Sha256 => fee_version.hashing.single_sha256_base, + // It's normal that the base cost for a sha256 will have a single sha256 base + // But it has an extra block + HashFunction::Sha256_2 => fee_version.hashing.single_sha256_base, + HashFunction::Blake3 => fee_version.hashing.blake3_base, + HashFunction::Sha256RipeMD160 => fee_version.hashing.sha256_ripe_md160_base, } } } @@ -163,8 +171,9 @@ pub struct FunctionOp { impl FunctionOp { /// The cost of the function - fn cost(&self, epoch: &Epoch) -> u64 { - self.rounds as u64 * self.hash.base_cost(epoch) + fn cost(&self, fee_version: &FeeVersion) -> Credits { + let block_cost = (self.rounds as u64).saturating_mul(self.hash.block_cost(fee_version)); + self.hash.base_cost(fee_version).saturating_add(block_cost) } /// Create a new function operation with the following hash knowing the rounds it will take @@ -204,19 +213,23 @@ impl LowLevelDriveOperation { drive_operation: Vec, epoch: &Epoch, epochs_per_era: u16, + fee_version: &FeeVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, ) -> Result, Error> { drive_operation .into_iter() .map(|operation| match operation { PreCalculatedFeeResult(f) => Ok(f), FunctionOperation(op) => Ok(FeeResult { - processing_fee: op.cost(epoch), + processing_fee: op.cost(fee_version), ..Default::default() }), _ => { let cost = operation.operation_cost()?; - let storage_fee = cost.storage_cost(epoch)?; - let processing_fee = cost.ephemeral_cost(epoch)?; + // There is no need for a checked multiply here because added bytes are u64 and + // storage disk usage credit per byte should never be high enough to cause an overflow + let storage_fee = cost.storage_cost.added_bytes as u64 * fee_version.storage.storage_disk_usage_credit_per_byte; + let processing_fee = cost.ephemeral_cost(fee_version)?; let (fee_refunds, removed_bytes_from_system) = match cost.storage_cost.removed_bytes { NoStorageRemoval => (FeeRefunds::default(), 0), @@ -225,6 +238,7 @@ impl LowLevelDriveOperation { (FeeRefunds::default(), amount) } SectionedStorageRemoval(mut removal_per_epoch_by_identifier) => { + let previous_fee_versions = previous_fee_versions.ok_or(Error::Drive(DriveError::CorruptedCodeExecution("expected previous epoch index fee versions to be able to offer refunds")))?; let system_amount = removal_per_epoch_by_identifier .remove(&Identifier::default()) .map_or(0, |a| a.values().sum()); @@ -234,6 +248,7 @@ impl LowLevelDriveOperation { removal_per_epoch_by_identifier, epoch.index, epochs_per_era, + previous_fee_versions, )?, system_amount, ) @@ -452,15 +467,12 @@ impl LowLevelDriveOperation { /// Drive cost trait pub trait DriveCost { /// Ephemeral cost - fn ephemeral_cost(&self, epoch: &Epoch) -> Result; - /// Storage cost - fn storage_cost(&self, epoch: &Epoch) -> Result; + fn ephemeral_cost(&self, fee_version: &FeeVersion) -> Result; } impl DriveCost for OperationCost { /// Return the ephemeral cost from the operation - fn ephemeral_cost(&self, epoch: &Epoch) -> Result { - //todo: deal with epochs + fn ephemeral_cost(&self, fee_version: &FeeVersion) -> Result { let OperationCost { seek_count, storage_cost, @@ -468,9 +480,9 @@ impl DriveCost for OperationCost { hash_node_calls, } = self; let epoch_cost_for_processing_credit_per_byte = - epoch.cost_for_known_cost_item(StorageProcessingCreditPerByte); + fee_version.storage.storage_processing_credit_per_byte; let seek_cost = (*seek_count as u64) - .checked_mul(epoch.cost_for_known_cost_item(StorageSeekCost)) + .checked_mul(fee_version.storage.storage_seek_cost) .ok_or_else(|| get_overflow_error("seek cost overflow"))?; let storage_added_bytes_ephemeral_cost = (storage_cost.added_bytes as u64) .checked_mul(epoch_cost_for_processing_credit_per_byte) @@ -482,12 +494,15 @@ impl DriveCost for OperationCost { (storage_cost.removed_bytes.total_removed_bytes() as u64) .checked_mul(epoch_cost_for_processing_credit_per_byte) .ok_or_else(|| get_overflow_error("storage written bytes cost overflow"))?; + // not accessible let storage_loaded_bytes_cost = (*storage_loaded_bytes as u64) - .checked_mul(epoch.cost_for_known_cost_item(StorageLoadCreditPerByte)) + .checked_mul(fee_version.storage.storage_load_credit_per_byte) .ok_or_else(|| get_overflow_error("storage loaded cost overflow"))?; + + // There is one block per hash node call + let blake3_total = fee_version.hashing.blake3_base + fee_version.hashing.blake3_per_block; // this can't overflow - let hash_node_cost = - FunctionOp::new_with_round_count(HashFunction::Blake3, *hash_node_calls).cost(epoch); + let hash_node_cost = blake3_total * (*hash_node_calls as u64); seek_cost .checked_add(storage_added_bytes_ephemeral_cost) .and_then(|c| c.checked_add(storage_replaced_bytes_ephemeral_cost)) @@ -496,13 +511,4 @@ impl DriveCost for OperationCost { .and_then(|c| c.checked_add(hash_node_cost)) .ok_or_else(|| get_overflow_error("ephemeral cost addition overflow")) } - - /// Return the storage cost from the operation - fn storage_cost(&self, epoch: &Epoch) -> Result { - //todo: deal with epochs - let OperationCost { storage_cost, .. } = self; - (storage_cost.added_bytes as u64) - .checked_mul(epoch.cost_for_known_cost_item(StorageDiskUsageCreditPerByte)) - .ok_or_else(|| get_overflow_error("storage written bytes cost overflow")) - } } diff --git a/packages/rs-drive/src/query/contested_resource_votes_given_by_identity_query.rs b/packages/rs-drive/src/query/contested_resource_votes_given_by_identity_query.rs index d8a63c1da3..91902ba299 100644 --- a/packages/rs-drive/src/query/contested_resource_votes_given_by_identity_query.rs +++ b/packages/rs-drive/src/query/contested_resource_votes_given_by_identity_query.rs @@ -62,6 +62,7 @@ impl ContestedResourceVotesGivenByIdentityQuery { &block_info.epoch, drive.config.epochs_per_era, platform_version, + None, )?; fee_result.processing_fee } else { @@ -113,6 +114,7 @@ impl ContestedResourceVotesGivenByIdentityQuery { &block_info.epoch, drive.config.epochs_per_era, platform_version, + None, )?; fee_result.processing_fee } else { diff --git a/packages/rs-drive/src/query/mod.rs b/packages/rs-drive/src/query/mod.rs index 8b03e7e20c..85a525303b 100644 --- a/packages/rs-drive/src/query/mod.rs +++ b/packages/rs-drive/src/query/mod.rs @@ -1684,6 +1684,7 @@ impl<'a> DriveQuery<'a> { &block_info.epoch, drive.config.epochs_per_era, platform_version, + None, )?; fee_result.processing_fee } else { @@ -1739,6 +1740,7 @@ impl<'a> DriveQuery<'a> { &block_info.epoch, drive.config.epochs_per_era, platform_version, + None, )?; fee_result.processing_fee } else { @@ -1796,6 +1798,7 @@ impl<'a> DriveQuery<'a> { &block_info.epoch, drive.config.epochs_per_era, platform_version, + None, )?; fee_result.processing_fee } else { diff --git a/packages/rs-drive/src/query/vote_poll_contestant_votes_query.rs b/packages/rs-drive/src/query/vote_poll_contestant_votes_query.rs index ff65c1fd06..656f6fe6dc 100644 --- a/packages/rs-drive/src/query/vote_poll_contestant_votes_query.rs +++ b/packages/rs-drive/src/query/vote_poll_contestant_votes_query.rs @@ -137,6 +137,7 @@ impl ContestedDocumentVotePollVotesDriveQuery { &block_info.epoch, drive.config.epochs_per_era, platform_version, + None, )?; fee_result.processing_fee } else { @@ -183,6 +184,7 @@ impl ContestedDocumentVotePollVotesDriveQuery { &block_info.epoch, drive.config.epochs_per_era, platform_version, + None, )?; fee_result.processing_fee } else { diff --git a/packages/rs-drive/src/query/vote_poll_vote_state_query.rs b/packages/rs-drive/src/query/vote_poll_vote_state_query.rs index 71e49a1cf4..f78f30dde4 100644 --- a/packages/rs-drive/src/query/vote_poll_vote_state_query.rs +++ b/packages/rs-drive/src/query/vote_poll_vote_state_query.rs @@ -291,6 +291,7 @@ impl ContestedDocumentVotePollDriveQuery { &block_info.epoch, drive.config.epochs_per_era, platform_version, + None, )?; fee_result.processing_fee } else { @@ -338,6 +339,7 @@ impl ContestedDocumentVotePollDriveQuery { &block_info.epoch, drive.config.epochs_per_era, platform_version, + None, )?; fee_result.processing_fee } else { diff --git a/packages/rs-drive/src/query/vote_polls_by_document_type_query.rs b/packages/rs-drive/src/query/vote_polls_by_document_type_query.rs index e82599f304..161a269ca3 100644 --- a/packages/rs-drive/src/query/vote_polls_by_document_type_query.rs +++ b/packages/rs-drive/src/query/vote_polls_by_document_type_query.rs @@ -238,6 +238,7 @@ impl VotePollsByDocumentTypeQuery { &block_info.epoch, drive.config.epochs_per_era, platform_version, + None, )?; fee_result.processing_fee } else { diff --git a/packages/rs-drive/src/query/vote_polls_by_end_date_query.rs b/packages/rs-drive/src/query/vote_polls_by_end_date_query.rs index 3d08ce0a26..b20d892c47 100644 --- a/packages/rs-drive/src/query/vote_polls_by_end_date_query.rs +++ b/packages/rs-drive/src/query/vote_polls_by_end_date_query.rs @@ -205,6 +205,7 @@ impl VotePollsByEndDateDriveQuery { &block_info.epoch, drive.config.epochs_per_era, platform_version, + None, )?; fee_result.processing_fee } else { @@ -249,6 +250,7 @@ impl VotePollsByEndDateDriveQuery { &block_info.epoch, drive.config.epochs_per_era, platform_version, + None, )?; fee_result.processing_fee } else { diff --git a/packages/rs-drive/src/tests/helpers/setup.rs b/packages/rs-drive/src/tests/helpers/setup.rs index 7eaacc586f..1bd134045a 100644 --- a/packages/rs-drive/src/tests/helpers/setup.rs +++ b/packages/rs-drive/src/tests/helpers/setup.rs @@ -128,6 +128,7 @@ pub fn setup_document( true, transaction, platform_version, + None, ) .unwrap(); } diff --git a/packages/rs-drive/tests/deterministic_root_hash.rs b/packages/rs-drive/tests/deterministic_root_hash.rs index 705aba5a9e..5c65f06ddf 100644 --- a/packages/rs-drive/tests/deterministic_root_hash.rs +++ b/packages/rs-drive/tests/deterministic_root_hash.rs @@ -168,6 +168,7 @@ pub fn add_domains_to_contract( true, transaction, platform_version, + None, ) .expect("document should be inserted"); } diff --git a/packages/rs-drive/tests/query_tests.rs b/packages/rs-drive/tests/query_tests.rs index 1a7c0b6aeb..5fd6be2396 100644 --- a/packages/rs-drive/tests/query_tests.rs +++ b/packages/rs-drive/tests/query_tests.rs @@ -38,6 +38,7 @@ use serde::{Deserialize, Serialize}; use serde_json::json; #[cfg(feature = "server")] use std::borrow::Cow; +use std::collections::BTreeMap; #[cfg(feature = "server")] use std::collections::HashMap; #[cfg(feature = "server")] @@ -66,15 +67,15 @@ use dpp::document::serialization_traits::{ DocumentCborMethodsV0, DocumentPlatformConversionMethodsV0, DocumentPlatformValueMethodsV0, }; use dpp::document::{DocumentV0Getters, DocumentV0Setters}; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::identity::TimestampMillis; use dpp::platform_value; - #[cfg(feature = "server")] use dpp::prelude::DataContract; - use dpp::tests::json_document::json_document_to_contract; #[cfg(feature = "server")] use dpp::util::cbor_serializer; +use once_cell::sync::Lazy; use dpp::version::PlatformVersion; @@ -243,6 +244,7 @@ pub fn setup_family_tests(count: u32, seed: u64) -> (Drive, DataContract) { true, Some(&db_transaction), platform_version, + None, ) .expect("document should be inserted"); } @@ -311,6 +313,7 @@ pub fn setup_family_tests_with_nulls(count: u32, seed: u64) -> (Drive, DataContr true, Some(&db_transaction), platform_version, + None, ) .expect("document should be inserted"); } @@ -380,6 +383,7 @@ pub fn setup_family_tests_only_first_name_index(count: u32, seed: u64) -> (Drive true, Some(&db_transaction), platform_version, + None, ) .expect("document should be inserted"); } @@ -624,6 +628,7 @@ pub fn add_domains_to_contract( true, transaction, platform_version, + None, ) .expect("document should be inserted"); } @@ -794,6 +799,7 @@ pub fn setup_dpns_test_with_data(path: &str) -> (Drive, DataContract) { true, Some(&db_transaction), platform_version, + None, ) .expect("expected to insert a document successfully"); } @@ -843,6 +849,7 @@ fn test_query_many() { true, Some(&db_transaction), platform_version, + None, ) .expect("document should be inserted"); } @@ -1829,6 +1836,7 @@ fn test_family_basic_queries() { true, Some(&db_transaction), platform_version, + None, ) .expect("document should be inserted"); @@ -1873,6 +1881,7 @@ fn test_family_basic_queries() { true, Some(&db_transaction), platform_version, + None, ) .expect("document should be inserted"); @@ -2289,6 +2298,9 @@ 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())])); + let db_transaction = drive.grove.start_transaction(); let mut rng = rand::rngs::StdRng::seed_from_u64(84594); @@ -2335,6 +2347,7 @@ fn test_family_person_update() { true, Some(&db_transaction), platform_version, + None, ) .expect("document should be inserted"); @@ -2363,6 +2376,7 @@ fn test_family_person_update() { None, Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("expected to override document"); assert!(fee.storage_fee > 0); @@ -2856,6 +2870,9 @@ 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())])); + let db_transaction = drive.grove.start_transaction(); let root_hash = drive @@ -2960,6 +2977,7 @@ fn test_family_with_nulls_query() { true, Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("expected to be able to delete the document"); } @@ -4103,6 +4121,7 @@ fn test_dpns_query_start_at_with_null_id() { true, Some(&db_transaction), platform_version, + None, ) .expect("document should be inserted"); @@ -4145,6 +4164,7 @@ fn test_dpns_query_start_at_with_null_id() { true, Some(&db_transaction), platform_version, + None, ) .expect("document should be inserted"); @@ -4303,6 +4323,7 @@ fn test_dpns_query_start_after_with_null_id() { true, Some(&db_transaction), platform_version, + None, ) .expect("document should be inserted"); @@ -4346,6 +4367,7 @@ fn test_dpns_query_start_after_with_null_id() { true, Some(&db_transaction), platform_version, + None, ) .expect("document should be inserted"); @@ -4508,6 +4530,7 @@ fn test_dpns_query_start_after_with_null_id_desc() { true, Some(&db_transaction), platform_version, + None, ) .expect("document should be inserted"); @@ -4551,6 +4574,7 @@ fn test_dpns_query_start_after_with_null_id_desc() { true, Some(&db_transaction), platform_version, + None, ) .expect("document should be inserted"); @@ -4978,6 +5002,7 @@ fn test_query_documents_by_created_at() { true, None, platform_version, + None, ) .expect("should add document"); diff --git a/packages/rs-drive/tests/query_tests_history.rs b/packages/rs-drive/tests/query_tests_history.rs index 635447d69c..3747237028 100644 --- a/packages/rs-drive/tests/query_tests_history.rs +++ b/packages/rs-drive/tests/query_tests_history.rs @@ -30,19 +30,11 @@ //! Query Tests History //! -#[cfg(feature = "server")] -use std::borrow::Cow; -#[cfg(feature = "server")] -use std::collections::{BTreeMap, HashMap}; -#[cfg(feature = "server")] -use std::fmt::{Debug, Formatter}; -#[cfg(feature = "server")] -use std::option::Option::None; - #[cfg(feature = "server")] use dpp::document::Document; #[cfg(feature = "server")] use dpp::util::cbor_serializer; +use once_cell::sync::Lazy; #[cfg(feature = "server")] use rand::seq::SliceRandom; #[cfg(feature = "server")] @@ -51,6 +43,14 @@ use rand::{Rng, SeedableRng}; use serde::{Deserialize, Serialize}; #[cfg(feature = "server")] use serde_json::json; +#[cfg(feature = "server")] +use std::borrow::Cow; +#[cfg(feature = "server")] +use std::collections::{BTreeMap, HashMap}; +#[cfg(feature = "server")] +use std::fmt::{Debug, Formatter}; +#[cfg(feature = "server")] +use std::option::Option::None; #[cfg(feature = "server")] use drive::common; @@ -83,6 +83,7 @@ use dpp::document::serialization_traits::{ DocumentCborMethodsV0, DocumentPlatformConversionMethodsV0, }; use dpp::document::DocumentV0Getters; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::tests::json_document::json_document_to_contract; use dpp::version::PlatformVersion; use drive::drive::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; @@ -191,6 +192,9 @@ 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())])); + let drive = setup_drive(Some(drive_config)); let db_transaction = drive.grove.start_transaction(); @@ -254,6 +258,7 @@ pub fn setup( true, Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("expected to add document"); } @@ -281,6 +286,9 @@ 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())])); + let db_transaction = drive.grove.start_transaction(); let root_hash = drive @@ -1131,6 +1139,7 @@ fn test_query_historical() { true, Some(&db_transaction), platform_version, + Some(&EPOCH_CHANGE_FEE_VERSION_TEST), ) .expect("document should be inserted"); @@ -1176,6 +1185,7 @@ fn test_query_historical() { true, Some(&db_transaction), platform_version, + None, ) .expect("document should be inserted"); diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index fda58774fd..9b8c66d48b 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -9,6 +9,7 @@ license = "MIT" [dependencies] thiserror = { version = "1.0.59" } +bincode = { version = "2.0.0-rc.3"} versioned-feature-core = { git = "https://github.com/dashpay/versioned-feature-core", version = "1.0.0" } grovedb-version = { git = "https://github.com/dashpay/grovedb", rev = "8ada131a1079c763e83d2b11ab1f6abbd5d82e06"} diff --git a/packages/rs-platform-version/src/version/drive_versions.rs b/packages/rs-platform-version/src/version/drive_versions.rs index e197e414f9..92116528d8 100644 --- a/packages/rs-platform-version/src/version/drive_versions.rs +++ b/packages/rs-platform-version/src/version/drive_versions.rs @@ -465,6 +465,7 @@ pub struct DriveCreditPoolMethodVersions { #[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, diff --git a/packages/rs-platform-version/src/version/fee/data_contract/mod.rs b/packages/rs-platform-version/src/version/fee/data_contract/mod.rs index 4c8f3eb240..88894894f5 100644 --- a/packages/rs-platform-version/src/version/fee/data_contract/mod.rs +++ b/packages/rs-platform-version/src/version/fee/data_contract/mod.rs @@ -1,6 +1,8 @@ +use bincode::{Decode, Encode}; + pub mod v1; -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug, Encode, Decode, Default, PartialEq, Eq)] pub struct FeeDataContractValidationVersion { pub document_type_base_fee: u64, pub document_type_size_fee: u64, @@ -10,3 +12,35 @@ pub struct FeeDataContractValidationVersion { pub document_type_base_unique_index_fee: u64, pub document_type_unique_index_per_property_fee: u64, } + +#[cfg(test)] +mod tests { + use super::FeeDataContractValidationVersion; + + #[test] + // If this test failed, then a new field was added in FeeDataContractValidationVersion. And the corresponding eq needs to be updated as well + fn test_fee_data_contract_validation_fees_version_equality() { + let version1 = 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, + }; + + let version2 = 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, + }; + + // This assertion will check if all fields are considered in the equality comparison + assert_eq!(version1, version2, "FeeDataContractValidationVersion equality test failed. If a field was added or removed, update the Eq implementation."); + } +} diff --git a/packages/rs-platform-version/src/version/fee/hashing/mod.rs b/packages/rs-platform-version/src/version/fee/hashing/mod.rs index c5b51a4e4f..2d40315601 100644 --- a/packages/rs-platform-version/src/version/fee/hashing/mod.rs +++ b/packages/rs-platform-version/src/version/fee/hashing/mod.rs @@ -1,9 +1,40 @@ +use bincode::{Decode, Encode}; + pub mod v1; -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug, Encode, Decode, Default, PartialEq, Eq)] pub struct FeeHashingVersion { - pub double_sha256_base: u64, - pub double_sha256_per_block: u64, + pub blake3_base: u64, + pub blake3_per_block: u64, + pub sha256_per_block: u64, + pub sha256_ripe_md160_base: u64, pub single_sha256_base: u64, - pub single_sha256_per_block: u64, +} + +#[cfg(test)] +mod tests { + use super::FeeHashingVersion; + + #[test] + // If this test failed, then a new field was added in FeeHashingVersion. And the corresponding eq needs to be updated as well + fn test_fee_hashing_version_equality() { + let version1 = FeeHashingVersion { + single_sha256_base: 1, + blake3_base: 2, + sha256_ripe_md160_base: 3, + sha256_per_block: 4, + blake3_per_block: 5, + }; + + let version2 = FeeHashingVersion { + single_sha256_base: 1, + blake3_base: 2, + sha256_ripe_md160_base: 3, + sha256_per_block: 4, + blake3_per_block: 5, + }; + + // This assertion will check if all fields are considered in the equality comparison + assert_eq!(version1, version2, "FeeHashingVersion equality test failed. If a field was added or removed, update the Eq implementation."); + } } diff --git a/packages/rs-platform-version/src/version/fee/hashing/v1.rs b/packages/rs-platform-version/src/version/fee/hashing/v1.rs index a29d60858e..78c5f4533f 100644 --- a/packages/rs-platform-version/src/version/fee/hashing/v1.rs +++ b/packages/rs-platform-version/src/version/fee/hashing/v1.rs @@ -1,8 +1,9 @@ use crate::version::fee::hashing::FeeHashingVersion; pub const FEE_HASHING_VERSION1: FeeHashingVersion = FeeHashingVersion { - double_sha256_base: 500, - double_sha256_per_block: 400, single_sha256_base: 100, - single_sha256_per_block: 400, + blake3_base: 100, // TODO: Check this value + sha256_ripe_md160_base: 100, // TODO: Check this value + sha256_per_block: 400, + blake3_per_block: 100, // TODO: Check this value }; diff --git a/packages/rs-platform-version/src/version/fee/mod.rs b/packages/rs-platform-version/src/version/fee/mod.rs index 8da03becbc..aa83c46416 100644 --- a/packages/rs-platform-version/src/version/fee/mod.rs +++ b/packages/rs-platform-version/src/version/fee/mod.rs @@ -5,6 +5,7 @@ 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; +use bincode::{Decode, Encode}; mod data_contract; mod hashing; @@ -15,7 +16,7 @@ pub mod storage; pub mod v1; pub mod vote_resolution_fund_fees; -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug, Encode, Decode, Default, PartialEq, Eq)] pub struct FeeVersion { pub storage: FeeStorageVersion, pub signature: FeeSignatureVersion, @@ -25,3 +26,134 @@ pub struct FeeVersion { pub state_transition_min_fees: StateTransitionMinFees, 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; + + #[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 { + 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, + validate_key_structure: 6, + fetch_prefunded_specialized_balance_processing_cost: 7, + }, + 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, + }, + }; + + let version2 = FeeVersion { + 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, + validate_key_structure: 6, + fetch_prefunded_specialized_balance_processing_cost: 7, + }, + 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 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."); + } +} 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 4ba72b7456..0427cd0916 100644 --- a/packages/rs-platform-version/src/version/fee/processing/mod.rs +++ b/packages/rs-platform-version/src/version/fee/processing/mod.rs @@ -1,6 +1,8 @@ +use bincode::{Decode, Encode}; + pub mod v1; -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug, Encode, Decode, Default, PartialEq, Eq)] pub struct FeeProcessingVersion { pub fetch_identity_balance_processing_cost: u64, pub fetch_identity_revision_processing_cost: u64, @@ -10,3 +12,35 @@ pub struct FeeProcessingVersion { pub fetch_single_identity_key_processing_cost: u64, pub validate_key_structure: 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, + validate_key_structure: 6, + fetch_prefunded_specialized_balance_processing_cost: 7, + }; + + 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, + validate_key_structure: 6, + fetch_prefunded_specialized_balance_processing_cost: 7, + }; + + // 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."); + } +} diff --git a/packages/rs-platform-version/src/version/fee/signature/mod.rs b/packages/rs-platform-version/src/version/fee/signature/mod.rs index ebfbd22984..6a667bd574 100644 --- a/packages/rs-platform-version/src/version/fee/signature/mod.rs +++ b/packages/rs-platform-version/src/version/fee/signature/mod.rs @@ -1,6 +1,8 @@ +use bincode::{Decode, Encode}; + pub mod v1; -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug, Encode, Decode, Default, PartialEq, Eq)] pub struct FeeSignatureVersion { pub verify_signature_ecdsa_secp256k1: u64, pub verify_signature_bls12_381: u64, @@ -8,3 +10,31 @@ pub struct FeeSignatureVersion { pub verify_signature_bip13_script_hash: u64, pub verify_signature_eddsa25519_hash160: u64, } + +#[cfg(test)] +mod tests { + use super::FeeSignatureVersion; + + #[test] + // If this test failed, then a new field was added in FeeSignatureVersion. And the corresponding eq needs to be updated as well + fn test_fee_signature_version_equality() { + let version1 = 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, + }; + + let version2 = 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, + }; + + // This assertion will check if all fields are considered in the equality comparison + assert_eq!(version1, version2, "FeeSignatureVersion equality test failed. If a field was added or removed, update the Eq implementation."); + } +} diff --git a/packages/rs-platform-version/src/version/fee/state_transition_min_fees/mod.rs b/packages/rs-platform-version/src/version/fee/state_transition_min_fees/mod.rs index b94d61253b..2b099d7143 100644 --- a/packages/rs-platform-version/src/version/fee/state_transition_min_fees/mod.rs +++ b/packages/rs-platform-version/src/version/fee/state_transition_min_fees/mod.rs @@ -1,5 +1,7 @@ +use bincode::{Decode, Encode}; + pub mod v1; -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug, Encode, Decode, Default, PartialEq, Eq)] pub struct StateTransitionMinFees { pub credit_transfer: u64, pub credit_withdrawal: u64, @@ -9,3 +11,35 @@ pub struct StateTransitionMinFees { pub contract_update: u64, pub masternode_vote: u64, } + +#[cfg(test)] +mod tests { + use super::StateTransitionMinFees; + + #[test] + // If this test failed, then a new field was added in StateTransitionMinFees. And the corresponding eq needs to be updated as well + fn test_fee_state_transition_min_fees_version_equality() { + let version1 = StateTransitionMinFees { + credit_transfer: 1, + credit_withdrawal: 2, + identity_update: 3, + document_batch_sub_transition: 4, + contract_create: 5, + contract_update: 6, + masternode_vote: 7, + }; + + let version2 = StateTransitionMinFees { + credit_transfer: 1, + credit_withdrawal: 2, + identity_update: 3, + document_batch_sub_transition: 4, + contract_create: 5, + contract_update: 6, + masternode_vote: 7, + }; + + // This assertion will check if all fields are considered in the equality comparison + assert_eq!(version1, version2, "StateTransitionMinFees equality test failed. If a field was added or removed, update the Eq implementation."); + } +} diff --git a/packages/rs-platform-version/src/version/fee/storage/mod.rs b/packages/rs-platform-version/src/version/fee/storage/mod.rs index 765bee47b9..f6121321ba 100644 --- a/packages/rs-platform-version/src/version/fee/storage/mod.rs +++ b/packages/rs-platform-version/src/version/fee/storage/mod.rs @@ -1,6 +1,8 @@ +use bincode::{Decode, Encode}; + pub mod v1; -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug, Encode, Decode, Default, PartialEq, Eq)] pub struct FeeStorageVersion { pub storage_disk_usage_credit_per_byte: u64, pub storage_processing_credit_per_byte: u64, @@ -8,3 +10,31 @@ pub struct FeeStorageVersion { pub non_storage_load_credit_per_byte: u64, pub storage_seek_cost: u64, } + +#[cfg(test)] +mod tests { + use super::FeeStorageVersion; + + #[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_storage_version_equality() { + let version1 = 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, + }; + + let version2 = 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, + }; + + // This assertion will check if all fields are considered in the equality comparison + assert_eq!(version1, version2, "FeeStorageVersion equality test failed. If a field was added or removed, update the Eq implementation."); + } +} diff --git a/packages/rs-platform-version/src/version/fee/vote_resolution_fund_fees/mod.rs b/packages/rs-platform-version/src/version/fee/vote_resolution_fund_fees/mod.rs index 280202ef35..ba594961d4 100644 --- a/packages/rs-platform-version/src/version/fee/vote_resolution_fund_fees/mod.rs +++ b/packages/rs-platform-version/src/version/fee/vote_resolution_fund_fees/mod.rs @@ -1,5 +1,7 @@ +use bincode::{Decode, Encode}; + pub mod v1; -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug, Encode, Decode, Default, PartialEq, Eq)] pub struct VoteResolutionFundFees { /// This is the amount that will be deducted from an identity and used to pay for voting pub contested_document_vote_resolution_fund_required_amount: u64, @@ -8,3 +10,27 @@ pub struct VoteResolutionFundFees { /// This is the amount that a single vote will cost pub contested_document_single_vote_cost: u64, } + +#[cfg(test)] +mod tests { + use super::VoteResolutionFundFees; + + #[test] + // If this test failed, then a new field was added in VoteResolutionFundFees. And the corresponding eq needs to be updated as well + fn test_fee_storage_version_equality() { + let version1 = VoteResolutionFundFees { + contested_document_vote_resolution_fund_required_amount: 1, + contested_document_vote_resolution_unlock_fund_required_amount: 2, + contested_document_single_vote_cost: 3, + }; + + let version2 = 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 assertion will check if all fields are considered in the equality comparison + assert_eq!(version1, version2, "VoteResolutionFundFees equality test failed. If a field was added or removed, update the Eq implementation."); + } +} 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 de03884847..c23e6490af 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -119,6 +119,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { 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, 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 486ccc14c3..c525877d72 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -119,6 +119,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { 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, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 355abc38c3..138e482119 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -118,6 +118,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { 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,