diff --git a/CHANGELOG.md b/CHANGELOG.md index b33033fcc..fe9fd131e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## Unreleased ### Added +- Added createdAt timestamp to block, batch and settlement models.[#502](https://github.com/proto-kit/framework/pull/502) - Added missing block detection and recovery in the indexer.[#488](https://github.com/proto-kit/framework/pull/488) - `@dependencyFactory` for static dependency factory type safety - Added Mempool sorting [#395](https://github.com/proto-kit/framework/pull/395) diff --git a/packages/indexer/prisma/migrations/20260421115835_add_timestamp/migration.sql b/packages/indexer/prisma/migrations/20260421115835_add_timestamp/migration.sql new file mode 100644 index 000000000..a6bd08dbd --- /dev/null +++ b/packages/indexer/prisma/migrations/20260421115835_add_timestamp/migration.sql @@ -0,0 +1,16 @@ +/* + Warnings: + + - Added the required column `createdAt` to the `Batch` table without a default value. This is not possible if the table is not empty. + - Added the required column `createdAt` to the `Block` table without a default value. This is not possible if the table is not empty. + - Added the required column `createdAt` to the `Settlement` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "Batch" ADD COLUMN "createdAt" TIMESTAMP(3) NOT NULL; + +-- AlterTable +ALTER TABLE "Block" ADD COLUMN "createdAt" TIMESTAMP(3) NOT NULL; + +-- AlterTable +ALTER TABLE "Settlement" ADD COLUMN "createdAt" TIMESTAMP(3) NOT NULL; diff --git a/packages/indexer/prisma/schema.prisma b/packages/indexer/prisma/schema.prisma index 557665db9..7ef1da406 100644 --- a/packages/indexer/prisma/schema.prisma +++ b/packages/indexer/prisma/schema.prisma @@ -88,6 +88,7 @@ model Block { fromStateRoot String beforeBlockStateTransitions Json @db.Json + createdAt DateTime parentHash String? @unique parent Block? @relation("Parent", fields: [parentHash], references: [hash]) @@ -104,6 +105,7 @@ model Batch { height Int @id proof Json @db.Json + createdAt DateTime blocks Block[] @@ -128,6 +130,7 @@ model Settlement { // transaction String transactionHash String @id promisedMessagesHash String + createdAt DateTime batches Batch[] } diff --git a/packages/persistance/prisma/migrations/20260421120404_add_timestamp/migration.sql b/packages/persistance/prisma/migrations/20260421120404_add_timestamp/migration.sql new file mode 100644 index 000000000..34b6b0f33 --- /dev/null +++ b/packages/persistance/prisma/migrations/20260421120404_add_timestamp/migration.sql @@ -0,0 +1,8 @@ +-- AlterTable +ALTER TABLE "Batch" ADD COLUMN "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP; + +-- AlterTable +ALTER TABLE "Block" ADD COLUMN "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP; + +-- AlterTable +ALTER TABLE "Settlement" ADD COLUMN "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP; diff --git a/packages/persistance/prisma/schema.prisma b/packages/persistance/prisma/schema.prisma index 3613a00a6..8ad2d0a1b 100644 --- a/packages/persistance/prisma/schema.prisma +++ b/packages/persistance/prisma/schema.prisma @@ -108,6 +108,7 @@ model Block { fromStateRoot String beforeBlockStateTransitions Json @db.Json + createdAt DateTime @default(now()) parentHash String? @unique parent Block? @relation("Parent", fields: [parentHash], references: [hash]) @@ -124,6 +125,7 @@ model Batch { height Int @id proof Json @db.Json + createdAt DateTime @default(now()) blocks Block[] @@ -148,6 +150,7 @@ model Settlement { // transaction String transactionHash String @id promisedMessagesHash String + createdAt DateTime @default(now()) batches Batch[] } diff --git a/packages/persistance/src/services/prisma/PrismaBatchStore.ts b/packages/persistance/src/services/prisma/PrismaBatchStore.ts index eceaa84a7..51de78d9f 100644 --- a/packages/persistance/src/services/prisma/PrismaBatchStore.ts +++ b/packages/persistance/src/services/prisma/PrismaBatchStore.ts @@ -52,6 +52,7 @@ export class PrismaBatchStore implements BatchStorage { data: { proof: entity.proof as Prisma.InputJsonValue, height, + createdAt: new Date(batch.createdAt), blocks: { connect: batch.blockHashes.map((hash) => ({ hash, diff --git a/packages/persistance/src/services/prisma/mappers/BatchMapper.ts b/packages/persistance/src/services/prisma/mappers/BatchMapper.ts index e944d8766..e6c5547d7 100644 --- a/packages/persistance/src/services/prisma/mappers/BatchMapper.ts +++ b/packages/persistance/src/services/prisma/mappers/BatchMapper.ts @@ -15,6 +15,7 @@ export class BatchMapper implements ObjectMapper< blockHashes: input[1], proof: input[0].proof as JsonProof, height: input[0].height, + createdAt: input[0].createdAt.getTime(), }; } @@ -23,6 +24,7 @@ export class BatchMapper implements ObjectMapper< proof: input.proof, height: input.height, settlementTransactionHash: null, + createdAt: new Date(input.createdAt), }; return [batch, []]; } diff --git a/packages/persistance/src/services/prisma/mappers/BlockMapper.ts b/packages/persistance/src/services/prisma/mappers/BlockMapper.ts index bd5ee9b06..c16576ad1 100644 --- a/packages/persistance/src/services/prisma/mappers/BlockMapper.ts +++ b/packages/persistance/src/services/prisma/mappers/BlockMapper.ts @@ -45,6 +45,7 @@ export class BlockMapper implements ObjectMapper { beforeBlockStateTransitions: this.stArrayMapper.mapIn( input.beforeBlockStateTransitions ), + createdAt: new Date(input.createdAt).getTime(), }; } @@ -68,6 +69,7 @@ export class BlockMapper implements ObjectMapper { beforeBlockStateTransitions: this.stArrayMapper.mapOut( input.beforeBlockStateTransitions ), + createdAt: new Date(input.createdAt), }; } } diff --git a/packages/persistance/src/services/prisma/mappers/SettlementMapper.ts b/packages/persistance/src/services/prisma/mappers/SettlementMapper.ts index 8d495334c..53b096a18 100644 --- a/packages/persistance/src/services/prisma/mappers/SettlementMapper.ts +++ b/packages/persistance/src/services/prisma/mappers/SettlementMapper.ts @@ -15,6 +15,7 @@ export class SettlementMapper implements ObjectMapper< batches, transactionHash: settlement.transactionHash, promisedMessagesHash: settlement.promisedMessagesHash, + createdAt: settlement.createdAt.getTime(), }; } @@ -23,6 +24,7 @@ export class SettlementMapper implements ObjectMapper< { promisedMessagesHash: input.promisedMessagesHash, transactionHash: input.transactionHash, + createdAt: new Date(input.createdAt), }, input.batches, ]; diff --git a/packages/sdk/src/graphql/GraphqlTransactionSender.ts b/packages/sdk/src/graphql/GraphqlTransactionSender.ts index 6bf97b774..7a0c481e5 100644 --- a/packages/sdk/src/graphql/GraphqlTransactionSender.ts +++ b/packages/sdk/src/graphql/GraphqlTransactionSender.ts @@ -24,7 +24,6 @@ export class GraphqlTransactionSender } `; const tx = transaction.toJSON(); - const queryResult = await this.graphqlClient.client .mutation(query, { tx }) .toPromise(); diff --git a/packages/sequencer/src/protocol/production/BatchProducerModule.ts b/packages/sequencer/src/protocol/production/BatchProducerModule.ts index c1efd0b31..bdfced5ad 100644 --- a/packages/sequencer/src/protocol/production/BatchProducerModule.ts +++ b/packages/sequencer/src/protocol/production/BatchProducerModule.ts @@ -120,6 +120,7 @@ export class BatchProducerModule extends SequencerModule { height, fromNetworkState: batch.fromNetworkState, toNetworkState: batch.toNetworkState, + createdAt: Date.now(), }, changes: batch.changes, diff --git a/packages/sequencer/src/protocol/production/sequencing/BlockProductionService.ts b/packages/sequencer/src/protocol/production/sequencing/BlockProductionService.ts index ceaba6a79..706c27848 100644 --- a/packages/sequencer/src/protocol/production/sequencing/BlockProductionService.ts +++ b/packages/sequencer/src/protocol/production/sequencing/BlockProductionService.ts @@ -186,6 +186,7 @@ export class BlockProductionService { during: networkState, }, beforeBlockStateTransitions, + createdAt: Date.now(), }; const hash = Block.hash(block); diff --git a/packages/sequencer/src/settlement/interactions/bridging/BridgingSettlementInteraction.ts b/packages/sequencer/src/settlement/interactions/bridging/BridgingSettlementInteraction.ts index ee8b74983..6106233c0 100644 --- a/packages/sequencer/src/settlement/interactions/bridging/BridgingSettlementInteraction.ts +++ b/packages/sequencer/src/settlement/interactions/bridging/BridgingSettlementInteraction.ts @@ -121,6 +121,7 @@ export class BridgingSettlementInteraction implements SettleInteraction { batches: [batch.height], promisedMessagesHash: latestSequenceStateHash.toString(), transactionHash, + createdAt: Date.now(), }; } } diff --git a/packages/sequencer/src/settlement/interactions/vanilla/VanillaSettlementInteraction.ts b/packages/sequencer/src/settlement/interactions/vanilla/VanillaSettlementInteraction.ts index 096438ab5..59d0add1e 100644 --- a/packages/sequencer/src/settlement/interactions/vanilla/VanillaSettlementInteraction.ts +++ b/packages/sequencer/src/settlement/interactions/vanilla/VanillaSettlementInteraction.ts @@ -113,6 +113,7 @@ export class VanillaSettlementInteraction implements SettleInteraction { batches: [batch.height], promisedMessagesHash: latestSequenceStateHash.toString(), transactionHash, + createdAt: Date.now(), }; } } diff --git a/packages/sequencer/src/storage/model/Batch.ts b/packages/sequencer/src/storage/model/Batch.ts index 65e325a5b..aff22dee2 100644 --- a/packages/sequencer/src/storage/model/Batch.ts +++ b/packages/sequencer/src/storage/model/Batch.ts @@ -5,6 +5,7 @@ export interface Batch { proof: JsonProof; blockHashes: string[]; height: number; + createdAt: number; } export interface SettleableBatch extends Batch { diff --git a/packages/sequencer/src/storage/model/Block.ts b/packages/sequencer/src/storage/model/Block.ts index 2a9ea57d5..44402d0f6 100644 --- a/packages/sequencer/src/storage/model/Block.ts +++ b/packages/sequencer/src/storage/model/Block.ts @@ -50,6 +50,7 @@ export interface Block { toMessagesHash: Field; beforeBlockStateTransitions: UntypedStateTransition[]; + createdAt: number; } // eslint-disable-next-line @typescript-eslint/no-redeclare @@ -106,6 +107,7 @@ export const BlockWithResult = { beforeBlockStateTransitions: [], previousBlockHash: undefined, + createdAt: Date.now(), }, result: { afterNetworkState: NetworkState.empty(), diff --git a/packages/sequencer/src/storage/model/Settlement.ts b/packages/sequencer/src/storage/model/Settlement.ts index f3b91ab73..d8b589dab 100644 --- a/packages/sequencer/src/storage/model/Settlement.ts +++ b/packages/sequencer/src/storage/model/Settlement.ts @@ -2,4 +2,5 @@ export interface Settlement { transactionHash: string; promisedMessagesHash: string; batches: number[]; + createdAt: number; }