@@ -15,7 +15,7 @@ pub fn create_payout_tx(
15
15
nonce : u64 ,
16
16
to : Address ,
17
17
gas_limit : u64 ,
18
- value : u128 ,
18
+ value : U256 ,
19
19
) -> Result < Recovered < TransactionSigned > , secp256k1:: Error > {
20
20
let tx = Transaction :: Eip1559 ( TxEip1559 {
21
21
chain_id : chain_spec. chain . id ( ) ,
@@ -24,7 +24,7 @@ pub fn create_payout_tx(
24
24
max_fee_per_gas : basefee as u128 ,
25
25
max_priority_fee_per_gas : 0 ,
26
26
to : TransactionKind :: Call ( to) ,
27
- value : U256 :: from ( value ) ,
27
+ value,
28
28
..Default :: default ( )
29
29
} ) ;
30
30
@@ -53,22 +53,23 @@ pub fn insert_test_payout_tx(
53
53
54
54
let nonce = state. nonce ( builder_signer. address ) ?;
55
55
56
- let mut cfg = ctx. evm_env . cfg_env . clone ( ) ;
57
- // disable balance check so we can estimate the gas cost without having any funds
58
- cfg. disable_balance_check = true ;
59
-
56
+ let tx_value = 10u128 . pow ( 18 ) ; // 10 ether
60
57
let tx = create_payout_tx (
61
58
ctx. chain_spec . as_ref ( ) ,
62
59
ctx. evm_env . block_env . basefee ,
63
60
builder_signer,
64
61
nonce,
65
62
to,
66
63
gas_limit,
67
- 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ,
64
+ U256 :: from ( tx_value ) ,
68
65
) ?;
69
66
70
67
let mut db = state. new_db_ref ( ) ;
71
68
let mut evm = ctx. evm_factory . create_evm ( db. as_mut ( ) , ctx. evm_env . clone ( ) ) ;
69
+
70
+ let cache_account = evm. db_mut ( ) . load_cache_account ( builder_signer. address ) ?;
71
+ cache_account. increment_balance ( tx_value * 2 ) ; // double to cover tx value and fee
72
+
72
73
let res = evm. transact ( & tx) ?;
73
74
match res. result {
74
75
ExecutionResult :: Success {
@@ -130,3 +131,66 @@ pub fn estimate_payout_gas_limit(
130
131
}
131
132
}
132
133
}
134
+
135
+ #[ cfg( test) ]
136
+ mod tests {
137
+ use super :: * ;
138
+ use crate :: building:: builders:: mock_block_building_helper:: MockRootHasher ;
139
+ use alloy_eips:: eip1559:: INITIAL_BASE_FEE ;
140
+ use alloy_primitives:: B256 ;
141
+ use assert_matches:: assert_matches;
142
+ use reth_chainspec:: { EthereumHardfork , MAINNET } ;
143
+ use reth_db:: { tables, transaction:: DbTxMut } ;
144
+ use reth_primitives:: Account ;
145
+ use reth_provider:: test_utils:: create_test_provider_factory_with_chain_spec;
146
+ use revm:: primitives:: hardfork:: SpecId ;
147
+ use std:: sync:: Arc ;
148
+
149
+ #[ test]
150
+ fn estimate_payout_tx_gas_limit ( ) {
151
+ let signer = Signer :: random ( ) ;
152
+ let proposer = Address :: random ( ) ;
153
+ let chain_spec = MAINNET . clone ( ) ;
154
+ let spec_id = SpecId :: CANCUN ;
155
+ let cancun_timestamp = chain_spec
156
+ . fork ( EthereumHardfork :: Cancun )
157
+ . as_timestamp ( )
158
+ . unwrap ( ) ;
159
+
160
+ // Insert proposer
161
+ let provider_factory = create_test_provider_factory_with_chain_spec ( chain_spec. clone ( ) ) ;
162
+ let provider_rw = provider_factory. provider_rw ( ) . unwrap ( ) ;
163
+ provider_rw
164
+ . tx_ref ( )
165
+ . put :: < tables:: PlainAccountState > (
166
+ proposer,
167
+ Account {
168
+ balance : U256 :: ZERO ,
169
+ nonce : 1 ,
170
+ bytecode_hash : Some ( B256 :: random ( ) ) ,
171
+ } ,
172
+ )
173
+ . unwrap ( ) ;
174
+ provider_rw. commit ( ) . unwrap ( ) ;
175
+
176
+ let mut block: alloy_rpc_types:: Block = Default :: default ( ) ;
177
+ block. header . base_fee_per_gas = Some ( INITIAL_BASE_FEE ) ;
178
+ block. header . timestamp = cancun_timestamp + 1 ;
179
+ block. header . gas_limit = 30_000_000 ;
180
+ let ctx = BlockBuildingContext :: from_onchain_block (
181
+ block,
182
+ chain_spec,
183
+ Some ( spec_id) ,
184
+ Default :: default ( ) ,
185
+ signer. address ,
186
+ proposer,
187
+ Some ( signer) ,
188
+ Arc :: new ( MockRootHasher { } ) ,
189
+ ) ;
190
+ let mut state = BlockState :: new ( provider_factory. latest ( ) . unwrap ( ) ) ;
191
+
192
+ let estimate_result = estimate_payout_gas_limit ( proposer, & ctx, & mut state, 0 ) ;
193
+ assert_matches ! ( estimate_result, Ok ( _) ) ;
194
+ assert_eq ! ( estimate_result. unwrap( ) , 21_000 ) ;
195
+ }
196
+ }
0 commit comments