@ledgerhq/live-common 21.19.4 → 21.20.0-nft.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 (66) hide show
  1. package/lib/bridge/jsHelpers.d.ts +1 -1
  2. package/lib/bridge/jsHelpers.d.ts.map +1 -1
  3. package/lib/bridge/jsHelpers.js +9 -8
  4. package/lib/bridge/jsHelpers.js.map +1 -1
  5. package/lib/data/icons/react/cro.d.ts +8 -0
  6. package/lib/data/icons/react/cro.d.ts.map +1 -0
  7. package/lib/data/icons/react/cro.js +30 -0
  8. package/lib/data/icons/react/cro.js.map +1 -0
  9. package/lib/data/icons/react/index.d.ts +1 -0
  10. package/lib/data/icons/react/index.d.ts.map +1 -1
  11. package/lib/data/icons/react/index.js +10 -8
  12. package/lib/data/icons/react/index.js.map +1 -1
  13. package/lib/data/icons/reactNative/cro.d.ts +8 -0
  14. package/lib/data/icons/reactNative/cro.d.ts.map +1 -0
  15. package/lib/data/icons/reactNative/cro.js +31 -0
  16. package/lib/data/icons/reactNative/cro.js.map +1 -0
  17. package/lib/data/icons/reactNative/index.d.ts +1 -0
  18. package/lib/data/icons/reactNative/index.d.ts.map +1 -1
  19. package/lib/data/icons/reactNative/index.js +10 -8
  20. package/lib/data/icons/reactNative/index.js.map +1 -1
  21. package/lib/families/ethereum/modules/erc20.d.ts.map +1 -1
  22. package/lib/families/ethereum/modules/erc20.js +0 -12
  23. package/lib/families/ethereum/modules/erc20.js.map +1 -1
  24. package/lib/families/ethereum/modules/erc721.d.ts.map +1 -1
  25. package/lib/families/ethereum/modules/erc721.js +0 -1
  26. package/lib/families/ethereum/modules/erc721.js.map +1 -1
  27. package/lib/families/ethereum/nft.integration.test.d.ts +2 -0
  28. package/lib/families/ethereum/nft.integration.test.d.ts.map +1 -0
  29. package/lib/families/ethereum/nft.integration.test.js +264 -0
  30. package/lib/families/ethereum/nft.integration.test.js.map +1 -0
  31. package/lib/families/ethereum/nft.merging.unit.test.d.ts +2 -0
  32. package/lib/families/ethereum/nft.merging.unit.test.d.ts.map +1 -0
  33. package/lib/families/ethereum/nft.merging.unit.test.js +72 -0
  34. package/lib/families/ethereum/nft.merging.unit.test.js.map +1 -0
  35. package/lib/families/ethereum/synchronisation.js +4 -4
  36. package/lib/families/ethereum/synchronisation.js.map +1 -1
  37. package/lib/nft/NftMetadataProvider/index.d.ts +3 -2
  38. package/lib/nft/NftMetadataProvider/index.d.ts.map +1 -1
  39. package/lib/nft/NftMetadataProvider/index.js +9 -2
  40. package/lib/nft/NftMetadataProvider/index.js.map +1 -1
  41. package/lib/notifications/ServiceStatusProvider/index.d.ts.map +1 -1
  42. package/lib/notifications/ServiceStatusProvider/index.js +4 -1
  43. package/lib/notifications/ServiceStatusProvider/index.js.map +1 -1
  44. package/lib/operation.d.ts.map +1 -1
  45. package/lib/operation.js +0 -2
  46. package/lib/operation.js.map +1 -1
  47. package/package.json +1 -1
  48. package/src/bridge/jsHelpers.ts +10 -15
  49. package/src/data/icons/react/cro.tsx +12 -0
  50. package/src/data/icons/react/index.tsx +1 -0
  51. package/src/data/icons/reactNative/cro.tsx +13 -0
  52. package/src/data/icons/reactNative/index.tsx +1 -0
  53. package/src/data/icons/svg/CRO.svg +3 -0
  54. package/src/families/ethereum/modules/erc20.ts +0 -4
  55. package/src/families/ethereum/modules/erc721.ts +0 -4
  56. package/src/families/ethereum/nft.integration.test.ts +168 -0
  57. package/src/families/ethereum/nft.merging.unit.test.ts +78 -0
  58. package/src/families/ethereum/synchronisation.ts +4 -4
  59. package/src/nft/NftMetadataProvider/index.tsx +12 -3
  60. package/src/notifications/ServiceStatusProvider/index.tsx +5 -1
  61. package/src/operation.ts +0 -2
  62. package/lib/families/ethereum/nft.test.d.ts +0 -2
  63. package/lib/families/ethereum/nft.test.d.ts.map +0 -1
  64. package/lib/families/ethereum/nft.test.js +0 -360
  65. package/lib/families/ethereum/nft.test.js.map +0 -1
  66. package/src/families/ethereum/nft.test.ts +0 -263
@@ -0,0 +1,78 @@
1
+ import "../../__tests__/test-helpers/setup";
2
+ import BigNumber from "bignumber.js";
3
+ import { toNFTRaw } from "../../account";
4
+ import type { NFT } from "../../types";
5
+ import { mergeNfts } from "../../bridge/jsHelpers";
6
+ import { encodeNftId } from "../../nft";
7
+
8
+ describe("nft merging", () => {
9
+ const makeNFT = (tokenId: string, contract: string, amount: number): NFT => ({
10
+ id: encodeNftId("test", contract, tokenId),
11
+ tokenId,
12
+ amount: new BigNumber(amount),
13
+ collection: {
14
+ contract,
15
+ standard: "erc721",
16
+ },
17
+ });
18
+ const oldNfts = [
19
+ makeNFT("1", "contract1", 10),
20
+ makeNFT("2", "contract1", 1),
21
+ makeNFT("3", "contract2", 6),
22
+ ];
23
+
24
+ test("should remove first NFT and return new array with same refs", () => {
25
+ const nfts = [makeNFT("2", "contract1", 1), makeNFT("3", "contract2", 6)];
26
+ const newNfts = mergeNfts(oldNfts, nfts);
27
+
28
+ expect(newNfts.map(toNFTRaw)).toEqual(nfts.map(toNFTRaw));
29
+ expect(oldNfts[1]).toBe(newNfts[0]);
30
+ expect(oldNfts[2]).toBe(newNfts[1]);
31
+ });
32
+
33
+ test("should remove any NFT and return new array with same refs", () => {
34
+ const nfts = [makeNFT("1", "contract1", 10), makeNFT("3", "contract2", 6)];
35
+ const newNfts = mergeNfts(oldNfts, nfts);
36
+
37
+ expect(newNfts.map(toNFTRaw)).toEqual(nfts.map(toNFTRaw));
38
+ expect(oldNfts[0]).toBe(newNfts[0]);
39
+ expect(oldNfts[2]).toBe(newNfts[1]);
40
+ });
41
+
42
+ test("should change NFT amount and return new array with new ref", () => {
43
+ const nfts = [
44
+ makeNFT("1", "contract1", 10),
45
+ makeNFT("2", "contract1", 5),
46
+ makeNFT("3", "contract2", 6),
47
+ ];
48
+ const addToNft1 = mergeNfts(oldNfts, nfts);
49
+
50
+ expect(addToNft1.map(toNFTRaw)).toEqual(nfts.map(toNFTRaw));
51
+ expect(oldNfts[0]).toBe(addToNft1[0]);
52
+ expect(oldNfts[1]).not.toBe(addToNft1[1]);
53
+ expect(oldNfts[2]).toBe(addToNft1[2]);
54
+ });
55
+
56
+ test("should add NFT and return new array with new ref", () => {
57
+ const nfts = [
58
+ makeNFT("1", "contract1", 10),
59
+ makeNFT("2", "contract1", 1),
60
+ makeNFT("3", "contract2", 6),
61
+ makeNFT("4", "contract2", 4),
62
+ ];
63
+ const addToNft1 = mergeNfts(oldNfts, nfts);
64
+
65
+ expect(addToNft1.map(toNFTRaw)).toEqual(
66
+ [
67
+ makeNFT("4", "contract2", 4),
68
+ makeNFT("1", "contract1", 10),
69
+ makeNFT("2", "contract1", 1),
70
+ makeNFT("3", "contract2", 6),
71
+ ].map(toNFTRaw)
72
+ );
73
+ expect(oldNfts[0]).toBe(addToNft1[1]);
74
+ expect(oldNfts[1]).toBe(addToNft1[2]);
75
+ expect(oldNfts[2]).toBe(addToNft1[3]);
76
+ expect(addToNft1[0]).toBe(nfts[3]);
77
+ });
78
+ });
@@ -167,7 +167,7 @@ export const getAccountShape: GetAccountShape = async (
167
167
  const operations = mergeOps(initialStableOperations, newOps);
168
168
 
169
169
  const nfts = isNFTActive(currency)
170
- ? mergeNfts(initialAccount?.nfts, nftsFromOperations(operations))
170
+ ? mergeNfts(initialAccount?.nfts || [], nftsFromOperations(operations))
171
171
  : undefined;
172
172
 
173
173
  const accountShape: Partial<Account> = {
@@ -410,7 +410,7 @@ const txToOps =
410
410
 
411
411
  const all: Operation[] = [];
412
412
 
413
- event.transfers.forEach((transfer) => {
413
+ event.transfers.forEach((transfer, i) => {
414
414
  const tokenId = transfer.id;
415
415
  const value = new BigNumber(transfer.value);
416
416
  const nftId = encodeNftId(id, event.contract, tokenId);
@@ -418,7 +418,7 @@ const txToOps =
418
418
  if (sending) {
419
419
  const type = "NFT_OUT";
420
420
  all.push({
421
- id: `${nftId}-${hash}-${type}`,
421
+ id: `${nftId}-${hash}-${type}-i${i}`,
422
422
  senders: [sender],
423
423
  recipients: [receiver],
424
424
  contract,
@@ -441,7 +441,7 @@ const txToOps =
441
441
  if (receiving) {
442
442
  const type = "NFT_IN";
443
443
  all.push({
444
- id: `${nftId}-${hash}-${type}`,
444
+ id: `${nftId}-${hash}-${type}-i${i}`,
445
445
  senders: [sender],
446
446
  recipients: [receiver],
447
447
  contract,
@@ -7,7 +7,7 @@ import React, {
7
7
  } from "react";
8
8
  import { Currency, findCryptoCurrencyById } from "@ledgerhq/cryptoassets";
9
9
  import { API, apiForCurrency } from "../../api/Ethereum";
10
- import { NFTMetadataResponse } from "../../types";
10
+ import { NFT, NFTMetadataResponse } from "../../types";
11
11
  import { getNftKey } from "../helpers";
12
12
  import {
13
13
  Batch,
@@ -77,14 +77,19 @@ export const metadataCallBatcher = (() => {
77
77
  };
78
78
  })();
79
79
 
80
- export function useNftMetadata(contract: string, tokenId: string): NFTResource {
80
+ // DEPRECATED, use useNftResource
81
+ export function useNftMetadata(
82
+ contract: string | undefined,
83
+ tokenId: string | undefined
84
+ ): NFTResource {
81
85
  const { cache, loadNFTMetadata } = useContext(NftMetadataContext);
82
86
 
83
- const key = getNftKey(contract, tokenId);
87
+ const key = contract && tokenId ? getNftKey(contract, tokenId) : "";
84
88
 
85
89
  const cachedData = cache[key];
86
90
 
87
91
  useEffect(() => {
92
+ if (!contract || !tokenId) return;
88
93
  if (!cachedData || isOutdated(cachedData)) {
89
94
  loadNFTMetadata(contract, tokenId);
90
95
  }
@@ -99,6 +104,10 @@ export function useNftMetadata(contract: string, tokenId: string): NFTResource {
99
104
  }
100
105
  }
101
106
 
107
+ export function useNftResource(nft: NFT | undefined): NFTResource {
108
+ return useNftMetadata(nft?.collection.contract, nft?.tokenId);
109
+ }
110
+
102
111
  export function useNftAPI(): NFTMetadataContextAPI {
103
112
  const { clearCache, loadNFTMetadata } = useContext(NftMetadataContext);
104
113
 
@@ -39,13 +39,17 @@ export function useServiceStatus(): StatusContextType {
39
39
  return useContext(ServiceStatusContext);
40
40
  }
41
41
 
42
+ function escapeRegExp(string) {
43
+ return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
44
+ }
45
+
42
46
  export function filterServiceStatusIncidents(
43
47
  incidents: Incident[],
44
48
  tickers: string[] = []
45
49
  ): Incident[] {
46
50
  if (!tickers || tickers.length === 0) return [];
47
51
 
48
- const tickersRegex = new RegExp(tickers.join("|"), "i");
52
+ const tickersRegex = new RegExp(escapeRegExp(tickers.join("|")), "i");
49
53
  return incidents.filter(
50
54
  ({ components }) =>
51
55
  !components || // dont filter out if no components
package/src/operation.ts CHANGED
@@ -105,7 +105,6 @@ export function getOperationAmountNumber(op: Operation): BigNumber {
105
105
  case "REWARD":
106
106
  case "REWARD_PAYOUT":
107
107
  case "SUPPLY":
108
- case "NFT_IN":
109
108
  return op.value;
110
109
 
111
110
  case "OUT":
@@ -119,7 +118,6 @@ export function getOperationAmountNumber(op: Operation): BigNumber {
119
118
  case "OPT_OUT":
120
119
  case "REDEEM":
121
120
  case "SLASH":
122
- case "NFT_OUT":
123
121
  return op.value.negated();
124
122
 
125
123
  case "FREEZE":
@@ -1,2 +0,0 @@
1
- import "../../__tests__/test-helpers/setup";
2
- //# sourceMappingURL=nft.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nft.test.d.ts","sourceRoot":"","sources":["../../../src/families/ethereum/nft.test.ts"],"names":[],"mappings":"AAAA,OAAO,oCAAoC,CAAC"}
@@ -1,360 +0,0 @@
1
- "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
- return new (P || (P = Promise))(function (resolve, reject) {
16
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
- step((generator = generator.apply(thisArg, _arguments || [])).next());
20
- });
21
- };
22
- var __generator = (this && this.__generator) || function (thisArg, body) {
23
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
- function verb(n) { return function (v) { return step([n, v]); }; }
26
- function step(op) {
27
- if (f) throw new TypeError("Generator is already executing.");
28
- while (_) try {
29
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
- if (y = 0, t) op = [op[0] & 2, t.value];
31
- switch (op[0]) {
32
- case 0: case 1: t = op; break;
33
- case 4: _.label++; return { value: op[1], done: false };
34
- case 5: _.label++; y = op[1]; op = [0]; continue;
35
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
- default:
37
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
- if (t[2]) _.ops.pop();
42
- _.trys.pop(); continue;
43
- }
44
- op = body.call(thisArg, _);
45
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
- }
48
- };
49
- var __importDefault = (this && this.__importDefault) || function (mod) {
50
- return (mod && mod.__esModule) ? mod : { "default": mod };
51
- };
52
- exports.__esModule = true;
53
- require("../../__tests__/test-helpers/setup");
54
- var bignumber_js_1 = __importDefault(require("bignumber.js"));
55
- var operators_1 = require("rxjs/operators");
56
- var account_1 = require("../../account");
57
- var bridge_1 = require("../../bridge");
58
- var cache_1 = require("../../bridge/cache");
59
- var reconciliation_1 = require("../../reconciliation");
60
- var env_1 = require("../../env");
61
- var jsHelpers_1 = require("../../bridge/jsHelpers");
62
- var nft_1 = require("../../nft");
63
- jest.setTimeout(120000);
64
- var gaspardAccount = {
65
- id: "js:1:ethereum:0xb98d10d9f6d07ba283bfd21b2dfec050f9ae282a:",
66
- seedIdentifier: "0xb98d10d9f6d07ba283bfd21b2dfec050f9ae282a",
67
- name: "G4sp4rd",
68
- derivationMode: "",
69
- index: 0,
70
- freshAddress: "0xb98d10d9f6d07ba283bfd21b2dfec050f9ae282a",
71
- freshAddressPath: "44'/60'/0'/0/0",
72
- freshAddresses: [],
73
- pendingOperations: [],
74
- operations: [],
75
- currencyId: "ethereum",
76
- unitMagnitude: 18,
77
- balance: "",
78
- blockHeight: 0,
79
- lastSyncDate: "",
80
- xpub: ""
81
- };
82
- /*
83
- const gaspardPolygonAccount: AccountRaw = {
84
- id: "js:1:polygon:0xb98d10d9f6d07ba283bfd21b2dfec050f9ae282a:",
85
- seedIdentifier: "0xb98d10d9f6d07ba283bfd21b2dfec050f9ae282a",
86
- name: "G4sp4rd",
87
- derivationMode: "",
88
- index: 0,
89
- freshAddress: "0xb98d10d9f6d07ba283bfd21b2dfec050f9ae282a",
90
- freshAddressPath: "44'/60'/0'/0/0",
91
- freshAddresses: [],
92
- pendingOperations: [],
93
- operations: [],
94
- currencyId: "polygon",
95
- unitMagnitude: 18,
96
- balance: "",
97
- blockHeight: 0,
98
- lastSyncDate: "",
99
- xpub: "",
100
- };
101
- */
102
- var gaspardBscAccount = {
103
- id: "js:1:bsc:0xb98d10d9f6d07ba283bfd21b2dfec050f9ae282a:",
104
- seedIdentifier: "0xb98d10d9f6d07ba283bfd21b2dfec050f9ae282a",
105
- name: "G4sp4rd",
106
- derivationMode: "",
107
- index: 0,
108
- freshAddress: "0xb98d10d9f6d07ba283bfd21b2dfec050f9ae282a",
109
- freshAddressPath: "44'/60'/0'/0/0",
110
- freshAddresses: [],
111
- pendingOperations: [],
112
- operations: [],
113
- currencyId: "bsc",
114
- unitMagnitude: 18,
115
- balance: "",
116
- blockHeight: 0,
117
- lastSyncDate: "",
118
- xpub: ""
119
- };
120
- function sync(account, withNFT) {
121
- if (withNFT === void 0) { withNFT = true; }
122
- return __awaiter(this, void 0, void 0, function () {
123
- var bridge, blacklistedTokenIds, r;
124
- return __generator(this, function (_a) {
125
- switch (_a.label) {
126
- case 0:
127
- bridge = (0, bridge_1.getAccountBridge)(account);
128
- blacklistedTokenIds = [];
129
- (0, env_1.setEnv)("NFT", withNFT);
130
- return [4 /*yield*/, bridge
131
- .sync(account, {
132
- paginationConfig: {},
133
- blacklistedTokenIds: blacklistedTokenIds
134
- })
135
- .pipe((0, operators_1.reduce)(function (a, f) { return f(a); }, account))
136
- .toPromise()];
137
- case 1:
138
- r = _a.sent();
139
- (0, env_1.setEnv)("NFT", false);
140
- return [2 /*return*/, r];
141
- }
142
- });
143
- });
144
- }
145
- var localCache = {};
146
- var cache = (0, cache_1.makeBridgeCacheSystem)({
147
- saveData: function (c, d) {
148
- localCache[c.id] = d;
149
- return Promise.resolve();
150
- },
151
- getData: function (c) {
152
- return Promise.resolve(localCache[c.id]);
153
- }
154
- });
155
- describe("nft merging", function () {
156
- var makeNFT = function (tokenId, contract, amount) { return ({
157
- id: (0, nft_1.encodeNftId)("test", contract, tokenId),
158
- tokenId: tokenId,
159
- amount: new bignumber_js_1["default"](amount),
160
- collection: {
161
- contract: contract,
162
- standard: "erc721"
163
- }
164
- }); };
165
- var oldNfts = [
166
- makeNFT("1", "contract1", 10),
167
- makeNFT("2", "contract1", 1),
168
- makeNFT("3", "contract2", 6),
169
- ];
170
- test("should remove first NFT and return new array with same refs", function () {
171
- var nfts = [makeNFT("2", "contract1", 1), makeNFT("3", "contract2", 6)];
172
- var newNfts = (0, jsHelpers_1.mergeNfts)(oldNfts, nfts);
173
- expect(newNfts.map(account_1.toNFTRaw)).toEqual(nfts.map(account_1.toNFTRaw));
174
- expect(oldNfts[1]).toBe(newNfts[0]);
175
- expect(oldNfts[2]).toBe(newNfts[1]);
176
- });
177
- test("should remove any NFT and return new array with same refs", function () {
178
- var nfts = [makeNFT("1", "contract1", 10), makeNFT("3", "contract2", 6)];
179
- var newNfts = (0, jsHelpers_1.mergeNfts)(oldNfts, nfts);
180
- expect(newNfts.map(account_1.toNFTRaw)).toEqual(nfts.map(account_1.toNFTRaw));
181
- expect(oldNfts[0]).toBe(newNfts[0]);
182
- expect(oldNfts[2]).toBe(newNfts[1]);
183
- });
184
- test("should change NFT amount and return new array with new ref", function () {
185
- var nfts = [
186
- makeNFT("1", "contract1", 10),
187
- makeNFT("2", "contract1", 5),
188
- makeNFT("3", "contract2", 6),
189
- ];
190
- var addToNft1 = (0, jsHelpers_1.mergeNfts)(oldNfts, nfts);
191
- expect(addToNft1.map(account_1.toNFTRaw)).toEqual(nfts.map(account_1.toNFTRaw));
192
- expect(oldNfts[0]).toBe(addToNft1[0]);
193
- expect(oldNfts[1]).not.toBe(addToNft1[1]);
194
- expect(oldNfts[2]).toBe(addToNft1[2]);
195
- });
196
- test("should add NFT and return new array with new ref", function () {
197
- var nfts = [
198
- makeNFT("1", "contract1", 10),
199
- makeNFT("2", "contract1", 1),
200
- makeNFT("3", "contract2", 6),
201
- makeNFT("4", "contract2", 4),
202
- ];
203
- var addToNft1 = (0, jsHelpers_1.mergeNfts)(oldNfts, nfts);
204
- expect(addToNft1.map(account_1.toNFTRaw)).toEqual([
205
- makeNFT("4", "contract2", 4),
206
- makeNFT("1", "contract1", 10),
207
- makeNFT("2", "contract1", 1),
208
- makeNFT("3", "contract2", 6),
209
- ].map(account_1.toNFTRaw));
210
- expect(oldNfts[0]).toBe(addToNft1[1]);
211
- expect(oldNfts[1]).toBe(addToNft1[2]);
212
- expect(oldNfts[2]).toBe(addToNft1[3]);
213
- expect(addToNft1[0]).toBe(nfts[3]);
214
- });
215
- });
216
- describe("gaspard NFT on ethereum", function () {
217
- var account = (0, account_1.fromAccountRaw)(gaspardAccount);
218
- test("first sync & have nfts", function () { return __awaiter(void 0, void 0, void 0, function () {
219
- var _a;
220
- return __generator(this, function (_b) {
221
- switch (_b.label) {
222
- case 0: return [4 /*yield*/, cache.prepareCurrency(account.currency)];
223
- case 1:
224
- _b.sent();
225
- return [4 /*yield*/, sync(account)];
226
- case 2:
227
- account = _b.sent();
228
- expect(((_a = account.nfts) === null || _a === void 0 ? void 0 : _a.length) || 0).not.toBe(0);
229
- return [2 /*return*/];
230
- }
231
- });
232
- }); });
233
- test("remove half NFTs will restore them with operations still here", function () { return __awaiter(void 0, void 0, void 0, function () {
234
- var copy, resync;
235
- var _a, _b;
236
- return __generator(this, function (_c) {
237
- switch (_c.label) {
238
- case 0:
239
- copy = __assign(__assign({}, account), { nfts: (_a = account.nfts) === null || _a === void 0 ? void 0 : _a.slice(Math.ceil((((_b = account.nfts) === null || _b === void 0 ? void 0 : _b.length) || 0) / 2)) });
240
- return [4 /*yield*/, sync(copy)];
241
- case 1:
242
- resync = _c.sent();
243
- expect(resync.nfts).toEqual(account.nfts);
244
- return [2 /*return*/];
245
- }
246
- });
247
- }); });
248
- test("remove half NFTs will restore them with missing operations too", function () { return __awaiter(void 0, void 0, void 0, function () {
249
- var copy, resync;
250
- var _a, _b;
251
- return __generator(this, function (_c) {
252
- switch (_c.label) {
253
- case 0:
254
- copy = __assign(__assign({}, account), { operations: [], nfts: (_a = account.nfts) === null || _a === void 0 ? void 0 : _a.slice(Math.ceil((((_b = account.nfts) === null || _b === void 0 ? void 0 : _b.length) || 0) / 2)) });
255
- return [4 /*yield*/, sync(copy)];
256
- case 1:
257
- resync = _c.sent();
258
- expect(resync.nfts).toEqual(account.nfts);
259
- return [2 /*return*/];
260
- }
261
- });
262
- }); });
263
- test("remove half NFTs will restore them with half operations", function () { return __awaiter(void 0, void 0, void 0, function () {
264
- var halfOps, copy, resync;
265
- var _a, _b;
266
- return __generator(this, function (_c) {
267
- switch (_c.label) {
268
- case 0:
269
- halfOps = Math.ceil(account.operations.length / 2);
270
- copy = __assign(__assign({}, account), { operations: account.operations.slice(halfOps), nfts: (_a = account.nfts) === null || _a === void 0 ? void 0 : _a.slice(Math.ceil((((_b = account.nfts) === null || _b === void 0 ? void 0 : _b.length) || 0) / 2)) });
271
- return [4 /*yield*/, sync(copy)];
272
- case 1:
273
- resync = _c.sent();
274
- expect(resync.nfts).toEqual(account.nfts);
275
- return [2 /*return*/];
276
- }
277
- });
278
- }); });
279
- test("patchAccount restore new NFTs correctly", function () { return __awaiter(void 0, void 0, void 0, function () {
280
- var copy, newAccount;
281
- var _a, _b;
282
- return __generator(this, function (_c) {
283
- copy = __assign(__assign({}, account), { operations: [], nfts: (_a = account.nfts) === null || _a === void 0 ? void 0 : _a.slice(Math.ceil((((_b = account.nfts) === null || _b === void 0 ? void 0 : _b.length) || 0) / 2)) });
284
- newAccount = (0, reconciliation_1.patchAccount)(copy, (0, account_1.toAccountRaw)(account));
285
- expect(newAccount.nfts).toEqual(account.nfts);
286
- return [2 /*return*/];
287
- });
288
- }); });
289
- test("start account with .nfts and disable the NFT flag should make it disappear", function () { return __awaiter(void 0, void 0, void 0, function () {
290
- var resync;
291
- return __generator(this, function (_a) {
292
- switch (_a.label) {
293
- case 0:
294
- expect(account.nfts).not.toBeFalsy();
295
- return [4 /*yield*/, sync(account, false)];
296
- case 1:
297
- resync = _a.sent();
298
- expect(resync.nfts).toBeFalsy();
299
- return [2 /*return*/];
300
- }
301
- });
302
- }); });
303
- test("start account without .nfts and enable the NFT flag should make it appear", function () { return __awaiter(void 0, void 0, void 0, function () {
304
- var first, second;
305
- return __generator(this, function (_a) {
306
- switch (_a.label) {
307
- case 0: return [4 /*yield*/, sync(account, false)];
308
- case 1:
309
- first = _a.sent();
310
- expect(first.nfts).toBeFalsy();
311
- return [4 /*yield*/, sync(first, true)];
312
- case 2:
313
- second = _a.sent();
314
- expect(second.nfts).not.toBeFalsy();
315
- expect(second.nfts).toEqual(account.nfts);
316
- return [2 /*return*/];
317
- }
318
- });
319
- }); });
320
- test("no nft should be on quantity 0 or negative", function () { return __awaiter(void 0, void 0, void 0, function () {
321
- var _a;
322
- return __generator(this, function (_b) {
323
- expect((_a = account.nfts) === null || _a === void 0 ? void 0 : _a.find(function (n) { return !n.amount.gt(0); })).toEqual(undefined);
324
- return [2 /*return*/];
325
- });
326
- }); });
327
- });
328
- /*
329
- // this is never ending here... have to disable this test... (backend issue)
330
- describe("gaspard NFT on polygon", () => {
331
- let account = fromAccountRaw(gaspardPolygonAccount);
332
- test("first sync", async () => {
333
- await cache.prepareCurrency(account.currency);
334
- account = await sync(account);
335
- });
336
- test(".nfts shouldn't be visible", () => {
337
- expect(account.nfts).toBeFalsy();
338
- });
339
- });
340
- */
341
- describe("gaspard NFT on bsc", function () {
342
- var account = (0, account_1.fromAccountRaw)(gaspardBscAccount);
343
- test("first sync", function () { return __awaiter(void 0, void 0, void 0, function () {
344
- return __generator(this, function (_a) {
345
- switch (_a.label) {
346
- case 0: return [4 /*yield*/, cache.prepareCurrency(account.currency)];
347
- case 1:
348
- _a.sent();
349
- return [4 /*yield*/, sync(account)];
350
- case 2:
351
- account = _a.sent();
352
- return [2 /*return*/];
353
- }
354
- });
355
- }); });
356
- test(".nfts shouldn't be visible", function () {
357
- expect(account.nfts).toBeFalsy();
358
- });
359
- });
360
- //# sourceMappingURL=nft.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nft.test.js","sourceRoot":"","sources":["../../../src/families/ethereum/nft.test.ts"],"names":[],"mappings":"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"}