@subwallet/extension-base 1.0.2-2 → 1.0.2-3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/background/KoniTypes.d.ts +46 -38
  2. package/background/KoniTypes.js +8 -8
  3. package/background/errors/TransactionError.js +25 -1
  4. package/background/types.d.ts +10 -5
  5. package/cjs/background/KoniTypes.js +8 -8
  6. package/cjs/background/errors/TransactionError.js +24 -0
  7. package/cjs/constants/index.js +8 -26
  8. package/cjs/koni/api/dotsama/balance.js +49 -224
  9. package/cjs/koni/api/dotsama/transfer.js +34 -39
  10. package/cjs/koni/api/nft/acala_nft/index.js +7 -7
  11. package/cjs/koni/api/nft/bit.country/index.js +7 -6
  12. package/cjs/koni/api/nft/evm_nft/index.js +8 -3
  13. package/cjs/koni/api/nft/index.js +3 -6
  14. package/cjs/koni/api/nft/karura_nft/index.js +7 -6
  15. package/cjs/koni/api/nft/rmrk_nft/index.js +11 -1
  16. package/cjs/koni/api/nft/statemine_nft/index.js +7 -6
  17. package/cjs/koni/api/nft/unique_nft/index.js +5 -1
  18. package/cjs/koni/api/nft/wasm_nft/index.js +170 -111
  19. package/cjs/koni/api/nft/wasm_nft/utils.js +11 -7
  20. package/cjs/koni/api/staking/bonding/amplitude.js +13 -9
  21. package/cjs/koni/api/staking/bonding/astar.js +15 -13
  22. package/cjs/koni/api/staking/bonding/index.js +22 -10
  23. package/cjs/koni/api/staking/bonding/paraChain.js +85 -2
  24. package/cjs/koni/api/staking/bonding/relayChain.js +122 -16
  25. package/cjs/koni/api/staking/bonding/utils.js +27 -8
  26. package/cjs/koni/api/tokens/wasm/index.js +5 -4
  27. package/cjs/koni/api/tokens/wasm/utils.js +63 -0
  28. package/cjs/koni/api/xcm/polkadotXcm.js +1 -1
  29. package/cjs/koni/api/xcm/utils.js +18 -13
  30. package/cjs/koni/api/xcm/xTokens.js +1 -1
  31. package/cjs/koni/api/xcm/xcmPallet.js +9 -6
  32. package/cjs/koni/background/cron.js +171 -61
  33. package/cjs/koni/background/handlers/Extension.js +382 -207
  34. package/cjs/koni/background/handlers/State.js +41 -33
  35. package/cjs/koni/background/handlers/Tabs.js +50 -17
  36. package/cjs/koni/background/subscription.js +32 -29
  37. package/cjs/packageInfo.js +1 -1
  38. package/cjs/services/chain-service/handler/SubstrateChainHandler.js +13 -8
  39. package/cjs/services/chain-service/index.js +59 -45
  40. package/cjs/services/event-service/index.js +5 -1
  41. package/cjs/services/event-service/types.js +11 -1
  42. package/cjs/services/history-service/index.js +19 -13
  43. package/cjs/services/history-service/subsquid-multi-chain-history.js +13 -10
  44. package/cjs/services/keyring-service/index.js +11 -13
  45. package/cjs/services/price-service/coingecko.js +0 -1
  46. package/cjs/services/price-service/index.js +2 -3
  47. package/cjs/services/request-service/handler/AuthRequestHandler.js +13 -7
  48. package/cjs/services/request-service/handler/EvmRequestHandler.js +8 -12
  49. package/cjs/services/request-service/index.js +14 -5
  50. package/cjs/services/storage-service/DatabaseService.js +56 -34
  51. package/cjs/services/storage-service/db-stores/Nft.js +7 -15
  52. package/cjs/services/transaction-service/event-parser/index.js +20 -48
  53. package/cjs/services/transaction-service/index.js +26 -15
  54. package/cjs/utils/address.js +10 -1
  55. package/cjs/utils/index.js +9 -15
  56. package/constants/index.d.ts +7 -13
  57. package/constants/index.js +7 -13
  58. package/koni/api/dotsama/balance.d.ts +0 -1
  59. package/koni/api/dotsama/balance.js +22 -197
  60. package/koni/api/dotsama/transfer.js +11 -16
  61. package/koni/api/nft/acala_nft/index.js +7 -7
  62. package/koni/api/nft/bit.country/index.js +7 -6
  63. package/koni/api/nft/evm_nft/index.js +7 -3
  64. package/koni/api/nft/index.d.ts +1 -2
  65. package/koni/api/nft/index.js +3 -6
  66. package/koni/api/nft/karura_nft/index.js +7 -6
  67. package/koni/api/nft/nft.d.ts +1 -0
  68. package/koni/api/nft/rmrk_nft/index.js +11 -1
  69. package/koni/api/nft/statemine_nft/index.js +7 -6
  70. package/koni/api/nft/unique_nft/index.js +5 -1
  71. package/koni/api/nft/wasm_nft/index.d.ts +0 -2
  72. package/koni/api/nft/wasm_nft/index.js +168 -109
  73. package/koni/api/nft/wasm_nft/utils.d.ts +7 -5
  74. package/koni/api/nft/wasm_nft/utils.js +7 -5
  75. package/koni/api/staking/bonding/amplitude.d.ts +0 -1
  76. package/koni/api/staking/bonding/amplitude.js +15 -10
  77. package/koni/api/staking/bonding/astar.js +8 -6
  78. package/koni/api/staking/bonding/index.d.ts +4 -1
  79. package/koni/api/staking/bonding/index.js +23 -13
  80. package/koni/api/staking/bonding/paraChain.d.ts +3 -0
  81. package/koni/api/staking/bonding/paraChain.js +86 -5
  82. package/koni/api/staking/bonding/relayChain.d.ts +5 -1
  83. package/koni/api/staking/bonding/relayChain.js +121 -18
  84. package/koni/api/staking/bonding/utils.d.ts +3 -2
  85. package/koni/api/staking/bonding/utils.js +27 -9
  86. package/koni/api/tokens/wasm/index.js +5 -4
  87. package/koni/api/tokens/wasm/utils.d.ts +6 -0
  88. package/koni/api/tokens/wasm/utils.js +54 -0
  89. package/koni/api/xcm/polkadotXcm.js +2 -2
  90. package/koni/api/xcm/utils.d.ts +5 -6
  91. package/koni/api/xcm/utils.js +15 -10
  92. package/koni/api/xcm/xTokens.js +2 -2
  93. package/koni/api/xcm/xcmPallet.js +10 -9
  94. package/koni/background/cron.d.ts +6 -1
  95. package/koni/background/cron.js +172 -62
  96. package/koni/background/handlers/Extension.d.ts +8 -3
  97. package/koni/background/handlers/Extension.js +297 -126
  98. package/koni/background/handlers/State.d.ts +5 -6
  99. package/koni/background/handlers/State.js +43 -33
  100. package/koni/background/handlers/Tabs.js +50 -17
  101. package/koni/background/subscription.js +31 -30
  102. package/package.json +18 -13
  103. package/packageInfo.js +1 -1
  104. package/services/chain-service/handler/SubstrateChainHandler.js +14 -9
  105. package/services/chain-service/helper/psp22_abi.json +1041 -881
  106. package/services/chain-service/helper/psp34_abi.json +2963 -1807
  107. package/services/chain-service/index.d.ts +3 -2
  108. package/services/chain-service/index.js +53 -40
  109. package/services/chain-service/types.d.ts +1 -0
  110. package/services/event-service/index.js +5 -1
  111. package/services/event-service/types.d.ts +5 -9
  112. package/services/event-service/types.js +4 -1
  113. package/services/history-service/index.d.ts +4 -2
  114. package/services/history-service/index.js +19 -13
  115. package/services/history-service/subsquid-multi-chain-history.js +16 -12
  116. package/services/keyring-service/index.d.ts +4 -2
  117. package/services/keyring-service/index.js +11 -13
  118. package/services/price-service/coingecko.js +0 -1
  119. package/services/price-service/index.js +2 -3
  120. package/services/request-service/handler/AuthRequestHandler.d.ts +3 -1
  121. package/services/request-service/handler/AuthRequestHandler.js +13 -7
  122. package/services/request-service/handler/EvmRequestHandler.js +8 -12
  123. package/services/request-service/index.d.ts +3 -1
  124. package/services/request-service/index.js +14 -5
  125. package/services/storage-service/DatabaseService.d.ts +1 -0
  126. package/services/storage-service/DatabaseService.js +56 -34
  127. package/services/storage-service/db-stores/Nft.d.ts +2 -2
  128. package/services/storage-service/db-stores/Nft.js +7 -14
  129. package/services/transaction-service/event-parser/index.js +21 -49
  130. package/services/transaction-service/index.js +26 -15
  131. package/utils/address.d.ts +3 -0
  132. package/utils/address.js +8 -1
  133. package/utils/index.d.ts +2 -2
  134. package/utils/index.js +7 -13
@@ -7,8 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.ChainService = void 0;
8
8
  var _chainList = require("@subwallet/chain-list");
9
9
  var _types = require("@subwallet/chain-list/types");
10
- var _constants = require("@subwallet/extension-base/constants");
11
- var _constants2 = require("@subwallet/extension-base/services/chain-service/constants");
10
+ var _constants = require("@subwallet/extension-base/services/chain-service/constants");
12
11
  var _EvmChainHandler = require("@subwallet/extension-base/services/chain-service/handler/EvmChainHandler");
13
12
  var _SubstrateChainHandler = require("@subwallet/extension-base/services/chain-service/handler/SubstrateChainHandler");
14
13
  var _types2 = require("@subwallet/extension-base/services/chain-service/handler/types");
@@ -51,7 +50,7 @@ class ChainService {
51
50
  this.multiChainAssetMapSubject.next(_chainList.MultiChainAssetMap);
52
51
  this.xcmRefMapSubject.next(this.getXcmRefMap());
53
52
  this.logger = (0, _logger.logger)('chain-service');
54
- this.refreshChainStateInterval(3000);
53
+ this.refreshChainStateInterval(3000, 6);
55
54
  }
56
55
 
57
56
  // Getter
@@ -286,7 +285,7 @@ class ChainService {
286
285
  this.dbService.removeFromChainStore([slug]).catch(console.error);
287
286
  this.updateChainSubscription();
288
287
  this.lockChainInfoMap = false;
289
- this.eventService.emit('chain.remove', slug);
288
+ this.eventService.emit('chain.updateState', slug);
290
289
  return true;
291
290
  }
292
291
  resetChainInfoMap(excludedChains) {
@@ -296,7 +295,7 @@ class ChainService {
296
295
  this.lockChainInfoMap = true;
297
296
  const chainStateMap = this.getChainStateMap();
298
297
  for (const [slug, chainState] of Object.entries(chainStateMap)) {
299
- if (!_constants2._DEFAULT_ACTIVE_CHAINS.includes(slug) && !(excludedChains !== null && excludedChains !== void 0 && excludedChains.includes(slug))) {
298
+ if (!_constants._DEFAULT_ACTIVE_CHAINS.includes(slug) && !(excludedChains !== null && excludedChains !== void 0 && excludedChains.includes(slug))) {
300
299
  chainState.active = false;
301
300
  }
302
301
  }
@@ -352,7 +351,7 @@ class ChainService {
352
351
  this.dbService.removeFromAssetStore(targetAssets).catch(e => this.logger.error(e));
353
352
  this.assetRegistrySubject.next(assetRegistry);
354
353
  targetAssets.forEach(assetSlug => {
355
- this.eventService.emit('asset.remove', assetSlug);
354
+ this.eventService.emit('asset.updateState', assetSlug);
356
355
  });
357
356
  }
358
357
 
@@ -419,14 +418,14 @@ class ChainService {
419
418
  this.lockChainInfoMap = true;
420
419
  chainStateMap[chainSlug].active = true;
421
420
  this.initApiForChain(chainInfo);
422
- this.refreshChainStateInterval(1000);
421
+ this.refreshChainStateInterval(3000, 6);
423
422
  this.dbService.updateChainStore({
424
423
  ...chainInfo,
425
424
  active: true,
426
425
  currentProvider: chainStateMap[chainSlug].currentProvider
427
426
  }).catch(console.error);
428
427
  this.lockChainInfoMap = false;
429
- this.eventService.emit('chain.enable', chainSlug);
428
+ this.eventService.emit('chain.updateState', chainSlug);
430
429
  return true;
431
430
  }
432
431
  enableChain(chainSlug) {
@@ -461,7 +460,7 @@ class ChainService {
461
460
  }).catch(console.error);
462
461
  this.updateChainStateMapSubscription();
463
462
  this.lockChainInfoMap = false;
464
- this.eventService.emit('chain.disable', chainSlug);
463
+ this.eventService.emit('chain.updateState', chainSlug);
465
464
  return true;
466
465
  }
467
466
  checkExistedPredefinedChain(genesisHash, evmChainId) {
@@ -497,13 +496,13 @@ class ChainService {
497
496
  currentProvider: Object.keys(chainInfo.providers)[0],
498
497
  slug: chainInfo.slug,
499
498
  connectionStatus: _types3._ChainConnectionStatus.DISCONNECTED,
500
- active: _constants2._DEFAULT_ACTIVE_CHAINS.includes(chainInfo.slug)
499
+ active: _constants._DEFAULT_ACTIVE_CHAINS.includes(chainInfo.slug)
501
500
  };
502
501
 
503
502
  // create data for storage
504
503
  newStorageData.push({
505
504
  ...chainInfo,
506
- active: _constants2._DEFAULT_ACTIVE_CHAINS.includes(chainInfo.slug),
505
+ active: _constants._DEFAULT_ACTIVE_CHAINS.includes(chainInfo.slug),
507
506
  currentProvider: Object.keys(chainInfo.providers)[0]
508
507
  });
509
508
  });
@@ -584,11 +583,11 @@ class ChainService {
584
583
  currentProvider: Object.keys(chainInfo.providers)[0],
585
584
  slug,
586
585
  connectionStatus: _types3._ChainConnectionStatus.DISCONNECTED,
587
- active: _constants2._DEFAULT_ACTIVE_CHAINS.includes(slug)
586
+ active: _constants._DEFAULT_ACTIVE_CHAINS.includes(slug)
588
587
  };
589
588
  newStorageData.push({
590
589
  ...mergedChainInfoMap[slug],
591
- active: _constants2._DEFAULT_ACTIVE_CHAINS.includes(slug),
590
+ active: _constants._DEFAULT_ACTIVE_CHAINS.includes(slug),
592
591
  currentProvider: Object.keys(chainInfo.providers)[0]
593
592
  });
594
593
  }
@@ -685,7 +684,7 @@ class ChainService {
685
684
  active: targetChainState.active,
686
685
  currentProvider: targetChainState.currentProvider
687
686
  }).then(() => {
688
- this.eventService.emit('chain.update', chainSlug);
687
+ this.eventService.emit('chain.updateState', chainSlug);
689
688
  }).catch(e => this.logger.error(e));
690
689
  }
691
690
  insertChain(params) {
@@ -974,21 +973,23 @@ class ChainService {
974
973
  }
975
974
  async validateCustomToken(data) {
976
975
  const assetRegistry = this.getSmartContractTokens();
977
- let isExist = false;
976
+ let existedToken;
978
977
  for (const token of Object.values(assetRegistry)) {
979
978
  var _token$metadata2;
980
979
  const contractAddress = token === null || token === void 0 ? void 0 : (_token$metadata2 = token.metadata) === null || _token$metadata2 === void 0 ? void 0 : _token$metadata2.contractAddress;
981
980
  if ((0, _utils._isEqualContractAddress)(contractAddress, data.contractAddress) && token.assetType === data.type && token.originChain === data.originChain) {
982
- isExist = true;
981
+ existedToken = token;
983
982
  break;
984
983
  }
985
984
  }
986
- if (isExist) {
985
+ if (existedToken) {
986
+ var _existedToken;
987
987
  return {
988
- decimals: -1,
989
- name: '',
990
- symbol: '',
991
- isExist,
988
+ decimals: existedToken.decimals || 0,
989
+ name: existedToken.name,
990
+ symbol: existedToken.symbol,
991
+ isExist: !!existedToken,
992
+ existedSlug: (_existedToken = existedToken) === null || _existedToken === void 0 ? void 0 : _existedToken.slug,
992
993
  contractError: false
993
994
  };
994
995
  }
@@ -1002,7 +1003,7 @@ class ChainService {
1002
1003
  name,
1003
1004
  decimals,
1004
1005
  symbol,
1005
- isExist,
1006
+ isExist: !!existedToken,
1006
1007
  contractError
1007
1008
  };
1008
1009
  }
@@ -1052,20 +1053,28 @@ class ChainService {
1052
1053
 
1053
1054
  return this.substrateChainHandler.resumeAllApis();
1054
1055
  }
1055
-
1056
- // Interval update api status
1056
+ refreshChainStateTimeout = undefined;
1057
+ refreshChainStateTimes = 0;
1057
1058
  refreshChainStateInterval() {
1058
1059
  let delay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
1060
+ let times = arguments.length > 1 ? arguments[1] : undefined;
1059
1061
  clearTimeout(this.refreshChainStateTimeout);
1060
1062
  setTimeout(() => {
1061
- this.updateApiMapStatus();
1063
+ if (times) {
1064
+ this.refreshChainStateTimes = times;
1065
+ }
1066
+ this.refreshChainStateTimes -= 1;
1067
+ if (this.refreshChainStateTimes < 0) {
1068
+ return;
1069
+ }
1070
+ this.updateApiMapStatus().catch(console.error);
1062
1071
  this.refreshChainStateTimeout = setTimeout(() => {
1063
- this.updateApiMapStatus();
1064
- this.refreshChainStateInterval();
1065
- }, _constants.CRON_GET_API_MAP_STATUS);
1072
+ this.updateApiMapStatus().catch(console.error);
1073
+ this.refreshChainStateInterval(0);
1074
+ }, 3000);
1066
1075
  }, delay);
1067
1076
  }
1068
- updateApiMapStatus() {
1077
+ async updateApiMapStatus() {
1069
1078
  const substrateApiMap = this.getSubstrateApiMap();
1070
1079
  const evmApiMap = this.getEvmApiMap();
1071
1080
  const chainStateMap = this.getChainStateMap();
@@ -1076,25 +1085,31 @@ class ChainService {
1076
1085
  update = true;
1077
1086
  }
1078
1087
  }
1079
- Object.entries(chainStateMap).forEach(_ref4 => {
1088
+ const promiseList = Object.entries(chainStateMap).map(async _ref4 => {
1080
1089
  let [chain, chainState] = _ref4;
1081
- if (chainState.active) {
1082
- if (substrateApiMap[chain]) {
1083
- const api = substrateApiMap[chain];
1084
- if (api) {
1085
- updateState(chainState, _types3._ChainConnectionStatus.CONNECTED);
1086
- return;
1087
- }
1088
- } else if (evmApiMap[chain]) {
1089
- const api = evmApiMap[chain];
1090
- if (api) {
1091
- updateState(chainState, _types3._ChainConnectionStatus.CONNECTED);
1092
- return;
1090
+ try {
1091
+ if (chainState.active) {
1092
+ if (substrateApiMap[chain]) {
1093
+ const api = substrateApiMap[chain];
1094
+ if (api.isApiConnected) {
1095
+ updateState(chainState, _types3._ChainConnectionStatus.CONNECTED);
1096
+ return;
1097
+ }
1098
+ } else if (evmApiMap[chain]) {
1099
+ var _api$api;
1100
+ const api = evmApiMap[chain];
1101
+ if (await (api === null || api === void 0 ? void 0 : (_api$api = api.api) === null || _api$api === void 0 ? void 0 : _api$api.eth.net.isListening())) {
1102
+ updateState(chainState, _types3._ChainConnectionStatus.CONNECTED);
1103
+ return;
1104
+ }
1093
1105
  }
1094
1106
  }
1107
+ updateState(chainState, _types3._ChainConnectionStatus.DISCONNECTED);
1108
+ } catch (e) {
1109
+ updateState(chainState, _types3._ChainConnectionStatus.DISCONNECTED);
1095
1110
  }
1096
- updateState(chainState, _types3._ChainConnectionStatus.DISCONNECTED);
1097
1111
  });
1112
+ await Promise.all(promiseList);
1098
1113
  if (update) {
1099
1114
  console.log('Update chain connection state');
1100
1115
  this.chainStateMapSubject.next(chainStateMap);
@@ -1120,7 +1135,6 @@ class ChainService {
1120
1135
  this.setAssetSettings(assetSettings, false);
1121
1136
  }
1122
1137
  this.eventService.emit('asset.ready', true);
1123
- console.log('Done init asset settings');
1124
1138
  }
1125
1139
  setAssetSettings(assetSettings) {
1126
1140
  let emitEvent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
@@ -1135,7 +1149,7 @@ class ChainService {
1135
1149
  }
1136
1150
  this.assetSettingSubject.next(assetSettings);
1137
1151
  updateAssets.forEach(slug => {
1138
- this.eventService.emit(assetSettings[slug].visible ? 'asset.enable' : 'asset.disable', slug);
1152
+ this.eventService.emit('asset.updateState', slug);
1139
1153
  });
1140
1154
  this.store.set('AssetSetting', assetSettings);
1141
1155
  }
@@ -42,7 +42,11 @@ class EventService extends _eventemitter.default {
42
42
  }, this.lazyTime);
43
43
  }
44
44
  emitLazy() {
45
- this.lazyEmitter.emit('lazy', this.pendingEvents, this.pendingEvents.map(e => e.type));
45
+ try {
46
+ this.lazyEmitter.emit('lazy', this.pendingEvents, this.pendingEvents.map(e => e.type));
47
+ } catch (e) {
48
+ console.error('Get error in some listener of lazy event', e);
49
+ }
46
50
  this.pendingEvents = [];
47
51
  this.timeoutId = null;
48
52
  }
@@ -1 +1,11 @@
1
- "use strict";
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.COMMON_RELOAD_EVENTS = void 0;
7
+ // Copyright 2019-2022 @subwallet/extension-base
8
+ // SPDX-License-Identifier: Apache-2.0
9
+
10
+ const COMMON_RELOAD_EVENTS = ['account.updateCurrent', 'asset.updateState', 'account.add', 'chain.updateState', 'account.remove', 'chain.add'];
11
+ exports.COMMON_RELOAD_EVENTS = COMMON_RELOAD_EVENTS;
@@ -5,9 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.HistoryService = void 0;
7
7
  var _constants = require("@subwallet/extension-base/constants");
8
- var _address = require("@subwallet/extension-base/utils/address");
9
8
  var _uiKeyring = require("@subwallet/ui-keyring");
10
- var _accounts = require("@subwallet/ui-keyring/observable/accounts");
11
9
  var _rxjs = require("rxjs");
12
10
  var _subsquidMultiChainHistory = require("./subsquid-multi-chain-history");
13
11
  // Copyright 2019-2022 @subwallet/extension-base
@@ -15,10 +13,11 @@ var _subsquidMultiChainHistory = require("./subsquid-multi-chain-history");
15
13
 
16
14
  class HistoryService {
17
15
  historySubject = new _rxjs.BehaviorSubject([]);
18
- constructor(dbService, chainService, eventService) {
16
+ constructor(dbService, chainService, eventService, keyringService) {
19
17
  this.dbService = dbService;
20
18
  this.chainService = chainService;
21
19
  this.eventService = eventService;
20
+ this.keyringService = keyringService;
22
21
  // Load history from database
23
22
  this.dbService.getHistories().then(histories => {
24
23
  this.historySubject.next(histories);
@@ -47,7 +46,7 @@ class HistoryService {
47
46
  const historyRecords = await (0, _subsquidMultiChainHistory.fetchMultiChainHistories)(addresses, chainMap);
48
47
 
49
48
  // Fill additional info
50
- const accountMap = Object.entries(_accounts.accounts.subject.value).reduce((map, _ref) => {
49
+ const accountMap = Object.entries(this.keyringService.accounts).reduce((map, _ref) => {
51
50
  let [address, account] = _ref;
52
51
  map[address.toLowerCase()] = account.json.meta.name || address;
53
52
  return map;
@@ -57,7 +56,7 @@ class HistoryService {
57
56
  record.fromName = accountMap[(_record$from = record.from) === null || _record$from === void 0 ? void 0 : _record$from.toLowerCase()];
58
57
  record.toName = accountMap[(_record$to = record.to) === null || _record$to === void 0 ? void 0 : _record$to.toLowerCase()];
59
58
  });
60
- this.dbService.upsertHistory(historyRecords).catch(console.error);
59
+ await this.addHistoryItems(historyRecords);
61
60
  return historyRecords;
62
61
  }
63
62
  async fetchHistories(addresses) {
@@ -82,8 +81,8 @@ class HistoryService {
82
81
  const addressList = _uiKeyring.keyring.getAccounts().map(a => a.address);
83
82
  const currentHistories = this.historySubject.value;
84
83
  if (!this.fetchPromise || currentHistories.length === 0) {
85
- const historyRecords = await this.fetchHistories(addressList);
86
- this.historySubject.next(historyRecords);
84
+ await this.fetchHistories(addressList);
85
+ this.historySubject.next(await this.dbService.getHistories());
87
86
  }
88
87
  return this.historySubject.getValue();
89
88
  }
@@ -91,10 +90,6 @@ class HistoryService {
91
90
  await this.getHistories();
92
91
  return this.historySubject;
93
92
  }
94
- async insertHistories(historyItems) {
95
- await this.dbService.upsertHistory(historyItems);
96
- this.historySubject.next(await this.dbService.getHistories());
97
- }
98
93
  async updateHistories(chain, extrinsicHash, updateData) {
99
94
  const existedRecords = await this.dbService.getHistories({
100
95
  chain,
@@ -108,14 +103,25 @@ class HistoryService {
108
103
  });
109
104
  await this.addHistoryItems(updatedRecords);
110
105
  }
106
+
107
+ // Insert history without check override origin 'app'
108
+ async insertHistories(historyItems) {
109
+ await this.dbService.upsertHistory(historyItems);
110
+ this.historySubject.next(await this.dbService.getHistories());
111
+ }
112
+
113
+ // Insert history with check override origin 'app'
111
114
  async addHistoryItems(historyItems) {
112
115
  // Prevent override record with original is 'app'
113
116
  const appRecords = this.historySubject.value.filter(item => item.origin === 'app');
114
117
  const excludeKeys = appRecords.map(item => {
115
- return `${item.chain}-${(0, _address.quickFormatAddressToCompare)(item.address) || ''}-${item.extrinsicHash}`;
118
+ return `${item.chain}-${item.extrinsicHash}`;
116
119
  });
117
120
  const updateRecords = historyItems.filter(item => {
118
- const key = `${item.chain}-${(0, _address.quickFormatAddressToCompare)(item.address) || ''}-${item.extrinsicHash}`;
121
+ const key = `${item.chain}-${item.extrinsicHash}`;
122
+
123
+ // !excludeKeys.includes(key) && console.log('Cancel update', key);
124
+
119
125
  return item.origin === 'app' || !excludeKeys.includes(key);
120
126
  });
121
127
  await this.dbService.upsertHistory(updateRecords);
@@ -67,12 +67,15 @@ function autoFormatAddress(address) {
67
67
  return '';
68
68
  }
69
69
  }
70
- function generateSignature(_ref) {
71
- let {
70
+ function generateSignature(input) {
71
+ if (!input) {
72
+ return '';
73
+ }
74
+ const {
72
75
  r,
73
76
  s,
74
77
  v
75
- } = _ref;
78
+ } = input;
76
79
  const rHex = r.startsWith('0x') ? r.slice(2) : r;
77
80
  const sHex = s.startsWith('0x') ? s.slice(2) : s;
78
81
  const vHex = parseInt(v).toString(16);
@@ -118,7 +121,7 @@ function parseSubsquidTransactionData(address, type, historyItem, chainInfo, arg
118
121
  const transaction = data.call.data.args.transaction.value;
119
122
  to = autoFormatAddress(parsedArgs.to);
120
123
  from = autoFormatAddress(parsedArgs.from);
121
- extrinsicHash = parsedArgs.transactionHash;
124
+ extrinsicHash = parsedArgs.transactionHash || extrinsic.hash;
122
125
  amount = transaction.value || '0';
123
126
  fee = (parseInt(transaction.gasPrice) * parseInt(transaction.gasLimit)).toString();
124
127
  signature = generateSignature(transaction.signature);
@@ -255,14 +258,14 @@ async function fetchMultiChainHistories(addresses, chainMap) {
255
258
  console.warn(`Not found chain info for chain id: ${chainId}`);
256
259
  return;
257
260
  }
258
- try {
259
- usedAddresses.forEach(address => {
261
+ usedAddresses.forEach(address => {
262
+ try {
260
263
  const transactionData = parseSubsquidTransactionData(address, name, historyItem, chainInfo, parseData(args), parseData(_data));
261
264
  histories.push(transactionData);
262
- });
263
- } catch (e) {
264
- console.warn('Parse transaction data failed', e);
265
- }
265
+ } catch (e) {
266
+ console.warn('Parse transaction data failed', address, e);
267
+ }
268
+ });
266
269
  });
267
270
  return histories;
268
271
  }
@@ -16,8 +16,9 @@ class KeyringService {
16
16
  address: '',
17
17
  currentGenesisHash: null
18
18
  });
19
- accountsSubject = _uiKeyring.keyring.accounts.subject;
20
- beforeAccount = _uiKeyring.keyring.accounts.subject.value;
19
+ addressesSubject = _uiKeyring.keyring.addresses.subject;
20
+ accountSubject = _uiKeyring.keyring.accounts.subject;
21
+ beforeAccount = this.accountSubject.value;
21
22
  keyringStateSubject = new _rxjs.BehaviorSubject({
22
23
  isReady: false,
23
24
  hasMasterPassword: false,
@@ -26,23 +27,17 @@ class KeyringService {
26
27
  constructor(eventService) {
27
28
  this.eventService = eventService;
28
29
  this.currentAccountStore.get('CurrentAccountInfo', rs => {
29
- this.currentAccountSubject.next(rs);
30
+ rs && this.currentAccountSubject.next(rs);
30
31
  });
31
32
  this.subscribeAccounts().catch(console.error);
32
33
  }
33
34
  async subscribeAccounts() {
34
35
  // Wait until account ready
35
- await new Promise(resolve => {
36
- const onReady = () => {
37
- this.eventService.off('account.ready', onReady);
38
- resolve(true);
39
- };
40
- this.eventService.on('account.ready', onReady);
41
- });
36
+ await this.eventService.waitAccountReady;
42
37
  this.beforeAccount = {
43
- ...this.accountsSubject.value
38
+ ...this.accountSubject.value
44
39
  };
45
- this.accountsSubject.subscribe(subjectInfo => {
40
+ this.accountSubject.subscribe(subjectInfo => {
46
41
  // Check if accounts changed
47
42
  const beforeAddresses = Object.keys(this.beforeAccount);
48
43
  const afterAddresses = Object.keys(subjectInfo);
@@ -87,7 +82,10 @@ class KeyringService {
87
82
  });
88
83
  }
89
84
  get accounts() {
90
- return this.accountsSubject.value;
85
+ return this.accountSubject.value;
86
+ }
87
+ get addresses() {
88
+ return this.addressesSubject.value;
91
89
  }
92
90
  get currentAccount() {
93
91
  return this.currentAccountSubject.value;
@@ -24,7 +24,6 @@ const getTokenPrice = async function (priceIds) {
24
24
  }
25
25
  }
26
26
  if (useBackupApi || ((_res = res) === null || _res === void 0 ? void 0 : _res.status) !== 200) {
27
- console.log('Use backup api for price');
28
27
  useBackupApi = true;
29
28
  res = await _axios.default.get(`https://chain-data.subwallet.app/api/price/get?ids=${idStr}`);
30
29
  }
@@ -37,8 +37,8 @@ class PriceService {
37
37
  };
38
38
  this.eventService.waitAssetReady.then(() => {
39
39
  this.refreshPriceData();
40
- this.eventService.on('asset.enable', eventHandler);
41
- this.eventService.on('asset.update', eventHandler);
40
+ this.eventService.on('asset.updateState', eventHandler);
41
+ this.eventService.on('asset.updateState', eventHandler);
42
42
  }).catch(console.error);
43
43
  }
44
44
  async getPrice() {
@@ -68,7 +68,6 @@ class PriceService {
68
68
  ready: true
69
69
  });
70
70
  this.dbService.updatePriceStore(rs).catch(console.error);
71
- console.log('Get Token Price From CoinGecko');
72
71
  }).catch(console.error);
73
72
  this.refreshTimeout = setTimeout(this.refreshPriceData.bind(this), _constants.CRON_REFRESH_PRICE_INTERVAL);
74
73
  }
@@ -10,7 +10,6 @@ var _constants = require("@subwallet/extension-base/services/request-service/con
10
10
  var _Authorize = _interopRequireDefault(require("@subwallet/extension-base/stores/Authorize"));
11
11
  var _utils2 = require("@subwallet/extension-base/utils");
12
12
  var _getId = require("@subwallet/extension-base/utils/getId");
13
- var _accounts = require("@subwallet/ui-keyring/observable/accounts");
14
13
  var _rxjs = require("rxjs");
15
14
  var _util = require("@polkadot/util");
16
15
  var _utilCrypto = require("@polkadot/util-crypto");
@@ -27,7 +26,8 @@ class AuthRequestHandler {
27
26
  authorizeUrlSubject = new _rxjs.Subject();
28
27
  evmChainSubject = new _rxjs.Subject();
29
28
  authSubjectV2 = new _rxjs.BehaviorSubject([]);
30
- constructor(requestService, chainService) {
29
+ constructor(requestService, chainService, keyringService) {
30
+ this.keyringService = keyringService;
31
31
  this.#requestService = requestService;
32
32
  this.#chainService = chainService;
33
33
  }
@@ -38,7 +38,7 @@ class AuthRequestHandler {
38
38
  }
39
39
  getAddressList() {
40
40
  let value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
41
- const addressList = Object.keys(_accounts.accounts.subject.value);
41
+ const addressList = Object.keys(this.keyringService.accounts);
42
42
  return addressList.reduce((addressList, v) => ({
43
43
  ...addressList,
44
44
  [v]: value
@@ -95,11 +95,11 @@ class AuthRequestHandler {
95
95
  const chainInfoMaps = this.#chainService.getChainInfoMap();
96
96
  const chainStateMap = this.#chainService.getChainStateMap();
97
97
  let defaultChain = options.defaultChain;
98
- const needEnableChains = [];
98
+ let needEnableChains = [];
99
99
  if (options.url) {
100
100
  const domain = (0, _utils2.getDomainFromUrl)(options.url);
101
101
  const predefinedSupportChains = _constants.PREDEFINED_CHAIN_DAPP_CHAIN_MAP[domain];
102
- if (predefinedSupportChains) {
102
+ if (!defaultChain && predefinedSupportChains) {
103
103
  defaultChain = predefinedSupportChains[0];
104
104
  options.autoActive && needEnableChains.push(...predefinedSupportChains);
105
105
  }
@@ -112,11 +112,17 @@ class AuthRequestHandler {
112
112
  return (_chainStateMap$chain$ = chainStateMap[chain.slug]) === null || _chainStateMap$chain$ === void 0 ? void 0 : _chainStateMap$chain$.active;
113
113
  })) || evmChains[0];
114
114
  if (options.autoActive) {
115
- if (!needEnableChains.includes(chainInfo.slug)) {
116
- needEnableChains.push(chainInfo.slug);
115
+ var _chainInfo;
116
+ if (!needEnableChains.includes((_chainInfo = chainInfo) === null || _chainInfo === void 0 ? void 0 : _chainInfo.slug)) {
117
+ var _chainInfo2;
118
+ needEnableChains.push((_chainInfo2 = chainInfo) === null || _chainInfo2 === void 0 ? void 0 : _chainInfo2.slug);
117
119
  }
118
120
  }
119
121
  }
122
+ needEnableChains = needEnableChains.filter(slug => {
123
+ var _chainStateMap$slug;
124
+ return !((_chainStateMap$slug = chainStateMap[slug]) !== null && _chainStateMap$slug !== void 0 && _chainStateMap$slug.active);
125
+ });
120
126
  needEnableChains.length > 0 && this.#chainService.enableChains(needEnableChains);
121
127
  return chainInfo;
122
128
  }
@@ -76,16 +76,7 @@ class EvmRequestHandler {
76
76
  });
77
77
  this.confirmationsQueueSubject.next(confirmations);
78
78
  if (!isInternal) {
79
- // Not open new popup and use existed
80
- const popupList = this.#requestService.popup;
81
- if (this.#requestService.popup.length > 0) {
82
- // eslint-disable-next-line no-void
83
- void chrome.windows.update(popupList[0], {
84
- focused: true
85
- });
86
- } else {
87
- this.#requestService.popupOpen();
88
- }
79
+ this.#requestService.popupOpen();
89
80
  }
90
81
  this.#requestService.updateIconV2();
91
82
  return promise;
@@ -136,7 +127,8 @@ class EvmRequestHandler {
136
127
  data: (0, _ethereumjsUtil.toBuffer)(config.data)
137
128
  };
138
129
  const common = _common.default.custom({
139
- chainId: config.chainId
130
+ chainId: config.chainId,
131
+ defaultHardfork: 'petersburg'
140
132
  });
141
133
 
142
134
  // @ts-ignore
@@ -149,11 +141,15 @@ class EvmRequestHandler {
149
141
  const {
150
142
  estimateGas,
151
143
  from,
152
- gasPrice
144
+ gas,
145
+ gasPrice,
146
+ value
153
147
  } = transaction;
154
148
  const pair = _uiKeyring.default.getPair(from);
155
149
  const params = {
156
150
  ...transaction,
151
+ gas: (0, _eth.anyNumberToBN)(gas).toNumber(),
152
+ value: (0, _eth.anyNumberToBN)(value).toNumber(),
157
153
  gasPrice: (0, _eth.anyNumberToBN)(gasPrice).toNumber(),
158
154
  gasLimit: (0, _eth.anyNumberToBN)(estimateGas).toNumber()
159
155
  // nonce: await web3.eth.getTransactionCount(from) // Todo: fill this value from transaction service
@@ -10,7 +10,6 @@ var _EvmRequestHandler = _interopRequireDefault(require("@subwallet/extension-ba
10
10
  var _MetadataRequestHandler = _interopRequireDefault(require("@subwallet/extension-base/services/request-service/handler/MetadataRequestHandler"));
11
11
  var _PopupHandler = _interopRequireDefault(require("@subwallet/extension-base/services/request-service/handler/PopupHandler"));
12
12
  var _SubstrateRequestHandler = _interopRequireDefault(require("@subwallet/extension-base/services/request-service/handler/SubstrateRequestHandler"));
13
- var _accounts = require("@subwallet/ui-keyring/observable/accounts");
14
13
  // Copyright 2019-2022 @subwallet/extension-base authors & contributors
15
14
  // SPDX-License-Identifier: Apache-2.0
16
15
 
@@ -24,12 +23,13 @@ class RequestService {
24
23
  #evmRequestHandler;
25
24
 
26
25
  // Common
27
- constructor(chainService, settingService) {
26
+ constructor(chainService, settingService, keyringService) {
27
+ this.keyringService = keyringService;
28
28
  this.#chainService = chainService;
29
29
  this.settingService = settingService;
30
30
  this.#popupHandler = new _PopupHandler.default(this);
31
31
  this.#metadataRequestHandler = new _MetadataRequestHandler.default(this);
32
- this.#authRequestHandler = new _AuthRequestHandler.default(this, this.#chainService);
32
+ this.#authRequestHandler = new _AuthRequestHandler.default(this, this.#chainService, this.keyringService);
33
33
  this.#substrateRequestHandler = new _SubstrateRequestHandler.default(this);
34
34
  this.#evmRequestHandler = new _EvmRequestHandler.default(this);
35
35
 
@@ -44,7 +44,7 @@ class RequestService {
44
44
  }
45
45
  getAddressList() {
46
46
  let value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
47
- const addressList = Object.keys(_accounts.accounts.subject.value);
47
+ const addressList = Object.keys(this.keyringService.accounts);
48
48
  return addressList.reduce((addressList, v) => ({
49
49
  ...addressList,
50
50
  [v]: value
@@ -59,7 +59,16 @@ class RequestService {
59
59
  this.#popupHandler.popupClose();
60
60
  }
61
61
  popupOpen() {
62
- this.#popupHandler.popupOpen();
62
+ // Not open new popup and use existed
63
+ const popupList = this.#popupHandler.popup;
64
+ if (popupList && popupList.length > 0) {
65
+ var _chrome$windows$updat;
66
+ (_chrome$windows$updat = chrome.windows.update(popupList[0], {
67
+ focused: true
68
+ })) === null || _chrome$windows$updat === void 0 ? void 0 : _chrome$windows$updat.catch(console.error);
69
+ } else {
70
+ this.#popupHandler.popupOpen();
71
+ }
63
72
  }
64
73
 
65
74
  // Metadata