@ledgerhq/live-common 34.54.0-nightly.20251204023901 → 34.54.0-nightly.20251205023918
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/lib/bridge/generic-alpaca/broadcast.d.ts.map +1 -1
- package/lib/bridge/generic-alpaca/broadcast.js +3 -3
- package/lib/bridge/generic-alpaca/broadcast.js.map +1 -1
- package/lib/bridge/generic-alpaca/currencyBridge.d.ts.map +1 -1
- package/lib/bridge/generic-alpaca/currencyBridge.js +1 -3
- package/lib/bridge/generic-alpaca/currencyBridge.js.map +1 -1
- package/lib/bridge/generic-alpaca/estimateMaxSpendable.d.ts.map +1 -1
- package/lib/bridge/generic-alpaca/estimateMaxSpendable.js +2 -1
- package/lib/bridge/generic-alpaca/estimateMaxSpendable.js.map +1 -1
- package/lib/bridge/generic-alpaca/getAccountShape.d.ts.map +1 -1
- package/lib/bridge/generic-alpaca/getAccountShape.js +16 -7
- package/lib/bridge/generic-alpaca/getAccountShape.js.map +1 -1
- package/lib/bridge/generic-alpaca/getTransactionStatus.d.ts.map +1 -1
- package/lib/bridge/generic-alpaca/getTransactionStatus.js +16 -1
- package/lib/bridge/generic-alpaca/getTransactionStatus.js.map +1 -1
- package/lib/bridge/generic-alpaca/prepareTransaction.d.ts.map +1 -1
- package/lib/bridge/generic-alpaca/prepareTransaction.js +38 -4
- package/lib/bridge/generic-alpaca/prepareTransaction.js.map +1 -1
- package/lib/bridge/generic-alpaca/signOperation.d.ts.map +1 -1
- package/lib/bridge/generic-alpaca/signOperation.js +18 -2
- package/lib/bridge/generic-alpaca/signOperation.js.map +1 -1
- package/lib/bridge/generic-alpaca/signer/Eth.d.ts +2 -0
- package/lib/bridge/generic-alpaca/signer/Eth.d.ts.map +1 -1
- package/lib/bridge/generic-alpaca/signer/Eth.js +8 -1
- package/lib/bridge/generic-alpaca/signer/Eth.js.map +1 -1
- package/lib/bridge/generic-alpaca/signer/index.d.ts.map +1 -1
- package/lib/bridge/generic-alpaca/signer/index.js +7 -0
- package/lib/bridge/generic-alpaca/signer/index.js.map +1 -1
- package/lib/bridge/generic-alpaca/types.d.ts +4 -0
- package/lib/bridge/generic-alpaca/types.d.ts.map +1 -1
- package/lib/bridge/generic-alpaca/utils.d.ts.map +1 -1
- package/lib/bridge/generic-alpaca/utils.js +11 -3
- package/lib/bridge/generic-alpaca/utils.js.map +1 -1
- package/lib/bridge/impl.d.ts.map +1 -1
- package/lib/bridge/impl.js +14 -3
- package/lib/bridge/impl.js.map +1 -1
- package/lib/e2e/index.d.ts +7 -0
- package/lib/e2e/index.d.ts.map +1 -1
- package/lib/env.react.d.ts +1 -1
- package/lib/env.react.d.ts.map +1 -1
- package/lib/families/canton/config.d.ts.map +1 -1
- package/lib/families/canton/config.js +4 -4
- package/lib/families/canton/config.js.map +1 -1
- package/lib/families/celo/setup.d.ts.map +1 -1
- package/lib/families/celo/setup.js +11 -0
- package/lib/families/celo/setup.js.map +1 -1
- package/lib/families/evm/bridge/mock.d.ts +1 -0
- package/lib/families/evm/bridge/mock.d.ts.map +1 -1
- package/lib/families/evm/bridge/mock.js +12 -0
- package/lib/families/evm/bridge/mock.js.map +1 -1
- package/lib/families/evm/setup.d.ts +1 -4
- package/lib/families/evm/setup.d.ts.map +1 -1
- package/lib/families/evm/setup.js +1 -8
- package/lib/families/evm/setup.js.map +1 -1
- package/lib/families/evm/walletApiAdapter.d.ts +7 -0
- package/lib/families/evm/walletApiAdapter.d.ts.map +1 -1
- package/lib/families/evm/walletApiAdapter.js +36 -2
- package/lib/families/evm/walletApiAdapter.js.map +1 -1
- package/lib/families/hedera/react.d.ts +6 -0
- package/lib/families/hedera/react.d.ts.map +1 -0
- package/lib/families/hedera/react.js +50 -0
- package/lib/families/hedera/react.js.map +1 -0
- package/lib/families/stacks/constants.d.ts +1 -1
- package/lib/families/stacks/constants.d.ts.map +1 -1
- package/lib/families/stacks/constants.js +1 -1
- package/lib/families/stacks/constants.js.map +1 -1
- package/lib/featureFlags/defaultFeatures.d.ts.map +1 -1
- package/lib/featureFlags/defaultFeatures.js +1 -0
- package/lib/featureFlags/defaultFeatures.js.map +1 -1
- package/lib/featureFlags/useFeature.d.ts +1 -1
- package/lib/featureFlags/useFeature.d.ts.map +1 -1
- package/lib/generated/bridge/js.d.ts +0 -1
- package/lib/generated/bridge/js.d.ts.map +1 -1
- package/lib/generated/bridge/js.js +30 -32
- package/lib/generated/bridge/js.js.map +1 -1
- package/lib/generated/bridge/mock.d.ts +1 -0
- package/lib/generated/bridge/mock.d.ts.map +1 -1
- package/lib/operation.d.ts.map +1 -1
- package/lib/operation.js +7 -2
- package/lib/operation.js.map +1 -1
- package/lib/wallet-api/constants.d.ts +1 -1
- package/lib-es/bridge/generic-alpaca/broadcast.d.ts.map +1 -1
- package/lib-es/bridge/generic-alpaca/broadcast.js +3 -3
- package/lib-es/bridge/generic-alpaca/broadcast.js.map +1 -1
- package/lib-es/bridge/generic-alpaca/currencyBridge.d.ts.map +1 -1
- package/lib-es/bridge/generic-alpaca/currencyBridge.js +1 -3
- package/lib-es/bridge/generic-alpaca/currencyBridge.js.map +1 -1
- package/lib-es/bridge/generic-alpaca/estimateMaxSpendable.d.ts.map +1 -1
- package/lib-es/bridge/generic-alpaca/estimateMaxSpendable.js +2 -1
- package/lib-es/bridge/generic-alpaca/estimateMaxSpendable.js.map +1 -1
- package/lib-es/bridge/generic-alpaca/getAccountShape.d.ts.map +1 -1
- package/lib-es/bridge/generic-alpaca/getAccountShape.js +16 -7
- package/lib-es/bridge/generic-alpaca/getAccountShape.js.map +1 -1
- package/lib-es/bridge/generic-alpaca/getTransactionStatus.d.ts.map +1 -1
- package/lib-es/bridge/generic-alpaca/getTransactionStatus.js +16 -1
- package/lib-es/bridge/generic-alpaca/getTransactionStatus.js.map +1 -1
- package/lib-es/bridge/generic-alpaca/prepareTransaction.d.ts.map +1 -1
- package/lib-es/bridge/generic-alpaca/prepareTransaction.js +38 -4
- package/lib-es/bridge/generic-alpaca/prepareTransaction.js.map +1 -1
- package/lib-es/bridge/generic-alpaca/signOperation.d.ts.map +1 -1
- package/lib-es/bridge/generic-alpaca/signOperation.js +18 -2
- package/lib-es/bridge/generic-alpaca/signOperation.js.map +1 -1
- package/lib-es/bridge/generic-alpaca/signer/Eth.d.ts +2 -0
- package/lib-es/bridge/generic-alpaca/signer/Eth.d.ts.map +1 -1
- package/lib-es/bridge/generic-alpaca/signer/Eth.js +4 -0
- package/lib-es/bridge/generic-alpaca/signer/Eth.js.map +1 -1
- package/lib-es/bridge/generic-alpaca/signer/index.d.ts.map +1 -1
- package/lib-es/bridge/generic-alpaca/signer/index.js +7 -0
- package/lib-es/bridge/generic-alpaca/signer/index.js.map +1 -1
- package/lib-es/bridge/generic-alpaca/types.d.ts +4 -0
- package/lib-es/bridge/generic-alpaca/types.d.ts.map +1 -1
- package/lib-es/bridge/generic-alpaca/utils.d.ts.map +1 -1
- package/lib-es/bridge/generic-alpaca/utils.js +11 -3
- package/lib-es/bridge/generic-alpaca/utils.js.map +1 -1
- package/lib-es/bridge/impl.d.ts.map +1 -1
- package/lib-es/bridge/impl.js +14 -3
- package/lib-es/bridge/impl.js.map +1 -1
- package/lib-es/e2e/index.d.ts +7 -0
- package/lib-es/e2e/index.d.ts.map +1 -1
- package/lib-es/env.react.d.ts +1 -1
- package/lib-es/env.react.d.ts.map +1 -1
- package/lib-es/families/canton/config.d.ts.map +1 -1
- package/lib-es/families/canton/config.js +4 -4
- package/lib-es/families/canton/config.js.map +1 -1
- package/lib-es/families/celo/setup.d.ts.map +1 -1
- package/lib-es/families/celo/setup.js +11 -0
- package/lib-es/families/celo/setup.js.map +1 -1
- package/lib-es/families/evm/bridge/mock.d.ts +1 -0
- package/lib-es/families/evm/bridge/mock.d.ts.map +1 -1
- package/lib-es/families/evm/bridge/mock.js +12 -0
- package/lib-es/families/evm/bridge/mock.js.map +1 -1
- package/lib-es/families/evm/setup.d.ts +1 -4
- package/lib-es/families/evm/setup.d.ts.map +1 -1
- package/lib-es/families/evm/setup.js +2 -8
- package/lib-es/families/evm/setup.js.map +1 -1
- package/lib-es/families/evm/walletApiAdapter.d.ts +7 -0
- package/lib-es/families/evm/walletApiAdapter.d.ts.map +1 -1
- package/lib-es/families/evm/walletApiAdapter.js +30 -1
- package/lib-es/families/evm/walletApiAdapter.js.map +1 -1
- package/lib-es/families/hedera/react.d.ts +6 -0
- package/lib-es/families/hedera/react.d.ts.map +1 -0
- package/lib-es/families/hedera/react.js +41 -0
- package/lib-es/families/hedera/react.js.map +1 -0
- package/lib-es/families/stacks/constants.d.ts +1 -1
- package/lib-es/families/stacks/constants.d.ts.map +1 -1
- package/lib-es/families/stacks/constants.js +1 -1
- package/lib-es/families/stacks/constants.js.map +1 -1
- package/lib-es/featureFlags/defaultFeatures.d.ts.map +1 -1
- package/lib-es/featureFlags/defaultFeatures.js +1 -0
- package/lib-es/featureFlags/defaultFeatures.js.map +1 -1
- package/lib-es/featureFlags/useFeature.d.ts +1 -1
- package/lib-es/featureFlags/useFeature.d.ts.map +1 -1
- package/lib-es/generated/bridge/js.d.ts +0 -1
- package/lib-es/generated/bridge/js.d.ts.map +1 -1
- package/lib-es/generated/bridge/js.js +0 -2
- package/lib-es/generated/bridge/js.js.map +1 -1
- package/lib-es/generated/bridge/mock.d.ts +1 -0
- package/lib-es/generated/bridge/mock.d.ts.map +1 -1
- package/lib-es/operation.d.ts.map +1 -1
- package/lib-es/operation.js +7 -2
- package/lib-es/operation.js.map +1 -1
- package/lib-es/wallet-api/constants.d.ts +1 -1
- package/package.json +55 -55
- package/src/bridge/generic-alpaca/broadcast.ts +6 -3
- package/src/bridge/generic-alpaca/currencyBridge.ts +1 -3
- package/src/bridge/generic-alpaca/estimateMaxSpendable.ts +2 -1
- package/src/bridge/generic-alpaca/getAccountShape.ts +24 -12
- package/src/bridge/generic-alpaca/getTransactionStatus.ts +16 -1
- package/src/bridge/generic-alpaca/prepareTransaction.ts +44 -10
- package/src/bridge/generic-alpaca/signOperation.ts +18 -2
- package/src/bridge/generic-alpaca/signer/Eth.ts +5 -1
- package/src/bridge/generic-alpaca/signer/index.ts +7 -0
- package/src/bridge/generic-alpaca/tests/getAccountShape.test.ts +2 -2
- package/src/bridge/generic-alpaca/tests/prepareTransaction.test.ts +32 -0
- package/src/bridge/generic-alpaca/types.ts +4 -0
- package/src/bridge/generic-alpaca/utils.test.ts +1 -0
- package/src/bridge/generic-alpaca/utils.ts +14 -3
- package/src/bridge/impl.ts +16 -3
- package/src/families/canton/config.ts +5 -4
- package/src/families/celo/setup.ts +12 -0
- package/src/families/evm/bridge/mock.ts +14 -0
- package/src/families/evm/setup.ts +3 -22
- package/src/families/evm/walletApiAdapter.ts +33 -1
- package/src/families/hedera/__snapshots__/bridge.integration.test.ts.snap +229 -14
- package/src/families/hedera/react.test.ts +272 -0
- package/src/families/hedera/react.ts +63 -0
- package/src/families/stacks/__snapshots__/bridge.integration.test.ts.snap +1537 -18
- package/src/families/stacks/__tests__/sync.integration.test.ts +2 -2
- package/src/families/stacks/constants.ts +1 -1
- package/src/families/stellar/__snapshots__/bridge.integration.test.ts.snap +9 -9
- package/src/featureFlags/defaultFeatures.ts +1 -0
- package/src/generated/bridge/js.ts +0 -2
- package/src/operation.ts +10 -2
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @jest-environment jsdom
|
|
3
|
+
*/
|
|
4
|
+
import "../../__tests__/test-helpers/dom-polyfill";
|
|
5
|
+
import BigNumber from "bignumber.js";
|
|
6
|
+
import invariant from "invariant";
|
|
7
|
+
import { getCurrentHederaPreloadData } from "@ledgerhq/coin-hedera/preload-data";
|
|
8
|
+
import { apiClient } from "@ledgerhq/coin-hedera/network/api";
|
|
9
|
+
import { LiveConfig } from "@ledgerhq/live-config/LiveConfig";
|
|
10
|
+
import { renderHook } from "@testing-library/react";
|
|
11
|
+
import { makeBridgeCacheSystem } from "../../bridge/cache";
|
|
12
|
+
import { liveConfig } from "../../config/sharedConfig";
|
|
13
|
+
import { getCryptoCurrencyById } from "../../currencies";
|
|
14
|
+
import * as hooks from "./react";
|
|
15
|
+
import type { HederaAccount, HederaDelegation } from "./types";
|
|
16
|
+
|
|
17
|
+
const localCache: Record<string, unknown> = {};
|
|
18
|
+
const cache = makeBridgeCacheSystem({
|
|
19
|
+
saveData(c, d) {
|
|
20
|
+
localCache[c.id] = d;
|
|
21
|
+
return Promise.resolve();
|
|
22
|
+
},
|
|
23
|
+
getData(c) {
|
|
24
|
+
return Promise.resolve(localCache[c.id]);
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
describe("hedera/react", () => {
|
|
29
|
+
const currency = getCryptoCurrencyById("hedera");
|
|
30
|
+
|
|
31
|
+
beforeAll(() => {
|
|
32
|
+
LiveConfig.setConfig(liveConfig);
|
|
33
|
+
jest.spyOn(apiClient, "getNodes").mockResolvedValue([
|
|
34
|
+
{
|
|
35
|
+
description: "Hosted by LG | Seoul, South Korea",
|
|
36
|
+
node_id: 0,
|
|
37
|
+
node_account_id: "0.0.3",
|
|
38
|
+
stake: 45000000000000000,
|
|
39
|
+
stake_rewarded: 86596417100000000,
|
|
40
|
+
min_stake: 0,
|
|
41
|
+
max_stake: 45000000000000000,
|
|
42
|
+
reward_rate_start: 3500,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
description: "Hosted by Swirlds | Iowa, USA",
|
|
46
|
+
node_id: 1,
|
|
47
|
+
node_account_id: "0.0.4",
|
|
48
|
+
stake: 45000000000000000,
|
|
49
|
+
stake_rewarded: 88990261300000000,
|
|
50
|
+
min_stake: 0,
|
|
51
|
+
max_stake: 45000000000000000,
|
|
52
|
+
reward_rate_start: 4000,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
description: "Hosted for Wipro | Amsterdam, Netherlands",
|
|
56
|
+
node_id: 3,
|
|
57
|
+
node_account_id: "0.0.6",
|
|
58
|
+
stake: 45000000000000000,
|
|
59
|
+
stake_rewarded: 21477855400000000,
|
|
60
|
+
min_stake: 0,
|
|
61
|
+
max_stake: 45000000000000000,
|
|
62
|
+
reward_rate_start: 5000,
|
|
63
|
+
},
|
|
64
|
+
]);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
describe("useHederaPreloadData", () => {
|
|
68
|
+
beforeEach(async () => {
|
|
69
|
+
const { prepare } = setup();
|
|
70
|
+
await prepare();
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("should return preloaded data", async () => {
|
|
74
|
+
const { result } = renderHook(() => hooks.useHederaPreloadData(currency));
|
|
75
|
+
const data = getCurrentHederaPreloadData(currency);
|
|
76
|
+
|
|
77
|
+
expect(result.current).toStrictEqual(data);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
describe("useHederaValidators", () => {
|
|
82
|
+
beforeEach(async () => {
|
|
83
|
+
const { prepare } = setup();
|
|
84
|
+
await prepare();
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it("should return all validators when no search query", () => {
|
|
88
|
+
const { result } = renderHook(() => hooks.useHederaValidators(currency));
|
|
89
|
+
const data = getCurrentHederaPreloadData(currency);
|
|
90
|
+
|
|
91
|
+
expect(result.current).toEqual(data.validators);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it("should return all validators when search query is empty string", () => {
|
|
95
|
+
const { result } = renderHook(() => hooks.useHederaValidators(currency, ""));
|
|
96
|
+
const data = getCurrentHederaPreloadData(currency);
|
|
97
|
+
|
|
98
|
+
expect(result.current).toEqual(data.validators);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it("should filter validators by name", () => {
|
|
102
|
+
const { result } = renderHook(() => hooks.useHederaValidators(currency, "Swirlds"));
|
|
103
|
+
|
|
104
|
+
expect(result.current.length).toBeGreaterThan(0);
|
|
105
|
+
result.current.forEach(validator => {
|
|
106
|
+
expect(validator.name.toLowerCase()).toContain("swirlds");
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it("should filter validators by node ID", () => {
|
|
111
|
+
const data = getCurrentHederaPreloadData(currency);
|
|
112
|
+
const firstValidator = data.validators[0];
|
|
113
|
+
|
|
114
|
+
if (firstValidator) {
|
|
115
|
+
const { result } = renderHook(() =>
|
|
116
|
+
hooks.useHederaValidators(currency, firstValidator.nodeId.toString()),
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
expect(result.current.length).toBeGreaterThan(0);
|
|
120
|
+
expect(result.current.some(v => v.nodeId === firstValidator.nodeId)).toBe(true);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it("should return empty array when no validators match search", () => {
|
|
125
|
+
const { result } = renderHook(() =>
|
|
126
|
+
hooks.useHederaValidators(currency, "nonexistingvalidator"),
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
expect(result.current).toEqual([]);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it("should be case insensitive when filtering", () => {
|
|
133
|
+
const { result: upperResult } = renderHook(() =>
|
|
134
|
+
hooks.useHederaValidators(currency, "SWIRLDS"),
|
|
135
|
+
);
|
|
136
|
+
const { result: lowerResult } = renderHook(() =>
|
|
137
|
+
hooks.useHederaValidators(currency, "swirlds"),
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
expect(upperResult.current.length).toEqual(lowerResult.current.length);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
describe("useHederaEnrichedDelegation", () => {
|
|
145
|
+
const mockAccount = {
|
|
146
|
+
type: "Account",
|
|
147
|
+
id: "mock-account-id",
|
|
148
|
+
currency,
|
|
149
|
+
balance: new BigNumber(1000000),
|
|
150
|
+
spendableBalance: new BigNumber(1000000),
|
|
151
|
+
hederaResources: {
|
|
152
|
+
delegation: null,
|
|
153
|
+
},
|
|
154
|
+
} as HederaAccount;
|
|
155
|
+
|
|
156
|
+
beforeEach(async () => {
|
|
157
|
+
const { prepare } = setup();
|
|
158
|
+
await prepare();
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it("should enrich delegation with validator data", () => {
|
|
162
|
+
const data = getCurrentHederaPreloadData(currency);
|
|
163
|
+
const validator = data.validators[0];
|
|
164
|
+
invariant(validator, "No validators available for test");
|
|
165
|
+
|
|
166
|
+
const delegation: HederaDelegation = {
|
|
167
|
+
nodeId: validator.nodeId,
|
|
168
|
+
delegated: new BigNumber(100000),
|
|
169
|
+
pendingReward: new BigNumber(500),
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
const { result } = renderHook(() =>
|
|
173
|
+
hooks.useHederaEnrichedDelegation(mockAccount, delegation),
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
expect(result.current).toEqual({
|
|
177
|
+
nodeId: validator.nodeId,
|
|
178
|
+
delegated: delegation.delegated,
|
|
179
|
+
pendingReward: delegation.pendingReward,
|
|
180
|
+
status: "overstaked",
|
|
181
|
+
validator: {
|
|
182
|
+
name: validator.name,
|
|
183
|
+
address: validator.address,
|
|
184
|
+
addressChecksum: validator.addressChecksum,
|
|
185
|
+
nodeId: validator.nodeId,
|
|
186
|
+
minStake: validator.minStake,
|
|
187
|
+
maxStake: validator.maxStake,
|
|
188
|
+
activeStake: validator.activeStake,
|
|
189
|
+
activeStakePercentage: validator.activeStakePercentage,
|
|
190
|
+
overstaked: validator.overstaked,
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it("should handle delegation with non-existent validator", () => {
|
|
196
|
+
const delegation: HederaDelegation = {
|
|
197
|
+
nodeId: 999999,
|
|
198
|
+
delegated: new BigNumber(100000),
|
|
199
|
+
pendingReward: new BigNumber(500),
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
const { result } = renderHook(() =>
|
|
203
|
+
hooks.useHederaEnrichedDelegation(mockAccount, delegation),
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
expect(result.current).toEqual({
|
|
207
|
+
nodeId: delegation.nodeId,
|
|
208
|
+
delegated: delegation.delegated,
|
|
209
|
+
pendingReward: delegation.pendingReward,
|
|
210
|
+
status: "inactive",
|
|
211
|
+
validator: {
|
|
212
|
+
name: "",
|
|
213
|
+
address: "",
|
|
214
|
+
addressChecksum: null,
|
|
215
|
+
nodeId: delegation.nodeId,
|
|
216
|
+
minStake: new BigNumber(0),
|
|
217
|
+
maxStake: new BigNumber(0),
|
|
218
|
+
activeStake: new BigNumber(0),
|
|
219
|
+
activeStakePercentage: new BigNumber(0),
|
|
220
|
+
overstaked: false,
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
it("should handle delegation with zero staked amount", () => {
|
|
226
|
+
const data = getCurrentHederaPreloadData(currency);
|
|
227
|
+
const validator = data.validators[0];
|
|
228
|
+
invariant(validator, "No validators available for test");
|
|
229
|
+
|
|
230
|
+
const delegation: HederaDelegation = {
|
|
231
|
+
nodeId: validator.nodeId,
|
|
232
|
+
delegated: new BigNumber(0),
|
|
233
|
+
pendingReward: new BigNumber(0),
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
const { result } = renderHook(() =>
|
|
237
|
+
hooks.useHederaEnrichedDelegation(mockAccount, delegation),
|
|
238
|
+
);
|
|
239
|
+
|
|
240
|
+
expect(result.current.delegated).toEqual(new BigNumber(0));
|
|
241
|
+
expect(result.current.validator.nodeId).toEqual(validator.nodeId);
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
it("should handle delegation with pending rewards", () => {
|
|
245
|
+
const data = getCurrentHederaPreloadData(currency);
|
|
246
|
+
const validator = data.validators[0];
|
|
247
|
+
invariant(validator, "No validators available for test");
|
|
248
|
+
|
|
249
|
+
const delegation: HederaDelegation = {
|
|
250
|
+
nodeId: validator.nodeId,
|
|
251
|
+
delegated: new BigNumber(100000),
|
|
252
|
+
pendingReward: new BigNumber(1500),
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
const { result } = renderHook(() =>
|
|
256
|
+
hooks.useHederaEnrichedDelegation(mockAccount, delegation),
|
|
257
|
+
);
|
|
258
|
+
|
|
259
|
+
expect(result.current.pendingReward).toEqual(new BigNumber(1500));
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
function setup(): {
|
|
265
|
+
prepare: () => Promise<unknown>;
|
|
266
|
+
} {
|
|
267
|
+
const currency = getCryptoCurrencyById("hedera");
|
|
268
|
+
|
|
269
|
+
return {
|
|
270
|
+
prepare: async () => cache.prepareCurrency(currency),
|
|
271
|
+
};
|
|
272
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import BigNumber from "bignumber.js";
|
|
2
|
+
import type { CryptoCurrency } from "@ledgerhq/types-cryptoassets";
|
|
3
|
+
import { useMemo } from "react";
|
|
4
|
+
import {
|
|
5
|
+
getCurrentHederaPreloadData,
|
|
6
|
+
getHederaPreloadData,
|
|
7
|
+
} from "@ledgerhq/coin-hedera/preload-data";
|
|
8
|
+
import { getDelegationStatus, filterValidatorBySearchTerm } from "./utils";
|
|
9
|
+
import { useObservable } from "../../observable";
|
|
10
|
+
import type {
|
|
11
|
+
HederaAccount,
|
|
12
|
+
HederaPreloadData,
|
|
13
|
+
HederaValidator,
|
|
14
|
+
HederaDelegation,
|
|
15
|
+
HederaEnrichedDelegation,
|
|
16
|
+
} from "./types";
|
|
17
|
+
|
|
18
|
+
export function useHederaPreloadData(
|
|
19
|
+
currency: CryptoCurrency,
|
|
20
|
+
): HederaPreloadData | undefined | null {
|
|
21
|
+
return useObservable(getHederaPreloadData(currency), getCurrentHederaPreloadData(currency));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function useHederaValidators(currency: CryptoCurrency, search?: string): HederaValidator[] {
|
|
25
|
+
const data = useHederaPreloadData(currency);
|
|
26
|
+
|
|
27
|
+
return useMemo(() => {
|
|
28
|
+
const validators = data?.validators ?? [];
|
|
29
|
+
|
|
30
|
+
if (validators.length === 0 || !search || search === "") {
|
|
31
|
+
return validators;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return validators.filter(validator => {
|
|
35
|
+
return filterValidatorBySearchTerm(validator, search);
|
|
36
|
+
});
|
|
37
|
+
}, [data, search]);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function useHederaEnrichedDelegation(
|
|
41
|
+
account: HederaAccount,
|
|
42
|
+
delegation: HederaDelegation,
|
|
43
|
+
): HederaEnrichedDelegation {
|
|
44
|
+
const validators = useHederaValidators(account.currency);
|
|
45
|
+
const validatorByNodeId = new Map(validators.map(v => [v.nodeId, v]));
|
|
46
|
+
const validator = validatorByNodeId.get(delegation.nodeId) ?? null;
|
|
47
|
+
|
|
48
|
+
return {
|
|
49
|
+
...delegation,
|
|
50
|
+
status: getDelegationStatus(validator),
|
|
51
|
+
validator: {
|
|
52
|
+
name: validator?.name ?? "",
|
|
53
|
+
address: validator?.address ?? "",
|
|
54
|
+
addressChecksum: validator?.addressChecksum ?? null,
|
|
55
|
+
nodeId: delegation.nodeId,
|
|
56
|
+
minStake: validator?.minStake ?? new BigNumber(0),
|
|
57
|
+
maxStake: validator?.maxStake ?? new BigNumber(0),
|
|
58
|
+
activeStake: validator?.activeStake ?? new BigNumber(0),
|
|
59
|
+
activeStakePercentage: validator?.activeStakePercentage ?? new BigNumber(0),
|
|
60
|
+
overstaked: validator?.overstaked ?? false,
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|