@@ -13,16 +13,17 @@ use adapter::{
13
13
Adapter , Dummy ,
14
14
} ;
15
15
use primitives:: {
16
- balances:: { Balances , CheckedState , UncheckedState } ,
16
+ balances:: { Balances , BalancesState , CheckedState , UncheckedState } ,
17
17
merkle_tree:: MerkleTree ,
18
18
sentry:: {
19
19
channel_list:: { ChannelListQuery , ChannelListResponse } ,
20
+ message:: MessageResponse ,
20
21
AccountingResponse , AllSpendersQuery , AllSpendersResponse , ChannelPayRequest ,
21
22
GetLeafResponse , LastApproved , LastApprovedQuery , LastApprovedResponse , SpenderResponse ,
22
23
SuccessResponse ,
23
24
} ,
24
25
spender:: { Spendable , Spender } ,
25
- validator:: NewState ,
26
+ validator:: { ApproveState , NewState } ,
26
27
Address , ChainOf , Channel , ChannelId , Deposit , UnifiedNum ,
27
28
} ;
28
29
@@ -97,17 +98,11 @@ pub async fn last_approved<C: Locked + 'static>(
97
98
heartbeats : None ,
98
99
} ) ;
99
100
100
- let approve_state = match latest_approve_state ( & app. pool , & channel) . await ? {
101
- Some ( approve_state) => approve_state,
102
- None => return Ok ( default_response) ,
103
- } ;
104
-
105
- let state_root = approve_state. msg . state_root . clone ( ) ;
106
-
107
- let new_state = latest_new_state ( & app. pool , & channel, & state_root) . await ?;
108
- if new_state. is_none ( ) {
109
- return Ok ( default_response) ;
110
- }
101
+ let ( approve_state, new_state) =
102
+ match get_corresponding_states :: < UncheckedState > ( & app. pool , & app. logger , & channel) . await ? {
103
+ Some ( states) => states,
104
+ None => return Ok ( default_response) ,
105
+ } ;
111
106
112
107
let validators = vec ! [ channel. leader, channel. follower] ;
113
108
let channel_id = channel. id ( ) ;
@@ -126,7 +121,7 @@ pub async fn last_approved<C: Locked + 'static>(
126
121
127
122
Ok ( Json ( LastApprovedResponse {
128
123
last_approved : Some ( LastApproved {
129
- new_state,
124
+ new_state : Some ( new_state ) ,
130
125
approve_state : Some ( approve_state) ,
131
126
} ) ,
132
127
heartbeats,
@@ -193,19 +188,21 @@ pub async fn get_spender_limits<C: Locked + 'static>(
193
188
}
194
189
} ;
195
190
196
- let new_state = match get_corresponding_new_state ( & app. pool , & app. logger , channel) . await ? {
197
- Some ( new_state) => new_state,
198
- None => {
199
- return Ok ( Json ( SpenderResponse {
200
- spender : Spender {
201
- total_deposited : latest_spendable. deposit . total ,
202
- total_spent : None ,
203
- } ,
204
- } ) )
205
- }
206
- } ;
191
+ let ( _, new_state) =
192
+ match get_corresponding_states :: < CheckedState > ( & app. pool , & app. logger , channel) . await ? {
193
+ Some ( new_state) => new_state,
194
+ None => {
195
+ return Ok ( Json ( SpenderResponse {
196
+ spender : Spender {
197
+ total_deposited : latest_spendable. deposit . total ,
198
+ total_spent : None ,
199
+ } ,
200
+ } ) )
201
+ }
202
+ } ;
207
203
208
204
let total_spent = new_state
205
+ . msg
209
206
. balances
210
207
. spenders
211
208
. get ( & spender)
@@ -235,7 +232,8 @@ pub async fn get_all_spender_limits<C: Locked + 'static>(
235
232
. checked_mul ( limit. into ( ) )
236
233
. ok_or_else ( || ResponseError :: FailedValidation ( "Page and/or limit is too large" . into ( ) ) ) ?;
237
234
238
- let new_state = get_corresponding_new_state ( & app. pool , & app. logger , & channel) . await ?;
235
+ let corresponding_states =
236
+ get_corresponding_states :: < CheckedState > ( & app. pool , & app. logger , & channel) . await ?;
239
237
240
238
let mut all_spender_limits: HashMap < Address , Spender > = HashMap :: new ( ) ;
241
239
@@ -245,16 +243,20 @@ pub async fn get_all_spender_limits<C: Locked + 'static>(
245
243
// Using for loop to avoid async closures
246
244
for spendable in all_spendables {
247
245
let spender = spendable. spender ;
248
- let total_spent = match new_state {
249
- Some ( ref new_state) => new_state. balances . spenders . get ( & spender) . map ( |balance| {
250
- spendable
251
- . deposit
252
- . total
253
- . checked_sub ( balance)
254
- . unwrap_or_default ( )
255
- } ) ,
256
- None => None ,
257
- } ;
246
+ let total_spent = corresponding_states. as_ref ( ) . and_then ( |( _, new_state) | {
247
+ new_state
248
+ . msg
249
+ . balances
250
+ . spenders
251
+ . get ( & spender)
252
+ . map ( |balance| {
253
+ spendable
254
+ . deposit
255
+ . total
256
+ . checked_sub ( balance)
257
+ . unwrap_or_default ( )
258
+ } )
259
+ } ) ;
258
260
259
261
let spender_info = Spender {
260
262
total_deposited : spendable. deposit . total ,
@@ -300,8 +302,10 @@ pub async fn add_spender_leaf<C: Locked + 'static>(
300
302
}
301
303
} ;
302
304
303
- let new_state =
304
- match get_corresponding_new_state ( & app. pool , & app. logger , & channel. context ) . await ? {
305
+ let ( _, new_state) =
306
+ match get_corresponding_states :: < CheckedState > ( & app. pool , & app. logger , & channel. context )
307
+ . await ?
308
+ {
305
309
Some ( new_state) => new_state,
306
310
None => {
307
311
return Ok ( Json ( SpenderResponse {
@@ -313,11 +317,7 @@ pub async fn add_spender_leaf<C: Locked + 'static>(
313
317
}
314
318
} ;
315
319
316
- let total_spent = new_state
317
- . balances
318
- . spenders
319
- . get ( & spender)
320
- . map ( |spent| spent. to_owned ( ) ) ;
320
+ let total_spent = new_state. msg . balances . spenders . get ( & spender) . copied ( ) ;
321
321
322
322
Ok ( Json ( SpenderResponse {
323
323
spender : Spender {
@@ -327,28 +327,38 @@ pub async fn add_spender_leaf<C: Locked + 'static>(
327
327
} ) )
328
328
}
329
329
330
- async fn get_corresponding_new_state (
330
+ /// Retrieves the [`Channel`]'s latest [`ApproveState`] and the corresponding
331
+ /// approved [`NewState`].
332
+ ///
333
+ /// # Errors
334
+ ///
335
+ /// - Returns [`ResponseError::NotFound`] if there is no [`ApproveState`]
336
+ /// generated for the [`Channel`], i.e. the [`Channel`] is new.
337
+ ///
338
+ /// - Returns [`ResponseError::BadRequest`] if the [`ApproveState`]'s
339
+ /// corresponding approve [`NewState`] is not found.
340
+ ///
341
+ /// - Returns [`ResponseError::BadRequest`] if the [`NewState`]'s
342
+ /// [`Balances`] don't align, i.e. `sum(earner) != sum(spenders)`
343
+ ///
344
+ /// [`ApproveState`]: primitives::validator::ApproveState
345
+ async fn get_corresponding_states < S : BalancesState > (
331
346
pool : & DbPool ,
332
347
logger : & Logger ,
333
348
channel : & Channel ,
334
- ) -> Result < Option < NewState < CheckedState > > , ResponseError > {
349
+ ) -> Result < Option < ( MessageResponse < ApproveState > , MessageResponse < NewState < S > > ) > , ResponseError > {
335
350
let approve_state = match latest_approve_state ( pool, channel) . await ? {
336
351
Some ( approve_state) => approve_state,
337
352
None => return Ok ( None ) ,
338
353
} ;
339
354
340
355
let state_root = approve_state. msg . state_root . clone ( ) ;
341
356
342
- match latest_new_state ( pool, channel, & state_root) . await ? {
343
- Some ( new_state) => {
344
- let new_state = new_state. msg . into_inner ( ) . try_checked ( ) . map_err ( |err| {
345
- error ! ( & logger, "Balances are not aligned in an approved NewState: {}" , & err; "module" => "get_spender_limits" ) ;
346
- ResponseError :: BadRequest ( "Balances are not aligned in an approved NewState" . to_string ( ) )
347
- } ) ?;
348
- Ok ( Some ( new_state) )
349
- }
357
+ match latest_new_state :: < S > ( pool, channel, & state_root) . await ? {
358
+ Some ( new_state) => Ok ( Some ( ( approve_state, new_state) ) ) ,
350
359
None => {
351
- error ! ( & logger, "{}" , "Fatal error! The NewState for the last ApproveState was not found" ; "module" => "get_spender_limits" ) ;
360
+ error ! ( & logger, "{}" , "Fatal error! The NewState for the last ApproveState was not found" ; "module" => "routes::channel" ) ;
361
+
352
362
Err ( ResponseError :: BadRequest (
353
363
"Fatal error! The NewState for the last ApproveState was not found" . to_string ( ) ,
354
364
) )
@@ -520,16 +530,10 @@ pub async fn get_leaf<C: Locked + 'static>(
520
530
) -> Result < Json < GetLeafResponse > , ResponseError > {
521
531
let channel = channel_context. context ;
522
532
523
- let approve_state = latest_approve_state ( & app. pool , & channel)
533
+ let ( _ , new_state ) = get_corresponding_states :: < CheckedState > ( & app. pool , & app . logger , & channel)
524
534
. await ?
525
535
. ok_or ( ResponseError :: NotFound ) ?;
526
536
527
- let state_root = approve_state. msg . state_root . clone ( ) ;
528
-
529
- let new_state = latest_new_state ( & app. pool , & channel, & state_root)
530
- . await ?
531
- . ok_or_else ( || ResponseError :: BadRequest ( "No NewState message for spender" . to_string ( ) ) ) ?;
532
-
533
537
let addr = params. 1 ;
534
538
535
539
let element = match leaf_for {
0 commit comments