test(bip322): integration test message signing

This commit is contained in:
kyranjamie
2023-05-09 20:13:27 +02:00
committed by kyranjamie
parent c13ae584a4
commit 950db679c2
5 changed files with 79 additions and 24 deletions

View File

@@ -224,7 +224,7 @@
"@babel/core": "7.20.12", "@babel/core": "7.20.12",
"@babel/preset-react": "7.18.6", "@babel/preset-react": "7.18.6",
"@babel/preset-typescript": "7.18.6", "@babel/preset-typescript": "7.18.6",
"@btckit/types": "0.0.16", "@btckit/types": "0.0.18",
"@emotion/babel-plugin": "11.10.5", "@emotion/babel-plugin": "11.10.5",
"@emotion/babel-preset-css-prop": "11.10.0", "@emotion/babel-preset-css-prop": "11.10.0",
"@emotion/cache": "11.10.5", "@emotion/cache": "11.10.5",

View File

@@ -1,7 +1,7 @@
import { useMemo, useState } from 'react'; import { useMemo, useState } from 'react';
import toast from 'react-hot-toast'; import toast from 'react-hot-toast';
import { RpcErrorCode } from '@btckit/types'; import { PaymentTypes, RpcErrorCode } from '@btckit/types';
import * as bitcoin from 'bitcoinjs-lib'; import * as bitcoin from 'bitcoinjs-lib';
import { import {
@@ -34,7 +34,10 @@ function useRpcSignBitcoinMessage() {
...defaultParams, ...defaultParams,
requestId: initialSearchParams.get('requestId') ?? '', requestId: initialSearchParams.get('requestId') ?? '',
message: initialSearchParams.get('message') ?? '', message: initialSearchParams.get('message') ?? '',
paymentType: (initialSearchParams.get('paymentType') ?? 'p2wpkh') as 'p2tr' | 'p2wpkh', paymentType: (initialSearchParams.get('paymentType') ?? 'p2wpkh') as Extract<
'p2tr' | 'p2wpkh',
PaymentTypes
>,
}), }),
[defaultParams] [defaultParams]
); );
@@ -96,7 +99,7 @@ function useSignBip322MessageFactory({ address, signPsbt }: SignBip322MessageFac
tabId, tabId,
makeRpcSuccessResponse('signMessage', { makeRpcSuccessResponse('signMessage', {
id: requestId, id: requestId,
result: { signature, address, message } as any, result: { signature, address, message },
}) })
); );

View File

@@ -160,19 +160,3 @@ export const timeDifference = (startDate: Date, endDate: Date) => {
const seconds = (endDate.getTime() - startDate.getTime()) / 1000; const seconds = (endDate.getTime() - startDate.getTime()) / 1000;
return seconds; return seconds;
}; };
// TODO: Need to fix this. It is producing an error: `Unable to fetch info from node.`
// I don't even understand why this is being used in a test to check a balance?
//
// export const addAPINetwork = async (wallet: WalletPage) => {
// await wallet.clickSettingsButton();
// await wallet.page.click(createTestSelector(SettingsSelectors.ChangeNetworkAction));
// await wallet.page.click(createTestSelector(SettingsSelectors.BtnAddNetwork));
// const networkPage: NetworkPage = new NetworkPage(wallet.page);
// await networkPage.inputNetworkNameField('api');
// await networkPage.inputNetworkAddressField(
// process.env.APIEnvVariable || 'https://stacks-node-api-inactive.stacks.co/'
// );
// await networkPage.inputNetworkKeyField('api');
// await networkPage.clickAddNetwork();
// };

View File

@@ -0,0 +1,68 @@
import { BrowserContext, Page } from '@playwright/test';
import { test } from '../../fixtures/fixtures';
test.describe('Message signing', () =>
test.describe('BIP-322 message signing', () => {
test.beforeEach(async ({ extensionId, globalPage, onboardingPage, page }) => {
await globalPage.setupAndUseApiCalls(extensionId);
await onboardingPage.signInExistingUser();
await page.goto('https://wallet.hiro.so');
});
function clickActionButton(context: BrowserContext) {
return async (buttonToPress: 'Cancel' | 'Sign') => {
const popup = await context.waitForEvent('page');
const btn = popup.locator(`text="${buttonToPress}"`);
await btn.click();
};
}
function initiateMessageSigning(page: Page) {
return async (message: string) =>
page.evaluate(
async message =>
(window as any).HiroWalletProvider.request('signMessage', {
message,
}).catch((e: unknown) => e),
message
);
}
test('Signature approved', async ({ page, context }) => {
const [result] = await Promise.all([
initiateMessageSigning(page)('test'),
clickActionButton(context)('Sign'),
]);
// ID is random, so we anticipate it
delete result.id;
test.expect(result).toEqual({
jsonrpc: '2.0',
result: {
signature:
'AkcwRAIgdvIlzioQtCWH+p3yLgHcBOIcHCzK2FysW1sZ6IuS2foCIGZUMUUg8emDxtsE5XZh4CDsVM64jL8SssFMpq0kIaqJASEDYBnHwvCycDDBY1EklpMD4+R6Z+KBIwYMwApNNhWs220=',
address: 'bc1qhdykvr9eafepm9cf6aryk0stmmwpv4wws9raj5',
message: 'test',
},
});
});
test('Signature rejected', async ({ page, context }) => {
const [result] = await Promise.all([
initiateMessageSigning(page)('test'),
clickActionButton(context)('Cancel'),
]);
delete result.id;
test.expect(result).toEqual({
jsonrpc: '2.0',
error: {
code: 4001,
message: 'User rejected message signing request',
},
});
});
}));

View File

@@ -713,10 +713,10 @@
sha.js "^2.4.11" sha.js "^2.4.11"
smart-buffer "^4.1.0" smart-buffer "^4.1.0"
"@btckit/types@0.0.16": "@btckit/types@0.0.18":
version "0.0.16" version "0.0.18"
resolved "https://registry.yarnpkg.com/@btckit/types/-/types-0.0.16.tgz#f63a62e052d3d852083c3b7b38f7d8939af78ec0" resolved "https://registry.yarnpkg.com/@btckit/types/-/types-0.0.18.tgz#48bd0b564a9c14bf0c670b0834131e5054c20d69"
integrity sha512-giSLXXe7hYubCkzqVgBIbBDH4StiSGTPUs+Nd4WIKVumf0hz8xrrubv7HUSgkpG2gsMXPzTIRDF6rorhKRt4xA== integrity sha512-2b/Ny4rZ+TbGW59xiV/PvXRP1cnF40874t12OzeVKa/BghxBFazEayDHce9YtPTkxQ4ilQkmeNrS67FWK4OsGA==
"@coinbase/cbpay-js@1.0.2": "@coinbase/cbpay-js@1.0.2":
version "1.0.2" version "1.0.2"