@ledgerhq/coin-hedera 1.15.0-nightly.20251209144712 → 1.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +48 -14
- package/lib/bridge/buildOptimisticOperation.d.ts.map +1 -1
- package/lib/bridge/buildOptimisticOperation.js +0 -33
- package/lib/bridge/buildOptimisticOperation.js.map +1 -1
- package/lib/bridge/getTransactionStatus.d.ts.map +1 -1
- package/lib/bridge/getTransactionStatus.js +0 -54
- package/lib/bridge/getTransactionStatus.js.map +1 -1
- package/lib/bridge/index.d.ts.map +1 -1
- package/lib/bridge/index.js +2 -4
- package/lib/bridge/index.js.map +1 -1
- package/lib/bridge/prepareTransaction.d.ts.map +1 -1
- package/lib/bridge/prepareTransaction.js +0 -16
- package/lib/bridge/prepareTransaction.js.map +1 -1
- package/lib/bridge/serialization.d.ts.map +1 -1
- package/lib/bridge/serialization.js +0 -20
- package/lib/bridge/serialization.js.map +1 -1
- package/lib/bridge/signOperation.d.ts +4 -4
- package/lib/bridge/signOperation.d.ts.map +1 -1
- package/lib/bridge/signOperation.js +0 -10
- package/lib/bridge/signOperation.js.map +1 -1
- package/lib/bridge/synchronisation.d.ts.map +1 -1
- package/lib/bridge/synchronisation.js +0 -8
- package/lib/bridge/synchronisation.js.map +1 -1
- package/lib/constants.d.ts +1 -21
- package/lib/constants.d.ts.map +1 -1
- package/lib/constants.js +1 -22
- package/lib/constants.js.map +1 -1
- package/lib/deviceTransactionConfig.d.ts.map +1 -1
- package/lib/deviceTransactionConfig.js +0 -30
- package/lib/deviceTransactionConfig.js.map +1 -1
- package/lib/errors.d.ts +0 -9
- package/lib/errors.d.ts.map +1 -1
- package/lib/errors.js +1 -4
- package/lib/errors.js.map +1 -1
- package/lib/logic/craftTransaction.d.ts +2 -2
- package/lib/logic/craftTransaction.d.ts.map +1 -1
- package/lib/logic/craftTransaction.js +8 -42
- package/lib/logic/craftTransaction.js.map +1 -1
- package/lib/logic/getBlock.d.ts.map +1 -1
- package/lib/logic/getBlock.js +0 -1
- package/lib/logic/getBlock.js.map +1 -1
- package/lib/logic/listOperations.d.ts.map +1 -1
- package/lib/logic/listOperations.js +7 -39
- package/lib/logic/listOperations.js.map +1 -1
- package/lib/logic/utils.d.ts +3 -61
- package/lib/logic/utils.d.ts.map +1 -1
- package/lib/logic/utils.js +4 -117
- package/lib/logic/utils.js.map +1 -1
- package/lib/network/api.d.ts +1 -3
- package/lib/network/api.d.ts.map +1 -1
- package/lib/network/api.js +0 -19
- package/lib/network/api.js.map +1 -1
- package/lib/test/fixtures/account.fixture.d.ts +1 -1
- package/lib/test/fixtures/account.fixture.d.ts.map +1 -1
- package/lib/test/fixtures/account.fixture.js +0 -2
- package/lib/test/fixtures/account.fixture.js.map +1 -1
- package/lib/transaction.d.ts.map +1 -1
- package/lib/transaction.js +0 -34
- package/lib/transaction.js.map +1 -1
- package/lib/types/alpaca.d.ts +0 -3
- package/lib/types/alpaca.d.ts.map +1 -1
- package/lib/types/bridge.d.ts +3 -87
- package/lib/types/bridge.d.ts.map +1 -1
- package/lib/types/logic.d.ts +1 -5
- package/lib/types/logic.d.ts.map +1 -1
- package/lib/types/mirror.d.ts +0 -19
- package/lib/types/mirror.d.ts.map +1 -1
- package/lib-es/bridge/buildOptimisticOperation.d.ts.map +1 -1
- package/lib-es/bridge/buildOptimisticOperation.js +1 -34
- 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 +3 -57
- package/lib-es/bridge/getTransactionStatus.js.map +1 -1
- package/lib-es/bridge/index.d.ts.map +1 -1
- package/lib-es/bridge/index.js +2 -4
- package/lib-es/bridge/index.js.map +1 -1
- package/lib-es/bridge/prepareTransaction.d.ts.map +1 -1
- package/lib-es/bridge/prepareTransaction.js +2 -15
- package/lib-es/bridge/prepareTransaction.js.map +1 -1
- package/lib-es/bridge/serialization.d.ts.map +1 -1
- package/lib-es/bridge/serialization.js +0 -17
- package/lib-es/bridge/serialization.js.map +1 -1
- package/lib-es/bridge/signOperation.d.ts +4 -4
- package/lib-es/bridge/signOperation.d.ts.map +1 -1
- package/lib-es/bridge/signOperation.js +1 -11
- package/lib-es/bridge/signOperation.js.map +1 -1
- package/lib-es/bridge/synchronisation.d.ts.map +1 -1
- package/lib-es/bridge/synchronisation.js +0 -8
- package/lib-es/bridge/synchronisation.js.map +1 -1
- package/lib-es/constants.d.ts +1 -21
- package/lib-es/constants.d.ts.map +1 -1
- package/lib-es/constants.js +0 -21
- package/lib-es/constants.js.map +1 -1
- package/lib-es/deviceTransactionConfig.d.ts.map +1 -1
- package/lib-es/deviceTransactionConfig.js +1 -31
- package/lib-es/deviceTransactionConfig.js.map +1 -1
- package/lib-es/errors.d.ts +0 -9
- package/lib-es/errors.d.ts.map +1 -1
- package/lib-es/errors.js +0 -3
- package/lib-es/errors.js.map +1 -1
- package/lib-es/logic/craftTransaction.d.ts +2 -2
- package/lib-es/logic/craftTransaction.d.ts.map +1 -1
- package/lib-es/logic/craftTransaction.js +10 -44
- package/lib-es/logic/craftTransaction.js.map +1 -1
- package/lib-es/logic/getBlock.d.ts.map +1 -1
- package/lib-es/logic/getBlock.js +1 -2
- package/lib-es/logic/getBlock.js.map +1 -1
- package/lib-es/logic/listOperations.d.ts.map +1 -1
- package/lib-es/logic/listOperations.js +7 -39
- package/lib-es/logic/listOperations.js.map +1 -1
- package/lib-es/logic/utils.d.ts +3 -61
- package/lib-es/logic/utils.d.ts.map +1 -1
- package/lib-es/logic/utils.js +4 -107
- package/lib-es/logic/utils.js.map +1 -1
- package/lib-es/network/api.d.ts +1 -3
- package/lib-es/network/api.d.ts.map +1 -1
- package/lib-es/network/api.js +0 -19
- package/lib-es/network/api.js.map +1 -1
- package/lib-es/test/fixtures/account.fixture.d.ts +1 -1
- package/lib-es/test/fixtures/account.fixture.d.ts.map +1 -1
- package/lib-es/test/fixtures/account.fixture.js +0 -2
- package/lib-es/test/fixtures/account.fixture.js.map +1 -1
- package/lib-es/transaction.d.ts.map +1 -1
- package/lib-es/transaction.js +0 -34
- package/lib-es/transaction.js.map +1 -1
- package/lib-es/types/alpaca.d.ts +0 -3
- package/lib-es/types/alpaca.d.ts.map +1 -1
- package/lib-es/types/bridge.d.ts +3 -87
- package/lib-es/types/bridge.d.ts.map +1 -1
- package/lib-es/types/logic.d.ts +1 -5
- package/lib-es/types/logic.d.ts.map +1 -1
- package/lib-es/types/mirror.d.ts +0 -19
- package/lib-es/types/mirror.d.ts.map +1 -1
- package/package.json +11 -12
- package/src/api/index.integ.test.ts +1 -11
- package/src/bridge/buildOptimisticOperation.integration.test.ts +4 -159
- package/src/bridge/buildOptimisticOperation.ts +2 -50
- package/src/bridge/getTransactionStatus.test.ts +21 -191
- package/src/bridge/getTransactionStatus.ts +1 -75
- package/src/bridge/index.ts +2 -4
- package/src/bridge/prepareTransaction.test.ts +8 -112
- package/src/bridge/prepareTransaction.ts +2 -20
- package/src/bridge/serialization.ts +0 -17
- package/src/bridge/signOperation.ts +5 -15
- package/src/bridge/synchronisation.ts +0 -9
- package/src/bridge/utils.integration.test.ts +10 -3
- package/src/constants.ts +0 -22
- package/src/deviceTransactionConfig.ts +1 -37
- package/src/errors.ts +0 -7
- package/src/logic/craftTransaction.ts +13 -70
- package/src/logic/getBalance.test.ts +16 -15
- package/src/logic/getBlock.ts +1 -2
- package/src/logic/listOperations.test.ts +29 -86
- package/src/logic/listOperations.ts +6 -46
- package/src/logic/utils.test.ts +8 -362
- package/src/logic/utils.ts +4 -158
- package/src/network/api.test.ts +6 -58
- package/src/network/api.ts +0 -25
- package/src/network/thirdweb.test.ts +2 -2
- package/src/network/utils.test.ts +6 -4
- package/src/test/fixtures/account.fixture.ts +1 -3
- package/src/transaction.ts +0 -42
- package/src/types/alpaca.ts +0 -4
- package/src/types/bridge.ts +3 -108
- package/src/types/logic.ts +1 -6
- package/src/types/mirror.ts +0 -21
- package/lib/preload-data.d.ts +0 -7
- package/lib/preload-data.d.ts.map +0 -1
- package/lib/preload-data.js +0 -37
- package/lib/preload-data.js.map +0 -1
- package/lib/preload.d.ts +0 -8
- package/lib/preload.d.ts.map +0 -1
- package/lib/preload.js +0 -76
- package/lib/preload.js.map +0 -1
- package/lib-es/preload-data.d.ts +0 -7
- package/lib-es/preload-data.d.ts.map +0 -1
- package/lib-es/preload-data.js +0 -31
- package/lib-es/preload-data.js.map +0 -1
- package/lib-es/preload.d.ts +0 -8
- package/lib-es/preload.d.ts.map +0 -1
- package/lib-es/preload.js +0 -67
- package/lib-es/preload.js.map +0 -1
- package/src/deviceTransactionConfig.test.ts +0 -315
- package/src/preload-data.ts +0 -38
- package/src/preload.test.ts +0 -64
- package/src/preload.ts +0 -80
package/lib-es/preload-data.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { CryptoCurrency } from "@ledgerhq/types-cryptoassets";
|
|
2
|
-
import { Observable } from "rxjs";
|
|
3
|
-
import type { HederaPreloadData } from "./types";
|
|
4
|
-
export declare function setHederaPreloadData(data: HederaPreloadData, currency: CryptoCurrency): void;
|
|
5
|
-
export declare function getHederaPreloadData(currency: CryptoCurrency): Observable<HederaPreloadData>;
|
|
6
|
-
export declare function getCurrentHederaPreloadData(currency: CryptoCurrency): HederaPreloadData;
|
|
7
|
-
//# sourceMappingURL=preload-data.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preload-data.d.ts","sourceRoot":"","sources":["../src/preload-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAmB,UAAU,EAAE,MAAM,MAAM,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAYjD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,CAO5F;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAM5F;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,cAAc,GAAG,iBAAiB,CAMvF"}
|
package/lib-es/preload-data.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { BehaviorSubject } from "rxjs";
|
|
2
|
-
const initialData = {
|
|
3
|
-
validators: [],
|
|
4
|
-
};
|
|
5
|
-
const dataByCurrency = new Map([["hedera", initialData]]);
|
|
6
|
-
const dataUpdatesByCurrency = new Map([
|
|
7
|
-
["hedera", new BehaviorSubject(initialData)],
|
|
8
|
-
]);
|
|
9
|
-
export function setHederaPreloadData(data, currency) {
|
|
10
|
-
dataByCurrency.set(currency.id, data ?? initialData);
|
|
11
|
-
const subject = dataUpdatesByCurrency.get(currency.id);
|
|
12
|
-
if (subject === undefined) {
|
|
13
|
-
throw new Error(`unsupported currency ${currency.id}`);
|
|
14
|
-
}
|
|
15
|
-
subject.next(data);
|
|
16
|
-
}
|
|
17
|
-
export function getHederaPreloadData(currency) {
|
|
18
|
-
const subject = dataUpdatesByCurrency.get(currency.id);
|
|
19
|
-
if (subject === undefined) {
|
|
20
|
-
throw new Error(`unsupported currency ${currency.id}`);
|
|
21
|
-
}
|
|
22
|
-
return subject.asObservable();
|
|
23
|
-
}
|
|
24
|
-
export function getCurrentHederaPreloadData(currency) {
|
|
25
|
-
const data = dataByCurrency.get(currency.id);
|
|
26
|
-
if (data === undefined) {
|
|
27
|
-
throw new Error(`unsupported currency ${currency.id}`);
|
|
28
|
-
}
|
|
29
|
-
return data;
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=preload-data.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preload-data.js","sourceRoot":"","sources":["../src/preload-data.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAc,MAAM,MAAM,CAAC;AAGnD,MAAM,WAAW,GAAsB;IACrC,UAAU,EAAE,EAAE;CACf,CAAC;AAEF,MAAM,cAAc,GAAG,IAAI,GAAG,CAA4B,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;AAErF,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,CAAC,QAAQ,EAAE,IAAI,eAAe,CAAoB,WAAW,CAAC,CAAC;CAChE,CAAC,CAAC;AAEH,MAAM,UAAU,oBAAoB,CAAC,IAAuB,EAAE,QAAwB;IACpF,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,IAAI,WAAW,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAwB;IAC3D,MAAM,OAAO,GAAG,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,OAAO,CAAC,YAAY,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,QAAwB;IAClE,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/lib-es/preload.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { CryptoCurrency } from "@ledgerhq/types-cryptoassets";
|
|
2
|
-
import type { HederaPreloadData } from "./types";
|
|
3
|
-
export declare const getPreloadStrategy: () => {
|
|
4
|
-
preloadMaxAge: number;
|
|
5
|
-
};
|
|
6
|
-
export declare function preload(currency: CryptoCurrency): Promise<HederaPreloadData>;
|
|
7
|
-
export declare function hydrate(data: unknown, currency: CryptoCurrency): void;
|
|
8
|
-
//# sourceMappingURL=preload.d.ts.map
|
package/lib-es/preload.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preload.d.ts","sourceRoot":"","sources":["../src/preload.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAInE,OAAO,KAAK,EAAE,iBAAiB,EAAuC,MAAM,SAAS,CAAC;AAEtF,eAAO,MAAM,kBAAkB;;CAE7B,CAAC;AAEH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAiClF;AA8BD,wBAAgB,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,CAIrE"}
|
package/lib-es/preload.js
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import BigNumber from "bignumber.js";
|
|
2
|
-
import { log } from "@ledgerhq/logs";
|
|
3
|
-
import { extractCompanyFromNodeDescription, getChecksum, sortValidators } from "./logic/utils";
|
|
4
|
-
import { apiClient } from "./network/api";
|
|
5
|
-
import { setHederaPreloadData } from "./preload-data";
|
|
6
|
-
export const getPreloadStrategy = () => ({
|
|
7
|
-
preloadMaxAge: 15 * 60 * 1000, // 15 minutes
|
|
8
|
-
});
|
|
9
|
-
export async function preload(currency) {
|
|
10
|
-
log("hedera/preload", "preloading hedera data...");
|
|
11
|
-
const nodes = await apiClient.getNodes();
|
|
12
|
-
const validators = nodes.map(mirrorNode => {
|
|
13
|
-
const minStake = new BigNumber(mirrorNode.min_stake);
|
|
14
|
-
const maxStake = new BigNumber(mirrorNode.max_stake);
|
|
15
|
-
const activeStake = new BigNumber(mirrorNode.stake_rewarded);
|
|
16
|
-
const activeStakePercentage = maxStake.gt(0)
|
|
17
|
-
? activeStake.dividedBy(maxStake).multipliedBy(100).dp(0, BigNumber.ROUND_CEIL)
|
|
18
|
-
: new BigNumber(0);
|
|
19
|
-
return {
|
|
20
|
-
nodeId: mirrorNode.node_id,
|
|
21
|
-
address: mirrorNode.node_account_id,
|
|
22
|
-
addressChecksum: getChecksum(mirrorNode.node_account_id),
|
|
23
|
-
name: extractCompanyFromNodeDescription(mirrorNode.description),
|
|
24
|
-
minStake,
|
|
25
|
-
maxStake,
|
|
26
|
-
activeStake,
|
|
27
|
-
activeStakePercentage,
|
|
28
|
-
overstaked: activeStake.gte(maxStake),
|
|
29
|
-
};
|
|
30
|
-
});
|
|
31
|
-
const sortedValidators = sortValidators(validators);
|
|
32
|
-
const data = {
|
|
33
|
-
validators: sortedValidators,
|
|
34
|
-
};
|
|
35
|
-
setHederaPreloadData(data, currency);
|
|
36
|
-
return data;
|
|
37
|
-
}
|
|
38
|
-
function mapRawValidatorToValidator(validatorRaw) {
|
|
39
|
-
return {
|
|
40
|
-
nodeId: validatorRaw.nodeId,
|
|
41
|
-
address: validatorRaw.address,
|
|
42
|
-
addressChecksum: validatorRaw.addressChecksum,
|
|
43
|
-
name: validatorRaw.name,
|
|
44
|
-
minStake: new BigNumber(validatorRaw.minStake),
|
|
45
|
-
maxStake: new BigNumber(validatorRaw.maxStake),
|
|
46
|
-
activeStake: new BigNumber(validatorRaw.activeStake),
|
|
47
|
-
activeStakePercentage: new BigNumber(validatorRaw.activeStakePercentage),
|
|
48
|
-
overstaked: validatorRaw.overstaked,
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
function fromHydratePreloadData(data) {
|
|
52
|
-
let validators = [];
|
|
53
|
-
if (data && typeof data === "object" && "validators" in data) {
|
|
54
|
-
if (Array.isArray(data.validators)) {
|
|
55
|
-
validators = data.validators.map(mapRawValidatorToValidator);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return {
|
|
59
|
-
validators,
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
export function hydrate(data, currency) {
|
|
63
|
-
const hydrated = fromHydratePreloadData(data);
|
|
64
|
-
log("hedera/preload", `hydrated ${hydrated.validators.length} hedera validators`);
|
|
65
|
-
setHederaPreloadData(hydrated, currency);
|
|
66
|
-
}
|
|
67
|
-
//# sourceMappingURL=preload.js.map
|
package/lib-es/preload.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preload.js","sourceRoot":"","sources":["../src/preload.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,315 +0,0 @@
|
|
|
1
|
-
import BigNumber from "bignumber.js";
|
|
2
|
-
import type { Account } from "@ledgerhq/types-live";
|
|
3
|
-
import { HEDERA_TRANSACTION_MODES } from "./constants";
|
|
4
|
-
import getDeviceTransactionConfig from "./deviceTransactionConfig";
|
|
5
|
-
import type { Transaction, TransactionStatus } from "./types";
|
|
6
|
-
|
|
7
|
-
describe("getDeviceTransactionConfig", () => {
|
|
8
|
-
const mockAccount = {
|
|
9
|
-
id: "mock-account-id",
|
|
10
|
-
currency: { id: "hedera" },
|
|
11
|
-
} as Account;
|
|
12
|
-
|
|
13
|
-
const createMockStatus = (estimatedFees: BigNumber): TransactionStatus => ({
|
|
14
|
-
errors: {},
|
|
15
|
-
warnings: {},
|
|
16
|
-
estimatedFees,
|
|
17
|
-
amount: new BigNumber(0),
|
|
18
|
-
totalSpent: new BigNumber(0),
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
describe("staking transactions", () => {
|
|
22
|
-
it("should return correct fields for ClaimRewards transaction", async () => {
|
|
23
|
-
const transaction = {
|
|
24
|
-
family: "hedera",
|
|
25
|
-
mode: HEDERA_TRANSACTION_MODES.ClaimRewards,
|
|
26
|
-
amount: new BigNumber(0),
|
|
27
|
-
recipient: "",
|
|
28
|
-
memo: "Claiming rewards",
|
|
29
|
-
} as Transaction;
|
|
30
|
-
|
|
31
|
-
const status = createMockStatus(new BigNumber(100000));
|
|
32
|
-
|
|
33
|
-
const fields = await getDeviceTransactionConfig({
|
|
34
|
-
account: mockAccount,
|
|
35
|
-
transaction,
|
|
36
|
-
status,
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
expect(fields).toEqual([
|
|
40
|
-
{
|
|
41
|
-
type: "text",
|
|
42
|
-
label: "Method",
|
|
43
|
-
value: "Claim Rewards",
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
label: "Fees",
|
|
47
|
-
type: "fees",
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
type: "text",
|
|
51
|
-
label: "Memo",
|
|
52
|
-
value: "Claiming rewards",
|
|
53
|
-
},
|
|
54
|
-
]);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it("should return correct fields for Delegate transaction", async () => {
|
|
58
|
-
const transaction = {
|
|
59
|
-
family: "hedera",
|
|
60
|
-
mode: HEDERA_TRANSACTION_MODES.Delegate,
|
|
61
|
-
amount: new BigNumber(0),
|
|
62
|
-
recipient: "",
|
|
63
|
-
properties: {
|
|
64
|
-
stakingNodeId: 10,
|
|
65
|
-
},
|
|
66
|
-
} as Transaction;
|
|
67
|
-
|
|
68
|
-
const status = createMockStatus(new BigNumber(100000));
|
|
69
|
-
|
|
70
|
-
const fields = await getDeviceTransactionConfig({
|
|
71
|
-
account: mockAccount,
|
|
72
|
-
transaction,
|
|
73
|
-
status,
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
expect(fields).toEqual([
|
|
77
|
-
{
|
|
78
|
-
type: "text",
|
|
79
|
-
label: "Method",
|
|
80
|
-
value: "Update Account",
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
label: "Fees",
|
|
84
|
-
type: "fees",
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
type: "text",
|
|
88
|
-
label: "Staked Node ID",
|
|
89
|
-
value: "10",
|
|
90
|
-
},
|
|
91
|
-
]);
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it("should not include staking node ID if not provided", async () => {
|
|
95
|
-
const transaction = {
|
|
96
|
-
family: "hedera",
|
|
97
|
-
mode: HEDERA_TRANSACTION_MODES.Undelegate,
|
|
98
|
-
amount: new BigNumber(0),
|
|
99
|
-
recipient: "",
|
|
100
|
-
properties: {},
|
|
101
|
-
} as Transaction;
|
|
102
|
-
|
|
103
|
-
const status = createMockStatus(new BigNumber(100000));
|
|
104
|
-
|
|
105
|
-
const fields = await getDeviceTransactionConfig({
|
|
106
|
-
account: mockAccount,
|
|
107
|
-
transaction,
|
|
108
|
-
status,
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
expect(fields).toEqual([
|
|
112
|
-
{
|
|
113
|
-
type: "text",
|
|
114
|
-
label: "Method",
|
|
115
|
-
value: "Update Account",
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
label: "Fees",
|
|
119
|
-
type: "fees",
|
|
120
|
-
},
|
|
121
|
-
]);
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
describe("token associate transactions", () => {
|
|
126
|
-
it("should return correct fields for TokenAssociate transaction", async () => {
|
|
127
|
-
const transaction = {
|
|
128
|
-
family: "hedera",
|
|
129
|
-
mode: HEDERA_TRANSACTION_MODES.TokenAssociate,
|
|
130
|
-
amount: new BigNumber(0),
|
|
131
|
-
recipient: "",
|
|
132
|
-
subAccountId: "token-account-id",
|
|
133
|
-
memo: "Associating token",
|
|
134
|
-
} as Transaction;
|
|
135
|
-
|
|
136
|
-
const status = createMockStatus(new BigNumber(50000));
|
|
137
|
-
|
|
138
|
-
const fields = await getDeviceTransactionConfig({
|
|
139
|
-
account: mockAccount,
|
|
140
|
-
transaction,
|
|
141
|
-
status,
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
expect(fields).toEqual([
|
|
145
|
-
{
|
|
146
|
-
type: "text",
|
|
147
|
-
label: "Method",
|
|
148
|
-
value: "Associate Token",
|
|
149
|
-
},
|
|
150
|
-
{
|
|
151
|
-
type: "fees",
|
|
152
|
-
label: "Fees",
|
|
153
|
-
},
|
|
154
|
-
{
|
|
155
|
-
type: "text",
|
|
156
|
-
label: "Memo",
|
|
157
|
-
value: "Associating token",
|
|
158
|
-
},
|
|
159
|
-
]);
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
it("should not include fees if they are zero", async () => {
|
|
163
|
-
const transaction = {
|
|
164
|
-
family: "hedera",
|
|
165
|
-
mode: HEDERA_TRANSACTION_MODES.TokenAssociate,
|
|
166
|
-
amount: new BigNumber(0),
|
|
167
|
-
recipient: "",
|
|
168
|
-
subAccountId: "token-account-id",
|
|
169
|
-
} as Transaction;
|
|
170
|
-
|
|
171
|
-
const status = createMockStatus(new BigNumber(0));
|
|
172
|
-
|
|
173
|
-
const fields = await getDeviceTransactionConfig({
|
|
174
|
-
account: mockAccount,
|
|
175
|
-
transaction,
|
|
176
|
-
status,
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
expect(fields).toEqual([
|
|
180
|
-
{
|
|
181
|
-
type: "text",
|
|
182
|
-
label: "Method",
|
|
183
|
-
value: "Associate Token",
|
|
184
|
-
},
|
|
185
|
-
]);
|
|
186
|
-
});
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
describe("regular transfer transactions", () => {
|
|
190
|
-
it("should return correct fields for regular Send transaction", async () => {
|
|
191
|
-
const transaction = {
|
|
192
|
-
family: "hedera",
|
|
193
|
-
mode: HEDERA_TRANSACTION_MODES.Send,
|
|
194
|
-
amount: new BigNumber(1000000),
|
|
195
|
-
recipient: "0.0.12345",
|
|
196
|
-
useAllAmount: false,
|
|
197
|
-
memo: "Payment",
|
|
198
|
-
} as Transaction;
|
|
199
|
-
|
|
200
|
-
const status = createMockStatus(new BigNumber(100000));
|
|
201
|
-
|
|
202
|
-
const fields = await getDeviceTransactionConfig({
|
|
203
|
-
account: mockAccount,
|
|
204
|
-
transaction,
|
|
205
|
-
status,
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
expect(fields).toEqual([
|
|
209
|
-
{
|
|
210
|
-
type: "text",
|
|
211
|
-
label: "Method",
|
|
212
|
-
value: "Transfer",
|
|
213
|
-
},
|
|
214
|
-
{
|
|
215
|
-
type: "amount",
|
|
216
|
-
label: "Amount",
|
|
217
|
-
},
|
|
218
|
-
{
|
|
219
|
-
type: "fees",
|
|
220
|
-
label: "Fees",
|
|
221
|
-
},
|
|
222
|
-
{
|
|
223
|
-
type: "text",
|
|
224
|
-
label: "Memo",
|
|
225
|
-
value: "Payment",
|
|
226
|
-
},
|
|
227
|
-
]);
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
it("should show 'Transfer All' method when useAllAmount is true", async () => {
|
|
231
|
-
const transaction = {
|
|
232
|
-
family: "hedera",
|
|
233
|
-
mode: HEDERA_TRANSACTION_MODES.Send,
|
|
234
|
-
amount: new BigNumber(0),
|
|
235
|
-
recipient: "0.0.12345",
|
|
236
|
-
useAllAmount: true,
|
|
237
|
-
} as Transaction;
|
|
238
|
-
|
|
239
|
-
const status = createMockStatus(new BigNumber(100000));
|
|
240
|
-
|
|
241
|
-
const fields = await getDeviceTransactionConfig({
|
|
242
|
-
account: mockAccount,
|
|
243
|
-
transaction,
|
|
244
|
-
status,
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
expect(fields[0]).toEqual({
|
|
248
|
-
type: "text",
|
|
249
|
-
label: "Method",
|
|
250
|
-
value: "Transfer All",
|
|
251
|
-
});
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
it("should include gas limit for Send transactions with gasLimit", async () => {
|
|
255
|
-
const transaction = {
|
|
256
|
-
family: "hedera",
|
|
257
|
-
mode: HEDERA_TRANSACTION_MODES.Send,
|
|
258
|
-
amount: new BigNumber(1000000),
|
|
259
|
-
recipient: "0.0.12345",
|
|
260
|
-
useAllAmount: false,
|
|
261
|
-
gasLimit: new BigNumber(300000),
|
|
262
|
-
} as Transaction;
|
|
263
|
-
|
|
264
|
-
const status = createMockStatus(new BigNumber(100000));
|
|
265
|
-
|
|
266
|
-
const fields = await getDeviceTransactionConfig({
|
|
267
|
-
account: mockAccount,
|
|
268
|
-
transaction,
|
|
269
|
-
status,
|
|
270
|
-
});
|
|
271
|
-
|
|
272
|
-
expect(fields).toEqual([
|
|
273
|
-
{
|
|
274
|
-
type: "text",
|
|
275
|
-
label: "Method",
|
|
276
|
-
value: "Transfer",
|
|
277
|
-
},
|
|
278
|
-
{
|
|
279
|
-
type: "amount",
|
|
280
|
-
label: "Amount",
|
|
281
|
-
},
|
|
282
|
-
{
|
|
283
|
-
type: "fees",
|
|
284
|
-
label: "Fees",
|
|
285
|
-
},
|
|
286
|
-
{
|
|
287
|
-
type: "text",
|
|
288
|
-
label: "Gas Limit",
|
|
289
|
-
value: "300000",
|
|
290
|
-
},
|
|
291
|
-
]);
|
|
292
|
-
});
|
|
293
|
-
|
|
294
|
-
it("should not include memo if not provided", async () => {
|
|
295
|
-
const transaction = {
|
|
296
|
-
family: "hedera",
|
|
297
|
-
mode: HEDERA_TRANSACTION_MODES.Send,
|
|
298
|
-
amount: new BigNumber(1000000),
|
|
299
|
-
recipient: "0.0.12345",
|
|
300
|
-
useAllAmount: false,
|
|
301
|
-
} as Transaction;
|
|
302
|
-
|
|
303
|
-
const status = createMockStatus(new BigNumber(100000));
|
|
304
|
-
|
|
305
|
-
const fields = await getDeviceTransactionConfig({
|
|
306
|
-
account: mockAccount,
|
|
307
|
-
transaction,
|
|
308
|
-
status,
|
|
309
|
-
});
|
|
310
|
-
|
|
311
|
-
expect(fields).toHaveLength(3);
|
|
312
|
-
expect(fields.some(f => f.label === "Memo")).toBe(false);
|
|
313
|
-
});
|
|
314
|
-
});
|
|
315
|
-
});
|
package/src/preload-data.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import type { CryptoCurrency } from "@ledgerhq/types-cryptoassets";
|
|
2
|
-
import { BehaviorSubject, Observable } from "rxjs";
|
|
3
|
-
import type { HederaPreloadData } from "./types";
|
|
4
|
-
|
|
5
|
-
const initialData: HederaPreloadData = {
|
|
6
|
-
validators: [],
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
const dataByCurrency = new Map<string, HederaPreloadData>([["hedera", initialData]]);
|
|
10
|
-
|
|
11
|
-
const dataUpdatesByCurrency = new Map([
|
|
12
|
-
["hedera", new BehaviorSubject<HederaPreloadData>(initialData)],
|
|
13
|
-
]);
|
|
14
|
-
|
|
15
|
-
export function setHederaPreloadData(data: HederaPreloadData, currency: CryptoCurrency): void {
|
|
16
|
-
dataByCurrency.set(currency.id, data ?? initialData);
|
|
17
|
-
const subject = dataUpdatesByCurrency.get(currency.id);
|
|
18
|
-
if (subject === undefined) {
|
|
19
|
-
throw new Error(`unsupported currency ${currency.id}`);
|
|
20
|
-
}
|
|
21
|
-
subject.next(data);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export function getHederaPreloadData(currency: CryptoCurrency): Observable<HederaPreloadData> {
|
|
25
|
-
const subject = dataUpdatesByCurrency.get(currency.id);
|
|
26
|
-
if (subject === undefined) {
|
|
27
|
-
throw new Error(`unsupported currency ${currency.id}`);
|
|
28
|
-
}
|
|
29
|
-
return subject.asObservable();
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function getCurrentHederaPreloadData(currency: CryptoCurrency): HederaPreloadData {
|
|
33
|
-
const data = dataByCurrency.get(currency.id);
|
|
34
|
-
if (data === undefined) {
|
|
35
|
-
throw new Error(`unsupported currency ${currency.id}`);
|
|
36
|
-
}
|
|
37
|
-
return data;
|
|
38
|
-
}
|
package/src/preload.test.ts
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import BigNumber from "bignumber.js";
|
|
2
|
-
import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets";
|
|
3
|
-
import { hydrate } from "./preload";
|
|
4
|
-
import { setHederaPreloadData } from "./preload-data";
|
|
5
|
-
|
|
6
|
-
jest.mock("./preload-data", () => ({
|
|
7
|
-
setHederaPreloadData: jest.fn(),
|
|
8
|
-
}));
|
|
9
|
-
|
|
10
|
-
describe("hydrate", () => {
|
|
11
|
-
const currency = getCryptoCurrencyById("hedera");
|
|
12
|
-
|
|
13
|
-
beforeEach(() => {
|
|
14
|
-
jest.clearAllMocks();
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
test.each([undefined, null, {}, []])(
|
|
18
|
-
"should hydrate empty validators list if data is corrupted (%p value)",
|
|
19
|
-
value => {
|
|
20
|
-
hydrate(value, currency);
|
|
21
|
-
expect(setHederaPreloadData).toHaveBeenCalledWith({ validators: [] }, currency);
|
|
22
|
-
},
|
|
23
|
-
);
|
|
24
|
-
|
|
25
|
-
it("should hydrate valid validators list", () => {
|
|
26
|
-
hydrate(
|
|
27
|
-
{
|
|
28
|
-
validators: [
|
|
29
|
-
{
|
|
30
|
-
nodeId: 1,
|
|
31
|
-
address: "0.0.1",
|
|
32
|
-
addressChecksum: "abcde",
|
|
33
|
-
name: "Ledger",
|
|
34
|
-
minStake: "1",
|
|
35
|
-
maxStake: "10",
|
|
36
|
-
activeStake: "5",
|
|
37
|
-
activeStakePercentage: "50",
|
|
38
|
-
overstaked: false,
|
|
39
|
-
},
|
|
40
|
-
],
|
|
41
|
-
},
|
|
42
|
-
currency,
|
|
43
|
-
);
|
|
44
|
-
|
|
45
|
-
expect(setHederaPreloadData).toHaveBeenCalledWith(
|
|
46
|
-
{
|
|
47
|
-
validators: [
|
|
48
|
-
{
|
|
49
|
-
nodeId: 1,
|
|
50
|
-
address: "0.0.1",
|
|
51
|
-
addressChecksum: "abcde",
|
|
52
|
-
name: "Ledger",
|
|
53
|
-
minStake: new BigNumber(1),
|
|
54
|
-
maxStake: new BigNumber(10),
|
|
55
|
-
activeStake: new BigNumber(5),
|
|
56
|
-
activeStakePercentage: new BigNumber(50),
|
|
57
|
-
overstaked: false,
|
|
58
|
-
},
|
|
59
|
-
],
|
|
60
|
-
},
|
|
61
|
-
currency,
|
|
62
|
-
);
|
|
63
|
-
});
|
|
64
|
-
});
|
package/src/preload.ts
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import BigNumber from "bignumber.js";
|
|
2
|
-
import { log } from "@ledgerhq/logs";
|
|
3
|
-
import type { CryptoCurrency } from "@ledgerhq/types-cryptoassets";
|
|
4
|
-
import { extractCompanyFromNodeDescription, getChecksum, sortValidators } from "./logic/utils";
|
|
5
|
-
import { apiClient } from "./network/api";
|
|
6
|
-
import { setHederaPreloadData } from "./preload-data";
|
|
7
|
-
import type { HederaPreloadData, HederaValidator, HederaValidatorRaw } from "./types";
|
|
8
|
-
|
|
9
|
-
export const getPreloadStrategy = () => ({
|
|
10
|
-
preloadMaxAge: 15 * 60 * 1000, // 15 minutes
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
export async function preload(currency: CryptoCurrency): Promise<HederaPreloadData> {
|
|
14
|
-
log("hedera/preload", "preloading hedera data...");
|
|
15
|
-
const nodes = await apiClient.getNodes();
|
|
16
|
-
|
|
17
|
-
const validators: HederaValidator[] = nodes.map(mirrorNode => {
|
|
18
|
-
const minStake = new BigNumber(mirrorNode.min_stake);
|
|
19
|
-
const maxStake = new BigNumber(mirrorNode.max_stake);
|
|
20
|
-
const activeStake = new BigNumber(mirrorNode.stake_rewarded);
|
|
21
|
-
const activeStakePercentage = maxStake.gt(0)
|
|
22
|
-
? activeStake.dividedBy(maxStake).multipliedBy(100).dp(0, BigNumber.ROUND_CEIL)
|
|
23
|
-
: new BigNumber(0);
|
|
24
|
-
|
|
25
|
-
return {
|
|
26
|
-
nodeId: mirrorNode.node_id,
|
|
27
|
-
address: mirrorNode.node_account_id,
|
|
28
|
-
addressChecksum: getChecksum(mirrorNode.node_account_id),
|
|
29
|
-
name: extractCompanyFromNodeDescription(mirrorNode.description),
|
|
30
|
-
minStake,
|
|
31
|
-
maxStake,
|
|
32
|
-
activeStake,
|
|
33
|
-
activeStakePercentage,
|
|
34
|
-
overstaked: activeStake.gte(maxStake),
|
|
35
|
-
};
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
const sortedValidators = sortValidators(validators);
|
|
39
|
-
const data: HederaPreloadData = {
|
|
40
|
-
validators: sortedValidators,
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
setHederaPreloadData(data, currency);
|
|
44
|
-
|
|
45
|
-
return data;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function mapRawValidatorToValidator(validatorRaw: HederaValidatorRaw): HederaValidator {
|
|
49
|
-
return {
|
|
50
|
-
nodeId: validatorRaw.nodeId,
|
|
51
|
-
address: validatorRaw.address,
|
|
52
|
-
addressChecksum: validatorRaw.addressChecksum,
|
|
53
|
-
name: validatorRaw.name,
|
|
54
|
-
minStake: new BigNumber(validatorRaw.minStake),
|
|
55
|
-
maxStake: new BigNumber(validatorRaw.maxStake),
|
|
56
|
-
activeStake: new BigNumber(validatorRaw.activeStake),
|
|
57
|
-
activeStakePercentage: new BigNumber(validatorRaw.activeStakePercentage),
|
|
58
|
-
overstaked: validatorRaw.overstaked,
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
function fromHydratePreloadData(data: unknown): HederaPreloadData {
|
|
63
|
-
let validators: HederaValidator[] = [];
|
|
64
|
-
|
|
65
|
-
if (data && typeof data === "object" && "validators" in data) {
|
|
66
|
-
if (Array.isArray(data.validators)) {
|
|
67
|
-
validators = data.validators.map(mapRawValidatorToValidator);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return {
|
|
72
|
-
validators,
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export function hydrate(data: unknown, currency: CryptoCurrency): void {
|
|
77
|
-
const hydrated = fromHydratePreloadData(data);
|
|
78
|
-
log("hedera/preload", `hydrated ${hydrated.validators.length} hedera validators`);
|
|
79
|
-
setHederaPreloadData(hydrated, currency);
|
|
80
|
-
}
|