ssv-keys
Version:
CLI Tool for splitting a validator key into a predefined threshold of shares via Shamir-Secret-Sharing (SSS), and encrypt them with a set of operator keys.
85 lines (73 loc) • 2.5 kB
text/typescript
import fs from 'fs';
import path from 'path';
import moment from 'moment';
import { promises as fsp } from 'fs';
import { SSVKeysException } from "@ssv-labs/ssv-sdk";
/**
* Read file contents and return json data from it.
* @param filePath
* @param json
*/
export const readFile = async (filePath: string, json=true): Promise<any> => {
return fsp.readFile(filePath, { encoding: 'utf-8' }).then((data) => {
return json ? JSON.parse(data) : data;
});
}
/**
* Write file contents.
* @param filePath
* @param data
*/
export const writeFile = async (filePath: string, data: string): Promise<any> => {
fsp.writeFile(filePath, data, { encoding: 'utf-8' });
}
/**
* Create SSV keys directory to work in scope of in user home directory
*/
export const createSSVDir = async (outputFolder: string): Promise<any> => {
return fsp.mkdir(outputFolder, { recursive: true });
}
/**
* Get SSV keys directory to work in scope of in user home directory.
* Create it before, if it doesn't exist.
*/
export const getSSVDir = async (outputFolder: string): Promise<string> => {
if (!fs.existsSync(outputFolder)) {
await createSSVDir(outputFolder);
}
return outputFolder.endsWith(path.sep) ? outputFolder : `${outputFolder}${path.sep}`;
}
export const getFilePath = async (name: string, outputFolder: string, withTime = true): Promise<string> => {
return `${await getSSVDir(outputFolder)}${name}${withTime ? `-${moment().unix()}` : ''}.json`;
}
export type KeyStoreFilesResult = {
files: string[];
isFolder: boolean;
}
export const getKeyStoreFiles = async (keystorePath: string): Promise<KeyStoreFilesResult> => {
let isFolder = false;
let files;
try {
// Attempt to open the directory to determine if the path is a folder
const dir = await fsp.opendir(keystorePath);
isFolder = true;
files = [];
for await (const dirent of dir) {
files.push(path.join(keystorePath, dirent.name));
}
if (files.length === 0) {
throw new SSVKeysException('No keystore files detected. Please provide a folder with correct keystore files and try again.');
}
} catch (error: any) {
if (error.code === 'ENOTDIR') {
// It's not a directory, assume it's a file path
isFolder = false;
files = [keystorePath];
} else {
// Other errors are re-thrown
throw new SSVKeysException(error.message);
}
}
files.sort(); // Sort the files array regardless of how it was populated
return { files, isFolder };
}