diff --git a/src/app/pages/choose-account-request/account-request.tsx b/src/app/pages/choose-account-request/account-request.tsx
index b370fcc8a06..1d53508bd98 100644
--- a/src/app/pages/choose-account-request/account-request.tsx
+++ b/src/app/pages/choose-account-request/account-request.tsx
@@ -1,3 +1,4 @@
+import { useEffect } from 'react';
import { logger } from '@shared/logger';
import { useRouteHeader } from '@app/common/hooks/use-route-header';
@@ -10,26 +11,30 @@ import {
sendRequestAccountResponseToTab,
sendUserDeniesAccountRequest,
} from '@app/common/actions/send-request-account-response';
+import { useUserGrantsPermissionToAppDomain } from '@app/store/apps/apps.actions';
import { useAccountRequestSearchParams } from './use-account-request-search-params';
-import { useEffect } from 'react';
export function AccountRequest() {
const accounts = useAccounts();
const { name: appName } = useAppDetails();
+ const grantDomainPermission = useUserGrantsPermissionToAppDomain();
- const { tabId, id } = useAccountRequestSearchParams();
+ const { tabId, id, origin } = useAccountRequestSearchParams();
useRouteHeader();
const returnAccountDetailsToApp = (index: number) => {
if (!accounts) throw new Error('Cannot request account details with no account');
- if (!tabId || !id) {
- logger.error('Missing either tabId or uuid. Both values are necessary to respond to app');
+ if (!tabId || !id || !origin) {
+ logger.error(
+ 'Missing necessary search param values. All values are necessary to respond to app'
+ );
return;
}
+ grantDomainPermission(origin);
sendRequestAccountResponseToTab({ tabId, id, account: accounts[index] });
window.close();
};
@@ -45,6 +50,7 @@ export function AccountRequest() {
useEffect(() => {
window.addEventListener('beforeunload', handleUnmount);
return () => window.removeEventListener('beforeunload', handleUnmount);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return (
diff --git a/src/app/pages/choose-account-request/use-account-request-search-params.ts b/src/app/pages/choose-account-request/use-account-request-search-params.ts
index 82ae533d80c..47c648c9d3c 100644
--- a/src/app/pages/choose-account-request/use-account-request-search-params.ts
+++ b/src/app/pages/choose-account-request/use-account-request-search-params.ts
@@ -8,6 +8,7 @@ export function useAccountRequestSearchParams() {
() => ({
tabId: searchParams.get('tabId'),
id: searchParams.get('id'),
+ origin: searchParams.get('origin'),
}),
[searchParams]
);
diff --git a/src/app/pages/transaction-request/components/submit-action.tsx b/src/app/pages/transaction-request/components/submit-action.tsx
index 583029ff291..f29a3901973 100644
--- a/src/app/pages/transaction-request/components/submit-action.tsx
+++ b/src/app/pages/transaction-request/components/submit-action.tsx
@@ -11,6 +11,7 @@ import { ShowEditNonceAction, ShowEditNoncePlaceholder } from '@app/components/s
import { useTransactionError } from '@app/pages/transaction-request/hooks/use-transaction-error';
import { useFeeEstimationsState } from '@app/store/transactions/fees.hooks';
import { TransactionSigningSelectors } from '@tests/page-objects/transaction-signing.selectors';
+import { TransactionErrorReason } from './transaction-error/transaction-error';
function BaseConfirmButton(props: ButtonProps): JSX.Element {
return (
diff --git a/src/app/store/apps/apps.actions.ts b/src/app/store/apps/apps.actions.ts
index e69de29bb2d..d2856b31b5c 100644
--- a/src/app/store/apps/apps.actions.ts
+++ b/src/app/store/apps/apps.actions.ts
@@ -0,0 +1,17 @@
+import { useCallback } from 'react';
+import { useDispatch } from 'react-redux';
+
+import { appsSlice } from './apps.slice';
+
+export const appActions = appsSlice.actions;
+
+export function useUserGrantsPermissionToAppDomain() {
+ const dispatch = useDispatch();
+ return useCallback(
+ (domain: string) => {
+ const host = new URL(domain).host;
+ dispatch(appActions.appConnected({ domain: host }));
+ },
+ [dispatch]
+ );
+}
diff --git a/src/app/store/index.ts b/src/app/store/index.ts
index eb47923f143..dc48e34370d 100644
--- a/src/app/store/index.ts
+++ b/src/app/store/index.ts
@@ -40,7 +40,7 @@ const persistConfig = {
version: 1,
storage,
serialize: true,
- whitelist: ['keys', 'chains', 'onboarding', 'analytics'],
+ whitelist: ['apps', 'keys', 'chains', 'onboarding', 'analytics'],
};
const persistedReducer = persistReducer(persistConfig, rootReducer);
diff --git a/src/app/store/wallet/wallet.hooks.ts b/src/app/store/wallet/wallet.hooks.ts
index 5c1e3029a46..2b8d45bbd22 100644
--- a/src/app/store/wallet/wallet.hooks.ts
+++ b/src/app/store/wallet/wallet.hooks.ts
@@ -17,6 +17,7 @@ import { finalizeAuthResponse } from '@app/common/actions/finalize-auth-response
import { logger } from '@shared/logger';
import { encryptedSecretKeyState, secretKeyState, walletState } from './wallet';
import { useKeyActions } from '@app/common/hooks/use-key-actions';
+import { useUserGrantsPermissionToAppDomain } from '../apps/apps.actions';
export function useWalletState() {
return useAtom(walletState);
@@ -47,6 +48,7 @@ export function useSetLatestNonceCallback() {
export function useFinishSignInCallback() {
const { decodedAuthRequest, authRequest, appName, appIcon } = useOnboardingState();
const keyActions = useKeyActions();
+ const grantPermissionToDomain = useUserGrantsPermissionToAppDomain();
return useAtomCallback(
useCallback(
async (get, _set, accountIndex) => {
@@ -84,9 +86,10 @@ export function useFinishSignInCallback() {
account,
});
keyActions.switchAccount(accountIndex);
+ grantPermissionToDomain(appURL.origin);
finalizeAuthResponse({ decodedAuthRequest, authRequest, authResponse });
},
- [decodedAuthRequest, authRequest, appIcon, appName, keyActions]
+ [decodedAuthRequest, authRequest, appIcon, appName, keyActions, grantPermissionToDomain]
)
);
}
diff --git a/src/inpage/inpage.ts b/src/inpage/inpage.ts
index 0c1275ee992..3b626624d4d 100644
--- a/src/inpage/inpage.ts
+++ b/src/inpage/inpage.ts
@@ -118,16 +118,20 @@ const provider: StacksProvider = {
},
async request(method: RpcMethodNames, params?: any[]): Promise {
- return new Promise((resolve, _reject) => {
+ return new Promise((resolve, reject) => {
const id = crypto.randomUUID();
- const event = new CustomEvent(DomEventName.rpcRequest, {
- detail: { jsonrpc: '2.0', id, method, params },
- });
- document.dispatchEvent(event);
+ console.log('request');
+ document.dispatchEvent(
+ new CustomEvent(DomEventName.rpcRequest, {
+ detail: { jsonrpc: '2.0', id, method, params },
+ })
+ );
+ // @TODO: add RPC response type
const handleMessage = (event: MessageEvent) => {
if (event.data.id !== id) return;
window.removeEventListener('message', handleMessage);
- resolve(event.data);
+ if (event.data.error) reject(event.data.error);
+ resolve(event.data.result);
};
window.addEventListener('message', handleMessage);
});
diff --git a/src/shared/message-types.ts b/src/shared/message-types.ts
index a81f65d87ef..ae408a6e335 100644
--- a/src/shared/message-types.ts
+++ b/src/shared/message-types.ts
@@ -61,7 +61,7 @@ export type RpcResponseArgs = RpcSuccessResponseArgs | RpcErrorResponseArgs;
export enum RpcMethods {
stx_requestAccounts,
- stx_testAnotherMethod,
+ stx_signTransactionRequest,
}
export type RpcMethodNames = keyof typeof RpcMethods;
@@ -73,9 +73,9 @@ interface RpcMessage {
}
type RequestAccounts = RpcMessage<'stx_requestAccounts'>;
-type TestAction = RpcMessage<'stx_testAnotherMethod'>;
+type SignTransactionRequest = RpcMessage<'stx_signTransactionRequest'>;
-export type SupportedRpcMessages = RequestAccounts | TestAction;
+export type SupportedRpcMessages = RequestAccounts | SignTransactionRequest;
//
// Deprecated methods