mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 19:09:54 +00:00
chore(txpool): move basefee to u64 (#3872)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
This commit is contained in:
@ -581,7 +581,7 @@ fn build_payload<Pool, Client>(
|
|||||||
let base_fee = initialized_block_env.basefee.to::<u64>();
|
let base_fee = initialized_block_env.basefee.to::<u64>();
|
||||||
|
|
||||||
let mut executed_txs = Vec::new();
|
let mut executed_txs = Vec::new();
|
||||||
let mut best_txs = pool.best_transactions_with_base_fee(base_fee as u128);
|
let mut best_txs = pool.best_transactions_with_base_fee(base_fee);
|
||||||
|
|
||||||
let mut total_fees = U256::ZERO;
|
let mut total_fees = U256::ZERO;
|
||||||
|
|
||||||
|
|||||||
@ -39,7 +39,7 @@ pub const ETHEREUM_BLOCK_GAS_LIMIT: u64 = 30_000_000;
|
|||||||
/// The `BASE_FEE_MAX_CHANGE_DENOMINATOR` <https://eips.ethereum.org/EIPS/eip-1559> is `8`, or 12.5%.
|
/// The `BASE_FEE_MAX_CHANGE_DENOMINATOR` <https://eips.ethereum.org/EIPS/eip-1559> is `8`, or 12.5%.
|
||||||
/// Once the base fee has dropped to `7` WEI it cannot decrease further because 12.5% of 7 is less
|
/// Once the base fee has dropped to `7` WEI it cannot decrease further because 12.5% of 7 is less
|
||||||
/// than 1.
|
/// than 1.
|
||||||
pub const MIN_PROTOCOL_BASE_FEE: u128 = 7;
|
pub const MIN_PROTOCOL_BASE_FEE: u64 = 7;
|
||||||
|
|
||||||
/// Same as [MIN_PROTOCOL_BASE_FEE] but as a U256.
|
/// Same as [MIN_PROTOCOL_BASE_FEE] but as a U256.
|
||||||
pub const MIN_PROTOCOL_BASE_FEE_U256: U256 = U256::from_limbs([7u64, 0, 0, 0]);
|
pub const MIN_PROTOCOL_BASE_FEE_U256: U256 = U256::from_limbs([7u64, 0, 0, 0]);
|
||||||
@ -114,6 +114,6 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn min_protocol_sanity() {
|
fn min_protocol_sanity() {
|
||||||
assert_eq!(MIN_PROTOCOL_BASE_FEE_U256.to::<u128>(), MIN_PROTOCOL_BASE_FEE);
|
assert_eq!(MIN_PROTOCOL_BASE_FEE_U256.to::<u64>(), MIN_PROTOCOL_BASE_FEE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -462,7 +462,7 @@ impl Transaction {
|
|||||||
///
|
///
|
||||||
/// This is different than the `max_priority_fee_per_gas` method, which returns `None` for
|
/// This is different than the `max_priority_fee_per_gas` method, which returns `None` for
|
||||||
/// non-EIP-1559 transactions.
|
/// non-EIP-1559 transactions.
|
||||||
pub(crate) fn priority_fee_or_price(&self) -> u128 {
|
pub fn priority_fee_or_price(&self) -> u128 {
|
||||||
match self {
|
match self {
|
||||||
Transaction::Legacy(TxLegacy { gas_price, .. }) |
|
Transaction::Legacy(TxLegacy { gas_price, .. }) |
|
||||||
Transaction::Eip2930(TxEip2930 { gas_price, .. }) => *gas_price,
|
Transaction::Eip2930(TxEip2930 { gas_price, .. }) => *gas_price,
|
||||||
|
|||||||
@ -50,7 +50,7 @@ impl PendingBlockEnv {
|
|||||||
let block_number = block_env.number.to::<u64>();
|
let block_number = block_env.number.to::<u64>();
|
||||||
|
|
||||||
let mut executed_txs = Vec::new();
|
let mut executed_txs = Vec::new();
|
||||||
let mut best_txs = pool.best_transactions_with_base_fee(base_fee as u128);
|
let mut best_txs = pool.best_transactions_with_base_fee(base_fee);
|
||||||
|
|
||||||
while let Some(pool_tx) = best_txs.next() {
|
while let Some(pool_tx) = best_txs.next() {
|
||||||
// ensure we still have capacity for this transaction
|
// ensure we still have capacity for this transaction
|
||||||
|
|||||||
@ -399,7 +399,7 @@ where
|
|||||||
|
|
||||||
fn best_transactions_with_base_fee(
|
fn best_transactions_with_base_fee(
|
||||||
&self,
|
&self,
|
||||||
base_fee: u128,
|
base_fee: u64,
|
||||||
) -> Box<dyn BestTransactions<Item = Arc<ValidPoolTransaction<Self::Transaction>>>> {
|
) -> Box<dyn BestTransactions<Item = Arc<ValidPoolTransaction<Self::Transaction>>>> {
|
||||||
self.pool.best_transactions_with_base_fee(base_fee)
|
self.pool.best_transactions_with_base_fee(base_fee)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -83,7 +83,7 @@ pub async fn maintain_transaction_pool<Client, P, St, Tasks>(
|
|||||||
let info = BlockInfo {
|
let info = BlockInfo {
|
||||||
last_seen_block_hash: latest.hash,
|
last_seen_block_hash: latest.hash,
|
||||||
last_seen_block_number: latest.number,
|
last_seen_block_number: latest.number,
|
||||||
pending_basefee: latest.next_block_base_fee().unwrap_or_default() as u128,
|
pending_basefee: latest.next_block_base_fee().unwrap_or_default(),
|
||||||
};
|
};
|
||||||
pool.set_block_info(info);
|
pool.set_block_info(info);
|
||||||
}
|
}
|
||||||
@ -205,8 +205,7 @@ pub async fn maintain_transaction_pool<Client, P, St, Tasks>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// base fee for the next block: `new_tip+1`
|
// base fee for the next block: `new_tip+1`
|
||||||
let pending_block_base_fee =
|
let pending_block_base_fee = new_tip.next_block_base_fee().unwrap_or_default();
|
||||||
new_tip.next_block_base_fee().unwrap_or_default() as u128;
|
|
||||||
|
|
||||||
// we know all changed account in the new chain
|
// we know all changed account in the new chain
|
||||||
let new_changed_accounts: HashSet<_> =
|
let new_changed_accounts: HashSet<_> =
|
||||||
@ -282,7 +281,7 @@ pub async fn maintain_transaction_pool<Client, P, St, Tasks>(
|
|||||||
let tip = blocks.tip();
|
let tip = blocks.tip();
|
||||||
|
|
||||||
// base fee for the next block: `tip+1`
|
// base fee for the next block: `tip+1`
|
||||||
let pending_block_base_fee = tip.next_block_base_fee().unwrap_or_default() as u128;
|
let pending_block_base_fee = tip.next_block_base_fee().unwrap_or_default();
|
||||||
|
|
||||||
let first_block = blocks.first();
|
let first_block = blocks.first();
|
||||||
trace!(
|
trace!(
|
||||||
|
|||||||
@ -112,7 +112,7 @@ impl TransactionPool for NoopTransactionPool {
|
|||||||
|
|
||||||
fn best_transactions_with_base_fee(
|
fn best_transactions_with_base_fee(
|
||||||
&self,
|
&self,
|
||||||
_: u128,
|
_: u64,
|
||||||
) -> Box<dyn BestTransactions<Item = Arc<ValidPoolTransaction<Self::Transaction>>>> {
|
) -> Box<dyn BestTransactions<Item = Arc<ValidPoolTransaction<Self::Transaction>>>> {
|
||||||
Box::new(std::iter::empty())
|
Box::new(std::iter::empty())
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,7 +18,7 @@ use tracing::debug;
|
|||||||
/// This iterator guarantees that all transaction it returns satisfy the base fee.
|
/// This iterator guarantees that all transaction it returns satisfy the base fee.
|
||||||
pub(crate) struct BestTransactionsWithBasefee<T: TransactionOrdering> {
|
pub(crate) struct BestTransactionsWithBasefee<T: TransactionOrdering> {
|
||||||
pub(crate) best: BestTransactions<T>,
|
pub(crate) best: BestTransactions<T>,
|
||||||
pub(crate) base_fee: u128,
|
pub(crate) base_fee: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: TransactionOrdering> crate::traits::BestTransactions for BestTransactionsWithBasefee<T> {
|
impl<T: TransactionOrdering> crate::traits::BestTransactions for BestTransactionsWithBasefee<T> {
|
||||||
@ -34,7 +34,7 @@ impl<T: TransactionOrdering> Iterator for BestTransactionsWithBasefee<T> {
|
|||||||
// find the next transaction that satisfies the base fee
|
// find the next transaction that satisfies the base fee
|
||||||
loop {
|
loop {
|
||||||
let best = self.best.next()?;
|
let best = self.best.next()?;
|
||||||
if best.transaction.max_fee_per_gas() < self.base_fee {
|
if best.transaction.max_fee_per_gas() < self.base_fee as u128 {
|
||||||
// tx violates base fee, mark it as invalid and continue
|
// tx violates base fee, mark it as invalid and continue
|
||||||
crate::traits::BestTransactions::mark_invalid(self, &best);
|
crate::traits::BestTransactions::mark_invalid(self, &best);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -467,7 +467,7 @@ where
|
|||||||
/// the given base fee.
|
/// the given base fee.
|
||||||
pub(crate) fn best_transactions_with_base_fee(
|
pub(crate) fn best_transactions_with_base_fee(
|
||||||
&self,
|
&self,
|
||||||
base_fee: u128,
|
base_fee: u64,
|
||||||
) -> Box<dyn crate::traits::BestTransactions<Item = Arc<ValidPoolTransaction<T::Transaction>>>>
|
) -> Box<dyn crate::traits::BestTransactions<Item = Arc<ValidPoolTransaction<T::Transaction>>>>
|
||||||
{
|
{
|
||||||
self.pool.read().best_transactions_with_base_fee(base_fee)
|
self.pool.read().best_transactions_with_base_fee(base_fee)
|
||||||
|
|||||||
@ -115,7 +115,7 @@ impl<T: PoolTransaction> ParkedPool<BasefeeOrd<T>> {
|
|||||||
/// Note: this does _not_ remove the transactions
|
/// Note: this does _not_ remove the transactions
|
||||||
pub(crate) fn satisfy_base_fee_transactions(
|
pub(crate) fn satisfy_base_fee_transactions(
|
||||||
&self,
|
&self,
|
||||||
basefee: u128,
|
basefee: u64,
|
||||||
) -> Vec<Arc<ValidPoolTransaction<T>>> {
|
) -> Vec<Arc<ValidPoolTransaction<T>>> {
|
||||||
let ids = self.satisfy_base_fee_ids(basefee);
|
let ids = self.satisfy_base_fee_ids(basefee);
|
||||||
let mut txs = Vec::with_capacity(ids.len());
|
let mut txs = Vec::with_capacity(ids.len());
|
||||||
@ -126,13 +126,13 @@ impl<T: PoolTransaction> ParkedPool<BasefeeOrd<T>> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Returns all transactions that satisfy the given basefee.
|
/// Returns all transactions that satisfy the given basefee.
|
||||||
fn satisfy_base_fee_ids(&self, basefee: u128) -> Vec<TransactionId> {
|
fn satisfy_base_fee_ids(&self, basefee: u64) -> Vec<TransactionId> {
|
||||||
let mut transactions = Vec::new();
|
let mut transactions = Vec::new();
|
||||||
{
|
{
|
||||||
let mut iter = self.by_id.iter().peekable();
|
let mut iter = self.by_id.iter().peekable();
|
||||||
|
|
||||||
while let Some((id, tx)) = iter.next() {
|
while let Some((id, tx)) = iter.next() {
|
||||||
if tx.transaction.transaction.max_fee_per_gas() < basefee {
|
if tx.transaction.transaction.max_fee_per_gas() < basefee as u128 {
|
||||||
// still parked -> skip descendant transactions
|
// still parked -> skip descendant transactions
|
||||||
'this: while let Some((peek, _)) = iter.peek() {
|
'this: while let Some((peek, _)) = iter.peek() {
|
||||||
if peek.sender != id.sender {
|
if peek.sender != id.sender {
|
||||||
@ -152,7 +152,7 @@ impl<T: PoolTransaction> ParkedPool<BasefeeOrd<T>> {
|
|||||||
/// satisfy the given basefee.
|
/// satisfy the given basefee.
|
||||||
///
|
///
|
||||||
/// Note: the transactions are not returned in a particular order.
|
/// Note: the transactions are not returned in a particular order.
|
||||||
pub(crate) fn enforce_basefee(&mut self, basefee: u128) -> Vec<Arc<ValidPoolTransaction<T>>> {
|
pub(crate) fn enforce_basefee(&mut self, basefee: u64) -> Vec<Arc<ValidPoolTransaction<T>>> {
|
||||||
let to_remove = self.satisfy_base_fee_ids(basefee);
|
let to_remove = self.satisfy_base_fee_ids(basefee);
|
||||||
|
|
||||||
let mut removed = Vec::with_capacity(to_remove.len());
|
let mut removed = Vec::with_capacity(to_remove.len());
|
||||||
@ -330,10 +330,10 @@ mod tests {
|
|||||||
assert!(pool.by_id.contains_key(tx.id()));
|
assert!(pool.by_id.contains_key(tx.id()));
|
||||||
assert_eq!(pool.len(), 1);
|
assert_eq!(pool.len(), 1);
|
||||||
|
|
||||||
let removed = pool.enforce_basefee(u128::MAX);
|
let removed = pool.enforce_basefee(u64::MAX);
|
||||||
assert!(removed.is_empty());
|
assert!(removed.is_empty());
|
||||||
|
|
||||||
let removed = pool.enforce_basefee(tx.max_fee_per_gas() - 1);
|
let removed = pool.enforce_basefee((tx.max_fee_per_gas() - 1) as u64);
|
||||||
assert_eq!(removed.len(), 1);
|
assert_eq!(removed.len(), 1);
|
||||||
assert!(pool.is_empty());
|
assert!(pool.is_empty());
|
||||||
}
|
}
|
||||||
@ -353,14 +353,14 @@ mod tests {
|
|||||||
assert!(pool.by_id.contains_key(descendant_tx.id()));
|
assert!(pool.by_id.contains_key(descendant_tx.id()));
|
||||||
assert_eq!(pool.len(), 2);
|
assert_eq!(pool.len(), 2);
|
||||||
|
|
||||||
let removed = pool.enforce_basefee(u128::MAX);
|
let removed = pool.enforce_basefee(u64::MAX);
|
||||||
assert!(removed.is_empty());
|
assert!(removed.is_empty());
|
||||||
|
|
||||||
// two dependent tx in the pool with decreasing fee
|
// two dependent tx in the pool with decreasing fee
|
||||||
|
|
||||||
{
|
{
|
||||||
let mut pool2 = pool.clone();
|
let mut pool2 = pool.clone();
|
||||||
let removed = pool2.enforce_basefee(descendant_tx.max_fee_per_gas());
|
let removed = pool2.enforce_basefee(descendant_tx.max_fee_per_gas() as u64);
|
||||||
assert_eq!(removed.len(), 1);
|
assert_eq!(removed.len(), 1);
|
||||||
assert_eq!(pool2.len(), 1);
|
assert_eq!(pool2.len(), 1);
|
||||||
// descendant got popped
|
// descendant got popped
|
||||||
@ -369,7 +369,7 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// remove root transaction via root tx fee
|
// remove root transaction via root tx fee
|
||||||
let removed = pool.enforce_basefee(root_tx.max_fee_per_gas());
|
let removed = pool.enforce_basefee(root_tx.max_fee_per_gas() as u64);
|
||||||
assert_eq!(removed.len(), 2);
|
assert_eq!(removed.len(), 2);
|
||||||
assert!(pool.is_empty());
|
assert!(pool.is_empty());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -86,7 +86,7 @@ impl<T: TransactionOrdering> PendingPool<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Same as `best` but only returns transactions that satisfy the given basefee.
|
/// Same as `best` but only returns transactions that satisfy the given basefee.
|
||||||
pub(crate) fn best_with_basefee(&self, base_fee: u128) -> BestTransactionsWithBasefee<T> {
|
pub(crate) fn best_with_basefee(&self, base_fee: u64) -> BestTransactionsWithBasefee<T> {
|
||||||
BestTransactionsWithBasefee { best: self.best(), base_fee }
|
BestTransactionsWithBasefee { best: self.best(), base_fee }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,14 +135,14 @@ impl<T: TransactionOrdering> PendingPool<T> {
|
|||||||
/// Note: the transactions are not returned in a particular order.
|
/// Note: the transactions are not returned in a particular order.
|
||||||
pub(crate) fn enforce_basefee(
|
pub(crate) fn enforce_basefee(
|
||||||
&mut self,
|
&mut self,
|
||||||
basefee: u128,
|
basefee: u64,
|
||||||
) -> Vec<Arc<ValidPoolTransaction<T::Transaction>>> {
|
) -> Vec<Arc<ValidPoolTransaction<T::Transaction>>> {
|
||||||
let mut to_remove = Vec::new();
|
let mut to_remove = Vec::new();
|
||||||
|
|
||||||
{
|
{
|
||||||
let mut iter = self.by_id.iter().peekable();
|
let mut iter = self.by_id.iter().peekable();
|
||||||
while let Some((id, tx)) = iter.next() {
|
while let Some((id, tx)) = iter.next() {
|
||||||
if tx.transaction.transaction.max_fee_per_gas() < basefee {
|
if tx.transaction.transaction.max_fee_per_gas() < basefee as u128 {
|
||||||
// this transaction no longer satisfies the basefee: remove it and all its
|
// this transaction no longer satisfies the basefee: remove it and all its
|
||||||
// descendants
|
// descendants
|
||||||
to_remove.push(*id);
|
to_remove.push(*id);
|
||||||
@ -346,7 +346,7 @@ mod tests {
|
|||||||
let removed = pool.enforce_basefee(0);
|
let removed = pool.enforce_basefee(0);
|
||||||
assert!(removed.is_empty());
|
assert!(removed.is_empty());
|
||||||
|
|
||||||
let removed = pool.enforce_basefee(tx.max_fee_per_gas() + 1);
|
let removed = pool.enforce_basefee((tx.max_fee_per_gas() + 1) as u64);
|
||||||
assert_eq!(removed.len(), 1);
|
assert_eq!(removed.len(), 1);
|
||||||
assert!(pool.is_empty());
|
assert!(pool.is_empty());
|
||||||
}
|
}
|
||||||
@ -375,7 +375,7 @@ mod tests {
|
|||||||
|
|
||||||
{
|
{
|
||||||
let mut pool2 = pool.clone();
|
let mut pool2 = pool.clone();
|
||||||
let removed = pool2.enforce_basefee(descendant_tx.max_fee_per_gas() + 1);
|
let removed = pool2.enforce_basefee((descendant_tx.max_fee_per_gas() + 1) as u64);
|
||||||
assert_eq!(removed.len(), 1);
|
assert_eq!(removed.len(), 1);
|
||||||
assert_eq!(pool2.len(), 1);
|
assert_eq!(pool2.len(), 1);
|
||||||
// descendant got popped
|
// descendant got popped
|
||||||
@ -384,7 +384,7 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// remove root transaction via fee
|
// remove root transaction via fee
|
||||||
let removed = pool.enforce_basefee(root_tx.max_fee_per_gas() + 1);
|
let removed = pool.enforce_basefee((root_tx.max_fee_per_gas() + 1) as u64);
|
||||||
assert_eq!(removed.len(), 2);
|
assert_eq!(removed.len(), 2);
|
||||||
assert!(pool.is_empty());
|
assert!(pool.is_empty());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -142,7 +142,7 @@ impl<T: TransactionOrdering> TxPool<T> {
|
|||||||
///
|
///
|
||||||
/// Depending on the change in direction of the basefee, this will promote or demote
|
/// Depending on the change in direction of the basefee, this will promote or demote
|
||||||
/// transactions from the basefee pool.
|
/// transactions from the basefee pool.
|
||||||
fn update_basefee(&mut self, pending_basefee: u128) {
|
fn update_basefee(&mut self, pending_basefee: u64) {
|
||||||
match pending_basefee.cmp(&self.all_transactions.pending_basefee) {
|
match pending_basefee.cmp(&self.all_transactions.pending_basefee) {
|
||||||
Ordering::Equal => {
|
Ordering::Equal => {
|
||||||
// fee unchanged, nothing to update
|
// fee unchanged, nothing to update
|
||||||
@ -195,7 +195,7 @@ impl<T: TransactionOrdering> TxPool<T> {
|
|||||||
/// the given base fee.
|
/// the given base fee.
|
||||||
pub(crate) fn best_transactions_with_base_fee(
|
pub(crate) fn best_transactions_with_base_fee(
|
||||||
&self,
|
&self,
|
||||||
basefee: u128,
|
basefee: u64,
|
||||||
) -> Box<dyn crate::traits::BestTransactions<Item = Arc<ValidPoolTransaction<T::Transaction>>>>
|
) -> Box<dyn crate::traits::BestTransactions<Item = Arc<ValidPoolTransaction<T::Transaction>>>>
|
||||||
{
|
{
|
||||||
match basefee.cmp(&self.all_transactions.pending_basefee) {
|
match basefee.cmp(&self.all_transactions.pending_basefee) {
|
||||||
@ -649,7 +649,7 @@ pub(crate) struct AllTransactions<T: PoolTransaction> {
|
|||||||
/// Minimum base fee required by the protocol.
|
/// Minimum base fee required by the protocol.
|
||||||
///
|
///
|
||||||
/// Transactions with a lower base fee will never be included by the chain
|
/// Transactions with a lower base fee will never be included by the chain
|
||||||
minimal_protocol_basefee: u128,
|
minimal_protocol_basefee: u64,
|
||||||
/// The max gas limit of the block
|
/// The max gas limit of the block
|
||||||
block_gas_limit: u64,
|
block_gas_limit: u64,
|
||||||
/// Max number of executable transaction slots guaranteed per account
|
/// Max number of executable transaction slots guaranteed per account
|
||||||
@ -665,7 +665,7 @@ pub(crate) struct AllTransactions<T: PoolTransaction> {
|
|||||||
/// The current block hash the pool keeps track of.
|
/// The current block hash the pool keeps track of.
|
||||||
last_seen_block_hash: H256,
|
last_seen_block_hash: H256,
|
||||||
/// Expected base fee for the pending block.
|
/// Expected base fee for the pending block.
|
||||||
pending_basefee: u128,
|
pending_basefee: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: PoolTransaction> AllTransactions<T> {
|
impl<T: PoolTransaction> AllTransactions<T> {
|
||||||
@ -812,7 +812,7 @@ impl<T: PoolTransaction> AllTransactions<T> {
|
|||||||
tx.state.insert(TxState::NO_PARKED_ANCESTORS);
|
tx.state.insert(TxState::NO_PARKED_ANCESTORS);
|
||||||
|
|
||||||
// Update the first transaction of this sender.
|
// Update the first transaction of this sender.
|
||||||
Self::update_tx_base_fee(&self.pending_basefee, tx);
|
Self::update_tx_base_fee(self.pending_basefee, tx);
|
||||||
// Track if the transaction's sub-pool changed.
|
// Track if the transaction's sub-pool changed.
|
||||||
Self::record_subpool_update(&mut updates, tx);
|
Self::record_subpool_update(&mut updates, tx);
|
||||||
|
|
||||||
@ -858,7 +858,7 @@ impl<T: PoolTransaction> AllTransactions<T> {
|
|||||||
has_parked_ancestor = !tx.state.is_pending();
|
has_parked_ancestor = !tx.state.is_pending();
|
||||||
|
|
||||||
// Update and record sub-pool changes.
|
// Update and record sub-pool changes.
|
||||||
Self::update_tx_base_fee(&self.pending_basefee, tx);
|
Self::update_tx_base_fee(self.pending_basefee, tx);
|
||||||
Self::record_subpool_update(&mut updates, tx);
|
Self::record_subpool_update(&mut updates, tx);
|
||||||
|
|
||||||
// Advance iterator
|
// Advance iterator
|
||||||
@ -887,9 +887,9 @@ impl<T: PoolTransaction> AllTransactions<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Rechecks the transaction's dynamic fee condition.
|
/// Rechecks the transaction's dynamic fee condition.
|
||||||
fn update_tx_base_fee(pending_block_base_fee: &u128, tx: &mut PoolInternalTransaction<T>) {
|
fn update_tx_base_fee(pending_block_base_fee: u64, tx: &mut PoolInternalTransaction<T>) {
|
||||||
// Recheck dynamic fee condition.
|
// Recheck dynamic fee condition.
|
||||||
match tx.transaction.max_fee_per_gas().cmp(pending_block_base_fee) {
|
match tx.transaction.max_fee_per_gas().cmp(&(pending_block_base_fee as u128)) {
|
||||||
Ordering::Greater | Ordering::Equal => {
|
Ordering::Greater | Ordering::Equal => {
|
||||||
tx.state.insert(TxState::ENOUGH_FEE_CAP_BLOCK);
|
tx.state.insert(TxState::ENOUGH_FEE_CAP_BLOCK);
|
||||||
}
|
}
|
||||||
@ -1070,10 +1070,10 @@ impl<T: PoolTransaction> AllTransactions<T> {
|
|||||||
// Check dynamic fee
|
// Check dynamic fee
|
||||||
let fee_cap = transaction.max_fee_per_gas();
|
let fee_cap = transaction.max_fee_per_gas();
|
||||||
|
|
||||||
if fee_cap < self.minimal_protocol_basefee {
|
if fee_cap < self.minimal_protocol_basefee as u128 {
|
||||||
return Err(InsertErr::FeeCapBelowMinimumProtocolFeeCap { transaction, fee_cap })
|
return Err(InsertErr::FeeCapBelowMinimumProtocolFeeCap { transaction, fee_cap })
|
||||||
}
|
}
|
||||||
if fee_cap >= self.pending_basefee {
|
if fee_cap >= self.pending_basefee as u128 {
|
||||||
state.insert(TxState::ENOUGH_FEE_CAP_BLOCK);
|
state.insert(TxState::ENOUGH_FEE_CAP_BLOCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1570,7 +1570,7 @@ mod tests {
|
|||||||
|
|
||||||
let first_in_pool = pool.get(first.id()).unwrap();
|
let first_in_pool = pool.get(first.id()).unwrap();
|
||||||
|
|
||||||
assert!(tx.get_gas_price() < pool.pending_basefee);
|
assert!(tx.get_gas_price() < pool.pending_basefee as u128);
|
||||||
// has nonce gap
|
// has nonce gap
|
||||||
assert!(!first_in_pool.state.contains(TxState::NO_NONCE_GAPS));
|
assert!(!first_in_pool.state.contains(TxState::NO_NONCE_GAPS));
|
||||||
|
|
||||||
@ -1671,7 +1671,7 @@ mod tests {
|
|||||||
|
|
||||||
assert_eq!(pool.pending_pool.len(), 1);
|
assert_eq!(pool.pending_pool.len(), 1);
|
||||||
|
|
||||||
pool.update_basefee(tx.max_fee_per_gas() + 1);
|
pool.update_basefee((tx.max_fee_per_gas() + 1) as u64);
|
||||||
|
|
||||||
assert!(pool.pending_pool.is_empty());
|
assert!(pool.pending_pool.is_empty());
|
||||||
assert_eq!(pool.basefee_pool.len(), 1);
|
assert_eq!(pool.basefee_pool.len(), 1);
|
||||||
|
|||||||
@ -131,8 +131,8 @@ impl MockTransaction {
|
|||||||
hash: H256::random(),
|
hash: H256::random(),
|
||||||
sender: Address::random(),
|
sender: Address::random(),
|
||||||
nonce: 0,
|
nonce: 0,
|
||||||
max_fee_per_gas: MIN_PROTOCOL_BASE_FEE,
|
max_fee_per_gas: MIN_PROTOCOL_BASE_FEE as u128,
|
||||||
max_priority_fee_per_gas: MIN_PROTOCOL_BASE_FEE,
|
max_priority_fee_per_gas: MIN_PROTOCOL_BASE_FEE as u128,
|
||||||
gas_limit: 0,
|
gas_limit: 0,
|
||||||
to: TransactionKind::Call(Address::random()),
|
to: TransactionKind::Call(Address::random()),
|
||||||
value: Default::default(),
|
value: Default::default(),
|
||||||
|
|||||||
@ -181,7 +181,7 @@ pub trait TransactionPool: Send + Sync + Clone {
|
|||||||
/// Consumer: Block production
|
/// Consumer: Block production
|
||||||
fn best_transactions_with_base_fee(
|
fn best_transactions_with_base_fee(
|
||||||
&self,
|
&self,
|
||||||
base_fee: u128,
|
base_fee: u64,
|
||||||
) -> Box<dyn BestTransactions<Item = Arc<ValidPoolTransaction<Self::Transaction>>>>;
|
) -> Box<dyn BestTransactions<Item = Arc<ValidPoolTransaction<Self::Transaction>>>>;
|
||||||
|
|
||||||
/// Returns all transactions that can be included in the next block.
|
/// Returns all transactions that can be included in the next block.
|
||||||
@ -397,7 +397,7 @@ pub struct CanonicalStateUpdate {
|
|||||||
/// EIP-1559 Base fee of the _next_ (pending) block
|
/// EIP-1559 Base fee of the _next_ (pending) block
|
||||||
///
|
///
|
||||||
/// The base fee of a block depends on the utilization of the last block and its base fee.
|
/// The base fee of a block depends on the utilization of the last block and its base fee.
|
||||||
pub pending_block_base_fee: u128,
|
pub pending_block_base_fee: u64,
|
||||||
/// A set of changed accounts across a range of blocks.
|
/// A set of changed accounts across a range of blocks.
|
||||||
pub changed_accounts: Vec<ChangedAccount>,
|
pub changed_accounts: Vec<ChangedAccount>,
|
||||||
/// All mined transactions in the block range.
|
/// All mined transactions in the block range.
|
||||||
@ -677,7 +677,7 @@ pub struct BlockInfo {
|
|||||||
///
|
///
|
||||||
/// Note: this is the derived base fee of the _next_ block that builds on the clock the pool is
|
/// Note: this is the derived base fee of the _next_ block that builds on the clock the pool is
|
||||||
/// currently tracking.
|
/// currently tracking.
|
||||||
pub pending_basefee: u128,
|
pub pending_basefee: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A Stream that yields full transactions the subpool
|
/// A Stream that yields full transactions the subpool
|
||||||
|
|||||||
@ -164,7 +164,7 @@ impl<T: PoolTransaction> ValidPoolTransaction<T> {
|
|||||||
self.transaction.cost()
|
self.transaction.cost()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the gas cost for this transaction.
|
/// Returns the effective tip for this transaction.
|
||||||
///
|
///
|
||||||
/// For EIP-1559 transactions: `max_fee_per_gas * gas_limit`.
|
/// For EIP-1559 transactions: `max_fee_per_gas * gas_limit`.
|
||||||
/// For legacy transactions: `gas_price * gas_limit`.
|
/// For legacy transactions: `gas_price * gas_limit`.
|
||||||
|
|||||||
Reference in New Issue
Block a user