fix: xpub version mismatch in software mode

This commit is contained in:
kyranjamie
2023-07-24 15:36:05 +02:00
committed by kyranjamie
parent 47239e66cd
commit 89d77df751
5 changed files with 44 additions and 12 deletions

View File

@@ -23,7 +23,7 @@ export function LedgerConnectInstructionTitle({
}: LedgerConnectInstructionTitleProps) {
return (
<LedgerTitle {...props}>
Plug in your Ledger, open the <Capitalize>(chain)</Capitalize> app and click connect
Plug in your Ledger, open the <Capitalize>{chain}</Capitalize> app and click connect
</LedgerTitle>
);
}

View File

@@ -1,10 +1,17 @@
import { useMemo } from 'react';
import { createSelector } from '@reduxjs/toolkit';
import { HDKey } from '@scure/bip32';
import { HDKey, Versions } from '@scure/bip32';
import { NetworkModes } from '@shared/constants';
import { getBtcSignerLibNetworkConfigByMode } from '@shared/crypto/bitcoin/bitcoin.network';
import { BitcoinAccount } from '@shared/crypto/bitcoin/bitcoin.utils';
import {
BitcoinAccount,
bitcoinNetworkModeToCoreNetworkMode,
getHdKeyVersionsFromNetwork,
} from '@shared/crypto/bitcoin/bitcoin.utils';
import { useWalletType } from '@app/common/use-wallet-type';
import { selectRootKeychain } from '@app/store/in-memory-key/in-memory-key.selectors';
import { selectCurrentKey } from '@app/store/keys/key.selectors';
import { selectDefaultWalletBitcoinKeyEntities } from '@app/store/ledger/bitcoin-key.slice';
@@ -50,3 +57,19 @@ export function useBitcoinScureLibNetworkConfig() {
const network = useCurrentNetwork();
return getBtcSignerLibNetworkConfigByMode(network.chain.bitcoin.network);
}
export function useBitcoinExtendedPublicKeyVersions(): Versions | undefined {
const network = useCurrentNetwork();
const { whenWallet } = useWalletType();
// Only Ledger in testnet mode do we need to manually declare `Versions`
return useMemo(
() =>
whenWallet({
software: undefined,
ledger: getHdKeyVersionsFromNetwork(
bitcoinNetworkModeToCoreNetworkMode(network.chain.bitcoin.network)
),
}),
[network, whenWallet]
);
}

View File

@@ -1,14 +1,12 @@
import { useCallback } from 'react';
import { HDKey } from '@scure/bip32';
import { HDKey, Versions } from '@scure/bip32';
import * as btc from '@scure/btc-signer';
import { BitcoinNetworkModes } from '@shared/constants';
import {
BitcoinAccount,
bitcoinNetworkModeToCoreNetworkMode,
deriveAddressIndexKeychainFromAccount,
getHdKeyVersionsFromNetwork,
whenPaymentType,
} from '@shared/crypto/bitcoin/bitcoin.utils';
import { getTaprootAddressIndexDerivationPath } from '@shared/crypto/bitcoin/p2tr-address-gen';
@@ -59,11 +57,12 @@ interface BitcoinAddressIndexSignerFactoryArgs {
accountKeychain: HDKey;
paymentFn(keychain: HDKey, network: BitcoinNetworkModes): any;
network: BitcoinNetworkModes;
extendedPublicKeyVersions?: Versions;
}
export function bitcoinAddressIndexSignerFactory<T extends BitcoinAddressIndexSignerFactoryArgs>(
args: T
) {
const { accountIndex, network, paymentFn, accountKeychain } = args;
const { accountIndex, network, paymentFn, accountKeychain, extendedPublicKeyVersions } = args;
return (addressIndex: number): Signer<ReturnType<T['paymentFn']>> => {
const addressIndexKeychain =
deriveAddressIndexKeychainFromAccount(accountKeychain)(addressIndex);
@@ -73,7 +72,7 @@ export function bitcoinAddressIndexSignerFactory<T extends BitcoinAddressIndexSi
return makeBitcoinSigner({
keychain: HDKey.fromExtendedKey(
addressIndexKeychain.publicExtendedKey,
getHdKeyVersionsFromNetwork(bitcoinNetworkModeToCoreNetworkMode(network))
extendedPublicKeyVersions
),
network,
derivationPath: whenPaymentType(payment.type)({

View File

@@ -19,7 +19,10 @@ import { selectCurrentAccountIndex } from '@app/store/keys/key.selectors';
import { selectCurrentNetwork } from '@app/store/networks/networks.selectors';
import { useCurrentAccountIndex } from '../../account';
import { bitcoinAccountBuilderFactory } from './bitcoin-keychain';
import {
bitcoinAccountBuilderFactory,
useBitcoinExtendedPublicKeyVersions,
} from './bitcoin-keychain';
import {
bitcoinAddressIndexSignerFactory,
useMakeBitcoinNetworkSignersForPaymentType,
@@ -65,6 +68,7 @@ export function useNativeSegwitNetworkSigners() {
function useNativeSegwitSigner(accountIndex: number) {
const account = useNativeSegwitAccountBuilder()(accountIndex);
const extendedPublicKeyVersions = useBitcoinExtendedPublicKeyVersions();
return useMemo(() => {
if (!account) return;
@@ -73,8 +77,9 @@ function useNativeSegwitSigner(accountIndex: number) {
accountKeychain: account.keychain,
paymentFn: getNativeSegWitPaymentFromAddressIndex,
network: account.network,
extendedPublicKeyVersions,
});
}, [accountIndex, account]);
}, [account, accountIndex, extendedPublicKeyVersions]);
}
export function useCurrentAccountNativeSegwitSigner() {

View File

@@ -18,7 +18,10 @@ import { selectCurrentAccountIndex } from '@app/store/keys/key.selectors';
import { selectCurrentNetwork, useCurrentNetwork } from '@app/store/networks/networks.selectors';
import { useCurrentAccountIndex } from '../../account';
import { bitcoinAccountBuilderFactory } from './bitcoin-keychain';
import {
bitcoinAccountBuilderFactory,
useBitcoinExtendedPublicKeyVersions,
} from './bitcoin-keychain';
import {
bitcoinAddressIndexSignerFactory,
useMakeBitcoinNetworkSignersForPaymentType,
@@ -66,6 +69,7 @@ export function useTaprootNetworkSigners() {
function useTaprootSigner(accountIndex: number, network: BitcoinNetworkModes) {
const account = useTaprootAccount(accountIndex);
const extendedPublicKeyVersions = useBitcoinExtendedPublicKeyVersions();
return useMemo(() => {
if (!account) return; // TODO: Revisit this return early
@@ -74,8 +78,9 @@ function useTaprootSigner(accountIndex: number, network: BitcoinNetworkModes) {
accountKeychain: account.keychain,
paymentFn: getTaprootPaymentFromAddressIndex,
network,
extendedPublicKeyVersions,
});
}, [account, accountIndex, network]);
}, [account, accountIndex, extendedPublicKeyVersions, network]);
}
export function useCurrentAccountTaprootIndexZeroSigner() {