Skip to content

Commit 4bf30dc

Browse files
committed
test: stx_signMessage
1 parent aa3d64a commit 4bf30dc

33 files changed

+2319
-1324
lines changed

package.json

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -146,15 +146,15 @@
146146
"@hirosystems/token-metadata-api-client": "1.2.0",
147147
"@hookform/resolvers": "3.9.1",
148148
"@leather.io/analytics": "2.0.1",
149-
"@leather.io/bitcoin": "0.19.18",
149+
"@leather.io/bitcoin": "0.19.19",
150150
"@leather.io/constants": "0.15.5",
151-
"@leather.io/crypto": "1.6.34",
151+
"@leather.io/crypto": "1.6.35",
152152
"@leather.io/models": "0.25.1",
153-
"@leather.io/query": "2.26.19",
154-
"@leather.io/stacks": "1.5.19",
155-
"@leather.io/tokens": "0.12.10",
156-
"@leather.io/ui": "1.48.2",
157-
"@leather.io/utils": "0.25.1",
153+
"@leather.io/query": "2.26.21",
154+
"@leather.io/stacks": "1.5.20",
155+
"@leather.io/tokens": "0.12.11",
156+
"@leather.io/ui": "1.48.3",
157+
"@leather.io/utils": "0.25.2",
158158
"@ledgerhq/hw-transport-webusb": "6.27.19",
159159
"@noble/hashes": "1.5.0",
160160
"@noble/secp256k1": "2.1.0",
@@ -173,7 +173,7 @@
173173
"@sentry/tracing": "7.106.0",
174174
"@stacks/auth": "7.0.2",
175175
"@stacks/common": "7.0.2",
176-
"@stacks/connect": "7.4.0",
176+
"@stacks/connect-jwt": "npm:@stacks/connect@7.4.0",
177177
"@stacks/encryption": "7.0.2",
178178
"@stacks/network": "7.0.2",
179179
"@stacks/network-v6": "npm:@stacks/[email protected]",
@@ -266,20 +266,20 @@
266266
"@actions/core": "1.10.1",
267267
"@chromatic-com/storybook": "3.2.2",
268268
"@leather.io/eslint-config": "0.7.0",
269-
"@leather.io/panda-preset": " 0.8.9",
269+
"@leather.io/panda-preset": "0.8.10",
270270
"@leather.io/prettier-config": "0.6.0",
271-
"@leather.io/rpc": "2.5.5",
271+
"@leather.io/rpc": "2.5.6",
272272
"@ls-lint/ls-lint": "2.2.3",
273273
"@mdx-js/loader": "3.0.0",
274274
"@pandacss/dev": "0.46.1",
275-
"@playwright/test": "1.48.2",
275+
"@playwright/test": "1.50.1",
276276
"@pmmmwh/react-refresh-webpack-plugin": "0.5.13",
277277
"@redux-devtools/cli": "4.0.0",
278278
"@redux-devtools/remote": "0.9.3",
279279
"@schemastore/web-manifest": "0.0.6",
280280
"@sentry/react": "8.26.0",
281281
"@sentry/webpack-plugin": "2.17.0",
282-
"@stacks/connect-react": "22.2.0",
282+
"@stacks/connect-react-jwt": "npm:@stacks/connect-react@22.2.0",
283283
"@stacks/stacks-blockchain-api-types": "7.8.2",
284284
"@storybook/addon-docs": "8.4.4",
285285
"@storybook/addon-essentials": "8.4.4",

pnpm-lock.yaml

Lines changed: 2120 additions & 1265 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/app/common/psbt/requests.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { TransactionInput } from '@scure/btc-signer/psbt';
2-
import { PsbtPayload } from '@stacks/connect';
2+
import { PsbtPayload } from '@stacks/connect-jwt';
33
import { decodeToken } from 'jsontokens';
44

55
import type { Money } from '@leather.io/models';

src/app/common/publish-subscribe.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { Transaction } from '@scure/btc-signer';
2-
import type { SignatureData } from '@stacks/connect';
2+
import type { SignatureData } from '@stacks/connect-jwt';
33
import type { StacksTransactionWire } from '@stacks/transactions';
44
import type { StacksTransaction } from '@stacks/transactions-v6';
55

src/app/features/ledger/flows/stacks-message-signing/stacks-message-signing-event-listeners.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { SignatureData } from '@stacks/connect-jwt';
12
import isEqual from 'lodash.isequal';
23

34
import type { UnsignedMessage } from '@shared/signature/signature-types';
@@ -6,7 +7,7 @@ import { GlobalAppEvents, appEvents } from '@app/common/publish-subscribe';
67

78
export async function listenForStacksMessageSigning(
89
unsignedMessage: UnsignedMessage
9-
): Promise<any> {
10+
): Promise<SignatureData> {
1011
return new Promise((resolve, reject) => {
1112
function stacksMessageSignedHandler(msg: GlobalAppEvents['ledgerStacksMessageSigned']) {
1213
if (isEqual(msg.unsignedMessage, unsignedMessage)) {

src/app/features/stacks-message-signer/stacks-message-signing.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ export function StacksMessageSigning({
6363
return (
6464
<MessageSigningRequestLayout>
6565
<MessageSigningHeader name={origin} origin={origin} />
66-
6766
{isUtf8MessageType(messageType) && payload.messageType === 'utf8' && (
6867
<StacksSignatureRequestMessageContent
6968
isLoading={isLoading}

src/app/features/stacks-message-signer/stacks-message-signing.utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { createDelay } from '@shared/utils';
1010

1111
import { useCurrentStacksAccount } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks';
1212

13-
export const improveUxWithShortDelayAsStacksSigningIsSoFast = createDelay(1000);
13+
export const improveUxWithShortDelayAsStacksSigningIsSoFast = createDelay(600);
1414

1515
export function useMessageSignerStacksSoftwareWallet() {
1616
const account = useCurrentStacksAccount();

src/app/features/stacks-message-signer/use-sign-stacks-message.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useState } from 'react';
22

3-
import { SignatureData } from '@stacks/connect';
3+
import { SignatureData } from '@stacks/connect-jwt';
44

55
import { logger } from '@shared/logger';
66
import { UnsignedMessage } from '@shared/signature/signature-types';

src/app/pages/rpc-sign-stacks-message/use-rpc-sign-stacks-message.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export function useRpcStacksMessagePayload() {
4545
appName,
4646
} satisfies Utf8Payload;
4747
}
48+
4849
if (isStructuredMessageType(messageType)) {
4950
if (!domain) return null;
5051

@@ -96,7 +97,10 @@ export function useRpcSignStacksMessage() {
9697
tabId,
9798
makeRpcSuccessResponse('stx_signMessage', {
9899
id: requestId,
99-
result: { signature: messageSignature.signature },
100+
result: {
101+
signature: messageSignature.signature,
102+
publicKey: messageSignature.publicKey,
103+
},
100104
})
101105
);
102106
closeWindow();

src/app/pages/swap/providers/use-stacks-swap.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { useCallback } from 'react';
22
import { useNavigate } from 'react-router-dom';
33

44
import { bytesToHex } from '@stacks/common';
5-
import { type ContractCallPayload, TransactionTypes } from '@stacks/connect';
5+
import { type ContractCallPayload, TransactionTypes } from '@stacks/connect-jwt';
66
import { PostConditionMode } from '@stacks/transactions';
77
import { serializeCV } from '@stacks/transactions-v6';
88
import type { RouteQuote } from 'bitflow-sdk';

src/app/store/transactions/contract-call-v6.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { hexToBytes } from '@stacks/common';
2-
import type { ContractCallPayload } from '@stacks/connect';
2+
import type { ContractCallPayload } from '@stacks/connect-jwt';
33
import {
44
AnchorMode,
55
BytesReader,

src/background/messaging/rpc-methods/sign-stacks-message.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export async function rpcSignStacksMessage(
6464
requestParams.push(['network', message.params.network.toString()]);
6565
}
6666

67-
if (isDefined(message.params.domain)) {
67+
if ('domain' in message.params) {
6868
requestParams.push([
6969
'domain',
7070
(message.params as StxSignMessageRequestParamsStructured).domain.toString(),

src/inpage/inpage.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { StacksProvider } from '@stacks/connect';
1+
import type { StacksProvider } from '@stacks/connect-jwt';
22

33
import { type LeatherRpcMethodMap, type RpcParameter, RpcRequest } from '@leather.io/rpc';
44

src/shared/actions/finalize-message-signature-format.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { SignatureData } from '@stacks/connect';
1+
import { SignatureData } from '@stacks/connect-jwt';
22

33
import { ExternalMethods, MESSAGE_SOURCE, SignatureResponseMessage } from '@shared/message-types';
44

src/shared/actions/finalize-message-signature.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { SignatureData } from '@stacks/connect';
1+
import { SignatureData } from '@stacks/connect-jwt';
22

33
import { closeWindow } from '@shared/utils';
44

src/shared/actions/finalize-psbt.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { PsbtData } from '@stacks/connect';
1+
import { PsbtData } from '@stacks/connect-jwt';
22

33
import { ExternalMethods, MESSAGE_SOURCE, PsbtResponseMessage } from '@shared/message-types';
44
import { closeWindow } from '@shared/utils';

src/shared/crypto/sign-message.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { type PrivateKey, bytesToHex } from '@stacks/common';
2-
import { SignatureData } from '@stacks/connect';
2+
import { SignatureData } from '@stacks/connect-jwt';
33
import { hashMessage } from '@stacks/encryption';
44
import {
55
ClarityValue,

src/shared/message-types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {
33
PsbtData,
44
SignatureData,
55
SponsoredFinishedTxPayload,
6-
} from '@stacks/connect';
6+
} from '@stacks/connect-jwt';
77
import { PublicProfile } from '@stacks/profile';
88

99
export const MESSAGE_SOURCE = 'stacks-wallet';

src/shared/utils/legacy-requests.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
ContractDeployPayload as ConnectContractDeployPayload,
55
ProfileUpdatePayload as ConnectProfileUpdatePayload,
66
STXTransferPayload as ConnectSTXTransferPayload,
7-
} from '@stacks/connect';
7+
} from '@stacks/connect-jwt';
88
import type { StacksNetwork } from '@stacks/network';
99
import type { PostCondition, PostConditionWire } from '@stacks/transactions';
1010
import { decodeToken } from 'jsontokens';

test-app/src/common/use-auth.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { useCallback, useEffect, useMemo } from 'react';
22

33
import { AppState, defaultState } from '@common/context';
44
import { AppConfig, UserSession } from '@stacks/auth';
5-
import { AuthOptions } from '@stacks/connect';
5+
import { AuthOptions } from '@stacks/connect-jwt';
66

77
export function useAuth() {
88
const [state, setState] = React.useState<AppState>(defaultState());

test-app/src/components/app.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import React from 'react';
33
import { AppContext } from '@common/context';
44
import { useAuth } from '@common/use-auth';
55
import { Home } from '@components/home';
6-
import { Connect } from '@stacks/connect-react';
6+
import { Connect } from '@stacks/connect-react-jwt';
77
import { Box, styled } from 'leather-styles/jsx';
88
import { Flex } from 'leather-styles/jsx';
99

test-app/src/components/auth.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react';
22

3-
import { useConnect } from '@stacks/connect-react';
3+
import { useConnect } from '@stacks/connect-react-jwt';
44
import { OnboardingSelectors } from '@tests/selectors/onboarding.selectors';
55
import { Box, styled } from 'leather-styles/jsx';
66

test-app/src/components/bitcoin.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import { AppContext } from '@common/context';
44
import { stacksTestnetNetwork } from '@common/utils';
55
import * as btc from '@scure/btc-signer';
66
import { bytesToHex, hexToBytes } from '@stacks/common';
7-
import { PsbtData, PsbtRequestOptions } from '@stacks/connect';
8-
import { useConnect } from '@stacks/connect-react';
7+
import { PsbtData, PsbtRequestOptions } from '@stacks/connect-jwt';
8+
import { useConnect } from '@stacks/connect-react-jwt';
99
import { StacksNetwork } from '@stacks/network';
1010
import { styled } from 'leather-styles/jsx';
1111

test-app/src/components/counter-actions.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { IntCV, deserializeCV } from '@blockstack/stacks-transactions';
44
import { AppContext } from '@common/context';
55
import { getRPCClient, stacksTestnetNetwork as network } from '@common/utils';
66
import { ExplorerLink } from '@components/explorer-link';
7-
import { useConnect } from '@stacks/connect-react';
7+
import { useConnect } from '@stacks/connect-react-jwt';
88
import { Box, Flex, styled } from 'leather-styles/jsx';
99

1010
export const CounterActions: React.FC = () => {

test-app/src/components/debugger.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
stacksTestnetNetwork,
1010
} from '@common/utils';
1111
import { hexToBytes } from '@stacks/common';
12-
import { useConnect } from '@stacks/connect-react';
12+
import { useConnect } from '@stacks/connect-react-jwt';
1313
import { STACKS_TESTNET } from '@stacks/network';
1414
import { type StacksTestnet } from '@stacks/network-v6';
1515
import {

test-app/src/components/deploy.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from 'react';
22

33
import { SampleContracts } from '@common/contracts';
4-
import { useConnect } from '@stacks/connect-react';
4+
import { useConnect } from '@stacks/connect-react-jwt';
55
import { Box, styled } from 'leather-styles/jsx';
66

77
import { ExplorerLink } from './explorer-link';

test-app/src/components/profile.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { useState } from 'react';
22

33
import { useAuth } from '@common/use-auth';
44
import { stacksMainnetNetwork, stacksTestnetNetwork } from '@common/utils';
5-
import { openProfileUpdateRequestPopup } from '@stacks/connect';
5+
import { openProfileUpdateRequestPopup } from '@stacks/connect-jwt';
66
import { StacksNetwork } from '@stacks/network';
77
import { PublicPersonProfile, PublicProfile } from '@stacks/profile';
88
import { TestAppSelectors } from '@tests/selectors/test-app.selectors';

test-app/src/components/signature.tsx

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
1-
import React, { useEffect, useState } from 'react';
1+
import { useEffect, useState } from 'react';
2+
import React from 'react';
23

3-
import {
4-
stacksTestnetNetwork as network,
5-
stacksMainnetNetwork,
6-
stacksTestnetNetwork,
7-
} from '@common/utils';
4+
import { stacksTestnetNetwork as network, stacksTestnetNetwork } from '@common/utils';
85
import { sha256 } from '@noble/hashes/sha256';
96
import { bytesToHex } from '@noble/hashes/utils';
10-
import { SignatureData } from '@stacks/connect';
11-
import { useConnect } from '@stacks/connect-react';
7+
import { SignatureData } from '@stacks/connect-jwt';
8+
import { useConnect } from '@stacks/connect-react-jwt';
129
import { hashMessage, verifyMessageSignatureRsv } from '@stacks/encryption';
1310
import { StacksNetwork } from '@stacks/network';
1411
import {
@@ -34,6 +31,14 @@ import {
3431
} from '@stacks/transactions';
3532
import { Box, styled } from 'leather-styles/jsx';
3633

34+
import { LeatherProvider } from '@leather.io/rpc';
35+
36+
declare global {
37+
interface Window {
38+
LeatherProvider?: LeatherProvider;
39+
}
40+
}
41+
3742
export const Signature = () => {
3843
const [signature, setSignature] = useState<SignatureData | undefined>();
3944
const [signatureStructured, setSignatureStructured] = useState<SignatureData | undefined>();
@@ -125,13 +130,24 @@ export const Signature = () => {
125130
};
126131

127132
const signMessageRpc = async (message: string) => {
133+
if (!window.LeatherProvider) throw new Error('LeatherProvider not found');
134+
128135
clearState();
129136
setCurrentMessage(message);
130137

131-
await window.btc?.request('stx_signMessage', {
138+
const result = await window.LeatherProvider.request('stx_signMessage', {
132139
message,
133140
messageType: 'utf8',
134141
});
142+
143+
const isValid = verifyMessageSignatureRsv({
144+
...result.result,
145+
message: hashMessage(message),
146+
});
147+
148+
console.log('Is message valid', isValid);
149+
150+
console.log('signature from rpc', result);
135151
};
136152

137153
const domain = tupleCV({
@@ -162,18 +178,22 @@ export const Signature = () => {
162178
};
163179

164180
const signStructureRpc = async (message: ClarityValue, domain: TupleCV) => {
181+
if (!window.LeatherProvider) throw new Error('LeatherProvider not found');
182+
165183
clearState();
166184
setCurrentStructuredData({ message, domain });
167185

168186
// ClarityValue -> Uint8Array -> Buffer -> string (hex)
169-
const stringMessage = Buffer.from(serializeCV(message)).toString('hex');
170-
const stringDomain = Buffer.from(serializeCV(domain)).toString('hex');
187+
const stringMessage = serializeCV(message);
188+
const stringDomain = serializeCV(domain);
171189

172-
await window.btc?.request('stx_signMessage', {
190+
const result = await window.LeatherProvider.request('stx_signMessage', {
173191
message: stringMessage,
174192
messageType: 'structured',
175193
domain: stringDomain,
176194
});
195+
196+
setSignatureStructured(result.result);
177197
};
178198

179199
const sip18Test = [
@@ -196,14 +216,10 @@ export const Signature = () => {
196216
</styled.span>
197217
</styled.span>
198218
)}
199-
<styled.button mt={3} onClick={() => signMessage(signatureMessage, stacksMainnetNetwork)}>
219+
<styled.button mt={3} onClick={() => signMessage(signatureMessage)}>
200220
Signature (Mainnet)
201221
</styled.button>
202-
<styled.button
203-
mt={3}
204-
ml={3}
205-
onClick={() => signMessage(signatureMessage, stacksTestnetNetwork)}
206-
>
222+
<styled.button mt={3} ml={3} onClick={() => signMessage(signatureMessage)}>
207223
Signature (Testnet)
208224
</styled.button>
209225
<br />

test-app/src/components/status.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
import { useSTXAddress } from '@common/use-stx-address';
1212
import { getRPCClient, stacksTestnetNetwork as network } from '@common/utils';
1313
import { TxCard } from '@components/tx-card';
14-
import { useConnect } from '@stacks/connect-react';
14+
import { useConnect } from '@stacks/connect-react-jwt';
1515
import type { ContractCallTransaction } from '@stacks/stacks-blockchain-api-types';
1616
import { Box, Flex, styled } from 'leather-styles/jsx';
1717

test-app/tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"noImplicitReturns": true,
2424
"noFallthroughCasesInSwitch": true,
2525
"resolveJsonModule": true,
26-
"moduleResolution": "node",
26+
"moduleResolution": "bundler",
2727
"paths": {
2828
"@store/*": ["./store/*"],
2929
"@store": ["./store/index"],

0 commit comments

Comments
 (0)