@ledgerhq/coin-hedera 1.12.0 → 1.12.1-nightly.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/lib/api/network.d.ts +2 -6
  3. package/lib/api/network.d.ts.map +1 -1
  4. package/lib/api/network.js +4 -25
  5. package/lib/api/network.js.map +1 -1
  6. package/lib/bridge/buildOptimisticOperation.d.ts.map +1 -1
  7. package/lib/bridge/buildOptimisticOperation.js +6 -2
  8. package/lib/bridge/buildOptimisticOperation.js.map +1 -1
  9. package/lib/bridge/getTransactionStatus.d.ts.map +1 -1
  10. package/lib/bridge/getTransactionStatus.js +10 -13
  11. package/lib/bridge/getTransactionStatus.js.map +1 -1
  12. package/lib/bridge/utils.d.ts +4 -0
  13. package/lib/bridge/utils.d.ts.map +1 -1
  14. package/lib/bridge/utils.js +41 -3
  15. package/lib/bridge/utils.js.map +1 -1
  16. package/lib/errors.d.ts +12 -0
  17. package/lib/errors.d.ts.map +1 -1
  18. package/lib/errors.js +5 -1
  19. package/lib/errors.js.map +1 -1
  20. package/lib-es/api/network.d.ts +2 -6
  21. package/lib-es/api/network.d.ts.map +1 -1
  22. package/lib-es/api/network.js +3 -24
  23. package/lib-es/api/network.js.map +1 -1
  24. package/lib-es/bridge/buildOptimisticOperation.d.ts.map +1 -1
  25. package/lib-es/bridge/buildOptimisticOperation.js +7 -3
  26. package/lib-es/bridge/buildOptimisticOperation.js.map +1 -1
  27. package/lib-es/bridge/getTransactionStatus.d.ts.map +1 -1
  28. package/lib-es/bridge/getTransactionStatus.js +9 -12
  29. package/lib-es/bridge/getTransactionStatus.js.map +1 -1
  30. package/lib-es/bridge/utils.d.ts +4 -0
  31. package/lib-es/bridge/utils.d.ts.map +1 -1
  32. package/lib-es/bridge/utils.js +40 -3
  33. package/lib-es/bridge/utils.js.map +1 -1
  34. package/lib-es/errors.d.ts +12 -0
  35. package/lib-es/errors.d.ts.map +1 -1
  36. package/lib-es/errors.js +4 -0
  37. package/lib-es/errors.js.map +1 -1
  38. package/package.json +7 -7
  39. package/src/api/network.ts +2 -35
  40. package/src/bridge/buildOptimisticOperation.ts +7 -3
  41. package/src/bridge/getTransactionStatus.test.ts +27 -5
  42. package/src/bridge/getTransactionStatus.ts +14 -13
  43. package/src/bridge/utils.integration.test.ts +52 -0
  44. package/src/bridge/utils.ts +49 -2
  45. package/src/errors.ts +12 -0
  46. package/lib/api/mirror.test.d.ts +0 -2
  47. package/lib/api/mirror.test.d.ts.map +0 -1
  48. package/lib/api/mirror.test.js +0 -114
  49. package/lib/api/mirror.test.js.map +0 -1
  50. package/lib/api/network.test.d.ts +0 -2
  51. package/lib/api/network.test.d.ts.map +0 -1
  52. package/lib/api/network.test.js +0 -45
  53. package/lib/api/network.test.js.map +0 -1
  54. package/lib/bridge/buildOptimisticOperation.integration.test.d.ts +0 -2
  55. package/lib/bridge/buildOptimisticOperation.integration.test.d.ts.map +0 -1
  56. package/lib/bridge/buildOptimisticOperation.integration.test.js +0 -82
  57. package/lib/bridge/buildOptimisticOperation.integration.test.js.map +0 -1
  58. package/lib/bridge/getTransactionStatus.test.d.ts +0 -2
  59. package/lib/bridge/getTransactionStatus.test.d.ts.map +0 -1
  60. package/lib/bridge/getTransactionStatus.test.js +0 -176
  61. package/lib/bridge/getTransactionStatus.test.js.map +0 -1
  62. package/lib/bridge/js-estimateMaxSpendable.integration.test.d.ts +0 -2
  63. package/lib/bridge/js-estimateMaxSpendable.integration.test.d.ts.map +0 -1
  64. package/lib/bridge/js-estimateMaxSpendable.integration.test.js +0 -47
  65. package/lib/bridge/js-estimateMaxSpendable.integration.test.js.map +0 -1
  66. package/lib/bridge/js-transaction.test.d.ts +0 -2
  67. package/lib/bridge/js-transaction.test.d.ts.map +0 -1
  68. package/lib/bridge/js-transaction.test.js +0 -40
  69. package/lib/bridge/js-transaction.test.js.map +0 -1
  70. package/lib/bridge/prepareTransaction.test.d.ts +0 -2
  71. package/lib/bridge/prepareTransaction.test.d.ts.map +0 -1
  72. package/lib/bridge/prepareTransaction.test.js +0 -58
  73. package/lib/bridge/prepareTransaction.test.js.map +0 -1
  74. package/lib/bridge/serialization.test.d.ts +0 -2
  75. package/lib/bridge/serialization.test.d.ts.map +0 -1
  76. package/lib/bridge/serialization.test.js +0 -27
  77. package/lib/bridge/serialization.test.js.map +0 -1
  78. package/lib/bridge/transaction.test.d.ts +0 -2
  79. package/lib/bridge/transaction.test.d.ts.map +0 -1
  80. package/lib/bridge/transaction.test.js +0 -37
  81. package/lib/bridge/transaction.test.js.map +0 -1
  82. package/lib/bridge/utils.integration.test.d.ts +0 -2
  83. package/lib/bridge/utils.integration.test.d.ts.map +0 -1
  84. package/lib/bridge/utils.integration.test.js +0 -428
  85. package/lib/bridge/utils.integration.test.js.map +0 -1
  86. package/lib/logic.test.d.ts +0 -2
  87. package/lib/logic.test.d.ts.map +0 -1
  88. package/lib/logic.test.js +0 -111
  89. package/lib/logic.test.js.map +0 -1
  90. package/lib-es/api/mirror.test.d.ts +0 -2
  91. package/lib-es/api/mirror.test.d.ts.map +0 -1
  92. package/lib-es/api/mirror.test.js +0 -109
  93. package/lib-es/api/mirror.test.js.map +0 -1
  94. package/lib-es/api/network.test.d.ts +0 -2
  95. package/lib-es/api/network.test.d.ts.map +0 -1
  96. package/lib-es/api/network.test.js +0 -40
  97. package/lib-es/api/network.test.js.map +0 -1
  98. package/lib-es/bridge/buildOptimisticOperation.integration.test.d.ts +0 -2
  99. package/lib-es/bridge/buildOptimisticOperation.integration.test.d.ts.map +0 -1
  100. package/lib-es/bridge/buildOptimisticOperation.integration.test.js +0 -77
  101. package/lib-es/bridge/buildOptimisticOperation.integration.test.js.map +0 -1
  102. package/lib-es/bridge/getTransactionStatus.test.d.ts +0 -2
  103. package/lib-es/bridge/getTransactionStatus.test.d.ts.map +0 -1
  104. package/lib-es/bridge/getTransactionStatus.test.js +0 -148
  105. package/lib-es/bridge/getTransactionStatus.test.js.map +0 -1
  106. package/lib-es/bridge/js-estimateMaxSpendable.integration.test.d.ts +0 -2
  107. package/lib-es/bridge/js-estimateMaxSpendable.integration.test.d.ts.map +0 -1
  108. package/lib-es/bridge/js-estimateMaxSpendable.integration.test.js +0 -42
  109. package/lib-es/bridge/js-estimateMaxSpendable.integration.test.js.map +0 -1
  110. package/lib-es/bridge/js-transaction.test.d.ts +0 -2
  111. package/lib-es/bridge/js-transaction.test.d.ts.map +0 -1
  112. package/lib-es/bridge/js-transaction.test.js +0 -35
  113. package/lib-es/bridge/js-transaction.test.js.map +0 -1
  114. package/lib-es/bridge/prepareTransaction.test.d.ts +0 -2
  115. package/lib-es/bridge/prepareTransaction.test.d.ts.map +0 -1
  116. package/lib-es/bridge/prepareTransaction.test.js +0 -30
  117. package/lib-es/bridge/prepareTransaction.test.js.map +0 -1
  118. package/lib-es/bridge/serialization.test.d.ts +0 -2
  119. package/lib-es/bridge/serialization.test.d.ts.map +0 -1
  120. package/lib-es/bridge/serialization.test.js +0 -25
  121. package/lib-es/bridge/serialization.test.js.map +0 -1
  122. package/lib-es/bridge/transaction.test.d.ts +0 -2
  123. package/lib-es/bridge/transaction.test.d.ts.map +0 -1
  124. package/lib-es/bridge/transaction.test.js +0 -32
  125. package/lib-es/bridge/transaction.test.js.map +0 -1
  126. package/lib-es/bridge/utils.integration.test.d.ts +0 -2
  127. package/lib-es/bridge/utils.integration.test.d.ts.map +0 -1
  128. package/lib-es/bridge/utils.integration.test.js +0 -423
  129. package/lib-es/bridge/utils.integration.test.js.map +0 -1
  130. package/lib-es/logic.test.d.ts +0 -2
  131. package/lib-es/logic.test.d.ts.map +0 -1
  132. package/lib-es/logic.test.js +0 -109
  133. package/lib-es/logic.test.js.map +0 -1
@@ -1,428 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const bignumber_js_1 = __importDefault(require("bignumber.js"));
7
- const index_1 = __importDefault(require("@ledgerhq/live-countervalues/api/index"));
8
- const account_1 = require("@ledgerhq/coin-framework/account");
9
- const account_fixture_1 = require("../test/fixtures/account.fixture");
10
- const transaction_fixture_1 = require("../test/fixtures/transaction.fixture");
11
- const utils_1 = require("./utils");
12
- const currency_fixture_1 = require("../test/fixtures/currency.fixture");
13
- const operation_fixture_1 = require("../test/fixtures/operation.fixture");
14
- const mirror_1 = require("../api/mirror");
15
- const logic_1 = require("../logic");
16
- const mirror_fixture_1 = require("../test/fixtures/mirror.fixture");
17
- const constants_1 = require("../constants");
18
- jest.mock("../api/mirror");
19
- jest.mock("@ledgerhq/live-countervalues/api/index");
20
- const mockedFetchLatest = index_1.default.fetchLatest;
21
- const mockedGetAccount = mirror_1.getAccount;
22
- describe("utils", () => {
23
- describe("calculateAmount", () => {
24
- let estimatedFees;
25
- beforeAll(async () => {
26
- const mockedAccount = (0, account_fixture_1.getMockedAccount)();
27
- const [crypto, associate] = await Promise.all([
28
- (0, utils_1.getEstimatedFees)(mockedAccount, constants_1.HEDERA_OPERATION_TYPES.CryptoTransfer),
29
- (0, utils_1.getEstimatedFees)(mockedAccount, constants_1.HEDERA_OPERATION_TYPES.TokenAssociate),
30
- ]);
31
- estimatedFees = { crypto, associate };
32
- });
33
- test("HBAR transfer, useAllAmount = true", async () => {
34
- const mockedAccount = (0, account_fixture_1.getMockedAccount)();
35
- const mockedTransaction = (0, transaction_fixture_1.getMockedTransaction)({ useAllAmount: true });
36
- const amount = mockedAccount.balance.minus(estimatedFees.crypto);
37
- const totalSpent = amount.plus(estimatedFees.crypto);
38
- const result = await (0, utils_1.calculateAmount)({
39
- account: mockedAccount,
40
- transaction: mockedTransaction,
41
- });
42
- expect(result).toEqual({ amount, totalSpent });
43
- });
44
- test("HBAR transfer, useAllAmount = false", async () => {
45
- const mockedAccount = (0, account_fixture_1.getMockedAccount)();
46
- const mockedTransaction = (0, transaction_fixture_1.getMockedTransaction)({
47
- useAllAmount: false,
48
- amount: new bignumber_js_1.default(1000000),
49
- });
50
- const amount = mockedTransaction.amount;
51
- const totalSpent = amount.plus(estimatedFees.crypto);
52
- const result = await (0, utils_1.calculateAmount)({
53
- account: mockedAccount,
54
- transaction: mockedTransaction,
55
- });
56
- expect(result).toEqual({ amount, totalSpent });
57
- });
58
- test("token transfer, useAllAmount = true", async () => {
59
- const mockedTokenCurrency = (0, currency_fixture_1.getMockedTokenCurrency)();
60
- const mockedTokenAccount = (0, account_fixture_1.getMockedTokenAccount)(mockedTokenCurrency);
61
- const mockedAccount = (0, account_fixture_1.getMockedAccount)({ subAccounts: [mockedTokenAccount] });
62
- const mockedTransaction = (0, transaction_fixture_1.getMockedTransaction)({
63
- useAllAmount: true,
64
- subAccountId: mockedTokenAccount.id,
65
- });
66
- const amount = mockedTokenAccount.balance;
67
- const totalSpent = amount;
68
- const result = await (0, utils_1.calculateAmount)({
69
- account: mockedAccount,
70
- transaction: mockedTransaction,
71
- });
72
- expect(result).toEqual({ amount, totalSpent });
73
- });
74
- test("token transfer, useAllAmount = false", async () => {
75
- const mockedTokenCurrency = (0, currency_fixture_1.getMockedTokenCurrency)();
76
- const mockedTokenAccount = (0, account_fixture_1.getMockedTokenAccount)(mockedTokenCurrency);
77
- const mockedAccount = (0, account_fixture_1.getMockedAccount)({ subAccounts: [mockedTokenAccount] });
78
- const mockedTransaction = (0, transaction_fixture_1.getMockedTransaction)({
79
- useAllAmount: false,
80
- amount: new bignumber_js_1.default(1),
81
- subAccountId: mockedTokenAccount.id,
82
- });
83
- const amount = mockedTransaction.amount;
84
- const totalSpent = amount;
85
- const result = await (0, utils_1.calculateAmount)({
86
- account: mockedAccount,
87
- transaction: mockedTransaction,
88
- });
89
- expect(result).toEqual({ amount, totalSpent });
90
- });
91
- test("token associate operation uses TokenAssociate fee", async () => {
92
- const mockedTokenCurrency = (0, currency_fixture_1.getMockedTokenCurrency)();
93
- const mockedTokenAccount = (0, account_fixture_1.getMockedTokenAccount)(mockedTokenCurrency);
94
- const mockedAccount = (0, account_fixture_1.getMockedAccount)({ subAccounts: [mockedTokenAccount] });
95
- const mockedTransaction = (0, transaction_fixture_1.getMockedTransaction)({
96
- useAllAmount: false,
97
- amount: new bignumber_js_1.default(1),
98
- properties: {
99
- name: constants_1.HEDERA_TRANSACTION_KINDS.TokenAssociate.name,
100
- token: mockedTokenCurrency,
101
- },
102
- });
103
- const amount = mockedTransaction.amount;
104
- const totalSpent = amount.plus(estimatedFees.associate);
105
- const result = await (0, utils_1.calculateAmount)({
106
- account: mockedAccount,
107
- transaction: mockedTransaction,
108
- });
109
- expect(result).toEqual({ amount, totalSpent });
110
- });
111
- });
112
- describe("getEstimatedFees", () => {
113
- const mockedAccount = (0, account_fixture_1.getMockedAccount)();
114
- beforeEach(() => {
115
- jest.clearAllMocks();
116
- // reset LRU cache to make sure all tests receive correct mocks from mockedFetchLatest
117
- utils_1.getCurrencyToUSDRate.clear(mockedAccount.currency.ticker);
118
- });
119
- test("returns estimated fee based on USD rate for CryptoTransfer", async () => {
120
- // 1 HBAR = 1 USD
121
- const usdRate = 1;
122
- mockedFetchLatest.mockResolvedValueOnce([usdRate]);
123
- const result = await (0, utils_1.getEstimatedFees)(mockedAccount, constants_1.HEDERA_OPERATION_TYPES.CryptoTransfer);
124
- const baseFeeTinybar = 0.0001 * 10 ** 8;
125
- const expectedFee = new bignumber_js_1.default(baseFeeTinybar)
126
- .div(usdRate)
127
- .integerValue(bignumber_js_1.default.ROUND_CEIL)
128
- .multipliedBy(2); // safety rate
129
- expect(result.toFixed()).toBe(expectedFee.toFixed());
130
- });
131
- test("returns estimated fee based on USD rate for TokenTransfer", async () => {
132
- // 1 HBAR = 0.5 USD
133
- const usdRate = 0.5;
134
- mockedFetchLatest.mockResolvedValueOnce([usdRate]);
135
- const result = await (0, utils_1.getEstimatedFees)(mockedAccount, constants_1.HEDERA_OPERATION_TYPES.TokenTransfer);
136
- const baseFeeTinybar = 0.001 * 10 ** 8;
137
- const expectedFee = new bignumber_js_1.default(baseFeeTinybar)
138
- .div(usdRate)
139
- .integerValue(bignumber_js_1.default.ROUND_CEIL)
140
- .multipliedBy(2);
141
- expect(result.toFixed()).toBe(expectedFee.toFixed());
142
- });
143
- test("returns estimated fee based on USD rate for TokenAssociate", async () => {
144
- // 1 HBAR = 2 USD
145
- const usdRate = 2;
146
- mockedFetchLatest.mockResolvedValueOnce([usdRate]);
147
- const result = await (0, utils_1.getEstimatedFees)(mockedAccount, constants_1.HEDERA_OPERATION_TYPES.TokenAssociate);
148
- const baseFeeTinybar = 0.05 * 10 ** 8;
149
- const expectedFee = new bignumber_js_1.default(baseFeeTinybar)
150
- .div(usdRate)
151
- .integerValue(bignumber_js_1.default.ROUND_CEIL)
152
- .multipliedBy(2);
153
- expect(result.toFixed()).toBe(expectedFee.toFixed());
154
- });
155
- test("falls back to default estimate when cvs api returns null", async () => {
156
- const usdRate = null;
157
- mockedFetchLatest.mockResolvedValueOnce([usdRate]);
158
- const result = await (0, utils_1.getEstimatedFees)(mockedAccount, constants_1.HEDERA_OPERATION_TYPES.CryptoTransfer);
159
- const expected = new bignumber_js_1.default("150200").multipliedBy(2);
160
- expect(result.toFixed()).toBe(expected.toFixed());
161
- });
162
- test("falls back to default estimate on cvs api failure", async () => {
163
- mockedFetchLatest.mockRejectedValueOnce(new Error("Network error"));
164
- const result = await (0, utils_1.getEstimatedFees)(mockedAccount, constants_1.HEDERA_OPERATION_TYPES.CryptoTransfer);
165
- const expected = new bignumber_js_1.default("150200").multipliedBy(2);
166
- expect(result.toFixed()).toBe(expected.toFixed());
167
- });
168
- });
169
- describe("getSyncHash", () => {
170
- const mockedCurrency = (0, currency_fixture_1.getMockedCurrency)();
171
- test("returns a consistent hash for same input", () => {
172
- const hash1 = (0, utils_1.getSyncHash)(mockedCurrency, []);
173
- const hash2 = (0, utils_1.getSyncHash)(mockedCurrency, []);
174
- expect(hash2).toBe(hash1);
175
- });
176
- test("produces different hash if blacklistedTokenIds changes", () => {
177
- const hash1 = (0, utils_1.getSyncHash)(mockedCurrency, []);
178
- const hash2 = (0, utils_1.getSyncHash)(mockedCurrency, ["random_token"]);
179
- expect(hash1).not.toBe(hash2);
180
- });
181
- });
182
- describe("getSubAccounts", () => {
183
- test("returns sub account based on operations and mirror tokens", async () => {
184
- const firstTokenCurrencyFromCAL = (0, currency_fixture_1.getTokenCurrencyFromCAL)(0);
185
- const secondTokenCurrencyFromCAL = (0, currency_fixture_1.getTokenCurrencyFromCAL)(1);
186
- const mockedAccount = (0, account_fixture_1.getMockedAccount)();
187
- const mockedMirrorToken1 = (0, mirror_fixture_1.getMockedMirrorToken)({
188
- token_id: firstTokenCurrencyFromCAL.contractAddress,
189
- balance: 10,
190
- });
191
- const mockedMirrorToken2 = (0, mirror_fixture_1.getMockedMirrorToken)({
192
- token_id: secondTokenCurrencyFromCAL.contractAddress,
193
- balance: 0,
194
- });
195
- const mockedOperation1 = (0, operation_fixture_1.getMockedOperation)({
196
- accountId: (0, account_1.encodeTokenAccountId)(mockedAccount.id, firstTokenCurrencyFromCAL),
197
- });
198
- const mockedOperation2 = (0, operation_fixture_1.getMockedOperation)({
199
- accountId: (0, account_1.encodeTokenAccountId)(mockedAccount.id, secondTokenCurrencyFromCAL),
200
- });
201
- const result = await (0, utils_1.getSubAccounts)(mockedAccount.id, [mockedOperation1, mockedOperation2], [mockedMirrorToken1, mockedMirrorToken2]);
202
- const uniqueSubAccountIds = new Set(result.map(sa => sa.id));
203
- expect(result).toHaveLength(2);
204
- expect(result[0].token).toEqual(firstTokenCurrencyFromCAL);
205
- expect(result[1].token).toEqual(secondTokenCurrencyFromCAL);
206
- expect(result[0].balance).toEqual(new bignumber_js_1.default(10));
207
- expect(result[1].balance).toEqual(new bignumber_js_1.default(0));
208
- expect(result[0].operations).toEqual([mockedOperation1]);
209
- expect(result[1].operations).toEqual([mockedOperation2]);
210
- expect(uniqueSubAccountIds.size).toBe(result.length);
211
- });
212
- test("ignores operation if token is not listed in CAL", async () => {
213
- const mockedTokenCurrency = (0, currency_fixture_1.getMockedTokenCurrency)();
214
- const mockedAccount = (0, account_fixture_1.getMockedAccount)();
215
- const mockedOperation = (0, operation_fixture_1.getMockedOperation)({
216
- accountId: (0, account_1.encodeTokenAccountId)(mockedAccount.id, mockedTokenCurrency),
217
- });
218
- const result = await (0, utils_1.getSubAccounts)(mockedAccount.id, [mockedOperation], []);
219
- expect(result).toHaveLength(0);
220
- });
221
- test("returns sub account for mirror token with no operations yet (e.g. right after association)", async () => {
222
- const tokenCurrencyFromCAL = (0, currency_fixture_1.getTokenCurrencyFromCAL)(0);
223
- const mockedAccount = (0, account_fixture_1.getMockedAccount)();
224
- const mockedMirrorToken = (0, mirror_fixture_1.getMockedMirrorToken)({
225
- token_id: tokenCurrencyFromCAL.contractAddress,
226
- balance: 42,
227
- });
228
- const result = await (0, utils_1.getSubAccounts)(mockedAccount.id, [], [mockedMirrorToken]);
229
- expect(result).toHaveLength(1);
230
- expect(result[0].token).toEqual(tokenCurrencyFromCAL);
231
- expect(result[0].operations).toHaveLength(0);
232
- expect(result[0].balance.toString()).toBe("42");
233
- });
234
- });
235
- describe("prepareOperations", () => {
236
- const tokenCurrencyFromCAL = (0, currency_fixture_1.getTokenCurrencyFromCAL)(0);
237
- test("links token operation to existing coin operation with matching hash", () => {
238
- const mockedTokenAccount = (0, account_fixture_1.getMockedTokenAccount)(tokenCurrencyFromCAL);
239
- const mockedCoinOperation = (0, operation_fixture_1.getMockedOperation)({ hash: "shared" });
240
- const mockedTokenOperation = (0, operation_fixture_1.getMockedOperation)({
241
- hash: "shared",
242
- accountId: (0, account_1.encodeTokenAccountId)(mockedTokenAccount.parentId, tokenCurrencyFromCAL),
243
- });
244
- const result = (0, utils_1.prepareOperations)([mockedCoinOperation], [mockedTokenOperation], []);
245
- expect(result).toHaveLength(1);
246
- expect(result[0].subOperations).toEqual([mockedTokenOperation]);
247
- });
248
- test("creates NONE coin operation as parent if no coin op with matching hash exists", () => {
249
- const mockedTokenAccount = (0, account_fixture_1.getMockedTokenAccount)(tokenCurrencyFromCAL);
250
- const mockedOrphanTokenOperation = (0, operation_fixture_1.getMockedOperation)({
251
- hash: "unknown-hash",
252
- accountId: (0, account_1.encodeTokenAccountId)(mockedTokenAccount.parentId, tokenCurrencyFromCAL),
253
- });
254
- const result = (0, utils_1.prepareOperations)([], [mockedOrphanTokenOperation], []);
255
- const noneOp = result.find(op => op.type === "NONE");
256
- expect(typeof noneOp).toBe("object");
257
- expect(noneOp).not.toBeNull();
258
- expect(noneOp?.subOperations?.[0]).toEqual(mockedOrphanTokenOperation);
259
- expect(noneOp?.hash).toBe("unknown-hash");
260
- });
261
- test("adds associatedTokenId to ASSOCIATE_TOKEN coin operation based on consensusTimestamp", () => {
262
- const mockedCoinOperation = (0, operation_fixture_1.getMockedOperation)({
263
- type: "ASSOCIATE_TOKEN",
264
- extra: { consensusTimestamp: "123" },
265
- });
266
- const mockedMirrorToken = (0, mirror_fixture_1.getMockedMirrorToken)({
267
- token_id: "0.0.1001",
268
- created_timestamp: "123",
269
- });
270
- const result = (0, utils_1.prepareOperations)([mockedCoinOperation], [], [mockedMirrorToken]);
271
- const extra = (0, logic_1.isValidExtra)(result[0].extra) ? result[0].extra : null;
272
- expect(typeof extra).toBe("object");
273
- expect(extra).not.toBeNull();
274
- expect(extra?.associatedTokenId).toBe("0.0.1001");
275
- });
276
- test("ignores enrichment of ASSOCIATE_TOKEN operation if consensusTimestamp mismatches", () => {
277
- const mockedCoinOperation = (0, operation_fixture_1.getMockedOperation)({
278
- type: "ASSOCIATE_TOKEN",
279
- extra: { consensusTimestamp: "123" },
280
- });
281
- const mockedMirrorToken = (0, mirror_fixture_1.getMockedMirrorToken)({
282
- token_id: "0.0.1001",
283
- created_timestamp: "999",
284
- });
285
- const result = (0, utils_1.prepareOperations)([mockedCoinOperation], [], [mockedMirrorToken]);
286
- const extra = (0, logic_1.isValidExtra)(result[0].extra) ? result[0].extra : null;
287
- expect(typeof extra).toBe("object");
288
- expect(extra).not.toBeNull();
289
- expect(extra?.associatedTokenId).toBeUndefined();
290
- });
291
- });
292
- describe("mergeSubAccounts", () => {
293
- test("returns newSubAccounts if no initial account exists", () => {
294
- const mockedTokenCurrency1 = (0, currency_fixture_1.getMockedTokenCurrency)({ id: "token1" });
295
- const mockedTokenCurrency2 = (0, currency_fixture_1.getMockedTokenCurrency)({ id: "token2" });
296
- const mockedTokenAccount1 = (0, account_fixture_1.getMockedTokenAccount)(mockedTokenCurrency1, { id: "ta1" });
297
- const mockedTokenAccount2 = (0, account_fixture_1.getMockedTokenAccount)(mockedTokenCurrency2, { id: "ta2" });
298
- const initialAccount = undefined;
299
- const newSubAccounts = [mockedTokenAccount1, mockedTokenAccount2];
300
- const result = (0, utils_1.mergeSubAccounts)(initialAccount, newSubAccounts);
301
- expect(result).toEqual(newSubAccounts);
302
- });
303
- test("merges operations and updates only changed fields", () => {
304
- const mockedTokenCurrency = (0, currency_fixture_1.getMockedTokenCurrency)();
305
- const existingOperation = (0, operation_fixture_1.getMockedOperation)({ id: "op1" });
306
- const newOperation = (0, operation_fixture_1.getMockedOperation)({ id: "op2" });
307
- const newPendingOperation = (0, operation_fixture_1.getMockedOperation)({ id: "op3" });
308
- const existingTokenAccount = (0, account_fixture_1.getMockedTokenAccount)(mockedTokenCurrency, {
309
- id: "tokenaccount",
310
- balance: new bignumber_js_1.default(1000),
311
- creationDate: new Date(),
312
- operations: [existingOperation],
313
- pendingOperations: [],
314
- });
315
- const updatedTokenAccount = (0, account_fixture_1.getMockedTokenAccount)(mockedTokenCurrency, {
316
- id: "tokenaccount",
317
- balance: new bignumber_js_1.default(2000),
318
- creationDate: new Date(Date.now() - 24 * 60 * 60 * 1000),
319
- operations: [newOperation],
320
- pendingOperations: [newPendingOperation],
321
- });
322
- const mockedAccount = (0, account_fixture_1.getMockedAccount)({ subAccounts: [existingTokenAccount] });
323
- const result = (0, utils_1.mergeSubAccounts)(mockedAccount, [updatedTokenAccount]);
324
- const merged = result[0];
325
- expect(result).toHaveLength(1);
326
- expect(merged.creationDate).toEqual(existingTokenAccount.creationDate);
327
- expect(merged.balance).toEqual(new bignumber_js_1.default(2000));
328
- expect(merged.pendingOperations.map(op => op.id)).toEqual(["op3"]);
329
- expect(merged.operations.map(op => op.id)).toEqual(["op2", "op1"]);
330
- expect(merged.operationsCount).toEqual(2);
331
- });
332
- test("adds new sub accounts that are not present in initial account", () => {
333
- const existingToken = (0, currency_fixture_1.getMockedTokenCurrency)({ id: "token1" });
334
- const newToken = (0, currency_fixture_1.getMockedTokenCurrency)({ id: "token2" });
335
- const existingTokenAccount = (0, account_fixture_1.getMockedTokenAccount)(existingToken, { id: "ta1" });
336
- const newTokenAccount = (0, account_fixture_1.getMockedTokenAccount)(newToken, { id: "ta2" });
337
- const mockedAccount = (0, account_fixture_1.getMockedAccount)({ subAccounts: [existingTokenAccount] });
338
- const result = (0, utils_1.mergeSubAccounts)(mockedAccount, [existingTokenAccount, newTokenAccount]);
339
- expect(result.map(sa => sa.id)).toEqual(["ta1", "ta2"]);
340
- });
341
- });
342
- describe("applyPendingExtras", () => {
343
- test("merges valid extras from pending operations", () => {
344
- const opExtra1 = { consensusTimestamp: "1.2.3.4" };
345
- const pendingExtra1 = { associatedTokenId: "0.0.1234" };
346
- const mockedOperation1 = (0, operation_fixture_1.getMockedOperation)({ hash: "op1", extra: opExtra1 });
347
- const mockedPendingOperation1 = (0, operation_fixture_1.getMockedOperation)({ hash: "op1", extra: pendingExtra1 });
348
- const result = (0, utils_1.applyPendingExtras)([mockedOperation1], [mockedPendingOperation1]);
349
- expect(result[0].extra).toEqual({
350
- ...mockedOperation1.extra,
351
- ...mockedPendingOperation1.extra,
352
- });
353
- });
354
- test("returns original operation if no matching pending is found", () => {
355
- const opExtra = { consensusTimestamp: "1.2.3.4" };
356
- const pendingExtra = { associatedTokenId: "0.0.1234" };
357
- const mockedOperation = (0, operation_fixture_1.getMockedOperation)({ hash: "unknown", extra: opExtra });
358
- const mockedPendingOperation = (0, operation_fixture_1.getMockedOperation)({ hash: "op1", extra: pendingExtra });
359
- const result = (0, utils_1.applyPendingExtras)([mockedOperation], [mockedPendingOperation]);
360
- expect(result[0].extra).toEqual(mockedOperation.extra);
361
- });
362
- });
363
- describe("patchOperationWithExtra", () => {
364
- test("adds extra to operation and nested sub operations", () => {
365
- const mockedOperation = (0, operation_fixture_1.getMockedOperation)({
366
- hash: "parent",
367
- extra: {},
368
- subOperations: [(0, operation_fixture_1.getMockedOperation)({ hash: "sub1", extra: {} })],
369
- });
370
- const extra = {
371
- consensusTimestamp: "12345",
372
- associatedTokenId: "0.0.1001",
373
- };
374
- const patched = (0, utils_1.patchOperationWithExtra)(mockedOperation, extra);
375
- expect(patched.extra).toEqual(extra);
376
- expect(patched.subOperations?.[0].extra).toEqual(extra);
377
- });
378
- });
379
- describe("checkAccountTokenAssociationStatus", () => {
380
- const accountId = "0.0.1234";
381
- const tokenId = "0.0.5678";
382
- beforeEach(() => {
383
- jest.clearAllMocks();
384
- // reset LRU cache to make sure all tests receive correct mocks from mockedGetAccount
385
- utils_1.checkAccountTokenAssociationStatus.clear(`${accountId}-${tokenId}`);
386
- });
387
- test("returns true if max_automatic_token_associations === -1", async () => {
388
- mockedGetAccount.mockResolvedValueOnce({
389
- account: accountId,
390
- max_automatic_token_associations: -1,
391
- balance: {
392
- balance: 0,
393
- timestamp: "",
394
- tokens: [],
395
- },
396
- });
397
- const result = await (0, utils_1.checkAccountTokenAssociationStatus)(accountId, tokenId);
398
- expect(result).toBe(true);
399
- });
400
- test("returns true if token is already associated", async () => {
401
- mockedGetAccount.mockResolvedValueOnce({
402
- account: accountId,
403
- max_automatic_token_associations: 0,
404
- balance: {
405
- balance: 1,
406
- timestamp: "",
407
- tokens: [{ token_id: tokenId, balance: 1 }],
408
- },
409
- });
410
- const result = await (0, utils_1.checkAccountTokenAssociationStatus)(accountId, tokenId);
411
- expect(result).toBe(true);
412
- });
413
- test("returns false if token is not associated", async () => {
414
- mockedGetAccount.mockResolvedValueOnce({
415
- account: accountId,
416
- max_automatic_token_associations: 0,
417
- balance: {
418
- balance: 1,
419
- timestamp: "",
420
- tokens: [{ token_id: "0.0.9999", balance: 1 }],
421
- },
422
- });
423
- const result = await (0, utils_1.checkAccountTokenAssociationStatus)(accountId, tokenId);
424
- expect(result).toBe(false);
425
- });
426
- });
427
- });
428
- //# sourceMappingURL=utils.integration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.integration.test.js","sourceRoot":"","sources":["../../src/bridge/utils.integration.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=logic.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logic.test.d.ts","sourceRoot":"","sources":["../src/logic.test.ts"],"names":[],"mappings":""}
package/lib/logic.test.js DELETED
@@ -1,111 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const cryptoassets_1 = require("@ledgerhq/cryptoassets");
4
- const logic_1 = require("./logic");
5
- const account_fixture_1 = require("./test/fixtures/account.fixture");
6
- const operation_fixture_1 = require("./test/fixtures/operation.fixture");
7
- const currency_fixture_1 = require("./test/fixtures/currency.fixture");
8
- const constants_1 = require("./constants");
9
- describe("logic", () => {
10
- describe("getTransactionExplorer", () => {
11
- test("Tx explorer URL is converted from hash to consensus timestamp", async () => {
12
- const explorerView = (0, cryptoassets_1.getCryptoCurrencyById)("hedera").explorerViews[0];
13
- expect(explorerView).toEqual({
14
- tx: expect.any(String),
15
- address: expect.any(String),
16
- });
17
- const mockedOperation = (0, operation_fixture_1.getMockedOperation)({
18
- extra: { consensusTimestamp: "1.2.3.4" },
19
- });
20
- const newUrl = (0, logic_1.getTransactionExplorer)(explorerView, mockedOperation);
21
- expect(newUrl).toBe("https://hashscan.io/mainnet/transaction/1.2.3.4");
22
- });
23
- test("Tx explorer URL is based on transaction id if consensus timestamp is not available", async () => {
24
- const explorerView = (0, cryptoassets_1.getCryptoCurrencyById)("hedera").explorerViews[0];
25
- expect(explorerView).toEqual({
26
- tx: expect.any(String),
27
- address: expect.any(String),
28
- });
29
- const mockedOperation = (0, operation_fixture_1.getMockedOperation)({
30
- extra: { transactionId: "0.0.1234567-123-123" },
31
- });
32
- const newUrl = (0, logic_1.getTransactionExplorer)(explorerView, mockedOperation);
33
- expect(newUrl).toBe("https://hashscan.io/mainnet/transaction/0.0.1234567-123-123");
34
- });
35
- });
36
- describe("isTokenAssociateTransaction", () => {
37
- test("returns correct value based on tx.properties", () => {
38
- expect((0, logic_1.isTokenAssociateTransaction)({
39
- properties: { name: constants_1.HEDERA_TRANSACTION_KINDS.TokenAssociate.name },
40
- })).toBe(true);
41
- expect((0, logic_1.isTokenAssociateTransaction)({
42
- properties: { name: "transfer" },
43
- })).toBe(false);
44
- expect((0, logic_1.isTokenAssociateTransaction)({})).toBe(false);
45
- });
46
- });
47
- describe("isAutoTokenAssociationEnabled", () => {
48
- test("returns value based on isAutoTokenAssociationEnabled flag", () => {
49
- expect((0, logic_1.isAutoTokenAssociationEnabled)({
50
- hederaResources: { isAutoTokenAssociationEnabled: true },
51
- })).toBe(true);
52
- expect((0, logic_1.isAutoTokenAssociationEnabled)({
53
- hederaResources: { isAutoTokenAssociationEnabled: false },
54
- })).toBe(false);
55
- expect((0, logic_1.isAutoTokenAssociationEnabled)({})).toBe(false);
56
- });
57
- });
58
- describe("isTokenAssociationRequired", () => {
59
- test("should return false if token is already associated (token account exists)", () => {
60
- const mockedTokenCurrency = (0, currency_fixture_1.getMockedTokenCurrency)();
61
- const mockedTokenAccount = (0, account_fixture_1.getMockedTokenAccount)(mockedTokenCurrency);
62
- const mockedAccount = (0, account_fixture_1.getMockedAccount)({ subAccounts: [mockedTokenAccount] });
63
- expect((0, logic_1.isTokenAssociationRequired)(mockedAccount, mockedTokenCurrency)).toBe(false);
64
- });
65
- test("should return false if auto token associations are enabled", () => {
66
- const mockedTokenCurrency = (0, currency_fixture_1.getMockedTokenCurrency)();
67
- const mockedAccount = (0, account_fixture_1.getMockedAccount)({
68
- subAccounts: [],
69
- hederaResources: {
70
- maxAutomaticTokenAssociations: -1,
71
- isAutoTokenAssociationEnabled: true,
72
- },
73
- });
74
- expect((0, logic_1.isTokenAssociationRequired)(mockedAccount, mockedTokenCurrency)).toBe(false);
75
- });
76
- test("should return true if token is not associated and auto associations are disabled", () => {
77
- const mockedTokenCurrency = (0, currency_fixture_1.getMockedTokenCurrency)();
78
- const mockedAccount = (0, account_fixture_1.getMockedAccount)({ subAccounts: [] });
79
- expect((0, logic_1.isTokenAssociationRequired)(mockedAccount, mockedTokenCurrency)).toBe(true);
80
- });
81
- test("should return false if token is undefined", () => {
82
- const mockedAccount = (0, account_fixture_1.getMockedAccount)({ subAccounts: [] });
83
- expect((0, logic_1.isTokenAssociationRequired)(mockedAccount, undefined)).toBe(false);
84
- });
85
- test("should return false for legacy accounts without subAccounts or hederaResources", () => {
86
- const mockedTokenCurrency = (0, currency_fixture_1.getMockedTokenCurrency)();
87
- const mockedAccount = (0, account_fixture_1.getMockedAccount)();
88
- delete mockedAccount.subAccounts;
89
- delete mockedAccount.hederaResources;
90
- expect((0, logic_1.isTokenAssociationRequired)(mockedAccount, mockedTokenCurrency)).toBe(true);
91
- });
92
- });
93
- describe("isValidExtra", () => {
94
- test("returns true for object and false for invalid types", () => {
95
- expect((0, logic_1.isValidExtra)({ some: "value" })).toBe(true);
96
- expect((0, logic_1.isValidExtra)(null)).toBe(false);
97
- expect((0, logic_1.isValidExtra)(undefined)).toBe(false);
98
- expect((0, logic_1.isValidExtra)("string")).toBe(false);
99
- expect((0, logic_1.isValidExtra)(123)).toBe(false);
100
- expect((0, logic_1.isValidExtra)([])).toBe(false);
101
- });
102
- });
103
- describe("sendRecipientCanNext", () => {
104
- test("handles association warnings", () => {
105
- expect((0, logic_1.sendRecipientCanNext)({ warnings: {} })).toBe(true);
106
- expect((0, logic_1.sendRecipientCanNext)({ warnings: { missingAssociation: new Error() } })).toBe(false);
107
- expect((0, logic_1.sendRecipientCanNext)({ warnings: { unverifiedAssociation: new Error() } })).toBe(false);
108
- });
109
- });
110
- });
111
- //# sourceMappingURL=logic.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logic.test.js","sourceRoot":"","sources":["../src/logic.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=mirror.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mirror.test.d.ts","sourceRoot":"","sources":["../../src/api/mirror.test.ts"],"names":[],"mappings":""}