#[derive(Debug, Clone)]
pub struct FeeTable {
pub per_transaction_weight_cost: u64,
pub per_module_call_cost: u64,
pub per_byte_storage_cost: u64,
pub per_signature_verification_cost: u64,
pub per_template_load_cost_unit: u64,
pub per_substate_create_cost: u64,
pub per_wasm_point_cost: u64,
pub storage_cost_divisor: u64,
pub template_load_bytes_cost_divisor: u64,
pub wasm_points_cost_divisor: u64,
pub template_size_premium_free_bytes: u64,
pub template_size_premium_unit_bytes: u64,
pub per_template_size_premium_unit_cost: u64,
}
impl FeeTable {
pub fn zero_rated() -> Self {
Self {
per_transaction_weight_cost: 0,
per_module_call_cost: 0,
per_byte_storage_cost: 0,
per_signature_verification_cost: 0,
per_template_load_cost_unit: 0,
per_substate_create_cost: 0,
per_wasm_point_cost: 0,
storage_cost_divisor: 1,
template_load_bytes_cost_divisor: 1,
wasm_points_cost_divisor: 1,
template_size_premium_free_bytes: 0,
template_size_premium_unit_bytes: 1,
per_template_size_premium_unit_cost: 0,
}
}
pub fn per_transaction_weight_cost(&self) -> u64 {
self.per_transaction_weight_cost
}
pub fn per_module_call_cost(&self) -> u64 {
self.per_module_call_cost
}
pub fn per_byte_storage_cost(&self) -> u64 {
self.per_byte_storage_cost
}
pub fn per_signature_verification_cost(&self) -> u64 {
self.per_signature_verification_cost
}
pub fn per_template_load_cost_unit(&self) -> u64 {
self.per_template_load_cost_unit
}
pub fn per_substate_create_cost(&self) -> u64 {
self.per_substate_create_cost
}
pub fn per_wasm_point_cost(&self) -> u64 {
self.per_wasm_point_cost
}
pub fn storage_cost_divisor(&self) -> u64 {
non_zero(self.storage_cost_divisor)
}
pub fn template_load_bytes_cost_divisor(&self) -> u64 {
non_zero(self.template_load_bytes_cost_divisor)
}
pub fn wasm_points_cost_divisor(&self) -> u64 {
non_zero(self.wasm_points_cost_divisor)
}
pub fn template_size_premium_free_bytes(&self) -> u64 {
self.template_size_premium_free_bytes
}
pub fn template_size_premium_unit_bytes(&self) -> u64 {
non_zero(self.template_size_premium_unit_bytes)
}
pub fn per_template_size_premium_unit_cost(&self) -> u64 {
self.per_template_size_premium_unit_cost
}
}
fn non_zero(divisor: u64) -> u64 {
divisor.max(1)
}
#[derive(Debug, Clone, Copy)]
pub struct WasmMeteringRate {
per_point_cost: u64,
points_divisor: u64,
}
impl WasmMeteringRate {
pub fn from_fee_table(fee_table: &FeeTable) -> Self {
Self {
per_point_cost: fee_table.per_wasm_point_cost(),
points_divisor: fee_table.wasm_points_cost_divisor(),
}
}
pub fn unmetered() -> Self {
Self {
per_point_cost: 0,
points_divisor: 1,
}
}
pub fn points_funded_by(&self, fees_paid: u64) -> Option<u64> {
if self.per_point_cost == 0 {
return None;
}
let funded =
u128::from(fees_paid).saturating_mul(u128::from(self.points_divisor)) / u128::from(self.per_point_cost);
Some(u64::try_from(funded).unwrap_or(u64::MAX))
}
}