@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.
- package/lib/bridge/jsHelpers.d.ts +1 -1
- package/lib/bridge/jsHelpers.d.ts.map +1 -1
- package/lib/bridge/jsHelpers.js +9 -8
- package/lib/bridge/jsHelpers.js.map +1 -1
- package/lib/data/icons/react/cro.d.ts +8 -0
- package/lib/data/icons/react/cro.d.ts.map +1 -0
- package/lib/data/icons/react/cro.js +30 -0
- package/lib/data/icons/react/cro.js.map +1 -0
- package/lib/data/icons/react/index.d.ts +1 -0
- package/lib/data/icons/react/index.d.ts.map +1 -1
- package/lib/data/icons/react/index.js +10 -8
- package/lib/data/icons/react/index.js.map +1 -1
- package/lib/data/icons/reactNative/cro.d.ts +8 -0
- package/lib/data/icons/reactNative/cro.d.ts.map +1 -0
- package/lib/data/icons/reactNative/cro.js +31 -0
- package/lib/data/icons/reactNative/cro.js.map +1 -0
- package/lib/data/icons/reactNative/index.d.ts +1 -0
- package/lib/data/icons/reactNative/index.d.ts.map +1 -1
- package/lib/data/icons/reactNative/index.js +10 -8
- package/lib/data/icons/reactNative/index.js.map +1 -1
- package/lib/families/ethereum/modules/erc20.d.ts.map +1 -1
- package/lib/families/ethereum/modules/erc20.js +0 -12
- package/lib/families/ethereum/modules/erc20.js.map +1 -1
- package/lib/families/ethereum/modules/erc721.d.ts.map +1 -1
- package/lib/families/ethereum/modules/erc721.js +0 -1
- package/lib/families/ethereum/modules/erc721.js.map +1 -1
- package/lib/families/ethereum/nft.integration.test.d.ts +2 -0
- package/lib/families/ethereum/nft.integration.test.d.ts.map +1 -0
- package/lib/families/ethereum/nft.integration.test.js +264 -0
- package/lib/families/ethereum/nft.integration.test.js.map +1 -0
- package/lib/families/ethereum/nft.merging.unit.test.d.ts +2 -0
- package/lib/families/ethereum/nft.merging.unit.test.d.ts.map +1 -0
- package/lib/families/ethereum/nft.merging.unit.test.js +72 -0
- package/lib/families/ethereum/nft.merging.unit.test.js.map +1 -0
- package/lib/families/ethereum/synchronisation.js +4 -4
- package/lib/families/ethereum/synchronisation.js.map +1 -1
- package/lib/nft/NftMetadataProvider/index.d.ts +3 -2
- package/lib/nft/NftMetadataProvider/index.d.ts.map +1 -1
- package/lib/nft/NftMetadataProvider/index.js +9 -2
- package/lib/nft/NftMetadataProvider/index.js.map +1 -1
- package/lib/notifications/ServiceStatusProvider/index.d.ts.map +1 -1
- package/lib/notifications/ServiceStatusProvider/index.js +4 -1
- package/lib/notifications/ServiceStatusProvider/index.js.map +1 -1
- package/lib/operation.d.ts.map +1 -1
- package/lib/operation.js +0 -2
- package/lib/operation.js.map +1 -1
- package/package.json +1 -1
- package/src/bridge/jsHelpers.ts +10 -15
- package/src/data/icons/react/cro.tsx +12 -0
- package/src/data/icons/react/index.tsx +1 -0
- package/src/data/icons/reactNative/cro.tsx +13 -0
- package/src/data/icons/reactNative/index.tsx +1 -0
- package/src/data/icons/svg/CRO.svg +3 -0
- package/src/families/ethereum/modules/erc20.ts +0 -4
- package/src/families/ethereum/modules/erc721.ts +0 -4
- package/src/families/ethereum/nft.integration.test.ts +168 -0
- package/src/families/ethereum/nft.merging.unit.test.ts +78 -0
- package/src/families/ethereum/synchronisation.ts +4 -4
- package/src/nft/NftMetadataProvider/index.tsx +12 -3
- package/src/notifications/ServiceStatusProvider/index.tsx +5 -1
- package/src/operation.ts +0 -2
- package/lib/families/ethereum/nft.test.d.ts +0 -2
- package/lib/families/ethereum/nft.test.d.ts.map +0 -1
- package/lib/families/ethereum/nft.test.js +0 -360
- package/lib/families/ethereum/nft.test.js.map +0 -1
- 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
|
-
|
|
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 +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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"}
|