@nomicfoundation/hardhat-keystore
Version:
A module for managing keystore files that store a map from IDs to encrypted string values.
45 lines • 2.12 kB
JavaScript
import { PLUGIN_ID } from "../constants.js";
import { createMasterKey, deriveMasterKeyFromKeystore, } from "../keystores/encryption.js";
import { askPassword, setUpPassword } from "../keystores/password.js";
import { UserDisplayMessages } from "../ui/user-display-messages.js";
import { setupKeystoreLoaderFrom } from "../utils/setup-keystore-loader-from.js";
import { validateKey } from "../utils/validate-key.js";
const taskSet = async (setArgs, hre) => {
const keystoreLoader = setupKeystoreLoaderFrom(hre);
await set(setArgs, keystoreLoader, hre.interruptions.requestSecretInput.bind(hre.interruptions));
};
export const set = async ({ key, force }, keystoreLoader, requestSecretInput, consoleLog = console.log) => {
if (!(await validateKey(key))) {
consoleLog(UserDisplayMessages.displayInvalidKeyErrorMessage(key));
process.exitCode = 1;
return;
}
const isKeystoreInitialized = await keystoreLoader.isKeystoreInitialized();
const password = isKeystoreInitialized
? await askPassword(requestSecretInput)
: await setUpPassword(requestSecretInput, consoleLog);
if (isKeystoreInitialized === false) {
await keystoreLoader.createUnsavedKeystore(createMasterKey({ password }));
}
const keystore = await keystoreLoader.loadKeystore();
const masterKey = deriveMasterKeyFromKeystore({
encryptedKeystore: keystore.toJSON(),
password,
});
if (!force && (await keystore.hasKey(key, masterKey))) {
consoleLog(UserDisplayMessages.displayKeyAlreadyExistsWarning(key));
process.exitCode = 1;
return;
}
const secret = await requestSecretInput(PLUGIN_ID, UserDisplayMessages.enterSecretMessage());
if (secret.length === 0) {
consoleLog(UserDisplayMessages.displaySecretCannotBeEmptyErrorMessage());
process.exitCode = 1;
return;
}
await keystore.addNewValue(key, secret, masterKey);
await keystoreLoader.saveKeystoreToFile();
consoleLog(UserDisplayMessages.displayKeySetInfoMessage(key));
};
export default taskSet;
//# sourceMappingURL=set.js.map