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';
15 * @param {String}} rootXPub
16 * @param {String} oldPassword
17 * @param {String} newPassword
19 keysSDK.prototype.resetKeyPassword = function(rootXPub, oldPassword, newPassword) {
20 let retPromise = new Promise((resolve, reject) => {
21 let data = {rootXPub: rootXPub, oldPassword:oldPassword, newPassword:newPassword};
22 resetKeyPassword(data).then(res => {
24 let objectStore = db.transaction(['keys'], 'readwrite').objectStore('keys');
25 let index = objectStore.index('xpub');
26 let keyRange = IDBKeyRange.only(rootXPub);
27 let getRequest = index.openCursor(keyRange);
28 getRequest.onsuccess = function (event) {
29 const cursor = event.target.result;
30 if(cursor && cursor.value.xpub === rootXPub) {
31 const updateData = cursor.value;
32 updateData.key = res.data;
33 const request = cursor.update(updateData);
34 request.onsuccess = function() {
37 request.onerror = function() {
38 reject(new Error('db update error'));
41 reject(new Error('db update error: not found by rootXPub'));
44 getRequest.onerror = function () {
45 reject(new Error('db get error'));
60 * @param {String} xpub
62 keysSDK.prototype.getKeyByXPub = function(xpub) {
63 let retPromise = new Promise((resolve, reject) => {
65 let getRequest = db.transaction(['keys'], 'readonly')
69 getRequest.onsuccess = function(e) {
71 resolve(e.target.result.key);
73 reject(new Error('not found by XPub'));
76 getRequest.onerror = function() {
77 reject(new Error('db get error'));
91 keysSDK.prototype.list = function() {
92 let retPromise = new Promise((resolve, reject) => {
94 let transaction = db.transaction(['keys'], 'readonly');
95 let objectStore = transaction.objectStore('keys');
96 let oc = objectStore.openCursor();
98 oc.onsuccess = function (event) {
99 var cursor = event.target.result;
101 ret.push({alias: cursor.value.alias, xpub: cursor.value.xpub});
107 oc.onerror = function(e){
120 * @param {String} alias - User specified, unique identifier.
121 * @param {String} password - User specified, key password.
123 keysSDK.prototype.createKey = function(alias, password) {
124 var normalizedAlias = alias.toLowerCase().trim();
127 data.alias = normalizedAlias;
128 data.password = password;
129 const res = createkey(data);
136 * @param {String} alias - User specified, unique identifier.
137 * @param {String} password - User specified, key password.
139 keysSDK.prototype.restoreFromMnemonic = function(alias, password, mnemonic) {
140 var normalizedAlias = alias.toLowerCase().trim();
143 data.alias = normalizedAlias;
144 data.password = password;
145 data.mnemonic = mnemonic;
147 const res = createkey(data);
154 * @param {String} alias - User specified, unique identifier.
155 * @param {String} password - User specified, key password.
157 keysSDK.prototype.restoreFromKeystore = function( password, keystore) {
159 const result = decryptKey(keystore, password);
160 result.xpub = result.xPub.toString('hex');
161 delete result['xPub'];
169 * @param {String} keystore - User specified, unique identifier.
171 keysSDK.prototype.isValidKeystore = function( keystore ) {
173 const walletImage = camelize(JSON.parse(keystore));
176 if(walletImage.keyImages && walletImage.keyImages.xkeys ){
177 keys = walletImage.keyImages.xkeys;
180 // match older version of backups keystore files
181 else if(walletImage.keys>0){
182 keys = walletImage.keys.map(keyItem => JSON.parse( keyItem.key ) );
189 throw 'do not support multiple keystore imported.';
191 else if(keys.length === 1){
202 * @param {String} alias - User specified, unique identifier.
203 * @param {String} password - User specified, key password.
205 keysSDK.prototype.isValidMnemonic = function(mnemonic) {
207 return isValidMnemonic(mnemonic);
213 * @param {String} alias - User specified, unique identifier.
214 * @param {String} password - User specified, key password.
216 keysSDK.prototype.create = function(alias, password) {
217 var normalizedAlias = alias.toLowerCase().trim();
218 let retPromise = new Promise((resolve, reject) => {
220 let getRequest = db.transaction(['keys'], 'readonly')
223 .get(normalizedAlias);
224 getRequest.onsuccess = function (e) {
225 if (e.target.result) {
226 reject(new Error('key alias already exists'));
230 data.alias = normalizedAlias;
231 data.auth = password;
232 createKey(data).then((res) => {
233 let jsonData = JSON.parse(res.data);
239 let request = db.transaction(['keys'], 'readwrite')
242 request.onsuccess = function () {
243 resolve({xpub:jsonData.xpub, alias: alias});
245 request.onerror = function () {
246 reject(new Error('db insert error'));
252 getRequest.onerror = function () {
253 reject(new Error('db get error'));
266 * @param {String} xpub - xpub.
268 keysSDK.prototype.createPubkey = function(xpub) {
269 let retPromise = new Promise((resolve, reject) => {
273 createPubkey(data).then((res) => {
274 let jsonData = JSON.parse(res.data);
286 * @param {String} message - message.
287 * @param {String} password - password.
288 * @param {Object} address - address.
290 keysSDK.prototype.signMessage = function(message, password, address) {
291 let retPromise = new Promise((resolve, reject) => {
293 let getRequest = db.transaction(['accounts-server'], 'readonly')
294 .objectStore('accounts-server')
297 getRequest.onsuccess = function (e) {
298 const result = getRequest.result.filter(obj => (obj.address === address || obj.vpAddress === address));
299 if (result.length === 0) {
300 reject(new Error('not found address'));
304 const rootXpub = result[0].rootXPub;
305 let keyObject = db.transaction(['keys'], 'readonly')
310 keyObject.onsuccess = function (e) {
311 if (!e.target.result) {
312 reject(new Error('not found xpub'));
317 data.message = message;
318 data.password = password;
319 data.key = e.target.result.key;
320 signMessage(data).then((res) => {
321 let jsonData = JSON.parse(res.data);
327 keyObject.onerror = function () {
328 reject(getRequest.error);
331 getRequest.onerror = function () {
332 reject(getRequest.error);
341 export default keysSDK;