@ledgerhq/coin-vechain 2.6.0 → 2.7.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/.unimportedrc.json +1 -0
  2. package/CHANGELOG.md +16 -0
  3. package/jest.config.js +1 -0
  4. package/lib/bridge/helpers.d.ts +3 -0
  5. package/lib/bridge/helpers.d.ts.map +1 -0
  6. package/lib/bridge/helpers.js +9 -0
  7. package/lib/bridge/helpers.js.map +1 -0
  8. package/lib/bridge/synchronisation.d.ts.map +1 -1
  9. package/lib/bridge/synchronisation.js +5 -1
  10. package/lib/bridge/synchronisation.js.map +1 -1
  11. package/lib/bridge/synchronisation.test.d.ts +2 -0
  12. package/lib/bridge/synchronisation.test.d.ts.map +1 -0
  13. package/lib/bridge/synchronisation.test.js +201 -0
  14. package/lib/bridge/synchronisation.test.js.map +1 -0
  15. package/lib/index.d.ts +1 -0
  16. package/lib/index.d.ts.map +1 -1
  17. package/lib/index.js +3 -1
  18. package/lib/index.js.map +1 -1
  19. package/lib-es/bridge/helpers.d.ts +3 -0
  20. package/lib-es/bridge/helpers.d.ts.map +1 -0
  21. package/lib-es/bridge/helpers.js +5 -0
  22. package/lib-es/bridge/helpers.js.map +1 -0
  23. package/lib-es/bridge/synchronisation.d.ts.map +1 -1
  24. package/lib-es/bridge/synchronisation.js +5 -1
  25. package/lib-es/bridge/synchronisation.js.map +1 -1
  26. package/lib-es/bridge/synchronisation.test.d.ts +2 -0
  27. package/lib-es/bridge/synchronisation.test.d.ts.map +1 -0
  28. package/lib-es/bridge/synchronisation.test.js +196 -0
  29. package/lib-es/bridge/synchronisation.test.js.map +1 -0
  30. package/lib-es/index.d.ts +1 -0
  31. package/lib-es/index.d.ts.map +1 -1
  32. package/lib-es/index.js +1 -0
  33. package/lib-es/index.js.map +1 -1
  34. package/package.json +8 -6
  35. package/src/bridge/helpers.ts +8 -0
  36. package/src/bridge/synchronisation.test.ts +216 -0
  37. package/src/bridge/synchronisation.ts +5 -1
  38. package/src/index.ts +1 -0
  39. package/src/__snapshots__/bridge.integration.test.ts.snap +0 -146
@@ -21,6 +21,7 @@
21
21
  "src/bridge/createTransaction.ts",
22
22
  "src/bridge/estimateMaxSpendable.ts",
23
23
  "src/bridge/getTransactionStatus.ts",
24
+ "src/bridge/helpers.ts",
24
25
  "src/bridge/index.ts",
25
26
  "src/bridge/prepareTransaction.ts",
26
27
  "src/bridge/signOperation.ts",
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @ledgerhq/coin-evm
2
2
 
3
+ ## 2.7.0-next.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#9597](https://github.com/LedgerHQ/ledger-live/pull/9597) [`1e7d454`](https://github.com/LedgerHQ/ledger-live/commit/1e7d454d99f1f39880f39a120c59020725d26475) Thanks [@sprohaszka-ledger](https://github.com/sprohaszka-ledger)! - isAccountEmpty is now defined in each coin needed a dedicated logic.
8
+
9
+ - [#9648](https://github.com/LedgerHQ/ledger-live/pull/9648) [`f1732a7`](https://github.com/LedgerHQ/ledger-live/commit/f1732a795e54f666b67e7686d59926037412caca) Thanks [@sprohaszka-ledger](https://github.com/sprohaszka-ledger)! - Remove SubAccount as it is an alias to TokenAccount
10
+
11
+ ### Patch Changes
12
+
13
+ - Updated dependencies [[`44ae74c`](https://github.com/LedgerHQ/ledger-live/commit/44ae74c272ba803bed7c9f4fc3351e3ce8a15531), [`71bb6a9`](https://github.com/LedgerHQ/ledger-live/commit/71bb6a9adb4ac83172be5def5b25d2836380df1d), [`8ce7b0a`](https://github.com/LedgerHQ/ledger-live/commit/8ce7b0ab2d1d73ef071102f795e7c868c676b1f4), [`46a9620`](https://github.com/LedgerHQ/ledger-live/commit/46a9620b4ea6343efc28792d3b57bf84ee2a23e8), [`1e7d454`](https://github.com/LedgerHQ/ledger-live/commit/1e7d454d99f1f39880f39a120c59020725d26475), [`f1732a7`](https://github.com/LedgerHQ/ledger-live/commit/f1732a795e54f666b67e7686d59926037412caca), [`32d46cc`](https://github.com/LedgerHQ/ledger-live/commit/32d46cc77debe059ae0bcd848a21065dec7ee091), [`d694069`](https://github.com/LedgerHQ/ledger-live/commit/d6940698a49b7a0ed48f84d6e8184d80760cca4f)]:
14
+ - @ledgerhq/coin-framework@2.6.0-next.0
15
+ - @ledgerhq/live-env@2.8.0-next.0
16
+ - @ledgerhq/cryptoassets@13.14.1-next.0
17
+ - @ledgerhq/live-network@2.0.7-next.0
18
+
3
19
  ## 2.6.0
4
20
 
5
21
  ### Minor Changes
package/jest.config.js CHANGED
@@ -14,6 +14,7 @@ module.exports = {
14
14
  testEnvironment: "node",
15
15
  testPathIgnorePatterns: ["lib/", "lib-es/", ".integration.test.ts"],
16
16
  reporters: [
17
+ "default",
17
18
  [
18
19
  "jest-sonar",
19
20
  { outputName: "vechain-sonar-executionTests-report.xml", reportedFilePath: "absolute" },
@@ -0,0 +1,3 @@
1
+ import { Account } from "@ledgerhq/types-live";
2
+ export declare function isAccountEmpty(account: Pick<Account, "subAccounts" | "balance" | "operationsCount">): boolean;
3
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/bridge/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,wBAAgB,cAAc,CAC5B,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,GAAG,iBAAiB,CAAC,WAItE"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isAccountEmpty = void 0;
4
+ function isAccountEmpty(account) {
5
+ const checkSubAccounts = account.subAccounts && !account.subAccounts[0].balance.isZero();
6
+ return account.operationsCount === 0 && account.balance.isZero() && !checkSubAccounts;
7
+ }
8
+ exports.isAccountEmpty = isAccountEmpty;
9
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/bridge/helpers.ts"],"names":[],"mappings":";;;AAEA,SAAgB,cAAc,CAC5B,OAAqE;IAErE,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IACzF,OAAO,OAAO,CAAC,eAAe,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC;AACxF,CAAC;AALD,wCAKC"}
@@ -1 +1 @@
1
- {"version":3,"file":"synchronisation.d.ts","sourceRoot":"","sources":["../../src/bridge/synchronisation.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,eAAe,EAAY,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,eAAO,MAAM,eAAe,EAAE,eAAe,CAAC,OAAO,CAsEpD,CAAC"}
1
+ {"version":3,"file":"synchronisation.d.ts","sourceRoot":"","sources":["../../src/bridge/synchronisation.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,eAAe,EAAY,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG/C,eAAO,MAAM,eAAe,EAAE,eAAe,CAAC,OAAO,CAyEpD,CAAC"}
@@ -11,6 +11,7 @@ const network_1 = require("../network");
11
11
  const tokens_1 = require("@ledgerhq/cryptoassets/tokens");
12
12
  const constants_1 = require("../contracts/constants");
13
13
  const jsHelpers_1 = require("@ledgerhq/coin-framework/bridge/jsHelpers");
14
+ const helpers_1 = require("./helpers");
14
15
  const getAccountShape = async (info) => {
15
16
  const { initialAccount, currency, derivationMode } = info;
16
17
  const address = eip55_1.default.encode(info.address);
@@ -68,7 +69,10 @@ const getAccountShape = async (info) => {
68
69
  },
69
70
  ],
70
71
  };
71
- return shape;
72
+ return {
73
+ ...shape,
74
+ used: !(0, helpers_1.isAccountEmpty)(shape),
75
+ };
72
76
  };
73
77
  exports.getAccountShape = getAccountShape;
74
78
  //# sourceMappingURL=synchronisation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"synchronisation.js","sourceRoot":"","sources":["../../src/bridge/synchronisation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"synchronisation.js","sourceRoot":"","sources":["../../src/bridge/synchronisation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=synchronisation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synchronisation.test.d.ts","sourceRoot":"","sources":["../../src/bridge/synchronisation.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,201 @@
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 faker_1 = require("@faker-js/faker");
7
+ const account_1 = require("@ledgerhq/coin-framework/account");
8
+ const jsHelpers_1 = require("@ledgerhq/coin-framework/bridge/jsHelpers");
9
+ const cryptoassets_1 = require("@ledgerhq/cryptoassets");
10
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
11
+ const node_1 = require("msw/node");
12
+ const rxjs_1 = require("rxjs");
13
+ const synchronisation_1 = require("./synchronisation");
14
+ const mockGetAccount = jest.fn();
15
+ const mockGetOperations = jest.fn();
16
+ const mockGetTokenOperations = jest.fn();
17
+ const mockGetLastBlockHeight = jest.fn();
18
+ jest.mock("../network", () => {
19
+ return {
20
+ getAccount: () => mockGetAccount(),
21
+ getLastBlockHeight: () => mockGetLastBlockHeight(),
22
+ getOperations: () => mockGetOperations(),
23
+ getTokenOperations: () => mockGetTokenOperations(),
24
+ };
25
+ });
26
+ describe("scanAccounts", () => {
27
+ const syncConfig = {
28
+ paginationConfig: {},
29
+ };
30
+ const deviceId = "deviceId";
31
+ const currency = (0, cryptoassets_1.getCryptoCurrencyById)("vechain");
32
+ beforeAll(() => {
33
+ (0, node_1.setupServer)().listen({ onUnhandledRequest: "error" });
34
+ });
35
+ beforeEach(() => {
36
+ mockGetAccount.mockClear();
37
+ mockGetLastBlockHeight.mockClear();
38
+ mockGetOperations.mockClear();
39
+ mockGetTokenOperations.mockClear();
40
+ });
41
+ it("returns the account info and its subaccount", async () => {
42
+ // Given
43
+ const blockHeight = 0;
44
+ const address = "0x5066118c66793ED86bd379b50b20E32B0FC1aBf5";
45
+ const addressResolver = {
46
+ address,
47
+ path: "path",
48
+ publicKey: "publicKey",
49
+ };
50
+ mockGetAccount.mockResolvedValueOnce({ balance: "0", energy: "0" });
51
+ mockGetLastBlockHeight.mockResolvedValueOnce(blockHeight);
52
+ mockGetOperations.mockResolvedValueOnce([]);
53
+ mockGetTokenOperations.mockResolvedValueOnce([]);
54
+ // When
55
+ const scanAccounts = (0, jsHelpers_1.makeScanAccounts)({
56
+ getAccountShape: synchronisation_1.getAccountShape,
57
+ getAddressFn: (_deviceId, _addressOpt) => Promise.resolve(addressResolver),
58
+ });
59
+ const result = await (0, rxjs_1.firstValueFrom)(scanAccounts({
60
+ currency,
61
+ deviceId,
62
+ syncConfig,
63
+ }));
64
+ // Then
65
+ expect(result).toEqual({
66
+ account: {
67
+ id: "js:2:vechain:0x5066118c66793ED86bd379b50b20E32B0FC1aBf5:vechain",
68
+ balance: new bignumber_js_1.default("0"),
69
+ balanceHistoryCache: {
70
+ HOUR: {
71
+ latestDate: expect.any(Number),
72
+ balances: [],
73
+ },
74
+ DAY: {
75
+ latestDate: expect.any(Number),
76
+ balances: [],
77
+ },
78
+ WEEK: {
79
+ latestDate: expect.any(Number),
80
+ balances: [],
81
+ },
82
+ },
83
+ blockHeight,
84
+ creationDate: expect.any(Date),
85
+ currency,
86
+ derivationMode: "vechain",
87
+ freshAddress: addressResolver.address,
88
+ freshAddressPath: addressResolver.path,
89
+ index: 0,
90
+ lastSyncDate: expect.any(Date),
91
+ operations: [],
92
+ operationsCount: 0,
93
+ pendingOperations: [],
94
+ seedIdentifier: addressResolver.publicKey,
95
+ spendableBalance: new bignumber_js_1.default("0"),
96
+ swapHistory: [],
97
+ type: "Account",
98
+ used: false,
99
+ feesCurrency: (0, cryptoassets_1.getTokenById)("vechain/vip180/vtho"),
100
+ subAccounts: [
101
+ {
102
+ type: "TokenAccount",
103
+ id: "js:2:vechain:0x5066118c66793ED86bd379b50b20E32B0FC1aBf5:vechain+vechain%2Fvip180%2Fvtho",
104
+ parentId: "js:2:vechain:0x5066118c66793ED86bd379b50b20E32B0FC1aBf5:vechain",
105
+ token: (0, cryptoassets_1.getTokenById)("vechain/vip180/vtho"),
106
+ balance: new bignumber_js_1.default("0"),
107
+ spendableBalance: new bignumber_js_1.default("0"),
108
+ creationDate: expect.any(Date),
109
+ operationsCount: 0,
110
+ operations: [],
111
+ blockHeight,
112
+ pendingOperations: [],
113
+ balanceHistoryCache: (0, account_1.createEmptyHistoryCache)(),
114
+ swapHistory: [],
115
+ },
116
+ ],
117
+ },
118
+ type: "discovered",
119
+ });
120
+ });
121
+ it("returns the balance in the main account and the energy in the subAccount", async () => {
122
+ // Given
123
+ const address = "0x5066118c66793ED86bd379b50b20E32B0FC1aBf5";
124
+ const addressResolver = {
125
+ address,
126
+ path: "path",
127
+ publicKey: "publicKey",
128
+ };
129
+ const balance = new bignumber_js_1.default(faker_1.faker.number.int({ min: 100_000, max: 1_000_000 }));
130
+ const energy = new bignumber_js_1.default(faker_1.faker.number.int({ min: 100_000, max: 1_000_000 }));
131
+ mockGetAccount.mockResolvedValueOnce({ balance, energy });
132
+ mockGetOperations.mockResolvedValueOnce([]);
133
+ mockGetTokenOperations.mockResolvedValueOnce([]);
134
+ // When
135
+ const scanAccounts = (0, jsHelpers_1.makeScanAccounts)({
136
+ getAccountShape: synchronisation_1.getAccountShape,
137
+ getAddressFn: (_deviceId, _addressOpt) => Promise.resolve(addressResolver),
138
+ });
139
+ const { account } = await (0, rxjs_1.firstValueFrom)(scanAccounts({
140
+ currency,
141
+ deviceId,
142
+ syncConfig,
143
+ }));
144
+ // Then
145
+ expect(account).toMatchObject({
146
+ balance,
147
+ spendableBalance: balance,
148
+ subAccounts: [
149
+ {
150
+ balance: energy,
151
+ spendableBalance: energy,
152
+ },
153
+ ],
154
+ });
155
+ });
156
+ it.each([
157
+ {
158
+ balance: "100000",
159
+ energy: "0",
160
+ operations: [],
161
+ },
162
+ {
163
+ balance: "0",
164
+ energy: "100000",
165
+ operations: [],
166
+ },
167
+ {
168
+ balance: "0",
169
+ energy: "0",
170
+ operations: [
171
+ {
172
+ date: faker_1.faker.date.recent(),
173
+ },
174
+ ],
175
+ },
176
+ ])("returns the account flagged as used", async ({ balance, energy, operations }) => {
177
+ // Given
178
+ const address = "0x5066118c66793ED86bd379b50b20E32B0FC1aBf5";
179
+ const addressResolver = {
180
+ address,
181
+ path: "path",
182
+ publicKey: "publicKey",
183
+ };
184
+ mockGetAccount.mockResolvedValueOnce({ balance, energy });
185
+ mockGetOperations.mockResolvedValueOnce(operations);
186
+ mockGetTokenOperations.mockResolvedValueOnce([]);
187
+ // When
188
+ const scanAccounts = (0, jsHelpers_1.makeScanAccounts)({
189
+ getAccountShape: synchronisation_1.getAccountShape,
190
+ getAddressFn: (_deviceId, _addressOpt) => Promise.resolve(addressResolver),
191
+ });
192
+ const { account } = await (0, rxjs_1.firstValueFrom)(scanAccounts({
193
+ currency,
194
+ deviceId,
195
+ syncConfig,
196
+ }));
197
+ // Then
198
+ expect(account.used).toBe(true);
199
+ });
200
+ });
201
+ //# sourceMappingURL=synchronisation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synchronisation.test.js","sourceRoot":"","sources":["../../src/bridge/synchronisation.test.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export { createBridges } from "./bridge/index";
2
+ export { isAccountEmpty } from "./bridge/helpers";
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
package/lib/index.js CHANGED
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createBridges = void 0;
3
+ exports.isAccountEmpty = exports.createBridges = void 0;
4
4
  var index_1 = require("./bridge/index");
5
5
  Object.defineProperty(exports, "createBridges", { enumerable: true, get: function () { return index_1.createBridges; } });
6
+ var helpers_1 = require("./bridge/helpers");
7
+ Object.defineProperty(exports, "isAccountEmpty", { enumerable: true, get: function () { return helpers_1.isAccountEmpty; } });
6
8
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,wCAA+C;AAAtC,sGAAA,aAAa,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,wCAA+C;AAAtC,sGAAA,aAAa,OAAA;AACtB,4CAAkD;AAAzC,yGAAA,cAAc,OAAA"}
@@ -0,0 +1,3 @@
1
+ import { Account } from "@ledgerhq/types-live";
2
+ export declare function isAccountEmpty(account: Pick<Account, "subAccounts" | "balance" | "operationsCount">): boolean;
3
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/bridge/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,wBAAgB,cAAc,CAC5B,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,GAAG,iBAAiB,CAAC,WAItE"}
@@ -0,0 +1,5 @@
1
+ export function isAccountEmpty(account) {
2
+ const checkSubAccounts = account.subAccounts && !account.subAccounts[0].balance.isZero();
3
+ return account.operationsCount === 0 && account.balance.isZero() && !checkSubAccounts;
4
+ }
5
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/bridge/helpers.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAC5B,OAAqE;IAErE,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IACzF,OAAO,OAAO,CAAC,eAAe,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC;AACxF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"synchronisation.d.ts","sourceRoot":"","sources":["../../src/bridge/synchronisation.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,eAAe,EAAY,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,eAAO,MAAM,eAAe,EAAE,eAAe,CAAC,OAAO,CAsEpD,CAAC"}
1
+ {"version":3,"file":"synchronisation.d.ts","sourceRoot":"","sources":["../../src/bridge/synchronisation.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,eAAe,EAAY,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG/C,eAAO,MAAM,eAAe,EAAE,eAAe,CAAC,OAAO,CAyEpD,CAAC"}
@@ -5,6 +5,7 @@ import { getAccount, getLastBlockHeight, getOperations, getTokenOperations } fro
5
5
  import { findTokenById, getTokenById } from "@ledgerhq/cryptoassets/tokens";
6
6
  import { VTHO_ADDRESS } from "../contracts/constants";
7
7
  import { mergeOps } from "@ledgerhq/coin-framework/bridge/jsHelpers";
8
+ import { isAccountEmpty } from "./helpers";
8
9
  export const getAccountShape = async (info) => {
9
10
  const { initialAccount, currency, derivationMode } = info;
10
11
  const address = eip55.encode(info.address);
@@ -62,6 +63,9 @@ export const getAccountShape = async (info) => {
62
63
  },
63
64
  ],
64
65
  };
65
- return shape;
66
+ return {
67
+ ...shape,
68
+ used: !isAccountEmpty(shape),
69
+ };
66
70
  };
67
71
  //# sourceMappingURL=synchronisation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"synchronisation.js","sourceRoot":"","sources":["../../src/bridge/synchronisation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"synchronisation.js","sourceRoot":"","sources":["../../src/bridge/synchronisation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=synchronisation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synchronisation.test.d.ts","sourceRoot":"","sources":["../../src/bridge/synchronisation.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,196 @@
1
+ import { faker } from "@faker-js/faker";
2
+ import { createEmptyHistoryCache } from "@ledgerhq/coin-framework/account";
3
+ import { makeScanAccounts } from "@ledgerhq/coin-framework/bridge/jsHelpers";
4
+ import { getCryptoCurrencyById, getTokenById } from "@ledgerhq/cryptoassets";
5
+ import BigNumber from "bignumber.js";
6
+ import { setupServer } from "msw/node";
7
+ import { firstValueFrom } from "rxjs";
8
+ import { getAccountShape } from "./synchronisation";
9
+ const mockGetAccount = jest.fn();
10
+ const mockGetOperations = jest.fn();
11
+ const mockGetTokenOperations = jest.fn();
12
+ const mockGetLastBlockHeight = jest.fn();
13
+ jest.mock("../network", () => {
14
+ return {
15
+ getAccount: () => mockGetAccount(),
16
+ getLastBlockHeight: () => mockGetLastBlockHeight(),
17
+ getOperations: () => mockGetOperations(),
18
+ getTokenOperations: () => mockGetTokenOperations(),
19
+ };
20
+ });
21
+ describe("scanAccounts", () => {
22
+ const syncConfig = {
23
+ paginationConfig: {},
24
+ };
25
+ const deviceId = "deviceId";
26
+ const currency = getCryptoCurrencyById("vechain");
27
+ beforeAll(() => {
28
+ setupServer().listen({ onUnhandledRequest: "error" });
29
+ });
30
+ beforeEach(() => {
31
+ mockGetAccount.mockClear();
32
+ mockGetLastBlockHeight.mockClear();
33
+ mockGetOperations.mockClear();
34
+ mockGetTokenOperations.mockClear();
35
+ });
36
+ it("returns the account info and its subaccount", async () => {
37
+ // Given
38
+ const blockHeight = 0;
39
+ const address = "0x5066118c66793ED86bd379b50b20E32B0FC1aBf5";
40
+ const addressResolver = {
41
+ address,
42
+ path: "path",
43
+ publicKey: "publicKey",
44
+ };
45
+ mockGetAccount.mockResolvedValueOnce({ balance: "0", energy: "0" });
46
+ mockGetLastBlockHeight.mockResolvedValueOnce(blockHeight);
47
+ mockGetOperations.mockResolvedValueOnce([]);
48
+ mockGetTokenOperations.mockResolvedValueOnce([]);
49
+ // When
50
+ const scanAccounts = makeScanAccounts({
51
+ getAccountShape,
52
+ getAddressFn: (_deviceId, _addressOpt) => Promise.resolve(addressResolver),
53
+ });
54
+ const result = await firstValueFrom(scanAccounts({
55
+ currency,
56
+ deviceId,
57
+ syncConfig,
58
+ }));
59
+ // Then
60
+ expect(result).toEqual({
61
+ account: {
62
+ id: "js:2:vechain:0x5066118c66793ED86bd379b50b20E32B0FC1aBf5:vechain",
63
+ balance: new BigNumber("0"),
64
+ balanceHistoryCache: {
65
+ HOUR: {
66
+ latestDate: expect.any(Number),
67
+ balances: [],
68
+ },
69
+ DAY: {
70
+ latestDate: expect.any(Number),
71
+ balances: [],
72
+ },
73
+ WEEK: {
74
+ latestDate: expect.any(Number),
75
+ balances: [],
76
+ },
77
+ },
78
+ blockHeight,
79
+ creationDate: expect.any(Date),
80
+ currency,
81
+ derivationMode: "vechain",
82
+ freshAddress: addressResolver.address,
83
+ freshAddressPath: addressResolver.path,
84
+ index: 0,
85
+ lastSyncDate: expect.any(Date),
86
+ operations: [],
87
+ operationsCount: 0,
88
+ pendingOperations: [],
89
+ seedIdentifier: addressResolver.publicKey,
90
+ spendableBalance: new BigNumber("0"),
91
+ swapHistory: [],
92
+ type: "Account",
93
+ used: false,
94
+ feesCurrency: getTokenById("vechain/vip180/vtho"),
95
+ subAccounts: [
96
+ {
97
+ type: "TokenAccount",
98
+ id: "js:2:vechain:0x5066118c66793ED86bd379b50b20E32B0FC1aBf5:vechain+vechain%2Fvip180%2Fvtho",
99
+ parentId: "js:2:vechain:0x5066118c66793ED86bd379b50b20E32B0FC1aBf5:vechain",
100
+ token: getTokenById("vechain/vip180/vtho"),
101
+ balance: new BigNumber("0"),
102
+ spendableBalance: new BigNumber("0"),
103
+ creationDate: expect.any(Date),
104
+ operationsCount: 0,
105
+ operations: [],
106
+ blockHeight,
107
+ pendingOperations: [],
108
+ balanceHistoryCache: createEmptyHistoryCache(),
109
+ swapHistory: [],
110
+ },
111
+ ],
112
+ },
113
+ type: "discovered",
114
+ });
115
+ });
116
+ it("returns the balance in the main account and the energy in the subAccount", async () => {
117
+ // Given
118
+ const address = "0x5066118c66793ED86bd379b50b20E32B0FC1aBf5";
119
+ const addressResolver = {
120
+ address,
121
+ path: "path",
122
+ publicKey: "publicKey",
123
+ };
124
+ const balance = new BigNumber(faker.number.int({ min: 100_000, max: 1_000_000 }));
125
+ const energy = new BigNumber(faker.number.int({ min: 100_000, max: 1_000_000 }));
126
+ mockGetAccount.mockResolvedValueOnce({ balance, energy });
127
+ mockGetOperations.mockResolvedValueOnce([]);
128
+ mockGetTokenOperations.mockResolvedValueOnce([]);
129
+ // When
130
+ const scanAccounts = makeScanAccounts({
131
+ getAccountShape,
132
+ getAddressFn: (_deviceId, _addressOpt) => Promise.resolve(addressResolver),
133
+ });
134
+ const { account } = await firstValueFrom(scanAccounts({
135
+ currency,
136
+ deviceId,
137
+ syncConfig,
138
+ }));
139
+ // Then
140
+ expect(account).toMatchObject({
141
+ balance,
142
+ spendableBalance: balance,
143
+ subAccounts: [
144
+ {
145
+ balance: energy,
146
+ spendableBalance: energy,
147
+ },
148
+ ],
149
+ });
150
+ });
151
+ it.each([
152
+ {
153
+ balance: "100000",
154
+ energy: "0",
155
+ operations: [],
156
+ },
157
+ {
158
+ balance: "0",
159
+ energy: "100000",
160
+ operations: [],
161
+ },
162
+ {
163
+ balance: "0",
164
+ energy: "0",
165
+ operations: [
166
+ {
167
+ date: faker.date.recent(),
168
+ },
169
+ ],
170
+ },
171
+ ])("returns the account flagged as used", async ({ balance, energy, operations }) => {
172
+ // Given
173
+ const address = "0x5066118c66793ED86bd379b50b20E32B0FC1aBf5";
174
+ const addressResolver = {
175
+ address,
176
+ path: "path",
177
+ publicKey: "publicKey",
178
+ };
179
+ mockGetAccount.mockResolvedValueOnce({ balance, energy });
180
+ mockGetOperations.mockResolvedValueOnce(operations);
181
+ mockGetTokenOperations.mockResolvedValueOnce([]);
182
+ // When
183
+ const scanAccounts = makeScanAccounts({
184
+ getAccountShape,
185
+ getAddressFn: (_deviceId, _addressOpt) => Promise.resolve(addressResolver),
186
+ });
187
+ const { account } = await firstValueFrom(scanAccounts({
188
+ currency,
189
+ deviceId,
190
+ syncConfig,
191
+ }));
192
+ // Then
193
+ expect(account.used).toBe(true);
194
+ });
195
+ });
196
+ //# sourceMappingURL=synchronisation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synchronisation.test.js","sourceRoot":"","sources":["../../src/bridge/synchronisation.test.ts"],"names":[],"mappings":"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"}
package/lib-es/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export { createBridges } from "./bridge/index";
2
+ export { isAccountEmpty } from "./bridge/helpers";
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
package/lib-es/index.js CHANGED
@@ -1,2 +1,3 @@
1
1
  export { createBridges } from "./bridge/index";
2
+ export { isAccountEmpty } from "./bridge/helpers";
2
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ledgerhq/coin-vechain",
3
- "version": "2.6.0",
3
+ "version": "2.7.0-next.0",
4
4
  "description": "Ledger VeChain Coin integration",
5
5
  "keywords": [
6
6
  "Ledger",
@@ -85,24 +85,26 @@
85
85
  "lodash": "^4.17.21",
86
86
  "rxjs": "^7.8.1",
87
87
  "thor-devkit": "^2.0.6",
88
- "@ledgerhq/coin-framework": "^2.5.0",
89
- "@ledgerhq/cryptoassets": "^13.14.0",
88
+ "@ledgerhq/coin-framework": "^2.6.0-next.0",
89
+ "@ledgerhq/cryptoassets": "^13.14.1-next.0",
90
90
  "@ledgerhq/devices": "^8.4.4",
91
91
  "@ledgerhq/errors": "^6.19.1",
92
- "@ledgerhq/live-env": "^2.7.0",
93
- "@ledgerhq/live-network": "^2.0.6"
92
+ "@ledgerhq/live-env": "^2.8.0-next.0",
93
+ "@ledgerhq/live-network": "^2.0.7-next.0"
94
94
  },
95
95
  "devDependencies": {
96
+ "@faker-js/faker": "^9.6.0",
96
97
  "@types/invariant": "^2.2.2",
97
98
  "@types/jest": "^29.5.10",
98
99
  "@types/lodash": "^4.14.191",
99
100
  "dotenv": "^16.4.5",
100
101
  "jest": "^29.7.0",
101
102
  "jest-sonar": "0.2.16",
103
+ "msw": "^2.2.13",
102
104
  "ts-jest": "^29.1.1",
103
105
  "@ledgerhq/coin-tester": "^0.4.0",
104
106
  "@ledgerhq/types-cryptoassets": "^7.21.0",
105
- "@ledgerhq/types-live": "^6.65.0"
107
+ "@ledgerhq/types-live": "^6.66.0-next.0"
106
108
  },
107
109
  "scripts": {
108
110
  "clean": "rimraf lib lib-es",
@@ -0,0 +1,8 @@
1
+ import { Account } from "@ledgerhq/types-live";
2
+
3
+ export function isAccountEmpty(
4
+ account: Pick<Account, "subAccounts" | "balance" | "operationsCount">,
5
+ ) {
6
+ const checkSubAccounts = account.subAccounts && !account.subAccounts[0].balance.isZero();
7
+ return account.operationsCount === 0 && account.balance.isZero() && !checkSubAccounts;
8
+ }
@@ -0,0 +1,216 @@
1
+ import { faker } from "@faker-js/faker";
2
+ import { createEmptyHistoryCache } from "@ledgerhq/coin-framework/account";
3
+ import { makeScanAccounts } from "@ledgerhq/coin-framework/bridge/jsHelpers";
4
+ import { getCryptoCurrencyById, getTokenById } from "@ledgerhq/cryptoassets";
5
+ import BigNumber from "bignumber.js";
6
+ import { setupServer } from "msw/node";
7
+ import { firstValueFrom } from "rxjs";
8
+ import { getAccountShape } from "./synchronisation";
9
+ import { Operation } from "@ledgerhq/types-live";
10
+
11
+ const mockGetAccount = jest.fn();
12
+ const mockGetOperations = jest.fn();
13
+ const mockGetTokenOperations = jest.fn();
14
+ const mockGetLastBlockHeight = jest.fn();
15
+
16
+ jest.mock("../network", () => {
17
+ return {
18
+ getAccount: () => mockGetAccount(),
19
+ getLastBlockHeight: () => mockGetLastBlockHeight(),
20
+ getOperations: () => mockGetOperations(),
21
+ getTokenOperations: () => mockGetTokenOperations(),
22
+ };
23
+ });
24
+
25
+ describe("scanAccounts", () => {
26
+ const syncConfig = {
27
+ paginationConfig: {},
28
+ };
29
+ const deviceId = "deviceId";
30
+ const currency = getCryptoCurrencyById("vechain");
31
+
32
+ beforeAll(() => {
33
+ setupServer().listen({ onUnhandledRequest: "error" });
34
+ });
35
+
36
+ beforeEach(() => {
37
+ mockGetAccount.mockClear();
38
+ mockGetLastBlockHeight.mockClear();
39
+ mockGetOperations.mockClear();
40
+ mockGetTokenOperations.mockClear();
41
+ });
42
+
43
+ it("returns the account info and its subaccount", async () => {
44
+ // Given
45
+ const blockHeight = 0;
46
+ const address = "0x5066118c66793ED86bd379b50b20E32B0FC1aBf5";
47
+ const addressResolver = {
48
+ address,
49
+ path: "path",
50
+ publicKey: "publicKey",
51
+ };
52
+ mockGetAccount.mockResolvedValueOnce({ balance: "0", energy: "0" });
53
+ mockGetLastBlockHeight.mockResolvedValueOnce(blockHeight);
54
+ mockGetOperations.mockResolvedValueOnce([]);
55
+ mockGetTokenOperations.mockResolvedValueOnce([]);
56
+
57
+ // When
58
+ const scanAccounts = makeScanAccounts({
59
+ getAccountShape,
60
+ getAddressFn: (_deviceId, _addressOpt) => Promise.resolve(addressResolver),
61
+ });
62
+ const result = await firstValueFrom(
63
+ scanAccounts({
64
+ currency,
65
+ deviceId,
66
+ syncConfig,
67
+ }),
68
+ );
69
+
70
+ // Then
71
+ expect(result).toEqual({
72
+ account: {
73
+ id: "js:2:vechain:0x5066118c66793ED86bd379b50b20E32B0FC1aBf5:vechain",
74
+ balance: new BigNumber("0"),
75
+ balanceHistoryCache: {
76
+ HOUR: {
77
+ latestDate: expect.any(Number),
78
+ balances: [],
79
+ },
80
+ DAY: {
81
+ latestDate: expect.any(Number),
82
+ balances: [],
83
+ },
84
+ WEEK: {
85
+ latestDate: expect.any(Number),
86
+ balances: [],
87
+ },
88
+ },
89
+ blockHeight,
90
+ creationDate: expect.any(Date),
91
+ currency,
92
+ derivationMode: "vechain",
93
+ freshAddress: addressResolver.address,
94
+ freshAddressPath: addressResolver.path,
95
+ index: 0,
96
+ lastSyncDate: expect.any(Date),
97
+ operations: [],
98
+ operationsCount: 0,
99
+ pendingOperations: [],
100
+ seedIdentifier: addressResolver.publicKey,
101
+ spendableBalance: new BigNumber("0"),
102
+ swapHistory: [],
103
+ type: "Account",
104
+ used: false,
105
+ feesCurrency: getTokenById("vechain/vip180/vtho"),
106
+ subAccounts: [
107
+ {
108
+ type: "TokenAccount",
109
+ id: "js:2:vechain:0x5066118c66793ED86bd379b50b20E32B0FC1aBf5:vechain+vechain%2Fvip180%2Fvtho",
110
+ parentId: "js:2:vechain:0x5066118c66793ED86bd379b50b20E32B0FC1aBf5:vechain",
111
+ token: getTokenById("vechain/vip180/vtho"),
112
+ balance: new BigNumber("0"),
113
+ spendableBalance: new BigNumber("0"),
114
+ creationDate: expect.any(Date),
115
+ operationsCount: 0,
116
+ operations: [],
117
+ blockHeight,
118
+ pendingOperations: [],
119
+ balanceHistoryCache: createEmptyHistoryCache(),
120
+ swapHistory: [],
121
+ },
122
+ ],
123
+ },
124
+ type: "discovered",
125
+ });
126
+ });
127
+
128
+ it("returns the balance in the main account and the energy in the subAccount", async () => {
129
+ // Given
130
+ const address = "0x5066118c66793ED86bd379b50b20E32B0FC1aBf5";
131
+ const addressResolver = {
132
+ address,
133
+ path: "path",
134
+ publicKey: "publicKey",
135
+ };
136
+ const balance = new BigNumber(faker.number.int({ min: 100_000, max: 1_000_000 }));
137
+ const energy = new BigNumber(faker.number.int({ min: 100_000, max: 1_000_000 }));
138
+ mockGetAccount.mockResolvedValueOnce({ balance, energy });
139
+ mockGetOperations.mockResolvedValueOnce([]);
140
+ mockGetTokenOperations.mockResolvedValueOnce([]);
141
+
142
+ // When
143
+ const scanAccounts = makeScanAccounts({
144
+ getAccountShape,
145
+ getAddressFn: (_deviceId, _addressOpt) => Promise.resolve(addressResolver),
146
+ });
147
+ const { account } = await firstValueFrom(
148
+ scanAccounts({
149
+ currency,
150
+ deviceId,
151
+ syncConfig,
152
+ }),
153
+ );
154
+
155
+ // Then
156
+ expect(account).toMatchObject({
157
+ balance,
158
+ spendableBalance: balance,
159
+ subAccounts: [
160
+ {
161
+ balance: energy,
162
+ spendableBalance: energy,
163
+ },
164
+ ],
165
+ });
166
+ });
167
+
168
+ it.each([
169
+ {
170
+ balance: "100000",
171
+ energy: "0",
172
+ operations: [] as unknown as Operation,
173
+ },
174
+ {
175
+ balance: "0",
176
+ energy: "100000",
177
+ operations: [] as unknown as Operation,
178
+ },
179
+ {
180
+ balance: "0",
181
+ energy: "0",
182
+ operations: [
183
+ {
184
+ date: faker.date.recent(),
185
+ },
186
+ ] as unknown as Operation,
187
+ },
188
+ ])("returns the account flagged as used", async ({ balance, energy, operations }) => {
189
+ // Given
190
+ const address = "0x5066118c66793ED86bd379b50b20E32B0FC1aBf5";
191
+ const addressResolver = {
192
+ address,
193
+ path: "path",
194
+ publicKey: "publicKey",
195
+ };
196
+ mockGetAccount.mockResolvedValueOnce({ balance, energy });
197
+ mockGetOperations.mockResolvedValueOnce(operations);
198
+ mockGetTokenOperations.mockResolvedValueOnce([]);
199
+
200
+ // When
201
+ const scanAccounts = makeScanAccounts({
202
+ getAccountShape,
203
+ getAddressFn: (_deviceId, _addressOpt) => Promise.resolve(addressResolver),
204
+ });
205
+ const { account } = await firstValueFrom(
206
+ scanAccounts({
207
+ currency,
208
+ deviceId,
209
+ syncConfig,
210
+ }),
211
+ );
212
+
213
+ // Then
214
+ expect(account.used).toBe(true);
215
+ });
216
+ });
@@ -12,6 +12,7 @@ import { findTokenById, getTokenById } from "@ledgerhq/cryptoassets/tokens";
12
12
  import { VTHO_ADDRESS } from "../contracts/constants";
13
13
  import { GetAccountShape, mergeOps } from "@ledgerhq/coin-framework/bridge/jsHelpers";
14
14
  import { Account } from "@ledgerhq/types-live";
15
+ import { isAccountEmpty } from "./helpers";
15
16
 
16
17
  export const getAccountShape: GetAccountShape<Account> = async info => {
17
18
  const { initialAccount, currency, derivationMode } = info;
@@ -82,5 +83,8 @@ export const getAccountShape: GetAccountShape<Account> = async info => {
82
83
  ],
83
84
  };
84
85
 
85
- return shape;
86
+ return {
87
+ ...shape,
88
+ used: !isAccountEmpty(shape),
89
+ };
86
90
  };
package/src/index.ts CHANGED
@@ -1 +1,2 @@
1
1
  export { createBridges } from "./bridge/index";
2
+ export { isAccountEmpty } from "./bridge/helpers";
@@ -1,146 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`vechain currency bridge scanAccounts vechain seed 1 1`] = `
4
- [
5
- {
6
- "currencyId": "vechain",
7
- "derivationMode": "vechain",
8
- "feesCurrencyId": "vechain/vip180/vtho",
9
- "freshAddress": "0x0fe6688548f0C303932bB197B0A96034f1d74dba",
10
- "freshAddressPath": "44'/818'/0'/0/0",
11
- "id": "js:2:vechain:0x0fe6688548f0C303932bB197B0A96034f1d74dba:vechain",
12
- "index": 0,
13
- "operationsCount": 1,
14
- "pendingOperations": [],
15
- "seedIdentifier": "04de5a8f11cc426ff5617aeffd397c5dd77b58424662f368f2cd539a8c42fd2e7d0c6245c9c3a4306f70d7f292e95642651a6832d66fd9823fa6a0af575113e94e",
16
- "subAccounts": [],
17
- "swapHistory": [],
18
- "syncHash": undefined,
19
- "used": true,
20
- },
21
- {
22
- "id": "js:2:vechain:0x0fe6688548f0C303932bB197B0A96034f1d74dba:vechain+vechain%2Fvip180%2Fvtho",
23
- "operationsCount": 1,
24
- "parentId": "js:2:vechain:0x0fe6688548f0C303932bB197B0A96034f1d74dba:vechain",
25
- "pendingOperations": [],
26
- "swapHistory": [],
27
- "tokenId": "vechain/vip180/vtho",
28
- "type": "TokenAccountRaw",
29
- },
30
- {
31
- "currencyId": "vechain",
32
- "derivationMode": "vechain",
33
- "feesCurrencyId": "vechain/vip180/vtho",
34
- "freshAddress": "0x02961B92B8D20A4ea12f1f1CeFA74Dd7B4355A86",
35
- "freshAddressPath": "44'/818'/0'/0/1",
36
- "id": "js:2:vechain:0x02961B92B8D20A4ea12f1f1CeFA74Dd7B4355A86:vechain",
37
- "index": 1,
38
- "operationsCount": 1,
39
- "pendingOperations": [],
40
- "seedIdentifier": "04de5a8f11cc426ff5617aeffd397c5dd77b58424662f368f2cd539a8c42fd2e7d0c6245c9c3a4306f70d7f292e95642651a6832d66fd9823fa6a0af575113e94e",
41
- "subAccounts": [],
42
- "swapHistory": [],
43
- "syncHash": undefined,
44
- "used": true,
45
- },
46
- {
47
- "id": "js:2:vechain:0x02961B92B8D20A4ea12f1f1CeFA74Dd7B4355A86:vechain+vechain%2Fvip180%2Fvtho",
48
- "operationsCount": 0,
49
- "parentId": "js:2:vechain:0x02961B92B8D20A4ea12f1f1CeFA74Dd7B4355A86:vechain",
50
- "pendingOperations": [],
51
- "swapHistory": [],
52
- "tokenId": "vechain/vip180/vtho",
53
- "type": "TokenAccountRaw",
54
- },
55
- {
56
- "currencyId": "vechain",
57
- "derivationMode": "vechain",
58
- "feesCurrencyId": "vechain/vip180/vtho",
59
- "freshAddress": "0xFbC8653C0b842dd33361CE8938B24e407dd4838C",
60
- "freshAddressPath": "44'/818'/0'/0/2",
61
- "id": "js:2:vechain:0xFbC8653C0b842dd33361CE8938B24e407dd4838C:vechain",
62
- "index": 2,
63
- "operationsCount": 0,
64
- "pendingOperations": [],
65
- "seedIdentifier": "04de5a8f11cc426ff5617aeffd397c5dd77b58424662f368f2cd539a8c42fd2e7d0c6245c9c3a4306f70d7f292e95642651a6832d66fd9823fa6a0af575113e94e",
66
- "subAccounts": [],
67
- "swapHistory": [],
68
- "syncHash": undefined,
69
- "used": false,
70
- },
71
- {
72
- "id": "js:2:vechain:0xFbC8653C0b842dd33361CE8938B24e407dd4838C:vechain+vechain%2Fvip180%2Fvtho",
73
- "operationsCount": 0,
74
- "parentId": "js:2:vechain:0xFbC8653C0b842dd33361CE8938B24e407dd4838C:vechain",
75
- "pendingOperations": [],
76
- "swapHistory": [],
77
- "tokenId": "vechain/vip180/vtho",
78
- "type": "TokenAccountRaw",
79
- },
80
- ]
81
- `;
82
-
83
- exports[`vechain currency bridge scanAccounts vechain seed 1 2`] = `
84
- [
85
- [
86
- {
87
- "accountId": "js:2:vechain:0x0fe6688548f0C303932bB197B0A96034f1d74dba:vechain",
88
- "blockHash": "0x00fa5b35f158cee280b6be35b4ada7669951035a79806244aaa11e5d2764d5bd",
89
- "blockHeight": 16407349,
90
- "extra": {},
91
- "fee": "210000000000000000",
92
- "hash": "0xe113f82af98a24c6f2473802f8673f0d69eed1c0f51a5a87d3cc6b8cf96ccfd6",
93
- "id": "js:2:vechain:0x0fe6688548f0C303932bB197B0A96034f1d74dba:vechain-0xe113f82af98a24c6f2473802f8673f0d69eed1c0f51a5a87d3cc6b8cf96ccfd6-IN",
94
- "recipients": [
95
- "0x0fe6688548f0c303932bb197b0a96034f1d74dba",
96
- ],
97
- "senders": [
98
- "0xcf130b42ae31c4931298b4b1c0f1d974b8732957",
99
- ],
100
- "type": "IN",
101
- "value": "10000000000000000000",
102
- },
103
- ],
104
- [
105
- {
106
- "accountId": "js:2:vechain:0x0fe6688548f0C303932bB197B0A96034f1d74dba:vechain+vechain%2Fvip180%2Fvtho",
107
- "blockHash": "0x00fa5b4ee2eca5cf65907e3695bbea044cd1f78224534dc0ba02526890055ecc",
108
- "blockHeight": 16407374,
109
- "extra": {},
110
- "fee": "365180000000000000",
111
- "hash": "0x5fdd7191c4d476a8e86060d516366e87421f65667b9b3c14c33a740c04921b10",
112
- "id": "js:2:vechain:0x0fe6688548f0C303932bB197B0A96034f1d74dba:vechain+vechain%2Fvip180%2Fvtho-0x5fdd7191c4d476a8e86060d516366e87421f65667b9b3c14c33a740c04921b10-IN",
113
- "recipients": [
114
- "0x0fe6688548f0c303932bb197b0a96034f1d74dba",
115
- ],
116
- "senders": [
117
- "0xcf130b42ae31c4931298b4b1c0f1d974b8732957",
118
- ],
119
- "type": "IN",
120
- "value": "10000000000000000000",
121
- },
122
- ],
123
- [
124
- {
125
- "accountId": "js:2:vechain:0x02961B92B8D20A4ea12f1f1CeFA74Dd7B4355A86:vechain",
126
- "blockHash": "0x00fa5b547b0d542ba8e62a85aa99cf355f1b2a70bd34e3949f889b0856776e05",
127
- "blockHeight": 16407380,
128
- "extra": {},
129
- "fee": "210000000000000000",
130
- "hash": "0xa4096186f2d58ecc68e6ea11c9757ef5bd78b21b87d73b4618eb6fd3508431ec",
131
- "id": "js:2:vechain:0x02961B92B8D20A4ea12f1f1CeFA74Dd7B4355A86:vechain-0xa4096186f2d58ecc68e6ea11c9757ef5bd78b21b87d73b4618eb6fd3508431ec-IN",
132
- "recipients": [
133
- "0x02961b92b8d20a4ea12f1f1cefa74dd7b4355a86",
134
- ],
135
- "senders": [
136
- "0xcf130b42ae31c4931298b4b1c0f1d974b8732957",
137
- ],
138
- "type": "IN",
139
- "value": "10000000000000000000",
140
- },
141
- ],
142
- [],
143
- [],
144
- [],
145
- ]
146
- `;