diff --git a/packages/chain/src/core/environments/development/chain.config.ts b/packages/chain/src/core/environments/development/chain.config.ts index 00f8897..2d00dd5 100644 --- a/packages/chain/src/core/environments/development/chain.config.ts +++ b/packages/chain/src/core/environments/development/chain.config.ts @@ -1,57 +1,118 @@ import { Runtime } from "@proto-kit/module"; import { Protocol } from "@proto-kit/protocol"; -import { AppChain, Sequencer } from "@proto-kit/sequencer"; +import { + AppChain, + Sequencer, + PrivateMempool, + TimedBlockTrigger, + SequencerCoreModule, +} from "@proto-kit/sequencer"; +import { VanillaGraphqlModules, GraphqlSequencerModule } from "@proto-kit/api"; +import { IndexerNotifier } from "@proto-kit/indexer"; +import { PrismaRedisDatabase } from "@proto-kit/persistance"; +import { BullQueue } from "@proto-kit/deployment"; +import { + BlockStorageNetworkStateModule, + InMemoryTransactionSender, + StateServiceQueryModule, +} from "@proto-kit/sdk"; import runtime from "../../../runtime"; import * as protocol from "../../../protocol"; import { Arguments } from "../../../start"; import { Startable } from "@proto-kit/common"; -import { DefaultConfigs, DefaultModules } from "@proto-kit/stack"; - -const settlementEnabled = process.env.PROTOKIT_SETTLEMENT_ENABLED! === "true"; +import { + buildCustomTokenConfig, + buildSettlementTokenConfig, +} from "@proto-kit/stack"; +import { + baseSettlementSequencerModules, + baseSettlementSequencerModulesConfig, +} from "../../sequencer"; const appChain = AppChain.from({ Runtime: Runtime.from(runtime.modules), Protocol: Protocol.from({ ...protocol.modules, - ...(settlementEnabled ? protocol.settlementModules : {}), + ...protocol.settlementModules, }), Sequencer: Sequencer.from({ // ordering of the modules matters due to dependency resolution - //...DefaultModules.metrics(), - ...DefaultModules.prismaRedisDatabase(), - ...DefaultModules.core({ settlementEnabled }), - ...DefaultModules.redisTaskQueue(), - ...DefaultModules.sequencerIndexer(), + Database: PrismaRedisDatabase, + Graphql: GraphqlSequencerModule.from(VanillaGraphqlModules.with({})), + Mempool: PrivateMempool, + BlockTrigger: TimedBlockTrigger, + SequencerCoreModule, + ...baseSettlementSequencerModules, + TaskQueue: BullQueue, + IndexerNotifier, }), - ...DefaultModules.appChainBase(), + TransactionSender: InMemoryTransactionSender, + QueryTransportModule: StateServiceQueryModule, + NetworkStateTransportModule: BlockStorageNetworkStateModule, }); export default async (args: Arguments): Promise => { - appChain.configurePartial({ + appChain.configure({ Runtime: runtime.config, Protocol: { ...protocol.config, - ...(settlementEnabled ? protocol.settlementModulesConfig : {}), + ...protocol.settlementModulesConfig, }, Sequencer: { - ...DefaultConfigs.core({ settlementEnabled, preset: "development" }), - ...DefaultConfigs.sequencerIndexer(), - //...DefaultConfigs.metrics({ preset: "development" }), - ...DefaultConfigs.redisTaskQueue({ - preset: "development", - overrides: { - redisDb: 1, + Graphql: { + ...VanillaGraphqlModules.defaultConfig(), + containerConfig: { + port: Number(process.env.PROTOKIT_GRAPHQL_PORT ?? 8080), + host: process.env.PROTOKIT_GRAPHQL_HOST ?? "0.0.0.0", + graphiql: process.env.PROTOKIT_GRAPHIQL_ENABLED !== "false", + }, + }, + Mempool: {}, + BlockTrigger: { + blockInterval: Number(process.env.PROTOKIT_BLOCK_INTERVAL ?? 30000), + produceEmptyBlocks: true, + settlementInterval: Number( + process.env.PROTOKIT_SETTLEMENT_INTERVAL ?? 60000 + ), + settlementTokenConfig: buildSettlementTokenConfig( + process.env.PROTOKIT_MINA_BRIDGE_CONTRACT_PRIVATE_KEY!, + buildCustomTokenConfig( + process.env.PROTOKIT_CUSTOM_TOKEN_PRIVATE_KEY, + process.env.PROTOKIT_CUSTOM_TOKEN_BRIDGE_PRIVATE_KEY + ) + ), + }, + IndexerNotifier: {}, + TaskQueue: { + redis: { + host: process.env.REDIS_HOST ?? "localhost", + port: Number(process.env.REDIS_PORT ?? 6379), + password: process.env.REDIS_PASSWORD ?? "password", + db: 1, + }, + }, + Database: { + redis: { + host: process.env.REDIS_HOST ?? "localhost", + port: Number(process.env.REDIS_PORT ?? 6379), + password: process.env.REDIS_PASSWORD ?? "password", }, - }), - ...DefaultConfigs.prismaRedisDatabase({ - preset: "development", - overrides: { - pruneOnStartup: args.pruneOnStartup, + prisma: { + connection: process.env.DATABASE_URL!, }, - }), + pruneOnStartup: args.pruneOnStartup, + }, + ...baseSettlementSequencerModulesConfig, + SequencerCoreModule: { + BlockProducerModule: {}, + BatchProducerModule: {}, + SequencerStartupModule: {}, + }, }, - ...DefaultConfigs.appChainBase(), + QueryTransportModule: {}, + NetworkStateTransportModule: {}, + TransactionSender: {}, }); return appChain; diff --git a/packages/chain/src/core/environments/development/indexer.config.ts b/packages/chain/src/core/environments/development/indexer.config.ts index 8140982..455b721 100644 --- a/packages/chain/src/core/environments/development/indexer.config.ts +++ b/packages/chain/src/core/environments/development/indexer.config.ts @@ -1,21 +1,67 @@ -import { Indexer } from "@proto-kit/indexer"; +import { + Indexer, + IndexBlockTask, + IndexBatchTask, + IndexPendingTxTask, + IndexSettlementTask, + GeneratedResolverFactoryGraphqlModule, +} from "@proto-kit/indexer"; +import { GraphqlSequencerModule } from "@proto-kit/api"; +import { WorkerModule } from "@proto-kit/sequencer"; +import { PrismaRedisDatabase } from "@proto-kit/persistance"; +import { BullQueue } from "@proto-kit/deployment"; import { Arguments } from "../../../start"; import { Startable } from "@proto-kit/common"; -import { DefaultConfigs, DefaultModules } from "@proto-kit/stack"; const indexer = Indexer.from({ - ...DefaultModules.indexer(), + Database: PrismaRedisDatabase, + TaskQueue: BullQueue, + TaskWorker: WorkerModule.from({ + IndexBlockTask, + IndexPendingTxTask, + IndexBatchTask, + IndexSettlementTask, + }), + Graphql: GraphqlSequencerModule.from({ + GeneratedResolverFactory: GeneratedResolverFactoryGraphqlModule, + }), }); export default async (args: Arguments): Promise => { indexer.configurePartial({ - ...DefaultConfigs.indexer({ - preset: "development", - overrides: { - pruneOnStartup: args.pruneOnStartup, - redisDb: 1, + Database: { + redis: { + host: process.env.REDIS_HOST ?? "localhost", + port: Number(process.env.REDIS_PORT ?? 6379), + password: process.env.REDIS_PASSWORD ?? "password", }, - }), + prisma: { + connection: process.env.INDEXER_DATABASE_URL!, + }, + pruneOnStartup: args.pruneOnStartup, + }, + TaskQueue: { + redis: { + host: process.env.REDIS_HOST ?? "localhost", + port: Number(process.env.REDIS_PORT ?? 6379), + password: process.env.REDIS_PASSWORD ?? "password", + db: 1, + }, + }, + TaskWorker: { + IndexBlockTask: {}, + IndexBatchTask: {}, + IndexPendingTxTask: {}, + IndexSettlementTask: {}, + }, + Graphql: { + GeneratedResolverFactory: {}, + containerConfig: { + port: Number(process.env.PROTOKIT_INDEXER_GRAPHQL_PORT ?? 8081), + host: process.env.PROTOKIT_INDEXER_GRAPHQL_HOST ?? "0.0.0.0", + graphiql: process.env.PROTOKIT_INDEXER_GRAPHIQL_ENABLED !== "false", + }, + }, }); return indexer; }; diff --git a/packages/chain/src/core/environments/development/processor.config.ts b/packages/chain/src/core/environments/development/processor.config.ts index ad62b8e..5c479c7 100644 --- a/packages/chain/src/core/environments/development/processor.config.ts +++ b/packages/chain/src/core/environments/development/processor.config.ts @@ -1,22 +1,43 @@ -import { DatabasePruneModule, Processor } from "@proto-kit/processor"; +import { + DatabasePruneModule, + Processor, + TimedProcessorTrigger, + BlockFetching, + HandlersExecutor, + ResolverFactoryGraphqlModule, +} from "@proto-kit/processor"; +import { + GraphqlSequencerModule, +} from "@proto-kit/api"; import { databaseModule } from "../../processor"; import { Arguments } from "../../../start"; import { Startable } from "@proto-kit/common"; -import { DefaultConfigs, DefaultModules } from "@proto-kit/stack"; import { resolvers } from "../../processor/api/resolvers"; import { handlers } from "../../processor/handlers"; const processor = Processor.from({ Database: databaseModule, DatabasePruneModule: DatabasePruneModule, - ...DefaultModules.processor(resolvers, handlers), + GraphqlSequencerModule: GraphqlSequencerModule.from({ + ResolverFactory: ResolverFactoryGraphqlModule.from(resolvers), + }), + HandlersExecutor: HandlersExecutor.from(handlers), + BlockFetching, + Trigger: TimedProcessorTrigger, }); export default async (args: Arguments): Promise => { processor.configurePartial({ - ...DefaultConfigs.processor({ - preset: "development", - }), + HandlersExecutor: {}, + BlockFetching: { + url: `http://${process.env.PROTOKIT_PROCESSOR_INDEXER_GRAPHQL_HOST ?? "0.0.0.0"}:${process.env.PROTOKIT_INDEXER_GRAPHQL_PORT ?? 8081}`, + }, + Trigger: { + interval: Number(process.env.PROTOKIT_BLOCK_INTERVAL ?? 30000) / 5, + }, + GraphqlSequencerModule: { + ResolverFactory: {}, + }, Database: {}, DatabasePruneModule: { pruneOnStartup: args.pruneOnStartup, diff --git a/packages/chain/src/core/environments/development/worker.config.ts b/packages/chain/src/core/environments/development/worker.config.ts index c1924f2..7b8d2ea 100644 --- a/packages/chain/src/core/environments/development/worker.config.ts +++ b/packages/chain/src/core/environments/development/worker.config.ts @@ -3,49 +3,46 @@ import { Protocol } from "@proto-kit/protocol"; import { Sequencer, AppChain, - LocalTaskWorkerModule, + WorkerModule, VanillaTaskWorkerModules, } from "@proto-kit/sequencer"; +import { BullQueue } from "@proto-kit/deployment"; import runtime from "../../../runtime"; import * as protocol from "../../../protocol"; import { Arguments } from "../../../start"; import { log, Startable } from "@proto-kit/common"; -import { DefaultConfigs, DefaultModules } from "@proto-kit/stack"; - -const settlementEnabled = process.env.PROTOKIT_SETTLEMENT_ENABLED! === "true"; const appChain = AppChain.from({ Runtime: Runtime.from(runtime.modules), Protocol: Protocol.from({ ...protocol.modules, - ...(settlementEnabled ? protocol.settlementModules : {}), + ...protocol.settlementModules, }), Sequencer: Sequencer.from({ - ...DefaultModules.remoteWorker(), - ...(!settlementEnabled - ? { - LocalTaskWorkerModule: LocalTaskWorkerModule.from( - VanillaTaskWorkerModules.withoutSettlement() - ), - } - : {}), + TaskQueue: BullQueue, + WorkerModule: WorkerModule.from(VanillaTaskWorkerModules.allTasks()), }), }); export default async (args: Arguments): Promise => { - appChain.configurePartial({ + appChain.configure({ Runtime: runtime.config, Protocol: { ...protocol.config, - ...(settlementEnabled ? protocol.settlementModulesConfig : {}), + ...protocol.settlementModulesConfig, }, - Sequencer: DefaultConfigs.worker({ - preset: "development", - overrides: { - redisDb: 1, + Sequencer: { + WorkerModule: VanillaTaskWorkerModules.defaultConfig(), + TaskQueue: { + redis: { + host: process.env.REDIS_HOST ?? "redis", + port: Number(process.env.REDIS_PORT ?? 6379), + password: process.env.REDIS_PASSWORD ?? "password", + db: 1, + }, }, - }), + }, }); log.setLevel("DEBUG"); diff --git a/packages/chain/src/core/environments/inmemory/chain.config.ts b/packages/chain/src/core/environments/inmemory/chain.config.ts index b6b7a88..c9d2644 100644 --- a/packages/chain/src/core/environments/inmemory/chain.config.ts +++ b/packages/chain/src/core/environments/inmemory/chain.config.ts @@ -1,38 +1,76 @@ import { Runtime } from "@proto-kit/module"; import { Protocol } from "@proto-kit/protocol"; -import { Sequencer, AppChain } from "@proto-kit/sequencer"; +import { + Sequencer, + AppChain, + InMemoryDatabase, + PrivateMempool, + TimedBlockTrigger, + WorkerModule, + VanillaTaskWorkerModules, + LocalTaskQueue, + LocalSequencerCoreModule, +} from "@proto-kit/sequencer"; +import { VanillaGraphqlModules, GraphqlSequencerModule } from "@proto-kit/api"; +import { + BlockStorageNetworkStateModule, + InMemoryTransactionSender, + StateServiceQueryModule, +} from "@proto-kit/sdk"; import { Startable } from "@proto-kit/common"; -import { DefaultConfigs, DefaultModules } from "@proto-kit/stack"; import protocol from "../../../protocol"; import runtime from "../../../runtime"; -const settlementEnabled = process.env.PROTOKIT_SETTLEMENT_ENABLED === "true"; - const appChain = AppChain.from({ Runtime: Runtime.from(runtime.modules), Protocol: Protocol.from(protocol.modules), Sequencer: Sequencer.from({ - ...DefaultModules.inMemoryDatabase(), - ...DefaultModules.core({ - settlementEnabled, - }), - ...DefaultModules.localWorker(), + WorkerModule: WorkerModule.from( + VanillaTaskWorkerModules.withoutSettlement() + ), + TaskQueue: LocalTaskQueue, + Database: InMemoryDatabase, + Graphql: GraphqlSequencerModule.from(VanillaGraphqlModules.with({})), + Mempool: PrivateMempool, + BlockTrigger: TimedBlockTrigger, + LocalSequencerCoreModule, }), - ...DefaultModules.appChainBase(), + TransactionSender: InMemoryTransactionSender, + QueryTransportModule: StateServiceQueryModule, + NetworkStateTransportModule: BlockStorageNetworkStateModule, }); + export default async (): Promise => { - appChain.configurePartial({ + appChain.configure({ Runtime: runtime.config, Protocol: protocol.config, Sequencer: { - ...DefaultConfigs.core({ - settlementEnabled, - }), - ...DefaultConfigs.inMemoryDatabase(), - ...DefaultConfigs.localWorker(), + Graphql: { + ...VanillaGraphqlModules.defaultConfig(), + containerConfig: { + port: Number(process.env.PROTOKIT_GRAPHQL_PORT), + host: process.env.PROTOKIT_GRAPHQL_HOST ?? "localhost", + graphiql: process.env.PROTOKIT_GRAPHIQL_ENABLED !== "false", + }, + }, + Mempool: {}, + LocalSequencerCoreModule: { + SequencerStartupModule: {}, + BlockProducerModule: {}, + }, + BlockTrigger: { + blockInterval: Number(process.env.PROTOKIT_BLOCK_INTERVAL ?? 5000), + produceEmptyBlocks: true, + settlementTokenConfig: {}, + }, + WorkerModule: VanillaTaskWorkerModules.defaultConfig(), + Database: {}, + TaskQueue: {}, }, - ...DefaultConfigs.appChainBase(), + QueryTransportModule: {}, + NetworkStateTransportModule: {}, + TransactionSender: {}, }); return appChain; diff --git a/packages/chain/src/core/environments/sovereign/chain.config.ts b/packages/chain/src/core/environments/sovereign/chain.config.ts index aa71783..17bb2c1 100644 --- a/packages/chain/src/core/environments/sovereign/chain.config.ts +++ b/packages/chain/src/core/environments/sovereign/chain.config.ts @@ -1,52 +1,121 @@ import { Runtime } from "@proto-kit/module"; import { Protocol } from "@proto-kit/protocol"; -import { AppChain, Sequencer } from "@proto-kit/sequencer"; +import { + AppChain, + Sequencer, + PrivateMempool, + TimedBlockTrigger, + BlockProducerModule, + SequencerStartupModule, +} from "@proto-kit/sequencer"; +import { VanillaGraphqlModules, GraphqlSequencerModule } from "@proto-kit/api"; +import { IndexerNotifier } from "@proto-kit/indexer"; +import { PrismaRedisDatabase } from "@proto-kit/persistance"; +import { BullQueue } from "@proto-kit/deployment"; +import { + BlockStorageNetworkStateModule, + InMemoryTransactionSender, + StateServiceQueryModule, +} from "@proto-kit/sdk"; import runtime from "../../../runtime"; import * as protocol from "../../../protocol"; import { Arguments } from "../../../start"; import { Startable } from "@proto-kit/common"; -import { DefaultConfigs, DefaultModules } from "@proto-kit/stack"; - -const settlementEnabled = process.env.PROTOKIT_SETTLEMENT_ENABLED! === "true"; +import { + buildCustomTokenConfig, + buildSettlementTokenConfig, +} from "@proto-kit/stack"; +import { + baseSettlementSequencerModules, + baseSettlementSequencerModulesConfig, + metricsSequencerModules, + metricsSequencerModulesConfig, +} from "../../sequencer"; const appChain = AppChain.from({ Runtime: Runtime.from(runtime.modules), Protocol: Protocol.from({ ...protocol.modules, - ...(settlementEnabled ? protocol.settlementModules : {}), + ...protocol.settlementModules, }), Sequencer: Sequencer.from({ // ordering of the modules matters due to dependency resolution - ...DefaultModules.prismaRedisDatabase(), - //...DefaultModules.metrics(), - ...DefaultModules.redisTaskQueue(), - ...DefaultModules.core({ settlementEnabled }), - ...DefaultModules.sequencerIndexer(), + ...metricsSequencerModules, + Database: PrismaRedisDatabase, + TaskQueue: BullQueue, + Graphql: GraphqlSequencerModule.from(VanillaGraphqlModules.with({})), + Mempool: PrivateMempool, + BlockProducerModule, + BlockTrigger: TimedBlockTrigger, + SequencerStartupModule, + ...baseSettlementSequencerModules, + IndexerNotifier, }), - ...DefaultModules.appChainBase(), + TransactionSender: InMemoryTransactionSender, + QueryTransportModule: StateServiceQueryModule, + NetworkStateTransportModule: BlockStorageNetworkStateModule, }); export default async (args: Arguments): Promise => { - appChain.configurePartial({ + appChain.configure({ Runtime: runtime.config, Protocol: { ...protocol.config, - ...(settlementEnabled ? protocol.settlementModulesConfig : {}), + ...protocol.settlementModulesConfig, }, Sequencer: { - ...DefaultConfigs.core({ settlementEnabled, preset: "sovereign" }), - ...DefaultConfigs.sequencerIndexer(), - //...DefaultConfigs.metrics({ preset: "sovereign" }), - ...DefaultConfigs.redisTaskQueue({ preset: "sovereign" }), - ...DefaultConfigs.prismaRedisDatabase({ - preset: "sovereign", - overrides: { - pruneOnStartup: args.pruneOnStartup, + ...metricsSequencerModulesConfig, + Graphql: { + ...VanillaGraphqlModules.defaultConfig(), + containerConfig: { + port: Number(process.env.PROTOKIT_GRAPHQL_PORT ?? 8080), + host: process.env.PROTOKIT_GRAPHQL_HOST ?? "0.0.0.0", + graphiql: process.env.PROTOKIT_GRAPHIQL_ENABLED !== "false", + }, + }, + Mempool: {}, + BlockProducerModule: {}, + BlockTrigger: { + blockInterval: Number(process.env.PROTOKIT_BLOCK_INTERVAL ?? 10000), + produceEmptyBlocks: true, + + settlementInterval: Number( + process.env.PROTOKIT_SETTLEMENT_INTERVAL ?? 60000 + ), + settlementTokenConfig: buildSettlementTokenConfig( + process.env.PROTOKIT_MINA_BRIDGE_CONTRACT_PRIVATE_KEY!, + buildCustomTokenConfig( + process.env.PROTOKIT_CUSTOM_TOKEN_PRIVATE_KEY, + process.env.PROTOKIT_CUSTOM_TOKEN_BRIDGE_PRIVATE_KEY + ) + ), + }, + SequencerStartupModule: {}, + ...baseSettlementSequencerModulesConfig, + IndexerNotifier: {}, + TaskQueue: { + redis: { + host: process.env.REDIS_HOST ?? "redis", + port: Number(process.env.REDIS_PORT ?? 6379), + password: process.env.REDIS_PASSWORD ?? "password", + db: 1, + }, + }, + Database: { + redis: { + host: process.env.REDIS_HOST ?? "redis", + port: Number(process.env.REDIS_PORT ?? 6379), + password: process.env.REDIS_PASSWORD ?? "password", + }, + prisma: { + connection: process.env.DATABASE_URL!, }, - }), + }, }, - ...DefaultConfigs.appChainBase(), + QueryTransportModule: {}, + NetworkStateTransportModule: {}, + TransactionSender: {}, }); return appChain; diff --git a/packages/chain/src/core/environments/sovereign/indexer.config.ts b/packages/chain/src/core/environments/sovereign/indexer.config.ts index bde036e..948e9e9 100644 --- a/packages/chain/src/core/environments/sovereign/indexer.config.ts +++ b/packages/chain/src/core/environments/sovereign/indexer.config.ts @@ -1,20 +1,63 @@ -import { Indexer } from "@proto-kit/indexer"; +import { + Indexer, + IndexBlockTask, + IndexBatchTask, + IndexPendingTxTask, + IndexSettlementTask, + GeneratedResolverFactoryGraphqlModule, +} from "@proto-kit/indexer"; +import { GraphqlSequencerModule } from "@proto-kit/api"; +import { + WorkerModule, +} from "@proto-kit/sequencer"; +import { PrismaRedisDatabase } from "@proto-kit/persistance"; +import { BullQueue } from "@proto-kit/deployment"; import { Arguments } from "../../../start"; import { Startable } from "@proto-kit/common"; -import { DefaultConfigs, DefaultModules } from "@proto-kit/stack"; const indexer = Indexer.from({ - ...DefaultModules.indexer(), + Database: PrismaRedisDatabase, + TaskQueue: BullQueue, + TaskWorker: WorkerModule.from({ + IndexBlockTask, + IndexPendingTxTask, + IndexBatchTask, + IndexSettlementTask, + }), + Graphql: GraphqlSequencerModule.from({ + GeneratedResolverFactory: GeneratedResolverFactoryGraphqlModule, + }), }); export default async (args: Arguments): Promise => { indexer.configurePartial({ - ...DefaultConfigs.indexer({ - preset: "sovereign", - overrides: { - redisDb: 1, + Database: { + redis: { + host: process.env.REDIS_HOST ?? "redis", + port: Number(process.env.REDIS_PORT ?? 6379), + password: process.env.REDIS_PASSWORD ?? "password", }, - }), + prisma: { + connection: process.env.INDEXER_DATABASE_URL!, + }, + }, + TaskQueue: { + redis: { + host: process.env.REDIS_HOST ?? "redis", + port: Number(process.env.REDIS_PORT ?? 6379), + password: process.env.REDIS_PASSWORD ?? "password", + db: 1, + }, + }, + TaskWorker: { + IndexBlockTask: {}, + IndexBatchTask: {}, + IndexPendingTxTask: {}, + IndexSettlementTask: {}, + }, + Graphql: { + GeneratedResolverFactory: {}, + }, }); return indexer; }; diff --git a/packages/chain/src/core/environments/sovereign/processor.config.ts b/packages/chain/src/core/environments/sovereign/processor.config.ts index 761002d..14903c1 100644 --- a/packages/chain/src/core/environments/sovereign/processor.config.ts +++ b/packages/chain/src/core/environments/sovereign/processor.config.ts @@ -1,21 +1,39 @@ -import { Processor } from "@proto-kit/processor"; +import { + Processor, + TimedProcessorTrigger, + BlockFetching, + HandlersExecutor, + ResolverFactoryGraphqlModule, +} from "@proto-kit/processor"; +import { GraphqlSequencerModule } from "@proto-kit/api"; +import { databaseModule } from "../../processor"; import { Arguments } from "../../../start"; import { Startable } from "@proto-kit/common"; -import { DefaultConfigs, DefaultModules } from "@proto-kit/stack"; -import { databaseModule } from "../../processor"; -import { handlers } from "../../processor/handlers"; import { resolvers } from "../../processor/api/resolvers"; +import { handlers } from "../../processor/handlers"; const processor = Processor.from({ Database: databaseModule, - ...DefaultModules.processor(resolvers, handlers), + GraphqlSequencerModule: GraphqlSequencerModule.from({ + ResolverFactory: ResolverFactoryGraphqlModule.from(resolvers), + }), + HandlersExecutor: HandlersExecutor.from(handlers), + BlockFetching, + Trigger: TimedProcessorTrigger, }); export default async (args: Arguments): Promise => { processor.configurePartial({ - ...DefaultConfigs.processor({ - preset: "sovereign", - }), + HandlersExecutor: {}, + BlockFetching: { + url: `http://${process.env.PROTOKIT_PROCESSOR_INDEXER_GRAPHQL_HOST ?? "0.0.0.0"}:${process.env.PROTOKIT_INDEXER_GRAPHQL_PORT ?? 8081}`, + }, + Trigger: { + interval: Number(process.env.PROTOKIT_BLOCK_INTERVAL ?? 30000) / 5, + }, + GraphqlSequencerModule: { + ResolverFactory: {}, + }, Database: {}, }); return processor; diff --git a/packages/chain/src/core/environments/sovereign/worker.config.ts b/packages/chain/src/core/environments/sovereign/worker.config.ts index 606a692..7b8d2ea 100644 --- a/packages/chain/src/core/environments/sovereign/worker.config.ts +++ b/packages/chain/src/core/environments/sovereign/worker.config.ts @@ -3,49 +3,46 @@ import { Protocol } from "@proto-kit/protocol"; import { Sequencer, AppChain, - LocalTaskWorkerModule, + WorkerModule, VanillaTaskWorkerModules, } from "@proto-kit/sequencer"; +import { BullQueue } from "@proto-kit/deployment"; import runtime from "../../../runtime"; import * as protocol from "../../../protocol"; import { Arguments } from "../../../start"; import { log, Startable } from "@proto-kit/common"; -import { DefaultConfigs, DefaultModules } from "@proto-kit/stack"; - -const settlementEnabled = process.env.PROTOKIT_SETTLEMENT_ENABLED! === "true"; const appChain = AppChain.from({ Runtime: Runtime.from(runtime.modules), Protocol: Protocol.from({ ...protocol.modules, - ...(settlementEnabled ? protocol.settlementModules : {}), + ...protocol.settlementModules, }), Sequencer: Sequencer.from({ - ...DefaultModules.remoteWorker(), - ...(!settlementEnabled - ? { - LocalTaskWorkerModule: LocalTaskWorkerModule.from( - VanillaTaskWorkerModules.withoutSettlement() - ), - } - : {}), + TaskQueue: BullQueue, + WorkerModule: WorkerModule.from(VanillaTaskWorkerModules.allTasks()), }), }); export default async (args: Arguments): Promise => { - appChain.configurePartial({ + appChain.configure({ Runtime: runtime.config, Protocol: { ...protocol.config, - ...(settlementEnabled ? protocol.settlementModulesConfig : {}), + ...protocol.settlementModulesConfig, }, - Sequencer: DefaultConfigs.worker({ - preset: "sovereign", - overrides: { - redisDb: 1, + Sequencer: { + WorkerModule: VanillaTaskWorkerModules.defaultConfig(), + TaskQueue: { + redis: { + host: process.env.REDIS_HOST ?? "redis", + port: Number(process.env.REDIS_PORT ?? 6379), + password: process.env.REDIS_PASSWORD ?? "password", + db: 1, + }, }, - }), + }, }); log.setLevel("DEBUG"); diff --git a/packages/chain/src/core/sequencer/index.ts b/packages/chain/src/core/sequencer/index.ts new file mode 100644 index 0000000..f9a7e0a --- /dev/null +++ b/packages/chain/src/core/sequencer/index.ts @@ -0,0 +1,89 @@ +import { OpenTelemetryServer } from "@proto-kit/api"; +import { ModulesConfig } from "@proto-kit/common"; +import { + BridgingModule, + ConstantFeeStrategy, + InMemoryMinaSigner, + MinaBaseLayer, + SequencerModulesRecord, + SettlementModule, +} from "@proto-kit/sequencer"; +import { PrivateKey } from "o1js"; + +export const baseSettlementSequencerModules = { + BaseLayer: MinaBaseLayer, + FeeStrategy: ConstantFeeStrategy, + SettlementModule, + SettlementSigner: InMemoryMinaSigner, + BridgingModule, +} satisfies SequencerModulesRecord; + +export const baseSettlementSequencerModulesConfig = { + BaseLayer: { + network: { + type: + (process.env.MINA_NETWORK as "local" | "lightnet" | "remote") ?? + "lightnet", + graphql: `${process.env.MINA_NODE_GRAPHQL_HOST ?? "http://localhost"}:${process.env.MINA_NODE_GRAPHQL_PORT ?? 8083}/graphql`, + archive: `${process.env.MINA_ARCHIVE_GRAPHQL_HOST ?? "http://localhost"}:${process.env.MINA_ARCHIVE_GRAPHQL_PORT ?? 8085}`, + accountManager: `${process.env.MINA_ACCOUNT_MANAGER_HOST ?? "http://localhost"}:${process.env.MINA_ACCOUNT_MANAGER_PORT ?? 8084}`, + }, + }, + SettlementModule: { + addresses: { + SettlementContract: PrivateKey.fromBase58( + process.env.PROTOKIT_SETTLEMENT_CONTRACT_PRIVATE_KEY! + ).toPublicKey(), + }, + }, + BridgingModule: { + addresses: { + DispatchContract: PrivateKey.fromBase58( + process.env.PROTOKIT_DISPATCHER_CONTRACT_PRIVATE_KEY! + ).toPublicKey(), + }, + }, + SettlementSigner: { + feepayer: PrivateKey.fromBase58( + process.env.PROTOKIT_SEQUENCER_PRIVATE_KEY! + ), + contractKeys: [ + PrivateKey.fromBase58( + process.env.PROTOKIT_SETTLEMENT_CONTRACT_PRIVATE_KEY! + ), + PrivateKey.fromBase58( + process.env.PROTOKIT_DISPATCHER_CONTRACT_PRIVATE_KEY! + ), + PrivateKey.fromBase58( + process.env.PROTOKIT_MINA_BRIDGE_CONTRACT_PRIVATE_KEY! + ), + ], + }, + FeeStrategy: {}, +} satisfies ModulesConfig; + +export const metricsSequencerModules = { + OpenTelemetryServer, +} satisfies SequencerModulesRecord; + +export const metricsSequencerModulesConfig = { + OpenTelemetryServer: { + metrics: { + enabled: Boolean(process.env.OPEN_TELEMETRY_METRICS_ENABLED ?? false), + prometheus: { + host: process.env.OPEN_TELEMETRY_METRICS_HOST ?? "localhost", + port: Number(process.env.OPEN_TELEMETRY_METRICS_PORT), + appendTimestamp: true, + }, + nodeScrapeInterval: Number( + process.env.OPEN_TELEMETRY_METRICS_SCRAPING_FREQUENCY ?? 10 + ), + }, + tracing: { + enabled: Boolean(process.env.OPEN_TELEMETRY_TRACING_ENABLED ?? false), + otlp: { + url: process.env.OPEN_TELEMETRY_TRACING_URL, + }, + }, + }, +} satisfies ModulesConfig;