@atomiqlabs/sdk 8.6.6 → 8.6.7
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/dist/SmartChainAssets.d.ts +181 -181
- package/dist/SmartChainAssets.js +181 -181
- package/dist/bitcoin/coinselect2/accumulative.d.ts +6 -6
- package/dist/bitcoin/coinselect2/accumulative.js +52 -51
- package/dist/bitcoin/coinselect2/blackjack.d.ts +6 -6
- package/dist/bitcoin/coinselect2/blackjack.js +38 -37
- package/dist/bitcoin/coinselect2/index.d.ts +19 -17
- package/dist/bitcoin/coinselect2/index.js +69 -69
- package/dist/bitcoin/coinselect2/utils.d.ts +77 -75
- package/dist/bitcoin/coinselect2/utils.js +123 -123
- package/dist/bitcoin/wallet/BitcoinWallet.d.ts +130 -128
- package/dist/bitcoin/wallet/BitcoinWallet.js +322 -322
- package/dist/bitcoin/wallet/IBitcoinWallet.d.ts +78 -78
- package/dist/bitcoin/wallet/IBitcoinWallet.js +21 -20
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.d.ts +101 -99
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.js +176 -176
- package/dist/enums/FeeType.d.ts +15 -15
- package/dist/enums/FeeType.js +19 -19
- package/dist/enums/SwapAmountType.d.ts +15 -15
- package/dist/enums/SwapAmountType.js +19 -19
- package/dist/enums/SwapDirection.d.ts +15 -15
- package/dist/enums/SwapDirection.js +19 -19
- package/dist/enums/SwapSide.d.ts +15 -15
- package/dist/enums/SwapSide.js +19 -19
- package/dist/enums/SwapType.d.ts +75 -75
- package/dist/enums/SwapType.js +79 -79
- package/dist/errors/IntermediaryError.d.ts +13 -13
- package/dist/errors/IntermediaryError.js +27 -27
- package/dist/errors/RequestError.d.ts +32 -32
- package/dist/errors/RequestError.js +54 -54
- package/dist/errors/UserError.d.ts +8 -8
- package/dist/errors/UserError.js +16 -16
- package/dist/events/UnifiedSwapEventListener.d.ts +23 -23
- package/dist/events/UnifiedSwapEventListener.js +130 -130
- package/dist/http/HttpUtils.d.ts +27 -27
- package/dist/http/HttpUtils.js +91 -90
- package/dist/http/paramcoders/IParamReader.d.ts +8 -8
- package/dist/http/paramcoders/IParamReader.js +2 -2
- package/dist/http/paramcoders/ParamDecoder.d.ts +44 -42
- package/dist/http/paramcoders/ParamDecoder.js +137 -137
- package/dist/http/paramcoders/ParamEncoder.d.ts +20 -18
- package/dist/http/paramcoders/ParamEncoder.js +36 -36
- package/dist/http/paramcoders/SchemaVerifier.d.ts +26 -26
- package/dist/http/paramcoders/SchemaVerifier.js +145 -145
- package/dist/http/paramcoders/client/ResponseParamDecoder.d.ts +11 -11
- package/dist/http/paramcoders/client/ResponseParamDecoder.js +57 -57
- package/dist/http/paramcoders/client/StreamParamEncoder.d.ts +13 -11
- package/dist/http/paramcoders/client/StreamParamEncoder.js +26 -26
- package/dist/http/paramcoders/client/StreamingFetchPromise.d.ts +16 -16
- package/dist/http/paramcoders/client/StreamingFetchPromise.js +174 -173
- package/dist/index.d.ts +85 -85
- package/dist/index.js +158 -158
- package/dist/intermediaries/Intermediary.d.ts +157 -157
- package/dist/intermediaries/Intermediary.js +142 -142
- package/dist/intermediaries/IntermediaryDiscovery.d.ts +199 -198
- package/dist/intermediaries/IntermediaryDiscovery.js +406 -406
- package/dist/intermediaries/apis/IntermediaryAPI.d.ts +439 -437
- package/dist/intermediaries/apis/IntermediaryAPI.js +603 -603
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.d.ts +155 -155
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.js +137 -137
- package/dist/lnurl/LNURL.d.ts +102 -102
- package/dist/lnurl/LNURL.js +321 -321
- package/dist/prices/RedundantSwapPrice.d.ts +110 -110
- package/dist/prices/RedundantSwapPrice.js +222 -222
- package/dist/prices/SingleSwapPrice.d.ts +34 -34
- package/dist/prices/SingleSwapPrice.js +44 -44
- package/dist/prices/SwapPriceWithChain.d.ts +107 -107
- package/dist/prices/SwapPriceWithChain.js +128 -128
- package/dist/prices/abstract/ICachedSwapPrice.d.ts +28 -28
- package/dist/prices/abstract/ICachedSwapPrice.js +62 -62
- package/dist/prices/abstract/IPriceProvider.d.ts +81 -81
- package/dist/prices/abstract/IPriceProvider.js +74 -74
- package/dist/prices/abstract/ISwapPrice.d.ts +168 -168
- package/dist/prices/abstract/ISwapPrice.js +279 -279
- package/dist/prices/providers/BinancePriceProvider.d.ts +23 -23
- package/dist/prices/providers/BinancePriceProvider.js +30 -30
- package/dist/prices/providers/CoinGeckoPriceProvider.d.ts +23 -23
- package/dist/prices/providers/CoinGeckoPriceProvider.js +29 -29
- package/dist/prices/providers/CoinPaprikaPriceProvider.d.ts +25 -25
- package/dist/prices/providers/CoinPaprikaPriceProvider.js +29 -29
- package/dist/prices/providers/CustomPriceProvider.d.ts +24 -24
- package/dist/prices/providers/CustomPriceProvider.js +35 -35
- package/dist/prices/providers/KrakenPriceProvider.d.ts +38 -38
- package/dist/prices/providers/KrakenPriceProvider.js +45 -45
- package/dist/prices/providers/OKXPriceProvider.d.ts +34 -34
- package/dist/prices/providers/OKXPriceProvider.js +29 -29
- package/dist/prices/providers/abstract/ExchangePriceProvider.d.ts +17 -17
- package/dist/prices/providers/abstract/ExchangePriceProvider.js +21 -21
- package/dist/prices/providers/abstract/HttpPriceProvider.d.ts +7 -7
- package/dist/prices/providers/abstract/HttpPriceProvider.js +12 -12
- package/dist/storage/IUnifiedStorage.d.ts +85 -85
- package/dist/storage/IUnifiedStorage.js +2 -2
- package/dist/storage/UnifiedSwapStorage.d.ts +114 -114
- package/dist/storage/UnifiedSwapStorage.js +116 -116
- package/dist/storage-browser/IndexedDBUnifiedStorage.d.ts +63 -63
- package/dist/storage-browser/IndexedDBUnifiedStorage.js +298 -298
- package/dist/storage-browser/LocalStorageManager.d.ts +49 -49
- package/dist/storage-browser/LocalStorageManager.js +93 -93
- package/dist/swapper/Swapper.d.ts +687 -686
- package/dist/swapper/Swapper.js +1603 -1603
- package/dist/swapper/SwapperFactory.d.ts +135 -135
- package/dist/swapper/SwapperFactory.js +162 -162
- package/dist/swapper/SwapperUtils.d.ts +200 -200
- package/dist/swapper/SwapperUtils.js +467 -467
- package/dist/swapper/SwapperWithChain.d.ts +404 -404
- package/dist/swapper/SwapperWithChain.js +469 -469
- package/dist/swapper/SwapperWithSigner.d.ts +322 -322
- package/dist/swapper/SwapperWithSigner.js +318 -318
- package/dist/swaps/IAddressSwap.d.ts +22 -22
- package/dist/swaps/IAddressSwap.js +14 -13
- package/dist/swaps/IBTCWalletSwap.d.ts +73 -73
- package/dist/swaps/IBTCWalletSwap.js +18 -17
- package/dist/swaps/IClaimableSwap.d.ts +49 -49
- package/dist/swaps/IClaimableSwap.js +15 -14
- package/dist/swaps/IClaimableSwapWrapper.d.ts +15 -15
- package/dist/swaps/IClaimableSwapWrapper.js +2 -2
- package/dist/swaps/IRefundableSwap.d.ts +43 -43
- package/dist/swaps/IRefundableSwap.js +14 -13
- package/dist/swaps/ISwap.d.ts +387 -386
- package/dist/swaps/ISwap.js +346 -346
- package/dist/swaps/ISwapWithGasDrop.d.ts +21 -21
- package/dist/swaps/ISwapWithGasDrop.js +12 -11
- package/dist/swaps/ISwapWrapper.d.ts +285 -283
- package/dist/swaps/ISwapWrapper.js +353 -353
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.d.ts +98 -98
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.js +126 -126
- package/dist/swaps/escrow_swaps/IEscrowSwap.d.ts +135 -133
- package/dist/swaps/escrow_swaps/IEscrowSwap.js +169 -169
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.d.ts +115 -114
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +134 -134
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.d.ts +101 -98
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.js +130 -130
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.d.ts +162 -162
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.js +190 -190
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.d.ts +58 -58
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.js +78 -78
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.d.ts +531 -529
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +1285 -1285
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.d.ts +184 -181
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +418 -418
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.d.ts +583 -581
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +1371 -1371
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.d.ts +228 -225
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +506 -506
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.d.ts +458 -458
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.js +1126 -1126
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.d.ts +191 -190
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +378 -378
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.d.ts +403 -403
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.js +924 -924
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.d.ts +62 -62
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +112 -112
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.d.ts +127 -125
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.js +256 -256
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.d.ts +242 -241
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +520 -520
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.d.ts +73 -73
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.js +155 -155
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.d.ts +128 -127
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +278 -278
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +630 -630
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +1443 -1443
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.d.ts +214 -213
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +756 -756
- package/dist/swaps/trusted/ln/LnForGasSwap.d.ts +261 -261
- package/dist/swaps/trusted/ln/LnForGasSwap.js +511 -511
- package/dist/swaps/trusted/ln/LnForGasWrapper.d.ts +40 -40
- package/dist/swaps/trusted/ln/LnForGasWrapper.js +82 -82
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.d.ts +342 -342
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.js +715 -715
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.d.ts +69 -68
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +92 -92
- package/dist/types/AmountData.d.ts +10 -10
- package/dist/types/AmountData.js +2 -2
- package/dist/types/CustomPriceFunction.d.ts +11 -11
- package/dist/types/CustomPriceFunction.js +2 -2
- package/dist/types/PriceInfoType.d.ts +28 -28
- package/dist/types/PriceInfoType.js +57 -56
- package/dist/types/SwapExecutionAction.d.ts +88 -88
- package/dist/types/SwapExecutionAction.js +2 -2
- package/dist/types/SwapStateInfo.d.ts +5 -5
- package/dist/types/SwapStateInfo.js +2 -2
- package/dist/types/SwapWithSigner.d.ts +17 -17
- package/dist/types/SwapWithSigner.js +43 -42
- package/dist/types/Token.d.ts +99 -99
- package/dist/types/Token.js +76 -76
- package/dist/types/TokenAmount.d.ts +69 -69
- package/dist/types/TokenAmount.js +60 -59
- package/dist/types/fees/Fee.d.ts +50 -50
- package/dist/types/fees/Fee.js +2 -2
- package/dist/types/fees/FeeBreakdown.d.ts +11 -11
- package/dist/types/fees/FeeBreakdown.js +2 -2
- package/dist/types/fees/PercentagePPM.d.ts +17 -17
- package/dist/types/fees/PercentagePPM.js +18 -17
- package/dist/types/lnurl/LNURLPay.d.ts +61 -61
- package/dist/types/lnurl/LNURLPay.js +31 -30
- package/dist/types/lnurl/LNURLWithdraw.d.ts +48 -48
- package/dist/types/lnurl/LNURLWithdraw.js +27 -26
- package/dist/types/wallets/LightningInvoiceCreateService.d.ts +24 -24
- package/dist/types/wallets/LightningInvoiceCreateService.js +15 -14
- package/dist/types/wallets/MinimalBitcoinWalletInterface.d.ts +23 -23
- package/dist/types/wallets/MinimalBitcoinWalletInterface.js +2 -2
- package/dist/types/wallets/MinimalLightningNetworkWalletInterface.d.ts +9 -9
- package/dist/types/wallets/MinimalLightningNetworkWalletInterface.js +2 -2
- package/dist/utils/AutomaticClockDriftCorrection.d.ts +1 -1
- package/dist/utils/AutomaticClockDriftCorrection.js +70 -69
- package/dist/utils/BitcoinUtils.d.ts +14 -12
- package/dist/utils/BitcoinUtils.js +102 -101
- package/dist/utils/BitcoinWalletUtils.d.ts +7 -7
- package/dist/utils/BitcoinWalletUtils.js +14 -13
- package/dist/utils/Logger.d.ts +7 -7
- package/dist/utils/Logger.js +12 -11
- package/dist/utils/RetryUtils.d.ts +22 -22
- package/dist/utils/RetryUtils.js +67 -66
- package/dist/utils/SwapUtils.d.ts +88 -88
- package/dist/utils/SwapUtils.js +72 -72
- package/dist/utils/TimeoutUtils.d.ts +17 -17
- package/dist/utils/TimeoutUtils.js +55 -54
- package/dist/utils/TokenUtils.d.ts +19 -19
- package/dist/utils/TokenUtils.js +37 -36
- package/dist/utils/TypeUtils.d.ts +7 -7
- package/dist/utils/TypeUtils.js +2 -2
- package/dist/utils/Utils.d.ts +58 -56
- package/dist/utils/Utils.js +194 -193
- package/package.json +1 -1
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DUST_THRESHOLDS = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
let
|
|
37
|
-
let
|
|
38
|
-
let
|
|
39
|
-
let
|
|
40
|
-
|
|
41
|
-
const
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.maxSendable = exports.coinSelect = exports.DUST_THRESHOLDS = void 0;
|
|
4
|
+
const accumulative_1 = require("./accumulative");
|
|
5
|
+
const blackjack_1 = require("./blackjack");
|
|
6
|
+
const utils_1 = require("./utils");
|
|
7
|
+
Object.defineProperty(exports, "DUST_THRESHOLDS", { enumerable: true, get: function () { return utils_1.DUST_THRESHOLDS; } });
|
|
8
|
+
// order by descending value, minus the inputs approximate fee
|
|
9
|
+
function utxoScore(x, feeRate) {
|
|
10
|
+
let valueAfterFee = x.value - (feeRate * utils_1.utils.inputBytes(x));
|
|
11
|
+
if (x.cpfp != null && x.cpfp.txEffectiveFeeRate < feeRate)
|
|
12
|
+
valueAfterFee -= x.cpfp.txVsize * (feeRate - x.cpfp.txEffectiveFeeRate);
|
|
13
|
+
return valueAfterFee;
|
|
14
|
+
}
|
|
15
|
+
function coinSelect(utxos, outputs, feeRate, type, requiredInputs) {
|
|
16
|
+
// order by descending value, minus the inputs approximate fee
|
|
17
|
+
utxos = utxos.sort((a, b) => {
|
|
18
|
+
// if(a.cpfp!=null && b.cpfp==null) return 1;
|
|
19
|
+
// if(a.cpfp==null && b.cpfp!=null) return -1;
|
|
20
|
+
return utxoScore(b, feeRate) - utxoScore(a, feeRate);
|
|
21
|
+
});
|
|
22
|
+
// attempt to use the blackjack strategy first (no change output)
|
|
23
|
+
const base = (0, blackjack_1.blackjack)(utxos, outputs, feeRate, type, requiredInputs);
|
|
24
|
+
if (base.inputs)
|
|
25
|
+
return base;
|
|
26
|
+
// else, try the accumulative strategy
|
|
27
|
+
return (0, accumulative_1.accumulative)(utxos, outputs, feeRate, type, requiredInputs);
|
|
28
|
+
}
|
|
29
|
+
exports.coinSelect = coinSelect;
|
|
30
|
+
function maxSendable(utxos, output, feeRate, requiredInputs, additionalOutputs) {
|
|
31
|
+
if (!isFinite(utils_1.utils.uintOrNaN(feeRate)))
|
|
32
|
+
throw new Error("Invalid feeRate passed!");
|
|
33
|
+
const outputs = additionalOutputs ?? [];
|
|
34
|
+
const inputs = requiredInputs ?? [];
|
|
35
|
+
let bytesAccum = utils_1.utils.transactionBytes(inputs, outputs.concat([output]));
|
|
36
|
+
let cpfpAddFee = 0;
|
|
37
|
+
let inAccum = utils_1.utils.sumOrNaN(inputs);
|
|
38
|
+
let outAccum = utils_1.utils.sumOrNaN(outputs);
|
|
39
|
+
for (let i = 0; i < utxos.length; ++i) {
|
|
40
|
+
const utxo = utxos[i];
|
|
41
|
+
const utxoBytes = utils_1.utils.inputBytes(utxo);
|
|
42
|
+
const utxoFee = feeRate * utxoBytes;
|
|
43
|
+
let cpfpFee = 0;
|
|
44
|
+
if (utxo.cpfp != null && utxo.cpfp.txEffectiveFeeRate < feeRate)
|
|
45
|
+
cpfpFee = utxo.cpfp.txVsize * (feeRate - utxo.cpfp.txEffectiveFeeRate);
|
|
46
|
+
const utxoValue = utils_1.utils.uintOrNaN(utxo.value);
|
|
47
|
+
// skip detrimental input
|
|
48
|
+
if (utxoFee + cpfpFee > utxo.value) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
bytesAccum += utxoBytes;
|
|
52
|
+
inAccum += utxoValue;
|
|
53
|
+
cpfpAddFee += cpfpFee;
|
|
54
|
+
inputs.push(utxo);
|
|
55
|
+
}
|
|
56
|
+
const fee = (feeRate * bytesAccum) + cpfpAddFee;
|
|
57
|
+
const outputValue = inAccum - fee - outAccum;
|
|
58
|
+
const dustThreshold = utils_1.DUST_THRESHOLDS[output.type];
|
|
59
|
+
if (outputValue < dustThreshold)
|
|
60
|
+
return {
|
|
61
|
+
fee,
|
|
62
|
+
value: 0
|
|
63
|
+
};
|
|
64
|
+
return {
|
|
65
|
+
fee,
|
|
66
|
+
value: outputValue
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
exports.maxSendable = maxSendable;
|
|
@@ -1,75 +1,77 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
/**
|
|
4
|
+
* Defines a type of the address used by the wallet, for proper coinselection (as coinselection
|
|
5
|
+
* depends on estimating the cost for spending the input + the cost of adding a change output)
|
|
6
|
+
*
|
|
7
|
+
* @category Bitcoin
|
|
8
|
+
*/
|
|
9
|
+
export type CoinselectAddressTypes = "p2sh-p2wpkh" | "p2wpkh" | "p2wsh" | "p2tr" | "p2pkh";
|
|
10
|
+
export type CoinselectTxInput = {
|
|
11
|
+
script?: Buffer;
|
|
12
|
+
txId: string;
|
|
13
|
+
vout: number;
|
|
14
|
+
type?: CoinselectAddressTypes;
|
|
15
|
+
value: number;
|
|
16
|
+
outputScript?: Buffer;
|
|
17
|
+
address?: string;
|
|
18
|
+
cpfp?: {
|
|
19
|
+
txVsize: number;
|
|
20
|
+
txEffectiveFeeRate: number;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
export type CoinselectTxOutput = {
|
|
24
|
+
script?: Buffer;
|
|
25
|
+
address?: string;
|
|
26
|
+
type?: CoinselectAddressTypes;
|
|
27
|
+
value: number;
|
|
28
|
+
};
|
|
29
|
+
declare function inputBytes(input: {
|
|
30
|
+
script?: Buffer;
|
|
31
|
+
type?: CoinselectAddressTypes;
|
|
32
|
+
}): number;
|
|
33
|
+
declare function outputBytes(output: {
|
|
34
|
+
script?: Buffer;
|
|
35
|
+
type?: CoinselectAddressTypes;
|
|
36
|
+
}): number;
|
|
37
|
+
export declare const DUST_THRESHOLDS: {
|
|
38
|
+
"p2sh-p2wpkh": number;
|
|
39
|
+
p2wpkh: number;
|
|
40
|
+
p2tr: number;
|
|
41
|
+
p2pkh: number;
|
|
42
|
+
p2wsh: number;
|
|
43
|
+
};
|
|
44
|
+
declare function dustThreshold(output: {
|
|
45
|
+
script?: Buffer;
|
|
46
|
+
type: CoinselectAddressTypes;
|
|
47
|
+
}): number;
|
|
48
|
+
declare function transactionBytes(inputs: {
|
|
49
|
+
script?: Buffer;
|
|
50
|
+
type?: CoinselectAddressTypes;
|
|
51
|
+
}[], outputs: {
|
|
52
|
+
script?: Buffer;
|
|
53
|
+
type?: CoinselectAddressTypes;
|
|
54
|
+
}[], changeType?: CoinselectAddressTypes): number;
|
|
55
|
+
declare function uintOrNaN(v: number): number;
|
|
56
|
+
declare function sumForgiving(range: {
|
|
57
|
+
value: number;
|
|
58
|
+
}[]): number;
|
|
59
|
+
declare function sumOrNaN(range: {
|
|
60
|
+
value: number;
|
|
61
|
+
}[]): number;
|
|
62
|
+
declare function finalize(inputs: CoinselectTxInput[], outputs: CoinselectTxOutput[], feeRate: number, changeType: CoinselectAddressTypes, cpfpAddFee?: number): {
|
|
63
|
+
inputs?: CoinselectTxInput[];
|
|
64
|
+
outputs?: CoinselectTxOutput[];
|
|
65
|
+
fee: number;
|
|
66
|
+
};
|
|
67
|
+
export declare const utils: {
|
|
68
|
+
dustThreshold: typeof dustThreshold;
|
|
69
|
+
finalize: typeof finalize;
|
|
70
|
+
inputBytes: typeof inputBytes;
|
|
71
|
+
outputBytes: typeof outputBytes;
|
|
72
|
+
sumOrNaN: typeof sumOrNaN;
|
|
73
|
+
sumForgiving: typeof sumForgiving;
|
|
74
|
+
transactionBytes: typeof transactionBytes;
|
|
75
|
+
uintOrNaN: typeof uintOrNaN;
|
|
76
|
+
};
|
|
77
|
+
export {};
|
|
@@ -1,123 +1,123 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.utils = exports.DUST_THRESHOLDS = void 0;
|
|
4
|
-
const Logger_1 = require("../../utils/Logger");
|
|
5
|
-
const logger = (0, Logger_1.getLogger)("CoinSelect: ");
|
|
6
|
-
// baseline estimates, used to improve performance
|
|
7
|
-
const TX_EMPTY_SIZE = 4 + 1 + 1 + 4;
|
|
8
|
-
const TX_INPUT_BASE = 32 + 4 + 1 + 4;
|
|
9
|
-
const WITNESS_OVERHEAD = 2 / 4;
|
|
10
|
-
const P2WPKH_WITNESS = (1 + 1 + 72 + 1 + 33) / 4;
|
|
11
|
-
const P2TR_WITNESS = (1 + 1 + 65) / 4;
|
|
12
|
-
const TX_INPUT_PUBKEYHASH = 107;
|
|
13
|
-
const TX_INPUT_P2SH_P2WPKH = 23 + P2WPKH_WITNESS + 1;
|
|
14
|
-
const TX_INPUT_P2WPKH = 0 + P2WPKH_WITNESS;
|
|
15
|
-
const TX_INPUT_P2WSH = 0 + (1 + 1 + 64) / 4;
|
|
16
|
-
const TX_INPUT_P2TR = 0 + P2TR_WITNESS;
|
|
17
|
-
const TX_OUTPUT_BASE = 8 + 1;
|
|
18
|
-
const TX_OUTPUT_PUBKEYHASH = 25;
|
|
19
|
-
const TX_OUTPUT_P2SH_P2WPKH = 23;
|
|
20
|
-
const TX_OUTPUT_P2WPKH = 22;
|
|
21
|
-
const TX_OUTPUT_P2WSH = 34;
|
|
22
|
-
const TX_OUTPUT_P2TR = 34;
|
|
23
|
-
const INPUT_BYTES = {
|
|
24
|
-
"p2sh-p2wpkh": TX_INPUT_P2SH_P2WPKH,
|
|
25
|
-
"p2wpkh": TX_INPUT_P2WPKH,
|
|
26
|
-
"p2tr": TX_INPUT_P2TR,
|
|
27
|
-
"p2pkh": TX_INPUT_PUBKEYHASH,
|
|
28
|
-
"p2wsh": TX_INPUT_P2WSH
|
|
29
|
-
};
|
|
30
|
-
function inputBytes(input) {
|
|
31
|
-
if (input.script == null && input.type == null)
|
|
32
|
-
throw new Error("Needs either script or type defined!");
|
|
33
|
-
return TX_INPUT_BASE + (input.script ? input.script.length : INPUT_BYTES[input.type]);
|
|
34
|
-
}
|
|
35
|
-
const OUTPUT_BYTES = {
|
|
36
|
-
"p2sh-p2wpkh": TX_OUTPUT_P2SH_P2WPKH,
|
|
37
|
-
"p2wpkh": TX_OUTPUT_P2WPKH,
|
|
38
|
-
"p2tr": TX_OUTPUT_P2TR,
|
|
39
|
-
"p2pkh": TX_OUTPUT_PUBKEYHASH,
|
|
40
|
-
"p2wsh": TX_OUTPUT_P2WSH
|
|
41
|
-
};
|
|
42
|
-
function outputBytes(output) {
|
|
43
|
-
if (output.script == null && output.type == null)
|
|
44
|
-
throw new Error("Needs either script or type defined!");
|
|
45
|
-
return TX_OUTPUT_BASE + (output.script ? output.script.length : OUTPUT_BYTES[output.type]);
|
|
46
|
-
}
|
|
47
|
-
exports.DUST_THRESHOLDS = {
|
|
48
|
-
"p2sh-p2wpkh": 540,
|
|
49
|
-
"p2wpkh": 294,
|
|
50
|
-
"p2tr": 330,
|
|
51
|
-
"p2pkh": 546,
|
|
52
|
-
"p2wsh": 330
|
|
53
|
-
};
|
|
54
|
-
function dustThreshold(output) {
|
|
55
|
-
return exports.DUST_THRESHOLDS[output.type];
|
|
56
|
-
}
|
|
57
|
-
function transactionBytes(inputs, outputs, changeType) {
|
|
58
|
-
let size = TX_EMPTY_SIZE;
|
|
59
|
-
let isSegwit = false;
|
|
60
|
-
if (changeType != null && changeType !== "p2pkh") {
|
|
61
|
-
size += WITNESS_OVERHEAD;
|
|
62
|
-
isSegwit = true;
|
|
63
|
-
}
|
|
64
|
-
for (let input of inputs) {
|
|
65
|
-
if (!isSegwit && (input.type !== "p2pkh")) {
|
|
66
|
-
isSegwit = true;
|
|
67
|
-
size += WITNESS_OVERHEAD;
|
|
68
|
-
}
|
|
69
|
-
size += inputBytes(input);
|
|
70
|
-
}
|
|
71
|
-
for (let output of outputs) {
|
|
72
|
-
size += outputBytes(output);
|
|
73
|
-
}
|
|
74
|
-
return Math.ceil(size);
|
|
75
|
-
}
|
|
76
|
-
function uintOrNaN(v) {
|
|
77
|
-
if (typeof v !== 'number')
|
|
78
|
-
return NaN;
|
|
79
|
-
if (!isFinite(v))
|
|
80
|
-
return NaN;
|
|
81
|
-
if (Math.floor(v) !== v)
|
|
82
|
-
return NaN;
|
|
83
|
-
if (v < 0)
|
|
84
|
-
return NaN;
|
|
85
|
-
return v;
|
|
86
|
-
}
|
|
87
|
-
function sumForgiving(range) {
|
|
88
|
-
return range.reduce((a, x) => a + (isFinite(x.value) ? x.value : 0), 0);
|
|
89
|
-
}
|
|
90
|
-
function sumOrNaN(range) {
|
|
91
|
-
return range.reduce((a, x) => a + uintOrNaN(x.value), 0);
|
|
92
|
-
}
|
|
93
|
-
function finalize(inputs, outputs, feeRate, changeType, cpfpAddFee = 0) {
|
|
94
|
-
const bytesAccum = transactionBytes(inputs, outputs, changeType);
|
|
95
|
-
logger.debug("finalize(): Transaction bytes: ", bytesAccum);
|
|
96
|
-
const feeAfterExtraOutput = (feeRate * (bytesAccum + outputBytes({ type: changeType }))) + cpfpAddFee;
|
|
97
|
-
logger.debug("finalize(): TX fee after adding change output: ", feeAfterExtraOutput);
|
|
98
|
-
const remainderAfterExtraOutput = Math.floor(sumOrNaN(inputs) - (sumOrNaN(outputs) + feeAfterExtraOutput));
|
|
99
|
-
logger.debug("finalize(): Leaves change (changeType=" + changeType + ") value: ", remainderAfterExtraOutput);
|
|
100
|
-
// is it worth a change output?
|
|
101
|
-
if (remainderAfterExtraOutput >= dustThreshold({ type: changeType })) {
|
|
102
|
-
outputs = outputs.concat({ value: remainderAfterExtraOutput, type: changeType });
|
|
103
|
-
}
|
|
104
|
-
const fee = sumOrNaN(inputs) - sumOrNaN(outputs);
|
|
105
|
-
logger.debug("finalize(): Re-calculated total fee: ", fee);
|
|
106
|
-
if (!isFinite(fee))
|
|
107
|
-
return { fee: (feeRate * bytesAccum) + cpfpAddFee };
|
|
108
|
-
return {
|
|
109
|
-
inputs: inputs,
|
|
110
|
-
outputs: outputs,
|
|
111
|
-
fee: fee
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
exports.utils = {
|
|
115
|
-
dustThreshold: dustThreshold,
|
|
116
|
-
finalize: finalize,
|
|
117
|
-
inputBytes: inputBytes,
|
|
118
|
-
outputBytes: outputBytes,
|
|
119
|
-
sumOrNaN: sumOrNaN,
|
|
120
|
-
sumForgiving: sumForgiving,
|
|
121
|
-
transactionBytes: transactionBytes,
|
|
122
|
-
uintOrNaN: uintOrNaN
|
|
123
|
-
};
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.utils = exports.DUST_THRESHOLDS = void 0;
|
|
4
|
+
const Logger_1 = require("../../utils/Logger");
|
|
5
|
+
const logger = (0, Logger_1.getLogger)("CoinSelect: ");
|
|
6
|
+
// baseline estimates, used to improve performance
|
|
7
|
+
const TX_EMPTY_SIZE = 4 + 1 + 1 + 4;
|
|
8
|
+
const TX_INPUT_BASE = 32 + 4 + 1 + 4;
|
|
9
|
+
const WITNESS_OVERHEAD = 2 / 4;
|
|
10
|
+
const P2WPKH_WITNESS = (1 + 1 + 72 + 1 + 33) / 4;
|
|
11
|
+
const P2TR_WITNESS = (1 + 1 + 65) / 4;
|
|
12
|
+
const TX_INPUT_PUBKEYHASH = 107;
|
|
13
|
+
const TX_INPUT_P2SH_P2WPKH = 23 + P2WPKH_WITNESS + 1;
|
|
14
|
+
const TX_INPUT_P2WPKH = 0 + P2WPKH_WITNESS;
|
|
15
|
+
const TX_INPUT_P2WSH = 0 + (1 + 1 + 64) / 4;
|
|
16
|
+
const TX_INPUT_P2TR = 0 + P2TR_WITNESS;
|
|
17
|
+
const TX_OUTPUT_BASE = 8 + 1;
|
|
18
|
+
const TX_OUTPUT_PUBKEYHASH = 25;
|
|
19
|
+
const TX_OUTPUT_P2SH_P2WPKH = 23;
|
|
20
|
+
const TX_OUTPUT_P2WPKH = 22;
|
|
21
|
+
const TX_OUTPUT_P2WSH = 34;
|
|
22
|
+
const TX_OUTPUT_P2TR = 34;
|
|
23
|
+
const INPUT_BYTES = {
|
|
24
|
+
"p2sh-p2wpkh": TX_INPUT_P2SH_P2WPKH,
|
|
25
|
+
"p2wpkh": TX_INPUT_P2WPKH,
|
|
26
|
+
"p2tr": TX_INPUT_P2TR,
|
|
27
|
+
"p2pkh": TX_INPUT_PUBKEYHASH,
|
|
28
|
+
"p2wsh": TX_INPUT_P2WSH
|
|
29
|
+
};
|
|
30
|
+
function inputBytes(input) {
|
|
31
|
+
if (input.script == null && input.type == null)
|
|
32
|
+
throw new Error("Needs either script or type defined!");
|
|
33
|
+
return TX_INPUT_BASE + (input.script ? input.script.length : INPUT_BYTES[input.type]);
|
|
34
|
+
}
|
|
35
|
+
const OUTPUT_BYTES = {
|
|
36
|
+
"p2sh-p2wpkh": TX_OUTPUT_P2SH_P2WPKH,
|
|
37
|
+
"p2wpkh": TX_OUTPUT_P2WPKH,
|
|
38
|
+
"p2tr": TX_OUTPUT_P2TR,
|
|
39
|
+
"p2pkh": TX_OUTPUT_PUBKEYHASH,
|
|
40
|
+
"p2wsh": TX_OUTPUT_P2WSH
|
|
41
|
+
};
|
|
42
|
+
function outputBytes(output) {
|
|
43
|
+
if (output.script == null && output.type == null)
|
|
44
|
+
throw new Error("Needs either script or type defined!");
|
|
45
|
+
return TX_OUTPUT_BASE + (output.script ? output.script.length : OUTPUT_BYTES[output.type]);
|
|
46
|
+
}
|
|
47
|
+
exports.DUST_THRESHOLDS = {
|
|
48
|
+
"p2sh-p2wpkh": 540,
|
|
49
|
+
"p2wpkh": 294,
|
|
50
|
+
"p2tr": 330,
|
|
51
|
+
"p2pkh": 546,
|
|
52
|
+
"p2wsh": 330
|
|
53
|
+
};
|
|
54
|
+
function dustThreshold(output) {
|
|
55
|
+
return exports.DUST_THRESHOLDS[output.type];
|
|
56
|
+
}
|
|
57
|
+
function transactionBytes(inputs, outputs, changeType) {
|
|
58
|
+
let size = TX_EMPTY_SIZE;
|
|
59
|
+
let isSegwit = false;
|
|
60
|
+
if (changeType != null && changeType !== "p2pkh") {
|
|
61
|
+
size += WITNESS_OVERHEAD;
|
|
62
|
+
isSegwit = true;
|
|
63
|
+
}
|
|
64
|
+
for (let input of inputs) {
|
|
65
|
+
if (!isSegwit && (input.type !== "p2pkh")) {
|
|
66
|
+
isSegwit = true;
|
|
67
|
+
size += WITNESS_OVERHEAD;
|
|
68
|
+
}
|
|
69
|
+
size += inputBytes(input);
|
|
70
|
+
}
|
|
71
|
+
for (let output of outputs) {
|
|
72
|
+
size += outputBytes(output);
|
|
73
|
+
}
|
|
74
|
+
return Math.ceil(size);
|
|
75
|
+
}
|
|
76
|
+
function uintOrNaN(v) {
|
|
77
|
+
if (typeof v !== 'number')
|
|
78
|
+
return NaN;
|
|
79
|
+
if (!isFinite(v))
|
|
80
|
+
return NaN;
|
|
81
|
+
if (Math.floor(v) !== v)
|
|
82
|
+
return NaN;
|
|
83
|
+
if (v < 0)
|
|
84
|
+
return NaN;
|
|
85
|
+
return v;
|
|
86
|
+
}
|
|
87
|
+
function sumForgiving(range) {
|
|
88
|
+
return range.reduce((a, x) => a + (isFinite(x.value) ? x.value : 0), 0);
|
|
89
|
+
}
|
|
90
|
+
function sumOrNaN(range) {
|
|
91
|
+
return range.reduce((a, x) => a + uintOrNaN(x.value), 0);
|
|
92
|
+
}
|
|
93
|
+
function finalize(inputs, outputs, feeRate, changeType, cpfpAddFee = 0) {
|
|
94
|
+
const bytesAccum = transactionBytes(inputs, outputs, changeType);
|
|
95
|
+
logger.debug("finalize(): Transaction bytes: ", bytesAccum);
|
|
96
|
+
const feeAfterExtraOutput = (feeRate * (bytesAccum + outputBytes({ type: changeType }))) + cpfpAddFee;
|
|
97
|
+
logger.debug("finalize(): TX fee after adding change output: ", feeAfterExtraOutput);
|
|
98
|
+
const remainderAfterExtraOutput = Math.floor(sumOrNaN(inputs) - (sumOrNaN(outputs) + feeAfterExtraOutput));
|
|
99
|
+
logger.debug("finalize(): Leaves change (changeType=" + changeType + ") value: ", remainderAfterExtraOutput);
|
|
100
|
+
// is it worth a change output?
|
|
101
|
+
if (remainderAfterExtraOutput >= dustThreshold({ type: changeType })) {
|
|
102
|
+
outputs = outputs.concat({ value: remainderAfterExtraOutput, type: changeType });
|
|
103
|
+
}
|
|
104
|
+
const fee = sumOrNaN(inputs) - sumOrNaN(outputs);
|
|
105
|
+
logger.debug("finalize(): Re-calculated total fee: ", fee);
|
|
106
|
+
if (!isFinite(fee))
|
|
107
|
+
return { fee: (feeRate * bytesAccum) + cpfpAddFee };
|
|
108
|
+
return {
|
|
109
|
+
inputs: inputs,
|
|
110
|
+
outputs: outputs,
|
|
111
|
+
fee: fee
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
exports.utils = {
|
|
115
|
+
dustThreshold: dustThreshold,
|
|
116
|
+
finalize: finalize,
|
|
117
|
+
inputBytes: inputBytes,
|
|
118
|
+
outputBytes: outputBytes,
|
|
119
|
+
sumOrNaN: sumOrNaN,
|
|
120
|
+
sumForgiving: sumForgiving,
|
|
121
|
+
transactionBytes: transactionBytes,
|
|
122
|
+
uintOrNaN: uintOrNaN
|
|
123
|
+
};
|