use vapory_types::{U256, H256, Address};
use tetsy_util_mem::MallocSizeOfExt;
use types::transaction;
use txpool;
mod listener;
mod queue;
mod ready;
pub mod client;
pub mod local_transactions;
pub mod replace;
pub mod scoring;
pub mod verifier;
#[cfg(test)]
mod tests;
pub use self::queue::{TransactionQueue, Status as QueueStatus};
pub use self::txpool::{VerifiedTransaction as PoolVerifiedTransaction, Options};
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum PrioritizationStrategy {
GasPriceOnly,
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum PendingOrdering {
Priority,
Unordered,
}
#[derive(Debug, Clone)]
pub struct PendingSettings {
pub block_number: u64,
pub current_timestamp: u64,
pub nonce_cap: Option<U256>,
pub max_len: usize,
pub ordering: PendingOrdering,
}
impl PendingSettings {
pub fn all_prioritized(block_number: u64, current_timestamp: u64) -> Self {
PendingSettings {
block_number,
current_timestamp,
nonce_cap: None,
max_len: usize::max_value(),
ordering: PendingOrdering::Priority,
}
}
}
#[derive(Debug, PartialEq, Eq, PartialOrd, Clone, Copy)]
pub enum Priority {
Regular,
Retracted,
Local,
}
impl Priority {
fn is_local(&self) -> bool {
match *self {
Priority::Local => true,
_ => false,
}
}
}
pub trait ScoredTransaction {
fn priority(&self) -> Priority;
fn gas_price(&self) -> &U256;
fn nonce(&self) -> U256;
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct VerifiedTransaction {
transaction: transaction::PendingTransaction,
hash: H256,
sender: Address,
priority: Priority,
insertion_id: usize,
}
impl VerifiedTransaction {
pub fn from_pending_block_transaction(tx: transaction::SignedTransaction) -> Self {
let hash = tx.hash();
let sender = tx.sender();
VerifiedTransaction {
transaction: tx.into(),
hash,
sender,
priority: Priority::Retracted,
insertion_id: 0,
}
}
pub(crate) fn insertion_id(&self) -> usize {
self.insertion_id
}
pub fn signed(&self) -> &transaction::SignedTransaction {
&self.transaction
}
pub fn pending(&self) -> &transaction::PendingTransaction {
&self.transaction
}
}
impl txpool::VerifiedTransaction for VerifiedTransaction {
type Hash = H256;
type Sender = Address;
fn hash(&self) -> &H256 {
&self.hash
}
fn mem_usage(&self) -> usize {
self.transaction.malloc_size_of()
}
fn sender(&self) -> &Address {
&self.sender
}
}
impl ScoredTransaction for VerifiedTransaction {
fn priority(&self) -> Priority {
self.priority
}
fn gas_price(&self) -> &U256 {
&self.transaction.gas_price
}
fn nonce(&self) -> U256 {
self.transaction.nonce
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum TxStatus {
Added,
Rejected,
Dropped,
Invalid,
Canceled,
Culled,
}