Skip to content

Commit 2138387

Browse files
committed
feat: added JSON devnet config
1 parent 310495c commit 2138387

File tree

9 files changed

+95
-75
lines changed

9 files changed

+95
-75
lines changed

devnet-configs/devnet.example.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"name":"devnet-example",
3+
"WithdrawalQueue": "0x0..",
4+
"Lido": "0x0..",
5+
"OracleReportSanityChecker": "0x0..",
6+
"AccountingOracleHashConsensus": "0x0..",
7+
"ValidatorsExitBusOracleHashConsensus": "0x0..",
8+
"LidoLocator": "0x0..",
9+
"KeysApiBasePath": ""
10+
}

src/common/config/config.service.ts

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { ConfigService as ConfigServiceSource } from '@nestjs/config';
2-
import { EnvironmentVariables } from './env.validation';
32
import {
43
AccountingOracleHashConsensusModule,
54
LidoContractModule,
@@ -8,8 +7,9 @@ import {
87
ValidatorsExitBusOracleHashConsensusModule,
98
WithdrawalQueueContractModule,
109
} from '@lido-nestjs/contracts';
11-
import { devnetConfigs } from './devnets/configs';
12-
import { DevnetName } from './devnets/devnet-config.interface';
10+
import { EnvironmentVariables } from './env.validation';
11+
import { findDevnetConfig } from './utils/find-devnet-config';
12+
import { KEYS_API_PATHS } from '../../jobs/validators/lido-keys/lido-keys.constants';
1313

1414
export class ConfigService extends ConfigServiceSource<EnvironmentVariables> {
1515
/**
@@ -29,28 +29,45 @@ export class ConfigService extends ConfigServiceSource<EnvironmentVariables> {
2929
return super.get(key, { infer: true }) as EnvironmentVariables[T];
3030
}
3131

32-
public getCustomConfigContractsAddressMap() {
33-
if (!this.get('DEVNET_NAME')) {
32+
public async getCustomConfigContractsAddressMap() {
33+
const name = this.get('DEVNET_NAME');
34+
35+
if (!name) {
3436
return null;
3537
}
3638

39+
const devnetConfig = await findDevnetConfig(name);
40+
3741
return new Map<symbol, string>([
38-
[WithdrawalQueueContractModule.contractToken, devnetConfigs[DevnetName.Devnet8].contracts['WithdrawalQueue']],
39-
40-
[LidoContractModule.contractToken, devnetConfigs[DevnetName.Devnet8].contracts['Lido']],
41-
[
42-
OracleReportSanityCheckerModule.contractToken,
43-
devnetConfigs[DevnetName.Devnet8].contracts['OracleReportSanityChecker'],
44-
],
45-
[
46-
AccountingOracleHashConsensusModule.contractToken,
47-
devnetConfigs[DevnetName.Devnet8].contracts['AccountingOracleHashConsensus'],
48-
],
49-
[
50-
ValidatorsExitBusOracleHashConsensusModule.contractToken,
51-
devnetConfigs[DevnetName.Devnet8].contracts['ValidatorsExitBusOracleHashConsensus'],
52-
],
53-
[LidoLocatorContractModule.contractToken, devnetConfigs[DevnetName.Devnet8].contracts['LidoLocator']],
42+
[WithdrawalQueueContractModule.contractToken, devnetConfig['WithdrawalQueue']],
43+
44+
[LidoContractModule.contractToken, devnetConfig['Lido']],
45+
[OracleReportSanityCheckerModule.contractToken, devnetConfig['OracleReportSanityChecker']],
46+
[AccountingOracleHashConsensusModule.contractToken, devnetConfig['AccountingOracleHashConsensus']],
47+
[ValidatorsExitBusOracleHashConsensusModule.contractToken, devnetConfig['ValidatorsExitBusOracleHashConsensus']],
48+
[LidoLocatorContractModule.contractToken, devnetConfig['LidoLocator']],
5449
]);
5550
}
51+
52+
public async getKeysApiBasePath(): Promise<string> {
53+
const name = this.get('DEVNET_NAME');
54+
55+
if (name) {
56+
const devnetConfig = await findDevnetConfig(name);
57+
const keysApiBasePath = devnetConfig['KeysApiBasePath'];
58+
59+
if (keysApiBasePath) {
60+
return keysApiBasePath;
61+
}
62+
}
63+
64+
const envUrl = this.get('KEYS_API_BASE_PATH');
65+
66+
if (envUrl) {
67+
return envUrl;
68+
}
69+
70+
const chainId = this.get('CHAIN_ID');
71+
return KEYS_API_PATHS[chainId];
72+
}
5673
}

src/common/config/devnets/configs/devent-8.ts

Lines changed: 0 additions & 14 deletions
This file was deleted.

src/common/config/devnets/configs/index.ts

Lines changed: 0 additions & 6 deletions
This file was deleted.
Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,10 @@
1-
export enum DevnetName {
2-
Devnet8 = 'Devnet8',
3-
}
4-
5-
export const requiredContracts = [
6-
'WithdrawalQueue',
7-
'Lido',
8-
'OracleReportSanityChecker',
9-
'AccountingOracleHashConsensus',
10-
'ValidatorsExitBusOracleHashConsensus',
11-
'LidoLocator',
12-
] as const;
13-
141
export interface DevnetConfig {
15-
name: DevnetName;
16-
contracts: Record<(typeof requiredContracts)[number], string>;
17-
keysApiBasePath: string;
2+
name: string;
3+
WithdrawalQueue: string;
4+
Lido: string;
5+
OracleReportSanityChecker: string;
6+
AccountingOracleHashConsensus: string;
7+
ValidatorsExitBusOracleHashConsensus: string;
8+
LidoLocator: string;
9+
KeysApiBasePath: string;
1810
}

src/common/config/env.validation.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ import {
1212
IsBoolean,
1313
} from 'class-validator';
1414
import { Environment, LogLevel, LogFormat } from './interfaces';
15-
import { DevnetName } from './devnets/devnet-config.interface';
16-
import { devnetConfigs } from './devnets/configs';
1715

1816
const toNumber =
1917
({ defaultValue }) =>
@@ -96,7 +94,6 @@ export class EnvironmentVariables {
9694

9795
@IsOptional()
9896
@IsString()
99-
@Transform(({ value }) => (devnetConfigs[value] ? devnetConfigs[value].keysApiBasePath : ''))
10097
KEYS_API_BASE_PATH = '';
10198

10299
@IsOptional()
@@ -116,7 +113,7 @@ export class EnvironmentVariables {
116113

117114
@IsOptional()
118115
@IsString()
119-
DEVNET_NAME: DevnetName = null;
116+
DEVNET_NAME: string = null;
120117
}
121118
export const ENV_KEYS = Object.keys(new EnvironmentVariables());
122119

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { readdir, readFile } from 'node:fs/promises';
2+
import { extname, join } from 'node:path';
3+
import { DevnetConfig } from '../devnets';
4+
5+
export async function findDevnetConfig(name: string, directory = './devnet-configs'): Promise<DevnetConfig> {
6+
try {
7+
const files = await readdir(directory);
8+
9+
for (const file of files) {
10+
if (extname(file) === '.json') {
11+
const filePath = join(directory, file);
12+
13+
try {
14+
const content = await readFile(filePath, 'utf8');
15+
const json = JSON.parse(content);
16+
17+
if (json.name === name) {
18+
return json;
19+
}
20+
} catch (err) {
21+
console.error(`Error reading file ${file}: ${err.message}`);
22+
}
23+
}
24+
}
25+
} catch (err) {
26+
console.error(`Error ready directory: ${err.message}`);
27+
}
28+
29+
return null;
30+
}

src/common/contracts/contracts.module.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { ConfigService } from '../config';
2222
].map((module) =>
2323
module.forRootAsync({
2424
async useFactory(provider: ExecutionProvider, config: ConfigService) {
25-
const addressMap = config.getCustomConfigContractsAddressMap();
25+
const addressMap = await config.getCustomConfigContractsAddressMap();
2626
const address = addressMap ? addressMap.get(module.contractToken) : undefined;
2727
return { provider, address };
2828
},

src/jobs/validators/lido-keys/lido-keys.client.ts

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,27 @@
1-
import { Inject, Injectable } from '@nestjs/common';
1+
import { Inject, Injectable, OnModuleInit } from '@nestjs/common';
22
import { LOGGER_PROVIDER, LoggerService } from '../../../common/logger';
33
import { ConfigService } from '../../../common/config';
4-
import { KEYS_API_PATHS } from './lido-keys.constants';
54
import { LidoKeysData } from './lido-keys.types';
65

76
@Injectable()
8-
export class LidoKeysClient {
7+
export class LidoKeysClient implements OnModuleInit {
98
protected endpoints = {
109
usedKeys: '/v1/keys?used=true',
1110
};
1211

12+
protected basePath: string;
13+
1314
constructor(
1415
@Inject(LOGGER_PROVIDER) protected readonly logger: LoggerService,
1516
protected readonly configService: ConfigService,
1617
) {}
1718

18-
protected getBasePath(): string {
19-
const envUrl = this.configService.get('KEYS_API_BASE_PATH');
20-
21-
if (envUrl) {
22-
return envUrl;
23-
}
24-
25-
const chainId = this.configService.get('CHAIN_ID');
26-
return KEYS_API_PATHS[chainId];
19+
async onModuleInit() {
20+
this.basePath = await this.configService.getKeysApiBasePath();
2721
}
2822

2923
public async getUsedKeys() {
30-
const url = this.getBasePath() + this.endpoints.usedKeys;
24+
const url = this.basePath + this.endpoints.usedKeys;
3125
const lidoKeysResponse = await fetch(url, {
3226
method: 'GET',
3327
});

0 commit comments

Comments
 (0)