diff --git a/web/cashtab/src/components/Wallet/Wallet.js b/web/cashtab/src/components/Wallet/Wallet.js
--- a/web/cashtab/src/components/Wallet/Wallet.js
+++ b/web/cashtab/src/components/Wallet/Wallet.js
@@ -203,14 +203,33 @@
const WalletInfo = () => {
const ContextValue = React.useContext(WalletContext);
- const {
- wallet,
- fiatPrice,
- balances,
- tokens,
- parsedTxHistory,
- apiError,
- } = ContextValue;
+ const { wallet, fiatPrice, apiError } = ContextValue;
+ let balances;
+ let parsedTxHistory;
+ let tokens;
+ // use parameters from wallet.state object and not legacy separate parameters, if they are in state
+ // handle edge case of user with old wallet who has not opened latest Cashtab version yet
+
+ // If the wallet object from ContextValue has a `state key`, then check which keys are in the wallet object
+ // Else set it as blank
+ const paramsInWalletState = wallet.state ? Object.keys(wallet.state) : [];
+ // If wallet.state includes balances and parsedTxHistory params, use these
+ // These are saved in indexedDb in the latest version of the app, hence accessible more quickly
+ if (
+ paramsInWalletState.includes('balances') &&
+ paramsInWalletState.includes('parsedTxHistory') &&
+ paramsInWalletState.includes('tokens')
+ ) {
+ balances = wallet.state.balances;
+ parsedTxHistory = wallet.state.parsedTxHistory;
+ tokens = wallet.state.tokens;
+ } else {
+ // If balances and parsedTxHistory are not in the wallet.state object, load them from Context
+ // This is how the app used to work
+ balances = ContextValue.balances;
+ parsedTxHistory = ContextValue.parsedTxHistory;
+ tokens = ContextValue.tokens;
+ }
const [address, setAddress] = React.useState('cashAddress');
const [activeTab, setActiveTab] = React.useState('txHistory');
diff --git a/web/cashtab/src/components/Wallet/__mocks__/walletAndBalancesMock.js b/web/cashtab/src/components/Wallet/__mocks__/walletAndBalancesMock.js
--- a/web/cashtab/src/components/Wallet/__mocks__/walletAndBalancesMock.js
+++ b/web/cashtab/src/components/Wallet/__mocks__/walletAndBalancesMock.js
@@ -1,4 +1,4 @@
-import BigNumber from 'bignumber.js';
+// @generated
export const walletWithBalancesMock = {
wallet: {
@@ -152,3 +152,190 @@
},
],
};
+
+export const walletWithBalancesAndTokensWithCorrectState = {
+ wallet: {
+ name: 'MigrationTestAlpha',
+ Path245: {
+ cashAddress:
+ 'bitcoincash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy54hkry298',
+ slpAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ fundingWif: 'KwgNkyijAaxFr5XQdnaYyNMXVSZobgHzSoKKfWiC3Q7Xr4n7iYMG',
+ fundingAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ legacyAddress: '1EgPUfBgU7ekho3EjtGze87dRADnUE8ojP',
+ },
+ Path145: {
+ cashAddress:
+ 'bitcoincash:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9v0lgx569z',
+ slpAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ fundingWif: 'L2xvTe6CdNxroR6pbdpGWNjAa55AZX5Wm59W5TXMuH31ihNJdDjt',
+ fundingAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ legacyAddress: '1511T3ynXKgCwXhFijCUWKuTfqbPxFV1AF',
+ },
+ Path1899: {
+ cashAddress:
+ 'bitcoincash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cptzgcqy6',
+ slpAddress:
+ 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ fundingWif: 'Kx4FiBMvKK1iXjFk5QTaAK6E4mDGPjmwDZ2HDKGUZpE4gCXMaPe9',
+ fundingAddress:
+ 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ legacyAddress: '1J1Aq5tAAYxZgSDRo8soKM2Rb41z3xrYpm',
+ },
+ state: {
+ balances: {
+ totalBalanceInSatoshis: 6047469,
+ totalBalance: 0.06047469,
+ },
+ tokens: [
+ {
+ info: {
+ height: 666987,
+ tx_hash:
+ 'e7d554c317db71fd5b50fcf0b2cb4cbdce54a09f1732cfaade0820659318e30a',
+ tx_pos: 2,
+ value: 546,
+ satoshis: 546,
+ txid:
+ 'e7d554c317db71fd5b50fcf0b2cb4cbdce54a09f1732cfaade0820659318e30a',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '6.001',
+ isValid: true,
+ address:
+ 'bitcoincash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy54hkry298',
+ },
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ balance: '6.001',
+ hasBaton: false,
+ },
+ ],
+ parsedTxHistory: [],
+ },
+ },
+ balances: {
+ totalBalanceInSatoshis: 6047469,
+ totalBalance: 0.06047469,
+ },
+ tokens: [
+ {
+ info: {
+ height: 666987,
+ tx_hash:
+ 'e7d554c317db71fd5b50fcf0b2cb4cbdce54a09f1732cfaade0820659318e30a',
+ tx_pos: 2,
+ value: 546,
+ satoshis: 546,
+ txid:
+ 'e7d554c317db71fd5b50fcf0b2cb4cbdce54a09f1732cfaade0820659318e30a',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '6.001',
+ isValid: true,
+ address:
+ 'bitcoincash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy54hkry298',
+ },
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ balance: '6.001',
+ hasBaton: false,
+ },
+ ],
+};
+
+export const walletWithBalancesAndTokensWithEmptyState = {
+ wallet: {
+ name: 'MigrationTestAlpha',
+ Path245: {
+ cashAddress:
+ 'bitcoincash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy54hkry298',
+ slpAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ fundingWif: 'KwgNkyijAaxFr5XQdnaYyNMXVSZobgHzSoKKfWiC3Q7Xr4n7iYMG',
+ fundingAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ legacyAddress: '1EgPUfBgU7ekho3EjtGze87dRADnUE8ojP',
+ },
+ Path145: {
+ cashAddress:
+ 'bitcoincash:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9v0lgx569z',
+ slpAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ fundingWif: 'L2xvTe6CdNxroR6pbdpGWNjAa55AZX5Wm59W5TXMuH31ihNJdDjt',
+ fundingAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ legacyAddress: '1511T3ynXKgCwXhFijCUWKuTfqbPxFV1AF',
+ },
+ Path1899: {
+ cashAddress:
+ 'bitcoincash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cptzgcqy6',
+ slpAddress:
+ 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ fundingWif: 'Kx4FiBMvKK1iXjFk5QTaAK6E4mDGPjmwDZ2HDKGUZpE4gCXMaPe9',
+ fundingAddress:
+ 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ legacyAddress: '1J1Aq5tAAYxZgSDRo8soKM2Rb41z3xrYpm',
+ },
+ state: {},
+ },
+ balances: {
+ totalBalanceInSatoshis: 6047469,
+ totalBalance: 0.06047469,
+ },
+ tokens: [
+ {
+ info: {
+ height: 666987,
+ tx_hash:
+ 'e7d554c317db71fd5b50fcf0b2cb4cbdce54a09f1732cfaade0820659318e30a',
+ tx_pos: 2,
+ value: 546,
+ satoshis: 546,
+ txid:
+ 'e7d554c317db71fd5b50fcf0b2cb4cbdce54a09f1732cfaade0820659318e30a',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '6.001',
+ isValid: true,
+ address:
+ 'bitcoincash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy54hkry298',
+ },
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ balance: '6.001',
+ hasBaton: false,
+ },
+ ],
+};
diff --git a/web/cashtab/src/components/Wallet/__tests__/Wallet.test.js b/web/cashtab/src/components/Wallet/__tests__/Wallet.test.js
--- a/web/cashtab/src/components/Wallet/__tests__/Wallet.test.js
+++ b/web/cashtab/src/components/Wallet/__tests__/Wallet.test.js
@@ -7,6 +7,8 @@
walletWithBalancesAndTokens,
walletWithBalancesMock,
walletWithoutBalancesMock,
+ walletWithBalancesAndTokensWithCorrectState,
+ walletWithBalancesAndTokensWithEmptyState,
} from '../__mocks__/walletAndBalancesMock';
import { BrowserRouter as Router } from 'react-router-dom';
@@ -61,6 +63,32 @@
expect(tree).toMatchSnapshot();
});
+test('Wallet with BCH balances and tokens and state field', () => {
+ useContextMock.mockReturnValue(walletWithBalancesAndTokensWithCorrectState);
+ const component = renderer.create(
+