From d553e88bfe4aceb1f595b81281af30dc90887dfc Mon Sep 17 00:00:00 2001 From: kyranjamie Date: Wed, 22 Feb 2023 12:26:54 +0100 Subject: [PATCH] feat: return btc address during auth, closes #2909 --- package.json | 2 +- .../authentication/use-finish-auth-request.ts | 19 +++- src/app/common/utils.ts | 5 + .../blockchain/bitcoin/bitcoin-keychain.ts | 52 +++++---- .../bitcoin/native-segwit-account.hooks.ts | 43 +++++++- .../bitcoin/taproot-account.hooks.ts | 19 +++- src/app/store/keys/key.actions.ts | 4 +- src/app/store/networks/networks.selectors.ts | 2 +- test-app/src/common/use-auth.ts | 1 + yarn.lock | 103 ++++++++++++++++-- 10 files changed, 200 insertions(+), 50 deletions(-) diff --git a/package.json b/package.json index 9af87e3478e..cd86aecd4e2 100644 --- a/package.json +++ b/package.json @@ -153,7 +153,7 @@ "@stacks/ui-core": "7.3.0", "@stacks/ui-theme": "7.5.0", "@stacks/ui-utils": "7.5.0", - "@stacks/wallet-sdk": "6.1.1", + "@stacks/wallet-sdk": "6.1.2-pr.4e0feae.0", "@styled-system/theme-get": "5.1.2", "@tanstack/query-sync-storage-persister": "4.24.4", "@tanstack/react-query": "4.24.4", diff --git a/src/app/common/authentication/use-finish-auth-request.ts b/src/app/common/authentication/use-finish-auth-request.ts index 82725988492..b5994a77651 100644 --- a/src/app/common/authentication/use-finish-auth-request.ts +++ b/src/app/common/authentication/use-finish-auth-request.ts @@ -15,6 +15,7 @@ import { useAuthRequestParams } from '@app/common/hooks/auth/use-auth-request-pa import { useOnboardingState } from '@app/common/hooks/auth/use-onboarding-state'; import { useKeyActions } from '@app/common/hooks/use-key-actions'; import { useWalletType } from '@app/common/use-wallet-type'; +import { useAllBitcoinNativeSegWitNetworksByAccount } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; import { useStacksAccounts } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; import { useStacksWallet } from '@app/store/accounts/blockchain/stacks/stacks-keychain'; @@ -26,6 +27,8 @@ export function useFinishAuthRequest() { const accounts = useStacksAccounts(); const { origin, tabId } = useAuthRequestParams(); + const deriveNativeSegWitAccountAtIndex = useAllBitcoinNativeSegWitNetworksByAccount(); + return useCallback( async (accountIndex: number) => { const account = accounts?.[accountIndex]; @@ -76,6 +79,9 @@ export function useFinishAuthRequest() { transitPublicKey: decodedAuthRequest.public_keys[0], scopes: decodedAuthRequest.scopes, account: legacyAccount, + additionalData: { + btcAddress: deriveNativeSegWitAccountAtIndex(accountIndex), + }, }); keyActions.switchAccount(accountIndex); finalizeAuthResponse({ @@ -89,15 +95,16 @@ export function useFinishAuthRequest() { }, [ accounts, - appIcon, - appName, - authRequest, + wallet, decodedAuthRequest, - keyActions, + authRequest, origin, - wallet, - walletType, tabId, + walletType, + appIcon, + appName, + deriveNativeSegWitAccountAtIndex, + keyActions, ] ); } diff --git a/src/app/common/utils.ts b/src/app/common/utils.ts index c6d99fd7416..33dfba2089c 100644 --- a/src/app/common/utils.ts +++ b/src/app/common/utils.ts @@ -312,6 +312,11 @@ export function whenStxChainId(chainId: ChainID) { return (chainIdMap: WhenChainIdMap): T => chainIdMap[chainId]; } +type NetworkMap = Record; +export function whenNetwork(mode: NetworkModes) { + return (networkMap: NetworkMap): T => networkMap[mode]; +} + export function sumNumbers(nums: number[]) { return nums.reduce((acc, num) => acc.plus(num), new BigNumber(0)); } diff --git a/src/app/store/accounts/blockchain/bitcoin/bitcoin-keychain.ts b/src/app/store/accounts/blockchain/bitcoin/bitcoin-keychain.ts index d9883e5d56a..7187400c0f1 100644 --- a/src/app/store/accounts/blockchain/bitcoin/bitcoin-keychain.ts +++ b/src/app/store/accounts/blockchain/bitcoin/bitcoin-keychain.ts @@ -12,35 +12,49 @@ import { mnemonicToRootNode } from '@app/common/keychain/keychain'; import { selectInMemoryKey } from '@app/store/in-memory-key/in-memory-key.selectors'; import { selectCurrentKey } from '@app/store/keys/key.selectors'; import { defaultKeyId } from '@app/store/keys/key.slice'; -import { selectCurrentNetwork } from '@app/store/networks/networks.selectors'; +// This factory selector extends from the wallet root keychain to derive child +// keychains. It accepts a curried fn that takes a keychain and returns a fn +// accepting an account index, to further derive a nested layer of derivation. +// We use this approach to reuse code between both native segwith and taproot +// keychains. function bitcoinKeychainSelectorFactory( - keychainFn: (hdkey: HDKey, network: NetworkModes) => (index: number) => HDKey + keychainFn: (hdkey: HDKey, network: NetworkModes) => (index: number) => HDKey, + network: NetworkModes ) { - return createSelector( - selectCurrentKey, - selectInMemoryKey, - selectCurrentNetwork, - (currentKey, inMemKey, network) => { - if (currentKey?.type !== 'software') return; - if (!inMemKey.keys[defaultKeyId]) throw new Error('No in-memory key found'); - return keychainFn(mnemonicToRootNode(inMemKey.keys.default), network.chain.bitcoin.network); - } - ); + return createSelector(selectCurrentKey, selectInMemoryKey, (currentKey, inMemKey) => { + if (currentKey?.type !== 'software') return; + + if (!inMemKey.keys[defaultKeyId]) throw new Error('No in-memory key found'); + + return keychainFn(mnemonicToRootNode(inMemKey.keys.default), network); + }); } -export function getNativeSegwitAddressFromMnemonic(secretKey: string) { - return (index: number) => { +export function getNativeSegwitMainnetAddressFromMnemonic(secretKey: string) { + return (accountIndex: number) => { const rootNode = mnemonicToRootNode(secretKey); - const account = deriveNativeSegWitAccountKeychain(rootNode, 'mainnet')(index); + const account = deriveNativeSegWitAccountKeychain(rootNode, 'mainnet')(accountIndex); return getNativeSegWitAddressIndex(account, 'mainnet'); }; } -export const selectSoftwareBitcoinNativeSegWitKeychain = bitcoinKeychainSelectorFactory( - deriveNativeSegWitAccountKeychain +export const selectMainnetNativeSegWitKeychain = bitcoinKeychainSelectorFactory( + deriveNativeSegWitAccountKeychain, + 'mainnet' +); + +export const selectTestnetNativeSegWitKeychain = bitcoinKeychainSelectorFactory( + deriveNativeSegWitAccountKeychain, + 'testnet' +); + +export const selectMainnetTaprootKeychain = bitcoinKeychainSelectorFactory( + deriveTaprootAccountFromRootKeychain, + 'mainnet' ); -export const selectSoftwareBitcoinTaprootKeychain = bitcoinKeychainSelectorFactory( - deriveTaprootAccountFromRootKeychain +export const selectTestnetTaprootKeychain = bitcoinKeychainSelectorFactory( + deriveTaprootAccountFromRootKeychain, + 'testnet' ); diff --git a/src/app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks.ts b/src/app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks.ts index 5d397305abc..f920c0b720c 100644 --- a/src/app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks.ts +++ b/src/app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks.ts @@ -8,6 +8,7 @@ import { deriveAddressIndexZeroFromAccount } from '@shared/crypto/bitcoin/bitcoi import { deriveNativeSegWitReceiveAddressIndex } from '@shared/crypto/bitcoin/p2wpkh-address-gen'; import { isUndefined } from '@shared/utils'; +import { whenNetwork } from '@app/common/utils'; import { formatBitcoinAccount, tempHardwareAccountForTesting, @@ -15,10 +16,46 @@ import { import { useCurrentNetwork } from '@app/store/networks/networks.selectors'; import { useCurrentAccountIndex } from '../../account'; -import { selectSoftwareBitcoinNativeSegWitKeychain } from './bitcoin-keychain'; +import { + selectMainnetNativeSegWitKeychain, + selectTestnetNativeSegWitKeychain, +} from './bitcoin-keychain'; + +function useNativeSegWitCurrentNetworkAccountKeychain() { + const network = useCurrentNetwork(); + return useSelector( + whenNetwork(network.chain.bitcoin.network)({ + mainnet: selectMainnetNativeSegWitKeychain, + testnet: selectTestnetNativeSegWitKeychain, + }) + ); +} + +export function useAllBitcoinNativeSegWitNetworksByAccount() { + const mainnetKeychainAtAccount = useSelector(selectMainnetNativeSegWitKeychain); + const testnetKeychainAtAccount = useSelector(selectTestnetNativeSegWitKeychain); + + return useCallback( + (accountIndex: number) => { + if (!mainnetKeychainAtAccount || !testnetKeychainAtAccount) + throw new Error('Cannot derive addresses in non-software mode'); + return { + mainnet: deriveNativeSegWitReceiveAddressIndex({ + xpub: mainnetKeychainAtAccount(accountIndex).publicExtendedKey, + network: 'mainnet', + })?.address, + testnet: deriveNativeSegWitReceiveAddressIndex({ + xpub: testnetKeychainAtAccount(accountIndex).publicExtendedKey, + network: 'testnet', + })?.address, + }; + }, + [mainnetKeychainAtAccount, testnetKeychainAtAccount] + ); +} function useBitcoinNativeSegwitAccount(index: number) { - const keychain = useSelector(selectSoftwareBitcoinNativeSegWitKeychain); + const keychain = useNativeSegWitCurrentNetworkAccountKeychain(); return useMemo(() => { // TODO: Remove with bitcoin Ledger integration if (isUndefined(keychain)) return tempHardwareAccountForTesting; @@ -69,7 +106,7 @@ export function useCurrentBitcoinNativeSegwitAddressIndexKeychain() { export function useSignBitcoinNativeSegwitTx() { const index = useCurrentAccountIndex(); - const keychain = useSelector(selectSoftwareBitcoinNativeSegWitKeychain)?.(index); + const keychain = useNativeSegWitCurrentNetworkAccountKeychain()?.(index); return useCallback( (tx: btc.Transaction) => { if (isUndefined(keychain)) return; diff --git a/src/app/store/accounts/blockchain/bitcoin/taproot-account.hooks.ts b/src/app/store/accounts/blockchain/bitcoin/taproot-account.hooks.ts index 41a9934680e..1d4aa25e793 100644 --- a/src/app/store/accounts/blockchain/bitcoin/taproot-account.hooks.ts +++ b/src/app/store/accounts/blockchain/bitcoin/taproot-account.hooks.ts @@ -4,14 +4,25 @@ import { useSelector } from 'react-redux'; import { deriveTaprootReceiveAddressIndex } from '@shared/crypto/bitcoin/p2tr-address-gen'; import { isUndefined } from '@shared/utils'; +import { whenNetwork } from '@app/common/utils'; import { useCurrentNetwork } from '@app/store/networks/networks.selectors'; import { useCurrentAccountIndex } from '../../account'; import { formatBitcoinAccount, tempHardwareAccountForTesting } from './bitcoin-account.models'; -import { selectSoftwareBitcoinTaprootKeychain } from './bitcoin-keychain'; +import { selectMainnetTaprootKeychain, selectTestnetTaprootKeychain } from './bitcoin-keychain'; + +function useTaprootKeychainByAccount() { + const network = useCurrentNetwork(); + return useSelector( + whenNetwork(network.chain.bitcoin.network)({ + mainnet: selectMainnetTaprootKeychain, + testnet: selectTestnetTaprootKeychain, + }) + ); +} function useBitcoinTaprootAccount(index: number) { - const keychain = useSelector(selectSoftwareBitcoinTaprootKeychain); + const keychain = useSelector(selectMainnetTaprootKeychain); return useMemo(() => { // TODO: Remove with bitcoin Ledger integration if (isUndefined(keychain)) return tempHardwareAccountForTesting; @@ -37,10 +48,6 @@ function useDeriveTaprootAccountIndexAddressIndexZero(xpub: string) { ); } -function useTaprootKeychainByAccount() { - return useSelector(selectSoftwareBitcoinTaprootKeychain); -} - export function useCurrentTaprootAccountKeychain() { const currentAccountIndex = useCurrentAccountIndex(); const accountKeychain = useTaprootKeychainByAccount(); diff --git a/src/app/store/keys/key.actions.ts b/src/app/store/keys/key.actions.ts index 31cce1d5f6d..5b91dd44065 100644 --- a/src/app/store/keys/key.actions.ts +++ b/src/app/store/keys/key.actions.ts @@ -11,7 +11,7 @@ import { BitcoinClient } from '@app/query/bitcoin/bitcoin-client'; import { StacksClient } from '@app/query/stacks/stacks-client'; import { AppThunk } from '@app/store'; -import { getNativeSegwitAddressFromMnemonic } from '../accounts/blockchain/bitcoin/bitcoin-keychain'; +import { getNativeSegwitMainnetAddressFromMnemonic } from '../accounts/blockchain/bitcoin/bitcoin-keychain'; import { getStacksAddressByIndex } from '../accounts/blockchain/stacks/stacks-keychain'; import { stxChainSlice } from '../chains/stx-chain.slice'; import { selectDefaultWalletKey } from '../in-memory-key/in-memory-key.selectors'; @@ -67,7 +67,7 @@ function setWalletEncryptionPassword(args: { const hasStxBalance = await doesStacksAddressHaveBalance(stxAddress); const hasNames = await doesStacksAddressHaveBnsName(stxAddress); - const btcAddress = getNativeSegwitAddressFromMnemonic(secretKey)(index); + const btcAddress = getNativeSegwitMainnetAddressFromMnemonic(secretKey)(index); const hasBtcBalance = await doesBitcoinAddressHaveBalance(btcAddress.address!); // TODO: add inscription check here also? return hasStxBalance || hasNames || hasBtcBalance; diff --git a/src/app/store/networks/networks.selectors.ts b/src/app/store/networks/networks.selectors.ts index b60309d072d..52a062fddb6 100644 --- a/src/app/store/networks/networks.selectors.ts +++ b/src/app/store/networks/networks.selectors.ts @@ -42,7 +42,7 @@ export const selectAppRequestedNetworkId = createSelector(selectNetworks, networ return findMatchingNetworkKey({ coreApiUrl, networkChainId, networks }); }); -export const selectCurrentNetwork = createSelector( +const selectCurrentNetwork = createSelector( selectNetworks, selectCurrentNetworkId, selectAppRequestedNetworkId, diff --git a/test-app/src/common/use-auth.ts b/test-app/src/common/use-auth.ts index f0a43fc2292..86b57b5ed31 100644 --- a/test-app/src/common/use-auth.ts +++ b/test-app/src/common/use-auth.ts @@ -1,4 +1,5 @@ import React, { useCallback, useEffect, useMemo } from 'react'; + import { AppState, defaultState } from '@common/context'; import { AppConfig, UserSession } from '@stacks/auth'; import { AuthOptions } from '@stacks/connect'; diff --git a/yarn.lock b/yarn.lock index 9264ffc9a46..81fe8d0dbb3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3468,6 +3468,18 @@ jsontokens "^4.0.1" query-string "^6.13.1" +"@stacks/auth@^6.1.2-pr.4e0feae.0", "@stacks/auth@^6.1.2-pr.f3e03fa.0": + version "6.1.2-pr.f3e03fa.0" + resolved "https://registry.yarnpkg.com/@stacks/auth/-/auth-6.1.2-pr.f3e03fa.0.tgz#5481e6db6e5c3e26d2f70a3c3b2979fd07608558" + integrity sha512-mqeuEPzFNuHYb7kOcRsj03ceLCfMEGhpk6FUoIBsQPmDjPYP8b6bPIP+wU0hMJCQrQBpA3rdZaI22Cuhhkjw4A== + dependencies: + "@stacks/common" "^6.1.2-pr.f3e03fa.0" + "@stacks/encryption" "^6.1.2-pr.f3e03fa.0" + "@stacks/network" "^6.1.2-pr.f3e03fa.0" + "@stacks/profile" "^6.1.2-pr.f3e03fa.0" + cross-fetch "^3.1.5" + jsontokens "^4.0.1" + "@stacks/blockchain-api-client@6.3.4": version "6.3.4" resolved "https://registry.yarnpkg.com/@stacks/blockchain-api-client/-/blockchain-api-client-6.3.4.tgz#b9746747ec0563791eb1f3d22dec35cd6a6d6296" @@ -3498,6 +3510,14 @@ "@types/node" "^18.0.4" buffer "^6.0.3" +"@stacks/common@^6.1.2-pr.4e0feae.0", "@stacks/common@^6.1.2-pr.f3e03fa.0": + version "6.1.2-pr.f3e03fa.0" + resolved "https://registry.yarnpkg.com/@stacks/common/-/common-6.1.2-pr.f3e03fa.0.tgz#e70370a2589477c305a1d7b224b7c484db3583bc" + integrity sha512-Rq1ToKTamP2O3K3S+BysNmeN9FjvdCREzVeDpK+r5Xzkw7TTfr/bjNXdI30IB5QSxPfjXpqU2rb77WKJH9bUZQ== + dependencies: + "@types/bn.js" "^5.1.0" + "@types/node" "^18.0.4" + "@stacks/connect-react@21.0.0": version "21.0.0" resolved "https://registry.yarnpkg.com/@stacks/connect-react/-/connect-react-21.0.0.tgz#5e13b0f41ed9be81519297def9911f8ab38622b7" @@ -3543,6 +3563,21 @@ ripemd160-min "^0.0.6" varuint-bitcoin "^1.1.2" +"@stacks/encryption@^6.1.2-pr.4e0feae.0", "@stacks/encryption@^6.1.2-pr.f3e03fa.0": + version "6.1.2-pr.f3e03fa.0" + resolved "https://registry.yarnpkg.com/@stacks/encryption/-/encryption-6.1.2-pr.f3e03fa.0.tgz#3fc5e412f8f440aed9f00cd8b91e8a4f513b090e" + integrity sha512-avx1phIylxRWxLiRXAL5QavAjMFPLN64VHLw8gh7A96B7hHmoWbo+DzKY2O8fe29H6A5mSEsXylPjMpES25vjg== + dependencies: + "@noble/hashes" "1.1.5" + "@noble/secp256k1" "1.7.1" + "@scure/bip39" "1.1.0" + "@stacks/common" "^6.1.2-pr.f3e03fa.0" + "@types/node" "^18.0.4" + base64-js "^1.5.1" + bs58 "^5.0.0" + ripemd160-min "^0.0.6" + varuint-bitcoin "^1.1.2" + "@stacks/eslint-config@1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@stacks/eslint-config/-/eslint-config-1.2.0.tgz#40fccf1d96dbe48194f0be4c001cf98b611655ee" @@ -3573,6 +3608,14 @@ "@stacks/common" "^4.3.5" cross-fetch "^3.1.5" +"@stacks/network@^6.1.2-pr.4e0feae.0", "@stacks/network@^6.1.2-pr.f3e03fa.0": + version "6.1.2-pr.f3e03fa.0" + resolved "https://registry.yarnpkg.com/@stacks/network/-/network-6.1.2-pr.f3e03fa.0.tgz#614e6adef3613c9a5d035152496a1948859a4071" + integrity sha512-FclXUn47tB/edHJoaifcpyA1pNuoNpwJOOUDc477PN8TrBBB85Tc8BE6Ysps5KrJk3xp8o7e5oR/FF5xLzu1fw== + dependencies: + "@stacks/common" "^6.1.2-pr.f3e03fa.0" + cross-fetch "^3.1.5" + "@stacks/prettier-config@0.0.10": version "0.0.10" resolved "https://registry.yarnpkg.com/@stacks/prettier-config/-/prettier-config-0.0.10.tgz#a63915c1e466a1ca9b34d3947f448ac101764b94" @@ -3599,6 +3642,18 @@ schema-inspector "^2.0.2" zone-file "^2.0.0-beta.3" +"@stacks/profile@^6.1.2-pr.4e0feae.0", "@stacks/profile@^6.1.2-pr.f3e03fa.0": + version "6.1.2-pr.f3e03fa.0" + resolved "https://registry.yarnpkg.com/@stacks/profile/-/profile-6.1.2-pr.f3e03fa.0.tgz#3e141433f38a9c4f42a05ef18dc450d068efda7c" + integrity sha512-PMX7si/Go3KcwQm0IEk/frtO0cHmnnk42QExFceuwhvSdSU9ZxPyyhLlG+04gNsX0G9cR5ZTPHag9Dq6t0pBXQ== + dependencies: + "@stacks/common" "^6.1.2-pr.f3e03fa.0" + "@stacks/network" "^6.1.2-pr.f3e03fa.0" + "@stacks/transactions" "^6.1.2-pr.f3e03fa.0" + jsontokens "^4.0.1" + schema-inspector "^2.0.2" + zone-file "^2.0.0-beta.3" + "@stacks/rpc-client@1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@stacks/rpc-client/-/rpc-client-1.0.3.tgz#2d9b2c9ba60eab276854789df84da8b910446a64" @@ -3617,7 +3672,7 @@ resolved "https://registry.yarnpkg.com/@stacks/stacks-blockchain-api-types/-/stacks-blockchain-api-types-6.3.4.tgz#40d672e352310ec5d4dd68dd2d28a9a4b76533a4" integrity sha512-zrjKPGJN4p1azzmh8j0Yj+ZjQ0L9F01qJjAxOtBpapmFbGr1NUuPT1GthIg76y+dobdjSDPN39LpoJG/FbWFLw== -"@stacks/storage@6.1.1", "@stacks/storage@^6.1.1": +"@stacks/storage@6.1.1": version "6.1.1" resolved "https://registry.yarnpkg.com/@stacks/storage/-/storage-6.1.1.tgz#3573fa416c90e341fa2e81f87f5c6d949ef691de" integrity sha512-zqbmoJ95L8DTgpQG5k0MvV8cornkrfTNnVEYDp7nefGiVnH3QR6Mx0xnKlOo4bI4ebHDJ0a2gtWo7Ke9HYEoUw== @@ -3629,6 +3684,18 @@ base64-js "^1.5.1" jsontokens "^4.0.1" +"@stacks/storage@^6.1.2-pr.4e0feae.0": + version "6.1.2-pr.f3e03fa.0" + resolved "https://registry.yarnpkg.com/@stacks/storage/-/storage-6.1.2-pr.f3e03fa.0.tgz#2c5ec73c668def97bc7fcced14192cbb56501b88" + integrity sha512-6XOhhXxZibk5pfJqw88Ly33hWfSnGvPZHm+2ugM+05wO0GAo9/nkl/GNjONE/QwA5ROAhhOaCOcGNTFTY1oFLw== + dependencies: + "@stacks/auth" "^6.1.2-pr.f3e03fa.0" + "@stacks/common" "^6.1.2-pr.f3e03fa.0" + "@stacks/encryption" "^6.1.2-pr.f3e03fa.0" + "@stacks/network" "^6.1.2-pr.f3e03fa.0" + base64-js "^1.5.1" + jsontokens "^4.0.1" + "@stacks/transactions@6.1.1", "@stacks/transactions@^6.0.0", "@stacks/transactions@^6.1.1": version "6.1.1" resolved "https://registry.yarnpkg.com/@stacks/transactions/-/transactions-6.1.1.tgz#f686a560a78280f1ae148443d0ba78d8665f10f9" @@ -3658,6 +3725,18 @@ sha.js "^2.4.11" smart-buffer "^4.1.0" +"@stacks/transactions@^6.1.2-pr.4e0feae.0", "@stacks/transactions@^6.1.2-pr.f3e03fa.0": + version "6.1.2-pr.f3e03fa.0" + resolved "https://registry.yarnpkg.com/@stacks/transactions/-/transactions-6.1.2-pr.f3e03fa.0.tgz#d9675a5373a6d5c14de9d5c5e4c99d4f13d97a67" + integrity sha512-54qjEHa3Jk/kkLWxqWD3mXKkJ8MZCmQP+YkZwV6FIrFUsXbMpHx5JP30Y5Rl2A77SFXIsxSVX0max5z/Wh4hig== + dependencies: + "@noble/hashes" "1.1.5" + "@noble/secp256k1" "1.7.1" + "@stacks/common" "^6.1.2-pr.f3e03fa.0" + "@stacks/network" "^6.1.2-pr.f3e03fa.0" + c32check "^2.0.0" + lodash.clonedeep "^4.5.0" + "@stacks/ui-core@7.3.0", "@stacks/ui-core@^7.3.0": version "7.3.0" resolved "https://registry.yarnpkg.com/@stacks/ui-core/-/ui-core-7.3.0.tgz#7d4dd4d60206e795ca6b7109dfbaea74f878fda2" @@ -3714,20 +3793,20 @@ use-events "^1.4.1" use-onclickoutside "npm:use-onclickoutside-peer-deps@0.3.1" -"@stacks/wallet-sdk@6.1.1": - version "6.1.1" - resolved "https://registry.yarnpkg.com/@stacks/wallet-sdk/-/wallet-sdk-6.1.1.tgz#baf5e320c62d0383f120e34e1f823b319686bd97" - integrity sha512-VZ6JGctVY22J0TzX39d5lZ7TEMUxl5TlJF0C6SLcXCn8v80nC9icn/dYb/uq3DShPMavNdbLAe9D4tpE0RM6wg== +"@stacks/wallet-sdk@6.1.2-pr.4e0feae.0": + version "6.1.2-pr.4e0feae.0" + resolved "https://registry.yarnpkg.com/@stacks/wallet-sdk/-/wallet-sdk-6.1.2-pr.4e0feae.0.tgz#3187836a28954ca2b5e3d9b51c45788c82e2a5b4" + integrity sha512-zmc4jKAVPwfBLca1tuCmsnonbOenAFuT4L0NWX5SJT5S/XAMoFNcYBwIsyJDwRR7FTq3yO94eyR+gls8Y32h+Q== dependencies: "@scure/bip32" "1.1.3" "@scure/bip39" "1.1.0" - "@stacks/auth" "^6.1.1" - "@stacks/common" "^6.0.0" - "@stacks/encryption" "^6.1.1" - "@stacks/network" "^6.1.1" - "@stacks/profile" "^6.1.1" - "@stacks/storage" "^6.1.1" - "@stacks/transactions" "^6.1.1" + "@stacks/auth" "^6.1.2-pr.4e0feae.0" + "@stacks/common" "^6.1.2-pr.4e0feae.0" + "@stacks/encryption" "^6.1.2-pr.4e0feae.0" + "@stacks/network" "^6.1.2-pr.4e0feae.0" + "@stacks/profile" "^6.1.2-pr.4e0feae.0" + "@stacks/storage" "^6.1.2-pr.4e0feae.0" + "@stacks/transactions" "^6.1.2-pr.4e0feae.0" buffer "^6.0.3" c32check "^2.0.0" jsontokens "^4.0.1"