diff --git a/web/cashtab/src/hooks/__mocks__/mockLegacyWallets.js b/web/cashtab/src/hooks/__mocks__/mockLegacyWallets.js --- a/web/cashtab/src/hooks/__mocks__/mockLegacyWallets.js +++ b/web/cashtab/src/hooks/__mocks__/mockLegacyWallets.js @@ -35,6 +35,7 @@ slpAddress: 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me', fundingWif: 'KwgNkyijAaxFr5XQdnaYyNMXVSZobgHzSoKKfWiC3Q7Xr4n7iYMG', + hash160: '960c9ed561f1699f0c49974d50b3bb7cdc118625', fundingAddress: 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me', legacyAddress: '1EgPUfBgU7ekho3EjtGze87dRADnUE8ojP', @@ -47,6 +48,7 @@ slpAddress: 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu', fundingWif: 'L2xvTe6CdNxroR6pbdpGWNjAa55AZX5Wm59W5TXMuH31ihNJdDjt', + hash160: '2be0e0c999e7e77a443ea726f82c441912fca92b', fundingAddress: 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu', legacyAddress: '1511T3ynXKgCwXhFijCUWKuTfqbPxFV1AF', @@ -59,6 +61,7 @@ slpAddress: 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y', fundingWif: 'Kx4FiBMvKK1iXjFk5QTaAK6E4mDGPjmwDZ2HDKGUZpE4gCXMaPe9', + hash160: 'ba8257db65f40359989c7b894c5e88ed7b6344f6', fundingAddress: 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y', legacyAddress: '1J1Aq5tAAYxZgSDRo8soKM2Rb41z3xrYpm', @@ -98,6 +101,7 @@ fundingAddress: 'slptest:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5234lu2sx', fundingWif: 'cN3NDtiabeeX1Wzg2CPgLgrb7fsDG8PgWqTnmwAhYWmY6osSta7Q', + hash160: '960c9ed561f1699f0c49974d50b3bb7cdc118625', legacyAddress: 'muCLmiGfH961UuWrTTFNU3KxH9pVQJJx6Z', slpAddress: 'slptest:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5234lu2sx', publicKey: @@ -108,6 +112,7 @@ fundingAddress: 'slptest:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vset6v6sr', fundingWif: 'cTKuvZ644Sf7xra5z3dPshEECJNaDyBCq7HyBsysQPh1ySSpxtQ1', + hash160: '2be0e0c999e7e77a443ea726f82c441912fca92b', legacyAddress: 'mjWxk74mLM7TieAsSJArLF7nXqC6oc2mof', slpAddress: 'slptest:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vset6v6sr', publicKey: @@ -118,6 +123,7 @@ fundingAddress: 'slptest:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7c7dp5qq3m', fundingWif: 'cNRFB6MmkNhyhAj1TpGhXdbHgzWg4BsdHbAkKjiz4vt4vwgpC44F', + hash160: 'ba8257db65f40359989c7b894c5e88ed7b6344f6', legacyAddress: 'mxX888y8yaPpTYh3WhrB9GEkT3cgumYwPw', slpAddress: 'slptest:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7c7dp5qq3m', publicKey: diff --git a/web/cashtab/src/hooks/useWallet.js b/web/cashtab/src/hooks/useWallet.js --- a/web/cashtab/src/hooks/useWallet.js +++ b/web/cashtab/src/hooks/useWallet.js @@ -115,10 +115,12 @@ const node = BCH.HDNode.derivePath(masterHDNode, path); const publicKey = BCH.HDNode.toPublicKey(node).toString('hex'); const cashAddress = BCH.HDNode.toCashAddress(node); + const hash160 = BCH.Address.toHash160(cashAddress); const slpAddress = BCH.SLP.Address.toSLPAddress(cashAddress); return { publicKey, + hash160, cashAddress, slpAddress, fundingWif: BCH.HDNode.toWIF(node), diff --git a/web/cashtab/src/utils/__mocks__/mockLegacyWalletsUtils.js b/web/cashtab/src/utils/__mocks__/mockLegacyWalletsUtils.js --- a/web/cashtab/src/utils/__mocks__/mockLegacyWalletsUtils.js +++ b/web/cashtab/src/utils/__mocks__/mockLegacyWalletsUtils.js @@ -132,6 +132,7 @@ fundingAddress: 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu', fundingWif: 'L2xvTe6CdNxroR6pbdpGWNjAa55AZX5Wm59W5TXMuH31ihNJdDjt', + hash160: '2be0e0c999e7e77a443ea726f82c441912fca92b', legacyAddress: '1511T3ynXKgCwXhFijCUWKuTfqbPxFV1AF', publicKey: '02fe5308d77bcce825068a9e46adc6f032dbbe39167a7b6d05ac563ac71d8b186e', @@ -142,6 +143,7 @@ fundingAddress: 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y', fundingWif: 'Kx4FiBMvKK1iXjFk5QTaAK6E4mDGPjmwDZ2HDKGUZpE4gCXMaPe9', + hash160: 'ba8257db65f40359989c7b894c5e88ed7b6344f6', legacyAddress: '1J1Aq5tAAYxZgSDRo8soKM2Rb41z3xrYpm', publicKey: '02a06bb380cf180d703f6f80796a13555aefff817d1f6f842f1e5c555b15f0fa70', @@ -152,6 +154,7 @@ fundingAddress: 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me', fundingWif: 'KwgNkyijAaxFr5XQdnaYyNMXVSZobgHzSoKKfWiC3Q7Xr4n7iYMG', + hash160: '960c9ed561f1699f0c49974d50b3bb7cdc118625', legacyAddress: '1EgPUfBgU7ekho3EjtGze87dRADnUE8ojP', publicKey: '03c4a69fd90c8b196683216cffd2943a7b13b0db0812e44a4ff156ac7e03fc4ed7', @@ -162,3 +165,43 @@ name: 'Current Wallet, Not Legacy', state: {}, }; + +export const missingHash160 = { + Path145: { + cashAddress: 'bitcoincash:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9v0lgx569z', + fundingAddress: + 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu', + fundingWif: 'L2xvTe6CdNxroR6pbdpGWNjAa55AZX5Wm59W5TXMuH31ihNJdDjt', + + legacyAddress: '1511T3ynXKgCwXhFijCUWKuTfqbPxFV1AF', + publicKey: + '02fe5308d77bcce825068a9e46adc6f032dbbe39167a7b6d05ac563ac71d8b186e', + slpAddress: 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu', + }, + Path1899: { + cashAddress: 'bitcoincash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cptzgcqy6', + fundingAddress: + 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y', + fundingWif: 'Kx4FiBMvKK1iXjFk5QTaAK6E4mDGPjmwDZ2HDKGUZpE4gCXMaPe9', + + legacyAddress: '1J1Aq5tAAYxZgSDRo8soKM2Rb41z3xrYpm', + publicKey: + '02a06bb380cf180d703f6f80796a13555aefff817d1f6f842f1e5c555b15f0fa70', + slpAddress: 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y', + }, + Path245: { + cashAddress: 'bitcoincash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy54hkry298', + fundingAddress: + 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me', + fundingWif: 'KwgNkyijAaxFr5XQdnaYyNMXVSZobgHzSoKKfWiC3Q7Xr4n7iYMG', + + legacyAddress: '1EgPUfBgU7ekho3EjtGze87dRADnUE8ojP', + publicKey: + '03c4a69fd90c8b196683216cffd2943a7b13b0db0812e44a4ff156ac7e03fc4ed7', + slpAddress: 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me', + }, + mnemonic: + 'apart vacuum color cream drama kind foil history hurt alone ask census', + name: 'Missing Public Key in Path1899', + state: {}, +}; diff --git a/web/cashtab/src/utils/__tests__/cashMethods.test.js b/web/cashtab/src/utils/__tests__/cashMethods.test.js --- a/web/cashtab/src/utils/__tests__/cashMethods.test.js +++ b/web/cashtab/src/utils/__tests__/cashMethods.test.js @@ -66,6 +66,7 @@ missingPublicKeyInPath145Wallet, missingPublicKeyInPath245Wallet, notLegacyWallet, + missingHash160, } from '../__mocks__/mockLegacyWalletsUtils'; import { @@ -263,6 +264,9 @@ true, ); }); + it(`Recognizes a wallet with missing Hash160 values is a Legacy Wallet and requires migration`, () => { + expect(isLegacyMigrationRequired(missingHash160)).toBe(true); + }); it(`Recognizes a latest, current wallet that does not require migration`, () => { expect(isLegacyMigrationRequired(notLegacyWallet)).toBe(false); }); diff --git a/web/cashtab/src/utils/cashMethods.js b/web/cashtab/src/utils/cashMethods.js --- a/web/cashtab/src/utils/cashMethods.js +++ b/web/cashtab/src/utils/cashMethods.js @@ -565,8 +565,11 @@ if ( !wallet.Path1899 || !wallet.Path1899.publicKey || + !wallet.Path1899.hash160 || !wallet.Path145.publicKey || - !wallet.Path245.publicKey + !wallet.Path145.hash160 || + !wallet.Path245.publicKey || + !wallet.Path245.hash160 ) { return true; }