Page MenuHomePhabricator

D15612.id45875.diff
No OneTemporary

D15612.id45875.diff

diff --git a/cashtab/src/components/__tests__/App.test.js b/cashtab/src/components/__tests__/App.test.js
--- a/cashtab/src/components/__tests__/App.test.js
+++ b/cashtab/src/components/__tests__/App.test.js
@@ -820,7 +820,7 @@
state: importedWallet.state,
});
});
- it('A user with an invalid Cashtab wallet is migrated on startup', async () => {
+ it('A user with an invalid Cashtab wallet as the active wallet is migrated on startup', async () => {
const mockedChronik = await initializeCashtabStateForTests(
{
...walletWithXecAndTokens,
@@ -843,6 +843,29 @@
// Check wallet in localforage
const migratedWallet = await localforage.getItem('wallet');
+ // The wallet has been migrated
+ expect(migratedWallet.Path1899.cashAddress).toBe(
+ walletWithXecAndTokens.Path1899.cashAddress,
+ );
+ });
+ it('A user with an invalid Cashtab wallet in savedWallets has savedWallets migrated on startup', async () => {
+ const mockedChronik = await initializeCashtabStateForTests(
+ walletWithXecAndTokens,
+ localforage,
+ );
+
+ // Add an invalid wallet to savedWallets
+
+ render(<CashtabTestWrapper chronik={mockedChronik} />);
+
+ // Wait balance to be rendered correctly so we know Cashtab has loaded the wallet
+ expect(await screen.findByTestId('balance-xec')).toHaveTextContent(
+ '9,513.12 XEC',
+ );
+
+ // Check wallet in localforage
+ const migratedWallet = await localforage.getItem('wallet');
+
// The wallet has been migrated
expect(migratedWallet.Path1899.cashAddress).toBe(
walletWithXecAndTokens.Path1899.cashAddress,
diff --git a/cashtab/src/hooks/useWallet.js b/cashtab/src/hooks/useWallet.js
--- a/cashtab/src/hooks/useWallet.js
+++ b/cashtab/src/hooks/useWallet.js
@@ -32,7 +32,6 @@
import { queryAliasServer } from 'alias';
import cashaddr from 'ecashaddrjs';
import * as bip39 from 'bip39';
-import * as randomBytes from 'randombytes';
import * as utxolib from '@bitgo/utxo-lib';
import { websocket as websocketConfig } from 'config/websocket';
import defaultCashtabCache from 'config/cashtabCache';
@@ -45,6 +44,7 @@
import { supportedFiatCurrencies } from 'config/cashtabSettings';
import { notification } from 'antd';
import { cashtabCacheToJSON, storedCashtabCacheToMap } from 'helpers';
+import { createCashtabWallet } from 'wallet';
// Cashtab is always running the `update` function at an interval
// When the websocket detects an incoming tx (or when the wallet is first loaded)
// Set this interval to near-instant (50ms)
@@ -314,6 +314,41 @@
cashtabState.cashtabCache = cashtabCache;
}
+ // savedWallets
+ let savedWallets = await localforage.getItem('savedWallets');
+ if (savedWallets !== null) {
+ // If we find savedWallets in localforage
+
+ // Iterate over savedWallets to check if any require migration
+ let savedWalletsMigrationRequired = false;
+ savedWallets.forEach(
+ async (savedWallet, index, thisSavedWalletsArray) => {
+ if (!isValidCashtabWallet(savedWallet)) {
+ // Update the flag
+ savedWalletsMigrationRequired = true;
+ // Recreate this wallet at latest format from mnemonic
+ const newSavedWallet = await createCashtabWallet(
+ savedWallet.mnemonic,
+ );
+
+ // Modify savedWallets in place. Keep the same name.
+ thisSavedWalletsArray[index] = {
+ ...newSavedWallet,
+ name: savedWallet.name,
+ };
+ }
+ },
+ );
+
+ if (savedWalletsMigrationRequired) {
+ // If we migrated any savedWallets, update localforage
+ updateCashtabState('savedWallets', savedWallets);
+ }
+ // Set cashtabState savedWallets to valid localforage savedWallets
+ // (or the savedWallets you just migrated, above)
+ cashtabState.savedWallets = savedWallets;
+ }
+
setCashtabState(cashtabState);
};
@@ -758,97 +793,6 @@
return true;
};
- const addNewSavedWallet = async importMnemonic => {
- setLoading(true);
- // Add a new wallet to savedWallets from importMnemonic or just new wallet
- const lang = 'english';
-
- // create 128 bit BIP39 mnemonic
- const Bip39128BitMnemonic = importMnemonic
- ? importMnemonic
- : bip39.generateMnemonic(128, randomBytes, bip39.wordlists[lang]);
-
- const newSavedWallet = await getWalletDetails({
- mnemonic: Bip39128BitMnemonic.toString(),
- });
- // Get saved wallets
- let savedWallets;
- try {
- savedWallets = await localforage.getItem('savedWallets');
- // If this doesn't exist yet, savedWallets === null
- if (savedWallets === null) {
- savedWallets = [];
- }
- } catch (err) {
- console.log(
- `Error in savedWallets = await localforage.getItem("savedWallets") in addNewSavedWallet()`,
- err,
- );
- console.log(`savedWallets in error state`, savedWallets);
- }
- // If this wallet is from an imported mnemonic, make sure it does not already exist in savedWallets
- if (importMnemonic) {
- for (let i = 0; i < savedWallets.length; i += 1) {
- // Check for condition "importing new wallet that is already in savedWallets"
- if (savedWallets[i].mnemonic === importMnemonic) {
- // set this as the active wallet to keep name history
- console.log(
- `Error: this wallet already exists in savedWallets`,
- );
- console.log(`Wallet not being added.`);
- setLoading(false);
- return false;
- }
- }
- }
- // add newSavedWallet
- savedWallets.push(newSavedWallet);
- // update savedWallets
- try {
- await localforage.setItem('savedWallets', savedWallets);
- } catch (err) {
- console.log(
- `Error in localforage.setItem("savedWallets", activeWallet) called in createWallet with ${importMnemonic}`,
- err,
- );
- console.log(`savedWallets`, savedWallets);
- }
- setLoading(false);
- return true;
- };
-
- const createWallet = async importMnemonic => {
- const lang = 'english';
-
- // create 128 bit BIP39 mnemonic
- const Bip39128BitMnemonic = importMnemonic
- ? importMnemonic
- : bip39.generateMnemonic(128, randomBytes, bip39.wordlists[lang]);
-
- const wallet = await getWalletDetails({
- mnemonic: Bip39128BitMnemonic.toString(),
- });
-
- try {
- await localforage.setItem('wallet', wallet);
- } catch (err) {
- console.log(
- `Error setting wallet to wallet indexedDb in createWallet()`,
- );
- console.log(err);
- }
- // Since this function is only called from OnBoarding.js, also add this to the saved wallet
- try {
- await localforage.setItem('savedWallets', [wallet]);
- } catch (err) {
- console.log(
- `Error setting wallet to savedWallets indexedDb in createWallet()`,
- );
- console.log(err);
- }
- return wallet;
- };
-
// Parse chronik ws message for incoming tx notifications
const processChronikWsMsg = async (msg, wallet, fiatPrice) => {
// get the message type
@@ -1430,14 +1374,6 @@
getSavedWallets,
migrateLegacyWallet,
updateCashtabState,
- createWallet: async importMnemonic => {
- setLoading(true);
- const newWallet = await createWallet(importMnemonic);
- setWallet(newWallet);
- update({
- wallet: newWallet,
- }).finally(() => setLoading(false));
- },
activateWallet: async (currentlyActiveWallet, walletToActivate) => {
setLoading(true);
const newWallet = await activateWallet(
@@ -1452,7 +1388,6 @@
setWalletRefreshInterval(TRIGGER_UTXO_REFRESH_INTERVAL_MS);
setLoading(false);
},
- addNewSavedWallet,
renameSavedWallet,
renameActiveWallet,
deleteWallet,

File Metadata

Mime Type
text/plain
Expires
Mon, May 12, 01:37 (4 h, 6 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5777027
Default Alt Text
D15612.id45875.diff (8 KB)

Event Timeline