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

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 (140) hide show
  1. package/background/KoniTypes.d.ts +14 -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 +164 -134
  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 +227 -0
  49. package/cjs/services/history-service/index.js +68 -6
  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/notification-service/NotificationService.js +1 -1
  58. package/cjs/services/price-service/coingecko.js +1 -1
  59. package/cjs/services/price-service/index.js +0 -3
  60. package/cjs/services/request-service/handler/AuthRequestHandler.js +1 -1
  61. package/cjs/services/setting-service/constants.js +8 -2
  62. package/cjs/services/storage-service/DatabaseService.js +3 -45
  63. package/cjs/services/transaction-service/constants.js +11 -0
  64. package/cjs/services/transaction-service/index.js +60 -20
  65. package/cjs/services/transaction-service/utils.js +25 -14
  66. package/cjs/utils/index.js +3 -0
  67. package/constants/index.d.ts +1 -1
  68. package/constants/index.js +1 -1
  69. package/koni/api/coingecko.js +1 -4
  70. package/koni/api/dotsama/balance.js +7 -5
  71. package/koni/api/dotsama/crowdloan.js +0 -4
  72. package/koni/api/dotsama/transfer.js +0 -4
  73. package/koni/api/nft/acala_nft/index.js +1 -1
  74. package/koni/api/nft/bit.country/index.js +1 -1
  75. package/koni/api/nft/evm_nft/index.js +2 -3
  76. package/koni/api/nft/index.js +1 -2
  77. package/koni/api/nft/karura_nft/index.js +1 -1
  78. package/koni/api/nft/quartz_nft/index.js +1 -1
  79. package/koni/api/nft/rmrk_nft/index.js +2 -3
  80. package/koni/api/nft/statemine_nft/index.js +1 -1
  81. package/koni/api/nft/transfer.js +5 -5
  82. package/koni/api/nft/unique_nft/index.js +1 -1
  83. package/koni/api/nft/unique_nft/uniqueNftV2.js +0 -1
  84. package/koni/api/nft/wasm_nft/index.js +1 -2
  85. package/koni/api/staking/bonding/astar.d.ts +2 -1
  86. package/koni/api/staking/bonding/astar.js +27 -12
  87. package/koni/api/staking/bonding/utils.js +4 -0
  88. package/koni/api/staking/relayChain.js +0 -1
  89. package/koni/api/staking/subsquidStaking.js +0 -2
  90. package/koni/api/tokens/wasm/index.js +0 -1
  91. package/koni/api/tokens/wasm/utils.js +0 -1
  92. package/koni/api/xcm/index.js +0 -1
  93. package/koni/background/cron.js +0 -45
  94. package/koni/background/handlers/Extension.d.ts +2 -0
  95. package/koni/background/handlers/Extension.js +79 -51
  96. package/koni/background/handlers/State.d.ts +3 -1
  97. package/koni/background/handlers/State.js +18 -3
  98. package/koni/background/handlers/Tabs.d.ts +1 -0
  99. package/koni/background/handlers/Tabs.js +32 -1
  100. package/koni/background/handlers/index.js +3 -2
  101. package/koni/background/subscription.d.ts +0 -1
  102. package/koni/background/subscription.js +0 -26
  103. package/package.json +55 -34
  104. package/packageInfo.js +1 -1
  105. package/services/chain-service/handler/EvmChainHandler.js +1 -1
  106. package/services/chain-service/handler/SubstrateChainHandler.js +2 -9
  107. package/services/chain-service/handler/light-client/index.js +8 -6
  108. package/services/chain-service/helper/api-helper/spec/acala.d.ts +3 -3
  109. package/services/chain-service/index.js +0 -2
  110. package/services/chain-service/utils.js +3 -0
  111. package/services/history-service/helpers/recoverHistoryStatus.d.ts +17 -0
  112. package/services/history-service/helpers/recoverHistoryStatus.js +214 -0
  113. package/services/history-service/index.d.ts +6 -0
  114. package/services/history-service/index.js +69 -7
  115. package/services/history-service/subsquid-multi-chain-history.js +3 -2
  116. package/services/history-service/testChainMap.d.ts +3 -0
  117. package/services/history-service/testChainMap.js +716 -0
  118. package/services/keyring-service/index.js +0 -2
  119. package/services/migration-service/index.js +0 -3
  120. package/services/migration-service/scripts/MigrateAutoLock.d.ts +4 -0
  121. package/services/migration-service/scripts/MigrateAutoLock.js +22 -0
  122. package/services/migration-service/scripts/MigrateChainPatrol.d.ts +4 -0
  123. package/services/migration-service/scripts/MigrateChainPatrol.js +22 -0
  124. package/services/migration-service/scripts/index.js +5 -1
  125. package/services/notification-service/NotificationService.js +1 -1
  126. package/services/price-service/coingecko.js +1 -1
  127. package/services/price-service/index.js +0 -3
  128. package/services/request-service/handler/AuthRequestHandler.js +1 -1
  129. package/services/setting-service/constants.d.ts +4 -2
  130. package/services/setting-service/constants.js +5 -1
  131. package/services/storage-service/DatabaseService.d.ts +1 -1
  132. package/services/storage-service/DatabaseService.js +3 -45
  133. package/services/transaction-service/constants.d.ts +1 -0
  134. package/services/transaction-service/constants.js +4 -0
  135. package/services/transaction-service/index.d.ts +1 -0
  136. package/services/transaction-service/index.js +61 -21
  137. package/services/transaction-service/types.d.ts +2 -0
  138. package/services/transaction-service/utils.d.ts +1 -1
  139. package/services/transaction-service/utils.js +24 -13
  140. package/utils/index.js +3 -0
@@ -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
  };
@@ -30,7 +30,7 @@ export default class NotificationService {
30
30
  type: 'basic',
31
31
  title,
32
32
  message,
33
- iconUrl: 'https://subwallet.app/assets/images/favicon/favicon-192x192.png',
33
+ iconUrl: './images/icon-128.png',
34
34
  priority: 2,
35
35
  isClickable: !!link
36
36
  }, notificationId => {
@@ -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
  };
@@ -41,7 +41,7 @@ export default class DatabaseService {
41
41
  subscribeNominatorMetadata(callback: (data: NominatorMetadata[]) => void): void;
42
42
  getHistories(query?: HistoryQuery): Promise<import("@subwallet/extension-base/services/storage-service/databases").ITransactionHistoryItem[]>;
43
43
  upsertHistory(histories: TransactionHistoryItem[]): Promise<unknown>;
44
- updateHistoryByNewExtrinsicHash(extrinsicHash: string, updateData: Partial<TransactionHistoryItem>): Promise<unknown>;
44
+ updateHistoryByExtrinsicHash(extrinsicHash: string, updateData: Partial<TransactionHistoryItem>): Promise<unknown>;
45
45
  addNftCollection(collection: NftCollection): Promise<unknown>;
46
46
  deleteNftCollection(chain: string, collectionId: string): Promise<void>;
47
47
  getAllNftCollection(chainHashes?: string[]): import("dexie").PromiseExtended<NftCollection[]>;
@@ -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
- async updateHistoryByNewExtrinsicHash(extrinsicHash, updateData) {
130
- // this.logger.log('Updating transaction histories');
116
+ async updateHistoryByExtrinsicHash(extrinsicHash, updateData) {
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,9 +270,9 @@ 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
- transactionToHistories(id, eventLogs) {
275
+ transactionToHistories(id, startBlock, nonce, eventLogs) {
275
276
  const transaction = this.getTransaction(id);
276
277
  const historyItem = {
277
278
  origin: 'app',
@@ -289,9 +290,12 @@ export default class TransactionService {
289
290
  fee: transaction.estimateFee,
290
291
  blockNumber: 0,
291
292
  // Will be added in next step
292
- blockHash: '' // Will be added in next step
293
+ blockHash: '',
294
+ // Will be added in next step
295
+ nonce: nonce || 0,
296
+ startBlock: startBlock || 0
293
297
  };
294
-
298
+ console.log('historyItem', historyItem);
295
299
  const chainInfo = this.chainService.getChainInfoByKey(transaction.chain);
296
300
  const nativeAsset = _getChainNativeTokenBasicInfo(chainInfo);
297
301
  const baseNativeAmount = {
@@ -455,10 +459,12 @@ export default class TransactionService {
455
459
  onSigned({
456
460
  id
457
461
  }) {
458
- console.log(`Transaction "${id}" is signed`);
462
+ console.debug(`Transaction "${id}" is signed`);
459
463
  }
460
464
  onSend({
461
- id
465
+ id,
466
+ nonce,
467
+ startBlock
462
468
  }) {
463
469
  // Update transaction status
464
470
  this.updateTransaction(id, {
@@ -466,23 +472,25 @@ export default class TransactionService {
466
472
  });
467
473
 
468
474
  // Create Input History Transaction History
469
- this.historyService.insertHistories(this.transactionToHistories(id)).catch(console.error);
470
- console.log(`Transaction "${id}" is sent`);
475
+ this.historyService.insertHistories(this.transactionToHistories(id, startBlock, nonce)).catch(console.error);
476
+ console.debug(`Transaction "${id}" is sent`);
471
477
  }
472
478
  onHasTransactionHash({
479
+ blockHash,
473
480
  extrinsicHash,
474
481
  id
475
482
  }) {
476
483
  // Write processing transaction history
477
484
  const updateData = {
478
485
  extrinsicHash,
479
- status: ExtrinsicStatus.PROCESSING
486
+ status: ExtrinsicStatus.PROCESSING,
487
+ blockHash: blockHash || ''
480
488
  };
481
489
  this.updateTransaction(id, updateData);
482
490
 
483
491
  // In this case transaction id is the same as extrinsic hash and will change after below update
484
492
  this.historyService.updateHistoryByExtrinsicHash(id, updateData).catch(console.error);
485
- console.log(`Transaction "${id}" is submitted with hash ${extrinsicHash || ''}`);
493
+ console.debug(`Transaction "${id}" is submitted with hash ${extrinsicHash || ''}`);
486
494
  }
487
495
  handlePostProcessing(id) {
488
496
  // must be done after success/failure to make sure the transaction is finalized
@@ -513,16 +521,18 @@ export default class TransactionService {
513
521
  onSuccess({
514
522
  blockHash,
515
523
  blockNumber,
524
+ extrinsicHash,
516
525
  id
517
526
  }) {
518
527
  const transaction = this.getTransaction(id);
519
528
  this.updateTransaction(id, {
520
- status: ExtrinsicStatus.SUCCESS
529
+ status: ExtrinsicStatus.SUCCESS,
530
+ extrinsicHash
521
531
  });
522
- console.log('Transaction completed', id, transaction.extrinsicHash);
523
532
 
524
533
  // Write success transaction history
525
- this.historyService.updateHistories(transaction.chain, transaction.extrinsicHash, {
534
+ this.historyService.updateHistoryByExtrinsicHash(transaction.extrinsicHash, {
535
+ extrinsicHash,
526
536
  status: ExtrinsicStatus.SUCCESS,
527
537
  blockNumber: blockNumber || 0,
528
538
  blockHash: blockHash || ''
@@ -542,6 +552,7 @@ export default class TransactionService {
542
552
  blockHash,
543
553
  blockNumber,
544
554
  errors,
555
+ extrinsicHash,
545
556
  id
546
557
  }) {
547
558
  const transaction = this.getTransaction(id);
@@ -549,12 +560,13 @@ export default class TransactionService {
549
560
  if (transaction) {
550
561
  this.updateTransaction(id, {
551
562
  status: nextStatus,
552
- errors
563
+ errors,
564
+ extrinsicHash
553
565
  });
554
- console.log('Transaction failed', id, transaction.extrinsicHash);
555
566
 
556
567
  // Write failed transaction history
557
- this.historyService.updateHistories(transaction.chain, transaction.extrinsicHash, {
568
+ this.historyService.updateHistoryByExtrinsicHash(transaction.extrinsicHash, {
569
+ extrinsicHash: extrinsicHash || transaction.extrinsicHash,
558
570
  status: nextStatus,
559
571
  blockNumber: blockNumber || 0,
560
572
  blockHash: blockHash || ''
@@ -570,8 +582,6 @@ export default class TransactionService {
570
582
  });
571
583
  }
572
584
  this.eventService.emit('transaction.failed', transaction);
573
- // Log transaction errors
574
- console.error(errors);
575
585
  }
576
586
  generateHashPayload(chain, transaction) {
577
587
  const chainInfo = this.chainService.getChainInfoByKey(chain);
@@ -655,7 +665,7 @@ export default class TransactionService {
655
665
  errors: [],
656
666
  warnings: []
657
667
  };
658
- this.requestService.addConfirmation(id, url || EXTENSION_REQUEST_URL, 'evmSendTransactionRequest', payload, {}).then(({
668
+ this.requestService.addConfirmation(id, url || EXTENSION_REQUEST_URL, 'evmSendTransactionRequest', payload, {}).then(async ({
659
669
  isApproved,
660
670
  payload
661
671
  }) => {
@@ -680,11 +690,17 @@ export default class TransactionService {
680
690
  emitter.emit('signed', eventData);
681
691
 
682
692
  // Send transaction
693
+ this.handleTransactionTimeout(emitter, eventData);
694
+
695
+ // Add start info
696
+ eventData.nonce = txObject.nonce;
697
+ eventData.startBlock = await web3Api.eth.getBlockNumber();
683
698
  emitter.emit('send', eventData); // This event is needed after sending transaction with queue
684
699
  signedTransaction && web3Api.eth.sendSignedTransaction(signedTransaction).once('transactionHash', hash => {
685
700
  eventData.extrinsicHash = hash;
686
701
  emitter.emit('extrinsicHash', eventData);
687
702
  }).once('receipt', rs => {
703
+ eventData.extrinsicHash = rs.transactionHash;
688
704
  eventData.blockHash = rs.blockHash;
689
705
  eventData.blockNumber = rs.blockNumber;
690
706
  emitter.emit('success', eventData);
@@ -709,6 +725,7 @@ export default class TransactionService {
709
725
  }
710
726
  signAndSendSubstrateTransaction({
711
727
  address,
728
+ chain,
712
729
  id,
713
730
  transaction,
714
731
  url
@@ -729,12 +746,17 @@ export default class TransactionService {
729
746
  };
730
747
  }
731
748
  }
732
- }).then(rs => {
749
+ }).then(async rs => {
733
750
  // Emit signed event
734
751
  emitter.emit('signed', eventData);
735
752
 
736
753
  // Send transaction
754
+ const api = this.chainService.getSubstrateApi(chain);
755
+ eventData.nonce = rs.nonce.toNumber();
756
+ eventData.startBlock = (await api.api.query.system.number()).toPrimitive();
757
+ this.handleTransactionTimeout(emitter, eventData);
737
758
  emitter.emit('send', eventData); // This event is needed after sending transaction with queue
759
+
738
760
  rs.send(txState => {
739
761
  // handle events, logs, history
740
762
  if (!txState || !txState.status) {
@@ -744,10 +766,12 @@ export default class TransactionService {
744
766
  eventData.eventLogs = txState.events;
745
767
  if (!eventData.extrinsicHash || eventData.extrinsicHash === '') {
746
768
  eventData.extrinsicHash = txState.txHash.toHex();
769
+ eventData.blockHash = txState.status.asInBlock.toHex();
747
770
  emitter.emit('extrinsicHash', eventData);
748
771
  }
749
772
  }
750
773
  if (txState.status.isFinalized) {
774
+ eventData.extrinsicHash = txState.txHash.toHex();
751
775
  eventData.eventLogs = txState.events;
752
776
  // TODO: push block hash and block number into eventData
753
777
  txState.events.filter(({
@@ -779,6 +803,22 @@ export default class TransactionService {
779
803
  });
780
804
  return emitter;
781
805
  }
806
+ handleTransactionTimeout(emitter, eventData) {
807
+ const timeout = setTimeout(() => {
808
+ const transaction = this.getTransaction(eventData.id);
809
+ if (transaction.status !== ExtrinsicStatus.SUCCESS && transaction.status !== ExtrinsicStatus.FAIL) {
810
+ eventData.errors.push(new TransactionError(BasicTxErrorType.TIMEOUT, 'Transaction timeout'));
811
+ emitter.emit('error', eventData);
812
+ clearTimeout(timeout);
813
+ }
814
+ }, TRANSACTION_TIMEOUT);
815
+ emitter.once('success', () => {
816
+ clearTimeout(timeout);
817
+ });
818
+ emitter.once('error', () => {
819
+ clearTimeout(timeout);
820
+ });
821
+ }
782
822
  resetWallet() {
783
823
  this.transactionSubject.next({});
784
824
  }
@@ -39,6 +39,8 @@ export interface TransactionEventResponse extends ValidateTransactionResponse {
39
39
  blockHash?: string;
40
40
  blockNumber?: number;
41
41
  eventLogs?: EventRecord[];
42
+ nonce?: number;
43
+ startBlock?: number;
42
44
  }
43
45
  export interface TransactionEventMap {
44
46
  send: (response: TransactionEventResponse) => void;
@@ -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;