diff --git a/packages/extension-base/src/koni/background/handlers/State.ts b/packages/extension-base/src/koni/background/handlers/State.ts index 8354010df8..feb1408044 100644 --- a/packages/extension-base/src/koni/background/handlers/State.ts +++ b/packages/extension-base/src/koni/background/handlers/State.ts @@ -1229,8 +1229,8 @@ export default class KoniState { throw new BitcoinProviderError(BitcoinProviderErrorType.INVALID_PARAMS, t('Not found payload to sign')); } - if (!isHex(psbt)) { - throw new BitcoinProviderError(BitcoinProviderErrorType.INVALID_PARAMS, t('Psbt to be signed must be base64-encoded')); + if (!isHex(`0x${psbt}`)) { + throw new BitcoinProviderError(BitcoinProviderErrorType.INVALID_PARAMS, t('Psbt to be signed must be hex-encoded')); } let canSign = true; diff --git a/packages/extension-base/src/services/request-service/handler/BitcoinRequestHandler.ts b/packages/extension-base/src/services/request-service/handler/BitcoinRequestHandler.ts index 635f32e4ca..df9cb75a3a 100644 --- a/packages/extension-base/src/services/request-service/handler/BitcoinRequestHandler.ts +++ b/packages/extension-base/src/services/request-service/handler/BitcoinRequestHandler.ts @@ -1,7 +1,8 @@ // Copyright 2019-2022 @subwallet/extension-base authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { ConfirmationDefinitionsBitcoin, ConfirmationsQueueBitcoin, ConfirmationsQueueItemOptions, ConfirmationTypeBitcoin, RequestConfirmationCompleteBitcoin, SignMessageBitcoinResult, SignPsbtBitcoinResult } from '@subwallet/extension-base/background/KoniTypes'; +import { BitcoinProviderError } from '@subwallet/extension-base/background/errors/BitcoinProviderError'; +import { BitcoinProviderErrorType, ConfirmationDefinitionsBitcoin, ConfirmationsQueueBitcoin, ConfirmationsQueueItemOptions, ConfirmationTypeBitcoin, RequestConfirmationCompleteBitcoin, SignMessageBitcoinResult, SignPsbtBitcoinResult } from '@subwallet/extension-base/background/KoniTypes'; import { ConfirmationRequestBase, Resolver } from '@subwallet/extension-base/background/types'; import RequestService from '@subwallet/extension-base/services/request-service'; import { isInternalRequest } from '@subwallet/extension-base/utils/request'; @@ -196,6 +197,10 @@ export default class BitcoinRequestHandler { const { accounts, payload } = request.payload; const { psbt, signingIndexes } = payload; + if (accounts.length === 0) { + throw new BitcoinProviderError(BitcoinProviderErrorType.INVALID_PARAMS, 'Please connect to Wallet to try this request'); + } + const psbtList = accounts.map(({ address }) => { const pair = keyring.getPair(address); @@ -204,16 +209,13 @@ export default class BitcoinRequestHandler { keyring.unlockPair(pair.address); } - // Finalize all inputs in the Psbt - // Sign the Psbt using the pair's bitcoin object const signedTransaction = pair.bitcoin.signTransaction(psbt, signingIndexes[address]); return signedTransaction.finalizeAllInputs(); }); - const psbtCombine = new Psbt().combine(...psbtList); - + const psbtCombine = psbtList[0].combine(...psbtList); const transactionObj = psbt.extractTransaction(); return { @@ -258,12 +260,16 @@ export default class BitcoinRequestHandler { } if (isApproved) { - // Fill signature for some special type - await this.decorateResultBitcoin(type, confirmation, result); - const error = validator && validator(result); - - if (error) { - resolver.reject(error); + try { + // Fill signature for some special type + await this.decorateResultBitcoin(type, confirmation, result); + const error = validator && validator(result); + + if (error) { + resolver.reject(error); + } + } catch (e) { + resolver.reject(e as Error); } } diff --git a/packages/extension-koni-ui/src/Popup/Confirmations/parts/Sign/Bitcoin.tsx b/packages/extension-koni-ui/src/Popup/Confirmations/parts/Sign/Bitcoin.tsx index 5a4b0d23da..9cd664be62 100644 --- a/packages/extension-koni-ui/src/Popup/Confirmations/parts/Sign/Bitcoin.tsx +++ b/packages/extension-koni-ui/src/Popup/Confirmations/parts/Sign/Bitcoin.tsx @@ -64,7 +64,7 @@ const Component: React.FC = (props: Props) => { const chain = useGetChainInfoByChainId(chainId); const checkUnlock = useUnlockChecker(); - const signMode = useMemo(() => getSignMode(account || accounts[0]?.address), [account, accounts]); + const signMode = useMemo(() => getSignMode(account || accounts[0]), [account, accounts]); const isLedger = useMemo(() => signMode === AccountSignMode.LEDGER, [signMode]); const isMessage = isBitcoinMessage(payload); @@ -147,7 +147,7 @@ const Component: React.FC = (props: Props) => { setLoading(true); setTimeout(() => { - const signPromise = isMessage ? ledgerSignMessage(u8aToU8a(hashPayload), account.accountIndex, account.addressOffset) : ledgerSignTransaction(hexToU8a(hashPayload), account.accountIndex, account.addressOffset); + const signPromise = isMessage ? ledgerSignMessage(u8aToU8a(hashPayload), account?.accountIndex, account?.addressOffset) : ledgerSignTransaction(hexToU8a(hashPayload), account?.accountIndex, account?.addressOffset); signPromise .then(({ signature }) => { @@ -158,7 +158,7 @@ const Component: React.FC = (props: Props) => { setLoading(false); }); }); - }, [account.accountIndex, account.addressOffset, hashPayload, isLedgerConnected, isMessage, ledger, ledgerSignMessage, ledgerSignTransaction, onApproveSignature, refreshLedger]); + }, [account?.accountIndex, account?.addressOffset, hashPayload, isLedgerConnected, isMessage, ledger, ledgerSignMessage, ledgerSignTransaction, onApproveSignature, refreshLedger]); const onConfirmInject = useCallback(() => { console.error('Not implemented yet'); diff --git a/packages/extension-koni-ui/src/Popup/Confirmations/variants/BitcoinSignPsbtConfirmation.tsx b/packages/extension-koni-ui/src/Popup/Confirmations/variants/BitcoinSignPsbtConfirmation.tsx index bf14e6cc0b..65cba51ee0 100644 --- a/packages/extension-koni-ui/src/Popup/Confirmations/variants/BitcoinSignPsbtConfirmation.tsx +++ b/packages/extension-koni-ui/src/Popup/Confirmations/variants/BitcoinSignPsbtConfirmation.tsx @@ -22,7 +22,7 @@ interface Props extends ThemeProps { function Component ({ className, request, type }: Props) { const { id, payload } = request; const { t } = useTranslation(); - const { account } = payload; + const { accounts } = payload; const onClickDetail = useOpenDetailModal(); @@ -36,14 +36,16 @@ function Component ({ className, request, type }: Props) {
{t('You are approving a request with the following account')}
- + {accounts.map((account) => + )}