// Copyright (C) 2018 Zilliqa
//
// This file is part of zilliqa-js
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
import * as zcrypto from "@zilliqa-js/crypto";
// @ts-ignore
import { Buffer } from "buffer";
export class Account {
/**
* fromFile
*
* Takes a JSON-encoded keystore and passphrase, returning a fully
* instantiated Account instance.
*
* @param {string} file
* @param {string} passphrase
* @returns {Promise}
*/
static async fromFile(file: string, passphrase: string): Promise {
try {
const keystore = JSON.parse(file);
const privateKey = await zcrypto.decryptPrivateKey(passphrase, keystore);
return new Account(privateKey);
} catch (err) {
throw new Error(`Could not decrypt keystore file.`);
}
}
privateKey: string;
publicKey: string;
address: string;
bech32Address: string;
constructor(privateKey: string) {
this.privateKey = this.normalizePrivateKey(privateKey);
this.publicKey = zcrypto.getPubKeyFromPrivateKey(this.privateKey);
this.address = zcrypto.getAddressFromPublicKey(this.publicKey);
this.bech32Address = zcrypto.toBech32Address(this.address);
}
/**
* toFile
*
* @param {string} passphrase
* @param {kdf} 'pbkdf2' | 'scrypt'
* @returns {Promise}
*/
async toFile(
passphrase: string,
kdf: "pbkdf2" | "scrypt" = "scrypt"
): Promise {
if (!passphrase || !passphrase.length) {
throw new Error("Passphrase cannot have a length of 0");
}
const keystore = await zcrypto.encryptPrivateKey(
kdf,
this.privateKey,
passphrase
);
return keystore;
}
/**
* signTransaction
*
* @param {Buffer} bytes - the data to be signed
*
* @returns {string} - the hex encoded signature. it is a concatenation of
* the r and s values in hex, each padded to a length of 64.
*/
signTransaction(bytes: Buffer) {
return zcrypto.sign(bytes, this.privateKey, this.publicKey);
}
private normalizePrivateKey(privateKey: string) {
return zcrypto.normalizePrivateKey(privateKey);
}
}