@subwallet/extension-base 1.1.35-beta.3 → 1.1.36-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/cjs/koni/api/nft/config.js +11 -6
- package/cjs/koni/api/nft/index.js +4 -2
- package/cjs/koni/api/nft/transfer.js +7 -19
- package/cjs/koni/api/nft/unique_network_nft/index.js +154 -0
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/index.js +1 -1
- package/cjs/services/chain-service/constants.js +1 -1
- package/cjs/services/chain-service/index.js +3 -2
- package/cjs/services/earning-service/service.js +29 -12
- package/cjs/services/transaction-service/constants.js +1 -1
- package/cjs/services/transaction-service/index.js +1 -1
- package/cjs/utils/eth.js +10 -1
- package/koni/api/nft/config.d.ts +3 -2
- package/koni/api/nft/config.js +8 -3
- package/koni/api/nft/index.js +3 -2
- package/koni/api/nft/transfer.d.ts +0 -1
- package/koni/api/nft/transfer.js +7 -18
- package/koni/api/nft/unique_network_nft/index.d.ts +9 -0
- package/koni/api/nft/unique_network_nft/index.js +146 -0
- package/package.json +12 -7
- package/packageInfo.js +1 -1
- package/services/balance-service/index.js +1 -1
- package/services/chain-service/constants.js +1 -1
- package/services/chain-service/index.js +4 -3
- package/services/earning-service/service.d.ts +2 -1
- package/services/earning-service/service.js +30 -13
- package/services/transaction-service/constants.js +1 -1
- package/services/transaction-service/index.js +1 -1
- package/utils/eth.js +10 -1
- package/cjs/utils/yield/index.js +0 -3
|
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.W3S_IPFS = exports.VARA_SCAN_ENDPOINT = exports.UNIQUE_SCAN_ENDPOINT = exports.UNIQUE_IPFS_GATEWAY = exports.TRANSFER_CHAIN_ID = exports.SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME = exports.SUPPORTED_TRANSFER_EVM_CHAIN_NAME = exports.SUPPORTED_TRANSFER_EVM_CHAIN = exports.SUPPORTED_NFT_NETWORKS = exports.SUBWALLET_IPFS = exports.SINGULAR_V2_ENDPOINT = exports.SINGULAR_V2_COLLECTION_ENDPOINT = exports.SINGULAR_V1_ENDPOINT = exports.SINGULAR_V1_COLLECTION_ENDPOINT = exports.RMRK_PINATA_SERVER = exports.QUARTZ_SCAN_ENDPOINT = exports.PINATA_IPFS_GATEWAY = exports.NFT_STORAGE_GATEWAY = exports.KANARIA_EXTERNAL_SERVER = exports.KANARIA_ENDPOINT = exports.IPFS_W3S_LINK = exports.IPFS_IO = exports.IPFS_GATEWAY_4EVERLAND = exports.IPFS_FLEEK = exports.IPFS_ETH_ARAGON = exports.IPFS2_RMRK = exports.GATEWAY_IPFS_IO = exports.DWEB_LINK = exports.CLOUDFLARE_PINATA_SERVER = exports.CF_IPFS_GATEWAY = exports.BIT_COUNTRY_THUMBNAIL_RESOLVER = exports.BIT_COUNTRY_LAND_ESTATE_METADATA_API = exports.BIT_COUNTRY_IPFS_SERVER = void 0;
|
|
7
|
+
exports.W3S_IPFS = exports.VARA_SCAN_ENDPOINT = exports.UNIQUE_SCAN_ENDPOINT = exports.UNIQUE_IPFS_GATEWAY = exports.TRANSFER_CHAIN_ID = exports.SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME = exports.SUPPORTED_TRANSFER_EVM_CHAIN_NAME = exports.SUPPORTED_TRANSFER_EVM_CHAIN = exports.SUPPORTED_NFT_NETWORKS = exports.SUBWALLET_IPFS = exports.SINGULAR_V2_ENDPOINT = exports.SINGULAR_V2_COLLECTION_ENDPOINT = exports.SINGULAR_V1_ENDPOINT = exports.SINGULAR_V1_COLLECTION_ENDPOINT = exports.RMRK_PINATA_SERVER = exports.QUARTZ_SCAN_ENDPOINT = exports.PINATA_IPFS_GATEWAY = exports.OPAL_SCAN_ENDPOINT = exports.NFT_STORAGE_GATEWAY = exports.KANARIA_EXTERNAL_SERVER = exports.KANARIA_ENDPOINT = exports.IPFS_W3S_LINK = exports.IPFS_IO = exports.IPFS_GATEWAY_4EVERLAND = exports.IPFS_FLEEK = exports.IPFS_ETH_ARAGON = exports.IPFS2_RMRK = exports.GATEWAY_IPFS_IO = exports.DWEB_LINK = exports.CLOUDFLARE_PINATA_SERVER = exports.CF_IPFS_GATEWAY = exports.BIT_COUNTRY_THUMBNAIL_RESOLVER = exports.BIT_COUNTRY_LAND_ESTATE_METADATA_API = exports.BIT_COUNTRY_IPFS_SERVER = void 0;
|
|
8
8
|
exports.getRandomIpfsGateway = getRandomIpfsGateway;
|
|
9
9
|
var _storage = require("@subwallet/extension-base/storage");
|
|
10
10
|
var _utils = require("@subwallet/extension-base/utils");
|
|
@@ -41,15 +41,20 @@ const CF_IPFS_GATEWAY = 'https://cf-ipfs.com/ipfs/';
|
|
|
41
41
|
// XOrigin
|
|
42
42
|
exports.CF_IPFS_GATEWAY = CF_IPFS_GATEWAY;
|
|
43
43
|
const PINATA_IPFS_GATEWAY = 'https://gateway.pinata.cloud/ipfs/';
|
|
44
|
+
|
|
45
|
+
// deprecated
|
|
46
|
+
// export const UNIQUE_SCAN_ENDPOINT = 'https://explorer-api.unique.network/v1/graphql';
|
|
47
|
+
// export const QUARTZ_SCAN_ENDPOINT = 'https://hasura-quartz.unique.network/v1/graphql';
|
|
44
48
|
exports.PINATA_IPFS_GATEWAY = PINATA_IPFS_GATEWAY;
|
|
45
|
-
const
|
|
49
|
+
const VARA_SCAN_ENDPOINT = 'https://nft-explorer.vara-network.io/graphql';
|
|
50
|
+
exports.VARA_SCAN_ENDPOINT = VARA_SCAN_ENDPOINT;
|
|
51
|
+
const UNIQUE_SCAN_ENDPOINT = 'https://api-unique.uniquescan.io/v1/graphql';
|
|
46
52
|
exports.UNIQUE_SCAN_ENDPOINT = UNIQUE_SCAN_ENDPOINT;
|
|
47
|
-
const QUARTZ_SCAN_ENDPOINT = 'https://
|
|
53
|
+
const QUARTZ_SCAN_ENDPOINT = 'https://api-quartz.uniquescan.io/v1/graphql';
|
|
48
54
|
exports.QUARTZ_SCAN_ENDPOINT = QUARTZ_SCAN_ENDPOINT;
|
|
49
|
-
const
|
|
50
|
-
|
|
55
|
+
const OPAL_SCAN_ENDPOINT = 'https://api-opal.uniquescan.io/v1/graphql';
|
|
51
56
|
// GATEWAY
|
|
52
|
-
exports.
|
|
57
|
+
exports.OPAL_SCAN_ENDPOINT = OPAL_SCAN_ENDPOINT;
|
|
53
58
|
const UNIQUE_IPFS_GATEWAY = 'https://ipfs.unique.network/ipfs/';
|
|
54
59
|
|
|
55
60
|
// XOrigin
|
|
@@ -12,7 +12,7 @@ var _karura_nft = require("@subwallet/extension-base/koni/api/nft/karura_nft");
|
|
|
12
12
|
var _ordinal_nft = _interopRequireDefault(require("@subwallet/extension-base/koni/api/nft/ordinal_nft"));
|
|
13
13
|
var _rmrk_nft = require("@subwallet/extension-base/koni/api/nft/rmrk_nft");
|
|
14
14
|
var _statemine_nft = _interopRequireDefault(require("@subwallet/extension-base/koni/api/nft/statemine_nft"));
|
|
15
|
-
var
|
|
15
|
+
var _unique_network_nft = require("@subwallet/extension-base/koni/api/nft/unique_network_nft");
|
|
16
16
|
var _vara_nft = require("@subwallet/extension-base/koni/api/nft/vara_nft");
|
|
17
17
|
var _wasm_nft = require("@subwallet/extension-base/koni/api/nft/wasm_nft");
|
|
18
18
|
var _constants = require("@subwallet/extension-base/services/chain-service/constants");
|
|
@@ -22,6 +22,8 @@ var _statemint_nft = _interopRequireDefault(require("./statemint_nft"));
|
|
|
22
22
|
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
23
23
|
// SPDX-License-Identifier: Apache-2.0
|
|
24
24
|
|
|
25
|
+
// import UniqueNftApi from '@subwallet/extension-base/koni/api/nft/unique_nft';
|
|
26
|
+
|
|
25
27
|
function createSubstrateNftApi(chain, substrateApi, addresses) {
|
|
26
28
|
const [substrateAddresses] = (0, _utils2.categoryAddresses)(addresses);
|
|
27
29
|
if (_constants._NFT_CHAIN_GROUP.acala.includes(chain)) {
|
|
@@ -35,7 +37,7 @@ function createSubstrateNftApi(chain, substrateApi, addresses) {
|
|
|
35
37
|
} else if (_constants._NFT_CHAIN_GROUP.statemint.includes(chain)) {
|
|
36
38
|
return new _statemint_nft.default(substrateApi, substrateAddresses, chain);
|
|
37
39
|
} else if (_constants._NFT_CHAIN_GROUP.unique_network.includes(chain)) {
|
|
38
|
-
return new
|
|
40
|
+
return new _unique_network_nft.UniqueNftApi(chain, substrateAddresses);
|
|
39
41
|
} else if (_constants._NFT_CHAIN_GROUP.bitcountry.includes(chain)) {
|
|
40
42
|
return new _bit.BitCountryNftApi(substrateApi, substrateAddresses, chain);
|
|
41
43
|
} else if (_constants._NFT_CHAIN_GROUP.vara.includes(chain)) {
|
|
@@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.acalaGetExtrinsic = acalaGetExtrinsic;
|
|
7
7
|
exports.getNftTransferExtrinsic = getNftTransferExtrinsic;
|
|
8
8
|
exports.isRecipientSelf = isRecipientSelf;
|
|
9
|
-
exports.quartzGetExtrinsic = quartzGetExtrinsic;
|
|
10
9
|
exports.rmrkGetExtrinsic = rmrkGetExtrinsic;
|
|
11
10
|
exports.statemineGetExtrinsic = statemineGetExtrinsic;
|
|
12
11
|
exports.statemintGetExtrinsic = statemintGetExtrinsic;
|
|
@@ -43,18 +42,6 @@ function rmrkGetExtrinsic(substrateApi, senderAddress, recipientAddress, params)
|
|
|
43
42
|
}
|
|
44
43
|
}
|
|
45
44
|
function uniqueGetExtrinsic(substrateApi, senderAddress, recipientAddress, params) {
|
|
46
|
-
try {
|
|
47
|
-
const itemId = params.itemId;
|
|
48
|
-
const collectionId = params.collectionId;
|
|
49
|
-
return substrateApi.api.tx.nft.transfer({
|
|
50
|
-
Substrate: recipientAddress
|
|
51
|
-
}, collectionId, itemId, 1);
|
|
52
|
-
} catch (e) {
|
|
53
|
-
console.error(e);
|
|
54
|
-
return null;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
function quartzGetExtrinsic(substrateApi, senderAddress, recipientAddress, params) {
|
|
58
45
|
try {
|
|
59
46
|
const itemId = params.itemId;
|
|
60
47
|
const collectionId = params.collectionId;
|
|
@@ -94,12 +81,13 @@ function getNftTransferExtrinsic(networkKey, substrateApi, senderAddress, recipi
|
|
|
94
81
|
return acalaGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
95
82
|
case _config.SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.kusama:
|
|
96
83
|
return rmrkGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
84
|
+
// temporary prevent send nfts on Unique network-based chains
|
|
85
|
+
// case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.uniqueNft:
|
|
86
|
+
// return uniqueGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
87
|
+
// case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.quartz:
|
|
88
|
+
// return uniqueGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
89
|
+
// case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.opal:
|
|
90
|
+
// return uniqueGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
103
91
|
case _config.SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.statemine:
|
|
104
92
|
return statemineGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
105
93
|
case _config.SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.statemint:
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.UniqueNftApi = void 0;
|
|
8
|
+
var _config = require("@subwallet/extension-base/koni/api/nft/config");
|
|
9
|
+
var _nft = require("@subwallet/extension-base/koni/api/nft/nft");
|
|
10
|
+
var _crossFetch = _interopRequireDefault(require("cross-fetch"));
|
|
11
|
+
var _utilCrypto = require("@polkadot/util-crypto");
|
|
12
|
+
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
13
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
14
|
+
|
|
15
|
+
class UniqueNftApi extends _nft.BaseNftApi {
|
|
16
|
+
constructor(chain, addresses) {
|
|
17
|
+
super(chain, undefined, addresses);
|
|
18
|
+
}
|
|
19
|
+
handleProperties(nft) {
|
|
20
|
+
const propertiesMap = {};
|
|
21
|
+
const attRecord = nft.attributes;
|
|
22
|
+
if (attRecord) {
|
|
23
|
+
for (const item in attRecord) {
|
|
24
|
+
if (attRecord[item].name._.toLowerCase() === 'traits') {
|
|
25
|
+
const traits = [];
|
|
26
|
+
const traitValues = attRecord[item].value;
|
|
27
|
+
for (const trait in traitValues) {
|
|
28
|
+
traits.push(traitValues[trait]._);
|
|
29
|
+
}
|
|
30
|
+
propertiesMap.traits = {
|
|
31
|
+
value: traits
|
|
32
|
+
};
|
|
33
|
+
} else {
|
|
34
|
+
propertiesMap[attRecord[item].name._] = {
|
|
35
|
+
value: attRecord[item].value._
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return propertiesMap;
|
|
41
|
+
}
|
|
42
|
+
static parseNftRequest(uniqueAddress) {
|
|
43
|
+
return {
|
|
44
|
+
query: `
|
|
45
|
+
query {
|
|
46
|
+
tokens(
|
|
47
|
+
limit: 99999
|
|
48
|
+
offset: 0
|
|
49
|
+
where: { owner: { _eq: "${uniqueAddress}" }, burned: { _eq: "false" }})
|
|
50
|
+
{
|
|
51
|
+
data {
|
|
52
|
+
collection_id
|
|
53
|
+
collection_name
|
|
54
|
+
collection_description
|
|
55
|
+
collection_cover
|
|
56
|
+
token_id
|
|
57
|
+
token_name
|
|
58
|
+
image
|
|
59
|
+
attributes
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
`
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
async getNftByAccount(address) {
|
|
67
|
+
var _result$data, _result$data$tokens;
|
|
68
|
+
let endpoint = '';
|
|
69
|
+
let uniqueAddress = '';
|
|
70
|
+
|
|
71
|
+
// Use exactly endpoint for each network
|
|
72
|
+
if (['unique_network'].includes(this.chain)) {
|
|
73
|
+
endpoint = _config.UNIQUE_SCAN_ENDPOINT;
|
|
74
|
+
uniqueAddress = (0, _utilCrypto.encodeAddress)((0, _utilCrypto.decodeAddress)(address), 7391);
|
|
75
|
+
// Unique network prefix: 7391
|
|
76
|
+
} else if (['quartz'].includes(this.chain)) {
|
|
77
|
+
endpoint = _config.QUARTZ_SCAN_ENDPOINT;
|
|
78
|
+
uniqueAddress = (0, _utilCrypto.encodeAddress)((0, _utilCrypto.decodeAddress)(address), 255);
|
|
79
|
+
// Quartz prefix: 255
|
|
80
|
+
} else if (['opal'].includes(this.chain)) {
|
|
81
|
+
endpoint = _config.OPAL_SCAN_ENDPOINT;
|
|
82
|
+
uniqueAddress = address;
|
|
83
|
+
// Opal address: Normal address
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const resp = await (0, _crossFetch.default)(endpoint, {
|
|
87
|
+
method: 'post',
|
|
88
|
+
headers: {
|
|
89
|
+
'Content-Type': 'application/json'
|
|
90
|
+
},
|
|
91
|
+
body: JSON.stringify(UniqueNftApi.parseNftRequest(uniqueAddress))
|
|
92
|
+
});
|
|
93
|
+
const result = await resp.json();
|
|
94
|
+
|
|
95
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
96
|
+
return result === null || result === void 0 ? void 0 : (_result$data = result.data) === null || _result$data === void 0 ? void 0 : (_result$data$tokens = _result$data.tokens) === null || _result$data$tokens === void 0 ? void 0 : _result$data$tokens.data;
|
|
97
|
+
}
|
|
98
|
+
async handleNfts(params) {
|
|
99
|
+
try {
|
|
100
|
+
await Promise.all(this.addresses.map(async address => {
|
|
101
|
+
const nfts = await this.getNftByAccount(address);
|
|
102
|
+
if (nfts) {
|
|
103
|
+
const collectionMap = {};
|
|
104
|
+
for (const nft of nfts) {
|
|
105
|
+
var _nft$image;
|
|
106
|
+
// Handle case rendering image on Quartz Network (Temporary solution)
|
|
107
|
+
if (this.chain === 'quartz' && nft.collection_id.toString() === '141') {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Handle properties
|
|
112
|
+
const propertiesMap = this.handleProperties(nft);
|
|
113
|
+
|
|
114
|
+
// Update Nft information
|
|
115
|
+
const parsedNft = {
|
|
116
|
+
id: nft.token_id.toString(),
|
|
117
|
+
chain: this.chain,
|
|
118
|
+
owner: address,
|
|
119
|
+
name: nft.token_name,
|
|
120
|
+
image: this.parseUrl((_nft$image = nft.image) === null || _nft$image === void 0 ? void 0 : _nft$image.fullUrl),
|
|
121
|
+
description: nft.collection_description,
|
|
122
|
+
collectionId: nft.collection_id.toString(),
|
|
123
|
+
properties: propertiesMap
|
|
124
|
+
};
|
|
125
|
+
params.updateItem(this.chain, parsedNft, address);
|
|
126
|
+
|
|
127
|
+
// Update Collection information
|
|
128
|
+
if (!collectionMap[nft.collection_id.toString()]) {
|
|
129
|
+
const parsedCollection = {
|
|
130
|
+
collectionId: nft.collection_id.toString(),
|
|
131
|
+
chain: this.chain,
|
|
132
|
+
collectionName: nft.collection_name,
|
|
133
|
+
image: this.parseUrl(nft.collection_cover)
|
|
134
|
+
};
|
|
135
|
+
collectionMap[nft.collection_id.toString()] = parsedCollection;
|
|
136
|
+
params.updateCollection(this.chain, parsedCollection);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}));
|
|
141
|
+
} catch (e) {
|
|
142
|
+
console.error(`Failed to fetch ${this.chain} nft`, e);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async fetchNfts(params) {
|
|
146
|
+
try {
|
|
147
|
+
await this.handleNfts(params);
|
|
148
|
+
} catch (e) {
|
|
149
|
+
return 0;
|
|
150
|
+
}
|
|
151
|
+
return 1;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
exports.UniqueNftApi = UniqueNftApi;
|
package/cjs/packageInfo.js
CHANGED
|
@@ -44,7 +44,7 @@ class BalanceService {
|
|
|
44
44
|
if (!chainInfo || !chainState || !chainState.active) {
|
|
45
45
|
return Promise.reject(new _BalanceError.BalanceError(_KoniTypes.BalanceErrorType.NETWORK_ERROR, (0, _i18next.t)('{{chain}} is inactive. Please enable network', {
|
|
46
46
|
replace: {
|
|
47
|
-
chain
|
|
47
|
+
chain: chainInfo.name
|
|
48
48
|
}
|
|
49
49
|
})));
|
|
50
50
|
}
|
|
@@ -58,7 +58,7 @@ const _NFT_CHAIN_GROUP = {
|
|
|
58
58
|
rmrk: ['kusama'],
|
|
59
59
|
statemine: ['statemine'],
|
|
60
60
|
statemint: ['statemint'],
|
|
61
|
-
unique_network: ['unique_network'],
|
|
61
|
+
unique_network: ['unique_network', 'quartz', 'opal'],
|
|
62
62
|
bitcountry: ['bitcountry', 'pioneer'],
|
|
63
63
|
vara: ['vara_network']
|
|
64
64
|
};
|
|
@@ -417,7 +417,6 @@ class ChainService {
|
|
|
417
417
|
|
|
418
418
|
await this.initChains();
|
|
419
419
|
this.chainInfoMapSubject.next(this.getChainInfoMap());
|
|
420
|
-
this.updateChainStateMapSubscription();
|
|
421
420
|
this.assetRegistrySubject.next(this.getAssetRegistry());
|
|
422
421
|
this.xcmRefMapSubject.next(this.dataMap.assetRefMap);
|
|
423
422
|
await this.initApis();
|
|
@@ -929,7 +928,9 @@ class ChainService {
|
|
|
929
928
|
}
|
|
930
929
|
}
|
|
931
930
|
updateChainStateMapSubscription() {
|
|
932
|
-
|
|
931
|
+
(0, _utils2.addLazy)('updateChainStateMapSubscription', () => {
|
|
932
|
+
this.chainStateMapSubject.next(this.getChainStateMap());
|
|
933
|
+
}, 300, 900);
|
|
933
934
|
}
|
|
934
935
|
updateChainInfoMapSubscription() {
|
|
935
936
|
this.chainInfoMapSubject.next(this.getChainInfoMap());
|
|
@@ -411,12 +411,10 @@ class EarningService {
|
|
|
411
411
|
return Promise.resolve(this.yieldPositionListSubject.getValue());
|
|
412
412
|
}
|
|
413
413
|
yieldPositionPersistQueue = [];
|
|
414
|
-
resetYieldPositionQueue() {
|
|
415
|
-
this.yieldPositionPersistQueue = [];
|
|
416
|
-
}
|
|
417
414
|
async resetYieldPosition() {
|
|
418
415
|
this.yieldPositionSubject.next({});
|
|
419
416
|
this.yieldPositionPersistQueue = [];
|
|
417
|
+
(0, _utils2.removeLazy)('persistYieldPositionInfo');
|
|
420
418
|
await this.dbService.stores.yieldPosition.clear();
|
|
421
419
|
}
|
|
422
420
|
_getYieldPositionKey(slug, address) {
|
|
@@ -463,6 +461,7 @@ class EarningService {
|
|
|
463
461
|
runUnsubscribePoolsPosition() {
|
|
464
462
|
var _this$yieldPositionUn;
|
|
465
463
|
(_this$yieldPositionUn = this.yieldPositionUnsub) === null || _this$yieldPositionUn === void 0 ? void 0 : _this$yieldPositionUn.call(this);
|
|
464
|
+
(0, _utils2.removeLazy)('persistYieldPositionInfo');
|
|
466
465
|
this.yieldPositionPersistQueue = [];
|
|
467
466
|
}
|
|
468
467
|
|
|
@@ -470,12 +469,19 @@ class EarningService {
|
|
|
470
469
|
|
|
471
470
|
/* Get pools' reward */
|
|
472
471
|
|
|
472
|
+
earningsRewardQueue = [];
|
|
473
473
|
updateEarningReward(stakingRewardData) {
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
474
|
+
this.earningsRewardQueue.push(stakingRewardData);
|
|
475
|
+
(0, _utils2.addLazy)('updateEarningReward', () => {
|
|
476
|
+
const stakingRewardState = this.earningRewardSubject.getValue();
|
|
477
|
+
this.earningsRewardQueue.forEach(item => {
|
|
478
|
+
const key = `${item.slug}---${item.address}`;
|
|
479
|
+
stakingRewardState.data[key] = item;
|
|
480
|
+
});
|
|
481
|
+
stakingRewardState.ready = true;
|
|
482
|
+
this.earningRewardSubject.next(stakingRewardState);
|
|
483
|
+
this.earningsRewardQueue = [];
|
|
484
|
+
});
|
|
479
485
|
}
|
|
480
486
|
async getPoolReward(addresses, callback) {
|
|
481
487
|
let cancel = false;
|
|
@@ -524,6 +530,8 @@ class EarningService {
|
|
|
524
530
|
}, _constants.CRON_REFRESH_STAKING_REWARD_FAST_INTERVAL);
|
|
525
531
|
}
|
|
526
532
|
runUnsubscribeStakingRewardInterval() {
|
|
533
|
+
(0, _utils2.removeLazy)('updateEarningReward');
|
|
534
|
+
this.earningsRewardQueue = [];
|
|
527
535
|
this.earningsRewardInterval && clearInterval(this.earningsRewardInterval);
|
|
528
536
|
}
|
|
529
537
|
async fetchPoolRewardHistory(addresses, callback) {
|
|
@@ -552,11 +560,18 @@ class EarningService {
|
|
|
552
560
|
});
|
|
553
561
|
};
|
|
554
562
|
}
|
|
563
|
+
earningRewardHistoryQueue = [];
|
|
555
564
|
updateEarningRewardHistory(earningRewardHistory) {
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
565
|
+
this.earningRewardHistoryQueue.push(earningRewardHistory);
|
|
566
|
+
(0, _utils2.addLazy)('updateEarningRewardHistory', () => {
|
|
567
|
+
const earningRewardHistoryState = this.earningRewardHistorySubject.getValue();
|
|
568
|
+
this.earningRewardHistoryQueue.forEach(item => {
|
|
569
|
+
const key = `${item.slug}---${item.address}---${item.eventIndex}`;
|
|
570
|
+
earningRewardHistoryState[key] = item;
|
|
571
|
+
});
|
|
572
|
+
this.earningRewardHistorySubject.next(earningRewardHistoryState);
|
|
573
|
+
this.earningRewardHistoryQueue = [];
|
|
574
|
+
}, 300, 1800);
|
|
560
575
|
}
|
|
561
576
|
subscribeEarningRewardHistory() {
|
|
562
577
|
return this.earningRewardHistorySubject;
|
|
@@ -580,6 +595,8 @@ class EarningService {
|
|
|
580
595
|
}, _constants.CRON_REFRESH_EARNING_REWARD_HISTORY_INTERVAL);
|
|
581
596
|
}
|
|
582
597
|
runUnsubscribeEarningRewardHistoryInterval() {
|
|
598
|
+
(0, _utils2.removeLazy)('updateEarningRewardHistory');
|
|
599
|
+
this.earningRewardHistoryQueue = [];
|
|
583
600
|
this.earningsRewardHistoryInterval && clearInterval(this.earningsRewardHistoryInterval);
|
|
584
601
|
}
|
|
585
602
|
|
|
@@ -7,5 +7,5 @@ exports.TRANSACTION_TIMEOUT = void 0;
|
|
|
7
7
|
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
8
8
|
// SPDX-License-Identifier: Apache-2.0
|
|
9
9
|
|
|
10
|
-
const TRANSACTION_TIMEOUT =
|
|
10
|
+
const TRANSACTION_TIMEOUT = 5 * 60 * 1000;
|
|
11
11
|
exports.TRANSACTION_TIMEOUT = TRANSACTION_TIMEOUT;
|
|
@@ -714,7 +714,7 @@ class TransactionService {
|
|
|
714
714
|
this.state.historyService.updateHistoryByExtrinsicHash(id, updateData).catch(console.error);
|
|
715
715
|
console.debug(`Transaction "${id}" is submitted with hash ${extrinsicHash || ''}`);
|
|
716
716
|
const transaction = this.getTransaction(id);
|
|
717
|
-
if ([_KoniTypes.ExtrinsicType.STAKING_JOIN_POOL, _KoniTypes.ExtrinsicType.JOIN_YIELD_POOL, _KoniTypes.ExtrinsicType.MINT_LDOT, _KoniTypes.ExtrinsicType.MINT_QDOT, _KoniTypes.ExtrinsicType.MINT_SDOT, _KoniTypes.ExtrinsicType.MINT_VDOT].includes(transaction.extrinsicType)) {
|
|
717
|
+
if ([_KoniTypes.ExtrinsicType.STAKING_JOIN_POOL, _KoniTypes.ExtrinsicType.STAKING_BOND, _KoniTypes.ExtrinsicType.JOIN_YIELD_POOL, _KoniTypes.ExtrinsicType.MINT_LDOT, _KoniTypes.ExtrinsicType.MINT_QDOT, _KoniTypes.ExtrinsicType.MINT_SDOT, _KoniTypes.ExtrinsicType.MINT_STDOT, _KoniTypes.ExtrinsicType.MINT_VDOT, _KoniTypes.ExtrinsicType.MINT_VMANTA].includes(transaction.extrinsicType)) {
|
|
718
718
|
this.handlePostEarningTransaction(id);
|
|
719
719
|
}
|
|
720
720
|
}
|
package/cjs/utils/eth.js
CHANGED
|
@@ -94,10 +94,19 @@ const calculateGasFeeParams = async (web3, networkKey) => {
|
|
|
94
94
|
}, 0);
|
|
95
95
|
const busyNetwork = blocksBusy >= numBlock / 2; // True if half of block is busy
|
|
96
96
|
|
|
97
|
-
const maxPriorityFeePerGas = history.reward.reduce((previous, rewards) => {
|
|
97
|
+
const maxPriorityFeePerGas = history.reward.reduce((previous, rewards, currentIndex) => {
|
|
98
98
|
const [first, second] = rewards;
|
|
99
|
+
const base = history.baseFeePerGas[currentIndex];
|
|
99
100
|
const firstBN = new _bignumber.default(first);
|
|
100
101
|
const secondBN = new _bignumber.default(second);
|
|
102
|
+
const baseBN = new _bignumber.default(base);
|
|
103
|
+
|
|
104
|
+
// Special for bsc, base and first always 0
|
|
105
|
+
if (baseBN.eq(_number.BN_ZERO) && firstBN.eq(_number.BN_ZERO)) {
|
|
106
|
+
const current = secondBN;
|
|
107
|
+
return current.gte(previous) ? current : previous; // get min priority
|
|
108
|
+
}
|
|
109
|
+
|
|
101
110
|
if (busyNetwork) {
|
|
102
111
|
const current = secondBN.dividedBy(2).gte(firstBN) ? firstBN : secondBN; // second too larger than first (> 2 times), use first else use second
|
|
103
112
|
|
package/koni/api/nft/config.d.ts
CHANGED
|
@@ -11,9 +11,10 @@ export declare const BIT_COUNTRY_LAND_ESTATE_METADATA_API = "https://pioneer-api
|
|
|
11
11
|
export declare const BIT_COUNTRY_THUMBNAIL_RESOLVER = "https://res.cloudinary.com/ddftctzph/image/upload/c_scale,q_100,w_250/production-ipfs/asset/";
|
|
12
12
|
export declare const CF_IPFS_GATEWAY = "https://cf-ipfs.com/ipfs/";
|
|
13
13
|
export declare const PINATA_IPFS_GATEWAY = "https://gateway.pinata.cloud/ipfs/";
|
|
14
|
-
export declare const UNIQUE_SCAN_ENDPOINT = "https://explorer-api.unique.network/v1/graphql";
|
|
15
|
-
export declare const QUARTZ_SCAN_ENDPOINT = "https://hasura-quartz.unique.network/v1/graphql";
|
|
16
14
|
export declare const VARA_SCAN_ENDPOINT = "https://nft-explorer.vara-network.io/graphql";
|
|
15
|
+
export declare const UNIQUE_SCAN_ENDPOINT = "https://api-unique.uniquescan.io/v1/graphql";
|
|
16
|
+
export declare const QUARTZ_SCAN_ENDPOINT = "https://api-quartz.uniquescan.io/v1/graphql";
|
|
17
|
+
export declare const OPAL_SCAN_ENDPOINT = "https://api-opal.uniquescan.io/v1/graphql";
|
|
17
18
|
export declare const UNIQUE_IPFS_GATEWAY = "https://ipfs.unique.network/ipfs/";
|
|
18
19
|
export declare const NFT_STORAGE_GATEWAY = "https://nftstorage.link/ipfs/";
|
|
19
20
|
export declare const IPFS_W3S_LINK = "https://w3s.link/ipfs/";
|
package/koni/api/nft/config.js
CHANGED
|
@@ -21,10 +21,15 @@ export const CF_IPFS_GATEWAY = 'https://cf-ipfs.com/ipfs/';
|
|
|
21
21
|
|
|
22
22
|
// XOrigin
|
|
23
23
|
export const PINATA_IPFS_GATEWAY = 'https://gateway.pinata.cloud/ipfs/';
|
|
24
|
-
export const UNIQUE_SCAN_ENDPOINT = 'https://explorer-api.unique.network/v1/graphql';
|
|
25
|
-
export const QUARTZ_SCAN_ENDPOINT = 'https://hasura-quartz.unique.network/v1/graphql';
|
|
26
|
-
export const VARA_SCAN_ENDPOINT = 'https://nft-explorer.vara-network.io/graphql';
|
|
27
24
|
|
|
25
|
+
// deprecated
|
|
26
|
+
// export const UNIQUE_SCAN_ENDPOINT = 'https://explorer-api.unique.network/v1/graphql';
|
|
27
|
+
// export const QUARTZ_SCAN_ENDPOINT = 'https://hasura-quartz.unique.network/v1/graphql';
|
|
28
|
+
|
|
29
|
+
export const VARA_SCAN_ENDPOINT = 'https://nft-explorer.vara-network.io/graphql';
|
|
30
|
+
export const UNIQUE_SCAN_ENDPOINT = 'https://api-unique.uniquescan.io/v1/graphql';
|
|
31
|
+
export const QUARTZ_SCAN_ENDPOINT = 'https://api-quartz.uniquescan.io/v1/graphql';
|
|
32
|
+
export const OPAL_SCAN_ENDPOINT = 'https://api-opal.uniquescan.io/v1/graphql';
|
|
28
33
|
// GATEWAY
|
|
29
34
|
|
|
30
35
|
export const UNIQUE_IPFS_GATEWAY = 'https://ipfs.unique.network/ipfs/';
|
package/koni/api/nft/index.js
CHANGED
|
@@ -8,7 +8,8 @@ import { KaruraNftApi } from '@subwallet/extension-base/koni/api/nft/karura_nft'
|
|
|
8
8
|
import OrdinalNftApi from '@subwallet/extension-base/koni/api/nft/ordinal_nft';
|
|
9
9
|
import { RmrkNftApi } from '@subwallet/extension-base/koni/api/nft/rmrk_nft';
|
|
10
10
|
import StatemineNftApi from '@subwallet/extension-base/koni/api/nft/statemine_nft';
|
|
11
|
-
import UniqueNftApi from '@subwallet/extension-base/koni/api/nft/
|
|
11
|
+
import { UniqueNftApi } from '@subwallet/extension-base/koni/api/nft/unique_network_nft';
|
|
12
|
+
// import UniqueNftApi from '@subwallet/extension-base/koni/api/nft/unique_nft';
|
|
12
13
|
import { VaraNftApi } from '@subwallet/extension-base/koni/api/nft/vara_nft';
|
|
13
14
|
import { WasmNftApi } from '@subwallet/extension-base/koni/api/nft/wasm_nft';
|
|
14
15
|
import { _NFT_CHAIN_GROUP } from '@subwallet/extension-base/services/chain-service/constants';
|
|
@@ -28,7 +29,7 @@ function createSubstrateNftApi(chain, substrateApi, addresses) {
|
|
|
28
29
|
} else if (_NFT_CHAIN_GROUP.statemint.includes(chain)) {
|
|
29
30
|
return new StatemintNftApi(substrateApi, substrateAddresses, chain);
|
|
30
31
|
} else if (_NFT_CHAIN_GROUP.unique_network.includes(chain)) {
|
|
31
|
-
return new UniqueNftApi(
|
|
32
|
+
return new UniqueNftApi(chain, substrateAddresses);
|
|
32
33
|
} else if (_NFT_CHAIN_GROUP.bitcountry.includes(chain)) {
|
|
33
34
|
return new BitCountryNftApi(substrateApi, substrateAddresses, chain);
|
|
34
35
|
} else if (_NFT_CHAIN_GROUP.vara.includes(chain)) {
|
|
@@ -3,7 +3,6 @@ export declare function isRecipientSelf(currentAddress: string, recipientAddress
|
|
|
3
3
|
export declare function acalaGetExtrinsic(substrateApi: _SubstrateApi, senderAddress: string, recipientAddress: string, params: Record<string, any>): import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult> | null;
|
|
4
4
|
export declare function rmrkGetExtrinsic(substrateApi: _SubstrateApi, senderAddress: string, recipientAddress: string, params: Record<string, any>): import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult> | null;
|
|
5
5
|
export declare function uniqueGetExtrinsic(substrateApi: _SubstrateApi, senderAddress: string, recipientAddress: string, params: Record<string, any>): import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult> | null;
|
|
6
|
-
export declare function quartzGetExtrinsic(substrateApi: _SubstrateApi, senderAddress: string, recipientAddress: string, params: Record<string, any>): import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult> | null;
|
|
7
6
|
export declare function statemineGetExtrinsic(substrateApi: _SubstrateApi, senderAddress: string, recipientAddress: string, params: Record<string, any>): import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult> | null;
|
|
8
7
|
export declare function statemintGetExtrinsic(substrateApi: _SubstrateApi, senderAddress: string, recipientAddress: string, params: Record<string, any>): import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult> | null;
|
|
9
8
|
export declare function getNftTransferExtrinsic(networkKey: string, substrateApi: _SubstrateApi, senderAddress: string, recipientAddress: string, params: Record<string, any>): import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult> | null;
|
package/koni/api/nft/transfer.js
CHANGED
|
@@ -30,18 +30,6 @@ export function rmrkGetExtrinsic(substrateApi, senderAddress, recipientAddress,
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
export function uniqueGetExtrinsic(substrateApi, senderAddress, recipientAddress, params) {
|
|
33
|
-
try {
|
|
34
|
-
const itemId = params.itemId;
|
|
35
|
-
const collectionId = params.collectionId;
|
|
36
|
-
return substrateApi.api.tx.nft.transfer({
|
|
37
|
-
Substrate: recipientAddress
|
|
38
|
-
}, collectionId, itemId, 1);
|
|
39
|
-
} catch (e) {
|
|
40
|
-
console.error(e);
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
export function quartzGetExtrinsic(substrateApi, senderAddress, recipientAddress, params) {
|
|
45
33
|
try {
|
|
46
34
|
const itemId = params.itemId;
|
|
47
35
|
const collectionId = params.collectionId;
|
|
@@ -81,12 +69,13 @@ export function getNftTransferExtrinsic(networkKey, substrateApi, senderAddress,
|
|
|
81
69
|
return acalaGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
82
70
|
case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.kusama:
|
|
83
71
|
return rmrkGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
72
|
+
// temporary prevent send nfts on Unique network-based chains
|
|
73
|
+
// case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.uniqueNft:
|
|
74
|
+
// return uniqueGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
75
|
+
// case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.quartz:
|
|
76
|
+
// return uniqueGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
77
|
+
// case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.opal:
|
|
78
|
+
// return uniqueGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
90
79
|
case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.statemine:
|
|
91
80
|
return statemineGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
92
81
|
case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.statemint:
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { BaseNftApi, HandleNftParams } from '@subwallet/extension-base/koni/api/nft/nft';
|
|
2
|
+
export declare class UniqueNftApi extends BaseNftApi {
|
|
3
|
+
constructor(chain: string, addresses: string[]);
|
|
4
|
+
private handleProperties;
|
|
5
|
+
private static parseNftRequest;
|
|
6
|
+
private getNftByAccount;
|
|
7
|
+
handleNfts(params: HandleNftParams): Promise<void>;
|
|
8
|
+
fetchNfts(params: HandleNftParams): Promise<number>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { OPAL_SCAN_ENDPOINT, QUARTZ_SCAN_ENDPOINT, UNIQUE_SCAN_ENDPOINT } from '@subwallet/extension-base/koni/api/nft/config';
|
|
5
|
+
import { BaseNftApi } from '@subwallet/extension-base/koni/api/nft/nft';
|
|
6
|
+
import fetch from 'cross-fetch';
|
|
7
|
+
import { decodeAddress, encodeAddress } from '@polkadot/util-crypto';
|
|
8
|
+
export class UniqueNftApi extends BaseNftApi {
|
|
9
|
+
constructor(chain, addresses) {
|
|
10
|
+
super(chain, undefined, addresses);
|
|
11
|
+
}
|
|
12
|
+
handleProperties(nft) {
|
|
13
|
+
const propertiesMap = {};
|
|
14
|
+
const attRecord = nft.attributes;
|
|
15
|
+
if (attRecord) {
|
|
16
|
+
for (const item in attRecord) {
|
|
17
|
+
if (attRecord[item].name._.toLowerCase() === 'traits') {
|
|
18
|
+
const traits = [];
|
|
19
|
+
const traitValues = attRecord[item].value;
|
|
20
|
+
for (const trait in traitValues) {
|
|
21
|
+
traits.push(traitValues[trait]._);
|
|
22
|
+
}
|
|
23
|
+
propertiesMap.traits = {
|
|
24
|
+
value: traits
|
|
25
|
+
};
|
|
26
|
+
} else {
|
|
27
|
+
propertiesMap[attRecord[item].name._] = {
|
|
28
|
+
value: attRecord[item].value._
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return propertiesMap;
|
|
34
|
+
}
|
|
35
|
+
static parseNftRequest(uniqueAddress) {
|
|
36
|
+
return {
|
|
37
|
+
query: `
|
|
38
|
+
query {
|
|
39
|
+
tokens(
|
|
40
|
+
limit: 99999
|
|
41
|
+
offset: 0
|
|
42
|
+
where: { owner: { _eq: "${uniqueAddress}" }, burned: { _eq: "false" }})
|
|
43
|
+
{
|
|
44
|
+
data {
|
|
45
|
+
collection_id
|
|
46
|
+
collection_name
|
|
47
|
+
collection_description
|
|
48
|
+
collection_cover
|
|
49
|
+
token_id
|
|
50
|
+
token_name
|
|
51
|
+
image
|
|
52
|
+
attributes
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
`
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
async getNftByAccount(address) {
|
|
60
|
+
var _result$data, _result$data$tokens;
|
|
61
|
+
let endpoint = '';
|
|
62
|
+
let uniqueAddress = '';
|
|
63
|
+
|
|
64
|
+
// Use exactly endpoint for each network
|
|
65
|
+
if (['unique_network'].includes(this.chain)) {
|
|
66
|
+
endpoint = UNIQUE_SCAN_ENDPOINT;
|
|
67
|
+
uniqueAddress = encodeAddress(decodeAddress(address), 7391);
|
|
68
|
+
// Unique network prefix: 7391
|
|
69
|
+
} else if (['quartz'].includes(this.chain)) {
|
|
70
|
+
endpoint = QUARTZ_SCAN_ENDPOINT;
|
|
71
|
+
uniqueAddress = encodeAddress(decodeAddress(address), 255);
|
|
72
|
+
// Quartz prefix: 255
|
|
73
|
+
} else if (['opal'].includes(this.chain)) {
|
|
74
|
+
endpoint = OPAL_SCAN_ENDPOINT;
|
|
75
|
+
uniqueAddress = address;
|
|
76
|
+
// Opal address: Normal address
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const resp = await fetch(endpoint, {
|
|
80
|
+
method: 'post',
|
|
81
|
+
headers: {
|
|
82
|
+
'Content-Type': 'application/json'
|
|
83
|
+
},
|
|
84
|
+
body: JSON.stringify(UniqueNftApi.parseNftRequest(uniqueAddress))
|
|
85
|
+
});
|
|
86
|
+
const result = await resp.json();
|
|
87
|
+
|
|
88
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
89
|
+
return result === null || result === void 0 ? void 0 : (_result$data = result.data) === null || _result$data === void 0 ? void 0 : (_result$data$tokens = _result$data.tokens) === null || _result$data$tokens === void 0 ? void 0 : _result$data$tokens.data;
|
|
90
|
+
}
|
|
91
|
+
async handleNfts(params) {
|
|
92
|
+
try {
|
|
93
|
+
await Promise.all(this.addresses.map(async address => {
|
|
94
|
+
const nfts = await this.getNftByAccount(address);
|
|
95
|
+
if (nfts) {
|
|
96
|
+
const collectionMap = {};
|
|
97
|
+
for (const nft of nfts) {
|
|
98
|
+
var _nft$image;
|
|
99
|
+
// Handle case rendering image on Quartz Network (Temporary solution)
|
|
100
|
+
if (this.chain === 'quartz' && nft.collection_id.toString() === '141') {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Handle properties
|
|
105
|
+
const propertiesMap = this.handleProperties(nft);
|
|
106
|
+
|
|
107
|
+
// Update Nft information
|
|
108
|
+
const parsedNft = {
|
|
109
|
+
id: nft.token_id.toString(),
|
|
110
|
+
chain: this.chain,
|
|
111
|
+
owner: address,
|
|
112
|
+
name: nft.token_name,
|
|
113
|
+
image: this.parseUrl((_nft$image = nft.image) === null || _nft$image === void 0 ? void 0 : _nft$image.fullUrl),
|
|
114
|
+
description: nft.collection_description,
|
|
115
|
+
collectionId: nft.collection_id.toString(),
|
|
116
|
+
properties: propertiesMap
|
|
117
|
+
};
|
|
118
|
+
params.updateItem(this.chain, parsedNft, address);
|
|
119
|
+
|
|
120
|
+
// Update Collection information
|
|
121
|
+
if (!collectionMap[nft.collection_id.toString()]) {
|
|
122
|
+
const parsedCollection = {
|
|
123
|
+
collectionId: nft.collection_id.toString(),
|
|
124
|
+
chain: this.chain,
|
|
125
|
+
collectionName: nft.collection_name,
|
|
126
|
+
image: this.parseUrl(nft.collection_cover)
|
|
127
|
+
};
|
|
128
|
+
collectionMap[nft.collection_id.toString()] = parsedCollection;
|
|
129
|
+
params.updateCollection(this.chain, parsedCollection);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}));
|
|
134
|
+
} catch (e) {
|
|
135
|
+
console.error(`Failed to fetch ${this.chain} nft`, e);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async fetchNfts(params) {
|
|
139
|
+
try {
|
|
140
|
+
await this.handleNfts(params);
|
|
141
|
+
} catch (e) {
|
|
142
|
+
return 0;
|
|
143
|
+
}
|
|
144
|
+
return 1;
|
|
145
|
+
}
|
|
146
|
+
}
|
package/package.json
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"./cjs/detectPackage.js"
|
|
18
18
|
],
|
|
19
19
|
"type": "module",
|
|
20
|
-
"version": "1.1.
|
|
20
|
+
"version": "1.1.36-0",
|
|
21
21
|
"main": "./cjs/index.js",
|
|
22
22
|
"module": "./index.js",
|
|
23
23
|
"types": "./index.d.ts",
|
|
@@ -269,6 +269,11 @@
|
|
|
269
269
|
"require": "./cjs/koni/api/nft/transfer.js",
|
|
270
270
|
"default": "./koni/api/nft/transfer.js"
|
|
271
271
|
},
|
|
272
|
+
"./koni/api/nft/unique_network_nft": {
|
|
273
|
+
"types": "./koni/api/nft/unique_network_nft/index.d.ts",
|
|
274
|
+
"require": "./cjs/koni/api/nft/unique_network_nft/index.js",
|
|
275
|
+
"default": "./koni/api/nft/unique_network_nft/index.js"
|
|
276
|
+
},
|
|
272
277
|
"./koni/api/nft/unique_nft": {
|
|
273
278
|
"types": "./koni/api/nft/unique_nft/index.d.ts",
|
|
274
279
|
"require": "./cjs/koni/api/nft/unique_nft/index.js",
|
|
@@ -1731,11 +1736,11 @@
|
|
|
1731
1736
|
"@reduxjs/toolkit": "^1.9.1",
|
|
1732
1737
|
"@sora-substrate/type-definitions": "^1.17.7",
|
|
1733
1738
|
"@substrate/connect": "^0.7.26",
|
|
1734
|
-
"@subwallet/chain-list": "0.2.40
|
|
1735
|
-
"@subwallet/extension-base": "^1.1.
|
|
1736
|
-
"@subwallet/extension-chains": "^1.1.
|
|
1737
|
-
"@subwallet/extension-dapp": "^1.1.
|
|
1738
|
-
"@subwallet/extension-inject": "^1.1.
|
|
1739
|
+
"@subwallet/chain-list": "0.2.40",
|
|
1740
|
+
"@subwallet/extension-base": "^1.1.36-0",
|
|
1741
|
+
"@subwallet/extension-chains": "^1.1.36-0",
|
|
1742
|
+
"@subwallet/extension-dapp": "^1.1.36-0",
|
|
1743
|
+
"@subwallet/extension-inject": "^1.1.36-0",
|
|
1739
1744
|
"@subwallet/keyring": "^0.1.3",
|
|
1740
1745
|
"@subwallet/ui-keyring": "^0.1.3",
|
|
1741
1746
|
"@walletconnect/sign-client": "^2.8.4",
|
|
@@ -1772,4 +1777,4 @@
|
|
|
1772
1777
|
"web3-eth-contract": "^1.10.0",
|
|
1773
1778
|
"web3-utils": "^1.10.0"
|
|
1774
1779
|
}
|
|
1775
|
-
}
|
|
1780
|
+
}
|
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.1.
|
|
10
|
+
version: '1.1.36-0'
|
|
11
11
|
};
|
|
@@ -39,7 +39,7 @@ export class BalanceService {
|
|
|
39
39
|
if (!chainInfo || !chainState || !chainState.active) {
|
|
40
40
|
return Promise.reject(new BalanceError(BalanceErrorType.NETWORK_ERROR, t('{{chain}} is inactive. Please enable network', {
|
|
41
41
|
replace: {
|
|
42
|
-
chain
|
|
42
|
+
chain: chainInfo.name
|
|
43
43
|
}
|
|
44
44
|
})));
|
|
45
45
|
}
|
|
@@ -45,7 +45,7 @@ export const _NFT_CHAIN_GROUP = {
|
|
|
45
45
|
rmrk: ['kusama'],
|
|
46
46
|
statemine: ['statemine'],
|
|
47
47
|
statemint: ['statemint'],
|
|
48
|
-
unique_network: ['unique_network'],
|
|
48
|
+
unique_network: ['unique_network', 'quartz', 'opal'],
|
|
49
49
|
bitcountry: ['bitcountry', 'pioneer'],
|
|
50
50
|
vara: ['vara_network']
|
|
51
51
|
};
|
|
@@ -11,7 +11,7 @@ import { _CHAIN_VALIDATION_ERROR } from '@subwallet/extension-base/services/chai
|
|
|
11
11
|
import { _ChainConnectionStatus, _CUSTOM_PREFIX, _NFT_CONTRACT_STANDARDS, _SMART_CONTRACT_STANDARDS } from '@subwallet/extension-base/services/chain-service/types';
|
|
12
12
|
import { _isAssetFungibleToken, _isChainEnabled, _isCustomAsset, _isCustomChain, _isCustomProvider, _isEqualContractAddress, _isEqualSmartContractAsset, _isMantaZkAsset, _isPureEvmChain, _isPureSubstrateChain, _parseAssetRefKey, randomizeProvider, updateLatestChainInfo } from '@subwallet/extension-base/services/chain-service/utils';
|
|
13
13
|
import AssetSettingStore from '@subwallet/extension-base/stores/AssetSetting';
|
|
14
|
-
import { fetchStaticData, MODULE_SUPPORT } from '@subwallet/extension-base/utils';
|
|
14
|
+
import { addLazy, fetchStaticData, MODULE_SUPPORT } from '@subwallet/extension-base/utils';
|
|
15
15
|
import { BehaviorSubject, Subject } from 'rxjs';
|
|
16
16
|
import Web3 from 'web3';
|
|
17
17
|
import { logger as createLogger } from '@polkadot/util/logger';
|
|
@@ -403,7 +403,6 @@ export class ChainService {
|
|
|
403
403
|
|
|
404
404
|
await this.initChains();
|
|
405
405
|
this.chainInfoMapSubject.next(this.getChainInfoMap());
|
|
406
|
-
this.updateChainStateMapSubscription();
|
|
407
406
|
this.assetRegistrySubject.next(this.getAssetRegistry());
|
|
408
407
|
this.xcmRefMapSubject.next(this.dataMap.assetRefMap);
|
|
409
408
|
await this.initApis();
|
|
@@ -911,7 +910,9 @@ export class ChainService {
|
|
|
911
910
|
}
|
|
912
911
|
}
|
|
913
912
|
updateChainStateMapSubscription() {
|
|
914
|
-
|
|
913
|
+
addLazy('updateChainStateMapSubscription', () => {
|
|
914
|
+
this.chainStateMapSubject.next(this.getChainStateMap());
|
|
915
|
+
}, 300, 900);
|
|
915
916
|
}
|
|
916
917
|
updateChainInfoMapSubscription() {
|
|
917
918
|
this.chainInfoMapSubject.next(this.getChainInfoMap());
|
|
@@ -53,7 +53,6 @@ export default class EarningService implements StoppableServiceInterface, Persis
|
|
|
53
53
|
subscribeYieldPosition(): BehaviorSubject<YieldPositionInfo[]>;
|
|
54
54
|
getYieldPositionInfo(): Promise<YieldPositionInfo[]>;
|
|
55
55
|
yieldPositionPersistQueue: YieldPositionInfo[];
|
|
56
|
-
resetYieldPositionQueue(): void;
|
|
57
56
|
resetYieldPosition(): Promise<void>;
|
|
58
57
|
private _getYieldPositionKey;
|
|
59
58
|
updateYieldPosition(data: YieldPositionInfo): void;
|
|
@@ -61,6 +60,7 @@ export default class EarningService implements StoppableServiceInterface, Persis
|
|
|
61
60
|
private yieldPositionUnsub;
|
|
62
61
|
runSubscribePoolsPosition(): Promise<void>;
|
|
63
62
|
runUnsubscribePoolsPosition(): void;
|
|
63
|
+
earningsRewardQueue: EarningRewardItem[];
|
|
64
64
|
updateEarningReward(stakingRewardData: EarningRewardItem): void;
|
|
65
65
|
getPoolReward(addresses: string[], callback: (result: EarningRewardItem) => void): Promise<VoidFunction>;
|
|
66
66
|
subscribeEarningReward(): BehaviorSubject<EarningRewardJson>;
|
|
@@ -69,6 +69,7 @@ export default class EarningService implements StoppableServiceInterface, Persis
|
|
|
69
69
|
runSubscribeStakingRewardInterval(): void;
|
|
70
70
|
runUnsubscribeStakingRewardInterval(): void;
|
|
71
71
|
fetchPoolRewardHistory(addresses: string[], callback: (result: EarningRewardHistoryItem) => void): Promise<VoidFunction>;
|
|
72
|
+
private earningRewardHistoryQueue;
|
|
72
73
|
updateEarningRewardHistory(earningRewardHistory: EarningRewardHistoryItem): void;
|
|
73
74
|
subscribeEarningRewardHistory(): BehaviorSubject<Record<string, EarningRewardHistoryItem>>;
|
|
74
75
|
getEarningRewardHistory(): Record<string, EarningRewardHistoryItem>;
|
|
@@ -9,7 +9,7 @@ import { _isChainEvmCompatible } from '@subwallet/extension-base/services/chain-
|
|
|
9
9
|
import { _STAKING_CHAIN_GROUP } from '@subwallet/extension-base/services/earning-service/constants';
|
|
10
10
|
import BaseLiquidStakingPoolHandler from '@subwallet/extension-base/services/earning-service/handlers/liquid-staking/base';
|
|
11
11
|
import { YieldPoolType } from '@subwallet/extension-base/types';
|
|
12
|
-
import { addLazy, categoryAddresses, createPromiseHandler } from '@subwallet/extension-base/utils';
|
|
12
|
+
import { addLazy, categoryAddresses, createPromiseHandler, removeLazy } from '@subwallet/extension-base/utils';
|
|
13
13
|
import { fetchStaticCache } from '@subwallet/extension-base/utils/fetchStaticCache';
|
|
14
14
|
import { BehaviorSubject } from 'rxjs';
|
|
15
15
|
import { AcalaLiquidStakingPoolHandler, AmplitudeNativeStakingPoolHandler, AstarNativeStakingPoolHandler, BifrostLiquidStakingPoolHandler, BifrostMantaLiquidStakingPoolHandler, InterlayLendingPoolHandler, NominationPoolHandler, ParallelLiquidStakingPoolHandler, ParaNativeStakingPoolHandler, RelayNativeStakingPoolHandler, StellaSwapLiquidStakingPoolHandler } from "./handlers/index.js";
|
|
@@ -402,12 +402,10 @@ export default class EarningService {
|
|
|
402
402
|
return Promise.resolve(this.yieldPositionListSubject.getValue());
|
|
403
403
|
}
|
|
404
404
|
yieldPositionPersistQueue = [];
|
|
405
|
-
resetYieldPositionQueue() {
|
|
406
|
-
this.yieldPositionPersistQueue = [];
|
|
407
|
-
}
|
|
408
405
|
async resetYieldPosition() {
|
|
409
406
|
this.yieldPositionSubject.next({});
|
|
410
407
|
this.yieldPositionPersistQueue = [];
|
|
408
|
+
removeLazy('persistYieldPositionInfo');
|
|
411
409
|
await this.dbService.stores.yieldPosition.clear();
|
|
412
410
|
}
|
|
413
411
|
_getYieldPositionKey(slug, address) {
|
|
@@ -453,6 +451,7 @@ export default class EarningService {
|
|
|
453
451
|
runUnsubscribePoolsPosition() {
|
|
454
452
|
var _this$yieldPositionUn;
|
|
455
453
|
(_this$yieldPositionUn = this.yieldPositionUnsub) === null || _this$yieldPositionUn === void 0 ? void 0 : _this$yieldPositionUn.call(this);
|
|
454
|
+
removeLazy('persistYieldPositionInfo');
|
|
456
455
|
this.yieldPositionPersistQueue = [];
|
|
457
456
|
}
|
|
458
457
|
|
|
@@ -460,12 +459,19 @@ export default class EarningService {
|
|
|
460
459
|
|
|
461
460
|
/* Get pools' reward */
|
|
462
461
|
|
|
462
|
+
earningsRewardQueue = [];
|
|
463
463
|
updateEarningReward(stakingRewardData) {
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
464
|
+
this.earningsRewardQueue.push(stakingRewardData);
|
|
465
|
+
addLazy('updateEarningReward', () => {
|
|
466
|
+
const stakingRewardState = this.earningRewardSubject.getValue();
|
|
467
|
+
this.earningsRewardQueue.forEach(item => {
|
|
468
|
+
const key = `${item.slug}---${item.address}`;
|
|
469
|
+
stakingRewardState.data[key] = item;
|
|
470
|
+
});
|
|
471
|
+
stakingRewardState.ready = true;
|
|
472
|
+
this.earningRewardSubject.next(stakingRewardState);
|
|
473
|
+
this.earningsRewardQueue = [];
|
|
474
|
+
});
|
|
469
475
|
}
|
|
470
476
|
async getPoolReward(addresses, callback) {
|
|
471
477
|
let cancel = false;
|
|
@@ -514,6 +520,8 @@ export default class EarningService {
|
|
|
514
520
|
}, CRON_REFRESH_STAKING_REWARD_FAST_INTERVAL);
|
|
515
521
|
}
|
|
516
522
|
runUnsubscribeStakingRewardInterval() {
|
|
523
|
+
removeLazy('updateEarningReward');
|
|
524
|
+
this.earningsRewardQueue = [];
|
|
517
525
|
this.earningsRewardInterval && clearInterval(this.earningsRewardInterval);
|
|
518
526
|
}
|
|
519
527
|
async fetchPoolRewardHistory(addresses, callback) {
|
|
@@ -542,11 +550,18 @@ export default class EarningService {
|
|
|
542
550
|
});
|
|
543
551
|
};
|
|
544
552
|
}
|
|
553
|
+
earningRewardHistoryQueue = [];
|
|
545
554
|
updateEarningRewardHistory(earningRewardHistory) {
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
555
|
+
this.earningRewardHistoryQueue.push(earningRewardHistory);
|
|
556
|
+
addLazy('updateEarningRewardHistory', () => {
|
|
557
|
+
const earningRewardHistoryState = this.earningRewardHistorySubject.getValue();
|
|
558
|
+
this.earningRewardHistoryQueue.forEach(item => {
|
|
559
|
+
const key = `${item.slug}---${item.address}---${item.eventIndex}`;
|
|
560
|
+
earningRewardHistoryState[key] = item;
|
|
561
|
+
});
|
|
562
|
+
this.earningRewardHistorySubject.next(earningRewardHistoryState);
|
|
563
|
+
this.earningRewardHistoryQueue = [];
|
|
564
|
+
}, 300, 1800);
|
|
550
565
|
}
|
|
551
566
|
subscribeEarningRewardHistory() {
|
|
552
567
|
return this.earningRewardHistorySubject;
|
|
@@ -570,6 +585,8 @@ export default class EarningService {
|
|
|
570
585
|
}, CRON_REFRESH_EARNING_REWARD_HISTORY_INTERVAL);
|
|
571
586
|
}
|
|
572
587
|
runUnsubscribeEarningRewardHistoryInterval() {
|
|
588
|
+
removeLazy('updateEarningRewardHistory');
|
|
589
|
+
this.earningRewardHistoryQueue = [];
|
|
573
590
|
this.earningsRewardHistoryInterval && clearInterval(this.earningsRewardHistoryInterval);
|
|
574
591
|
}
|
|
575
592
|
|
|
@@ -704,7 +704,7 @@ export default class TransactionService {
|
|
|
704
704
|
this.state.historyService.updateHistoryByExtrinsicHash(id, updateData).catch(console.error);
|
|
705
705
|
console.debug(`Transaction "${id}" is submitted with hash ${extrinsicHash || ''}`);
|
|
706
706
|
const transaction = this.getTransaction(id);
|
|
707
|
-
if ([ExtrinsicType.STAKING_JOIN_POOL, ExtrinsicType.JOIN_YIELD_POOL, ExtrinsicType.MINT_LDOT, ExtrinsicType.MINT_QDOT, ExtrinsicType.MINT_SDOT, ExtrinsicType.MINT_VDOT].includes(transaction.extrinsicType)) {
|
|
707
|
+
if ([ExtrinsicType.STAKING_JOIN_POOL, ExtrinsicType.STAKING_BOND, ExtrinsicType.JOIN_YIELD_POOL, ExtrinsicType.MINT_LDOT, ExtrinsicType.MINT_QDOT, ExtrinsicType.MINT_SDOT, ExtrinsicType.MINT_STDOT, ExtrinsicType.MINT_VDOT, ExtrinsicType.MINT_VMANTA].includes(transaction.extrinsicType)) {
|
|
708
708
|
this.handlePostEarningTransaction(id);
|
|
709
709
|
}
|
|
710
710
|
}
|
package/utils/eth.js
CHANGED
|
@@ -82,10 +82,19 @@ export const calculateGasFeeParams = async (web3, networkKey) => {
|
|
|
82
82
|
}, 0);
|
|
83
83
|
const busyNetwork = blocksBusy >= numBlock / 2; // True if half of block is busy
|
|
84
84
|
|
|
85
|
-
const maxPriorityFeePerGas = history.reward.reduce((previous, rewards) => {
|
|
85
|
+
const maxPriorityFeePerGas = history.reward.reduce((previous, rewards, currentIndex) => {
|
|
86
86
|
const [first, second] = rewards;
|
|
87
|
+
const base = history.baseFeePerGas[currentIndex];
|
|
87
88
|
const firstBN = new BigN(first);
|
|
88
89
|
const secondBN = new BigN(second);
|
|
90
|
+
const baseBN = new BigN(base);
|
|
91
|
+
|
|
92
|
+
// Special for bsc, base and first always 0
|
|
93
|
+
if (baseBN.eq(BN_ZERO) && firstBN.eq(BN_ZERO)) {
|
|
94
|
+
const current = secondBN;
|
|
95
|
+
return current.gte(previous) ? current : previous; // get min priority
|
|
96
|
+
}
|
|
97
|
+
|
|
89
98
|
if (busyNetwork) {
|
|
90
99
|
const current = secondBN.dividedBy(2).gte(firstBN) ? firstBN : secondBN; // second too larger than first (> 2 times), use first else use second
|
|
91
100
|
|
package/cjs/utils/yield/index.js
DELETED