@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.
- package/background/KoniTypes.d.ts +14 -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 +164 -134
- 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 +227 -0
- package/cjs/services/history-service/index.js +68 -6
- 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/notification-service/NotificationService.js +1 -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 +3 -45
- package/cjs/services/transaction-service/constants.js +11 -0
- package/cjs/services/transaction-service/index.js +60 -20
- package/cjs/services/transaction-service/utils.js +25 -14
- package/cjs/utils/index.js +3 -0
- 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 +79 -51
- 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 +17 -0
- package/services/history-service/helpers/recoverHistoryStatus.js +214 -0
- package/services/history-service/index.d.ts +6 -0
- package/services/history-service/index.js +69 -7
- 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/notification-service/NotificationService.js +1 -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.d.ts +1 -1
- package/services/storage-service/DatabaseService.js +3 -45
- 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 +61 -21
- package/services/transaction-service/types.d.ts +2 -0
- package/services/transaction-service/utils.d.ts +1 -1
- package/services/transaction-service/utils.js +24 -13
- 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,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
|
};
|
|
@@ -30,7 +30,7 @@ export default class NotificationService {
|
|
|
30
30
|
type: 'basic',
|
|
31
31
|
title,
|
|
32
32
|
message,
|
|
33
|
-
iconUrl: '
|
|
33
|
+
iconUrl: './images/icon-128.png',
|
|
34
34
|
priority: 2,
|
|
35
35
|
isClickable: !!link
|
|
36
36
|
}, notificationId => {
|
|
@@ -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
|
};
|
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
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,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
|
|
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: ''
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
4
|
+
export declare function getExplorerLink(chainInfo: _ChainInfo, value: string, type: 'account' | 'tx'): string | undefined;
|