From d280896c0bc3be49ed5083c79a2f9a84a6272547 Mon Sep 17 00:00:00 2001 From: Zhiting Lin Date: Wed, 9 Sep 2020 14:40:47 +0800 Subject: [PATCH] update error code --- src/sdk/accounts.js | 342 ------------------------------- src/sdk/keys.js | 208 +------------------ src/sdk/transaction.js | 67 +----- src/sdk/wallet.js | 106 ---------- src/utils/convertArguement.js | 9 +- src/utils/error.js | 7 + src/utils/key/chainkd.js | 1 - src/utils/key/createKey.js | 5 +- src/utils/key/keystore.js | 9 +- src/utils/transaction/signMessage.js | 2 +- src/utils/transaction/signTransaction.js | 2 +- 11 files changed, 33 insertions(+), 725 deletions(-) create mode 100644 src/utils/error.js diff --git a/src/sdk/accounts.js b/src/sdk/accounts.js index ebaaeef..8f8f5fb 100644 --- a/src/sdk/accounts.js +++ b/src/sdk/accounts.js @@ -1,47 +1,8 @@ -import {getDB} from '../db/db'; -import {createAccount, createAccountReceiver, signTransaction} from '../wasm/func'; -import {handleApiError, handleAxiosError} from '../utils/http'; - - function accountsSDK(bytom){ this.http = bytom.serverHttp; this.bytom = bytom; } -/** - * List of the account. - * - * @returns {Promise} List of Accounts - */ -accountsSDK.prototype.listAccountUseServer = function() { - let net = 'mainnet'; - // let net = 'testnet'; - let retPromise = new Promise((resolve, reject) => { - getDB().then(db => { - let transaction = db.transaction(['accounts-server'], 'readonly'); - let objectStore = transaction.objectStore('accounts-server').index('net'); - let keyRange = IDBKeyRange.only(net); - let oc = objectStore.openCursor(keyRange); - let ret = []; - - oc.onsuccess = function (event) { - var cursor = event.target.result; - if (cursor) { - ret.push(cursor.value); - cursor.continue(); - } else { - resolve(ret); - } - }; - oc.onerror = function(e){ - reject(e); - }; - }).catch(error => { - reject(error); - }); - }); - return retPromise; -}; /** @@ -55,43 +16,6 @@ accountsSDK.prototype.listAddressUseServer = function(address) { let net = this.bytom.net; return this.http.request(`account/address?address=${address}`, '', net, 'GET'); }; -/** - * Create a new address for a wallet. - * - * @see https://gist.github.com/HAOYUatHZ/0c7446b8f33e7cddd590256b3824b08f#apiv1btmaccountnew-address - * @param {String} guid unique id for each wallet - * @param {String} label alias for the address to be created - * @returns {Promise} - */ -accountsSDK.prototype.createAccountReceiverUseServer = function(guid, label) { - let net = this.bytom.net; - let retPromise = new Promise((resolve, reject) => { - let pm = {guid: guid}; - if (label) { - pm.label = label; - } - this.http.request('account/new-address', pm, net).then(resp => { - let dbData = resp; - dbData.guid = guid; - dbData.net = net; - getDB().then(db => { - let transaction = db.transaction(['addresses-server'], 'readwrite'); - let objectStore = transaction.objectStore('addresses-server'); - delete dbData.rootXPub; - let request = objectStore.add(dbData); - request.onsuccess = function() { - resolve(dbData); - }; - request.onerror = function() { - reject(request.error); - }; - }); - }).catch(error => { - reject(handleAxiosError(error)); - }); - }); - return retPromise; -}; /** * Create a wallet using a public key. Each wallet is identified by a guid. (by server) @@ -114,72 +38,6 @@ accountsSDK.prototype.createNewAccount = function(rootXPub, label) { /** * Create a wallet using a public key. Each wallet is identified by a guid. (by server) - * - * @see https://gist.github.com/HAOYUatHZ/0c7446b8f33e7cddd590256b3824b08f#endpoints - * @param {String} rootXPub - * @param {String} alias alias for the account - * @param {String} label alias for the first address - * @returns {Promise} - */ -accountsSDK.prototype.createAccountUseServer = function(rootXPub, alias, label) { - let net = this.bytom.net; - let that = this; - let retPromise = new Promise((resolve, reject) => { - getDB().then(db => { - let getRequest = db.transaction(['accounts-server'], 'readonly') - .objectStore('accounts-server') - .index('alias') - .get(alias); - getRequest.onsuccess = function(e) { - if (e.target.result) { - reject(new Error('duplicate account alias')); - return; - } - let pm = {pubkey: rootXPub}; - if (label) { - pm.label = label; - } - that.http.request('account/create', pm, net).then(resp => { - let dbData = resp; - dbData.rootXPub = rootXPub; - dbData.alias = alias; - dbData.net = net; - getDB().then(db => { - let transaction = db.transaction(['accounts-server'], 'readwrite'); - let objectStore = transaction.objectStore('accounts-server'); - let request = objectStore.add(dbData); - request.onsuccess = function() { - let transaction = db.transaction(['addresses-server'], 'readwrite'); - let objectStore = transaction.objectStore('addresses-server'); - delete dbData.rootXPub; - let request = objectStore.add(dbData); - request.onsuccess = function() { - resolve(dbData); - }; - request.onerror = function() { - reject(request.error); - }; - }; - request.onerror = function() { - reject(request.error); - }; - }); - }).catch(error => { - reject(handleAxiosError(error)); - }); - }; - getRequest.onerror = function() { - reject(getRequest.error); - }; - }).catch(err => { - reject(err); - }); - }); - return retPromise; -}; - -/** - * Create a wallet using a public key. Each wallet is identified by a guid. (by server) * * @param {String} guid * @param {String} coin type of coin @@ -195,205 +53,5 @@ accountsSDK.prototype.copyAccountUseServer = function(guid, coin) { return this.http.request('account/copy', pm, net); }; -/** - * list a wallet using a guid. Each wallet is identified by a guid. (by server) - * - * @param {String} guid - * @param {String} coin type of coin - * @returns {Promise} - */ -accountsSDK.prototype.listVaporAccountUseServer = function(guid) { - let net = this.bytom.net; - let that = this; - let retPromise = new Promise((resolve, reject) => { - that.http.request('account/addresses', {address:address}, net).then(resp => { - getDB().then(db => { - let objectStore = db.transaction(['accounts-server'], 'readwrite').objectStore('accounts-server'); - let index = objectStore.index('guid'); - let keyRange = IDBKeyRange.only(guid); - let getRequest = index.openCursor(keyRange); - - getRequest.onsuccess = function(e) { - const cursor = e.target.result; - if(cursor){ - const accountObject = cursor.value; - - accountObject.vpAddress = resp[0].address; - const request = cursor.update(accountObject); - request.onsuccess = function () { - resolve(accountObject); - }; - request.onerror = function () { - reject(request.error); - }; - } - }; - getRequest.onerror = function() { - reject(getRequest.error); - }; - }).catch(err => { - throw (err); - }); - }).catch(err => { - reject(err); - }); - }); - return retPromise; -}; - -/** - * create account - * - * @param {String} alias - * @param {Int} quorum - * @param {String} rootXPub - * @returns {Promise} - */ -accountsSDK.prototype.createAccount = function(alias, quorum, rootXPub) { - let retPromise = new Promise((resolve, reject) => { - getDB().then(db => { - let transaction = db.transaction(['accounts'], 'readwrite'); - let objectStore = transaction.objectStore('accounts'); - let request = objectStore.add({ - alias:alias, - }); - request.onsuccess = function () { - let data = {alias:alias, quorum:quorum, rootXPub:rootXPub, nextIndex:request.result}; - createAccount(data).then(res => { - let jsonData = JSON.parse(res.data); - let putTransaction = db.transaction(['accounts'], 'readwrite'); - let putObjectStore = putTransaction.objectStore('accounts'); - let putRequest = putObjectStore.put(jsonData, request.result); - putRequest.onsuccess = function() { - resolve(jsonData); - }; - putRequest.onerror = function() { - reject(putRequest.error); - }; - }).catch(error => { - reject(error); - }); - }; - request.onerror = function() { - reject(request.error); - }; - }).catch(error => { - reject(error); - }); - }); - return retPromise; -}; - -/** - * create account address - * - * @param {Object} account createAccount return account Object val - * @param {Int} nextIndex - * @returns {Promise} - */ -accountsSDK.prototype.createAccountReceiver = function(account) { - let retPromise = new Promise((resolve, reject) => { - getDB().then(db => { - let transaction = db.transaction(['addresses'], 'readwrite'); - let objectStore = transaction.objectStore('addresses'); - let request = objectStore.add({ - account_id:account.id, - account_alias:account.alias, - }); - request.onsuccess = function() { - let data = {account:JSON.stringify(account), nextIndex: request.result}; - createAccountReceiver(data).then(res => { - let jsonData = JSON.parse(res.data); - let jsonDB = JSON.parse(res.db); - let putTransaction = db.transaction(['addresses'], 'readwrite'); - let putObjectStore = putTransaction.objectStore('addresses'); - let putRequest = null; - for (let key in jsonDB) { - if(!jsonDB.hasOwnProperty(key)) continue; - let putData = JSON.parse(jsonDB[key]); - putRequest = putObjectStore.put(putData, request.result); - } - putRequest.onsuccess = function() { - resolve(jsonData); - }; - putRequest.onerror = function() { - reject(putRequest.error); - }; - }).catch(error => { - reject(error); - }); - }; - request.onerror = function() { - reject(request.error); - }; - }).catch(error => { - reject(error); - }); - }); - return retPromise; -}; - -/** - * create account address - * - * @param {Object} account createAccount return account Object val - * @param {Int} nextIndex - * @returns {Promise} - */ -accountsSDK.prototype.getAccountXpubById = function(guid) { - let retPromise = new Promise((resolve, reject) => { - getDB().then(db => { - let getRequest = db.transaction(['accounts-server'], 'readonly') - .objectStore('accounts-server') - .index('guid') - .get(guid); - getRequest.onsuccess = function(e) { - if (!e.target.result) { - reject(new Error('not found guid')); - return; - } - resolve(e.target.result.rootXPub); - }; - getRequest.onerror = function() { - reject(getRequest.error); - }; - }).catch(error => { - reject(error); - }); - }); - return retPromise; -}; - - -/** - * create account address - * - * @param {Object} account createAccount return account Object val - * @param {Int} nextIndex - * @returns {Promise} - */ -accountsSDK.prototype.getAccountXpubByAddress = function(guid) { - let retPromise = new Promise((resolve, reject) => { - getDB().then(db => { - let getRequest = db.transaction(['accounts-server'], 'readonly') - .objectStore('accounts-server') - .index('guid') - .get(guid); - getRequest.onsuccess = function(e) { - if (!e.target.result) { - reject(new Error('not found guid')); - return; - } - resolve(e.target.result.rootXPub); - }; - getRequest.onerror = function() { - reject(getRequest.error); - }; - }).catch(error => { - reject(error); - }); - }); - return retPromise; -}; export default accountsSDK; \ No newline at end of file diff --git a/src/sdk/keys.js b/src/sdk/keys.js index 2d94527..2a017c9 100644 --- a/src/sdk/keys.js +++ b/src/sdk/keys.js @@ -1,123 +1,15 @@ -import { createKey ,resetKeyPassword, createPubkey, signMessage, signTransaction} from '../wasm/func'; -import {getDB} from '../db/db'; import {createkey, isValidMnemonic} from '../utils/key/createKey'; -import {encryptKey, decryptKey} from '../utils/key/keystore'; -import { restoreFromKeyStore } from '../utils/account'; +import { decryptKey} from '../utils/key/keystore'; import { camelize } from '../utils/utils'; import CryptoJS from 'crypto-js'; import {signMessage as signMJs} from '../utils/transaction/signMessage'; -import transactionSDK from './transaction'; +import Error from '../utils/error'; function keysSDK() { } /** - * reset key password - * - * @param {String}} rootXPub - * @param {String} oldPassword - * @param {String} newPassword - */ -keysSDK.prototype.resetKeyPassword = function(rootXPub, oldPassword, newPassword) { - let retPromise = new Promise((resolve, reject) => { - let data = {rootXPub: rootXPub, oldPassword:oldPassword, newPassword:newPassword}; - resetKeyPassword(data).then(res => { - getDB().then(db => { - let objectStore = db.transaction(['keys'], 'readwrite').objectStore('keys'); - let index = objectStore.index('xpub'); - let keyRange = IDBKeyRange.only(rootXPub); - let getRequest = index.openCursor(keyRange); - getRequest.onsuccess = function (event) { - const cursor = event.target.result; - if(cursor && cursor.value.xpub === rootXPub) { - const updateData = cursor.value; - updateData.key = res.data; - const request = cursor.update(updateData); - request.onsuccess = function() { - resolve(true); - }; - request.onerror = function() { - reject(new Error('db update error')); - }; - } else { - reject(new Error('db update error: not found by rootXPub')); - } - }; - getRequest.onerror = function () { - reject(new Error('db get error')); - }; - }).catch(error => { - reject(error); - }); - }).catch(error => { - reject(error); - }); - }); - return retPromise; -}; - -/** - * get key by XPub - * - * @param {String} xpub - */ -keysSDK.prototype.getKeyByXPub = function(xpub) { - let retPromise = new Promise((resolve, reject) => { - getDB().then(db => { - let getRequest = db.transaction(['keys'], 'readonly') - .objectStore('keys') - .index('xpub') - .get(xpub); - getRequest.onsuccess = function(e) { - if(e.target.result) { - resolve(e.target.result.key); - } else { - reject(new Error('not found by XPub')); - } - }; - getRequest.onerror = function() { - reject(new Error('db get error')); - }; - }).catch(error => { - reject(error); - }); - }); - return retPromise; -}; - -/** - * List key - * - * @returns {Promise} - */ -keysSDK.prototype.list = function() { - let retPromise = new Promise((resolve, reject) => { - getDB().then(db => { - let transaction = db.transaction(['keys'], 'readonly'); - let objectStore = transaction.objectStore('keys'); - let oc = objectStore.openCursor(); - let ret = []; - oc.onsuccess = function (event) { - var cursor = event.target.result; - if (cursor) { - ret.push({alias: cursor.value.alias, xpub: cursor.value.xpub}); - cursor.continue(); - } else { - resolve(ret); - } - }; - oc.onerror = function(e){ - reject(e); - }; - }).catch(err => { - reject(err); - }); - }); - return retPromise; -}; - -/** * Create a new key. * * @param {String} alias - User specified, unique identifier. @@ -231,7 +123,7 @@ keysSDK.prototype.isValidKeystore = function( keystore ) { if(keys){ if(keys.length>1){ - throw 'do not support multiple keystore imported.'; + throw new Error('do not support multiple keystore imported.', 'BTM3004'); } else if(keys.length === 1){ key = keys[0]; @@ -268,100 +160,6 @@ keysSDK.prototype.verifyPassword = function(keystore, password) { }; /** - * Create a new key. - * - * @param {String} alias - User specified, unique identifier. - * @param {String} password - User specified, key password. - */ -keysSDK.prototype.create = function(alias, password) { - var normalizedAlias = alias.toLowerCase().trim(); - let retPromise = new Promise((resolve, reject) => { - getDB().then(db => { - let getRequest = db.transaction(['keys'], 'readonly') - .objectStore('keys') - .index('alias') - .get(normalizedAlias); - getRequest.onsuccess = function (e) { - if (e.target.result) { - reject(new Error('key alias already exists')); - return; - } - let data = {}; - data.alias = normalizedAlias; - data.auth = password; - createKey(data).then((res) => { - let jsonData = JSON.parse(res.data); - let dbData = { - key:res.data, - xpub:jsonData.xpub, - alias:alias, - }; - let request = db.transaction(['keys'], 'readwrite') - .objectStore('keys') - .add(dbData); - request.onsuccess = function () { - resolve({xpub:jsonData.xpub, alias: alias}); - }; - request.onerror = function () { - reject(new Error('db insert error')); - }; - }).catch(error => { - reject(error); - }); - }; - getRequest.onerror = function () { - reject(new Error('db get error')); - }; - }).catch(error => { - reject(error); - }); - }); - return retPromise; -}; - - -/** - * Create a new key. - * - * @param {String} xpub - xpub. - */ -keysSDK.prototype.createPubkey = function(xpub) { - let retPromise = new Promise((resolve, reject) => { - let data = {}; - data.xpub = xpub; - data.seed = 1; - createPubkey(data).then((res) => { - let jsonData = JSON.parse(res.data); - resolve(jsonData); - }).catch(error => { - reject(error); - }); - }); - return retPromise; -}; - -/** - * Sign Message. - * - * @param {String} message - message. - * @param {String} password - password. - * @param {Object} address - address. - */ -keysSDK.prototype.signMessage = function(message, password, keystore) { - let data = {}; - data.message = message; - data.password = password; - data.key = keystore; - return signMessage(data).then((res) => { - let jsonData = JSON.parse(res.data); - return (jsonData); - }).catch(error => { - throw (error); - }); - -}; - -/** * Sign Message. * * @param {String} message - message. diff --git a/src/sdk/transaction.js b/src/sdk/transaction.js index 485bac4..ee9fdc5 100644 --- a/src/sdk/transaction.js +++ b/src/sdk/transaction.js @@ -1,8 +1,6 @@ -import {convertArgument, signTransaction} from '../wasm/func'; -import { handleApiError, handleAxiosError } from '../utils/http'; -import { getDB } from '../db/db'; import {signTransaction as signJs} from '../utils/transaction/signTransaction'; import { camelize } from '../utils/utils'; +import {convertArgument} from '../utils/convertArguement'; function transactionSDK(bytom) { @@ -209,57 +207,6 @@ transactionSDK.prototype.buildTransaction = function(address, inputs, outputs, f return this.http.request(`merchant/build-advanced-tx?address=${address}`, pm, net); }; -/** - * sign transaction - * @param {String} guid - * @param {String} transaction - * @param {String} password - * @returns {Object} signed data - */ -transactionSDK.prototype.signTransaction = function(guid, transaction, password, getKeyByXPub) { - let bytom = this.bytom; - let retPromise = new Promise((resolve, reject) => { - getDB().then(db => { - let getRequest = db.transaction(['accounts-server'], 'readonly') - .objectStore('accounts-server') - .index('guid') - .get(guid); - getRequest.onsuccess = function(e) { - if (!e.target.result) { - reject(new Error('not found guid')); - return; - } - const res = getKeyByXPub(e.target.result.rootXPub)[0]; - if(!res){ - reject('not found xpub'); - }else{ - const key = res.key; - let pm = {transaction: transaction, password: password, key: key}; - signTransaction(pm).then(res => { - resolve(JSON.parse(res.data)); - }).catch(err => { - reject(err); - }); - } - }; - getRequest.onerror = function() { - reject(getRequest.error); - }; - }).catch(error => { - reject(error); - }); - }); - return retPromise; -}; - -transactionSDK.prototype._signTransaction = function( transaction, password, key) { - let pm = {transaction: transaction, password: password, key: key}; - return signTransaction(pm).then(res => { - return JSON.parse(res.data); - }).catch(err => { - throw (err); - }); -}; transactionSDK.prototype._signTransactionJs = function( transaction, password, key) { let tx = camelize(JSON.parse(transaction)); @@ -292,14 +239,16 @@ transactionSDK.prototype.convertArgument = function(type, value) { let data = {}; data.type = type; data.raw_data = JSON.stringify({value}); - convertArgument(data).then((res) => { - let jsonData = JSON.parse(res.data); - resolve(jsonData); - }).catch(error => { + try{ + const result = convertArgument(data).data + resolve(result); + } + catch(error){ reject(error); - }); + } }); return retPromise; }; + export default transactionSDK; \ No newline at end of file diff --git a/src/sdk/wallet.js b/src/sdk/wallet.js index 9fa14f7..130ad5b 100644 --- a/src/sdk/wallet.js +++ b/src/sdk/wallet.js @@ -1,58 +1,10 @@ -import {initDB, getDB} from '../db/db'; import { restoreFromKeyStore } from '../utils/account'; -import accountsSDK from './accounts'; function walletSDK(bytom) { this.http = bytom.serverHttp; this.bytom = bytom; } -let backupDBList = ['keys', 'accounts-server']; - -/** - * backup wallet. - */ -walletSDK.prototype.backup = function() { - let retPromise = new Promise((resolve, reject) => { - initDB().then(() =>{ - let walletImage = { - key_images:{ xkeys:[] }, - account_image:{ assets:[] }, - asset_image:{ slices:[] } - }; - - - let promiseList = []; - for(let dbName of backupDBList){ - promiseList.push(backupDB(dbName)); - } - - Promise.all([promiseList]).then(([keyData, AccountData]) =>{ - walletImage['key_images']['xkeys'] = keyData.map(a => JSON.parse(a.key)); - walletImage['account_image']['assets'] = AccountData.map(a => { - return { - 'account':{ - 'type':'account', - 'xpubs':[ - a.rootXPub - ], - 'quorum':1, - 'id':'byone-', - 'alias':a.alias, - 'keyIndex':1 - },'contractIndex':1 - }; - }); - - resolve(JSON.stringify(walletImage)); - }).catch(error => { - reject(error); - }); - }); - }); - return retPromise; -}; - walletSDK.prototype.list = function(pubkey) { let net = this.bytom.net; let pm = {pubkey}; @@ -87,62 +39,4 @@ walletSDK.prototype.restore = function(keystore, password) { }; -function backupDB(dbname) { - let ret = new Promise((resolve, reject) => { - getDB().then(db => { - - let transaction = db.transaction([dbname], 'readonly'); - let objectStore = transaction.objectStore(dbname); - let oc = objectStore.openCursor(); - let data = []; - oc.onsuccess = function (event) { - var cursor = event.target.result; - if (cursor) { - data.push(cursor.value); - cursor.continue(); - } else { - resolve(data); - } - }; - oc.onerror = function(e){ - reject(e); - }; - }).catch(err => { - reject(err); - }); - }); - return ret; -} - -function restoreDB(dbname, data) { - let ret = new Promise((resolve, reject) => { - getDB().then(db => { - let index = 0; - let errList = []; - batchAdd(); - - function batchAdd() { - if (index >= data.length) { - let r = {name: dbname, err: errList}; - resolve(r); - return; - } - let transaction = db.transaction([dbname], 'readwrite'); - let objectStore = transaction.objectStore(dbname); - let req = objectStore.add(data[index]); - req.onsuccess = batchAdd; - req.onerror = function() { - // if error continue add - errList.push(req.error); - batchAdd(); - }; - index++; - } - }).catch(err => { - reject(err); - }); - }); - return ret; -} - export default walletSDK; \ No newline at end of file diff --git a/src/utils/convertArguement.js b/src/utils/convertArguement.js index f18b419..a4fe2ad 100644 --- a/src/utils/convertArguement.js +++ b/src/utils/convertArguement.js @@ -1,7 +1,8 @@ import { hexEncode } from './hex.js'; import bech32 from 'bech32'; +import Error from './error'; -export function convertArguements(obj){ +export function convertArgument(obj){ const type = obj.type; const value = obj.raw_data.value; let convertValue; @@ -22,7 +23,7 @@ export function convertArguements(obj){ convertValue = convertAddress(value); break; default: - throw 'Invalid data type.'; + throw new Error('Invalid data type.', 'BTM3101'); } return { data: convertValue }; } @@ -33,7 +34,7 @@ function convertBoolean(bool) { }else if(bool === false){ return ''; }else { - throw 'Invalid Boolean argument'; + throw new Error('Invalid Boolean argument','BTM3102'); } } @@ -54,7 +55,7 @@ function convertData(data){ if(/^[-+]?[0-9A-Fa-f]+\.?[0-9A-Fa-f]*?$/i.test(data)){ return data; }else{ - throw 'Invalid hex data'; + throw new Error('Invalid hex data','BTM3103'); } } diff --git a/src/utils/error.js b/src/utils/error.js new file mode 100644 index 0000000..9f73757 --- /dev/null +++ b/src/utils/error.js @@ -0,0 +1,7 @@ +export default class Error { + + constructor( _message, _code) { + this.message = _message; + this.code = _code; + } +} \ No newline at end of file diff --git a/src/utils/key/chainkd.js b/src/utils/key/chainkd.js index d8298fc..e7a7d08 100644 --- a/src/utils/key/chainkd.js +++ b/src/utils/key/chainkd.js @@ -1,7 +1,6 @@ let createHmac = require('create-hmac'); let ED25519 =require('../ed25519'); let Curve25519 = new ED25519.Curve; -const ExpandedPrivateKeySize = 64 const nacl = require('../nacl'); // If r is nil, crypto/rand.Reader is used. diff --git a/src/utils/key/createKey.js b/src/utils/key/createKey.js index cb52229..74900db 100644 --- a/src/utils/key/createKey.js +++ b/src/utils/key/createKey.js @@ -1,5 +1,6 @@ const bip39 = require('bip39'); const utils = require('./utils'); +import Error from '../error' const WORDLISTS = { en: require('bip39/src/wordlists/english.json'), @@ -35,13 +36,13 @@ function isValidMnemonic(mnemonic, language){ // mnemonic length = (entropy length + checksum length)/11 let mnemArray = mnemonic.trim().split(' '); if (mnemArray.length != ((EntropyLength+EntropyLength/32)/11 )){ - throw 'mnemonic length error'; + throw new Error('mnemonic length error', 'BTM3005'); } // Pre validate that the mnemonic is well formed and only contains words that // are present in the word list if (!bip39.validateMnemonic(mnemonic, WORDLISTS[language])) { - throw 'mnemonic is invalid'; + throw new Error('mnemonic is invalid', 'BTM3006'); } } diff --git a/src/utils/key/keystore.js b/src/utils/key/keystore.js index a34672a..52664e4 100644 --- a/src/utils/key/keystore.js +++ b/src/utils/key/keystore.js @@ -3,6 +3,7 @@ let scrypt = require('scrypt-js'); import {XPrv} from './chainkd'; let sha3_256 = require('js-sha3').sha3_256; import _ from 'lodash'; +import Error from '../error'; const scryptDKLen = 32; const scryptR = 8; @@ -64,7 +65,7 @@ function aesCTRXOR(key, inText, iv) { function decryptKey(v3Keystore, password){ if (!_.isString(password)) { - throw new Error('No password given.'); + throw new Error('No password given.', 'BTM3003'); } let k = (_.isObject(v3Keystore)) ? v3Keystore : JSON.parse(v3Keystore); @@ -92,19 +93,19 @@ function decrypt(json, password) { kdfparams = json.crypto.kdfparams; if (kdfparams.prf !== 'hmac-sha256') { - throw new Error('Unsupported parameters to PBKDF2'); + throw new Error('Unsupported parameters to PBKDF2', 'BTM3002'); } derivedKey = cryp.pbkdf2Sync(Buffer.from(password), Buffer.from(kdfparams.salt, 'hex'), kdfparams.c, kdfparams.dklen, 'sha3256'); } else { - throw new Error('Unsupported key derivation scheme'); + throw new Error('Unsupported key derivation scheme' , 'BTM3001'); } var ciphertext = Buffer.from(json.crypto.ciphertext, 'hex'); var mac = sha3_256(Buffer.concat([Buffer(derivedKey.slice(16, 32)), ciphertext])); if (mac !== json.crypto.mac) { - throw new Error('Key derivation failed - possibly wrong password'); + throw new Error('Key derivation failed - possibly wrong password', 'BTM3000'); } var decipher = cryp.createDecipheriv(json.crypto.cipher, derivedKey.slice(0, 16), Buffer.from(json.crypto.cipherparams.iv, 'hex')); diff --git a/src/utils/transaction/signMessage.js b/src/utils/transaction/signMessage.js index cca8d34..8de171d 100644 --- a/src/utils/transaction/signMessage.js +++ b/src/utils/transaction/signMessage.js @@ -2,7 +2,7 @@ import {SignData} from './signTransaction'; function signMessage(message, password, keyJSON) { if (!(message) || !(password) || !(keyJSON) ){ - throw('Input args are empty'); + throw('Input args are empty', 'BTM3100'); } let signData = SignData(keyJSON, null, Buffer.from(message, 'utf8'), password); diff --git a/src/utils/transaction/signTransaction.js b/src/utils/transaction/signTransaction.js index 58fe9be..5244edb 100644 --- a/src/utils/transaction/signTransaction.js +++ b/src/utils/transaction/signTransaction.js @@ -4,7 +4,7 @@ import {XPrv} from '../key/chainkd'; function signTransaction(transaction, password, keyJSON) { if (!(transaction) || !(password) || !(keyJSON) ){ - throw('Input args are empty'); + throw('Input args are empty', 'BTM3100'); } let tx = transaction; let signRet = []; -- 2.11.0