@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.
Files changed (102) hide show
  1. package/background/KoniTypes.d.ts +13 -1
  2. package/background/KoniTypes.js +5 -0
  3. package/background/errors/BalanceError.js +7 -5
  4. package/background/errors/EvmProviderError.js +10 -8
  5. package/background/errors/ProviderError.js +5 -4
  6. package/background/errors/TransactionError.js +22 -17
  7. package/background/handlers/Extension.js +18 -18
  8. package/background/handlers/State.js +5 -5
  9. package/background/handlers/Tabs.js +1 -1
  10. package/background/warnings/TransactionWarning.js +4 -2
  11. package/cjs/background/KoniTypes.js +7 -1
  12. package/cjs/background/errors/BalanceError.js +7 -5
  13. package/cjs/background/errors/EvmProviderError.js +10 -8
  14. package/cjs/background/errors/ProviderError.js +5 -4
  15. package/cjs/background/errors/TransactionError.js +22 -17
  16. package/cjs/background/handlers/Extension.js +18 -18
  17. package/cjs/background/handlers/State.js +5 -5
  18. package/cjs/background/handlers/Tabs.js +1 -1
  19. package/cjs/background/warnings/TransactionWarning.js +4 -2
  20. package/cjs/constants/i18n.js +4 -1
  21. package/cjs/constants/index.js +12 -0
  22. package/cjs/constants/storage.js +11 -0
  23. package/cjs/defaults.js +3 -1
  24. package/cjs/koni/api/dotsama/parseTransaction.js +2 -1
  25. package/cjs/koni/api/nft/config.js +10 -12
  26. package/cjs/koni/api/staking/bonding/paraChain.js +10 -6
  27. package/cjs/koni/api/staking/bonding/relayChain.js +16 -7
  28. package/cjs/koni/api/staking/bonding/utils.js +80 -7
  29. package/cjs/koni/background/handlers/Extension.js +256 -183
  30. package/cjs/koni/background/handlers/State.js +19 -14
  31. package/cjs/koni/background/handlers/Tabs.js +15 -14
  32. package/cjs/packageInfo.js +1 -1
  33. package/cjs/services/balance-service/index.js +12 -3
  34. package/cjs/services/chain-service/constants.js +3 -2
  35. package/cjs/services/keyring-service/index.js +4 -0
  36. package/cjs/services/request-service/handler/AuthRequestHandler.js +4 -4
  37. package/cjs/services/request-service/handler/EvmRequestHandler.js +24 -11
  38. package/cjs/services/request-service/handler/SubstrateRequestHandler.js +10 -2
  39. package/cjs/services/request-service/index.js +1 -1
  40. package/cjs/services/setting-service/SettingService.js +29 -7
  41. package/cjs/services/setting-service/constants.js +5 -1
  42. package/cjs/services/setting-service/i18n/Backend.js +42 -0
  43. package/cjs/services/setting-service/i18n/cache.js +12 -0
  44. package/cjs/services/setting-service/i18n/extend.js +16 -0
  45. package/cjs/services/setting-service/i18n/i18n.js +29 -0
  46. package/cjs/services/transaction-service/index.js +25 -16
  47. package/cjs/services/wallet-connect-service/handler/PolkadotRequestHandler.js +0 -1
  48. package/cjs/utils/eth/parseTransaction/base.js +1 -1
  49. package/cjs/utils/eth/parseTransaction/index.js +2 -1
  50. package/cjs/utils/getId.js +1 -1
  51. package/cjs/utils/index.js +2 -1
  52. package/constants/i18n.js +4 -1
  53. package/constants/index.d.ts +1 -0
  54. package/constants/index.js +2 -1
  55. package/constants/storage.d.ts +1 -0
  56. package/constants/storage.js +4 -0
  57. package/defaults.d.ts +2 -1
  58. package/defaults.js +2 -1
  59. package/koni/api/dotsama/parseTransaction.js +2 -1
  60. package/koni/api/nft/config.d.ts +1 -1
  61. package/koni/api/nft/config.js +8 -10
  62. package/koni/api/staking/bonding/paraChain.js +11 -7
  63. package/koni/api/staking/bonding/relayChain.js +17 -8
  64. package/koni/api/staking/bonding/utils.d.ts +4 -0
  65. package/koni/api/staking/bonding/utils.js +70 -2
  66. package/koni/background/handlers/Extension.d.ts +1 -0
  67. package/koni/background/handlers/Extension.js +135 -63
  68. package/koni/background/handlers/State.js +19 -14
  69. package/koni/background/handlers/Tabs.js +15 -14
  70. package/package.json +31 -11
  71. package/packageInfo.js +1 -1
  72. package/services/balance-service/index.js +12 -3
  73. package/services/chain-service/constants.js +3 -2
  74. package/services/keyring-service/index.d.ts +1 -0
  75. package/services/keyring-service/index.js +4 -0
  76. package/services/request-service/handler/AuthRequestHandler.js +4 -4
  77. package/services/request-service/handler/EvmRequestHandler.js +24 -11
  78. package/services/request-service/handler/SubstrateRequestHandler.js +10 -2
  79. package/services/request-service/index.d.ts +1 -1
  80. package/services/request-service/index.js +1 -1
  81. package/services/setting-service/SettingService.d.ts +2 -0
  82. package/services/setting-service/SettingService.js +26 -5
  83. package/services/setting-service/constants.d.ts +2 -1
  84. package/services/setting-service/constants.js +4 -1
  85. package/services/setting-service/i18n/Backend.d.ts +9 -0
  86. package/services/setting-service/i18n/Backend.js +34 -0
  87. package/services/setting-service/i18n/cache.d.ts +2 -0
  88. package/services/setting-service/i18n/cache.js +5 -0
  89. package/services/setting-service/i18n/extend.d.ts +2 -0
  90. package/services/setting-service/i18n/extend.js +8 -0
  91. package/services/setting-service/i18n/i18n.d.ts +2 -0
  92. package/services/setting-service/i18n/i18n.js +21 -0
  93. package/services/transaction-service/index.d.ts +3 -3
  94. package/services/transaction-service/index.js +25 -16
  95. package/services/wallet-connect-service/handler/PolkadotRequestHandler.js +0 -1
  96. package/utils/eth/parseTransaction/base.js +1 -1
  97. package/utils/eth/parseTransaction/index.js +2 -1
  98. package/utils/getId.js +2 -2
  99. package/utils/index.js +2 -1
  100. package/cjs/utils/keyring.js +0 -57
  101. package/utils/keyring.d.ts +0 -4
  102. package/utils/keyring.js +0 -49
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.InternalTranslation = exports.ExternalTranslation = void 0;
7
+ var _utils = require("@subwallet/extension-base/utils");
8
+ // Copyright 2017-2022 @subwallet/extension-base authors & contributors
9
+ // SPDX-License-Identifier: Apache-2.0
10
+
11
+ const ExternalTranslation = [
12
+ // Case change password
13
+ (0, _utils.detectTranslate)('Invalid master password')];
14
+ exports.ExternalTranslation = ExternalTranslation;
15
+ const InternalTranslation = [];
16
+ exports.InternalTranslation = InternalTranslation;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _constants = require("@subwallet/extension-base/constants");
9
+ var _i18next = _interopRequireDefault(require("i18next"));
10
+ var _Backend = _interopRequireDefault(require("./Backend"));
11
+ // Copyright 2019-2022 @polkadot/extension-ui authors & contributors
12
+ // SPDX-License-Identifier: Apache-2.0
13
+
14
+ _i18next.default.use(_Backend.default).init({
15
+ backend: {},
16
+ debug: false,
17
+ fallbackLng: 'en',
18
+ interpolation: {
19
+ escapeValue: false
20
+ },
21
+ keySeparator: false,
22
+ lng: localStorage.getItem(_constants.LANGUAGE) || 'en',
23
+ load: 'languageOnly',
24
+ nsSeparator: false,
25
+ returnEmptyString: false,
26
+ returnNull: false
27
+ }).catch(error => console.log('i18n: failure', error));
28
+ var _default = _i18next.default;
29
+ exports.default = _default;
@@ -26,6 +26,7 @@ var _bignumber = _interopRequireDefault(require("bignumber.js"));
26
26
  var _ethereumjsUtil = require("ethereumjs-util");
27
27
  var _ethers = require("ethers");
28
28
  var _eventemitter = _interopRequireDefault(require("eventemitter3"));
29
+ var _i18next = require("i18next");
29
30
  var _rxjs = require("rxjs");
30
31
  var _util = require("@polkadot/util");
31
32
  // Copyright 2019-2022 @subwallet/extension-base authors & contributors
@@ -97,7 +98,7 @@ class TransactionService {
97
98
  };
98
99
  const chainInfo = this.chainService.getChainInfoByKey(chain);
99
100
  if (!chainInfo) {
100
- validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR, "Can't find network"));
101
+ validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR, (0, _i18next.t)('Cannot find network')));
101
102
  } else {
102
103
  const {
103
104
  decimals,
@@ -112,7 +113,7 @@ class TransactionService {
112
113
  } else {
113
114
  const web3 = this.chainService.getEvmApi(chain);
114
115
  if (!web3) {
115
- validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.CHAIN_DISCONNECTED));
116
+ validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.CHAIN_DISCONNECTED, undefined));
116
117
  } else {
117
118
  const gasPrice = await web3.api.eth.getGasPrice();
118
119
  const gasLimit = await web3.api.eth.estimateGas(transaction);
@@ -133,11 +134,11 @@ class TransactionService {
133
134
  // Read-only account
134
135
  const pair = _uiKeyring.default.getPair(address);
135
136
  if (!pair) {
136
- validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR, 'Can\'t find account'));
137
+ validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR, (0, _i18next.t)('Unable to find account')));
137
138
  } else {
138
139
  var _pair$meta;
139
140
  if ((_pair$meta = pair.meta) !== null && _pair$meta !== void 0 && _pair$meta.isReadOnly) {
140
- validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR, 'This is watch-only account'));
141
+ validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR, (0, _i18next.t)('This account is watch-only')));
141
142
  }
142
143
  }
143
144
 
@@ -166,9 +167,9 @@ class TransactionService {
166
167
  if (!isTransferAll) {
167
168
  if (balanceNum - (transferNativeNum + feeNum) < edNum) {
168
169
  if (edAsWarning) {
169
- validationResponse.warnings.push(new _TransactionWarning.TransactionWarning(_KoniTypes.BasicTxWarningCode.NOT_ENOUGH_EXISTENTIAL_DEPOSIT, ''));
170
+ validationResponse.warnings.push(new _TransactionWarning.TransactionWarning(_KoniTypes.BasicTxWarningCode.NOT_ENOUGH_EXISTENTIAL_DEPOSIT));
170
171
  } else {
171
- validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.NOT_ENOUGH_EXISTENTIAL_DEPOSIT, ''));
172
+ validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.NOT_ENOUGH_EXISTENTIAL_DEPOSIT));
172
173
  }
173
174
  }
174
175
  }
@@ -593,8 +594,12 @@ class TransactionService {
593
594
  const info = (0, _util.isHex)(extrinsicHash) ? extrinsicHash : (0, _helpers.getBaseTransactionInfo)(transaction, this.chainService.getChainInfoMap());
594
595
  this.notificationService.notify({
595
596
  type: _KoniTypes.NotificationType.SUCCESS,
596
- title: 'Transaction completed',
597
- message: `Transaction ${info} completed`,
597
+ title: (0, _i18next.t)('Transaction completed'),
598
+ message: (0, _i18next.t)('Transaction {{info}} completed', {
599
+ replace: {
600
+ info
601
+ }
602
+ }),
598
603
  action: {
599
604
  url: this.getTransactionLink(id)
600
605
  },
@@ -629,8 +634,12 @@ class TransactionService {
629
634
  const info = (0, _util.isHex)(transaction === null || transaction === void 0 ? void 0 : transaction.extrinsicHash) ? transaction === null || transaction === void 0 ? void 0 : transaction.extrinsicHash : (0, _helpers.getBaseTransactionInfo)(transaction, this.chainService.getChainInfoMap());
630
635
  this.notificationService.notify({
631
636
  type: _KoniTypes.NotificationType.ERROR,
632
- title: 'Transaction failed',
633
- message: `Transaction ${info} failed`,
637
+ title: (0, _i18next.t)('Transaction failed'),
638
+ message: (0, _i18next.t)('Transaction {{info}} failed', {
639
+ replace: {
640
+ info
641
+ }
642
+ }),
634
643
  action: {
635
644
  url: this.getTransactionLink(id)
636
645
  },
@@ -735,7 +744,7 @@ class TransactionService {
735
744
  if (isApproved) {
736
745
  let signedTransaction;
737
746
  if (!payload) {
738
- throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.UNAUTHORIZED, 'Bad signature');
747
+ throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.UNAUTHORIZED, (0, _i18next.t)('Failed to sign'));
739
748
  }
740
749
  const web3Api = this.chainService.getEvmApi(chain).api;
741
750
  if (!isExternal) {
@@ -744,7 +753,7 @@ class TransactionService {
744
753
  const signed = (0, _mergeTransactionAndSignature.mergeTransactionAndSignature)(txObject, payload);
745
754
  const recover = web3Api.eth.accounts.recoverTransaction(signed);
746
755
  if (recover.toLowerCase() !== account.address.toLowerCase()) {
747
- throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.UNAUTHORIZED, 'Bad signature');
756
+ throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.UNAUTHORIZED, (0, _i18next.t)('Wrong signature. Please sign with the account you use in dApp'));
748
757
  }
749
758
  signedTransaction = signed;
750
759
  }
@@ -768,10 +777,10 @@ class TransactionService {
768
777
  eventData.blockNumber = rs.blockNumber;
769
778
  emitter.emit('success', eventData);
770
779
  }).once('error', e => {
771
- eventData.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.SEND_TRANSACTION_FAILED, e.message));
780
+ eventData.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.SEND_TRANSACTION_FAILED, (0, _i18next.t)(e.message)));
772
781
  emitter.emit('error', eventData);
773
782
  }).catch(e => {
774
- eventData.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.UNABLE_TO_SEND, e.message));
783
+ eventData.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.UNABLE_TO_SEND, (0, _i18next.t)(e.message)));
775
784
  emitter.emit('error', eventData);
776
785
  });
777
786
  } else {
@@ -781,7 +790,7 @@ class TransactionService {
781
790
  }
782
791
  }).catch(e => {
783
792
  this.removeTransaction(id);
784
- eventData.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.UNABLE_TO_SIGN, e.message));
793
+ eventData.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.UNABLE_TO_SIGN, (0, _i18next.t)(e.message)));
785
794
  emitter.emit('error', eventData);
786
795
  });
787
796
  return emitter;
@@ -876,7 +885,7 @@ class TransactionService {
876
885
  const timeout = setTimeout(() => {
877
886
  const transaction = this.getTransaction(eventData.id);
878
887
  if (transaction.status !== _KoniTypes.ExtrinsicStatus.SUCCESS && transaction.status !== _KoniTypes.ExtrinsicStatus.FAIL) {
879
- eventData.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.TIMEOUT, 'Transaction timeout'));
888
+ eventData.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.TIMEOUT, (0, _i18next.t)('Transaction timeout')));
880
889
  emitter.emit('error', eventData);
881
890
  clearTimeout(timeout);
882
891
  }
@@ -111,7 +111,6 @@ function _checkAccount2(address, accounts) {
111
111
  }
112
112
  }
113
113
  function _handleError2(topic, id, e) {
114
- console.log(e);
115
114
  let message = e.message;
116
115
  if (message.includes('User Rejected Request')) {
117
116
  message = (0, _utils3.getSdkError)('USER_REJECTED').message;
@@ -95,7 +95,7 @@ class InputDataDecoder {
95
95
  try {
96
96
  this.abi = JSON.parse(prop);
97
97
  } catch (err) {
98
- throw new Error(`Invalid ABI: ${err.message}`);
98
+ throw new Error('Invalid ABI: ' + err.message);
99
99
  }
100
100
  } else if (checkArrayAbiItems(prop)) {
101
101
  this.abi = prop;
@@ -11,6 +11,7 @@ var _eth = require("@subwallet/extension-base/utils/eth");
11
11
  var _base = require("@subwallet/extension-base/utils/eth/parseTransaction/base");
12
12
  var _axios = _interopRequireDefault(require("axios"));
13
13
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
14
+ var _i18next = require("i18next");
14
15
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
15
16
  // SPDX-License-Identifier: Apache-2.0
16
17
 
@@ -189,7 +190,7 @@ const getChainInfoByChainId = (networkMap, chainId) => {
189
190
  const parseEvmRlp = async (data, networkMap, evmApiMap) => {
190
191
  const tx = (0, _eth.createTransactionFromRLP)(data);
191
192
  if (!tx) {
192
- throw new Error(`Cannot create tx from ${data}`);
193
+ throw new Error((0, _i18next.t)('Failed to decode data. Please use a valid QR code'));
193
194
  }
194
195
  const result = {
195
196
  input: tx.data,
@@ -10,5 +10,5 @@ var _defaults = require("../defaults");
10
10
 
11
11
  let counter = 0;
12
12
  function getId() {
13
- return `${_defaults.EXTENSION_PREFIX}.${Date.now()}.${++counter}`;
13
+ return `${_defaults.ID_PREFIX}.${Date.now()}.${++counter}`;
14
14
  }
@@ -72,6 +72,7 @@ exports.waitTimeout = waitTimeout;
72
72
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
73
73
  var _constants = require("@subwallet/extension-base/constants");
74
74
  var _environment = require("@subwallet/extension-base/utils/environment");
75
+ var _i18next = require("i18next");
75
76
  var _util = require("@polkadot/util");
76
77
  var _utilCrypto = require("@polkadot/util-crypto");
77
78
  var _canDerive = require("./canDerive");
@@ -430,7 +431,7 @@ async function waitTimeout(ms) {
430
431
  return new Promise(resolve => setTimeout(resolve, ms));
431
432
  }
432
433
  const stripUrl = url => {
433
- (0, _util.assert)(url && (url.startsWith('http:') || url.startsWith('https:') || url.startsWith('ipfs:') || url.startsWith('ipns:')), `Invalid url ${url}, expected to start with http: or https: or ipfs: or ipns:`);
434
+ (0, _util.assert)(url && (url.startsWith('http:') || url.startsWith('https:') || url.startsWith('ipfs:') || url.startsWith('ipns:')), (0, _i18next.t)('Invalid URL for provider'));
434
435
  const parts = url.split('/');
435
436
  return parts[2];
436
437
  };
package/constants/i18n.js CHANGED
@@ -13,6 +13,9 @@ export const languageOptions = [{
13
13
  }, {
14
14
  text: '日本語',
15
15
  value: 'ja'
16
+ }, {
17
+ text: 'Русский',
18
+ value: 'ru'
16
19
  }, {
17
20
  text: 'Français',
18
21
  value: 'fr'
@@ -29,4 +32,4 @@ export const languageOptions = [{
29
32
  text: 'اردو',
30
33
  value: 'ur'
31
34
  }];
32
- export const ENABLE_LANGUAGES = ['en', 'vi', 'zh'];
35
+ export const ENABLE_LANGUAGES = ['en', 'vi', 'zh', 'ja', 'ru'];
@@ -21,3 +21,4 @@ export declare const IGNORE_GET_SUBSTRATE_FEATURES_LIST: string[];
21
21
  export declare const IGNORE_QR_SIGNER: string[];
22
22
  export declare const XCM_MIN_AMOUNT_RATIO = 1.2;
23
23
  export * from './staking';
24
+ export * from './storage';
@@ -23,4 +23,5 @@ export const ALL_GENESIS_HASH = null;
23
23
  export const IGNORE_GET_SUBSTRATE_FEATURES_LIST = ['astarEvm', 'ethereum', 'ethereum_goerli', 'binance', 'binance_test', 'boba_rinkeby', 'boba', 'bobabase', 'bobabeam'];
24
24
  export const IGNORE_QR_SIGNER = [];
25
25
  export const XCM_MIN_AMOUNT_RATIO = 1.2;
26
- export * from "./staking.js";
26
+ export * from "./staking.js";
27
+ export * from "./storage.js";
@@ -0,0 +1 @@
1
+ export declare const LANGUAGE = "current-language";
@@ -0,0 +1,4 @@
1
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export const LANGUAGE = 'current-language';
package/defaults.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  declare const ALLOWED_PATH: readonly ["/", "/settings/security", "/accounts/connect-ledger", "/accounts/restore-json", "/accounts/detail", "/accounts/new-seed-phrase"];
2
2
  declare const PHISHING_PAGE_REDIRECT = "/phishing-page-detected";
3
3
  declare const EXTENSION_PREFIX: string;
4
+ declare const ID_PREFIX: string;
4
5
  declare const PORT_MOBILE: string;
5
6
  declare const PORT_CONTENT: string;
6
7
  declare const PORT_EXTENSION: string;
@@ -8,4 +9,4 @@ declare const MESSAGE_ORIGIN_PAGE: string;
8
9
  declare const MESSAGE_ORIGIN_CONTENT: string;
9
10
  declare const PASSWORD_EXPIRY_MIN = 15;
10
11
  declare const PASSWORD_EXPIRY_MS: number;
11
- export { ALLOWED_PATH, PASSWORD_EXPIRY_MIN, PASSWORD_EXPIRY_MS, PHISHING_PAGE_REDIRECT, EXTENSION_PREFIX, PORT_MOBILE, PORT_CONTENT, PORT_EXTENSION, MESSAGE_ORIGIN_PAGE, MESSAGE_ORIGIN_CONTENT };
12
+ export { ALLOWED_PATH, PASSWORD_EXPIRY_MIN, PASSWORD_EXPIRY_MS, PHISHING_PAGE_REDIRECT, EXTENSION_PREFIX, ID_PREFIX, PORT_MOBILE, PORT_CONTENT, PORT_EXTENSION, MESSAGE_ORIGIN_PAGE, MESSAGE_ORIGIN_CONTENT };
package/defaults.js CHANGED
@@ -4,6 +4,7 @@
4
4
  const ALLOWED_PATH = ['/', '/settings/security', '/accounts/connect-ledger', '/accounts/restore-json', '/accounts/detail', '/accounts/new-seed-phrase'];
5
5
  const PHISHING_PAGE_REDIRECT = '/phishing-page-detected';
6
6
  const EXTENSION_PREFIX = process.env.EXTENSION_PREFIX || '';
7
+ const ID_PREFIX = process.env.ID_PREFIX || EXTENSION_PREFIX || '';
7
8
  const PORT_MOBILE = `${EXTENSION_PREFIX}mobile`;
8
9
  const PORT_CONTENT = `${EXTENSION_PREFIX}koni-content`;
9
10
  const PORT_EXTENSION = `${EXTENSION_PREFIX}koni-extension`;
@@ -11,4 +12,4 @@ const MESSAGE_ORIGIN_PAGE = `${EXTENSION_PREFIX}koni-page`;
11
12
  const MESSAGE_ORIGIN_CONTENT = `${EXTENSION_PREFIX}koni-content`;
12
13
  const PASSWORD_EXPIRY_MIN = 15;
13
14
  const PASSWORD_EXPIRY_MS = PASSWORD_EXPIRY_MIN * 60 * 1000;
14
- export { ALLOWED_PATH, PASSWORD_EXPIRY_MIN, PASSWORD_EXPIRY_MS, PHISHING_PAGE_REDIRECT, EXTENSION_PREFIX, PORT_MOBILE, PORT_CONTENT, PORT_EXTENSION, MESSAGE_ORIGIN_PAGE, MESSAGE_ORIGIN_CONTENT };
15
+ export { ALLOWED_PATH, PASSWORD_EXPIRY_MIN, PASSWORD_EXPIRY_MS, PHISHING_PAGE_REDIRECT, EXTENSION_PREFIX, ID_PREFIX, PORT_MOBILE, PORT_CONTENT, PORT_EXTENSION, MESSAGE_ORIGIN_PAGE, MESSAGE_ORIGIN_CONTENT };
@@ -1,6 +1,7 @@
1
1
  // Copyright 2019-2022 @polkadot/extension-koni-base authors & contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
+ import { t } from 'i18next';
4
5
  import { hexToU8a } from '@polkadot/util';
5
6
  const formatArgs = callInstance => {
6
7
  const paramArgKvArray = [];
@@ -80,7 +81,7 @@ export const parseSubstrateTransaction = (data, apiPromise) => {
80
81
  } catch (e) {
81
82
  return {
82
83
  ...baseInfo,
83
- message: 'Unable to decode method',
84
+ message: t('Unable to decode the information'),
84
85
  method: _method
85
86
  };
86
87
  }
@@ -17,10 +17,10 @@ export declare const UNIQUE_IPFS_GATEWAY = "https://ipfs.unique.network/ipfs/";
17
17
  export declare const NFT_STORAGE_GATEWAY = "https://nftstorage.link/ipfs/";
18
18
  export declare const IPFS_W3S_LINK = "https://w3s.link/ipfs/";
19
19
  export declare const GATEWAY_IPFS_IO = "https://gateway.ipfs.io/ipfs/";
20
+ export declare const IPFS_IO = "https://ipfs.io/ipfs/";
20
21
  export declare const DWEB_LINK = "https://dweb.link/ipfs/";
21
22
  export declare const IPFS_GATEWAY_4EVERLAND = "https://4everland.io/ipfs/";
22
23
  export declare const IPFS_FLEEK = "https://ipfs.fleek.co/ipfs/";
23
- export declare const IPFS_HARDBIN = "https://hardbin.com/ipfs/";
24
24
  export declare enum SUPPORTED_NFT_NETWORKS {
25
25
  karura = "karura",
26
26
  acala = "acala",
@@ -21,10 +21,10 @@ export const UNIQUE_IPFS_GATEWAY = 'https://ipfs.unique.network/ipfs/';
21
21
  export const NFT_STORAGE_GATEWAY = 'https://nftstorage.link/ipfs/';
22
22
  export const IPFS_W3S_LINK = 'https://w3s.link/ipfs/';
23
23
  export const GATEWAY_IPFS_IO = 'https://gateway.ipfs.io/ipfs/';
24
+ export const IPFS_IO = 'https://ipfs.io/ipfs/';
24
25
  export const DWEB_LINK = 'https://dweb.link/ipfs/';
25
26
  export const IPFS_GATEWAY_4EVERLAND = 'https://4everland.io/ipfs/';
26
27
  export const IPFS_FLEEK = 'https://ipfs.fleek.co/ipfs/';
27
- export const IPFS_HARDBIN = 'https://hardbin.com/ipfs/';
28
28
  export let SUPPORTED_NFT_NETWORKS;
29
29
  (function (SUPPORTED_NFT_NETWORKS) {
30
30
  SUPPORTED_NFT_NETWORKS["karura"] = "karura";
@@ -76,26 +76,24 @@ const RANDOM_IPFS_GATEWAY_SETTING = [{
76
76
  }, {
77
77
  provider: PINATA_IPFS_GATEWAY,
78
78
  weight: 1 // Rate limit too low
79
+ }, {
80
+ provider: DWEB_LINK,
81
+ weight: 5
79
82
  }, {
80
83
  provider: GATEWAY_IPFS_IO,
81
84
  weight: 5
82
85
  }, {
83
- provider: DWEB_LINK,
86
+ provider: IPFS_IO,
84
87
  weight: 5
88
+ }, {
89
+ provider: NFT_STORAGE_GATEWAY,
90
+ weight: 50
85
91
  }];
86
92
  if (!RuntimeInfo.protocol || RuntimeInfo.protocol && !RuntimeInfo.protocol.startsWith('http')) {
87
- RANDOM_IPFS_GATEWAY_SETTING.push({
88
- provider: NFT_STORAGE_GATEWAY,
89
- weight: 50
90
- });
91
93
  RANDOM_IPFS_GATEWAY_SETTING.push({
92
94
  provider: IPFS_FLEEK,
93
95
  weight: 4
94
96
  });
95
- RANDOM_IPFS_GATEWAY_SETTING.push({
96
- provider: IPFS_HARDBIN,
97
- weight: 1
98
- });
99
97
  RANDOM_IPFS_GATEWAY_SETTING.push({
100
98
  provider: IPFS_GATEWAY_4EVERLAND,
101
99
  weight: 2
@@ -3,7 +3,7 @@
3
3
 
4
4
  import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
5
5
  import { BasicTxErrorType, StakingStatus, StakingTxErrorType, StakingType, UnstakingStatus } from '@subwallet/extension-base/background/KoniTypes';
6
- import { getBondedValidators, getParaCurrentInflation, getStakingStatusByNominations, isUnstakeAll, parseIdentity } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
6
+ import { getBondedValidators, getExistUnstakeErrorMessage, getMaxValidatorErrorMessage, getMinStakeErrorMessage, getParaCurrentInflation, getStakingStatusByNominations, isUnstakeAll, parseIdentity } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
7
7
  import { _STAKING_ERA_LENGTH_MAP } from '@subwallet/extension-base/services/chain-service/constants';
8
8
  import { _isChainEvmCompatible } from '@subwallet/extension-base/services/chain-service/utils';
9
9
  import { isSameAddress, parseRawNumber, reformatAddress } from '@subwallet/extension-base/utils';
@@ -27,8 +27,9 @@ export function validateParaChainUnbondingCondition(amount, nominatorMetadata, c
27
27
  const bnChainMinStake = new BN(chainStakingMetadata.minStake || '0');
28
28
  const bnCollatorMinStake = new BN(targetNomination.validatorMinStake || '0');
29
29
  const bnMinStake = BN.max(bnCollatorMinStake, bnChainMinStake);
30
+ const existUnstakeErrorMessage = getExistUnstakeErrorMessage(chainStakingMetadata.chain);
30
31
  if (targetNomination.hasUnstaking) {
31
- errors.push(new TransactionError(StakingTxErrorType.EXIST_UNSTAKING_REQUEST));
32
+ errors.push(new TransactionError(StakingTxErrorType.EXIST_UNSTAKING_REQUEST, existUnstakeErrorMessage));
32
33
  }
33
34
  if (!(bnRemainingStake.isZero() || bnRemainingStake.gte(bnMinStake))) {
34
35
  errors.push(new TransactionError(StakingTxErrorType.INVALID_ACTIVE_STAKE));
@@ -42,9 +43,12 @@ export function validateParaChainBondingCondition(chainInfo, amount, selectedCol
42
43
  const bnChainMinStake = new BN(chainStakingMetadata.minStake || '0');
43
44
  const bnCollatorMinStake = new BN(selectedCollator.minBond || '0');
44
45
  const bnMinStake = bnCollatorMinStake > bnChainMinStake ? bnCollatorMinStake : bnChainMinStake;
46
+ const minStakeErrorMessage = getMinStakeErrorMessage(chainInfo, bnMinStake);
47
+ const maxValidatorErrorMessage = getMaxValidatorErrorMessage(chainInfo, chainStakingMetadata.maxValidatorPerNominator);
48
+ const existUnstakeErrorMessage = getExistUnstakeErrorMessage(chainInfo.slug, true);
45
49
  if (!nominatorMetadata || nominatorMetadata.status === StakingStatus.NOT_STAKING) {
46
50
  if (!bnTotalStake.gte(bnMinStake)) {
47
- errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
51
+ errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_STAKE, minStakeErrorMessage));
48
52
  }
49
53
  return errors;
50
54
  }
@@ -55,11 +59,11 @@ export function validateParaChainBondingCondition(chainInfo, amount, selectedCol
55
59
  if (!bondedValidators.includes(parsedSelectedCollatorAddress)) {
56
60
  // new delegation
57
61
  if (!bnTotalStake.gte(bnMinStake)) {
58
- errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
62
+ errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_STAKE, minStakeErrorMessage));
59
63
  }
60
64
  const delegationCount = nominatorMetadata.nominations.length + 1;
61
65
  if (delegationCount > chainStakingMetadata.maxValidatorPerNominator) {
62
- errors.push(new TransactionError(StakingTxErrorType.EXCEED_MAX_NOMINATIONS));
66
+ errors.push(new TransactionError(StakingTxErrorType.EXCEED_MAX_NOMINATIONS, maxValidatorErrorMessage));
63
67
  }
64
68
  } else {
65
69
  let currentDelegationAmount = '0';
@@ -73,10 +77,10 @@ export function validateParaChainBondingCondition(chainInfo, amount, selectedCol
73
77
  }
74
78
  bnTotalStake = bnTotalStake.add(new BN(currentDelegationAmount));
75
79
  if (!bnTotalStake.gte(bnMinStake)) {
76
- errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
80
+ errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_STAKE, minStakeErrorMessage));
77
81
  }
78
82
  if (hasUnstaking) {
79
- errors.push(new TransactionError(StakingTxErrorType.EXIST_UNSTAKING_REQUEST));
83
+ errors.push(new TransactionError(StakingTxErrorType.EXIST_UNSTAKING_REQUEST, existUnstakeErrorMessage));
80
84
  }
81
85
  }
82
86
  return errors;
@@ -3,10 +3,11 @@
3
3
 
4
4
  import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
5
5
  import { StakingStatus, StakingTxErrorType, StakingType, UnstakingStatus } from '@subwallet/extension-base/background/KoniTypes';
6
- import { calculateAlephZeroValidatorReturn, calculateChainStakedReturn, calculateInflation, calculateTernoaValidatorReturn, calculateValidatorStakedReturn, getCommission, parseIdentity, parsePoolStashAddress, transformPoolName } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
6
+ import { calculateAlephZeroValidatorReturn, calculateChainStakedReturn, calculateInflation, calculateTernoaValidatorReturn, calculateValidatorStakedReturn, getCommission, getExistUnstakeErrorMessage, getMaxValidatorErrorMessage, getMinStakeErrorMessage, parseIdentity, parsePoolStashAddress, transformPoolName } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
7
7
  import { _STAKING_CHAIN_GROUP, _STAKING_ERA_LENGTH_MAP } from '@subwallet/extension-base/services/chain-service/constants';
8
8
  import { _getChainSubstrateAddressPrefix } from '@subwallet/extension-base/services/chain-service/utils';
9
9
  import { reformatAddress } from '@subwallet/extension-base/utils';
10
+ import { t } from 'i18next';
10
11
  import { BN, BN_ZERO } from '@polkadot/util';
11
12
  import { isEthereumAddress } from '@polkadot/util-crypto';
12
13
  export function validateRelayUnbondingCondition(amount, chainStakingMetadata, nominatorMetadata) {
@@ -18,7 +19,11 @@ export function validateRelayUnbondingCondition(amount, chainStakingMetadata, no
18
19
  errors.push(new TransactionError(StakingTxErrorType.INVALID_ACTIVE_STAKE));
19
20
  }
20
21
  if (nominatorMetadata.unstakings.length > chainStakingMetadata.maxWithdrawalRequestPerValidator) {
21
- errors.push(new TransactionError(StakingTxErrorType.EXCEED_MAX_UNSTAKING));
22
+ errors.push(new TransactionError(StakingTxErrorType.EXCEED_MAX_UNSTAKING, t('You cannot unstake more than {{number}} times', {
23
+ replace: {
24
+ number: chainStakingMetadata.maxWithdrawalRequestPerValidator
25
+ }
26
+ })));
22
27
  }
23
28
  return errors;
24
29
  }
@@ -28,6 +33,8 @@ export function validatePoolBondingCondition(chainInfo, amount, selectedPool, ad
28
33
  const errors = [];
29
34
  let bnTotalStake = new BN(amount);
30
35
  const bnMinStake = new BN(chainStakingMetadata.minJoinNominationPool || '0');
36
+ const minStakeErrorMessage = getMinStakeErrorMessage(chainInfo, bnMinStake);
37
+ const existUnstakeErrorMessage = getExistUnstakeErrorMessage(chainInfo.slug, true);
31
38
  if (selectedPool.state !== 'Open') {
32
39
  errors.push(new TransactionError(StakingTxErrorType.INACTIVE_NOMINATION_POOL));
33
40
  }
@@ -35,11 +42,11 @@ export function validatePoolBondingCondition(chainInfo, amount, selectedPool, ad
35
42
  const bnCurrentActiveStake = new BN(nominatorMetadata.activeStake);
36
43
  bnTotalStake = bnTotalStake.add(bnCurrentActiveStake);
37
44
  if (nominatorMetadata.unstakings.length > 0 && bnCurrentActiveStake.isZero()) {
38
- errors.push(new TransactionError(StakingTxErrorType.EXIST_UNSTAKING_REQUEST));
45
+ errors.push(new TransactionError(StakingTxErrorType.EXIST_UNSTAKING_REQUEST, existUnstakeErrorMessage));
39
46
  }
40
47
  }
41
48
  if (!bnTotalStake.gte(bnMinStake)) {
42
- errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
49
+ errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_STAKE, minStakeErrorMessage));
43
50
  }
44
51
  return errors;
45
52
  }
@@ -47,22 +54,24 @@ export function validateRelayBondingCondition(chainInfo, amount, selectedValidat
47
54
  const errors = [];
48
55
  let bnTotalStake = new BN(amount);
49
56
  const bnMinStake = new BN(chainStakingMetadata.minStake);
57
+ const minStakeErrorMessage = getMinStakeErrorMessage(chainInfo, bnMinStake);
58
+ const maxValidatorErrorMessage = getMaxValidatorErrorMessage(chainInfo, chainStakingMetadata.maxValidatorPerNominator);
50
59
  if (!nominatorMetadata || nominatorMetadata.status === StakingStatus.NOT_STAKING) {
51
60
  if (!bnTotalStake.gte(bnMinStake)) {
52
- errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
61
+ errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_STAKE, minStakeErrorMessage));
53
62
  }
54
63
  if (selectedValidators.length > chainStakingMetadata.maxValidatorPerNominator) {
55
- errors.push(new TransactionError(StakingTxErrorType.EXCEED_MAX_NOMINATIONS));
64
+ errors.push(new TransactionError(StakingTxErrorType.EXCEED_MAX_NOMINATIONS, maxValidatorErrorMessage));
56
65
  }
57
66
  return errors;
58
67
  }
59
68
  const bnCurrentActiveStake = new BN(nominatorMetadata.activeStake);
60
69
  bnTotalStake = bnTotalStake.add(bnCurrentActiveStake);
61
70
  if (!bnTotalStake.gte(bnMinStake)) {
62
- errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
71
+ errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_STAKE, minStakeErrorMessage));
63
72
  }
64
73
  if (selectedValidators.length > chainStakingMetadata.maxValidatorPerNominator) {
65
- errors.push(new TransactionError(StakingTxErrorType.EXCEED_MAX_NOMINATIONS));
74
+ errors.push(new TransactionError(StakingTxErrorType.EXCEED_MAX_NOMINATIONS, maxValidatorErrorMessage));
66
75
  }
67
76
  return errors;
68
77
  }
@@ -1,4 +1,5 @@
1
1
  /// <reference types="bn.js" />
2
+ import { _ChainInfo } from '@subwallet/chain-list/types';
2
3
  import { NominationInfo, NominatorMetadata, StakingStatus, StakingType, UnstakingInfo } from '@subwallet/extension-base/background/KoniTypes';
3
4
  import { _SubstrateInflationParams } from '@subwallet/extension-base/services/chain-service/constants';
4
5
  import { ApiPromise } from '@polkadot/api';
@@ -159,3 +160,6 @@ export declare function isActionFromValidator(stakingType: StakingType, chain: s
159
160
  export declare function getWithdrawalInfo(nominatorMetadata: NominatorMetadata): UnstakingInfo | undefined;
160
161
  export declare function getStakingStatusByNominations(bnTotalActiveStake: BN, nominationList: NominationInfo[]): StakingStatus;
161
162
  export declare function getValidatorLabel(chain: string): "dApp" | "Validator" | "Collator";
163
+ export declare const getMinStakeErrorMessage: (chainInfo: _ChainInfo, bnMinStake: BN) => string;
164
+ export declare const getMaxValidatorErrorMessage: (chainInfo: _ChainInfo, max: number) => string;
165
+ export declare const getExistUnstakeErrorMessage: (chain: string, isStakeMore?: boolean) => string;
@@ -4,7 +4,9 @@
4
4
  import { StakingStatus, StakingType, UnstakingStatus } from '@subwallet/extension-base/background/KoniTypes';
5
5
  import { getAstarWithdrawable } from '@subwallet/extension-base/koni/api/staking/bonding/astar';
6
6
  import { _KNOWN_CHAIN_INFLATION_PARAMS, _STAKING_CHAIN_GROUP, _SUBSTRATE_DEFAULT_INFLATION_PARAMS } from '@subwallet/extension-base/services/chain-service/constants';
7
- import { parseRawNumber, reformatAddress } from '@subwallet/extension-base/utils';
7
+ import { _getChainNativeTokenBasicInfo } from '@subwallet/extension-base/services/chain-service/utils';
8
+ import { detectTranslate, parseRawNumber, reformatAddress } from '@subwallet/extension-base/utils';
9
+ import { t } from 'i18next';
8
10
  import { BN, BN_BILLION, BN_HUNDRED, BN_MILLION, BN_THOUSAND, BN_ZERO, bnToU8a, stringToU8a, u8aConcat } from '@polkadot/util';
9
11
  export let PalletParachainStakingRequestType;
10
12
  (function (PalletParachainStakingRequestType) {
@@ -249,4 +251,70 @@ export function getValidatorLabel(chain) {
249
251
  return 'Validator';
250
252
  }
251
253
  return 'Collator';
252
- }
254
+ }
255
+ export const getMinStakeErrorMessage = (chainInfo, bnMinStake) => {
256
+ const tokenInfo = _getChainNativeTokenBasicInfo(chainInfo);
257
+ const number = bnMinStake.div(new BN(10).pow(new BN(tokenInfo.decimals))).toString();
258
+ return t('Insufficient stake. Please stake at least {{number}} {{tokenSymbol}} to get rewards', {
259
+ replace: {
260
+ tokenSymbol: tokenInfo.symbol,
261
+ number
262
+ }
263
+ });
264
+ };
265
+ export const getMaxValidatorErrorMessage = (chainInfo, max) => {
266
+ let message = detectTranslate('You cannot select more than {{number}} validators for this network');
267
+ const label = getValidatorLabel(chainInfo.slug);
268
+ if (max > 1) {
269
+ switch (label) {
270
+ case 'dApp':
271
+ message = detectTranslate('You cannot select more than {{number}} dApps for this network');
272
+ break;
273
+ case 'Collator':
274
+ message = detectTranslate('You cannot select more than {{number}} collators for this network');
275
+ break;
276
+ case 'Validator':
277
+ message = detectTranslate('You cannot select more than {{number}} validators for this network');
278
+ break;
279
+ }
280
+ } else {
281
+ switch (label) {
282
+ case 'dApp':
283
+ message = detectTranslate('You cannot select more than {{number}} dApp for this network');
284
+ break;
285
+ case 'Collator':
286
+ message = detectTranslate('You cannot select more than {{number}} collator for this network');
287
+ break;
288
+ case 'Validator':
289
+ message = detectTranslate('You cannot select more than {{number}} validator for this network');
290
+ break;
291
+ }
292
+ }
293
+ return t(message, {
294
+ replace: {
295
+ number: max
296
+ }
297
+ });
298
+ };
299
+ export const getExistUnstakeErrorMessage = (chain, isStakeMore) => {
300
+ const label = getValidatorLabel(chain);
301
+ if (!isStakeMore) {
302
+ switch (label) {
303
+ case 'dApp':
304
+ return t('You can unstake from a dApp once');
305
+ case 'Collator':
306
+ return t('You can unstake from a collator once');
307
+ case 'Validator':
308
+ return t('You can unstake from a validator once');
309
+ }
310
+ } else {
311
+ switch (label) {
312
+ case 'dApp':
313
+ return t('You cannot stake more for a dApp you are unstaking from');
314
+ case 'Collator':
315
+ return t('You cannot stake more for a collator you are unstaking from');
316
+ case 'Validator':
317
+ return t('You cannot stake more for a validator you are unstaking from');
318
+ }
319
+ }
320
+ };
@@ -74,6 +74,7 @@ export default class KoniExtension {
74
74
  private setCamera;
75
75
  private saveBrowserConfirmationType;
76
76
  private setAutoLockTime;
77
+ private setUnlockType;
77
78
  private subscribeSettings;
78
79
  private setEnableChainPatrol;
79
80
  private setShowZeroBalance;