@@ -38,6 +38,7 @@ pub enum SenderAccountMessage {
38
38
UpdateBalanceAndLastRavs ( Balance , RavMap ) ,
39
39
UpdateAllocationIds ( HashSet < Address > ) ,
40
40
UpdateReceiptFees ( Address , UnaggregatedReceipts ) ,
41
+ UpdateInvalidReceiptFees ( Address , UnaggregatedReceipts ) ,
41
42
UpdateRav ( SignedRAV ) ,
42
43
#[ cfg( test) ]
43
44
GetSenderFeeTracker ( ractor:: RpcReplyPort < SenderFeeTracker > ) ,
@@ -74,6 +75,7 @@ pub struct State {
74
75
prefix : Option < String > ,
75
76
sender_fee_tracker : SenderFeeTracker ,
76
77
rav_tracker : SenderFeeTracker ,
78
+ invalid_receipts_tracker : SenderFeeTracker ,
77
79
allocation_ids : HashSet < Address > ,
78
80
_indexer_allocations_handle : PipeHandle ,
79
81
_escrow_account_monitor : PipeHandle ,
@@ -177,7 +179,9 @@ impl State {
177
179
let pending_fees_over_balance =
178
180
pending_ravs + unaggregated_fees >= self . sender_balance . as_u128 ( ) ;
179
181
let max_unaggregated_fees = self . config . tap . max_unnaggregated_fees_per_sender ;
180
- let total_fee_over_max_value = unaggregated_fees >= max_unaggregated_fees;
182
+ let invalid_receipt_fees = self . invalid_receipts_tracker . get_total_fee ( ) ;
183
+ let total_fee_over_max_value =
184
+ unaggregated_fees + invalid_receipt_fees >= max_unaggregated_fees;
181
185
182
186
tracing:: trace!(
183
187
%pending_fees_over_balance,
@@ -409,6 +413,7 @@ impl Actor for SenderAccount {
409
413
let state = State {
410
414
sender_fee_tracker : SenderFeeTracker :: default ( ) ,
411
415
rav_tracker : SenderFeeTracker :: default ( ) ,
416
+ invalid_receipts_tracker : SenderFeeTracker :: default ( ) ,
412
417
allocation_ids : allocation_ids. clone ( ) ,
413
418
_indexer_allocations_handle,
414
419
_escrow_account_monitor,
@@ -463,6 +468,17 @@ impl Actor for SenderAccount {
463
468
state. add_to_denylist ( ) . await ;
464
469
}
465
470
}
471
+ SenderAccountMessage :: UpdateInvalidReceiptFees ( allocation_id, unaggregated_fees) => {
472
+ state
473
+ . invalid_receipts_tracker
474
+ . update ( allocation_id, unaggregated_fees. value ) ;
475
+
476
+ // invalid receipts can't go down
477
+ let should_deny = !state. denied && state. deny_condition_reached ( ) ;
478
+ if should_deny {
479
+ state. add_to_denylist ( ) . await ;
480
+ }
481
+ }
466
482
SenderAccountMessage :: UpdateReceiptFees ( allocation_id, unaggregated_fees) => {
467
483
// If we're here because of a new receipt, abort any scheduled UpdateReceiptFees
468
484
if let Some ( scheduled_rav_request) = state. scheduled_rav_request . take ( ) {
@@ -713,7 +729,11 @@ pub mod tests {
713
729
( Self :: UpdateReceiptFees ( l0, l1) , Self :: UpdateReceiptFees ( r0, r1) ) => {
714
730
l0 == r0 && l1 == r1
715
731
}
716
- _ => core:: mem:: discriminant ( self ) == core:: mem:: discriminant ( other) ,
732
+ (
733
+ Self :: UpdateInvalidReceiptFees ( l0, l1) ,
734
+ Self :: UpdateInvalidReceiptFees ( r0, r1) ,
735
+ ) => l0 == r0 && l1 == r1,
736
+ ( a, b) => unimplemented ! ( "PartialEq not implementated for {a:?} and {b:?}" ) ,
717
737
}
718
738
}
719
739
}
@@ -1158,6 +1178,22 @@ pub mod tests {
1158
1178
} ;
1159
1179
}
1160
1180
1181
+ macro_rules! update_invalid_receipt_fees {
1182
+ ( $value: expr) => {
1183
+ sender_account
1184
+ . cast( SenderAccountMessage :: UpdateInvalidReceiptFees (
1185
+ * ALLOCATION_ID_0 ,
1186
+ UnaggregatedReceipts {
1187
+ value: $value,
1188
+ last_id: 11 ,
1189
+ } ,
1190
+ ) )
1191
+ . unwrap( ) ;
1192
+
1193
+ tokio:: time:: sleep( Duration :: from_millis( 10 ) ) . await ;
1194
+ } ;
1195
+ }
1196
+
1161
1197
update_receipt_fees ! ( max_unaggregated_fees_per_sender - 1 ) ;
1162
1198
let deny = get_deny_status ( & sender_account) . await ;
1163
1199
assert ! ( !deny) ;
@@ -1178,6 +1214,28 @@ pub mod tests {
1178
1214
let deny = get_deny_status ( & sender_account) . await ;
1179
1215
assert ! ( !deny) ;
1180
1216
1217
+ update_receipt_fees ! ( 0 ) ;
1218
+
1219
+ update_invalid_receipt_fees ! ( max_unaggregated_fees_per_sender - 1 ) ;
1220
+ let deny = get_deny_status ( & sender_account) . await ;
1221
+ assert ! ( !deny) ;
1222
+
1223
+ update_invalid_receipt_fees ! ( max_unaggregated_fees_per_sender) ;
1224
+ let deny = get_deny_status ( & sender_account) . await ;
1225
+ assert ! ( deny) ;
1226
+
1227
+ // invalid receipts should not go down
1228
+ update_invalid_receipt_fees ! ( 0 ) ;
1229
+ let deny = get_deny_status ( & sender_account) . await ;
1230
+ // keep denied
1231
+ assert ! ( deny) ;
1232
+
1233
+ // condition reached using receipts
1234
+ update_receipt_fees ! ( 0 ) ;
1235
+ let deny = get_deny_status ( & sender_account) . await ;
1236
+ // allow sender
1237
+ assert ! ( !deny) ;
1238
+
1181
1239
sender_account. stop_and_wait ( None , None ) . await . unwrap ( ) ;
1182
1240
handle. await . unwrap ( ) ;
1183
1241
}
0 commit comments