@subwallet/extension-base 1.0.4-1 → 1.0.5-1

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 +12 -1
  2. package/background/KoniTypes.js +1 -0
  3. package/background/errors/TransactionError.js +4 -0
  4. package/background/handlers/State.d.ts +1 -1
  5. package/background/handlers/State.js +2 -8
  6. package/background/handlers/subscriptions.js +0 -1
  7. package/background/types.d.ts +2 -2
  8. package/cjs/background/KoniTypes.js +1 -0
  9. package/cjs/background/errors/TransactionError.js +4 -0
  10. package/cjs/background/handlers/State.js +1 -7
  11. package/cjs/background/handlers/subscriptions.js +0 -1
  12. package/cjs/constants/index.js +6 -6
  13. package/cjs/koni/api/coingecko.js +1 -4
  14. package/cjs/koni/api/dotsama/balance.js +7 -5
  15. package/cjs/koni/api/dotsama/crowdloan.js +0 -4
  16. package/cjs/koni/api/dotsama/transfer.js +0 -4
  17. package/cjs/koni/api/nft/acala_nft/index.js +1 -1
  18. package/cjs/koni/api/nft/bit.country/index.js +1 -1
  19. package/cjs/koni/api/nft/evm_nft/index.js +2 -3
  20. package/cjs/koni/api/nft/index.js +1 -2
  21. package/cjs/koni/api/nft/karura_nft/index.js +1 -1
  22. package/cjs/koni/api/nft/quartz_nft/index.js +1 -1
  23. package/cjs/koni/api/nft/rmrk_nft/index.js +2 -3
  24. package/cjs/koni/api/nft/statemine_nft/index.js +1 -1
  25. package/cjs/koni/api/nft/transfer.js +5 -5
  26. package/cjs/koni/api/nft/unique_nft/index.js +1 -1
  27. package/cjs/koni/api/nft/unique_nft/uniqueNftV2.js +0 -1
  28. package/cjs/koni/api/nft/wasm_nft/index.js +1 -2
  29. package/cjs/koni/api/staking/bonding/astar.js +28 -12
  30. package/cjs/koni/api/staking/bonding/utils.js +4 -0
  31. package/cjs/koni/api/staking/relayChain.js +0 -1
  32. package/cjs/koni/api/staking/subsquidStaking.js +0 -2
  33. package/cjs/koni/api/tokens/wasm/index.js +0 -1
  34. package/cjs/koni/api/tokens/wasm/utils.js +0 -1
  35. package/cjs/koni/api/xcm/index.js +0 -1
  36. package/cjs/koni/background/cron.js +0 -45
  37. package/cjs/koni/background/handlers/Extension.js +163 -133
  38. package/cjs/koni/background/handlers/State.js +18 -3
  39. package/cjs/koni/background/handlers/Tabs.js +34 -2
  40. package/cjs/koni/background/handlers/index.js +3 -2
  41. package/cjs/koni/background/subscription.js +0 -26
  42. package/cjs/packageInfo.js +1 -1
  43. package/cjs/services/chain-service/handler/EvmChainHandler.js +1 -1
  44. package/cjs/services/chain-service/handler/SubstrateChainHandler.js +2 -9
  45. package/cjs/services/chain-service/handler/light-client/index.js +9 -6
  46. package/cjs/services/chain-service/index.js +0 -2
  47. package/cjs/services/chain-service/utils.js +3 -0
  48. package/cjs/services/history-service/helpers/recoverHistoryStatus.js +108 -0
  49. package/cjs/services/history-service/index.js +60 -5
  50. package/cjs/services/history-service/subsquid-multi-chain-history.js +3 -2
  51. package/cjs/services/history-service/testChainMap.js +724 -0
  52. package/cjs/services/keyring-service/index.js +0 -2
  53. package/cjs/services/migration-service/index.js +0 -3
  54. package/cjs/services/migration-service/scripts/MigrateAutoLock.js +30 -0
  55. package/cjs/services/migration-service/scripts/MigrateChainPatrol.js +30 -0
  56. package/cjs/services/migration-service/scripts/index.js +5 -1
  57. package/cjs/services/price-service/coingecko.js +1 -1
  58. package/cjs/services/price-service/index.js +0 -3
  59. package/cjs/services/request-service/handler/AuthRequestHandler.js +1 -1
  60. package/cjs/services/setting-service/constants.js +8 -2
  61. package/cjs/services/storage-service/DatabaseService.js +2 -44
  62. package/cjs/services/transaction-service/constants.js +11 -0
  63. package/cjs/services/transaction-service/index.js +28 -9
  64. package/cjs/services/transaction-service/utils.js +25 -14
  65. package/constants/index.d.ts +1 -1
  66. package/constants/index.js +1 -1
  67. package/koni/api/coingecko.js +1 -4
  68. package/koni/api/dotsama/balance.js +7 -5
  69. package/koni/api/dotsama/crowdloan.js +0 -4
  70. package/koni/api/dotsama/transfer.js +0 -4
  71. package/koni/api/nft/acala_nft/index.js +1 -1
  72. package/koni/api/nft/bit.country/index.js +1 -1
  73. package/koni/api/nft/evm_nft/index.js +2 -3
  74. package/koni/api/nft/index.js +1 -2
  75. package/koni/api/nft/karura_nft/index.js +1 -1
  76. package/koni/api/nft/quartz_nft/index.js +1 -1
  77. package/koni/api/nft/rmrk_nft/index.js +2 -3
  78. package/koni/api/nft/statemine_nft/index.js +1 -1
  79. package/koni/api/nft/transfer.js +5 -5
  80. package/koni/api/nft/unique_nft/index.js +1 -1
  81. package/koni/api/nft/unique_nft/uniqueNftV2.js +0 -1
  82. package/koni/api/nft/wasm_nft/index.js +1 -2
  83. package/koni/api/staking/bonding/astar.d.ts +2 -1
  84. package/koni/api/staking/bonding/astar.js +27 -12
  85. package/koni/api/staking/bonding/utils.js +4 -0
  86. package/koni/api/staking/relayChain.js +0 -1
  87. package/koni/api/staking/subsquidStaking.js +0 -2
  88. package/koni/api/tokens/wasm/index.js +0 -1
  89. package/koni/api/tokens/wasm/utils.js +0 -1
  90. package/koni/api/xcm/index.js +0 -1
  91. package/koni/background/cron.js +0 -45
  92. package/koni/background/handlers/Extension.d.ts +2 -0
  93. package/koni/background/handlers/Extension.js +78 -50
  94. package/koni/background/handlers/State.d.ts +3 -1
  95. package/koni/background/handlers/State.js +18 -3
  96. package/koni/background/handlers/Tabs.d.ts +1 -0
  97. package/koni/background/handlers/Tabs.js +32 -1
  98. package/koni/background/handlers/index.js +3 -2
  99. package/koni/background/subscription.d.ts +0 -1
  100. package/koni/background/subscription.js +0 -26
  101. package/package.json +55 -34
  102. package/packageInfo.js +1 -1
  103. package/services/chain-service/handler/EvmChainHandler.js +1 -1
  104. package/services/chain-service/handler/SubstrateChainHandler.js +2 -9
  105. package/services/chain-service/handler/light-client/index.js +8 -6
  106. package/services/chain-service/helper/api-helper/spec/acala.d.ts +3 -3
  107. package/services/chain-service/index.js +0 -2
  108. package/services/chain-service/utils.js +3 -0
  109. package/services/history-service/helpers/recoverHistoryStatus.d.ts +11 -0
  110. package/services/history-service/helpers/recoverHistoryStatus.js +98 -0
  111. package/services/history-service/index.d.ts +6 -0
  112. package/services/history-service/index.js +61 -6
  113. package/services/history-service/subsquid-multi-chain-history.js +3 -2
  114. package/services/history-service/testChainMap.d.ts +3 -0
  115. package/services/history-service/testChainMap.js +716 -0
  116. package/services/keyring-service/index.js +0 -2
  117. package/services/migration-service/index.js +0 -3
  118. package/services/migration-service/scripts/MigrateAutoLock.d.ts +4 -0
  119. package/services/migration-service/scripts/MigrateAutoLock.js +22 -0
  120. package/services/migration-service/scripts/MigrateChainPatrol.d.ts +4 -0
  121. package/services/migration-service/scripts/MigrateChainPatrol.js +22 -0
  122. package/services/migration-service/scripts/index.js +5 -1
  123. package/services/price-service/coingecko.js +1 -1
  124. package/services/price-service/index.js +0 -3
  125. package/services/request-service/handler/AuthRequestHandler.js +1 -1
  126. package/services/setting-service/constants.d.ts +4 -2
  127. package/services/setting-service/constants.js +5 -1
  128. package/services/storage-service/DatabaseService.js +2 -44
  129. package/services/transaction-service/constants.d.ts +1 -0
  130. package/services/transaction-service/constants.js +4 -0
  131. package/services/transaction-service/index.d.ts +1 -0
  132. package/services/transaction-service/index.js +29 -10
  133. package/services/transaction-service/utils.d.ts +1 -1
  134. package/services/transaction-service/utils.js +24 -13
@@ -41,7 +41,6 @@ export class KeyringService {
41
41
 
42
42
  // Remove account
43
43
  removedAddresses.forEach(address => {
44
- console.log('account.remove', address);
45
44
  this.eventService.emit('account.remove', address);
46
45
  });
47
46
  } else if (beforeAddresses.length < afterAddresses.length) {
@@ -49,7 +48,6 @@ export class KeyringService {
49
48
 
50
49
  // Add account
51
50
  addedAddresses.forEach(address => {
52
- console.log('account.add', address);
53
51
  this.eventService.emit('account.add', address);
54
52
  });
55
53
  } else {
@@ -9,7 +9,6 @@ export default class MigrationService {
9
9
  this.logger = createLogger('Migration');
10
10
  }
11
11
  async run() {
12
- this.logger.log('Migrating...');
13
12
  const keys = Object.keys(MigrationScripts).sort((a, b) => a.localeCompare(b));
14
13
 
15
14
  // Await timeout 2s
@@ -24,7 +23,6 @@ export default class MigrationService {
24
23
  key
25
24
  }).first();
26
25
  if (!check || key.startsWith(EVERYTIME)) {
27
- this.logger.log('Running script: ', JobClass.name);
28
26
  const job = new JobClass(this.state);
29
27
  await job.run();
30
28
  await this.state.dbService.stores.migration.table.put({
@@ -37,6 +35,5 @@ export default class MigrationService {
37
35
  this.logger.error('Migration error: ', MigrationScripts[keys[i]].name, error);
38
36
  }
39
37
  }
40
- this.logger.log('Migration done.');
41
38
  }
42
39
  }
@@ -0,0 +1,4 @@
1
+ import BaseMigrationJob from '@subwallet/extension-base/services/migration-service/Base';
2
+ export default class MigrateAutoLock extends BaseMigrationJob {
3
+ run(): Promise<void>;
4
+ }
@@ -0,0 +1,22 @@
1
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import BaseMigrationJob from '@subwallet/extension-base/services/migration-service/Base';
5
+ import { DEFAULT_AUTO_LOCK_TIME } from '@subwallet/extension-base/services/setting-service/constants';
6
+ export default class MigrateAutoLock extends BaseMigrationJob {
7
+ async run() {
8
+ try {
9
+ return new Promise(resolve => {
10
+ this.state.settingService.getSettings(currentSettings => {
11
+ this.state.settingService.setSettings({
12
+ ...currentSettings,
13
+ timeAutoLock: DEFAULT_AUTO_LOCK_TIME
14
+ });
15
+ resolve();
16
+ });
17
+ });
18
+ } catch (e) {
19
+ console.error(e);
20
+ }
21
+ }
22
+ }
@@ -0,0 +1,4 @@
1
+ import BaseMigrationJob from '@subwallet/extension-base/services/migration-service/Base';
2
+ export default class MigrateChainPatrol extends BaseMigrationJob {
3
+ run(): Promise<void>;
4
+ }
@@ -0,0 +1,22 @@
1
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import BaseMigrationJob from '@subwallet/extension-base/services/migration-service/Base';
5
+ import { DEFAULT_CHAIN_PATROL_ENABLE } from '@subwallet/extension-base/services/setting-service/constants';
6
+ export default class MigrateChainPatrol extends BaseMigrationJob {
7
+ async run() {
8
+ try {
9
+ return new Promise(resolve => {
10
+ this.state.settingService.getSettings(currentSettings => {
11
+ this.state.settingService.setSettings({
12
+ ...currentSettings,
13
+ enableChainPatrol: DEFAULT_CHAIN_PATROL_ENABLE
14
+ });
15
+ resolve();
16
+ });
17
+ });
18
+ } catch (e) {
19
+ console.error(e);
20
+ }
21
+ }
22
+ }
@@ -3,6 +3,8 @@
3
3
 
4
4
  import AutoEnableChainsTokens from '@subwallet/extension-base/services/migration-service/scripts/AutoEnableChainsTokens';
5
5
  import MigrateAuthUrls from '@subwallet/extension-base/services/migration-service/scripts/MigrateAuthUrls';
6
+ import MigrateAutoLock from '@subwallet/extension-base/services/migration-service/scripts/MigrateAutoLock';
7
+ import MigrateChainPatrol from '@subwallet/extension-base/services/migration-service/scripts/MigrateChainPatrol';
6
8
  import MigrateImportedToken from '@subwallet/extension-base/services/migration-service/scripts/MigrateImportedToken';
7
9
  import MigrateNetworkSettings from '@subwallet/extension-base/services/migration-service/scripts/MigrateNetworkSettings';
8
10
  import MigrateSettings from '@subwallet/extension-base/services/migration-service/scripts/MigrateSettings';
@@ -14,6 +16,8 @@ export default {
14
16
  '1.0.1-30': MigrateTransactionHistory,
15
17
  '1.0.1-40': AutoEnableChainsTokens,
16
18
  '1.0.1-50': MigrateSettings,
17
- '1.0.1-60': MigrateAuthUrls
19
+ '1.0.1-60': MigrateAuthUrls,
20
+ '1.0.3-01': MigrateAutoLock,
21
+ '1.0.3-02': MigrateChainPatrol
18
22
  // [`${EVERYTIME}-1`]: AutoEnableChainsTokens
19
23
  };
@@ -37,7 +37,7 @@ export const getTokenPrice = async (priceIds, currency = 'usd') => {
37
37
  price24hMap
38
38
  };
39
39
  } catch (err) {
40
- console.error('Failed to get token price', err);
40
+ console.error(err);
41
41
  throw err;
42
42
  }
43
43
  };
@@ -34,7 +34,6 @@ export class PriceService {
34
34
  }
35
35
  refreshPriceData(priceIds) {
36
36
  clearTimeout(this.refreshTimeout);
37
- console.log('Refresh Price Data');
38
37
  this.priceIds = priceIds || this.getPriceIds();
39
38
 
40
39
  // Update for tokens price
@@ -73,7 +72,6 @@ export class PriceService {
73
72
  }
74
73
  startPromiseHandler = createPromiseHandler();
75
74
  async start() {
76
- console.debug('Start price service');
77
75
  try {
78
76
  this.startPromiseHandler = createPromiseHandler();
79
77
  this.status = ServiceStatus.STARTING;
@@ -90,7 +88,6 @@ export class PriceService {
90
88
  }
91
89
  stopPromiseHandler = createPromiseHandler();
92
90
  async stop() {
93
- console.debug('Stop price service');
94
91
  try {
95
92
  this.status = ServiceStatus.STOPPING;
96
93
  this.stopPromiseHandler = createPromiseHandler();
@@ -68,7 +68,7 @@ export default class AuthRequestHandler {
68
68
  update(this.authorizeCached);
69
69
  } else {
70
70
  this.authorizeStore.get('authUrls', data => {
71
- this.authorizeCached = data;
71
+ this.authorizeCached = data || {};
72
72
  update(this.authorizeCached);
73
73
  });
74
74
  }
@@ -1,4 +1,6 @@
1
- import { BrowserConfirmationType, RequestSettingsType, ThemeNames } from '@subwallet/extension-base/background/KoniTypes';
1
+ import { BrowserConfirmationType, ThemeNames, UiSettings } from '@subwallet/extension-base/background/KoniTypes';
2
2
  export declare const DEFAULT_THEME: ThemeNames;
3
3
  export declare const DEFAULT_NOTIFICATION_TYPE: BrowserConfirmationType;
4
- export declare const DEFAULT_SETTING: RequestSettingsType;
4
+ export declare const DEFAULT_AUTO_LOCK_TIME = 15;
5
+ export declare const DEFAULT_CHAIN_PATROL_ENABLE = false;
6
+ export declare const DEFAULT_SETTING: UiSettings;
@@ -4,6 +4,8 @@
4
4
  import { ThemeNames } from '@subwallet/extension-base/background/KoniTypes';
5
5
  export const DEFAULT_THEME = ThemeNames.DARK;
6
6
  export const DEFAULT_NOTIFICATION_TYPE = 'popup';
7
+ export const DEFAULT_AUTO_LOCK_TIME = 15;
8
+ export const DEFAULT_CHAIN_PATROL_ENABLE = false;
7
9
  export const DEFAULT_SETTING = {
8
10
  // language: 'en',
9
11
  browserConfirmationType: DEFAULT_NOTIFICATION_TYPE,
@@ -11,5 +13,7 @@ export const DEFAULT_SETTING = {
11
13
  isShowBalance: false,
12
14
  accountAllLogo: '',
13
15
  theme: DEFAULT_THEME,
14
- camera: false
16
+ camera: false,
17
+ timeAutoLock: DEFAULT_AUTO_LOCK_TIME,
18
+ enableChainPatrol: DEFAULT_CHAIN_PATROL_ENABLE
15
19
  };
@@ -38,6 +38,7 @@ export default class DatabaseService {
38
38
  const rs = await this.stores.price.table.get('usd');
39
39
  return rs;
40
40
  } catch (e) {
41
+ this.logger.error(e);
41
42
  return undefined;
42
43
  }
43
44
  }
@@ -48,8 +49,6 @@ export default class DatabaseService {
48
49
  }
49
50
  async updateBalanceStore(address, item) {
50
51
  if (item.state === APIItemState.READY) {
51
- // this.logger.log(`Updating balance for [${item.tokenSlug}]`);
52
-
53
52
  return this.stores.balance.upsert({
54
53
  address,
55
54
  ...item
@@ -57,23 +56,18 @@ export default class DatabaseService {
57
56
  }
58
57
  }
59
58
  async removeFromBalanceStore(assets) {
60
- this.logger.log('Bulk removing AssetStore');
61
59
  return this.stores.balance.removeBySlugs(assets);
62
60
  }
63
61
 
64
62
  // Crowdloan
65
63
  async updateCrowdloanStore(chain, address, item) {
66
64
  if (item.state === APIItemState.READY && item.contribute !== '0') {
67
- // this.logger.log(`Updating crowdloan for [${chain}]`);
68
-
69
65
  return this.stores.crowdloan.upsert({
70
66
  chain,
71
67
  address,
72
68
  ...item
73
69
  });
74
70
  } else {
75
- // this.logger.debug(`Removing crowdloan for [${chain}]`);
76
-
77
71
  return this.stores.crowdloan.deleteByChainAndAddress(chain, address);
78
72
  }
79
73
  }
@@ -81,22 +75,16 @@ export default class DatabaseService {
81
75
  // Staking
82
76
  async updateStaking(chain, address, item) {
83
77
  if (item.state === APIItemState.READY) {
84
- // this.logger.log(`Updating staking for [${chain}]`);
85
-
86
78
  return this.stores.staking.upsert(item);
87
79
  }
88
80
  }
89
81
  async getStakings(addresses, chains) {
90
- // this.logger.log('Get Stakings: ', stakings);
91
-
92
82
  return this.stores.staking.getStakings(addresses, chains);
93
83
  }
94
84
  async getStakingsByChains(chains) {
95
85
  return this.stores.staking.getStakingsByChains(chains);
96
86
  }
97
87
  async getPooledStakings(addresses, chainHashes) {
98
- // this.logger.log('Get Pooled Stakings: ', stakings);
99
-
100
88
  return this.stores.staking.getPooledStakings(addresses, chainHashes);
101
89
  }
102
90
  subscribeStaking(addresses, chainList, callback) {
@@ -122,12 +110,10 @@ export default class DatabaseService {
122
110
  return this.stores.transaction.queryHistory(query);
123
111
  }
124
112
  async upsertHistory(histories) {
125
- // this.logger.log('Updating transaction histories');
126
113
  const cleanedHistory = histories.filter(x => x && x.address && x.chain && x.extrinsicHash);
127
114
  return this.stores.transaction.bulkUpsert(cleanedHistory);
128
115
  }
129
116
  async updateHistoryByNewExtrinsicHash(extrinsicHash, updateData) {
130
- // this.logger.log('Updating transaction histories');
131
117
  const canUpdate = updateData && extrinsicHash;
132
118
  if (!canUpdate) {
133
119
  return;
@@ -139,8 +125,6 @@ export default class DatabaseService {
139
125
 
140
126
  // NFT Collection
141
127
  async addNftCollection(collection) {
142
- // this.logger.log(`Updating NFT collection for [${collection.chain}]`);
143
-
144
128
  return this.stores.nftCollection.upsert(collection);
145
129
  }
146
130
  async deleteNftCollection(chain, collectionId) {
@@ -163,18 +147,12 @@ export default class DatabaseService {
163
147
  if (ownNothing) {
164
148
  return this.stores.nft.deleteNftsByChainAndOwner(chain, reformatAddress(owner, 42));
165
149
  }
166
- const result = await this.stores.nft.cleanUpNfts(chain, reformatAddress(owner, 42), collectionIds, nftIds);
167
- result > 0 && console.debug(`Cleaned up ${result} NFTs on chain ${chain} for owner ${reformatAddress(owner, 42)}`, collectionIds, nftIds);
168
- return result;
150
+ return this.stores.nft.cleanUpNfts(chain, reformatAddress(owner, 42), collectionIds, nftIds);
169
151
  }
170
152
  async getNft(addresses, chainHashes) {
171
- // this.logger.log('Get NFTs: ', nfts);
172
-
173
153
  return this.stores.nft.getNft(addresses, chainHashes);
174
154
  }
175
155
  async addNft(address, nft) {
176
- // this.logger.log(`Updating NFT for [${nft.chain}]`);
177
-
178
156
  return this.stores.nft.upsert({
179
157
  ...nft,
180
158
  address
@@ -184,54 +162,36 @@ export default class DatabaseService {
184
162
  return this.stores.nft.deleteNftItem(chain, addresses, nftItem);
185
163
  }
186
164
  removeNfts(chain, address, collectionId, nftIds) {
187
- // this.logger.log(`Remove NFTs [${nftIds.join(', ')}]`);
188
-
189
165
  return this.stores.nft.removeNfts(chain, address, collectionId, nftIds);
190
166
  }
191
167
 
192
168
  // Chain
193
169
  async updateChainStore(item) {
194
- // this.logger.log(`Updating storageInfo for chain [${item.slug}]`);
195
-
196
170
  return this.stores.chain.upsert(item);
197
171
  }
198
172
  async bulkUpdateChainStore(data) {
199
- // this.logger.log('Bulk updating ChainStore');
200
-
201
173
  return this.stores.chain.bulkUpsert(data);
202
174
  }
203
175
  async removeFromChainStore(chains) {
204
- // this.logger.log('Bulk removing ChainStore');
205
-
206
176
  return this.stores.chain.removeChains(chains);
207
177
  }
208
178
  async getAllChainStore() {
209
- // this.logger.log('Get all chains: ', allChains);
210
-
211
179
  return this.stores.chain.getAll();
212
180
  }
213
181
 
214
182
  // Asset
215
183
  async updateAssetStore(item) {
216
- // this.logger.log(`Updating storageInfo for chainAsset [${item.originChain}]`);
217
-
218
184
  return this.stores.asset.upsert(item);
219
185
  }
220
186
  async getAllAssetStore() {
221
- // this.logger.log('Get all stored assets: ', allAssets);
222
-
223
187
  return this.stores.asset.getAll();
224
188
  }
225
189
  async removeFromAssetStore(items) {
226
- // this.logger.log('Bulk removing AssetStore');
227
-
228
190
  return this.stores.asset.removeAssets(items);
229
191
  }
230
192
 
231
193
  // Staking
232
194
  async updateChainStakingMetadata(item) {
233
- // this.logger.log('Update ChainStakingMetadata: ', item.chain);
234
-
235
195
  return this.stores.chainStakingMetadata.upsert(item);
236
196
  }
237
197
  async getChainStakingMetadata() {
@@ -241,8 +201,6 @@ export default class DatabaseService {
241
201
  return this.stores.chainStakingMetadata.getByChainAndType(chain, type);
242
202
  }
243
203
  async updateNominatorMetadata(item) {
244
- // this.logger.log('Update NominatorMetadata: ', item.address, item.chain);
245
-
246
204
  return this.stores.nominatorMetadata.upsert(item);
247
205
  }
248
206
  async getNominatorMetadata() {
@@ -0,0 +1 @@
1
+ export declare const TRANSACTION_TIMEOUT: number;
@@ -0,0 +1,4 @@
1
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export const TRANSACTION_TIMEOUT = 2 * 60 * 1000;
@@ -45,5 +45,6 @@ export default class TransactionService {
45
45
  generateHashPayload(chain: string, transaction: TransactionConfig): HexString;
46
46
  private signAndSendEvmTransaction;
47
47
  private signAndSendSubstrateTransaction;
48
+ private handleTransactionTimeout;
48
49
  resetWallet(): void;
49
50
  }
@@ -8,9 +8,10 @@ import { TransactionWarning } from '@subwallet/extension-base/background/warning
8
8
  import { ALL_ACCOUNT_KEY } from '@subwallet/extension-base/constants';
9
9
  import { _getChainNativeTokenBasicInfo, _getEvmChainId } from '@subwallet/extension-base/services/chain-service/utils';
10
10
  import { EXTENSION_REQUEST_URL } from '@subwallet/extension-base/services/request-service/constants';
11
+ import { TRANSACTION_TIMEOUT } from '@subwallet/extension-base/services/transaction-service/constants';
11
12
  import { parseTransferEventLogs, parseXcmEventLogs } from '@subwallet/extension-base/services/transaction-service/event-parser';
12
13
  import { getTransactionId, isSubstrateTransaction } from '@subwallet/extension-base/services/transaction-service/helpers';
13
- import { getTransactionLink, parseTransactionData } from '@subwallet/extension-base/services/transaction-service/utils';
14
+ import { getExplorerLink, parseTransactionData } from '@subwallet/extension-base/services/transaction-service/utils';
14
15
  import { anyNumberToBN } from '@subwallet/extension-base/utils/eth';
15
16
  import { parseTxAndSignature } from '@subwallet/extension-base/utils/eth/mergeTransactionAndSignature';
16
17
  import { isContractAddress, parseContractInput } from '@subwallet/extension-base/utils/eth/parseTransaction';
@@ -269,7 +270,7 @@ export default class TransactionService {
269
270
  getTransactionLink(id) {
270
271
  const transaction = this.getTransaction(id);
271
272
  const chainInfo = this.chainService.getChainInfoByKey(transaction.chain);
272
- return getTransactionLink(chainInfo, transaction.extrinsicHash);
273
+ return getExplorerLink(chainInfo, transaction.extrinsicHash, 'tx');
273
274
  }
274
275
  transactionToHistories(id, eventLogs) {
275
276
  const transaction = this.getTransaction(id);
@@ -455,7 +456,7 @@ export default class TransactionService {
455
456
  onSigned({
456
457
  id
457
458
  }) {
458
- console.log(`Transaction "${id}" is signed`);
459
+ console.debug(`Transaction "${id}" is signed`);
459
460
  }
460
461
  onSend({
461
462
  id
@@ -467,22 +468,24 @@ export default class TransactionService {
467
468
 
468
469
  // Create Input History Transaction History
469
470
  this.historyService.insertHistories(this.transactionToHistories(id)).catch(console.error);
470
- console.log(`Transaction "${id}" is sent`);
471
+ console.debug(`Transaction "${id}" is sent`);
471
472
  }
472
473
  onHasTransactionHash({
474
+ blockHash,
473
475
  extrinsicHash,
474
476
  id
475
477
  }) {
476
478
  // Write processing transaction history
477
479
  const updateData = {
478
480
  extrinsicHash,
479
- status: ExtrinsicStatus.PROCESSING
481
+ status: ExtrinsicStatus.PROCESSING,
482
+ blockHash: blockHash || ''
480
483
  };
481
484
  this.updateTransaction(id, updateData);
482
485
 
483
486
  // In this case transaction id is the same as extrinsic hash and will change after below update
484
487
  this.historyService.updateHistoryByExtrinsicHash(id, updateData).catch(console.error);
485
- console.log(`Transaction "${id}" is submitted with hash ${extrinsicHash || ''}`);
488
+ console.debug(`Transaction "${id}" is submitted with hash ${extrinsicHash || ''}`);
486
489
  }
487
490
  handlePostProcessing(id) {
488
491
  // must be done after success/failure to make sure the transaction is finalized
@@ -519,7 +522,6 @@ export default class TransactionService {
519
522
  this.updateTransaction(id, {
520
523
  status: ExtrinsicStatus.SUCCESS
521
524
  });
522
- console.log('Transaction completed', id, transaction.extrinsicHash);
523
525
 
524
526
  // Write success transaction history
525
527
  this.historyService.updateHistories(transaction.chain, transaction.extrinsicHash, {
@@ -551,7 +553,6 @@ export default class TransactionService {
551
553
  status: nextStatus,
552
554
  errors
553
555
  });
554
- console.log('Transaction failed', id, transaction.extrinsicHash);
555
556
 
556
557
  // Write failed transaction history
557
558
  this.historyService.updateHistories(transaction.chain, transaction.extrinsicHash, {
@@ -570,8 +571,6 @@ export default class TransactionService {
570
571
  });
571
572
  }
572
573
  this.eventService.emit('transaction.failed', transaction);
573
- // Log transaction errors
574
- console.error(errors);
575
574
  }
576
575
  generateHashPayload(chain, transaction) {
577
576
  const chainInfo = this.chainService.getChainInfoByKey(chain);
@@ -680,6 +679,7 @@ export default class TransactionService {
680
679
  emitter.emit('signed', eventData);
681
680
 
682
681
  // Send transaction
682
+ this.handleTransactionTimeout(emitter, eventData);
683
683
  emitter.emit('send', eventData); // This event is needed after sending transaction with queue
684
684
  signedTransaction && web3Api.eth.sendSignedTransaction(signedTransaction).once('transactionHash', hash => {
685
685
  eventData.extrinsicHash = hash;
@@ -734,7 +734,9 @@ export default class TransactionService {
734
734
  emitter.emit('signed', eventData);
735
735
 
736
736
  // Send transaction
737
+ this.handleTransactionTimeout(emitter, eventData);
737
738
  emitter.emit('send', eventData); // This event is needed after sending transaction with queue
739
+
738
740
  rs.send(txState => {
739
741
  // handle events, logs, history
740
742
  if (!txState || !txState.status) {
@@ -744,6 +746,7 @@ export default class TransactionService {
744
746
  eventData.eventLogs = txState.events;
745
747
  if (!eventData.extrinsicHash || eventData.extrinsicHash === '') {
746
748
  eventData.extrinsicHash = txState.txHash.toHex();
749
+ eventData.blockHash = txState.status.asInBlock.toHex();
747
750
  emitter.emit('extrinsicHash', eventData);
748
751
  }
749
752
  }
@@ -779,6 +782,22 @@ export default class TransactionService {
779
782
  });
780
783
  return emitter;
781
784
  }
785
+ handleTransactionTimeout(emitter, eventData) {
786
+ const timeout = setTimeout(() => {
787
+ const transaction = this.getTransaction(eventData.id);
788
+ if (transaction.status !== ExtrinsicStatus.SUCCESS && transaction.status !== ExtrinsicStatus.FAIL) {
789
+ eventData.errors.push(new TransactionError(BasicTxErrorType.TIMEOUT, 'Transaction timeout'));
790
+ emitter.emit('error', eventData);
791
+ clearTimeout(timeout);
792
+ }
793
+ }, TRANSACTION_TIMEOUT);
794
+ emitter.once('success', () => {
795
+ clearTimeout(timeout);
796
+ });
797
+ emitter.once('error', () => {
798
+ clearTimeout(timeout);
799
+ });
800
+ }
782
801
  resetWallet() {
783
802
  this.transactionSubject.next({});
784
803
  }
@@ -1,4 +1,4 @@
1
1
  import { _ChainInfo } from '@subwallet/chain-list/types';
2
2
  import { ExtrinsicDataTypeMap, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
3
3
  export declare function parseTransactionData<T extends ExtrinsicType>(data: unknown): ExtrinsicDataTypeMap[T];
4
- export declare function getTransactionLink(chainInfo: _ChainInfo, extrinsicHash: string): string | undefined;
4
+ export declare function getExplorerLink(chainInfo: _ChainInfo, value: string, type: 'account' | 'tx'): string | undefined;
@@ -8,19 +8,30 @@ export function parseTransactionData(data) {
8
8
  // eslint-disable-next-line @typescript-eslint/no-unsafe-return
9
9
  return data;
10
10
  }
11
- export function getTransactionLink(chainInfo, extrinsicHash) {
12
- if (extrinsicHash.startsWith('0x')) {
13
- const explorerLink = _getBlockExplorerFromChain(chainInfo);
14
- if (_isPureEvmChain(chainInfo)) {
15
- if (explorerLink) {
16
- return `${explorerLink}${explorerLink.endsWith('/') ? '' : '/'}tx/${extrinsicHash}`;
17
- }
18
- } else {
19
- const explorerLink = _getBlockExplorerFromChain(chainInfo);
20
- if (explorerLink) {
21
- return `${explorerLink}${explorerLink.endsWith('/') ? '' : '/'}extrinsic/${extrinsicHash}`;
22
- }
23
- }
11
+ function getBlockExplorerAccountRoute(explorerLink) {
12
+ if (explorerLink.includes('explorer.subspace.network')) {
13
+ return 'accounts';
14
+ }
15
+ if (explorerLink.includes('subscan.io')) {
16
+ return 'account';
17
+ }
18
+ return 'address';
19
+ }
20
+ function getBlockExplorerTxRoute(chainInfo) {
21
+ if (_isPureEvmChain(chainInfo)) {
22
+ return 'tx';
23
+ }
24
+ return 'extrinsic';
25
+ }
26
+ export function getExplorerLink(chainInfo, value, type) {
27
+ const explorerLink = _getBlockExplorerFromChain(chainInfo);
28
+ if (explorerLink && type === 'account') {
29
+ const route = getBlockExplorerAccountRoute(explorerLink);
30
+ return `${explorerLink}${explorerLink.endsWith('/') ? '' : '/'}${route}/${value}`;
31
+ }
32
+ if (explorerLink && value.startsWith('0x')) {
33
+ const route = getBlockExplorerTxRoute(chainInfo);
34
+ return `${explorerLink}${explorerLink.endsWith('/') ? '' : '/'}${route}/${value}`;
24
35
  }
25
36
  return undefined;
26
37
  }