@lodestar/validator 1.46.0-dev.94030df26b → 1.46.0-dev.aa562e6793

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/lib/services/attestation.d.ts +2 -1
  2. package/lib/services/attestation.d.ts.map +1 -1
  3. package/lib/services/attestation.js.map +1 -1
  4. package/lib/services/attestationDuties.d.ts +2 -1
  5. package/lib/services/attestationDuties.d.ts.map +1 -1
  6. package/lib/services/attestationDuties.js +1 -1
  7. package/lib/services/attestationDuties.js.map +1 -1
  8. package/lib/services/block.d.ts +2 -1
  9. package/lib/services/block.d.ts.map +1 -1
  10. package/lib/services/block.js.map +1 -1
  11. package/lib/services/blockDuties.d.ts +2 -1
  12. package/lib/services/blockDuties.d.ts.map +1 -1
  13. package/lib/services/blockDuties.js.map +1 -1
  14. package/lib/services/doppelgangerService.d.ts +1 -1
  15. package/lib/services/doppelgangerService.d.ts.map +1 -1
  16. package/lib/services/doppelgangerService.js.map +1 -1
  17. package/lib/services/prepareBeaconProposer.d.ts +2 -1
  18. package/lib/services/prepareBeaconProposer.d.ts.map +1 -1
  19. package/lib/services/prepareBeaconProposer.js.map +1 -1
  20. package/lib/services/proposerPreferences.d.ts +2 -1
  21. package/lib/services/proposerPreferences.d.ts.map +1 -1
  22. package/lib/services/proposerPreferences.js.map +1 -1
  23. package/lib/services/ptc.d.ts +2 -1
  24. package/lib/services/ptc.d.ts.map +1 -1
  25. package/lib/services/ptc.js.map +1 -1
  26. package/lib/services/ptcDuties.d.ts +2 -1
  27. package/lib/services/ptcDuties.d.ts.map +1 -1
  28. package/lib/services/ptcDuties.js.map +1 -1
  29. package/lib/services/syncCommittee.d.ts +2 -1
  30. package/lib/services/syncCommittee.d.ts.map +1 -1
  31. package/lib/services/syncCommittee.js.map +1 -1
  32. package/lib/services/syncCommitteeDuties.d.ts +2 -1
  33. package/lib/services/syncCommitteeDuties.d.ts.map +1 -1
  34. package/lib/services/syncCommitteeDuties.js.map +1 -1
  35. package/lib/services/syncingStatusTracker.d.ts +1 -1
  36. package/lib/services/syncingStatusTracker.d.ts.map +1 -1
  37. package/lib/services/syncingStatusTracker.js.map +1 -1
  38. package/lib/util/index.d.ts +0 -1
  39. package/lib/util/index.d.ts.map +1 -1
  40. package/lib/util/index.js +0 -1
  41. package/lib/util/index.js.map +1 -1
  42. package/lib/util/logger.d.ts +1 -1
  43. package/lib/util/logger.d.ts.map +1 -1
  44. package/lib/util/logger.js.map +1 -1
  45. package/lib/validator.d.ts +1 -1
  46. package/lib/validator.d.ts.map +1 -1
  47. package/lib/validator.js +1 -2
  48. package/lib/validator.js.map +1 -1
  49. package/package.json +12 -12
  50. package/src/services/attestation.ts +2 -2
  51. package/src/services/attestationDuties.ts +7 -2
  52. package/src/services/block.ts +2 -1
  53. package/src/services/blockDuties.ts +2 -2
  54. package/src/services/doppelgangerService.ts +1 -2
  55. package/src/services/prepareBeaconProposer.ts +2 -1
  56. package/src/services/proposerPreferences.ts +2 -2
  57. package/src/services/ptc.ts +2 -1
  58. package/src/services/ptcDuties.ts +2 -2
  59. package/src/services/syncCommittee.ts +2 -1
  60. package/src/services/syncCommitteeDuties.ts +2 -1
  61. package/src/services/syncingStatusTracker.ts +1 -1
  62. package/src/util/index.ts +0 -1
  63. package/src/util/logger.ts +1 -1
  64. package/src/validator.ts +1 -2
  65. package/lib/util/clock.d.ts +0 -55
  66. package/lib/util/clock.d.ts.map +0 -1
  67. package/lib/util/clock.js +0 -141
  68. package/lib/util/clock.js.map +0 -1
  69. package/src/util/clock.ts +0 -182
@@ -1,55 +0,0 @@
1
- import { ChainForkConfig } from "@lodestar/config";
2
- import { Epoch, Slot, TimeSeconds } from "@lodestar/types";
3
- import { Logger } from "@lodestar/utils";
4
- type RunEveryFn = (slot: Slot, signal: AbortSignal) => Promise<void>;
5
- export type ClockOptions = {
6
- skipSlots?: boolean;
7
- };
8
- export interface IClock {
9
- readonly genesisTime: number;
10
- readonly secondsPerSlot: number;
11
- readonly currentEpoch: number;
12
- start(signal: AbortSignal): void;
13
- runEverySlot(fn: (slot: Slot, signal: AbortSignal) => Promise<void>): void;
14
- runEveryEpoch(fn: (epoch: Epoch, signal: AbortSignal) => Promise<void>): void;
15
- msToSlot(slot: Slot): number;
16
- msFromSlot(slot: Slot): number;
17
- secFromSlot(slot: Slot): number;
18
- getCurrentSlot(): Slot;
19
- getCurrentEpoch(): Epoch;
20
- }
21
- export declare enum TimeItem {
22
- Slot = 0,
23
- Epoch = 1
24
- }
25
- export declare class Clock implements IClock {
26
- private readonly opts;
27
- readonly genesisTime: number;
28
- readonly secondsPerSlot: number;
29
- private readonly config;
30
- private readonly logger;
31
- private readonly fns;
32
- constructor(config: ChainForkConfig, logger: Logger, opts: {
33
- genesisTime: number;
34
- } & ClockOptions);
35
- get currentEpoch(): Epoch;
36
- start(signal: AbortSignal): void;
37
- getCurrentSlot(): Slot;
38
- getCurrentEpoch(): Epoch;
39
- runEverySlot(fn: RunEveryFn): void;
40
- runEveryEpoch(fn: RunEveryFn): void;
41
- /** Milliseconds from now to a specific slot */
42
- msToSlot(slot: Slot): number;
43
- /** Milliseconds elapsed from a specific slot to now */
44
- msFromSlot(slot: Slot): number;
45
- /** Seconds elapsed from a specific slot to now */
46
- secFromSlot(slot: Slot): number;
47
- private runAtMostEvery;
48
- private timeUntilNext;
49
- }
50
- /**
51
- * Same to the spec but we use Math.round instead of Math.floor.
52
- */
53
- export declare function getCurrentSlotAround(config: ChainForkConfig, genesisTime: TimeSeconds): Slot;
54
- export {};
55
- //# sourceMappingURL=clock.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clock.d.ts","sourceRoot":"","sources":["../../src/util/clock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAC,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAe,MAAM,EAAwB,MAAM,iBAAiB,CAAC;AAE5E,KAAK,UAAU,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAErE,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC,YAAY,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3E,aAAa,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC9E,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC;IAC7B,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC;IAC/B,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC;IAChC,cAAc,IAAI,IAAI,CAAC;IACvB,eAAe,IAAI,KAAK,CAAC;CAC1B;AAED,oBAAY,QAAQ;IAClB,IAAI,IAAA;IACJ,KAAK,IAAA;CACN;AAED,qBAAa,KAAM,YAAW,MAAM;IAUhC,OAAO,CAAC,QAAQ,CAAC,IAAI;IATvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA8C;IAElE,YACE,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,EACG,IAAI,EAAE;QAAC,WAAW,EAAE,MAAM,CAAA;KAAC,GAAG,YAAY,EAM5D;IAED,IAAI,YAAY,IAAI,KAAK,CAExB;IAED,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAQ/B;IAED,cAAc,IAAI,IAAI,CAErB;IAED,eAAe,IAAI,KAAK,CAEvB;IAED,YAAY,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,CAEjC;IAED,aAAa,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,CAElC;IAED,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAE3B;IAED,uDAAuD;IACvD,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAE7B;IAED,kDAAkD;IAClD,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAE9B;YAQa,cAAc;IA2C5B,OAAO,CAAC,aAAa;CAgBtB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI,CAI5F"}
package/lib/util/clock.js DELETED
@@ -1,141 +0,0 @@
1
- import { GENESIS_SLOT, SLOTS_PER_EPOCH } from "@lodestar/params";
2
- import { computeEpochAtSlot, computeTimeAtSlot, getCurrentSlot } from "@lodestar/state-transition";
3
- import { ErrorAborted, isErrorAborted, sleep } from "@lodestar/utils";
4
- export { TimeItem };
5
- var TimeItem;
6
- (function (TimeItem) {
7
- TimeItem[TimeItem["Slot"] = 0] = "Slot";
8
- TimeItem[TimeItem["Epoch"] = 1] = "Epoch";
9
- })(TimeItem || (TimeItem = {}));
10
- export class Clock {
11
- opts;
12
- genesisTime;
13
- secondsPerSlot;
14
- config;
15
- logger;
16
- fns = [];
17
- constructor(config, logger, opts) {
18
- this.opts = opts;
19
- this.genesisTime = opts.genesisTime;
20
- this.secondsPerSlot = config.SLOT_DURATION_MS / 1000;
21
- this.config = config;
22
- this.logger = logger;
23
- }
24
- get currentEpoch() {
25
- return computeEpochAtSlot(getCurrentSlot(this.config, this.genesisTime));
26
- }
27
- start(signal) {
28
- for (const { timeItem, fn } of this.fns) {
29
- this.runAtMostEvery(timeItem, signal, fn).catch((e) => {
30
- if (!isErrorAborted(e)) {
31
- this.logger.error("runAtMostEvery", {}, e);
32
- }
33
- });
34
- }
35
- }
36
- getCurrentSlot() {
37
- return getCurrentSlot(this.config, this.genesisTime);
38
- }
39
- getCurrentEpoch() {
40
- return computeEpochAtSlot(getCurrentSlot(this.config, this.genesisTime));
41
- }
42
- runEverySlot(fn) {
43
- this.fns.push({ timeItem: TimeItem.Slot, fn });
44
- }
45
- runEveryEpoch(fn) {
46
- this.fns.push({ timeItem: TimeItem.Epoch, fn });
47
- }
48
- /** Milliseconds from now to a specific slot */
49
- msToSlot(slot) {
50
- return computeTimeAtSlot(this.config, slot, this.genesisTime) * 1000 - Date.now();
51
- }
52
- /** Milliseconds elapsed from a specific slot to now */
53
- msFromSlot(slot) {
54
- return Date.now() - computeTimeAtSlot(this.config, slot, this.genesisTime) * 1000;
55
- }
56
- /** Seconds elapsed from a specific slot to now */
57
- secFromSlot(slot) {
58
- return Date.now() / 1000 - computeTimeAtSlot(this.config, slot, this.genesisTime);
59
- }
60
- /**
61
- * If a task happens to take more than one slot to run, we might skip a slot. This is unfortunate,
62
- * however the alternative is to *always* process every slot, which has the chance of creating a
63
- * theoretically unlimited backlog of tasks. It was a conscious decision to choose to drop tasks
64
- * on an overloaded/latent system rather than overload it even more.
65
- */
66
- async runAtMostEvery(timeItem, signal, fn) {
67
- // Run immediately first
68
- let slot = getCurrentSlot(this.config, this.genesisTime);
69
- let slotOrEpoch = timeItem === TimeItem.Slot ? slot : computeEpochAtSlot(slot);
70
- while (!signal.aborted) {
71
- // Must catch fn() to ensure `sleep()` is awaited both for resolve and reject
72
- const task = fn(slotOrEpoch, signal).catch((e) => {
73
- if (!isErrorAborted(e))
74
- this.logger.error("Error on runEvery fn", {}, e);
75
- });
76
- if (timeItem !== TimeItem.Slot || this.opts.skipSlots !== false) {
77
- // await response to only continue with next task if current task finished within slot
78
- await task;
79
- }
80
- try {
81
- await sleep(this.timeUntilNext(timeItem), signal);
82
- // calling getCurrentSlot here may not be correct when we're close to the next slot
83
- // it's safe to call getCurrentSlotAround after we sleep
84
- const nextSlot = getCurrentSlotAround(this.config, this.genesisTime);
85
- if (timeItem === TimeItem.Slot) {
86
- if (nextSlot > slot + 1) {
87
- // It's not very likely that we skip more than one slot as HTTP timeout is set
88
- // to SLOT_DURATION_MS so we will fail task before skipping another slot.
89
- this.logger.warn("Skipped slot due to task taking more than one slot to run", {
90
- skippedSlot: slot + 1,
91
- });
92
- }
93
- slotOrEpoch = nextSlot;
94
- }
95
- else {
96
- slotOrEpoch = computeEpochAtSlot(nextSlot);
97
- }
98
- slot = nextSlot;
99
- }
100
- catch (e) {
101
- if (e instanceof ErrorAborted) {
102
- return;
103
- }
104
- throw e;
105
- }
106
- }
107
- }
108
- timeUntilNext(timeItem) {
109
- const milliSecondsPerSlot = this.config.SLOT_DURATION_MS;
110
- const msFromGenesis = Date.now() - this.genesisTime * 1000;
111
- if (timeItem === TimeItem.Slot) {
112
- if (msFromGenesis >= 0) {
113
- return milliSecondsPerSlot - (msFromGenesis % milliSecondsPerSlot);
114
- }
115
- return Math.abs(msFromGenesis) % milliSecondsPerSlot;
116
- }
117
- const milliSecondsPerEpoch = SLOTS_PER_EPOCH * milliSecondsPerSlot;
118
- if (msFromGenesis >= 0) {
119
- return milliSecondsPerEpoch - (msFromGenesis % milliSecondsPerEpoch);
120
- }
121
- return Math.abs(msFromGenesis) % milliSecondsPerEpoch;
122
- }
123
- }
124
- /**
125
- * Same to the spec but we use Math.round instead of Math.floor.
126
- */
127
- export function getCurrentSlotAround(config, genesisTime) {
128
- const diffInSeconds = Date.now() / 1000 - genesisTime;
129
- const slotsSinceGenesis = Math.round((diffInSeconds * 1000) / config.SLOT_DURATION_MS);
130
- return GENESIS_SLOT + slotsSinceGenesis;
131
- }
132
- // function useEventStream() {
133
- // this.stream = this.events.getEventStream([BeaconEventType.BLOCK, BeaconEventType.HEAD, BeaconEventType.CHAIN_REORG]);
134
- // pipeToEmitter(this.stream, this).catch((e: Error) => {
135
- // this.logger.error("Error on stream pipe", {}, e);
136
- // });
137
- // // On stop
138
- // this.stream.stop();
139
- // this.stream = null;
140
- // }
141
- //# sourceMappingURL=clock.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clock.js","sourceRoot":"","sources":["../../src/util/clock.ts"],"names":[],"mappings":"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"}
package/src/util/clock.ts DELETED
@@ -1,182 +0,0 @@
1
- import {ChainForkConfig} from "@lodestar/config";
2
- import {GENESIS_SLOT, SLOTS_PER_EPOCH} from "@lodestar/params";
3
- import {computeEpochAtSlot, computeTimeAtSlot, getCurrentSlot} from "@lodestar/state-transition";
4
- import {Epoch, Slot, TimeSeconds} from "@lodestar/types";
5
- import {ErrorAborted, Logger, isErrorAborted, sleep} from "@lodestar/utils";
6
-
7
- type RunEveryFn = (slot: Slot, signal: AbortSignal) => Promise<void>;
8
-
9
- export type ClockOptions = {
10
- skipSlots?: boolean;
11
- };
12
-
13
- export interface IClock {
14
- readonly genesisTime: number;
15
- readonly secondsPerSlot: number;
16
-
17
- readonly currentEpoch: number;
18
-
19
- start(signal: AbortSignal): void;
20
- runEverySlot(fn: (slot: Slot, signal: AbortSignal) => Promise<void>): void;
21
- runEveryEpoch(fn: (epoch: Epoch, signal: AbortSignal) => Promise<void>): void;
22
- msToSlot(slot: Slot): number;
23
- msFromSlot(slot: Slot): number;
24
- secFromSlot(slot: Slot): number;
25
- getCurrentSlot(): Slot;
26
- getCurrentEpoch(): Epoch;
27
- }
28
-
29
- export enum TimeItem {
30
- Slot,
31
- Epoch,
32
- }
33
-
34
- export class Clock implements IClock {
35
- readonly genesisTime: number;
36
- readonly secondsPerSlot: number;
37
- private readonly config: ChainForkConfig;
38
- private readonly logger: Logger;
39
- private readonly fns: {timeItem: TimeItem; fn: RunEveryFn}[] = [];
40
-
41
- constructor(
42
- config: ChainForkConfig,
43
- logger: Logger,
44
- private readonly opts: {genesisTime: number} & ClockOptions
45
- ) {
46
- this.genesisTime = opts.genesisTime;
47
- this.secondsPerSlot = config.SLOT_DURATION_MS / 1000;
48
- this.config = config;
49
- this.logger = logger;
50
- }
51
-
52
- get currentEpoch(): Epoch {
53
- return computeEpochAtSlot(getCurrentSlot(this.config, this.genesisTime));
54
- }
55
-
56
- start(signal: AbortSignal): void {
57
- for (const {timeItem, fn} of this.fns) {
58
- this.runAtMostEvery(timeItem, signal, fn).catch((e: Error) => {
59
- if (!isErrorAborted(e)) {
60
- this.logger.error("runAtMostEvery", {}, e);
61
- }
62
- });
63
- }
64
- }
65
-
66
- getCurrentSlot(): Slot {
67
- return getCurrentSlot(this.config, this.genesisTime);
68
- }
69
-
70
- getCurrentEpoch(): Epoch {
71
- return computeEpochAtSlot(getCurrentSlot(this.config, this.genesisTime));
72
- }
73
-
74
- runEverySlot(fn: RunEveryFn): void {
75
- this.fns.push({timeItem: TimeItem.Slot, fn});
76
- }
77
-
78
- runEveryEpoch(fn: RunEveryFn): void {
79
- this.fns.push({timeItem: TimeItem.Epoch, fn});
80
- }
81
-
82
- /** Milliseconds from now to a specific slot */
83
- msToSlot(slot: Slot): number {
84
- return computeTimeAtSlot(this.config, slot, this.genesisTime) * 1000 - Date.now();
85
- }
86
-
87
- /** Milliseconds elapsed from a specific slot to now */
88
- msFromSlot(slot: Slot): number {
89
- return Date.now() - computeTimeAtSlot(this.config, slot, this.genesisTime) * 1000;
90
- }
91
-
92
- /** Seconds elapsed from a specific slot to now */
93
- secFromSlot(slot: Slot): number {
94
- return Date.now() / 1000 - computeTimeAtSlot(this.config, slot, this.genesisTime);
95
- }
96
-
97
- /**
98
- * If a task happens to take more than one slot to run, we might skip a slot. This is unfortunate,
99
- * however the alternative is to *always* process every slot, which has the chance of creating a
100
- * theoretically unlimited backlog of tasks. It was a conscious decision to choose to drop tasks
101
- * on an overloaded/latent system rather than overload it even more.
102
- */
103
- private async runAtMostEvery(timeItem: TimeItem, signal: AbortSignal, fn: RunEveryFn): Promise<void> {
104
- // Run immediately first
105
- let slot = getCurrentSlot(this.config, this.genesisTime);
106
- let slotOrEpoch = timeItem === TimeItem.Slot ? slot : computeEpochAtSlot(slot);
107
- while (!signal.aborted) {
108
- // Must catch fn() to ensure `sleep()` is awaited both for resolve and reject
109
- const task = fn(slotOrEpoch, signal).catch((e: Error) => {
110
- if (!isErrorAborted(e)) this.logger.error("Error on runEvery fn", {}, e);
111
- });
112
-
113
- if (timeItem !== TimeItem.Slot || this.opts.skipSlots !== false) {
114
- // await response to only continue with next task if current task finished within slot
115
- await task;
116
- }
117
-
118
- try {
119
- await sleep(this.timeUntilNext(timeItem), signal);
120
- // calling getCurrentSlot here may not be correct when we're close to the next slot
121
- // it's safe to call getCurrentSlotAround after we sleep
122
- const nextSlot = getCurrentSlotAround(this.config, this.genesisTime);
123
-
124
- if (timeItem === TimeItem.Slot) {
125
- if (nextSlot > slot + 1) {
126
- // It's not very likely that we skip more than one slot as HTTP timeout is set
127
- // to SLOT_DURATION_MS so we will fail task before skipping another slot.
128
- this.logger.warn("Skipped slot due to task taking more than one slot to run", {
129
- skippedSlot: slot + 1,
130
- });
131
- }
132
- slotOrEpoch = nextSlot;
133
- } else {
134
- slotOrEpoch = computeEpochAtSlot(nextSlot);
135
- }
136
- slot = nextSlot;
137
- } catch (e) {
138
- if (e instanceof ErrorAborted) {
139
- return;
140
- }
141
- throw e;
142
- }
143
- }
144
- }
145
-
146
- private timeUntilNext(timeItem: TimeItem): number {
147
- const milliSecondsPerSlot = this.config.SLOT_DURATION_MS;
148
- const msFromGenesis = Date.now() - this.genesisTime * 1000;
149
-
150
- if (timeItem === TimeItem.Slot) {
151
- if (msFromGenesis >= 0) {
152
- return milliSecondsPerSlot - (msFromGenesis % milliSecondsPerSlot);
153
- }
154
- return Math.abs(msFromGenesis) % milliSecondsPerSlot;
155
- }
156
- const milliSecondsPerEpoch = SLOTS_PER_EPOCH * milliSecondsPerSlot;
157
- if (msFromGenesis >= 0) {
158
- return milliSecondsPerEpoch - (msFromGenesis % milliSecondsPerEpoch);
159
- }
160
- return Math.abs(msFromGenesis) % milliSecondsPerEpoch;
161
- }
162
- }
163
-
164
- /**
165
- * Same to the spec but we use Math.round instead of Math.floor.
166
- */
167
- export function getCurrentSlotAround(config: ChainForkConfig, genesisTime: TimeSeconds): Slot {
168
- const diffInSeconds = Date.now() / 1000 - genesisTime;
169
- const slotsSinceGenesis = Math.round((diffInSeconds * 1000) / config.SLOT_DURATION_MS);
170
- return GENESIS_SLOT + slotsSinceGenesis;
171
- }
172
-
173
- // function useEventStream() {
174
- // this.stream = this.events.getEventStream([BeaconEventType.BLOCK, BeaconEventType.HEAD, BeaconEventType.CHAIN_REORG]);
175
- // pipeToEmitter(this.stream, this).catch((e: Error) => {
176
- // this.logger.error("Error on stream pipe", {}, e);
177
- // });
178
-
179
- // // On stop
180
- // this.stream.stop();
181
- // this.stream = null;
182
- // }