Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F14362646
D15612.id45875.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
8 KB
Subscribers
None
D15612.id45875.diff
View Options
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
Details
Attached
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)
Attached To
D15612: [Cashtab] Cashtab 2.0.0 - Migrate to new wallet management API
Event Timeline
Log In to Comment