@ledgerhq/coin-hedera 1.10.1 → 1.10.2-nightly.1

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 (249) hide show
  1. package/.eslintrc.js +1 -0
  2. package/.turbo/turbo-build.log +1 -1
  3. package/CHANGELOG.md +19 -0
  4. package/lib/api/mirror.d.ts +3 -20
  5. package/lib/api/mirror.d.ts.map +1 -1
  6. package/lib/api/mirror.js +32 -90
  7. package/lib/api/mirror.js.map +1 -1
  8. package/lib/api/mirror.test.js +59 -4
  9. package/lib/api/mirror.test.js.map +1 -1
  10. package/lib/api/network.d.ts +3 -3
  11. package/lib/api/network.d.ts.map +1 -1
  12. package/lib/api/network.js +46 -3
  13. package/lib/api/network.js.map +1 -1
  14. package/lib/api/types.d.ts +44 -0
  15. package/lib/api/types.d.ts.map +1 -0
  16. package/lib/api/types.js +3 -0
  17. package/lib/api/types.js.map +1 -0
  18. package/lib/api/utils.d.ts +8 -0
  19. package/lib/api/utils.d.ts.map +1 -0
  20. package/lib/api/utils.js +132 -0
  21. package/lib/api/utils.js.map +1 -0
  22. package/lib/bridge/broadcast.d.ts.map +1 -1
  23. package/lib/bridge/broadcast.js +2 -0
  24. package/lib/bridge/broadcast.js.map +1 -1
  25. package/lib/bridge/buildOptimisticOperation.d.ts +2 -2
  26. package/lib/bridge/buildOptimisticOperation.d.ts.map +1 -1
  27. package/lib/bridge/buildOptimisticOperation.integration.test.d.ts +2 -0
  28. package/lib/bridge/buildOptimisticOperation.integration.test.d.ts.map +1 -0
  29. package/lib/bridge/buildOptimisticOperation.integration.test.js +82 -0
  30. package/lib/bridge/buildOptimisticOperation.integration.test.js.map +1 -0
  31. package/lib/bridge/buildOptimisticOperation.js +87 -5
  32. package/lib/bridge/buildOptimisticOperation.js.map +1 -1
  33. package/lib/bridge/estimateMaxSpendable.d.ts.map +1 -1
  34. package/lib/bridge/estimateMaxSpendable.js +8 -2
  35. package/lib/bridge/estimateMaxSpendable.js.map +1 -1
  36. package/lib/bridge/getTransactionStatus.d.ts +3 -3
  37. package/lib/bridge/getTransactionStatus.d.ts.map +1 -1
  38. package/lib/bridge/getTransactionStatus.js +116 -23
  39. package/lib/bridge/getTransactionStatus.js.map +1 -1
  40. package/lib/bridge/getTransactionStatus.test.d.ts +2 -0
  41. package/lib/bridge/getTransactionStatus.test.d.ts.map +1 -0
  42. package/lib/bridge/getTransactionStatus.test.js +176 -0
  43. package/lib/bridge/getTransactionStatus.test.js.map +1 -0
  44. package/lib/bridge/index.d.ts +4 -4
  45. package/lib/bridge/index.d.ts.map +1 -1
  46. package/lib/bridge/index.js +9 -6
  47. package/lib/bridge/index.js.map +1 -1
  48. package/lib/bridge/js-estimateMaxSpendable.integration.test.js +28 -44
  49. package/lib/bridge/js-estimateMaxSpendable.integration.test.js.map +1 -1
  50. package/lib/bridge/js-transaction.test.js +10 -49
  51. package/lib/bridge/js-transaction.test.js.map +1 -1
  52. package/lib/bridge/prepareTransaction.d.ts +0 -1
  53. package/lib/bridge/prepareTransaction.d.ts.map +1 -1
  54. package/lib/bridge/prepareTransaction.js +0 -1
  55. package/lib/bridge/prepareTransaction.js.map +1 -1
  56. package/lib/bridge/serialization.d.ts +7 -0
  57. package/lib/bridge/serialization.d.ts.map +1 -0
  58. package/lib/bridge/serialization.js +36 -0
  59. package/lib/bridge/serialization.js.map +1 -0
  60. package/lib/bridge/serialization.test.d.ts +2 -0
  61. package/lib/bridge/serialization.test.d.ts.map +1 -0
  62. package/lib/bridge/serialization.test.js +27 -0
  63. package/lib/bridge/serialization.test.js.map +1 -0
  64. package/lib/bridge/synchronisation.d.ts +3 -3
  65. package/lib/bridge/synchronisation.d.ts.map +1 -1
  66. package/lib/bridge/synchronisation.js +37 -15
  67. package/lib/bridge/synchronisation.js.map +1 -1
  68. package/lib/bridge/transaction.test.js +18 -59
  69. package/lib/bridge/transaction.test.js.map +1 -1
  70. package/lib/bridge/utils.d.ts +22 -8
  71. package/lib/bridge/utils.d.ts.map +1 -1
  72. package/lib/bridge/utils.integration.test.js +415 -73
  73. package/lib/bridge/utils.integration.test.js.map +1 -1
  74. package/lib/bridge/utils.js +300 -15
  75. package/lib/bridge/utils.js.map +1 -1
  76. package/lib/constants.d.ts +32 -0
  77. package/lib/constants.d.ts.map +1 -0
  78. package/lib/constants.js +37 -0
  79. package/lib/constants.js.map +1 -0
  80. package/lib/deviceTransactionConfig.d.ts.map +1 -1
  81. package/lib/deviceTransactionConfig.js +17 -15
  82. package/lib/deviceTransactionConfig.js.map +1 -1
  83. package/lib/logic.d.ts +9 -3
  84. package/lib/logic.d.ts.map +1 -1
  85. package/lib/logic.js +31 -3
  86. package/lib/logic.js.map +1 -1
  87. package/lib/logic.test.js +103 -50
  88. package/lib/logic.test.js.map +1 -1
  89. package/lib/test/fixtures/account.fixture.d.ts +19 -0
  90. package/lib/test/fixtures/account.fixture.d.ts.map +1 -0
  91. package/lib/test/fixtures/account.fixture.js +116 -0
  92. package/lib/test/fixtures/account.fixture.js.map +1 -0
  93. package/lib/test/fixtures/currency.fixture.d.ts +5 -0
  94. package/lib/test/fixtures/currency.fixture.d.ts.map +1 -0
  95. package/lib/test/fixtures/currency.fixture.js +67 -0
  96. package/lib/test/fixtures/currency.fixture.js.map +1 -0
  97. package/lib/test/fixtures/mirror.fixture.d.ts +3 -0
  98. package/lib/test/fixtures/mirror.fixture.d.ts.map +1 -0
  99. package/lib/test/fixtures/mirror.fixture.js +17 -0
  100. package/lib/test/fixtures/mirror.fixture.js.map +1 -0
  101. package/lib/test/fixtures/operation.fixture.d.ts +3 -0
  102. package/lib/test/fixtures/operation.fixture.d.ts.map +1 -0
  103. package/lib/test/fixtures/operation.fixture.js +26 -0
  104. package/lib/test/fixtures/operation.fixture.js.map +1 -0
  105. package/lib/test/fixtures/transaction.fixture.d.ts +4 -0
  106. package/lib/test/fixtures/transaction.fixture.d.ts.map +1 -0
  107. package/lib/test/fixtures/transaction.fixture.js +28 -0
  108. package/lib/test/fixtures/transaction.fixture.js.map +1 -0
  109. package/lib/types/bridge.d.ts +25 -1
  110. package/lib/types/bridge.d.ts.map +1 -1
  111. package/lib-es/api/mirror.d.ts +3 -20
  112. package/lib-es/api/mirror.d.ts.map +1 -1
  113. package/lib-es/api/mirror.js +29 -88
  114. package/lib-es/api/mirror.js.map +1 -1
  115. package/lib-es/api/mirror.test.js +60 -5
  116. package/lib-es/api/mirror.test.js.map +1 -1
  117. package/lib-es/api/network.d.ts +3 -3
  118. package/lib-es/api/network.d.ts.map +1 -1
  119. package/lib-es/api/network.js +44 -4
  120. package/lib-es/api/network.js.map +1 -1
  121. package/lib-es/api/types.d.ts +44 -0
  122. package/lib-es/api/types.d.ts.map +1 -0
  123. package/lib-es/api/types.js +2 -0
  124. package/lib-es/api/types.js.map +1 -0
  125. package/lib-es/api/utils.d.ts +8 -0
  126. package/lib-es/api/utils.d.ts.map +1 -0
  127. package/lib-es/api/utils.js +124 -0
  128. package/lib-es/api/utils.js.map +1 -0
  129. package/lib-es/bridge/broadcast.d.ts.map +1 -1
  130. package/lib-es/bridge/broadcast.js +2 -0
  131. package/lib-es/bridge/broadcast.js.map +1 -1
  132. package/lib-es/bridge/buildOptimisticOperation.d.ts +2 -2
  133. package/lib-es/bridge/buildOptimisticOperation.d.ts.map +1 -1
  134. package/lib-es/bridge/buildOptimisticOperation.integration.test.d.ts +2 -0
  135. package/lib-es/bridge/buildOptimisticOperation.integration.test.d.ts.map +1 -0
  136. package/lib-es/bridge/buildOptimisticOperation.integration.test.js +77 -0
  137. package/lib-es/bridge/buildOptimisticOperation.integration.test.js.map +1 -0
  138. package/lib-es/bridge/buildOptimisticOperation.js +84 -5
  139. package/lib-es/bridge/buildOptimisticOperation.js.map +1 -1
  140. package/lib-es/bridge/estimateMaxSpendable.d.ts.map +1 -1
  141. package/lib-es/bridge/estimateMaxSpendable.js +8 -2
  142. package/lib-es/bridge/estimateMaxSpendable.js.map +1 -1
  143. package/lib-es/bridge/getTransactionStatus.d.ts +3 -3
  144. package/lib-es/bridge/getTransactionStatus.d.ts.map +1 -1
  145. package/lib-es/bridge/getTransactionStatus.js +114 -24
  146. package/lib-es/bridge/getTransactionStatus.js.map +1 -1
  147. package/lib-es/bridge/getTransactionStatus.test.d.ts +2 -0
  148. package/lib-es/bridge/getTransactionStatus.test.d.ts.map +1 -0
  149. package/lib-es/bridge/getTransactionStatus.test.js +148 -0
  150. package/lib-es/bridge/getTransactionStatus.test.js.map +1 -0
  151. package/lib-es/bridge/index.d.ts +4 -4
  152. package/lib-es/bridge/index.d.ts.map +1 -1
  153. package/lib-es/bridge/index.js +9 -6
  154. package/lib-es/bridge/index.js.map +1 -1
  155. package/lib-es/bridge/js-estimateMaxSpendable.integration.test.js +28 -44
  156. package/lib-es/bridge/js-estimateMaxSpendable.integration.test.js.map +1 -1
  157. package/lib-es/bridge/js-transaction.test.js +10 -49
  158. package/lib-es/bridge/js-transaction.test.js.map +1 -1
  159. package/lib-es/bridge/prepareTransaction.d.ts +0 -1
  160. package/lib-es/bridge/prepareTransaction.d.ts.map +1 -1
  161. package/lib-es/bridge/prepareTransaction.js +0 -1
  162. package/lib-es/bridge/prepareTransaction.js.map +1 -1
  163. package/lib-es/bridge/serialization.d.ts +7 -0
  164. package/lib-es/bridge/serialization.d.ts.map +1 -0
  165. package/lib-es/bridge/serialization.js +29 -0
  166. package/lib-es/bridge/serialization.js.map +1 -0
  167. package/lib-es/bridge/serialization.test.d.ts +2 -0
  168. package/lib-es/bridge/serialization.test.d.ts.map +1 -0
  169. package/lib-es/bridge/serialization.test.js +25 -0
  170. package/lib-es/bridge/serialization.test.js.map +1 -0
  171. package/lib-es/bridge/synchronisation.d.ts +3 -3
  172. package/lib-es/bridge/synchronisation.d.ts.map +1 -1
  173. package/lib-es/bridge/synchronisation.js +39 -17
  174. package/lib-es/bridge/synchronisation.js.map +1 -1
  175. package/lib-es/bridge/transaction.test.js +18 -59
  176. package/lib-es/bridge/transaction.test.js.map +1 -1
  177. package/lib-es/bridge/utils.d.ts +22 -8
  178. package/lib-es/bridge/utils.d.ts.map +1 -1
  179. package/lib-es/bridge/utils.integration.test.js +416 -74
  180. package/lib-es/bridge/utils.integration.test.js.map +1 -1
  181. package/lib-es/bridge/utils.js +295 -15
  182. package/lib-es/bridge/utils.js.map +1 -1
  183. package/lib-es/constants.d.ts +32 -0
  184. package/lib-es/constants.d.ts.map +1 -0
  185. package/lib-es/constants.js +34 -0
  186. package/lib-es/constants.js.map +1 -0
  187. package/lib-es/deviceTransactionConfig.d.ts.map +1 -1
  188. package/lib-es/deviceTransactionConfig.js +17 -15
  189. package/lib-es/deviceTransactionConfig.js.map +1 -1
  190. package/lib-es/logic.d.ts +9 -3
  191. package/lib-es/logic.d.ts.map +1 -1
  192. package/lib-es/logic.js +26 -3
  193. package/lib-es/logic.js.map +1 -1
  194. package/lib-es/logic.test.js +104 -51
  195. package/lib-es/logic.test.js.map +1 -1
  196. package/lib-es/test/fixtures/account.fixture.d.ts +19 -0
  197. package/lib-es/test/fixtures/account.fixture.d.ts.map +1 -0
  198. package/lib-es/test/fixtures/account.fixture.js +107 -0
  199. package/lib-es/test/fixtures/account.fixture.js.map +1 -0
  200. package/lib-es/test/fixtures/currency.fixture.d.ts +5 -0
  201. package/lib-es/test/fixtures/currency.fixture.d.ts.map +1 -0
  202. package/lib-es/test/fixtures/currency.fixture.js +58 -0
  203. package/lib-es/test/fixtures/currency.fixture.js.map +1 -0
  204. package/lib-es/test/fixtures/mirror.fixture.d.ts +3 -0
  205. package/lib-es/test/fixtures/mirror.fixture.d.ts.map +1 -0
  206. package/lib-es/test/fixtures/mirror.fixture.js +13 -0
  207. package/lib-es/test/fixtures/mirror.fixture.js.map +1 -0
  208. package/lib-es/test/fixtures/operation.fixture.d.ts +3 -0
  209. package/lib-es/test/fixtures/operation.fixture.d.ts.map +1 -0
  210. package/lib-es/test/fixtures/operation.fixture.js +19 -0
  211. package/lib-es/test/fixtures/operation.fixture.js.map +1 -0
  212. package/lib-es/test/fixtures/transaction.fixture.d.ts +4 -0
  213. package/lib-es/test/fixtures/transaction.fixture.d.ts.map +1 -0
  214. package/lib-es/test/fixtures/transaction.fixture.js +20 -0
  215. package/lib-es/test/fixtures/transaction.fixture.js.map +1 -0
  216. package/lib-es/types/bridge.d.ts +25 -1
  217. package/lib-es/types/bridge.d.ts.map +1 -1
  218. package/package.json +12 -10
  219. package/src/api/mirror.test.ts +79 -5
  220. package/src/api/mirror.ts +30 -111
  221. package/src/api/network.ts +71 -4
  222. package/src/api/types.ts +48 -0
  223. package/src/api/utils.ts +150 -0
  224. package/src/bridge/broadcast.ts +2 -0
  225. package/src/bridge/buildOptimisticOperation.integration.test.ts +88 -0
  226. package/src/bridge/buildOptimisticOperation.ts +118 -7
  227. package/src/bridge/estimateMaxSpendable.ts +8 -2
  228. package/src/bridge/getTransactionStatus.test.ts +200 -0
  229. package/src/bridge/getTransactionStatus.ts +166 -32
  230. package/src/bridge/index.ts +13 -10
  231. package/src/bridge/js-estimateMaxSpendable.integration.test.ts +37 -46
  232. package/src/bridge/js-transaction.test.ts +13 -54
  233. package/src/bridge/prepareTransaction.ts +1 -2
  234. package/src/bridge/serialization.test.ts +39 -0
  235. package/src/bridge/serialization.ts +43 -0
  236. package/src/bridge/synchronisation.ts +65 -27
  237. package/src/bridge/transaction.test.ts +22 -64
  238. package/src/bridge/utils.integration.test.ts +525 -76
  239. package/src/bridge/utils.ts +423 -24
  240. package/src/constants.ts +35 -0
  241. package/src/deviceTransactionConfig.ts +16 -15
  242. package/src/logic.test.ts +147 -57
  243. package/src/logic.ts +58 -7
  244. package/src/test/fixtures/account.fixture.ts +123 -0
  245. package/src/test/fixtures/currency.fixture.ts +66 -0
  246. package/src/test/fixtures/mirror.fixture.ts +14 -0
  247. package/src/test/fixtures/operation.fixture.ts +20 -0
  248. package/src/test/fixtures/transaction.fixture.ts +22 -0
  249. package/src/types/bridge.ts +33 -0
@@ -3,44 +3,85 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.patchOperationWithExtra = exports.base64ToUrlSafeBase64 = exports.calculateAmount = exports.getEstimatedFees = exports.estimatedFeeSafetyRate = void 0;
6
+ exports.checkAccountTokenAssociationStatus = exports.patchOperationWithExtra = exports.applyPendingExtras = exports.mergeSubAccounts = exports.prepareOperations = exports.getSubAccounts = exports.getSyncHash = exports.base64ToUrlSafeBase64 = exports.calculateAmount = exports.getEstimatedFees = exports.getCurrencyToUSDRate = void 0;
7
7
  const bignumber_js_1 = __importDefault(require("bignumber.js"));
8
+ const imurmurhash_1 = __importDefault(require("imurmurhash"));
9
+ const invariant_1 = __importDefault(require("invariant"));
8
10
  const index_1 = __importDefault(require("@ledgerhq/live-countervalues/api/index"));
9
11
  const cryptoassets_1 = require("@ledgerhq/cryptoassets");
12
+ const account_1 = require("@ledgerhq/coin-framework/account");
13
+ const operation_1 = require("@ledgerhq/coin-framework/operation");
14
+ const jsHelpers_1 = require("@ledgerhq/coin-framework/bridge/jsHelpers");
15
+ const cache_1 = require("@ledgerhq/live-network/cache");
10
16
  const estimateMaxSpendable_1 = require("./estimateMaxSpendable");
11
- exports.estimatedFeeSafetyRate = 2;
12
- async function getEstimatedFees(account) {
17
+ const mirror_1 = require("../api/mirror");
18
+ const logic_1 = require("../logic");
19
+ const constants_1 = require("../constants");
20
+ const ESTIMATED_FEE_SAFETY_RATE = 2;
21
+ // note: this is currently called frequently by getTransactionStatus; LRU cache prevents duplicated requests
22
+ exports.getCurrencyToUSDRate = (0, cache_1.makeLRUCache)(async (currency) => {
13
23
  try {
14
- const data = await index_1.default.fetchLatest([
24
+ const [rate] = await index_1.default.fetchLatest([
15
25
  {
16
- from: account.currency,
26
+ from: currency,
17
27
  to: (0, cryptoassets_1.getFiatCurrencyByTicker)("USD"),
18
28
  startDate: new Date(),
19
29
  },
20
30
  ]);
21
- if (data[0]) {
22
- return new bignumber_js_1.default(10000)
23
- .dividedBy(new bignumber_js_1.default(data[0]))
31
+ (0, invariant_1.default)(rate, "no value returned from cvs api");
32
+ return new bignumber_js_1.default(rate);
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ }, currency => currency.ticker, (0, cache_1.seconds)(3));
38
+ const getEstimatedFees = async (account, operationType) => {
39
+ try {
40
+ const usdRate = await (0, exports.getCurrencyToUSDRate)(account.currency);
41
+ if (usdRate) {
42
+ return new bignumber_js_1.default(constants_1.BASE_USD_FEE_BY_OPERATION_TYPE[operationType])
43
+ .dividedBy(new bignumber_js_1.default(usdRate))
24
44
  .integerValue(bignumber_js_1.default.ROUND_CEIL)
25
- .multipliedBy(exports.estimatedFeeSafetyRate);
45
+ .multipliedBy(ESTIMATED_FEE_SAFETY_RATE);
26
46
  }
27
47
  // eslint-disable-next-line no-empty
28
48
  }
29
49
  catch { }
30
50
  // as fees are based on a currency conversion, we stay
31
51
  // on the safe side here and double the estimate for "max spendable"
32
- return new bignumber_js_1.default("150200").multipliedBy(exports.estimatedFeeSafetyRate); // 0.001502 ℏ (as of 2023-03-14)
33
- }
52
+ return new bignumber_js_1.default("150200").multipliedBy(ESTIMATED_FEE_SAFETY_RATE); // 0.001502 ℏ (as of 2023-03-14)
53
+ };
34
54
  exports.getEstimatedFees = getEstimatedFees;
35
- async function calculateAmount({ account, transaction, }) {
55
+ const calculateCoinAmount = async ({ account, transaction, operationType, }) => {
56
+ const estimatedFees = await (0, exports.getEstimatedFees)(account, operationType);
36
57
  const amount = transaction.useAllAmount
37
- ? await (0, estimateMaxSpendable_1.estimateMaxSpendable)({ account })
58
+ ? await (0, estimateMaxSpendable_1.estimateMaxSpendable)({ account, transaction })
38
59
  : transaction.amount;
39
60
  return {
40
61
  amount,
41
- totalSpent: amount.plus(await getEstimatedFees(account)),
62
+ totalSpent: amount.plus(estimatedFees),
42
63
  };
43
- }
64
+ };
65
+ const calculateTokenAmount = async ({ account, tokenAccount, transaction, }) => {
66
+ const amount = transaction.useAllAmount
67
+ ? await (0, estimateMaxSpendable_1.estimateMaxSpendable)({ account: tokenAccount, parentAccount: account, transaction })
68
+ : transaction.amount;
69
+ return {
70
+ amount,
71
+ totalSpent: amount,
72
+ };
73
+ };
74
+ const calculateAmount = ({ account, transaction, }) => {
75
+ const subAccount = (0, account_1.findSubAccountById)(account, transaction?.subAccountId || "");
76
+ const isTokenTransaction = (0, account_1.isTokenAccount)(subAccount);
77
+ if (isTokenTransaction) {
78
+ return calculateTokenAmount({ account, tokenAccount: subAccount, transaction });
79
+ }
80
+ const operationType = (0, logic_1.isTokenAssociateTransaction)(transaction)
81
+ ? constants_1.HEDERA_OPERATION_TYPES.TokenAssociate
82
+ : constants_1.HEDERA_OPERATION_TYPES.CryptoTransfer;
83
+ return calculateCoinAmount({ account, transaction, operationType });
84
+ };
44
85
  exports.calculateAmount = calculateAmount;
45
86
  // NOTE: convert from the non-url-safe version of base64 to the url-safe version (that the explorer uses)
46
87
  function base64ToUrlSafeBase64(data) {
@@ -50,6 +91,239 @@ function base64ToUrlSafeBase64(data) {
50
91
  return data.replace(/\//g, "_").replace(/\+/g, "-");
51
92
  }
52
93
  exports.base64ToUrlSafeBase64 = base64ToUrlSafeBase64;
94
+ const simpleSyncHashMemoize = {};
95
+ const getSyncHash = (currency, blacklistedTokenIds = []) => {
96
+ const tokens = (0, cryptoassets_1.listTokensForCryptoCurrency)(currency);
97
+ const stringToHash = currency.id +
98
+ tokens.map(token => token.id + token.contractAddress + token.name + token.ticker).join("") +
99
+ blacklistedTokenIds.join("");
100
+ if (!simpleSyncHashMemoize[stringToHash]) {
101
+ simpleSyncHashMemoize[stringToHash] = `0x${(0, imurmurhash_1.default)(stringToHash).result().toString(16)}`;
102
+ }
103
+ return simpleSyncHashMemoize[stringToHash];
104
+ };
105
+ exports.getSyncHash = getSyncHash;
106
+ const getSubAccounts = async (accountId, lastTokenOperations, mirrorTokens) => {
107
+ // Creating a Map of Operations by TokenCurrencies in order to know which TokenAccounts should be synced as well
108
+ const operationsByToken = lastTokenOperations.reduce((acc, tokenOperation) => {
109
+ const { token } = (0, account_1.decodeTokenAccountId)(tokenOperation.accountId);
110
+ if (!token)
111
+ return acc;
112
+ const isTokenListedInCAL = (0, cryptoassets_1.findTokenByAddressInCurrency)(token.contractAddress, token.parentCurrency.id);
113
+ if (!isTokenListedInCAL)
114
+ return acc;
115
+ if (!acc.has(token)) {
116
+ acc.set(token, []);
117
+ }
118
+ acc.get(token)?.push(tokenOperation);
119
+ return acc;
120
+ }, new Map());
121
+ const subAccounts = [];
122
+ // extract token accounts from existing operations
123
+ for (const [token, tokenOperations] of operationsByToken.entries()) {
124
+ const parentAccountId = accountId;
125
+ const rawBalance = mirrorTokens.find(t => t.token_id === token.contractAddress)?.balance;
126
+ const balance = rawBalance !== undefined ? new bignumber_js_1.default(rawBalance) : null;
127
+ if (!balance) {
128
+ continue;
129
+ }
130
+ subAccounts.push({
131
+ type: "TokenAccount",
132
+ id: (0, account_1.encodeTokenAccountId)(parentAccountId, token),
133
+ parentId: parentAccountId,
134
+ token,
135
+ balance,
136
+ spendableBalance: balance,
137
+ creationDate: tokenOperations.length > 0 ? tokenOperations[tokenOperations.length - 1].date : new Date(),
138
+ operations: tokenOperations,
139
+ operationsCount: tokenOperations.length,
140
+ pendingOperations: [],
141
+ balanceHistoryCache: account_1.emptyHistoryCache,
142
+ swapHistory: [],
143
+ });
144
+ }
145
+ // extract token accounts existing in the account's balance, but with no recorded operations yet
146
+ // e.g. tokens added via association flow, without any subsequent activity
147
+ for (const rawToken of mirrorTokens) {
148
+ const parentAccountId = accountId;
149
+ const rawBalance = rawToken.balance;
150
+ const balance = new bignumber_js_1.default(rawBalance);
151
+ const token = (0, cryptoassets_1.findTokenByAddressInCurrency)(rawToken.token_id, "hedera");
152
+ if (!token) {
153
+ continue;
154
+ }
155
+ const id = (0, account_1.encodeTokenAccountId)(parentAccountId, token);
156
+ if (subAccounts.some(a => a.id === id)) {
157
+ continue;
158
+ }
159
+ subAccounts.push({
160
+ type: "TokenAccount",
161
+ id: (0, account_1.encodeTokenAccountId)(parentAccountId, token),
162
+ parentId: parentAccountId,
163
+ token,
164
+ balance,
165
+ spendableBalance: balance,
166
+ creationDate: new Date(parseFloat(rawToken.created_timestamp) * 1000),
167
+ operations: [],
168
+ operationsCount: 0,
169
+ pendingOperations: [],
170
+ balanceHistoryCache: account_1.emptyHistoryCache,
171
+ swapHistory: [],
172
+ });
173
+ }
174
+ return subAccounts;
175
+ };
176
+ exports.getSubAccounts = getSubAccounts;
177
+ // create NONE coin operation that will be a parent of an orphan child operation
178
+ const makeCoinOperationForOrphanChildOperation = (childOperation) => {
179
+ const type = "NONE";
180
+ const { accountId } = (0, account_1.decodeTokenAccountId)(childOperation.accountId);
181
+ const id = (0, operation_1.encodeOperationId)(accountId, childOperation.hash, type);
182
+ return {
183
+ id,
184
+ hash: childOperation.hash,
185
+ type,
186
+ value: new bignumber_js_1.default(0),
187
+ fee: new bignumber_js_1.default(0),
188
+ senders: [],
189
+ recipients: [],
190
+ blockHeight: childOperation.blockHeight,
191
+ blockHash: childOperation.blockHash,
192
+ transactionSequenceNumber: childOperation.transactionSequenceNumber,
193
+ subOperations: [],
194
+ nftOperations: [],
195
+ internalOperations: [],
196
+ accountId: "",
197
+ date: childOperation.date,
198
+ extra: {},
199
+ };
200
+ };
201
+ // this util handles:
202
+ // - linking sub operations with coin operations, e.g. token transfer with fee payment
203
+ // - if possible, assigning `extra.associatedTokenId = mirrorToken.tokenId` based on operation's consensus timestamp
204
+ const prepareOperations = (coinOperations, tokenOperations, mirrorTokens) => {
205
+ const preparedCoinOperations = coinOperations.map(op => ({ ...op }));
206
+ const preparedTokenOperations = tokenOperations.map(op => ({ ...op }));
207
+ // loop through coin operations to:
208
+ // - enrich ASSOCIATE_TOKEN operations with extra.associatedTokenId
209
+ // - prepare a map of hash => operations
210
+ const coinOperationsByHash = {};
211
+ preparedCoinOperations.forEach(op => {
212
+ const extra = (0, logic_1.isValidExtra)(op.extra) ? op.extra : null;
213
+ if (op.type === "ASSOCIATE_TOKEN" && extra?.consensusTimestamp) {
214
+ const relatedMirrorToken = mirrorTokens.find(t => {
215
+ return t.created_timestamp === extra.consensusTimestamp;
216
+ });
217
+ if (relatedMirrorToken) {
218
+ op.extra = {
219
+ ...extra,
220
+ associatedTokenId: relatedMirrorToken.token_id,
221
+ };
222
+ }
223
+ }
224
+ if (!coinOperationsByHash[op.hash]) {
225
+ coinOperationsByHash[op.hash] = [];
226
+ }
227
+ op.subOperations = [];
228
+ coinOperationsByHash[op.hash].push(op);
229
+ });
230
+ // loop through token operations to potentially copy them as a child operation of a coin operation
231
+ for (const tokenOperation of preparedTokenOperations) {
232
+ const { token } = (0, account_1.decodeTokenAccountId)(tokenOperation.accountId);
233
+ if (!token)
234
+ continue;
235
+ let mainOperations = coinOperationsByHash[tokenOperation.hash];
236
+ if (!mainOperations?.length) {
237
+ const noneOperation = makeCoinOperationForOrphanChildOperation(tokenOperation);
238
+ mainOperations = [noneOperation];
239
+ preparedCoinOperations.push(noneOperation);
240
+ }
241
+ // ugly loop in loop but in theory, this can only be a 2 elements array maximum in the case of a self send
242
+ for (const mainOperation of mainOperations) {
243
+ mainOperation.subOperations.push(tokenOperation);
244
+ }
245
+ }
246
+ return preparedCoinOperations;
247
+ };
248
+ exports.prepareOperations = prepareOperations;
249
+ /**
250
+ * List of properties of a sub account that can be updated when 2 "identical" accounts are found
251
+ */
252
+ const updatableSubAccountProperties = [
253
+ { name: "balance", isOps: false },
254
+ { name: "spendableBalance", isOps: false },
255
+ { name: "balanceHistoryCache", isOps: false },
256
+ { name: "operations", isOps: true },
257
+ { name: "pendingOperations", isOps: true },
258
+ ];
259
+ /**
260
+ * In charge of smartly merging sub accounts while maintaining references as much as possible
261
+ */
262
+ const mergeSubAccounts = (initialAccount, newSubAccounts) => {
263
+ const oldSubAccounts = initialAccount?.subAccounts;
264
+ if (!oldSubAccounts) {
265
+ return newSubAccounts;
266
+ }
267
+ // map of already existing sub accounts by id
268
+ const oldSubAccountsById = {};
269
+ for (const oldSubAccount of oldSubAccounts) {
270
+ oldSubAccountsById[oldSubAccount.id] = oldSubAccount;
271
+ }
272
+ // looping through new sub accounts to compare them with already existing ones
273
+ // already existing will be updated if necessary (see `updatableSubAccountProperties`)
274
+ // new sub accounts will be added/pushed after already existing
275
+ const newSubAccountsToAdd = [];
276
+ for (const newSubAccount of newSubAccounts) {
277
+ const duplicatedAccount = oldSubAccountsById[newSubAccount.id];
278
+ if (!duplicatedAccount) {
279
+ newSubAccountsToAdd.push(newSubAccount);
280
+ continue;
281
+ }
282
+ const updates = {};
283
+ for (const { name, isOps } of updatableSubAccountProperties) {
284
+ if (!isOps) {
285
+ if (newSubAccount[name] !== duplicatedAccount[name]) {
286
+ // @ts-expect-error - TypeScript assumes all possible types could be assigned here
287
+ updates[name] = newSubAccount[name];
288
+ }
289
+ }
290
+ else {
291
+ updates[name] = (0, jsHelpers_1.mergeOps)(duplicatedAccount[name], newSubAccount[name]);
292
+ }
293
+ }
294
+ // update the operationsCount in case the mergeOps changed it
295
+ updates.operationsCount =
296
+ updates.operations?.length || duplicatedAccount?.operations?.length || 0;
297
+ // modify the map with the updated sub account with a new ref
298
+ oldSubAccountsById[newSubAccount.id] = {
299
+ ...duplicatedAccount,
300
+ ...updates,
301
+ };
302
+ }
303
+ const updatedSubAccounts = Object.values(oldSubAccountsById);
304
+ return [...updatedSubAccounts, ...newSubAccountsToAdd];
305
+ };
306
+ exports.mergeSubAccounts = mergeSubAccounts;
307
+ const applyPendingExtras = (existing, pending) => {
308
+ const pendingOperationsByHash = new Map(pending.map(op => [op.hash, op]));
309
+ return existing.map(op => {
310
+ const pendingOp = pendingOperationsByHash.get(op.hash);
311
+ if (!pendingOp)
312
+ return op;
313
+ if (!(0, logic_1.isValidExtra)(op.extra))
314
+ return op;
315
+ if (!(0, logic_1.isValidExtra)(pendingOp.extra))
316
+ return op;
317
+ return {
318
+ ...op,
319
+ extra: {
320
+ ...pendingOp.extra,
321
+ ...op.extra,
322
+ },
323
+ };
324
+ });
325
+ };
326
+ exports.applyPendingExtras = applyPendingExtras;
53
327
  function patchOperationWithExtra(operation, extra) {
54
328
  return {
55
329
  ...operation,
@@ -59,4 +333,15 @@ function patchOperationWithExtra(operation, extra) {
59
333
  };
60
334
  }
61
335
  exports.patchOperationWithExtra = patchOperationWithExtra;
336
+ exports.checkAccountTokenAssociationStatus = (0, cache_1.makeLRUCache)(async (accountId, tokenId) => {
337
+ const mirrorAccount = await (0, mirror_1.getAccount)(accountId);
338
+ // auto association is enabled
339
+ if (mirrorAccount.max_automatic_token_associations === -1) {
340
+ return true;
341
+ }
342
+ const isTokenAssociated = mirrorAccount.balance.tokens.some(token => {
343
+ return token.token_id === tokenId;
344
+ });
345
+ return isTokenAssociated;
346
+ }, (accountId, tokenId) => `${accountId}-${tokenId}`, (0, cache_1.seconds)(30));
62
347
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/bridge/utils.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAqC;AAErC,mFAA4D;AAC5D,yDAAiE;AACjE,iEAA8D;AAGjD,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAEjC,KAAK,UAAU,gBAAgB,CAAC,OAAgB;IACrD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,eAAM,CAAC,WAAW,CAAC;YACpC;gBACE,IAAI,EAAE,OAAO,CAAC,QAAQ;gBACtB,EAAE,EAAE,IAAA,sCAAuB,EAAC,KAAK,CAAC;gBAClC,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB;SACF,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACZ,OAAO,IAAI,sBAAS,CAAC,KAAK,CAAC;iBACxB,SAAS,CAAC,IAAI,sBAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;iBACjC,YAAY,CAAC,sBAAS,CAAC,UAAU,CAAC;iBAClC,YAAY,CAAC,8BAAsB,CAAC,CAAC;QAC1C,CAAC;QACD,oCAAoC;IACtC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,sDAAsD;IACtD,oEAAoE;IACpE,OAAO,IAAI,sBAAS,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,8BAAsB,CAAC,CAAC,CAAC,gCAAgC;AACvG,CAAC;AAtBD,4CAsBC;AAEM,KAAK,UAAU,eAAe,CAAC,EACpC,OAAO,EACP,WAAW,GAIZ;IAIC,MAAM,MAAM,GAAG,WAAW,CAAC,YAAY;QACrC,CAAC,CAAC,MAAM,IAAA,2CAAoB,EAAC,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;AAlBD,0CAkBC;AAED,yGAAyG;AACzG,SAAgB,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;AAND,sDAMC;AAED,SAAgB,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;AAVD,0DAUC"}
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,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BASE_USD_FEE_BY_OPERATION_TYPE = exports.HEDERA_OPERATION_TYPES = exports.HEDERA_TRANSACTION_KINDS = void 0;
4
+ /**
5
+ * Internal types used to distinguish custom Hedera transaction behaviors.
6
+ * These can be stored in transaction.properties.name and used to route specific preparation logic.
7
+ */
8
+ exports.HEDERA_TRANSACTION_KINDS = {
9
+ TokenAssociate: {
10
+ name: "tokenAssociate",
11
+ },
12
+ };
13
+ /**
14
+ * Enum representing the supported Hedera operation types for fee estimation
15
+ */
16
+ var HEDERA_OPERATION_TYPES;
17
+ (function (HEDERA_OPERATION_TYPES) {
18
+ HEDERA_OPERATION_TYPES["CryptoTransfer"] = "CryptoTransfer";
19
+ HEDERA_OPERATION_TYPES["TokenTransfer"] = "TokenTransfer";
20
+ HEDERA_OPERATION_TYPES["TokenAssociate"] = "TokenAssociate";
21
+ })(HEDERA_OPERATION_TYPES || (exports.HEDERA_OPERATION_TYPES = HEDERA_OPERATION_TYPES = {}));
22
+ const TINYBAR_SCALE = 8;
23
+ /**
24
+ * https://docs.hedera.com/hedera/networks/mainnet/fees
25
+ *
26
+ * These are Hedera's estimated fee costs in USD, scaled to tinybars (1 HBAR = 10^8 tinybars),
27
+ * so they can be converted into actual HBAR amounts based on current USD/crypto rates.
28
+ *
29
+ * Used in fee estimation logic (getEstimatedFees function) to determine whether an account
30
+ * has sufficient balance to cover the cost of a transaction (e.g. token association).
31
+ */
32
+ exports.BASE_USD_FEE_BY_OPERATION_TYPE = {
33
+ [HEDERA_OPERATION_TYPES.CryptoTransfer]: 0.0001 * 10 ** TINYBAR_SCALE,
34
+ [HEDERA_OPERATION_TYPES.TokenTransfer]: 0.001 * 10 ** TINYBAR_SCALE,
35
+ [HEDERA_OPERATION_TYPES.TokenAssociate]: 0.05 * 10 ** TINYBAR_SCALE,
36
+ };
37
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACU,QAAA,wBAAwB,GAAG;IACtC,cAAc,EAAE;QACd,IAAI,EAAE,gBAAgB;KACvB;CAC4E,CAAC;AAEhF;;GAEG;AACH,IAAY,sBAIX;AAJD,WAAY,sBAAsB;IAChC,2DAAiC,CAAA;IACjC,yDAA+B,CAAA;IAC/B,2DAAiC,CAAA;AACnC,CAAC,EAJW,sBAAsB,sCAAtB,sBAAsB,QAIjC;AAED,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB;;;;;;;;GAQG;AACU,QAAA,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;AAE1H,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
+ {"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,25 +1,27 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ const logic_1 = require("./logic");
3
4
  function getDeviceTransactionConfig({ transaction, status: { estimatedFees }, }) {
4
5
  const fields = [];
5
- if (transaction.useAllAmount) {
6
- fields.push({
7
- type: "text",
8
- label: "Method",
9
- value: "Transfer All",
10
- });
11
- }
12
- else {
6
+ const method = (() => {
7
+ if ((0, logic_1.isTokenAssociateTransaction)(transaction))
8
+ return "Associate Token";
9
+ else if (transaction.useAllAmount)
10
+ return "Transfer All";
11
+ else
12
+ return "Transfer";
13
+ })();
14
+ fields.push({
15
+ type: "text",
16
+ label: "Method",
17
+ value: method,
18
+ });
19
+ if (!(0, logic_1.isTokenAssociateTransaction)(transaction)) {
13
20
  fields.push({
14
- type: "text",
15
- label: "Method",
16
- value: "Transfer",
21
+ type: "amount",
22
+ label: "Amount",
17
23
  });
18
24
  }
19
- fields.push({
20
- type: "amount",
21
- label: "Amount",
22
- });
23
25
  if (!estimatedFees.isZero()) {
24
26
  fields.push({
25
27
  type: "fees",
@@ -1 +1 @@
1
- {"version":3,"file":"deviceTransactionConfig.js","sourceRoot":"","sources":["../src/deviceTransactionConfig.ts"],"names":[],"mappings":";;AAIA,SAAS,0BAA0B,CAAC,EAClC,WAAW,EACX,MAAM,EAAE,EAAE,aAAa,EAAE,GAM1B;IACC,MAAM,MAAM,GAAkC,EAAE,CAAC;IAEjD,IAAI,WAAW,CAAC,YAAY,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,cAAc;SACtB,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,UAAU;SAClB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;IAEH,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,kBAAe,0BAA0B,CAAC"}
1
+ {"version":3,"file":"deviceTransactionConfig.js","sourceRoot":"","sources":["../src/deviceTransactionConfig.ts"],"names":[],"mappings":";;AAGA,mCAAsD;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,IAAA,mCAA2B,EAAC,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,IAAA,mCAA2B,EAAC,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,kBAAe,0BAA0B,CAAC"}
package/lib/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
- export { getTransactionExplorer };
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
@@ -1 +1 @@
1
- {"version":3,"file":"logic.d.ts","sourceRoot":"","sources":["../src/logic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAIjD,QAAA,MAAM,sBAAsB,iBACZ,YAAY,GAAG,IAAI,GAAG,SAAS,aAClC,SAAS,KACnB,MAAM,GAAG,SAIX,CAAC;AAEF,OAAO,EAAE,sBAAsB,EAAE,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/logic.js CHANGED
@@ -1,9 +1,37 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getTransactionExplorer = void 0;
3
+ exports.isAutoTokenAssociationEnabled = exports.isTokenAssociationRequired = exports.isTokenAssociateTransaction = exports.isValidExtra = exports.getTransactionExplorer = exports.sendRecipientCanNext = void 0;
4
+ const constants_1 = require("./constants");
4
5
  const getTransactionExplorer = (explorerView, operation) => {
5
- const extra = operation.extra;
6
- return explorerView?.tx?.replace("$hash", extra.consensusTimestamp ?? extra.transactionId ?? "0");
6
+ const extra = isValidExtra(operation.extra) ? operation.extra : null;
7
+ return explorerView?.tx?.replace("$hash", extra?.consensusTimestamp ?? extra?.transactionId ?? "0");
7
8
  };
8
9
  exports.getTransactionExplorer = getTransactionExplorer;
10
+ const isTokenAssociateTransaction = (tx) => {
11
+ return tx.properties?.name === constants_1.HEDERA_TRANSACTION_KINDS.TokenAssociate.name;
12
+ };
13
+ exports.isTokenAssociateTransaction = isTokenAssociateTransaction;
14
+ const isAutoTokenAssociationEnabled = (account) => {
15
+ const hederaAccount = "hederaResources" in account ? account : null;
16
+ return hederaAccount?.hederaResources?.isAutoTokenAssociationEnabled ?? false;
17
+ };
18
+ exports.isAutoTokenAssociationEnabled = isAutoTokenAssociationEnabled;
19
+ const isTokenAssociationRequired = (account, token) => {
20
+ const subAccounts = !!account && "subAccounts" in account ? account.subAccounts ?? [] : [];
21
+ const isTokenAssociated = subAccounts.some(item => item.token.id === token?.id);
22
+ return !!token && !isTokenAssociated && !isAutoTokenAssociationEnabled(account);
23
+ };
24
+ exports.isTokenAssociationRequired = isTokenAssociationRequired;
25
+ const isValidExtra = (extra) => {
26
+ return !!extra && typeof extra === "object" && !Array.isArray(extra);
27
+ };
28
+ exports.isValidExtra = isValidExtra;
29
+ // disables the "Continue" button in the Send modal's Recipient step during token transfers if:
30
+ // - the recipient is not associated with the token
31
+ // - the association status can't be verified
32
+ const sendRecipientCanNext = (status) => {
33
+ const { missingAssociation, unverifiedAssociation } = status.warnings;
34
+ return !missingAssociation && !unverifiedAssociation;
35
+ };
36
+ exports.sendRecipientCanNext = sendRecipientCanNext;
9
37
  //# sourceMappingURL=logic.js.map
package/lib/logic.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"logic.js","sourceRoot":"","sources":["../src/logic.ts"],"names":[],"mappings":";;;AAKA,MAAM,sBAAsB,GAAG,CAC7B,YAA6C,EAC7C,SAAoB,EACA,EAAE;IACtB,MAAM,KAAK,GAAG,SAAS,CAAC,KAA6B,CAAC;IAEtD,OAAO,YAAY,EAAE,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,kBAAkB,IAAI,KAAK,CAAC,aAAa,IAAI,GAAG,CAAC,CAAC;AACpG,CAAC,CAAC;AAEO,wDAAsB"}
1
+ {"version":3,"file":"logic.js","sourceRoot":"","sources":["../src/logic.ts"],"names":[],"mappings":";;;AAEA,2CAAuD;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;AAuCA,wDAAsB;AArCxB,MAAM,2BAA2B,GAAG,CAClC,EAAe,EACiE,EAAE;IAClF,OAAO,EAAE,CAAC,UAAU,EAAE,IAAI,KAAK,oCAAwB,CAAC,cAAc,CAAC,IAAI,CAAC;AAC9E,CAAC,CAAC;AAmCA,kEAA2B;AAjC7B,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;AA+BA,sEAA6B;AA7B/B,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;AAoBA,gEAA0B;AAlB5B,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;AAcA,oCAAY;AAZd,+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;AAGA,oDAAoB"}