diff --git a/docker-compose.devnet.yml b/docker-compose.devnet.yml new file mode 100644 index 00000000..ad5942d5 --- /dev/null +++ b/docker-compose.devnet.yml @@ -0,0 +1,57 @@ +version: '3.9' + +networks: + devnet: + name: ${DOCKER_NETWORK_NAME} + external: true + +services: + db: + image: postgres:16-alpine + restart: unless-stopped + networks: + - devnet + environment: + - POSTGRES_DB=${DB_NAME} + - POSTGRES_USER=${DB_USER} + - POSTGRES_PASSWORD=${DB_PASSWORD} + volumes: + - pgdata:/var/lib/postgresql/data + + keys_api: + build: ./ + platform: linux/amd64 + restart: always + networks: + - devnet + environment: + - NODE_ENV=production + - PORT=${PORT} + - CORS_WHITELIST_REGEXP=${CORS_WHITELIST_REGEXP} + - GLOBAL_THROTTLE_TTL=${GLOBAL_THROTTLE_TTL} + - GLOBAL_THROTTLE_LIMIT=${GLOBAL_THROTTLE_LIMIT} + - GLOBAL_CACHE_TTL=${GLOBAL_CACHE_TTL} + - LOG_LEVEL=${LOG_LEVEL} + - LOG_FORMAT=${LOG_FORMAT} + - PROVIDERS_URLS=${PROVIDERS_URLS} + - CL_API_URLS=${CL_API_URLS} + - CHAIN_ID=${CHAIN_ID} + - DB_NAME=${DB_NAME} + - DB_PORT=5432 + - DB_HOST=db + - DB_USER=${DB_USER} + - DB_PASSWORD=${DB_PASSWORD} + - JOB_INTERVAL_REGISTRY=${JOB_INTERVAL_REGISTRY} + - VALIDATOR_REGISTRY_ENABLE=${VALIDATOR_REGISTRY_ENABLE} + - JOB_INTERVAL_VALIDATORS_REGISTRY=${JOB_INTERVAL_VALIDATORS_REGISTRY} + - LIDO_LOCATOR_DEVNET_ADDRESS=${LIDO_LOCATOR_DEVNET_ADDRESS} + - CURATED_MODULE_DEVNET_ADDRESS=${CURATED_MODULE_DEVNET_ADDRESS} + - CSM_MODULE_DEVNET_ADDRESS=${CSM_MODULE_DEVNET_ADDRESS} + - STAKING_ROUTER_DEVNET_ADDRESS=${STAKING_ROUTER_DEVNET_ADDRESS} + ports: + - '${PORT}:${PORT}' + depends_on: + - db + +volumes: + pgdata: diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 6eb7c5f8..7bca72e7 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -49,13 +49,21 @@ import { CSMKeyRegistryModule } from 'common/registry-csm'; KeyRegistryModule.forRootAsync({ inject: [SimpleFallbackJsonRpcBatchProvider, ConfigService], async useFactory(provider: SimpleFallbackJsonRpcBatchProvider, configService: ConfigService) { - return { provider, keysBatchSize: configService.get('KEYS_FETCH_BATCH_SIZE') }; + return { + provider, + keysBatchSize: configService.get('KEYS_FETCH_BATCH_SIZE'), + registryAddress: configService.get('CURATED_MODULE_DEVNET_ADDRESS'), + }; }, }), CSMKeyRegistryModule.forRootAsync({ inject: [SimpleFallbackJsonRpcBatchProvider, ConfigService], async useFactory(provider: SimpleFallbackJsonRpcBatchProvider, configService: ConfigService) { - return { provider, keysBatchSize: configService.get('KEYS_FETCH_BATCH_SIZE') }; + return { + provider, + keysBatchSize: configService.get('KEYS_FETCH_BATCH_SIZE'), + registryAddress: configService.get('CSM_MODULE_DEVNET_ADDRESS'), + }; }, }), StakingRouterModule, diff --git a/src/common/config/env.validation.ts b/src/common/config/env.validation.ts index 26fc96c8..34dc9ca8 100644 --- a/src/common/config/env.validation.ts +++ b/src/common/config/env.validation.ts @@ -180,6 +180,18 @@ export class EnvironmentVariables { @IsOptional() @IsString() LIDO_LOCATOR_DEVNET_ADDRESS = ''; + + @IsOptional() + @IsString() + CURATED_MODULE_DEVNET_ADDRESS = ''; + + @IsOptional() + @IsString() + CSM_MODULE_DEVNET_ADDRESS = ''; + + @IsOptional() + @IsString() + STAKING_ROUTER_DEVNET_ADDRESS = ''; } export function validate(config: Record) { diff --git a/src/common/registry-csm/fetch/interfaces/module.interface.ts b/src/common/registry-csm/fetch/interfaces/module.interface.ts index aa1c7776..d4c7bdbb 100644 --- a/src/common/registry-csm/fetch/interfaces/module.interface.ts +++ b/src/common/registry-csm/fetch/interfaces/module.interface.ts @@ -7,7 +7,6 @@ export const REGISTRY_FETCH_OPTIONS_TOKEN = Symbol('registryFetchOptionsToken'); export interface RegistryFetchOptions { registryAddress?: string; - lidoAddress?: string; provider?: Provider | Signer; keysBatchSize?: number; } diff --git a/src/common/registry-csm/fetch/registry-fetch.module.ts b/src/common/registry-csm/fetch/registry-fetch.module.ts index d7166f74..6d393689 100644 --- a/src/common/registry-csm/fetch/registry-fetch.module.ts +++ b/src/common/registry-csm/fetch/registry-fetch.module.ts @@ -1,5 +1,5 @@ import { DynamicModule, Module } from '@nestjs/common'; -import { LidoContractModule, RegistryContractModule } from '@lido-nestjs/contracts'; +import { RegistryContractModule } from '@lido-nestjs/contracts'; import { RegistryFetchModuleSyncOptions, RegistryFetchModuleAsyncOptions, @@ -39,10 +39,6 @@ export class RegistryFetchModule { module: RegistryFetchModule, imports: [ ...(options?.imports || []), - LidoContractModule.forFeature({ - address: options?.lidoAddress, - provider: options?.provider, - }), RegistryContractModule.forFeature({ address: options?.registryAddress, provider: options?.provider, @@ -54,7 +50,7 @@ export class RegistryFetchModule { useValue: options?.keysBatchSize ? { keysBatchSize: options.keysBatchSize } : {}, }, ], - exports: [LidoContractModule, RegistryContractModule], + exports: [RegistryContractModule], }; } @@ -63,15 +59,6 @@ export class RegistryFetchModule { module: RegistryFetchModule, imports: [ ...(options.imports || []), - LidoContractModule.forFeatureAsync({ - async useFactory(...args) { - const config = await options.useFactory(...args); - const { provider, lidoAddress } = config; - - return { provider, address: lidoAddress }; - }, - inject: options.inject, - }), RegistryContractModule.forFeatureAsync({ async useFactory(...args) { const config = await options.useFactory(...args); @@ -89,7 +76,7 @@ export class RegistryFetchModule { inject: options.inject, }, ], - exports: [LidoContractModule, RegistryContractModule], + exports: [RegistryContractModule], }; } } diff --git a/src/common/registry/fetch/interfaces/module.interface.ts b/src/common/registry/fetch/interfaces/module.interface.ts index aa1c7776..d4c7bdbb 100644 --- a/src/common/registry/fetch/interfaces/module.interface.ts +++ b/src/common/registry/fetch/interfaces/module.interface.ts @@ -7,7 +7,6 @@ export const REGISTRY_FETCH_OPTIONS_TOKEN = Symbol('registryFetchOptionsToken'); export interface RegistryFetchOptions { registryAddress?: string; - lidoAddress?: string; provider?: Provider | Signer; keysBatchSize?: number; } diff --git a/src/common/registry/fetch/registry-fetch.module.ts b/src/common/registry/fetch/registry-fetch.module.ts index 4949f32b..e49b23fb 100644 --- a/src/common/registry/fetch/registry-fetch.module.ts +++ b/src/common/registry/fetch/registry-fetch.module.ts @@ -1,5 +1,5 @@ import { DynamicModule, Module } from '@nestjs/common'; -import { LidoContractModule, RegistryContractModule } from '@lido-nestjs/contracts'; +import { RegistryContractModule } from '@lido-nestjs/contracts'; import { RegistryFetchModuleSyncOptions, RegistryFetchModuleAsyncOptions, @@ -47,10 +47,6 @@ export class RegistryFetchModule { module: RegistryFetchModule, imports: [ ...(options?.imports || []), - LidoContractModule.forFeature({ - address: options?.lidoAddress, - provider: options?.provider, - }), RegistryContractModule.forFeature({ address: options?.registryAddress, provider: options?.provider, @@ -62,7 +58,7 @@ export class RegistryFetchModule { useValue: options?.keysBatchSize ? { keysBatchSize: options.keysBatchSize } : {}, }, ], - exports: [LidoContractModule, RegistryContractModule], + exports: [RegistryContractModule], }; } @@ -71,15 +67,6 @@ export class RegistryFetchModule { module: RegistryFetchModule, imports: [ ...(options.imports || []), - LidoContractModule.forFeatureAsync({ - async useFactory(...args) { - const config = await options.useFactory(...args); - const { provider, lidoAddress } = config; - - return { provider, address: lidoAddress }; - }, - inject: options.inject, - }), RegistryContractModule.forFeatureAsync({ async useFactory(...args) { const config = await options.useFactory(...args); @@ -97,7 +84,7 @@ export class RegistryFetchModule { inject: options.inject, }, ], - exports: [LidoContractModule, RegistryContractModule], + exports: [RegistryContractModule], }; } } diff --git a/src/common/registry/test/fetch/sync.spec.ts b/src/common/registry/test/fetch/sync.spec.ts index 35592bfc..b9a7058e 100644 --- a/src/common/registry/test/fetch/sync.spec.ts +++ b/src/common/registry/test/fetch/sync.spec.ts @@ -47,13 +47,11 @@ describe('Sync module initializing', () => { }); test('forFeature addresses', async () => { - const lidoAddress = hexZeroPad('0x01', 20); const registryAddress = hexZeroPad('0x02', 20); const imports = [ RegistryFetchModule.forFeature({ provider, - lidoAddress, registryAddress, }), LoggerModule.forRoot({ transports: [nullTransport()] }), @@ -61,9 +59,6 @@ describe('Sync module initializing', () => { const moduleRef = await testModules({ imports }); - const lidoContract: Lido = moduleRef.get(LIDO_CONTRACT_TOKEN); - expect(lidoContract.address).toBe(lidoAddress); - const registryContract: Registry = moduleRef.get(REGISTRY_CONTRACT_TOKEN); expect(registryContract.address).toBe(registryAddress); }); diff --git a/src/staking-router-modules/contracts/lido-locator/lido-locator.module.ts b/src/staking-router-modules/contracts/lido-locator/lido-locator.module.ts index 1804c8c8..edc4724c 100644 --- a/src/staking-router-modules/contracts/lido-locator/lido-locator.module.ts +++ b/src/staking-router-modules/contracts/lido-locator/lido-locator.module.ts @@ -1,16 +1,17 @@ import { Global, Module } from '@nestjs/common'; import { LidoLocatorService } from './lido-locator.service'; import { LidoLocatorContractModule } from '@lido-nestjs/contracts'; -// TODO: maybe ../../../ shows us that we need to move execution-provider on level up import { ExecutionProvider } from '../../../common/execution-provider'; +import { ConfigModule, ConfigService } from 'common/config'; @Global() @Module({ imports: [ + ConfigModule, LidoLocatorContractModule.forRootAsync({ - inject: [ExecutionProvider], - async useFactory(provider) { - return { provider }; + inject: [ExecutionProvider, ConfigService], + async useFactory(provider, configService: ConfigService) { + return { provider, address: configService.get('LIDO_LOCATOR_DEVNET_ADDRESS') }; }, }), ], diff --git a/src/staking-router-modules/contracts/staking-router/staking-router-fetch.module.ts b/src/staking-router-modules/contracts/staking-router/staking-router-fetch.module.ts index f4406055..f7f00c1f 100644 --- a/src/staking-router-modules/contracts/staking-router/staking-router-fetch.module.ts +++ b/src/staking-router-modules/contracts/staking-router/staking-router-fetch.module.ts @@ -4,15 +4,16 @@ import { StakingModuleInterfaceModule } from '../staking-module-interface'; import { LidoLocatorModule } from '../lido-locator/lido-locator.module'; import { StakingRouterContractModule } from '@lido-nestjs/contracts'; import { ExecutionProvider } from '../../../common/execution-provider'; +import { ConfigService } from 'common/config'; @Module({ imports: [ StakingModuleInterfaceModule, LidoLocatorModule, StakingRouterContractModule.forRootAsync({ - inject: [ExecutionProvider], - async useFactory(provider) { - return { provider }; + inject: [ExecutionProvider, ConfigService], + async useFactory(provider, configService: ConfigService) { + return { provider, address: configService.get('STAKING_ROUTER_DEVNET_ADDRESS') }; }, }), ],