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';
14 * @param {String}} rootXPub
15 * @param {String} oldPassword
16 * @param {String} newPassword
18 keysSDK.prototype.resetKeyPassword = function(rootXPub, oldPassword, newPassword) {
19 let retPromise = new Promise((resolve, reject) => {
20 let data = {rootXPub: rootXPub, oldPassword:oldPassword, newPassword:newPassword};
21 resetKeyPassword(data).then(res => {
23 let objectStore = db.transaction(['keys'], 'readwrite').objectStore('keys');
24 let index = objectStore.index('xpub');
25 let keyRange = IDBKeyRange.only(rootXPub);
26 let getRequest = index.openCursor(keyRange);
27 getRequest.onsuccess = function (event) {
28 const cursor = event.target.result;
29 if(cursor && cursor.value.xpub === rootXPub) {
30 const updateData = cursor.value;
31 updateData.key = res.data;
32 const request = cursor.update(updateData);
33 request.onsuccess = function() {
36 request.onerror = function() {
37 reject(new Error('db update error'));
40 reject(new Error('db update error: not found by rootXPub'));
43 getRequest.onerror = function () {
44 reject(new Error('db get error'));
59 * @param {String} xpub
61 keysSDK.prototype.getKeyByXPub = function(xpub) {
62 let retPromise = new Promise((resolve, reject) => {
64 let getRequest = db.transaction(['keys'], 'readonly')
68 getRequest.onsuccess = function(e) {
70 resolve(e.target.result.key);
72 reject(new Error('not found by XPub'));
75 getRequest.onerror = function() {
76 reject(new Error('db get error'));
90 keysSDK.prototype.list = function() {
91 let retPromise = new Promise((resolve, reject) => {
93 let transaction = db.transaction(['keys'], 'readonly');
94 let objectStore = transaction.objectStore('keys');
95 let oc = objectStore.openCursor();
97 oc.onsuccess = function (event) {
98 var cursor = event.target.result;
100 ret.push({alias: cursor.value.alias, xpub: cursor.value.xpub});
106 oc.onerror = function(e){
119 * @param {String} alias - User specified, unique identifier.
120 * @param {String} password - User specified, key password.
122 keysSDK.prototype.createKey = function(alias, password) {
123 var normalizedAlias = alias.toLowerCase().trim();
126 data.alias = normalizedAlias;
127 data.password = password;
128 const res = createkey(data);
135 * @param {String} alias - User specified, unique identifier.
136 * @param {String} password - User specified, key password.
138 keysSDK.prototype.restoreFromMnemonic = function(alias, password, mnemonic) {
139 var normalizedAlias = alias.toLowerCase().trim();
142 data.alias = normalizedAlias;
143 data.password = password;
144 data.mnemonic = mnemonic;
146 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 walletImage = JSON.parse(keystore);
162 if(walletImage.key_images && walletImage.key_images.xkeys ){
163 keys = walletImage.key_images.xkeys;
166 // match older version of backups keystore files
167 else if(walletImage.keys>0){
168 keys = walletImage.keys.map(keyItem => JSON.parse( keyItem.key ) );
174 throw 'do not support multiple keystore imported.';
176 else if(keys.length === 1){
180 const result = decryptKey(key, password);
188 * @param {String} alias - User specified, unique identifier.
189 * @param {String} password - User specified, key password.
191 keysSDK.prototype.isValidMnemonic = function(mnemonic) {
193 return isValidMnemonic(mnemonic);
199 * @param {String} alias - User specified, unique identifier.
200 * @param {String} password - User specified, key password.
202 keysSDK.prototype.create = function(alias, password) {
203 var normalizedAlias = alias.toLowerCase().trim();
204 let retPromise = new Promise((resolve, reject) => {
206 let getRequest = db.transaction(['keys'], 'readonly')
209 .get(normalizedAlias);
210 getRequest.onsuccess = function (e) {
211 if (e.target.result) {
212 reject(new Error('key alias already exists'));
216 data.alias = normalizedAlias;
217 data.auth = password;
218 createKey(data).then((res) => {
219 let jsonData = JSON.parse(res.data);
225 let request = db.transaction(['keys'], 'readwrite')
228 request.onsuccess = function () {
229 resolve({xpub:jsonData.xpub, alias: alias});
231 request.onerror = function () {
232 reject(new Error('db insert error'));
238 getRequest.onerror = function () {
239 reject(new Error('db get error'));
252 * @param {String} xpub - xpub.
254 keysSDK.prototype.createPubkey = function(xpub) {
255 let retPromise = new Promise((resolve, reject) => {
259 createPubkey(data).then((res) => {
260 let jsonData = JSON.parse(res.data);
272 * @param {String} message - message.
273 * @param {String} password - password.
274 * @param {Object} address - address.
276 keysSDK.prototype.signMessage = function(message, password, address) {
277 let retPromise = new Promise((resolve, reject) => {
279 let getRequest = db.transaction(['accounts-server'], 'readonly')
280 .objectStore('accounts-server')
283 getRequest.onsuccess = function (e) {
284 const result = getRequest.result.filter(obj => (obj.address === address || obj.vpAddress === address));
285 if (result.length === 0) {
286 reject(new Error('not found address'));
290 const rootXpub = result[0].rootXPub;
291 let keyObject = db.transaction(['keys'], 'readonly')
296 keyObject.onsuccess = function (e) {
297 if (!e.target.result) {
298 reject(new Error('not found xpub'));
303 data.message = message;
304 data.password = password;
305 data.key = e.target.result.key;
306 signMessage(data).then((res) => {
307 let jsonData = JSON.parse(res.data);
313 keyObject.onerror = function () {
314 reject(getRequest.error);
317 getRequest.onerror = function () {
318 reject(getRequest.error);
327 export default keysSDK;