revm_interpreter/interpreter_action/
create_inputs.rs1use context_interface::CreateScheme;
2use core::cell::OnceCell;
3use primitives::{Address, Bytes, U256};
4
5#[derive(Clone, Debug, Default, PartialEq, Eq)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8pub struct CreateInputs {
9 caller: Address,
11 scheme: CreateScheme,
13 value: U256,
15 init_code: Bytes,
17 gas_limit: u64,
19 #[cfg_attr(feature = "serde", serde(skip))]
22 cached_address: OnceCell<Address>,
23}
24
25impl CreateInputs {
26 pub fn new(
28 caller: Address,
29 scheme: CreateScheme,
30 value: U256,
31 init_code: Bytes,
32 gas_limit: u64,
33 ) -> Self {
34 Self {
35 caller,
36 scheme,
37 value,
38 init_code,
39 gas_limit,
40 cached_address: OnceCell::new(),
41 }
42 }
43
44 pub fn created_address(&self, nonce: u64) -> Address {
48 *self.cached_address.get_or_init(|| match self.scheme {
49 CreateScheme::Create => self.caller.create(nonce),
50 CreateScheme::Create2 { salt } => self
51 .caller
52 .create2_from_code(salt.to_be_bytes(), &self.init_code),
53 CreateScheme::Custom { address } => address,
54 })
55 }
56
57 pub fn caller(&self) -> Address {
59 self.caller
60 }
61
62 pub fn scheme(&self) -> CreateScheme {
64 self.scheme
65 }
66
67 pub fn value(&self) -> U256 {
69 self.value
70 }
71
72 pub fn init_code(&self) -> &Bytes {
74 &self.init_code
75 }
76
77 pub fn gas_limit(&self) -> u64 {
79 self.gas_limit
80 }
81
82 pub fn set_call(&mut self, caller: Address) {
84 self.caller = caller;
85 self.cached_address = OnceCell::new();
86 }
87
88 pub fn set_scheme(&mut self, scheme: CreateScheme) {
90 self.scheme = scheme;
91 self.cached_address = OnceCell::new();
92 }
93
94 pub fn set_value(&mut self, value: U256) {
96 self.value = value;
97 }
98
99 pub fn set_init_code(&mut self, init_code: Bytes) {
101 self.init_code = init_code;
102 self.cached_address = OnceCell::new();
103 }
104
105 pub fn set_gas_limit(&mut self, gas_limit: u64) {
107 self.gas_limit = gas_limit;
108 }
109}