@@ -79,7 +79,8 @@ type Balance = U256;
7979
8080#[ derive( Debug ,  Eq ,  PartialEq ) ]  
8181pub  enum  ReceiptFees  { 
82-     NewValue ( UnaggregatedReceipts ) , 
82+     NewReceipt ( u128 ) , 
83+     UpdateValue ( UnaggregatedReceipts ) , 
8384    Retry , 
8485} 
8586
@@ -198,8 +199,13 @@ impl State {
198199    async  fn  rav_requester_single ( & mut  self )  -> Result < ( ) >  { 
199200        let  Some ( allocation_id)  = self . sender_fee_tracker . get_heaviest_allocation_id ( )  else  { 
200201            anyhow:: bail!( 
201-                 "Error while getting the heaviest allocation because \  
202- 
202+                 "Error while getting the heaviest allocation, \  
203+ \n 
204+                 1. allocations have too much fees under their buffer\n  
205+                 2. allocations are blocked to be redeemed due to ongoing last rav. \n  
206+                 If you keep seeing this message try to increase your `amount_willing_to_lose` \  
207+ \n 
208+                 If this doesn't work, open an issue on our Github." 
203209            ) ; 
204210        } ; 
205211        let  sender_allocation_id = self . format_sender_allocation ( & allocation_id) ; 
@@ -478,7 +484,9 @@ impl Actor for SenderAccount {
478484            . set ( config. tap . rav_request_trigger_value  as  f64 ) ; 
479485
480486        let  state = State  { 
481-             sender_fee_tracker :  SenderFeeTracker :: default ( ) , 
487+             sender_fee_tracker :  SenderFeeTracker :: new ( Duration :: from_millis ( 
488+                 config. tap . rav_request_timestamp_buffer_ms , 
489+             ) ) , 
482490            rav_tracker :  SenderFeeTracker :: default ( ) , 
483491            invalid_receipts_tracker :  SenderFeeTracker :: default ( ) , 
484492            allocation_ids :  allocation_ids. clone ( ) , 
@@ -564,14 +572,30 @@ impl Actor for SenderAccount {
564572                    scheduled_rav_request. abort ( ) ; 
565573                } 
566574
567-                 if  let  ReceiptFees :: NewValue ( unaggregated_fees)  = receipt_fees { 
568-                     state
569-                         . sender_fee_tracker 
570-                         . update ( allocation_id,  unaggregated_fees. value ) ; 
575+                 match  receipt_fees { 
576+                     ReceiptFees :: NewReceipt ( value)  => { 
577+                         state. sender_fee_tracker . add ( allocation_id,  value) ; 
571578
572-                     UNAGGREGATED_FEES 
573-                         . with_label_values ( & [ & state. sender . to_string ( ) ,  & allocation_id. to_string ( ) ] ) 
574-                         . set ( unaggregated_fees. value  as  f64 ) ; 
579+                         UNAGGREGATED_FEES 
580+                             . with_label_values ( & [ 
581+                                 & state. sender . to_string ( ) , 
582+                                 & allocation_id. to_string ( ) , 
583+                             ] ) 
584+                             . add ( value as  f64 ) ; 
585+                     } 
586+                     ReceiptFees :: UpdateValue ( unaggregated_fees)  => { 
587+                         state
588+                             . sender_fee_tracker 
589+                             . update ( allocation_id,  unaggregated_fees. value ) ; 
590+ 
591+                         UNAGGREGATED_FEES 
592+                             . with_label_values ( & [ 
593+                                 & state. sender . to_string ( ) , 
594+                                 & allocation_id. to_string ( ) , 
595+                             ] ) 
596+                             . set ( unaggregated_fees. value  as  f64 ) ; 
597+                     } 
598+                     ReceiptFees :: Retry  => { } 
575599                } 
576600
577601                // Eagerly deny the sender (if needed), before the RAV request. To be sure not to 
@@ -582,7 +606,7 @@ impl Actor for SenderAccount {
582606                    state. add_to_denylist ( ) . await ; 
583607                } 
584608
585-                 if  state. sender_fee_tracker . get_total_fee ( ) 
609+                 if  state. sender_fee_tracker . get_total_fee_outside_buffer ( ) 
586610                    >= state. config . tap . rav_request_trigger_value 
587611                { 
588612                    tracing:: debug!( 
@@ -769,7 +793,7 @@ impl Actor for SenderAccount {
769793                // update the receipt fees by reseting to 0 
770794                myself. cast ( SenderAccountMessage :: UpdateReceiptFees ( 
771795                    allocation_id, 
772-                     ReceiptFees :: NewValue ( UnaggregatedReceipts :: default ( ) ) , 
796+                     ReceiptFees :: UpdateValue ( UnaggregatedReceipts :: default ( ) ) , 
773797                ) ) ?; 
774798
775799                // rav tracker is not updated because it's still not redeemed 
@@ -884,6 +908,7 @@ pub mod tests {
884908    const  DUMMY_URL :  & str  = "http://localhost:1234" ; 
885909    const  TRIGGER_VALUE :  u128  = 500 ; 
886910    const  ESCROW_VALUE :  u128  = 1000 ; 
911+     const  BUFFER_MS :  u64  = 100 ; 
887912
888913    async  fn  create_sender_account ( 
889914        pgpool :  PgPool , 
@@ -904,7 +929,7 @@ pub mod tests {
904929            } , 
905930            tap :  config:: Tap  { 
906931                rav_request_trigger_value, 
907-                 rav_request_timestamp_buffer_ms :  1 , 
932+                 rav_request_timestamp_buffer_ms :  BUFFER_MS , 
908933                rav_request_timeout_secs :  5 , 
909934                max_unnaggregated_fees_per_sender, 
910935                ..Default :: default ( ) 
@@ -1191,14 +1216,11 @@ pub mod tests {
11911216        sender_account
11921217            . cast ( SenderAccountMessage :: UpdateReceiptFees ( 
11931218                * ALLOCATION_ID_0 , 
1194-                 ReceiptFees :: NewValue ( UnaggregatedReceipts  { 
1195-                     value :  TRIGGER_VALUE  - 1 , 
1196-                     last_id :  10 , 
1197-                 } ) , 
1219+                 ReceiptFees :: NewReceipt ( TRIGGER_VALUE  - 1 ) , 
11981220            ) ) 
11991221            . unwrap ( ) ; 
12001222
1201-         tokio:: time:: sleep ( Duration :: from_millis ( 10 ) ) . await ; 
1223+         tokio:: time:: sleep ( Duration :: from_millis ( BUFFER_MS ) ) . await ; 
12021224
12031225        assert_eq ! ( 
12041226            triggered_rav_request. load( std:: sync:: atomic:: Ordering :: SeqCst ) , 
@@ -1230,10 +1252,24 @@ pub mod tests {
12301252        sender_account
12311253            . cast ( SenderAccountMessage :: UpdateReceiptFees ( 
12321254                * ALLOCATION_ID_0 , 
1233-                 ReceiptFees :: NewValue ( UnaggregatedReceipts  { 
1234-                     value :  TRIGGER_VALUE , 
1235-                     last_id :  10 , 
1236-                 } ) , 
1255+                 ReceiptFees :: NewReceipt ( TRIGGER_VALUE ) , 
1256+             ) ) 
1257+             . unwrap ( ) ; 
1258+ 
1259+         tokio:: time:: sleep ( Duration :: from_millis ( 20 ) ) . await ; 
1260+ 
1261+         assert_eq ! ( 
1262+             triggered_rav_request. load( std:: sync:: atomic:: Ordering :: SeqCst ) , 
1263+             0 
1264+         ) ; 
1265+ 
1266+         // wait for it to be outside buffer 
1267+         tokio:: time:: sleep ( Duration :: from_millis ( BUFFER_MS ) ) . await ; 
1268+ 
1269+         sender_account
1270+             . cast ( SenderAccountMessage :: UpdateReceiptFees ( 
1271+                 * ALLOCATION_ID_0 , 
1272+                 ReceiptFees :: Retry , 
12371273            ) ) 
12381274            . unwrap ( ) ; 
12391275
@@ -1342,10 +1378,7 @@ pub mod tests {
13421378        sender_account
13431379            . cast ( SenderAccountMessage :: UpdateReceiptFees ( 
13441380                * ALLOCATION_ID_0 , 
1345-                 ReceiptFees :: NewValue ( UnaggregatedReceipts  { 
1346-                     value :  TRIGGER_VALUE , 
1347-                     last_id :  11 , 
1348-                 } ) , 
1381+                 ReceiptFees :: NewReceipt ( TRIGGER_VALUE ) , 
13491382            ) ) 
13501383            . unwrap ( ) ; 
13511384        tokio:: time:: sleep ( Duration :: from_millis ( 200 ) ) . await ; 
@@ -1388,7 +1421,7 @@ pub mod tests {
13881421                sender_account
13891422                    . cast( SenderAccountMessage :: UpdateReceiptFees ( 
13901423                        * ALLOCATION_ID_0 , 
1391-                         ReceiptFees :: NewValue ( UnaggregatedReceipts  { 
1424+                         ReceiptFees :: UpdateValue ( UnaggregatedReceipts  { 
13921425                            value:  $value, 
13931426                            last_id:  11 , 
13941427                        } ) , 
@@ -1529,7 +1562,7 @@ pub mod tests {
15291562                sender_account
15301563                    . cast( SenderAccountMessage :: UpdateReceiptFees ( 
15311564                        * ALLOCATION_ID_0 , 
1532-                         ReceiptFees :: NewValue ( UnaggregatedReceipts  { 
1565+                         ReceiptFees :: UpdateValue ( UnaggregatedReceipts  { 
15331566                            value:  $value, 
15341567                            last_id:  11 , 
15351568                        } ) , 
@@ -1730,10 +1763,7 @@ pub mod tests {
17301763        sender_account
17311764            . cast ( SenderAccountMessage :: UpdateReceiptFees ( 
17321765                * ALLOCATION_ID_0 , 
1733-                 ReceiptFees :: NewValue ( UnaggregatedReceipts  { 
1734-                     value :  TRIGGER_VALUE , 
1735-                     last_id :  11 , 
1736-                 } ) , 
1766+                 ReceiptFees :: NewReceipt ( TRIGGER_VALUE ) , 
17371767            ) ) 
17381768            . unwrap ( ) ; 
17391769        tokio:: time:: sleep ( Duration :: from_millis ( 100 ) ) . await ; 
0 commit comments