diff --git a/packages/cli/src/cmds/account/cmds/validator/import.ts b/packages/cli/src/cmds/account/cmds/validator/import.ts index 99ce4d8cd4f7..415dca9fdaa7 100644 --- a/packages/cli/src/cmds/account/cmds/validator/import.ts +++ b/packages/cli/src/cmds/account/cmds/validator/import.ts @@ -117,7 +117,7 @@ has the '.json' extension will be attempted to be imported.", } const dir = getValidatorDirPath({keystoresDir, pubkey, prefixed: true}); if (fs.existsSync(dir) || fs.existsSync(getValidatorDirPath({keystoresDir, pubkey}))) { - console.log(`Skipping existing validator ${pubkey}`); + console.log(`Skipping existing validator ${pubkey}. Already exist in ${dir}`); continue; } @@ -128,10 +128,11 @@ has the '.json' extension will be attempted to be imported.", const passphrase = await getKeystorePassphrase(keystore, passphrasePaths, passphraseFile); fs.mkdirSync(secretsDir, {recursive: true}); fs.mkdirSync(dir, {recursive: true}); - fs.writeFileSync(path.join(dir, VOTING_KEYSTORE_FILE), keystore.stringify()); + const votingKeystoreFile = path.join(dir, VOTING_KEYSTORE_FILE); + fs.writeFileSync(votingKeystoreFile, keystore.stringify()); writeValidatorPassphrase({secretsDir, pubkey, passphrase}); - console.log(`Successfully imported validator ${pubkey}`); + console.log(`Successfully imported validator ${pubkey} to ${votingKeystoreFile}`); numOfImportedValidators++; } @@ -202,3 +203,11 @@ required each time the validator client starts return answers.password; } + +/** + * Extend an existing error by appending a string to its `e.message` + */ +export function extendError(e: Error, prependMessage: string): Error { + e.message = `${e.message} - ${prependMessage}`; + return e; +} diff --git a/packages/cli/src/cmds/account/cmds/validator/voluntaryExit.ts b/packages/cli/src/cmds/account/cmds/validator/voluntaryExit.ts index fd95c215c1f5..dbd77aed4432 100644 --- a/packages/cli/src/cmds/account/cmds/validator/voluntaryExit.ts +++ b/packages/cli/src/cmds/account/cmds/validator/voluntaryExit.ts @@ -91,7 +91,16 @@ BE UNTIL AT LEAST TWO YEARS AFTER THE PHASE 0 MAINNET LAUNCH. console.log(`Initiating voluntary exit for validator ${publicKey}`); - const secretKey = await validatorDirManager.decryptValidator(publicKey, {force}); + let secretKey; + try { + secretKey = await validatorDirManager.decryptValidator(publicKey, {force}); + } catch (e) { + if ((e as Error).message.indexOf("EEXIST") !== -1) { + console.log(`Decrypting keystore failed with error ${e}. use --force to override`); + } + throw e; + } + console.log(`Decrypted keystore for validator ${publicKey}`); const validatorPaths = getValidatorPaths(args); diff --git a/packages/cli/src/validatorDir/ValidatorDir.ts b/packages/cli/src/validatorDir/ValidatorDir.ts index 7195153e78c9..1b8477b04491 100644 --- a/packages/cli/src/validatorDir/ValidatorDir.ts +++ b/packages/cli/src/validatorDir/ValidatorDir.ts @@ -4,15 +4,13 @@ import bls, {SecretKey} from "@chainsafe/bls"; import {Keystore} from "@chainsafe/bls-keystore"; import {phase0} from "@chainsafe/lodestar-types"; import {lockFilepath, unlockFilepath} from "@chainsafe/lodestar-keymanager-server"; -import {YargsError, readValidatorPassphrase} from "../util"; +import {YargsError, readValidatorPassphrase, add0xPrefix} from "../util"; import {decodeEth1TxData} from "../depositContract/depositData"; -import {add0xPrefix} from "../util/format"; import { VOTING_KEYSTORE_FILE, WITHDRAWAL_KEYSTORE_FILE, ETH1_DEPOSIT_DATA_FILE, ETH1_DEPOSIT_AMOUNT_FILE, - ETH1_DEPOSIT_TX_HASH_FILE, } from "./paths"; export interface IValidatorDirOptions { @@ -116,28 +114,6 @@ export class ValidatorDir { return bls.SecretKey.fromBytes(privKey); } - /** - * Indicates if there is a file containing an eth1 deposit transaction. This can be used to - * check if a deposit transaction has been created. - * - * *Note*: It's possible to submit an Eth1 deposit without creating this file, so use caution - * when relying upon this value. - */ - eth1DepositTxHashExists(): boolean { - return fs.existsSync(path.join(this.dirpath, ETH1_DEPOSIT_TX_HASH_FILE)); - } - - /** - * Saves the `tx_hash` to a file in `this.dir`. - */ - saveEth1DepositTxHash(txHash: string): void { - const filepath = path.join(this.dirpath, ETH1_DEPOSIT_TX_HASH_FILE); - - if (fs.existsSync(filepath)) throw new YargsError(`ETH1_DEPOSIT_TX_HASH_FILE ${filepath} already exists`); - - fs.writeFileSync(filepath, txHash); - } - /** * Attempts to read files in `this.dir` and return an `Eth1DepositData` that can be used for * submitting an Eth1 deposit. diff --git a/packages/utils/src/errors.ts b/packages/utils/src/errors.ts index 79c7c6e25a36..2faeebbd4054 100644 --- a/packages/utils/src/errors.ts +++ b/packages/utils/src/errors.ts @@ -48,3 +48,11 @@ export class TimeoutError extends Error { export function isErrorAborted(e: unknown): e is ErrorAborted { return e instanceof ErrorAborted; } + +/** + * Extend an existing error by appending a string to its `e.message` + */ +export function extendError(e: Error, appendMessage: string): Error { + e.message = `${e.message} - ${appendMessage}`; + return e; +} diff --git a/packages/validator/src/services/attestation.ts b/packages/validator/src/services/attestation.ts index e25b59da6d10..7d06365e8d4e 100644 --- a/packages/validator/src/services/attestation.ts +++ b/packages/validator/src/services/attestation.ts @@ -1,9 +1,9 @@ import {AbortSignal} from "@chainsafe/abort-controller"; import {phase0, Slot, ssz} from "@chainsafe/lodestar-types"; import {computeEpochAtSlot} from "@chainsafe/lodestar-beacon-state-transition"; -import {sleep} from "@chainsafe/lodestar-utils"; +import {extendError, sleep} from "@chainsafe/lodestar-utils"; import {Api} from "@chainsafe/lodestar-api"; -import {extendError, IClock, ILoggerVc} from "../util"; +import {IClock, ILoggerVc} from "../util"; import {ValidatorStore} from "./validatorStore"; import {AttestationDutiesService, AttDutyAndProof} from "./attestationDuties"; import {groupAttDutiesByCommitteeIndex} from "./utils"; diff --git a/packages/validator/src/services/attestationDuties.ts b/packages/validator/src/services/attestationDuties.ts index 55c68b13e861..3a165d36399a 100644 --- a/packages/validator/src/services/attestationDuties.ts +++ b/packages/validator/src/services/attestationDuties.ts @@ -1,11 +1,11 @@ import {SLOTS_PER_EPOCH} from "@chainsafe/lodestar-params"; -import {sleep} from "@chainsafe/lodestar-utils"; +import {extendError, sleep} from "@chainsafe/lodestar-utils"; import {computeEpochAtSlot, isAggregatorFromCommitteeLength} from "@chainsafe/lodestar-beacon-state-transition"; import {BLSSignature, Epoch, Slot, ValidatorIndex, RootHex} from "@chainsafe/lodestar-types"; import {Api, routes} from "@chainsafe/lodestar-api"; import {toHexString} from "@chainsafe/ssz"; import {IndicesService} from "./indices"; -import {IClock, extendError, ILoggerVc} from "../util"; +import {IClock, ILoggerVc} from "../util"; import {ValidatorStore} from "./validatorStore"; import {ChainHeaderTracker, HeadEventData} from "./chainHeaderTracker"; import {PubkeyHex} from "../types"; diff --git a/packages/validator/src/services/block.ts b/packages/validator/src/services/block.ts index 9f7224c693e3..a404eabbcba3 100644 --- a/packages/validator/src/services/block.ts +++ b/packages/validator/src/services/block.ts @@ -1,10 +1,10 @@ import {BLSPubkey, Slot} from "@chainsafe/lodestar-types"; import {IChainForkConfig} from "@chainsafe/lodestar-config"; import {ForkName} from "@chainsafe/lodestar-params"; -import {prettyBytes} from "@chainsafe/lodestar-utils"; +import {extendError, prettyBytes} from "@chainsafe/lodestar-utils"; import {toHexString} from "@chainsafe/ssz"; import {Api} from "@chainsafe/lodestar-api"; -import {IClock, extendError, ILoggerVc} from "../util"; +import {IClock, ILoggerVc} from "../util"; import {ValidatorStore} from "./validatorStore"; import {BlockDutiesService, GENESIS_SLOT} from "./blockDuties"; import {PubkeyHex} from "../types"; diff --git a/packages/validator/src/services/blockDuties.ts b/packages/validator/src/services/blockDuties.ts index 3c66ab5a2bdb..4dde9c7fb140 100644 --- a/packages/validator/src/services/blockDuties.ts +++ b/packages/validator/src/services/blockDuties.ts @@ -2,7 +2,8 @@ import {computeEpochAtSlot} from "@chainsafe/lodestar-beacon-state-transition"; import {BLSPubkey, Epoch, Root, Slot, ssz} from "@chainsafe/lodestar-types"; import {toHexString} from "@chainsafe/ssz"; import {Api, routes} from "@chainsafe/lodestar-api"; -import {IClock, extendError, differenceHex, ILoggerVc} from "../util"; +import {extendError} from "@chainsafe/lodestar-utils"; +import {IClock, differenceHex, ILoggerVc} from "../util"; import {ValidatorStore} from "./validatorStore"; import {PubkeyHex} from "../types"; import {Metrics} from "../metrics"; diff --git a/packages/validator/src/services/syncCommittee.ts b/packages/validator/src/services/syncCommittee.ts index 0660a279c454..bbb61525cef2 100644 --- a/packages/validator/src/services/syncCommittee.ts +++ b/packages/validator/src/services/syncCommittee.ts @@ -1,10 +1,10 @@ import {AbortSignal} from "@chainsafe/abort-controller"; import {IChainForkConfig} from "@chainsafe/lodestar-config"; import {Slot, CommitteeIndex, altair, Root} from "@chainsafe/lodestar-types"; -import {sleep} from "@chainsafe/lodestar-utils"; +import {extendError, sleep} from "@chainsafe/lodestar-utils"; import {computeEpochAtSlot} from "@chainsafe/lodestar-beacon-state-transition"; import {Api} from "@chainsafe/lodestar-api"; -import {IClock, extendError, ILoggerVc} from "../util"; +import {IClock, ILoggerVc} from "../util"; import {ValidatorStore} from "./validatorStore"; import {SyncCommitteeDutiesService, SyncDutyAndProofs} from "./syncCommitteeDuties"; import {groupSyncDutiesBySubcommitteeIndex, SubcommitteeDuty} from "./utils"; diff --git a/packages/validator/src/services/syncCommitteeDuties.ts b/packages/validator/src/services/syncCommitteeDuties.ts index 22c95d713c01..a3fce25a2145 100644 --- a/packages/validator/src/services/syncCommitteeDuties.ts +++ b/packages/validator/src/services/syncCommitteeDuties.ts @@ -8,8 +8,9 @@ import {IChainForkConfig} from "@chainsafe/lodestar-config"; import {BLSSignature, Epoch, Root, Slot, SyncPeriod, ValidatorIndex} from "@chainsafe/lodestar-types"; import {toHexString} from "@chainsafe/ssz"; import {Api, routes} from "@chainsafe/lodestar-api"; +import {extendError} from "@chainsafe/lodestar-utils"; import {IndicesService} from "./indices"; -import {IClock, extendError, ILoggerVc} from "../util"; +import {IClock, ILoggerVc} from "../util"; import {ValidatorStore} from "./validatorStore"; import {PubkeyHex} from "../types"; import {Metrics} from "../metrics"; diff --git a/packages/validator/src/util/error.ts b/packages/validator/src/util/error.ts deleted file mode 100644 index 5aabcb0f264d..000000000000 --- a/packages/validator/src/util/error.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Extend an existing error by appending a string to its `e.message` - */ -export function extendError(e: Error, prependMessage: string): Error { - e.message = `${prependMessage} - ${e.message}`; - return e; -} diff --git a/packages/validator/src/util/index.ts b/packages/validator/src/util/index.ts index d012b52acc76..4800e3a2b696 100644 --- a/packages/validator/src/util/index.ts +++ b/packages/validator/src/util/index.ts @@ -1,6 +1,5 @@ export * from "./clock"; export * from "./difference"; -export * from "./error"; export * from "./logger"; export * from "./params"; export * from "./url";