Skip to content

Commit

Permalink
feat: add stx_signStructuredMessage, closes LEA-1960
Browse files Browse the repository at this point in the history
  • Loading branch information
kyranjamie committed Feb 10, 2025
1 parent ea68e3c commit 5e899ba
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 24 deletions.
10 changes: 9 additions & 1 deletion src/background/messaging/rpc-message-handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@ import { rpcOpen } from './rpc-methods/open';
import { rpcSendTransfer } from './rpc-methods/send-transfer';
import { rpcSignMessage } from './rpc-methods/sign-message';
import { rpcSignPsbt } from './rpc-methods/sign-psbt';
import { rpcSignStacksMessage } from './rpc-methods/sign-stacks-message';
import {
rpcSignStacksMessage,
rpcSignStacksStructuredMessage,
} from './rpc-methods/sign-stacks-message';
import { rpcStxCallContract } from './rpc-methods/stx-call-contract';
import { rpcStxGetAddresses } from './rpc-methods/stx-get-addresses';
import { rpcSupportedMethods } from './rpc-methods/supported-methods';
Expand Down Expand Up @@ -69,6 +72,11 @@ export async function rpcMessageHandler(message: WalletRequests, port: chrome.ru
break;
}

case 'stx_signStructuredMessage': {
await rpcSignStacksStructuredMessage(message, port);
break;
}

case 'stx_getAddresses': {
await rpcStxGetAddresses(message, port);
break;
Expand Down
75 changes: 53 additions & 22 deletions src/background/messaging/rpc-methods/sign-stacks-message.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import { serializeCV } from '@stacks/transactions';

import {
RpcErrorCode,
type StxSignMessageRequest,
type StxSignMessageRequestParamsStructured,
type StxSignStructuredMessageRequest,

Check failure on line 7 in src/background/messaging/rpc-methods/sign-stacks-message.ts

View workflow job for this annotation

GitHub Actions / typecheck

'"@leather.io/rpc"' has no exported member named 'StxSignStructuredMessageRequest'. Did you mean 'StxSignMessageRequest'?
} from '@leather.io/rpc';
import { isDefined, isUndefined } from '@leather.io/utils';
import { isDefined, isString, isUndefined } from '@leather.io/utils';

import { RouteUrls } from '@shared/route-urls';
import {
Expand All @@ -21,15 +24,17 @@ import {
} from '../messaging-utils';
import { trackRpcRequestError, trackRpcRequestSuccess } from '../rpc-message-handler';

export async function rpcSignStacksMessage(
message: StxSignMessageRequest,
port: chrome.runtime.Port
async function handleRpcSignStacksMessage(
method: 'stx_signMessage' | 'stx_signStructuredMessage',
message: StxSignMessageRequest | StxSignStructuredMessageRequest,
port: chrome.runtime.Port,
requestParams: RequestParams
) {
if (isUndefined(message.params)) {
void trackRpcRequestError({ endpoint: message.method, error: 'Undefined parameters' });
void trackRpcRequestError({ endpoint: method, error: 'Undefined parameters' });
chrome.tabs.sendMessage(
getTabIdFromPort(port),
makeRpcErrorResponse('stx_signMessage', {
makeRpcErrorResponse(method, {
id: message.id,
error: { code: RpcErrorCode.INVALID_REQUEST, message: 'Parameters undefined' },
})
Expand All @@ -38,10 +43,10 @@ export async function rpcSignStacksMessage(
}

if (!validateRpcSignStacksMessageParams(message.params)) {
void trackRpcRequestError({ endpoint: message.method, error: 'Invalid parameters' });
void trackRpcRequestError({ endpoint: method, error: 'Invalid parameters' });
chrome.tabs.sendMessage(
getTabIdFromPort(port),
makeRpcErrorResponse('stx_signMessage', {
makeRpcErrorResponse(method, {
id: message.id,
error: {
code: RpcErrorCode.INVALID_PARAMS,
Expand All @@ -52,8 +57,26 @@ export async function rpcSignStacksMessage(
return;
}

void trackRpcRequestSuccess({ endpoint: message.method });
void trackRpcRequestSuccess({ endpoint: method });

const { urlParams, tabId } = makeSearchParamsWithDefaults(port, requestParams);

const { id } = await triggerRequestWindowOpen(RouteUrls.RpcStacksSignature, urlParams);

listenForPopupClose({
tabId,
id,
response: makeRpcErrorResponse(method, {
id: message.id,
error: {
code: RpcErrorCode.USER_REJECTION,
message: 'User rejected the Stacks message signing request',
},
}),
});
}

export function rpcSignStacksMessage(message: StxSignMessageRequest, port: chrome.runtime.Port) {
const requestParams: RequestParams = [
['message', message.params.message],
['messageType', message.params.messageType],
Expand All @@ -71,19 +94,27 @@ export async function rpcSignStacksMessage(
]);
}

const { urlParams, tabId } = makeSearchParamsWithDefaults(port, requestParams);
return handleRpcSignStacksMessage('stx_signMessage', message, port, requestParams);
}

const { id } = await triggerRequestWindowOpen(RouteUrls.RpcStacksSignature, urlParams);
export function rpcSignStacksStructuredMessage(
message: StxSignStructuredMessageRequest,
port: chrome.runtime.Port
) {
const requestParams: RequestParams = [
['requestId', message.id],
['messageType', 'structured'],
[
'message',
isString(message.params.message)
? message.params.message
: serializeCV(message.params.message),
],
[
'domain',
isString(message.params.domain) ? message.params.domain : serializeCV(message.params.domain),
],
];

listenForPopupClose({
tabId,
id,
response: makeRpcErrorResponse('stx_signMessage', {
id: message.id,
error: {
code: RpcErrorCode.USER_REJECTION,
message: 'User rejected the Stacks message signing request',
},
}),
});
return handleRpcSignStacksMessage('stx_signStructuredMessage', message, port, requestParams);
}
2 changes: 1 addition & 1 deletion test-app/src/components/signature.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ export const Signature = () => {
const stringMessage = serializeCV(message);
const stringDomain = serializeCV(domain);

const result = await window.LeatherProvider.request('stx_signMessage', {
const result = await window.LeatherProvider.request('stx_signStructuredMessage', {
message: stringMessage,
messageType: 'structured',
domain: stringDomain,
Expand Down

0 comments on commit 5e899ba

Please sign in to comment.