@ledgerhq/live-common 21.13.2-btcjs.0 → 21.15.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 (183) hide show
  1. package/lib/__tests__/derivation.js +1 -1
  2. package/lib/__tests__/derivation.js.map +1 -1
  3. package/lib/__tests__/families/bitcoin/wallet-btc/wallet.integration.test.js +2 -2
  4. package/lib/account/groupOperations.js +1 -1
  5. package/lib/account/groupOperations.js.map +1 -1
  6. package/lib/account/pending.d.ts +1 -0
  7. package/lib/account/pending.d.ts.map +1 -1
  8. package/lib/account/serialization.d.ts +6 -4
  9. package/lib/account/serialization.d.ts.map +1 -1
  10. package/lib/account/serialization.js +47 -9
  11. package/lib/account/serialization.js.map +1 -1
  12. package/lib/api/Ethereum.d.ts +22 -1
  13. package/lib/api/Ethereum.d.ts.map +1 -1
  14. package/lib/api/Ethereum.js +21 -1
  15. package/lib/api/Ethereum.js.map +1 -1
  16. package/lib/apps/polyfill.d.ts.map +1 -1
  17. package/lib/apps/polyfill.js +1 -0
  18. package/lib/apps/polyfill.js.map +1 -1
  19. package/lib/bridge/jsHelpers.d.ts +2 -1
  20. package/lib/bridge/jsHelpers.d.ts.map +1 -1
  21. package/lib/bridge/jsHelpers.js +27 -1
  22. package/lib/bridge/jsHelpers.js.map +1 -1
  23. package/lib/csvExport.d.ts.map +1 -1
  24. package/lib/csvExport.js +3 -1
  25. package/lib/csvExport.js.map +1 -1
  26. package/lib/derivation.js +1 -1
  27. package/lib/derivation.js.map +1 -1
  28. package/lib/env.d.ts +15 -5
  29. package/lib/env.d.ts.map +1 -1
  30. package/lib/env.js +11 -0
  31. package/lib/env.js.map +1 -1
  32. package/lib/env.react.d.ts +1 -1
  33. package/lib/env.react.d.ts.map +1 -1
  34. package/lib/families/bitcoin/cache.d.ts +1 -0
  35. package/lib/families/bitcoin/cache.d.ts.map +1 -1
  36. package/lib/families/bitcoin/cache.js +7 -1
  37. package/lib/families/bitcoin/cache.js.map +1 -1
  38. package/lib/families/bitcoin/errors.d.ts +4 -0
  39. package/lib/families/bitcoin/errors.d.ts.map +1 -0
  40. package/lib/families/bitcoin/errors.js +6 -0
  41. package/lib/families/bitcoin/errors.js.map +1 -0
  42. package/lib/families/bitcoin/js-getTransactionStatus.d.ts.map +1 -1
  43. package/lib/families/bitcoin/js-getTransactionStatus.js +24 -11
  44. package/lib/families/bitcoin/js-getTransactionStatus.js.map +1 -1
  45. package/lib/families/bitcoin/test-dataset.js +2 -2
  46. package/lib/families/bitcoin/test-dataset.js.map +1 -1
  47. package/lib/families/bitcoin/wallet-btc/crypto/base.d.ts +1 -0
  48. package/lib/families/bitcoin/wallet-btc/crypto/base.d.ts.map +1 -1
  49. package/lib/families/bitcoin/wallet-btc/crypto/base.js +4 -0
  50. package/lib/families/bitcoin/wallet-btc/crypto/base.js.map +1 -1
  51. package/lib/families/bitcoin/wallet-btc/crypto/bitcoin.d.ts +1 -0
  52. package/lib/families/bitcoin/wallet-btc/crypto/bitcoin.d.ts.map +1 -1
  53. package/lib/families/bitcoin/wallet-btc/crypto/bitcoin.js +13 -0
  54. package/lib/families/bitcoin/wallet-btc/crypto/bitcoin.js.map +1 -1
  55. package/lib/families/bitcoin/wallet-btc/crypto/bitcoincash.d.ts +1 -0
  56. package/lib/families/bitcoin/wallet-btc/crypto/bitcoincash.d.ts.map +1 -1
  57. package/lib/families/bitcoin/wallet-btc/crypto/bitcoincash.js +4 -0
  58. package/lib/families/bitcoin/wallet-btc/crypto/bitcoincash.js.map +1 -1
  59. package/lib/families/bitcoin/wallet-btc/crypto/types.d.ts +1 -0
  60. package/lib/families/bitcoin/wallet-btc/crypto/types.d.ts.map +1 -1
  61. package/lib/families/bitcoin/wallet-btc/crypto/zec.d.ts +1 -0
  62. package/lib/families/bitcoin/wallet-btc/crypto/zec.d.ts.map +1 -1
  63. package/lib/families/bitcoin/wallet-btc/crypto/zec.js +4 -0
  64. package/lib/families/bitcoin/wallet-btc/crypto/zec.js.map +1 -1
  65. package/lib/families/bitcoin/wallet-btc/crypto/zen.d.ts +1 -0
  66. package/lib/families/bitcoin/wallet-btc/crypto/zen.d.ts.map +1 -1
  67. package/lib/families/bitcoin/wallet-btc/crypto/zen.js +4 -0
  68. package/lib/families/bitcoin/wallet-btc/crypto/zen.js.map +1 -1
  69. package/lib/families/bitcoin/wallet-btc/index.d.ts +2 -2
  70. package/lib/families/bitcoin/wallet-btc/index.d.ts.map +1 -1
  71. package/lib/families/bitcoin/wallet-btc/index.js +4 -5
  72. package/lib/families/bitcoin/wallet-btc/index.js.map +1 -1
  73. package/lib/families/bitcoin/wallet-btc/utils.d.ts +2 -1
  74. package/lib/families/bitcoin/wallet-btc/utils.d.ts.map +1 -1
  75. package/lib/families/bitcoin/wallet-btc/utils.js +23 -7
  76. package/lib/families/bitcoin/wallet-btc/utils.js.map +1 -1
  77. package/lib/families/bitcoin/wallet-btc/wallet.js +1 -1
  78. package/lib/families/bitcoin/wallet-btc/wallet.js.map +1 -1
  79. package/lib/families/elrond/js-getTransactionStatus.d.ts.map +1 -1
  80. package/lib/families/elrond/js-getTransactionStatus.js +3 -0
  81. package/lib/families/elrond/js-getTransactionStatus.js.map +1 -1
  82. package/lib/families/elrond/js-signOperation.d.ts.map +1 -1
  83. package/lib/families/elrond/js-signOperation.js +3 -1
  84. package/lib/families/elrond/js-signOperation.js.map +1 -1
  85. package/lib/families/ethereum/signOperation.d.ts.map +1 -1
  86. package/lib/families/ethereum/signOperation.js +7 -0
  87. package/lib/families/ethereum/signOperation.js.map +1 -1
  88. package/lib/families/ethereum/synchronisation.d.ts.map +1 -1
  89. package/lib/families/ethereum/synchronisation.js +175 -15
  90. package/lib/families/ethereum/synchronisation.js.map +1 -1
  91. package/lib/families/ethereum/versions.d.ts +2 -0
  92. package/lib/families/ethereum/versions.d.ts.map +1 -0
  93. package/lib/families/ethereum/versions.js +5 -0
  94. package/lib/families/ethereum/versions.js.map +1 -0
  95. package/lib/nft/NftMetadataProvider/index.d.ts +10 -0
  96. package/lib/nft/NftMetadataProvider/index.d.ts.map +1 -0
  97. package/lib/nft/NftMetadataProvider/index.js +244 -0
  98. package/lib/nft/NftMetadataProvider/index.js.map +1 -0
  99. package/lib/nft/NftMetadataProvider/logic.d.ts +3 -0
  100. package/lib/nft/NftMetadataProvider/logic.d.ts.map +1 -0
  101. package/lib/nft/NftMetadataProvider/logic.js +22 -0
  102. package/lib/nft/NftMetadataProvider/logic.js.map +1 -0
  103. package/lib/nft/NftMetadataProvider/types.d.ts +44 -0
  104. package/lib/nft/NftMetadataProvider/types.d.ts.map +1 -0
  105. package/lib/nft/NftMetadataProvider/types.js +3 -0
  106. package/lib/nft/NftMetadataProvider/types.js.map +1 -0
  107. package/lib/nft/helpers.d.ts +10 -0
  108. package/lib/nft/helpers.d.ts.map +1 -0
  109. package/lib/nft/helpers.js +85 -0
  110. package/lib/nft/helpers.js.map +1 -0
  111. package/lib/nft/index.d.ts +4 -0
  112. package/lib/nft/index.d.ts.map +1 -0
  113. package/lib/nft/index.js +16 -0
  114. package/lib/nft/index.js.map +1 -0
  115. package/lib/nft/nftId.d.ts +3 -0
  116. package/lib/nft/nftId.d.ts.map +1 -0
  117. package/lib/nft/nftId.js +33 -0
  118. package/lib/nft/nftId.js.map +1 -0
  119. package/lib/operation.d.ts +1 -1
  120. package/lib/operation.d.ts.map +1 -1
  121. package/lib/operation.js +19 -5
  122. package/lib/operation.js.map +1 -1
  123. package/lib/reconciliation.d.ts.map +1 -1
  124. package/lib/reconciliation.js +6 -0
  125. package/lib/reconciliation.js.map +1 -1
  126. package/lib/types/account.d.ts +3 -0
  127. package/lib/types/account.d.ts.map +1 -1
  128. package/lib/types/index.d.ts +1 -0
  129. package/lib/types/index.d.ts.map +1 -1
  130. package/lib/types/index.js +1 -0
  131. package/lib/types/index.js.map +1 -1
  132. package/lib/types/nft.d.ts +29 -0
  133. package/lib/types/nft.d.ts.map +1 -0
  134. package/lib/types/nft.js +3 -0
  135. package/lib/types/nft.js.map +1 -0
  136. package/lib/types/operation.d.ts +12 -1
  137. package/lib/types/operation.d.ts.map +1 -1
  138. package/package.json +6 -6
  139. package/src/.DS_Store +0 -0
  140. package/src/__tests__/.DS_Store +0 -0
  141. package/src/__tests__/__snapshots__/all.libcore.ts.snap +60933 -53418
  142. package/src/__tests__/derivation.ts +1 -1
  143. package/src/__tests__/families/bitcoin/wallet-btc/wallet.integration.test.ts +2 -2
  144. package/src/account/groupOperations.ts +2 -2
  145. package/src/account/serialization.ts +52 -0
  146. package/src/api/Ethereum.ts +40 -2
  147. package/src/apps/polyfill.ts +1 -0
  148. package/src/bridge/jsHelpers.ts +35 -0
  149. package/src/csvExport.ts +3 -2
  150. package/src/currencies/__snapshots__/sortByMarketcap.test.ts.snap +1361 -1
  151. package/src/derivation.ts +1 -1
  152. package/src/env.ts +11 -0
  153. package/src/families/bitcoin/cache.ts +12 -0
  154. package/src/families/bitcoin/errors.ts +5 -0
  155. package/src/families/bitcoin/js-getTransactionStatus.ts +15 -1
  156. package/src/families/bitcoin/test-dataset.ts +2 -2
  157. package/src/families/bitcoin/wallet-btc/crypto/base.ts +5 -0
  158. package/src/families/bitcoin/wallet-btc/crypto/bitcoin.ts +13 -0
  159. package/src/families/bitcoin/wallet-btc/crypto/bitcoincash.ts +5 -0
  160. package/src/families/bitcoin/wallet-btc/crypto/types.ts +1 -0
  161. package/src/families/bitcoin/wallet-btc/crypto/zec.ts +5 -0
  162. package/src/families/bitcoin/wallet-btc/crypto/zen.ts +5 -0
  163. package/src/families/bitcoin/wallet-btc/index.ts +4 -4
  164. package/src/families/bitcoin/wallet-btc/utils.ts +20 -6
  165. package/src/families/bitcoin/wallet-btc/wallet.ts +1 -1
  166. package/src/families/elrond/js-getTransactionStatus.ts +4 -0
  167. package/src/families/elrond/js-signOperation.ts +3 -1
  168. package/src/families/ethereum/modules/__snapshots__/compound.resilience.test.ts.snap +2876 -0
  169. package/src/families/ethereum/signOperation.ts +8 -0
  170. package/src/families/ethereum/synchronisation.ts +185 -6
  171. package/src/families/ethereum/versions.ts +1 -0
  172. package/src/nft/NftMetadataProvider/index.tsx +205 -0
  173. package/src/nft/NftMetadataProvider/logic.ts +20 -0
  174. package/src/nft/NftMetadataProvider/types.ts +60 -0
  175. package/src/nft/helpers.ts +78 -0
  176. package/src/nft/index.ts +3 -0
  177. package/src/nft/nftId.ts +17 -0
  178. package/src/operation.ts +22 -3
  179. package/src/reconciliation.ts +7 -0
  180. package/src/types/account.ts +4 -0
  181. package/src/types/index.ts +1 -0
  182. package/src/types/nft.ts +38 -0
  183. package/src/types/operation.ts +23 -1
package/src/derivation.ts CHANGED
@@ -470,7 +470,7 @@ export const getDerivationModesForCurrency = (
470
470
 
471
471
  // taproot logic. FIXME should move per family
472
472
  if (currency.family === "bitcoin") {
473
- if (currency.id === "bitcoin_testnet") {
473
+ if (currency.id === "bitcoin" || currency.id === "bitcoin_testnet") {
474
474
  all.push("taproot");
475
475
  }
476
476
  }
package/src/env.ts CHANGED
@@ -376,6 +376,17 @@ const envDefinitions = {
376
376
  parser: stringParser,
377
377
  desc: "mock the server response for the exchange KYC check, options are 'open', 'pending', 'closed' or 'approved'.",
378
378
  },
379
+ NFT: {
380
+ def: false,
381
+ parser: boolParser,
382
+ desc: "synchronizing nfts",
383
+ },
384
+ NFT_ETH_METADATA_SERVICE: {
385
+ // FIXME LL-8001
386
+ def: "https://nft.staging.aws.ledger.fr/v1/ethereum/1/contracts/tokens/infos",
387
+ parser: stringParser,
388
+ desc: "service uri used to get the metadata of an nft",
389
+ },
379
390
  OPERATION_ADDRESSES_LIMIT: {
380
391
  def: 100,
381
392
  parser: intParser,
@@ -4,6 +4,7 @@ import type { Account, CryptoCurrency } from "./../../types";
4
4
  import type { Transaction } from "./types";
5
5
  import getFeesForTransaction from "./js-getFeesForTransaction";
6
6
  import { isValidRecipient } from "./logic";
7
+ import { Currency, isTaprootAddress } from "./wallet-btc";
7
8
 
8
9
  const getCacheKeyForCalculateFees = ({
9
10
  a,
@@ -41,6 +42,7 @@ export const calculateFees = makeLRUCache(
41
42
  maxAge: 5 * 60 * 1000, // 5 minutes
42
43
  }
43
44
  );
45
+
44
46
  export const validateRecipient: (
45
47
  arg0: CryptoCurrency,
46
48
  arg1: string | null | undefined
@@ -74,3 +76,13 @@ export const validateRecipient: (
74
76
  },
75
77
  (currency, recipient) => `${currency.id}_${recipient || ""}`
76
78
  );
79
+
80
+ export const isTaprootRecipient: (
81
+ arg0: CryptoCurrency,
82
+ arg1: string
83
+ ) => Promise<boolean> = makeLRUCache(
84
+ async (currency, recipient) => {
85
+ return isTaprootAddress(recipient, <Currency>currency.id);
86
+ },
87
+ (currency, recipient) => `${currency.id}_${recipient || ""}`
88
+ );
@@ -0,0 +1,5 @@
1
+ import { createCustomErrorClass } from "@ledgerhq/errors";
2
+
3
+ export const TaprootNotActivated = createCustomErrorClass(
4
+ "TaprootNotActivated"
5
+ );
@@ -9,7 +9,8 @@ import {
9
9
  } from "@ledgerhq/errors";
10
10
  import type { Account, TransactionStatus } from "./../../types";
11
11
  import type { Transaction } from "./types";
12
- import { calculateFees, validateRecipient } from "./cache";
12
+ import { calculateFees, validateRecipient, isTaprootRecipient } from "./cache";
13
+ import { TaprootNotActivated } from "./errors";
13
14
 
14
15
  const getTransactionStatus = async (
15
16
  a: Account,
@@ -31,6 +32,19 @@ const getTransactionStatus = async (
31
32
  warnings.recipient = recipientWarning;
32
33
  }
33
34
 
35
+ // Safeguard before Taproot activation
36
+ if (
37
+ t.recipient &&
38
+ !errors.recipient &&
39
+ a.currency.id === "bitcoin" &&
40
+ a.blockHeight <= 709632
41
+ ) {
42
+ const isTaproot = await isTaprootRecipient(a.currency, t.recipient);
43
+ if (isTaproot) {
44
+ errors.recipient = new TaprootNotActivated();
45
+ }
46
+ }
47
+
34
48
  let txInputs;
35
49
  let txOutputs;
36
50
  let estimatedFees = new BigNumber(0);
@@ -1,7 +1,7 @@
1
1
  import type { DatasetTest } from "../../types";
2
2
  import type { Transaction } from "./types";
3
3
  import bitcoin_cash from "./datasets/bitcoin_cash";
4
- import bitcoin_gold from "./datasets/bitcoin_gold";
4
+ // import bitcoin_gold from "./datasets/bitcoin_gold";
5
5
  import bitcoin from "./datasets/bitcoin";
6
6
  import dash from "./datasets/dash";
7
7
  // import decred from "./datasets/decred";
@@ -22,7 +22,7 @@ const dataset: DatasetTest<Transaction> = {
22
22
  currencies: {
23
23
  bitcoin,
24
24
  bitcoin_cash,
25
- bitcoin_gold,
25
+ // bitcoin_gold,
26
26
  dash,
27
27
  // decred, // BACK-2443
28
28
  digibyte,
@@ -149,6 +149,11 @@ class Base implements ICrypto {
149
149
  (res[0] === this.network.pubKeyHash || res[0] === this.network.scriptHash)
150
150
  );
151
151
  }
152
+
153
+ // eslint-disable-next-line
154
+ isTaprootAddress(address: string): boolean {
155
+ return false;
156
+ }
152
157
  }
153
158
 
154
159
  export default Base;
@@ -209,6 +209,19 @@ class Bitcoin extends Base {
209
209
  // Create address
210
210
  return toBech32(outputSchnorrKey, 1, this.network.bech32);
211
211
  }
212
+
213
+ isTaprootAddress(address: string): boolean {
214
+ // This prefix check is to avoid returning false in cases where a valid base58 address also happens
215
+ // to be a valid bech32(m) string (but invalid segwit address).
216
+ if (address.toLowerCase().startsWith(`${this.network.bech32}1`)) {
217
+ try {
218
+ bjs.address.fromBech32(address);
219
+ } catch {
220
+ return true;
221
+ }
222
+ }
223
+ return false;
224
+ }
212
225
  }
213
226
 
214
227
  export default Bitcoin;
@@ -70,6 +70,11 @@ class BitcoinCash implements ICrypto {
70
70
  validateAddress(address: string): boolean {
71
71
  return bchaddr.isValidAddress(address);
72
72
  }
73
+
74
+ // eslint-disable-next-line
75
+ isTaprootAddress(address: string): boolean {
76
+ return false;
77
+ }
73
78
  }
74
79
 
75
80
  export default BitcoinCash;
@@ -11,6 +11,7 @@ export interface ICrypto {
11
11
 
12
12
  toOutputScript(address: string): Buffer;
13
13
  validateAddress(address: string): boolean;
14
+ isTaprootAddress(address: string): boolean;
14
15
  }
15
16
 
16
17
  export type Currency =
@@ -74,6 +74,11 @@ class ZCash implements ICrypto {
74
74
  validateAddress(address: string): boolean {
75
75
  return zec.Address.isValid(address, "livenet");
76
76
  }
77
+
78
+ // eslint-disable-next-line
79
+ isTaprootAddress(address: string): boolean {
80
+ return false;
81
+ }
77
82
  }
78
83
 
79
84
  export default ZCash;
@@ -102,6 +102,11 @@ class Zen implements ICrypto {
102
102
  (res[1] === 0x89 || res[1] === 0x96)
103
103
  );
104
104
  }
105
+
106
+ // eslint-disable-next-line
107
+ isTaprootAddress(address: string): boolean {
108
+ return false;
109
+ }
105
110
  }
106
111
 
107
112
  export default Zen;
@@ -11,7 +11,7 @@ import { TX, Input, Output } from "./storage/types";
11
11
  import { CoinSelect } from "./pickingstrategies/CoinSelect";
12
12
  import { DeepFirst } from "./pickingstrategies/DeepFirst";
13
13
  import { Merge } from "./pickingstrategies/Merge";
14
- import { isValidAddress } from "./utils";
14
+ import { isValidAddress, isTaprootAddress } from "./utils";
15
15
 
16
16
  import type { Account as WalletAccount } from "./account";
17
17
  import type { Account as LiveAccount } from "./../../../types";
@@ -32,16 +32,16 @@ export {
32
32
  DeepFirst,
33
33
  Merge,
34
34
  isValidAddress,
35
+ isTaprootAddress,
35
36
  Currency,
36
37
  };
37
38
 
38
39
  let wallet: BitcoinLikeWallet | null = null;
39
40
 
40
41
  export const getWalletAccount = (account: LiveAccount): WalletAccount => {
41
- if (account.id.startsWith("libcore")) throw new AccountNeedResync();
42
42
  const walletAccount = account.bitcoinResources?.walletAccount;
43
- if (!walletAccount) {
44
- throw new Error("bitcoin wallet account expected");
43
+ if (account.id.startsWith("libcore") || !walletAccount) {
44
+ throw new AccountNeedResync();
45
45
  }
46
46
  return walletAccount;
47
47
  };
@@ -83,12 +83,12 @@ export function byteSize(count: number) {
83
83
  return 1;
84
84
  }
85
85
  if (count <= 0xffff) {
86
- return 2;
86
+ return 3;
87
87
  }
88
88
  if (count <= 0xffffffff) {
89
- return 4;
89
+ return 5;
90
90
  }
91
- return 8;
91
+ return 9;
92
92
  }
93
93
 
94
94
  // refer to https://github.com/LedgerHQ/lib-ledger-core/blob/fc9d762b83fc2b269d072b662065747a64ab2816/core/src/wallet/bitcoin/api_impl/BitcoinLikeTransactionApi.cpp#L217
@@ -106,10 +106,14 @@ export function estimateTxSize(
106
106
  fixedSize += byteSize(inputCount); // Number of inputs
107
107
  fixedSize += byteSize(outputCount); // Number of outputs
108
108
  fixedSize += 4; // Timelock
109
+ if (derivationMode !== DerivationModes.LEGACY) {
110
+ fixedSize += 0.5; // Segwit marker & segwit flag
111
+ }
109
112
  // refer to https://medium.com/coinmonks/on-bitcoin-transaction-sizes-part-2-9445373d17f4
110
113
  // and https://bitcoin.stackexchange.com/questions/96017/what-are-the-sizes-of-single-sig-and-2-of-3-multisig-taproot-inputs
114
+ // and https://bitcoinops.org/en/tools/calc-size/
111
115
  if (derivationMode === DerivationModes.TAPROOT) {
112
- txSize = fixedSize + 57.5 * inputCount + 43 * outputCount;
116
+ txSize = fixedSize + 57.75 * inputCount + 43 * outputCount;
113
117
  return Math.ceil(txSize);
114
118
  }
115
119
  const isSegwit =
@@ -120,12 +124,12 @@ export function estimateTxSize(
120
124
  // P2SH: 32 PrevTxHash + 4 Index + 23 scriptPubKey + 4 sequence
121
125
  const isNativeSegwit = derivationMode === DerivationModes.NATIVE_SEGWIT;
122
126
  const inputSize = isNativeSegwit ? 41 : 63;
123
- const noWitness = fixedSize + inputSize * inputCount + 34 * outputCount;
127
+ const noWitness = fixedSize + inputSize * inputCount + 43 * outputCount; //43 is the biggest output(taproot output) size, we use the biggest one for safety
124
128
  // Include flag and marker size (one byte each)
125
129
  const witnessSize = noWitness + 108 * inputCount + 2;
126
130
  txSize = (noWitness * 3 + witnessSize) / 4;
127
131
  } else {
128
- txSize = fixedSize + 148 * inputCount + 34 * outputCount;
132
+ txSize = fixedSize + 148 * inputCount + 43 * outputCount;
129
133
  }
130
134
  return Math.ceil(txSize); // We don't allow floating value
131
135
  }
@@ -156,3 +160,13 @@ export function isValidAddress(address: string, currency?: Currency) {
156
160
  const crypto = cryptoFactory(currency);
157
161
  return crypto.validateAddress(address);
158
162
  }
163
+
164
+ export function isTaprootAddress(address: string, currency?: Currency) {
165
+ if (currency === "bitcoin") {
166
+ return cryptoFactory("bitcoin").isTaprootAddress(address);
167
+ } else if (currency === "bitcoin_testnet") {
168
+ return cryptoFactory("bitcoin_testnet").isTaprootAddress(address);
169
+ } else {
170
+ return false;
171
+ }
172
+ }
@@ -263,7 +263,7 @@ class BitcoinLikeWallet {
263
263
  return [
264
264
  btc.splitTransaction(
265
265
  i.txHex,
266
- segwit,
266
+ true,
267
267
  false, // FIXME hasTimestamp needed for LL-7539
268
268
  hasExtraData,
269
269
  additionals
@@ -32,6 +32,10 @@ const getTransactionStatus = async (
32
32
  }
33
33
 
34
34
  const estimatedFees = t.fees || new BigNumber(0);
35
+ if (estimatedFees.gt(a.balance)) {
36
+ errors.amount = new NotEnoughBalance();
37
+ }
38
+
35
39
  const totalSpent = useAllAmount
36
40
  ? a.balance
37
41
  : new BigNumber(t.amount).plus(estimatedFees);
@@ -15,7 +15,9 @@ const buildOptimisticOperation = (
15
15
  fee: BigNumber
16
16
  ): Operation => {
17
17
  const type = "OUT";
18
- const value = new BigNumber(transaction.amount);
18
+ const value = transaction.useAllAmount
19
+ ? account.balance.minus(fee)
20
+ : new BigNumber(transaction.amount);
19
21
  const operation: Operation = {
20
22
  id: encodeOperationId(account.id, "", type),
21
23
  hash: "",