Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F14362783
D15084.id43965.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
10 KB
Subscribers
None
D15084.id43965.diff
View Options
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
Details
Attached
Mime Type
text/plain
Expires
Mon, May 12, 01:49 (2 h, 1 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5777074
Default Alt Text
D15084.id43965.diff (10 KB)
Attached To
D15084: [Cashtab] Additional mitigation for legacy wallet addresses
Event Timeline
Log In to Comment