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