@@ -14,13 +14,14 @@ use hyper::{Body, Request, Response};
14
14
use primitives:: {
15
15
adapter:: Adapter ,
16
16
channel_v5:: Channel as ChannelV5 ,
17
- config:: TokenInfo ,
17
+ config:: { Config , TokenInfo } ,
18
18
sentry:: {
19
19
channel_list:: { ChannelListQuery , LastApprovedQuery } ,
20
- LastApproved , LastApprovedResponse , SpenderResponse , SuccessResponse ,
20
+ AllSpendersResponse , LastApproved , LastApprovedResponse , MessageResponse , SpenderResponse ,
21
+ SuccessResponse ,
21
22
} ,
22
23
spender:: { Deposit , Spendable , Spender , SpenderLeaf } ,
23
- validator:: MessageTypes ,
24
+ validator:: { MessageTypes , NewState } ,
24
25
Address , Channel , ChannelId , UnifiedNum ,
25
26
} ;
26
27
use slog:: error;
@@ -298,38 +299,18 @@ pub async fn get_spender_limits<A: Adapter + 'static>(
298
299
. expect ( "Request should have Channel" )
299
300
. to_owned ( ) ;
300
301
301
- let channel_id = channel. id ( ) ;
302
302
let spender = Address :: from_str ( & route_params. index ( 1 ) ) ?;
303
303
304
- let latest_spendable = fetch_spendable ( app. pool . clone ( ) , & spender, & channel_id) . await ?;
305
- let token_info = app
306
- . config
307
- . token_address_whitelist
308
- . get ( & channel. token )
309
- . ok_or_else ( || ResponseError :: FailedValidation ( "Unsupported Channel Token" . to_string ( ) ) ) ?;
310
-
311
- let latest_spendable = match latest_spendable {
312
- Some ( spendable) => spendable,
313
- None => {
314
- create_spendable_document (
315
- & app. adapter ,
316
- token_info,
317
- app. pool . clone ( ) ,
318
- & channel,
319
- spender,
320
- )
321
- . await ?
322
- }
323
- } ;
324
-
325
- let approve_state = match latest_approve_state_v5 ( & app. pool , & channel) . await ? {
326
- Some ( approve_state) => approve_state,
327
- None => return spender_response_without_leaf ( latest_spendable. deposit . total ) ,
328
- } ;
329
-
330
- let state_root = approve_state. msg . state_root . clone ( ) ;
304
+ let latest_spendable = get_latest_spendable (
305
+ app. pool . clone ( ) ,
306
+ & app. config ,
307
+ & app. adapter ,
308
+ & spender,
309
+ & channel,
310
+ )
311
+ . await ?;
331
312
332
- let new_state = match latest_new_state_v5 ( & app. pool , & channel, & state_root ) . await ? {
313
+ let new_state = match get_corresponding_new_state ( & app. pool , & channel) . await {
333
314
Some ( new_state) => new_state,
334
315
None => return spender_response_without_leaf ( latest_spendable. deposit . total ) ,
335
316
} ;
@@ -351,6 +332,29 @@ pub async fn get_spender_limits<A: Adapter + 'static>(
351
332
Ok ( success_response ( serde_json:: to_string ( & res) ?) )
352
333
}
353
334
335
+ async fn get_latest_spendable (
336
+ pool : DbPool ,
337
+ config : & Config ,
338
+ adapter : & impl Adapter ,
339
+ spender : & Address ,
340
+ channel : & ChannelV5 ,
341
+ ) -> Result < Spendable , ResponseError > {
342
+ let latest_spendable = fetch_spendable ( pool. clone ( ) , spender, & channel. id ( ) ) . await ?;
343
+ let token_info = config
344
+ . token_address_whitelist
345
+ . get ( & channel. token )
346
+ . ok_or_else ( || ResponseError :: FailedValidation ( "Unsupported Channel Token" . to_string ( ) ) ) ?;
347
+
348
+ let latest_spendable = match latest_spendable {
349
+ Some ( spendable) => spendable,
350
+ None => {
351
+ create_spendable_document ( adapter, token_info, pool. clone ( ) , channel, * spender) . await ?
352
+ }
353
+ } ;
354
+
355
+ Ok ( latest_spendable)
356
+ }
357
+
354
358
pub async fn get_all_spender_limits < A : Adapter + ' static > (
355
359
req : Request < Body > ,
356
360
app : & Application < A > ,
@@ -361,66 +365,62 @@ pub async fn get_all_spender_limits<A: Adapter + 'static>(
361
365
. expect ( "Request should have Channel" )
362
366
. to_owned ( ) ;
363
367
364
- let new_state = get_corresponding_new_state ( & app. pool , & channel) . await . ok_or_else ( || ResponseError :: NotFound ) ?;
368
+ let new_state = get_corresponding_new_state ( & app. pool , & channel)
369
+ . await
370
+ . ok_or ( ResponseError :: NotFound ) ?;
365
371
366
- let mut all_spender_limits: HashMap < Address , SpenderResponse > = HashMap :: new ( ) ;
372
+ let mut all_spender_limits: HashMap < Address , Spender > = HashMap :: new ( ) ;
367
373
368
374
// Using for loop to avoid async closures
369
- for ( spender , balance) in new_state. msg . balances . iter ( ) {
370
- let latest_spendable = fetch_spendable ( app . pool . clone ( ) , & spender , & channel . id ( ) ) . await . expect ( "todo: fix" ) ;
371
-
372
- let latest_spendable = match latest_spendable {
373
- Some ( spendable ) => spendable ,
374
- None => create_spendable_document ( & app . adapter , app . pool . clone ( ) , & channel , & spender ) . await . expect ( "todo" ) ,
375
- } ;
376
-
377
- let total_deposited = latest_spendable . deposit . total . checked_add ( & latest_spendable . deposit . still_on_create2 ) . ok_or_else ( || ResponseError :: BadRequest ( "Total Deposited is too large" . to_string ( ) ) ) . expect ( "todo" ) ;
375
+ for ( spender_addr , balance) in new_state. msg . balances . spenders . iter ( ) {
376
+ let latest_spendable = get_latest_spendable (
377
+ app . pool . clone ( ) ,
378
+ & app . config ,
379
+ & app . adapter ,
380
+ spender_addr ,
381
+ & channel ,
382
+ )
383
+ . await ? ;
378
384
379
- // TODO: Maybe throw error if None?
385
+ let total_deposited = latest_spendable . deposit . total ;
380
386
let spender_leaf = get_spender_leaf_for_spender ( balance, & total_deposited) ;
381
387
382
- let spender_response = SpenderResponse {
383
- total_deposited : Some ( total_deposited ) ,
388
+ let spender_info = Spender {
389
+ total_deposited,
384
390
spender_leaf,
385
391
} ;
386
392
387
- all_spender_limits. insert ( spender . clone ( ) , spender_response ) ;
393
+ all_spender_limits. insert ( * spender_addr , spender_info ) ;
388
394
}
389
395
390
- // Format and return output
391
-
392
396
let res = AllSpendersResponse {
393
- spenders : Some ( all_spender_limits) ,
397
+ spenders : all_spender_limits,
394
398
} ;
395
399
396
400
Ok ( success_response ( serde_json:: to_string ( & res) ?) )
397
401
}
398
402
399
- async fn get_corresponding_new_state ( pool : & DbPool , channel : & ChannelV5 ) -> Option < MessageResponse < NewState > > {
400
- // Get all spenders for this channel
401
- let approve_state = match latest_approve_state_v5 ( & pool, & channel) . await {
402
- Ok ( Some ( approve_state) ) => approve_state,
403
- _ => return None ,
403
+ async fn get_corresponding_new_state (
404
+ pool : & DbPool ,
405
+ channel : & ChannelV5 ,
406
+ ) -> Option < MessageResponse < NewState > > {
407
+ let approve_state = match latest_approve_state_v5 ( pool, channel) . await . ok ( ) ? {
408
+ Some ( approve_state) => approve_state,
409
+ None => return None ,
404
410
} ;
405
411
406
412
let state_root = approve_state. msg . state_root . clone ( ) ;
407
413
408
- let new_state = match latest_new_state_v5 ( & pool, & channel, & state_root) . await {
409
- Ok ( Some ( new_state) ) => Some ( new_state) ,
410
- _ => None ,
411
- } ;
414
+ let new_state = latest_new_state_v5 ( pool, channel, & state_root) . await . ok ( ) ?;
412
415
413
416
new_state
414
417
}
415
418
416
- // TODO pass UnifiedNum instead
417
- fn get_spender_leaf_for_spender ( spender_balance : & BigNum , total_deposited : & UnifiedNum ) -> Option < SpenderLeaf > {
418
- let spender_balance = match spender_balance. to_u64 ( ) {
419
- Some ( balance) => UnifiedNum :: from_u64 ( balance) ,
420
- None => return None ,
421
- } ;
422
-
423
- let total_spent = match total_deposited. checked_sub ( & spender_balance) {
419
+ fn get_spender_leaf_for_spender (
420
+ spender_balance : & UnifiedNum ,
421
+ total_deposited : & UnifiedNum ,
422
+ ) -> Option < SpenderLeaf > {
423
+ let total_spent = match total_deposited. checked_sub ( spender_balance) {
424
424
Some ( spent) => spent,
425
425
None => return None ,
426
426
} ;
0 commit comments