From 22dc5568ea2e1e513bdbdb6df225287102efe479 Mon Sep 17 00:00:00 2001 From: Enzo Cioppettini Date: Tue, 12 Dec 2023 12:25:58 -0300 Subject: [PATCH] carp funnel: add last epoch to the cache --- .../paima-funnel/src/funnels/FunnelCache.ts | 9 ++++++++- .../paima-funnel/src/funnels/carp/funnel.ts | 17 ++++++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/engine/paima-funnel/src/funnels/FunnelCache.ts b/packages/engine/paima-funnel/src/funnels/FunnelCache.ts index 1c85b8f5d..7d41e5cc3 100644 --- a/packages/engine/paima-funnel/src/funnels/FunnelCache.ts +++ b/packages/engine/paima-funnel/src/funnels/FunnelCache.ts @@ -76,6 +76,7 @@ export class RpcCacheEntry implements FunnelCacheEntry { export type CarpFunnelCacheEntryState = { startingSlot: number; lastPoint: { blockHeight: number; timestamp: number } | undefined; + epoch: number | undefined; }; export class CarpFunnelCacheEntry implements FunnelCacheEntry { @@ -83,7 +84,7 @@ export class CarpFunnelCacheEntry implements FunnelCacheEntry { public static readonly SYMBOL = Symbol('CarpFunnelStartingSlot'); public updateStartingSlot(startingSlot: number): void { - this.state = { startingSlot, lastPoint: this.state?.lastPoint }; + this.state = { startingSlot, lastPoint: this.state?.lastPoint, epoch: this.state?.epoch }; } public updateLastPoint(blockHeight: number, timestamp: number): void { @@ -92,6 +93,12 @@ export class CarpFunnelCacheEntry implements FunnelCacheEntry { } } + public updateEpoch(epoch: number): void { + if (this.state) { + this.state.epoch = epoch; + } + } + public initialized(): boolean { return !!this.state; } diff --git a/packages/engine/paima-funnel/src/funnels/carp/funnel.ts b/packages/engine/paima-funnel/src/funnels/carp/funnel.ts index cfd174ded..37487ecc5 100644 --- a/packages/engine/paima-funnel/src/funnels/carp/funnel.ts +++ b/packages/engine/paima-funnel/src/funnels/carp/funnel.ts @@ -25,6 +25,7 @@ import { query } from '@dcspark/carp-client/client/src/index'; import { Routes } from '@dcspark/carp-client/shared/routes'; import { FUNNEL_PRESYNC_FINISHED, InternalEventType } from '@paima/utils/src/constants'; import { CarpFunnelCacheEntry } from '../FunnelCache.js'; +import { getCardanoEpoch } from '@paima/db'; const delayForWaitingForFinalityLoop = 1000; @@ -154,10 +155,6 @@ export class CarpFunnel extends BaseFunnel implements ChainFunnel { const composed = composeChainData(this.bufferedData, grouped); - this.bufferedData = null; - - let prevEpoch; - for (const data of composed) { if (!data.internalEvents) { data.internalEvents = [] as InternalEvent[]; @@ -166,6 +163,8 @@ export class CarpFunnel extends BaseFunnel implements ChainFunnel { timestampToAbsoluteSlot(data.timestamp, this.confirmationDepth) ); + const prevEpoch = this.cache.getState().epoch; + if (!prevEpoch || epoch !== prevEpoch) { data.internalEvents?.push({ type: InternalEventType.CardanoBestEpoch, @@ -173,10 +172,12 @@ export class CarpFunnel extends BaseFunnel implements ChainFunnel { }); } - prevEpoch = epoch; + this.cache.updateEpoch(epoch); } } + this.bufferedData = null; + return composed; } @@ -253,6 +254,12 @@ export class CarpFunnel extends BaseFunnel implements ChainFunnel { ) ); + const epoch = await getCardanoEpoch.run(undefined, dbTx); + + if (epoch.length === 1) { + newEntry.updateEpoch(epoch[0].epoch); + } + return newEntry; })();