From 5b6077c2890a73fcdb9493ec566725b92bbe6de7 Mon Sep 17 00:00:00 2001 From: lbqds Date: Thu, 24 Oct 2024 08:26:44 +0800 Subject: [PATCH] Improve signing error messages --- .../extension/locales/en-US/translation.json | 1 + .../src/background/actionHandlers.ts | 38 ++++++++++++------- .../src/ui/features/actions/ActionScreen.tsx | 29 +++++++++----- 3 files changed, 45 insertions(+), 23 deletions(-) diff --git a/packages/extension/locales/en-US/translation.json b/packages/extension/locales/en-US/translation.json index ad25c7b0..108d7eb3 100644 --- a/packages/extension/locales/en-US/translation.json +++ b/packages/extension/locales/en-US/translation.json @@ -186,6 +186,7 @@ "Transaction building failed": "Transaction building failed", "Sending transaction failed": "Sending transaction failed", "Sign unsigned tx failed": "Sign unsigned tx failed", + "Sign message failed": "Sign message failed", "Add Network": "Add Network", "Switch Network": "Switch Network", "Network ID": "Network ID", diff --git a/packages/extension/src/background/actionHandlers.ts b/packages/extension/src/background/actionHandlers.ts index 8a65bf02..a4e4a45c 100644 --- a/packages/extension/src/background/actionHandlers.ts +++ b/packages/extension/src/background/actionHandlers.ts @@ -76,22 +76,32 @@ export const handleActionApproval = async ( } case "ALPH_SIGN_MESSAGE": { - const account = await wallet.getAccount({ - address: action.payload.signerAddress, - networkId: action.payload.networkId, - }) - if (!account) { - throw Error("No selected account") - } + try { + const account = await wallet.getAccount({ + address: action.payload.signerAddress, + networkId: action.payload.networkId, + }) + if (!account) { + throw Error("No selected account") + } + if (account.signer.type === 'ledger') { + throw Error("Signing messages with Ledger accounts is not supported") + } - const result = await wallet.signMessage(account, action.payload) + const result = await wallet.signMessage(account, action.payload) - return { - type: "ALPH_SIGN_MESSAGE_SUCCESS", - data: { - signature: result.signature, - actionHash, - }, + return { + type: "ALPH_SIGN_MESSAGE_SUCCESS", + data: { + signature: result.signature, + actionHash, + }, + } + } catch (error) { + return { + type: "ALPH_SIGN_MESSAGE_FAILURE", + data: { actionHash, error: `${error}` }, + } } } diff --git a/packages/extension/src/ui/features/actions/ActionScreen.tsx b/packages/extension/src/ui/features/actions/ActionScreen.tsx index 275ffc28..be72485c 100644 --- a/packages/extension/src/ui/features/actions/ActionScreen.tsx +++ b/packages/extension/src/ui/features/actions/ActionScreen.tsx @@ -188,15 +188,26 @@ export const ActionScreen: FC = () => { onSubmit={async () => { await approveAction(action) useAppState.setState({ isLoading: true }) - await waitForMessage( - "ALPH_SIGN_MESSAGE_SUCCESS", - ({ data }) => data.actionHash === action.meta.hash, - ) - await analytics.track("signedMessage", { - networkId: selectedAccount?.networkId || t("unknown"), - }) - closePopupIfLastAction() - useAppState.setState({ isLoading: false }) + const result = await Promise.race([ + waitForMessage( + 'ALPH_SIGN_MESSAGE_SUCCESS', + ({ data }) => data.actionHash === action.meta.hash, + ), + waitForMessage( + 'ALPH_SIGN_MESSAGE_FAILURE', + ({ data }) => data.actionHash === action.meta.hash, + ), + ]) + if ("error" in result) { + useAppState.setState({ + error: `${t('Sign message failed')}: ${result.error}`, + isLoading: false, + }) + navigate(routes.error()) + } else { + closePopupIfLastAction() + useAppState.setState({ isLoading: false }) + } }} onReject={onReject} selectedAccount={signerAccount}