jcc_wallet
Version:
Toolkit of wallet to manage multiple chains & support multiple keystores for each chain
98 lines • 3.73 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createWallet = exports.decryptKeystore = exports.getAddress = exports.isValidAddress = exports.isValidSecret = void 0;
var crypto_1 = __importDefault(require("crypto"));
var util_1 = require("@ethereumjs/util");
var wallet_1 = require("@ethereumjs/wallet");
var jcc_common_1 = require("jcc_common");
var keccak_1 = __importDefault(require("keccak"));
var scryptsy_1 = __importDefault(require("scryptsy"));
var constant_1 = require("../constant");
var isObject = function (obj) {
return Object.prototype.toString.call(obj) === "[object Object]";
};
/**
* check eth secret is valid or not
*
* @param {string} secret
* @returns {boolean} return true if valid
*/
var isValidSecret = function (secret) {
secret = (0, jcc_common_1.filterOx)(secret);
try {
return (0, util_1.isValidPrivate)(Buffer.from(secret, "hex"));
}
catch (error) {
return false;
}
};
exports.isValidSecret = isValidSecret;
/**
* check eth address is valid or not
*
* @param {string} address
* @returns {boolean} return true if valid
*/
var isValidAddress = function (address) {
return (0, util_1.isValidAddress)(address);
};
exports.isValidAddress = isValidAddress;
/**
* get eth address with secret
* @param {string} secret
* @returns {string | null} return address if valid, otherwise return null
*/
var getAddress = function (secret) {
secret = (0, jcc_common_1.filterOx)(secret);
if (!isValidSecret(secret)) {
return null;
}
var wallet = wallet_1.Wallet.fromPrivateKey(Buffer.from(secret, "hex"));
return wallet.getAddressString();
};
exports.getAddress = getAddress;
/**
* decrypt ethereum keystore file with ethereum password
*
* @param {string} password
* @param {*} encryptData
* @returns {string} return secret if success, otherwise throws `keystore is invalid` if the keystore is invalid or
* throws `ethereum password is wrong` if the password is wrong
*/
var decryptKeystore = function (password, encryptData) {
if (!isObject(encryptData)) {
throw new Error(constant_1.KEYSTORE_IS_INVALID);
}
var cryptoData = encryptData.Crypto || encryptData.crypto;
if ((0, jcc_common_1.isEmptyObject)(cryptoData) || (0, jcc_common_1.isEmptyObject)(cryptoData.cipherparams) || (0, jcc_common_1.isEmptyObject)(cryptoData.kdfparams)) {
throw new Error(constant_1.KEYSTORE_IS_INVALID);
}
var iv = Buffer.from(cryptoData.cipherparams.iv, "hex");
var kdfparams = cryptoData.kdfparams;
var derivedKey = (0, scryptsy_1.default)(Buffer.from(password), Buffer.from(kdfparams.salt, "hex"), kdfparams.n, kdfparams.r, kdfparams.p, kdfparams.dklen);
var ciphertext = Buffer.from(cryptoData.ciphertext, "hex");
var mac = (0, keccak_1.default)("keccak256")
.update(Buffer.concat([derivedKey.slice(16, 32), ciphertext]))
.digest();
if (mac.toString("hex") !== cryptoData.mac) {
throw new Error(constant_1.ETH_PASSWORD_IS_WRONG);
}
var decipher = crypto_1.default.createDecipheriv("aes-128-ctr", derivedKey.slice(0, 16), iv);
var seed = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
return seed.toString("hex");
};
exports.decryptKeystore = decryptKeystore;
/**
* create eth wallet
*
* @returns {IWalletModel}
*/
var createWallet = function () {
var _w = wallet_1.Wallet.generate();
return { address: _w.getAddressString(), secret: _w.getPrivateKeyString() };
};
exports.createWallet = createWallet;
//# sourceMappingURL=index.js.map