@ledgerhq/coin-hedera 1.15.0-nightly.20251126023856 → 1.15.0-nightly.20251126160702

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 (280) hide show
  1. package/CHANGELOG.md +10 -8
  2. package/lib/api/index.d.ts.map +1 -1
  3. package/lib/api/index.js +6 -2
  4. package/lib/api/index.js.map +1 -1
  5. package/lib/bridge/broadcast.js +1 -1
  6. package/lib/bridge/broadcast.js.map +1 -1
  7. package/lib/bridge/buildOptimisticOperation.d.ts.map +1 -1
  8. package/lib/bridge/buildOptimisticOperation.js +80 -15
  9. package/lib/bridge/buildOptimisticOperation.js.map +1 -1
  10. package/lib/bridge/estimateMaxSpendable.js +5 -2
  11. package/lib/bridge/estimateMaxSpendable.js.map +1 -1
  12. package/lib/bridge/getTransactionStatus.d.ts.map +1 -1
  13. package/lib/bridge/getTransactionStatus.js +70 -13
  14. package/lib/bridge/getTransactionStatus.js.map +1 -1
  15. package/lib/bridge/index.js +1 -1
  16. package/lib/bridge/index.js.map +1 -1
  17. package/lib/bridge/prepareTransaction.d.ts.map +1 -1
  18. package/lib/bridge/prepareTransaction.js +40 -7
  19. package/lib/bridge/prepareTransaction.js.map +1 -1
  20. package/lib/bridge/signOperation.d.ts.map +1 -1
  21. package/lib/bridge/signOperation.js +19 -2
  22. package/lib/bridge/signOperation.js.map +1 -1
  23. package/lib/bridge/synchronisation.d.ts +2 -0
  24. package/lib/bridge/synchronisation.d.ts.map +1 -1
  25. package/lib/bridge/synchronisation.js +101 -30
  26. package/lib/bridge/synchronisation.js.map +1 -1
  27. package/lib/bridge/utils.d.ts +35 -2
  28. package/lib/bridge/utils.d.ts.map +1 -1
  29. package/lib/bridge/utils.js +215 -16
  30. package/lib/bridge/utils.js.map +1 -1
  31. package/lib/constants.d.ts +22 -2
  32. package/lib/constants.d.ts.map +1 -1
  33. package/lib/constants.js +42 -2
  34. package/lib/constants.js.map +1 -1
  35. package/lib/deviceTransactionConfig.d.ts +1 -1
  36. package/lib/deviceTransactionConfig.d.ts.map +1 -1
  37. package/lib/deviceTransactionConfig.js +8 -0
  38. package/lib/deviceTransactionConfig.js.map +1 -1
  39. package/lib/errors.d.ts +3 -0
  40. package/lib/errors.d.ts.map +1 -1
  41. package/lib/errors.js +2 -1
  42. package/lib/errors.js.map +1 -1
  43. package/lib/logic/craftTransaction.d.ts +4 -4
  44. package/lib/logic/craftTransaction.d.ts.map +1 -1
  45. package/lib/logic/craftTransaction.js +46 -5
  46. package/lib/logic/craftTransaction.js.map +1 -1
  47. package/lib/logic/estimateFees.d.ts +2 -4
  48. package/lib/logic/estimateFees.d.ts.map +1 -1
  49. package/lib/logic/estimateFees.js +45 -5
  50. package/lib/logic/estimateFees.js.map +1 -1
  51. package/lib/logic/listOperations.d.ts.map +1 -1
  52. package/lib/logic/listOperations.js +7 -3
  53. package/lib/logic/listOperations.js.map +1 -1
  54. package/lib/logic/utils.d.ts +24 -2
  55. package/lib/logic/utils.d.ts.map +1 -1
  56. package/lib/logic/utils.js +66 -13
  57. package/lib/logic/utils.js.map +1 -1
  58. package/lib/network/api.d.ts +12 -1
  59. package/lib/network/api.d.ts.map +1 -1
  60. package/lib/network/api.js +91 -19
  61. package/lib/network/api.js.map +1 -1
  62. package/lib/network/rpc.d.ts.map +1 -1
  63. package/lib/network/rpc.js +1 -0
  64. package/lib/network/rpc.js.map +1 -1
  65. package/lib/network/thirdweb.d.ts +21 -0
  66. package/lib/network/thirdweb.d.ts.map +1 -0
  67. package/lib/network/thirdweb.js +72 -0
  68. package/lib/network/thirdweb.js.map +1 -0
  69. package/lib/network/utils.d.ts +4 -1
  70. package/lib/network/utils.d.ts.map +1 -1
  71. package/lib/network/utils.js +53 -1
  72. package/lib/network/utils.js.map +1 -1
  73. package/lib/test/bridgeDatasetTest.d.ts.map +1 -1
  74. package/lib/test/bridgeDatasetTest.js +4 -4
  75. package/lib/test/bridgeDatasetTest.js.map +1 -1
  76. package/lib/test/fixtures/account.fixture.js +1 -1
  77. package/lib/test/fixtures/account.fixture.js.map +1 -1
  78. package/lib/test/fixtures/common.fixture.d.ts +12 -0
  79. package/lib/test/fixtures/common.fixture.d.ts.map +1 -0
  80. package/lib/test/fixtures/common.fixture.js +66 -0
  81. package/lib/test/fixtures/common.fixture.js.map +1 -0
  82. package/lib/test/fixtures/currency.fixture.d.ts +3 -1
  83. package/lib/test/fixtures/currency.fixture.d.ts.map +1 -1
  84. package/lib/test/fixtures/currency.fixture.js +63 -16
  85. package/lib/test/fixtures/currency.fixture.js.map +1 -1
  86. package/lib/test/fixtures/mirror.fixture.d.ts +3 -1
  87. package/lib/test/fixtures/mirror.fixture.d.ts.map +1 -1
  88. package/lib/test/fixtures/mirror.fixture.js +12 -1
  89. package/lib/test/fixtures/mirror.fixture.js.map +1 -1
  90. package/lib/test/fixtures/thirdweb.fixture.d.ts +3 -0
  91. package/lib/test/fixtures/thirdweb.fixture.d.ts.map +1 -0
  92. package/lib/test/fixtures/thirdweb.fixture.js +34 -0
  93. package/lib/test/fixtures/thirdweb.fixture.js.map +1 -0
  94. package/lib/transaction.d.ts.map +1 -1
  95. package/lib/transaction.js +2 -0
  96. package/lib/transaction.js.map +1 -1
  97. package/lib/types/alpaca.d.ts +5 -1
  98. package/lib/types/alpaca.d.ts.map +1 -1
  99. package/lib/types/bridge.d.ts +6 -1
  100. package/lib/types/bridge.d.ts.map +1 -1
  101. package/lib/types/index.d.ts +2 -0
  102. package/lib/types/index.d.ts.map +1 -1
  103. package/lib/types/index.js +2 -0
  104. package/lib/types/index.js.map +1 -1
  105. package/lib/types/logic.d.ts +39 -0
  106. package/lib/types/logic.d.ts.map +1 -0
  107. package/lib/types/logic.js +3 -0
  108. package/lib/types/logic.js.map +1 -0
  109. package/lib/types/mirror.d.ts +29 -0
  110. package/lib/types/mirror.d.ts.map +1 -1
  111. package/lib/types/thirdweb.d.ts +34 -0
  112. package/lib/types/thirdweb.d.ts.map +1 -0
  113. package/lib/types/thirdweb.js +3 -0
  114. package/lib/types/thirdweb.js.map +1 -0
  115. package/lib-es/api/index.d.ts.map +1 -1
  116. package/lib-es/api/index.js +7 -3
  117. package/lib-es/api/index.js.map +1 -1
  118. package/lib-es/bridge/broadcast.js +2 -2
  119. package/lib-es/bridge/broadcast.js.map +1 -1
  120. package/lib-es/bridge/buildOptimisticOperation.d.ts.map +1 -1
  121. package/lib-es/bridge/buildOptimisticOperation.js +83 -18
  122. package/lib-es/bridge/buildOptimisticOperation.js.map +1 -1
  123. package/lib-es/bridge/estimateMaxSpendable.js +5 -2
  124. package/lib-es/bridge/estimateMaxSpendable.js.map +1 -1
  125. package/lib-es/bridge/getTransactionStatus.d.ts.map +1 -1
  126. package/lib-es/bridge/getTransactionStatus.js +73 -16
  127. package/lib-es/bridge/getTransactionStatus.js.map +1 -1
  128. package/lib-es/bridge/index.js +2 -2
  129. package/lib-es/bridge/index.js.map +1 -1
  130. package/lib-es/bridge/prepareTransaction.d.ts.map +1 -1
  131. package/lib-es/bridge/prepareTransaction.js +42 -9
  132. package/lib-es/bridge/prepareTransaction.js.map +1 -1
  133. package/lib-es/bridge/signOperation.d.ts.map +1 -1
  134. package/lib-es/bridge/signOperation.js +21 -4
  135. package/lib-es/bridge/signOperation.js.map +1 -1
  136. package/lib-es/bridge/synchronisation.d.ts +2 -0
  137. package/lib-es/bridge/synchronisation.d.ts.map +1 -1
  138. package/lib-es/bridge/synchronisation.js +97 -27
  139. package/lib-es/bridge/synchronisation.js.map +1 -1
  140. package/lib-es/bridge/utils.d.ts +35 -2
  141. package/lib-es/bridge/utils.d.ts.map +1 -1
  142. package/lib-es/bridge/utils.js +211 -16
  143. package/lib-es/bridge/utils.js.map +1 -1
  144. package/lib-es/constants.d.ts +22 -2
  145. package/lib-es/constants.d.ts.map +1 -1
  146. package/lib-es/constants.js +38 -1
  147. package/lib-es/constants.js.map +1 -1
  148. package/lib-es/deviceTransactionConfig.d.ts +1 -1
  149. package/lib-es/deviceTransactionConfig.d.ts.map +1 -1
  150. package/lib-es/deviceTransactionConfig.js +8 -0
  151. package/lib-es/deviceTransactionConfig.js.map +1 -1
  152. package/lib-es/errors.d.ts +3 -0
  153. package/lib-es/errors.d.ts.map +1 -1
  154. package/lib-es/errors.js +1 -0
  155. package/lib-es/errors.js.map +1 -1
  156. package/lib-es/logic/craftTransaction.d.ts +4 -4
  157. package/lib-es/logic/craftTransaction.d.ts.map +1 -1
  158. package/lib-es/logic/craftTransaction.js +48 -7
  159. package/lib-es/logic/craftTransaction.js.map +1 -1
  160. package/lib-es/logic/estimateFees.d.ts +2 -4
  161. package/lib-es/logic/estimateFees.d.ts.map +1 -1
  162. package/lib-es/logic/estimateFees.js +47 -7
  163. package/lib-es/logic/estimateFees.js.map +1 -1
  164. package/lib-es/logic/listOperations.d.ts.map +1 -1
  165. package/lib-es/logic/listOperations.js +7 -3
  166. package/lib-es/logic/listOperations.js.map +1 -1
  167. package/lib-es/logic/utils.d.ts +24 -2
  168. package/lib-es/logic/utils.d.ts.map +1 -1
  169. package/lib-es/logic/utils.js +63 -13
  170. package/lib-es/logic/utils.js.map +1 -1
  171. package/lib-es/network/api.d.ts +12 -1
  172. package/lib-es/network/api.d.ts.map +1 -1
  173. package/lib-es/network/api.js +91 -19
  174. package/lib-es/network/api.js.map +1 -1
  175. package/lib-es/network/rpc.d.ts.map +1 -1
  176. package/lib-es/network/rpc.js +1 -0
  177. package/lib-es/network/rpc.js.map +1 -1
  178. package/lib-es/network/thirdweb.d.ts +21 -0
  179. package/lib-es/network/thirdweb.d.ts.map +1 -0
  180. package/lib-es/network/thirdweb.js +66 -0
  181. package/lib-es/network/thirdweb.js.map +1 -0
  182. package/lib-es/network/utils.d.ts +4 -1
  183. package/lib-es/network/utils.d.ts.map +1 -1
  184. package/lib-es/network/utils.js +49 -0
  185. package/lib-es/network/utils.js.map +1 -1
  186. package/lib-es/test/bridgeDatasetTest.d.ts.map +1 -1
  187. package/lib-es/test/bridgeDatasetTest.js +4 -4
  188. package/lib-es/test/bridgeDatasetTest.js.map +1 -1
  189. package/lib-es/test/fixtures/account.fixture.js +2 -2
  190. package/lib-es/test/fixtures/account.fixture.js.map +1 -1
  191. package/lib-es/test/fixtures/common.fixture.d.ts +12 -0
  192. package/lib-es/test/fixtures/common.fixture.d.ts.map +1 -0
  193. package/lib-es/test/fixtures/common.fixture.js +57 -0
  194. package/lib-es/test/fixtures/common.fixture.js.map +1 -0
  195. package/lib-es/test/fixtures/currency.fixture.d.ts +3 -1
  196. package/lib-es/test/fixtures/currency.fixture.d.ts.map +1 -1
  197. package/lib-es/test/fixtures/currency.fixture.js +59 -14
  198. package/lib-es/test/fixtures/currency.fixture.js.map +1 -1
  199. package/lib-es/test/fixtures/mirror.fixture.d.ts +3 -1
  200. package/lib-es/test/fixtures/mirror.fixture.d.ts.map +1 -1
  201. package/lib-es/test/fixtures/mirror.fixture.js +9 -0
  202. package/lib-es/test/fixtures/mirror.fixture.js.map +1 -1
  203. package/lib-es/test/fixtures/thirdweb.fixture.d.ts +3 -0
  204. package/lib-es/test/fixtures/thirdweb.fixture.d.ts.map +1 -0
  205. package/lib-es/test/fixtures/thirdweb.fixture.js +30 -0
  206. package/lib-es/test/fixtures/thirdweb.fixture.js.map +1 -0
  207. package/lib-es/transaction.d.ts.map +1 -1
  208. package/lib-es/transaction.js +2 -0
  209. package/lib-es/transaction.js.map +1 -1
  210. package/lib-es/types/alpaca.d.ts +5 -1
  211. package/lib-es/types/alpaca.d.ts.map +1 -1
  212. package/lib-es/types/bridge.d.ts +6 -1
  213. package/lib-es/types/bridge.d.ts.map +1 -1
  214. package/lib-es/types/index.d.ts +2 -0
  215. package/lib-es/types/index.d.ts.map +1 -1
  216. package/lib-es/types/index.js +2 -0
  217. package/lib-es/types/index.js.map +1 -1
  218. package/lib-es/types/logic.d.ts +39 -0
  219. package/lib-es/types/logic.d.ts.map +1 -0
  220. package/lib-es/types/logic.js +2 -0
  221. package/lib-es/types/logic.js.map +1 -0
  222. package/lib-es/types/mirror.d.ts +29 -0
  223. package/lib-es/types/mirror.d.ts.map +1 -1
  224. package/lib-es/types/thirdweb.d.ts +34 -0
  225. package/lib-es/types/thirdweb.d.ts.map +1 -0
  226. package/lib-es/types/thirdweb.js +2 -0
  227. package/lib-es/types/thirdweb.js.map +1 -0
  228. package/package.json +9 -8
  229. package/src/api/index.integ.test.ts +11 -8
  230. package/src/api/index.ts +10 -3
  231. package/src/bridge/broadcast.ts +2 -2
  232. package/src/bridge/buildOptimisticOperation.integration.test.ts +70 -19
  233. package/src/bridge/buildOptimisticOperation.ts +98 -20
  234. package/src/bridge/estimateMaxSpendable.ts +5 -5
  235. package/src/bridge/getTransactionStatus.test.ts +57 -12
  236. package/src/bridge/getTransactionStatus.ts +88 -15
  237. package/src/bridge/index.ts +2 -2
  238. package/src/bridge/js-estimateMaxSpendable.integration.test.ts +12 -9
  239. package/src/bridge/prepareTransaction.test.ts +3 -1
  240. package/src/bridge/prepareTransaction.ts +45 -10
  241. package/src/bridge/signOperation.ts +23 -5
  242. package/src/bridge/synchronisation.test.ts +67 -0
  243. package/src/bridge/synchronisation.ts +114 -34
  244. package/src/bridge/utils.integration.test.ts +486 -180
  245. package/src/bridge/utils.test.ts +404 -0
  246. package/src/bridge/utils.ts +330 -27
  247. package/src/constants.ts +47 -2
  248. package/src/deviceTransactionConfig.ts +10 -1
  249. package/src/errors.ts +3 -0
  250. package/src/logic/craftTransaction.test.ts +49 -9
  251. package/src/logic/craftTransaction.ts +76 -11
  252. package/src/logic/estimateFees.test.ts +180 -31
  253. package/src/logic/estimateFees.ts +68 -7
  254. package/src/logic/getAssetFromToken.test.ts +2 -2
  255. package/src/logic/getBalance.test.ts +18 -57
  256. package/src/logic/getTokenFromAsset.test.ts +2 -2
  257. package/src/logic/listOperations.ts +9 -5
  258. package/src/logic/utils.test.ts +157 -69
  259. package/src/logic/utils.ts +75 -13
  260. package/src/network/api.test.ts +211 -3
  261. package/src/network/api.ts +118 -24
  262. package/src/network/rpc.test.ts +1 -0
  263. package/src/network/rpc.ts +1 -0
  264. package/src/network/thirdweb.test.ts +188 -0
  265. package/src/network/thirdweb.ts +101 -0
  266. package/src/network/utils.test.ts +364 -164
  267. package/src/network/utils.ts +83 -1
  268. package/src/test/bridgeDatasetTest.ts +4 -5
  269. package/src/test/fixtures/account.fixture.ts +2 -2
  270. package/src/test/fixtures/common.fixture.ts +74 -0
  271. package/src/test/fixtures/currency.fixture.ts +66 -14
  272. package/src/test/fixtures/mirror.fixture.ts +23 -1
  273. package/src/test/fixtures/thirdweb.fixture.ts +33 -0
  274. package/src/transaction.ts +2 -0
  275. package/src/types/alpaca.ts +8 -1
  276. package/src/types/bridge.ts +6 -1
  277. package/src/types/index.ts +2 -0
  278. package/src/types/logic.ts +44 -0
  279. package/src/types/mirror.ts +35 -0
  280. package/src/types/thirdweb.ts +36 -0
@@ -1 +1 @@
1
- {"version":3,"file":"synchronisation.d.ts","sourceRoot":"","sources":["../../src/bridge/synchronisation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACrB,MAAM,2CAA2C,CAAC;AAKnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAG9C,eAAO,MAAM,eAAe,EAAE,eAAe,CAAC,aAAa,CAuF1D,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,oBAqBhC,CAAC"}
1
+ {"version":3,"file":"synchronisation.d.ts","sourceRoot":"","sources":["../../src/bridge/synchronisation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACrB,MAAM,2CAA2C,CAAC;AAGnD,OAAO,KAAK,EAAE,OAAO,EAAa,MAAM,sBAAsB,CAAC;AAM/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAS9C,eAAO,MAAM,eAAe,EAAE,eAAe,CAAC,aAAa,CA0I1D,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,oBAqBhC,CAAC;AAGF,eAAO,MAAM,QAAQ,aAAc,OAAO,UAAU,OAAO,KAAG,OAgB7D,CAAC"}
@@ -3,12 +3,17 @@ import invariant from "invariant";
3
3
  import { getDerivationScheme, runDerivationScheme } from "@ledgerhq/coin-framework/derivation";
4
4
  import { mergeOps } from "@ledgerhq/coin-framework/bridge/jsHelpers";
5
5
  import { encodeAccountId, getSyncHash } from "@ledgerhq/coin-framework/account";
6
- import { listOperations } from "../logic/listOperations";
6
+ import { toEVMAddress } from "../logic/utils";
7
+ import { listOperations } from "../logic";
7
8
  import { apiClient } from "../network/api";
8
- import { getSubAccounts, prepareOperations, applyPendingExtras, mergeSubAccounts } from "./utils";
9
+ import { thirdwebClient } from "../network/thirdweb";
10
+ import { getERC20BalancesForAccount } from "../network/utils";
11
+ import { getSubAccounts, prepareOperations, applyPendingExtras, mergeSubAccounts, integrateERC20Operations, } from "./utils";
9
12
  export const getAccountShape = async (info, { blacklistedTokenIds }) => {
10
13
  const { currency, derivationMode, address, initialAccount } = info;
11
- invariant(address, "an hedera address is expected");
14
+ invariant(address, "hedera: address is expected");
15
+ const evmAddress = toEVMAddress(address);
16
+ invariant(evmAddress, "hedera: evm address is missing");
12
17
  const liveAccountId = encodeAccountId({
13
18
  type: "js",
14
19
  version: "2",
@@ -19,41 +24,90 @@ export const getAccountShape = async (info, { blacklistedTokenIds }) => {
19
24
  // get current account balance and tokens
20
25
  // tokens are fetched with separate requests to get "created_timestamp" for each token
21
26
  // based on this, ASSOCIATE_TOKEN operations can be connected with tokens
22
- const [mirrorAccount, mirrorTokens] = await Promise.all([
27
+ const [mirrorAccount, mirrorTokens, erc20TokenBalances] = await Promise.all([
23
28
  apiClient.getAccount(address),
24
29
  apiClient.getAccountTokens(address),
30
+ getERC20BalancesForAccount(evmAddress),
25
31
  ]);
26
32
  const accountBalance = new BigNumber(mirrorAccount.balance.balance);
27
33
  // we should sync again when new tokens are added or blacklist changes
28
34
  const syncHash = await getSyncHash(currency.id, blacklistedTokenIds);
29
35
  const shouldSyncFromScratch = !initialAccount || syncHash !== initialAccount?.syncHash;
30
- const oldOperations = initialAccount?.operations ?? [];
31
- const pendingOperations = initialAccount?.pendingOperations ?? [];
32
- // grab latest operation's consensus timestamp for incremental sync
36
+ const pendingOperations = shouldSyncFromScratch ? [] : initialAccount?.pendingOperations ?? [];
37
+ const oldOperations = shouldSyncFromScratch ? [] : initialAccount?.operations ?? [];
38
+ const oldERC20Operations = oldOperations.filter(item => item.standard === "erc20");
33
39
  const latestOperation = oldOperations[0];
34
- const latestOperationTimestamp = !shouldSyncFromScratch && latestOperation
35
- ? new BigNumber(Math.floor(latestOperation.date.getTime() / 1000))
36
- : null;
37
- const latestAccountOperations = await listOperations({
38
- currency,
39
- address,
40
- mirrorTokens,
41
- pagination: {
42
- minHeight: 0,
43
- ...(latestOperationTimestamp && { lastPagingToken: latestOperationTimestamp.toString() }),
44
- },
45
- fetchAllPages: true,
46
- skipFeesForTokenOperations: false,
47
- useEncodedHash: true,
48
- useSyntheticBlocks: false,
49
- });
50
- const newSubAccounts = await getSubAccounts(liveAccountId, latestAccountOperations.tokenOperations, mirrorTokens);
51
- const subAccounts = mergeSubAccounts(initialAccount, newSubAccounts);
40
+ const erc20LatestOperation = oldERC20Operations[0];
41
+ const pendingOperationHashes = new Set(pendingOperations.map(op => op.hash));
42
+ const erc20OperationHashes = new Set(oldERC20Operations.map(op => op.hash));
43
+ // grab latest operation timestamps for incremental sync
44
+ let latestOperationTimestamp = null;
45
+ let erc20LatestOperationTimestamp = null;
46
+ if (!shouldSyncFromScratch && latestOperation) {
47
+ const timestamp = Math.floor(latestOperation.date.getTime() / 1000);
48
+ latestOperationTimestamp = new BigNumber(timestamp).toString();
49
+ }
50
+ if (!shouldSyncFromScratch && erc20LatestOperation) {
51
+ const timestamp = Math.floor(erc20LatestOperation.date.getTime() / 1000);
52
+ erc20LatestOperationTimestamp = new BigNumber(timestamp).toString();
53
+ }
54
+ const [latestAccountOperations, erc20Transactions] = await Promise.all([
55
+ listOperations({
56
+ currency,
57
+ address,
58
+ mirrorTokens,
59
+ pagination: {
60
+ minHeight: 0,
61
+ ...(latestOperationTimestamp && { lastPagingToken: latestOperationTimestamp.toString() }),
62
+ },
63
+ fetchAllPages: true,
64
+ skipFeesForTokenOperations: false,
65
+ useEncodedHash: true,
66
+ useSyntheticBlocks: false,
67
+ }),
68
+ thirdwebClient.getERC20TransactionsForAccount({
69
+ address,
70
+ contractAddresses: erc20TokenBalances.map(token => token.token.contractAddress),
71
+ since: erc20LatestOperationTimestamp,
72
+ }),
73
+ ]);
52
74
  const newOperations = await prepareOperations(latestAccountOperations.coinOperations, latestAccountOperations.tokenOperations);
53
75
  const enrichedNewOperations = applyPendingExtras(newOperations, pendingOperations);
54
76
  const operations = shouldSyncFromScratch
55
77
  ? enrichedNewOperations
56
78
  : mergeOps(oldOperations, enrichedNewOperations);
79
+ // how ERC20 operations are handled:
80
+ // - mirror node doesn't include "IN" erc20 token transactions
81
+ // - mirror node returns "CONTRACT_CALL" (OUT) erc20 token transactions made from given account address
82
+ // - mirror node doesn't return "CONTRACT_CALL" (OUT) erc20 token transactions made from 3rd party with allowance
83
+ //
84
+ // 1. mirror node transactions are already transformed into operations at this point + we have raw erc20 transactions fetched from thirdweb
85
+ // 2. related mirror node transaction must be fetched for each erc20 transaction (to get fee and consensus timestamp)
86
+ // 3. CONTRACTCALL operations must be removed if existing operations already include erc20 operation with the same tx.hash
87
+ // 4. ERC20 transactions must be classified into two groups: patchList and addList
88
+ // - patchList: transactions which are already present in mirror operations (we can have CONTRACT_CALL from mirror node that we can transform into "FEES")
89
+ // - addList should include transactions which are missing in mirror operations (e.g. "IN" erc20 token transaction and "OUT" made by 3rd party with allowance)
90
+ // 5. list of all operations must be updated based on prepared `patchList` and `addList`
91
+ // 6. sub accounts must get erc20 tokens and erc20 operations in addition to hts tokens and hts operations
92
+ // 7. postSync must remove pending operations that are already confirmed as erc20 operations
93
+ const { updatedOperations, newERC20TokenOperations } = await integrateERC20Operations({
94
+ ledgerAccountId: liveAccountId,
95
+ address,
96
+ allOperations: operations,
97
+ latestERC20Transactions: erc20Transactions,
98
+ pendingOperationHashes,
99
+ erc20OperationHashes,
100
+ });
101
+ const newSubAccounts = await getSubAccounts({
102
+ ledgerAccountId: liveAccountId,
103
+ latestHTSTokenOperations: latestAccountOperations.tokenOperations,
104
+ latestERC20TokenOperations: newERC20TokenOperations,
105
+ mirrorTokens,
106
+ erc20Tokens: erc20TokenBalances,
107
+ });
108
+ const subAccounts = shouldSyncFromScratch
109
+ ? newSubAccounts
110
+ : mergeSubAccounts(initialAccount, newSubAccounts);
57
111
  return {
58
112
  id: liveAccountId,
59
113
  freshAddress: address,
@@ -61,8 +115,8 @@ export const getAccountShape = async (info, { blacklistedTokenIds }) => {
61
115
  lastSyncDate: new Date(),
62
116
  balance: accountBalance,
63
117
  spendableBalance: accountBalance,
64
- operations,
65
- operationsCount: operations.length,
118
+ operations: updatedOperations,
119
+ operationsCount: updatedOperations.length,
66
120
  // NOTE: there are no "blocks" in hedera
67
121
  // Set a value just so that operations are considered confirmed according to isConfirmedOperation
68
122
  blockHeight: 10,
@@ -93,4 +147,20 @@ export const buildIterateResult = async ({ result: rootResult }) => {
93
147
  : null;
94
148
  };
95
149
  };
150
+ // it might be necessary to remove pending operations after ERC20 patching done by `integrateERC20Operations`
151
+ export const postSync = (_initial, synced) => {
152
+ const erc20Operations = synced.operations.filter(op => op.standard === "erc20");
153
+ const erc20Hashes = new Set(erc20Operations.map(op => op.hash));
154
+ const excludeConfirmedERC20Operations = (o) => !erc20Hashes.has(o.hash);
155
+ return {
156
+ ...synced,
157
+ pendingOperations: synced.pendingOperations.filter(excludeConfirmedERC20Operations),
158
+ subAccounts: (synced.subAccounts ?? []).map(subAccount => {
159
+ return {
160
+ ...subAccount,
161
+ pendingOperations: subAccount.pendingOperations.filter(excludeConfirmedERC20Operations),
162
+ };
163
+ }),
164
+ };
165
+ };
96
166
  //# sourceMappingURL=synchronisation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"synchronisation.js","sourceRoot":"","sources":["../../src/bridge/synchronisation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"synchronisation.js","sourceRoot":"","sources":["../../src/bridge/synchronisation.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import BigNumber from "bignumber.js";
2
2
  import type { Account, Operation, TokenAccount } from "@ledgerhq/types-live";
3
- import type { HederaOperationExtra, Transaction, HederaMirrorToken } from "../types";
3
+ import type { HederaOperationExtra, Transaction, OperationERC20, HederaMirrorToken, HederaERC20TokenBalance, HederaThirdwebTransaction, ERC20OperationFields } from "../types";
4
4
  interface CalculateAmountResult {
5
5
  amount: BigNumber;
6
6
  totalSpent: BigNumber;
@@ -9,7 +9,13 @@ export declare const calculateAmount: ({ account, transaction, }: {
9
9
  account: Account;
10
10
  transaction: Transaction;
11
11
  }) => Promise<CalculateAmountResult>;
12
- export declare const getSubAccounts: (accountId: string, lastTokenOperations: Operation[], mirrorTokens: HederaMirrorToken[]) => Promise<TokenAccount[]>;
12
+ export declare const getSubAccounts: ({ ledgerAccountId, latestHTSTokenOperations, latestERC20TokenOperations, mirrorTokens, erc20Tokens, }: {
13
+ ledgerAccountId: string;
14
+ latestHTSTokenOperations: Operation[];
15
+ latestERC20TokenOperations: Operation[];
16
+ mirrorTokens: HederaMirrorToken[];
17
+ erc20Tokens: HederaERC20TokenBalance[];
18
+ }) => Promise<TokenAccount[]>;
13
19
  export declare const prepareOperations: (coinOperations: Operation<HederaOperationExtra>[], tokenOperations: Operation<HederaOperationExtra>[]) => Promise<Operation<HederaOperationExtra>[]>;
14
20
  /**
15
21
  * In charge of smartly merging sub accounts while maintaining references as much as possible
@@ -17,5 +23,32 @@ export declare const prepareOperations: (coinOperations: Operation<HederaOperati
17
23
  export declare const mergeSubAccounts: (initialAccount: Account | undefined, newSubAccounts: TokenAccount[]) => Array<TokenAccount>;
18
24
  export declare const applyPendingExtras: (existing: Operation[], pending: Operation[]) => Operation[];
19
25
  export declare function patchOperationWithExtra(operation: Operation, extra: HederaOperationExtra): Operation;
26
+ export declare const removeDuplicatedContractCallOperations: (operations: Operation[], pendingOperationHashes: Set<string>, erc20OperationHashes: Set<string>) => Operation[];
27
+ export declare const classifyERC20Operations: ({ latestERC20Operations, operationsByHash, evmAccountAddress, }: {
28
+ latestERC20Operations: OperationERC20[];
29
+ operationsByHash: Map<string, Operation>;
30
+ evmAccountAddress: string | null;
31
+ }) => {
32
+ erc20OperationsToPatch: Map<string, OperationERC20>;
33
+ erc20OperationsToAdd: Map<string, OperationERC20>;
34
+ };
35
+ export declare const patchContractCallOperation: ({ relatedExistingOperation, ledgerAccountId, hash, erc20Fields, tokenOperation, }: {
36
+ relatedExistingOperation: Operation;
37
+ ledgerAccountId: string;
38
+ hash: string;
39
+ erc20Fields: ERC20OperationFields;
40
+ tokenOperation: Operation;
41
+ }) => void;
42
+ export declare const integrateERC20Operations: ({ ledgerAccountId, address, allOperations, latestERC20Transactions, pendingOperationHashes, erc20OperationHashes, }: {
43
+ ledgerAccountId: string;
44
+ address: string;
45
+ allOperations: Operation[];
46
+ latestERC20Transactions: HederaThirdwebTransaction[];
47
+ pendingOperationHashes: Set<string>;
48
+ erc20OperationHashes: Set<string>;
49
+ }) => Promise<{
50
+ updatedOperations: Operation[];
51
+ newERC20TokenOperations: Operation[];
52
+ }>;
20
53
  export {};
21
54
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/bridge/utils.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAgB7E,OAAO,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAErF,UAAU,qBAAqB;IAC7B,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,SAAS,CAAC;CACvB;AAyCD,eAAO,MAAM,eAAe;aAIjB,OAAO;iBACH,WAAW;MACtB,QAAQ,qBAAqB,CAahC,CAAC;AAEF,eAAO,MAAM,cAAc,cACd,MAAM,uBACI,SAAS,EAAE,gBAClB,iBAAiB,EAAE,KAChC,QAAQ,YAAY,EAAE,CAwFxB,CAAC;AAoCF,eAAO,MAAM,iBAAiB,mBACZ,UAAU,oBAAoB,CAAC,EAAE,mBAChC,UAAU,oBAAoB,CAAC,EAAE,KACjD,QAAQ,UAAU,oBAAoB,CAAC,EAAE,CAmC3C,CAAC;AAaF;;GAEG;AACH,eAAO,MAAM,gBAAgB,mBACX,OAAO,GAAG,SAAS,kBACnB,YAAY,EAAE,KAC7B,MAAM,YAAY,CAmDpB,CAAC;AAEF,eAAO,MAAM,kBAAkB,aAAc,SAAS,EAAE,WAAW,SAAS,EAAE,gBAiB7E,CAAC;AAEF,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,oBAAoB,GAC1B,SAAS,CAOX"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/bridge/utils.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAiB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAwB5F,OAAO,KAAK,EACV,oBAAoB,EACpB,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,uBAAuB,EACvB,yBAAyB,EACzB,oBAAoB,EACrB,MAAM,UAAU,CAAC;AAElB,UAAU,qBAAqB;IAC7B,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,SAAS,CAAC;CACvB;AAyCD,eAAO,MAAM,eAAe;aAIjB,OAAO;iBACH,WAAW;MACtB,QAAQ,qBAAqB,CAahC,CAAC;AAEF,eAAO,MAAM,cAAc;qBAOR,MAAM;8BACG,SAAS,EAAE;gCACT,SAAS,EAAE;kBACzB,iBAAiB,EAAE;iBACpB,uBAAuB,EAAE;MACpC,QAAQ,YAAY,EAAE,CAqGzB,CAAC;AAoCF,eAAO,MAAM,iBAAiB,mBACZ,UAAU,oBAAoB,CAAC,EAAE,mBAChC,UAAU,oBAAoB,CAAC,EAAE,KACjD,QAAQ,UAAU,oBAAoB,CAAC,EAAE,CAmC3C,CAAC;AAaF;;GAEG;AACH,eAAO,MAAM,gBAAgB,mBACX,OAAO,GAAG,SAAS,kBACnB,YAAY,EAAE,KAC7B,MAAM,YAAY,CAmDpB,CAAC;AAEF,eAAO,MAAM,kBAAkB,aAAc,SAAS,EAAE,WAAW,SAAS,EAAE,gBAiB7E,CAAC;AAEF,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,oBAAoB,GAC1B,SAAS,CAOX;AAGD,eAAO,MAAM,sCAAsC,eACrC,SAAS,EAAE,0BACC,IAAI,MAAM,CAAC,wBACb,IAAI,MAAM,CAAC,KAChC,SAAS,EAWX,CAAC;AAKF,eAAO,MAAM,uBAAuB;2BAKX,cAAc,EAAE;sBACrB,IAAI,MAAM,EAAE,SAAS,CAAC;uBACrB,MAAM,GAAG,IAAI;;4BAER,IAAI,MAAM,EAAE,cAAc,CAAC;0BAC7B,IAAI,MAAM,EAAE,cAAc,CAAC;CAuBlD,CAAC;AA6DF,eAAO,MAAM,0BAA0B;8BAOX,SAAS;qBAClB,MAAM;UACjB,MAAM;iBACC,oBAAoB;oBACjB,SAAS;MACvB,IAQH,CAAC;AAEF,eAAO,MAAM,wBAAwB;qBAQlB,MAAM;aACd,MAAM;mBACA,SAAS,EAAE;6BACD,yBAAyB,EAAE;4BAC5B,IAAI,MAAM,CAAC;0BACb,IAAI,MAAM,CAAC;;uBAEd,SAAS,EAAE;6BACL,SAAS,EAAE;EA+GrC,CAAC"}
@@ -1,20 +1,21 @@
1
1
  import BigNumber from "bignumber.js";
2
2
  import { decodeTokenAccountId, emptyHistoryCache, encodeTokenAccountId, findSubAccountById, isTokenAccount, } from "@ledgerhq/coin-framework/account";
3
- import { encodeOperationId } from "@ledgerhq/coin-framework/operation";
4
3
  import { mergeOps } from "@ledgerhq/coin-framework/bridge/jsHelpers";
4
+ import { encodeOperationId } from "@ledgerhq/coin-framework/operation";
5
5
  import { getCryptoAssetsStore } from "@ledgerhq/cryptoassets/state";
6
6
  import { HEDERA_OPERATION_TYPES } from "../constants";
7
7
  import { estimateMaxSpendable } from "./estimateMaxSpendable";
8
8
  import { estimateFees } from "../logic/estimateFees";
9
- import { isTokenAssociateTransaction, isValidExtra } from "../logic/utils";
9
+ import { fromEVMAddress, toEVMAddress, getMemoFromBase64, isTokenAssociateTransaction, isValidExtra, base64ToUrlSafeBase64, } from "../logic/utils";
10
+ import { getERC20Operations, parseThirdwebTransactionParams } from "../network/utils";
10
11
  const calculateCoinAmount = async ({ account, transaction, operationType, }) => {
11
- const estimatedFees = await estimateFees(account.currency, operationType);
12
+ const estimatedFees = await estimateFees({ currency: account.currency, operationType });
12
13
  const amount = transaction.useAllAmount
13
14
  ? await estimateMaxSpendable({ account, transaction })
14
15
  : transaction.amount;
15
16
  return {
16
17
  amount,
17
- totalSpent: amount.plus(estimatedFees),
18
+ totalSpent: amount.plus(estimatedFees.tinybars),
18
19
  };
19
20
  };
20
21
  const calculateTokenAmount = async ({ account, tokenAccount, transaction, }) => {
@@ -37,10 +38,11 @@ export const calculateAmount = ({ account, transaction, }) => {
37
38
  : HEDERA_OPERATION_TYPES.CryptoTransfer;
38
39
  return calculateCoinAmount({ account, transaction, operationType });
39
40
  };
40
- export const getSubAccounts = async (accountId, lastTokenOperations, mirrorTokens) => {
41
+ export const getSubAccounts = async ({ ledgerAccountId, latestHTSTokenOperations, latestERC20TokenOperations, mirrorTokens, erc20Tokens, }) => {
41
42
  // Creating a Map of Operations by TokenCurrencies in order to know which TokenAccounts should be synced as well
42
43
  const operationsByToken = new Map();
43
- for (const tokenOperation of lastTokenOperations) {
44
+ const subAccounts = [];
45
+ for (const tokenOperation of [...latestHTSTokenOperations, ...latestERC20TokenOperations]) {
44
46
  const { token } = await decodeTokenAccountId(tokenOperation.accountId);
45
47
  if (!token)
46
48
  continue;
@@ -52,12 +54,18 @@ export const getSubAccounts = async (accountId, lastTokenOperations, mirrorToken
52
54
  }
53
55
  operationsByToken.get(token)?.push(tokenOperation);
54
56
  }
55
- const subAccounts = [];
56
57
  // extract token accounts from existing operations
57
58
  for (const [token, tokenOperations] of operationsByToken.entries()) {
58
- const parentAccountId = accountId;
59
- const rawBalance = mirrorTokens.find(t => t.token_id === token.contractAddress)?.balance;
60
- const balance = rawBalance !== undefined ? new BigNumber(rawBalance) : null;
59
+ const parentAccountId = ledgerAccountId;
60
+ let balance = null;
61
+ if (token.tokenType === "erc20") {
62
+ const rawBalance = erc20Tokens.find(t => t.token.contractAddress === token.contractAddress);
63
+ balance = rawBalance === undefined ? null : new BigNumber(rawBalance.balance);
64
+ }
65
+ else {
66
+ const rawBalance = mirrorTokens.find(t => t.token_id === token.contractAddress)?.balance;
67
+ balance = rawBalance === undefined ? null : new BigNumber(rawBalance);
68
+ }
61
69
  if (!balance) {
62
70
  continue;
63
71
  }
@@ -77,27 +85,36 @@ export const getSubAccounts = async (accountId, lastTokenOperations, mirrorToken
77
85
  });
78
86
  }
79
87
  // extract token accounts existing in the account's balance, but with no recorded operations yet
80
- // e.g. tokens added via association flow, without any subsequent activity
81
- for (const rawToken of mirrorTokens) {
82
- const parentAccountId = accountId;
88
+ // e.g. hts tokens added via association flow, without any subsequent activity
89
+ // or erc20 tokens received from 3rd party
90
+ for (const rawToken of [...mirrorTokens, ...erc20Tokens]) {
91
+ const parentAccountId = ledgerAccountId;
83
92
  const rawBalance = rawToken.balance;
84
93
  const balance = new BigNumber(rawBalance);
85
- const token = await getCryptoAssetsStore().findTokenByAddressInCurrency(rawToken.token_id, "hedera");
94
+ const isERC20 = "token" in rawToken;
95
+ const tokenAddress = isERC20 ? rawToken.token.contractAddress : rawToken.token_id;
96
+ const token = await getCryptoAssetsStore().findTokenByAddressInCurrency(tokenAddress, "hedera");
86
97
  if (!token) {
87
98
  continue;
88
99
  }
89
100
  const id = encodeTokenAccountId(parentAccountId, token);
101
+ const operations = operationsByToken.get(token) ?? [];
90
102
  if (subAccounts.some(a => a.id === id)) {
91
103
  continue;
92
104
  }
105
+ if (isERC20 && operations.length === 0 && balance.isZero()) {
106
+ continue;
107
+ }
93
108
  subAccounts.push({
94
109
  type: "TokenAccount",
95
- id: encodeTokenAccountId(parentAccountId, token),
110
+ id,
96
111
  parentId: parentAccountId,
97
112
  token,
98
113
  balance,
99
114
  spendableBalance: balance,
100
- creationDate: new Date(parseFloat(rawToken.created_timestamp) * 1000),
115
+ creationDate: isERC20
116
+ ? new Date()
117
+ : new Date(Number.parseFloat(rawToken.created_timestamp) * 1000),
101
118
  operations: [],
102
119
  operationsCount: 0,
103
120
  pendingOperations: [],
@@ -248,4 +265,182 @@ export function patchOperationWithExtra(operation, extra) {
248
265
  nftOperations: (operation.nftOperations ?? []).map(op => ({ ...op, extra })),
249
266
  };
250
267
  }
268
+ // filter out CONTRACT_CALL operations based on pending and already existing ERC20 operations to avoid duplicates
269
+ export const removeDuplicatedContractCallOperations = (operations, pendingOperationHashes, erc20OperationHashes) => {
270
+ return operations.filter(op => {
271
+ if (op.type !== "CONTRACT_CALL") {
272
+ return true;
273
+ }
274
+ const hashAlreadyExists = erc20OperationHashes.has(op.hash) || pendingOperationHashes.has(op.hash);
275
+ return !hashAlreadyExists;
276
+ });
277
+ };
278
+ // loop over latestERC20Operations and prepare lists of transactions that should be patched and added
279
+ // - patching happens when we have a matching CONTRACT_CALL operation without blockHash set (mirror node transaction without ERC20 details)
280
+ // - adding happens when we have no matching operation
281
+ export const classifyERC20Operations = ({ latestERC20Operations, operationsByHash, evmAccountAddress, }) => {
282
+ const erc20OperationsToPatch = new Map();
283
+ const erc20OperationsToAdd = new Map();
284
+ for (const erc20Operation of latestERC20Operations) {
285
+ const hash = base64ToUrlSafeBase64(erc20Operation.mirrorTransaction.transaction_hash);
286
+ const existingOp = operationsByHash.get(hash);
287
+ const type = erc20Operation.thirdwebTransaction.decoded.params.from === evmAccountAddress ? "OUT" : "IN";
288
+ if (!existingOp) {
289
+ erc20OperationsToAdd.set(hash, erc20Operation);
290
+ continue;
291
+ }
292
+ if (existingOp.type === "CONTRACT_CALL" && type === "OUT" && !existingOp.blockHash) {
293
+ erc20OperationsToPatch.set(hash, erc20Operation);
294
+ continue;
295
+ }
296
+ }
297
+ return { erc20OperationsToPatch, erc20OperationsToAdd };
298
+ };
299
+ // extracts common fields from an ERC20 operation
300
+ const buildERC20OperationFields = ({ erc20Operation, relatedExistingOperation, variant, evmAddress, }) => {
301
+ const decodedParams = parseThirdwebTransactionParams(erc20Operation.thirdwebTransaction);
302
+ if (!decodedParams) {
303
+ return null;
304
+ }
305
+ let type = "OUT";
306
+ const standard = "erc20";
307
+ const blockHeight = 5;
308
+ const blockHash = erc20Operation.thirdwebTransaction.blockHash;
309
+ const consensusTimestamp = erc20Operation.mirrorTransaction.consensus_timestamp;
310
+ const timestamp = new Date(Number.parseInt(consensusTimestamp.split(".")[0], 10) * 1000);
311
+ const fee = BigNumber(erc20Operation.mirrorTransaction.charged_tx_fee);
312
+ const value = BigNumber(decodedParams.value);
313
+ const senderAddress = fromEVMAddress(decodedParams.from) ?? decodedParams.from;
314
+ const recipientAddress = fromEVMAddress(decodedParams.to) ?? decodedParams.to;
315
+ const memo = getMemoFromBase64(erc20Operation.mirrorTransaction.memo_base64);
316
+ const extra = {
317
+ ...(isValidExtra(relatedExistingOperation?.extra) && relatedExistingOperation.extra),
318
+ ...(memo && { memo }),
319
+ consensusTimestamp: erc20Operation.contractCallResult.timestamp,
320
+ transactionId: erc20Operation.mirrorTransaction.transaction_id,
321
+ gasConsumed: erc20Operation.contractCallResult.gas_consumed,
322
+ gasLimit: erc20Operation.contractCallResult.gas_limit,
323
+ gasUsed: erc20Operation.contractCallResult.gas_used,
324
+ };
325
+ if (variant === "add") {
326
+ type = decodedParams.from === evmAddress ? "OUT" : "IN";
327
+ }
328
+ return {
329
+ date: timestamp,
330
+ type,
331
+ fee,
332
+ value,
333
+ senders: [senderAddress],
334
+ recipients: [recipientAddress],
335
+ blockHeight,
336
+ blockHash,
337
+ extra,
338
+ standard,
339
+ hasFailed: false,
340
+ };
341
+ };
342
+ // patches an existing CONTRACT_CALL operation with ERC20 token operation details
343
+ export const patchContractCallOperation = ({ relatedExistingOperation, ledgerAccountId, hash, erc20Fields, tokenOperation, }) => {
344
+ Object.assign(relatedExistingOperation, {
345
+ ...erc20Fields,
346
+ id: encodeOperationId(ledgerAccountId, hash, "FEES"),
347
+ type: "FEES",
348
+ value: erc20Fields.fee,
349
+ subOperations: [tokenOperation],
350
+ });
351
+ };
352
+ export const integrateERC20Operations = async ({ ledgerAccountId, address, allOperations, latestERC20Transactions, pendingOperationHashes, erc20OperationHashes, }) => {
353
+ const newERC20TokenOperations = [];
354
+ const latestERC20Operations = await getERC20Operations(latestERC20Transactions);
355
+ const evmAddress = toEVMAddress(address);
356
+ // avoid duplicated CONTRACT_CALL operations if ERC20 operations are already present
357
+ const uniqueOperations = removeDuplicatedContractCallOperations(allOperations, pendingOperationHashes, erc20OperationHashes);
358
+ // nothing to patch/add if no new ERC20 operations found
359
+ if (latestERC20Operations.length === 0) {
360
+ return {
361
+ updatedOperations: uniqueOperations,
362
+ newERC20TokenOperations,
363
+ };
364
+ }
365
+ // create copy to avoid mutating original array and index by hash for easy lookup
366
+ const updatedOperations = uniqueOperations.map(op => ({ ...op }));
367
+ const operationsByHash = updatedOperations.reduce((acc, curr) => {
368
+ acc.set(curr.hash, curr);
369
+ return acc;
370
+ }, new Map());
371
+ // split erc20 operations into patch and add lists
372
+ const { erc20OperationsToPatch, erc20OperationsToAdd } = classifyERC20Operations({
373
+ latestERC20Operations,
374
+ operationsByHash,
375
+ evmAccountAddress: evmAddress,
376
+ });
377
+ // patch existing operations with data from thirdweb
378
+ for (const [hash, erc20Operation] of erc20OperationsToPatch.entries()) {
379
+ const relatedExistingOperation = operationsByHash.get(hash);
380
+ if (!relatedExistingOperation)
381
+ continue;
382
+ const erc20Fields = buildERC20OperationFields({
383
+ variant: "patch",
384
+ evmAddress,
385
+ erc20Operation,
386
+ relatedExistingOperation,
387
+ });
388
+ if (!erc20Fields)
389
+ continue;
390
+ const encodedTokenAccountId = encodeTokenAccountId(ledgerAccountId, erc20Operation.token);
391
+ const encodedOperationId = encodeOperationId(encodedTokenAccountId, hash, erc20Fields.type);
392
+ const tokenOperation = {
393
+ ...erc20Fields,
394
+ id: encodedOperationId,
395
+ accountId: encodedTokenAccountId,
396
+ hash,
397
+ };
398
+ patchContractCallOperation({
399
+ relatedExistingOperation,
400
+ ledgerAccountId,
401
+ hash,
402
+ erc20Fields,
403
+ tokenOperation,
404
+ });
405
+ newERC20TokenOperations.push(tokenOperation);
406
+ }
407
+ // create new operations for remaining ERC20 operations
408
+ for (const [hash, erc20Operation] of erc20OperationsToAdd.entries()) {
409
+ const erc20Fields = buildERC20OperationFields({
410
+ variant: "add",
411
+ evmAddress,
412
+ erc20Operation,
413
+ });
414
+ if (!erc20Fields)
415
+ continue;
416
+ const encodedTokenAccountId = encodeTokenAccountId(ledgerAccountId, erc20Operation.token);
417
+ const encodedOperationId = encodeOperationId(encodedTokenAccountId, hash, erc20Fields.type);
418
+ const tokenOperation = {
419
+ ...erc20Fields,
420
+ id: encodedOperationId,
421
+ accountId: encodedTokenAccountId,
422
+ hash,
423
+ };
424
+ const coinOperation = erc20Fields.type === "OUT"
425
+ ? {
426
+ ...erc20Fields,
427
+ id: encodeOperationId(ledgerAccountId, hash, "FEES"),
428
+ accountId: ledgerAccountId,
429
+ type: "FEES",
430
+ value: erc20Fields.fee,
431
+ hash,
432
+ }
433
+ : await makeCoinOperationForOrphanChildOperation(tokenOperation);
434
+ coinOperation.subOperations = [tokenOperation];
435
+ updatedOperations.push(coinOperation);
436
+ newERC20TokenOperations.push(tokenOperation);
437
+ }
438
+ // ensure operations lists are sorted correctly
439
+ updatedOperations.sort((a, b) => b.date.getTime() - a.date.getTime());
440
+ newERC20TokenOperations.sort((a, b) => b.date.getTime() - a.date.getTime());
441
+ return {
442
+ updatedOperations,
443
+ newERC20TokenOperations,
444
+ };
445
+ };
251
446
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/bridge/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/bridge/utils.ts"],"names":[],"mappings":"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"}