Skip to main content

forest/message_pool/msgpool/
utils.rs

1// Copyright 2019-2026 ChainSafe Systems
2// SPDX-License-Identifier: Apache-2.0, MIT
3
4use crate::chain::MINIMUM_BASE_FEE;
5use crate::message::{Message as MessageTrait, SignedMessage};
6use crate::shim::{crypto::Signature, econ::TokenAmount, message::Message};
7use crate::utils::cache::SizeTrackingLruCache;
8use crate::utils::get_size::CidWrapper;
9use num_rational::BigRational;
10use num_traits::ToPrimitive;
11
12use crate::message_pool::Error;
13
14pub(in crate::message_pool) fn get_base_fee_lower_bound(
15    base_fee: &TokenAmount,
16    factor: i64,
17) -> TokenAmount {
18    let base_fee_lower_bound = base_fee.div_floor(factor);
19    if base_fee_lower_bound.atto() < &MINIMUM_BASE_FEE.into() {
20        TokenAmount::from_atto(MINIMUM_BASE_FEE)
21    } else {
22        base_fee_lower_bound
23    }
24}
25
26/// Gets the gas reward for the given message.
27pub(in crate::message_pool) fn get_gas_reward(
28    msg: &SignedMessage,
29    base_fee: &TokenAmount,
30) -> TokenAmount {
31    let mut max_prem = msg.gas_fee_cap() - base_fee;
32    if max_prem < msg.gas_premium() {
33        max_prem = msg.gas_premium();
34    }
35    max_prem * msg.gas_limit()
36}
37
38pub(in crate::message_pool) fn get_gas_perf(gas_reward: &TokenAmount, gas_limit: u64) -> f64 {
39    let a = BigRational::new(
40        gas_reward.atto() * crate::shim::econ::BLOCK_GAS_LIMIT,
41        gas_limit.into(),
42    );
43    a.to_f64().unwrap()
44}
45
46/// Attempt to get a signed message that corresponds to an unsigned message in
47/// `bls_sig_cache`.
48pub(in crate::message_pool) fn recover_sig(
49    bls_sig_cache: &SizeTrackingLruCache<CidWrapper, Signature>,
50    msg: Message,
51) -> Result<SignedMessage, Error> {
52    let val = bls_sig_cache
53        .get_cloned(&(msg.cid()).into())
54        .ok_or_else(|| Error::Other("Could not recover sig".to_owned()))?;
55    let smsg = SignedMessage::new_from_parts(msg, val)?;
56    Ok(smsg)
57}