1
1
use crate :: {
2
2
error:: { Error , TickError } ,
3
- follower,
3
+ follower, leader ,
4
4
sentry_interface:: { campaigns:: all_campaigns, Validator , Validators } ,
5
5
SentryApi ,
6
6
} ;
7
7
use primitives:: { adapter:: Adapter , channel_v5:: Channel , config:: Config , util:: ApiUrl , ChannelId } ;
8
- // use slog::{error, info, Logger};
9
8
use slog:: Logger ;
10
9
use std:: collections:: { hash_map:: Entry , HashSet } ;
11
10
@@ -15,27 +14,22 @@ pub async fn channel_tick<A: Adapter + 'static>(
15
14
logger : & Logger ,
16
15
channel : Channel ,
17
16
validators : Validators ,
18
- ) -> Result < ChannelId , Error < A :: AdapterError > > {
17
+ ) -> Result < ChannelId , Error > {
19
18
let tick = channel
20
19
. find_validator ( adapter. whoami ( ) )
21
20
. ok_or ( Error :: ChannelNotIntendedForUs ) ?;
22
21
23
- let sentry = SentryApi :: init (
24
- adapter,
25
- logger. clone ( ) ,
26
- config. clone ( ) ,
27
- ( channel, validators) ,
28
- ) ?;
29
- // `GET /channel/:id/spender/all`
30
- let all_spenders = sentry. get_all_spenders ( ) . await ?;
22
+ let sentry = SentryApi :: init ( adapter, logger. clone ( ) , config. clone ( ) , validators) ?;
23
+ // 1. `GET /channel/:id/spender/all`
24
+ let all_spenders = sentry. get_all_spenders ( channel. id ( ) ) . await ?;
31
25
32
- // `GET /channel/:id/accounting`
26
+ // 2. `GET /channel/:id/accounting`
33
27
// Validation #1:
34
28
// sum(Accounting.spenders) == sum(Accounting.earners)
35
29
let accounting = sentry. get_accounting ( channel. id ( ) ) . await ?;
36
30
37
31
// Validation #2:
38
- // spender.spender_leaf. total_deposit >= accounting.balances.spenders[spender.address]
32
+ // spender.total_deposit >= accounting.balances.spenders[spender.address]
39
33
if !all_spenders. iter ( ) . all ( |( address, spender) | {
40
34
spender. total_deposited
41
35
>= accounting
@@ -48,22 +42,28 @@ pub async fn channel_tick<A: Adapter + 'static>(
48
42
return Err ( Error :: Validation ) ;
49
43
}
50
44
45
+ let token = config
46
+ . token_address_whitelist
47
+ . get ( & channel. token )
48
+ . ok_or ( Error :: ChannelTokenNotWhitelisted ) ?;
49
+
51
50
// TODO: Add timeout
52
- let _tick_result = match tick {
53
- primitives:: Validator :: Leader ( _v) => todo ! ( ) ,
54
- primitives:: Validator :: Follower ( _v) => {
55
- follower:: tick ( & sentry, channel, accounting. balances )
51
+ match tick {
52
+ primitives:: Validator :: Leader ( _v) => {
53
+ let _leader_tick_status = leader:: tick ( & sentry, channel, accounting. balances , token)
56
54
. await
57
- . map_err ( |err| Error :: FollowerTick ( channel. id ( ) , TickError :: Tick ( err) ) ) ?
55
+ . map_err ( |err| Error :: LeaderTick ( channel. id ( ) , TickError :: Tick ( Box :: new ( err) ) ) ) ?;
56
+ }
57
+ primitives:: Validator :: Follower ( _v) => {
58
+ let _follower_tick_status =
59
+ follower:: tick ( & sentry, channel, all_spenders, accounting. balances , token)
60
+ . await
61
+ . map_err ( |err| {
62
+ Error :: FollowerTick ( channel. id ( ) , TickError :: Tick ( Box :: new ( err) ) )
63
+ } ) ?;
58
64
}
59
65
} ;
60
66
61
- // Validation #3
62
- // Accounting.balances != NewState.balances
63
-
64
- // Validation #4
65
- // OUTPACE Rules:
66
-
67
67
Ok ( channel. id ( ) )
68
68
}
69
69
0 commit comments