@subwallet/extension-base 1.0.1 → 1.0.2-1b

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 (220) hide show
  1. package/background/KoniTypes.d.ts +25 -36
  2. package/background/KoniTypes.js +12 -7
  3. package/background/errors/TransactionError.js +21 -1
  4. package/cjs/background/KoniTypes.js +14 -8
  5. package/cjs/background/errors/TransactionError.js +20 -0
  6. package/cjs/constants/index.js +13 -28
  7. package/cjs/koni/api/dotsama/balance.js +60 -224
  8. package/cjs/koni/api/dotsama/transfer.js +30 -29
  9. package/cjs/koni/api/nft/acala_nft/index.js +4 -1
  10. package/cjs/koni/api/nft/bit.country/index.js +4 -1
  11. package/cjs/koni/api/nft/evm_nft/index.js +7 -3
  12. package/cjs/koni/api/nft/index.js +3 -6
  13. package/cjs/koni/api/nft/karura_nft/index.js +4 -1
  14. package/cjs/koni/api/nft/rmrk_nft/index.js +8 -1
  15. package/cjs/koni/api/nft/statemine_nft/index.js +4 -1
  16. package/cjs/koni/api/nft/unique_nft/index.js +6 -1
  17. package/cjs/koni/api/nft/wasm_nft/index.js +169 -111
  18. package/cjs/koni/api/nft/wasm_nft/utils.js +11 -7
  19. package/cjs/koni/api/staking/bonding/amplitude.js +18 -10
  20. package/cjs/koni/api/staking/bonding/astar.js +37 -238
  21. package/cjs/koni/api/staking/bonding/index.js +26 -14
  22. package/cjs/koni/api/staking/bonding/paraChain.js +100 -11
  23. package/cjs/koni/api/staking/bonding/relayChain.js +174 -16
  24. package/cjs/koni/api/staking/bonding/utils.js +55 -10
  25. package/cjs/koni/api/tokens/wasm/index.js +5 -4
  26. package/cjs/koni/api/tokens/wasm/utils.js +63 -0
  27. package/cjs/koni/api/xcm/index.js +0 -111
  28. package/cjs/koni/api/xcm/polkadotXcm.js +2 -2
  29. package/cjs/koni/api/xcm/utils.js +18 -13
  30. package/cjs/koni/api/xcm/xTokens.js +3 -5
  31. package/cjs/koni/api/xcm/xcmPallet.js +9 -6
  32. package/cjs/koni/background/cron.js +179 -77
  33. package/cjs/koni/background/handlers/Extension.js +231 -195
  34. package/cjs/koni/background/handlers/State.js +147 -111
  35. package/cjs/koni/background/handlers/Tabs.js +48 -39
  36. package/cjs/koni/background/subscription.js +64 -56
  37. package/cjs/packageInfo.js +1 -1
  38. package/cjs/page/index.js +5 -0
  39. package/cjs/services/chain-service/constants.js +1 -11
  40. package/cjs/services/chain-service/handler/SubstrateChainHandler.js +13 -8
  41. package/cjs/services/chain-service/handler/light-client/index.js +2 -0
  42. package/cjs/services/chain-service/index.js +39 -6
  43. package/cjs/services/chain-service/utils.js +4 -0
  44. package/cjs/services/event-service/index.js +75 -0
  45. package/cjs/services/event-service/types.js +11 -0
  46. package/cjs/services/history-service/index.js +46 -21
  47. package/cjs/services/history-service/subsquid-multi-chain-history.js +19 -11
  48. package/cjs/services/keyring-service/index.js +101 -0
  49. package/cjs/services/migration-service/index.js +13 -10
  50. package/cjs/{koni/migration/scripts/RemoveWrongCrowdloan.js → services/migration-service/scripts/AutoEnableChainsTokens.js} +11 -6
  51. package/cjs/services/migration-service/scripts/MigrateNetworkSettings.js +39 -19
  52. package/cjs/services/migration-service/scripts/MigrateSettings.js +31 -0
  53. package/cjs/services/migration-service/scripts/MigrateTransactionHistory.js +72 -0
  54. package/cjs/services/migration-service/scripts/index.js +13 -4
  55. package/cjs/services/price-service/coingecko.js +15 -3
  56. package/cjs/services/price-service/index.js +15 -18
  57. package/cjs/services/request-service/constants.js +8 -2
  58. package/cjs/services/request-service/handler/AuthRequestHandler.js +43 -12
  59. package/cjs/services/request-service/index.js +3 -0
  60. package/cjs/services/storage-service/DatabaseService.js +53 -34
  61. package/cjs/services/storage-service/databases/index.js +1 -1
  62. package/cjs/services/storage-service/db-stores/BaseStoreWithAddressAndChain.js +2 -8
  63. package/cjs/services/storage-service/db-stores/Nft.js +8 -18
  64. package/cjs/services/storage-service/db-stores/Transaction.js +10 -7
  65. package/cjs/services/subscan-service/index.js +107 -0
  66. package/cjs/services/subscan-service/subscan-chain-map.js +74 -0
  67. package/cjs/services/subscan-service/types.js +1 -0
  68. package/cjs/services/transaction-service/event-parser/index.js +20 -48
  69. package/cjs/services/transaction-service/index.js +66 -22
  70. package/cjs/services/transaction-service/utils.js +4 -6
  71. package/cjs/utils/address.js +9 -1
  72. package/cjs/utils/index.js +30 -26
  73. package/constants/index.d.ts +8 -13
  74. package/constants/index.js +8 -13
  75. package/koni/api/dotsama/balance.d.ts +0 -1
  76. package/koni/api/dotsama/balance.js +33 -197
  77. package/koni/api/dotsama/transfer.js +5 -4
  78. package/koni/api/nft/acala_nft/index.js +3 -1
  79. package/koni/api/nft/bit.country/index.js +3 -1
  80. package/koni/api/nft/evm_nft/index.js +6 -3
  81. package/koni/api/nft/index.d.ts +1 -2
  82. package/koni/api/nft/index.js +3 -6
  83. package/koni/api/nft/karura_nft/index.js +3 -1
  84. package/koni/api/nft/nft.d.ts +1 -0
  85. package/koni/api/nft/rmrk_nft/index.js +8 -1
  86. package/koni/api/nft/statemine_nft/index.js +3 -1
  87. package/koni/api/nft/unique_nft/index.js +5 -1
  88. package/koni/api/nft/wasm_nft/index.d.ts +0 -2
  89. package/koni/api/nft/wasm_nft/index.js +167 -109
  90. package/koni/api/nft/wasm_nft/utils.d.ts +7 -5
  91. package/koni/api/nft/wasm_nft/utils.js +7 -5
  92. package/koni/api/staking/bonding/amplitude.d.ts +1 -2
  93. package/koni/api/staking/bonding/amplitude.js +22 -13
  94. package/koni/api/staking/bonding/astar.d.ts +2 -11
  95. package/koni/api/staking/bonding/astar.js +39 -231
  96. package/koni/api/staking/bonding/index.d.ts +5 -2
  97. package/koni/api/staking/bonding/index.js +27 -17
  98. package/koni/api/staking/bonding/paraChain.d.ts +4 -1
  99. package/koni/api/staking/bonding/paraChain.js +101 -14
  100. package/koni/api/staking/bonding/relayChain.d.ts +6 -2
  101. package/koni/api/staking/bonding/relayChain.js +172 -17
  102. package/koni/api/staking/bonding/utils.d.ts +15 -2
  103. package/koni/api/staking/bonding/utils.js +53 -11
  104. package/koni/api/tokens/wasm/index.js +5 -4
  105. package/koni/api/tokens/wasm/utils.d.ts +6 -0
  106. package/koni/api/tokens/wasm/utils.js +54 -0
  107. package/koni/api/xcm/index.js +1 -112
  108. package/koni/api/xcm/polkadotXcm.js +3 -3
  109. package/koni/api/xcm/utils.d.ts +5 -6
  110. package/koni/api/xcm/utils.js +15 -10
  111. package/koni/api/xcm/xTokens.js +5 -7
  112. package/koni/api/xcm/xcmPallet.js +10 -9
  113. package/koni/background/cron.d.ts +6 -1
  114. package/koni/background/cron.js +179 -76
  115. package/koni/background/handlers/Extension.d.ts +2 -2
  116. package/koni/background/handlers/Extension.js +161 -125
  117. package/koni/background/handlers/State.d.ts +21 -20
  118. package/koni/background/handlers/State.js +144 -111
  119. package/koni/background/handlers/Tabs.js +30 -20
  120. package/koni/background/subscription.d.ts +1 -1
  121. package/koni/background/subscription.js +64 -58
  122. package/package.json +63 -18
  123. package/packageInfo.js +1 -1
  124. package/page/index.d.ts +2 -0
  125. package/page/index.js +4 -0
  126. package/services/chain-service/constants.d.ts +0 -1
  127. package/services/chain-service/constants.js +0 -9
  128. package/services/chain-service/handler/SubstrateChainHandler.js +14 -9
  129. package/services/chain-service/handler/light-client/index.d.ts +17 -1
  130. package/services/chain-service/handler/light-client/index.js +1 -1
  131. package/services/chain-service/helper/psp22_abi.json +1041 -881
  132. package/services/chain-service/helper/psp34_abi.json +2963 -1807
  133. package/services/chain-service/index.d.ts +6 -4
  134. package/services/chain-service/index.js +40 -9
  135. package/services/chain-service/utils.d.ts +1 -0
  136. package/services/chain-service/utils.js +3 -0
  137. package/services/event-service/index.d.ts +22 -0
  138. package/services/event-service/index.js +63 -0
  139. package/services/event-service/types.d.ts +28 -0
  140. package/services/event-service/types.js +4 -0
  141. package/services/history-service/index.d.ts +5 -3
  142. package/services/history-service/index.js +46 -21
  143. package/services/history-service/subsquid-multi-chain-history.js +22 -13
  144. package/services/keyring-service/index.d.ts +19 -0
  145. package/services/keyring-service/index.js +93 -0
  146. package/services/migration-service/index.js +11 -9
  147. package/services/migration-service/scripts/AutoEnableChainsTokens.d.ts +4 -0
  148. package/services/migration-service/scripts/AutoEnableChainsTokens.js +13 -0
  149. package/services/migration-service/scripts/MigrateNetworkSettings.js +37 -18
  150. package/services/migration-service/scripts/MigrateSettings.d.ts +4 -0
  151. package/services/migration-service/scripts/MigrateSettings.js +23 -0
  152. package/services/migration-service/scripts/MigrateTransactionHistory.d.ts +4 -0
  153. package/services/migration-service/scripts/MigrateTransactionHistory.js +64 -0
  154. package/services/migration-service/scripts/index.d.ts +1 -0
  155. package/services/migration-service/scripts/index.js +10 -3
  156. package/services/price-service/coingecko.js +15 -3
  157. package/services/price-service/index.d.ts +5 -3
  158. package/services/price-service/index.js +15 -18
  159. package/services/request-service/constants.d.ts +1 -0
  160. package/services/request-service/constants.js +6 -1
  161. package/services/request-service/handler/AuthRequestHandler.d.ts +8 -1
  162. package/services/request-service/handler/AuthRequestHandler.js +44 -13
  163. package/services/request-service/index.d.ts +7 -1
  164. package/services/request-service/index.js +3 -0
  165. package/services/storage-service/DatabaseService.d.ts +1 -0
  166. package/services/storage-service/DatabaseService.js +53 -34
  167. package/services/storage-service/databases/index.js +1 -1
  168. package/services/storage-service/db-stores/BaseStoreWithAddressAndChain.d.ts +1 -1
  169. package/services/storage-service/db-stores/BaseStoreWithAddressAndChain.js +2 -8
  170. package/services/storage-service/db-stores/Nft.d.ts +3 -3
  171. package/services/storage-service/db-stores/Nft.js +8 -17
  172. package/services/storage-service/db-stores/Transaction.js +10 -7
  173. package/services/subscan-service/index.d.ts +20 -0
  174. package/services/subscan-service/index.js +99 -0
  175. package/services/subscan-service/subscan-chain-map.d.ts +5 -0
  176. package/services/subscan-service/subscan-chain-map.js +63 -0
  177. package/services/subscan-service/types.d.ts +27 -0
  178. package/services/subscan-service/types.js +1 -0
  179. package/services/transaction-service/event-parser/index.d.ts +2 -2
  180. package/services/transaction-service/event-parser/index.js +21 -49
  181. package/services/transaction-service/index.d.ts +4 -2
  182. package/services/transaction-service/index.js +66 -22
  183. package/services/transaction-service/utils.js +5 -6
  184. package/utils/address.d.ts +1 -0
  185. package/utils/address.js +9 -2
  186. package/utils/index.d.ts +2 -1
  187. package/utils/index.js +26 -23
  188. package/cjs/background/errors/EvmRpcError.js +0 -21
  189. package/cjs/background/errors/SubWalletProviderError.js +0 -17
  190. package/cjs/constants/ethereum.js +0 -19
  191. package/cjs/errors/SubWalletProviderError.js +0 -17
  192. package/cjs/koni/api/xcm/astar.js +0 -160
  193. package/cjs/koni/api/xcm/moonbeamXcm.js +0 -80
  194. package/cjs/koni/api/xcm/statemintXcm.js +0 -197
  195. package/cjs/koni/api/xcm/substrateXcm.js +0 -213
  196. package/cjs/koni/migration/Base.js +0 -20
  197. package/cjs/koni/migration/index.js +0 -45
  198. package/cjs/koni/migration/scripts/ChangeRouteToHome.js +0 -22
  199. package/cjs/koni/migration/scripts/ClearOldStorage.js +0 -24
  200. package/cjs/koni/migration/scripts/RemoveWrongTransactionHistoriesFromStore.js +0 -36
  201. package/cjs/koni/migration/scripts/ResetTransactionHistoryEventIdx.js +0 -21
  202. package/cjs/koni/migration/scripts/index.js +0 -22
  203. package/cjs/koni/page/index.js +0 -16
  204. package/cjs/services/asset-service/index.js +0 -91
  205. package/cjs/services/storage-service/db-stores/ExtraDelegationInfo.js +0 -17
  206. package/cjs/stores/Balance.js +0 -18
  207. package/cjs/stores/Crowdloan.js +0 -18
  208. package/cjs/stores/CustomEvmToken.js +0 -18
  209. package/cjs/stores/NetworkMap.js +0 -18
  210. package/cjs/stores/Nft.js +0 -18
  211. package/cjs/stores/NftCollection.js +0 -18
  212. package/cjs/stores/Price.js +0 -18
  213. package/cjs/stores/Staking.js +0 -18
  214. package/cjs/stores/StakingReward.js +0 -18
  215. package/cjs/utils/eth/parseTransactionData.js +0 -284
  216. package/koni/page/index.d.ts +0 -2
  217. package/koni/page/index.js +0 -9
  218. /package/cjs/{koni/page → page}/SubWalleEvmProvider.js +0 -0
  219. /package/{koni/page → page}/SubWalleEvmProvider.d.ts +0 -0
  220. /package/{koni/page → page}/SubWalleEvmProvider.js +0 -0
@@ -5,6 +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 _uiKeyring = require("@subwallet/ui-keyring");
8
9
  var _accounts = require("@subwallet/ui-keyring/observable/accounts");
9
10
  var _rxjs = require("rxjs");
10
11
  var _subsquidMultiChainHistory = require("./subsquid-multi-chain-history");
@@ -13,20 +14,25 @@ var _subsquidMultiChainHistory = require("./subsquid-multi-chain-history");
13
14
 
14
15
  class HistoryService {
15
16
  historySubject = new _rxjs.BehaviorSubject([]);
16
- constructor(dbService, chainService) {
17
+ constructor(dbService, chainService, eventService) {
17
18
  this.dbService = dbService;
18
19
  this.chainService = chainService;
19
-
20
+ this.eventService = eventService;
20
21
  // Load history from database
21
22
  this.dbService.getHistories().then(histories => {
22
23
  this.historySubject.next(histories);
23
24
  }).catch(console.error);
24
25
 
25
- // Add some delay to avoid fetching many times when start extension background
26
- setTimeout(() => {
27
- // Create history interval and refresh it if changes accounts list
28
- _accounts.accounts.subject.subscribe(this.refreshHistoryInterval.bind(this));
29
- }, 3333);
26
+ // Wait for keyring and chain ready and start
27
+ Promise.all([this.eventService.waitKeyringReady, this.eventService.waitChainReady]).then(() => {
28
+ this.getHistories().catch(console.log);
29
+ this.eventService.on('account.add', () => {
30
+ this.refreshHistoryInterval();
31
+ });
32
+ this.eventService.on('account.remove', address => {
33
+ this.removeHistoryByAddress(address).catch(console.error);
34
+ });
35
+ }).catch(console.error);
30
36
  }
31
37
  fetchPromise = null;
32
38
  nextFetch = undefined;
@@ -50,8 +56,8 @@ class HistoryService {
50
56
  record.fromName = accountMap[(_record$from = record.from) === null || _record$from === void 0 ? void 0 : _record$from.toLowerCase()];
51
57
  record.toName = accountMap[(_record$to = record.to) === null || _record$to === void 0 ? void 0 : _record$to.toLowerCase()];
52
58
  });
53
- await this.dbService.upsertHistory(historyRecords);
54
- return await this.dbService.getHistories();
59
+ await this.addHistoryItems(historyRecords);
60
+ return historyRecords;
55
61
  }
56
62
  async fetchHistories(addresses) {
57
63
  if (!this.fetchPromise) {
@@ -67,13 +73,16 @@ class HistoryService {
67
73
  clearTimeout(this.nextFetch);
68
74
  this.invalidCache();
69
75
  this.getHistories().catch(console.error);
70
- this.nextFetch = setTimeout(this.refreshHistoryInterval.bind(this), _constants.CRON_REFRESH_HISTORY_INTERVAL);
76
+ this.nextFetch = setTimeout(() => {
77
+ this.refreshHistoryInterval();
78
+ }, _constants.CRON_REFRESH_HISTORY_INTERVAL);
71
79
  }
72
80
  async getHistories() {
73
- const addressList = Object.keys(_accounts.accounts.subject.value);
74
- if (!this.fetchPromise) {
75
- const historyRecords = await this.fetchHistories(addressList);
76
- this.historySubject.next(historyRecords);
81
+ const addressList = _uiKeyring.keyring.getAccounts().map(a => a.address);
82
+ const currentHistories = this.historySubject.value;
83
+ if (!this.fetchPromise || currentHistories.length === 0) {
84
+ await this.fetchHistories(addressList);
85
+ this.historySubject.next(await this.dbService.getHistories());
77
86
  }
78
87
  return this.historySubject.getValue();
79
88
  }
@@ -81,11 +90,7 @@ class HistoryService {
81
90
  await this.getHistories();
82
91
  return this.historySubject;
83
92
  }
84
- async insertHistory(historyItem) {
85
- await this.dbService.upsertHistory([historyItem]);
86
- this.historySubject.next(await this.dbService.getHistories());
87
- }
88
- async updateHistory(chain, extrinsicHash, historyItem) {
93
+ async updateHistories(chain, extrinsicHash, updateData) {
89
94
  const existedRecords = await this.dbService.getHistories({
90
95
  chain,
91
96
  extrinsicHash
@@ -93,15 +98,35 @@ class HistoryService {
93
98
  const updatedRecords = existedRecords.map(r => {
94
99
  return {
95
100
  ...r,
96
- ...historyItem
101
+ ...updateData
97
102
  };
98
103
  });
99
104
  await this.addHistoryItems(updatedRecords);
100
105
  }
101
- async addHistoryItems(historyItems) {
106
+
107
+ // Insert history without check override origin 'app'
108
+ async insertHistories(historyItems) {
102
109
  await this.dbService.upsertHistory(historyItems);
103
110
  this.historySubject.next(await this.dbService.getHistories());
104
111
  }
112
+
113
+ // Insert history with check override origin 'app'
114
+ async addHistoryItems(historyItems) {
115
+ // Prevent override record with original is 'app'
116
+ const appRecords = this.historySubject.value.filter(item => item.origin === 'app');
117
+ const excludeKeys = appRecords.map(item => {
118
+ return `${item.chain}-${item.extrinsicHash}`;
119
+ });
120
+ const updateRecords = historyItems.filter(item => {
121
+ const key = `${item.chain}-${item.extrinsicHash}`;
122
+
123
+ // !excludeKeys.includes(key) && console.log('Cancel update', key);
124
+
125
+ return item.origin === 'app' || !excludeKeys.includes(key);
126
+ });
127
+ await this.dbService.upsertHistory(updateRecords);
128
+ this.historySubject.next(await this.dbService.getHistories());
129
+ }
105
130
  async removeHistoryByAddress(address) {
106
131
  await this.dbService.stores.transaction.removeAllByAddress(address);
107
132
  this.historySubject.next(await this.dbService.getHistories());
@@ -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);
@@ -119,10 +122,15 @@ function parseSubsquidTransactionData(address, type, historyItem, chainInfo, arg
119
122
  to = autoFormatAddress(parsedArgs.to);
120
123
  from = autoFormatAddress(parsedArgs.from);
121
124
  extrinsicHash = parsedArgs.transactionHash;
122
- amount = transaction.value;
125
+ amount = transaction.value || '0';
123
126
  fee = (parseInt(transaction.gasPrice) * parseInt(transaction.gasLimit)).toString();
124
127
  signature = generateSignature(transaction.signature);
125
128
  success = extrinsic.success;
129
+
130
+ // Special fix for moonbeam
131
+ if ((historyItem.chainId === 'moonbeam' || historyItem.chainId === 'moonriver') && typeof amount === 'object') {
132
+ amount = amount[0];
133
+ }
126
134
  break;
127
135
  }
128
136
 
@@ -167,7 +175,7 @@ function parseSubsquidTransactionData(address, type, historyItem, chainInfo, arg
167
175
  }
168
176
  return {
169
177
  address,
170
- origin: MULTI_CHAIN_URL,
178
+ origin: 'subsquid',
171
179
  time: toTimestamp(historyItem.timestamp),
172
180
  chainType,
173
181
  from,
@@ -250,14 +258,14 @@ async function fetchMultiChainHistories(addresses, chainMap) {
250
258
  console.warn(`Not found chain info for chain id: ${chainId}`);
251
259
  return;
252
260
  }
253
- try {
254
- usedAddresses.forEach(address => {
261
+ usedAddresses.forEach(address => {
262
+ try {
255
263
  const transactionData = parseSubsquidTransactionData(address, name, historyItem, chainInfo, parseData(args), parseData(_data));
256
264
  histories.push(transactionData);
257
- });
258
- } catch (e) {
259
- console.warn('Parse transaction data failed', e);
260
- }
265
+ } catch (e) {
266
+ console.warn('Parse transaction data failed', address, e);
267
+ }
268
+ });
261
269
  });
262
270
  return histories;
263
271
  }
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.KeyringService = void 0;
7
+ var _stores = require("@subwallet/extension-base/stores");
8
+ var _uiKeyring = require("@subwallet/ui-keyring");
9
+ var _rxjs = require("rxjs");
10
+ // Copyright 2019-2022 @subwallet/extension-base
11
+ // SPDX-License-Identifier: Apache-2.0
12
+
13
+ class KeyringService {
14
+ currentAccountStore = new _stores.CurrentAccountStore();
15
+ currentAccountSubject = new _rxjs.BehaviorSubject({
16
+ address: '',
17
+ currentGenesisHash: null
18
+ });
19
+ accountsSubject = _uiKeyring.keyring.accounts.subject;
20
+ beforeAccount = _uiKeyring.keyring.accounts.subject.value;
21
+ keyringStateSubject = new _rxjs.BehaviorSubject({
22
+ isReady: false,
23
+ hasMasterPassword: false,
24
+ isLocked: false
25
+ });
26
+ constructor(eventService) {
27
+ this.eventService = eventService;
28
+ this.currentAccountStore.get('CurrentAccountInfo', rs => {
29
+ this.currentAccountSubject.next(rs);
30
+ });
31
+ this.subscribeAccounts().catch(console.error);
32
+ }
33
+ async subscribeAccounts() {
34
+ // 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
+ });
42
+ this.beforeAccount = {
43
+ ...this.accountsSubject.value
44
+ };
45
+ this.accountsSubject.subscribe(subjectInfo => {
46
+ // Check if accounts changed
47
+ const beforeAddresses = Object.keys(this.beforeAccount);
48
+ const afterAddresses = Object.keys(subjectInfo);
49
+ if (beforeAddresses.length > afterAddresses.length) {
50
+ const removedAddresses = beforeAddresses.filter(address => !afterAddresses.includes(address));
51
+
52
+ // Remove account
53
+ removedAddresses.forEach(address => {
54
+ console.log('account.remove', address);
55
+ this.eventService.emit('account.remove', address);
56
+ });
57
+ } else if (beforeAddresses.length < afterAddresses.length) {
58
+ const addedAddresses = afterAddresses.filter(address => !beforeAddresses.includes(address));
59
+
60
+ // Add account
61
+ addedAddresses.forEach(address => {
62
+ console.log('account.add', address);
63
+ this.eventService.emit('account.add', address);
64
+ });
65
+ } else {
66
+ // Handle case update later
67
+ }
68
+ this.beforeAccount = {
69
+ ...subjectInfo
70
+ };
71
+ });
72
+ }
73
+ get keyringState() {
74
+ return this.keyringStateSubject.value;
75
+ }
76
+ updateKeyringState() {
77
+ var _keyring$keyring, _keyring$keyring2;
78
+ let isReady = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
79
+ if (!this.keyringState.isReady && isReady) {
80
+ this.eventService.emit('keyring.ready', true);
81
+ this.eventService.emit('account.ready', true);
82
+ }
83
+ this.keyringStateSubject.next({
84
+ hasMasterPassword: !!((_keyring$keyring = _uiKeyring.keyring.keyring) !== null && _keyring$keyring !== void 0 && _keyring$keyring.hasMasterPassword),
85
+ isLocked: !!((_keyring$keyring2 = _uiKeyring.keyring.keyring) !== null && _keyring$keyring2 !== void 0 && _keyring$keyring2.isLocked),
86
+ isReady: isReady
87
+ });
88
+ }
89
+ get accounts() {
90
+ return this.accountsSubject.value;
91
+ }
92
+ get currentAccount() {
93
+ return this.currentAccountSubject.value;
94
+ }
95
+ setCurrentAccount(currentAccountData) {
96
+ this.currentAccountSubject.next(currentAccountData);
97
+ this.eventService.emit('account.updateCurrent', currentAccountData);
98
+ this.currentAccountStore.set('CurrentAccountInfo', currentAccountData);
99
+ }
100
+ }
101
+ exports.KeyringService = KeyringService;
@@ -1,12 +1,13 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
3
  Object.defineProperty(exports, "__esModule", {
5
4
  value: true
6
5
  });
7
6
  exports.default = void 0;
8
7
  var _util = require("@polkadot/util");
9
- var _scripts = _interopRequireDefault(require("./scripts"));
8
+ var _scripts = _interopRequireWildcard(require("./scripts"));
9
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
10
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
10
11
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
11
12
  // SPDX-License-Identifier: Apache-2.0
12
13
 
@@ -21,23 +22,25 @@ class MigrationService {
21
22
  try {
22
23
  for (let i = 0; i < keys.length; i++) {
23
24
  const JobClass = _scripts.default[keys[i]];
25
+ const key = keys[i];
26
+ const name = JobClass.name;
24
27
  const check = await this.state.dbService.stores.migration.table.where({
25
- name: JobClass.name,
26
- key: keys[i]
28
+ name,
29
+ key
27
30
  }).first();
28
- if (!check) {
29
- const job = new JobClass(this.state);
31
+ if (!check || key.startsWith(_scripts.EVERYTIME)) {
30
32
  this.logger.log('Running script: ', JobClass.name);
33
+ const job = new JobClass(this.state);
31
34
  await job.run();
32
35
  await this.state.dbService.stores.migration.table.put({
33
- key: keys[i],
34
- name: JobClass.name,
35
- timestamp: +new Date()
36
+ key,
37
+ name,
38
+ timestamp: new Date().getTime()
36
39
  });
37
40
  }
38
41
  }
39
42
  } catch (error) {
40
- this.logger.warn('Migration error: ', error);
43
+ this.logger.error('Migration error: ', error);
41
44
  }
42
45
  this.logger.log('Migration done.');
43
46
  }
@@ -5,15 +5,20 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.default = void 0;
8
- var _Base = _interopRequireDefault(require("@subwallet/extension-base/koni/migration/Base"));
9
- var _databases = _interopRequireDefault(require("@subwallet/extension-base/services/storage-service/databases"));
8
+ var _Base = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/Base"));
9
+ var _uiKeyring = require("@subwallet/ui-keyring");
10
10
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
11
11
  // SPDX-License-Identifier: Apache-2.0
12
12
 
13
- class RemoveWrongCrowdloan extends _Base.default {
13
+ class AutoEnableChainsTokens extends _Base.default {
14
14
  async run() {
15
- const db = new _databases.default();
16
- await db.crowdloans.clear();
15
+ const accounts = _uiKeyring.keyring.getAccounts();
16
+ await this.state.autoEnableChains(accounts.map(_ref => {
17
+ let {
18
+ address
19
+ } = _ref;
20
+ return address;
21
+ }));
17
22
  }
18
23
  }
19
- exports.default = RemoveWrongCrowdloan;
24
+ exports.default = AutoEnableChainsTokens;
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.default = void 0;
8
+ var _types = require("@subwallet/chain-list/types");
8
9
  var _Base = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/Base"));
9
10
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
10
11
  // SPDX-License-Identifier: Apache-2.0
@@ -12,28 +13,47 @@ var _Base = _interopRequireDefault(require("@subwallet/extension-base/services/m
12
13
  class MigrateNetworkSettings extends _Base.default {
13
14
  async run() {
14
15
  const state = this.state;
15
- return new Promise((resolve, reject) => {
16
- chrome.storage.local.get('NetworkMap', function (items) {
17
- if (items && items.NetworkMap) {
18
- const networkMap = items.NetworkMap;
19
- const enableList = [];
20
- const stateMap = state.getChainStateMap();
21
- Object.entries(networkMap).forEach(_ref => {
22
- let [slug, chain] = _ref;
23
- if (chain.active) {
24
- const currentState = stateMap[slug];
16
+ const items = await new Promise(resolve => {
17
+ chrome.storage.local.get('NetworkMap', items => {
18
+ resolve(items);
19
+ });
20
+ });
21
+ const oldNetworkMap = items.NetworkMap;
22
+ const enableList = [];
23
+ const stateMap = state.getChainStateMap();
24
+ if (!oldNetworkMap) {
25
+ return;
26
+ }
27
+ Object.entries(oldNetworkMap).forEach(_ref => {
28
+ let [slug, chain] = _ref;
29
+ if (chain.active) {
30
+ const currentState = stateMap[slug];
31
+
32
+ // Ensure chain in the list and is not active
33
+ currentState && enableList.push(slug);
34
+ }
35
+ });
36
+ if (enableList.length > 0) {
37
+ state.chainService.enableChains(enableList);
25
38
 
26
- // Ensure chain in the list and is not active
27
- currentState && !currentState.active && enableList.push(slug);
28
- }
29
- });
30
- if (enableList.length > 0) {
31
- state.chainService.enableChains(enableList);
32
- }
39
+ // Enable native token of these chains
40
+ const currentAssetSettings = await state.chainService.getAssetSettings();
41
+ const assetInfoMap = state.chainService.getAssetRegistry();
42
+ Object.entries(assetInfoMap).forEach(_ref2 => {
43
+ let [slug, assetInfo] = _ref2;
44
+ const assetSetting = currentAssetSettings[slug] || {};
45
+
46
+ // Enable native token of these chains
47
+ if (assetInfo.name && assetInfo.assetType === _types._AssetType.NATIVE && enableList.includes(assetInfo.originChain) && !assetSetting.visible) {
48
+ currentAssetSettings[slug] = {
49
+ visible: true
50
+ };
33
51
  }
34
- resolve();
35
52
  });
36
- });
53
+ state.chainService.setAssetSettings({
54
+ ...currentAssetSettings
55
+ });
56
+ }
37
57
  }
38
58
  }
39
59
  exports.default = MigrateNetworkSettings;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _Base = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/Base"));
9
+ var _uiSettings = _interopRequireDefault(require("@polkadot/ui-settings"));
10
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
11
+ // SPDX-License-Identifier: Apache-2.0
12
+
13
+ class MigrateSettings extends _Base.default {
14
+ async run() {
15
+ try {
16
+ return new Promise(resolve => {
17
+ this.state.settingService.getSettings(currentSettings => {
18
+ const isAccessCamera = _uiSettings.default.camera === 'on';
19
+ this.state.settingService.setSettings({
20
+ ...currentSettings,
21
+ camera: isAccessCamera
22
+ });
23
+ resolve();
24
+ });
25
+ });
26
+ } catch (e) {
27
+ console.error(e);
28
+ }
29
+ }
30
+ }
31
+ exports.default = MigrateSettings;
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
9
+ var _utils = require("@subwallet/extension-base/services/chain-service/utils");
10
+ var _Base = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/Base"));
11
+ var _dexie = _interopRequireDefault(require("dexie"));
12
+ var _utilCrypto = require("@polkadot/util-crypto");
13
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
14
+ // SPDX-License-Identifier: Apache-2.0
15
+
16
+ class MigrateTransactionHistory extends _Base.default {
17
+ async run() {
18
+ const state = this.state;
19
+ const chainInfoMap = state.getChainInfoMap();
20
+ const assetList = Object.values(state.getAssetRegistry());
21
+ try {
22
+ const db = new _dexie.default('SubWalletDB');
23
+ const dexieDB = await db.open();
24
+ const transactionTable = dexieDB.table('transactions');
25
+ const oldTransactionData = await transactionTable.toArray();
26
+ const newTransactionItems = [];
27
+ oldTransactionData.forEach(item => {
28
+ const chainInfo = chainInfoMap[item.networkKey];
29
+ if (!chainInfo) {
30
+ return;
31
+ }
32
+ const direction = item.action === 'send' ? _KoniTypes.TransactionDirection.SEND : _KoniTypes.TransactionDirection.RECEIVED;
33
+ const extrinsicType = item.changeSymbol === item.feeSymbol ? _KoniTypes.ExtrinsicType.TRANSFER_BALANCE : _KoniTypes.ExtrinsicType.TRANSFER_TOKEN;
34
+ const nativeAsset = (0, _utils._getChainNativeTokenBasicInfo)(chainInfo);
35
+ const transferAsset = assetList.find(a => a.originChain === item.networkKey && a.symbol === item.changeSymbol) || nativeAsset;
36
+ const newItem = {
37
+ chain: item.networkKey,
38
+ origin: 'migration',
39
+ type: extrinsicType,
40
+ address: item.address,
41
+ extrinsicHash: item.extrinsicHash,
42
+ time: item.time,
43
+ status: item.isSuccess ? _KoniTypes.ExtrinsicStatus.SUCCESS : _KoniTypes.ExtrinsicStatus.FAIL,
44
+ from: direction === _KoniTypes.TransactionDirection.SEND ? item.address : '',
45
+ to: direction === _KoniTypes.TransactionDirection.RECEIVED ? item.address : '',
46
+ amount: {
47
+ value: item.change,
48
+ decimals: transferAsset.decimals || 18,
49
+ symbol: transferAsset.symbol
50
+ },
51
+ fee: {
52
+ value: item.fee,
53
+ decimals: nativeAsset.decimals,
54
+ symbol: nativeAsset.symbol
55
+ },
56
+ direction: direction,
57
+ chainType: (0, _utilCrypto.isEthereumAddress)(item.address) ? _KoniTypes.ChainType.EVM : _KoniTypes.ChainType.SUBSTRATE,
58
+ chainName: chainInfo.name,
59
+ blockNumber: 0,
60
+ blockHash: '',
61
+ data: '',
62
+ signature: ''
63
+ };
64
+ newTransactionItems.push(newItem);
65
+ });
66
+ await state.historyService.addHistoryItems(newTransactionItems);
67
+ } catch (e) {
68
+ this.logger.error(e);
69
+ }
70
+ }
71
+ }
72
+ exports.default = MigrateTransactionHistory;
@@ -4,14 +4,23 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.default = void 0;
7
+ exports.default = exports.EVERYTIME = void 0;
8
+ var _AutoEnableChainsTokens = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/scripts/AutoEnableChainsTokens"));
8
9
  var _MigrateImportedToken = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/scripts/MigrateImportedToken"));
9
10
  var _MigrateNetworkSettings = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/scripts/MigrateNetworkSettings"));
11
+ var _MigrateSettings = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/scripts/MigrateSettings"));
12
+ var _MigrateTransactionHistory = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/scripts/MigrateTransactionHistory"));
10
13
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
11
14
  // SPDX-License-Identifier: Apache-2.0
15
+
16
+ const EVERYTIME = '__everytime__';
17
+ exports.EVERYTIME = EVERYTIME;
12
18
  var _default = {
13
- '1.0.1-1': _MigrateNetworkSettings.default,
14
- '1.0.1-2': _MigrateImportedToken.default
15
- // '1.0.1-0': ClearOldStorage
19
+ '1.0.1-11': _MigrateNetworkSettings.default,
20
+ '1.0.1-20': _MigrateImportedToken.default,
21
+ '1.0.1-30': _MigrateTransactionHistory.default,
22
+ '1.0.1-40': _AutoEnableChainsTokens.default,
23
+ '1.0.1-50': _MigrateSettings.default
24
+ // [`${EVERYTIME}-1`]: AutoEnableChainsTokens
16
25
  };
17
26
  exports.default = _default;
@@ -9,16 +9,28 @@ var _axios = _interopRequireDefault(require("axios"));
9
9
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
10
10
  // SPDX-License-Identifier: Apache-2.0
11
11
 
12
+ let useBackupApi = false;
12
13
  const getTokenPrice = async function (priceIds) {
13
14
  let currency = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'usd';
14
15
  try {
16
+ var _res;
15
17
  const idStr = Array.from(priceIds).join(',');
16
- // const res = await axios.get(`https://api.coingecko.com/api/v3/coins/markets?vs_currency=${currency}&per_page=250&ids=${idStr}`);
17
- const res = await _axios.default.get(`https://chain-data.subwallet.app/api/price/get?ids=${idStr}`);
18
+ let res;
19
+ if (!useBackupApi) {
20
+ try {
21
+ res = await _axios.default.get(`https://api.coingecko.com/api/v3/coins/markets?vs_currency=${currency}&per_page=250&ids=${idStr}`);
22
+ } catch (err) {
23
+ useBackupApi = true;
24
+ }
25
+ }
26
+ if (useBackupApi || ((_res = res) === null || _res === void 0 ? void 0 : _res.status) !== 200) {
27
+ useBackupApi = true;
28
+ res = await _axios.default.get(`https://chain-data.subwallet.app/api/price/get?ids=${idStr}`);
29
+ }
18
30
  if (res.status !== 200) {
19
31
  console.warn('Failed to get token price');
20
32
  }
21
- const responseData = res.data;
33
+ const responseData = res.data || [];
22
34
  const priceMap = {};
23
35
  const price24hMap = {};
24
36
  responseData.forEach(val => {
@@ -19,27 +19,27 @@ const DEFAULT_PRICE_SUBJECT = {
19
19
  class PriceService {
20
20
  priceSubject = new _rxjs.BehaviorSubject(DEFAULT_PRICE_SUBJECT);
21
21
  priceIds = new Set();
22
- constructor(serviceInfoSubject, dbService, chainService) {
22
+ constructor(dbService, eventService, chainService) {
23
23
  this.dbService = dbService;
24
+ this.eventService = eventService;
24
25
  this.chainService = chainService;
25
26
 
26
27
  // Fetch data from storage
27
28
  this.getPrice().catch(console.error);
29
+ const eventHandler = () => {
30
+ const newPriceIds = this.getPriceIds();
28
31
 
29
- // Add some delay to avoid fetching many times when start extension background
30
- // Subscribe service info to update price list
31
- setTimeout(() => {
32
+ // Compare two set newPriceIds and this.priceIds
33
+ if (newPriceIds.size !== this.priceIds.size || !Array.from(newPriceIds).every(v => this.priceIds.has(v))) {
34
+ this.priceIds = newPriceIds;
35
+ this.refreshPriceData(this.priceIds);
36
+ }
37
+ };
38
+ this.eventService.waitAssetReady.then(() => {
32
39
  this.refreshPriceData();
33
- serviceInfoSubject.subscribe(serviceInfo => {
34
- const newPriceIds = this.getPriceIds();
35
-
36
- // Compare two set newPriceIds and this.priceIds
37
- if (newPriceIds.size !== this.priceIds.size || !Array.from(newPriceIds).every(v => this.priceIds.has(v))) {
38
- this.priceIds = newPriceIds;
39
- this.refreshPriceData(this.priceIds);
40
- }
41
- });
42
- }, 3000);
40
+ this.eventService.on('asset.updateState', eventHandler);
41
+ this.eventService.on('asset.updateState', eventHandler);
42
+ }).catch(console.error);
43
43
  }
44
44
  async getPrice() {
45
45
  const isReady = this.priceSubject.value.ready;
@@ -68,10 +68,7 @@ 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
- }).catch(e => {
73
- // Pass
74
- });
71
+ }).catch(console.error);
75
72
  this.refreshTimeout = setTimeout(this.refreshPriceData.bind(this), _constants.CRON_REFRESH_PRICE_INTERVAL);
76
73
  }
77
74
  }