mirror of
https://github.com/zhigang1992/wallet.git
synced 2026-01-12 22:53:27 +08:00
fix: xpub version mismatch in software mode
This commit is contained in:
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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]
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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)({
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user