106 lines
3.3 KiB
TypeScript
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),
|
|
};
|
|
}
|