dpp/fee/default_costs/
mod.rs1use crate::block::epoch::{Epoch, EpochIndex};
7use crate::fee::Credits;
8use platform_version::version::fee::{
9 FeeVersion, FeeVersionFieldsBeforeVersion4, FeeVersionNumber,
10};
11use std::collections::BTreeMap;
12
13pub mod constants;
14
15pub type CachedEpochIndexFeeVersions = BTreeMap<EpochIndex, &'static FeeVersion>;
16pub type EpochIndexFeeVersionsForStorage = BTreeMap<EpochIndex, FeeVersionNumber>;
17
18pub type CachedEpochIndexFeeVersionsFieldsBeforeVersion4 =
23 BTreeMap<EpochIndex, FeeVersionFieldsBeforeVersion4>;
24
25#[derive(Eq, PartialEq, Copy, Clone, Hash)]
27pub enum KnownCostItem {
28 StorageDiskUsageCreditPerByte,
30 StorageProcessingCreditPerByte,
32 StorageLoadCreditPerByte,
34 NonStorageLoadCreditPerByte,
36 StorageSeekCost,
38 FetchIdentityBalanceProcessingCost,
41 FetchSingleIdentityKeyProcessingCost,
43 SingleSHA256(usize),
45 Blake3(usize),
47 VerifySignatureEcdsaSecp256k1,
49 VerifySignatureBLS12_381,
51 VerifySignatureEcdsaHash160,
53 VerifySignatureBip13ScriptHash,
55 VerifySignatureEddsa25519Hash160,
57}
58
59impl KnownCostItem {
60 #[inline]
61 pub fn lookup_cost(&self, fee_version: &FeeVersion) -> Credits {
62 match self {
63 KnownCostItem::StorageDiskUsageCreditPerByte => {
64 fee_version.storage.storage_disk_usage_credit_per_byte
65 }
66 KnownCostItem::StorageProcessingCreditPerByte => {
67 fee_version.storage.storage_processing_credit_per_byte
68 }
69 KnownCostItem::StorageLoadCreditPerByte => {
70 fee_version.storage.storage_load_credit_per_byte
71 }
72 KnownCostItem::NonStorageLoadCreditPerByte => {
73 fee_version.storage.non_storage_load_credit_per_byte
74 }
75 KnownCostItem::StorageSeekCost => fee_version.storage.storage_seek_cost,
76 KnownCostItem::FetchIdentityBalanceProcessingCost => {
77 fee_version
78 .processing
79 .fetch_identity_balance_processing_cost
80 }
81 KnownCostItem::FetchSingleIdentityKeyProcessingCost => {
82 fee_version
83 .processing
84 .fetch_single_identity_key_processing_cost
85 }
86 KnownCostItem::Blake3(size) => {
87 fee_version.hashing.blake3_base
88 + fee_version.hashing.blake3_per_block * *size as u64
89 }
90 KnownCostItem::SingleSHA256(size) => {
91 fee_version.hashing.single_sha256_base
92 + fee_version.hashing.sha256_per_block * *size as u64
93 }
94 KnownCostItem::VerifySignatureEcdsaSecp256k1 => {
95 fee_version.signature.verify_signature_ecdsa_secp256k1
96 }
97 KnownCostItem::VerifySignatureBLS12_381 => {
98 fee_version.signature.verify_signature_bls12_381
99 }
100 KnownCostItem::VerifySignatureEcdsaHash160 => {
101 fee_version.signature.verify_signature_ecdsa_hash160
102 }
103 KnownCostItem::VerifySignatureBip13ScriptHash => {
104 fee_version.signature.verify_signature_bip13_script_hash
105 }
106 KnownCostItem::VerifySignatureEddsa25519Hash160 => {
107 fee_version.signature.verify_signature_eddsa25519_hash160
108 }
109 }
110 }
111
112 pub fn lookup_cost_on_epoch<T: EpochCosts>(
113 &self,
114 epoch: &T,
115 cached_fee_version: &CachedEpochIndexFeeVersions,
116 ) -> Credits {
117 let version = epoch.active_fee_version(cached_fee_version);
118 self.lookup_cost(version)
119 }
120}
121
122pub trait EpochCosts {
124 fn active_fee_version(
127 &self,
128 cached_fee_version: &CachedEpochIndexFeeVersions,
129 ) -> &'static FeeVersion;
130 fn cost_for_known_cost_item(
132 &self,
133 cached_fee_version: &CachedEpochIndexFeeVersions,
134 cost_item: KnownCostItem,
135 ) -> Credits;
136}
137
138impl EpochCosts for Epoch {
139 fn active_fee_version(
141 &self,
142 cached_fee_version: &CachedEpochIndexFeeVersions,
143 ) -> &'static FeeVersion {
144 if let Some(fee_version) = cached_fee_version.get(&self.index) {
146 return fee_version;
147 }
148 cached_fee_version
150 .range(..=self.index)
151 .next_back()
152 .map(|(_, fee_version)| *fee_version)
153 .unwrap_or_else(|| FeeVersion::first())
154 }
155
156 fn cost_for_known_cost_item(
158 &self,
159 cached_fee_version: &CachedEpochIndexFeeVersions,
160 cost_item: KnownCostItem,
161 ) -> Credits {
162 cost_item.lookup_cost_on_epoch(self, cached_fee_version)
163 }
164}