tovarish-relayer/src/config.ts

106 lines
3.3 KiB
TypeScript

import path from 'path';
import process from 'process';
import os from 'os';
import 'dotenv/config';
import { computeAddress, isHexString } from 'ethers';
import { enabledChains, getConfig, NetIdType, SubdomainMap } from 'tornado-scripts';
import pkgJson from '../package.json';
export const version = `${pkgJson.name} ${pkgJson.version}`;
export interface RelayerConfig {
/**
* Router config
*/
host: string;
port: number;
workers: number;
reverseProxy: boolean;
logLevel?: string;
/**
* Worker config
*/
rewardAccount: string;
serviceFee: number;
// Clear work after this period
clearInterval: number;
/**
* Sync config
*/
enabledNetworks: NetIdType[];
enableTrees: boolean;
rpcUrls: SubdomainMap;
txRpcUrls: SubdomainMap;
merkleWorkerPath: string;
cacheDir: string;
userEventsDir: string;
userTreeDir: string;
syncInterval: number;
}
export function getPrivateKey(): string {
const privateKey = process.env.PRIVATE_KEY;
if (!privateKey || !isHexString(privateKey, 32)) {
throw new Error('Invalid private key, make sure it contains 0x prefix!');
}
return privateKey;
}
export function getRewardAccount(): string {
return computeAddress(getPrivateKey());
}
export function getRelayerConfig(): RelayerConfig {
const enabledNetworks = process.env.ENABLED_NETWORKS
? process.env.ENABLED_NETWORKS.replaceAll(' ', '')
.split(',')
.map((n) => Number(n))
.filter((n) => enabledChains.includes(n))
: enabledChains;
const rpcUrls = enabledNetworks.reduce((acc, netId) => {
// If we have custom RPC url (like as 1_RPC from ENV)
if (process.env[`${netId}_RPC`]) {
acc[netId] = process.env[`${netId}_RPC`] || '';
} else {
acc[netId] = Object.values(getConfig(netId).rpcUrls)[0]?.url;
}
return acc;
}, {} as SubdomainMap);
const txRpcUrls = enabledNetworks.reduce((acc, netId) => {
// If we have custom RPC url (like as 1_RPC from ENV)
if (process.env[`${netId}_TX_RPC`]) {
acc[netId] = process.env[`${netId}_TX_RPC`] || '';
} else {
acc[netId] = rpcUrls[netId];
}
return acc;
}, {} as SubdomainMap);
const STATIC_DIR = process.env.CACHE_DIR || path.join(__dirname, '../static');
const USER_DIR = process.env.USER_DIR || './data';
return {
host: process.env.HOST || '0.0.0.0',
port: Number(process.env.PORT || 3000),
workers: Number(process.env.WORKERS || os.cpus().length),
reverseProxy: process.env.REVERSE_PROXY === 'true',
logLevel: process.env.LOG_LEVEL || undefined,
rewardAccount: getRewardAccount(),
serviceFee: Number(process.env.SERVICE_FEE || 0.5),
clearInterval: Number(process.env.CLEAR_INTERVAL || 86400),
enabledNetworks,
enableTrees: process.env.ENABLE_TREES === 'true',
rpcUrls,
txRpcUrls,
merkleWorkerPath: path.join(STATIC_DIR, './merkleTreeWorker.js'),
cacheDir: path.join(STATIC_DIR, './events'),
userEventsDir: path.join(USER_DIR, './events'),
userTreeDir: path.join(USER_DIR, './trees'),
syncInterval: Number(process.env.SYNC_INTERVAL || 120),
};
}