@exodus/bitcoin-api 2.29.1 → 2.29.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,16 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [2.29.2](https://github.com/ExodusMovement/assets/compare/@exodus/bitcoin-api@2.29.1...@exodus/bitcoin-api@2.29.2) (2024-11-19)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+
12
+ * fix: bitcoin use utxo.derivationPath path to resolve purpose (#4541)
13
+
14
+
15
+
6
16
  ## [2.29.1](https://github.com/ExodusMovement/assets/compare/@exodus/bitcoin-api@2.29.0...@exodus/bitcoin-api@2.29.1) (2024-11-13)
7
17
 
8
18
  **Note:** Update exports in fee module of package @exodus/bitcoin-api
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exodus/bitcoin-api",
3
- "version": "2.29.1",
3
+ "version": "2.29.2",
4
4
  "description": "Exodus bitcoin-api",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
@@ -28,7 +28,7 @@
28
28
  "@exodus/bitcoin-lib": "^2.4.2",
29
29
  "@exodus/bitcoinjs": "^1.1.0",
30
30
  "@exodus/crypto": "^1.0.0-rc.13",
31
- "@exodus/currency": "^5.0.2",
31
+ "@exodus/currency": "^6.0.1",
32
32
  "@exodus/key-identifier": "^1.3.0",
33
33
  "@exodus/models": "^12.0.1",
34
34
  "@exodus/simple-retry": "^0.0.6",
@@ -56,5 +56,5 @@
56
56
  "type": "git",
57
57
  "url": "git+https://github.com/ExodusMovement/assets.git"
58
58
  },
59
- "gitHead": "5faabb2475dbf47e9877276b1ef22ad237628c40"
59
+ "gitHead": "ebe9c86c8ecb6e6810613402e27ee62e8c308753"
60
60
  }
@@ -545,6 +545,7 @@ export class BitcoinMonitorScanner {
545
545
  script: vout.scriptPubKey.hex,
546
546
  value: val,
547
547
  rbfEnabled: txItem.rbf,
548
+ derivationPath: address.meta.keyIdentifier?.derivationPath,
548
549
  ...(txItem.vin.length === 0 ? { isCoinbase: true } : undefined),
549
550
  }
550
551
 
@@ -8,6 +8,7 @@ export function createInputs(utxos) {
8
8
  value: utxo.value.toBaseBufferLE(8),
9
9
  script: utxo.script,
10
10
  sequence: getTxSequence(),
11
+ derivationPath: utxo.derivationPath,
11
12
  }))
12
13
  }
13
14
 
@@ -765,6 +765,7 @@ function defaultCreateInputs(utxos, rbfEnabled) {
765
765
  script: utxo.script,
766
766
  sequence: getTxSequence(rbfEnabled),
767
767
  inscriptionId: utxo.inscriptionId,
768
+ derivationPath: utxo.derivationPath,
768
769
  }))
769
770
  }
770
771
 
@@ -14,20 +14,27 @@ export const createGetKeyWithMetadata = ({
14
14
  coinInfo,
15
15
  getKeyIdentifier,
16
16
  }) =>
17
- memoize((address) => {
18
- const purpose = resolvePurpose(address)
19
- const networkInfo = coinInfo.toBitcoinJS()
17
+ memoize(
18
+ ({ address, derivationPath }) => {
19
+ const purpose = derivationPath
20
+ ? parseInt(derivationPath.split('/')[1].replace(/'/g, ''))
21
+ : resolvePurpose(address)
20
22
 
21
- if (signer) {
22
- return getPublicKeyFromSigner(signer, addressPathsMap, purpose, address, getKeyIdentifier)
23
- }
23
+ assert(typeof purpose === 'number' && purpose, 'purpose must be a number')
24
+ const networkInfo = coinInfo.toBitcoinJS()
24
25
 
25
- if (privateKeysAddressMap) {
26
- return getPrivateKeyFromMap(privateKeysAddressMap, networkInfo, purpose, address)
27
- }
26
+ if (signer) {
27
+ return getPublicKeyFromSigner(signer, addressPathsMap, purpose, address, getKeyIdentifier)
28
+ }
28
29
 
29
- return getPrivateKeyFromHDKeys(hdkeys, addressPathsMap, networkInfo, purpose, address)
30
- })
30
+ if (privateKeysAddressMap) {
31
+ return getPrivateKeyFromMap(privateKeysAddressMap, networkInfo, purpose, address)
32
+ }
33
+
34
+ return getPrivateKeyFromHDKeys(hdkeys, addressPathsMap, networkInfo, purpose, address)
35
+ },
36
+ ({ address, derivationPath }) => address + '_' + derivationPath
37
+ )
31
38
 
32
39
  function getPrivateKeyFromMap(privateKeysAddressMap, networkInfo, purpose, address) {
33
40
  const privateWif = getOwnProperty(privateKeysAddressMap, address, 'string')
@@ -34,14 +34,17 @@ export function createSignWithWallet({
34
34
  if (!inputInfo) continue
35
35
 
36
36
  const input = psbt.data.inputs[index]
37
- const { address, sigHash } = inputInfo
37
+ const { address, sigHash, derivationPath } = inputInfo
38
38
  // The sighash value from the PSBT input itself will be used.
39
39
  // This list just represents possible sighash values the inputs can have.
40
40
  const allowedSigHashTypes =
41
41
  sigHash === undefined
42
42
  ? undefined // `SIGHASH_DEFAULT` is a default safe sig hash, always allow it.
43
43
  : [sigHash, Transaction.SIGHASH_ALL]
44
- const { keyId, privateKey, publicKey, purpose } = await getKeyWithMetadata(address)
44
+ const { keyId, privateKey, publicKey, purpose } = await getKeyWithMetadata({
45
+ address,
46
+ derivationPath,
47
+ })
45
48
 
46
49
  const isTaprootInput = bip371.isTaprootInput(input)
47
50
  const isTapLeafScriptSpend = input.tapLeafScript && input.tapLeafScript.length > 0