newpay-wallet-js
Version:
856 lines (741 loc) • 40.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
//import TransactionConfirmActions from "actions/TransactionConfirmActions";
//import PrivateKeyActions from "./PrivateKeyActions.js";
//import AccountActions from "./AccountActions.js";
//import AddressIndex from "./AddressIndex.js";
var _idbInstance = require("./idb-instance.js");
var _idbInstance2 = _interopRequireDefault(_idbInstance);
var _idbHelper = require("./idb-helper.js");
var _idbHelper2 = _interopRequireDefault(_idbHelper);
var _lodash = require("lodash");
var _PrivateKeyStore = require("./PrivateKeyStore.js");
var _PrivateKeyStore2 = _interopRequireDefault(_PrivateKeyStore);
var _tcomb_structs = require("./tcomb_structs");
var _WalletUnlockActions = require("./WalletUnlockActions.js");
var _WalletUnlockActions2 = _interopRequireDefault(_WalletUnlockActions);
var _es = require("bitsharesjs/es");
var _bitsharesjsWs = require("bitsharesjs-ws");
var _AccountRefsStore = require("./AccountRefsStore.js");
var _AccountRefsStore2 = _interopRequireDefault(_AccountRefsStore);
var _AccountStore = require("./AccountStore.js");
var _AccountStore2 = _interopRequireDefault(_AccountStore);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var aes_private = null;
var _passwordKey = null;
// let transaction;
var TRACE = false;
var dictJson = void 0,
AesWorker = void 0;
if (false) {
AesWorker = require("worker-loader?inline!workers/AesWorker");
dictJson = require("json-loader!common/dictionary_en.json");
}
/** Represents a single wallet and related indexedDb database operations. */
var WalletDb = function () {
function WalletDb() {
_classCallCheck(this, WalletDb);
console.log("Walletdb constructor");
this.state = { wallet: null, saving_keys: false
// Confirm only works when there is a UI (this is for mocha unit tests)
};this.confirm_transactions = true;
_es.ChainStore.subscribe(this.checkNextGeneratedKey.bind(this));
this.generateNextKey_pubcache = [];
// WalletDb use to be a plan old javascript class (not an Alt store) so
// for now many methods need to be exported...
this.generatingKey = false;
}
_createClass(WalletDb, [{
key: "checkNextGeneratedKey",
/** Discover derived keys that are not in this wallet */
value: function checkNextGeneratedKey() {
if (!this.state.wallet) return;
if (!aes_private) return; // locked
if (!this.state.wallet.encrypted_brainkey) return; // no brainkey
if (this.chainstore_account_ids_by_key === _es.ChainStore.account_ids_by_key) return; // no change
this.chainstore_account_ids_by_key = _es.ChainStore.account_ids_by_key;
// Helps to ensure we are looking at an un-used key
try {
this.generateNextKey(false /*save*/);
} catch (e) {
console.error(e);
}
}
}, {
key: "getWallet",
value: function getWallet() {
return this.state.wallet;
}
}, {
key: "onLock",
value: function onLock() {
_passwordKey = null;
aes_private = null;
}
}, {
key: "isLocked",
value: function isLocked() {
return !(!!aes_private || !!_passwordKey);
//return false;
}
}, {
key: "decryptTcomb_PrivateKey",
value: function decryptTcomb_PrivateKey(private_key_tcomb) {
if (!private_key_tcomb) return null;
if (this.isLocked()) {
throw new Error("wallet locked");
}
if (_passwordKey && _passwordKey[private_key_tcomb.pubkey]) {
return _passwordKey[private_key_tcomb.pubkey];
}
var private_key_hex = aes_private.decryptHex(private_key_tcomb.encrypted_key);
return _es.PrivateKey.fromBuffer(new Buffer(private_key_hex, 'hex'));
}
/** @return ecc/PrivateKey or null */
}, {
key: "getPrivateKey",
value: function getPrivateKey(public_key) {
if (_passwordKey) return _passwordKey[public_key];
if (!public_key) return null;
if (public_key.Q) public_key = public_key.toPublicKeyString();
var private_key_tcomb = _PrivateKeyStore2.default.getTcomb_byPubkey(public_key);
if (!private_key_tcomb) return null;
return this.decryptTcomb_PrivateKey(private_key_tcomb);
}
}, {
key: "process_transaction",
value: function process_transaction(tr, signer_pubkeys, broadcast) {
var _this = this;
var extra_keys = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
if (_bitsharesjsWs.Apis.instance().chain_id !== this.state.wallet.chain_id) return Promise.reject("Mismatched chain_id; expecting " + this.state.wallet.chain_id + ", but got " + _bitsharesjsWs.Apis.instance().chain_id);
return _WalletUnlockActions2.default.unlock().then(function () {
_AccountStore2.default.tryToSetCurrentAccount();
return Promise.all([tr.set_required_fees(), tr.update_head_block()]).then(function () {
var signer_pubkeys_added = {};
if (signer_pubkeys) {
// Balance claims are by address, only the private
// key holder can know about these additional
// potential keys.
var pubkeys = _PrivateKeyStore2.default.getPubkeys_having_PrivateKey(signer_pubkeys);
if (!pubkeys.length) throw new Error("Missing signing key");
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = pubkeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var pubkey_string = _step.value;
var private_key = _this.getPrivateKey(pubkey_string);
tr.add_signer(private_key, pubkey_string);
signer_pubkeys_added[pubkey_string] = true;
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
}
return tr.get_potential_signatures().then(function (_ref) {
var pubkeys = _ref.pubkeys,
addys = _ref.addys;
var my_pubkeys = _PrivateKeyStore2.default.getPubkeys_having_PrivateKey(pubkeys.concat(extra_keys), addys);
console.log("pubkeys", pubkeys);
//{//Testing only, don't send All public keys!
// let pubkeys_all = PrivateKeyStore.getPubkeys() // All public keys
// tr.get_required_signatures(pubkeys_all).then( required_pubkey_strings =>
// console.log('get_required_signatures all\t',required_pubkey_strings.sort(), pubkeys_all))
// tr.get_required_signatures(my_pubkeys).then( required_pubkey_strings =>
// console.log('get_required_signatures normal\t',required_pubkey_strings.sort(), pubkeys))
//}
return tr.get_required_signatures(my_pubkeys).then(function (required_pubkeys) {
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = required_pubkeys[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var _pubkey_string = _step2.value;
if (signer_pubkeys_added[_pubkey_string]) continue;
var _private_key = _this.getPrivateKey(_pubkey_string);
if (!_private_key)
// This should not happen, get_required_signatures will only
// returned keys from my_pubkeys
throw new Error("Missing signing key for " + _pubkey_string);
tr.add_signer(_private_key, _pubkey_string);
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
});
}).then(function () {
if (broadcast) {
/* cyj delete 20171101 去掉web的界面刷新
if(this.confirm_transactions) {
let p = new Promise((resolve, reject) => {
TransactionConfirmActions.confirm(tr, resolve, reject)
})
return p;
}
else
*/
var broadcast_timeout = setTimeout(function () {
Promise.reject("Your transaction has expired without being confirmed, please try again later.");
}, 15 * 2000);
return tr.broadcast(function () {
//广播成功
console.log("broadcast success");
}).then(function (res) {
console.log("tr end Info", res);
clearTimeout(broadcast_timeout);
var tr_res = {};
tr_res['block_num'] = res[0].block_num;
tr_res['trx_num'] = res[0].trx_num;
tr_res['txid'] = tr.id();
tr_res['fee'] = tr.serialize().operations[0][1].fee;
return Promise.resolve(tr_res);
}).catch(function (error) {
clearTimeout(broadcast_timeout);
// messages of length 1 are local exceptions (use the 1st line)
// longer messages are remote API exceptions (use the 1st line)
var splitError = error.message.split("\n");
var message = splitError[0]; //报错信息
return Promise.reject(message);
});
} else return tr.serialize();
});
});
});
}
}, {
key: "transaction_update",
value: function transaction_update() {
var transaction = _idbInstance2.default.instance().db().transaction(["wallet"], "readwrite");
return transaction;
}
}, {
key: "transaction_update_keys",
value: function transaction_update_keys() {
var transaction = _idbInstance2.default.instance().db().transaction(["wallet", "private_keys"], "readwrite");
return transaction;
}
}, {
key: "getBrainKey",
value: function getBrainKey() {
var wallet = this.state.wallet;
if (!wallet.encrypted_brainkey) throw new Error("missing brainkey");
if (!aes_private) {
throw new Error("wallet locked");
}
var brainkey_plaintext = aes_private.decryptHexToText(wallet.encrypted_brainkey);
return brainkey_plaintext;
}
}, {
key: "getBrainKeyPrivate",
value: function getBrainKeyPrivate() {
var brainkey_plaintext = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getBrainKey();
if (!brainkey_plaintext) throw new Error("missing brainkey");
return _es.PrivateKey.fromSeed(_es.key.normalize_brainKey(brainkey_plaintext));
}
}, {
key: "onCreateWallet",
value: function onCreateWallet(password_plaintext, brainkey_plaintext) {
var _this2 = this;
var unlock = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
var public_name = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "default";
var walletCreateFct = function walletCreateFct(dictionary) {
//dictionary就是a-z的单词字典
return new Promise(function (resolve, reject) {
if (typeof password_plaintext !== 'string') throw new Error("password string is required");
var brainkey_backup_date = void 0;
if (brainkey_plaintext) {
if (typeof brainkey_plaintext !== "string") throw new Error("Brainkey must be a string");
if (brainkey_plaintext.trim() === "") throw new Error("Brainkey can not be an empty string");
if (brainkey_plaintext.length < 50) throw new Error("Brainkey must be at least 50 characters long");
// The user just provided the Brainkey so this avoids
// bugging them to back it up again.
brainkey_backup_date = new Date();
}
var password_aes = _es.Aes.fromSeed(password_plaintext);
var encryption_buffer = _es.key.get_random_key().toBuffer();
// encryption_key is the global encryption key (does not change even if the passsword changes)
var encryption_key = password_aes.encryptToHex(encryption_buffer);
// If unlocking, local_aes_private will become the global aes_private object
var local_aes_private = _es.Aes.fromSeed(encryption_buffer);
if (!brainkey_plaintext) brainkey_plaintext = _es.key.suggest_brain_key(dictionary.en);else brainkey_plaintext = _es.key.normalize_brainKey(brainkey_plaintext);
var brainkey_private = _this2.getBrainKeyPrivate(brainkey_plaintext);
var brainkey_pubkey = brainkey_private.toPublicKey().toPublicKeyString();
var encrypted_brainkey = local_aes_private.encryptToHex(brainkey_plaintext);
var password_private = _es.PrivateKey.fromSeed(password_plaintext);
var password_pubkey = password_private.toPublicKey().toPublicKeyString();
var wallet = {
public_name: public_name,
password_pubkey: password_pubkey,
encryption_key: encryption_key,
encrypted_brainkey: encrypted_brainkey,
brainkey_pubkey: brainkey_pubkey,
brainkey_sequence: 0,
brainkey_backup_date: brainkey_backup_date,
created: new Date(),
last_modified: new Date(),
chain_id: _bitsharesjsWs.Apis.instance().chain_id
};
(0, _tcomb_structs.WalletTcomb)(wallet); // validation
var transaction = _this2.transaction_update();
var add = _idbHelper2.default.add(transaction.objectStore("wallet"), wallet);
var end = _idbHelper2.default.on_transaction_end(transaction).then(function () {
_this2.state.wallet = wallet;
if (unlock) {
aes_private = local_aes_private;
_WalletUnlockActions2.default.unlock();
}
});
Promise.all([add, end]).then(function () {
resolve();
}).catch(function (err) {
reject(err);
});
});
};
if (false) {
//false
return walletCreateFct(dictJson);
} else {
//let dictionaryPromise = brainkey_plaintext ? null : fetch(`${__BASE_URL__}dictionary.json`);
var dictionaryPromise = brainkey_plaintext ? null : require("./lib/common/dictionary_en.json");
return Promise.all([dictionaryPromise]).then(function (res) {
return brainkey_plaintext ? walletCreateFct(null) : walletCreateFct(res[0]);
}).catch(function (err) {
console.log("unable to fetch dictionary.json", err);
return Promise.reject(err);
});
}
}
}, {
key: "generateKeyFromPassword",
value: function generateKeyFromPassword(accountName, role, password) {
var seed = accountName + role + password;
var privKey = _es.PrivateKey.fromSeed(seed);
var pubKey = privKey.toPublicKey().toString();
return { privKey: privKey, pubKey: pubKey };
}
/** This also serves as 'unlock' */
}, {
key: "validatePassword",
value: function validatePassword(password) {
var unlock = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
var _this3 = this;
var account = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
var roles = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ["active", "owner", "memo"];
if (account) {
var setKey = function setKey(role, priv, pub) {
if (!_passwordKey) _passwordKey = {};
_passwordKey[pub] = priv;
id++;
_PrivateKeyStore2.default.setPasswordLoginKey({
pubkey: pub,
import_account_names: [account],
encrypted_key: null,
id: id,
brainkey_sequence: null
});
};
/* Check if the user tried to login with a private key */
var id = 0;
var fromWif = void 0;
try {
fromWif = _es.PrivateKey.fromWif(password);
} catch (err) {}
var acc = _es.ChainStore.getAccount(account, false);
var _key = void 0;
if (fromWif) {
_key = { privKey: fromWif, pubKey: fromWif.toPublicKey().toString() };
}
/* Test the pubkey for each role against either the wif key, or the password generated keys */
roles.forEach(function (role) {
if (!fromWif) {
_key = _this3.generateKeyFromPassword(account, role, password);
}
var foundRole = false;
if (acc) {
if (role === "memo") {
if (acc.getIn(["options", "memo_key"]) === _key.pubKey) {
setKey(role, _key.privKey, _key.pubKey);
foundRole = true;
}
} else {
acc.getIn([role, "key_auths"]).forEach(function (auth) {
if (auth.get(0) === _key.pubKey) {
setKey(role, _key.privKey, _key.pubKey);
foundRole = true;
return false;
}
});
if (!foundRole) {
var alsoCheckRole = role === "active" ? "owner" : "active";
acc.getIn([alsoCheckRole, "key_auths"]).forEach(function (auth) {
if (auth.get(0) === _key.pubKey) {
setKey(alsoCheckRole, _key.privKey, _key.pubKey);
foundRole = true;
return false;
}
});
}
}
}
});
return !!_passwordKey;
} else {
var wallet = this.state.wallet;
try {
var password_private = _es.PrivateKey.fromSeed(password);
var password_pubkey = password_private.toPublicKey().toPublicKeyString();
if (wallet.password_pubkey !== password_pubkey) return false;
if (unlock) {
var password_aes = _es.Aes.fromSeed(password);
var encryption_plainbuffer = password_aes.decryptHexToBuffer(wallet.encryption_key);
aes_private = _es.Aes.fromSeed(encryption_plainbuffer);
}
return true;
} catch (e) {
console.error(e);
return false;
}
}
}
/** This may lock the wallet unless <b>unlock</b> is used. */
}, {
key: "changePassword",
value: function changePassword(old_password, new_password) {
var _this4 = this;
var unlock = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
return new Promise(function (resolve) {
var wallet = _this4.state.wallet;
if (!_this4.validatePassword(old_password)) throw new Error("wrong password");
var old_password_aes = _es.Aes.fromSeed(old_password);
var new_password_aes = _es.Aes.fromSeed(new_password);
if (!wallet.encryption_key)
// This change pre-dates the live chain..
throw new Error("This wallet does not support the change password feature.");
var encryption_plainbuffer = old_password_aes.decryptHexToBuffer(wallet.encryption_key);
wallet.encryption_key = new_password_aes.encryptToHex(encryption_plainbuffer);
var new_password_private = _es.PrivateKey.fromSeed(new_password);
wallet.password_pubkey = new_password_private.toPublicKey().toPublicKeyString();
if (unlock) {
aes_private = _es.Aes.fromSeed(encryption_plainbuffer);
} else {
// new password, make sure the wallet gets locked
aes_private = null;
}
resolve(_this4.setWalletModified());
});
}
/** @throws "missing brainkey", "wallet locked"
@return { private_key, sequence }
*/
}, {
key: "generateNextKey",
value: function generateNextKey() {
var save = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
if (this.generatingKey) return;
this.generatingKey = true;
var brainkey = this.getBrainKey();
var wallet = this.state.wallet;
var sequence = Math.max(wallet.brainkey_sequence, 0);
var used_sequence = null;
// Skip ahead in the sequence if any keys are found in use
// Slowly look ahead (1 new key per block) to keep the wallet fast after unlocking
this.brainkey_look_ahead = Math.min(10, (this.brainkey_look_ahead || 0) + 1);
/* If sequence is 0 this is the first lookup, so check at least the first 10 positions */
var loopMax = !sequence ? Math.max(sequence + this.brainkey_look_ahead, 10) : sequence + this.brainkey_look_ahead;
// console.log("generateNextKey, save:", save, "sequence:", sequence, "loopMax", loopMax, "brainkey_look_ahead:", this.brainkey_look_ahead);
for (var i = sequence; i < loopMax; i++) {
var _private_key2 = _es.key.get_brainPrivateKey(brainkey, i);
var pubkey = this.generateNextKey_pubcache[i] ? this.generateNextKey_pubcache[i] : this.generateNextKey_pubcache[i] = _private_key2.toPublicKey().toPublicKeyString();
var next_key = _es.ChainStore.getAccountRefsOfKey(pubkey);
// TODO if ( next_key === undefined ) return undefined
/* If next_key exists, it means the generated private key controls an account, so we need to save it */
if (next_key && next_key.size) {
used_sequence = i;
console.log("WARN: Private key sequence " + used_sequence + " in-use. " + "I am saving the private key and will go onto the next one.");
this.saveKey(_private_key2, used_sequence);
// this.brainkey_look_ahead++;
}
}
if (used_sequence !== null) {
wallet.brainkey_sequence = used_sequence + 1;
this._updateWallet();
}
sequence = Math.max(wallet.brainkey_sequence, 0);
var private_key = _es.key.get_brainPrivateKey(brainkey, sequence);
if (save && private_key) {
// save deterministic private keys ( the user can delete the brainkey )
// console.log("** saving a key and incrementing brainkey sequence **")
this.saveKey(private_key, sequence);
//TODO .error( error => ErrorStore.onAdd( "wallet", "saveKey", error ))
this.incrementBrainKeySequence();
}
this.generatingKey = false;
return { private_key: private_key, sequence: sequence };
}
}, {
key: "incrementBrainKeySequence",
value: function incrementBrainKeySequence(transaction) {
var wallet = this.state.wallet;
// increment in RAM so this can't be out-of-sync
wallet.brainkey_sequence++;
// update last modified
return this._updateWallet(transaction);
//TODO .error( error => ErrorStore.onAdd( "wallet", "incrementBrainKeySequence", error ))
}
}, {
key: "decrementBrainKeySequence",
value: function decrementBrainKeySequence() {
var wallet = this.state.wallet;
// increment in RAM so this can't be out-of-sync
wallet.brainkey_sequence = Math.max(0, wallet.brainkey_sequence - 1);
return this._updateWallet();
}
}, {
key: "resetBrainKeySequence",
value: function resetBrainKeySequence() {
var wallet = this.state.wallet;
// increment in RAM so this can't be out-of-sync
wallet.brainkey_sequence = 0;
console.log("reset sequence", wallet.brainkey_sequence);
// update last modified
return this._updateWallet();
}
/* cyj delete 20171024
//导入秘钥
importKeysWorker(private_key_objs) {
return new Promise( (resolve, reject) => {
let pubkeys = []
for(let private_key_obj of private_key_objs)
pubkeys.push( private_key_obj.public_key_string )
let addyIndexPromise = AddressIndex.addAll(pubkeys)
let private_plainhex_array = []
for(let private_key_obj of private_key_objs) {
private_plainhex_array.push( private_key_obj.private_plainhex );
}
if (!__ELECTRON__) {
AesWorker = require("worker-loader!workers/AesWorker");
}
let worker = new AesWorker
worker.postMessage({
private_plainhex_array,
key: aes_private.key, iv: aes_private.iv
})
let _this = this
this.setState({ saving_keys: true })
worker.onmessage = event => { try {
console.log("Preparing for private keys save");
let private_cipherhex_array = event.data
let enc_private_key_objs = []
for(let i = 0; i < private_key_objs.length; i++) {
let private_key_obj = private_key_objs[i]
let {import_account_names, public_key_string, private_plainhex} = private_key_obj
let private_cipherhex = private_cipherhex_array[i]
if( ! public_key_string) {
// console.log('WARN: public key was not provided, this will incur slow performance')
let private_key = PrivateKey.fromHex(private_plainhex)
let public_key = private_key.toPublicKey() // S L O W
public_key_string = public_key.toPublicKeyString()
} else
if(public_key_string.indexOf(ChainConfig.address_prefix) != 0)
throw new Error("Public Key should start with " + ChainConfig.address_prefix)
let private_key_object = {
import_account_names,
encrypted_key: private_cipherhex,
pubkey: public_key_string
// null brainkey_sequence
}
enc_private_key_objs.push(private_key_object)
}
console.log("Saving private keys", new Date().toString());
let transaction = _this.transaction_update_keys()
let insertKeysPromise = idb_helper.on_transaction_end(transaction)
try {
let duplicate_count = PrivateKeyStore
.addPrivateKeys_noindex(enc_private_key_objs, transaction )
if( private_key_objs.length != duplicate_count )
_this.setWalletModified(transaction)
_this.setState({saving_keys: false})
resolve(Promise.all([ insertKeysPromise, addyIndexPromise ]).then( ()=> {
console.log("Done saving keys", new Date().toString())
// return { duplicate_count }
}))
} catch(e) {
transaction.abort()
console.error(e)
reject(e)
}
} catch( e ) { console.error('AesWorker.encrypt', e) }}
})
}
*/
}, {
key: "saveKeys",
value: function saveKeys(private_keys, transaction, public_key_string) {
var promises = [];
var _iteratorNormalCompletion3 = true;
var _didIteratorError3 = false;
var _iteratorError3 = undefined;
try {
for (var _iterator3 = private_keys[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
var private_key_record = _step3.value;
promises.push(this.saveKey(private_key_record.private_key, private_key_record.sequence, null, //import_account_names
public_key_string, transaction));
}
} catch (err) {
_didIteratorError3 = true;
_iteratorError3 = err;
} finally {
try {
if (!_iteratorNormalCompletion3 && _iterator3.return) {
_iterator3.return();
}
} finally {
if (_didIteratorError3) {
throw _iteratorError3;
}
}
}
return Promise.all(promises);
}
}, {
key: "saveKey",
value: function saveKey(private_key, brainkey_sequence, import_account_names, public_key_string) {
var transaction = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.transaction_update_keys();
var private_cipherhex = aes_private.encryptToHex(private_key.toBuffer());
var wallet = this.state.wallet;
if (!public_key_string) {
//S L O W
// console.log('WARN: public key was not provided, this may incur slow performance')
var public_key = private_key.toPublicKey();
public_key_string = public_key.toPublicKeyString();
} else if (public_key_string.indexOf(_bitsharesjsWs.ChainConfig.address_prefix) != 0) throw new Error("Public Key should start with " + _bitsharesjsWs.ChainConfig.address_prefix);
var private_key_object = {
import_account_names: import_account_names,
encrypted_key: private_cipherhex,
pubkey: public_key_string,
brainkey_sequence: brainkey_sequence
/* cyj delete 20171024
let p1 = PrivateKeyActions.addKey(
private_key_object, transaction
).then((ret)=> {
if(TRACE) console.log('... WalletDb.saveKey result',ret.result)
return ret
})
*/
};var p1 = Promise.all([_PrivateKeyStore2.default.onAddKey({ private_key_object: private_key_object, transaction: transaction }), _AccountRefsStore2.default.onAddPrivateKey({ private_key_object: private_key_object })]).then(function (ret) {
if (TRACE) console.log('... WalletDb.saveKey result', ret[0].result);
return ret[0];
});
// let p1 = PrivateKeyStore.onAddKey({private_key_object, transaction}).then((ret)=>{
// AccountRefsStore.onAddPrivateKey({private_key_object});
// return ret[0];
// })
return p1;
}
}, {
key: "setWalletModified",
value: function setWalletModified(transaction) {
return this._updateWallet(transaction);
}
}, {
key: "setBackupDate",
value: function setBackupDate() {
var wallet = this.state.wallet;
wallet.backup_date = new Date();
return this._updateWallet();
}
}, {
key: "setBrainkeyBackupDate",
value: function setBrainkeyBackupDate() {
var wallet = this.state.wallet;
wallet.brainkey_backup_date = new Date();
return this._updateWallet();
}
/** Saves wallet object to disk. Always updates the last_modified date. */
}, {
key: "_updateWallet",
value: function _updateWallet() {
var _this5 = this;
var transaction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.transaction_update();
var wallet = this.state.wallet;
if (!wallet) {
reject("missing wallet");
return;
}
//DEBUG console.log('... wallet',wallet)
var wallet_clone = (0, _lodash.cloneDeep)(wallet);
wallet_clone.last_modified = new Date();
(0, _tcomb_structs.WalletTcomb)(wallet_clone); // validate
var wallet_store = transaction.objectStore("wallet");
var p = _idbHelper2.default.on_request_end(wallet_store.put(wallet_clone));
var p2 = _idbHelper2.default.on_transaction_end(transaction).then(function () {
_this5.state.wallet = wallet_clone;
});
return Promise.all([p, p2]);
}
/** This method may be called again should the main database change */
}, {
key: "loadDbData",
value: function loadDbData() {
var _this6 = this;
return _idbHelper2.default.cursor("wallet", function (cursor) {
if (!cursor) return false;
var wallet = cursor.value;
// Convert anything other than a string or number back into its proper type
wallet.created = new Date(wallet.created);
wallet.last_modified = new Date(wallet.last_modified);
wallet.backup_date = wallet.backup_date ? new Date(wallet.backup_date) : null;
wallet.brainkey_backup_date = wallet.brainkey_backup_date ? new Date(wallet.brainkey_backup_date) : null;
try {
(0, _tcomb_structs.WalletTcomb)(wallet);
} catch (e) {
console.log("WalletDb format error", e);return Promise.reject(new Error("WalletDb format error " + e));
}
_this6.state.wallet = wallet;
return false; //stop iterating
});
}
}], [{
key: "getInstance",
value: function getInstance() {
if (!WalletDb.instance) {
WalletDb.instance = new WalletDb();
}
return WalletDb.instance;
}
}]);
return WalletDb;
}();
var WalletDbIns = WalletDb.getInstance();
exports.default = WalletDbIns;
function reject(error) {
console.error("----- WalletDb reject error -----", error);
throw new Error(error);
}