@@ -27,11 +27,29 @@ impl ExpiringSum {
2727 }
2828 self . sum
2929 }
30+
31+ fn get_count ( & mut self , duration : & Duration ) -> usize {
32+ let now = Instant :: now ( ) ;
33+ while let Some ( & ( timestamp, _) ) = self . entries . front ( ) {
34+ if now. duration_since ( timestamp) >= * duration {
35+ self . entries . pop_front ( ) ;
36+ } else {
37+ break ;
38+ }
39+ }
40+ self . entries . len ( )
41+ }
42+ }
43+
44+ #[ derive( Debug , Clone , Default ) ]
45+ pub struct FeeCounter {
46+ fee : u128 ,
47+ count : usize ,
3048}
3149
3250#[ derive( Debug , Clone , Default ) ]
3351pub struct SenderFeeTracker {
34- id_to_fee : HashMap < Address , u128 > ,
52+ id_to_fee : HashMap < Address , FeeCounter > ,
3553 total_fee : u128 ,
3654
3755 fees_requesting : u128 ,
@@ -82,7 +100,8 @@ impl SenderFeeTracker {
82100 }
83101 self . total_fee += value;
84102 let entry = self . id_to_fee . entry ( id) . or_default ( ) ;
85- * entry += value;
103+ entry. fee += value;
104+ entry. count += 1 ;
86105 }
87106
88107 /// Updates and overwrite the fee counter into the specific
@@ -92,8 +111,8 @@ impl SenderFeeTracker {
92111 pub fn update ( & mut self , id : Address , fee : u128 ) {
93112 if fee > 0 {
94113 // insert or update, if update remove old fee from total
95- if let Some ( old_fee) = self . id_to_fee . insert ( id, fee) {
96- self . total_fee -= old_fee;
114+ if let Some ( old_fee) = self . id_to_fee . insert ( id, FeeCounter { fee, count : 0 } ) {
115+ self . total_fee -= old_fee. fee ;
97116 }
98117 self . total_fee = self . total_fee . checked_add ( fee) . unwrap_or_else ( || {
99118 // This should never happen, but if it does, we want to know about it.
@@ -105,7 +124,7 @@ impl SenderFeeTracker {
105124 u128:: MAX
106125 } ) ;
107126 } else if let Some ( old_fee) = self . id_to_fee . remove ( & id) {
108- self . total_fee -= old_fee;
127+ self . total_fee -= old_fee. fee ;
109128 }
110129 }
111130
@@ -134,11 +153,12 @@ impl SenderFeeTracker {
134153 . map ( |( addr, fee) | {
135154 (
136155 addr,
137- fee - self
138- . buffer_window_fee
139- . get_mut ( addr)
140- . map ( |expiring| expiring. get_sum ( & self . buffer_window_duration ) )
141- . unwrap_or_default ( ) ,
156+ fee. fee
157+ - self
158+ . buffer_window_fee
159+ . get_mut ( addr)
160+ . map ( |expiring| expiring. get_sum ( & self . buffer_window_duration ) )
161+ . unwrap_or_default ( ) ,
142162 )
143163 } )
144164 . filter ( |( _, fee) | * fee > 0 )
@@ -168,6 +188,25 @@ impl SenderFeeTracker {
168188 self . get_total_fee ( ) - self . get_buffer_fee ( ) . min ( self . total_fee )
169189 }
170190
191+ pub fn get_total_counter_outside_buffer_for_allocation (
192+ & mut self ,
193+ allocation_id : & Address ,
194+ ) -> usize {
195+ let Some ( allocation_counter) = self
196+ . id_to_fee
197+ . get ( allocation_id)
198+ . map ( |fee_counter| fee_counter. count )
199+ else {
200+ return 0 ;
201+ } ;
202+ let counter_in_buffer = self
203+ . buffer_window_fee
204+ . get_mut ( allocation_id)
205+ . map ( |window| window. get_count ( & self . buffer_window_duration ) )
206+ . unwrap_or ( 0 ) ;
207+ allocation_counter - counter_in_buffer
208+ }
209+
171210 pub fn get_buffer_fee ( & mut self ) -> u128 {
172211 self . buffer_window_fee
173212 . values_mut ( )
0 commit comments