@subwallet/extension-base 1.1.9-0 → 1.1.11-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 +13 -1
- package/background/KoniTypes.js +5 -0
- package/background/errors/BalanceError.js +7 -5
- package/background/errors/EvmProviderError.js +10 -8
- package/background/errors/ProviderError.js +5 -4
- package/background/errors/TransactionError.js +22 -17
- package/background/handlers/Extension.js +18 -18
- package/background/handlers/State.js +5 -5
- package/background/handlers/Tabs.js +1 -1
- package/background/warnings/TransactionWarning.js +4 -2
- package/cjs/background/KoniTypes.js +7 -1
- package/cjs/background/errors/BalanceError.js +7 -5
- package/cjs/background/errors/EvmProviderError.js +10 -8
- package/cjs/background/errors/ProviderError.js +5 -4
- package/cjs/background/errors/TransactionError.js +22 -17
- package/cjs/background/handlers/Extension.js +18 -18
- package/cjs/background/handlers/State.js +5 -5
- package/cjs/background/handlers/Tabs.js +1 -1
- package/cjs/background/warnings/TransactionWarning.js +4 -2
- package/cjs/constants/i18n.js +4 -1
- package/cjs/constants/index.js +12 -0
- package/cjs/constants/storage.js +11 -0
- package/cjs/defaults.js +3 -1
- package/cjs/koni/api/dotsama/parseTransaction.js +2 -1
- package/cjs/koni/api/nft/config.js +10 -12
- package/cjs/koni/api/staking/bonding/paraChain.js +10 -6
- package/cjs/koni/api/staking/bonding/relayChain.js +16 -7
- package/cjs/koni/api/staking/bonding/utils.js +80 -7
- package/cjs/koni/background/handlers/Extension.js +256 -183
- package/cjs/koni/background/handlers/State.js +19 -14
- package/cjs/koni/background/handlers/Tabs.js +15 -14
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/index.js +12 -3
- package/cjs/services/chain-service/constants.js +3 -2
- package/cjs/services/keyring-service/index.js +4 -0
- package/cjs/services/request-service/handler/AuthRequestHandler.js +4 -4
- package/cjs/services/request-service/handler/EvmRequestHandler.js +24 -11
- package/cjs/services/request-service/handler/SubstrateRequestHandler.js +10 -2
- package/cjs/services/request-service/index.js +1 -1
- package/cjs/services/setting-service/SettingService.js +29 -7
- package/cjs/services/setting-service/constants.js +5 -1
- package/cjs/services/setting-service/i18n/Backend.js +42 -0
- package/cjs/services/setting-service/i18n/cache.js +12 -0
- package/cjs/services/setting-service/i18n/extend.js +16 -0
- package/cjs/services/setting-service/i18n/i18n.js +29 -0
- package/cjs/services/transaction-service/index.js +25 -16
- package/cjs/services/wallet-connect-service/handler/PolkadotRequestHandler.js +0 -1
- package/cjs/utils/eth/parseTransaction/base.js +1 -1
- package/cjs/utils/eth/parseTransaction/index.js +2 -1
- package/cjs/utils/getId.js +1 -1
- package/cjs/utils/index.js +2 -1
- package/constants/i18n.js +4 -1
- package/constants/index.d.ts +1 -0
- package/constants/index.js +2 -1
- package/constants/storage.d.ts +1 -0
- package/constants/storage.js +4 -0
- package/defaults.d.ts +2 -1
- package/defaults.js +2 -1
- package/koni/api/dotsama/parseTransaction.js +2 -1
- package/koni/api/nft/config.d.ts +1 -1
- package/koni/api/nft/config.js +8 -10
- package/koni/api/staking/bonding/paraChain.js +11 -7
- package/koni/api/staking/bonding/relayChain.js +17 -8
- package/koni/api/staking/bonding/utils.d.ts +4 -0
- package/koni/api/staking/bonding/utils.js +70 -2
- package/koni/background/handlers/Extension.d.ts +1 -0
- package/koni/background/handlers/Extension.js +135 -63
- package/koni/background/handlers/State.js +19 -14
- package/koni/background/handlers/Tabs.js +15 -14
- package/package.json +31 -11
- package/packageInfo.js +1 -1
- package/services/balance-service/index.js +12 -3
- package/services/chain-service/constants.js +3 -2
- package/services/keyring-service/index.d.ts +1 -0
- package/services/keyring-service/index.js +4 -0
- package/services/request-service/handler/AuthRequestHandler.js +4 -4
- package/services/request-service/handler/EvmRequestHandler.js +24 -11
- package/services/request-service/handler/SubstrateRequestHandler.js +10 -2
- package/services/request-service/index.d.ts +1 -1
- package/services/request-service/index.js +1 -1
- package/services/setting-service/SettingService.d.ts +2 -0
- package/services/setting-service/SettingService.js +26 -5
- package/services/setting-service/constants.d.ts +2 -1
- package/services/setting-service/constants.js +4 -1
- package/services/setting-service/i18n/Backend.d.ts +9 -0
- package/services/setting-service/i18n/Backend.js +34 -0
- package/services/setting-service/i18n/cache.d.ts +2 -0
- package/services/setting-service/i18n/cache.js +5 -0
- package/services/setting-service/i18n/extend.d.ts +2 -0
- package/services/setting-service/i18n/extend.js +8 -0
- package/services/setting-service/i18n/i18n.d.ts +2 -0
- package/services/setting-service/i18n/i18n.js +21 -0
- package/services/transaction-service/index.d.ts +3 -3
- package/services/transaction-service/index.js +25 -16
- package/services/wallet-connect-service/handler/PolkadotRequestHandler.js +0 -1
- package/utils/eth/parseTransaction/base.js +1 -1
- package/utils/eth/parseTransaction/index.js +2 -1
- package/utils/getId.js +2 -2
- package/utils/index.js +2 -1
- package/cjs/utils/keyring.js +0 -57
- package/utils/keyring.d.ts +0 -4
- package/utils/keyring.js +0 -49
|
@@ -1,22 +1,34 @@
|
|
|
1
1
|
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
|
+
import { LANGUAGE } from '@subwallet/extension-base/constants';
|
|
4
5
|
import PassPhishingStore from '@subwallet/extension-base/stores/PassPhishingStore';
|
|
5
6
|
import SettingsStore from '@subwallet/extension-base/stores/Settings';
|
|
7
|
+
import i18n from "./i18n/i18n.js";
|
|
6
8
|
import { DEFAULT_SETTING } from "./constants.js";
|
|
7
9
|
export default class SettingService {
|
|
8
10
|
settingsStore = new SettingsStore();
|
|
9
11
|
passPhishingStore = new PassPhishingStore();
|
|
12
|
+
constructor() {
|
|
13
|
+
let old = localStorage.getItem(LANGUAGE) || 'en';
|
|
14
|
+
this.settingsStore.getSubject().subscribe(({
|
|
15
|
+
language
|
|
16
|
+
}) => {
|
|
17
|
+
if (language !== old) {
|
|
18
|
+
old = language;
|
|
19
|
+
i18n.changeLanguage(language).catch(console.error);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
10
23
|
getSubject() {
|
|
11
24
|
return this.settingsStore.getSubject();
|
|
12
25
|
}
|
|
13
26
|
getSettings(update) {
|
|
14
27
|
this.settingsStore.get('Settings', value => {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
28
|
+
update({
|
|
29
|
+
...DEFAULT_SETTING,
|
|
30
|
+
...(value || {})
|
|
31
|
+
});
|
|
20
32
|
});
|
|
21
33
|
}
|
|
22
34
|
setSettings(data, callback) {
|
|
@@ -33,6 +45,15 @@ export default class SettingService {
|
|
|
33
45
|
setPassPhishing(data, callback) {
|
|
34
46
|
this.passPhishingStore.set('PassPhishing', data, callback);
|
|
35
47
|
}
|
|
48
|
+
|
|
49
|
+
// Use for mobile only
|
|
50
|
+
get isAlwaysRequired() {
|
|
51
|
+
return new Promise(resolve => {
|
|
52
|
+
this.settingsStore.get('Settings', value => {
|
|
53
|
+
resolve(!value.timeAutoLock);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
}
|
|
36
57
|
resetWallet() {
|
|
37
58
|
this.settingsStore.set('Settings', DEFAULT_SETTING);
|
|
38
59
|
this.passPhishingStore.set('PassPhishing', {});
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { BrowserConfirmationType, LanguageType, ThemeNames, UiSettings } from '@subwallet/extension-base/background/KoniTypes';
|
|
1
|
+
import { BrowserConfirmationType, LanguageType, ThemeNames, UiSettings, WalletUnlockType } from '@subwallet/extension-base/background/KoniTypes';
|
|
2
2
|
export declare const DEFAULT_THEME: ThemeNames;
|
|
3
3
|
export declare const DEFAULT_NOTIFICATION_TYPE: BrowserConfirmationType;
|
|
4
4
|
export declare const DEFAULT_AUTO_LOCK_TIME = 15;
|
|
5
|
+
export declare const DEFAULT_UNLOCK_TYPE: WalletUnlockType;
|
|
5
6
|
export declare const DEFAULT_CHAIN_PATROL_ENABLE = false;
|
|
6
7
|
export declare const DEFAULT_LANGUAGE: LanguageType;
|
|
7
8
|
export declare const DEFAULT_SHOW_ZERO_BALANCE = true;
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
|
-
import { ThemeNames } from '@subwallet/extension-base/background/KoniTypes';
|
|
4
|
+
import { ThemeNames, WalletUnlockType } from '@subwallet/extension-base/background/KoniTypes';
|
|
5
|
+
import { TARGET_ENV } from '@subwallet/extension-base/utils';
|
|
5
6
|
export const DEFAULT_THEME = ThemeNames.DARK;
|
|
6
7
|
export const DEFAULT_NOTIFICATION_TYPE = 'popup';
|
|
7
8
|
export const DEFAULT_AUTO_LOCK_TIME = 15;
|
|
9
|
+
export const DEFAULT_UNLOCK_TYPE = TARGET_ENV === 'extension' ? WalletUnlockType.ALWAYS_REQUIRED : WalletUnlockType.WHEN_NEEDED;
|
|
8
10
|
export const DEFAULT_CHAIN_PATROL_ENABLE = false;
|
|
9
11
|
export const DEFAULT_LANGUAGE = 'en';
|
|
10
12
|
export const DEFAULT_SHOW_ZERO_BALANCE = true;
|
|
@@ -18,6 +20,7 @@ export const DEFAULT_SETTING = {
|
|
|
18
20
|
isShowBalance: DEFAULT_SHOW_BALANCE,
|
|
19
21
|
accountAllLogo: DEFAULT_ALL_LOGO,
|
|
20
22
|
theme: DEFAULT_THEME,
|
|
23
|
+
unlockType: DEFAULT_UNLOCK_TYPE,
|
|
21
24
|
camera: DEFAULT_CAMERA_ENABLE,
|
|
22
25
|
timeAutoLock: DEFAULT_AUTO_LOCK_TIME,
|
|
23
26
|
enableChainPatrol: DEFAULT_CHAIN_PATROL_ENABLE,
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
declare type Callback = (error: string | null, data: unknown) => void;
|
|
2
|
+
declare type LoadResult = [string | null, Record<string, string> | boolean];
|
|
3
|
+
export default class Backend {
|
|
4
|
+
type: string;
|
|
5
|
+
static type: 'backend';
|
|
6
|
+
read(lng: string, _namespace: string, responder: Callback): Promise<void>;
|
|
7
|
+
createLoader(lng: string): Promise<LoadResult>;
|
|
8
|
+
}
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Copyright 2017-2022 @polkadot/react-components authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import languageCache from "./cache.js";
|
|
5
|
+
const loaders = {};
|
|
6
|
+
export default class Backend {
|
|
7
|
+
type = 'backend';
|
|
8
|
+
static type = 'backend';
|
|
9
|
+
async read(lng, _namespace, responder) {
|
|
10
|
+
if (languageCache[lng]) {
|
|
11
|
+
return responder(null, languageCache[lng]);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
15
|
+
if (!loaders[lng]) {
|
|
16
|
+
loaders[lng] = this.createLoader(lng);
|
|
17
|
+
}
|
|
18
|
+
const [error, data] = await loaders[lng];
|
|
19
|
+
return responder(error, data);
|
|
20
|
+
}
|
|
21
|
+
async createLoader(lng) {
|
|
22
|
+
try {
|
|
23
|
+
const response = await fetch(`locales/${lng}/translation.json`, {});
|
|
24
|
+
if (!response.ok) {
|
|
25
|
+
return [`i18n: failed loading ${lng}`, response.status >= 500 && response.status < 600];
|
|
26
|
+
} else {
|
|
27
|
+
languageCache[lng] = await response.json();
|
|
28
|
+
return [null, languageCache[lng]];
|
|
29
|
+
}
|
|
30
|
+
} catch (error) {
|
|
31
|
+
return [error.message, false];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Copyright 2017-2022 @subwallet/extension-base authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { detectTranslate } from '@subwallet/extension-base/utils';
|
|
5
|
+
export const ExternalTranslation = [
|
|
6
|
+
// Case change password
|
|
7
|
+
detectTranslate('Invalid master password')];
|
|
8
|
+
export const InternalTranslation = [];
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Copyright 2019-2022 @polkadot/extension-ui authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { LANGUAGE } from '@subwallet/extension-base/constants';
|
|
5
|
+
import i18next from 'i18next';
|
|
6
|
+
import Backend from "./Backend.js";
|
|
7
|
+
i18next.use(Backend).init({
|
|
8
|
+
backend: {},
|
|
9
|
+
debug: false,
|
|
10
|
+
fallbackLng: 'en',
|
|
11
|
+
interpolation: {
|
|
12
|
+
escapeValue: false
|
|
13
|
+
},
|
|
14
|
+
keySeparator: false,
|
|
15
|
+
lng: localStorage.getItem(LANGUAGE) || 'en',
|
|
16
|
+
load: 'languageOnly',
|
|
17
|
+
nsSeparator: false,
|
|
18
|
+
returnEmptyString: false,
|
|
19
|
+
returnNull: false
|
|
20
|
+
}).catch(error => console.log('i18n: failure', error));
|
|
21
|
+
export default i18next;
|
|
@@ -11,13 +11,13 @@ import { BehaviorSubject } from 'rxjs';
|
|
|
11
11
|
import { TransactionConfig } from 'web3-core';
|
|
12
12
|
import { HexString } from '@polkadot/util/types';
|
|
13
13
|
export default class TransactionService {
|
|
14
|
+
private readonly balanceService;
|
|
14
15
|
private readonly chainService;
|
|
15
|
-
private readonly eventService;
|
|
16
16
|
private readonly databaseService;
|
|
17
|
-
private readonly
|
|
18
|
-
private readonly balanceService;
|
|
17
|
+
private readonly eventService;
|
|
19
18
|
private readonly historyService;
|
|
20
19
|
private readonly notificationService;
|
|
20
|
+
private readonly requestService;
|
|
21
21
|
private readonly transactionSubject;
|
|
22
22
|
private get transactions();
|
|
23
23
|
constructor(chainService: ChainService, eventService: EventService, requestService: RequestService, balanceService: BalanceService, historyService: HistoryService, notificationService: NotificationService, databaseService: DatabaseService);
|
|
@@ -22,6 +22,7 @@ import BigN from 'bignumber.js';
|
|
|
22
22
|
import { addHexPrefix } from 'ethereumjs-util';
|
|
23
23
|
import { ethers } from 'ethers';
|
|
24
24
|
import EventEmitter from 'eventemitter3';
|
|
25
|
+
import { t } from 'i18next';
|
|
25
26
|
import { BehaviorSubject } from 'rxjs';
|
|
26
27
|
import { isHex } from '@polkadot/util';
|
|
27
28
|
export default class TransactionService {
|
|
@@ -90,7 +91,7 @@ export default class TransactionService {
|
|
|
90
91
|
};
|
|
91
92
|
const chainInfo = this.chainService.getChainInfoByKey(chain);
|
|
92
93
|
if (!chainInfo) {
|
|
93
|
-
validationResponse.errors.push(new TransactionError(BasicTxErrorType.INTERNAL_ERROR,
|
|
94
|
+
validationResponse.errors.push(new TransactionError(BasicTxErrorType.INTERNAL_ERROR, t('Cannot find network')));
|
|
94
95
|
} else {
|
|
95
96
|
const {
|
|
96
97
|
decimals,
|
|
@@ -105,7 +106,7 @@ export default class TransactionService {
|
|
|
105
106
|
} else {
|
|
106
107
|
const web3 = this.chainService.getEvmApi(chain);
|
|
107
108
|
if (!web3) {
|
|
108
|
-
validationResponse.errors.push(new TransactionError(BasicTxErrorType.CHAIN_DISCONNECTED));
|
|
109
|
+
validationResponse.errors.push(new TransactionError(BasicTxErrorType.CHAIN_DISCONNECTED, undefined));
|
|
109
110
|
} else {
|
|
110
111
|
const gasPrice = await web3.api.eth.getGasPrice();
|
|
111
112
|
const gasLimit = await web3.api.eth.estimateGas(transaction);
|
|
@@ -126,11 +127,11 @@ export default class TransactionService {
|
|
|
126
127
|
// Read-only account
|
|
127
128
|
const pair = keyring.getPair(address);
|
|
128
129
|
if (!pair) {
|
|
129
|
-
validationResponse.errors.push(new TransactionError(BasicTxErrorType.INTERNAL_ERROR, '
|
|
130
|
+
validationResponse.errors.push(new TransactionError(BasicTxErrorType.INTERNAL_ERROR, t('Unable to find account')));
|
|
130
131
|
} else {
|
|
131
132
|
var _pair$meta;
|
|
132
133
|
if ((_pair$meta = pair.meta) !== null && _pair$meta !== void 0 && _pair$meta.isReadOnly) {
|
|
133
|
-
validationResponse.errors.push(new TransactionError(BasicTxErrorType.INTERNAL_ERROR, 'This is watch-only
|
|
134
|
+
validationResponse.errors.push(new TransactionError(BasicTxErrorType.INTERNAL_ERROR, t('This account is watch-only')));
|
|
134
135
|
}
|
|
135
136
|
}
|
|
136
137
|
|
|
@@ -159,9 +160,9 @@ export default class TransactionService {
|
|
|
159
160
|
if (!isTransferAll) {
|
|
160
161
|
if (balanceNum - (transferNativeNum + feeNum) < edNum) {
|
|
161
162
|
if (edAsWarning) {
|
|
162
|
-
validationResponse.warnings.push(new TransactionWarning(BasicTxWarningCode.NOT_ENOUGH_EXISTENTIAL_DEPOSIT
|
|
163
|
+
validationResponse.warnings.push(new TransactionWarning(BasicTxWarningCode.NOT_ENOUGH_EXISTENTIAL_DEPOSIT));
|
|
163
164
|
} else {
|
|
164
|
-
validationResponse.errors.push(new TransactionError(BasicTxErrorType.NOT_ENOUGH_EXISTENTIAL_DEPOSIT
|
|
165
|
+
validationResponse.errors.push(new TransactionError(BasicTxErrorType.NOT_ENOUGH_EXISTENTIAL_DEPOSIT));
|
|
165
166
|
}
|
|
166
167
|
}
|
|
167
168
|
}
|
|
@@ -582,8 +583,12 @@ export default class TransactionService {
|
|
|
582
583
|
const info = isHex(extrinsicHash) ? extrinsicHash : getBaseTransactionInfo(transaction, this.chainService.getChainInfoMap());
|
|
583
584
|
this.notificationService.notify({
|
|
584
585
|
type: NotificationType.SUCCESS,
|
|
585
|
-
title: 'Transaction completed',
|
|
586
|
-
message:
|
|
586
|
+
title: t('Transaction completed'),
|
|
587
|
+
message: t('Transaction {{info}} completed', {
|
|
588
|
+
replace: {
|
|
589
|
+
info
|
|
590
|
+
}
|
|
591
|
+
}),
|
|
587
592
|
action: {
|
|
588
593
|
url: this.getTransactionLink(id)
|
|
589
594
|
},
|
|
@@ -617,8 +622,12 @@ export default class TransactionService {
|
|
|
617
622
|
const info = isHex(transaction === null || transaction === void 0 ? void 0 : transaction.extrinsicHash) ? transaction === null || transaction === void 0 ? void 0 : transaction.extrinsicHash : getBaseTransactionInfo(transaction, this.chainService.getChainInfoMap());
|
|
618
623
|
this.notificationService.notify({
|
|
619
624
|
type: NotificationType.ERROR,
|
|
620
|
-
title: 'Transaction failed',
|
|
621
|
-
message:
|
|
625
|
+
title: t('Transaction failed'),
|
|
626
|
+
message: t('Transaction {{info}} failed', {
|
|
627
|
+
replace: {
|
|
628
|
+
info
|
|
629
|
+
}
|
|
630
|
+
}),
|
|
622
631
|
action: {
|
|
623
632
|
url: this.getTransactionLink(id)
|
|
624
633
|
},
|
|
@@ -721,7 +730,7 @@ export default class TransactionService {
|
|
|
721
730
|
if (isApproved) {
|
|
722
731
|
let signedTransaction;
|
|
723
732
|
if (!payload) {
|
|
724
|
-
throw new EvmProviderError(EvmProviderErrorType.UNAUTHORIZED, '
|
|
733
|
+
throw new EvmProviderError(EvmProviderErrorType.UNAUTHORIZED, t('Failed to sign'));
|
|
725
734
|
}
|
|
726
735
|
const web3Api = this.chainService.getEvmApi(chain).api;
|
|
727
736
|
if (!isExternal) {
|
|
@@ -730,7 +739,7 @@ export default class TransactionService {
|
|
|
730
739
|
const signed = mergeTransactionAndSignature(txObject, payload);
|
|
731
740
|
const recover = web3Api.eth.accounts.recoverTransaction(signed);
|
|
732
741
|
if (recover.toLowerCase() !== account.address.toLowerCase()) {
|
|
733
|
-
throw new EvmProviderError(EvmProviderErrorType.UNAUTHORIZED, '
|
|
742
|
+
throw new EvmProviderError(EvmProviderErrorType.UNAUTHORIZED, t('Wrong signature. Please sign with the account you use in dApp'));
|
|
734
743
|
}
|
|
735
744
|
signedTransaction = signed;
|
|
736
745
|
}
|
|
@@ -754,10 +763,10 @@ export default class TransactionService {
|
|
|
754
763
|
eventData.blockNumber = rs.blockNumber;
|
|
755
764
|
emitter.emit('success', eventData);
|
|
756
765
|
}).once('error', e => {
|
|
757
|
-
eventData.errors.push(new TransactionError(BasicTxErrorType.SEND_TRANSACTION_FAILED, e.message));
|
|
766
|
+
eventData.errors.push(new TransactionError(BasicTxErrorType.SEND_TRANSACTION_FAILED, t(e.message)));
|
|
758
767
|
emitter.emit('error', eventData);
|
|
759
768
|
}).catch(e => {
|
|
760
|
-
eventData.errors.push(new TransactionError(BasicTxErrorType.UNABLE_TO_SEND, e.message));
|
|
769
|
+
eventData.errors.push(new TransactionError(BasicTxErrorType.UNABLE_TO_SEND, t(e.message)));
|
|
761
770
|
emitter.emit('error', eventData);
|
|
762
771
|
});
|
|
763
772
|
} else {
|
|
@@ -767,7 +776,7 @@ export default class TransactionService {
|
|
|
767
776
|
}
|
|
768
777
|
}).catch(e => {
|
|
769
778
|
this.removeTransaction(id);
|
|
770
|
-
eventData.errors.push(new TransactionError(BasicTxErrorType.UNABLE_TO_SIGN, e.message));
|
|
779
|
+
eventData.errors.push(new TransactionError(BasicTxErrorType.UNABLE_TO_SIGN, t(e.message)));
|
|
771
780
|
emitter.emit('error', eventData);
|
|
772
781
|
});
|
|
773
782
|
return emitter;
|
|
@@ -857,7 +866,7 @@ export default class TransactionService {
|
|
|
857
866
|
const timeout = setTimeout(() => {
|
|
858
867
|
const transaction = this.getTransaction(eventData.id);
|
|
859
868
|
if (transaction.status !== ExtrinsicStatus.SUCCESS && transaction.status !== ExtrinsicStatus.FAIL) {
|
|
860
|
-
eventData.errors.push(new TransactionError(BasicTxErrorType.TIMEOUT, 'Transaction timeout'));
|
|
869
|
+
eventData.errors.push(new TransactionError(BasicTxErrorType.TIMEOUT, t('Transaction timeout')));
|
|
861
870
|
emitter.emit('error', eventData);
|
|
862
871
|
clearTimeout(timeout);
|
|
863
872
|
}
|
|
@@ -87,7 +87,7 @@ export class InputDataDecoder {
|
|
|
87
87
|
try {
|
|
88
88
|
this.abi = JSON.parse(prop);
|
|
89
89
|
} catch (err) {
|
|
90
|
-
throw new Error(
|
|
90
|
+
throw new Error('Invalid ABI: ' + err.message);
|
|
91
91
|
}
|
|
92
92
|
} else if (checkArrayAbiItems(prop)) {
|
|
93
93
|
this.abi = prop;
|
|
@@ -7,6 +7,7 @@ import { createTransactionFromRLP } from '@subwallet/extension-base/utils/eth';
|
|
|
7
7
|
import { InputDataDecoder } from '@subwallet/extension-base/utils/eth/parseTransaction/base';
|
|
8
8
|
import axios from 'axios';
|
|
9
9
|
import BigN from 'bignumber.js';
|
|
10
|
+
import { t } from 'i18next';
|
|
10
11
|
|
|
11
12
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
12
13
|
const ABIs = [_ERC20_ABI, _ERC721_ABI];
|
|
@@ -181,7 +182,7 @@ const getChainInfoByChainId = (networkMap, chainId) => {
|
|
|
181
182
|
export const parseEvmRlp = async (data, networkMap, evmApiMap) => {
|
|
182
183
|
const tx = createTransactionFromRLP(data);
|
|
183
184
|
if (!tx) {
|
|
184
|
-
throw new Error(
|
|
185
|
+
throw new Error(t('Failed to decode data. Please use a valid QR code'));
|
|
185
186
|
}
|
|
186
187
|
const result = {
|
|
187
188
|
input: tx.data,
|
package/utils/getId.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Copyright 2019-2022 @polkadot/extension authors & contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import { ID_PREFIX } from "../defaults.js";
|
|
5
5
|
let counter = 0;
|
|
6
6
|
export function getId() {
|
|
7
|
-
return `${
|
|
7
|
+
return `${ID_PREFIX}.${Date.now()}.${++counter}`;
|
|
8
8
|
}
|
package/utils/index.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import { CrowdloanParaState, MobileOS } from '@subwallet/extension-base/background/KoniTypes';
|
|
5
5
|
import { ALL_ACCOUNT_KEY } from '@subwallet/extension-base/constants';
|
|
6
6
|
import { getOS } from '@subwallet/extension-base/utils/environment';
|
|
7
|
+
import { t } from 'i18next';
|
|
7
8
|
import { assert, BN, hexToU8a, isHex } from '@polkadot/util';
|
|
8
9
|
import { decodeAddress, encodeAddress, ethereumEncode, isEthereumAddress } from '@polkadot/util-crypto';
|
|
9
10
|
export { canDerive } from "./canDerive.js";
|
|
@@ -282,7 +283,7 @@ export async function waitTimeout(ms) {
|
|
|
282
283
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
283
284
|
}
|
|
284
285
|
export const stripUrl = url => {
|
|
285
|
-
assert(url && (url.startsWith('http:') || url.startsWith('https:') || url.startsWith('ipfs:') || url.startsWith('ipns:')),
|
|
286
|
+
assert(url && (url.startsWith('http:') || url.startsWith('https:') || url.startsWith('ipfs:') || url.startsWith('ipns:')), t('Invalid URL for provider'));
|
|
286
287
|
const parts = url.split('/');
|
|
287
288
|
return parts[2];
|
|
288
289
|
};
|
package/cjs/utils/keyring.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.extractPrivateKey = extractPrivateKey;
|
|
7
|
-
exports.unlockAccount = exports.lockAccount = void 0;
|
|
8
|
-
var _uiKeyring = require("@subwallet/ui-keyring");
|
|
9
|
-
// Copyright 2019-2022 @subwallet/extension-base
|
|
10
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
11
|
-
|
|
12
|
-
// import _decode from '@polkadot/keyring/pair/decode';
|
|
13
|
-
|
|
14
|
-
function extract(address) {
|
|
15
|
-
// @ts-ignore
|
|
16
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
|
|
17
|
-
const rs = this.getPair(address);
|
|
18
|
-
|
|
19
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
20
|
-
console.log(rs.publicKey);
|
|
21
|
-
}
|
|
22
|
-
function extractPrivateKey(keyring, address, password) {
|
|
23
|
-
extract.call(keyring, address);
|
|
24
|
-
}
|
|
25
|
-
const unlockAccount = signAddress => {
|
|
26
|
-
let publicKey;
|
|
27
|
-
try {
|
|
28
|
-
publicKey = _uiKeyring.keyring.decodeAddress(signAddress);
|
|
29
|
-
} catch (error) {
|
|
30
|
-
console.error(error);
|
|
31
|
-
return 'Unable to decode address';
|
|
32
|
-
}
|
|
33
|
-
const pair = _uiKeyring.keyring.getPair(publicKey);
|
|
34
|
-
if (!pair) {
|
|
35
|
-
return 'Unable to find pair';
|
|
36
|
-
}
|
|
37
|
-
if (pair.isLocked) {
|
|
38
|
-
try {
|
|
39
|
-
_uiKeyring.keyring.unlockPair(pair.address);
|
|
40
|
-
} catch (e) {
|
|
41
|
-
return e.message;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return null;
|
|
45
|
-
};
|
|
46
|
-
exports.unlockAccount = unlockAccount;
|
|
47
|
-
const lockAccount = address => {
|
|
48
|
-
try {
|
|
49
|
-
const pair = _uiKeyring.keyring.getPair(address);
|
|
50
|
-
if (pair) {
|
|
51
|
-
pair.lock();
|
|
52
|
-
}
|
|
53
|
-
} catch (error) {
|
|
54
|
-
console.error('Unable to lock account', error);
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
exports.lockAccount = lockAccount;
|
package/utils/keyring.d.ts
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { Keyring } from '@subwallet/keyring';
|
|
2
|
-
export declare function extractPrivateKey(keyring: Keyring, address: string, password: string): void;
|
|
3
|
-
export declare const unlockAccount: (signAddress: string) => string | null;
|
|
4
|
-
export declare const lockAccount: (address: string) => void;
|
package/utils/keyring.js
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
// Copyright 2019-2022 @subwallet/extension-base
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
|
|
4
|
-
import { keyring } from '@subwallet/ui-keyring';
|
|
5
|
-
|
|
6
|
-
// import _decode from '@polkadot/keyring/pair/decode';
|
|
7
|
-
|
|
8
|
-
function extract(address) {
|
|
9
|
-
// @ts-ignore
|
|
10
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
|
|
11
|
-
const rs = this.getPair(address);
|
|
12
|
-
|
|
13
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
14
|
-
console.log(rs.publicKey);
|
|
15
|
-
}
|
|
16
|
-
export function extractPrivateKey(keyring, address, password) {
|
|
17
|
-
extract.call(keyring, address);
|
|
18
|
-
}
|
|
19
|
-
export const unlockAccount = signAddress => {
|
|
20
|
-
let publicKey;
|
|
21
|
-
try {
|
|
22
|
-
publicKey = keyring.decodeAddress(signAddress);
|
|
23
|
-
} catch (error) {
|
|
24
|
-
console.error(error);
|
|
25
|
-
return 'Unable to decode address';
|
|
26
|
-
}
|
|
27
|
-
const pair = keyring.getPair(publicKey);
|
|
28
|
-
if (!pair) {
|
|
29
|
-
return 'Unable to find pair';
|
|
30
|
-
}
|
|
31
|
-
if (pair.isLocked) {
|
|
32
|
-
try {
|
|
33
|
-
keyring.unlockPair(pair.address);
|
|
34
|
-
} catch (e) {
|
|
35
|
-
return e.message;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return null;
|
|
39
|
-
};
|
|
40
|
-
export const lockAccount = address => {
|
|
41
|
-
try {
|
|
42
|
-
const pair = keyring.getPair(address);
|
|
43
|
-
if (pair) {
|
|
44
|
-
pair.lock();
|
|
45
|
-
}
|
|
46
|
-
} catch (error) {
|
|
47
|
-
console.error('Unable to lock account', error);
|
|
48
|
-
}
|
|
49
|
-
};
|