@exodus/bitcoin-api 2.19.0 → 2.20.0

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,15 @@
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.20.0](https://github.com/ExodusMovement/assets/compare/@exodus/bitcoin-api@2.19.0...@exodus/bitcoin-api@2.20.0) (2024-07-09)
7
+
8
+
9
+ ### Features
10
+
11
+ * **BTC:** add changeAddressType to createAsset config ([#2772](https://github.com/ExodusMovement/assets/issues/2772)) ([d8e38dd](https://github.com/ExodusMovement/assets/commit/d8e38dddfbe59b3e8ff9fc2432049bb512a91c22))
12
+
13
+
14
+
6
15
  ## [2.19.0](https://github.com/ExodusMovement/assets/compare/@exodus/bitcoin-api@2.18.4...@exodus/bitcoin-api@2.19.0) (2024-07-05)
7
16
 
8
17
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exodus/bitcoin-api",
3
- "version": "2.19.0",
3
+ "version": "2.20.0",
4
4
  "description": "Exodus bitcoin-api",
5
5
  "main": "src/index.js",
6
6
  "files": [
@@ -66,5 +66,5 @@
66
66
  "type": "git",
67
67
  "url": "git+https://github.com/ExodusMovement/assets.git"
68
68
  },
69
- "gitHead": "9c3024f69fbda1069a437fb19c43e6f341185c6f"
69
+ "gitHead": "0dc141fc6a249ac051a5ca591d46cbc81096a4f3"
70
70
  }
@@ -19,6 +19,7 @@ const _canBumpTx = ({
19
19
  allowUnconfirmedRbfEnabledUtxos,
20
20
  utxosDescendingOrder,
21
21
  taprootInputWitnessSize,
22
+ changeAddressType,
22
23
  }) => {
23
24
  assert(asset, 'asset must be provided')
24
25
  assert(tx, 'tx must be provided')
@@ -95,6 +96,7 @@ const _canBumpTx = ({
95
96
  unconfirmedTxAncestor,
96
97
  utxosDescendingOrder,
97
98
  taprootInputWitnessSize,
99
+ changeAddressType,
98
100
  })
99
101
  if (replaceTx) return { bumpType: BumpType.RBF, bumpFee: fee.sub(replaceTx.feeAmount) }
100
102
  }
@@ -103,13 +105,14 @@ const _canBumpTx = ({
103
105
  asset,
104
106
  usableUtxos,
105
107
  feeRate,
106
- receiveAddress: 'P2WPKH',
108
+ receiveAddress: changeAddressType,
107
109
  getFeeEstimator,
108
110
  mustSpendUtxos: changeUtxos,
109
111
  allowUnconfirmedRbfEnabledUtxos,
110
112
  unconfirmedTxAncestor,
111
113
  utxosDescendingOrder,
112
114
  taprootInputWitnessSize,
115
+ changeAddressType,
113
116
  })
114
117
 
115
118
  return fee ? { bumpType: BumpType.CPFP, bumpFee: fee } : { errorMessage: 'insufficient funds' }
@@ -15,13 +15,20 @@ export class GetFeeResolver {
15
15
  #getFeeEstimator
16
16
  #allowUnconfirmedRbfEnabledUtxos
17
17
  #utxosDescendingOrder
18
+ #changeAddressType
18
19
 
19
- constructor({ getFeeEstimator, allowUnconfirmedRbfEnabledUtxos, utxosDescendingOrder }) {
20
+ constructor({
21
+ getFeeEstimator,
22
+ allowUnconfirmedRbfEnabledUtxos,
23
+ utxosDescendingOrder,
24
+ changeAddressType,
25
+ }) {
20
26
  assert(getFeeEstimator, 'getFeeEstimator must be provided')
21
27
  this.#getFeeEstimator = (asset, { feePerKB, ...options }) =>
22
28
  getFeeEstimator(asset, feePerKB, options)
23
29
  this.#allowUnconfirmedRbfEnabledUtxos = allowUnconfirmedRbfEnabledUtxos
24
30
  this.#utxosDescendingOrder = utxosDescendingOrder
31
+ this.#changeAddressType = changeAddressType
25
32
  }
26
33
 
27
34
  getFee = ({
@@ -151,10 +158,11 @@ export class GetFeeResolver {
151
158
  unconfirmedTxAncestor,
152
159
  utxosDescendingOrder: this.#utxosDescendingOrder,
153
160
  taprootInputWitnessSize,
161
+ changeAddressType: this.#changeAddressType,
154
162
  })
155
163
  }
156
164
 
157
- canBumpTx = ({ asset, tx, txSet, accountState, feeData }) => {
165
+ canBumpTx = ({ asset, tx, txSet, accountState, feeData, taprootInputWitnessSize }) => {
158
166
  return canBumpTx({
159
167
  asset,
160
168
  tx,
@@ -164,6 +172,8 @@ export class GetFeeResolver {
164
172
  getFeeEstimator: this.#getFeeEstimator,
165
173
  allowUnconfirmedRbfEnabledUtxos: this.#allowUnconfirmedRbfEnabledUtxos,
166
174
  utxosDescendingOrder: this.#utxosDescendingOrder,
175
+ taprootInputWitnessSize,
176
+ changeAddressType: this.#changeAddressType,
167
177
  })
168
178
  }
169
179
  }
@@ -36,6 +36,7 @@ export const selectUtxos = ({
36
36
  inscriptionIds, // for each inscription transfer, we need to calculate one more input and one more output
37
37
  transferOrdinalsUtxos, // to calculate the size of the input
38
38
  taprootInputWitnessSize,
39
+ changeAddressType = 'P2PKH',
39
40
  }) => {
40
41
  const resolvedReceiveAddresses = getBestReceiveAddresses({
41
42
  asset,
@@ -54,10 +55,6 @@ export const selectUtxos = ({
54
55
  assert(usableUtxos, 'usableUtxos is required')
55
56
  assert(getFeeEstimator, 'getFeeEstimator is required')
56
57
 
57
- const changeAddressType = ['bitcoin', 'bitcoinregtest', 'bitcointestnet'].includes(asset.name)
58
- ? 'P2WPKH'
59
- : 'P2PKH'
60
-
61
58
  const feeEstimator = getFeeEstimator(asset, { feePerKB: feeRate, unconfirmedTxAncestor })
62
59
  const { currency } = asset
63
60
  if (!amount) amount = currency.ZERO
@@ -263,6 +260,7 @@ export const getUtxosData = ({
263
260
  unconfirmedTxAncestor,
264
261
  utxosDescendingOrder,
265
262
  taprootInputWitnessSize,
263
+ changeAddressType,
266
264
  }) => {
267
265
  const { selectedUtxos, replaceTx, fee } = selectUtxos({
268
266
  asset,
@@ -281,6 +279,7 @@ export const getUtxosData = ({
281
279
  transferOrdinalsUtxos,
282
280
  utxosDescendingOrder,
283
281
  taprootInputWitnessSize,
282
+ changeAddressType,
284
283
  })
285
284
 
286
285
  const resolvedFee = replaceTx ? fee.sub(replaceTx.feeAmount) : fee
@@ -223,6 +223,7 @@ export const getPrepareSendTransaction =
223
223
  utxosDescendingOrder,
224
224
  rbfEnabled: providedRbfEnabled,
225
225
  assetClientInterface,
226
+ changeAddressType,
226
227
  }) =>
227
228
  async ({ asset: maybeToken, walletAccount, address, amount: tokenAmount, options }) => {
228
229
  const {
@@ -243,6 +244,7 @@ export const getPrepareSendTransaction =
243
244
  const assetName = asset.name
244
245
  const accountState = await assetClientInterface.getAccountState({ assetName, walletAccount })
245
246
  const feeData = await assetClientInterface.getFeeConfig({ assetName })
247
+ feeData.feePerKB = feePerKB ?? feeData.feePerKB
246
248
  const insightClient = asset.baseAsset.insightClient
247
249
 
248
250
  const blockHeight = providedBlockHeight || (await getBlockHeight({ assetName, insightClient }))
@@ -354,6 +356,7 @@ export const getPrepareSendTransaction =
354
356
  transferOrdinalsUtxos,
355
357
  utxosDescendingOrder,
356
358
  taprootInputWitnessSize,
359
+ changeAddressType,
357
360
  })
358
361
 
359
362
  if (!selectedUtxos && !replaceTx) throw new Error('Not enough funds.')
@@ -473,18 +476,11 @@ export const createAndBroadcastTXFactory =
473
476
  ordinalsEnabled = false,
474
477
  utxosDescendingOrder,
475
478
  assetClientInterface,
479
+ changeAddressType,
476
480
  }) =>
477
481
  async ({ asset: maybeToken, walletAccount, address, amount: tokenAmount, options }) => {
478
482
  // Prepare transaction
479
- const {
480
- bumpTxId,
481
- nft,
482
- isExchange,
483
- isBip70,
484
- isRbfAllowed = true,
485
- feeOpts,
486
- taprootInputWitnessSize,
487
- } = options
483
+ const { bumpTxId, nft, isExchange, isBip70, isRbfAllowed = true, feeOpts } = options
488
484
 
489
485
  const asset = maybeToken.baseAsset
490
486
  const assetName = asset.name
@@ -508,7 +504,7 @@ export const createAndBroadcastTXFactory =
508
504
  utxosDescendingOrder,
509
505
  rbfEnabled,
510
506
  assetClientInterface,
511
- taprootInputWitnessSize,
507
+ changeAddressType,
512
508
  })({ asset: maybeToken, walletAccount, address, amount: tokenAmount, options })
513
509
  const {
514
510
  amount,