@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.
- package/lib/__tests__/derivation.js +1 -1
- package/lib/__tests__/derivation.js.map +1 -1
- package/lib/__tests__/families/bitcoin/wallet-btc/wallet.integration.test.js +2 -2
- package/lib/account/groupOperations.js +1 -1
- package/lib/account/groupOperations.js.map +1 -1
- package/lib/account/pending.d.ts +1 -0
- package/lib/account/pending.d.ts.map +1 -1
- package/lib/account/serialization.d.ts +6 -4
- package/lib/account/serialization.d.ts.map +1 -1
- package/lib/account/serialization.js +47 -9
- package/lib/account/serialization.js.map +1 -1
- package/lib/api/Ethereum.d.ts +22 -1
- package/lib/api/Ethereum.d.ts.map +1 -1
- package/lib/api/Ethereum.js +21 -1
- package/lib/api/Ethereum.js.map +1 -1
- package/lib/apps/polyfill.d.ts.map +1 -1
- package/lib/apps/polyfill.js +1 -0
- package/lib/apps/polyfill.js.map +1 -1
- package/lib/bridge/jsHelpers.d.ts +2 -1
- package/lib/bridge/jsHelpers.d.ts.map +1 -1
- package/lib/bridge/jsHelpers.js +27 -1
- package/lib/bridge/jsHelpers.js.map +1 -1
- package/lib/csvExport.d.ts.map +1 -1
- package/lib/csvExport.js +3 -1
- package/lib/csvExport.js.map +1 -1
- package/lib/derivation.js +1 -1
- package/lib/derivation.js.map +1 -1
- package/lib/env.d.ts +15 -5
- package/lib/env.d.ts.map +1 -1
- package/lib/env.js +11 -0
- package/lib/env.js.map +1 -1
- package/lib/env.react.d.ts +1 -1
- package/lib/env.react.d.ts.map +1 -1
- package/lib/families/bitcoin/cache.d.ts +1 -0
- package/lib/families/bitcoin/cache.d.ts.map +1 -1
- package/lib/families/bitcoin/cache.js +7 -1
- package/lib/families/bitcoin/cache.js.map +1 -1
- package/lib/families/bitcoin/errors.d.ts +4 -0
- package/lib/families/bitcoin/errors.d.ts.map +1 -0
- package/lib/families/bitcoin/errors.js +6 -0
- package/lib/families/bitcoin/errors.js.map +1 -0
- package/lib/families/bitcoin/js-getTransactionStatus.d.ts.map +1 -1
- package/lib/families/bitcoin/js-getTransactionStatus.js +24 -11
- package/lib/families/bitcoin/js-getTransactionStatus.js.map +1 -1
- package/lib/families/bitcoin/test-dataset.js +2 -2
- package/lib/families/bitcoin/test-dataset.js.map +1 -1
- package/lib/families/bitcoin/wallet-btc/crypto/base.d.ts +1 -0
- package/lib/families/bitcoin/wallet-btc/crypto/base.d.ts.map +1 -1
- package/lib/families/bitcoin/wallet-btc/crypto/base.js +4 -0
- package/lib/families/bitcoin/wallet-btc/crypto/base.js.map +1 -1
- package/lib/families/bitcoin/wallet-btc/crypto/bitcoin.d.ts +1 -0
- package/lib/families/bitcoin/wallet-btc/crypto/bitcoin.d.ts.map +1 -1
- package/lib/families/bitcoin/wallet-btc/crypto/bitcoin.js +13 -0
- package/lib/families/bitcoin/wallet-btc/crypto/bitcoin.js.map +1 -1
- package/lib/families/bitcoin/wallet-btc/crypto/bitcoincash.d.ts +1 -0
- package/lib/families/bitcoin/wallet-btc/crypto/bitcoincash.d.ts.map +1 -1
- package/lib/families/bitcoin/wallet-btc/crypto/bitcoincash.js +4 -0
- package/lib/families/bitcoin/wallet-btc/crypto/bitcoincash.js.map +1 -1
- package/lib/families/bitcoin/wallet-btc/crypto/types.d.ts +1 -0
- package/lib/families/bitcoin/wallet-btc/crypto/types.d.ts.map +1 -1
- package/lib/families/bitcoin/wallet-btc/crypto/zec.d.ts +1 -0
- package/lib/families/bitcoin/wallet-btc/crypto/zec.d.ts.map +1 -1
- package/lib/families/bitcoin/wallet-btc/crypto/zec.js +4 -0
- package/lib/families/bitcoin/wallet-btc/crypto/zec.js.map +1 -1
- package/lib/families/bitcoin/wallet-btc/crypto/zen.d.ts +1 -0
- package/lib/families/bitcoin/wallet-btc/crypto/zen.d.ts.map +1 -1
- package/lib/families/bitcoin/wallet-btc/crypto/zen.js +4 -0
- package/lib/families/bitcoin/wallet-btc/crypto/zen.js.map +1 -1
- package/lib/families/bitcoin/wallet-btc/index.d.ts +2 -2
- package/lib/families/bitcoin/wallet-btc/index.d.ts.map +1 -1
- package/lib/families/bitcoin/wallet-btc/index.js +4 -5
- package/lib/families/bitcoin/wallet-btc/index.js.map +1 -1
- package/lib/families/bitcoin/wallet-btc/utils.d.ts +2 -1
- package/lib/families/bitcoin/wallet-btc/utils.d.ts.map +1 -1
- package/lib/families/bitcoin/wallet-btc/utils.js +23 -7
- package/lib/families/bitcoin/wallet-btc/utils.js.map +1 -1
- package/lib/families/bitcoin/wallet-btc/wallet.js +1 -1
- package/lib/families/bitcoin/wallet-btc/wallet.js.map +1 -1
- package/lib/families/elrond/js-getTransactionStatus.d.ts.map +1 -1
- package/lib/families/elrond/js-getTransactionStatus.js +3 -0
- package/lib/families/elrond/js-getTransactionStatus.js.map +1 -1
- package/lib/families/elrond/js-signOperation.d.ts.map +1 -1
- package/lib/families/elrond/js-signOperation.js +3 -1
- package/lib/families/elrond/js-signOperation.js.map +1 -1
- package/lib/families/ethereum/signOperation.d.ts.map +1 -1
- package/lib/families/ethereum/signOperation.js +7 -0
- package/lib/families/ethereum/signOperation.js.map +1 -1
- package/lib/families/ethereum/synchronisation.d.ts.map +1 -1
- package/lib/families/ethereum/synchronisation.js +175 -15
- package/lib/families/ethereum/synchronisation.js.map +1 -1
- package/lib/families/ethereum/versions.d.ts +2 -0
- package/lib/families/ethereum/versions.d.ts.map +1 -0
- package/lib/families/ethereum/versions.js +5 -0
- package/lib/families/ethereum/versions.js.map +1 -0
- package/lib/nft/NftMetadataProvider/index.d.ts +10 -0
- package/lib/nft/NftMetadataProvider/index.d.ts.map +1 -0
- package/lib/nft/NftMetadataProvider/index.js +244 -0
- package/lib/nft/NftMetadataProvider/index.js.map +1 -0
- package/lib/nft/NftMetadataProvider/logic.d.ts +3 -0
- package/lib/nft/NftMetadataProvider/logic.d.ts.map +1 -0
- package/lib/nft/NftMetadataProvider/logic.js +22 -0
- package/lib/nft/NftMetadataProvider/logic.js.map +1 -0
- package/lib/nft/NftMetadataProvider/types.d.ts +44 -0
- package/lib/nft/NftMetadataProvider/types.d.ts.map +1 -0
- package/lib/nft/NftMetadataProvider/types.js +3 -0
- package/lib/nft/NftMetadataProvider/types.js.map +1 -0
- package/lib/nft/helpers.d.ts +10 -0
- package/lib/nft/helpers.d.ts.map +1 -0
- package/lib/nft/helpers.js +85 -0
- package/lib/nft/helpers.js.map +1 -0
- package/lib/nft/index.d.ts +4 -0
- package/lib/nft/index.d.ts.map +1 -0
- package/lib/nft/index.js +16 -0
- package/lib/nft/index.js.map +1 -0
- package/lib/nft/nftId.d.ts +3 -0
- package/lib/nft/nftId.d.ts.map +1 -0
- package/lib/nft/nftId.js +33 -0
- package/lib/nft/nftId.js.map +1 -0
- package/lib/operation.d.ts +1 -1
- package/lib/operation.d.ts.map +1 -1
- package/lib/operation.js +19 -5
- package/lib/operation.js.map +1 -1
- package/lib/reconciliation.d.ts.map +1 -1
- package/lib/reconciliation.js +6 -0
- package/lib/reconciliation.js.map +1 -1
- package/lib/types/account.d.ts +3 -0
- package/lib/types/account.d.ts.map +1 -1
- package/lib/types/index.d.ts +1 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +1 -0
- package/lib/types/index.js.map +1 -1
- package/lib/types/nft.d.ts +29 -0
- package/lib/types/nft.d.ts.map +1 -0
- package/lib/types/nft.js +3 -0
- package/lib/types/nft.js.map +1 -0
- package/lib/types/operation.d.ts +12 -1
- package/lib/types/operation.d.ts.map +1 -1
- package/package.json +6 -6
- package/src/.DS_Store +0 -0
- package/src/__tests__/.DS_Store +0 -0
- package/src/__tests__/__snapshots__/all.libcore.ts.snap +60933 -53418
- package/src/__tests__/derivation.ts +1 -1
- package/src/__tests__/families/bitcoin/wallet-btc/wallet.integration.test.ts +2 -2
- package/src/account/groupOperations.ts +2 -2
- package/src/account/serialization.ts +52 -0
- package/src/api/Ethereum.ts +40 -2
- package/src/apps/polyfill.ts +1 -0
- package/src/bridge/jsHelpers.ts +35 -0
- package/src/csvExport.ts +3 -2
- package/src/currencies/__snapshots__/sortByMarketcap.test.ts.snap +1361 -1
- package/src/derivation.ts +1 -1
- package/src/env.ts +11 -0
- package/src/families/bitcoin/cache.ts +12 -0
- package/src/families/bitcoin/errors.ts +5 -0
- package/src/families/bitcoin/js-getTransactionStatus.ts +15 -1
- package/src/families/bitcoin/test-dataset.ts +2 -2
- package/src/families/bitcoin/wallet-btc/crypto/base.ts +5 -0
- package/src/families/bitcoin/wallet-btc/crypto/bitcoin.ts +13 -0
- package/src/families/bitcoin/wallet-btc/crypto/bitcoincash.ts +5 -0
- package/src/families/bitcoin/wallet-btc/crypto/types.ts +1 -0
- package/src/families/bitcoin/wallet-btc/crypto/zec.ts +5 -0
- package/src/families/bitcoin/wallet-btc/crypto/zen.ts +5 -0
- package/src/families/bitcoin/wallet-btc/index.ts +4 -4
- package/src/families/bitcoin/wallet-btc/utils.ts +20 -6
- package/src/families/bitcoin/wallet-btc/wallet.ts +1 -1
- package/src/families/elrond/js-getTransactionStatus.ts +4 -0
- package/src/families/elrond/js-signOperation.ts +3 -1
- package/src/families/ethereum/modules/__snapshots__/compound.resilience.test.ts.snap +2876 -0
- package/src/families/ethereum/signOperation.ts +8 -0
- package/src/families/ethereum/synchronisation.ts +185 -6
- package/src/families/ethereum/versions.ts +1 -0
- package/src/nft/NftMetadataProvider/index.tsx +205 -0
- package/src/nft/NftMetadataProvider/logic.ts +20 -0
- package/src/nft/NftMetadataProvider/types.ts +60 -0
- package/src/nft/helpers.ts +78 -0
- package/src/nft/index.ts +3 -0
- package/src/nft/nftId.ts +17 -0
- package/src/operation.ts +22 -3
- package/src/reconciliation.ts +7 -0
- package/src/types/account.ts +4 -0
- package/src/types/index.ts +1 -0
- package/src/types/nft.ts +38 -0
- 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
|
+
);
|
|
@@ -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;
|
|
@@ -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;
|
|
@@ -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
|
|
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
|
|
86
|
+
return 3;
|
|
87
87
|
}
|
|
88
88
|
if (count <= 0xffffffff) {
|
|
89
|
-
return
|
|
89
|
+
return 5;
|
|
90
90
|
}
|
|
91
|
-
return
|
|
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.
|
|
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 +
|
|
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 +
|
|
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
|
+
}
|
|
@@ -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 =
|
|
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: "",
|