@@ -50,7 +50,7 @@ impl PendingTransaction {
50
50
return Err ( TransactionCreationError :: ContractMissingData ) ;
51
51
}
52
52
53
- let initial_cost = Self :: initial_cost ( spec_id, & transaction) ;
53
+ let initial_cost = initial_cost ( spec_id, & transaction) ;
54
54
if transaction. gas_limit ( ) < initial_cost {
55
55
return Err ( TransactionCreationError :: InsufficientGas {
56
56
initial_gas_cost : U256 :: from ( initial_cost) ,
@@ -69,6 +69,11 @@ impl PendingTransaction {
69
69
& self . caller
70
70
}
71
71
72
+ /// The minimum gas required to include the transaction in a block.
73
+ pub fn initial_cost ( & self , spec_id : SpecId ) -> u64 {
74
+ initial_cost ( spec_id, & self . transaction )
75
+ }
76
+
72
77
/// Returns the inner [`SignedTransaction`]
73
78
pub fn transaction ( & self ) -> & SignedTransaction {
74
79
& self . transaction
@@ -78,81 +83,6 @@ impl PendingTransaction {
78
83
pub fn into_inner ( self ) -> ( SignedTransaction , Address ) {
79
84
( self . transaction , self . caller )
80
85
}
81
-
82
- fn initial_cost ( spec_id : SpecId , transaction : & SignedTransaction ) -> u64 {
83
- let access_list: Option < Vec < ( Address , Vec < U256 > ) > > =
84
- transaction. access_list ( ) . cloned ( ) . map ( Into :: into) ;
85
-
86
- match spec_id {
87
- SpecId :: FRONTIER | SpecId :: FRONTIER_THAWING => initial_tx_gas :: < FrontierSpec > (
88
- transaction. data ( ) ,
89
- transaction. kind ( ) == TransactionKind :: Create ,
90
- access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
91
- ) ,
92
- SpecId :: HOMESTEAD | SpecId :: DAO_FORK => initial_tx_gas :: < HomesteadSpec > (
93
- transaction. data ( ) ,
94
- transaction. kind ( ) == TransactionKind :: Create ,
95
- access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
96
- ) ,
97
- SpecId :: TANGERINE => initial_tx_gas :: < TangerineSpec > (
98
- transaction. data ( ) ,
99
- transaction. kind ( ) == TransactionKind :: Create ,
100
- access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
101
- ) ,
102
- SpecId :: SPURIOUS_DRAGON => initial_tx_gas :: < SpuriousDragonSpec > (
103
- transaction. data ( ) ,
104
- transaction. kind ( ) == TransactionKind :: Create ,
105
- access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
106
- ) ,
107
- SpecId :: BYZANTIUM => initial_tx_gas :: < ByzantiumSpec > (
108
- transaction. data ( ) ,
109
- transaction. kind ( ) == TransactionKind :: Create ,
110
- access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
111
- ) ,
112
- SpecId :: PETERSBURG | SpecId :: CONSTANTINOPLE => initial_tx_gas :: < PetersburgSpec > (
113
- transaction. data ( ) ,
114
- transaction. kind ( ) == TransactionKind :: Create ,
115
- access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
116
- ) ,
117
- SpecId :: ISTANBUL | SpecId :: MUIR_GLACIER => initial_tx_gas :: < IstanbulSpec > (
118
- transaction. data ( ) ,
119
- transaction. kind ( ) == TransactionKind :: Create ,
120
- access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
121
- ) ,
122
- SpecId :: BERLIN => initial_tx_gas :: < BerlinSpec > (
123
- transaction. data ( ) ,
124
- transaction. kind ( ) == TransactionKind :: Create ,
125
- access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
126
- ) ,
127
- SpecId :: LONDON | SpecId :: ARROW_GLACIER | SpecId :: GRAY_GLACIER => {
128
- initial_tx_gas :: < LondonSpec > (
129
- transaction. data ( ) ,
130
- transaction. kind ( ) == TransactionKind :: Create ,
131
- access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
132
- )
133
- }
134
- SpecId :: MERGE => initial_tx_gas :: < MergeSpec > (
135
- transaction. data ( ) ,
136
- transaction. kind ( ) == TransactionKind :: Create ,
137
- access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
138
- ) ,
139
- SpecId :: SHANGHAI => initial_tx_gas :: < ShanghaiSpec > (
140
- transaction. data ( ) ,
141
- transaction. kind ( ) == TransactionKind :: Create ,
142
- access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
143
- ) ,
144
- SpecId :: CANCUN => initial_tx_gas :: < LatestSpec > (
145
- transaction. data ( ) ,
146
- transaction. kind ( ) == TransactionKind :: Create ,
147
- access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
148
- ) ,
149
- SpecId :: LATEST => initial_tx_gas :: < LatestSpec > (
150
- transaction. data ( ) ,
151
- transaction. kind ( ) == TransactionKind :: Create ,
152
- access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
153
- ) ,
154
- }
155
- }
156
86
}
157
87
158
88
impl Deref for PendingTransaction {
@@ -281,3 +211,78 @@ impl From<PendingTransaction> for TxEnv {
281
211
}
282
212
}
283
213
}
214
+
215
+ fn initial_cost ( spec_id : SpecId , transaction : & SignedTransaction ) -> u64 {
216
+ let access_list: Option < Vec < ( Address , Vec < U256 > ) > > =
217
+ transaction. access_list ( ) . cloned ( ) . map ( Into :: into) ;
218
+
219
+ match spec_id {
220
+ SpecId :: FRONTIER | SpecId :: FRONTIER_THAWING => initial_tx_gas :: < FrontierSpec > (
221
+ transaction. data ( ) ,
222
+ transaction. kind ( ) == TransactionKind :: Create ,
223
+ access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
224
+ ) ,
225
+ SpecId :: HOMESTEAD | SpecId :: DAO_FORK => initial_tx_gas :: < HomesteadSpec > (
226
+ transaction. data ( ) ,
227
+ transaction. kind ( ) == TransactionKind :: Create ,
228
+ access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
229
+ ) ,
230
+ SpecId :: TANGERINE => initial_tx_gas :: < TangerineSpec > (
231
+ transaction. data ( ) ,
232
+ transaction. kind ( ) == TransactionKind :: Create ,
233
+ access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
234
+ ) ,
235
+ SpecId :: SPURIOUS_DRAGON => initial_tx_gas :: < SpuriousDragonSpec > (
236
+ transaction. data ( ) ,
237
+ transaction. kind ( ) == TransactionKind :: Create ,
238
+ access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
239
+ ) ,
240
+ SpecId :: BYZANTIUM => initial_tx_gas :: < ByzantiumSpec > (
241
+ transaction. data ( ) ,
242
+ transaction. kind ( ) == TransactionKind :: Create ,
243
+ access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
244
+ ) ,
245
+ SpecId :: PETERSBURG | SpecId :: CONSTANTINOPLE => initial_tx_gas :: < PetersburgSpec > (
246
+ transaction. data ( ) ,
247
+ transaction. kind ( ) == TransactionKind :: Create ,
248
+ access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
249
+ ) ,
250
+ SpecId :: ISTANBUL | SpecId :: MUIR_GLACIER => initial_tx_gas :: < IstanbulSpec > (
251
+ transaction. data ( ) ,
252
+ transaction. kind ( ) == TransactionKind :: Create ,
253
+ access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
254
+ ) ,
255
+ SpecId :: BERLIN => initial_tx_gas :: < BerlinSpec > (
256
+ transaction. data ( ) ,
257
+ transaction. kind ( ) == TransactionKind :: Create ,
258
+ access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
259
+ ) ,
260
+ SpecId :: LONDON | SpecId :: ARROW_GLACIER | SpecId :: GRAY_GLACIER => {
261
+ initial_tx_gas :: < LondonSpec > (
262
+ transaction. data ( ) ,
263
+ transaction. kind ( ) == TransactionKind :: Create ,
264
+ access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
265
+ )
266
+ }
267
+ SpecId :: MERGE => initial_tx_gas :: < MergeSpec > (
268
+ transaction. data ( ) ,
269
+ transaction. kind ( ) == TransactionKind :: Create ,
270
+ access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
271
+ ) ,
272
+ SpecId :: SHANGHAI => initial_tx_gas :: < ShanghaiSpec > (
273
+ transaction. data ( ) ,
274
+ transaction. kind ( ) == TransactionKind :: Create ,
275
+ access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
276
+ ) ,
277
+ SpecId :: CANCUN => initial_tx_gas :: < LatestSpec > (
278
+ transaction. data ( ) ,
279
+ transaction. kind ( ) == TransactionKind :: Create ,
280
+ access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
281
+ ) ,
282
+ SpecId :: LATEST => initial_tx_gas :: < LatestSpec > (
283
+ transaction. data ( ) ,
284
+ transaction. kind ( ) == TransactionKind :: Create ,
285
+ access_list. as_ref ( ) . map_or ( & [ ] , |access_list| access_list) ,
286
+ ) ,
287
+ }
288
+ }
0 commit comments