@ethersphere/swarm-cli
Version:
CLI tool for Bee
92 lines (74 loc) • 3.15 kB
text/typescript
import { Wallet } from '@ethereumjs/wallet'
import { randomBytes } from 'crypto'
import { Argument, LeafCommand, Option, Utils } from 'furious-commander'
import { getPrintableIdentityType } from '../../service/identity'
import { Identity, IdentityType } from '../../service/identity/types'
import { CommandLineError } from '../../utils/error'
import { Message } from '../../utils/message'
import { createAndRunSpinner } from '../../utils/spinner'
import { createKeyValue } from '../../utils/text'
import { IdentityCommand } from './identity-command'
export class Create extends IdentityCommand implements LeafCommand {
public readonly name = 'create'
public readonly description = 'Create Ethereum compatible keypair to sign chunks'
public identityName!: string
public password!: string
public onlyKeypair!: boolean
public async run(): Promise<void> {
super.init()
if (Utils.getSourcemap().name === 'default') {
this.console.info(`No identity name specified, defaulting to '${this.identityName}'`)
}
if (this.commandConfig.config.identities[this.identityName]) {
throw new CommandLineError(Message.identityNameConflictArgument(this.identityName))
}
const wallet = this.generateWallet()
const identity = this.onlyKeypair ? this.createPrivateKeyIdentity(wallet) : await this.createV3Identity(wallet)
const saved = this.commandConfig.saveIdentity(this.identityName, identity)
if (!saved) {
throw new CommandLineError(Message.identityNameConflictArgument(this.identityName))
}
this.console.log(createKeyValue('Name', this.identityName))
this.console.log(createKeyValue('Type', getPrintableIdentityType(identity.identityType)))
this.printWallet(wallet)
this.printWalletQuietly(wallet)
}
private async createV3Identity(wallet: Wallet): Promise<Identity> {
if (!this.password) {
this.console.log(Message.optionNotDefined('password'))
this.console.info('If you want to create passwordless keypair, use the --only-keypair option')
this.password = await this.console.askForPasswordWithConfirmation(
Message.newV3Password(),
Message.newV3PasswordConfirmation(),
)
}
const spinner = createAndRunSpinner('Creating V3 wallet...', this.verbosity)
const v3 = await wallet.toV3(this.password)
spinner.stop()
return {
wallet: v3,
identityType: IdentityType.v3,
}
}
private createPrivateKeyIdentity(wallet: Wallet): Identity {
return {
wallet: {
privateKey: wallet.getPrivateKeyString(),
},
identityType: IdentityType.simple,
}
}
private generateWallet(): Wallet {
const privateKey = randomBytes(32)
return new Wallet(privateKey)
}
}