@ledgerhq/coin-hedera 1.10.1 → 1.11.0-nightly.2
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/.eslintrc.js +1 -0
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +37 -12
- package/lib/api/mirror.d.ts +3 -20
- package/lib/api/mirror.d.ts.map +1 -1
- package/lib/api/mirror.js +32 -90
- package/lib/api/mirror.js.map +1 -1
- package/lib/api/mirror.test.js +59 -4
- package/lib/api/mirror.test.js.map +1 -1
- package/lib/api/network.d.ts +3 -3
- package/lib/api/network.d.ts.map +1 -1
- package/lib/api/network.js +46 -3
- package/lib/api/network.js.map +1 -1
- package/lib/api/types.d.ts +44 -0
- package/lib/api/types.d.ts.map +1 -0
- package/lib/api/types.js +3 -0
- package/lib/api/types.js.map +1 -0
- package/lib/api/utils.d.ts +8 -0
- package/lib/api/utils.d.ts.map +1 -0
- package/lib/api/utils.js +132 -0
- package/lib/api/utils.js.map +1 -0
- package/lib/bridge/broadcast.d.ts.map +1 -1
- package/lib/bridge/broadcast.js +2 -0
- package/lib/bridge/broadcast.js.map +1 -1
- package/lib/bridge/buildOptimisticOperation.d.ts +2 -2
- package/lib/bridge/buildOptimisticOperation.d.ts.map +1 -1
- package/lib/bridge/buildOptimisticOperation.integration.test.d.ts +2 -0
- package/lib/bridge/buildOptimisticOperation.integration.test.d.ts.map +1 -0
- package/lib/bridge/buildOptimisticOperation.integration.test.js +82 -0
- package/lib/bridge/buildOptimisticOperation.integration.test.js.map +1 -0
- package/lib/bridge/buildOptimisticOperation.js +87 -5
- package/lib/bridge/buildOptimisticOperation.js.map +1 -1
- package/lib/bridge/estimateMaxSpendable.d.ts.map +1 -1
- package/lib/bridge/estimateMaxSpendable.js +8 -2
- package/lib/bridge/estimateMaxSpendable.js.map +1 -1
- package/lib/bridge/getTransactionStatus.d.ts +3 -3
- package/lib/bridge/getTransactionStatus.d.ts.map +1 -1
- package/lib/bridge/getTransactionStatus.js +116 -23
- package/lib/bridge/getTransactionStatus.js.map +1 -1
- package/lib/bridge/getTransactionStatus.test.d.ts +2 -0
- package/lib/bridge/getTransactionStatus.test.d.ts.map +1 -0
- package/lib/bridge/getTransactionStatus.test.js +176 -0
- package/lib/bridge/getTransactionStatus.test.js.map +1 -0
- package/lib/bridge/index.d.ts +4 -4
- package/lib/bridge/index.d.ts.map +1 -1
- package/lib/bridge/index.js +9 -6
- package/lib/bridge/index.js.map +1 -1
- package/lib/bridge/js-estimateMaxSpendable.integration.test.js +28 -44
- package/lib/bridge/js-estimateMaxSpendable.integration.test.js.map +1 -1
- package/lib/bridge/js-transaction.test.js +10 -49
- package/lib/bridge/js-transaction.test.js.map +1 -1
- package/lib/bridge/prepareTransaction.d.ts +0 -1
- package/lib/bridge/prepareTransaction.d.ts.map +1 -1
- package/lib/bridge/prepareTransaction.js +0 -1
- package/lib/bridge/prepareTransaction.js.map +1 -1
- package/lib/bridge/serialization.d.ts +7 -0
- package/lib/bridge/serialization.d.ts.map +1 -0
- package/lib/bridge/serialization.js +36 -0
- package/lib/bridge/serialization.js.map +1 -0
- package/lib/bridge/serialization.test.d.ts +2 -0
- package/lib/bridge/serialization.test.d.ts.map +1 -0
- package/lib/bridge/serialization.test.js +27 -0
- package/lib/bridge/serialization.test.js.map +1 -0
- package/lib/bridge/synchronisation.d.ts +3 -3
- package/lib/bridge/synchronisation.d.ts.map +1 -1
- package/lib/bridge/synchronisation.js +37 -15
- package/lib/bridge/synchronisation.js.map +1 -1
- package/lib/bridge/transaction.test.js +18 -59
- package/lib/bridge/transaction.test.js.map +1 -1
- package/lib/bridge/utils.d.ts +22 -8
- package/lib/bridge/utils.d.ts.map +1 -1
- package/lib/bridge/utils.integration.test.js +415 -73
- package/lib/bridge/utils.integration.test.js.map +1 -1
- package/lib/bridge/utils.js +300 -15
- package/lib/bridge/utils.js.map +1 -1
- package/lib/constants.d.ts +32 -0
- package/lib/constants.d.ts.map +1 -0
- package/lib/constants.js +37 -0
- package/lib/constants.js.map +1 -0
- package/lib/deviceTransactionConfig.d.ts.map +1 -1
- package/lib/deviceTransactionConfig.js +17 -15
- package/lib/deviceTransactionConfig.js.map +1 -1
- package/lib/logic.d.ts +9 -3
- package/lib/logic.d.ts.map +1 -1
- package/lib/logic.js +31 -3
- package/lib/logic.js.map +1 -1
- package/lib/logic.test.js +103 -50
- package/lib/logic.test.js.map +1 -1
- package/lib/test/fixtures/account.fixture.d.ts +19 -0
- package/lib/test/fixtures/account.fixture.d.ts.map +1 -0
- package/lib/test/fixtures/account.fixture.js +116 -0
- package/lib/test/fixtures/account.fixture.js.map +1 -0
- package/lib/test/fixtures/currency.fixture.d.ts +5 -0
- package/lib/test/fixtures/currency.fixture.d.ts.map +1 -0
- package/lib/test/fixtures/currency.fixture.js +67 -0
- package/lib/test/fixtures/currency.fixture.js.map +1 -0
- package/lib/test/fixtures/mirror.fixture.d.ts +3 -0
- package/lib/test/fixtures/mirror.fixture.d.ts.map +1 -0
- package/lib/test/fixtures/mirror.fixture.js +17 -0
- package/lib/test/fixtures/mirror.fixture.js.map +1 -0
- package/lib/test/fixtures/operation.fixture.d.ts +3 -0
- package/lib/test/fixtures/operation.fixture.d.ts.map +1 -0
- package/lib/test/fixtures/operation.fixture.js +26 -0
- package/lib/test/fixtures/operation.fixture.js.map +1 -0
- package/lib/test/fixtures/transaction.fixture.d.ts +4 -0
- package/lib/test/fixtures/transaction.fixture.d.ts.map +1 -0
- package/lib/test/fixtures/transaction.fixture.js +28 -0
- package/lib/test/fixtures/transaction.fixture.js.map +1 -0
- package/lib/types/bridge.d.ts +25 -1
- package/lib/types/bridge.d.ts.map +1 -1
- package/lib-es/api/mirror.d.ts +3 -20
- package/lib-es/api/mirror.d.ts.map +1 -1
- package/lib-es/api/mirror.js +29 -88
- package/lib-es/api/mirror.js.map +1 -1
- package/lib-es/api/mirror.test.js +60 -5
- package/lib-es/api/mirror.test.js.map +1 -1
- package/lib-es/api/network.d.ts +3 -3
- package/lib-es/api/network.d.ts.map +1 -1
- package/lib-es/api/network.js +44 -4
- package/lib-es/api/network.js.map +1 -1
- package/lib-es/api/types.d.ts +44 -0
- package/lib-es/api/types.d.ts.map +1 -0
- package/lib-es/api/types.js +2 -0
- package/lib-es/api/types.js.map +1 -0
- package/lib-es/api/utils.d.ts +8 -0
- package/lib-es/api/utils.d.ts.map +1 -0
- package/lib-es/api/utils.js +124 -0
- package/lib-es/api/utils.js.map +1 -0
- package/lib-es/bridge/broadcast.d.ts.map +1 -1
- package/lib-es/bridge/broadcast.js +2 -0
- package/lib-es/bridge/broadcast.js.map +1 -1
- package/lib-es/bridge/buildOptimisticOperation.d.ts +2 -2
- package/lib-es/bridge/buildOptimisticOperation.d.ts.map +1 -1
- package/lib-es/bridge/buildOptimisticOperation.integration.test.d.ts +2 -0
- package/lib-es/bridge/buildOptimisticOperation.integration.test.d.ts.map +1 -0
- package/lib-es/bridge/buildOptimisticOperation.integration.test.js +77 -0
- package/lib-es/bridge/buildOptimisticOperation.integration.test.js.map +1 -0
- package/lib-es/bridge/buildOptimisticOperation.js +84 -5
- package/lib-es/bridge/buildOptimisticOperation.js.map +1 -1
- package/lib-es/bridge/estimateMaxSpendable.d.ts.map +1 -1
- package/lib-es/bridge/estimateMaxSpendable.js +8 -2
- package/lib-es/bridge/estimateMaxSpendable.js.map +1 -1
- package/lib-es/bridge/getTransactionStatus.d.ts +3 -3
- package/lib-es/bridge/getTransactionStatus.d.ts.map +1 -1
- package/lib-es/bridge/getTransactionStatus.js +114 -24
- package/lib-es/bridge/getTransactionStatus.js.map +1 -1
- package/lib-es/bridge/getTransactionStatus.test.d.ts +2 -0
- package/lib-es/bridge/getTransactionStatus.test.d.ts.map +1 -0
- package/lib-es/bridge/getTransactionStatus.test.js +148 -0
- package/lib-es/bridge/getTransactionStatus.test.js.map +1 -0
- package/lib-es/bridge/index.d.ts +4 -4
- package/lib-es/bridge/index.d.ts.map +1 -1
- package/lib-es/bridge/index.js +9 -6
- package/lib-es/bridge/index.js.map +1 -1
- package/lib-es/bridge/js-estimateMaxSpendable.integration.test.js +28 -44
- package/lib-es/bridge/js-estimateMaxSpendable.integration.test.js.map +1 -1
- package/lib-es/bridge/js-transaction.test.js +10 -49
- package/lib-es/bridge/js-transaction.test.js.map +1 -1
- package/lib-es/bridge/prepareTransaction.d.ts +0 -1
- package/lib-es/bridge/prepareTransaction.d.ts.map +1 -1
- package/lib-es/bridge/prepareTransaction.js +0 -1
- package/lib-es/bridge/prepareTransaction.js.map +1 -1
- package/lib-es/bridge/serialization.d.ts +7 -0
- package/lib-es/bridge/serialization.d.ts.map +1 -0
- package/lib-es/bridge/serialization.js +29 -0
- package/lib-es/bridge/serialization.js.map +1 -0
- package/lib-es/bridge/serialization.test.d.ts +2 -0
- package/lib-es/bridge/serialization.test.d.ts.map +1 -0
- package/lib-es/bridge/serialization.test.js +25 -0
- package/lib-es/bridge/serialization.test.js.map +1 -0
- package/lib-es/bridge/synchronisation.d.ts +3 -3
- package/lib-es/bridge/synchronisation.d.ts.map +1 -1
- package/lib-es/bridge/synchronisation.js +39 -17
- package/lib-es/bridge/synchronisation.js.map +1 -1
- package/lib-es/bridge/transaction.test.js +18 -59
- package/lib-es/bridge/transaction.test.js.map +1 -1
- package/lib-es/bridge/utils.d.ts +22 -8
- package/lib-es/bridge/utils.d.ts.map +1 -1
- package/lib-es/bridge/utils.integration.test.js +416 -74
- package/lib-es/bridge/utils.integration.test.js.map +1 -1
- package/lib-es/bridge/utils.js +295 -15
- package/lib-es/bridge/utils.js.map +1 -1
- package/lib-es/constants.d.ts +32 -0
- package/lib-es/constants.d.ts.map +1 -0
- package/lib-es/constants.js +34 -0
- package/lib-es/constants.js.map +1 -0
- package/lib-es/deviceTransactionConfig.d.ts.map +1 -1
- package/lib-es/deviceTransactionConfig.js +17 -15
- package/lib-es/deviceTransactionConfig.js.map +1 -1
- package/lib-es/logic.d.ts +9 -3
- package/lib-es/logic.d.ts.map +1 -1
- package/lib-es/logic.js +26 -3
- package/lib-es/logic.js.map +1 -1
- package/lib-es/logic.test.js +104 -51
- package/lib-es/logic.test.js.map +1 -1
- package/lib-es/test/fixtures/account.fixture.d.ts +19 -0
- package/lib-es/test/fixtures/account.fixture.d.ts.map +1 -0
- package/lib-es/test/fixtures/account.fixture.js +107 -0
- package/lib-es/test/fixtures/account.fixture.js.map +1 -0
- package/lib-es/test/fixtures/currency.fixture.d.ts +5 -0
- package/lib-es/test/fixtures/currency.fixture.d.ts.map +1 -0
- package/lib-es/test/fixtures/currency.fixture.js +58 -0
- package/lib-es/test/fixtures/currency.fixture.js.map +1 -0
- package/lib-es/test/fixtures/mirror.fixture.d.ts +3 -0
- package/lib-es/test/fixtures/mirror.fixture.d.ts.map +1 -0
- package/lib-es/test/fixtures/mirror.fixture.js +13 -0
- package/lib-es/test/fixtures/mirror.fixture.js.map +1 -0
- package/lib-es/test/fixtures/operation.fixture.d.ts +3 -0
- package/lib-es/test/fixtures/operation.fixture.d.ts.map +1 -0
- package/lib-es/test/fixtures/operation.fixture.js +19 -0
- package/lib-es/test/fixtures/operation.fixture.js.map +1 -0
- package/lib-es/test/fixtures/transaction.fixture.d.ts +4 -0
- package/lib-es/test/fixtures/transaction.fixture.d.ts.map +1 -0
- package/lib-es/test/fixtures/transaction.fixture.js +20 -0
- package/lib-es/test/fixtures/transaction.fixture.js.map +1 -0
- package/lib-es/types/bridge.d.ts +25 -1
- package/lib-es/types/bridge.d.ts.map +1 -1
- package/package.json +12 -10
- package/src/api/mirror.test.ts +79 -5
- package/src/api/mirror.ts +30 -111
- package/src/api/network.ts +71 -4
- package/src/api/types.ts +48 -0
- package/src/api/utils.ts +150 -0
- package/src/bridge/broadcast.ts +2 -0
- package/src/bridge/buildOptimisticOperation.integration.test.ts +88 -0
- package/src/bridge/buildOptimisticOperation.ts +118 -7
- package/src/bridge/estimateMaxSpendable.ts +8 -2
- package/src/bridge/getTransactionStatus.test.ts +200 -0
- package/src/bridge/getTransactionStatus.ts +166 -32
- package/src/bridge/index.ts +13 -10
- package/src/bridge/js-estimateMaxSpendable.integration.test.ts +37 -46
- package/src/bridge/js-transaction.test.ts +13 -54
- package/src/bridge/prepareTransaction.ts +1 -2
- package/src/bridge/serialization.test.ts +39 -0
- package/src/bridge/serialization.ts +43 -0
- package/src/bridge/synchronisation.ts +65 -27
- package/src/bridge/transaction.test.ts +22 -64
- package/src/bridge/utils.integration.test.ts +525 -76
- package/src/bridge/utils.ts +423 -24
- package/src/constants.ts +35 -0
- package/src/deviceTransactionConfig.ts +16 -15
- package/src/logic.test.ts +147 -57
- package/src/logic.ts +58 -7
- package/src/test/fixtures/account.fixture.ts +123 -0
- package/src/test/fixtures/currency.fixture.ts +66 -0
- package/src/test/fixtures/mirror.fixture.ts +14 -0
- package/src/test/fixtures/operation.fixture.ts +20 -0
- package/src/test/fixtures/transaction.fixture.ts +22 -0
- package/src/types/bridge.ts +33 -0
package/lib-es/bridge/utils.js
CHANGED
|
@@ -1,39 +1,80 @@
|
|
|
1
1
|
import BigNumber from "bignumber.js";
|
|
2
|
+
import murmurhash from "imurmurhash";
|
|
3
|
+
import invariant from "invariant";
|
|
2
4
|
import cvsApi from "@ledgerhq/live-countervalues/api/index";
|
|
3
|
-
import { getFiatCurrencyByTicker } from "@ledgerhq/cryptoassets";
|
|
5
|
+
import { findTokenByAddressInCurrency, getFiatCurrencyByTicker, listTokensForCryptoCurrency, } from "@ledgerhq/cryptoassets";
|
|
6
|
+
import { decodeTokenAccountId, emptyHistoryCache, encodeTokenAccountId, findSubAccountById, isTokenAccount, } from "@ledgerhq/coin-framework/account";
|
|
7
|
+
import { encodeOperationId } from "@ledgerhq/coin-framework/operation";
|
|
8
|
+
import { mergeOps } from "@ledgerhq/coin-framework/bridge/jsHelpers";
|
|
9
|
+
import { makeLRUCache, seconds } from "@ledgerhq/live-network/cache";
|
|
4
10
|
import { estimateMaxSpendable } from "./estimateMaxSpendable";
|
|
5
|
-
|
|
6
|
-
|
|
11
|
+
import { getAccount } from "../api/mirror";
|
|
12
|
+
import { isTokenAssociateTransaction, isValidExtra } from "../logic";
|
|
13
|
+
import { BASE_USD_FEE_BY_OPERATION_TYPE, HEDERA_OPERATION_TYPES } from "../constants";
|
|
14
|
+
const ESTIMATED_FEE_SAFETY_RATE = 2;
|
|
15
|
+
// note: this is currently called frequently by getTransactionStatus; LRU cache prevents duplicated requests
|
|
16
|
+
export const getCurrencyToUSDRate = makeLRUCache(async (currency) => {
|
|
7
17
|
try {
|
|
8
|
-
const
|
|
18
|
+
const [rate] = await cvsApi.fetchLatest([
|
|
9
19
|
{
|
|
10
|
-
from:
|
|
20
|
+
from: currency,
|
|
11
21
|
to: getFiatCurrencyByTicker("USD"),
|
|
12
22
|
startDate: new Date(),
|
|
13
23
|
},
|
|
14
24
|
]);
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
25
|
+
invariant(rate, "no value returned from cvs api");
|
|
26
|
+
return new BigNumber(rate);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}, currency => currency.ticker, seconds(3));
|
|
32
|
+
export const getEstimatedFees = async (account, operationType) => {
|
|
33
|
+
try {
|
|
34
|
+
const usdRate = await getCurrencyToUSDRate(account.currency);
|
|
35
|
+
if (usdRate) {
|
|
36
|
+
return new BigNumber(BASE_USD_FEE_BY_OPERATION_TYPE[operationType])
|
|
37
|
+
.dividedBy(new BigNumber(usdRate))
|
|
18
38
|
.integerValue(BigNumber.ROUND_CEIL)
|
|
19
|
-
.multipliedBy(
|
|
39
|
+
.multipliedBy(ESTIMATED_FEE_SAFETY_RATE);
|
|
20
40
|
}
|
|
21
41
|
// eslint-disable-next-line no-empty
|
|
22
42
|
}
|
|
23
43
|
catch { }
|
|
24
44
|
// as fees are based on a currency conversion, we stay
|
|
25
45
|
// on the safe side here and double the estimate for "max spendable"
|
|
26
|
-
return new BigNumber("150200").multipliedBy(
|
|
27
|
-
}
|
|
28
|
-
|
|
46
|
+
return new BigNumber("150200").multipliedBy(ESTIMATED_FEE_SAFETY_RATE); // 0.001502 ℏ (as of 2023-03-14)
|
|
47
|
+
};
|
|
48
|
+
const calculateCoinAmount = async ({ account, transaction, operationType, }) => {
|
|
49
|
+
const estimatedFees = await getEstimatedFees(account, operationType);
|
|
29
50
|
const amount = transaction.useAllAmount
|
|
30
|
-
? await estimateMaxSpendable({ account })
|
|
51
|
+
? await estimateMaxSpendable({ account, transaction })
|
|
31
52
|
: transaction.amount;
|
|
32
53
|
return {
|
|
33
54
|
amount,
|
|
34
|
-
totalSpent: amount.plus(
|
|
55
|
+
totalSpent: amount.plus(estimatedFees),
|
|
35
56
|
};
|
|
36
|
-
}
|
|
57
|
+
};
|
|
58
|
+
const calculateTokenAmount = async ({ account, tokenAccount, transaction, }) => {
|
|
59
|
+
const amount = transaction.useAllAmount
|
|
60
|
+
? await estimateMaxSpendable({ account: tokenAccount, parentAccount: account, transaction })
|
|
61
|
+
: transaction.amount;
|
|
62
|
+
return {
|
|
63
|
+
amount,
|
|
64
|
+
totalSpent: amount,
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
export const calculateAmount = ({ account, transaction, }) => {
|
|
68
|
+
const subAccount = findSubAccountById(account, transaction?.subAccountId || "");
|
|
69
|
+
const isTokenTransaction = isTokenAccount(subAccount);
|
|
70
|
+
if (isTokenTransaction) {
|
|
71
|
+
return calculateTokenAmount({ account, tokenAccount: subAccount, transaction });
|
|
72
|
+
}
|
|
73
|
+
const operationType = isTokenAssociateTransaction(transaction)
|
|
74
|
+
? HEDERA_OPERATION_TYPES.TokenAssociate
|
|
75
|
+
: HEDERA_OPERATION_TYPES.CryptoTransfer;
|
|
76
|
+
return calculateCoinAmount({ account, transaction, operationType });
|
|
77
|
+
};
|
|
37
78
|
// NOTE: convert from the non-url-safe version of base64 to the url-safe version (that the explorer uses)
|
|
38
79
|
export function base64ToUrlSafeBase64(data) {
|
|
39
80
|
// Might be nice to use this alternative if .nvmrc changes to >= Node v14.18.0
|
|
@@ -41,6 +82,234 @@ export function base64ToUrlSafeBase64(data) {
|
|
|
41
82
|
// Buffer.from(data, "base64").toString("base64url");
|
|
42
83
|
return data.replace(/\//g, "_").replace(/\+/g, "-");
|
|
43
84
|
}
|
|
85
|
+
const simpleSyncHashMemoize = {};
|
|
86
|
+
export const getSyncHash = (currency, blacklistedTokenIds = []) => {
|
|
87
|
+
const tokens = listTokensForCryptoCurrency(currency);
|
|
88
|
+
const stringToHash = currency.id +
|
|
89
|
+
tokens.map(token => token.id + token.contractAddress + token.name + token.ticker).join("") +
|
|
90
|
+
blacklistedTokenIds.join("");
|
|
91
|
+
if (!simpleSyncHashMemoize[stringToHash]) {
|
|
92
|
+
simpleSyncHashMemoize[stringToHash] = `0x${murmurhash(stringToHash).result().toString(16)}`;
|
|
93
|
+
}
|
|
94
|
+
return simpleSyncHashMemoize[stringToHash];
|
|
95
|
+
};
|
|
96
|
+
export const getSubAccounts = async (accountId, lastTokenOperations, mirrorTokens) => {
|
|
97
|
+
// Creating a Map of Operations by TokenCurrencies in order to know which TokenAccounts should be synced as well
|
|
98
|
+
const operationsByToken = lastTokenOperations.reduce((acc, tokenOperation) => {
|
|
99
|
+
const { token } = decodeTokenAccountId(tokenOperation.accountId);
|
|
100
|
+
if (!token)
|
|
101
|
+
return acc;
|
|
102
|
+
const isTokenListedInCAL = findTokenByAddressInCurrency(token.contractAddress, token.parentCurrency.id);
|
|
103
|
+
if (!isTokenListedInCAL)
|
|
104
|
+
return acc;
|
|
105
|
+
if (!acc.has(token)) {
|
|
106
|
+
acc.set(token, []);
|
|
107
|
+
}
|
|
108
|
+
acc.get(token)?.push(tokenOperation);
|
|
109
|
+
return acc;
|
|
110
|
+
}, new Map());
|
|
111
|
+
const subAccounts = [];
|
|
112
|
+
// extract token accounts from existing operations
|
|
113
|
+
for (const [token, tokenOperations] of operationsByToken.entries()) {
|
|
114
|
+
const parentAccountId = accountId;
|
|
115
|
+
const rawBalance = mirrorTokens.find(t => t.token_id === token.contractAddress)?.balance;
|
|
116
|
+
const balance = rawBalance !== undefined ? new BigNumber(rawBalance) : null;
|
|
117
|
+
if (!balance) {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
subAccounts.push({
|
|
121
|
+
type: "TokenAccount",
|
|
122
|
+
id: encodeTokenAccountId(parentAccountId, token),
|
|
123
|
+
parentId: parentAccountId,
|
|
124
|
+
token,
|
|
125
|
+
balance,
|
|
126
|
+
spendableBalance: balance,
|
|
127
|
+
creationDate: tokenOperations.length > 0 ? tokenOperations[tokenOperations.length - 1].date : new Date(),
|
|
128
|
+
operations: tokenOperations,
|
|
129
|
+
operationsCount: tokenOperations.length,
|
|
130
|
+
pendingOperations: [],
|
|
131
|
+
balanceHistoryCache: emptyHistoryCache,
|
|
132
|
+
swapHistory: [],
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
// extract token accounts existing in the account's balance, but with no recorded operations yet
|
|
136
|
+
// e.g. tokens added via association flow, without any subsequent activity
|
|
137
|
+
for (const rawToken of mirrorTokens) {
|
|
138
|
+
const parentAccountId = accountId;
|
|
139
|
+
const rawBalance = rawToken.balance;
|
|
140
|
+
const balance = new BigNumber(rawBalance);
|
|
141
|
+
const token = findTokenByAddressInCurrency(rawToken.token_id, "hedera");
|
|
142
|
+
if (!token) {
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const id = encodeTokenAccountId(parentAccountId, token);
|
|
146
|
+
if (subAccounts.some(a => a.id === id)) {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
subAccounts.push({
|
|
150
|
+
type: "TokenAccount",
|
|
151
|
+
id: encodeTokenAccountId(parentAccountId, token),
|
|
152
|
+
parentId: parentAccountId,
|
|
153
|
+
token,
|
|
154
|
+
balance,
|
|
155
|
+
spendableBalance: balance,
|
|
156
|
+
creationDate: new Date(parseFloat(rawToken.created_timestamp) * 1000),
|
|
157
|
+
operations: [],
|
|
158
|
+
operationsCount: 0,
|
|
159
|
+
pendingOperations: [],
|
|
160
|
+
balanceHistoryCache: emptyHistoryCache,
|
|
161
|
+
swapHistory: [],
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
return subAccounts;
|
|
165
|
+
};
|
|
166
|
+
// create NONE coin operation that will be a parent of an orphan child operation
|
|
167
|
+
const makeCoinOperationForOrphanChildOperation = (childOperation) => {
|
|
168
|
+
const type = "NONE";
|
|
169
|
+
const { accountId } = decodeTokenAccountId(childOperation.accountId);
|
|
170
|
+
const id = encodeOperationId(accountId, childOperation.hash, type);
|
|
171
|
+
return {
|
|
172
|
+
id,
|
|
173
|
+
hash: childOperation.hash,
|
|
174
|
+
type,
|
|
175
|
+
value: new BigNumber(0),
|
|
176
|
+
fee: new BigNumber(0),
|
|
177
|
+
senders: [],
|
|
178
|
+
recipients: [],
|
|
179
|
+
blockHeight: childOperation.blockHeight,
|
|
180
|
+
blockHash: childOperation.blockHash,
|
|
181
|
+
transactionSequenceNumber: childOperation.transactionSequenceNumber,
|
|
182
|
+
subOperations: [],
|
|
183
|
+
nftOperations: [],
|
|
184
|
+
internalOperations: [],
|
|
185
|
+
accountId: "",
|
|
186
|
+
date: childOperation.date,
|
|
187
|
+
extra: {},
|
|
188
|
+
};
|
|
189
|
+
};
|
|
190
|
+
// this util handles:
|
|
191
|
+
// - linking sub operations with coin operations, e.g. token transfer with fee payment
|
|
192
|
+
// - if possible, assigning `extra.associatedTokenId = mirrorToken.tokenId` based on operation's consensus timestamp
|
|
193
|
+
export const prepareOperations = (coinOperations, tokenOperations, mirrorTokens) => {
|
|
194
|
+
const preparedCoinOperations = coinOperations.map(op => ({ ...op }));
|
|
195
|
+
const preparedTokenOperations = tokenOperations.map(op => ({ ...op }));
|
|
196
|
+
// loop through coin operations to:
|
|
197
|
+
// - enrich ASSOCIATE_TOKEN operations with extra.associatedTokenId
|
|
198
|
+
// - prepare a map of hash => operations
|
|
199
|
+
const coinOperationsByHash = {};
|
|
200
|
+
preparedCoinOperations.forEach(op => {
|
|
201
|
+
const extra = isValidExtra(op.extra) ? op.extra : null;
|
|
202
|
+
if (op.type === "ASSOCIATE_TOKEN" && extra?.consensusTimestamp) {
|
|
203
|
+
const relatedMirrorToken = mirrorTokens.find(t => {
|
|
204
|
+
return t.created_timestamp === extra.consensusTimestamp;
|
|
205
|
+
});
|
|
206
|
+
if (relatedMirrorToken) {
|
|
207
|
+
op.extra = {
|
|
208
|
+
...extra,
|
|
209
|
+
associatedTokenId: relatedMirrorToken.token_id,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (!coinOperationsByHash[op.hash]) {
|
|
214
|
+
coinOperationsByHash[op.hash] = [];
|
|
215
|
+
}
|
|
216
|
+
op.subOperations = [];
|
|
217
|
+
coinOperationsByHash[op.hash].push(op);
|
|
218
|
+
});
|
|
219
|
+
// loop through token operations to potentially copy them as a child operation of a coin operation
|
|
220
|
+
for (const tokenOperation of preparedTokenOperations) {
|
|
221
|
+
const { token } = decodeTokenAccountId(tokenOperation.accountId);
|
|
222
|
+
if (!token)
|
|
223
|
+
continue;
|
|
224
|
+
let mainOperations = coinOperationsByHash[tokenOperation.hash];
|
|
225
|
+
if (!mainOperations?.length) {
|
|
226
|
+
const noneOperation = makeCoinOperationForOrphanChildOperation(tokenOperation);
|
|
227
|
+
mainOperations = [noneOperation];
|
|
228
|
+
preparedCoinOperations.push(noneOperation);
|
|
229
|
+
}
|
|
230
|
+
// ugly loop in loop but in theory, this can only be a 2 elements array maximum in the case of a self send
|
|
231
|
+
for (const mainOperation of mainOperations) {
|
|
232
|
+
mainOperation.subOperations.push(tokenOperation);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return preparedCoinOperations;
|
|
236
|
+
};
|
|
237
|
+
/**
|
|
238
|
+
* List of properties of a sub account that can be updated when 2 "identical" accounts are found
|
|
239
|
+
*/
|
|
240
|
+
const updatableSubAccountProperties = [
|
|
241
|
+
{ name: "balance", isOps: false },
|
|
242
|
+
{ name: "spendableBalance", isOps: false },
|
|
243
|
+
{ name: "balanceHistoryCache", isOps: false },
|
|
244
|
+
{ name: "operations", isOps: true },
|
|
245
|
+
{ name: "pendingOperations", isOps: true },
|
|
246
|
+
];
|
|
247
|
+
/**
|
|
248
|
+
* In charge of smartly merging sub accounts while maintaining references as much as possible
|
|
249
|
+
*/
|
|
250
|
+
export const mergeSubAccounts = (initialAccount, newSubAccounts) => {
|
|
251
|
+
const oldSubAccounts = initialAccount?.subAccounts;
|
|
252
|
+
if (!oldSubAccounts) {
|
|
253
|
+
return newSubAccounts;
|
|
254
|
+
}
|
|
255
|
+
// map of already existing sub accounts by id
|
|
256
|
+
const oldSubAccountsById = {};
|
|
257
|
+
for (const oldSubAccount of oldSubAccounts) {
|
|
258
|
+
oldSubAccountsById[oldSubAccount.id] = oldSubAccount;
|
|
259
|
+
}
|
|
260
|
+
// looping through new sub accounts to compare them with already existing ones
|
|
261
|
+
// already existing will be updated if necessary (see `updatableSubAccountProperties`)
|
|
262
|
+
// new sub accounts will be added/pushed after already existing
|
|
263
|
+
const newSubAccountsToAdd = [];
|
|
264
|
+
for (const newSubAccount of newSubAccounts) {
|
|
265
|
+
const duplicatedAccount = oldSubAccountsById[newSubAccount.id];
|
|
266
|
+
if (!duplicatedAccount) {
|
|
267
|
+
newSubAccountsToAdd.push(newSubAccount);
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
const updates = {};
|
|
271
|
+
for (const { name, isOps } of updatableSubAccountProperties) {
|
|
272
|
+
if (!isOps) {
|
|
273
|
+
if (newSubAccount[name] !== duplicatedAccount[name]) {
|
|
274
|
+
// @ts-expect-error - TypeScript assumes all possible types could be assigned here
|
|
275
|
+
updates[name] = newSubAccount[name];
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
updates[name] = mergeOps(duplicatedAccount[name], newSubAccount[name]);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// update the operationsCount in case the mergeOps changed it
|
|
283
|
+
updates.operationsCount =
|
|
284
|
+
updates.operations?.length || duplicatedAccount?.operations?.length || 0;
|
|
285
|
+
// modify the map with the updated sub account with a new ref
|
|
286
|
+
oldSubAccountsById[newSubAccount.id] = {
|
|
287
|
+
...duplicatedAccount,
|
|
288
|
+
...updates,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
const updatedSubAccounts = Object.values(oldSubAccountsById);
|
|
292
|
+
return [...updatedSubAccounts, ...newSubAccountsToAdd];
|
|
293
|
+
};
|
|
294
|
+
export const applyPendingExtras = (existing, pending) => {
|
|
295
|
+
const pendingOperationsByHash = new Map(pending.map(op => [op.hash, op]));
|
|
296
|
+
return existing.map(op => {
|
|
297
|
+
const pendingOp = pendingOperationsByHash.get(op.hash);
|
|
298
|
+
if (!pendingOp)
|
|
299
|
+
return op;
|
|
300
|
+
if (!isValidExtra(op.extra))
|
|
301
|
+
return op;
|
|
302
|
+
if (!isValidExtra(pendingOp.extra))
|
|
303
|
+
return op;
|
|
304
|
+
return {
|
|
305
|
+
...op,
|
|
306
|
+
extra: {
|
|
307
|
+
...pendingOp.extra,
|
|
308
|
+
...op.extra,
|
|
309
|
+
},
|
|
310
|
+
};
|
|
311
|
+
});
|
|
312
|
+
};
|
|
44
313
|
export function patchOperationWithExtra(operation, extra) {
|
|
45
314
|
return {
|
|
46
315
|
...operation,
|
|
@@ -49,4 +318,15 @@ export function patchOperationWithExtra(operation, extra) {
|
|
|
49
318
|
nftOperations: (operation.nftOperations ?? []).map(op => ({ ...op, extra })),
|
|
50
319
|
};
|
|
51
320
|
}
|
|
321
|
+
export const checkAccountTokenAssociationStatus = makeLRUCache(async (accountId, tokenId) => {
|
|
322
|
+
const mirrorAccount = await getAccount(accountId);
|
|
323
|
+
// auto association is enabled
|
|
324
|
+
if (mirrorAccount.max_automatic_token_associations === -1) {
|
|
325
|
+
return true;
|
|
326
|
+
}
|
|
327
|
+
const isTokenAssociated = mirrorAccount.balance.tokens.some(token => {
|
|
328
|
+
return token.token_id === tokenId;
|
|
329
|
+
});
|
|
330
|
+
return isTokenAssociated;
|
|
331
|
+
}, (accountId, tokenId) => `${accountId}-${tokenId}`, seconds(30));
|
|
52
332
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/bridge/utils.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AAErC,OAAO,MAAM,MAAM,wCAAwC,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAgB;IACrD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC;YACpC;gBACE,IAAI,EAAE,OAAO,CAAC,QAAQ;gBACtB,EAAE,EAAE,uBAAuB,CAAC,KAAK,CAAC;gBAClC,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB;SACF,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACZ,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC;iBACxB,SAAS,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;iBACjC,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC;iBAClC,YAAY,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QACD,oCAAoC;IACtC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,sDAAsD;IACtD,oEAAoE;IACpE,OAAO,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAC,gCAAgC;AACvG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EACpC,OAAO,EACP,WAAW,GAIZ;IAIC,MAAM,MAAM,GAAG,WAAW,CAAC,YAAY;QACrC,CAAC,CAAC,MAAM,oBAAoB,CAAC,EAAE,OAAO,EAAE,CAAC;QACzC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC;IAEvB,OAAO;QACL,MAAM;QACN,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;KACzD,CAAC;AACJ,CAAC;AAED,yGAAyG;AACzG,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,8EAA8E;IAC9E,uDAAuD;IACvD,qDAAqD;IAErD,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,SAAoB,EACpB,KAA2B;IAE3B,OAAO;QACL,GAAG,SAAS;QACZ,KAAK;QACL,aAAa,EAAE,CAAC,SAAS,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5E,aAAa,EAAE,CAAC,SAAS,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;KAC7E,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/bridge/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal types used to distinguish custom Hedera transaction behaviors.
|
|
3
|
+
* These can be stored in transaction.properties.name and used to route specific preparation logic.
|
|
4
|
+
*/
|
|
5
|
+
export declare const HEDERA_TRANSACTION_KINDS: {
|
|
6
|
+
readonly TokenAssociate: {
|
|
7
|
+
readonly name: "tokenAssociate";
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Enum representing the supported Hedera operation types for fee estimation
|
|
12
|
+
*/
|
|
13
|
+
export declare enum HEDERA_OPERATION_TYPES {
|
|
14
|
+
CryptoTransfer = "CryptoTransfer",
|
|
15
|
+
TokenTransfer = "TokenTransfer",
|
|
16
|
+
TokenAssociate = "TokenAssociate"
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* https://docs.hedera.com/hedera/networks/mainnet/fees
|
|
20
|
+
*
|
|
21
|
+
* These are Hedera's estimated fee costs in USD, scaled to tinybars (1 HBAR = 10^8 tinybars),
|
|
22
|
+
* so they can be converted into actual HBAR amounts based on current USD/crypto rates.
|
|
23
|
+
*
|
|
24
|
+
* Used in fee estimation logic (getEstimatedFees function) to determine whether an account
|
|
25
|
+
* has sufficient balance to cover the cost of a transaction (e.g. token association).
|
|
26
|
+
*/
|
|
27
|
+
export declare const BASE_USD_FEE_BY_OPERATION_TYPE: {
|
|
28
|
+
readonly CryptoTransfer: number;
|
|
29
|
+
readonly TokenTransfer: number;
|
|
30
|
+
readonly TokenAssociate: number;
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,wBAAwB;;;;CAI0C,CAAC;AAEhF;;GAEG;AACH,oBAAY,sBAAsB;IAChC,cAAc,mBAAmB;IACjC,aAAa,kBAAkB;IAC/B,cAAc,mBAAmB;CAClC;AAID;;;;;;;;GAQG;AACH,eAAO,MAAM,8BAA8B;;;;CAIgB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal types used to distinguish custom Hedera transaction behaviors.
|
|
3
|
+
* These can be stored in transaction.properties.name and used to route specific preparation logic.
|
|
4
|
+
*/
|
|
5
|
+
export const HEDERA_TRANSACTION_KINDS = {
|
|
6
|
+
TokenAssociate: {
|
|
7
|
+
name: "tokenAssociate",
|
|
8
|
+
},
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Enum representing the supported Hedera operation types for fee estimation
|
|
12
|
+
*/
|
|
13
|
+
export var HEDERA_OPERATION_TYPES;
|
|
14
|
+
(function (HEDERA_OPERATION_TYPES) {
|
|
15
|
+
HEDERA_OPERATION_TYPES["CryptoTransfer"] = "CryptoTransfer";
|
|
16
|
+
HEDERA_OPERATION_TYPES["TokenTransfer"] = "TokenTransfer";
|
|
17
|
+
HEDERA_OPERATION_TYPES["TokenAssociate"] = "TokenAssociate";
|
|
18
|
+
})(HEDERA_OPERATION_TYPES || (HEDERA_OPERATION_TYPES = {}));
|
|
19
|
+
const TINYBAR_SCALE = 8;
|
|
20
|
+
/**
|
|
21
|
+
* https://docs.hedera.com/hedera/networks/mainnet/fees
|
|
22
|
+
*
|
|
23
|
+
* These are Hedera's estimated fee costs in USD, scaled to tinybars (1 HBAR = 10^8 tinybars),
|
|
24
|
+
* so they can be converted into actual HBAR amounts based on current USD/crypto rates.
|
|
25
|
+
*
|
|
26
|
+
* Used in fee estimation logic (getEstimatedFees function) to determine whether an account
|
|
27
|
+
* has sufficient balance to cover the cost of a transaction (e.g. token association).
|
|
28
|
+
*/
|
|
29
|
+
export const BASE_USD_FEE_BY_OPERATION_TYPE = {
|
|
30
|
+
[HEDERA_OPERATION_TYPES.CryptoTransfer]: 0.0001 * 10 ** TINYBAR_SCALE,
|
|
31
|
+
[HEDERA_OPERATION_TYPES.TokenTransfer]: 0.001 * 10 ** TINYBAR_SCALE,
|
|
32
|
+
[HEDERA_OPERATION_TYPES.TokenAssociate]: 0.05 * 10 ** TINYBAR_SCALE,
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,cAAc,EAAE;QACd,IAAI,EAAE,gBAAgB;KACvB;CAC4E,CAAC;AAEhF;;GAEG;AACH,MAAM,CAAN,IAAY,sBAIX;AAJD,WAAY,sBAAsB;IAChC,2DAAiC,CAAA;IACjC,yDAA+B,CAAA;IAC/B,2DAAiC,CAAA;AACnC,CAAC,EAJW,sBAAsB,KAAtB,sBAAsB,QAIjC;AAED,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC5C,CAAC,sBAAsB,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,aAAa;IACrE,CAAC,sBAAsB,CAAC,aAAa,CAAC,EAAE,KAAK,GAAG,EAAE,IAAI,aAAa;IACnE,CAAC,sBAAsB,CAAC,cAAc,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,aAAa;CACV,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deviceTransactionConfig.d.ts","sourceRoot":"","sources":["../src/deviceTransactionConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,KAAK,EAAE,4BAA4B,IAAI,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"deviceTransactionConfig.d.ts","sourceRoot":"","sources":["../src/deviceTransactionConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,KAAK,EAAE,4BAA4B,IAAI,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAG1H,iBAAS,0BAA0B,CAAC,EAClC,WAAW,EACX,MAAM,EAAE,EAAE,aAAa,EAAE,GAC1B,EAAE;IACD,OAAO,EAAE,WAAW,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,iBAAiB,CAAC;CAC3B,GAAG,KAAK,CAAC,sBAAsB,CAAC,CAsChC;AAED,eAAe,0BAA0B,CAAC"}
|
|
@@ -1,23 +1,25 @@
|
|
|
1
|
+
import { isTokenAssociateTransaction } from "./logic";
|
|
1
2
|
function getDeviceTransactionConfig({ transaction, status: { estimatedFees }, }) {
|
|
2
3
|
const fields = [];
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
const method = (() => {
|
|
5
|
+
if (isTokenAssociateTransaction(transaction))
|
|
6
|
+
return "Associate Token";
|
|
7
|
+
else if (transaction.useAllAmount)
|
|
8
|
+
return "Transfer All";
|
|
9
|
+
else
|
|
10
|
+
return "Transfer";
|
|
11
|
+
})();
|
|
12
|
+
fields.push({
|
|
13
|
+
type: "text",
|
|
14
|
+
label: "Method",
|
|
15
|
+
value: method,
|
|
16
|
+
});
|
|
17
|
+
if (!isTokenAssociateTransaction(transaction)) {
|
|
11
18
|
fields.push({
|
|
12
|
-
type: "
|
|
13
|
-
label: "
|
|
14
|
-
value: "Transfer",
|
|
19
|
+
type: "amount",
|
|
20
|
+
label: "Amount",
|
|
15
21
|
});
|
|
16
22
|
}
|
|
17
|
-
fields.push({
|
|
18
|
-
type: "amount",
|
|
19
|
-
label: "Amount",
|
|
20
|
-
});
|
|
21
23
|
if (!estimatedFees.isZero()) {
|
|
22
24
|
fields.push({
|
|
23
25
|
type: "fees",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deviceTransactionConfig.js","sourceRoot":"","sources":["../src/deviceTransactionConfig.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"deviceTransactionConfig.js","sourceRoot":"","sources":["../src/deviceTransactionConfig.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAEtD,SAAS,0BAA0B,CAAC,EAClC,WAAW,EACX,MAAM,EAAE,EAAE,aAAa,EAAE,GAM1B;IACC,MAAM,MAAM,GAAkC,EAAE,CAAC;IAEjD,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;QACnB,IAAI,2BAA2B,CAAC,WAAW,CAAC;YAAE,OAAO,iBAAiB,CAAC;aAClE,IAAI,WAAW,CAAC,YAAY;YAAE,OAAO,cAAc,CAAC;;YACpD,OAAO,UAAU,CAAC;IACzB,CAAC,CAAC,EAAE,CAAC;IAEL,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,MAAM;KACd,CAAC,CAAC;IAEH,IAAI,CAAC,2BAA2B,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;IACL,CAAC;IAED,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,WAAW,CAAC,IAAI;SACxB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,eAAe,0BAA0B,CAAC"}
|
package/lib-es/logic.d.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
import { ExplorerView } from "@ledgerhq/types-cryptoassets";
|
|
2
|
-
import { Operation } from "@ledgerhq/types-live";
|
|
1
|
+
import type { ExplorerView, TokenCurrency } from "@ledgerhq/types-cryptoassets";
|
|
2
|
+
import type { AccountLike, Operation } from "@ledgerhq/types-live";
|
|
3
|
+
import type { HederaOperationExtra, Transaction, TransactionStatus } from "./types";
|
|
3
4
|
declare const getTransactionExplorer: (explorerView: ExplorerView | null | undefined, operation: Operation) => string | undefined;
|
|
4
|
-
|
|
5
|
+
declare const isTokenAssociateTransaction: (tx: Transaction) => tx is Required<Transaction>;
|
|
6
|
+
declare const isAutoTokenAssociationEnabled: (account: AccountLike) => boolean;
|
|
7
|
+
declare const isTokenAssociationRequired: (account: AccountLike, token: TokenCurrency | null | undefined) => boolean;
|
|
8
|
+
declare const isValidExtra: (extra: unknown) => extra is HederaOperationExtra;
|
|
9
|
+
declare const sendRecipientCanNext: (status: TransactionStatus) => boolean;
|
|
10
|
+
export { sendRecipientCanNext, getTransactionExplorer, isValidExtra, isTokenAssociateTransaction, isTokenAssociationRequired, isAutoTokenAssociationEnabled, };
|
|
5
11
|
//# sourceMappingURL=logic.d.ts.map
|
package/lib-es/logic.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logic.d.ts","sourceRoot":"","sources":["../src/logic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"logic.d.ts","sourceRoot":"","sources":["../src/logic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAChF,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEnE,OAAO,KAAK,EAEV,oBAAoB,EAEpB,WAAW,EACX,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAEjB,QAAA,MAAM,sBAAsB,iBACZ,YAAY,GAAG,IAAI,GAAG,SAAS,aAClC,SAAS,KACnB,MAAM,GAAG,SAOX,CAAC;AAEF,QAAA,MAAM,2BAA2B,OAC3B,WAAW,gCAGhB,CAAC;AAEF,QAAA,MAAM,6BAA6B,YAAa,WAAW,YAI1D,CAAC;AAEF,QAAA,MAAM,0BAA0B,YACrB,WAAW,SACb,aAAa,GAAG,IAAI,GAAG,SAAS,YAMxC,CAAC;AAEF,QAAA,MAAM,YAAY,UAAW,OAAO,kCAEnC,CAAC;AAKF,QAAA,MAAM,oBAAoB,WAAY,iBAAiB,YAItD,CAAC;AAEF,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,YAAY,EACZ,2BAA2B,EAC3B,0BAA0B,EAC1B,6BAA6B,GAC9B,CAAC"}
|
package/lib-es/logic.js
CHANGED
|
@@ -1,6 +1,29 @@
|
|
|
1
|
+
import { HEDERA_TRANSACTION_KINDS } from "./constants";
|
|
1
2
|
const getTransactionExplorer = (explorerView, operation) => {
|
|
2
|
-
const extra = operation.extra;
|
|
3
|
-
return explorerView?.tx?.replace("$hash", extra
|
|
3
|
+
const extra = isValidExtra(operation.extra) ? operation.extra : null;
|
|
4
|
+
return explorerView?.tx?.replace("$hash", extra?.consensusTimestamp ?? extra?.transactionId ?? "0");
|
|
4
5
|
};
|
|
5
|
-
|
|
6
|
+
const isTokenAssociateTransaction = (tx) => {
|
|
7
|
+
return tx.properties?.name === HEDERA_TRANSACTION_KINDS.TokenAssociate.name;
|
|
8
|
+
};
|
|
9
|
+
const isAutoTokenAssociationEnabled = (account) => {
|
|
10
|
+
const hederaAccount = "hederaResources" in account ? account : null;
|
|
11
|
+
return hederaAccount?.hederaResources?.isAutoTokenAssociationEnabled ?? false;
|
|
12
|
+
};
|
|
13
|
+
const isTokenAssociationRequired = (account, token) => {
|
|
14
|
+
const subAccounts = !!account && "subAccounts" in account ? account.subAccounts ?? [] : [];
|
|
15
|
+
const isTokenAssociated = subAccounts.some(item => item.token.id === token?.id);
|
|
16
|
+
return !!token && !isTokenAssociated && !isAutoTokenAssociationEnabled(account);
|
|
17
|
+
};
|
|
18
|
+
const isValidExtra = (extra) => {
|
|
19
|
+
return !!extra && typeof extra === "object" && !Array.isArray(extra);
|
|
20
|
+
};
|
|
21
|
+
// disables the "Continue" button in the Send modal's Recipient step during token transfers if:
|
|
22
|
+
// - the recipient is not associated with the token
|
|
23
|
+
// - the association status can't be verified
|
|
24
|
+
const sendRecipientCanNext = (status) => {
|
|
25
|
+
const { missingAssociation, unverifiedAssociation } = status.warnings;
|
|
26
|
+
return !missingAssociation && !unverifiedAssociation;
|
|
27
|
+
};
|
|
28
|
+
export { sendRecipientCanNext, getTransactionExplorer, isValidExtra, isTokenAssociateTransaction, isTokenAssociationRequired, isAutoTokenAssociationEnabled, };
|
|
6
29
|
//# sourceMappingURL=logic.js.map
|
package/lib-es/logic.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logic.js","sourceRoot":"","sources":["../src/logic.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logic.js","sourceRoot":"","sources":["../src/logic.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AASvD,MAAM,sBAAsB,GAAG,CAC7B,YAA6C,EAC7C,SAAoB,EACA,EAAE;IACtB,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAErE,OAAO,YAAY,EAAE,EAAE,EAAE,OAAO,CAC9B,OAAO,EACP,KAAK,EAAE,kBAAkB,IAAI,KAAK,EAAE,aAAa,IAAI,GAAG,CACzD,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,2BAA2B,GAAG,CAClC,EAAe,EACiE,EAAE;IAClF,OAAO,EAAE,CAAC,UAAU,EAAE,IAAI,KAAK,wBAAwB,CAAC,cAAc,CAAC,IAAI,CAAC;AAC9E,CAAC,CAAC;AAEF,MAAM,6BAA6B,GAAG,CAAC,OAAoB,EAAE,EAAE;IAC7D,MAAM,aAAa,GAAG,iBAAiB,IAAI,OAAO,CAAC,CAAC,CAAE,OAAyB,CAAC,CAAC,CAAC,IAAI,CAAC;IAEvF,OAAO,aAAa,EAAE,eAAe,EAAE,6BAA6B,IAAI,KAAK,CAAC;AAChF,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAAG,CACjC,OAAoB,EACpB,KAAuC,EACvC,EAAE;IACF,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,IAAI,aAAa,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3F,MAAM,iBAAiB,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,EAAE,EAAE,CAAC,CAAC;IAEhF,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC,iBAAiB,IAAI,CAAC,6BAA6B,CAAC,OAAO,CAAC,CAAC;AAClF,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,KAAc,EAAiC,EAAE;IACrE,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACvE,CAAC,CAAC;AAEF,+FAA+F;AAC/F,mDAAmD;AACnD,6CAA6C;AAC7C,MAAM,oBAAoB,GAAG,CAAC,MAAyB,EAAE,EAAE;IACzD,MAAM,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;IAEtE,OAAO,CAAC,kBAAkB,IAAI,CAAC,qBAAqB,CAAC;AACvD,CAAC,CAAC;AAEF,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,YAAY,EACZ,2BAA2B,EAC3B,0BAA0B,EAC1B,6BAA6B,GAC9B,CAAC"}
|