@@ -262,9 +262,17 @@ impl<B: ChainApi> Pool<B> {
262262 pub fn remove ( & self , hashes : & [ B :: Hash ] , is_valid : bool ) -> Vec < Option < Arc < VerifiedFor < B > > > > {
263263 let mut pool = self . pool . write ( ) ;
264264 let mut results = Vec :: with_capacity ( hashes. len ( ) ) ;
265+
266+ // temporarily ban invalid transactions
267+ if !is_valid {
268+ debug ! ( target: "transaction-pool" , "Banning invalid transactions: {:?}" , hashes) ;
269+ self . rotator . ban ( & time:: Instant :: now ( ) , hashes) ;
270+ }
271+
265272 for hash in hashes {
266273 results. push ( pool. remove ( hash, is_valid) ) ;
267274 }
275+
268276 results
269277 }
270278
@@ -578,4 +586,21 @@ pub mod tests {
578586 let pending: Vec < _ > = pool. cull_and_get_pending ( & BlockId :: number ( 0 ) , |p| p. map ( |a| ( * a. sender ( ) , a. original . transfer . nonce ) ) . collect ( ) ) . unwrap ( ) ;
579587 assert_eq ! ( pending, vec![ ( Alice . to_raw_public( ) . into( ) , 209 ) , ( Alice . to_raw_public( ) . into( ) , 210 ) ] ) ;
580588 }
589+
590+ #[ test]
591+ fn should_ban_invalid_transactions ( ) {
592+ let pool = pool ( ) ;
593+ let uxt = uxt ( Alice , 209 ) ;
594+ let hash = * pool. submit_one ( & BlockId :: number ( 0 ) , uxt. clone ( ) ) . unwrap ( ) . hash ( ) ;
595+ pool. remove ( & [ hash] , true ) ;
596+ pool. submit_one ( & BlockId :: number ( 0 ) , uxt. clone ( ) ) . unwrap ( ) ;
597+
598+ // when
599+ pool. remove ( & [ hash] , false ) ;
600+ let pending: Vec < AccountId > = pool. cull_and_get_pending ( & BlockId :: number ( 0 ) , |p| p. map ( |a| * a. sender ( ) ) . collect ( ) ) . unwrap ( ) ;
601+ assert_eq ! ( pending, vec![ ] ) ;
602+
603+ // then
604+ pool. submit_one ( & BlockId :: number ( 0 ) , uxt. clone ( ) ) . unwrap_err ( ) ;
605+ }
581606}
0 commit comments