Page MenuHomePhabricator

D15084.id43965.diff
No OneTemporary

D15084.id43965.diff

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
@@ -10,6 +10,7 @@
isActiveWebsocket,
getWalletBalanceFromUtxos,
toHash160,
+ convertToEcashPrefix,
} from 'utils/cashMethods';
import {
isValidCashtabSettings,
@@ -17,6 +18,7 @@
isValidContactList,
parseInvalidSettingsForMigration,
parseInvalidCashtabCacheForMigration,
+ isValidXecAddress,
} from 'utils/validation';
import localforage from 'localforage';
import {
@@ -141,6 +143,24 @@
const liveWalletState = loadStoredWallet(wallet.state);
wallet.state = liveWalletState;
+ // Additional mitigation for edge cases where older wallets may still
+ // have bitcoincash prefixes
+ if (!isValidXecAddress(wallet.Path245.cashAddress)) {
+ wallet.Path245.cashAddress = convertToEcashPrefix(
+ wallet.Path245.cashAddress,
+ );
+ }
+ if (!isValidXecAddress(wallet.Path145.cashAddress)) {
+ wallet.Path145.cashAddress = convertToEcashPrefix(
+ wallet.Path145.cashAddress,
+ );
+ }
+ if (!isValidXecAddress(wallet.Path1899.cashAddress)) {
+ wallet.Path1899.cashAddress = convertToEcashPrefix(
+ wallet.Path1899.cashAddress,
+ );
+ }
+
setWallet(wallet);
return setLoading(false);
}
diff --git a/cashtab/src/utils/__mocks__/mockLegacyWalletsUtils.js b/cashtab/src/utils/__mocks__/mockLegacyWalletsUtils.js
--- a/cashtab/src/utils/__mocks__/mockLegacyWalletsUtils.js
+++ b/cashtab/src/utils/__mocks__/mockLegacyWalletsUtils.js
@@ -126,9 +126,9 @@
state: {},
};
-export const notLegacyWallet = {
+export const notLegacyWalletWithXecPrefixes = {
Path145: {
- cashAddress: 'bitcoincash:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9v0lgx569z',
+ cashAddress: 'ecash:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vkjud0qr4',
fundingAddress:
'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
fundingWif: 'L2xvTe6CdNxroR6pbdpGWNjAa55AZX5Wm59W5TXMuH31ihNJdDjt',
@@ -139,7 +139,47 @@
slpAddress: 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
},
Path1899: {
- cashAddress: 'bitcoincash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cptzgcqy6',
+ cashAddress: 'ecash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7ccxkrr6zd',
+ fundingAddress:
+ 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ fundingWif: 'Kx4FiBMvKK1iXjFk5QTaAK6E4mDGPjmwDZ2HDKGUZpE4gCXMaPe9',
+ hash160: 'ba8257db65f40359989c7b894c5e88ed7b6344f6',
+ legacyAddress: '1J1Aq5tAAYxZgSDRo8soKM2Rb41z3xrYpm',
+ publicKey:
+ '02a06bb380cf180d703f6f80796a13555aefff817d1f6f842f1e5c555b15f0fa70',
+ slpAddress: 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ },
+ Path245: {
+ cashAddress: 'ecash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5v6zglsrs',
+ fundingAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ fundingWif: 'KwgNkyijAaxFr5XQdnaYyNMXVSZobgHzSoKKfWiC3Q7Xr4n7iYMG',
+ hash160: '960c9ed561f1699f0c49974d50b3bb7cdc118625',
+ legacyAddress: '1EgPUfBgU7ekho3EjtGze87dRADnUE8ojP',
+ publicKey:
+ '03c4a69fd90c8b196683216cffd2943a7b13b0db0812e44a4ff156ac7e03fc4ed7',
+ slpAddress: 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ },
+ mnemonic:
+ 'apart vacuum color cream drama kind foil history hurt alone ask census',
+ name: 'Current Wallet, Not Legacy',
+ state: {},
+};
+
+export const notLegacyWalletWithPath245OnBchPrefix = {
+ Path145: {
+ cashAddress: 'ecash:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vkjud0qr4',
+ fundingAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ fundingWif: 'L2xvTe6CdNxroR6pbdpGWNjAa55AZX5Wm59W5TXMuH31ihNJdDjt',
+ hash160: '2be0e0c999e7e77a443ea726f82c441912fca92b',
+ legacyAddress: '1511T3ynXKgCwXhFijCUWKuTfqbPxFV1AF',
+ publicKey:
+ '02fe5308d77bcce825068a9e46adc6f032dbbe39167a7b6d05ac563ac71d8b186e',
+ slpAddress: 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ },
+ Path1899: {
+ cashAddress: 'ecash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7ccxkrr6zd',
fundingAddress:
'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
fundingWif: 'Kx4FiBMvKK1iXjFk5QTaAK6E4mDGPjmwDZ2HDKGUZpE4gCXMaPe9',
@@ -166,6 +206,86 @@
state: {},
};
+export const notLegacyWalletWithPath1899OnBchPrefix = {
+ Path145: {
+ cashAddress: 'ecash:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vkjud0qr4',
+ fundingAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ fundingWif: 'L2xvTe6CdNxroR6pbdpGWNjAa55AZX5Wm59W5TXMuH31ihNJdDjt',
+ hash160: '2be0e0c999e7e77a443ea726f82c441912fca92b',
+ legacyAddress: '1511T3ynXKgCwXhFijCUWKuTfqbPxFV1AF',
+ publicKey:
+ '02fe5308d77bcce825068a9e46adc6f032dbbe39167a7b6d05ac563ac71d8b186e',
+ slpAddress: 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ },
+ Path1899: {
+ cashAddress: 'bitcoincash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cptzgcqy6',
+ fundingAddress:
+ 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ fundingWif: 'Kx4FiBMvKK1iXjFk5QTaAK6E4mDGPjmwDZ2HDKGUZpE4gCXMaPe9',
+ hash160: 'ba8257db65f40359989c7b894c5e88ed7b6344f6',
+ legacyAddress: '1J1Aq5tAAYxZgSDRo8soKM2Rb41z3xrYpm',
+ publicKey:
+ '02a06bb380cf180d703f6f80796a13555aefff817d1f6f842f1e5c555b15f0fa70',
+ slpAddress: 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ },
+ Path245: {
+ cashAddress: 'ecash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5v6zglsrs',
+ fundingAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ fundingWif: 'KwgNkyijAaxFr5XQdnaYyNMXVSZobgHzSoKKfWiC3Q7Xr4n7iYMG',
+ hash160: '960c9ed561f1699f0c49974d50b3bb7cdc118625',
+ legacyAddress: '1EgPUfBgU7ekho3EjtGze87dRADnUE8ojP',
+ publicKey:
+ '03c4a69fd90c8b196683216cffd2943a7b13b0db0812e44a4ff156ac7e03fc4ed7',
+ slpAddress: 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ },
+ mnemonic:
+ 'apart vacuum color cream drama kind foil history hurt alone ask census',
+ name: 'Current Wallet, Not Legacy',
+ state: {},
+};
+
+export const notLegacyWalletWithPath145OnBchPrefix = {
+ Path145: {
+ cashAddress: 'bitcoincash:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9v0lgx569z',
+ fundingAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ fundingWif: 'L2xvTe6CdNxroR6pbdpGWNjAa55AZX5Wm59W5TXMuH31ihNJdDjt',
+ hash160: '2be0e0c999e7e77a443ea726f82c441912fca92b',
+ legacyAddress: '1511T3ynXKgCwXhFijCUWKuTfqbPxFV1AF',
+ publicKey:
+ '02fe5308d77bcce825068a9e46adc6f032dbbe39167a7b6d05ac563ac71d8b186e',
+ slpAddress: 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ },
+ Path1899: {
+ cashAddress: 'ecash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7ccxkrr6zd',
+ fundingAddress:
+ 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ fundingWif: 'Kx4FiBMvKK1iXjFk5QTaAK6E4mDGPjmwDZ2HDKGUZpE4gCXMaPe9',
+ hash160: 'ba8257db65f40359989c7b894c5e88ed7b6344f6',
+ legacyAddress: '1J1Aq5tAAYxZgSDRo8soKM2Rb41z3xrYpm',
+ publicKey:
+ '02a06bb380cf180d703f6f80796a13555aefff817d1f6f842f1e5c555b15f0fa70',
+ slpAddress: 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ },
+ Path245: {
+ cashAddress: 'ecash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5v6zglsrs',
+ fundingAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ fundingWif: 'KwgNkyijAaxFr5XQdnaYyNMXVSZobgHzSoKKfWiC3Q7Xr4n7iYMG',
+ hash160: '960c9ed561f1699f0c49974d50b3bb7cdc118625',
+ legacyAddress: '1EgPUfBgU7ekho3EjtGze87dRADnUE8ojP',
+ publicKey:
+ '03c4a69fd90c8b196683216cffd2943a7b13b0db0812e44a4ff156ac7e03fc4ed7',
+ slpAddress: 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ },
+ mnemonic:
+ 'apart vacuum color cream drama kind foil history hurt alone ask census',
+ name: 'Current Wallet, Not Legacy',
+ state: {},
+};
+
export const missingHash160 = {
Path145: {
cashAddress: 'bitcoincash:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9v0lgx569z',
diff --git a/cashtab/src/utils/__tests__/cashMethods.test.js b/cashtab/src/utils/__tests__/cashMethods.test.js
--- a/cashtab/src/utils/__tests__/cashMethods.test.js
+++ b/cashtab/src/utils/__tests__/cashMethods.test.js
@@ -61,7 +61,10 @@
missingPublicKeyInPath1899Wallet,
missingPublicKeyInPath145Wallet,
missingPublicKeyInPath245Wallet,
- notLegacyWallet,
+ notLegacyWalletWithXecPrefixes,
+ notLegacyWalletWithPath145OnBchPrefix,
+ notLegacyWalletWithPath1899OnBchPrefix,
+ notLegacyWalletWithPath245OnBchPrefix,
missingHash160,
} from '../__mocks__/mockLegacyWalletsUtils';
@@ -1241,7 +1244,24 @@
expect(isLegacyMigrationRequired(missingHash160)).toBe(true);
});
it(`Recognizes a latest, current wallet that does not require migration`, () => {
- expect(isLegacyMigrationRequired(notLegacyWallet)).toBe(false);
+ expect(isLegacyMigrationRequired(notLegacyWalletWithXecPrefixes)).toBe(
+ false,
+ );
+ });
+ it(`Recognizes a non-eCash prefixed Path245 address and requires migration`, () => {
+ expect(
+ isLegacyMigrationRequired(notLegacyWalletWithPath245OnBchPrefix),
+ ).toBe(true);
+ });
+ it(`Recognizes a non-eCash prefixed Path1899 address and requires migration`, () => {
+ expect(
+ isLegacyMigrationRequired(notLegacyWalletWithPath1899OnBchPrefix),
+ ).toBe(true);
+ });
+ it(`Recognizes a non-eCash prefixed Path145 address and requires migration`, () => {
+ expect(
+ isLegacyMigrationRequired(notLegacyWalletWithPath145OnBchPrefix),
+ ).toBe(true);
});
test('toHash160() converts a valid bitcoincash: prefix address to a hash160', () => {
diff --git a/cashtab/src/utils/cashMethods.js b/cashtab/src/utils/cashMethods.js
--- a/cashtab/src/utils/cashMethods.js
+++ b/cashtab/src/utils/cashMethods.js
@@ -993,7 +993,10 @@
!wallet.Path145.publicKey ||
!wallet.Path145.hash160 ||
!wallet.Path245.publicKey ||
- !wallet.Path245.hash160
+ !wallet.Path245.hash160 ||
+ !isValidXecAddress(wallet.Path1899.cashAddress) ||
+ !isValidXecAddress(wallet.Path145.cashAddress) ||
+ !isValidXecAddress(wallet.Path245.cashAddress)
) {
return true;
}

File Metadata

Mime Type
text/plain
Expires
Mon, May 12, 01:49 (20 h, 38 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5777074
Default Alt Text
D15084.id43965.diff (10 KB)

Event Timeline