diff --git a/package-lock.json b/package-lock.json index 89f52adaa..e749c8176 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28691,6 +28691,7 @@ "@proto-kit/indexer": "*", "@proto-kit/library": "*", "@proto-kit/module": "*", + "@proto-kit/persistance": "*", "@proto-kit/protocol": "*", "@proto-kit/sdk": "*", "@proto-kit/sequencer": "*", diff --git a/packages/cli/package.json b/packages/cli/package.json index 765644474..c89a3c7c2 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -35,7 +35,6 @@ "peerDependencies": { "@proto-kit/api": "*", "@proto-kit/common": "*", - "@proto-kit/indexer": "*", "@proto-kit/library": "*", "@proto-kit/module": "*", "@proto-kit/protocol": "*", @@ -43,6 +42,7 @@ "@proto-kit/sequencer": "*", "@proto-kit/stack": "*", "@proto-kit/indexer": "*", + "@proto-kit/persistance": "*", "o1js": "2.14.0-dev.e1080", "tsyringe": "^4.10.0" }, diff --git a/packages/cli/src/commands/lightnet/faucet.ts b/packages/cli/src/commands/lightnet/faucet.ts index b4f3cb38c..57c28ffc7 100644 --- a/packages/cli/src/commands/lightnet/faucet.ts +++ b/packages/cli/src/commands/lightnet/faucet.ts @@ -11,7 +11,8 @@ interface FaucetArgs { export const faucetCommand: CommandModule<{}, FaucetArgs> = { command: "faucet ", - describe: "Send MINA to an account from the lightnet faucet", + describe: + "Send MINA to an account from the lightnet faucet\n\nRequires: MINA_NODE_GRAPHQL_HOST, MINA_NODE_GRAPHQL_PORT, MINA_ARCHIVE_GRAPHQL_HOST, MINA_ARCHIVE_GRAPHQL_PORT, MINA_ACCOUNT_MANAGER_HOST, MINA_ACCOUNT_MANAGER_PORT", builder: (yarg) => addEnvironmentOptions( yarg.positional("publicKey", { diff --git a/packages/cli/src/commands/settlement/deploy.ts b/packages/cli/src/commands/settlement/deploy.ts index 11ba65f54..972895c87 100644 --- a/packages/cli/src/commands/settlement/deploy.ts +++ b/packages/cli/src/commands/settlement/deploy.ts @@ -11,7 +11,7 @@ interface DeployArgs { export const deployCommand: CommandModule<{}, DeployArgs> = { command: "deploy", describe: - "Deploy settlement contracts\n\nRequires: PROTOKIT_SETTLEMENT_CONTRACT_PRIVATE_KEY, PROTOKIT_DISPATCHER_CONTRACT_PRIVATE_KEY, PROTOKIT_MINA_BRIDGE_CONTRACT_PRIVATE_KEY", + "Deploy settlement contracts\n\nRequires: PROTOKIT_SETTLEMENT_CONTRACT_PUBLIC_KEY, PROTOKIT_DISPATCHER_CONTRACT_PUBLIC_KEY", builder: (yarg) => addEnvironmentOptions(yarg), handler: async (args) => { try { diff --git a/packages/cli/src/commands/settlement/tokenDeploy.ts b/packages/cli/src/commands/settlement/tokenDeploy.ts index b9277509d..38af039d1 100644 --- a/packages/cli/src/commands/settlement/tokenDeploy.ts +++ b/packages/cli/src/commands/settlement/tokenDeploy.ts @@ -16,7 +16,7 @@ export const tokenDeployCommand: CommandModule<{}, TokenDeployArgs> = { command: "token-deploy [mintAmount]", describe: - "Deploy custom fungible token for settlement\n\nRequires: PROTOKIT_SETTLEMENT_CONTRACT_PRIVATE_KEY, PROTOKIT_DISPATCHER_CONTRACT_PRIVATE_KEY, PROTOKIT_CUSTOM_TOKEN_PRIVATE_KEY, PROTOKIT_CUSTOM_TOKEN_ADMIN_PRIVATE_KEY, PROTOKIT_CUSTOM_TOKEN_BRIDGE_PRIVATE_KEY", + "Deploy custom fungible token for settlement\n\nRequires: REDIS_HOST, REDIS_PORT, REDIS_PASSWORD, DATABASE_URL, PROTOKIT_SETTLEMENT_CONTRACT_PRIVATE_KEY, PROTOKIT_DISPATCHER_CONTRACT_PRIVATE_KEY", builder: (yarg) => addEnvironmentOptions( yarg diff --git a/packages/cli/src/scripts/bridge/deposit.ts b/packages/cli/src/scripts/bridge/deposit.ts index 5272d5de2..50b471313 100644 --- a/packages/cli/src/scripts/bridge/deposit.ts +++ b/packages/cli/src/scripts/bridge/deposit.ts @@ -1,4 +1,5 @@ import { DispatchSmartContract } from "@proto-kit/protocol"; +import { InMemoryDatabase } from "@proto-kit/sequencer"; import { loadEnvironmentVariables, @@ -25,6 +26,9 @@ export default async function ( ); } loadEnvironmentVariables(options); + const { scriptModules, scriptModulesConfig } = + await import("../../utils/modules"); + const { BridgingModule, MinaTransactionSender, @@ -34,7 +38,6 @@ export default async function ( } = await import("@proto-kit/sequencer"); const { Runtime } = await import("@proto-kit/module"); const { Protocol } = await import("@proto-kit/protocol"); - const { DefaultConfigs, DefaultModules } = await import("@proto-kit/stack"); const { AccountUpdate, fetchAccount, @@ -87,8 +90,8 @@ export default async function ( ...protocol.settlementModules, }), Sequencer: Sequencer.from({ - ...DefaultModules.inMemoryDatabase(), - ...DefaultModules.settlementScript(), + Database: InMemoryDatabase, + ...scriptModules, }), }); @@ -99,10 +102,8 @@ export default async function ( ...protocol.settlementModulesConfig, }, Sequencer: { - ...DefaultConfigs.inMemoryDatabase(), - ...DefaultConfigs.settlementScript({ - preset: "development", - }), + Database: {}, + ...scriptModulesConfig, }, }); diff --git a/packages/cli/src/scripts/bridge/redeem.ts b/packages/cli/src/scripts/bridge/redeem.ts index efa950d39..4595f481a 100644 --- a/packages/cli/src/scripts/bridge/redeem.ts +++ b/packages/cli/src/scripts/bridge/redeem.ts @@ -1,3 +1,5 @@ +import { InMemoryDatabase } from "@proto-kit/sequencer"; + import { loadEnvironmentVariables, getRequiredEnv, @@ -22,6 +24,8 @@ export default async function ( ); } loadEnvironmentVariables(options); + const { scriptModules, scriptModulesConfig } = + await import("../../utils/modules"); const { BridgingModule, @@ -42,7 +46,6 @@ export default async function ( UInt64, } = await import("o1js"); const { FungibleToken } = await import("mina-fungible-token"); - const { DefaultConfigs, DefaultModules } = await import("@proto-kit/stack"); const { runtime, protocol } = await loadUserModules(); const tokenId = Field(bridgeArgs.tokenId); const toPrivateKey = PrivateKey.fromBase58( @@ -72,8 +75,8 @@ export default async function ( ...protocol.settlementModules, }), Sequencer: Sequencer.from({ - ...DefaultModules.inMemoryDatabase(), - ...DefaultModules.settlementScript(), + Database: InMemoryDatabase, + ...scriptModules, }), }); @@ -84,10 +87,8 @@ export default async function ( ...protocol.settlementModulesConfig, }, Sequencer: { - ...DefaultConfigs.inMemoryDatabase(), - ...DefaultConfigs.settlementScript({ - preset: "development", - }), + Database: {}, + ...scriptModulesConfig, }, }); diff --git a/packages/cli/src/scripts/settlement/deploy-token.ts b/packages/cli/src/scripts/settlement/deploy-token.ts index 419435901..e2b5e398c 100644 --- a/packages/cli/src/scripts/settlement/deploy-token.ts +++ b/packages/cli/src/scripts/settlement/deploy-token.ts @@ -4,7 +4,11 @@ import { DispatchSmartContract } from "@proto-kit/protocol"; import "reflect-metadata"; import { container } from "tsyringe"; -import { loadEnvironmentVariables, LoadEnvOptions } from "../../utils/loadEnv"; +import { + getRequiredEnv, + loadEnvironmentVariables, + LoadEnvOptions, +} from "../../utils/loadEnv"; import { loadUserModules } from "../../utils/loadUserModules"; export interface TokenDeployArgs { @@ -25,6 +29,8 @@ export default async function ( ); } loadEnvironmentVariables(options); + const { scriptModules, scriptModulesConfig } = + await import("../../utils/modules"); const { Runtime } = await import("@proto-kit/module"); const { Protocol } = await import("@proto-kit/protocol"); @@ -51,7 +57,6 @@ export default async function ( } = await import("o1js"); const { FungibleToken, FungibleTokenAdmin } = await import("mina-fungible-token"); - const { DefaultConfigs, DefaultModules } = await import("@proto-kit/stack"); const { runtime, protocol } = await loadUserModules(); const appChain = AppChain.from({ @@ -60,10 +65,7 @@ export default async function ( ...protocol.modules, ...protocol.settlementModules, }), - Sequencer: Sequencer.from({ - ...DefaultModules.prismaRedisDatabase(), - ...DefaultModules.settlementScript(), - }), + Sequencer: Sequencer.from(scriptModules), }); appChain.configure({ @@ -73,15 +75,7 @@ export default async function ( ...protocol.settlementModulesConfig, }, Sequencer: { - ...DefaultConfigs.prismaRedisDatabase({ - preset: "development", - overrides: { - pruneOnStartup: false, - }, - }), - ...DefaultConfigs.settlementScript({ - preset: "development", - }), + ...scriptModulesConfig, }, }); @@ -256,10 +250,10 @@ export default async function ( Provable.log("Deployed and initialized settlement contracts", { settlement: PrivateKey.fromBase58( - process.env.PROTOKIT_SETTLEMENT_CONTRACT_PRIVATE_KEY! + getRequiredEnv("PROTOKIT_SETTLEMENT_CONTRACT_PRIVATE_KEY") ).toPublicKey(), dispatcher: PrivateKey.fromBase58( - process.env.PROTOKIT_DISPATCHER_CONTRACT_PRIVATE_KEY! + getRequiredEnv("PROTOKIT_DISPATCHER_CONTRACT_PRIVATE_KEY") ).toPublicKey(), }); diff --git a/packages/cli/src/scripts/settlement/deploy.ts b/packages/cli/src/scripts/settlement/deploy.ts index 21c69a849..90db9a6ce 100644 --- a/packages/cli/src/scripts/settlement/deploy.ts +++ b/packages/cli/src/scripts/settlement/deploy.ts @@ -11,27 +11,15 @@ import { loadUserModules } from "../../utils/loadUserModules"; export default async function (options: LoadEnvOptions) { try { loadEnvironmentVariables(options); - const { Provable, PublicKey, PrivateKey } = await import("o1js"); + const { Provable, PublicKey } = await import("o1js"); const { Runtime } = await import("@proto-kit/module"); const { Protocol } = await import("@proto-kit/protocol"); - const { - AppChain, - Sequencer, - SettlementModule, - InMemoryDatabase, - BatchProducerModule, - BridgingModule, - ConstantFeeStrategy, - InMemoryMinaSigner, - MinaBaseLayer, - PrivateMempool, - LocalTaskQueue, - WorkerModule, - VanillaTaskWorkerModules, - SequencerStartupModule, - } = await import("@proto-kit/sequencer"); + const { AppChain, Sequencer, SettlementModule, VanillaTaskWorkerModules } = + await import("@proto-kit/sequencer"); - const { DefaultConfigs } = await import("@proto-kit/stack"); + loadEnvironmentVariables(options); + const { scriptModules, scriptModulesConfig } = + await import("../../utils/modules"); const { runtime, protocol } = await loadUserModules(); const appChain = AppChain.from({ Runtime: Runtime.from(runtime.modules), @@ -40,17 +28,7 @@ export default async function (options: LoadEnvOptions) { ...protocol.settlementModules, }), Sequencer: Sequencer.from({ - Database: InMemoryDatabase, - BaseLayer: MinaBaseLayer, - FeeStrategy: ConstantFeeStrategy, - BatchProducerModule, - SettlementModule, - SettlementSigner: InMemoryMinaSigner, - BridgingModule, - Mempool: PrivateMempool, - TaskQueue: LocalTaskQueue, - WorkerModule: WorkerModule.from(VanillaTaskWorkerModules.allTasks()), - SequencerStartupModule, + ...scriptModules, }), }); @@ -61,35 +39,7 @@ export default async function (options: LoadEnvOptions) { ...protocol.settlementModulesConfig, }, Sequencer: { - ...DefaultConfigs.inMemoryDatabase(), - BaseLayer: { - network: { - // eslint-disable-next-line max-len - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions,@typescript-eslint/no-unsafe-assignment - type: process.env.MINA_NETWORK as any, - graphql: process.env.MINA_NODE_GRAPHQL!, - archive: process.env.MINA_ARCHIVE_GRAPHQL!, - accountManager: process.env.MINA_ACCOUNT_MANAGER_URL!, - }, - }, - 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: {}, - BatchProducerModule: {}, + ...scriptModulesConfig, SettlementModule: { addresses: undefined, }, @@ -101,7 +51,6 @@ export default async function (options: LoadEnvOptions) { simulatedDuration: 0, }, WorkerModule: VanillaTaskWorkerModules.defaultConfig(), - Mempool: {}, }, }); diff --git a/packages/cli/src/utils/loadEnv.ts b/packages/cli/src/utils/loadEnv.ts index a79453e5e..8806749e1 100644 --- a/packages/cli/src/utils/loadEnv.ts +++ b/packages/cli/src/utils/loadEnv.ts @@ -13,12 +13,18 @@ export type LoadEnvOptions = { export function loadEnvironmentVariables(options: LoadEnvOptions) { const cwd = process.cwd(); + + const scriptsEnvPath = path.join( + resolveChainPath(), + `./src/core/environments/${options.env}/scripts.env` + ); + const defaultEnvPath = path.join( + resolveChainPath(), + `./src/core/environments/${options.env}/.env` + ); const env = options.envPath ?? - path.join( - resolveChainPath(), - `./src/core/environments/${options.env}/.env` - ); + (fs.existsSync(scriptsEnvPath) ? scriptsEnvPath : defaultEnvPath); const envPath = path.isAbsolute(env) ? env : path.join(cwd, env); if (fs.existsSync(envPath)) { dotenv.config({ path: envPath }); diff --git a/packages/cli/src/utils/modules.ts b/packages/cli/src/utils/modules.ts new file mode 100644 index 000000000..8f6039010 --- /dev/null +++ b/packages/cli/src/utils/modules.ts @@ -0,0 +1,74 @@ +import { + SequencerStartupModule, + WorkerModule, + VanillaTaskWorkerModules, + MinaBaseLayer, + ConstantFeeStrategy, + SettlementModule, + LocalTaskQueue, + InMemoryMinaSigner, + BridgingModule, +} from "@proto-kit/sequencer"; +import { PrivateKey } from "o1js"; +import { ModulesConfig } from "@proto-kit/common"; + +import { getRequiredEnv } from "./loadEnv"; + +export const scriptModules = { + BaseLayer: MinaBaseLayer, + FeeStrategy: ConstantFeeStrategy, + SettlementModule, + SettlementSigner: InMemoryMinaSigner, + BridgingModule, + TaskQueue: LocalTaskQueue, + WorkerModule: WorkerModule.from(VanillaTaskWorkerModules.allTasks()), + SequencerStartupModule, +}; + +export const scriptModulesConfig = { + BaseLayer: { + network: { + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + type: getRequiredEnv("MINA_NETWORK") as "local" | "lightnet" | "remote", + graphql: getRequiredEnv("MINA_NODE_GRAPHQL"), + archive: getRequiredEnv("MINA_ARCHIVE_GRAPHQL"), + accountManager: getRequiredEnv("MINA_ACCOUNT_MANAGER_URL"), + }, + }, + SettlementModule: { + addresses: { + SettlementContract: PrivateKey.fromBase58( + getRequiredEnv("PROTOKIT_SETTLEMENT_CONTRACT_PRIVATE_KEY") + ).toPublicKey(), + }, + }, + BridgingModule: { + addresses: { + DispatchContract: PrivateKey.fromBase58( + getRequiredEnv("PROTOKIT_DISPATCHER_CONTRACT_PRIVATE_KEY") + ).toPublicKey(), + }, + }, + SettlementSigner: { + feepayer: PrivateKey.fromBase58( + getRequiredEnv("PROTOKIT_SEQUENCER_PRIVATE_KEY") + ), + contractKeys: [ + PrivateKey.fromBase58( + getRequiredEnv("PROTOKIT_SETTLEMENT_CONTRACT_PRIVATE_KEY") + ), + PrivateKey.fromBase58( + getRequiredEnv("PROTOKIT_DISPATCHER_CONTRACT_PRIVATE_KEY") + ), + PrivateKey.fromBase58( + getRequiredEnv("PROTOKIT_MINA_BRIDGE_CONTRACT_PRIVATE_KEY") + ), + ], + }, + FeeStrategy: {}, + WorkerModule: VanillaTaskWorkerModules.defaultConfig(), + SequencerStartupModule: {}, + TaskQueue: { + simulatedDuration: 0, + }, +} satisfies ModulesConfig; diff --git a/packages/cli/src/utils/pathResolver.ts b/packages/cli/src/utils/pathResolver.ts index d5ffea04a..d76d950a4 100644 --- a/packages/cli/src/utils/pathResolver.ts +++ b/packages/cli/src/utils/pathResolver.ts @@ -3,6 +3,7 @@ import fs from "fs"; export function resolveChainPath(isFolderRequired?: boolean): string { let currentDir = process.cwd(); + // eslint-disable-next-line no-constant-condition while (true) { const candidate = path.join(currentDir, "packages", "chain");