Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: Resolve Type Warnings for ConfigService.get() #3350

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
141 changes: 141 additions & 0 deletions packages/config-service/src/services/configName.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
/*-
*
* Hedera JSON RPC Relay
*
* Copyright (C) 2024 Hedera Hashgraph, LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/

export enum ConfigName {
BATCH_REQUESTS_ENABLED = 'BATCH_REQUESTS_ENABLED',
BATCH_REQUESTS_MAX_SIZE = 'BATCH_REQUESTS_MAX_SIZE',
CACHE_MAX = 'CACHE_MAX',
CACHE_TTL = 'CACHE_TTL',
CHAIN_ID = 'CHAIN_ID',
CLIENT_TRANSPORT_SECURITY = 'CLIENT_TRANSPORT_SECURITY',
CONSENSUS_MAX_EXECUTION_TIME = 'CONSENSUS_MAX_EXECUTION_TIME',
CONTRACT_CALL_GAS_LIMIT = 'CONTRACT_CALL_GAS_LIMIT',
CONTRACT_QUERY_TIMEOUT_RETRIES = 'CONTRACT_QUERY_TIMEOUT_RETRIES',
DEBUG_API_ENABLED = 'DEBUG_API_ENABLED',
DEFAULT_RATE_LIMIT = 'DEFAULT_RATE_LIMIT',
DEV_MODE = 'DEV_MODE',
E2E_RELAY_HOST = 'E2E_RELAY_HOST',
E2E_SERVER_PORT = 'E2E_SERVER_PORT',
ESTIMATE_GAS_THROWS = 'ESTIMATE_GAS_THROWS',
ETH_BLOCK_NUMBER_CACHE_TTL_MS = 'ETH_BLOCK_NUMBER_CACHE_TTL_MS',
ETH_CALL_ACCEPTED_ERRORS = 'ETH_CALL_ACCEPTED_ERRORS',
ETH_CALL_CACHE_TTL = 'ETH_CALL_CACHE_TTL',
ETH_CALL_CONSENSUS_SELECTORS = 'ETH_CALL_CONSENSUS_SELECTORS',
ETH_CALL_DEFAULT_TO_CONSENSUS_NODE = 'ETH_CALL_DEFAULT_TO_CONSENSUS_NODE',
ETH_FEE_HISTORY_FIXED = 'ETH_FEE_HISTORY_FIXED',
ETH_GET_BALANCE_CACHE_TTL_MS = 'ETH_GET_BALANCE_CACHE_TTL_MS',
ETH_GET_GAS_PRICE_CACHE_TTL_MS = 'ETH_GET_GAS_PRICE_CACHE_TTL_MS',
ETH_GET_LOGS_BLOCK_RANGE_LIMIT = 'ETH_GET_LOGS_BLOCK_RANGE_LIMIT',
ETH_GET_TRANSACTION_COUNT_CACHE_TTL = 'ETH_GET_TRANSACTION_COUNT_CACHE_TTL',
ETH_GET_TRANSACTION_COUNT_MAX_BLOCK_RANGE = 'ETH_GET_TRANSACTION_COUNT_MAX_BLOCK_RANGE',
HEDERA_SPECIFIC_REVERT_STATUSES = 'HEDERA_SPECIFIC_REVERT_STATUSES',
FEE_HISTORY_MAX_RESULTS = 'FEE_HISTORY_MAX_RESULTS',
FILE_APPEND_CHUNK_SIZE = 'FILE_APPEND_CHUNK_SIZE',
FILE_APPEND_MAX_CHUNKS = 'FILE_APPEND_MAX_CHUNKS',
FILTER_API_ENABLED = 'FILTER_API_ENABLED',
FILTER_TTL = 'FILTER_TTL',
GAS_PRICE_PERCENTAGE_BUFFER = 'GAS_PRICE_PERCENTAGE_BUFFER',
GAS_PRICE_TINY_BAR_BUFFER = 'GAS_PRICE_TINY_BAR_BUFFER',
GET_RECORD_DEFAULT_TO_CONSENSUS_NODE = 'GET_RECORD_DEFAULT_TO_CONSENSUS_NODE',
GH_ACCESS_TOKEN = 'GH_ACCESS_TOKEN',
GITHUB_PR_NUMBER = 'GITHUB_PR_NUMBER',
GITHUB_REPOSITORY = 'GITHUB_REPOSITORY',
GITHUB_TOKEN = 'GITHUB_TOKEN',
HAPI_CLIENT_DURATION_RESET = 'HAPI_CLIENT_DURATION_RESET',
HAPI_CLIENT_ERROR_RESET = 'HAPI_CLIENT_ERROR_RESET',
HAPI_CLIENT_TRANSACTION_RESET = 'HAPI_CLIENT_TRANSACTION_RESET',
HBAR_RATE_LIMIT_BASIC = 'HBAR_RATE_LIMIT_BASIC',
HBAR_RATE_LIMIT_EXTENDED = 'HBAR_RATE_LIMIT_EXTENDED',
HBAR_RATE_LIMIT_PRIVILEGED = 'HBAR_RATE_LIMIT_PRIVILEGED',
HBAR_RATE_LIMIT_DURATION = 'HBAR_RATE_LIMIT_DURATION',
HBAR_RATE_LIMIT_TINYBAR = 'HBAR_RATE_LIMIT_TINYBAR',
HEDERA_NETWORK = 'HEDERA_NETWORK',
HBAR_SPENDING_PLANS_CONFIG = 'HBAR_SPENDING_PLANS_CONFIG',
INITIAL_BALANCE = 'INITIAL_BALANCE',
INPUT_SIZE_LIMIT = 'INPUT_SIZE_LIMIT',
LIMIT_DURATION = 'LIMIT_DURATION',
LOCAL_NODE = 'LOCAL_NODE',
LOG_LEVEL = 'LOG_LEVEL',
MAX_BLOCK_RANGE = 'MAX_BLOCK_RANGE',
MEMWATCH_ENABLED = 'MEMWATCH_ENABLED',
MIRROR_NODE_AGENT_CACHEABLE_DNS = 'MIRROR_NODE_AGENT_CACHEABLE_DNS',
MIRROR_NODE_CONTRACT_RESULTS_LOGS_PG_MAX = 'MIRROR_NODE_CONTRACT_RESULTS_LOGS_PG_MAX',
MIRROR_NODE_CONTRACT_RESULTS_PG_MAX = 'MIRROR_NODE_CONTRACT_RESULTS_PG_MAX',
MIRROR_NODE_HTTP_KEEP_ALIVE = 'MIRROR_NODE_HTTP_KEEP_ALIVE',
MIRROR_NODE_HTTP_KEEP_ALIVE_MSECS = 'MIRROR_NODE_HTTP_KEEP_ALIVE_MSECS',
MIRROR_NODE_HTTP_MAX_SOCKETS = 'MIRROR_NODE_HTTP_MAX_SOCKETS',
MIRROR_NODE_HTTP_MAX_TOTAL_SOCKETS = 'MIRROR_NODE_HTTP_MAX_TOTAL_SOCKETS',
MIRROR_NODE_HTTP_SOCKET_TIMEOUT = 'MIRROR_NODE_HTTP_SOCKET_TIMEOUT',
MIRROR_NODE_LIMIT_PARAM = 'MIRROR_NODE_LIMIT_PARAM',
MIRROR_NODE_MAX_REDIRECTS = 'MIRROR_NODE_MAX_REDIRECTS',
MIRROR_NODE_RETRIES = 'MIRROR_NODE_RETRIES',
MIRROR_NODE_RETRIES_DEVMODE = 'MIRROR_NODE_RETRIES_DEVMODE',
MIRROR_NODE_RETRY_CODES = 'MIRROR_NODE_RETRY_CODES',
MIRROR_NODE_RETRY_DELAY = 'MIRROR_NODE_RETRY_DELAY',
MIRROR_NODE_RETRY_DELAY_DEVMODE = 'MIRROR_NODE_RETRY_DELAY_DEVMODE',
MIRROR_NODE_REQUEST_RETRY_COUNT = 'MIRROR_NODE_REQUEST_RETRY_COUNT',
MIRROR_NODE_TIMEOUT = 'MIRROR_NODE_TIMEOUT',
MIRROR_NODE_URL = 'MIRROR_NODE_URL',
MIRROR_NODE_URL_HEADER_X_API_KEY = 'MIRROR_NODE_URL_HEADER_X_API_KEY',
MIRROR_NODE_URL_WEB3 = 'MIRROR_NODE_URL_WEB3',
MULTI_SET = 'MULTI_SET',
npm_package_version = 'npm_package_version',
OPERATOR_ID_ETH_SENDRAWTRANSACTION = 'OPERATOR_ID_ETH_SENDRAWTRANSACTION',
OPERATOR_ID_MAIN = 'OPERATOR_ID_MAIN',
OPERATOR_KEY_ETH_SENDRAWTRANSACTION = 'OPERATOR_KEY_ETH_SENDRAWTRANSACTION',
OPERATOR_KEY_FORMAT = 'OPERATOR_KEY_FORMAT',
OPERATOR_KEY_MAIN = 'OPERATOR_KEY_MAIN',
RATE_LIMIT_DISABLED = 'RATE_LIMIT_DISABLED',
REDIS_ENABLED = 'REDIS_ENABLED',
REDIS_RECONNECT_DELAY_MS = 'REDIS_RECONNECT_DELAY_MS',
REDIS_URL = 'REDIS_URL',
REQUEST_ID_IS_OPTIONAL = 'REQUEST_ID_IS_OPTIONAL',
SDK_REQUEST_TIMEOUT = 'SDK_REQUEST_TIMEOUT',
SEND_RAW_TRANSACTION_SIZE_LIMIT = 'SEND_RAW_TRANSACTION_SIZE_LIMIT',
SERVER_PORT = 'SERVER_PORT',
SERVER_REQUEST_TIMEOUT_MS = 'SERVER_REQUEST_TIMEOUT_MS',
SUBSCRIPTIONS_ENABLED = 'SUBSCRIPTIONS_ENABLED',
TEST = 'TEST',
TEST_GAS_PRICE_DEVIATION = 'TEST_GAS_PRICE_DEVIATION',
TEST_INITIAL_ACCOUNT_STARTING_BALANCE = 'TEST_INITIAL_ACCOUNT_STARTING_BALANCE',
TEST_TRANSACTION_RECORD_COST_TOLERANCE = 'TEST_TRANSACTION_RECORD_COST_TOLERANCE',
TEST_WS_SERVER = 'TEST_WS_SERVER',
TIER_1_RATE_LIMIT = 'TIER_1_RATE_LIMIT',
TIER_2_RATE_LIMIT = 'TIER_2_RATE_LIMIT',
TIER_3_RATE_LIMIT = 'TIER_3_RATE_LIMIT',
TX_DEFAULT_GAS = 'TX_DEFAULT_GAS',
USE_ASYNC_TX_PROCESSING = 'USE_ASYNC_TX_PROCESSING',
WEB_SOCKET_HTTP_PORT = 'WEB_SOCKET_HTTP_PORT',
WEB_SOCKET_PORT = 'WEB_SOCKET_PORT',
WRITE_SNAPSHOT_ON_MEMORY_LEAK = 'WRITE_SNAPSHOT_ON_MEMORY_LEAK',
WS_BATCH_REQUESTS_ENABLED = 'WS_BATCH_REQUESTS_ENABLED',
WS_BATCH_REQUESTS_MAX_SIZE = 'WS_BATCH_REQUESTS_MAX_SIZE',
WS_CACHE_TTL = 'WS_CACHE_TTL',
WS_CONNECTION_LIMIT = 'WS_CONNECTION_LIMIT',
WS_CONNECTION_LIMIT_PER_IP = 'WS_CONNECTION_LIMIT_PER_IP',
WS_MAX_INACTIVITY_TTL = 'WS_MAX_INACTIVITY_TTL',
WS_MULTIPLE_ADDRESSES_ENABLED = 'WS_MULTIPLE_ADDRESSES_ENABLED',
WS_NEW_HEADS_ENABLED = 'WS_NEW_HEADS_ENABLED',
WS_PING_INTERVAL = 'WS_PING_INTERVAL',
WS_POLLING_INTERVAL = 'WS_POLLING_INTERVAL',
WS_RELAY_URL = 'WS_RELAY_URL',
WS_SAME_SUB_FOR_SAME_EVENT = 'WS_SAME_SUB_FOR_SAME_EVENT',
WS_SUBSCRIPTION_LIMIT = 'WS_SUBSCRIPTION_LIMIT',
}
4 changes: 3 additions & 1 deletion packages/config-service/src/services/globalConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
*
*/

import { ConfigName } from './configName';

export interface ConfigProperty {
envName: string;
type: string;
Expand All @@ -26,7 +28,7 @@ export interface ConfigProperty {
}

export class GlobalConfig {
public static readonly ENTRIES: Record<string, ConfigProperty> = {
public static readonly ENTRIES: Record<ConfigName, ConfigProperty> = {
Copy link
Contributor

@acuarica acuarica Dec 21, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of enumerating the keys manually, can we do something like

const _CONFIG = {
  BATCH_REQUESTS_ENABLED: {
    envName: 'BATCH_REQUESTS_ENABLED',
    type: 'boolean',
    required: false,
    defaultValue: null,
  },
  //...
  WS_SUBSCRIPTION_LIMIT: {
    envName: 'WS_SUBSCRIPTION_LIMIT',
    type: 'number',
    required: false,
    defaultValue: null,
  },
} satisfies { [key: string]: ConfigProperty };

export type ConfigKey = keyof typeof _CONFIG;

export class GlobalConfig {
  public static readonly ENTRIES: Record<ConfigKey, ConfigProperty> = _CONFIG;
}

?

So we retain type safety for the keys (even if they're strings).

Note that we can use satisfies because we're using TypeScript 4.9.5 as defined in package-lock.json.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ohh I like the suggestion! Looks cleaner for sure 👏🏼

BATCH_REQUESTS_ENABLED: {
envName: 'BATCH_REQUESTS_ENABLED',
type: 'boolean',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import chai, { expect } from 'chai';
import chaiAsPromised from 'chai-as-promised';
import { ConfigService } from '../../../src/services';
import { ConfigName } from '../../../src/services/configName';

chai.use(chaiAsPromised);

Expand Down Expand Up @@ -49,7 +50,7 @@ describe('ConfigService tests', async function () {
});

it('should be able to get existing env var', async () => {
const res = ConfigService.get('CHAIN_ID');
const res = ConfigService.get(ConfigName.CHAIN_ID);

expect(res).to.equal('0x12a');
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import crypto from 'crypto';
import { ConfigService } from '../../../src/services';
import { LoggerService } from '../../../src/services/loggerService';
import { GlobalConfig } from '../../../dist/services/globalConfig';
import { ConfigName } from '../../../src/services/configName';

chai.use(chaiAsPromised);

Expand All @@ -47,8 +48,8 @@ describe('LoggerService tests', async function () {
});

it('should be able to return plain information', async () => {
const envName = GlobalConfig.ENTRIES.CHAIN_ID.envName;
const res = ConfigService.get(envName);
const envName = ConfigName.CHAIN_ID;
const res = ConfigService.get(envName) as string;

expect(LoggerService.maskUpEnv(envName, res)).to.equal(`${envName} = ${res}`);
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
/*
/*-
*
* Hedera JSON RPC Relay
*
* Copyright (C) 2022-2024 Hedera Hashgraph, LLC
* Copyright (C) 2024 Hedera Hashgraph, LLC
*
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: revert

* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -27,6 +27,7 @@ import pino, { Logger } from 'pino';
import { Registry } from 'prom-client';
import sinon from 'sinon';

import { ConfigName } from '../../../../config-service/src/services/configName';
import { HbarSpendingPlanConfigService } from '../../../src/lib/config/hbarSpendingPlanConfigService';
import { EvmAddressHbarSpendingPlanRepository } from '../../../src/lib/db/repositories/hbarLimiter/evmAddressHbarSpendingPlanRepository';
import { HbarSpendingPlanRepository } from '../../../src/lib/db/repositories/hbarLimiter/hbarSpendingPlanRepository';
Expand Down Expand Up @@ -112,7 +113,7 @@ describe('HbarSpendingPlanConfigService', function () {
});

after(async function () {
if (ConfigService.get('REDIS_ENABLED')) {
if (ConfigService.get(ConfigName.REDIS_ENABLED)) {
await cacheService.disconnectRedisClient();
}
});
Expand Down Expand Up @@ -392,7 +393,7 @@ describe('HbarSpendingPlanConfigService', function () {
it('should not delete pre-configured spending plans after default cache TTL expires', async function () {
await hbarSpendingPlanConfigService.populatePreconfiguredSpendingPlans();

await new Promise((resolve) => setTimeout(resolve, Number(ConfigService.get('CACHE_TTL'))));
await new Promise((resolve) => setTimeout(resolve, Number(ConfigService.get(ConfigName.CACHE_TTL))));

await verifySpendingPlans(spendingPlansConfig);
});
Expand Down
8 changes: 5 additions & 3 deletions packages/relay/tests/lib/eth/eth-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@
*/

import { ConfigService } from '@hashgraph/json-rpc-config-service/dist/services';

import { ConfigName } from '../../../../config-service/src/services/configName';
import { nanOrNumberTo0x,numberTo0x } from '../../../dist/formatters';
import constants from '../../../src/lib/constants';
import {
defaultDetailedContractResultByHash,
defaultEvmAddress,
Expand All @@ -29,8 +33,6 @@ import {
mockData,
toHex,
} from '../../helpers';
import { numberTo0x, nanOrNumberTo0x } from '../../../dist/formatters';
import constants from '../../../src/lib/constants';

export const BLOCK_TRANSACTION_COUNT = 77;
export const GAS_USED_1 = 200000;
Expand Down Expand Up @@ -119,7 +121,7 @@ export const CONTRACT_RESULT_MOCK = {
};

export const CONTRACT_CALL_DATA = '0xef641f44';
export const ETH_FEE_HISTORY_VALUE = ConfigService.get('ETH_FEE_HISTORY_FIXED') ?? true;
export const ETH_FEE_HISTORY_VALUE = ConfigService.get(ConfigName.ETH_FEE_HISTORY_FIXED) ?? true;
export const BLOCK_HASH_PREV_TRIMMED = '0xf7d6481f659c866c35391ee230c374f163642ebf13a5e604e04a95a9ca48a298';
export const BLOCK_NUMBER_HEX = `0x${BLOCK_NUMBER.toString(16)}`;
export const MAX_GAS_LIMIT = 250000;
Expand Down
3 changes: 2 additions & 1 deletion packages/relay/tests/lib/eth/eth-helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import EventEmitter from 'events';
import pino from 'pino';
import { register, Registry } from 'prom-client';

import { ConfigName } from '../../../../config-service/src/services/configName';
import { ConfigServiceTestHelper } from '../../../../config-service/tests/configServiceTestHelper';
import { MirrorNodeClient } from '../../../src/lib/clients/mirrorNodeClient';
import constants from '../../../src/lib/constants';
Expand Down Expand Up @@ -55,7 +56,7 @@ export function generateEthTestEnv(fixedFeeHistory = false) {
const cacheService = new CacheService(logger.child({ name: `cache` }), registry);
// @ts-ignore
const mirrorNodeInstance = new MirrorNodeClient(
ConfigService.get('MIRROR_NODE_URL') || '',
ConfigService.get(ConfigName.MIRROR_NODE_URL) as string || '',
logger.child({ name: `mirror-node` }),
registry,
cacheService,
Expand Down
8 changes: 5 additions & 3 deletions packages/relay/tests/lib/eth/eth_common.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,11 @@

import { ConfigService } from '@hashgraph/json-rpc-config-service/dist/services';
import { expect, use } from 'chai';
import { Registry } from 'prom-client';
import pino from 'pino';
import chaiAsPromised from 'chai-as-promised';
import pino from 'pino';
import { Registry } from 'prom-client';

import { ConfigName } from '../../../../config-service/src/services/configName';
import { RelayImpl } from '../../../src';
import { RequestDetails } from '../../../src/lib/types';

Expand All @@ -42,7 +44,7 @@ describe('@ethCommon', async function () {
it('should execute "eth_chainId"', async function () {
const chainId = Relay.eth().chainId(requestDetails);

expect(chainId).to.be.equal('0x' + Number(ConfigService.get('CHAIN_ID')).toString(16));
expect(chainId).to.be.equal('0x' + Number(ConfigService.get(ConfigName.CHAIN_ID)).toString(16));
});

it('should execute "eth_accounts"', async function () {
Expand Down
5 changes: 3 additions & 2 deletions packages/relay/tests/lib/eth/eth_sendRawTransaction.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import pino from 'pino';
import { Counter } from 'prom-client';
import sinon, { useFakeTimers } from 'sinon';

import { ConfigName } from '../../../../config-service/src/services/configName';
import { Eth, JsonRpcError, predefined } from '../../../src';
import { formatTransactionIdWithoutQueryParams } from '../../../src/formatters';
import { SDKClient } from '../../../src/lib/clients';
Expand Down Expand Up @@ -115,7 +116,7 @@ describe('@ethSendRawTransaction eth_sendRawTransaction spec', async function ()
},
};
const transaction = {
chainId: Number(ConfigService.get('CHAIN_ID') || 0x12a),
chainId: Number(ConfigService.get(ConfigName.CHAIN_ID) || 0x12a),
to: ACCOUNT_ADDRESS_1,
from: accountAddress,
value,
Expand All @@ -135,7 +136,7 @@ describe('@ethSendRawTransaction eth_sendRawTransaction spec', async function ()
},
receiver_sig_required: false,
};
const useAsyncTxProcessing = ConfigService.get('USE_ASYNC_TX_PROCESSING') as boolean;
const useAsyncTxProcessing = ConfigService.get(ConfigName.USE_ASYNC_TX_PROCESSING) as boolean;

beforeEach(() => {
clock = useFakeTimers();
Expand Down
3 changes: 2 additions & 1 deletion packages/relay/tests/lib/ethGetBlockBy.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import HAPIService from '../../src/lib/services/hapiService/hapiService';
import { HbarLimitService } from '../../src/lib/services/hbarLimitService';
import { RequestDetails } from '../../src/lib/types';
import { defaultDetailedContractResults, overrideEnvsInMochaDescribe, useInMemoryRedisServer } from '../helpers';
import { ConfigName } from '../../../config-service/src/services/configName';

use(chaiAsPromised);

Expand Down Expand Up @@ -128,7 +129,7 @@ describe('eth_getBlockBy', async function () {

// @ts-ignore
mirrorNodeInstance = new MirrorNodeClient(
ConfigService.get('MIRROR_NODE_URL') ?? '',
(ConfigService.get(ConfigName.MIRROR_NODE_URL) as string) ?? '',
logger.child({ name: `mirror-node` }),
registry,
cacheService,
Expand Down
Loading
Loading