revm_interpreter/interpreter_action/
create_inputs.rs1use context_interface::CreateScheme;
2use core::cell::OnceCell;
3use primitives::{keccak256, Address, Bytes, B256, 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 reservoir: u64,
21 charged_create_state_gas: bool,
26 #[cfg_attr(feature = "serde", serde(skip))]
29 cached_address: OnceCell<Address>,
30 #[cfg_attr(feature = "serde", serde(skip))]
34 cached_init_code_hash: OnceCell<B256>,
35}
36
37impl CreateInputs {
38 pub const fn new(
40 caller: Address,
41 scheme: CreateScheme,
42 value: U256,
43 init_code: Bytes,
44 gas_limit: u64,
45 reservoir: u64,
46 ) -> Self {
47 Self {
48 caller,
49 scheme,
50 value,
51 init_code,
52 gas_limit,
53 reservoir,
54 charged_create_state_gas: false,
55 cached_address: OnceCell::new(),
56 cached_init_code_hash: OnceCell::new(),
57 }
58 }
59
60 pub fn created_address(&self, nonce: u64) -> Address {
64 *self.cached_address.get_or_init(|| match self.scheme {
65 CreateScheme::Create => self.caller.create(nonce),
66 CreateScheme::Create2 { salt } => self
67 .caller
68 .create2(salt.to_be_bytes(), self.init_code_hash()),
69 CreateScheme::Custom { address } => address,
70 })
71 }
72
73 pub fn init_code_hash(&self) -> B256 {
78 *self
79 .cached_init_code_hash
80 .get_or_init(|| keccak256(self.init_code.as_ref()))
81 }
82
83 pub const fn caller(&self) -> Address {
85 self.caller
86 }
87
88 pub const fn scheme(&self) -> CreateScheme {
90 self.scheme
91 }
92
93 pub const fn value(&self) -> U256 {
95 self.value
96 }
97
98 pub const fn init_code(&self) -> &Bytes {
100 &self.init_code
101 }
102
103 pub const fn gas_limit(&self) -> u64 {
105 self.gas_limit
106 }
107
108 pub const fn set_call(&mut self, caller: Address) {
110 self.caller = caller;
111 self.cached_address = OnceCell::new();
112 }
113
114 pub const fn set_scheme(&mut self, scheme: CreateScheme) {
116 self.scheme = scheme;
117 self.cached_address = OnceCell::new();
118 }
119
120 pub const fn set_value(&mut self, value: U256) {
122 self.value = value;
123 }
124
125 pub fn set_init_code(&mut self, init_code: Bytes) {
127 self.init_code = init_code;
128 self.cached_address = OnceCell::new();
129 self.cached_init_code_hash = OnceCell::new();
130 }
131
132 pub const fn set_gas_limit(&mut self, gas_limit: u64) {
134 self.gas_limit = gas_limit;
135 }
136
137 pub const fn reservoir(&self) -> u64 {
139 self.reservoir
140 }
141
142 pub const fn charged_create_state_gas(&self) -> bool {
145 self.charged_create_state_gas
146 }
147
148 pub const fn set_charged_create_state_gas(&mut self, charged: bool) {
151 self.charged_create_state_gas = charged;
152 }
153
154 pub const fn set_reservoir(&mut self, reservoir: u64) {
156 self.reservoir = reservoir;
157 }
158}