1 import { createKey ,resetKeyPassword, createPubkey, signMessage, signTransaction} from '../wasm/func';
2 import {getDB} from '../db/db';
3 import {createkey, isValidMnemonic} from '../utils/key/createKey';
4 import {encryptKey, decryptKey} from '../utils/key/keystore';
5 import { restoreFromKeyStore } from '../utils/account';
6 import { camelize } from '../utils/utils';
7 import CryptoJS from 'crypto-js';
16 * @param {String}} rootXPub
17 * @param {String} oldPassword
18 * @param {String} newPassword
20 keysSDK.prototype.resetKeyPassword = function(rootXPub, oldPassword, newPassword) {
21 let retPromise = new Promise((resolve, reject) => {
22 let data = {rootXPub: rootXPub, oldPassword:oldPassword, newPassword:newPassword};
23 resetKeyPassword(data).then(res => {
25 let objectStore = db.transaction(['keys'], 'readwrite').objectStore('keys');
26 let index = objectStore.index('xpub');
27 let keyRange = IDBKeyRange.only(rootXPub);
28 let getRequest = index.openCursor(keyRange);
29 getRequest.onsuccess = function (event) {
30 const cursor = event.target.result;
31 if(cursor && cursor.value.xpub === rootXPub) {
32 const updateData = cursor.value;
33 updateData.key = res.data;
34 const request = cursor.update(updateData);
35 request.onsuccess = function() {
38 request.onerror = function() {
39 reject(new Error('db update error'));
42 reject(new Error('db update error: not found by rootXPub'));
45 getRequest.onerror = function () {
46 reject(new Error('db get error'));
61 * @param {String} xpub
63 keysSDK.prototype.getKeyByXPub = function(xpub) {
64 let retPromise = new Promise((resolve, reject) => {
66 let getRequest = db.transaction(['keys'], 'readonly')
70 getRequest.onsuccess = function(e) {
72 resolve(e.target.result.key);
74 reject(new Error('not found by XPub'));
77 getRequest.onerror = function() {
78 reject(new Error('db get error'));
92 keysSDK.prototype.list = function() {
93 let retPromise = new Promise((resolve, reject) => {
95 let transaction = db.transaction(['keys'], 'readonly');
96 let objectStore = transaction.objectStore('keys');
97 let oc = objectStore.openCursor();
99 oc.onsuccess = function (event) {
100 var cursor = event.target.result;
102 ret.push({alias: cursor.value.alias, xpub: cursor.value.xpub});
108 oc.onerror = function(e){
121 * @param {String} alias - User specified, unique identifier.
122 * @param {String} password - User specified, key password.
124 keysSDK.prototype.createKey = function(alias, password) {
125 var normalizedAlias = alias.toLowerCase().trim();
128 data.alias = normalizedAlias;
129 data.password = password;
130 const res = createkey(data);
132 res.vault = this.encryptMnemonic(res.mnemonic, password, res.keystore);
140 * @param {String} alias - User specified, unique identifier.
141 * @param {String} password - User specified, key password.
143 keysSDK.prototype.restoreFromMnemonic = function(alias, password, mnemonic) {
144 var normalizedAlias = alias.toLowerCase().trim();
147 data.alias = normalizedAlias;
148 data.password = password;
149 data.mnemonic = mnemonic;
151 const res = createkey(data);
153 res.vault = this.encryptMnemonic(mnemonic, password, res.keystore);
160 * @param {String} alias - User specified, unique identifier.
161 * @param {String} password - User specified, key password.
163 keysSDK.prototype.restoreFromKeystore = function( password, keystore) {
165 const result = decryptKey(keystore, password);
166 result.xpub = result.xPub.toString('hex');
167 delete result['xPub'];
176 * @param {String} alias - User specified, unique identifier.
177 * @param {String} password - User specified, key password.
179 keysSDK.prototype.encryptMnemonic = function(mnemonic, password, keystore) {
181 const result = decryptKey(keystore, password);
182 const xprv = result.xPrv.toString('hex');
184 const ciphertext = CryptoJS.AES.encrypt(mnemonic, xprv);
186 return ciphertext.toString();
192 * @param {String} alias - User specified, unique identifier.
193 * @param {String} password - User specified, key password.
195 keysSDK.prototype.decryptMnemonic = function(ciphertext, password, keystore) {
197 const result = decryptKey(keystore, password);
198 const xprv = result.xPrv.toString('hex');
201 const bytes = CryptoJS.AES.decrypt(ciphertext, xprv);
202 const plaintext = bytes.toString(CryptoJS.enc.Utf8);
212 * @param {String} keystore - User specified, unique identifier.
214 keysSDK.prototype.isValidKeystore = function( keystore ) {
216 const walletImage = camelize(JSON.parse(keystore));
219 if(walletImage.keyImages && walletImage.keyImages.xkeys ){
220 keys = walletImage.keyImages.xkeys;
223 // match older version of backups keystore files
224 else if(walletImage['accounts-server']){
225 keys = walletImage.keys.map(keyItem => JSON.parse( keyItem.key ) );
232 throw 'do not support multiple keystore imported.';
234 else if(keys.length === 1){
245 * @param {String} alias - User specified, unique identifier.
246 * @param {String} password - User specified, key password.
248 keysSDK.prototype.isValidMnemonic = function(mnemonic) {
250 return isValidMnemonic(mnemonic);
256 * @param {String} alias - User specified, unique identifier.
257 * @param {String} password - User specified, key password.
259 keysSDK.prototype.create = function(alias, password) {
260 var normalizedAlias = alias.toLowerCase().trim();
261 let retPromise = new Promise((resolve, reject) => {
263 let getRequest = db.transaction(['keys'], 'readonly')
266 .get(normalizedAlias);
267 getRequest.onsuccess = function (e) {
268 if (e.target.result) {
269 reject(new Error('key alias already exists'));
273 data.alias = normalizedAlias;
274 data.auth = password;
275 createKey(data).then((res) => {
276 let jsonData = JSON.parse(res.data);
282 let request = db.transaction(['keys'], 'readwrite')
285 request.onsuccess = function () {
286 resolve({xpub:jsonData.xpub, alias: alias});
288 request.onerror = function () {
289 reject(new Error('db insert error'));
295 getRequest.onerror = function () {
296 reject(new Error('db get error'));
309 * @param {String} xpub - xpub.
311 keysSDK.prototype.createPubkey = function(xpub) {
312 let retPromise = new Promise((resolve, reject) => {
316 createPubkey(data).then((res) => {
317 let jsonData = JSON.parse(res.data);
329 * @param {String} message - message.
330 * @param {String} password - password.
331 * @param {Object} address - address.
333 keysSDK.prototype.signMessage = function(message, password, keystore) {
335 data.message = message;
336 data.password = password;
338 return signMessage(data).then((res) => {
339 let jsonData = JSON.parse(res.data);
348 export default keysSDK;