From 78e555b264e5fa7a922b76f975ce3c32a42da3ca Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Sun, 7 Feb 2021 20:30:24 +0100 Subject: [PATCH 01/26] fix: store blockHash and remove unknown incrementer --- .../Storage/methods/importBlockHeader.js | 6 +-- .../Storage/methods/importBlockHeader.spec.js | 51 +++++++++++++++++++ 2 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 src/types/Storage/methods/importBlockHeader.spec.js diff --git a/src/types/Storage/methods/importBlockHeader.js b/src/types/Storage/methods/importBlockHeader.js index a96ca0f11..36122a4c0 100644 --- a/src/types/Storage/methods/importBlockHeader.js +++ b/src/types/Storage/methods/importBlockHeader.js @@ -13,9 +13,9 @@ const importBlockHeader = function importBlockHeader(blockHeader, height) { if (!chainStore.blockHeaders[blockHeader.hash]) { if (height) { - if (height > currentChainHeight) store.chains[network].blockHeight = height; - else { - store.chains[network].blockHeight += 1; + if (height > currentChainHeight) { + store.chains[network].blockHeight = height; + store.chains[network].blockHash = blockHeader.hash; self.announce(EVENTS.BLOCKHEIGHT_CHANGED, store.chains[network].blockHeight); } } diff --git a/src/types/Storage/methods/importBlockHeader.spec.js b/src/types/Storage/methods/importBlockHeader.spec.js new file mode 100644 index 000000000..1ff914c7a --- /dev/null +++ b/src/types/Storage/methods/importBlockHeader.spec.js @@ -0,0 +1,51 @@ +const {expect} = require('chai'); +const importBlockHeader = require('./importBlockHeader'); +const {BlockHeader} = require('@dashevo/dashcore-lib'); +const blockheaders = [ + ["000000203ff9cabb94af363861e25efb20af3e3ff3cb4b4d74b058634ed9b681e001000090aeea4d32cc2af0e1581bfa857ec92d576c6a850ba016360495c13e0e71d3939d372060721c021ed1d70000", 440864], + ["00000020716fc387353a10a7fa96313c0c4d2e9961115aa5166b65ab03f787d262000000d2727f82f3c07b3a06cc8ab4ad2b2d2b587c349e84ba038c0780200fb1d1c6ecef372060661b021e06f20000", 440865], + ["000000206bd27ed18629d8248d96abfc35df9f12d4819efb9033bf180867b7efb2010000f3badd5d7a58bda5bf0110faba792e095d25bf7b74c3c30d60e6cf1fd269421342382060701d021eed740000", 440866], + ["000000207c5555e0be42d75dce146ff12191689bba87808eeb6d99b6cf311be3b6010000d3f2ac26c878add6c559b57c7a329c11152faa850002d78c7a2f87af8648c38fc9382060ec18021e5cbb0000", 440867], + ["0000002026b9d8782f5072960e1e3747be751f966a58d07c60907cf50611fb838e0000000125fb982bff2e2051721761e937bacc98879b51263242c866e9b3959d244db591392060ecfc011e1f4d0000", 440868], + ["00000020824f369f4f3ce7bb540eed5b5bf860c52d1b628d22157cc82187912a0a000000863a79e51ff603e374b52e781f70b4a7ebcfa0115c3aa9f9357a00a2224d983dac392060ff0c021e2f000000", 440869], + ["00000020da05110166b7f440315d30715276a94a97fc88373a89b2b832e7d3d5bb010000306704e86b48d66ad28e7fc43aa6d3068d0f64606b383652284ac3b22cb7f052cd392060ec06021ea18f0000", 440870] +] + +const fakeState = { + announce: ()=>{}, + network: 'testnet', store: { + chains: { + 'testnet': { + blockHeaders: {}, + mappedBlockHeaderHeights:{}, + blockHeight: -1, + blockHash: null, + } + } + } +}; +describe('Storage - ImportBlockHeader', () => { + it('should import a blockheader', () => { + importBlockHeader.call(fakeState, new BlockHeader.fromString(blockheaders[1][0]), blockheaders[1][1]); + expect(fakeState.store.chains.testnet.blockHeight).to.deep.equal(440865) + expect(fakeState.store.chains.testnet.blockHash).to.deep.equal('000001b2efb7670818bf3390fb9e81d4129fdf35fcab968d24d82986d17ed26b') + + }); + it('should import multiple blockheaders', function () { + importBlockHeader.call(fakeState, new BlockHeader.fromString(blockheaders[2][0]), blockheaders[2][1]); + importBlockHeader.call(fakeState, new BlockHeader.fromString(blockheaders[3][0]), blockheaders[3][1]); + importBlockHeader.call(fakeState, new BlockHeader.fromString(blockheaders[4][0]), blockheaders[4][1]); + importBlockHeader.call(fakeState, new BlockHeader.fromString(blockheaders[5][0]), blockheaders[5][1]); + importBlockHeader.call(fakeState, new BlockHeader.fromString(blockheaders[6][0]), blockheaders[6][1]); + expect(fakeState.store.chains.testnet.blockHeight).to.deep.equal(440870) + }); + it('should deal with importing a blockheader prior the last', function () { + importBlockHeader.call(fakeState, new BlockHeader.fromString(blockheaders[0][0]), blockheaders[0][1]); + expect(fakeState.store.chains.testnet.blockHeight).to.deep.equal(440870) + expect(fakeState.store.chains.testnet.blockHash).to.deep.equal('0000005a38e319021ffaa1f4d1765d5f5a0e02e78ab488623a897c85240e2ca6') + const hashes = blockheaders.map((el)=> new BlockHeader.fromString(el[0]).hash); + + // Sorting as we added [0] after all the other ones. + expect(Object.keys(fakeState.store.chains.testnet.blockHeaders).sort()).to.deep.equal(hashes.sort()); + }); +}); From bf8f8f221935f5a3a1ca0b1e41f60015e9da32aa Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Sun, 7 Feb 2021 20:30:45 +0100 Subject: [PATCH 02/26] feat: added blockHash in store --- src/types/Storage/methods/createAccount.js | 1 + src/types/Storage/methods/createChain.js | 1 + src/types/Storage/methods/createSingleAddress.js | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/types/Storage/methods/createAccount.js b/src/types/Storage/methods/createAccount.js index 819a17372..6832b521d 100644 --- a/src/types/Storage/methods/createAccount.js +++ b/src/types/Storage/methods/createAccount.js @@ -20,6 +20,7 @@ module.exports = function createAccount(walletId, path, network, label = null) { path, network, blockHeight: 0, // Used to keep track of local state sync of the account + blockHash: null, }; return true; diff --git a/src/types/Storage/methods/createChain.js b/src/types/Storage/methods/createChain.js index 33da66a20..3bebc142e 100644 --- a/src/types/Storage/methods/createChain.js +++ b/src/types/Storage/methods/createChain.js @@ -13,6 +13,7 @@ const createChain = function createChain(network) { // Map a blockheader to it's height (used by searchBlockheader for speed up the process) mappedBlockHeaderHeights: {}, blockHeight: -1, + blockHash: null, }; return true; } diff --git a/src/types/Storage/methods/createSingleAddress.js b/src/types/Storage/methods/createSingleAddress.js index 62421610c..7a304e999 100644 --- a/src/types/Storage/methods/createSingleAddress.js +++ b/src/types/Storage/methods/createSingleAddress.js @@ -18,7 +18,8 @@ module.exports = function createAccount(walletId, network, label = null) { this.store.wallets[walletId].accounts['0'] = { label, network, - blockHeight: 0, // Used to keep track of local state sync of the account + blockHeight: 0, // Used to keep track of local state sync of the account, + blockHash: null }; return true; From 359a6a9ce593f5b1015e636399b2b66f7ef6c9ad Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Sun, 7 Feb 2021 21:17:27 +0100 Subject: [PATCH 03/26] feat: provide height on execStatusFetch --- src/plugins/Plugins/ChainPlugin.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/plugins/Plugins/ChainPlugin.js b/src/plugins/Plugins/ChainPlugin.js index 56ad9ed54..97796dfde 100644 --- a/src/plugins/Plugins/ChainPlugin.js +++ b/src/plugins/Plugins/ChainPlugin.js @@ -60,12 +60,11 @@ class ChainPlugin extends StandardPlugin { return false; } const { blocks } = res; - const { network } = this.storage.store.wallets[this.walletId]; logger.debug('ChainPlugin - Setting up starting blockHeight', blocks); - this.storage.store.chains[network.toString()].blockHeight = blocks; - const bestBlock = await this.transport.getBlockHeaderByHeight(blocks); - await this.storage.importBlockHeader(bestBlock); + const height = blocks; + const bestBlock = await this.transport.getBlockHeaderByHeight(height); + await this.storage.importBlockHeader(bestBlock, height); return true; } From 57db15fefc2a56a29886d7edc0ed0b1eb7e805b9 Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Sun, 7 Feb 2021 21:18:39 +0100 Subject: [PATCH 04/26] feat: provide height in execBlockListener --- src/plugins/Plugins/ChainPlugin.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/plugins/Plugins/ChainPlugin.js b/src/plugins/Plugins/ChainPlugin.js index 97796dfde..df1b6dfbe 100644 --- a/src/plugins/Plugins/ChainPlugin.js +++ b/src/plugins/Plugins/ChainPlugin.js @@ -38,10 +38,9 @@ class ChainPlugin extends StandardPlugin { // const { network } = self.storage.store.wallets[self.walletId]; const { payload: block } = ev; this.parentEvents.emit(EVENTS.BLOCK, { type: EVENTS.BLOCK, payload: block }); - // We do not announce BLOCKHEADER as this is done by Storage - await self.storage.importBlockHeader(block.header); - const blockHeight = await self.transport.getBestBlockHeight(); + // We do not announce BLOCKHEADER as this is done by Storage + await self.storage.importBlockHeader(block.header, blockHeight); this.storage.store.chains[network.toString()].blockHeight = blockHeight; logger.debug(`ChainPlugin - setting chain blockheight ${blockHeight}`); }); From 13577657a6b54cecbdf9e97c139e262cf24dd6bb Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Sun, 7 Feb 2021 21:38:47 +0100 Subject: [PATCH 05/26] feat: setLastSyncedBlockHeight to provide hash in accountStore --- .../methods/setLastSyncedBlockHeight.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHeight.js b/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHeight.js index eec5dbd8b..5acb090c0 100644 --- a/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHeight.js +++ b/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHeight.js @@ -7,14 +7,18 @@ const { WALLET_TYPES } = require('../../../../CONSTANTS'); * @return {number} */ module.exports = function setLastSyncedBlockHeight(blockHeight) { - const { walletId } = this; + const { walletId, transport } = this; const accountsStore = this.storage.store.wallets[walletId].accounts; const accountStore = (this.walletType === WALLET_TYPES.SINGLE_ADDRESS) - ? accountsStore[this.index.toString()] - : accountsStore[this.BIP44PATH.toString()]; + ? accountsStore[this.index.toString()] + : accountsStore[this.BIP44PATH.toString()]; accountStore.blockHeight = blockHeight; + transport.client.core.getBlockHash(blockHeight).then((hash) => { + accountStore.blockHash = hash; + }); + return accountStore.blockHeight; }; From e078bb70cd96cf80af766d2c196a47881cc8346f Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Sun, 7 Feb 2021 21:47:17 +0100 Subject: [PATCH 06/26] feat: update hash as we update height in local account store --- .../TransactionSyncStreamWorker.js | 30 ++++--------------- .../methods/getLastSyncedBlockHash.js | 15 ++++++++++ .../methods/setLastSyncedBlockHash.js | 20 +++++++++++++ .../methods/setLastSyncedBlockHeight.js | 6 +--- .../methods/startHistoricalSync.js | 3 ++ 5 files changed, 45 insertions(+), 29 deletions(-) create mode 100644 src/plugins/Workers/TransactionSyncStreamWorker/methods/getLastSyncedBlockHash.js create mode 100644 src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHash.js diff --git a/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js b/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js index 9a38c96af..75ce13e30 100644 --- a/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js +++ b/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js @@ -128,9 +128,13 @@ class TransactionSyncStreamWorker extends Worker { } = (this.storage.store.syncOptions || {}); if (skipSynchronizationBeforeHeight) { + const hash = await this.transport.client.core.getBlockHash(skipSynchronizationBeforeHeight); this.setLastSyncedBlockHeight( skipSynchronizationBeforeHeight, ); + this.setLastSyncedBlockHash( + hash, + ); } // We first need to sync up initial historical transactions @@ -167,35 +171,13 @@ class TransactionSyncStreamWorker extends Worker { this.stream = null; } } - - setLastSyncedBlockHash(hash) { - const { walletId } = this; - const accountsStore = this.storage.store.wallets[walletId].accounts; - - const accountStore = (this.walletType === WALLET_TYPES.SINGLE_ADDRESS) - ? accountsStore[this.index.toString()] - : accountsStore[this.BIP44PATH.toString()]; - - accountStore.blockHash = hash; - - return accountStore.blockHash; - } - - getLastSyncedBlockHash() { - const { walletId } = this; - const accountsStore = this.storage.store.wallets[walletId].accounts; - - const { blockHash } = (this.walletType === WALLET_TYPES.SINGLE_ADDRESS) - ? accountsStore[this.index.toString()] - : accountsStore[this.BIP44PATH.toString()]; - - return blockHash; - } } TransactionSyncStreamWorker.prototype.getAddressesToSync = require('./methods/getAddressesToSync'); TransactionSyncStreamWorker.prototype.getBestBlockHeightFromTransport = require('./methods/getBestBlockHeight'); +TransactionSyncStreamWorker.prototype.setLastSyncedBlockHash = require('./methods/setLastSyncedBlockHash'); TransactionSyncStreamWorker.prototype.setLastSyncedBlockHeight = require('./methods/setLastSyncedBlockHeight'); +TransactionSyncStreamWorker.prototype.getLastSyncedBlockHash = require('./methods/getLastSyncedBlockHash'); TransactionSyncStreamWorker.prototype.getLastSyncedBlockHeight = require('./methods/getLastSyncedBlockHeight'); TransactionSyncStreamWorker.prototype.startHistoricalSync = require('./methods/startHistoricalSync'); TransactionSyncStreamWorker.prototype.startIncomingSync = require('./methods/startIncomingSync'); diff --git a/src/plugins/Workers/TransactionSyncStreamWorker/methods/getLastSyncedBlockHash.js b/src/plugins/Workers/TransactionSyncStreamWorker/methods/getLastSyncedBlockHash.js new file mode 100644 index 000000000..5572bc374 --- /dev/null +++ b/src/plugins/Workers/TransactionSyncStreamWorker/methods/getLastSyncedBlockHash.js @@ -0,0 +1,15 @@ +const { WALLET_TYPES } = require('../../../../CONSTANTS'); +/** + * Return last synced block height + * @return {number} + */ +module.exports = function getLastSyncedBlockHeight() { + const { walletId } = this; + const accountsStore = this.storage.store.wallets[walletId].accounts; + + const { blockHash } = (this.walletType === WALLET_TYPES.SINGLE_ADDRESS) + ? accountsStore[this.index.toString()] + : accountsStore[this.BIP44PATH.toString()]; + + return blockHash; +}; diff --git a/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHash.js b/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHash.js new file mode 100644 index 000000000..d259fa52a --- /dev/null +++ b/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHash.js @@ -0,0 +1,20 @@ +const { WALLET_TYPES } = require('../../../../CONSTANTS'); + +/** + * Set last synced block height + * + * @param {number} blockHeight + * @return {number} + */ +module.exports = function setLastSyncedBlockHeight(hash) { + const { walletId } = this; + const accountsStore = this.storage.store.wallets[walletId].accounts; + + const accountStore = (this.walletType === WALLET_TYPES.SINGLE_ADDRESS) + ? accountsStore[this.index.toString()] + : accountsStore[this.BIP44PATH.toString()]; + + accountStore.blockHash = hash; + + return accountStore.blockHash; +}; diff --git a/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHeight.js b/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHeight.js index 5acb090c0..7a673f010 100644 --- a/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHeight.js +++ b/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHeight.js @@ -7,7 +7,7 @@ const { WALLET_TYPES } = require('../../../../CONSTANTS'); * @return {number} */ module.exports = function setLastSyncedBlockHeight(blockHeight) { - const { walletId, transport } = this; + const { walletId } = this; const accountsStore = this.storage.store.wallets[walletId].accounts; const accountStore = (this.walletType === WALLET_TYPES.SINGLE_ADDRESS) @@ -16,9 +16,5 @@ module.exports = function setLastSyncedBlockHeight(blockHeight) { accountStore.blockHeight = blockHeight; - transport.client.core.getBlockHash(blockHeight).then((hash) => { - accountStore.blockHash = hash; - }); - return accountStore.blockHeight; }; diff --git a/src/plugins/Workers/TransactionSyncStreamWorker/methods/startHistoricalSync.js b/src/plugins/Workers/TransactionSyncStreamWorker/methods/startHistoricalSync.js index 115f1d8d2..58256c9fd 100644 --- a/src/plugins/Workers/TransactionSyncStreamWorker/methods/startHistoricalSync.js +++ b/src/plugins/Workers/TransactionSyncStreamWorker/methods/startHistoricalSync.js @@ -56,6 +56,9 @@ module.exports = async function startHistoricalSync(network) { throw e; } + const hash = await this.transport.client.core.getBlockHash(bestBlockHeight); + + this.setLastSyncedBlockHeight(hash); this.setLastSyncedBlockHeight(bestBlockHeight); logger.debug(`TransactionSyncStreamWorker - HistoricalSync - Synchronized ${count} in ${+new Date() - start}ms`); From fd02c497a6ca00fc98212f855d29b4d3facda55b Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Sun, 7 Feb 2021 22:02:33 +0100 Subject: [PATCH 07/26] test: update test with added blockHash --- .../methods/getLastSyncedBlockHash.js | 2 +- src/types/Storage/Storage.spec.js | 4 ++-- src/types/Storage/methods/createChain.spec.js | 2 +- src/types/Storage/methods/createWallet.spec.js | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/plugins/Workers/TransactionSyncStreamWorker/methods/getLastSyncedBlockHash.js b/src/plugins/Workers/TransactionSyncStreamWorker/methods/getLastSyncedBlockHash.js index 5572bc374..5152a5f88 100644 --- a/src/plugins/Workers/TransactionSyncStreamWorker/methods/getLastSyncedBlockHash.js +++ b/src/plugins/Workers/TransactionSyncStreamWorker/methods/getLastSyncedBlockHash.js @@ -10,6 +10,6 @@ module.exports = function getLastSyncedBlockHeight() { const { blockHash } = (this.walletType === WALLET_TYPES.SINGLE_ADDRESS) ? accountsStore[this.index.toString()] : accountsStore[this.BIP44PATH.toString()]; - + return blockHash; }; diff --git a/src/types/Storage/Storage.spec.js b/src/types/Storage/Storage.spec.js index 9344be4f9..5cfa800ef 100644 --- a/src/types/Storage/Storage.spec.js +++ b/src/types/Storage/Storage.spec.js @@ -55,7 +55,7 @@ describe('Storage - constructor', function suite() { transactions: {}, chains: { testnet: { - name: 'testnet', blockHeight: -1, blockHeaders: {}, mappedBlockHeaderHeights: {}, + name: 'testnet', blockHeight: -1, blockHash: null, blockHeaders: {}, mappedBlockHeaderHeights: {}, }, }, instantLocks: {} @@ -77,7 +77,7 @@ describe('Storage - constructor', function suite() { transactions: {}, chains: { testnet: { - name: 'testnet', blockHeight: -1, blockHeaders: {}, mappedBlockHeaderHeights: {}, + name: 'testnet', blockHeight: -1, blockHash: null, blockHeaders: {}, mappedBlockHeaderHeights: {}, }, }, instantLocks: {}, diff --git a/src/types/Storage/methods/createChain.spec.js b/src/types/Storage/methods/createChain.spec.js index 496e0dbb7..686ebfb18 100644 --- a/src/types/Storage/methods/createChain.spec.js +++ b/src/types/Storage/methods/createChain.spec.js @@ -15,7 +15,7 @@ describe('Storage - createChain', function suite() { store: { chains: { testnet: { - name: 'testnet', blockHeight: -1, blockHeaders: {}, mappedBlockHeaderHeights: {}, + name: 'testnet', blockHeight: -1, blockHash: null, blockHeaders: {}, mappedBlockHeaderHeights: {}, }, }, }, diff --git a/src/types/Storage/methods/createWallet.spec.js b/src/types/Storage/methods/createWallet.spec.js index 306e4b651..e02d1b13b 100644 --- a/src/types/Storage/methods/createWallet.spec.js +++ b/src/types/Storage/methods/createWallet.spec.js @@ -27,7 +27,7 @@ describe('Storage - createWallet', function suite() { }, chains: { testnet: { - name: 'testnet', blockHeight: -1, blockHeaders: {}, mappedBlockHeaderHeights: {}, + name: 'testnet', blockHeight: -1, blockHash: null, blockHeaders: {}, mappedBlockHeaderHeights: {}, }, }, }; @@ -54,7 +54,7 @@ describe('Storage - createWallet', function suite() { }, chains: { testnet: { - name: 'testnet', blockHeight: -1, blockHeaders: {}, mappedBlockHeaderHeights: {}, + name: 'testnet', blockHeight: -1, blockHash: null, blockHeaders: {}, mappedBlockHeaderHeights: {}, }, }, }; From fc8ee6636e1e8e02f4efcc80fac4903d7fb9bf98 Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Sun, 7 Feb 2021 22:03:31 +0100 Subject: [PATCH 08/26] chore: remove unused imported variable --- .../TransactionSyncStreamWorker/TransactionSyncStreamWorker.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js b/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js index 75ce13e30..1e8c0e30a 100644 --- a/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js +++ b/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js @@ -1,7 +1,6 @@ const { Transaction, MerkleBlock, InstantLock, } = require('@dashevo/dashcore-lib'); -const { WALLET_TYPES } = require('../../../CONSTANTS'); const Worker = require('../../Worker'); From 83201a173afe5795b2d140451a7efb9e482bab5e Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Mon, 8 Feb 2021 01:35:01 +0100 Subject: [PATCH 09/26] fix: setting hash to setLastSyncedBlockHash --- .../TransactionSyncStreamWorker/methods/startHistoricalSync.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/Workers/TransactionSyncStreamWorker/methods/startHistoricalSync.js b/src/plugins/Workers/TransactionSyncStreamWorker/methods/startHistoricalSync.js index 58256c9fd..6bf7a0888 100644 --- a/src/plugins/Workers/TransactionSyncStreamWorker/methods/startHistoricalSync.js +++ b/src/plugins/Workers/TransactionSyncStreamWorker/methods/startHistoricalSync.js @@ -58,7 +58,7 @@ module.exports = async function startHistoricalSync(network) { const hash = await this.transport.client.core.getBlockHash(bestBlockHeight); - this.setLastSyncedBlockHeight(hash); + this.setLastSyncedBlockHash(hash); this.setLastSyncedBlockHeight(bestBlockHeight); logger.debug(`TransactionSyncStreamWorker - HistoricalSync - Synchronized ${count} in ${+new Date() - start}ms`); From 17b3fc5d45437154e7b88d986c5f61af4c0bbe08 Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Mon, 8 Feb 2021 01:38:17 +0100 Subject: [PATCH 10/26] typo: fix linting --- .../TransactionSyncStreamWorker.js | 2 +- .../methods/getLastSyncedBlockHash.js | 4 ++-- .../methods/setLastSyncedBlockHash.js | 4 ++-- .../methods/setLastSyncedBlockHeight.js | 4 ++-- src/types/Storage/methods/createSingleAddress.js | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js b/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js index 1e8c0e30a..837df7856 100644 --- a/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js +++ b/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js @@ -132,7 +132,7 @@ class TransactionSyncStreamWorker extends Worker { skipSynchronizationBeforeHeight, ); this.setLastSyncedBlockHash( - hash, + hash, ); } diff --git a/src/plugins/Workers/TransactionSyncStreamWorker/methods/getLastSyncedBlockHash.js b/src/plugins/Workers/TransactionSyncStreamWorker/methods/getLastSyncedBlockHash.js index 5152a5f88..8c3aab9e9 100644 --- a/src/plugins/Workers/TransactionSyncStreamWorker/methods/getLastSyncedBlockHash.js +++ b/src/plugins/Workers/TransactionSyncStreamWorker/methods/getLastSyncedBlockHash.js @@ -8,8 +8,8 @@ module.exports = function getLastSyncedBlockHeight() { const accountsStore = this.storage.store.wallets[walletId].accounts; const { blockHash } = (this.walletType === WALLET_TYPES.SINGLE_ADDRESS) - ? accountsStore[this.index.toString()] - : accountsStore[this.BIP44PATH.toString()]; + ? accountsStore[this.index.toString()] + : accountsStore[this.BIP44PATH.toString()]; return blockHash; }; diff --git a/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHash.js b/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHash.js index d259fa52a..e0fcfb326 100644 --- a/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHash.js +++ b/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHash.js @@ -11,8 +11,8 @@ module.exports = function setLastSyncedBlockHeight(hash) { const accountsStore = this.storage.store.wallets[walletId].accounts; const accountStore = (this.walletType === WALLET_TYPES.SINGLE_ADDRESS) - ? accountsStore[this.index.toString()] - : accountsStore[this.BIP44PATH.toString()]; + ? accountsStore[this.index.toString()] + : accountsStore[this.BIP44PATH.toString()]; accountStore.blockHash = hash; diff --git a/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHeight.js b/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHeight.js index 7a673f010..eec5dbd8b 100644 --- a/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHeight.js +++ b/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHeight.js @@ -11,8 +11,8 @@ module.exports = function setLastSyncedBlockHeight(blockHeight) { const accountsStore = this.storage.store.wallets[walletId].accounts; const accountStore = (this.walletType === WALLET_TYPES.SINGLE_ADDRESS) - ? accountsStore[this.index.toString()] - : accountsStore[this.BIP44PATH.toString()]; + ? accountsStore[this.index.toString()] + : accountsStore[this.BIP44PATH.toString()]; accountStore.blockHeight = blockHeight; diff --git a/src/types/Storage/methods/createSingleAddress.js b/src/types/Storage/methods/createSingleAddress.js index 7a304e999..b57936bc7 100644 --- a/src/types/Storage/methods/createSingleAddress.js +++ b/src/types/Storage/methods/createSingleAddress.js @@ -19,7 +19,7 @@ module.exports = function createAccount(walletId, network, label = null) { label, network, blockHeight: 0, // Used to keep track of local state sync of the account, - blockHash: null + blockHash: null, }; return true; From 4e63aaf877e0c25b4c46a18d7775b3b6dc0140b5 Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Mon, 8 Feb 2021 02:03:25 +0100 Subject: [PATCH 11/26] fix: use abstract method instead of DAPIClient specific --- .../TransactionSyncStreamWorker.js | 4 +++- .../methods/startHistoricalSync.js | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js b/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js index 837df7856..cce655fc5 100644 --- a/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js +++ b/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js @@ -127,7 +127,9 @@ class TransactionSyncStreamWorker extends Worker { } = (this.storage.store.syncOptions || {}); if (skipSynchronizationBeforeHeight) { - const hash = await this.transport.client.core.getBlockHash(skipSynchronizationBeforeHeight); + const header = await this.transport.getBlockHeaderByHeight(skipSynchronizationBeforeHeight); + const { hash } = header; + this.setLastSyncedBlockHeight( skipSynchronizationBeforeHeight, ); diff --git a/src/plugins/Workers/TransactionSyncStreamWorker/methods/startHistoricalSync.js b/src/plugins/Workers/TransactionSyncStreamWorker/methods/startHistoricalSync.js index 6bf7a0888..0c5af9b2a 100644 --- a/src/plugins/Workers/TransactionSyncStreamWorker/methods/startHistoricalSync.js +++ b/src/plugins/Workers/TransactionSyncStreamWorker/methods/startHistoricalSync.js @@ -56,7 +56,8 @@ module.exports = async function startHistoricalSync(network) { throw e; } - const hash = await this.transport.client.core.getBlockHash(bestBlockHeight); + const header = await this.transport.getBlockHeaderByHeight(bestBlockHeight); + const { hash } = header; this.setLastSyncedBlockHash(hash); this.setLastSyncedBlockHeight(bestBlockHeight); From 2a81ea0f0180200ce5d903a008511da3890bf3dd Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Mon, 8 Feb 2021 03:12:39 +0100 Subject: [PATCH 12/26] revert: remove blockhash set on skipSyncBeforeHeight --- .../TransactionSyncStreamWorker.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js b/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js index cce655fc5..66e3f819e 100644 --- a/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js +++ b/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js @@ -127,15 +127,9 @@ class TransactionSyncStreamWorker extends Worker { } = (this.storage.store.syncOptions || {}); if (skipSynchronizationBeforeHeight) { - const header = await this.transport.getBlockHeaderByHeight(skipSynchronizationBeforeHeight); - const { hash } = header; - this.setLastSyncedBlockHeight( skipSynchronizationBeforeHeight, ); - this.setLastSyncedBlockHash( - hash, - ); } // We first need to sync up initial historical transactions From bc0a4b32f2d1d48e890b313964b67003c4ebf298 Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Mon, 8 Feb 2021 03:24:30 +0100 Subject: [PATCH 13/26] doc: update JSDoc --- .../methods/setLastSyncedBlockHash.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHash.js b/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHash.js index e0fcfb326..893b0a07a 100644 --- a/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHash.js +++ b/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHash.js @@ -1,12 +1,12 @@ const { WALLET_TYPES } = require('../../../../CONSTANTS'); /** - * Set last synced block height + * Set last synced block hash * - * @param {number} blockHeight - * @return {number} + * @param {string} hash + * @return {string} */ -module.exports = function setLastSyncedBlockHeight(hash) { +module.exports = function setLastSyncedBlockHash(hash) { const { walletId } = this; const accountsStore = this.storage.store.wallets[walletId].accounts; From d10df348fbcc8592d296702dd6a39e56d759b99b Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Wed, 17 Feb 2021 20:40:05 +0100 Subject: [PATCH 14/26] feat: remove ChainPlugin and unnecessary methods linked to chain --- src/CONSTANTS.js | 1 - src/plugins/Plugins/.gitkeep | 0 src/plugins/Plugins/ChainPlugin.js | 77 ------------------- .../TransactionSyncStreamWorker.js | 1 - .../methods/syncUpToTheGapLimit.js | 19 ----- src/types/Account/Account.js | 5 -- src/types/Account/Account.spec.js | 19 +---- src/types/Account/_initializeAccount.js | 3 - src/types/Account/methods/getBlockHeader.js | 3 - src/types/Account/methods/getTransaction.js | 7 -- src/types/Account/methods/getUTXOS.js | 4 +- .../Account/methods/importBlockHeader.js | 30 -------- src/types/Storage/Storage.d.ts | 1 - src/types/Storage/Storage.js | 4 - src/types/Storage/Storage.spec.js | 11 --- src/types/Storage/methods/createChain.js | 22 ------ src/types/Storage/methods/createChain.spec.js | 25 ------ src/types/Storage/methods/createWallet.js | 1 - src/types/Storage/methods/exportChains.js | 3 - .../Storage/methods/importBlockHeader.js | 30 -------- .../Storage/methods/importBlockHeader.spec.js | 51 ------------ src/types/Storage/methods/importChains.js | 10 --- src/types/Storage/methods/rehydrateState.js | 4 - src/types/Storage/methods/saveState.js | 1 - 24 files changed, 3 insertions(+), 329 deletions(-) create mode 100644 src/plugins/Plugins/.gitkeep delete mode 100644 src/plugins/Plugins/ChainPlugin.js delete mode 100644 src/types/Account/methods/importBlockHeader.js delete mode 100644 src/types/Storage/methods/createChain.js delete mode 100644 src/types/Storage/methods/createChain.spec.js delete mode 100644 src/types/Storage/methods/exportChains.js delete mode 100644 src/types/Storage/methods/importBlockHeader.js delete mode 100644 src/types/Storage/methods/importBlockHeader.spec.js delete mode 100644 src/types/Storage/methods/importChains.js diff --git a/src/CONSTANTS.js b/src/CONSTANTS.js index 33388d36a..dcd4e5ec4 100644 --- a/src/CONSTANTS.js +++ b/src/CONSTANTS.js @@ -56,7 +56,6 @@ const CONSTANTS = { 'getTotalBalance', 'broadcastTransaction', 'importTransactions', - 'importBlockHeader', 'getAddress', 'fetchStatus', 'getPlugin', diff --git a/src/plugins/Plugins/.gitkeep b/src/plugins/Plugins/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/plugins/Plugins/ChainPlugin.js b/src/plugins/Plugins/ChainPlugin.js deleted file mode 100644 index df1b6dfbe..000000000 --- a/src/plugins/Plugins/ChainPlugin.js +++ /dev/null @@ -1,77 +0,0 @@ -const logger = require('../../logger'); -const { StandardPlugin } = require('..'); -const EVENTS = require('../../EVENTS'); - -const defaultOpts = { - firstExecutionRequired: true, - executeOnStart: true, -}; - -class ChainPlugin extends StandardPlugin { - constructor(opts = {}) { - const params = { - name: 'ChainPlugin', - executeOnStart: defaultOpts.executeOnStart, - firstExecutionRequired: defaultOpts.firstExecutionRequired, - dependencies: [ - 'storage', - 'transport', - 'fetchStatus', - 'walletId', - ], - }; - super(Object.assign(params, opts)); - this.isSubscribedToBlocks = false; - } - - /** - * Used to subscribe to blockheaders and provide BLOCK, BLOCKHEADER and BLOCKHEIGHT_CHANGED. - * Also, maintain the blockheader storage up to date. - * @return {Promise} - */ - async execBlockListener() { - const self = this; - const { network } = this.storage.store.wallets[this.walletId]; - - if (!this.isSubscribedToBlocks) { - self.transport.on(EVENTS.BLOCK, async (ev) => { - // const { network } = self.storage.store.wallets[self.walletId]; - const { payload: block } = ev; - this.parentEvents.emit(EVENTS.BLOCK, { type: EVENTS.BLOCK, payload: block }); - const blockHeight = await self.transport.getBestBlockHeight(); - // We do not announce BLOCKHEADER as this is done by Storage - await self.storage.importBlockHeader(block.header, blockHeight); - this.storage.store.chains[network.toString()].blockHeight = blockHeight; - logger.debug(`ChainPlugin - setting chain blockheight ${blockHeight}`); - }); - await self.transport.subscribeToBlocks(); - } - } - - /** - * Used on ChainPlugin to be able to report on BLOCKHEIGHT_CHANGED. - * Neither Block or Blockheader contains blockheight, we need to fetch it from getStatus.blocks - * @return {Promise} - */ - async execStatusFetch() { - const res = await this.fetchStatus(); - if (!res) { - return false; - } - const { blocks } = res; - logger.debug('ChainPlugin - Setting up starting blockHeight', blocks); - - const height = blocks; - const bestBlock = await this.transport.getBlockHeaderByHeight(height); - await this.storage.importBlockHeader(bestBlock, height); - - return true; - } - - async onStart() { - await this.execStatusFetch(); - await this.execBlockListener(); - } -} - -module.exports = ChainPlugin; diff --git a/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js b/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js index 66e3f819e..bae8e7912 100644 --- a/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js +++ b/src/plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker.js @@ -14,7 +14,6 @@ class TransactionSyncStreamWorker extends Worker { gapLimit: 10, dependencies: [ 'importTransactions', - 'importBlockHeader', 'importInstantLock', 'storage', 'transport', diff --git a/src/plugins/Workers/TransactionSyncStreamWorker/methods/syncUpToTheGapLimit.js b/src/plugins/Workers/TransactionSyncStreamWorker/methods/syncUpToTheGapLimit.js index 4f6247fa2..6c4c24304 100644 --- a/src/plugins/Workers/TransactionSyncStreamWorker/methods/syncUpToTheGapLimit.js +++ b/src/plugins/Workers/TransactionSyncStreamWorker/methods/syncUpToTheGapLimit.js @@ -1,10 +1,5 @@ const logger = require('../../../../logger'); -function isAnyIntersection(arrayA, arrayB) { - const intersection = arrayA.filter((e) => arrayB.indexOf(e) > -1); - return intersection.length > 0; -} - /** * * @param options @@ -75,20 +70,6 @@ module.exports = async function syncUpToTheGapLimit({ stream.cancel(); } } - - /* Incoming Merkle block handling */ - const merkleBlockFromResponse = this.constructor - .getMerkleBlockFromStreamResponse(response); - - if (merkleBlockFromResponse) { - // Reverse hashes, as they're little endian in the header - const transactionsInHeader = merkleBlockFromResponse.hashes.map((hashHex) => Buffer.from(hashHex, 'hex').reverse().toString('hex')); - const transactionsInWallet = Object.keys(self.storage.getStore().transactions); - const isTruePositive = isAnyIntersection(transactionsInHeader, transactionsInWallet); - if (isTruePositive) { - self.importBlockHeader(merkleBlockFromResponse.header); - } - } }) .on('error', (err) => { logger.silly('TransactionSyncStreamWorker - end stream on error'); diff --git a/src/types/Account/Account.js b/src/types/Account/Account.js index eddcf1030..0326caef8 100644 --- a/src/types/Account/Account.js +++ b/src/types/Account/Account.js @@ -30,7 +30,6 @@ function getNextUnusedAccountIndexForWallet(wallet) { const defaultOptions = { network: 'testnet', cacheTx: true, - cacheBlockHeaders: true, allowSensitiveOperations: false, plugins: [], injectDefaultPlugins: true, @@ -119,9 +118,6 @@ class Account extends EventEmitter { this.keyChain = wallet.keyChain; this.cacheTx = (opts.cacheTx) ? opts.cacheTx : defaultOptions.cacheTx; - this.cacheBlockHeaders = (opts.cacheBlockHeaders) - ? opts.cacheBlockHeaders - : defaultOptions.cacheBlockHeaders; this.plugins = { workers: {}, @@ -254,7 +250,6 @@ Account.prototype.getWorker = require('./methods/getWorker'); Account.prototype.hasPlugins = require('./methods/hasPlugins'); Account.prototype.injectPlugin = require('./methods/injectPlugin'); Account.prototype.importTransactions = require('./methods/importTransactions'); -Account.prototype.importBlockHeader = require('./methods/importBlockHeader'); Account.prototype.sign = require('./methods/sign'); diff --git a/src/types/Account/Account.spec.js b/src/types/Account/Account.spec.js index 4f7f1fa0a..e7e0fa502 100644 --- a/src/types/Account/Account.spec.js +++ b/src/types/Account/Account.spec.js @@ -1,27 +1,14 @@ const { expect } = require('chai'); const Dashcore = require('@dashevo/dashcore-lib'); -const knifeMnemonic = require('../../../fixtures/knifeeasily'); -const fluidMnemonic = require('../../../fixtures/fluidDepth'); -const cR4t6ePrivateKey = require('../../../fixtures/cR4t6e_pk'); -const { WALLET_TYPES } = require('../../CONSTANTS'); const { Account, EVENTS } = require('../../index'); const EventEmitter = require('events'); const inMem = require('../../adapters/InMem'); -const blockHeader = new Dashcore.BlockHeader.fromObject({ - hash: '00000ac3a0c9df709260e41290d6902e5a4a073099f11fe8c1ce80aadc4bb331', - version: 2, - prevHash: '00000ce430de949c85a145b02e33ebbaed3772dc8f3d668f66edc6852c24d002', - merkleRoot: '663360403b5fba9cd8744c3706f9660c7d3fee4e5a9ee98ce0ad5e5ad7824c1d', - time: 1398712821, - bits: 504365040, - nonce: 312363 -}); + const mocks = { adapter: inMem, offlineMode: true, }; - describe('Account - class', function suite() { this.timeout(10000); before(() => { @@ -33,9 +20,6 @@ describe('Account - class', function suite() { getStore: () => {}, saveState: () => {}, stopWorker: () => {}, - importBlockHeader: (blockheader)=>{ - mockStorage.emit(EVENTS.BLOCKHEADER, {type: EVENTS.BLOCKHEADER, payload:blockheader}); - } }; mocks.wallet = (new (function Wallet() { this.walletId = '1234567891'; @@ -94,7 +78,6 @@ describe('Account - class', function suite() { await account.on(EVENTS.BLOCKHEADER, ()=>{ done(); }); - account.storage.importBlockHeader(blockHeader); }) }); diff --git a/src/types/Account/_initializeAccount.js b/src/types/Account/_initializeAccount.js index 7299b0268..f80b6bd33 100644 --- a/src/types/Account/_initializeAccount.js +++ b/src/types/Account/_initializeAccount.js @@ -1,7 +1,6 @@ const _ = require('lodash'); const logger = require('../../logger'); const TransactionSyncStreamWorker = require('../../plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker'); -const ChainPlugin = require('../../plugins/Plugins/ChainPlugin'); const IdentitySyncWorker = require('../../plugins/Workers/IdentitySyncWorker'); const EVENTS = require('../../EVENTS'); const { WALLET_TYPES } = require('../../CONSTANTS'); @@ -44,8 +43,6 @@ async function _initializeAccount(account, userUnsafePlugins) { await account.getAddress('0'); // We force what is usually done by the BIP44Worker. } if (!account.offlineMode) { - await account.injectPlugin(ChainPlugin, true); - // Transaction sync worker await account.injectPlugin(TransactionSyncStreamWorker, true); diff --git a/src/types/Account/methods/getBlockHeader.js b/src/types/Account/methods/getBlockHeader.js index 6d3cfc11d..638beff2b 100644 --- a/src/types/Account/methods/getBlockHeader.js +++ b/src/types/Account/methods/getBlockHeader.js @@ -15,9 +15,6 @@ async function getBlockHeader(identifier) { ? await this.transport.getBlockByHeight(blockHeight) : await this.transport.getBlockHeaderByHash(identifier); - if (this.cacheBlockHeaders) { - await this.storage.importBlockHeader(blockHeader, blockHeight); - } return blockHeader; } module.exports = getBlockHeader; diff --git a/src/types/Account/methods/getTransaction.js b/src/types/Account/methods/getTransaction.js index 9d2559f72..7e932a717 100644 --- a/src/types/Account/methods/getTransaction.js +++ b/src/types/Account/methods/getTransaction.js @@ -11,13 +11,6 @@ async function getTransaction(txid = null) { const tx = await this.transport.getTransaction(txid); if (this.cacheTx) { await this.importTransactions(tx); - if (this.cacheBlockHeaders) { - const searchBlockHeader = this.storage.searchBlockHeader(tx.nLockTime); - if (!searchBlockHeader.found) { - // Trigger caching of blockheader - await this.getBlockHeader(tx.nLockTime); - } - } } return tx; } diff --git a/src/types/Account/methods/getUTXOS.js b/src/types/Account/methods/getUTXOS.js index 4af7fa617..8910d1bfa 100644 --- a/src/types/Account/methods/getUTXOS.js +++ b/src/types/Account/methods/getUTXOS.js @@ -7,8 +7,8 @@ function getUTXOS() { const utxos = []; const self = this; - const { walletId, network } = this; - const currentBlockHeight = this.store.chains[network].blockHeight; + const { walletId, network, index } = this; + const currentBlockHeight = this.store.wallets[walletId].accounts[index].blockHeight; /* eslint-disable-next-line no-restricted-syntax */ for (const walletType in this.store.wallets[walletId].addresses) { if (walletType && ['external', 'internal', 'misc'].includes(walletType)) { diff --git a/src/types/Account/methods/importBlockHeader.js b/src/types/Account/methods/importBlockHeader.js deleted file mode 100644 index 01e4517a4..000000000 --- a/src/types/Account/methods/importBlockHeader.js +++ /dev/null @@ -1,30 +0,0 @@ -const logger = require('../../../logger'); -const { WALLET_TYPES } = require('../../../CONSTANTS'); -/** - * Import transactions and always keep a number of unused addresses up to gap - * - * @param blockHeader - * @returns {Promise} - */ -module.exports = async function importBlockHeader(blockHeader) { - // At this point, the hash of a blockHeader obtained by doing blockHeader.hash, - // do not seems to be a valid hash. - // So we will just assume continuous incremental (by one) importing process. - - // We do however have the knowledge of previous block hash by - // knowing the following blockHeight blockheader's prevHash value - // const previousHash = blockHeader.prevHash.reverse().toString('hex'); - const { - walletId, BIP44PATH, index, store, storage, walletType, - } = this; - - const localWalletStore = store.wallets[walletId]; - const localAccountStore = ([WALLET_TYPES.HDPUBLIC, WALLET_TYPES.HDWALLET].includes(walletType)) - ? localWalletStore.accounts[BIP44PATH.toString()] - : localWalletStore.accounts[index.toString()]; - - localAccountStore.blockHash = blockHeader.id; - - storage.importBlockHeader(blockHeader); - logger.silly(`Account.importBlockHeader(${blockHeader.id})`); -}; diff --git a/src/types/Storage/Storage.d.ts b/src/types/Storage/Storage.d.ts index ab57c5c64..c55120e74 100644 --- a/src/types/Storage/Storage.d.ts +++ b/src/types/Storage/Storage.d.ts @@ -56,7 +56,6 @@ export declare class Storage { importAccounts(accounts: Account|[Account], walletId: string): boolean; importAddress(address: AddressObj, walletId: string): boolean; importAddresses(addresses: [AddressObj], walletId: string): boolean; - importBlockHeader(blockHeader: BlockHeader, height: number): void; importSingleAddress(singleAddress: AddressObj, walletId: string): boolean; importTransaction(transaction: Transaction): void; importTransactions(transactions: [Transaction]): boolean; diff --git a/src/types/Storage/Storage.js b/src/types/Storage/Storage.js index 0d88cd520..60759e8dc 100644 --- a/src/types/Storage/Storage.js +++ b/src/types/Storage/Storage.js @@ -48,12 +48,10 @@ Storage.prototype.calculateDuffBalance = require('./methods/calculateDuffBalance Storage.prototype.clearAll = require('./methods/clearAll'); Storage.prototype.configure = require('./methods/configure'); Storage.prototype.createAccount = require('./methods/createAccount'); -Storage.prototype.createChain = require('./methods/createChain'); Storage.prototype.createSingleAddress = require('./methods/createSingleAddress'); Storage.prototype.createWallet = require('./methods/createWallet'); Storage.prototype.exportAccounts = require('./methods/exportAccounts'); -Storage.prototype.exportChains = require('./methods/exportChains'); Storage.prototype.exportTransactions = require('./methods/exportTransactions'); Storage.prototype.exportWallets = require('./methods/exportWallets'); @@ -64,9 +62,7 @@ Storage.prototype.getInstantLock = require('./methods/getInstantLock'); Storage.prototype.importAccounts = require('./methods/importAccounts'); Storage.prototype.importAddress = require('./methods/importAddress'); Storage.prototype.importAddresses = require('./methods/importAddresses'); -Storage.prototype.importBlockHeader = require('./methods/importBlockHeader'); Storage.prototype.importSingleAddress = require('./methods/importSingleAddress'); -Storage.prototype.importChains = require('./methods/importChains'); Storage.prototype.importTransaction = require('./methods/importTransaction'); Storage.prototype.importTransactions = require('./methods/importTransactions'); Storage.prototype.importInstantLock = require('./methods/importInstantLock'); diff --git a/src/types/Storage/Storage.spec.js b/src/types/Storage/Storage.spec.js index 5cfa800ef..f903c85e9 100644 --- a/src/types/Storage/Storage.spec.js +++ b/src/types/Storage/Storage.spec.js @@ -47,17 +47,11 @@ describe('Storage - constructor', function suite() { it('should work on usage', async () => { const storage = new Storage(); await storage.configure(); - await storage.createChain(Dashcore.Networks.testnet); const defaultWalletId = 'squawk7700'; const expectedStore1 = { wallets: {}, transactions: {}, - chains: { - testnet: { - name: 'testnet', blockHeight: -1, blockHash: null, blockHeaders: {}, mappedBlockHeaderHeights: {}, - }, - }, instantLocks: {} }; expect(storage.getStore()).to.deep.equal(expectedStore1); @@ -75,11 +69,6 @@ describe('Storage - constructor', function suite() { }, }, transactions: {}, - chains: { - testnet: { - name: 'testnet', blockHeight: -1, blockHash: null, blockHeaders: {}, mappedBlockHeaderHeights: {}, - }, - }, instantLocks: {}, }; expect(storage.getStore()).to.deep.equal(expectedStore2); diff --git a/src/types/Storage/methods/createChain.js b/src/types/Storage/methods/createChain.js deleted file mode 100644 index 3bebc142e..000000000 --- a/src/types/Storage/methods/createChain.js +++ /dev/null @@ -1,22 +0,0 @@ -const { hasProp } = require('../../../utils'); - -/** - * Create when does not yet exist a chain in the store - * @param network - * @return {boolean} - */ -const createChain = function createChain(network) { - if (!hasProp(this.store.chains, network.toString())) { - this.store.chains[network.toString()] = { - name: network.toString(), - blockHeaders: {}, - // Map a blockheader to it's height (used by searchBlockheader for speed up the process) - mappedBlockHeaderHeights: {}, - blockHeight: -1, - blockHash: null, - }; - return true; - } - return false; -}; -module.exports = createChain; diff --git a/src/types/Storage/methods/createChain.spec.js b/src/types/Storage/methods/createChain.spec.js deleted file mode 100644 index 686ebfb18..000000000 --- a/src/types/Storage/methods/createChain.spec.js +++ /dev/null @@ -1,25 +0,0 @@ -const { expect } = require('chai'); -const createChain = require('./createChain'); - -describe('Storage - createChain', function suite() { - this.timeout(10000); - it('should create a chain', () => { - const self = { - store: { chains: {} }, - }; - const testnet = 'testnet'; - - createChain.call(self, testnet); - - const expected = { - store: { - chains: { - testnet: { - name: 'testnet', blockHeight: -1, blockHash: null, blockHeaders: {}, mappedBlockHeaderHeights: {}, - }, - }, - }, - }; - expect(self).to.be.deep.equal(expected); - }); -}); diff --git a/src/types/Storage/methods/createWallet.js b/src/types/Storage/methods/createWallet.js index 7380cdbc5..15315e0be 100644 --- a/src/types/Storage/methods/createWallet.js +++ b/src/types/Storage/methods/createWallet.js @@ -16,7 +16,6 @@ const createWallet = function createWallet(walletId = 'squawk7700', network = te misc: {}, }, }; - this.createChain(network); return true; } return false; diff --git a/src/types/Storage/methods/exportChains.js b/src/types/Storage/methods/exportChains.js deleted file mode 100644 index 0cef2b28d..000000000 --- a/src/types/Storage/methods/exportChains.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = function exportChains() { - return this.store.chains; -}; diff --git a/src/types/Storage/methods/importBlockHeader.js b/src/types/Storage/methods/importBlockHeader.js deleted file mode 100644 index 36122a4c0..000000000 --- a/src/types/Storage/methods/importBlockHeader.js +++ /dev/null @@ -1,30 +0,0 @@ -const EVENTS = require('../../../EVENTS'); -/** - * This method is used to import a blockheader in Store. - * @param {BlockHeader} blockHeader - A Blockheader - * @param {number} height - */ -const importBlockHeader = function importBlockHeader(blockHeader, height) { - const self = this; - const { store, network } = this; - - const chainStore = store.chains[network]; - const { blockHeight: currentChainHeight } = store.chains[network]; - - if (!chainStore.blockHeaders[blockHeader.hash]) { - if (height) { - if (height > currentChainHeight) { - store.chains[network].blockHeight = height; - store.chains[network].blockHash = blockHeader.hash; - self.announce(EVENTS.BLOCKHEIGHT_CHANGED, store.chains[network].blockHeight); - } - } - const blockHeight = height || currentChainHeight; - - chainStore.blockHeaders[blockHeader.hash] = blockHeader; - chainStore.mappedBlockHeaderHeights[blockHeight] = blockHeader.hash; - - self.announce(EVENTS.BLOCKHEADER, blockHeader); - } -}; -module.exports = importBlockHeader; diff --git a/src/types/Storage/methods/importBlockHeader.spec.js b/src/types/Storage/methods/importBlockHeader.spec.js deleted file mode 100644 index 1ff914c7a..000000000 --- a/src/types/Storage/methods/importBlockHeader.spec.js +++ /dev/null @@ -1,51 +0,0 @@ -const {expect} = require('chai'); -const importBlockHeader = require('./importBlockHeader'); -const {BlockHeader} = require('@dashevo/dashcore-lib'); -const blockheaders = [ - ["000000203ff9cabb94af363861e25efb20af3e3ff3cb4b4d74b058634ed9b681e001000090aeea4d32cc2af0e1581bfa857ec92d576c6a850ba016360495c13e0e71d3939d372060721c021ed1d70000", 440864], - ["00000020716fc387353a10a7fa96313c0c4d2e9961115aa5166b65ab03f787d262000000d2727f82f3c07b3a06cc8ab4ad2b2d2b587c349e84ba038c0780200fb1d1c6ecef372060661b021e06f20000", 440865], - ["000000206bd27ed18629d8248d96abfc35df9f12d4819efb9033bf180867b7efb2010000f3badd5d7a58bda5bf0110faba792e095d25bf7b74c3c30d60e6cf1fd269421342382060701d021eed740000", 440866], - ["000000207c5555e0be42d75dce146ff12191689bba87808eeb6d99b6cf311be3b6010000d3f2ac26c878add6c559b57c7a329c11152faa850002d78c7a2f87af8648c38fc9382060ec18021e5cbb0000", 440867], - ["0000002026b9d8782f5072960e1e3747be751f966a58d07c60907cf50611fb838e0000000125fb982bff2e2051721761e937bacc98879b51263242c866e9b3959d244db591392060ecfc011e1f4d0000", 440868], - ["00000020824f369f4f3ce7bb540eed5b5bf860c52d1b628d22157cc82187912a0a000000863a79e51ff603e374b52e781f70b4a7ebcfa0115c3aa9f9357a00a2224d983dac392060ff0c021e2f000000", 440869], - ["00000020da05110166b7f440315d30715276a94a97fc88373a89b2b832e7d3d5bb010000306704e86b48d66ad28e7fc43aa6d3068d0f64606b383652284ac3b22cb7f052cd392060ec06021ea18f0000", 440870] -] - -const fakeState = { - announce: ()=>{}, - network: 'testnet', store: { - chains: { - 'testnet': { - blockHeaders: {}, - mappedBlockHeaderHeights:{}, - blockHeight: -1, - blockHash: null, - } - } - } -}; -describe('Storage - ImportBlockHeader', () => { - it('should import a blockheader', () => { - importBlockHeader.call(fakeState, new BlockHeader.fromString(blockheaders[1][0]), blockheaders[1][1]); - expect(fakeState.store.chains.testnet.blockHeight).to.deep.equal(440865) - expect(fakeState.store.chains.testnet.blockHash).to.deep.equal('000001b2efb7670818bf3390fb9e81d4129fdf35fcab968d24d82986d17ed26b') - - }); - it('should import multiple blockheaders', function () { - importBlockHeader.call(fakeState, new BlockHeader.fromString(blockheaders[2][0]), blockheaders[2][1]); - importBlockHeader.call(fakeState, new BlockHeader.fromString(blockheaders[3][0]), blockheaders[3][1]); - importBlockHeader.call(fakeState, new BlockHeader.fromString(blockheaders[4][0]), blockheaders[4][1]); - importBlockHeader.call(fakeState, new BlockHeader.fromString(blockheaders[5][0]), blockheaders[5][1]); - importBlockHeader.call(fakeState, new BlockHeader.fromString(blockheaders[6][0]), blockheaders[6][1]); - expect(fakeState.store.chains.testnet.blockHeight).to.deep.equal(440870) - }); - it('should deal with importing a blockheader prior the last', function () { - importBlockHeader.call(fakeState, new BlockHeader.fromString(blockheaders[0][0]), blockheaders[0][1]); - expect(fakeState.store.chains.testnet.blockHeight).to.deep.equal(440870) - expect(fakeState.store.chains.testnet.blockHash).to.deep.equal('0000005a38e319021ffaa1f4d1765d5f5a0e02e78ab488623a897c85240e2ca6') - const hashes = blockheaders.map((el)=> new BlockHeader.fromString(el[0]).hash); - - // Sorting as we added [0] after all the other ones. - expect(Object.keys(fakeState.store.chains.testnet.blockHeaders).sort()).to.deep.equal(hashes.sort()); - }); -}); diff --git a/src/types/Storage/methods/importChains.js b/src/types/Storage/methods/importChains.js deleted file mode 100644 index df1afb978..000000000 --- a/src/types/Storage/methods/importChains.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Import chains to the store - * - * @param {object} chains - * @return {void} - */ -const importChains = function importChains(chains) { - Object.assign(this.store.chains, chains); -}; -module.exports = importChains; diff --git a/src/types/Storage/methods/rehydrateState.js b/src/types/Storage/methods/rehydrateState.js index 839d982ed..dd784bc6e 100644 --- a/src/types/Storage/methods/rehydrateState.js +++ b/src/types/Storage/methods/rehydrateState.js @@ -18,9 +18,6 @@ const rehydrateState = async function rehydrateState() { const wallets = (this.adapter && hasProp(this.adapter, 'getItem')) ? (await this.adapter.getItem('wallets') || this.store.wallets) : this.store.wallets; - const chains = (this.adapter && hasProp(this.adapter, 'getItem')) - ? (await this.adapter.getItem('chains') || this.store.chains) - : this.store.chains; const instantLocks = (this.adapter && hasProp(this.adapter, 'getItem')) ? (await this.adapter.getItem('instantLocks') || this.store.instantLocks) : this.store.instantLocks; @@ -35,7 +32,6 @@ const rehydrateState = async function rehydrateState() { this.store.transactions = mergeHelper(this.store.transactions, transactions); this.store.wallets = mergeHelper(this.store.wallets, wallets); - this.store.chains = mergeHelper(this.store.chains, chains); this.store.instantLocks = mergeHelper(this.store.instantLocks, instantLocks); this.lastRehydrate = +new Date(); this.emit(REHYDRATE_STATE_SUCCESS, { type: REHYDRATE_STATE_SUCCESS, payload: null }); diff --git a/src/types/Storage/methods/saveState.js b/src/types/Storage/methods/saveState.js index 2eb95eab9..99bbcd491 100644 --- a/src/types/Storage/methods/saveState.js +++ b/src/types/Storage/methods/saveState.js @@ -10,7 +10,6 @@ const saveState = async function saveState() { try { await this.adapter.setItem('transactions', { ...self.store.transactions }); await this.adapter.setItem('wallets', { ...self.store.wallets }); - await this.adapter.setItem('chains', { ...self.store.chains }); await this.adapter.setItem('instantLocks', { ...self.store.instantLocks }); this.lastSave = +new Date(); this.emit(SAVE_STATE_SUCCESS, { type: SAVE_STATE_SUCCESS, payload: this.lastSave }); From 7880d447380b8d8edd977aea46bc6ec3c3b25b48 Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Thu, 18 Feb 2021 06:33:42 +0100 Subject: [PATCH 15/26] fix: tests --- fixtures/walletStore.json | 3 ++- src/types/Account/Account.spec.js | 10 ++++---- .../Account/methods/createTransaction.spec.js | 5 +++- src/types/Account/methods/getUTXOS.js | 23 ++++++++++++++----- src/types/Account/methods/getUTXOS.spec.js | 20 ++++++++++++++-- src/types/Storage/Storage.js | 1 - src/types/Storage/Storage.spec.js | 2 +- .../Storage/methods/createWallet.spec.js | 17 ++------------ src/types/Wallet/methods/sweepWallet.spec.js | 6 ++++- 9 files changed, 53 insertions(+), 34 deletions(-) diff --git a/fixtures/walletStore.json b/fixtures/walletStore.json index e6b7ecefb..30fd0de8f 100644 --- a/fixtures/walletStore.json +++ b/fixtures/walletStore.json @@ -9,7 +9,8 @@ "m/44'/1'/0'": { "label": null, "path": "m/44'/1'/0'", - "network": "testnet" + "network": "testnet", + "blockHeight": 0 } }, "network":"testnet", diff --git a/src/types/Account/Account.spec.js b/src/types/Account/Account.spec.js index e7e0fa502..dcc3d8757 100644 --- a/src/types/Account/Account.spec.js +++ b/src/types/Account/Account.spec.js @@ -74,11 +74,9 @@ describe('Account - class', function suite() { it('should forward events', function (done) { const mockWallet = mocks.wallet; const account = new Account(mockWallet, { injectDefaultPlugins: false }); - account.init(mockWallet).then(async ()=>{ - await account.on(EVENTS.BLOCKHEADER, ()=>{ - done(); - }); - }) - + account.on(EVENTS.STARTED, ()=>{ + done(); + }); + account.init(mockWallet); }); }); diff --git a/src/types/Account/methods/createTransaction.spec.js b/src/types/Account/methods/createTransaction.spec.js index 7dedef8c9..76f547aa9 100644 --- a/src/types/Account/methods/createTransaction.spec.js +++ b/src/types/Account/methods/createTransaction.spec.js @@ -24,7 +24,10 @@ describe('Account - createTransaction', function suite() { store: validStore, walletId: 'a3771aaf93', getUTXOS, - network: 'testnet' + network: 'testnet', + index: 0, + walletType: 'hdwallet', + BIP44PATH: "m/44'/1'/0'" }; const mockOpts1 = {}; diff --git a/src/types/Account/methods/getUTXOS.js b/src/types/Account/methods/getUTXOS.js index 8910d1bfa..645d3cc82 100644 --- a/src/types/Account/methods/getUTXOS.js +++ b/src/types/Account/methods/getUTXOS.js @@ -1,4 +1,5 @@ const { Address, Transaction } = require('@dashevo/dashcore-lib'); +const { WALLET_TYPES } = require('../../../CONSTANTS'); /** * Return all the utxos * @return {UnspentOutput[]} @@ -7,15 +8,25 @@ function getUTXOS() { const utxos = []; const self = this; - const { walletId, network, index } = this; - const currentBlockHeight = this.store.wallets[walletId].accounts[index].blockHeight; + const { + walletId, + network, + index, + walletType, + BIP44PATH, + } = this; + const accountKeyIndex = [WALLET_TYPES.HDWALLET, WALLET_TYPES.HDPUBLIC].includes(walletType) + ? BIP44PATH + : index; + + const currentBlockHeight = this.store.wallets[walletId].accounts[accountKeyIndex].blockHeight; /* eslint-disable-next-line no-restricted-syntax */ - for (const walletType in this.store.wallets[walletId].addresses) { - if (walletType && ['external', 'internal', 'misc'].includes(walletType)) { + for (const addressType in this.store.wallets[walletId].addresses) { + if (addressType && ['external', 'internal', 'misc'].includes(addressType)) { /* eslint-disable-next-line no-restricted-syntax */ - for (const path in self.store.wallets[walletId].addresses[walletType]) { + for (const path in self.store.wallets[walletId].addresses[addressType]) { if (path) { - const address = self.store.wallets[walletId].addresses[walletType][path]; + const address = self.store.wallets[walletId].addresses[addressType][path]; /* eslint-disable-next-line no-restricted-syntax */ for (const identifier in address.utxos) { if (identifier) { diff --git a/src/types/Account/methods/getUTXOS.spec.js b/src/types/Account/methods/getUTXOS.spec.js index 5603be7c5..85e2db448 100644 --- a/src/types/Account/methods/getUTXOS.spec.js +++ b/src/types/Account/methods/getUTXOS.spec.js @@ -6,6 +6,11 @@ const { Transaction } = Dashcore; const mockedStoreEmpty = { wallets: { 123456789: { + accounts:{ + "m/44'/1'/0'":{ + blockHeight: 0, + } + }, addresses: {}, }, }, @@ -19,6 +24,11 @@ const mockedStoreEmpty = { const mockedStore2 = { wallets: { 123456789: { + accounts:{ + "m/44'/1'/0'":{ + blockHeight: 10000, + } + }, addresses: { external: { "m/44'/1'/0'/0/0": { @@ -90,7 +100,10 @@ describe('Account - getUTXOS', function suite() { store: mockedStoreEmpty, getStore: mockedStoreEmpty, walletId: '123456789', - network: 'testnet' + network: 'testnet', + index: 0, + walletType: 'hdwallet', + BIP44PATH: "m/44'/1'/0'" }); expect(utxos).to.be.deep.equal([]); @@ -98,7 +111,10 @@ describe('Account - getUTXOS', function suite() { store: mockedStore2, getStore: mockedStore2, walletId: '123456789', - network: 'testnet' + network: 'testnet', + index: 0, + walletType: 'hdwallet', + BIP44PATH: "m/44'/1'/0'" }); expect(utxos2).to.be.deep.equal([new Dashcore.Transaction.UnspentOutput( diff --git a/src/types/Storage/Storage.js b/src/types/Storage/Storage.js index 60759e8dc..f1c4416ba 100644 --- a/src/types/Storage/Storage.js +++ b/src/types/Storage/Storage.js @@ -6,7 +6,6 @@ const CONSTANTS = require('../../CONSTANTS'); const initialStore = { wallets: {}, transactions: {}, - chains: {}, instantLocks: {}, }; // eslint-disable-next-line no-underscore-dangle diff --git a/src/types/Storage/Storage.spec.js b/src/types/Storage/Storage.spec.js index f903c85e9..f2af4cdd9 100644 --- a/src/types/Storage/Storage.spec.js +++ b/src/types/Storage/Storage.spec.js @@ -9,7 +9,7 @@ describe('Storage - constructor', function suite() { this.timeout(10000); it('It should create a storage', () => { const storage = new Storage(); - expect(storage.store).to.deep.equal({ wallets: {}, transactions: {}, chains: {}, instantLocks: {} }); + expect(storage.store).to.deep.equal({ wallets: {}, transactions: {}, instantLocks: {} }); expect(storage.getStore()).to.deep.equal(storage.store); expect(storage.rehydrate).to.equal(true); expect(storage.autosave).to.equal(true); diff --git a/src/types/Storage/methods/createWallet.spec.js b/src/types/Storage/methods/createWallet.spec.js index e02d1b13b..5a530b72a 100644 --- a/src/types/Storage/methods/createWallet.spec.js +++ b/src/types/Storage/methods/createWallet.spec.js @@ -1,14 +1,12 @@ const { expect } = require('chai'); const Dashcore = require('@dashevo/dashcore-lib'); const createWallet = require('./createWallet'); -const createChain = require('./createChain'); describe('Storage - createWallet', function suite() { this.timeout(10000); it('should create a wallet', () => { const self = { - store: { wallets: {}, chains: {} }, - createChain, + store: { wallets: {} }, }; const walletid = '123ae'; @@ -25,18 +23,12 @@ describe('Storage - createWallet', function suite() { addresses: { external: {}, internal: {}, misc: {} }, }, }, - chains: { - testnet: { - name: 'testnet', blockHeight: -1, blockHash: null, blockHeaders: {}, mappedBlockHeaderHeights: {}, - }, - }, }; expect(self.store).to.be.deep.equal(expected); }); it('should create a wallet without any walletId', () => { const self = { - store: { wallets: {}, chains: {} }, - createChain, + store: { wallets: {} }, }; createWallet.call(self); @@ -52,11 +44,6 @@ describe('Storage - createWallet', function suite() { addresses: { external: {}, internal: {}, misc: {} }, }, }, - chains: { - testnet: { - name: 'testnet', blockHeight: -1, blockHash: null, blockHeaders: {}, mappedBlockHeaderHeights: {}, - }, - }, }; expect(self.store).to.be.deep.equal(expected); }); diff --git a/src/types/Wallet/methods/sweepWallet.spec.js b/src/types/Wallet/methods/sweepWallet.spec.js index f1bd71f13..7b7670d70 100644 --- a/src/types/Wallet/methods/sweepWallet.spec.js +++ b/src/types/Wallet/methods/sweepWallet.spec.js @@ -8,7 +8,7 @@ const paperWallet = { }; describe('Wallet - sweepWallet', function suite() { - this.timeout(60000); + this.timeout(900000); let emptyWallet; let emptyAccount; const transportOpts = (process.env.DAPI_SEED) @@ -24,18 +24,22 @@ describe('Wallet - sweepWallet', function suite() { }); emptyAccount = await emptyWallet.getAccount(); + console.log(emptyAccount); }); after(async () => { if (emptyWallet) { + console.log('Disconnect'); await emptyWallet.disconnect(); } }); it('should warn on empty balance', async () => { await emptyAccount.isReady(); + console.log('ISREADY'); const exceptedException = 'Cannot sweep an empty private key (current balance: 0)'; await expectThrowsAsync(async () => await emptyWallet.sweepWallet(), exceptedException); + console.log('WARN DISCONNECT'); await emptyWallet.disconnect(); }); it('should warn on sweep from mnemonic', async () => { From 91de57fa0cff86c1f1268a65e446ec12478aa6d4 Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Mon, 8 Feb 2021 01:21:35 +0100 Subject: [PATCH 16/26] fix: rehydrate state on async setItem --- src/types/Storage/methods/rehydrateState.js | 7 +++++-- src/types/Storage/methods/saveState.js | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/types/Storage/methods/rehydrateState.js b/src/types/Storage/methods/rehydrateState.js index dd784bc6e..9de5b2ec7 100644 --- a/src/types/Storage/methods/rehydrateState.js +++ b/src/types/Storage/methods/rehydrateState.js @@ -1,6 +1,7 @@ const { merge } = require('lodash'); const { InstantLock } = require('@dashevo/dashcore-lib'); const { hasProp } = require('../../../utils'); +const logger = require('../../../logger'); const mergeHelper = (initial = {}, additional = {}) => merge(initial, additional); const { REHYDRATE_STATE_FAILED, REHYDRATE_STATE_SUCCESS } = require('../../../EVENTS'); @@ -12,10 +13,11 @@ const { REHYDRATE_STATE_FAILED, REHYDRATE_STATE_SUCCESS } = require('../../../EV const rehydrateState = async function rehydrateState() { if (this.rehydrate && this.lastRehydrate === null) { try { - const transactions = (this.adapter && hasProp(this.adapter, 'getItem')) + const transactions = (this.adapter && this.adapter.getItem) ? (await this.adapter.getItem('transactions') || this.store.transactions) : this.store.transactions; - const wallets = (this.adapter && hasProp(this.adapter, 'getItem')) + + const wallets = (this.adapter && this.adapter.getItem) ? (await this.adapter.getItem('wallets') || this.store.wallets) : this.store.wallets; const instantLocks = (this.adapter && hasProp(this.adapter, 'getItem')) @@ -34,6 +36,7 @@ const rehydrateState = async function rehydrateState() { this.store.wallets = mergeHelper(this.store.wallets, wallets); this.store.instantLocks = mergeHelper(this.store.instantLocks, instantLocks); this.lastRehydrate = +new Date(); + logger.debug('Storage: rehydrated state.'); this.emit(REHYDRATE_STATE_SUCCESS, { type: REHYDRATE_STATE_SUCCESS, payload: null }); } catch (e) { this.emit(REHYDRATE_STATE_FAILED, { type: REHYDRATE_STATE_FAILED, payload: e }); diff --git a/src/types/Storage/methods/saveState.js b/src/types/Storage/methods/saveState.js index 99bbcd491..d5ee9e191 100644 --- a/src/types/Storage/methods/saveState.js +++ b/src/types/Storage/methods/saveState.js @@ -1,4 +1,5 @@ const { SAVE_STATE_SUCCESS, SAVE_STATE_FAILED } = require('../../../EVENTS'); +const logger = require('../../../logger'); /** * Force persistence of the state to the adapter @@ -12,6 +13,7 @@ const saveState = async function saveState() { await this.adapter.setItem('wallets', { ...self.store.wallets }); await this.adapter.setItem('instantLocks', { ...self.store.instantLocks }); this.lastSave = +new Date(); + logger.debug('Storage: saved state.'); this.emit(SAVE_STATE_SUCCESS, { type: SAVE_STATE_SUCCESS, payload: this.lastSave }); return true; } catch (err) { From dfdc4e5d73dce9cfb428f067d0637c7b66bf2c6a Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Mon, 8 Feb 2021 01:26:08 +0100 Subject: [PATCH 17/26] feat: ensure setting account hash/height triggers saveState --- .../methods/setLastSyncedBlockHash.js | 1 + .../methods/setLastSyncedBlockHeight.js | 1 + 2 files changed, 2 insertions(+) diff --git a/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHash.js b/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHash.js index 893b0a07a..ad4fc8d6e 100644 --- a/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHash.js +++ b/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHash.js @@ -16,5 +16,6 @@ module.exports = function setLastSyncedBlockHash(hash) { accountStore.blockHash = hash; + this.storage.store.lastModified = +new Date(); return accountStore.blockHash; }; diff --git a/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHeight.js b/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHeight.js index eec5dbd8b..3d7b376bb 100644 --- a/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHeight.js +++ b/src/plugins/Workers/TransactionSyncStreamWorker/methods/setLastSyncedBlockHeight.js @@ -16,5 +16,6 @@ module.exports = function setLastSyncedBlockHeight(blockHeight) { accountStore.blockHeight = blockHeight; + this.storage.store.lastModified = +new Date(); return accountStore.blockHeight; }; From d4d3ca4e8637c4db6751339dffd0fc59fa78deb8 Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Mon, 8 Feb 2021 01:30:48 +0100 Subject: [PATCH 18/26] feat: ensure saveState triggered on new block header imported --- .../TransactionSyncStreamWorker/methods/syncUpToTheGapLimit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/Workers/TransactionSyncStreamWorker/methods/syncUpToTheGapLimit.js b/src/plugins/Workers/TransactionSyncStreamWorker/methods/syncUpToTheGapLimit.js index 6c4c24304..a7e5ab60c 100644 --- a/src/plugins/Workers/TransactionSyncStreamWorker/methods/syncUpToTheGapLimit.js +++ b/src/plugins/Workers/TransactionSyncStreamWorker/methods/syncUpToTheGapLimit.js @@ -72,7 +72,7 @@ module.exports = async function syncUpToTheGapLimit({ } }) .on('error', (err) => { - logger.silly('TransactionSyncStreamWorker - end stream on error'); + logger.silly(`TransactionSyncStreamWorker - end stream on error: ${err}`); reject(err); }) .on('end', () => { From b1c7c31a791be3a7f5bd2c3aa915b687ac4f21dc Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Mon, 8 Feb 2021 03:26:45 +0100 Subject: [PATCH 19/26] typo: remove unused util import --- src/types/Storage/methods/rehydrateState.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/types/Storage/methods/rehydrateState.js b/src/types/Storage/methods/rehydrateState.js index 9de5b2ec7..0cbfec28f 100644 --- a/src/types/Storage/methods/rehydrateState.js +++ b/src/types/Storage/methods/rehydrateState.js @@ -1,6 +1,5 @@ const { merge } = require('lodash'); const { InstantLock } = require('@dashevo/dashcore-lib'); -const { hasProp } = require('../../../utils'); const logger = require('../../../logger'); const mergeHelper = (initial = {}, additional = {}) => merge(initial, additional); From 5af95578598659692fcc66a55330b33b4316754e Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Tue, 16 Feb 2021 01:14:34 +0100 Subject: [PATCH 20/26] feat: added adapter abstraction --- docs/_sidebar.md | 1 - docs/storage/configure.md | 16 ----- src/adapters/AbstractAdapter.js | 16 +++++ src/adapters/Adapter.d.ts | 7 +++ src/adapters/InMem.js | 20 ------ .../InMemoryAdapter/InMemoryAdapter.js | 18 ++++++ .../InMemoryAdapter/InMemoryAdapter.spec.js | 19 ++++++ .../InMemoryAdapter/methods/getItem.js | 3 + .../InMemoryAdapter/methods/setItem.js | 4 ++ .../LocalForageAdapter/LocalForageAdapter.js | 16 +++++ .../LocalForageAdapter/methods/getItem.js | 3 + .../LocalForageAdapter/methods/setItem.js | 3 + .../NodeForageAdapter/NodeForageAdapter.js | 16 +++++ .../NodeForageAdapter/methods/getItem.js | 3 + .../NodeForageAdapter/methods/setItem.js | 3 + src/adapters/berkeleyDB.js | 0 src/adapters/createAdapter.js | 29 +++++++++ src/adapters/inMem.spec.js | 19 ------ src/adapters/levelDB.js | 0 src/adapters/localStorage.js | 0 src/adapters/lowDB.js | 0 src/adapters/mongoDB.js | 0 src/adapters/secureStorage.js | 0 src/types/Storage/Storage.js | 15 ++++- src/types/Storage/_configureAdapter.js | 36 ----------- src/types/Storage/_getDefaultAdapter.js | 21 ------- src/types/Storage/methods/configure.js | 25 -------- src/types/Storage/methods/configure.spec.js | 61 ------------------- src/types/Wallet/Wallet.js | 6 +- 29 files changed, 156 insertions(+), 204 deletions(-) delete mode 100644 docs/storage/configure.md create mode 100644 src/adapters/AbstractAdapter.js create mode 100644 src/adapters/Adapter.d.ts delete mode 100644 src/adapters/InMem.js create mode 100644 src/adapters/InMemoryAdapter/InMemoryAdapter.js create mode 100644 src/adapters/InMemoryAdapter/InMemoryAdapter.spec.js create mode 100644 src/adapters/InMemoryAdapter/methods/getItem.js create mode 100644 src/adapters/InMemoryAdapter/methods/setItem.js create mode 100644 src/adapters/LocalForageAdapter/LocalForageAdapter.js create mode 100644 src/adapters/LocalForageAdapter/methods/getItem.js create mode 100644 src/adapters/LocalForageAdapter/methods/setItem.js create mode 100644 src/adapters/NodeForageAdapter/NodeForageAdapter.js create mode 100644 src/adapters/NodeForageAdapter/methods/getItem.js create mode 100644 src/adapters/NodeForageAdapter/methods/setItem.js delete mode 100644 src/adapters/berkeleyDB.js create mode 100644 src/adapters/createAdapter.js delete mode 100644 src/adapters/inMem.spec.js delete mode 100644 src/adapters/levelDB.js delete mode 100644 src/adapters/localStorage.js delete mode 100644 src/adapters/lowDB.js delete mode 100644 src/adapters/mongoDB.js delete mode 100644 src/adapters/secureStorage.js delete mode 100644 src/types/Storage/_configureAdapter.js delete mode 100644 src/types/Storage/_getDefaultAdapter.js delete mode 100644 src/types/Storage/methods/configure.js delete mode 100644 src/types/Storage/methods/configure.spec.js diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 1b48da52c..d79c795cf 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -59,7 +59,6 @@ - [`.announce()`](storage/announce.md) - [`.calculateDuffBalance()`](storage/calculateDuffBalance.md) - [`.clearAll()`](storage/clearAll.md) - - [`.configure()`](storage/configure.md) - [`.createChain()`](storage/createChain.md) - [`.createWallet()`](storage/createWallet.md) - [`.getStore()`](storage/getStore.md) diff --git a/docs/storage/configure.md b/docs/storage/configure.md deleted file mode 100644 index 14bafb76e..000000000 --- a/docs/storage/configure.md +++ /dev/null @@ -1,16 +0,0 @@ -**Usage**: `storage.configure(opts)` -**Description**: After Storage creation, this method is called to ensure Adapter contains expected method. -**Notes**: This is an internal advanced function called on the startup of a Storage. - -Parameters: - -| parameters | type | required | Description | -|------------------------|-------------------|------------------| ------------------------------------------------------------------------| -| **opts.rehydrate** | Boolean | no | Set if the Storage will autoload from the adapter | -| **opts.autosave** | Boolean | no | Set if the Storage will autosave to the adapter | -| **opts.adapter** | Adapter | no | The adapter to test and use. | - - -Returns: void. -Emits: `CONFIGURED` - diff --git a/src/adapters/AbstractAdapter.js b/src/adapters/AbstractAdapter.js new file mode 100644 index 000000000..d06bccb7f --- /dev/null +++ b/src/adapters/AbstractAdapter.js @@ -0,0 +1,16 @@ +const logger = require('../logger'); + +/** + * @abstract + */ +class AbstractAdapter { + constructor(options) { + this.isConfig = false; + } + + config() { + this.isConfig = true; + } +} + +module.exports = AbstractAdapter; diff --git a/src/adapters/Adapter.d.ts b/src/adapters/Adapter.d.ts new file mode 100644 index 000000000..1843e934a --- /dev/null +++ b/src/adapters/Adapter.d.ts @@ -0,0 +1,7 @@ +export declare interface Adapter { + config() + + setItem(key, item): Promise + + getItem(key): Promise +} diff --git a/src/adapters/InMem.js b/src/adapters/InMem.js deleted file mode 100644 index f17cb5606..000000000 --- a/src/adapters/InMem.js +++ /dev/null @@ -1,20 +0,0 @@ -class InMem { - constructor() { - this.isConfig = false; - this.keys = {}; - } - - config() { - this.isConfig = true; - } - - setItem(key, item) { - this.keys[key] = item; - return item; - } - - getItem(key) { - return this.keys[key] || null; - } -} -module.exports = InMem; diff --git a/src/adapters/InMemoryAdapter/InMemoryAdapter.js b/src/adapters/InMemoryAdapter/InMemoryAdapter.js new file mode 100644 index 000000000..12c197849 --- /dev/null +++ b/src/adapters/InMemoryAdapter/InMemoryAdapter.js @@ -0,0 +1,18 @@ +const logger = require('../../logger'); +const AbstractAdapter = require('../AbstractAdapter'); + +/** + * @implements {Adapter} + */ +class InMemoryAdapter extends AbstractAdapter { + constructor() { + super(); + logger.warn('Using InMemoryAdapter. Data will not persist.'); + this.keys = {}; + } +} + +InMemoryAdapter.prototype.setItem = require('./methods/setItem'); +InMemoryAdapter.prototype.getItem = require('./methods/getItem'); + +module.exports = InMemoryAdapter; diff --git a/src/adapters/InMemoryAdapter/InMemoryAdapter.spec.js b/src/adapters/InMemoryAdapter/InMemoryAdapter.spec.js new file mode 100644 index 000000000..068f3f195 --- /dev/null +++ b/src/adapters/InMemoryAdapter/InMemoryAdapter.spec.js @@ -0,0 +1,19 @@ +const { expect } = require('chai'); +const InMemoryAdapter = require('./InMemoryAdapter'); + +const inMemoryAdapter = new InMemoryAdapter(); + +describe('Adapter - InMemoryAdapter', function suite() { + this.timeout(10000); + it('should provide a config method', () => { + expect(inMemoryAdapter.config).to.exist; + }); + it('should set an item', () => { + const item = { item: 'item' }; + expect(inMemoryAdapter.setItem('toto', item)).to.deep.equal(item); + }); + it('should get an item', () => { + const item = { item: 'item' }; + expect(inMemoryAdapter.getItem('toto')).to.deep.equal(item); + }); +}); diff --git a/src/adapters/InMemoryAdapter/methods/getItem.js b/src/adapters/InMemoryAdapter/methods/getItem.js new file mode 100644 index 000000000..a26ed5bbf --- /dev/null +++ b/src/adapters/InMemoryAdapter/methods/getItem.js @@ -0,0 +1,3 @@ +module.exports = async function getItem(key) { + return this.keys[key] || null; +}; diff --git a/src/adapters/InMemoryAdapter/methods/setItem.js b/src/adapters/InMemoryAdapter/methods/setItem.js new file mode 100644 index 000000000..ddd66a32f --- /dev/null +++ b/src/adapters/InMemoryAdapter/methods/setItem.js @@ -0,0 +1,4 @@ +module.exports = async function setItem(key, item) { + this.keys[key] = item; + return item; +}; diff --git a/src/adapters/LocalForageAdapter/LocalForageAdapter.js b/src/adapters/LocalForageAdapter/LocalForageAdapter.js new file mode 100644 index 000000000..bc498a910 --- /dev/null +++ b/src/adapters/LocalForageAdapter/LocalForageAdapter.js @@ -0,0 +1,16 @@ +const AbstractAdapter = require('../AbstractAdapter'); + +/** + * @implements {Adapter} + */ +class LocalForageAdapter extends AbstractAdapter { + constructor(adapter) { + super(); + this.adapter = adapter; + } +} + +LocalForageAdapter.prototype.setItem = require('./methods/setItem'); +LocalForageAdapter.prototype.getItem = require('./methods/getItem'); + +module.exports = LocalForageAdapter; diff --git a/src/adapters/LocalForageAdapter/methods/getItem.js b/src/adapters/LocalForageAdapter/methods/getItem.js new file mode 100644 index 000000000..6ca44ac4c --- /dev/null +++ b/src/adapters/LocalForageAdapter/methods/getItem.js @@ -0,0 +1,3 @@ +module.exports = async function getItem(key) { + return this.adapter.getItem(key); +}; diff --git a/src/adapters/LocalForageAdapter/methods/setItem.js b/src/adapters/LocalForageAdapter/methods/setItem.js new file mode 100644 index 000000000..d4ddcc2d5 --- /dev/null +++ b/src/adapters/LocalForageAdapter/methods/setItem.js @@ -0,0 +1,3 @@ +module.exports = async function setItem(key, value) { + return this.adapter.setItem(key, value); +}; diff --git a/src/adapters/NodeForageAdapter/NodeForageAdapter.js b/src/adapters/NodeForageAdapter/NodeForageAdapter.js new file mode 100644 index 000000000..4e9fd6568 --- /dev/null +++ b/src/adapters/NodeForageAdapter/NodeForageAdapter.js @@ -0,0 +1,16 @@ +const AbstractAdapter = require('../AbstractAdapter'); + +/** + * @implements {Adapter} + */ +class NodeForageAdapter extends AbstractAdapter { + constructor(adapter) { + super(); + this.adapter = adapter; + } +} + +NodeForageAdapter.prototype.setItem = require('./methods/setItem'); +NodeForageAdapter.prototype.getItem = require('./methods/getItem'); + +module.exports = NodeForageAdapter; diff --git a/src/adapters/NodeForageAdapter/methods/getItem.js b/src/adapters/NodeForageAdapter/methods/getItem.js new file mode 100644 index 000000000..6ca44ac4c --- /dev/null +++ b/src/adapters/NodeForageAdapter/methods/getItem.js @@ -0,0 +1,3 @@ +module.exports = async function getItem(key) { + return this.adapter.getItem(key); +}; diff --git a/src/adapters/NodeForageAdapter/methods/setItem.js b/src/adapters/NodeForageAdapter/methods/setItem.js new file mode 100644 index 000000000..d4ddcc2d5 --- /dev/null +++ b/src/adapters/NodeForageAdapter/methods/setItem.js @@ -0,0 +1,3 @@ +module.exports = async function setItem(key, value) { + return this.adapter.setItem(key, value); +}; diff --git a/src/adapters/berkeleyDB.js b/src/adapters/berkeleyDB.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/adapters/createAdapter.js b/src/adapters/createAdapter.js new file mode 100644 index 000000000..97970db21 --- /dev/null +++ b/src/adapters/createAdapter.js @@ -0,0 +1,29 @@ +const InMemoryAdapter = require('./InMemoryAdapter/InMemoryAdapter'); +const LocalForageAdapter = require('./LocalForageAdapter/LocalForageAdapter'); +const NodeForageAdapter = require('./NodeForageAdapter/NodeForageAdapter'); + +const SUPPORTED_ADAPTERS = { + LocalForage: 'LocalForage', + NodeForage: 'NodeForage', +}; +/** + * + * @param {{adapter, name}} options + * @returns {Adapter} + */ +function createAdapter(options) { + console.log(options); + if (options && options.name && options.adapter) { + switch (options.name) { + case SUPPORTED_ADAPTERS.NodeForage: + return new NodeForageAdapter(options.adapter); + case SUPPORTED_ADAPTERS.LocalForage: + return new LocalForageAdapter(options.adapter); + default: + return new InMemoryAdapter(); + } + } + return new InMemoryAdapter(); +} + +module.exports = createAdapter; diff --git a/src/adapters/inMem.spec.js b/src/adapters/inMem.spec.js deleted file mode 100644 index 122a74421..000000000 --- a/src/adapters/inMem.spec.js +++ /dev/null @@ -1,19 +0,0 @@ -const { expect } = require('chai'); -const InMem = require('./InMem'); - -const inMem = new InMem(); - -describe('Adapter - inMem', function suite() { - this.timeout(10000); - it('should provide a config method', () => { - expect(inMem.config).to.exist; - }); - it('should set an item', () => { - const item = { item: 'item' }; - expect(inMem.setItem('toto', item)).to.deep.equal(item); - }); - it('should get an item', () => { - const item = { item: 'item' }; - expect(inMem.getItem('toto')).to.deep.equal(item); - }); -}); diff --git a/src/adapters/levelDB.js b/src/adapters/levelDB.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/adapters/localStorage.js b/src/adapters/localStorage.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/adapters/lowDB.js b/src/adapters/lowDB.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/adapters/mongoDB.js b/src/adapters/mongoDB.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/adapters/secureStorage.js b/src/adapters/secureStorage.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/types/Storage/Storage.js b/src/types/Storage/Storage.js index f1c4416ba..df39559c1 100644 --- a/src/types/Storage/Storage.js +++ b/src/types/Storage/Storage.js @@ -37,15 +37,28 @@ class Storage extends EventEmitter { this.lastModified = null; this.network = has(opts, 'network') ? opts.network.toString() : defaultOpts.network; + this.adapter = opts.adapter; + // // Map an address to it's walletid/path/type schema (used by searchAddress for speedup) this.mappedAddress = {}; + + this.prepare(); + } + + async prepare() { + if (this.rehydrate) { + await this.rehydrateState(); + } + + if (this.autosave) { + this.startWorker(); + } } } Storage.prototype.addNewTxToAddress = require('./methods/addNewTxToAddress'); Storage.prototype.announce = require('./methods/announce'); Storage.prototype.calculateDuffBalance = require('./methods/calculateDuffBalance'); Storage.prototype.clearAll = require('./methods/clearAll'); -Storage.prototype.configure = require('./methods/configure'); Storage.prototype.createAccount = require('./methods/createAccount'); Storage.prototype.createSingleAddress = require('./methods/createSingleAddress'); Storage.prototype.createWallet = require('./methods/createWallet'); diff --git a/src/types/Storage/_configureAdapter.js b/src/types/Storage/_configureAdapter.js deleted file mode 100644 index 98c5f639b..000000000 --- a/src/types/Storage/_configureAdapter.js +++ /dev/null @@ -1,36 +0,0 @@ -const { InvalidStorageAdapter } = require('../../errors'); - -module.exports = async function configureAdapter(argAdapter) { - let adapter; - if (!argAdapter) throw new Error('Expected an adapter to configure'); - const argAdapterContructorName = argAdapter.constructor.name; - - // In case of an adapter being a function, we assume it being a class non instanciated - if (argAdapterContructorName === 'Function') { - // eslint-disable-next-line new-cap - adapter = new argAdapter(); - if (adapter.config) { - try { - await adapter.config({ name: 'dashevo-wallet-lib' }); - } catch (e) { - throw new Error(`Tried to config the adapter. Failed with reason ${e.message}`); - } - } else if (adapter.createInstance) await adapter.createInstance({ name: 'dashevo-wallet-lib' }); - } else if (argAdapterContructorName === 'Object') { - if (argAdapter.createInstance) throw new Error('Adapter instance not created'); - adapter = argAdapter; - } else { - // Instance of specific class - adapter = argAdapter; - } - // Testing the storage - if (!adapter.getItem || !adapter.setItem) { - throw new InvalidStorageAdapter('expected getItem/setItem methods'); - } - try { - await adapter.getItem('dummy'); - } catch (e) { - throw new InvalidStorageAdapter(e.message); - } - return adapter; -}; diff --git a/src/types/Storage/_getDefaultAdapter.js b/src/types/Storage/_getDefaultAdapter.js deleted file mode 100644 index bfc4bfe7d..000000000 --- a/src/types/Storage/_getDefaultAdapter.js +++ /dev/null @@ -1,21 +0,0 @@ -const logger = require('../../logger'); -const InMem = require('../../adapters/InMem'); - -module.exports = async function getDefaultAdapter() { - const isBrowser = (typeof document !== 'undefined'); - // eslint-disable-next-line no-undef - const isReactNative = (typeof navigator !== 'undefined' && navigator.product === 'ReactNative'); - const isNode = !isBrowser && !isReactNative; - - if (isNode) { - logger.warn('Running on a NodeJS env without any specified adapter. Data will not persist.'); - return InMem; - } - if (isReactNative) { - logger.warn('Running on a React Native env without any specified adapter. Data will not persist.'); - return InMem; - } if (isBrowser) { - return InMem; - } - throw new Error('Undetected platform - No default adapter to persist data to.'); -}; diff --git a/src/types/Storage/methods/configure.js b/src/types/Storage/methods/configure.js deleted file mode 100644 index 06a77883c..000000000 --- a/src/types/Storage/methods/configure.js +++ /dev/null @@ -1,25 +0,0 @@ -const { has } = require('lodash'); -const configureAdapter = require('../_configureAdapter.js'); -const getDefaultAdapter = require('../_getDefaultAdapter.js'); -const { CONFIGURED } = require('../../../EVENTS'); - -/** - * To be called after instantialization as it contains all the async logic / test of adapters - * @param opts - * @return {Promise} - */ -module.exports = async function configure(opts = {}) { - this.rehydrate = has(opts, 'rehydrate') ? opts.rehydrate : this.rehydrate; - this.autosave = has(opts, 'autosave') ? opts.autosave : this.autosave; - this.adapter = await configureAdapter((opts.adapter) ? opts.adapter : await getDefaultAdapter()); - - if (this.rehydrate) { - await this.rehydrateState(); - } - - if (this.autosave) { - this.startWorker(); - } - - this.emit(CONFIGURED, { type: CONFIGURED, payload: null }); -}; diff --git a/src/types/Storage/methods/configure.spec.js b/src/types/Storage/methods/configure.spec.js deleted file mode 100644 index 186f5adc4..000000000 --- a/src/types/Storage/methods/configure.spec.js +++ /dev/null @@ -1,61 +0,0 @@ -const { expect } = require('chai'); -const configure = require('./configure'); - -const noop = () => {}; - -describe('Storage - configure', async function suite() { - this.timeout(10000); - it('should set save/rehydrate settings', () => { - let rehydrated = 0; - - const self = { - emit: noop, - autosaveIntervalTime: 1000, - startWorker: noop, - rehydrateState: () => (rehydrated += 1), - rehydrate: true, - autosave: true, - }; - expect(rehydrated).to.equal(0); - return configure - .call(self) - .then(() => expect(self.autosave).to.equal(true)) - .then(() => expect(self.rehydrate).to.equal(true)) - .then(() => expect(rehydrated).to.equal(1)) - .then(() => configure - .call(self, { rehydrate: false, autosave: false }) - .then(() => expect(self.autosave).to.equal(false)) - .then(() => expect(self.rehydrate).to.equal(false)) - .then(() => expect(rehydrated).to.equal(1))); - }); - it('should successfully emit', () => { - const emitted = []; - const self = { - emit: (emitType) => (emitted.push(emitType)), - autosaveIntervalTime: 1000, - startWorker: noop, - }; - expect(emitted.length).to.equal(0); - - return configure - .call(self) - .then(() => expect(emitted).to.deep.equal(['CONFIGURED'])); - }); - it('should start the autosave worker if autosave is true', () => { - let workerStarted = false; - const self = { - rehydrate: false, - autosave: false, - autosaveIntervalTime: 1000, - startWorker: () => { workerStarted = true; }, - emit: noop, - }; - - return configure - .call(self) - .then(() => expect(workerStarted).to.equal(false)) - .then(() => configure - .call(self, { autosave: true }) - .then(() => expect(workerStarted).to.equal(true))); - }); -}); diff --git a/src/types/Wallet/Wallet.js b/src/types/Wallet/Wallet.js index 96e2f8e17..04ff3b99f 100644 --- a/src/types/Wallet/Wallet.js +++ b/src/types/Wallet/Wallet.js @@ -24,6 +24,7 @@ const fromHDPublicKey = require('./methods/fromHDPublicKey'); const fromHDPrivateKey = require('./methods/fromHDPrivateKey'); const generateNewWalletId = require('./methods/generateNewWalletId'); +const createAdapter = require('../../adapters/createAdapter'); const createTransportFromOptions = require('../../transport/createTransportFromOptions'); /** @@ -94,10 +95,7 @@ class Wallet { rehydrate: true, autosave: true, network, - }); - - this.storage.configure({ - adapter: opts.adapter, + adapter: createAdapter(opts.adapter), }); this.store = this.storage.store; From 1cb7523f5e72367b364ad40bb9c996acb8d24296 Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Wed, 17 Feb 2021 20:43:02 +0100 Subject: [PATCH 21/26] feat: AbstractAdapter param --- src/adapters/AbstractAdapter.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/adapters/AbstractAdapter.js b/src/adapters/AbstractAdapter.js index d06bccb7f..e416bf6bf 100644 --- a/src/adapters/AbstractAdapter.js +++ b/src/adapters/AbstractAdapter.js @@ -1,11 +1,10 @@ -const logger = require('../logger'); - /** * @abstract */ class AbstractAdapter { - constructor(options) { + constructor(adapter) { this.isConfig = false; + this.adapter = adapter; } config() { From 1bcf2a7b935e964fbbfd040f156371b6999e1075 Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Thu, 18 Feb 2021 01:23:45 +0100 Subject: [PATCH 22/26] tests: adjust test with change --- .../InMemoryAdapter/InMemoryAdapter.spec.js | 5 +++-- src/adapters/InMemoryAdapter/methods/getItem.js | 2 +- src/adapters/InMemoryAdapter/methods/setItem.js | 2 +- src/adapters/createAdapter.js | 1 - src/types/Account/Account.spec.js | 14 +++++++++++--- src/types/Storage/Storage.js | 2 -- src/types/Wallet/Wallet.js | 1 + src/types/Wallet/Wallet.spec.js | 4 ++-- 8 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/adapters/InMemoryAdapter/InMemoryAdapter.spec.js b/src/adapters/InMemoryAdapter/InMemoryAdapter.spec.js index 068f3f195..03fa4a6f7 100644 --- a/src/adapters/InMemoryAdapter/InMemoryAdapter.spec.js +++ b/src/adapters/InMemoryAdapter/InMemoryAdapter.spec.js @@ -10,10 +10,11 @@ describe('Adapter - InMemoryAdapter', function suite() { }); it('should set an item', () => { const item = { item: 'item' }; - expect(inMemoryAdapter.setItem('toto', item)).to.deep.equal(item); + inMemoryAdapter.setItem('foo', item); + expect(inMemoryAdapter.setItem('foo', item)).to.deep.equal(item); }); it('should get an item', () => { const item = { item: 'item' }; - expect(inMemoryAdapter.getItem('toto')).to.deep.equal(item); + expect(inMemoryAdapter.getItem('foo')).to.deep.equal(item); }); }); diff --git a/src/adapters/InMemoryAdapter/methods/getItem.js b/src/adapters/InMemoryAdapter/methods/getItem.js index a26ed5bbf..bd7e460e2 100644 --- a/src/adapters/InMemoryAdapter/methods/getItem.js +++ b/src/adapters/InMemoryAdapter/methods/getItem.js @@ -1,3 +1,3 @@ -module.exports = async function getItem(key) { +module.exports = function getItem(key) { return this.keys[key] || null; }; diff --git a/src/adapters/InMemoryAdapter/methods/setItem.js b/src/adapters/InMemoryAdapter/methods/setItem.js index ddd66a32f..3a0dbaac7 100644 --- a/src/adapters/InMemoryAdapter/methods/setItem.js +++ b/src/adapters/InMemoryAdapter/methods/setItem.js @@ -1,4 +1,4 @@ -module.exports = async function setItem(key, item) { +module.exports = function setItem(key, item) { this.keys[key] = item; return item; }; diff --git a/src/adapters/createAdapter.js b/src/adapters/createAdapter.js index 97970db21..0048c8284 100644 --- a/src/adapters/createAdapter.js +++ b/src/adapters/createAdapter.js @@ -12,7 +12,6 @@ const SUPPORTED_ADAPTERS = { * @returns {Adapter} */ function createAdapter(options) { - console.log(options); if (options && options.name && options.adapter) { switch (options.name) { case SUPPORTED_ADAPTERS.NodeForage: diff --git a/src/types/Account/Account.spec.js b/src/types/Account/Account.spec.js index dcc3d8757..26079a01e 100644 --- a/src/types/Account/Account.spec.js +++ b/src/types/Account/Account.spec.js @@ -2,10 +2,18 @@ const { expect } = require('chai'); const Dashcore = require('@dashevo/dashcore-lib'); const { Account, EVENTS } = require('../../index'); const EventEmitter = require('events'); -const inMem = require('../../adapters/InMem'); - +const InMemoryAdapter = require('../../adapters/InMemoryAdapter/InMemoryAdapter'); +const blockHeader = new Dashcore.BlockHeader.fromObject({ + hash: '00000ac3a0c9df709260e41290d6902e5a4a073099f11fe8c1ce80aadc4bb331', + version: 2, + prevHash: '00000ce430de949c85a145b02e33ebbaed3772dc8f3d668f66edc6852c24d002', + merkleRoot: '663360403b5fba9cd8744c3706f9660c7d3fee4e5a9ee98ce0ad5e5ad7824c1d', + time: 1398712821, + bits: 504365040, + nonce: 312363 +}); const mocks = { - adapter: inMem, + adapter: new InMemoryAdapter(), offlineMode: true, }; diff --git a/src/types/Storage/Storage.js b/src/types/Storage/Storage.js index df39559c1..cb8fdce6c 100644 --- a/src/types/Storage/Storage.js +++ b/src/types/Storage/Storage.js @@ -41,8 +41,6 @@ class Storage extends EventEmitter { // // Map an address to it's walletid/path/type schema (used by searchAddress for speedup) this.mappedAddress = {}; - - this.prepare(); } async prepare() { diff --git a/src/types/Wallet/Wallet.js b/src/types/Wallet/Wallet.js index 04ff3b99f..b231dd9f4 100644 --- a/src/types/Wallet/Wallet.js +++ b/src/types/Wallet/Wallet.js @@ -97,6 +97,7 @@ class Wallet { network, adapter: createAdapter(opts.adapter), }); + this.storage.prepare(); this.store = this.storage.store; diff --git a/src/types/Wallet/Wallet.spec.js b/src/types/Wallet/Wallet.spec.js index 59fdf6b6e..eff097f2e 100644 --- a/src/types/Wallet/Wallet.spec.js +++ b/src/types/Wallet/Wallet.spec.js @@ -6,12 +6,12 @@ const fluidMnemonic = require('../../../fixtures/fluidDepth'); const cR4t6ePrivateKey = require('../../../fixtures/cR4t6e_pk'); const { WALLET_TYPES } = require('../../CONSTANTS'); const { Wallet } = require('../../index'); -const inMem = require('../../adapters/InMem'); +const InMemoryAdapter = require('../../adapters/InMemoryAdapter/InMemoryAdapter'); const fromHDPublicKey = require('./methods/fromHDPublicKey'); const gatherSail = require('../../../fixtures/gathersail'); const mocks = { - adapter: inMem, + adapter: new InMemoryAdapter(), offlineMode: true, }; describe('Wallet - class', function suite() { From 0b37bb6a5c3f6ddb57631c679d63355050d035d4 Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Thu, 18 Feb 2021 04:20:46 +0100 Subject: [PATCH 23/26] feat: modify storage worker logic --- src/types/Storage/Storage.js | 10 +++++--- src/types/Storage/Storage.spec.js | 13 +++++----- .../Storage/methods/importAccounts.spec.js | 5 ++-- src/types/Storage/methods/startWorker.js | 24 +++++++++++++++---- src/types/Storage/methods/startWorker.spec.js | 15 ++++-------- src/types/Storage/methods/stopWorker.js | 5 ++-- src/types/Wallet/Wallet.spec.js | 8 ++----- 7 files changed, 44 insertions(+), 36 deletions(-) diff --git a/src/types/Storage/Storage.js b/src/types/Storage/Storage.js index cb8fdce6c..30d42deca 100644 --- a/src/types/Storage/Storage.js +++ b/src/types/Storage/Storage.js @@ -1,8 +1,8 @@ const EventEmitter = require('events'); const { cloneDeep, has } = require('lodash'); - +const createAdapter = require('../../adapters/createAdapter'); const CONSTANTS = require('../../CONSTANTS'); - +const { CONFIGURED } = require('../../EVENTS'); const initialStore = { wallets: {}, transactions: {}, @@ -37,10 +37,12 @@ class Storage extends EventEmitter { this.lastModified = null; this.network = has(opts, 'network') ? opts.network.toString() : defaultOpts.network; - this.adapter = opts.adapter; + this.adapter = opts.adapter || createAdapter(); // // Map an address to it's walletid/path/type schema (used by searchAddress for speedup) this.mappedAddress = {}; + + this.isStopped = true; } async prepare() { @@ -51,6 +53,8 @@ class Storage extends EventEmitter { if (this.autosave) { this.startWorker(); } + + this.emit(CONFIGURED, { type: CONFIGURED, payload: null }) } } Storage.prototype.addNewTxToAddress = require('./methods/addNewTxToAddress'); diff --git a/src/types/Storage/Storage.spec.js b/src/types/Storage/Storage.spec.js index f2af4cdd9..c31292981 100644 --- a/src/types/Storage/Storage.spec.js +++ b/src/types/Storage/Storage.spec.js @@ -22,9 +22,9 @@ describe('Storage - constructor', function suite() { const storage = new Storage(); let configuredEvent = false; storage.on(CONFIGURED, () => configuredEvent = true); - await storage.configure(); expect(storage.adapter).to.exist; - expect(storage.adapter.constructor.name).to.equal('InMem'); + expect(storage.adapter.constructor.name).to.equal('InMemoryAdapter'); + await storage.prepare(); expect(configuredEvent).to.equal(true); storage.stopWorker(); }); @@ -34,10 +34,10 @@ describe('Storage - constructor', function suite() { this.skip('LocalForage is a valid adapter on browser') return; } - const expectedException1 = 'Invalid Storage Adapter : No available storage method found.'; + const expectedException1 = 'No available storage method found.'; const storageOpts1 = { adapter: localForage }; - const storage = new Storage(); - return storage.configure(storageOpts1).then( + const storage = new Storage(storageOpts1); + return storage.prepare().then( () => Promise.reject(new Error('Expected method to reject.')), (err) => expect(err).to.be.a('Error').with.property('message', expectedException1), ).then(() => { @@ -46,7 +46,8 @@ describe('Storage - constructor', function suite() { }); it('should work on usage', async () => { const storage = new Storage(); - await storage.configure(); + await storage.prepare(); + await storage.createChain(Dashcore.Networks.testnet); const defaultWalletId = 'squawk7700'; const expectedStore1 = { diff --git a/src/types/Storage/methods/importAccounts.spec.js b/src/types/Storage/methods/importAccounts.spec.js index 361f8cfba..a5802368c 100644 --- a/src/types/Storage/methods/importAccounts.spec.js +++ b/src/types/Storage/methods/importAccounts.spec.js @@ -34,10 +34,11 @@ describe('Storage - importAccounts', async function suite() { done(); }); }); + wallet.storage.prepare(); }); it('should import an account', (done) => { const wallet = new Wallet({ offlineMode: true }); - wallet.storage.on('CONFIGURED', () => { + wallet.storage.prepare().then(() => { wallet.getAccount().then((acc)=>{ let called = 0; @@ -56,7 +57,7 @@ describe('Storage - importAccounts', async function suite() { wallet.disconnect(); acc.disconnect(); done(); - }, 50); + }, 150); }) }); }); diff --git a/src/types/Storage/methods/startWorker.js b/src/types/Storage/methods/startWorker.js index 4976c0ebc..a06cef226 100644 --- a/src/types/Storage/methods/startWorker.js +++ b/src/types/Storage/methods/startWorker.js @@ -1,11 +1,25 @@ +const processStep = (self) => { + if (self.lastModified > self.lastSave) { + self.saveState(); + } +}; +const stepExecutor = (self) => { + if (!self.isStopped) { + processStep(self); + setTimeout(() => { + stepExecutor(self); + }, self.autosaveIntervalTime); + } +}; /** * Allow to start the working interval (worker for saving state). * @return {void} */ module.exports = function startWorker() { - this.interval = setInterval(() => { - if (this.lastModified > this.lastSave) { - this.saveState(); - } - }, this.autosaveIntervalTime); + this.isStopped = false; + const self = this; + + setTimeout(() => { + stepExecutor(self); + }, self.autosaveIntervalTime); }; diff --git a/src/types/Storage/methods/startWorker.spec.js b/src/types/Storage/methods/startWorker.spec.js index 0711f4094..0fc9f427e 100644 --- a/src/types/Storage/methods/startWorker.spec.js +++ b/src/types/Storage/methods/startWorker.spec.js @@ -16,15 +16,9 @@ describe('Storage - startWorker', function suite() { autosaveIntervalTime: defaultIntervalValue, }; startWorker.call(self); - if (process.browser){ - this.skip('doesn\'t work in browser') - // Need to clear to not hang-on forever - clearInterval(self.interval); - return; - } - expect(self.interval.constructor.name).to.be.equal('Timeout'); - expect(self.interval._repeat).to.be.equal(defaultIntervalValue); // Timeout are null btw - clearInterval(self.interval); + expect(self.isStopped).to.be.equal(false); + expect(self.autosaveIntervalTime).to.be.equal(defaultIntervalValue); + self.isStopped = true; }); it('should work', async () => new Promise((res) => { let saved = 0; @@ -39,9 +33,8 @@ describe('Storage - startWorker', function suite() { }; startWorker.call(self); simulateChangeEvery.call(self, 200); - setTimeout(() => { - clearInterval(self.interval); + self.isStopped = true; testInterval = clearInterval(testInterval); expect(saved < 11).to.be.equal(true); diff --git a/src/types/Storage/methods/stopWorker.js b/src/types/Storage/methods/stopWorker.js index f0aa66903..1d5f2940c 100644 --- a/src/types/Storage/methods/stopWorker.js +++ b/src/types/Storage/methods/stopWorker.js @@ -1,9 +1,8 @@ /** - * Allow to clear the working interval (worker). + * Allow to stop the Storage executor (worker). * @return {boolean} */ module.exports = function stopWorker() { - clearInterval(this.interval); - this.interval = null; + this.isStopped = true; return true; }; diff --git a/src/types/Wallet/Wallet.spec.js b/src/types/Wallet/Wallet.spec.js index eff097f2e..6aa81b349 100644 --- a/src/types/Wallet/Wallet.spec.js +++ b/src/types/Wallet/Wallet.spec.js @@ -35,12 +35,8 @@ describe('Wallet - class', function suite() { expect(Dashcore.Mnemonic(wallet2.mnemonic).toString()).to.be.equal(wallet2.mnemonic); expect(wallet2.mnemonic).to.be.not.equal(wallet1.mnemonic); expect(wallet2.network).to.be.deep.equal(Dashcore.Networks.testnet.toString()); - wallet1.storage.on('CONFIGURED', () => { - wallet1.disconnect(); - }); - wallet2.storage.on('CONFIGURED', () => { - wallet2.disconnect(); - }); + wallet1.disconnect(); + wallet2.disconnect(); }); it('should create a wallet with mnemonic', () => { const wallet1 = new Wallet({ mnemonic: knifeMnemonic.mnemonic, ...mocks }); From 0e6a64ece025a3c85415ac6b34cf861152d97665 Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Thu, 18 Feb 2021 04:38:44 +0100 Subject: [PATCH 24/26] fix: eslint --- src/types/Storage/Storage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types/Storage/Storage.js b/src/types/Storage/Storage.js index 30d42deca..d13895b84 100644 --- a/src/types/Storage/Storage.js +++ b/src/types/Storage/Storage.js @@ -54,7 +54,7 @@ class Storage extends EventEmitter { this.startWorker(); } - this.emit(CONFIGURED, { type: CONFIGURED, payload: null }) + this.emit(CONFIGURED, { type: CONFIGURED, payload: null }); } } Storage.prototype.addNewTxToAddress = require('./methods/addNewTxToAddress'); From 83e2dd1c492d71e33d8366a578125cded865cd4e Mon Sep 17 00:00:00 2001 From: Alex Werner Date: Thu, 18 Feb 2021 06:43:09 +0100 Subject: [PATCH 25/26] fix: rebase issue --- src/types/Storage/Storage.spec.js | 1 - src/types/Storage/methods/rehydrateState.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/types/Storage/Storage.spec.js b/src/types/Storage/Storage.spec.js index c31292981..97ec76ada 100644 --- a/src/types/Storage/Storage.spec.js +++ b/src/types/Storage/Storage.spec.js @@ -47,7 +47,6 @@ describe('Storage - constructor', function suite() { it('should work on usage', async () => { const storage = new Storage(); await storage.prepare(); - await storage.createChain(Dashcore.Networks.testnet); const defaultWalletId = 'squawk7700'; const expectedStore1 = { diff --git a/src/types/Storage/methods/rehydrateState.js b/src/types/Storage/methods/rehydrateState.js index 0cbfec28f..f880f1b7a 100644 --- a/src/types/Storage/methods/rehydrateState.js +++ b/src/types/Storage/methods/rehydrateState.js @@ -19,7 +19,7 @@ const rehydrateState = async function rehydrateState() { const wallets = (this.adapter && this.adapter.getItem) ? (await this.adapter.getItem('wallets') || this.store.wallets) : this.store.wallets; - const instantLocks = (this.adapter && hasProp(this.adapter, 'getItem')) + const instantLocks = (this.adapter && this.adapter.getItem) ? (await this.adapter.getItem('instantLocks') || this.store.instantLocks) : this.store.instantLocks; From d0e0cf7c45da55f5dab328e21b86b3d4697005e9 Mon Sep 17 00:00:00 2001 From: Konstantin Shuplenkov Date: Tue, 26 Oct 2021 19:09:38 +0300 Subject: [PATCH 26/26] chore: merge with 0.22.0-dev --- src/types/Account/_initializeAccount.js | 2 -- src/types/Account/_sortPlugins.js | 2 -- src/types/Storage/methods/rehydrateState.js | 3 --- 3 files changed, 7 deletions(-) diff --git a/src/types/Account/_initializeAccount.js b/src/types/Account/_initializeAccount.js index 07f23292e..858e74883 100644 --- a/src/types/Account/_initializeAccount.js +++ b/src/types/Account/_initializeAccount.js @@ -1,6 +1,4 @@ const logger = require('../../logger'); -const TransactionSyncStreamWorker = require('../../plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker'); -const IdentitySyncWorker = require('../../plugins/Workers/IdentitySyncWorker'); const EVENTS = require('../../EVENTS'); const { WALLET_TYPES } = require('../../CONSTANTS'); const preparePlugins = require('./_preparePlugins'); diff --git a/src/types/Account/_sortPlugins.js b/src/types/Account/_sortPlugins.js index ab7115a40..494b16a23 100644 --- a/src/types/Account/_sortPlugins.js +++ b/src/types/Account/_sortPlugins.js @@ -1,6 +1,5 @@ const { each, findIndex } = require('lodash'); const TransactionSyncStreamWorker = require('../../plugins/Workers/TransactionSyncStreamWorker/TransactionSyncStreamWorker'); -const ChainPlugin = require('../../plugins/Plugins/ChainPlugin'); const IdentitySyncWorker = require('../../plugins/Workers/IdentitySyncWorker'); const { WALLET_TYPES } = require('../../CONSTANTS'); @@ -127,7 +126,6 @@ const sortPlugins = (account, userUnsafePlugins) => { // eslint-disable-next-line no-async-promise-executor if (account.injectDefaultPlugins) { if (!account.offlineMode) { - plugins.push([ChainPlugin, true, true]); plugins.push([TransactionSyncStreamWorker, true, true]); if (account.walletType === WALLET_TYPES.HDWALLET) { diff --git a/src/types/Storage/methods/rehydrateState.js b/src/types/Storage/methods/rehydrateState.js index 45b64ce4c..bb4b16b94 100644 --- a/src/types/Storage/methods/rehydrateState.js +++ b/src/types/Storage/methods/rehydrateState.js @@ -19,9 +19,6 @@ const rehydrateState = async function rehydrateState() { const wallets = (this.adapter && hasMethod(this.adapter, 'getItem')) ? (await this.adapter.getItem('wallets') || this.store.wallets) : this.store.wallets; - const chains = (this.adapter && hasMethod(this.adapter, 'getItem')) - ? (await this.adapter.getItem('chains') || this.store.chains) - : this.store.chains; const instantLocks = (this.adapter && hasMethod(this.adapter, 'getItem')) ? (await this.adapter.getItem('instantLocks') || this.store.instantLocks) : this.store.instantLocks;