@ledgerhq/live-common 21.16.1 → 21.17.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.
Files changed (111) hide show
  1. package/lib/__tests__/families/bitcoin/wallet-btc/utils.test.js +95 -7
  2. package/lib/__tests__/families/bitcoin/wallet-btc/utils.test.js.map +1 -1
  3. package/lib/__tests__/families/bitcoin/wallet-btc/wallet.estimateMaxSpendable.test.js +1 -1
  4. package/lib/__tests__/families/bitcoin/wallet-btc/wallet.estimateMaxSpendable.test.js.map +1 -1
  5. package/lib/__tests__/families/bitcoin/wallet-btc/wallet.integration.test.js +2 -2
  6. package/lib/__tests__/families/bitcoin/wallet-btc/wallet.integration.test.js.map +1 -1
  7. package/lib/__tests__/families/bitcoin/wallet-btc/xpub.pickingStrategies.integration.test.js +20 -10
  8. package/lib/__tests__/families/bitcoin/wallet-btc/xpub.pickingStrategies.integration.test.js.map +1 -1
  9. package/lib/__tests__/families/bitcoin/wallet-btc/xpub.txs.NP2WPKH.integration.test.js +1 -1
  10. package/lib/__tests__/families/bitcoin/wallet-btc/xpub.txs.NP2WPKH.integration.test.js.map +1 -1
  11. package/lib/__tests__/families/bitcoin/wallet-btc/xpub.txs.P2WPKH.integration.test.js +1 -1
  12. package/lib/__tests__/families/bitcoin/wallet-btc/xpub.txs.P2WPKH.integration.test.js.map +1 -1
  13. package/lib/__tests__/families/bitcoin/wallet-btc/xpub.txs.integration.test.js +2 -2
  14. package/lib/__tests__/families/bitcoin/wallet-btc/xpub.txs.integration.test.js.map +1 -1
  15. package/lib/apps/polyfill.d.ts.map +1 -1
  16. package/lib/apps/polyfill.js +3 -0
  17. package/lib/apps/polyfill.js.map +1 -1
  18. package/lib/currencies/support.d.ts.map +1 -1
  19. package/lib/currencies/support.js.map +1 -1
  20. package/lib/families/bitcoin/bech32m.d.ts +22 -0
  21. package/lib/families/bitcoin/bech32m.d.ts.map +1 -0
  22. package/lib/families/bitcoin/bech32m.js +166 -0
  23. package/lib/families/bitcoin/bech32m.js.map +1 -0
  24. package/lib/families/bitcoin/js-buildTransaction.d.ts.map +1 -1
  25. package/lib/families/bitcoin/js-buildTransaction.js +1 -1
  26. package/lib/families/bitcoin/js-buildTransaction.js.map +1 -1
  27. package/lib/families/bitcoin/js-estimateMaxSpendable.d.ts.map +1 -1
  28. package/lib/families/bitcoin/js-estimateMaxSpendable.js +1 -1
  29. package/lib/families/bitcoin/js-estimateMaxSpendable.js.map +1 -1
  30. package/lib/families/bitcoin/js-synchronisation.d.ts.map +1 -1
  31. package/lib/families/bitcoin/js-synchronisation.js +3 -2
  32. package/lib/families/bitcoin/js-synchronisation.js.map +1 -1
  33. package/lib/families/bitcoin/wallet-btc/crypto/bitcoin.d.ts.map +1 -1
  34. package/lib/families/bitcoin/wallet-btc/crypto/bitcoin.js +11 -11
  35. package/lib/families/bitcoin/wallet-btc/crypto/bitcoin.js.map +1 -1
  36. package/lib/families/bitcoin/wallet-btc/crypto/bitcoincash.d.ts.map +1 -1
  37. package/lib/families/bitcoin/wallet-btc/crypto/bitcoincash.js +2 -1
  38. package/lib/families/bitcoin/wallet-btc/crypto/bitcoincash.js.map +1 -1
  39. package/lib/families/bitcoin/wallet-btc/crypto/digibyte.js +21 -2
  40. package/lib/families/bitcoin/wallet-btc/crypto/digibyte.js.map +1 -1
  41. package/lib/families/bitcoin/wallet-btc/crypto/litecoin.js +2 -2
  42. package/lib/families/bitcoin/wallet-btc/crypto/litecoin.js.map +1 -1
  43. package/lib/families/bitcoin/wallet-btc/crypto/zec.d.ts.map +1 -1
  44. package/lib/families/bitcoin/wallet-btc/crypto/zec.js +3 -2
  45. package/lib/families/bitcoin/wallet-btc/crypto/zec.js.map +1 -1
  46. package/lib/families/bitcoin/wallet-btc/crypto/zen.d.ts +2 -1
  47. package/lib/families/bitcoin/wallet-btc/crypto/zen.d.ts.map +1 -1
  48. package/lib/families/bitcoin/wallet-btc/crypto/zen.js +7 -4
  49. package/lib/families/bitcoin/wallet-btc/crypto/zen.js.map +1 -1
  50. package/lib/families/bitcoin/wallet-btc/pickingstrategies/CoinSelect.d.ts +2 -1
  51. package/lib/families/bitcoin/wallet-btc/pickingstrategies/CoinSelect.d.ts.map +1 -1
  52. package/lib/families/bitcoin/wallet-btc/pickingstrategies/CoinSelect.js +16 -12
  53. package/lib/families/bitcoin/wallet-btc/pickingstrategies/CoinSelect.js.map +1 -1
  54. package/lib/families/bitcoin/wallet-btc/pickingstrategies/DeepFirst.d.ts +2 -1
  55. package/lib/families/bitcoin/wallet-btc/pickingstrategies/DeepFirst.d.ts.map +1 -1
  56. package/lib/families/bitcoin/wallet-btc/pickingstrategies/DeepFirst.js +12 -7
  57. package/lib/families/bitcoin/wallet-btc/pickingstrategies/DeepFirst.js.map +1 -1
  58. package/lib/families/bitcoin/wallet-btc/pickingstrategies/Merge.d.ts +2 -1
  59. package/lib/families/bitcoin/wallet-btc/pickingstrategies/Merge.d.ts.map +1 -1
  60. package/lib/families/bitcoin/wallet-btc/pickingstrategies/Merge.js +12 -7
  61. package/lib/families/bitcoin/wallet-btc/pickingstrategies/Merge.js.map +1 -1
  62. package/lib/families/bitcoin/wallet-btc/pickingstrategies/types.d.ts +2 -1
  63. package/lib/families/bitcoin/wallet-btc/pickingstrategies/types.d.ts.map +1 -1
  64. package/lib/families/bitcoin/wallet-btc/pickingstrategies/types.js.map +1 -1
  65. package/lib/families/bitcoin/wallet-btc/utils.d.ts +38 -2
  66. package/lib/families/bitcoin/wallet-btc/utils.d.ts.map +1 -1
  67. package/lib/families/bitcoin/wallet-btc/utils.js +103 -35
  68. package/lib/families/bitcoin/wallet-btc/utils.js.map +1 -1
  69. package/lib/families/bitcoin/wallet-btc/wallet.d.ts +1 -1
  70. package/lib/families/bitcoin/wallet-btc/wallet.d.ts.map +1 -1
  71. package/lib/families/bitcoin/wallet-btc/wallet.js +9 -8
  72. package/lib/families/bitcoin/wallet-btc/wallet.js.map +1 -1
  73. package/lib/families/bitcoin/wallet-btc/xpub.js +2 -2
  74. package/lib/families/bitcoin/wallet-btc/xpub.js.map +1 -1
  75. package/lib/families/elrond/logic.js +22 -3
  76. package/lib/families/elrond/logic.js.map +1 -1
  77. package/lib/operation.js +1 -1
  78. package/lib/operation.js.map +1 -1
  79. package/package.json +16 -16
  80. package/src/.DS_Store +0 -0
  81. package/src/__tests__/__snapshots__/all.libcore.ts.snap +1188 -630
  82. package/src/__tests__/families/bitcoin/wallet-btc/utils.test.ts +109 -2
  83. package/src/__tests__/families/bitcoin/wallet-btc/wallet.estimateMaxSpendable.test.ts +3 -2
  84. package/src/__tests__/families/bitcoin/wallet-btc/wallet.integration.test.ts +2 -2
  85. package/src/__tests__/families/bitcoin/wallet-btc/xpub.pickingStrategies.integration.test.ts +35 -31
  86. package/src/__tests__/families/bitcoin/wallet-btc/xpub.txs.NP2WPKH.integration.test.ts +3 -2
  87. package/src/__tests__/families/bitcoin/wallet-btc/xpub.txs.P2WPKH.integration.test.ts +3 -2
  88. package/src/__tests__/families/bitcoin/wallet-btc/xpub.txs.integration.test.ts +6 -4
  89. package/src/apps/polyfill.ts +3 -0
  90. package/src/currencies/.DS_Store +0 -0
  91. package/src/currencies/__snapshots__/sortByMarketcap.test.ts.snap +68 -1325
  92. package/src/currencies/support.ts +1 -0
  93. package/src/families/bitcoin/bech32m.ts +197 -0
  94. package/src/families/bitcoin/js-buildTransaction.ts +2 -1
  95. package/src/families/bitcoin/js-estimateMaxSpendable.ts +2 -1
  96. package/src/families/bitcoin/js-synchronisation.ts +4 -2
  97. package/src/families/bitcoin/wallet-btc/crypto/bitcoin.ts +5 -4
  98. package/src/families/bitcoin/wallet-btc/crypto/bitcoincash.ts +2 -1
  99. package/src/families/bitcoin/wallet-btc/crypto/digibyte.ts +1 -1
  100. package/src/families/bitcoin/wallet-btc/crypto/litecoin.ts +1 -1
  101. package/src/families/bitcoin/wallet-btc/crypto/zec.ts +3 -2
  102. package/src/families/bitcoin/wallet-btc/crypto/zen.ts +10 -4
  103. package/src/families/bitcoin/wallet-btc/pickingstrategies/CoinSelect.ts +34 -22
  104. package/src/families/bitcoin/wallet-btc/pickingstrategies/DeepFirst.ts +30 -9
  105. package/src/families/bitcoin/wallet-btc/pickingstrategies/Merge.ts +30 -9
  106. package/src/families/bitcoin/wallet-btc/pickingstrategies/types.ts +3 -3
  107. package/src/families/bitcoin/wallet-btc/utils.ts +113 -41
  108. package/src/families/bitcoin/wallet-btc/wallet.ts +10 -8
  109. package/src/families/bitcoin/wallet-btc/xpub.ts +5 -5
  110. package/src/families/elrond/logic.ts +1 -1
  111. package/src/operation.ts +1 -1
@@ -10,8 +10,9 @@ var address_1 = require("bitcoinjs-lib/src/address");
10
10
  // @ts-ignore
11
11
  var zcash_bitcore_lib_1 = __importDefault(require("zcash-bitcore-lib"));
12
12
  var bs58check_1 = __importDefault(require("bs58check"));
13
- var types_1 = require("../types");
14
13
  var coininfo_1 = __importDefault(require("coininfo"));
14
+ var errors_1 = require("@ledgerhq/errors");
15
+ var types_1 = require("../types");
15
16
  var Zen = /** @class */ (function () {
16
17
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
18
  function Zen(_a) {
@@ -71,10 +72,12 @@ var Zen = /** @class */ (function () {
71
72
  };
72
73
  Zen.prototype.toOutputScript = function (address) {
73
74
  if (!this.validateAddress(address)) {
74
- throw new Error("Invalid address");
75
+ throw new errors_1.InvalidAddress();
75
76
  }
76
- // TODO find a better way to calculate the script from zen address instead of converting to bitcoin address
77
- return (0, address_1.toOutputScript)(Zen.toBitcoinAddr(address), coininfo_1["default"].bitcoin.main.toBitcoinJS());
77
+ var outputScript = (0, address_1.toOutputScript)(Zen.toBitcoinAddr(address), coininfo_1["default"].bitcoin.main.toBitcoinJS());
78
+ // refer to https://github.com/LedgerHQ/lib-ledger-core/blob/fc9d762b83fc2b269d072b662065747a64ab2816/core/src/wallet/bitcoin/scripts/BitcoinLikeScript.cpp#L139 and https://github.com/LedgerHQ/lib-ledger-core/blob/fc9d762b83fc2b269d072b662065747a64ab2816/core/src/wallet/bitcoin/networks.cpp#L39 for bip115 Script and its network parameters
79
+ var bip115Script = Buffer.from("209ec9845acb02fab24e1c0368b3b517c1a4488fba97f0e3459ac053ea0100000003c01f02b4", "hex");
80
+ return Buffer.concat([outputScript, bip115Script]);
78
81
  };
79
82
  // eslint-disable-next-line class-methods-use-this
80
83
  Zen.prototype.validateAddress = function (address) {
@@ -1 +1 @@
1
- {"version":3,"file":"zen.js","sourceRoot":"","sources":["../../../../../src/families/bitcoin/wallet-btc/crypto/zen.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"zen.js","sourceRoot":"","sources":["../../../../../src/families/bitcoin/wallet-btc/crypto/zen.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,9 @@ import BigNumber from "bignumber.js";
2
2
  import { Output } from "../storage/types";
3
3
  import Xpub from "../xpub";
4
4
  import { PickingStrategy } from "./types";
5
+ import { OutputInfo } from "..";
5
6
  export declare class CoinSelect extends PickingStrategy {
6
- selectUnspentUtxosToUse(xpub: Xpub, amount: BigNumber, feePerByte: number, nbOutputsWithoutChange: number): Promise<{
7
+ selectUnspentUtxosToUse(xpub: Xpub, outputs: OutputInfo[], feePerByte: number): Promise<{
7
8
  totalValue: BigNumber;
8
9
  unspentUtxos: Output[];
9
10
  fee: number;
@@ -1 +1 @@
1
- {"version":3,"file":"CoinSelect.d.ts","sourceRoot":"","sources":["../../../../../src/families/bitcoin/wallet-btc/pickingstrategies/CoinSelect.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AAGrC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAK1C,qBAAa,UAAW,SAAQ,eAAe;IAEvC,uBAAuB,CAC3B,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,sBAAsB,EAAE,MAAM;;;;;;CAwLjC"}
1
+ {"version":3,"file":"CoinSelect.d.ts","sourceRoot":"","sources":["../../../../../src/families/bitcoin/wallet-btc/pickingstrategies/CoinSelect.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AAGrC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAI1C,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,qBAAa,UAAW,SAAQ,eAAe;IAEvC,uBAAuB,CAC3B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,UAAU,EAAE,EACrB,UAAU,EAAE,MAAM;;;;;;CAoMrB"}
@@ -87,9 +87,9 @@ var CoinSelect = /** @class */ (function (_super) {
87
87
  return _super !== null && _super.apply(this, arguments) || this;
88
88
  }
89
89
  // eslint-disable-next-line class-methods-use-this
90
- CoinSelect.prototype.selectUnspentUtxosToUse = function (xpub, amount, feePerByte, nbOutputsWithoutChange) {
90
+ CoinSelect.prototype.selectUnspentUtxosToUse = function (xpub, outputs, feePerByte) {
91
91
  return __awaiter(this, void 0, void 0, function () {
92
- var addresses, unspentUtxos, _a, TOTAL_TRIES, fixedSize, oneOutputSize, oneInputSize, currentAvailableValue, effectiveUtxos, i, outEffectiveValue, effectiveUtxo, notInputFees, currentValue, currentSelection, actualTarget, currentWaste, bestWaste, bestSelection, bestSelectionNeedChangeoutput, currentSelectionNeedChangeoutput, i, backtrack, nbInput, eu, eu, total, unspentUtxoSelected, i, fee, pickingStrategy;
92
+ var addresses, unspentUtxos, _a, TOTAL_TRIES, fixedSize, outputAddresses, oneOutputSize, oneInputSize, currentAvailableValue, effectiveUtxos, i, outEffectiveValue, effectiveUtxo, notInputFees, currentValue, currentSelection, amount, actualTarget, currentWaste, bestWaste, bestSelection, bestSelectionNeedChangeoutput, currentSelectionNeedChangeoutput, i, backtrack, nbInput, eu, eu, total, unspentUtxoSelected, i, fee, pickingStrategy;
93
93
  var _this = this;
94
94
  return __generator(this, function (_b) {
95
95
  switch (_b.label) {
@@ -105,9 +105,14 @@ var CoinSelect = /** @class */ (function (_super) {
105
105
  });
106
106
  TOTAL_TRIES = 100000;
107
107
  (0, logs_1.log)("picking strategy", "utxos", unspentUtxos);
108
- fixedSize = utils.accurateTxSize(0, 0, this.crypto, this.derivationMode);
109
- oneOutputSize = utils.accurateTxSize(0, 1, this.crypto, this.derivationMode) - fixedSize;
110
- oneInputSize = utils.accurateTxSize(1, 0, this.crypto, this.derivationMode) - fixedSize;
108
+ fixedSize = utils.maxTxSize(0, [], false, this.crypto, this.derivationMode);
109
+ outputAddresses = outputs.map(function (o) { return o.address; });
110
+ oneOutputSize = outputAddresses.length > 0
111
+ ? utils.maxTxSize(0, [outputAddresses[0]], false, this.crypto, this.derivationMode) - fixedSize
112
+ : utils.maxTxSize(0, [], true, this.crypto, this.derivationMode) -
113
+ fixedSize;
114
+ oneInputSize = utils.maxTxSize(1, [], false, this.crypto, this.derivationMode) -
115
+ fixedSize;
111
116
  currentAvailableValue = 0;
112
117
  effectiveUtxos = [];
113
118
  for (i = 0; i < unspentUtxos.length; i += 1) {
@@ -121,9 +126,10 @@ var CoinSelect = /** @class */ (function (_super) {
121
126
  currentAvailableValue += outEffectiveValue;
122
127
  }
123
128
  }
124
- notInputFees = feePerByte * (fixedSize + oneOutputSize * nbOutputsWithoutChange);
129
+ notInputFees = feePerByte * (fixedSize + oneOutputSize * outputs.length);
125
130
  currentValue = 0;
126
131
  currentSelection = [];
132
+ amount = outputs.reduce(function (sum, output) { return sum.plus(output.value); }, new bignumber_js_1["default"](0));
127
133
  actualTarget = notInputFees + amount.toNumber();
128
134
  // Insufficient funds
129
135
  if (currentAvailableValue < actualTarget) {
@@ -146,14 +152,14 @@ var CoinSelect = /** @class */ (function (_super) {
146
152
  currentSelectionNeedChangeoutput = true;
147
153
  currentWaste =
148
154
  feePerByte *
149
- utils.estimateTxSize(nbInput, nbOutputsWithoutChange + 1, this.crypto, this.derivationMode);
155
+ utils.maxTxSizeCeil(nbInput, outputAddresses, true, this.crypto, this.derivationMode);
150
156
  }
151
157
  else {
152
158
  // changeoutput is not required
153
159
  currentSelectionNeedChangeoutput = false;
154
160
  currentWaste =
155
161
  feePerByte *
156
- utils.estimateTxSize(nbInput, nbOutputsWithoutChange, this.crypto, this.derivationMode) +
162
+ utils.maxTxSizeCeil(nbInput, outputAddresses, false, this.crypto, this.derivationMode) +
157
163
  currentValue -
158
164
  actualTarget;
159
165
  }
@@ -202,9 +208,7 @@ var CoinSelect = /** @class */ (function (_super) {
202
208
  }
203
209
  }
204
210
  fee = feePerByte *
205
- utils.estimateTxSize(unspentUtxoSelected.length, bestSelectionNeedChangeoutput
206
- ? nbOutputsWithoutChange + 1
207
- : nbOutputsWithoutChange, this.crypto, this.derivationMode);
211
+ utils.maxTxSizeCeil(unspentUtxoSelected.length, outputAddresses, bestSelectionNeedChangeoutput, this.crypto, this.derivationMode);
208
212
  return [2 /*return*/, {
209
213
  totalValue: total,
210
214
  unspentUtxos: unspentUtxoSelected,
@@ -213,7 +217,7 @@ var CoinSelect = /** @class */ (function (_super) {
213
217
  }];
214
218
  }
215
219
  pickingStrategy = new DeepFirst_1.DeepFirst(this.crypto, this.derivationMode, this.excludedUTXOs);
216
- return [2 /*return*/, pickingStrategy.selectUnspentUtxosToUse(xpub, amount, feePerByte, nbOutputsWithoutChange)];
220
+ return [2 /*return*/, pickingStrategy.selectUnspentUtxosToUse(xpub, outputs, feePerByte)];
217
221
  }
218
222
  });
219
223
  });
@@ -1 +1 @@
1
- {"version":3,"file":"CoinSelect.js","sourceRoot":"","sources":["../../../../../src/families/bitcoin/wallet-btc/pickingstrategies/CoinSelect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CoinSelect.js","sourceRoot":"","sources":["../../../../../src/families/bitcoin/wallet-btc/pickingstrategies/CoinSelect.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,9 @@ import BigNumber from "bignumber.js";
2
2
  import { Output } from "../storage/types";
3
3
  import Xpub from "../xpub";
4
4
  import { PickingStrategy } from "./types";
5
+ import { OutputInfo } from "..";
5
6
  export declare class DeepFirst extends PickingStrategy {
6
- selectUnspentUtxosToUse(xpub: Xpub, amount: BigNumber, feePerByte: number, nbOutputsWithoutChange: number): Promise<{
7
+ selectUnspentUtxosToUse(xpub: Xpub, outputs: OutputInfo[], feePerByte: number): Promise<{
7
8
  totalValue: BigNumber;
8
9
  unspentUtxos: Output[];
9
10
  fee: number;
@@ -1 +1 @@
1
- {"version":3,"file":"DeepFirst.d.ts","sourceRoot":"","sources":["../../../../../src/families/bitcoin/wallet-btc/pickingstrategies/DeepFirst.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AAGrC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAI1C,qBAAa,SAAU,SAAQ,eAAe;IAEtC,uBAAuB,CAC3B,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,sBAAsB,EAAE,MAAM;;;;;;CAkEjC"}
1
+ {"version":3,"file":"DeepFirst.d.ts","sourceRoot":"","sources":["../../../../../src/families/bitcoin/wallet-btc/pickingstrategies/DeepFirst.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AAGrC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG1C,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,qBAAa,SAAU,SAAQ,eAAe;IAEtC,uBAAuB,CAC3B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,UAAU,EAAE,EACrB,UAAU,EAAE,MAAM;;;;;;CAuFrB"}
@@ -86,9 +86,9 @@ var DeepFirst = /** @class */ (function (_super) {
86
86
  return _super !== null && _super.apply(this, arguments) || this;
87
87
  }
88
88
  // eslint-disable-next-line class-methods-use-this
89
- DeepFirst.prototype.selectUnspentUtxosToUse = function (xpub, amount, feePerByte, nbOutputsWithoutChange) {
89
+ DeepFirst.prototype.selectUnspentUtxosToUse = function (xpub, outputs, feePerByte) {
90
90
  return __awaiter(this, void 0, void 0, function () {
91
- var addresses, unspentUtxos, _a, txSizeNoInput, fee, sizePerInput, sizePerOutput, total, unspentUtxoSelected, i;
91
+ var addresses, unspentUtxos, _a, outputAddresses, txSizeNoInput, fee, emptyTxSize, sizePerInput, sizePerOutput, total, unspentUtxoSelected, amount, i;
92
92
  var _this = this;
93
93
  return __generator(this, function (_b) {
94
94
  switch (_b.label) {
@@ -102,15 +102,20 @@ var DeepFirst = /** @class */ (function (_super) {
102
102
  unspentUtxos = _a.apply(void 0, [_b.sent()]).filter(function (o) {
103
103
  return !_this.excludedUTXOs.filter(function (x) { return x.hash === o.output_hash && x.outputIndex === o.output_index; }).length;
104
104
  });
105
+ outputAddresses = outputs.map(function (o) { return o.address; });
105
106
  unspentUtxos = (0, lodash_1.sortBy)(unspentUtxos, "block_height");
106
- txSizeNoInput = utils.accurateTxSize(0, nbOutputsWithoutChange, this.crypto, this.derivationMode);
107
+ txSizeNoInput = utils.maxTxSize(0, outputAddresses, false, this.crypto, this.derivationMode);
107
108
  fee = txSizeNoInput * feePerByte;
108
- sizePerInput = utils.accurateTxSize(1, 0, this.crypto, this.derivationMode) -
109
- utils.accurateTxSize(0, 0, this.crypto, this.derivationMode);
110
- sizePerOutput = utils.accurateTxSize(0, 1, this.crypto, this.derivationMode) -
111
- utils.accurateTxSize(0, 0, this.crypto, this.derivationMode);
109
+ emptyTxSize = utils.maxTxSizeCeil(0, [], false, this.crypto, this.derivationMode);
110
+ sizePerInput = utils.maxTxSize(1, [], false, this.crypto, this.derivationMode) -
111
+ emptyTxSize;
112
+ sizePerOutput = (outputAddresses[0]
113
+ ? utils.maxTxSize(0, [outputAddresses[0]], false, this.crypto, this.derivationMode)
114
+ : utils.maxTxSize(0, [], true, this.crypto, this.derivationMode)) -
115
+ emptyTxSize;
112
116
  total = new bignumber_js_1["default"](0);
113
117
  unspentUtxoSelected = [];
118
+ amount = outputs.reduce(function (sum, output) { return sum.plus(output.value); }, new bignumber_js_1["default"](0));
114
119
  i = 0;
115
120
  while (total.lt(amount.plus(fee))) {
116
121
  if (!unspentUtxos[i]) {
@@ -1 +1 @@
1
- {"version":3,"file":"DeepFirst.js","sourceRoot":"","sources":["../../../../../src/families/bitcoin/wallet-btc/pickingstrategies/DeepFirst.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DeepFirst.js","sourceRoot":"","sources":["../../../../../src/families/bitcoin/wallet-btc/pickingstrategies/DeepFirst.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,9 @@ import BigNumber from "bignumber.js";
2
2
  import { Output } from "../storage/types";
3
3
  import Xpub from "../xpub";
4
4
  import { PickingStrategy } from "./types";
5
+ import { OutputInfo } from "..";
5
6
  export declare class Merge extends PickingStrategy {
6
- selectUnspentUtxosToUse(xpub: Xpub, amount: BigNumber, feePerByte: number, nbOutputsWithoutChange: number): Promise<{
7
+ selectUnspentUtxosToUse(xpub: Xpub, outputs: OutputInfo[], feePerByte: number): Promise<{
7
8
  totalValue: BigNumber;
8
9
  unspentUtxos: Output[];
9
10
  fee: number;
@@ -1 +1 @@
1
- {"version":3,"file":"Merge.d.ts","sourceRoot":"","sources":["../../../../../src/families/bitcoin/wallet-btc/pickingstrategies/Merge.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AAGrC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAI1C,qBAAa,KAAM,SAAQ,eAAe;IAElC,uBAAuB,CAC3B,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,sBAAsB,EAAE,MAAM;;;;;;CAkEjC"}
1
+ {"version":3,"file":"Merge.d.ts","sourceRoot":"","sources":["../../../../../src/families/bitcoin/wallet-btc/pickingstrategies/Merge.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AAGrC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG1C,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,qBAAa,KAAM,SAAQ,eAAe;IAElC,uBAAuB,CAC3B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,UAAU,EAAE,EACrB,UAAU,EAAE,MAAM;;;;;;CAuFrB"}
@@ -86,9 +86,9 @@ var Merge = /** @class */ (function (_super) {
86
86
  return _super !== null && _super.apply(this, arguments) || this;
87
87
  }
88
88
  // eslint-disable-next-line class-methods-use-this
89
- Merge.prototype.selectUnspentUtxosToUse = function (xpub, amount, feePerByte, nbOutputsWithoutChange) {
89
+ Merge.prototype.selectUnspentUtxosToUse = function (xpub, outputs, feePerByte) {
90
90
  return __awaiter(this, void 0, void 0, function () {
91
- var addresses, unspentUtxos, _a, sizePerInput, sizePerOutput, txSizeNoInput, fee, total, unspentUtxoSelected, i;
91
+ var addresses, unspentUtxos, _a, outputAddresses, emptyTxSize, sizePerInput, sizePerOutput, txSizeNoInput, fee, total, unspentUtxoSelected, i, amount;
92
92
  var _this = this;
93
93
  return __generator(this, function (_b) {
94
94
  switch (_b.label) {
@@ -102,16 +102,21 @@ var Merge = /** @class */ (function (_super) {
102
102
  unspentUtxos = _a.apply(void 0, [_b.sent()]).filter(function (o) {
103
103
  return !_this.excludedUTXOs.filter(function (x) { return x.hash === o.output_hash && x.outputIndex === o.output_index; }).length;
104
104
  });
105
- sizePerInput = utils.accurateTxSize(1, 0, this.crypto, this.derivationMode) -
106
- utils.accurateTxSize(0, 0, this.crypto, this.derivationMode);
107
- sizePerOutput = utils.accurateTxSize(0, 1, this.crypto, this.derivationMode) -
108
- utils.accurateTxSize(0, 0, this.crypto, this.derivationMode);
105
+ outputAddresses = outputs.map(function (o) { return o.address; });
106
+ emptyTxSize = utils.maxTxSizeCeil(0, [], false, this.crypto, this.derivationMode);
107
+ sizePerInput = utils.maxTxSize(1, [], false, this.crypto, this.derivationMode) -
108
+ emptyTxSize;
109
+ sizePerOutput = (outputAddresses[0]
110
+ ? utils.maxTxSize(0, [outputAddresses[0]], false, this.crypto, this.derivationMode)
111
+ : utils.maxTxSize(0, [], true, this.crypto, this.derivationMode)) -
112
+ emptyTxSize;
109
113
  unspentUtxos = (0, lodash_1.sortBy)(unspentUtxos, function (utxo) { return parseInt(utxo.value, 10); });
110
- txSizeNoInput = utils.accurateTxSize(0, nbOutputsWithoutChange, this.crypto, this.derivationMode);
114
+ txSizeNoInput = utils.maxTxSize(0, outputAddresses, false, this.crypto, this.derivationMode);
111
115
  fee = txSizeNoInput * feePerByte;
112
116
  total = new bignumber_js_1["default"](0);
113
117
  unspentUtxoSelected = [];
114
118
  i = 0;
119
+ amount = outputs.reduce(function (sum, output) { return sum.plus(output.value); }, new bignumber_js_1["default"](0));
115
120
  while (total.lt(amount.plus(fee))) {
116
121
  if (!unspentUtxos[i]) {
117
122
  throw new errors_1.NotEnoughBalance();
@@ -1 +1 @@
1
- {"version":3,"file":"Merge.js","sourceRoot":"","sources":["../../../../../src/families/bitcoin/wallet-btc/pickingstrategies/Merge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Merge.js","sourceRoot":"","sources":["../../../../../src/families/bitcoin/wallet-btc/pickingstrategies/Merge.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import BigNumber from "bignumber.js";
2
+ import { OutputInfo } from "..";
2
3
  import { ICrypto } from "../crypto/types";
3
4
  import { Output } from "../storage/types";
4
5
  import Xpub from "../xpub";
@@ -13,7 +14,7 @@ export declare abstract class PickingStrategy {
13
14
  hash: string;
14
15
  outputIndex: number;
15
16
  }>);
16
- abstract selectUnspentUtxosToUse(xpub: Xpub, amount: BigNumber, feePerByte: number, nbOutputsWithoutChange: number): Promise<{
17
+ abstract selectUnspentUtxosToUse(xpub: Xpub, outputs: OutputInfo[], feePerByte: number): Promise<{
17
18
  unspentUtxos: Output[];
18
19
  totalValue: BigNumber;
19
20
  fee: number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/families/bitcoin/wallet-btc/pickingstrategies/types.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,8BAAsB,eAAe;IACnC,MAAM,EAAE,OAAO,CAAC;IAEhB,cAAc,EAAE,MAAM,CAAC;IAGvB,aAAa,EAAE,KAAK,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;gBAGD,MAAM,EAAE,OAAO,EACf,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,KAAK,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IAOJ,QAAQ,CAAC,uBAAuB,CAC9B,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,sBAAsB,EAAE,MAAM,GAC7B,OAAO,CAAC;QACT,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,UAAU,EAAE,SAAS,CAAC;QACtB,GAAG,EAAE,MAAM,CAAC;QACZ,gBAAgB,EAAE,OAAO,CAAC;KAC3B,CAAC;CACH"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/families/bitcoin/wallet-btc/pickingstrategies/types.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,8BAAsB,eAAe;IACnC,MAAM,EAAE,OAAO,CAAC;IAEhB,cAAc,EAAE,MAAM,CAAC;IAGvB,aAAa,EAAE,KAAK,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;gBAGD,MAAM,EAAE,OAAO,EACf,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,KAAK,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IAOJ,QAAQ,CAAC,uBAAuB,CAC9B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,UAAU,EAAE,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;QACT,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,UAAU,EAAE,SAAS,CAAC;QACtB,GAAG,EAAE,MAAM,CAAC;QACZ,gBAAgB,EAAE,OAAO,CAAC;KAC3B,CAAC;CACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/families/bitcoin/wallet-btc/pickingstrategies/types.ts"],"names":[],"mappings":";;;AAKA;IAWE,yBACE,MAAe,EACf,cAAsB,EACtB,aAGE;QAEF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAaH,sBAAC;AAAD,CAAC,AAnCD,IAmCC;AAnCqB,0CAAe"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/families/bitcoin/wallet-btc/pickingstrategies/types.ts"],"names":[],"mappings":";;;AAMA;IAWE,yBACE,MAAe,EACf,cAAsB,EACtB,aAGE;QAEF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAYH,sBAAC;AAAD,CAAC,AAlCD,IAkCC;AAlCqB,0CAAe"}
@@ -6,8 +6,44 @@ export declare function toHexInt(number: any): string;
6
6
  export declare function compressPublicKey(publicKey: any): any;
7
7
  export declare function createXPUB(depth: any, fingerprint: any, childnum: any, chaincode: any, publicKey: any, network: any): string;
8
8
  export declare function byteSize(count: number): 1 | 3 | 5 | 9;
9
- export declare function accurateTxSize(inputCount: number, outputCount: number, currency: ICrypto, derivationMode: string): number;
10
- export declare function estimateTxSize(inputCount: number, outputCount: number, currency: ICrypto, derivationMode: string): number;
9
+ export declare function outputSize(currency: ICrypto, addr: string): number;
10
+ /**
11
+ * Calculates the maximun size of an imaginary transaction in virtual bytes
12
+ * (vB). 1vB = 4 WU (weight units). If a cryptocurrency doesn't use segwit, then
13
+ * 1 byte = 1 vB. Weight units are used for segwit transactions, where certain
14
+ * bytes of the transaction is counted as 4 WU and some as 1 WU. The resulting
15
+ * size is then ceil(totalWU/4) vB.
16
+ *
17
+ * refer to https://medium.com/coinmonks/on-bitcoin-transaction-sizes-part-2-9445373d17f4
18
+ * and https://bitcoin.stackexchange.com/questions/96017/what-are-the-sizes-of-single-sig-and-2-of-3-multisig-taproot-inputs
19
+ * and https://bitcoinops.org/en/tools/calc-size/
20
+ *
21
+ * Suggested improvement: I assume that these calculations won't be exactly
22
+ * correct for altcoins (but I don't know). Therefore we should move this
23
+ * functionality into ICrypto, to make it easier to provide slightly different
24
+ * calculations for different cryptocurrencies.
25
+ *
26
+ * The reason for the name maxTxSize, instead of just txSize, is that the size
27
+ * of modern ecdsa signatures aren't know beforehand. They are either 71 or
28
+ * 72 bytes. This function always count with 72 byte signatures.
29
+ *
30
+ * The size of schnorr signatures is expected to be 65 bytes, since the Bitcoin
31
+ * hardware app appends the optional sighash type 01 at the end of the
32
+ * signature. If the app removes that optional byte, this functions should be
33
+ * updated to use 64 byte schnorr signatures, even if 65 still is an acceptable
34
+ * maximum.
35
+ *
36
+ * @param inputCount Number of inputs of the imaginary transaction
37
+ * @param outputAddrs The addresses of the outputs, excluding change.
38
+ * @param includeChange Indicates whether we should add a change output. The
39
+ * change output will have the same derivation mode as the inputs. See
40
+ * derivationMode parameter.
41
+ * @param currency The currency for which the calculation is done.
42
+ * @param derivationMode The derivation mode used for calculating the size of
43
+ * the inputs.
44
+ */
45
+ export declare function maxTxSize(inputCount: number, outputAddrs: string[], includeChange: boolean, currency: ICrypto, derivationMode: string): number;
46
+ export declare function maxTxSizeCeil(inputCount: number, outputAddrs: string[], includeChange: boolean, currency: ICrypto, derivationMode: string): number;
11
47
  export declare function computeDustAmount(currency: ICrypto, txSize: number): any;
12
48
  export declare function isValidAddress(address: string, currency?: Currency): boolean;
13
49
  export declare function isTaprootAddress(address: string, currency?: Currency): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/families/bitcoin/wallet-btc/utils.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAInD,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,YAQtC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,GAAG,UAQ3C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,GAAG,UAIrC;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,GAAG,UAWnC;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,GAAG,OAa/C;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,GAAG,EACV,WAAW,EAAE,GAAG,EAChB,QAAQ,EAAE,GAAG,EACb,SAAS,EAAE,GAAG,EACd,SAAS,EAAE,GAAG,EACd,OAAO,EAAE,GAAG,UASb;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,iBAWrC;AAGD,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,OAAO,EACjB,cAAc,EAAE,MAAM,UAoCvB;AAED,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,OAAO,EACjB,cAAc,EAAE,MAAM,UAKvB;AAGD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAalE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,WASlE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,WAQpE"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/families/bitcoin/wallet-btc/utils.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAKnD,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,YAQtC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,GAAG,UAQ3C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,GAAG,UAIrC;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,GAAG,UAWnC;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,GAAG,OAa/C;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,GAAG,EACV,WAAW,EAAE,GAAG,EAChB,QAAQ,EAAE,GAAG,EACb,SAAS,EAAE,GAAG,EACd,SAAS,EAAE,GAAG,EACd,OAAO,EAAE,GAAG,UASb;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,iBAWrC;AA6CD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGlE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,SAAS,CACvB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EAAE,EACrB,aAAa,EAAE,OAAO,EACtB,QAAQ,EAAE,OAAO,EACjB,cAAc,EAAE,MAAM,GACrB,MAAM,CAiBR;AAED,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EAAE,EACrB,aAAa,EAAE,OAAO,EACtB,QAAQ,EAAE,OAAO,EACjB,cAAc,EAAE,MAAM,GACrB,MAAM,CASR;AAGD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAalE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,WASlE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,WAQpE"}
@@ -22,7 +22,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
22
22
  return (mod && mod.__esModule) ? mod : { "default": mod };
23
23
  };
24
24
  exports.__esModule = true;
25
- exports.isTaprootAddress = exports.isValidAddress = exports.computeDustAmount = exports.estimateTxSize = exports.accurateTxSize = exports.byteSize = exports.createXPUB = exports.compressPublicKey = exports.toHexInt = exports.toHexDigit = exports.encodeBase58Check = exports.parseHexString = void 0;
25
+ exports.isTaprootAddress = exports.isValidAddress = exports.computeDustAmount = exports.maxTxSizeCeil = exports.maxTxSize = exports.outputSize = exports.byteSize = exports.createXPUB = exports.compressPublicKey = exports.toHexInt = exports.toHexDigit = exports.encodeBase58Check = exports.parseHexString = void 0;
26
26
  /* eslint-disable @typescript-eslint/no-explicit-any */
27
27
  var bitcoin = __importStar(require("bitcoinjs-lib"));
28
28
  var bs58_1 = __importDefault(require("bs58"));
@@ -30,6 +30,7 @@ var lodash_1 = require("lodash");
30
30
  var types_1 = require("./types");
31
31
  var factory_1 = __importDefault(require("./crypto/factory"));
32
32
  var base_1 = require("./crypto/base");
33
+ var errors_1 = require("../../../errors");
33
34
  function parseHexString(str) {
34
35
  var result = [];
35
36
  while (str.length >= 2) {
@@ -107,49 +108,116 @@ function byteSize(count) {
107
108
  return 9;
108
109
  }
109
110
  exports.byteSize = byteSize;
110
- // refer to https://github.com/LedgerHQ/lib-ledger-core/blob/fc9d762b83fc2b269d072b662065747a64ab2816/core/src/wallet/bitcoin/api_impl/BitcoinLikeTransactionApi.cpp#L217
111
- function accurateTxSize(inputCount, outputCount, currency, derivationMode) {
112
- var txSize = 0;
113
- var fixedSize = 0;
114
- // Fixed size computation
115
- fixedSize = 4; // Transaction version
111
+ var baseByte = 4;
112
+ function fixedWeight(currency, derivationMode) {
113
+ var fixedWeight = 4 * baseByte; // Transaction version
116
114
  if (currency.network.usesTimestampedTransaction)
117
- fixedSize += 4; // Timestamp
118
- fixedSize += byteSize(inputCount); // Number of inputs
119
- fixedSize += byteSize(outputCount); // Number of outputs
120
- fixedSize += 4; // Timelock
115
+ fixedWeight += 4 * baseByte; // Timestamp
116
+ fixedWeight += 4 * baseByte; // Timelock
121
117
  if (derivationMode !== types_1.DerivationModes.LEGACY) {
122
- fixedSize += 0.5; // Segwit marker & segwit flag
118
+ fixedWeight += 2; // Segwit marker & segwit flag, 1 WU per byte
123
119
  }
124
- // refer to https://medium.com/coinmonks/on-bitcoin-transaction-sizes-part-2-9445373d17f4
125
- // and https://bitcoin.stackexchange.com/questions/96017/what-are-the-sizes-of-single-sig-and-2-of-3-multisig-taproot-inputs
126
- // and https://bitcoinops.org/en/tools/calc-size/
120
+ return fixedWeight;
121
+ }
122
+ function inputWeight(derivationMode) {
123
+ var inputWeight = (32 + 4 + 1 + 4) * baseByte;
127
124
  if (derivationMode === types_1.DerivationModes.TAPROOT) {
128
- txSize = fixedSize + 57.75 * inputCount + 43 * outputCount;
129
- return txSize;
130
- }
131
- var isSegwit = derivationMode === types_1.DerivationModes.NATIVE_SEGWIT ||
132
- derivationMode === types_1.DerivationModes.SEGWIT;
133
- if (isSegwit) {
134
- // Native Segwit: 32 PrevTxHash + 4 Index + 1 null byte + 4 sequence
135
- // P2SH: 32 PrevTxHash + 4 Index + 23 scriptPubKey + 4 sequence
136
- var isNativeSegwit = derivationMode === types_1.DerivationModes.NATIVE_SEGWIT;
137
- var inputSize = isNativeSegwit ? 41 : 63;
138
- var noWitness = fixedSize + inputSize * inputCount + 43 * outputCount; //43 is the biggest output(taproot output) size, we use the biggest one for safety
139
- // Include flag and marker size (one byte each)
140
- var witnessSize = noWitness + 108 * inputCount + 2;
141
- txSize = (noWitness * 3 + witnessSize) / 4;
125
+ inputWeight += 1 + 1 + 65;
126
+ }
127
+ else if (derivationMode === types_1.DerivationModes.NATIVE_SEGWIT) {
128
+ inputWeight += 1 + 1 + 72 + 1 + 33;
129
+ }
130
+ else if (derivationMode === types_1.DerivationModes.SEGWIT) {
131
+ inputWeight += 22 * baseByte + 1 + 1 + 72 + 1 + 33;
132
+ }
133
+ else if (derivationMode === types_1.DerivationModes.LEGACY) {
134
+ inputWeight += 107 * baseByte;
142
135
  }
143
136
  else {
144
- txSize = fixedSize + 148 * inputCount + 43 * outputCount;
137
+ throw (0, errors_1.UnsupportedDerivation)("Derivation mode " + derivationMode + " unknown");
138
+ }
139
+ return inputWeight;
140
+ }
141
+ function outputWeight(derivationMode) {
142
+ var outputSize = 8 + 1; // amount + script size
143
+ if (derivationMode === types_1.DerivationModes.TAPROOT) {
144
+ outputSize += 34; // "1" + PUSH32 + <32 bytes>
145
+ }
146
+ else if (derivationMode === types_1.DerivationModes.NATIVE_SEGWIT) {
147
+ outputSize += 22; // "0" + PUSH20 + <20 bytes>
148
+ }
149
+ else if (derivationMode === types_1.DerivationModes.SEGWIT) {
150
+ outputSize += 23; // HASH160 + PUSH20 + <20 bytes> + EQUAL
151
+ }
152
+ else if (derivationMode === types_1.DerivationModes.LEGACY) {
153
+ outputSize += 25; // DUP + HASH160 + PUSH20 + <20 bytes> + EQUALVERIFY + CHECKSIG
154
+ }
155
+ else {
156
+ throw (0, errors_1.UnsupportedDerivation)(derivationMode);
157
+ }
158
+ return outputSize * 4;
159
+ }
160
+ function outputSize(currency, addr) {
161
+ var scriptLen = currency.toOutputScript(addr).length;
162
+ return 1 + 8 + scriptLen;
163
+ }
164
+ exports.outputSize = outputSize;
165
+ /**
166
+ * Calculates the maximun size of an imaginary transaction in virtual bytes
167
+ * (vB). 1vB = 4 WU (weight units). If a cryptocurrency doesn't use segwit, then
168
+ * 1 byte = 1 vB. Weight units are used for segwit transactions, where certain
169
+ * bytes of the transaction is counted as 4 WU and some as 1 WU. The resulting
170
+ * size is then ceil(totalWU/4) vB.
171
+ *
172
+ * refer to https://medium.com/coinmonks/on-bitcoin-transaction-sizes-part-2-9445373d17f4
173
+ * and https://bitcoin.stackexchange.com/questions/96017/what-are-the-sizes-of-single-sig-and-2-of-3-multisig-taproot-inputs
174
+ * and https://bitcoinops.org/en/tools/calc-size/
175
+ *
176
+ * Suggested improvement: I assume that these calculations won't be exactly
177
+ * correct for altcoins (but I don't know). Therefore we should move this
178
+ * functionality into ICrypto, to make it easier to provide slightly different
179
+ * calculations for different cryptocurrencies.
180
+ *
181
+ * The reason for the name maxTxSize, instead of just txSize, is that the size
182
+ * of modern ecdsa signatures aren't know beforehand. They are either 71 or
183
+ * 72 bytes. This function always count with 72 byte signatures.
184
+ *
185
+ * The size of schnorr signatures is expected to be 65 bytes, since the Bitcoin
186
+ * hardware app appends the optional sighash type 01 at the end of the
187
+ * signature. If the app removes that optional byte, this functions should be
188
+ * updated to use 64 byte schnorr signatures, even if 65 still is an acceptable
189
+ * maximum.
190
+ *
191
+ * @param inputCount Number of inputs of the imaginary transaction
192
+ * @param outputAddrs The addresses of the outputs, excluding change.
193
+ * @param includeChange Indicates whether we should add a change output. The
194
+ * change output will have the same derivation mode as the inputs. See
195
+ * derivationMode parameter.
196
+ * @param currency The currency for which the calculation is done.
197
+ * @param derivationMode The derivation mode used for calculating the size of
198
+ * the inputs.
199
+ */
200
+ function maxTxSize(inputCount, outputAddrs, includeChange, currency, derivationMode) {
201
+ var fixed = fixedWeight(currency, derivationMode);
202
+ var outputsWeight = byteSize(outputAddrs.length) * baseByte; // Number of outputs;
203
+ outputAddrs.forEach(function (addr) {
204
+ outputsWeight += outputSize(currency, addr) * baseByte;
205
+ });
206
+ if (includeChange) {
207
+ outputsWeight += outputWeight(derivationMode);
145
208
  }
146
- return txSize;
209
+ // Input: 32 PrevTxHash + 4 Index + 1 scriptSigLength + 4 sequence
210
+ var inputsWeight = byteSize(inputCount) * baseByte; // Number of inputs
211
+ inputsWeight += inputWeight(derivationMode) * inputCount;
212
+ var txWeight = fixed + inputsWeight + outputsWeight;
213
+ return txWeight / 4;
147
214
  }
148
- exports.accurateTxSize = accurateTxSize;
149
- function estimateTxSize(inputCount, outputCount, currency, derivationMode) {
150
- return Math.ceil(accurateTxSize(inputCount, outputCount, currency, derivationMode)); // We don't allow floating value
215
+ exports.maxTxSize = maxTxSize;
216
+ function maxTxSizeCeil(inputCount, outputAddrs, includeChange, currency, derivationMode) {
217
+ var s = maxTxSize(inputCount, outputAddrs, includeChange, currency, derivationMode);
218
+ return Math.ceil(s);
151
219
  }
152
- exports.estimateTxSize = estimateTxSize;
220
+ exports.maxTxSizeCeil = maxTxSizeCeil;
153
221
  // refer to https://github.com/LedgerHQ/lib-ledger-core/blob/fc9d762b83fc2b269d072b662065747a64ab2816/core/src/wallet/bitcoin/api_impl/BitcoinLikeTransactionApi.cpp#L253
154
222
  function computeDustAmount(currency, txSize) {
155
223
  var dustAmount = currency.network.dustThreshold;