Skip to content

Commit 41108d7

Browse files
authored
feat(tap-agent): add invalid receipts tracker for deny condition (#196)
* feat(tap-agent): add invalid receipts tracker for deny condition Signed-off-by: Gustavo Inacio <[email protected]> * test(tap-agent): calculate invalid receipts and messages Signed-off-by: Gustavo Inacio <[email protected]> * test(tap-agent): sender account invalid deny invalid receipts Signed-off-by: Gustavo Inacio <[email protected]> * refactor(tap-agent): sum invalid receipts instead of recalculate Signed-off-by: Gustavo Inacio <[email protected]> * fix(tap-agent): update invalid receipt fees state test: fix partial eq implementation Signed-off-by: Gustavo Inacio <[email protected]> --------- Signed-off-by: Gustavo Inacio <[email protected]>
1 parent 3c40908 commit 41108d7

5 files changed

+318
-10
lines changed

.sqlx/query-0393f3408c1802950e39b3ecbcfae3ac4ff99253a4973d18df83d8645ac75cfc.json

Lines changed: 29 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.sqlx/query-f427b53120026e6df1e41ca864866c4b7e60ca1a6c09920cd9194de913fe6307.json

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tap-agent/src/agent/sender_account.rs

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ pub enum SenderAccountMessage {
3838
UpdateBalanceAndLastRavs(Balance, RavMap),
3939
UpdateAllocationIds(HashSet<Address>),
4040
UpdateReceiptFees(Address, UnaggregatedReceipts),
41+
UpdateInvalidReceiptFees(Address, UnaggregatedReceipts),
4142
UpdateRav(SignedRAV),
4243
#[cfg(test)]
4344
GetSenderFeeTracker(ractor::RpcReplyPort<SenderFeeTracker>),
@@ -74,6 +75,7 @@ pub struct State {
7475
prefix: Option<String>,
7576
sender_fee_tracker: SenderFeeTracker,
7677
rav_tracker: SenderFeeTracker,
78+
invalid_receipts_tracker: SenderFeeTracker,
7779
allocation_ids: HashSet<Address>,
7880
_indexer_allocations_handle: PipeHandle,
7981
_escrow_account_monitor: PipeHandle,
@@ -177,7 +179,9 @@ impl State {
177179
let pending_fees_over_balance =
178180
pending_ravs + unaggregated_fees >= self.sender_balance.as_u128();
179181
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;
181185

182186
tracing::trace!(
183187
%pending_fees_over_balance,
@@ -409,6 +413,7 @@ impl Actor for SenderAccount {
409413
let state = State {
410414
sender_fee_tracker: SenderFeeTracker::default(),
411415
rav_tracker: SenderFeeTracker::default(),
416+
invalid_receipts_tracker: SenderFeeTracker::default(),
412417
allocation_ids: allocation_ids.clone(),
413418
_indexer_allocations_handle,
414419
_escrow_account_monitor,
@@ -463,6 +468,17 @@ impl Actor for SenderAccount {
463468
state.add_to_denylist().await;
464469
}
465470
}
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+
}
466482
SenderAccountMessage::UpdateReceiptFees(allocation_id, unaggregated_fees) => {
467483
// If we're here because of a new receipt, abort any scheduled UpdateReceiptFees
468484
if let Some(scheduled_rav_request) = state.scheduled_rav_request.take() {
@@ -713,7 +729,11 @@ pub mod tests {
713729
(Self::UpdateReceiptFees(l0, l1), Self::UpdateReceiptFees(r0, r1)) => {
714730
l0 == r0 && l1 == r1
715731
}
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:?}"),
717737
}
718738
}
719739
}
@@ -1158,6 +1178,22 @@ pub mod tests {
11581178
};
11591179
}
11601180

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+
11611197
update_receipt_fees!(max_unaggregated_fees_per_sender - 1);
11621198
let deny = get_deny_status(&sender_account).await;
11631199
assert!(!deny);
@@ -1178,6 +1214,28 @@ pub mod tests {
11781214
let deny = get_deny_status(&sender_account).await;
11791215
assert!(!deny);
11801216

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+
11811239
sender_account.stop_and_wait(None, None).await.unwrap();
11821240
handle.await.unwrap();
11831241
}

0 commit comments

Comments
 (0)