diff --git a/web/cashtab/package-lock.json b/web/cashtab/package-lock.json --- a/web/cashtab/package-lock.json +++ b/web/cashtab/package-lock.json @@ -95,7 +95,7 @@ "webpack-manifest-plugin": "^4.0.2", "wif": "^2.0.6", "workbox-webpack-plugin": "^6.4.1", - "xecjs-message": "^1.0.5" + "xecjs-message": "file:../xecjs-message" }, "devDependencies": { "husky": "^8.0.1", @@ -152,7 +152,6 @@ }, "../xecjs-message": { "version": "1.0.5", - "extraneous": true, "license": "MIT", "dependencies": { "buffer-equals": "^1.0.3", @@ -20717,19 +20716,8 @@ } }, "node_modules/xecjs-message": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/xecjs-message/-/xecjs-message-1.0.5.tgz", - "integrity": "sha512-8gnkLAQz/Wz7/e5JfI4J+lVN8MdsS7Do+pyE0vF4fBsEtGDkOh71dQFcrQ8lbYEZhkIrwjsmDz964ub/52HCGg==", - "dependencies": { - "buffer-equals": "^1.0.3", - "create-hash": "^1.1.2", - "ecashaddrjs": "^1.0.7", - "secp256k1": "^3.0.1", - "varuint-bitcoin": "^1.0.1" - }, - "engines": { - "node": ">=0.10" - } + "resolved": "../xecjs-message", + "link": true }, "node_modules/xml": { "version": "1.0.1", @@ -35801,14 +35789,16 @@ "requires": {} }, "xecjs-message": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/xecjs-message/-/xecjs-message-1.0.5.tgz", - "integrity": "sha512-8gnkLAQz/Wz7/e5JfI4J+lVN8MdsS7Do+pyE0vF4fBsEtGDkOh71dQFcrQ8lbYEZhkIrwjsmDz964ub/52HCGg==", + "version": "file:../xecjs-message", "requires": { + "bigi": "^1.4.1", + "bitcoinjs-lib": "^3.2.0", "buffer-equals": "^1.0.3", "create-hash": "^1.1.2", "ecashaddrjs": "^1.0.7", + "nyc": "^14.1.1", "secp256k1": "^3.0.1", + "tape": "^4.5.1", "varuint-bitcoin": "^1.0.1" } }, diff --git a/web/cashtab/package.json b/web/cashtab/package.json --- a/web/cashtab/package.json +++ b/web/cashtab/package.json @@ -90,7 +90,7 @@ "webpack-manifest-plugin": "^4.0.2", "wif": "^2.0.6", "workbox-webpack-plugin": "^6.4.1", - "xecjs-message": "^1.0.5" + "xecjs-message": "file:../xecjs-message" }, "scripts": { "start": "node scripts/start.js", diff --git a/web/cashtab/src/components/SignVerifyMsg/SignVerifyMsg.js b/web/cashtab/src/components/SignVerifyMsg/SignVerifyMsg.js --- a/web/cashtab/src/components/SignVerifyMsg/SignVerifyMsg.js +++ b/web/cashtab/src/components/SignVerifyMsg/SignVerifyMsg.js @@ -98,7 +98,7 @@ useState(false); const [messageVerificationSigError, setMessageVerificationSigError] = useState(false); - const signMessageByPk = () => { + const signMessageByPk = async () => { try { // First, get required params const keyPair = getECPairFromWIF(wallet.Path1899.fundingWif); @@ -109,6 +109,22 @@ .sign(msgToSign, privKey, keyPair.compressed) .toString('base64'); + // Also test the async function + let asyncSignature = await ( + await xecMessage.signAsync( + msgToSign, + privKey, + keyPair.compressed, + ) + ).toString('base64'); + + console.log(`sync sig`, messageSignature); + console.log(`asyncSignature`, asyncSignature); + + if (messageSignature === asyncSignature) { + console.log(`Both methods not broken`); + } + setMessageSignature(messageSignature); messageSignedNotification(messageSignature); } catch (err) { diff --git a/web/cashtab/src/components/SignVerifyMsg/__tests__/SignVerifyMsg.test.js b/web/cashtab/src/components/SignVerifyMsg/__tests__/SignVerifyMsg.test.js deleted file mode 100644 --- a/web/cashtab/src/components/SignVerifyMsg/__tests__/SignVerifyMsg.test.js +++ /dev/null @@ -1,92 +0,0 @@ -import React from 'react'; -import renderer from 'react-test-renderer'; -import { ThemeProvider } from 'styled-components'; -import { theme } from 'assets/styles/theme'; -import { - walletWithoutBalancesMock, - walletWithBalancesMock, - walletWithBalancesAndTokensWithCorrectState, -} from '../../Home/__mocks__/walletAndBalancesMock'; -import SignVerifyMsg from '../SignVerifyMsg'; -import { BrowserRouter as Router } from 'react-router-dom'; -import { WalletContext } from 'utils/context'; - -beforeEach(() => { - // Mock method not implemented in JSDOM - // See reference at https://jestjs.io/docs/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom - Object.defineProperty(window, 'matchMedia', { - writable: true, - value: jest.fn().mockImplementation(query => ({ - matches: false, - media: query, - onchange: null, - addListener: jest.fn(), // Deprecated - removeListener: jest.fn(), // Deprecated - addEventListener: jest.fn(), - removeEventListener: jest.fn(), - dispatchEvent: jest.fn(), - })), - }); -}); - -test('Wallet without BCH balance', () => { - const component = renderer.create( - - - - - - - , - ); - let tree = component.toJSON(); - expect(tree).toMatchSnapshot(); -}); - -test('Wallet with BCH balances', () => { - const component = renderer.create( - - - - - - - , - ); - let tree = component.toJSON(); - expect(tree).toMatchSnapshot(); -}); -test('Wallet with BCH balances and tokens and state field', () => { - const component = renderer.create( - - - - - - - , - ); - let tree = component.toJSON(); - expect(tree).toMatchSnapshot(); -}); - -test('Without wallet defined', () => { - const withoutWalletDefinedMock = { - wallet: {}, - balances: { totalBalance: 0 }, - loading: false, - }; - const component = renderer.create( - - - - - - - , - ); - let tree = component.toJSON(); - expect(tree).toMatchSnapshot(); -}); diff --git a/web/cashtab/src/components/SignVerifyMsg/__tests__/__snapshots__/SignVerifyMsg.test.js.snap b/web/cashtab/src/components/SignVerifyMsg/__tests__/__snapshots__/SignVerifyMsg.test.js.snap deleted file mode 100644 --- a/web/cashtab/src/components/SignVerifyMsg/__tests__/__snapshots__/SignVerifyMsg.test.js.snap +++ /dev/null @@ -1,773 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP @generated - -exports[`Wallet with BCH balances 1`] = ` -
-
-
-

- MigrationTestAlpha -

- - - edit.svg - - -
- - -
-
-
- You currently have 0 - XEC -
- Deposit some funds to use this feature -
-
- -
-
-
-
-
-
- - - -
- -
- Sign -
-
-
-
-
-
-
-
-
-
-
- - - -
- -
- Verify -
-
-
-
-
-
-
-
-`; - -exports[`Wallet with BCH balances and tokens and state field 1`] = ` -
-
-
-

- MigrationTestAlpha -

- - - edit.svg - - -
- - -
-
-
- - - 0.06 - - XEC - - -
-
- -
-
-
-
-
-
- - - -
- -
- Sign -
-
-
-
-
-
-
-
-
-
-
- - - -
- -
- Verify -
-
-
-
-
-
-
-
-`; - -exports[`Wallet without BCH balance 1`] = ` -
-
-
-

- MigrationTestAlpha -

- - - edit.svg - - -
- - -
-
-
- You currently have 0 - XEC -
- Deposit some funds to use this feature -
-
- -
-
-
-
-
-
- - - -
- -
- Sign -
-
-
-
-
-
-
-
-
-
-
- - - -
- -
- Verify -
-
-
-
-
-
-
-
-`; - -exports[`Without wallet defined 1`] = ` -
-
-
- - - edit.svg - - -
- - -
-
-
- You currently have 0 - XEC -
- Deposit some funds to use this feature -
-
- -
-
-
-
-
-
- - - -
- -
- Sign -
-
-
-
-
-
-
-
-
-
-
- - - -
- -
- Verify -
-
-
-
-
-
-
-
-`; 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 @@ -25,7 +25,6 @@ fromXecToSatoshis, getWalletBalanceFromUtxos, signUtxosByAddress, - getUtxoWif, generateTokenTxOutput, getCashtabByteCount, calcFee, @@ -141,7 +140,6 @@ }); it(`generateSendOpReturnScript() throws error on invalid input`, () => { - const BCH = new BCHJS(); const mockSendOpReturnTokenUtxos = null; const tokensToSend = 50; @@ -210,7 +208,6 @@ }); it(`generateGenesisOpReturn() throws error on invalid configObj`, () => { - const BCH = new BCHJS(); const configObj = null; let errorThrown; diff --git a/web/xecjs-message/CHANGELOG.md b/web/xecjs-message/CHANGELOG.md --- a/web/xecjs-message/CHANGELOG.md +++ b/web/xecjs-message/CHANGELOG.md @@ -33,3 +33,9 @@ **removed** - No changes. This is the first version published from the BitcoinABC monorepo. + +# 1.0.6 + +**removed** + +- All segwit support diff --git a/web/xecjs-message/index.js b/web/xecjs-message/index.js --- a/web/xecjs-message/index.js +++ b/web/xecjs-message/index.js @@ -4,11 +4,6 @@ const varuint = require('varuint-bitcoin'); const ecashaddr = require('ecashaddrjs'); -const SEGWIT_TYPES = { - P2WPKH: 'p2wpkh', - P2SH_P2WPKH: 'p2sh(p2wpkh)', -}; - function sha256(b) { return createHash('sha256').update(b).digest(); } @@ -19,13 +14,9 @@ return createHash('ripemd160').update(sha256(buffer)).digest(); } -function encodeSignature(signature, recovery, compressed, segwitType) { - if (segwitType !== undefined) { - recovery += 8; - if (segwitType === SEGWIT_TYPES.P2WPKH) recovery += 4; - } else { - if (compressed) recovery += 4; - } +function encodeSignature(signature, recovery, compressed) { + if (compressed) recovery += 4; + return Buffer.concat([Buffer.alloc(1, recovery + 27), signature]); } @@ -39,11 +30,6 @@ return { compressed: !!(flagByte & 12), - segwitType: !(flagByte & 8) - ? null - : !(flagByte & 4) - ? SEGWIT_TYPES.P2SH_P2WPKH - : SEGWIT_TYPES.P2WPKH, recovery: flagByte & 3, signature: buffer.slice(1), }; @@ -72,30 +58,10 @@ sigOptions = messagePrefixArg; messagePrefixArg = undefined; } - let { segwitType, extraEntropy } = sigOptions || {}; - if ( - segwitType && - (typeof segwitType === 'string' || segwitType instanceof String) - ) { - segwitType = segwitType.toLowerCase(); - } - if ( - segwitType && - segwitType !== SEGWIT_TYPES.P2SH_P2WPKH && - segwitType !== SEGWIT_TYPES.P2WPKH - ) { - throw new Error( - 'Unrecognized segwitType: use "' + - SEGWIT_TYPES.P2SH_P2WPKH + - '" or "' + - SEGWIT_TYPES.P2WPKH + - '"', - ); - } + let { extraEntropy } = sigOptions || {}; return { messagePrefixArg, - segwitType, extraEntropy, }; } @@ -105,7 +71,7 @@ } function sign(message, privateKey, compressed, messagePrefix, sigOptions) { - const { messagePrefixArg, segwitType, extraEntropy } = prepareSign( + const { messagePrefixArg, extraEntropy } = prepareSign( messagePrefix, sigOptions, ); @@ -113,19 +79,14 @@ const sigObj = isSigner(privateKey) ? privateKey.sign(hash, extraEntropy) : secp256k1.sign(hash, privateKey, { data: extraEntropy }); - return encodeSignature( - sigObj.signature, - sigObj.recovery, - compressed, - segwitType, - ); + return encodeSignature(sigObj.signature, sigObj.recovery, compressed); } function signAsync(message, privateKey, compressed, messagePrefix, sigOptions) { - let messagePrefixArg, segwitType, extraEntropy; + let messagePrefixArg, extraEntropy; return Promise.resolve() .then(() => { - ({ messagePrefixArg, segwitType, extraEntropy } = prepareSign( + ({ messagePrefixArg, extraEntropy } = prepareSign( messagePrefix, sigOptions, )); @@ -139,7 +100,6 @@ sigObj.signature, sigObj.recovery, compressed, - segwitType, ); }); } diff --git a/web/xecjs-message/package.json b/web/xecjs-message/package.json --- a/web/xecjs-message/package.json +++ b/web/xecjs-message/package.json @@ -1,6 +1,6 @@ { "name": "xecjs-message", - "version": "1.0.5", + "version": "1.0.6", "description": "xecjs-message", "keywords": [ "xecjs-message",