-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathslice.ts
101 lines (95 loc) · 3.9 KB
/
slice.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import {ValidatorResponse} from "@chainsafe/lodestar-types";
import {toHexString} from "@chainsafe/ssz";
import {createSlice, PayloadAction} from "@reduxjs/toolkit";
import {ValidatorLogger} from "../../services/eth2/client/logger";
import {ICGKeystore} from "../../services/keystore";
import {ValidatorStatus} from "../../services/validator/status";
export interface IValidator {
name: string;
status: string;
publicKey: string;
network: string;
balance?: bigint;
keystore: ICGKeystore;
isRunning: boolean;
beaconNodes: string[];
}
export interface IValidatorComplete extends IValidator {
logger?: ValidatorLogger;
}
export interface IByPublicKey {
[publicKey: string]: IValidatorComplete;
}
export interface IValidatorState {
byPublicKey: IByPublicKey;
allPublicKeys: string[];
}
const initialState: IValidatorState = {
byPublicKey: {},
allPublicKeys: [],
};
export const validatorSlice = createSlice({
name: "validator",
initialState,
reducers: {
loadValidators: (state, action: PayloadAction<IValidator[]>): void => {
action.payload.forEach((validator) => {
state.byPublicKey[validator.publicKey] = validator;
if (!state.allPublicKeys.some((key) => key === validator.publicKey)) {
state.allPublicKeys.push(validator.publicKey);
}
});
},
addValidator: (state, action: PayloadAction<IValidator>): void => {
state.byPublicKey[action.payload.publicKey] = action.payload;
if (!state.allPublicKeys.some((key) => key === action.payload.publicKey)) {
state.allPublicKeys.push(action.payload.publicKey);
}
},
removeValidator: (state, action: PayloadAction<string>): void => {
delete state.byPublicKey[action.payload];
const index = state.allPublicKeys.findIndex((key) => key === action.payload);
if (index !== -1) {
state.allPublicKeys.splice(index, 1);
}
},
loadedValidatorsBalance: (state, action: PayloadAction<ValidatorResponse[]>): void => {
action.payload.forEach((response) => {
const publicKey = toHexString(response.pubkey);
//TODO: not ok, we need to fetch balance from different endpoint
state.byPublicKey[publicKey].balance = response.validator.effectiveBalance;
});
},
startValidatorService: {
reducer: (state, action: PayloadAction<ValidatorLogger, string, string>): void => {
state.byPublicKey[action.meta].isRunning = true;
state.byPublicKey[action.meta].logger = action.payload;
},
prepare: (logger: ValidatorLogger, publicKey: string): {payload: ValidatorLogger; meta: string} => ({
payload: logger,
meta: publicKey,
}),
},
storeValidatorBeaconNodes: {
reducer: (state, action: PayloadAction<string[], string, string>): void => {
state.byPublicKey[action.meta].beaconNodes = action.payload;
},
prepare: (beaconNodes: string[], publicKey: string): {payload: string[]; meta: string} => ({
payload: beaconNodes,
meta: publicKey,
}),
},
stopValidatorService: (state, action: PayloadAction<string>): void => {
state.byPublicKey[action.payload].isRunning = false;
},
loadValidatorStatus: {
reducer: (state, action: PayloadAction<ValidatorStatus, string, string>): void => {
state.byPublicKey[action.meta].status = action.payload;
},
prepare: (status: ValidatorStatus, validator: string): {payload: ValidatorStatus; meta: string} => ({
payload: status,
meta: validator,
}),
},
},
});