@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.
- package/background/KoniTypes.d.ts +12 -1
- package/background/KoniTypes.js +1 -0
- package/background/errors/TransactionError.js +4 -0
- package/background/handlers/State.d.ts +1 -1
- package/background/handlers/State.js +2 -8
- package/background/handlers/subscriptions.js +0 -1
- package/background/types.d.ts +2 -2
- package/cjs/background/KoniTypes.js +1 -0
- package/cjs/background/errors/TransactionError.js +4 -0
- package/cjs/background/handlers/State.js +1 -7
- package/cjs/background/handlers/subscriptions.js +0 -1
- package/cjs/constants/index.js +6 -6
- package/cjs/koni/api/coingecko.js +1 -4
- package/cjs/koni/api/dotsama/balance.js +7 -5
- package/cjs/koni/api/dotsama/crowdloan.js +0 -4
- package/cjs/koni/api/dotsama/transfer.js +0 -4
- package/cjs/koni/api/nft/acala_nft/index.js +1 -1
- package/cjs/koni/api/nft/bit.country/index.js +1 -1
- package/cjs/koni/api/nft/evm_nft/index.js +2 -3
- package/cjs/koni/api/nft/index.js +1 -2
- package/cjs/koni/api/nft/karura_nft/index.js +1 -1
- package/cjs/koni/api/nft/quartz_nft/index.js +1 -1
- package/cjs/koni/api/nft/rmrk_nft/index.js +2 -3
- package/cjs/koni/api/nft/statemine_nft/index.js +1 -1
- package/cjs/koni/api/nft/transfer.js +5 -5
- package/cjs/koni/api/nft/unique_nft/index.js +1 -1
- package/cjs/koni/api/nft/unique_nft/uniqueNftV2.js +0 -1
- package/cjs/koni/api/nft/wasm_nft/index.js +1 -2
- package/cjs/koni/api/staking/bonding/astar.js +28 -12
- package/cjs/koni/api/staking/bonding/utils.js +4 -0
- package/cjs/koni/api/staking/relayChain.js +0 -1
- package/cjs/koni/api/staking/subsquidStaking.js +0 -2
- package/cjs/koni/api/tokens/wasm/index.js +0 -1
- package/cjs/koni/api/tokens/wasm/utils.js +0 -1
- package/cjs/koni/api/xcm/index.js +0 -1
- package/cjs/koni/background/cron.js +0 -45
- package/cjs/koni/background/handlers/Extension.js +163 -133
- package/cjs/koni/background/handlers/State.js +18 -3
- package/cjs/koni/background/handlers/Tabs.js +34 -2
- package/cjs/koni/background/handlers/index.js +3 -2
- package/cjs/koni/background/subscription.js +0 -26
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/chain-service/handler/EvmChainHandler.js +1 -1
- package/cjs/services/chain-service/handler/SubstrateChainHandler.js +2 -9
- package/cjs/services/chain-service/handler/light-client/index.js +9 -6
- package/cjs/services/chain-service/index.js +0 -2
- package/cjs/services/chain-service/utils.js +3 -0
- package/cjs/services/history-service/helpers/recoverHistoryStatus.js +108 -0
- package/cjs/services/history-service/index.js +60 -5
- package/cjs/services/history-service/subsquid-multi-chain-history.js +3 -2
- package/cjs/services/history-service/testChainMap.js +724 -0
- package/cjs/services/keyring-service/index.js +0 -2
- package/cjs/services/migration-service/index.js +0 -3
- package/cjs/services/migration-service/scripts/MigrateAutoLock.js +30 -0
- package/cjs/services/migration-service/scripts/MigrateChainPatrol.js +30 -0
- package/cjs/services/migration-service/scripts/index.js +5 -1
- package/cjs/services/price-service/coingecko.js +1 -1
- package/cjs/services/price-service/index.js +0 -3
- package/cjs/services/request-service/handler/AuthRequestHandler.js +1 -1
- package/cjs/services/setting-service/constants.js +8 -2
- package/cjs/services/storage-service/DatabaseService.js +2 -44
- package/cjs/services/transaction-service/constants.js +11 -0
- package/cjs/services/transaction-service/index.js +28 -9
- package/cjs/services/transaction-service/utils.js +25 -14
- package/constants/index.d.ts +1 -1
- package/constants/index.js +1 -1
- package/koni/api/coingecko.js +1 -4
- package/koni/api/dotsama/balance.js +7 -5
- package/koni/api/dotsama/crowdloan.js +0 -4
- package/koni/api/dotsama/transfer.js +0 -4
- package/koni/api/nft/acala_nft/index.js +1 -1
- package/koni/api/nft/bit.country/index.js +1 -1
- package/koni/api/nft/evm_nft/index.js +2 -3
- package/koni/api/nft/index.js +1 -2
- package/koni/api/nft/karura_nft/index.js +1 -1
- package/koni/api/nft/quartz_nft/index.js +1 -1
- package/koni/api/nft/rmrk_nft/index.js +2 -3
- package/koni/api/nft/statemine_nft/index.js +1 -1
- package/koni/api/nft/transfer.js +5 -5
- package/koni/api/nft/unique_nft/index.js +1 -1
- package/koni/api/nft/unique_nft/uniqueNftV2.js +0 -1
- package/koni/api/nft/wasm_nft/index.js +1 -2
- package/koni/api/staking/bonding/astar.d.ts +2 -1
- package/koni/api/staking/bonding/astar.js +27 -12
- package/koni/api/staking/bonding/utils.js +4 -0
- package/koni/api/staking/relayChain.js +0 -1
- package/koni/api/staking/subsquidStaking.js +0 -2
- package/koni/api/tokens/wasm/index.js +0 -1
- package/koni/api/tokens/wasm/utils.js +0 -1
- package/koni/api/xcm/index.js +0 -1
- package/koni/background/cron.js +0 -45
- package/koni/background/handlers/Extension.d.ts +2 -0
- package/koni/background/handlers/Extension.js +78 -50
- package/koni/background/handlers/State.d.ts +3 -1
- package/koni/background/handlers/State.js +18 -3
- package/koni/background/handlers/Tabs.d.ts +1 -0
- package/koni/background/handlers/Tabs.js +32 -1
- package/koni/background/handlers/index.js +3 -2
- package/koni/background/subscription.d.ts +0 -1
- package/koni/background/subscription.js +0 -26
- package/package.json +55 -34
- package/packageInfo.js +1 -1
- package/services/chain-service/handler/EvmChainHandler.js +1 -1
- package/services/chain-service/handler/SubstrateChainHandler.js +2 -9
- package/services/chain-service/handler/light-client/index.js +8 -6
- package/services/chain-service/helper/api-helper/spec/acala.d.ts +3 -3
- package/services/chain-service/index.js +0 -2
- package/services/chain-service/utils.js +3 -0
- package/services/history-service/helpers/recoverHistoryStatus.d.ts +11 -0
- package/services/history-service/helpers/recoverHistoryStatus.js +98 -0
- package/services/history-service/index.d.ts +6 -0
- package/services/history-service/index.js +61 -6
- package/services/history-service/subsquid-multi-chain-history.js +3 -2
- package/services/history-service/testChainMap.d.ts +3 -0
- package/services/history-service/testChainMap.js +716 -0
- package/services/keyring-service/index.js +0 -2
- package/services/migration-service/index.js +0 -3
- package/services/migration-service/scripts/MigrateAutoLock.d.ts +4 -0
- package/services/migration-service/scripts/MigrateAutoLock.js +22 -0
- package/services/migration-service/scripts/MigrateChainPatrol.d.ts +4 -0
- package/services/migration-service/scripts/MigrateChainPatrol.js +22 -0
- package/services/migration-service/scripts/index.js +5 -1
- package/services/price-service/coingecko.js +1 -1
- package/services/price-service/index.js +0 -3
- package/services/request-service/handler/AuthRequestHandler.js +1 -1
- package/services/setting-service/constants.d.ts +4 -2
- package/services/setting-service/constants.js +5 -1
- package/services/storage-service/DatabaseService.js +2 -44
- package/services/transaction-service/constants.d.ts +1 -0
- package/services/transaction-service/constants.js +4 -0
- package/services/transaction-service/index.d.ts +1 -0
- package/services/transaction-service/index.js +29 -10
- package/services/transaction-service/utils.d.ts +1 -1
- 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,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,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
|
};
|
|
@@ -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();
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import { BrowserConfirmationType,
|
|
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
|
|
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
|
-
|
|
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;
|
|
@@ -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 {
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
|
|
12
|
-
if (
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
}
|