@subwallet/extension-base 1.0.6-0 → 1.0.6-2
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/cjs/koni/api/nft/rmrk_nft/index.js +0 -3
- package/cjs/koni/api/nft/wasm_nft/index.js +119 -29
- package/cjs/koni/api/nft/wasm_nft/utils.js +74 -13
- package/cjs/koni/background/handlers/Extension.js +2 -1
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/chain-service/index.js +5 -3
- package/koni/api/nft/rmrk_nft/index.js +1 -4
- package/koni/api/nft/wasm_nft/index.d.ts +2 -0
- package/koni/api/nft/wasm_nft/index.js +120 -30
- package/koni/api/nft/wasm_nft/utils.d.ts +18 -6
- package/koni/api/nft/wasm_nft/utils.js +55 -6
- package/koni/background/handlers/Extension.js +2 -1
- package/package.json +6 -6
- package/packageInfo.js +1 -1
- package/services/chain-service/index.js +5 -3
|
@@ -50,9 +50,6 @@ class RmrkNftApi extends _nft.BaseNftApi {
|
|
|
50
50
|
}
|
|
51
51
|
async getAllByAccount(account) {
|
|
52
52
|
const fetchUrls = [{
|
|
53
|
-
url: _config.SINGULAR_V1_ENDPOINT + account,
|
|
54
|
-
source: RMRK_SOURCE.SINGULAR_V1
|
|
55
|
-
}, {
|
|
56
53
|
url: _config.SINGULAR_V2_ENDPOINT + account,
|
|
57
54
|
source: RMRK_SOURCE.SINGULAR_V2
|
|
58
55
|
}];
|
|
@@ -32,7 +32,7 @@ async function isArtZeroFeaturedCollection(networkKey, contractAddress) {
|
|
|
32
32
|
const urlencoded = new URLSearchParams();
|
|
33
33
|
urlencoded.append('collection_address', contractAddress);
|
|
34
34
|
const collectionInfoPromise = new Promise(function (resolve) {
|
|
35
|
-
(0, _crossFetch.default)(
|
|
35
|
+
(0, _crossFetch.default)((0, _utils.collectionApiFromArtZero)(networkKey), {
|
|
36
36
|
method: 'POST',
|
|
37
37
|
headers: {
|
|
38
38
|
'Content-Type': 'application/x-www-form-urlencoded'
|
|
@@ -55,6 +55,20 @@ class WasmNftApi extends _nft.BaseNftApi {
|
|
|
55
55
|
setSmartContractNfts(wasmContracts) {
|
|
56
56
|
this.wasmContracts = wasmContracts;
|
|
57
57
|
}
|
|
58
|
+
async isAttributeStoredOnChain(contractPromise) {
|
|
59
|
+
var _this$substrateApi, _onChainAttributeCoun;
|
|
60
|
+
if (!contractPromise.query['psp34Traits::getAttributeCount']) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// @ts-ignore
|
|
65
|
+
const _onChainAttributeCount = await contractPromise.query['psp34Traits::getAttributeCount'](this.addresses[0], {
|
|
66
|
+
gasLimit: (0, _utils2.getDefaultWeightV2)((_this$substrateApi = this.substrateApi) === null || _this$substrateApi === void 0 ? void 0 : _this$substrateApi.api)
|
|
67
|
+
});
|
|
68
|
+
const _attributeCount = _onChainAttributeCount === null || _onChainAttributeCount === void 0 ? void 0 : (_onChainAttributeCoun = _onChainAttributeCount.output) === null || _onChainAttributeCoun === void 0 ? void 0 : _onChainAttributeCoun.toJSON();
|
|
69
|
+
const onChainAttributeCount = _onChainAttributeCount.output ? (_attributeCount === null || _attributeCount === void 0 ? void 0 : _attributeCount.ok) || (_attributeCount === null || _attributeCount === void 0 ? void 0 : _attributeCount.Ok) : '0';
|
|
70
|
+
return parseInt(onChainAttributeCount) !== 0;
|
|
71
|
+
}
|
|
58
72
|
parseFeaturedTokenUri(tokenUri) {
|
|
59
73
|
if (!tokenUri || tokenUri.length === 0) {
|
|
60
74
|
return undefined;
|
|
@@ -78,7 +92,7 @@ class WasmNftApi extends _nft.BaseNftApi {
|
|
|
78
92
|
if (!parsedTokenUri) {
|
|
79
93
|
return undefined;
|
|
80
94
|
}
|
|
81
|
-
const nftItemImageSrc = `${
|
|
95
|
+
const nftItemImageSrc = `${(0, _utils.itemImageApiFromArtZero)(this.chain)}?input=${parsedTokenUri}&size=500`;
|
|
82
96
|
const collectionImageUrl = await (0, _axios.default)(nftItemImageSrc, {
|
|
83
97
|
method: 'GET'
|
|
84
98
|
});
|
|
@@ -87,7 +101,7 @@ class WasmNftApi extends _nft.BaseNftApi {
|
|
|
87
101
|
async parseFeaturedCollectionImage(smartContract) {
|
|
88
102
|
const urlencoded = new URLSearchParams();
|
|
89
103
|
urlencoded.append('collection_address', smartContract);
|
|
90
|
-
const resp = await (0, _crossFetch.default)(
|
|
104
|
+
const resp = await (0, _crossFetch.default)((0, _utils.collectionDetailApiFromArtZero)(this.chain), {
|
|
91
105
|
method: 'POST',
|
|
92
106
|
headers: {
|
|
93
107
|
'Content-Type': 'application/x-www-form-urlencoded'
|
|
@@ -106,7 +120,7 @@ class WasmNftApi extends _nft.BaseNftApi {
|
|
|
106
120
|
if (!parsedCollectionImage) {
|
|
107
121
|
return;
|
|
108
122
|
}
|
|
109
|
-
const collectionImageSrc = `${
|
|
123
|
+
const collectionImageSrc = `${(0, _utils.itemImageApiFromArtZero)(this.chain)}?input=${parsedCollectionImage}&size=500`;
|
|
110
124
|
const collectionImageUrl = await (0, _axios.default)(collectionImageSrc, {
|
|
111
125
|
method: 'GET'
|
|
112
126
|
});
|
|
@@ -189,8 +203,55 @@ class WasmNftApi extends _nft.BaseNftApi {
|
|
|
189
203
|
// return nftItem;
|
|
190
204
|
// }
|
|
191
205
|
|
|
206
|
+
async processOnChainMetadata(tokenId, isFeatured, tokenUri) {
|
|
207
|
+
const nftItem = {
|
|
208
|
+
chain: '',
|
|
209
|
+
collectionId: '',
|
|
210
|
+
id: '',
|
|
211
|
+
owner: '',
|
|
212
|
+
name: tokenId
|
|
213
|
+
};
|
|
214
|
+
let itemDetail = false;
|
|
215
|
+
if (isFeatured) {
|
|
216
|
+
const parsedTokenUri = this.parseFeaturedTokenUri(tokenUri);
|
|
217
|
+
if (parsedTokenUri) {
|
|
218
|
+
const resp = await (0, _crossFetch.default)(`${(0, _utils.ipfsApiFromArtZero)(this.chain)}?input=${parsedTokenUri}`);
|
|
219
|
+
itemDetail = resp && resp.ok && (await resp.json());
|
|
220
|
+
}
|
|
221
|
+
} else {
|
|
222
|
+
const parsedTokenUri = this.parseFeaturedTokenUri(tokenUri);
|
|
223
|
+
const detailUrl = this.parseUrl(parsedTokenUri);
|
|
224
|
+
if (detailUrl) {
|
|
225
|
+
const resp = await (0, _crossFetch.default)(detailUrl);
|
|
226
|
+
itemDetail = resp && resp.ok && (await resp.json());
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
if (!itemDetail) {
|
|
230
|
+
return nftItem;
|
|
231
|
+
}
|
|
232
|
+
nftItem.name = itemDetail.name;
|
|
233
|
+
nftItem.description = itemDetail.description;
|
|
234
|
+
const rawImageSrc = itemDetail.image ? itemDetail.image : itemDetail.image_url;
|
|
235
|
+
if (isFeatured) {
|
|
236
|
+
nftItem.image = await this.parseFeaturedNftImage(rawImageSrc);
|
|
237
|
+
nftItem.externalUrl = (0, _utils.externalUrlOnArtZero)(this.chain);
|
|
238
|
+
} else {
|
|
239
|
+
nftItem.image = this.parseUrl(rawImageSrc);
|
|
240
|
+
}
|
|
241
|
+
const propertiesMap = {};
|
|
242
|
+
const traitList = itemDetail.attributes ? itemDetail.attributes : itemDetail.traits;
|
|
243
|
+
if (traitList) {
|
|
244
|
+
traitList.forEach(traitMap => {
|
|
245
|
+
propertiesMap[traitMap.trait_type] = {
|
|
246
|
+
value: traitMap.value
|
|
247
|
+
};
|
|
248
|
+
});
|
|
249
|
+
nftItem.properties = propertiesMap;
|
|
250
|
+
}
|
|
251
|
+
return nftItem;
|
|
252
|
+
}
|
|
192
253
|
async processOffChainMetadata(contractPromise, address, tokenId, isFeatured) {
|
|
193
|
-
var _this$
|
|
254
|
+
var _this$substrateApi2;
|
|
194
255
|
const nftItem = {
|
|
195
256
|
chain: '',
|
|
196
257
|
collectionId: '',
|
|
@@ -199,7 +260,7 @@ class WasmNftApi extends _nft.BaseNftApi {
|
|
|
199
260
|
name: tokenId
|
|
200
261
|
};
|
|
201
262
|
const _tokenUri = await contractPromise.query['psp34Traits::tokenUri'](address, {
|
|
202
|
-
gasLimit: (0, _utils2.getDefaultWeightV2)((_this$
|
|
263
|
+
gasLimit: (0, _utils2.getDefaultWeightV2)((_this$substrateApi2 = this.substrateApi) === null || _this$substrateApi2 === void 0 ? void 0 : _this$substrateApi2.api)
|
|
203
264
|
}, tokenId);
|
|
204
265
|
if (_tokenUri.output) {
|
|
205
266
|
let itemDetail = false;
|
|
@@ -210,7 +271,7 @@ class WasmNftApi extends _nft.BaseNftApi {
|
|
|
210
271
|
if (isFeatured) {
|
|
211
272
|
const parsedTokenUri = this.parseFeaturedTokenUri(tokenUri);
|
|
212
273
|
if (parsedTokenUri) {
|
|
213
|
-
const resp = await (0, _crossFetch.default)(`${
|
|
274
|
+
const resp = await (0, _crossFetch.default)(`${(0, _utils.ipfsApiFromArtZero)(this.chain)}?input=${parsedTokenUri}`);
|
|
214
275
|
itemDetail = resp && resp.ok && (await resp.json());
|
|
215
276
|
}
|
|
216
277
|
} else {
|
|
@@ -230,7 +291,7 @@ class WasmNftApi extends _nft.BaseNftApi {
|
|
|
230
291
|
const rawImageSrc = itemDetail.image ? itemDetail.image : itemDetail.image_url;
|
|
231
292
|
if (isFeatured) {
|
|
232
293
|
nftItem.image = await this.parseFeaturedNftImage(rawImageSrc);
|
|
233
|
-
nftItem.externalUrl = _utils.
|
|
294
|
+
nftItem.externalUrl = (0, _utils.externalUrlOnArtZero)(this.chain);
|
|
234
295
|
} else {
|
|
235
296
|
nftItem.image = this.parseUrl(rawImageSrc);
|
|
236
297
|
}
|
|
@@ -247,19 +308,19 @@ class WasmNftApi extends _nft.BaseNftApi {
|
|
|
247
308
|
}
|
|
248
309
|
return nftItem;
|
|
249
310
|
}
|
|
250
|
-
async getItemsByCollection(contractPromise, tokenInfo, collectionName, nftParams, isFeatured) {
|
|
311
|
+
async getItemsByCollection(contractPromise, tokenInfo, collectionName, nftParams, isFeatured, isAttributeOnChain) {
|
|
251
312
|
let ownItem = false;
|
|
252
313
|
let collectionImage;
|
|
253
314
|
const smartContract = (0, _utils3._getContractAddressOfToken)(tokenInfo);
|
|
254
315
|
const nftOwnerMap = {};
|
|
255
316
|
await Promise.all(this.addresses.map(async address => {
|
|
256
|
-
var _this$
|
|
317
|
+
var _this$substrateApi3, _balance$output;
|
|
257
318
|
if ((0, _utilCrypto.isEthereumAddress)(address)) {
|
|
258
319
|
return;
|
|
259
320
|
}
|
|
260
321
|
const nftIds = [];
|
|
261
322
|
const _balance = await contractPromise.query['psp34::balanceOf'](address, {
|
|
262
|
-
gasLimit: (0, _utils2.getDefaultWeightV2)((_this$
|
|
323
|
+
gasLimit: (0, _utils2.getDefaultWeightV2)((_this$substrateApi3 = this.substrateApi) === null || _this$substrateApi3 === void 0 ? void 0 : _this$substrateApi3.api)
|
|
263
324
|
}, address);
|
|
264
325
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
265
326
|
const balanceJson = _balance === null || _balance === void 0 ? void 0 : (_balance$output = _balance.output) === null || _balance$output === void 0 ? void 0 : _balance$output.toJSON();
|
|
@@ -275,9 +336,9 @@ class WasmNftApi extends _nft.BaseNftApi {
|
|
|
275
336
|
}
|
|
276
337
|
try {
|
|
277
338
|
await Promise.all(itemIndexes.map(async i => {
|
|
278
|
-
var _this$
|
|
339
|
+
var _this$substrateApi4;
|
|
279
340
|
const _tokenByIndexResp = await contractPromise.query['psp34Enumerable::ownersTokenByIndex'](address, {
|
|
280
|
-
gasLimit: (0, _utils2.getDefaultWeightV2)((_this$
|
|
341
|
+
gasLimit: (0, _utils2.getDefaultWeightV2)((_this$substrateApi4 = this.substrateApi) === null || _this$substrateApi4 === void 0 ? void 0 : _this$substrateApi4.api)
|
|
281
342
|
}, address, i);
|
|
282
343
|
if (_tokenByIndexResp.output) {
|
|
283
344
|
const rawTokenId = _tokenByIndexResp.output.toHuman();
|
|
@@ -285,18 +346,47 @@ class WasmNftApi extends _nft.BaseNftApi {
|
|
|
285
346
|
const tokenIdObj = rawTokenId.Ok.Ok || rawTokenId.ok.ok; // capital O, not normal o
|
|
286
347
|
const tokenId = Object.values(tokenIdObj)[0].replaceAll(',', '');
|
|
287
348
|
nftIds.push(tokenId);
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
349
|
+
let tokenUri;
|
|
350
|
+
try {
|
|
351
|
+
if (isAttributeOnChain) {
|
|
352
|
+
var _this$substrateApi5, _tokenUri$output;
|
|
353
|
+
const _tokenUri = await contractPromise.query['psp34Traits::getAttributes'](address, {
|
|
354
|
+
gasLimit: (0, _utils2.getDefaultWeightV2)((_this$substrateApi5 = this.substrateApi) === null || _this$substrateApi5 === void 0 ? void 0 : _this$substrateApi5.api)
|
|
355
|
+
}, tokenIdObj, ['metadata']);
|
|
356
|
+
const tokenUriObj = (_tokenUri$output = _tokenUri.output) === null || _tokenUri$output === void 0 ? void 0 : _tokenUri$output.toJSON();
|
|
357
|
+
tokenUri = (tokenUriObj.ok || tokenUriObj.Ok)[0];
|
|
358
|
+
}
|
|
359
|
+
} catch (e) {
|
|
360
|
+
console.debug(e);
|
|
361
|
+
}
|
|
362
|
+
if (!tokenUri) {
|
|
363
|
+
const nftItem = await this.processOffChainMetadata(contractPromise, address, tokenId, isFeatured);
|
|
364
|
+
nftItem.collectionId = smartContract;
|
|
365
|
+
nftItem.chain = this.chain;
|
|
366
|
+
nftItem.type = _types._AssetType.PSP34;
|
|
367
|
+
nftItem.id = tokenId;
|
|
368
|
+
nftItem.owner = address;
|
|
369
|
+
nftItem.onChainOption = tokenIdObj;
|
|
370
|
+
nftItem.originAsset = tokenInfo.slug;
|
|
371
|
+
nftParams.updateItem(this.chain, nftItem, address);
|
|
372
|
+
ownItem = true;
|
|
373
|
+
if (!isFeatured && !collectionImage && nftItem.image) {
|
|
374
|
+
collectionImage = nftItem.image; // No default collection image
|
|
375
|
+
}
|
|
376
|
+
} else {
|
|
377
|
+
const nftItem = await this.processOnChainMetadata(tokenId, false, tokenUri);
|
|
378
|
+
nftItem.collectionId = smartContract;
|
|
379
|
+
nftItem.chain = this.chain;
|
|
380
|
+
nftItem.type = _types._AssetType.PSP34;
|
|
381
|
+
nftItem.id = tokenId;
|
|
382
|
+
nftItem.owner = address;
|
|
383
|
+
nftItem.onChainOption = tokenIdObj;
|
|
384
|
+
nftItem.originAsset = tokenInfo.slug;
|
|
385
|
+
nftParams.updateItem(this.chain, nftItem, address);
|
|
386
|
+
ownItem = true;
|
|
387
|
+
if (!isFeatured && !collectionImage && nftItem.image) {
|
|
388
|
+
collectionImage = nftItem.image; // No default collection image
|
|
389
|
+
}
|
|
300
390
|
}
|
|
301
391
|
}
|
|
302
392
|
}));
|
|
@@ -336,17 +426,17 @@ class WasmNftApi extends _nft.BaseNftApi {
|
|
|
336
426
|
return 1;
|
|
337
427
|
}
|
|
338
428
|
async handleNfts(params) {
|
|
339
|
-
var _this$
|
|
429
|
+
var _this$substrateApi6;
|
|
340
430
|
if (!this.wasmContracts || this.wasmContracts.length === 0) {
|
|
341
431
|
return;
|
|
342
432
|
}
|
|
343
433
|
await this.connect(); // might not be necessary
|
|
344
434
|
|
|
345
|
-
const apiPromise = (_this$
|
|
435
|
+
const apiPromise = (_this$substrateApi6 = this.substrateApi) === null || _this$substrateApi6 === void 0 ? void 0 : _this$substrateApi6.api;
|
|
346
436
|
await Promise.all(this.wasmContracts.map(async tokenInfo => {
|
|
347
437
|
const contractPromise = (0, _wasm.getPSP34ContractPromise)(apiPromise, (0, _utils3._getContractAddressOfToken)(tokenInfo));
|
|
348
|
-
const isCollectionFeatured = await isArtZeroFeaturedCollection(this.chain, (0, _utils3._getContractAddressOfToken)(tokenInfo));
|
|
349
|
-
return await this.getItemsByCollection(contractPromise, tokenInfo, tokenInfo.name, params, isCollectionFeatured);
|
|
438
|
+
const [isAttributeOnChain, isCollectionFeatured] = await Promise.all([this.isAttributeStoredOnChain(contractPromise), isArtZeroFeaturedCollection(this.chain, (0, _utils3._getContractAddressOfToken)(tokenInfo))]);
|
|
439
|
+
return await this.getItemsByCollection(contractPromise, tokenInfo, tokenInfo.name, params, isCollectionFeatured, isAttributeOnChain);
|
|
350
440
|
}));
|
|
351
441
|
}
|
|
352
442
|
}
|
|
@@ -3,21 +3,82 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.ART_ZERO_TESTNET_IPFS_API = exports.
|
|
6
|
+
exports.ASTAR_ART_ZERO_TESTNET_IPFS_API = exports.ASTAR_ART_ZERO_TESTNET_IMAGE_API = exports.ASTAR_ART_ZERO_TESTNET_COLLECTION_API = exports.ASTAR_ART_ZERO_IPFS_API = exports.ASTAR_ART_ZERO_IMAGE_API = exports.ASTAR_ART_ZERO_EXTERNAL_URL = exports.ASTAR_ART_ZERO_COLLECTION_API = exports.ART_ZERO_TESTNET_IPFS_API = exports.A0_ART_ZERO_TESTNET_IMAGE_API = exports.A0_ART_ZERO_TESTNET_COLLECTION_API = exports.A0_ART_ZERO_IPFS_API = exports.A0_ART_ZERO_IMAGE_API = exports.A0_ART_ZERO_EXTERNAL_URL = exports.A0_ART_ZERO_COLLECTION_API = void 0;
|
|
7
|
+
exports.collectionApiFromArtZero = collectionApiFromArtZero;
|
|
8
|
+
exports.collectionDetailApiFromArtZero = collectionDetailApiFromArtZero;
|
|
9
|
+
exports.externalUrlOnArtZero = externalUrlOnArtZero;
|
|
10
|
+
exports.ipfsApiFromArtZero = ipfsApiFromArtZero;
|
|
11
|
+
exports.itemImageApiFromArtZero = itemImageApiFromArtZero;
|
|
7
12
|
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
8
13
|
// SPDX-License-Identifier: Apache-2.0
|
|
9
14
|
|
|
10
|
-
const
|
|
11
|
-
exports.
|
|
15
|
+
const A0_ART_ZERO_TESTNET_IMAGE_API = 'https://a0-test-api.artzero.io/getImage';
|
|
16
|
+
exports.A0_ART_ZERO_TESTNET_IMAGE_API = A0_ART_ZERO_TESTNET_IMAGE_API;
|
|
17
|
+
const ASTAR_ART_ZERO_TESTNET_IMAGE_API = 'https://astar-test-api.artzero.io/getImage';
|
|
18
|
+
exports.ASTAR_ART_ZERO_TESTNET_IMAGE_API = ASTAR_ART_ZERO_TESTNET_IMAGE_API;
|
|
12
19
|
const ART_ZERO_TESTNET_IPFS_API = 'https://a0-test-api.artzero.io/getJSON';
|
|
13
20
|
exports.ART_ZERO_TESTNET_IPFS_API = ART_ZERO_TESTNET_IPFS_API;
|
|
14
|
-
const
|
|
15
|
-
exports.
|
|
16
|
-
const
|
|
17
|
-
exports.
|
|
18
|
-
const
|
|
19
|
-
exports.
|
|
20
|
-
const
|
|
21
|
-
exports.
|
|
22
|
-
const
|
|
23
|
-
exports.
|
|
21
|
+
const ASTAR_ART_ZERO_TESTNET_IPFS_API = 'https://astar-test-api.artzero.io/getJSON';
|
|
22
|
+
exports.ASTAR_ART_ZERO_TESTNET_IPFS_API = ASTAR_ART_ZERO_TESTNET_IPFS_API;
|
|
23
|
+
const A0_ART_ZERO_TESTNET_COLLECTION_API = 'https://a0-test-api.artzero.io/getCollectionByAddress';
|
|
24
|
+
exports.A0_ART_ZERO_TESTNET_COLLECTION_API = A0_ART_ZERO_TESTNET_COLLECTION_API;
|
|
25
|
+
const ASTAR_ART_ZERO_TESTNET_COLLECTION_API = 'https://astar-test-api.artzero.io/getCollectionByAddress';
|
|
26
|
+
exports.ASTAR_ART_ZERO_TESTNET_COLLECTION_API = ASTAR_ART_ZERO_TESTNET_COLLECTION_API;
|
|
27
|
+
const A0_ART_ZERO_IMAGE_API = 'https://a0-api.artzero.io/getImage';
|
|
28
|
+
exports.A0_ART_ZERO_IMAGE_API = A0_ART_ZERO_IMAGE_API;
|
|
29
|
+
const ASTAR_ART_ZERO_IMAGE_API = 'https://astar-api.artzero.io/getImage';
|
|
30
|
+
exports.ASTAR_ART_ZERO_IMAGE_API = ASTAR_ART_ZERO_IMAGE_API;
|
|
31
|
+
const A0_ART_ZERO_IPFS_API = 'https://a0-api.artzero.io/getJSON';
|
|
32
|
+
exports.A0_ART_ZERO_IPFS_API = A0_ART_ZERO_IPFS_API;
|
|
33
|
+
const ASTAR_ART_ZERO_IPFS_API = 'https://astar-api.artzero.io/getJSON';
|
|
34
|
+
exports.ASTAR_ART_ZERO_IPFS_API = ASTAR_ART_ZERO_IPFS_API;
|
|
35
|
+
const A0_ART_ZERO_COLLECTION_API = 'https://a0-api.artzero.io/getCollectionByAddress';
|
|
36
|
+
exports.A0_ART_ZERO_COLLECTION_API = A0_ART_ZERO_COLLECTION_API;
|
|
37
|
+
const ASTAR_ART_ZERO_COLLECTION_API = 'https://astar-api.artzero.io/getCollectionByAddress';
|
|
38
|
+
exports.ASTAR_ART_ZERO_COLLECTION_API = ASTAR_ART_ZERO_COLLECTION_API;
|
|
39
|
+
const A0_ART_ZERO_EXTERNAL_URL = 'https://a0.artzero.io/#/marketplace';
|
|
40
|
+
exports.A0_ART_ZERO_EXTERNAL_URL = A0_ART_ZERO_EXTERNAL_URL;
|
|
41
|
+
const ASTAR_ART_ZERO_EXTERNAL_URL = 'https://astar.artzero.io/#/marketplace';
|
|
42
|
+
exports.ASTAR_ART_ZERO_EXTERNAL_URL = ASTAR_ART_ZERO_EXTERNAL_URL;
|
|
43
|
+
function collectionApiFromArtZero(chain) {
|
|
44
|
+
if (chain === 'alephTest') {
|
|
45
|
+
return A0_ART_ZERO_TESTNET_COLLECTION_API;
|
|
46
|
+
}
|
|
47
|
+
if (chain === 'astar') {
|
|
48
|
+
return ASTAR_ART_ZERO_COLLECTION_API;
|
|
49
|
+
}
|
|
50
|
+
return A0_ART_ZERO_COLLECTION_API;
|
|
51
|
+
}
|
|
52
|
+
function itemImageApiFromArtZero(chain) {
|
|
53
|
+
if (chain === 'alephTest') {
|
|
54
|
+
return A0_ART_ZERO_TESTNET_IMAGE_API;
|
|
55
|
+
}
|
|
56
|
+
if (chain === 'astar') {
|
|
57
|
+
return ASTAR_ART_ZERO_IMAGE_API;
|
|
58
|
+
}
|
|
59
|
+
return A0_ART_ZERO_IMAGE_API;
|
|
60
|
+
}
|
|
61
|
+
function collectionDetailApiFromArtZero(chain) {
|
|
62
|
+
if (chain === 'alephTest') {
|
|
63
|
+
return A0_ART_ZERO_TESTNET_COLLECTION_API;
|
|
64
|
+
}
|
|
65
|
+
if (chain === 'astar') {
|
|
66
|
+
return ASTAR_ART_ZERO_COLLECTION_API;
|
|
67
|
+
}
|
|
68
|
+
return A0_ART_ZERO_COLLECTION_API;
|
|
69
|
+
}
|
|
70
|
+
function ipfsApiFromArtZero(chain) {
|
|
71
|
+
if (chain === 'alephTest') {
|
|
72
|
+
return ART_ZERO_TESTNET_IPFS_API;
|
|
73
|
+
}
|
|
74
|
+
if (chain === 'astar') {
|
|
75
|
+
return ASTAR_ART_ZERO_IPFS_API;
|
|
76
|
+
}
|
|
77
|
+
return A0_ART_ZERO_IPFS_API;
|
|
78
|
+
}
|
|
79
|
+
function externalUrlOnArtZero(chain) {
|
|
80
|
+
if (chain === 'astar') {
|
|
81
|
+
return ASTAR_ART_ZERO_EXTERNAL_URL;
|
|
82
|
+
}
|
|
83
|
+
return A0_ART_ZERO_EXTERNAL_URL;
|
|
84
|
+
}
|
|
@@ -2387,7 +2387,8 @@ class KoniExtension {
|
|
|
2387
2387
|
transaction: extrinsic,
|
|
2388
2388
|
data: inputData,
|
|
2389
2389
|
extrinsicType: _KoniTypes.ExtrinsicType.STAKING_JOIN_POOL,
|
|
2390
|
-
chainType: _KoniTypes.ChainType.SUBSTRATE
|
|
2390
|
+
chainType: _KoniTypes.ChainType.SUBSTRATE,
|
|
2391
|
+
transferNativeAmount: amount
|
|
2391
2392
|
});
|
|
2392
2393
|
}
|
|
2393
2394
|
async submitPoolingUnbonding(inputData) {
|
package/cjs/packageInfo.js
CHANGED
|
@@ -665,17 +665,19 @@ class ChainService {
|
|
|
665
665
|
parsedStoredAssetRegistry[storedAsset.slug] = storedAsset;
|
|
666
666
|
}
|
|
667
667
|
});
|
|
668
|
-
for (const
|
|
668
|
+
for (const storedAssetInfo of Object.values(parsedStoredAssetRegistry)) {
|
|
669
669
|
let duplicated = false;
|
|
670
670
|
for (const defaultChainAsset of Object.values(latestAssetRegistry)) {
|
|
671
671
|
// case merge custom asset with default asset
|
|
672
|
-
if ((0, _utils._isEqualSmartContractAsset)(
|
|
672
|
+
if ((0, _utils._isEqualSmartContractAsset)(storedAssetInfo, defaultChainAsset)) {
|
|
673
673
|
duplicated = true;
|
|
674
674
|
break;
|
|
675
675
|
}
|
|
676
676
|
}
|
|
677
677
|
if (!duplicated) {
|
|
678
|
-
mergedAssetRegistry[
|
|
678
|
+
mergedAssetRegistry[storedAssetInfo.slug] = storedAssetInfo;
|
|
679
|
+
} else {
|
|
680
|
+
deprecatedAssets.push(storedAssetInfo.slug);
|
|
679
681
|
}
|
|
680
682
|
}
|
|
681
683
|
this.dataMap.assetRegistry = mergedAssetRegistry;
|
|
@@ -5,7 +5,7 @@ import { RMRK_VER } from '@subwallet/extension-base/background/KoniTypes';
|
|
|
5
5
|
import { BaseNftApi } from '@subwallet/extension-base/koni/api/nft/nft';
|
|
6
6
|
import { isUrl, reformatAddress } from '@subwallet/extension-base/utils';
|
|
7
7
|
import fetch from 'cross-fetch';
|
|
8
|
-
import { getRandomIpfsGateway, SINGULAR_V1_COLLECTION_ENDPOINT,
|
|
8
|
+
import { getRandomIpfsGateway, SINGULAR_V1_COLLECTION_ENDPOINT, SINGULAR_V2_COLLECTION_ENDPOINT, SINGULAR_V2_ENDPOINT } from "../config.js";
|
|
9
9
|
var RMRK_SOURCE;
|
|
10
10
|
(function (RMRK_SOURCE) {
|
|
11
11
|
RMRK_SOURCE["BIRD_KANARIA"] = "bird_kanaria";
|
|
@@ -44,9 +44,6 @@ export class RmrkNftApi extends BaseNftApi {
|
|
|
44
44
|
}
|
|
45
45
|
async getAllByAccount(account) {
|
|
46
46
|
const fetchUrls = [{
|
|
47
|
-
url: SINGULAR_V1_ENDPOINT + account,
|
|
48
|
-
source: RMRK_SOURCE.SINGULAR_V1
|
|
49
|
-
}, {
|
|
50
47
|
url: SINGULAR_V2_ENDPOINT + account,
|
|
51
48
|
source: RMRK_SOURCE.SINGULAR_V2
|
|
52
49
|
}];
|
|
@@ -5,9 +5,11 @@ export declare class WasmNftApi extends BaseNftApi {
|
|
|
5
5
|
private wasmContracts;
|
|
6
6
|
constructor(api: _SubstrateApi | null, addresses: string[], chain: string);
|
|
7
7
|
setSmartContractNfts(wasmContracts: _ChainAsset[]): void;
|
|
8
|
+
private isAttributeStoredOnChain;
|
|
8
9
|
private parseFeaturedTokenUri;
|
|
9
10
|
private parseFeaturedNftImage;
|
|
10
11
|
private parseFeaturedCollectionImage;
|
|
12
|
+
private processOnChainMetadata;
|
|
11
13
|
private processOffChainMetadata;
|
|
12
14
|
private getItemsByCollection;
|
|
13
15
|
fetchNfts(params: HandleNftParams): Promise<number>;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
import { _AssetType } from '@subwallet/chain-list/types';
|
|
5
5
|
import { BaseNftApi } from '@subwallet/extension-base/koni/api/nft/nft';
|
|
6
|
-
import {
|
|
6
|
+
import { collectionApiFromArtZero, collectionDetailApiFromArtZero, externalUrlOnArtZero, ipfsApiFromArtZero, itemImageApiFromArtZero } from '@subwallet/extension-base/koni/api/nft/wasm_nft/utils';
|
|
7
7
|
import { getPSP34ContractPromise } from '@subwallet/extension-base/koni/api/tokens/wasm';
|
|
8
8
|
import { getDefaultWeightV2 } from '@subwallet/extension-base/koni/api/tokens/wasm/utils';
|
|
9
9
|
import { _getContractAddressOfToken } from '@subwallet/extension-base/services/chain-service/utils';
|
|
@@ -26,7 +26,7 @@ async function isArtZeroFeaturedCollection(networkKey, contractAddress) {
|
|
|
26
26
|
const urlencoded = new URLSearchParams();
|
|
27
27
|
urlencoded.append('collection_address', contractAddress);
|
|
28
28
|
const collectionInfoPromise = new Promise(function (resolve) {
|
|
29
|
-
fetch(
|
|
29
|
+
fetch(collectionApiFromArtZero(networkKey), {
|
|
30
30
|
method: 'POST',
|
|
31
31
|
headers: {
|
|
32
32
|
'Content-Type': 'application/x-www-form-urlencoded'
|
|
@@ -49,6 +49,20 @@ export class WasmNftApi extends BaseNftApi {
|
|
|
49
49
|
setSmartContractNfts(wasmContracts) {
|
|
50
50
|
this.wasmContracts = wasmContracts;
|
|
51
51
|
}
|
|
52
|
+
async isAttributeStoredOnChain(contractPromise) {
|
|
53
|
+
var _this$substrateApi, _onChainAttributeCoun;
|
|
54
|
+
if (!contractPromise.query['psp34Traits::getAttributeCount']) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// @ts-ignore
|
|
59
|
+
const _onChainAttributeCount = await contractPromise.query['psp34Traits::getAttributeCount'](this.addresses[0], {
|
|
60
|
+
gasLimit: getDefaultWeightV2((_this$substrateApi = this.substrateApi) === null || _this$substrateApi === void 0 ? void 0 : _this$substrateApi.api)
|
|
61
|
+
});
|
|
62
|
+
const _attributeCount = _onChainAttributeCount === null || _onChainAttributeCount === void 0 ? void 0 : (_onChainAttributeCoun = _onChainAttributeCount.output) === null || _onChainAttributeCoun === void 0 ? void 0 : _onChainAttributeCoun.toJSON();
|
|
63
|
+
const onChainAttributeCount = _onChainAttributeCount.output ? (_attributeCount === null || _attributeCount === void 0 ? void 0 : _attributeCount.ok) || (_attributeCount === null || _attributeCount === void 0 ? void 0 : _attributeCount.Ok) : '0';
|
|
64
|
+
return parseInt(onChainAttributeCount) !== 0;
|
|
65
|
+
}
|
|
52
66
|
parseFeaturedTokenUri(tokenUri) {
|
|
53
67
|
if (!tokenUri || tokenUri.length === 0) {
|
|
54
68
|
return undefined;
|
|
@@ -72,7 +86,7 @@ export class WasmNftApi extends BaseNftApi {
|
|
|
72
86
|
if (!parsedTokenUri) {
|
|
73
87
|
return undefined;
|
|
74
88
|
}
|
|
75
|
-
const nftItemImageSrc = `${this.chain
|
|
89
|
+
const nftItemImageSrc = `${itemImageApiFromArtZero(this.chain)}?input=${parsedTokenUri}&size=500`;
|
|
76
90
|
const collectionImageUrl = await axios(nftItemImageSrc, {
|
|
77
91
|
method: 'GET'
|
|
78
92
|
});
|
|
@@ -81,7 +95,7 @@ export class WasmNftApi extends BaseNftApi {
|
|
|
81
95
|
async parseFeaturedCollectionImage(smartContract) {
|
|
82
96
|
const urlencoded = new URLSearchParams();
|
|
83
97
|
urlencoded.append('collection_address', smartContract);
|
|
84
|
-
const resp = await fetch(this.chain
|
|
98
|
+
const resp = await fetch(collectionDetailApiFromArtZero(this.chain), {
|
|
85
99
|
method: 'POST',
|
|
86
100
|
headers: {
|
|
87
101
|
'Content-Type': 'application/x-www-form-urlencoded'
|
|
@@ -100,7 +114,7 @@ export class WasmNftApi extends BaseNftApi {
|
|
|
100
114
|
if (!parsedCollectionImage) {
|
|
101
115
|
return;
|
|
102
116
|
}
|
|
103
|
-
const collectionImageSrc = `${this.chain
|
|
117
|
+
const collectionImageSrc = `${itemImageApiFromArtZero(this.chain)}?input=${parsedCollectionImage}&size=500`;
|
|
104
118
|
const collectionImageUrl = await axios(collectionImageSrc, {
|
|
105
119
|
method: 'GET'
|
|
106
120
|
});
|
|
@@ -183,8 +197,55 @@ export class WasmNftApi extends BaseNftApi {
|
|
|
183
197
|
// return nftItem;
|
|
184
198
|
// }
|
|
185
199
|
|
|
200
|
+
async processOnChainMetadata(tokenId, isFeatured, tokenUri) {
|
|
201
|
+
const nftItem = {
|
|
202
|
+
chain: '',
|
|
203
|
+
collectionId: '',
|
|
204
|
+
id: '',
|
|
205
|
+
owner: '',
|
|
206
|
+
name: tokenId
|
|
207
|
+
};
|
|
208
|
+
let itemDetail = false;
|
|
209
|
+
if (isFeatured) {
|
|
210
|
+
const parsedTokenUri = this.parseFeaturedTokenUri(tokenUri);
|
|
211
|
+
if (parsedTokenUri) {
|
|
212
|
+
const resp = await fetch(`${ipfsApiFromArtZero(this.chain)}?input=${parsedTokenUri}`);
|
|
213
|
+
itemDetail = resp && resp.ok && (await resp.json());
|
|
214
|
+
}
|
|
215
|
+
} else {
|
|
216
|
+
const parsedTokenUri = this.parseFeaturedTokenUri(tokenUri);
|
|
217
|
+
const detailUrl = this.parseUrl(parsedTokenUri);
|
|
218
|
+
if (detailUrl) {
|
|
219
|
+
const resp = await fetch(detailUrl);
|
|
220
|
+
itemDetail = resp && resp.ok && (await resp.json());
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (!itemDetail) {
|
|
224
|
+
return nftItem;
|
|
225
|
+
}
|
|
226
|
+
nftItem.name = itemDetail.name;
|
|
227
|
+
nftItem.description = itemDetail.description;
|
|
228
|
+
const rawImageSrc = itemDetail.image ? itemDetail.image : itemDetail.image_url;
|
|
229
|
+
if (isFeatured) {
|
|
230
|
+
nftItem.image = await this.parseFeaturedNftImage(rawImageSrc);
|
|
231
|
+
nftItem.externalUrl = externalUrlOnArtZero(this.chain);
|
|
232
|
+
} else {
|
|
233
|
+
nftItem.image = this.parseUrl(rawImageSrc);
|
|
234
|
+
}
|
|
235
|
+
const propertiesMap = {};
|
|
236
|
+
const traitList = itemDetail.attributes ? itemDetail.attributes : itemDetail.traits;
|
|
237
|
+
if (traitList) {
|
|
238
|
+
traitList.forEach(traitMap => {
|
|
239
|
+
propertiesMap[traitMap.trait_type] = {
|
|
240
|
+
value: traitMap.value
|
|
241
|
+
};
|
|
242
|
+
});
|
|
243
|
+
nftItem.properties = propertiesMap;
|
|
244
|
+
}
|
|
245
|
+
return nftItem;
|
|
246
|
+
}
|
|
186
247
|
async processOffChainMetadata(contractPromise, address, tokenId, isFeatured) {
|
|
187
|
-
var _this$
|
|
248
|
+
var _this$substrateApi2;
|
|
188
249
|
const nftItem = {
|
|
189
250
|
chain: '',
|
|
190
251
|
collectionId: '',
|
|
@@ -193,7 +254,7 @@ export class WasmNftApi extends BaseNftApi {
|
|
|
193
254
|
name: tokenId
|
|
194
255
|
};
|
|
195
256
|
const _tokenUri = await contractPromise.query['psp34Traits::tokenUri'](address, {
|
|
196
|
-
gasLimit: getDefaultWeightV2((_this$
|
|
257
|
+
gasLimit: getDefaultWeightV2((_this$substrateApi2 = this.substrateApi) === null || _this$substrateApi2 === void 0 ? void 0 : _this$substrateApi2.api)
|
|
197
258
|
}, tokenId);
|
|
198
259
|
if (_tokenUri.output) {
|
|
199
260
|
let itemDetail = false;
|
|
@@ -204,7 +265,7 @@ export class WasmNftApi extends BaseNftApi {
|
|
|
204
265
|
if (isFeatured) {
|
|
205
266
|
const parsedTokenUri = this.parseFeaturedTokenUri(tokenUri);
|
|
206
267
|
if (parsedTokenUri) {
|
|
207
|
-
const resp = await fetch(`${this.chain
|
|
268
|
+
const resp = await fetch(`${ipfsApiFromArtZero(this.chain)}?input=${parsedTokenUri}`);
|
|
208
269
|
itemDetail = resp && resp.ok && (await resp.json());
|
|
209
270
|
}
|
|
210
271
|
} else {
|
|
@@ -224,7 +285,7 @@ export class WasmNftApi extends BaseNftApi {
|
|
|
224
285
|
const rawImageSrc = itemDetail.image ? itemDetail.image : itemDetail.image_url;
|
|
225
286
|
if (isFeatured) {
|
|
226
287
|
nftItem.image = await this.parseFeaturedNftImage(rawImageSrc);
|
|
227
|
-
nftItem.externalUrl =
|
|
288
|
+
nftItem.externalUrl = externalUrlOnArtZero(this.chain);
|
|
228
289
|
} else {
|
|
229
290
|
nftItem.image = this.parseUrl(rawImageSrc);
|
|
230
291
|
}
|
|
@@ -241,19 +302,19 @@ export class WasmNftApi extends BaseNftApi {
|
|
|
241
302
|
}
|
|
242
303
|
return nftItem;
|
|
243
304
|
}
|
|
244
|
-
async getItemsByCollection(contractPromise, tokenInfo, collectionName, nftParams, isFeatured) {
|
|
305
|
+
async getItemsByCollection(contractPromise, tokenInfo, collectionName, nftParams, isFeatured, isAttributeOnChain) {
|
|
245
306
|
let ownItem = false;
|
|
246
307
|
let collectionImage;
|
|
247
308
|
const smartContract = _getContractAddressOfToken(tokenInfo);
|
|
248
309
|
const nftOwnerMap = {};
|
|
249
310
|
await Promise.all(this.addresses.map(async address => {
|
|
250
|
-
var _this$
|
|
311
|
+
var _this$substrateApi3, _balance$output;
|
|
251
312
|
if (isEthereumAddress(address)) {
|
|
252
313
|
return;
|
|
253
314
|
}
|
|
254
315
|
const nftIds = [];
|
|
255
316
|
const _balance = await contractPromise.query['psp34::balanceOf'](address, {
|
|
256
|
-
gasLimit: getDefaultWeightV2((_this$
|
|
317
|
+
gasLimit: getDefaultWeightV2((_this$substrateApi3 = this.substrateApi) === null || _this$substrateApi3 === void 0 ? void 0 : _this$substrateApi3.api)
|
|
257
318
|
}, address);
|
|
258
319
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
259
320
|
const balanceJson = _balance === null || _balance === void 0 ? void 0 : (_balance$output = _balance.output) === null || _balance$output === void 0 ? void 0 : _balance$output.toJSON();
|
|
@@ -269,9 +330,9 @@ export class WasmNftApi extends BaseNftApi {
|
|
|
269
330
|
}
|
|
270
331
|
try {
|
|
271
332
|
await Promise.all(itemIndexes.map(async i => {
|
|
272
|
-
var _this$
|
|
333
|
+
var _this$substrateApi4;
|
|
273
334
|
const _tokenByIndexResp = await contractPromise.query['psp34Enumerable::ownersTokenByIndex'](address, {
|
|
274
|
-
gasLimit: getDefaultWeightV2((_this$
|
|
335
|
+
gasLimit: getDefaultWeightV2((_this$substrateApi4 = this.substrateApi) === null || _this$substrateApi4 === void 0 ? void 0 : _this$substrateApi4.api)
|
|
275
336
|
}, address, i);
|
|
276
337
|
if (_tokenByIndexResp.output) {
|
|
277
338
|
const rawTokenId = _tokenByIndexResp.output.toHuman();
|
|
@@ -279,18 +340,47 @@ export class WasmNftApi extends BaseNftApi {
|
|
|
279
340
|
const tokenIdObj = rawTokenId.Ok.Ok || rawTokenId.ok.ok; // capital O, not normal o
|
|
280
341
|
const tokenId = Object.values(tokenIdObj)[0].replaceAll(',', '');
|
|
281
342
|
nftIds.push(tokenId);
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
343
|
+
let tokenUri;
|
|
344
|
+
try {
|
|
345
|
+
if (isAttributeOnChain) {
|
|
346
|
+
var _this$substrateApi5, _tokenUri$output;
|
|
347
|
+
const _tokenUri = await contractPromise.query['psp34Traits::getAttributes'](address, {
|
|
348
|
+
gasLimit: getDefaultWeightV2((_this$substrateApi5 = this.substrateApi) === null || _this$substrateApi5 === void 0 ? void 0 : _this$substrateApi5.api)
|
|
349
|
+
}, tokenIdObj, ['metadata']);
|
|
350
|
+
const tokenUriObj = (_tokenUri$output = _tokenUri.output) === null || _tokenUri$output === void 0 ? void 0 : _tokenUri$output.toJSON();
|
|
351
|
+
tokenUri = (tokenUriObj.ok || tokenUriObj.Ok)[0];
|
|
352
|
+
}
|
|
353
|
+
} catch (e) {
|
|
354
|
+
console.debug(e);
|
|
355
|
+
}
|
|
356
|
+
if (!tokenUri) {
|
|
357
|
+
const nftItem = await this.processOffChainMetadata(contractPromise, address, tokenId, isFeatured);
|
|
358
|
+
nftItem.collectionId = smartContract;
|
|
359
|
+
nftItem.chain = this.chain;
|
|
360
|
+
nftItem.type = _AssetType.PSP34;
|
|
361
|
+
nftItem.id = tokenId;
|
|
362
|
+
nftItem.owner = address;
|
|
363
|
+
nftItem.onChainOption = tokenIdObj;
|
|
364
|
+
nftItem.originAsset = tokenInfo.slug;
|
|
365
|
+
nftParams.updateItem(this.chain, nftItem, address);
|
|
366
|
+
ownItem = true;
|
|
367
|
+
if (!isFeatured && !collectionImage && nftItem.image) {
|
|
368
|
+
collectionImage = nftItem.image; // No default collection image
|
|
369
|
+
}
|
|
370
|
+
} else {
|
|
371
|
+
const nftItem = await this.processOnChainMetadata(tokenId, false, tokenUri);
|
|
372
|
+
nftItem.collectionId = smartContract;
|
|
373
|
+
nftItem.chain = this.chain;
|
|
374
|
+
nftItem.type = _AssetType.PSP34;
|
|
375
|
+
nftItem.id = tokenId;
|
|
376
|
+
nftItem.owner = address;
|
|
377
|
+
nftItem.onChainOption = tokenIdObj;
|
|
378
|
+
nftItem.originAsset = tokenInfo.slug;
|
|
379
|
+
nftParams.updateItem(this.chain, nftItem, address);
|
|
380
|
+
ownItem = true;
|
|
381
|
+
if (!isFeatured && !collectionImage && nftItem.image) {
|
|
382
|
+
collectionImage = nftItem.image; // No default collection image
|
|
383
|
+
}
|
|
294
384
|
}
|
|
295
385
|
}
|
|
296
386
|
}));
|
|
@@ -329,17 +419,17 @@ export class WasmNftApi extends BaseNftApi {
|
|
|
329
419
|
return 1;
|
|
330
420
|
}
|
|
331
421
|
async handleNfts(params) {
|
|
332
|
-
var _this$
|
|
422
|
+
var _this$substrateApi6;
|
|
333
423
|
if (!this.wasmContracts || this.wasmContracts.length === 0) {
|
|
334
424
|
return;
|
|
335
425
|
}
|
|
336
426
|
await this.connect(); // might not be necessary
|
|
337
427
|
|
|
338
|
-
const apiPromise = (_this$
|
|
428
|
+
const apiPromise = (_this$substrateApi6 = this.substrateApi) === null || _this$substrateApi6 === void 0 ? void 0 : _this$substrateApi6.api;
|
|
339
429
|
await Promise.all(this.wasmContracts.map(async tokenInfo => {
|
|
340
430
|
const contractPromise = getPSP34ContractPromise(apiPromise, _getContractAddressOfToken(tokenInfo));
|
|
341
|
-
const isCollectionFeatured = await isArtZeroFeaturedCollection(this.chain, _getContractAddressOfToken(tokenInfo));
|
|
342
|
-
return await this.getItemsByCollection(contractPromise, tokenInfo, tokenInfo.name, params, isCollectionFeatured);
|
|
431
|
+
const [isAttributeOnChain, isCollectionFeatured] = await Promise.all([this.isAttributeStoredOnChain(contractPromise), isArtZeroFeaturedCollection(this.chain, _getContractAddressOfToken(tokenInfo))]);
|
|
432
|
+
return await this.getItemsByCollection(contractPromise, tokenInfo, tokenInfo.name, params, isCollectionFeatured, isAttributeOnChain);
|
|
343
433
|
}));
|
|
344
434
|
}
|
|
345
435
|
}
|
|
@@ -1,7 +1,19 @@
|
|
|
1
|
-
export declare const
|
|
1
|
+
export declare const A0_ART_ZERO_TESTNET_IMAGE_API = "https://a0-test-api.artzero.io/getImage";
|
|
2
|
+
export declare const ASTAR_ART_ZERO_TESTNET_IMAGE_API = "https://astar-test-api.artzero.io/getImage";
|
|
2
3
|
export declare const ART_ZERO_TESTNET_IPFS_API = "https://a0-test-api.artzero.io/getJSON";
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const
|
|
5
|
-
export declare const
|
|
6
|
-
export declare const
|
|
7
|
-
export declare const
|
|
4
|
+
export declare const ASTAR_ART_ZERO_TESTNET_IPFS_API = "https://astar-test-api.artzero.io/getJSON";
|
|
5
|
+
export declare const A0_ART_ZERO_TESTNET_COLLECTION_API = "https://a0-test-api.artzero.io/getCollectionByAddress";
|
|
6
|
+
export declare const ASTAR_ART_ZERO_TESTNET_COLLECTION_API = "https://astar-test-api.artzero.io/getCollectionByAddress";
|
|
7
|
+
export declare const A0_ART_ZERO_IMAGE_API = "https://a0-api.artzero.io/getImage";
|
|
8
|
+
export declare const ASTAR_ART_ZERO_IMAGE_API = "https://astar-api.artzero.io/getImage";
|
|
9
|
+
export declare const A0_ART_ZERO_IPFS_API = "https://a0-api.artzero.io/getJSON";
|
|
10
|
+
export declare const ASTAR_ART_ZERO_IPFS_API = "https://astar-api.artzero.io/getJSON";
|
|
11
|
+
export declare const A0_ART_ZERO_COLLECTION_API = "https://a0-api.artzero.io/getCollectionByAddress";
|
|
12
|
+
export declare const ASTAR_ART_ZERO_COLLECTION_API = "https://astar-api.artzero.io/getCollectionByAddress";
|
|
13
|
+
export declare const A0_ART_ZERO_EXTERNAL_URL = "https://a0.artzero.io/#/marketplace";
|
|
14
|
+
export declare const ASTAR_ART_ZERO_EXTERNAL_URL = "https://astar.artzero.io/#/marketplace";
|
|
15
|
+
export declare function collectionApiFromArtZero(chain: string): "https://a0-test-api.artzero.io/getCollectionByAddress" | "https://a0-api.artzero.io/getCollectionByAddress" | "https://astar-api.artzero.io/getCollectionByAddress";
|
|
16
|
+
export declare function itemImageApiFromArtZero(chain: string): "https://a0-test-api.artzero.io/getImage" | "https://a0-api.artzero.io/getImage" | "https://astar-api.artzero.io/getImage";
|
|
17
|
+
export declare function collectionDetailApiFromArtZero(chain: string): "https://a0-test-api.artzero.io/getCollectionByAddress" | "https://a0-api.artzero.io/getCollectionByAddress" | "https://astar-api.artzero.io/getCollectionByAddress";
|
|
18
|
+
export declare function ipfsApiFromArtZero(chain: string): "https://a0-test-api.artzero.io/getJSON" | "https://a0-api.artzero.io/getJSON" | "https://astar-api.artzero.io/getJSON";
|
|
19
|
+
export declare function externalUrlOnArtZero(chain: string): "https://a0.artzero.io/#/marketplace" | "https://astar.artzero.io/#/marketplace";
|
|
@@ -1,10 +1,59 @@
|
|
|
1
1
|
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
|
-
export const
|
|
4
|
+
export const A0_ART_ZERO_TESTNET_IMAGE_API = 'https://a0-test-api.artzero.io/getImage';
|
|
5
|
+
export const ASTAR_ART_ZERO_TESTNET_IMAGE_API = 'https://astar-test-api.artzero.io/getImage';
|
|
5
6
|
export const ART_ZERO_TESTNET_IPFS_API = 'https://a0-test-api.artzero.io/getJSON';
|
|
6
|
-
export const
|
|
7
|
-
export const
|
|
8
|
-
export const
|
|
9
|
-
export const
|
|
10
|
-
export const
|
|
7
|
+
export const ASTAR_ART_ZERO_TESTNET_IPFS_API = 'https://astar-test-api.artzero.io/getJSON';
|
|
8
|
+
export const A0_ART_ZERO_TESTNET_COLLECTION_API = 'https://a0-test-api.artzero.io/getCollectionByAddress';
|
|
9
|
+
export const ASTAR_ART_ZERO_TESTNET_COLLECTION_API = 'https://astar-test-api.artzero.io/getCollectionByAddress';
|
|
10
|
+
export const A0_ART_ZERO_IMAGE_API = 'https://a0-api.artzero.io/getImage';
|
|
11
|
+
export const ASTAR_ART_ZERO_IMAGE_API = 'https://astar-api.artzero.io/getImage';
|
|
12
|
+
export const A0_ART_ZERO_IPFS_API = 'https://a0-api.artzero.io/getJSON';
|
|
13
|
+
export const ASTAR_ART_ZERO_IPFS_API = 'https://astar-api.artzero.io/getJSON';
|
|
14
|
+
export const A0_ART_ZERO_COLLECTION_API = 'https://a0-api.artzero.io/getCollectionByAddress';
|
|
15
|
+
export const ASTAR_ART_ZERO_COLLECTION_API = 'https://astar-api.artzero.io/getCollectionByAddress';
|
|
16
|
+
export const A0_ART_ZERO_EXTERNAL_URL = 'https://a0.artzero.io/#/marketplace';
|
|
17
|
+
export const ASTAR_ART_ZERO_EXTERNAL_URL = 'https://astar.artzero.io/#/marketplace';
|
|
18
|
+
export function collectionApiFromArtZero(chain) {
|
|
19
|
+
if (chain === 'alephTest') {
|
|
20
|
+
return A0_ART_ZERO_TESTNET_COLLECTION_API;
|
|
21
|
+
}
|
|
22
|
+
if (chain === 'astar') {
|
|
23
|
+
return ASTAR_ART_ZERO_COLLECTION_API;
|
|
24
|
+
}
|
|
25
|
+
return A0_ART_ZERO_COLLECTION_API;
|
|
26
|
+
}
|
|
27
|
+
export function itemImageApiFromArtZero(chain) {
|
|
28
|
+
if (chain === 'alephTest') {
|
|
29
|
+
return A0_ART_ZERO_TESTNET_IMAGE_API;
|
|
30
|
+
}
|
|
31
|
+
if (chain === 'astar') {
|
|
32
|
+
return ASTAR_ART_ZERO_IMAGE_API;
|
|
33
|
+
}
|
|
34
|
+
return A0_ART_ZERO_IMAGE_API;
|
|
35
|
+
}
|
|
36
|
+
export function collectionDetailApiFromArtZero(chain) {
|
|
37
|
+
if (chain === 'alephTest') {
|
|
38
|
+
return A0_ART_ZERO_TESTNET_COLLECTION_API;
|
|
39
|
+
}
|
|
40
|
+
if (chain === 'astar') {
|
|
41
|
+
return ASTAR_ART_ZERO_COLLECTION_API;
|
|
42
|
+
}
|
|
43
|
+
return A0_ART_ZERO_COLLECTION_API;
|
|
44
|
+
}
|
|
45
|
+
export function ipfsApiFromArtZero(chain) {
|
|
46
|
+
if (chain === 'alephTest') {
|
|
47
|
+
return ART_ZERO_TESTNET_IPFS_API;
|
|
48
|
+
}
|
|
49
|
+
if (chain === 'astar') {
|
|
50
|
+
return ASTAR_ART_ZERO_IPFS_API;
|
|
51
|
+
}
|
|
52
|
+
return A0_ART_ZERO_IPFS_API;
|
|
53
|
+
}
|
|
54
|
+
export function externalUrlOnArtZero(chain) {
|
|
55
|
+
if (chain === 'astar') {
|
|
56
|
+
return ASTAR_ART_ZERO_EXTERNAL_URL;
|
|
57
|
+
}
|
|
58
|
+
return A0_ART_ZERO_EXTERNAL_URL;
|
|
59
|
+
}
|
|
@@ -2321,7 +2321,8 @@ export default class KoniExtension {
|
|
|
2321
2321
|
transaction: extrinsic,
|
|
2322
2322
|
data: inputData,
|
|
2323
2323
|
extrinsicType: ExtrinsicType.STAKING_JOIN_POOL,
|
|
2324
|
-
chainType: ChainType.SUBSTRATE
|
|
2324
|
+
chainType: ChainType.SUBSTRATE,
|
|
2325
|
+
transferNativeAmount: amount
|
|
2325
2326
|
});
|
|
2326
2327
|
}
|
|
2327
2328
|
async submitPoolingUnbonding(inputData) {
|
package/package.json
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"./cjs/detectPackage.js"
|
|
18
18
|
],
|
|
19
19
|
"type": "module",
|
|
20
|
-
"version": "1.0.6-
|
|
20
|
+
"version": "1.0.6-2",
|
|
21
21
|
"main": "./cjs/index.js",
|
|
22
22
|
"module": "./index.js",
|
|
23
23
|
"types": "./index.d.ts",
|
|
@@ -1697,11 +1697,11 @@
|
|
|
1697
1697
|
"@sora-substrate/type-definitions": "^1.17.7",
|
|
1698
1698
|
"@subsocial/types": "^0.6.8",
|
|
1699
1699
|
"@substrate/connect": "^0.7.26",
|
|
1700
|
-
"@subwallet/chain-list": "^0.1.
|
|
1701
|
-
"@subwallet/extension-base": "^1.0.6-
|
|
1702
|
-
"@subwallet/extension-chains": "^1.0.6-
|
|
1703
|
-
"@subwallet/extension-dapp": "^1.0.6-
|
|
1704
|
-
"@subwallet/extension-inject": "^1.0.6-
|
|
1700
|
+
"@subwallet/chain-list": "^0.1.8",
|
|
1701
|
+
"@subwallet/extension-base": "^1.0.6-2",
|
|
1702
|
+
"@subwallet/extension-chains": "^1.0.6-2",
|
|
1703
|
+
"@subwallet/extension-dapp": "^1.0.6-2",
|
|
1704
|
+
"@subwallet/extension-inject": "^1.0.6-2",
|
|
1705
1705
|
"@subwallet/keyring": "^0.0.9",
|
|
1706
1706
|
"@subwallet/ui-keyring": "^0.0.9",
|
|
1707
1707
|
"@unique-nft/types": "^0.6.0-4",
|
package/packageInfo.js
CHANGED
|
@@ -7,5 +7,5 @@ export const packageInfo = {
|
|
|
7
7
|
name: '@subwallet/extension-base',
|
|
8
8
|
path: (import.meta && import.meta.url) ? new URL(import.meta.url).pathname.substring(0, new URL(import.meta.url).pathname.lastIndexOf('/') + 1) : 'auto',
|
|
9
9
|
type: 'esm',
|
|
10
|
-
version: '1.0.6-
|
|
10
|
+
version: '1.0.6-2'
|
|
11
11
|
};
|
|
@@ -652,17 +652,19 @@ export class ChainService {
|
|
|
652
652
|
parsedStoredAssetRegistry[storedAsset.slug] = storedAsset;
|
|
653
653
|
}
|
|
654
654
|
});
|
|
655
|
-
for (const
|
|
655
|
+
for (const storedAssetInfo of Object.values(parsedStoredAssetRegistry)) {
|
|
656
656
|
let duplicated = false;
|
|
657
657
|
for (const defaultChainAsset of Object.values(latestAssetRegistry)) {
|
|
658
658
|
// case merge custom asset with default asset
|
|
659
|
-
if (_isEqualSmartContractAsset(
|
|
659
|
+
if (_isEqualSmartContractAsset(storedAssetInfo, defaultChainAsset)) {
|
|
660
660
|
duplicated = true;
|
|
661
661
|
break;
|
|
662
662
|
}
|
|
663
663
|
}
|
|
664
664
|
if (!duplicated) {
|
|
665
|
-
mergedAssetRegistry[
|
|
665
|
+
mergedAssetRegistry[storedAssetInfo.slug] = storedAssetInfo;
|
|
666
|
+
} else {
|
|
667
|
+
deprecatedAssets.push(storedAssetInfo.slug);
|
|
666
668
|
}
|
|
667
669
|
}
|
|
668
670
|
this.dataMap.assetRegistry = mergedAssetRegistry;
|