@@ -215,3 +215,136 @@ func TestCollectGasRounding(t *testing.T) {
215
215
}
216
216
}
217
217
}
218
+
219
+ func TestPreCheck (t * testing.T ) {
220
+ tests := []struct {
221
+ name string
222
+ msg types.Message
223
+ expectedError error
224
+ }{
225
+ {
226
+ name : "NonceTooHigh" ,
227
+ msg : types .NewMessage (
228
+ crypto .PubkeyToAddress (key .PublicKey ),
229
+ nil ,
230
+ 2 ,
231
+ big .NewInt (0 ),
232
+ 21000 ,
233
+ big .NewInt (1 ),
234
+ []byte {},
235
+ false ,
236
+ false ,
237
+ ),
238
+ expectedError : ErrNonceTooHigh ,
239
+ },
240
+ {
241
+ name : "NonceTooLow" ,
242
+ msg : types .NewMessage (
243
+ crypto .PubkeyToAddress (key .PublicKey ),
244
+ nil ,
245
+ 0 ,
246
+ big .NewInt (0 ),
247
+ 21000 ,
248
+ big .NewInt (1 ),
249
+ []byte {},
250
+ false ,
251
+ false ,
252
+ ),
253
+ expectedError : ErrNonceTooLow ,
254
+ },
255
+ {
256
+ name : "SenderNotEOA" ,
257
+ msg : types .NewMessage (
258
+ common .HexToAddress ("0x0000000000000000000000000000000000000001" ),
259
+ nil ,
260
+ 1 ,
261
+ big .NewInt (0 ),
262
+ 21000 ,
263
+ big .NewInt (1 ),
264
+ []byte {},
265
+ false ,
266
+ false ,
267
+ ),
268
+ expectedError : ErrSenderNotEOA ,
269
+ },
270
+ {
271
+ name : "SuccessfulPreCheck" ,
272
+ msg : types .NewMessage (
273
+ crypto .PubkeyToAddress (key .PublicKey ),
274
+ nil ,
275
+ 1 ,
276
+ big .NewInt (0 ),
277
+ 21000 ,
278
+ big .NewInt (1 ),
279
+ []byte {},
280
+ false ,
281
+ false ,
282
+ ),
283
+ expectedError : nil ,
284
+ },
285
+ {
286
+ name : "SkipNonceChecks" ,
287
+ msg : types .NewMessage (
288
+ crypto .PubkeyToAddress (key .PublicKey ),
289
+ nil ,
290
+ 2 ,
291
+ big .NewInt (0 ),
292
+ 21000 ,
293
+ big .NewInt (1 ),
294
+ []byte {},
295
+ true ,
296
+ false ,
297
+ ),
298
+ expectedError : nil ,
299
+ },
300
+ {
301
+ name : "SkipFromEOACheck" ,
302
+ msg : types .NewMessage (
303
+ common .HexToAddress ("0x0000000000000000000000000000000000000001" ),
304
+ nil ,
305
+ 1 ,
306
+ big .NewInt (0 ),
307
+ 21000 ,
308
+ big .NewInt (1 ),
309
+ []byte {},
310
+ false ,
311
+ true ,
312
+ ),
313
+ expectedError : nil ,
314
+ },
315
+ {
316
+ name : "SkipBothChecks" ,
317
+ msg : types .NewMessage (
318
+ common .HexToAddress ("0x0000000000000000000000000000000000000001" ),
319
+ nil ,
320
+ 2 ,
321
+ big .NewInt (0 ),
322
+ 21000 ,
323
+ big .NewInt (1 ),
324
+ []byte {},
325
+ true ,
326
+ true ,
327
+ ),
328
+ expectedError : nil ,
329
+ },
330
+ }
331
+
332
+ for _ , tt := range tests {
333
+ t .Run (tt .name , func (t * testing.T ) {
334
+ // make evm
335
+ key , _ := crypto .GenerateKey ()
336
+ chain , db , header , _ := getTestEnvironment (* key )
337
+ gp := new (GasPool ).AddGas (math .MaxUint64 )
338
+ ctx := NewEVMContext (tt .msg , header , chain , nil /* coinbase is nil, no block reward */ )
339
+ ctx .TxType = types .SameShardTx
340
+ vmenv := vm .NewEVM (ctx , db , params .TestChainConfig , vm.Config {})
341
+
342
+ // call preCheck and check for expected error
343
+ st := NewStateTransition (vmenv , tt .msg , gp )
344
+ err := st .preCheck ()
345
+ if err != tt .expectedError {
346
+ t .Errorf ("expected error %v, got %v" , tt .expectedError , err )
347
+ }
348
+ })
349
+ }
350
+ }
0 commit comments