platform_version/version/fee/
mod.rs

1use crate::error::PlatformVersionError;
2use crate::version::fee::data_contract_registration::v1::FEE_DATA_CONTRACT_REGISTRATION_VERSION1;
3use crate::version::fee::data_contract_registration::FeeDataContractRegistrationVersion;
4use crate::version::fee::data_contract_validation::FeeDataContractValidationVersion;
5use crate::version::fee::hashing::v1::FEE_HASHING_VERSION1;
6use crate::version::fee::hashing::{FeeHashingVersion, FeeHashingVersionBeforeVersion11};
7use crate::version::fee::processing::{
8    FeeProcessingVersion, FeeProcessingVersionFieldsBeforeVersion1Point4,
9};
10use crate::version::fee::signature::FeeSignatureVersion;
11use crate::version::fee::state_transition_min_fees::{
12    StateTransitionMinFees, StateTransitionMinFeesBeforeProtocolVersion11,
13};
14use crate::version::fee::storage::FeeStorageVersion;
15use crate::version::fee::v1::FEE_VERSION1;
16use crate::version::fee::vote_resolution_fund_fees::VoteResolutionFundFees;
17use bincode::{Decode, Encode};
18
19pub mod data_contract_registration;
20mod data_contract_validation;
21mod hashing;
22mod processing;
23pub mod signature;
24pub mod state_transition_min_fees;
25pub mod storage;
26pub mod v1;
27pub mod v2;
28pub mod vote_resolution_fund_fees;
29
30pub type FeeVersionNumber = u32;
31
32pub const FEE_VERSIONS: &[FeeVersion] = &[FEE_VERSION1];
33
34#[derive(Clone, Debug, Encode, Decode, Default, PartialEq, Eq)]
35pub struct FeeVersion {
36    pub fee_version_number: FeeVersionNumber,
37    // Permille means devise by 1000
38    pub uses_version_fee_multiplier_permille: Option<u64>,
39    pub storage: FeeStorageVersion,
40    pub signature: FeeSignatureVersion,
41    pub hashing: FeeHashingVersion,
42    pub processing: FeeProcessingVersion,
43    pub data_contract_validation: FeeDataContractValidationVersion,
44    pub data_contract_registration: FeeDataContractRegistrationVersion,
45    pub state_transition_min_fees: StateTransitionMinFees,
46    pub vote_resolution_fund_fees: VoteResolutionFundFees,
47}
48
49impl FeeVersion {
50    pub fn as_static(&self) -> &'static FeeVersion {
51        FeeVersion::get(self.fee_version_number).expect("expected fee version to exist")
52    }
53    pub fn get<'a>(version: FeeVersionNumber) -> Result<&'a Self, PlatformVersionError> {
54        if version > 0 {
55            FEE_VERSIONS.get(version as usize - 1).ok_or_else(|| {
56                PlatformVersionError::UnknownVersionError(format!("no fee version {version}"))
57            })
58        } else {
59            Err(PlatformVersionError::UnknownVersionError(format!(
60                "no fee version {version}"
61            )))
62        }
63    }
64
65    pub fn get_optional<'a>(version: FeeVersionNumber) -> Option<&'a Self> {
66        if version > 0 {
67            FEE_VERSIONS.get(version as usize - 1)
68        } else {
69            None
70        }
71    }
72
73    pub fn first<'a>() -> &'a Self {
74        FEE_VERSIONS
75            .first()
76            .expect("expected to have a fee version")
77    }
78
79    pub fn latest<'a>() -> &'a Self {
80        FEE_VERSIONS.last().expect("expected to have a fee version")
81    }
82}
83
84// This is type only meant for deserialization because of an issue
85// The issue was that the platform state was stored with FeeVersions in it before version 1.4
86// When we would add new fields we would be unable to deserialize
87// This FeeProcessingVersionFieldsBeforeVersion4 is how things were before version 1.4 was released
88#[derive(Clone, Debug, Encode, Decode, Default, PartialEq, Eq)]
89pub struct FeeVersionFieldsBeforeVersion4 {
90    // Permille means devise by 1000
91    pub uses_version_fee_multiplier_permille: Option<u64>,
92    pub storage: FeeStorageVersion,
93    pub signature: FeeSignatureVersion,
94    pub hashing: FeeHashingVersionBeforeVersion11,
95    pub processing: FeeProcessingVersionFieldsBeforeVersion1Point4,
96    pub data_contract: FeeDataContractValidationVersion,
97    pub state_transition_min_fees: StateTransitionMinFeesBeforeProtocolVersion11,
98    pub vote_resolution_fund_fees: VoteResolutionFundFees,
99}
100
101impl From<FeeVersionFieldsBeforeVersion4> for FeeVersion {
102    fn from(value: FeeVersionFieldsBeforeVersion4) -> Self {
103        FeeVersion {
104            fee_version_number: 1,
105            uses_version_fee_multiplier_permille: value.uses_version_fee_multiplier_permille,
106            storage: value.storage,
107            signature: value.signature,
108            hashing: FEE_HASHING_VERSION1,
109            processing: FeeProcessingVersion::from(value.processing),
110            data_contract_validation: value.data_contract,
111            data_contract_registration: FEE_DATA_CONTRACT_REGISTRATION_VERSION1,
112            state_transition_min_fees: StateTransitionMinFees::from(
113                value.state_transition_min_fees,
114            ),
115            vote_resolution_fund_fees: value.vote_resolution_fund_fees,
116        }
117    }
118}