@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.
@@ -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 UNIQUE_SCAN_ENDPOINT = 'https://explorer-api.unique.network/v1/graphql';
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://hasura-quartz.unique.network/v1/graphql';
53
+ const QUARTZ_SCAN_ENDPOINT = 'https://api-quartz.uniquescan.io/v1/graphql';
48
54
  exports.QUARTZ_SCAN_ENDPOINT = QUARTZ_SCAN_ENDPOINT;
49
- const VARA_SCAN_ENDPOINT = 'https://nft-explorer.vara-network.io/graphql';
50
-
55
+ const OPAL_SCAN_ENDPOINT = 'https://api-opal.uniquescan.io/v1/graphql';
51
56
  // GATEWAY
52
- exports.VARA_SCAN_ENDPOINT = VARA_SCAN_ENDPOINT;
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 _unique_nft = _interopRequireDefault(require("@subwallet/extension-base/koni/api/nft/unique_nft"));
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 _unique_nft.default(substrateApi, substrateAddresses, chain);
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
- case _config.SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.uniqueNft:
98
- return uniqueGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
99
- case _config.SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.quartz:
100
- return quartzGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
101
- case _config.SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.opal:
102
- return quartzGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
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;
@@ -13,6 +13,6 @@ const packageInfo = {
13
13
  name: '@subwallet/extension-base',
14
14
  path: typeof __dirname === 'string' ? __dirname : 'auto',
15
15
  type: 'cjs',
16
- version: '1.1.35-0'
16
+ version: '1.1.36-0'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -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
- this.chainStateMapSubject.next(this.getChainStateMap());
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
- const stakingRewardState = this.earningRewardSubject.getValue();
475
- stakingRewardState.ready = true;
476
- const key = `${stakingRewardData.slug}---${stakingRewardData.address}`;
477
- stakingRewardState.data[key] = stakingRewardData;
478
- this.earningRewardSubject.next(stakingRewardState);
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
- const earningRewardHistoryState = this.earningRewardHistorySubject.getValue();
557
- const key = `${earningRewardHistory.slug}---${earningRewardHistory.address}---${earningRewardHistory.eventIndex}`;
558
- earningRewardHistoryState[key] = earningRewardHistory;
559
- this.earningRewardHistorySubject.next(earningRewardHistoryState);
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 = 2 * 60 * 1000;
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
 
@@ -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/";
@@ -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/';
@@ -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/unique_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(substrateApi, substrateAddresses, chain);
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;
@@ -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
- case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.uniqueNft:
85
- return uniqueGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
86
- case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.quartz:
87
- return quartzGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
88
- case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.opal:
89
- return quartzGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
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.35-beta.3",
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-beta.2",
1735
- "@subwallet/extension-base": "^1.1.35-0",
1736
- "@subwallet/extension-chains": "^1.1.35-0",
1737
- "@subwallet/extension-dapp": "^1.1.35-0",
1738
- "@subwallet/extension-inject": "^1.1.35-0",
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.35-0'
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
- this.chainStateMapSubject.next(this.getChainStateMap());
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
- const stakingRewardState = this.earningRewardSubject.getValue();
465
- stakingRewardState.ready = true;
466
- const key = `${stakingRewardData.slug}---${stakingRewardData.address}`;
467
- stakingRewardState.data[key] = stakingRewardData;
468
- this.earningRewardSubject.next(stakingRewardState);
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
- const earningRewardHistoryState = this.earningRewardHistorySubject.getValue();
547
- const key = `${earningRewardHistory.slug}---${earningRewardHistory.address}---${earningRewardHistory.eventIndex}`;
548
- earningRewardHistoryState[key] = earningRewardHistory;
549
- this.earningRewardHistorySubject.next(earningRewardHistoryState);
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
 
@@ -1,4 +1,4 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-base authors & contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- export const TRANSACTION_TIMEOUT = 2 * 60 * 1000;
4
+ export const TRANSACTION_TIMEOUT = 5 * 60 * 1000;
@@ -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
 
@@ -1,3 +0,0 @@
1
- // Copyright 2019-2022 @subwallet/extension-base
2
- // SPDX-License-Identifier: Apache-2.0
3
- "use strict";