@ledgerhq/live-common 34.33.0-nightly.2 → 34.33.0-nightly.4
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/domain/getTokensWithFunds.d.ts +3 -0
- package/lib/domain/getTokensWithFunds.d.ts.map +1 -0
- package/lib/domain/getTokensWithFunds.js +36 -0
- package/lib/domain/getTokensWithFunds.js.map +1 -0
- package/lib/domain/getTokensWithFunds.test.d.ts +2 -0
- package/lib/domain/getTokensWithFunds.test.d.ts.map +1 -0
- package/lib/domain/getTokensWithFunds.test.js +71 -0
- package/lib/domain/getTokensWithFunds.test.js.map +1 -0
- package/lib-es/domain/getTokensWithFunds.d.ts +3 -0
- package/lib-es/domain/getTokensWithFunds.d.ts.map +1 -0
- package/lib-es/domain/getTokensWithFunds.js +32 -0
- package/lib-es/domain/getTokensWithFunds.js.map +1 -0
- package/lib-es/domain/getTokensWithFunds.test.d.ts +2 -0
- package/lib-es/domain/getTokensWithFunds.test.d.ts.map +1 -0
- package/lib-es/domain/getTokensWithFunds.test.js +66 -0
- package/lib-es/domain/getTokensWithFunds.test.js.map +1 -0
- package/package.json +14 -14
- package/src/domain/getTokensWithFunds.test.ts +94 -0
- package/src/domain/getTokensWithFunds.ts +36 -0
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"getTokensWithFunds.d.ts","sourceRoot":"","sources":["../../src/domain/getTokensWithFunds.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,eAAO,MAAM,kBAAkB,aAAc,OAAO,EAAE,KAAG,MAAM,EAgC9D,CAAC"}
|
@@ -0,0 +1,36 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.getTokensWithFunds = void 0;
|
4
|
+
const helpers_1 = require("@ledgerhq/coin-framework/account/helpers");
|
5
|
+
const getTokensWithFunds = (accounts) => {
|
6
|
+
if (!accounts?.length)
|
7
|
+
return [];
|
8
|
+
const tokensMap = new Map();
|
9
|
+
for (const account of accounts) {
|
10
|
+
const { balance, currency } = account || {};
|
11
|
+
if (!balance?.gt(0) || !currency)
|
12
|
+
continue;
|
13
|
+
const parentAccount = (0, helpers_1.getParentAccount)(account, accounts);
|
14
|
+
const networkName = parentAccount?.currency?.name;
|
15
|
+
if (!networkName)
|
16
|
+
continue;
|
17
|
+
const mainKey = `${currency.ticker}:${networkName}`;
|
18
|
+
tokensMap.set(mainKey, {
|
19
|
+
ticker: currency.ticker,
|
20
|
+
networkName,
|
21
|
+
});
|
22
|
+
account.subAccounts?.forEach(subAccount => {
|
23
|
+
const { balance, token } = subAccount || {};
|
24
|
+
if (!balance?.gt(0) || !token)
|
25
|
+
return;
|
26
|
+
const subKey = `${token.ticker}:${networkName}`;
|
27
|
+
tokensMap.set(subKey, {
|
28
|
+
ticker: token.ticker,
|
29
|
+
networkName,
|
30
|
+
});
|
31
|
+
});
|
32
|
+
}
|
33
|
+
return Array.from(tokensMap.values(), ({ ticker, networkName }) => `${ticker} on ${networkName}`);
|
34
|
+
};
|
35
|
+
exports.getTokensWithFunds = getTokensWithFunds;
|
36
|
+
//# sourceMappingURL=getTokensWithFunds.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"getTokensWithFunds.js","sourceRoot":"","sources":["../../src/domain/getTokensWithFunds.ts"],"names":[],"mappings":";;;AAAA,sEAA4E;AAGrE,MAAM,kBAAkB,GAAG,CAAC,QAAmB,EAAY,EAAE;IAClE,IAAI,CAAC,QAAQ,EAAE,MAAM;QAAE,OAAO,EAAE,CAAC;IAEjC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAmD,CAAC;IAE7E,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;QAC9B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ;YAAE,SAAS;QAE3C,MAAM,aAAa,GAAG,IAAA,0BAAgB,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,aAAa,EAAE,QAAQ,EAAE,IAAI,CAAC;QAClD,IAAI,CAAC,WAAW;YAAE,SAAS;QAE3B,MAAM,OAAO,GAAG,GAAG,QAAQ,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;QACpD,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE;YACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,WAAW;SACZ,CAAC,CAAC;QAEH,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE;YACxC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,UAAU,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK;gBAAE,OAAO;YAEtC,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;YAChD,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE;gBACpB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,WAAW;aACZ,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;KACJ;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,OAAO,WAAW,EAAE,CAAC,CAAC;AACpG,CAAC,CAAC;AAhCW,QAAA,kBAAkB,sBAgC7B"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"getTokensWithFunds.test.d.ts","sourceRoot":"","sources":["../../src/domain/getTokensWithFunds.test.ts"],"names":[],"mappings":""}
|
@@ -0,0 +1,71 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const account_1 = require("@ledgerhq/coin-framework/lib/mocks/account");
|
7
|
+
const index_1 = require("@ledgerhq/live-common/currencies/index");
|
8
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
9
|
+
const getTokensWithFunds_1 = require("./getTokensWithFunds");
|
10
|
+
const ETH = (0, index_1.getCryptoCurrencyById)("ethereum");
|
11
|
+
const mockedAccounts = [
|
12
|
+
(0, account_1.genAccount)("mocked-account-2", {
|
13
|
+
currency: ETH,
|
14
|
+
}),
|
15
|
+
];
|
16
|
+
describe("getTokensWithFunds", () => {
|
17
|
+
it("should return empty array if no accounts", () => {
|
18
|
+
const result = (0, getTokensWithFunds_1.getTokensWithFunds)([]);
|
19
|
+
expect(result).toEqual([]);
|
20
|
+
});
|
21
|
+
it("should return array with accounts with funds", () => {
|
22
|
+
const account = mockedAccounts[0];
|
23
|
+
const result = (0, getTokensWithFunds_1.getTokensWithFunds)(mockedAccounts);
|
24
|
+
expect(account.balance).toBeTruthy();
|
25
|
+
expect(account.balance instanceof bignumber_js_1.default).toBe(true);
|
26
|
+
expect(account.balance.gt(0)).toBe(true);
|
27
|
+
expect(account.subAccounts).toBeDefined();
|
28
|
+
expect(account.subAccounts?.length).toBe(2);
|
29
|
+
const [zrxAccount, repAccount] = account.subAccounts || [];
|
30
|
+
expect(zrxAccount.balance).toBeTruthy();
|
31
|
+
expect(zrxAccount.balance instanceof bignumber_js_1.default).toBe(true);
|
32
|
+
expect(zrxAccount.balance.gt(0)).toBe(true);
|
33
|
+
expect(repAccount.balance).toBeTruthy();
|
34
|
+
expect(repAccount.balance instanceof bignumber_js_1.default).toBe(true);
|
35
|
+
expect(repAccount.balance.gt(0)).toBe(true);
|
36
|
+
expect(result).toEqual(["ETH on Ethereum", "ZRX on Ethereum", "REP on Ethereum"]);
|
37
|
+
});
|
38
|
+
it("should return array with accounts with funds", () => {
|
39
|
+
const account = mockedAccounts[0];
|
40
|
+
expect(account.balance).toBeTruthy();
|
41
|
+
expect(account.balance instanceof bignumber_js_1.default).toBe(true);
|
42
|
+
expect(account.balance.gt(0)).toBe(true);
|
43
|
+
expect(account.subAccounts).toBeDefined();
|
44
|
+
expect(account.subAccounts?.length).toBe(2);
|
45
|
+
const [zrxAccount, repAccount] = account.subAccounts || [];
|
46
|
+
const emptyRepAccount = { ...repAccount, balance: new bignumber_js_1.default(0) };
|
47
|
+
expect(zrxAccount.balance).toBeTruthy();
|
48
|
+
expect(zrxAccount.balance instanceof bignumber_js_1.default).toBe(true);
|
49
|
+
expect(zrxAccount.balance.gt(0)).toBe(true);
|
50
|
+
expect(emptyRepAccount.balance).toBeTruthy();
|
51
|
+
expect(emptyRepAccount.balance instanceof bignumber_js_1.default).toBe(true);
|
52
|
+
expect(emptyRepAccount.balance.gt(0)).toBe(false);
|
53
|
+
const accounts = { ...account, subAccounts: [zrxAccount, emptyRepAccount] };
|
54
|
+
const result = (0, getTokensWithFunds_1.getTokensWithFunds)([accounts]);
|
55
|
+
expect(result).toEqual(["ETH on Ethereum", "ZRX on Ethereum"]);
|
56
|
+
});
|
57
|
+
it("should return array with accounts with funds without duplication", () => {
|
58
|
+
const account = mockedAccounts[0];
|
59
|
+
expect(account.balance).toBeTruthy();
|
60
|
+
expect(account.balance instanceof bignumber_js_1.default).toBe(true);
|
61
|
+
expect(account.balance.gt(0)).toBe(true);
|
62
|
+
expect(account.subAccounts).toBeDefined();
|
63
|
+
expect(account.subAccounts?.length).toBe(2);
|
64
|
+
const [zrxAccount, repAccount] = account.subAccounts || [];
|
65
|
+
const accounts = { ...account, subAccounts: [zrxAccount, repAccount, repAccount] };
|
66
|
+
expect(accounts.subAccounts.length).toBe(3);
|
67
|
+
const result = (0, getTokensWithFunds_1.getTokensWithFunds)([accounts]);
|
68
|
+
expect(result).toEqual(["ETH on Ethereum", "ZRX on Ethereum", "REP on Ethereum"]);
|
69
|
+
});
|
70
|
+
});
|
71
|
+
//# sourceMappingURL=getTokensWithFunds.test.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"getTokensWithFunds.test.js","sourceRoot":"","sources":["../../src/domain/getTokensWithFunds.test.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"getTokensWithFunds.d.ts","sourceRoot":"","sources":["../../src/domain/getTokensWithFunds.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,eAAO,MAAM,kBAAkB,aAAc,OAAO,EAAE,KAAG,MAAM,EAgC9D,CAAC"}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
import { getParentAccount } from "@ledgerhq/coin-framework/account/helpers";
|
2
|
+
export const getTokensWithFunds = (accounts) => {
|
3
|
+
if (!accounts?.length)
|
4
|
+
return [];
|
5
|
+
const tokensMap = new Map();
|
6
|
+
for (const account of accounts) {
|
7
|
+
const { balance, currency } = account || {};
|
8
|
+
if (!balance?.gt(0) || !currency)
|
9
|
+
continue;
|
10
|
+
const parentAccount = getParentAccount(account, accounts);
|
11
|
+
const networkName = parentAccount?.currency?.name;
|
12
|
+
if (!networkName)
|
13
|
+
continue;
|
14
|
+
const mainKey = `${currency.ticker}:${networkName}`;
|
15
|
+
tokensMap.set(mainKey, {
|
16
|
+
ticker: currency.ticker,
|
17
|
+
networkName,
|
18
|
+
});
|
19
|
+
account.subAccounts?.forEach(subAccount => {
|
20
|
+
const { balance, token } = subAccount || {};
|
21
|
+
if (!balance?.gt(0) || !token)
|
22
|
+
return;
|
23
|
+
const subKey = `${token.ticker}:${networkName}`;
|
24
|
+
tokensMap.set(subKey, {
|
25
|
+
ticker: token.ticker,
|
26
|
+
networkName,
|
27
|
+
});
|
28
|
+
});
|
29
|
+
}
|
30
|
+
return Array.from(tokensMap.values(), ({ ticker, networkName }) => `${ticker} on ${networkName}`);
|
31
|
+
};
|
32
|
+
//# sourceMappingURL=getTokensWithFunds.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"getTokensWithFunds.js","sourceRoot":"","sources":["../../src/domain/getTokensWithFunds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAG5E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAmB,EAAY,EAAE;IAClE,IAAI,CAAC,QAAQ,EAAE,MAAM;QAAE,OAAO,EAAE,CAAC;IAEjC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAmD,CAAC;IAE7E,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;QAC9B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ;YAAE,SAAS;QAE3C,MAAM,aAAa,GAAG,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,aAAa,EAAE,QAAQ,EAAE,IAAI,CAAC;QAClD,IAAI,CAAC,WAAW;YAAE,SAAS;QAE3B,MAAM,OAAO,GAAG,GAAG,QAAQ,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;QACpD,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE;YACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,WAAW;SACZ,CAAC,CAAC;QAEH,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE;YACxC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,UAAU,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK;gBAAE,OAAO;YAEtC,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;YAChD,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE;gBACpB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,WAAW;aACZ,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;KACJ;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,OAAO,WAAW,EAAE,CAAC,CAAC;AACpG,CAAC,CAAC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"getTokensWithFunds.test.d.ts","sourceRoot":"","sources":["../../src/domain/getTokensWithFunds.test.ts"],"names":[],"mappings":""}
|
@@ -0,0 +1,66 @@
|
|
1
|
+
import { genAccount } from "@ledgerhq/coin-framework/lib/mocks/account";
|
2
|
+
import { getCryptoCurrencyById } from "@ledgerhq/live-common/currencies/index";
|
3
|
+
import BigNumber from "bignumber.js";
|
4
|
+
import { getTokensWithFunds } from "./getTokensWithFunds";
|
5
|
+
const ETH = getCryptoCurrencyById("ethereum");
|
6
|
+
const mockedAccounts = [
|
7
|
+
genAccount("mocked-account-2", {
|
8
|
+
currency: ETH,
|
9
|
+
}),
|
10
|
+
];
|
11
|
+
describe("getTokensWithFunds", () => {
|
12
|
+
it("should return empty array if no accounts", () => {
|
13
|
+
const result = getTokensWithFunds([]);
|
14
|
+
expect(result).toEqual([]);
|
15
|
+
});
|
16
|
+
it("should return array with accounts with funds", () => {
|
17
|
+
const account = mockedAccounts[0];
|
18
|
+
const result = getTokensWithFunds(mockedAccounts);
|
19
|
+
expect(account.balance).toBeTruthy();
|
20
|
+
expect(account.balance instanceof BigNumber).toBe(true);
|
21
|
+
expect(account.balance.gt(0)).toBe(true);
|
22
|
+
expect(account.subAccounts).toBeDefined();
|
23
|
+
expect(account.subAccounts?.length).toBe(2);
|
24
|
+
const [zrxAccount, repAccount] = account.subAccounts || [];
|
25
|
+
expect(zrxAccount.balance).toBeTruthy();
|
26
|
+
expect(zrxAccount.balance instanceof BigNumber).toBe(true);
|
27
|
+
expect(zrxAccount.balance.gt(0)).toBe(true);
|
28
|
+
expect(repAccount.balance).toBeTruthy();
|
29
|
+
expect(repAccount.balance instanceof BigNumber).toBe(true);
|
30
|
+
expect(repAccount.balance.gt(0)).toBe(true);
|
31
|
+
expect(result).toEqual(["ETH on Ethereum", "ZRX on Ethereum", "REP on Ethereum"]);
|
32
|
+
});
|
33
|
+
it("should return array with accounts with funds", () => {
|
34
|
+
const account = mockedAccounts[0];
|
35
|
+
expect(account.balance).toBeTruthy();
|
36
|
+
expect(account.balance instanceof BigNumber).toBe(true);
|
37
|
+
expect(account.balance.gt(0)).toBe(true);
|
38
|
+
expect(account.subAccounts).toBeDefined();
|
39
|
+
expect(account.subAccounts?.length).toBe(2);
|
40
|
+
const [zrxAccount, repAccount] = account.subAccounts || [];
|
41
|
+
const emptyRepAccount = { ...repAccount, balance: new BigNumber(0) };
|
42
|
+
expect(zrxAccount.balance).toBeTruthy();
|
43
|
+
expect(zrxAccount.balance instanceof BigNumber).toBe(true);
|
44
|
+
expect(zrxAccount.balance.gt(0)).toBe(true);
|
45
|
+
expect(emptyRepAccount.balance).toBeTruthy();
|
46
|
+
expect(emptyRepAccount.balance instanceof BigNumber).toBe(true);
|
47
|
+
expect(emptyRepAccount.balance.gt(0)).toBe(false);
|
48
|
+
const accounts = { ...account, subAccounts: [zrxAccount, emptyRepAccount] };
|
49
|
+
const result = getTokensWithFunds([accounts]);
|
50
|
+
expect(result).toEqual(["ETH on Ethereum", "ZRX on Ethereum"]);
|
51
|
+
});
|
52
|
+
it("should return array with accounts with funds without duplication", () => {
|
53
|
+
const account = mockedAccounts[0];
|
54
|
+
expect(account.balance).toBeTruthy();
|
55
|
+
expect(account.balance instanceof BigNumber).toBe(true);
|
56
|
+
expect(account.balance.gt(0)).toBe(true);
|
57
|
+
expect(account.subAccounts).toBeDefined();
|
58
|
+
expect(account.subAccounts?.length).toBe(2);
|
59
|
+
const [zrxAccount, repAccount] = account.subAccounts || [];
|
60
|
+
const accounts = { ...account, subAccounts: [zrxAccount, repAccount, repAccount] };
|
61
|
+
expect(accounts.subAccounts.length).toBe(3);
|
62
|
+
const result = getTokensWithFunds([accounts]);
|
63
|
+
expect(result).toEqual(["ETH on Ethereum", "ZRX on Ethereum", "REP on Ethereum"]);
|
64
|
+
});
|
65
|
+
});
|
66
|
+
//# sourceMappingURL=getTokensWithFunds.test.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"getTokensWithFunds.test.js","sourceRoot":"","sources":["../../src/domain/getTokensWithFunds.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "@ledgerhq/live-common",
|
3
3
|
"description": "Common ground for the Ledger Live apps",
|
4
|
-
"version": "34.33.0-nightly.
|
4
|
+
"version": "34.33.0-nightly.4",
|
5
5
|
"repository": {
|
6
6
|
"type": "git",
|
7
7
|
"url": "https://github.com/LedgerHQ/ledger-live.git"
|
@@ -162,39 +162,40 @@
|
|
162
162
|
"xstate": "4.38.3",
|
163
163
|
"yargs": "^17.0.0",
|
164
164
|
"zod": "^3.22.4",
|
165
|
+
"@ledgerhq/coin-aptos": "^1.9.5-nightly.0",
|
166
|
+
"@ledgerhq/coin-algorand": "^0.9.5-nightly.0",
|
165
167
|
"@ledgerhq/coin-bitcoin": "^0.15.5-nightly.0",
|
166
168
|
"@ledgerhq/coin-cardano": "^0.8.5-nightly.0",
|
167
|
-
"@ledgerhq/coin-algorand": "^0.9.5-nightly.0",
|
168
|
-
"@ledgerhq/coin-aptos": "^1.9.5-nightly.0",
|
169
169
|
"@ledgerhq/coin-casper": "^1.6.5-nightly.0",
|
170
170
|
"@ledgerhq/coin-celo": "^1.1.3-nightly.0",
|
171
171
|
"@ledgerhq/coin-cosmos": "^0.14.1-nightly.0",
|
172
172
|
"@ledgerhq/coin-evm": "^2.21.0-nightly.0",
|
173
|
-
"@ledgerhq/coin-framework": "^5.0.1-nightly.0",
|
174
173
|
"@ledgerhq/coin-filecoin": "^1.9.5-nightly.0",
|
174
|
+
"@ledgerhq/coin-framework": "^5.0.1-nightly.0",
|
175
175
|
"@ledgerhq/coin-hedera": "^1.6.5-nightly.0",
|
176
176
|
"@ledgerhq/coin-icon": "^0.10.5-nightly.0",
|
177
177
|
"@ledgerhq/coin-internet_computer": "^1.7.5-nightly.0",
|
178
|
+
"@ledgerhq/coin-mina": "^1.1.4-nightly.0",
|
179
|
+
"@ledgerhq/coin-multiversx": "^0.4.5-nightly.0",
|
178
180
|
"@ledgerhq/coin-near": "^0.11.5-nightly.0",
|
179
181
|
"@ledgerhq/coin-polkadot": "^6.0.1-nightly.1",
|
180
|
-
"@ledgerhq/coin-solana": "^0.22.0-nightly.
|
182
|
+
"@ledgerhq/coin-solana": "^0.22.0-nightly.2",
|
181
183
|
"@ledgerhq/coin-stacks": "^0.8.5-nightly.0",
|
182
184
|
"@ledgerhq/coin-stellar": "^5.0.1-nightly.0",
|
183
185
|
"@ledgerhq/coin-sui": "^0.3.2-nightly.0",
|
184
|
-
"@ledgerhq/coin-tezos": "^5.0
|
186
|
+
"@ledgerhq/coin-tezos": "^5.1.0-nightly.1",
|
185
187
|
"@ledgerhq/coin-ton": "^0.9.2-nightly.0",
|
186
|
-
"@ledgerhq/coin-tron": "^3.0
|
188
|
+
"@ledgerhq/coin-tron": "^3.1.0-nightly.1",
|
187
189
|
"@ledgerhq/coin-vechain": "^2.7.5-nightly.0",
|
188
190
|
"@ledgerhq/coin-xrp": "^6.0.1-nightly.0",
|
189
|
-
"@ledgerhq/crypto-icons-ui": "^1.
|
191
|
+
"@ledgerhq/crypto-icons-ui": "^1.14.0-nightly.0",
|
190
192
|
"@ledgerhq/cryptoassets": "^13.16.0",
|
191
|
-
"@ledgerhq/coin-mina": "^1.1.4-nightly.0",
|
192
193
|
"@ledgerhq/device-core": "^0.4.24-nightly.0",
|
194
|
+
"@ledgerhq/devices": "8.4.5-nightly.0",
|
193
195
|
"@ledgerhq/errors": "^6.20.0-nightly.0",
|
194
196
|
"@ledgerhq/hw-app-algorand": "^6.31.0",
|
195
197
|
"@ledgerhq/hw-app-aptos": "^6.34.0",
|
196
198
|
"@ledgerhq/hw-app-btc": "^10.9.0",
|
197
|
-
"@ledgerhq/devices": "8.4.5-nightly.0",
|
198
199
|
"@ledgerhq/hw-app-celo": "^6.33.2-nightly.0",
|
199
200
|
"@ledgerhq/hw-app-cosmos": "^6.32.0",
|
200
201
|
"@ledgerhq/hw-app-eth": "^6.45.4-nightly.0",
|
@@ -210,9 +211,10 @@
|
|
210
211
|
"@ledgerhq/hw-app-tezos": "^6.31.0",
|
211
212
|
"@ledgerhq/hw-app-trx": "^6.31.0",
|
212
213
|
"@ledgerhq/hw-app-vet": "^0.5.2",
|
214
|
+
"@ledgerhq/hw-app-xrp": "^6.31.0",
|
213
215
|
"@ledgerhq/hw-bolos": "6.32.1-nightly.0",
|
214
216
|
"@ledgerhq/hw-transport": "^6.31.5-nightly.0",
|
215
|
-
"@ledgerhq/
|
217
|
+
"@ledgerhq/hw-transport-mocker": "^6.29.5-nightly.0",
|
216
218
|
"@ledgerhq/ledger-cal-service": "^0.4.2",
|
217
219
|
"@ledgerhq/ledger-trust-service": "0.3.2",
|
218
220
|
"@ledgerhq/live-config": "^3.1.0",
|
@@ -225,12 +227,10 @@
|
|
225
227
|
"@ledgerhq/live-promise": "^0.1.0",
|
226
228
|
"@ledgerhq/live-signer-evm": "^0.4.0-nightly.0",
|
227
229
|
"@ledgerhq/live-wallet": "^0.10.8-nightly.0",
|
228
|
-
"@ledgerhq/hw-app-xrp": "^6.31.0",
|
229
230
|
"@ledgerhq/logs": "^6.12.0",
|
230
231
|
"@ledgerhq/speculos-transport": "^0.2.0",
|
231
232
|
"@ledgerhq/wallet-api-acre-module": "^0.5.0-nightly.1",
|
232
|
-
"@ledgerhq/wallet-api-exchange-module": "^0.13.0-nightly.1"
|
233
|
-
"@ledgerhq/hw-transport-mocker": "^6.29.5-nightly.0"
|
233
|
+
"@ledgerhq/wallet-api-exchange-module": "^0.13.0-nightly.1"
|
234
234
|
},
|
235
235
|
"devDependencies": {
|
236
236
|
"@solana/web3.js": "1.95.4",
|
@@ -0,0 +1,94 @@
|
|
1
|
+
import { genAccount } from "@ledgerhq/coin-framework/lib/mocks/account";
|
2
|
+
import { getCryptoCurrencyById } from "@ledgerhq/live-common/currencies/index";
|
3
|
+
import { Account } from "@ledgerhq/types-live";
|
4
|
+
import BigNumber from "bignumber.js";
|
5
|
+
import { getTokensWithFunds } from "./getTokensWithFunds";
|
6
|
+
|
7
|
+
const ETH = getCryptoCurrencyById("ethereum");
|
8
|
+
|
9
|
+
const mockedAccounts: Account[] = [
|
10
|
+
genAccount("mocked-account-2", {
|
11
|
+
currency: ETH,
|
12
|
+
}),
|
13
|
+
];
|
14
|
+
|
15
|
+
describe("getTokensWithFunds", () => {
|
16
|
+
it("should return empty array if no accounts", () => {
|
17
|
+
const result = getTokensWithFunds([]);
|
18
|
+
expect(result).toEqual([]);
|
19
|
+
});
|
20
|
+
|
21
|
+
it("should return array with accounts with funds", () => {
|
22
|
+
const account = mockedAccounts[0];
|
23
|
+
const result = getTokensWithFunds(mockedAccounts);
|
24
|
+
|
25
|
+
expect(account.balance).toBeTruthy();
|
26
|
+
expect(account.balance instanceof BigNumber).toBe(true);
|
27
|
+
expect(account.balance.gt(0)).toBe(true);
|
28
|
+
|
29
|
+
expect(account.subAccounts).toBeDefined();
|
30
|
+
expect(account.subAccounts?.length).toBe(2);
|
31
|
+
|
32
|
+
const [zrxAccount, repAccount] = account.subAccounts || [];
|
33
|
+
|
34
|
+
expect(zrxAccount.balance).toBeTruthy();
|
35
|
+
expect(zrxAccount.balance instanceof BigNumber).toBe(true);
|
36
|
+
expect(zrxAccount.balance.gt(0)).toBe(true);
|
37
|
+
|
38
|
+
expect(repAccount.balance).toBeTruthy();
|
39
|
+
expect(repAccount.balance instanceof BigNumber).toBe(true);
|
40
|
+
expect(repAccount.balance.gt(0)).toBe(true);
|
41
|
+
|
42
|
+
expect(result).toEqual(["ETH on Ethereum", "ZRX on Ethereum", "REP on Ethereum"]);
|
43
|
+
});
|
44
|
+
|
45
|
+
it("should return array with accounts with funds", () => {
|
46
|
+
const account = mockedAccounts[0];
|
47
|
+
|
48
|
+
expect(account.balance).toBeTruthy();
|
49
|
+
expect(account.balance instanceof BigNumber).toBe(true);
|
50
|
+
expect(account.balance.gt(0)).toBe(true);
|
51
|
+
|
52
|
+
expect(account.subAccounts).toBeDefined();
|
53
|
+
expect(account.subAccounts?.length).toBe(2);
|
54
|
+
|
55
|
+
const [zrxAccount, repAccount] = account.subAccounts || [];
|
56
|
+
|
57
|
+
const emptyRepAccount = { ...repAccount, balance: new BigNumber(0) };
|
58
|
+
|
59
|
+
expect(zrxAccount.balance).toBeTruthy();
|
60
|
+
expect(zrxAccount.balance instanceof BigNumber).toBe(true);
|
61
|
+
expect(zrxAccount.balance.gt(0)).toBe(true);
|
62
|
+
|
63
|
+
expect(emptyRepAccount.balance).toBeTruthy();
|
64
|
+
expect(emptyRepAccount.balance instanceof BigNumber).toBe(true);
|
65
|
+
expect(emptyRepAccount.balance.gt(0)).toBe(false);
|
66
|
+
|
67
|
+
const accounts = { ...account, subAccounts: [zrxAccount, emptyRepAccount] };
|
68
|
+
|
69
|
+
const result = getTokensWithFunds([accounts]);
|
70
|
+
|
71
|
+
expect(result).toEqual(["ETH on Ethereum", "ZRX on Ethereum"]);
|
72
|
+
});
|
73
|
+
|
74
|
+
it("should return array with accounts with funds without duplication", () => {
|
75
|
+
const account = mockedAccounts[0];
|
76
|
+
|
77
|
+
expect(account.balance).toBeTruthy();
|
78
|
+
expect(account.balance instanceof BigNumber).toBe(true);
|
79
|
+
expect(account.balance.gt(0)).toBe(true);
|
80
|
+
|
81
|
+
expect(account.subAccounts).toBeDefined();
|
82
|
+
expect(account.subAccounts?.length).toBe(2);
|
83
|
+
|
84
|
+
const [zrxAccount, repAccount] = account.subAccounts || [];
|
85
|
+
|
86
|
+
const accounts = { ...account, subAccounts: [zrxAccount, repAccount, repAccount] };
|
87
|
+
|
88
|
+
expect(accounts.subAccounts.length).toBe(3);
|
89
|
+
|
90
|
+
const result = getTokensWithFunds([accounts]);
|
91
|
+
|
92
|
+
expect(result).toEqual(["ETH on Ethereum", "ZRX on Ethereum", "REP on Ethereum"]);
|
93
|
+
});
|
94
|
+
});
|
@@ -0,0 +1,36 @@
|
|
1
|
+
import { getParentAccount } from "@ledgerhq/coin-framework/account/helpers";
|
2
|
+
import { Account } from "@ledgerhq/types-live";
|
3
|
+
|
4
|
+
export const getTokensWithFunds = (accounts: Account[]): string[] => {
|
5
|
+
if (!accounts?.length) return [];
|
6
|
+
|
7
|
+
const tokensMap = new Map<string, { ticker: string; networkName: string }>();
|
8
|
+
|
9
|
+
for (const account of accounts) {
|
10
|
+
const { balance, currency } = account || {};
|
11
|
+
if (!balance?.gt(0) || !currency) continue;
|
12
|
+
|
13
|
+
const parentAccount = getParentAccount(account, accounts);
|
14
|
+
const networkName = parentAccount?.currency?.name;
|
15
|
+
if (!networkName) continue;
|
16
|
+
|
17
|
+
const mainKey = `${currency.ticker}:${networkName}`;
|
18
|
+
tokensMap.set(mainKey, {
|
19
|
+
ticker: currency.ticker,
|
20
|
+
networkName,
|
21
|
+
});
|
22
|
+
|
23
|
+
account.subAccounts?.forEach(subAccount => {
|
24
|
+
const { balance, token } = subAccount || {};
|
25
|
+
if (!balance?.gt(0) || !token) return;
|
26
|
+
|
27
|
+
const subKey = `${token.ticker}:${networkName}`;
|
28
|
+
tokensMap.set(subKey, {
|
29
|
+
ticker: token.ticker,
|
30
|
+
networkName,
|
31
|
+
});
|
32
|
+
});
|
33
|
+
}
|
34
|
+
|
35
|
+
return Array.from(tokensMap.values(), ({ ticker, networkName }) => `${ticker} on ${networkName}`);
|
36
|
+
};
|