revm_primitives/
eof.rs

1//! EOF related constants and functions.
2use crate::{keccak256, Address, B256};
3
4/// TXCREATE transaction type.
5pub const INITCODE_TX_TYPE: u8 = 0x06;
6/// Maximum number of initcode in TXCREATE transactions.
7pub const MAX_INITCODE_COUNT: usize = 256;
8
9/// Calculated new EOF address from address and salt.
10///
11/// Buffer that is hashed is 65 bytes long. First bytes is magic number 0xFF,
12/// than comes 12 zeros, than 20 byte of address and in the end 32 bytes of salt.
13///
14///
15/// | 0xFF | zero padding (12 bytes) | Address (20 bytes) | salt (32 bytes).
16#[inline]
17pub fn new_eof_address(address: Address, salt: B256) -> Address {
18    let mut buffer = [0; 65];
19    buffer[0] = 0xff;
20    // 1..13 are padded zeroes
21    buffer[13..33].copy_from_slice(address.as_ref());
22    buffer[33..].copy_from_slice(salt.as_ref());
23    Address::from_word(keccak256(buffer))
24}
25
26#[cfg(test)]
27mod tests {
28    use super::*;
29    use alloy_primitives::{address, b256};
30
31    #[test]
32    fn test_new_eof_address() {
33        let address = address!("0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
34        let salt = b256!("0x0000000000000000000000000000000000000000000000000000000000000000");
35        let eof_address = new_eof_address(address, salt);
36        assert_eq!(
37            eof_address,
38            address!("0x02b6826e9392ee6bf6479e413c570846ab0107ec")
39        );
40    }
41}