@subwallet/extension-base 1.0.5-2 → 1.0.6-0
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 +7 -1
- package/cjs/constants/index.js +1 -1
- package/cjs/koni/api/staking/bonding/relayChain.js +2 -7
- package/cjs/koni/api/staking/bonding/utils.js +9 -0
- package/cjs/koni/api/staking/index.js +6 -3
- package/cjs/koni/api/staking/relayChain.js +16 -14
- package/cjs/koni/background/handlers/Extension.js +60 -46
- package/cjs/koni/background/handlers/State.js +16 -0
- package/cjs/koni/background/handlers/Tabs.js +47 -28
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/chain-service/constants.js +3 -3
- package/cjs/services/chain-service/index.js +5 -0
- package/cjs/services/chain-service/utils.js +15 -10
- package/cjs/services/history-service/subsquid-multi-chain-history.js +2 -2
- package/cjs/services/request-service/index.js +3 -0
- package/cjs/services/setting-service/SettingService.js +14 -0
- package/cjs/services/storage-service/DatabaseService.js +1 -1
- package/cjs/services/storage-service/db-stores/Nft.js +3 -3
- package/cjs/services/transaction-service/index.js +11 -5
- package/cjs/services/transaction-service/utils.js +3 -0
- package/cjs/stores/PassPhishingStore.js +18 -0
- package/constants/index.d.ts +1 -1
- package/constants/index.js +1 -1
- package/koni/api/staking/bonding/relayChain.js +3 -8
- package/koni/api/staking/bonding/utils.d.ts +1 -0
- package/koni/api/staking/bonding/utils.js +8 -0
- package/koni/api/staking/index.js +6 -4
- package/koni/api/staking/relayChain.js +16 -14
- package/koni/background/handlers/Extension.d.ts +1 -0
- package/koni/background/handlers/Extension.js +61 -48
- package/koni/background/handlers/State.d.ts +1 -0
- package/koni/background/handlers/State.js +16 -0
- package/koni/background/handlers/Tabs.d.ts +2 -0
- package/koni/background/handlers/Tabs.js +47 -28
- package/package.json +11 -6
- package/packageInfo.js +1 -1
- package/services/chain-service/constants.js +3 -3
- package/services/chain-service/index.js +5 -0
- package/services/chain-service/utils.d.ts +1 -0
- package/services/chain-service/utils.js +14 -10
- package/services/history-service/subsquid-multi-chain-history.js +2 -2
- package/services/request-service/handler/AuthRequestHandler.d.ts +1 -1
- package/services/request-service/index.d.ts +1 -0
- package/services/request-service/index.js +3 -0
- package/services/setting-service/SettingService.d.ts +5 -1
- package/services/setting-service/SettingService.js +14 -0
- package/services/storage-service/DatabaseService.js +1 -1
- package/services/storage-service/db-stores/Nft.d.ts +1 -1
- package/services/storage-service/db-stores/Nft.js +3 -3
- package/services/transaction-service/index.js +11 -5
- package/services/transaction-service/types.d.ts +3 -3
- package/services/transaction-service/utils.js +3 -0
- package/stores/PassPhishingStore.d.ts +5 -0
- package/stores/PassPhishingStore.js +10 -0
|
@@ -707,6 +707,11 @@ export class ChainService {
|
|
|
707
707
|
targetChainInfo.substrateInfo.crowdloanUrl = params.chainEditInfo.crowdloanUrl;
|
|
708
708
|
}
|
|
709
709
|
}
|
|
710
|
+
if (targetChainInfo.evmInfo) {
|
|
711
|
+
if (params.chainEditInfo.blockExplorer !== undefined) {
|
|
712
|
+
targetChainInfo.evmInfo.blockExplorer = params.chainEditInfo.blockExplorer;
|
|
713
|
+
}
|
|
714
|
+
}
|
|
710
715
|
this.updateChainInfoMapSubscription();
|
|
711
716
|
this.dbService.updateChainStore({
|
|
712
717
|
...targetChainInfo,
|
|
@@ -10,6 +10,7 @@ export declare function _isPureEvmChain(chainInfo: _ChainInfo): boolean;
|
|
|
10
10
|
export declare function _isPureSubstrateChain(chainInfo: _ChainInfo): boolean;
|
|
11
11
|
export declare function _getOriginChainOfAsset(assetSlug: string): string;
|
|
12
12
|
export declare function _getContractAddressOfToken(tokenInfo: _ChainAsset): string;
|
|
13
|
+
export declare function _isTokenTransferredByEvm(tokenInfo: _ChainAsset): boolean;
|
|
13
14
|
export declare function _checkSmartContractSupportByChain(chainInfo: _ChainInfo, contractType: _AssetType): boolean;
|
|
14
15
|
export declare function _getTokenOnChainAssetId(tokenInfo: _ChainAsset): string;
|
|
15
16
|
export declare function _getTokenOnChainInfo(tokenInfo: _ChainAsset): Record<string, any>;
|
|
@@ -61,6 +61,10 @@ export function _getContractAddressOfToken(tokenInfo) {
|
|
|
61
61
|
var _tokenInfo$metadata;
|
|
62
62
|
return ((_tokenInfo$metadata = tokenInfo.metadata) === null || _tokenInfo$metadata === void 0 ? void 0 : _tokenInfo$metadata.contractAddress) || '';
|
|
63
63
|
}
|
|
64
|
+
export function _isTokenTransferredByEvm(tokenInfo) {
|
|
65
|
+
var _tokenInfo$metadata2;
|
|
66
|
+
return !!((_tokenInfo$metadata2 = tokenInfo.metadata) !== null && _tokenInfo$metadata2 !== void 0 && _tokenInfo$metadata2.contractAddress) || _isNativeToken(tokenInfo);
|
|
67
|
+
}
|
|
64
68
|
export function _checkSmartContractSupportByChain(chainInfo, contractType) {
|
|
65
69
|
// EVM chains support smart contract by default so just checking Substrate chains
|
|
66
70
|
if (chainInfo.substrateInfo === null || chainInfo.substrateInfo && chainInfo.substrateInfo.supportSmartContract === null) {
|
|
@@ -71,12 +75,12 @@ export function _checkSmartContractSupportByChain(chainInfo, contractType) {
|
|
|
71
75
|
|
|
72
76
|
// Utils for balance functions
|
|
73
77
|
export function _getTokenOnChainAssetId(tokenInfo) {
|
|
74
|
-
var _tokenInfo$
|
|
75
|
-
return ((_tokenInfo$
|
|
78
|
+
var _tokenInfo$metadata3;
|
|
79
|
+
return ((_tokenInfo$metadata3 = tokenInfo.metadata) === null || _tokenInfo$metadata3 === void 0 ? void 0 : _tokenInfo$metadata3.assetId) || '-1';
|
|
76
80
|
}
|
|
77
81
|
export function _getTokenOnChainInfo(tokenInfo) {
|
|
78
|
-
var _tokenInfo$
|
|
79
|
-
return (_tokenInfo$
|
|
82
|
+
var _tokenInfo$metadata4;
|
|
83
|
+
return (_tokenInfo$metadata4 = tokenInfo.metadata) === null || _tokenInfo$metadata4 === void 0 ? void 0 : _tokenInfo$metadata4.onChainInfo;
|
|
80
84
|
}
|
|
81
85
|
export function _getTokenMinAmount(tokenInfo) {
|
|
82
86
|
return tokenInfo.minAmount || '0';
|
|
@@ -229,16 +233,16 @@ export function _isXcmPathSupported(originTokenSlug, destinationTokenSlug, asset
|
|
|
229
233
|
return assetRef.path === _AssetRefPath.XCM;
|
|
230
234
|
}
|
|
231
235
|
export function _getXcmAssetType(tokenInfo) {
|
|
232
|
-
var _tokenInfo$
|
|
233
|
-
return ((_tokenInfo$
|
|
236
|
+
var _tokenInfo$metadata5;
|
|
237
|
+
return ((_tokenInfo$metadata5 = tokenInfo.metadata) === null || _tokenInfo$metadata5 === void 0 ? void 0 : _tokenInfo$metadata5.assetType) || '';
|
|
234
238
|
}
|
|
235
239
|
export function _getXcmAssetId(tokenInfo) {
|
|
236
|
-
var _tokenInfo$
|
|
237
|
-
return ((_tokenInfo$
|
|
240
|
+
var _tokenInfo$metadata6;
|
|
241
|
+
return ((_tokenInfo$metadata6 = tokenInfo.metadata) === null || _tokenInfo$metadata6 === void 0 ? void 0 : _tokenInfo$metadata6.assetId) || '-1';
|
|
238
242
|
}
|
|
239
243
|
export function _getXcmAssetMultilocation(tokenInfo) {
|
|
240
|
-
var _tokenInfo$
|
|
241
|
-
return (_tokenInfo$
|
|
244
|
+
var _tokenInfo$metadata7;
|
|
245
|
+
return (_tokenInfo$metadata7 = tokenInfo.metadata) === null || _tokenInfo$metadata7 === void 0 ? void 0 : _tokenInfo$metadata7.multilocation;
|
|
242
246
|
}
|
|
243
247
|
export function _getXcmTransferType(originChainInfo, destinationChainInfo) {
|
|
244
248
|
var _originChainInfo$subs, _destinationChainInfo;
|
|
@@ -244,7 +244,7 @@ export async function fetchMultiChainHistories(addresses, chainMap, maxPage = 25
|
|
|
244
244
|
const usedAddresses = relatedAddresses.filter(a => lowerAddresses.includes(a.toLowerCase()));
|
|
245
245
|
const chainInfo = chainMap[chainId];
|
|
246
246
|
if (chainInfo === undefined) {
|
|
247
|
-
console.
|
|
247
|
+
console.debug(`Not found chain info for chain id: ${chainId}`); // TODO: resolve conflicting chainId
|
|
248
248
|
|
|
249
249
|
return;
|
|
250
250
|
}
|
|
@@ -253,7 +253,7 @@ export async function fetchMultiChainHistories(addresses, chainMap, maxPage = 25
|
|
|
253
253
|
const transactionData = parseSubsquidTransactionData(address, name, historyItem, chainInfo, parseData(args), parseData(_data));
|
|
254
254
|
histories.push(transactionData);
|
|
255
255
|
} catch (e) {
|
|
256
|
-
console.
|
|
256
|
+
console.debug('Parse transaction data failed', address, e);
|
|
257
257
|
}
|
|
258
258
|
});
|
|
259
259
|
});
|
|
@@ -15,7 +15,7 @@ export default class AuthRequestHandler {
|
|
|
15
15
|
private readonly evmChainSubject;
|
|
16
16
|
readonly authSubjectV2: BehaviorSubject<AuthorizeRequest[]>;
|
|
17
17
|
constructor(requestService: RequestService, chainService: ChainService, keyringService: KeyringService);
|
|
18
|
-
|
|
18
|
+
stripUrl(url: string): string;
|
|
19
19
|
private getAddressList;
|
|
20
20
|
get numAuthRequestsV2(): number;
|
|
21
21
|
private get allAuthRequestsV2();
|
|
@@ -14,6 +14,7 @@ export default class RequestService {
|
|
|
14
14
|
constructor(chainService: ChainService, settingService: SettingService, keyringService: KeyringService);
|
|
15
15
|
get numAllRequests(): number;
|
|
16
16
|
updateIconV2(shouldClose?: boolean): void;
|
|
17
|
+
stripUrl(url: string): string;
|
|
17
18
|
getAddressList(value?: boolean): Record<string, boolean>;
|
|
18
19
|
get popup(): number[];
|
|
19
20
|
popupClose(): void;
|
|
@@ -35,6 +35,9 @@ export default class RequestService {
|
|
|
35
35
|
updateIconV2(shouldClose) {
|
|
36
36
|
this.#popupHandler.updateIconV2(shouldClose);
|
|
37
37
|
}
|
|
38
|
+
stripUrl(url) {
|
|
39
|
+
return this.#authRequestHandler.stripUrl(url);
|
|
40
|
+
}
|
|
38
41
|
getAddressList(value = false) {
|
|
39
42
|
const addressList = Object.keys(this.keyringService.accounts);
|
|
40
43
|
return addressList.reduce((addressList, v) => ({
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import { RequestSettingsType } from '@subwallet/extension-base/background/KoniTypes';
|
|
1
|
+
import { PassPhishing, RequestSettingsType } from '@subwallet/extension-base/background/KoniTypes';
|
|
2
2
|
import { Subject } from 'rxjs';
|
|
3
3
|
export default class SettingService {
|
|
4
4
|
private readonly settingsStore;
|
|
5
|
+
private readonly passPhishingStore;
|
|
5
6
|
getSubject(): Subject<RequestSettingsType>;
|
|
6
7
|
getSettings(update: (value: RequestSettingsType) => void): void;
|
|
7
8
|
setSettings(data: RequestSettingsType, callback?: () => void): void;
|
|
9
|
+
passPhishingSubject(): Subject<Record<string, PassPhishing>>;
|
|
10
|
+
getPassPhishingList(update: (value: Record<string, PassPhishing>) => void): void;
|
|
11
|
+
setPassPhishing(data: Record<string, PassPhishing>, callback?: () => void): void;
|
|
8
12
|
resetWallet(): void;
|
|
9
13
|
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
|
+
import PassPhishingStore from '@subwallet/extension-base/stores/PassPhishingStore';
|
|
4
5
|
import SettingsStore from '@subwallet/extension-base/stores/Settings';
|
|
5
6
|
import { DEFAULT_SETTING } from "./constants.js";
|
|
6
7
|
export default class SettingService {
|
|
7
8
|
settingsStore = new SettingsStore();
|
|
9
|
+
passPhishingStore = new PassPhishingStore();
|
|
8
10
|
getSubject() {
|
|
9
11
|
return this.settingsStore.getSubject();
|
|
10
12
|
}
|
|
@@ -20,7 +22,19 @@ export default class SettingService {
|
|
|
20
22
|
setSettings(data, callback) {
|
|
21
23
|
this.settingsStore.set('Settings', data, callback);
|
|
22
24
|
}
|
|
25
|
+
passPhishingSubject() {
|
|
26
|
+
return this.passPhishingStore.getSubject();
|
|
27
|
+
}
|
|
28
|
+
getPassPhishingList(update) {
|
|
29
|
+
this.passPhishingStore.get('PassPhishing', value => {
|
|
30
|
+
update(value || {});
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
setPassPhishing(data, callback) {
|
|
34
|
+
this.passPhishingStore.set('PassPhishing', data, callback);
|
|
35
|
+
}
|
|
23
36
|
resetWallet() {
|
|
24
37
|
this.settingsStore.set('Settings', DEFAULT_SETTING);
|
|
38
|
+
this.passPhishingStore.set('PassPhishing', {});
|
|
25
39
|
}
|
|
26
40
|
}
|
|
@@ -145,7 +145,7 @@ export default class DatabaseService {
|
|
|
145
145
|
}
|
|
146
146
|
async cleanUpNft(chain, owner, collectionIds, nftIds, ownNothing) {
|
|
147
147
|
if (ownNothing) {
|
|
148
|
-
return this.stores.nft.deleteNftsByChainAndOwner(chain, reformatAddress(owner, 42));
|
|
148
|
+
return this.stores.nft.deleteNftsByChainAndOwner(chain, reformatAddress(owner, 42), collectionIds);
|
|
149
149
|
}
|
|
150
150
|
return this.stores.nft.cleanUpNfts(chain, reformatAddress(owner, 42), collectionIds, nftIds);
|
|
151
151
|
}
|
|
@@ -5,7 +5,7 @@ export default class NftStore extends BaseStoreWithAddressAndChain<INft> {
|
|
|
5
5
|
getNft(addresses: string[], chainList?: string[]): import("dexie").PromiseExtended<INft[]>;
|
|
6
6
|
subscribeNft(addresses: string[], chainList?: string[]): import("dexie").Observable<INft[]>;
|
|
7
7
|
cleanUpNfts(chain: string, address: string, collectionIds: string[], nftIds: string[]): import("dexie").PromiseExtended<number>;
|
|
8
|
-
deleteNftsByChainAndOwner(chain: string, address: string): import("dexie").PromiseExtended<number>;
|
|
8
|
+
deleteNftsByChainAndOwner(chain: string, address: string, collectionIds: string[]): import("dexie").PromiseExtended<number>;
|
|
9
9
|
deleteNftByAddress(addresses: string[]): import("dexie").PromiseExtended<number>;
|
|
10
10
|
deleteNftItem(chain: string, addresses: string[], nftItem: NftItem): import("dexie").PromiseExtended<number>;
|
|
11
11
|
deleteNftsByCollection(chain: string, collectionId: string): import("dexie").PromiseExtended<number>;
|
|
@@ -19,13 +19,13 @@ export default class NftStore extends BaseStoreWithAddressAndChain {
|
|
|
19
19
|
return this.table.where({
|
|
20
20
|
address,
|
|
21
21
|
chain
|
|
22
|
-
}).and(nft =>
|
|
22
|
+
}).and(nft => collectionIds.includes(nft.collectionId) && !nftIds.includes(nft.id)).delete();
|
|
23
23
|
}
|
|
24
|
-
deleteNftsByChainAndOwner(chain, address) {
|
|
24
|
+
deleteNftsByChainAndOwner(chain, address, collectionIds) {
|
|
25
25
|
return this.table.where({
|
|
26
26
|
address,
|
|
27
27
|
chain
|
|
28
|
-
}).delete();
|
|
28
|
+
}).and(nft => collectionIds.includes(nft.collectionId)).delete();
|
|
29
29
|
}
|
|
30
30
|
deleteNftByAddress(addresses) {
|
|
31
31
|
return this.table.where('address').anyOfIgnoreCase(addresses).delete();
|
|
@@ -122,7 +122,7 @@ export default class TransactionService {
|
|
|
122
122
|
} else {
|
|
123
123
|
var _pair$meta;
|
|
124
124
|
if ((_pair$meta = pair.meta) !== null && _pair$meta !== void 0 && _pair$meta.isReadOnly) {
|
|
125
|
-
validationResponse.errors.push(new TransactionError(BasicTxErrorType.INTERNAL_ERROR, 'This is
|
|
125
|
+
validationResponse.errors.push(new TransactionError(BasicTxErrorType.INTERNAL_ERROR, 'This is watch-only account'));
|
|
126
126
|
}
|
|
127
127
|
}
|
|
128
128
|
|
|
@@ -161,8 +161,8 @@ export default class TransactionService {
|
|
|
161
161
|
const transactionId = getTransactionId(transaction.chainType, transaction.chain, isInternal);
|
|
162
162
|
return {
|
|
163
163
|
...transaction,
|
|
164
|
-
createdAt: new Date(),
|
|
165
|
-
updatedAt: new Date(),
|
|
164
|
+
createdAt: new Date().getTime(),
|
|
165
|
+
updatedAt: new Date().getTime(),
|
|
166
166
|
errors: transaction.errors || [],
|
|
167
167
|
warnings: transaction.warnings || [],
|
|
168
168
|
url: transaction.url || EXTENSION_REQUEST_URL,
|
|
@@ -203,6 +203,9 @@ export default class TransactionService {
|
|
|
203
203
|
const stopByErrors = validatedTransaction.errors.length > 0;
|
|
204
204
|
const stopByWarnings = validatedTransaction.warnings.length > 0 && !validatedTransaction.ignoreWarnings;
|
|
205
205
|
if (stopByErrors || stopByWarnings) {
|
|
206
|
+
// @ts-ignore
|
|
207
|
+
'transaction' in validatedTransaction && delete validatedTransaction.transaction;
|
|
208
|
+
'additionalValidator' in validatedTransaction && delete validatedTransaction.additionalValidator;
|
|
206
209
|
return validatedTransaction;
|
|
207
210
|
}
|
|
208
211
|
validatedTransaction.warnings = [];
|
|
@@ -220,6 +223,10 @@ export default class TransactionService {
|
|
|
220
223
|
}
|
|
221
224
|
});
|
|
222
225
|
});
|
|
226
|
+
|
|
227
|
+
// @ts-ignore
|
|
228
|
+
'transaction' in validatedTransaction && delete validatedTransaction.transaction;
|
|
229
|
+
'additionalValidator' in validatedTransaction && delete validatedTransaction.additionalValidator;
|
|
223
230
|
return validatedTransaction;
|
|
224
231
|
}
|
|
225
232
|
async sendTransaction(transaction) {
|
|
@@ -286,7 +293,7 @@ export default class TransactionService {
|
|
|
286
293
|
status: transaction.status,
|
|
287
294
|
transactionId: transaction.id,
|
|
288
295
|
extrinsicHash: transaction.extrinsicHash,
|
|
289
|
-
time: transaction.createdAt
|
|
296
|
+
time: transaction.createdAt,
|
|
290
297
|
fee: transaction.estimateFee,
|
|
291
298
|
blockNumber: 0,
|
|
292
299
|
// Will be added in next step
|
|
@@ -295,7 +302,6 @@ export default class TransactionService {
|
|
|
295
302
|
nonce: nonce || 0,
|
|
296
303
|
startBlock: startBlock || 0
|
|
297
304
|
};
|
|
298
|
-
console.log('historyItem', historyItem);
|
|
299
305
|
const chainInfo = this.chainService.getChainInfoByKey(transaction.chain);
|
|
300
306
|
const nativeAsset = _getChainNativeTokenBasicInfo(chainInfo);
|
|
301
307
|
const baseNativeAmount = {
|
|
@@ -14,14 +14,14 @@ export interface SWTransaction extends ValidateTransactionResponse, Partial<Pick
|
|
|
14
14
|
status: ExtrinsicStatus;
|
|
15
15
|
extrinsicHash: string;
|
|
16
16
|
extrinsicType: ExtrinsicType;
|
|
17
|
-
createdAt:
|
|
18
|
-
updatedAt:
|
|
17
|
+
createdAt: number;
|
|
18
|
+
updatedAt: number;
|
|
19
19
|
estimateFee?: AmountData;
|
|
20
20
|
transaction: SubmittableExtrinsic | TransactionConfig;
|
|
21
21
|
additionalValidator?: (inputTransaction: SWTransactionResponse) => Promise<void>;
|
|
22
22
|
eventsHandler?: (eventEmitter: TransactionEmitter) => void;
|
|
23
23
|
}
|
|
24
|
-
export declare type SWTransactionResult = Omit<SWTransaction, 'transaction'>;
|
|
24
|
+
export declare type SWTransactionResult = Omit<SWTransaction, 'transaction' | 'additionalValidator'>;
|
|
25
25
|
declare type SwInputBase = Pick<SWTransaction, 'address' | 'url' | 'data' | 'extrinsicType' | 'chain' | 'chainType' | 'ignoreWarnings' | 'transferNativeAmount'> & Partial<Pick<SWTransaction, 'additionalValidator'>>;
|
|
26
26
|
export interface SWTransactionInput extends SwInputBase {
|
|
27
27
|
transaction?: SWTransaction['transaction'] | null;
|
|
@@ -21,6 +21,9 @@ function getBlockExplorerTxRoute(chainInfo) {
|
|
|
21
21
|
if (_isPureEvmChain(chainInfo)) {
|
|
22
22
|
return 'tx';
|
|
23
23
|
}
|
|
24
|
+
if (['aventus'].includes(chainInfo.slug)) {
|
|
25
|
+
return 'transaction';
|
|
26
|
+
}
|
|
24
27
|
return 'extrinsic';
|
|
25
28
|
}
|
|
26
29
|
export function getExplorerLink(chainInfo, value, type) {
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { PassPhishing } from '@subwallet/extension-base/background/KoniTypes';
|
|
2
|
+
import SubscribableStore from '@subwallet/extension-base/stores/SubscribableStore';
|
|
3
|
+
export default class PassPhishingStore extends SubscribableStore<Record<string, PassPhishing>> {
|
|
4
|
+
constructor();
|
|
5
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { EXTENSION_PREFIX } from '@subwallet/extension-base/defaults';
|
|
5
|
+
import SubscribableStore from '@subwallet/extension-base/stores/SubscribableStore';
|
|
6
|
+
export default class PassPhishingStore extends SubscribableStore {
|
|
7
|
+
constructor() {
|
|
8
|
+
super(EXTENSION_PREFIX ? `${EXTENSION_PREFIX}subwallet-pass-phishing-list` : null);
|
|
9
|
+
}
|
|
10
|
+
}
|