@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 +9 -0
- package/package.json +2 -2
- package/src/fee/can-bump-tx.js +4 -1
- package/src/fee/get-fee-resolver.js +12 -2
- package/src/fee/utxo-selector.js +3 -4
- package/src/tx-send/index.js +6 -10
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.
|
|
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": "
|
|
69
|
+
"gitHead": "0dc141fc6a249ac051a5ca591d46cbc81096a4f3"
|
|
70
70
|
}
|
package/src/fee/can-bump-tx.js
CHANGED
|
@@ -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:
|
|
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({
|
|
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
|
}
|
package/src/fee/utxo-selector.js
CHANGED
|
@@ -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
|
package/src/tx-send/index.js
CHANGED
|
@@ -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
|
-
|
|
507
|
+
changeAddressType,
|
|
512
508
|
})({ asset: maybeToken, walletAccount, address, amount: tokenAmount, options })
|
|
513
509
|
const {
|
|
514
510
|
amount,
|