Skip to content

Commit

Permalink
Update params stx_getAccounts (#121)
Browse files Browse the repository at this point in the history
* Update params stx_getAccounts

* Add user cancellation handling

* Update params stx_getAddresses (#122)
  • Loading branch information
aryzing committed Mar 8, 2024
1 parent ee2b36e commit 90fd19b
Show file tree
Hide file tree
Showing 6 changed files with 125 additions and 21 deletions.
49 changes: 42 additions & 7 deletions src/app/hooks/useStxAccountRequest.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
import { MESSAGE_SOURCE } from '@common/types/message-types';
import {
sendGetAccountsSuccessResponseMessage,
sendUserRejectionMessage,
} from '@common/utils/rpc/stx/rpcResponseMessages';
import useWalletSelector from '@hooks/useWalletSelector';
import { bip32, bip39, bs58 } from '@secretkeylabs/xverse-core';
import { GAIA_HUB_URL } from '@secretkeylabs/xverse-core/constant';
Expand All @@ -9,18 +13,28 @@ import { GetAddressOptions } from 'sats-connect';
import useSeedVault from './useSeedVault';

const useStxAccountRequest = () => {
const { stxAddress, stxPublicKey } = useWalletSelector();
const { getSeed } = useSeedVault();
// Params
const { search } = useLocation();
const params = new URLSearchParams(search);

// Utils
const { stxAddress, stxPublicKey, network } = useWalletSelector();
const { getSeed } = useSeedVault();

// Related to WebBTC RPC request
const messageId = params.get('messageId') ?? '';
const tabId = Number(params.get('tabId')) ?? 0;
const rpcMethod = params.get('rpcMethod') ?? '';

// Legacy
const origin = params.get('origin') ?? '';
const requestToken = params.get('addressRequest') ?? '';
const request = useMemo(
() => decodeToken(requestToken) as any as GetAddressOptions,
() => (requestToken ? (decodeToken(requestToken) as any as GetAddressOptions) : (null as any)),
[requestToken],
);
const tabId = params.get('tabId') ?? '0';
const origin = params.get('origin') ?? '';

// Actions
const approveStxAccountRequest = useCallback(async () => {
const seedPhrase = await getSeed();
const seed = await bip39.mnemonicToSeed(seedPhrase);
Expand Down Expand Up @@ -49,10 +63,20 @@ const useStxAccountRequest = () => {
method: 'stx_getAccounts',
payload: { addressRequest: requestToken, addressResponse: response },
};
chrome.tabs.sendMessage(+tabId, addressMessage);
}, [getSeed, stxAddress, stxPublicKey, requestToken, tabId]);

if (rpcMethod === 'stx_getAccounts') {
sendGetAccountsSuccessResponseMessage({ tabId, messageId, result: response });
return;
}

chrome.tabs.sendMessage(+tabId, addressMessage);
}, [getSeed, stxAddress, stxPublicKey, requestToken, tabId, messageId, rpcMethod]);
const cancelAccountRequest = useCallback(() => {
if (rpcMethod === 'stx_getAccounts') {
sendUserRejectionMessage({ tabId, messageId });
return;
}

const addressMessage = {
source: MESSAGE_SOURCE,
method: 'stx_getAccounts',
Expand All @@ -61,6 +85,17 @@ const useStxAccountRequest = () => {
chrome.tabs.sendMessage(+tabId, addressMessage);
}, [requestToken, tabId]);

if (rpcMethod === 'stx_getAccounts') {
return {
payload: { network },
tabId,
origin,
requestToken,
approveStxAccountRequest,
cancelAccountRequest,
};
}

return {
payload: request.payload,
tabId,
Expand Down
40 changes: 35 additions & 5 deletions src/app/hooks/useStxAddressRequest.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,31 @@
import { MESSAGE_SOURCE } from '@common/types/message-types';
import { sendGetAddressesSuccessResponseMessage } from '@common/utils/rpc/stx/rpcResponseMessages';
import useWalletSelector from '@hooks/useWalletSelector';
import { decodeToken } from 'jsontokens';
import { useCallback, useMemo } from 'react';
import { useLocation } from 'react-router-dom';
import { GetAddressOptions } from 'sats-connect';

const useStxAddressRequest = () => {
const { stxAddress, stxPublicKey } = useWalletSelector();
// Params
const { search } = useLocation();
const params = new URLSearchParams(search);

// Utils
const { stxAddress, stxPublicKey, network } = useWalletSelector();

// Related to WebBTC RPC request
const messageId = params.get('messageId') ?? '';
const tabId = Number(params.get('tabId')) ?? 0;
const rpcMethod = params.get('rpcMethod') ?? '';

// Legacy
const origin = params.get('origin') ?? '';
const requestToken = params.get('addressRequest') ?? '';
const request = useMemo(
() => decodeToken(requestToken) as any as GetAddressOptions,
() => (requestToken ? (decodeToken(requestToken) as any as GetAddressOptions) : (null as any)),
[requestToken],
);
const tabId = params.get('tabId') ?? '0';
const origin = params.get('origin') ?? '';

const approveStxAddressRequest = useCallback(() => {
const addressesResponse = [
Expand All @@ -33,9 +43,18 @@ const useStxAddressRequest = () => {
method: 'stx_getAddresses',
payload: { addressRequest: requestToken, addressResponse: response },
};

if (rpcMethod === 'stx_getAddresses') {
sendGetAddressesSuccessResponseMessage({
tabId,
messageId,
result: response,
});
return;
}

chrome.tabs.sendMessage(+tabId, addressMessage);
}, [stxAddress, stxPublicKey, requestToken, tabId]);

const cancelAddressRequest = useCallback(() => {
const addressMessage = {
source: MESSAGE_SOURCE,
Expand All @@ -45,6 +64,17 @@ const useStxAddressRequest = () => {
chrome.tabs.sendMessage(+tabId, addressMessage);
}, [requestToken, tabId]);

if (rpcMethod === 'stx_getAddresses') {
return {
payload: { network },
tabId,
origin,
requestToken,
approveStxAddressRequest,
cancelAddressRequest,
};
}

return {
payload: request.payload,
tabId,
Expand Down
2 changes: 1 addition & 1 deletion src/app/screens/connect/stxSelectAccountScreen/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ function StxSelectAccountScreen() {

const confirmCallback = async () => {
setLoading(true);
approveStxAccountRequest();
await approveStxAccountRequest();
window.close();
};

Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,30 @@
import { WebBtcMessage } from '@common/types/message-types';
import { getTabIdFromPort, isUndefined } from '@common/utils';
import { RpcErrorCode } from 'sats-connect';
import {
listenForPopupClose,
makeSearchParamsWithDefaults,
triggerRequestWindowOpen,
} from '../../legacy-external-message-handler';
import RequestsRoutes from '../../route-urls';
import { makeRPCError } from '../helpers';
} from '../../../legacy-external-message-handler';
import RequestsRoutes from '../../../route-urls';
import { makeRPCError } from '../../helpers';
import { sendMissingParametersMessage } from '../rpcResponseMessages';

const handleGetStxAccounts = async (
message: WebBtcMessage<'stx_getAccounts'>,
port: chrome.runtime.Port,
) => {
const { urlParams, tabId } = makeSearchParamsWithDefaults(port);
if (isUndefined(message.params)) {
sendMissingParametersMessage({ tabId: getTabIdFromPort(port), messageId: message.id });
return;
}

const popupParams = {
messageId: message.id,
rpcMethod: 'stx_getAccounts',
};

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

const { id } = await triggerRequestWindowOpen(RequestsRoutes.StxAccountRequest, urlParams);
listenForPopupClose({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,20 @@ import {
listenForPopupClose,
makeSearchParamsWithDefaults,
triggerRequestWindowOpen,
} from '../../legacy-external-message-handler';
import RequestsRoutes from '../../route-urls';
import { makeRPCError } from '../helpers';
} from '../../../legacy-external-message-handler';
import RequestsRoutes from '../../../route-urls';
import { makeRPCError } from '../../helpers';

const handleGetStxAddresses = async (
message: WebBtcMessage<'stx_getAddresses'>,
port: chrome.runtime.Port,
) => {
const { urlParams, tabId } = makeSearchParamsWithDefaults(port);
const popupParams = {
messageId: message.id,
rpcMethod: 'stx_getAddresses',
};

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

const { id } = await triggerRequestWindowOpen(RequestsRoutes.StxAddressRequest, urlParams);
listenForPopupClose({
Expand Down
22 changes: 22 additions & 0 deletions src/common/utils/rpc/stx/rpcResponseMessages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -127,3 +127,25 @@ export function sendStxTransferSuccessResponseMessage({
}: StxTransferSuccessArgs) {
sendRpcResponse(tabId, makeRpcSuccessResponse(messageId, result));
}

type GetAccountsSuccess = BaseArgs & {
result: Return<'stx_getAccounts'>;
};
export function sendGetAccountsSuccessResponseMessage({
tabId,
messageId,
result,
}: GetAccountsSuccess) {
sendRpcResponse(tabId, makeRpcSuccessResponse(messageId, result));
}

type GetAddressesSuccess = BaseArgs & {
result: Return<'stx_getAddresses'>;
};
export function sendGetAddressesSuccessResponseMessage({
tabId,
messageId,
result,
}: GetAddressesSuccess) {
sendRpcResponse(tabId, makeRpcSuccessResponse(messageId, result));
}

0 comments on commit 90fd19b

Please sign in to comment.