Skip to main content

revm_primitives/
lib.rs

1//! # revm-primitives
2//!
3//! Core primitive types and constants for the Ethereum Virtual Machine (EVM) implementation.
4//!
5//! This crate provides:
6//! - EVM constants and limits (gas, stack, code size)
7//! - Ethereum hard fork management and version control
8//! - EIP-specific constants and configuration values
9//! - Cross-platform synchronization primitives
10//! - Type aliases for common EVM concepts (storage keys/values)
11//! - Re-exports of alloy primitive types for convenience
12#![cfg_attr(not(test), warn(unused_crate_dependencies))]
13#![cfg_attr(not(feature = "std"), no_std)]
14
15#[cfg(not(feature = "std"))]
16extern crate alloc as std;
17
18pub mod constants;
19pub mod eip170;
20pub mod eip3860;
21pub mod eip4844;
22pub mod eip7702;
23pub mod eip7708;
24pub mod eip7823;
25pub mod eip7825;
26pub mod eip7907;
27pub mod eip7954;
28pub mod hardfork;
29pub mod hints_util;
30mod once_lock;
31
32pub use constants::*;
33pub use once_lock::OnceLock;
34
35// Reexport alloy primitives.
36
37pub use alloy_primitives::{
38    self, address, b256, bytes, fixed_bytes, hex, hex_literal, keccak256,
39    map::{
40        self, hash_map, hash_set, indexmap, AddressIndexMap, AddressMap, AddressSet, B256Map,
41        HashMap, HashSet, IndexMap, U256Map,
42    },
43    ruint, uint, Address, Bytes, FixedBytes, Log, LogData, TxKind, B256, I128, I256, U128, U256,
44};
45
46/// Type alias for EVM storage keys (256-bit unsigned integers).
47/// Used to identify storage slots within smart contract storage.
48pub type StorageKey = U256;
49
50/// Type alias for EVM storage values (256-bit unsigned integers).
51/// Used to store data values in smart contract storage slots.
52pub type StorageValue = U256;
53
54/// Type alias for a map with storage keys (U256) as keys.
55pub type StorageKeyMap<V> = U256Map<V>;
56
57/// Optimize short address access.
58pub const SHORT_ADDRESS_CAP: usize = 300;
59
60/// Returns the short address from Address.
61///
62/// Short address is considered address that has 18 leading zeros
63/// and last two bytes are less than [`SHORT_ADDRESS_CAP`].
64#[inline]
65pub fn short_address(address: &Address) -> Option<usize> {
66    if address[..18].iter().all(|b| *b == 0) {
67        let short_address = u16::from_be_bytes([address[18], address[19]]) as usize;
68        if short_address < SHORT_ADDRESS_CAP {
69            return Some(short_address);
70        }
71    }
72    None
73}
74
75/// 1 ether = 10^18 wei
76pub const ONE_ETHER: u128 = 1_000_000_000_000_000_000;
77
78/// 1 gwei = 10^9 wei
79pub const ONE_GWEI: u128 = 1_000_000_000;