@subwallet/extension-base 1.2.25-0 → 1.2.25-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/background/KoniTypes.d.ts +9 -0
  2. package/background/errors/EvmProviderError.d.ts +1 -1
  3. package/background/errors/EvmProviderError.js +2 -2
  4. package/background/errors/SWError.d.ts +1 -1
  5. package/background/errors/SWError.js +4 -1
  6. package/background/errors/TransactionError.d.ts +1 -1
  7. package/background/errors/TransactionError.js +2 -2
  8. package/cjs/background/errors/EvmProviderError.js +2 -2
  9. package/cjs/background/errors/SWError.js +4 -1
  10. package/cjs/background/errors/TransactionError.js +2 -2
  11. package/cjs/core/logic-validation/index.js +49 -0
  12. package/cjs/core/logic-validation/request.js +488 -0
  13. package/cjs/core/logic-validation/transfer.js +25 -8
  14. package/cjs/koni/api/staking/bonding/utils.js +2 -2
  15. package/cjs/koni/background/handlers/Extension.js +33 -8
  16. package/cjs/koni/background/handlers/State.js +41 -160
  17. package/cjs/koni/background/handlers/Tabs.js +35 -33
  18. package/cjs/packageInfo.js +1 -1
  19. package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +16 -8
  20. package/cjs/services/chain-service/constants.js +6 -1
  21. package/cjs/services/chain-service/index.js +32 -2
  22. package/cjs/services/chain-service/utils/index.js +2 -2
  23. package/cjs/services/earning-service/constants/chains.js +2 -2
  24. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +4 -3
  25. package/cjs/services/earning-service/service.js +1 -1
  26. package/cjs/services/event-service/index.js +1 -0
  27. package/cjs/services/request-service/handler/EvmRequestHandler.js +2 -1
  28. package/cjs/services/transaction-service/index.js +11 -7
  29. package/cjs/services/wallet-connect-service/handler/Eip155RequestHandler.js +12 -36
  30. package/core/logic-validation/index.d.ts +4 -0
  31. package/core/logic-validation/index.js +7 -0
  32. package/core/logic-validation/request.d.ts +23 -0
  33. package/core/logic-validation/request.js +475 -0
  34. package/core/logic-validation/transfer.d.ts +1 -1
  35. package/core/logic-validation/transfer.js +25 -8
  36. package/koni/api/staking/bonding/utils.js +2 -2
  37. package/koni/background/handlers/Extension.d.ts +1 -0
  38. package/koni/background/handlers/Extension.js +33 -8
  39. package/koni/background/handlers/State.d.ts +2 -2
  40. package/koni/background/handlers/State.js +42 -161
  41. package/koni/background/handlers/Tabs.d.ts +0 -1
  42. package/koni/background/handlers/Tabs.js +36 -34
  43. package/package.json +16 -6
  44. package/packageInfo.js +1 -1
  45. package/services/balance-service/helpers/subscribe/substrate/index.js +16 -8
  46. package/services/chain-service/constants.js +6 -1
  47. package/services/chain-service/index.d.ts +9 -0
  48. package/services/chain-service/index.js +32 -2
  49. package/services/chain-service/utils/index.js +2 -2
  50. package/services/earning-service/constants/chains.js +2 -2
  51. package/services/earning-service/handlers/native-staking/relay-chain.js +4 -3
  52. package/services/earning-service/service.js +1 -1
  53. package/services/event-service/index.d.ts +1 -0
  54. package/services/event-service/index.js +1 -0
  55. package/services/event-service/types.d.ts +1 -0
  56. package/services/request-service/handler/EvmRequestHandler.js +2 -1
  57. package/services/transaction-service/index.js +11 -7
  58. package/services/wallet-connect-service/handler/Eip155RequestHandler.js +9 -33
@@ -10,6 +10,7 @@ var _helpers = require("@subwallet/extension-base/background/handlers/helpers");
10
10
  var _subscriptions = require("@subwallet/extension-base/background/handlers/subscriptions");
11
11
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
12
12
  var _constants = require("@subwallet/extension-base/constants");
13
+ var _logicValidation = require("@subwallet/extension-base/core/logic-validation");
13
14
  var _balanceService = require("@subwallet/extension-base/services/balance-service");
14
15
  var _types = require("@subwallet/extension-base/services/base/types");
15
16
  var _buyService = _interopRequireDefault(require("@subwallet/extension-base/services/buy-service"));
@@ -39,11 +40,9 @@ var _walletConnectService = _interopRequireDefault(require("@subwallet/extension
39
40
  var _storage = require("@subwallet/extension-base/storage");
40
41
  var _AccountRef = _interopRequireDefault(require("@subwallet/extension-base/stores/AccountRef"));
41
42
  var _utils3 = require("@subwallet/extension-base/utils");
42
- var _parseTransaction = require("@subwallet/extension-base/utils/eth/parseTransaction");
43
43
  var _promise = require("@subwallet/extension-base/utils/promise");
44
44
  var _decode = require("@subwallet/keyring/pair/decode");
45
45
  var _uiKeyring = require("@subwallet/ui-keyring");
46
- var _bignumber = _interopRequireDefault(require("bignumber.js"));
47
46
  var _bn = _interopRequireDefault(require("bn.js"));
48
47
  var _ethSimpleKeyring = _interopRequireDefault(require("eth-simple-keyring"));
49
48
  var _i18next = require("i18next");
@@ -58,6 +57,7 @@ var _subscription = require("../subscription");
58
57
  // eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-unsafe-assignment
59
58
  const passworder = require('browser-passworder');
60
59
  const ETH_DERIVE_DEFAULT = '/m/44\'/60\'/0\'/0/0';
60
+ const ERROR_CONFIRMATION_TYPE = ['errorConnectNetwork'];
61
61
 
62
62
  // List of providers passed into constructor. This is the list of providers
63
63
  // exposed by the extension.
@@ -1099,7 +1099,7 @@ class KoniState {
1099
1099
  resolve(ethKeyring);
1100
1100
  });
1101
1101
  }
1102
- async evmSign(id, url, method, params, allowedAccounts) {
1102
+ async evmSign(id, url, method, params, topic) {
1103
1103
  let address = '';
1104
1104
  let payload;
1105
1105
  const [p1, p2] = params;
@@ -1110,60 +1110,21 @@ class KoniState {
1110
1110
  address = p2;
1111
1111
  payload = p1;
1112
1112
  }
1113
- if (address === '' || !payload) {
1114
- throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INVALID_PARAMS, (0, _i18next.t)('Not found address or payload to sign'));
1115
- }
1116
- if (['eth_sign', 'personal_sign', 'eth_signTypedData', 'eth_signTypedData_v1', 'eth_signTypedData_v3', 'eth_signTypedData_v4'].indexOf(method) < 0) {
1117
- throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INVALID_PARAMS, (0, _i18next.t)('Unsupported action'));
1118
- }
1119
- if (['eth_signTypedData_v3', 'eth_signTypedData_v4'].indexOf(method) > -1) {
1120
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-assignment
1121
- payload = JSON.parse(payload);
1122
- }
1123
-
1124
- // Check sign abiblity
1125
- if (!allowedAccounts.find(acc => acc.toLowerCase() === address.toLowerCase())) {
1126
- throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INVALID_PARAMS, (0, _i18next.t)('You have rescinded allowance for this account in wallet'));
1127
- }
1128
- const pair = _uiKeyring.keyring.getPair(address);
1129
- if (!pair) {
1130
- throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INVALID_PARAMS, (0, _i18next.t)('Unable to find account'));
1131
- }
1132
- const account = {
1133
- address: pair.address,
1134
- ...pair.meta
1113
+ const payloadValidation = {
1114
+ address,
1115
+ payloadAfterValidated: payload,
1116
+ method,
1117
+ errors: [],
1118
+ networkKey: ''
1135
1119
  };
1136
- let hashPayload = '';
1137
- let canSign = false;
1138
- switch (method) {
1139
- case 'personal_sign':
1140
- canSign = true;
1141
- hashPayload = payload;
1142
- break;
1143
- case 'eth_sign':
1144
- case 'eth_signTypedData':
1145
- case 'eth_signTypedData_v1':
1146
- case 'eth_signTypedData_v3':
1147
- case 'eth_signTypedData_v4':
1148
- if (!account.isExternal) {
1149
- canSign = true;
1150
- }
1151
- break;
1152
- default:
1153
- throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INVALID_PARAMS, (0, _i18next.t)('Unsupported action'));
1154
- }
1155
- const signPayload = {
1156
- account: account,
1157
- type: method,
1158
- payload: payload,
1159
- hashPayload: hashPayload,
1160
- canSign: canSign,
1120
+ const validationSteps = [topic ? _logicValidation.validationAuthWCMiddleware : _logicValidation.validationAuthMiddleware, _logicValidation.validationEvmSignMessageMiddleware];
1121
+ const result = await (0, _logicValidation.generateValidationProcess)(this, url, payloadValidation, validationSteps, topic);
1122
+ const payloadAfterValidated = {
1123
+ ...result.payloadAfterValidated,
1124
+ errors: result.errors,
1161
1125
  id
1162
1126
  };
1163
- return this.requestService.addConfirmation(id, url, 'evmSignatureRequest', signPayload, {
1164
- requiredPassword: false,
1165
- address
1166
- }).then(_ref9 => {
1127
+ return this.requestService.addConfirmation(id, url, 'evmSignatureRequest', payloadAfterValidated, {}).then(_ref9 => {
1167
1128
  let {
1168
1129
  isApproved,
1169
1130
  payload
@@ -1209,117 +1170,36 @@ class KoniState {
1209
1170
  });
1210
1171
  return Object.fromEntries(await Promise.all(promiseList));
1211
1172
  }
1212
- async evmSendTransaction(id, url, networkKey, allowedAccounts, transactionParams) {
1213
- const evmApi = this.getEvmApi(networkKey);
1214
- const evmNetwork = this.getChainInfo(networkKey);
1215
- const web3 = evmApi.api;
1216
- const autoFormatNumber = val => {
1217
- if (typeof val === 'string' && val.startsWith('0x')) {
1218
- return new _bn.default(val.replace('0x', ''), 16).toString();
1219
- } else if (typeof val === 'number') {
1220
- return val.toString();
1221
- }
1222
- return val;
1173
+ async evmSendTransaction(id, url, transactionParams, networkKeyInit, topic) {
1174
+ const payloadValidation = {
1175
+ errors: [],
1176
+ networkKey: networkKeyInit || '',
1177
+ payloadAfterValidated: transactionParams,
1178
+ address: transactionParams.from
1223
1179
  };
1224
- if (transactionParams.from === transactionParams.to) {
1225
- throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INVALID_PARAMS, (0, _i18next.t)('Receiving address must be different from sending address'));
1226
- }
1227
- const transaction = {
1228
- from: transactionParams.from,
1229
- to: transactionParams.to,
1230
- value: autoFormatNumber(transactionParams.value),
1231
- gas: autoFormatNumber(transactionParams.gas),
1232
- gasPrice: autoFormatNumber(transactionParams.gasPrice || transactionParams.gasLimit),
1233
- maxPriorityFeePerGas: autoFormatNumber(transactionParams.maxPriorityFeePerGas),
1234
- maxFeePerGas: autoFormatNumber(transactionParams.maxFeePerGas),
1235
- data: transactionParams.data
1236
- };
1237
- if (!transactionParams.gas) {
1238
- const getTransactionGas = async () => {
1239
- try {
1240
- transaction.gas = await web3.eth.estimateGas({
1241
- ...transaction
1242
- });
1243
- } catch (e) {
1244
- // @ts-ignore
1245
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
1246
- throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INVALID_PARAMS, e === null || e === void 0 ? void 0 : e.message);
1247
- }
1248
- };
1249
-
1250
- // Calculate transaction data
1251
- try {
1252
- await Promise.race([getTransactionGas(), (0, _utils3.wait)(3000).then(async () => {
1253
- if (!transaction.gas) {
1254
- await this.chainService.initSingleApi(networkKey);
1255
- await getTransactionGas();
1256
- }
1257
- })]);
1258
- } catch (e) {
1259
- // @ts-ignore
1260
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
1261
- throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INVALID_PARAMS, e === null || e === void 0 ? void 0 : e.message);
1262
- }
1263
- }
1264
- if (!transaction.gas) {
1265
- throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INVALID_PARAMS);
1266
- }
1267
- let estimateGas;
1268
-
1269
- // TODO: Review, If not override, transaction maybe fail because fee too low
1270
- if (transactionParams.maxPriorityFeePerGas && transactionParams.maxFeePerGas) {
1271
- const maxFee = new _bignumber.default(transactionParams.maxFeePerGas);
1272
- estimateGas = maxFee.multipliedBy(transaction.gas).toFixed(0);
1273
- } else if (transactionParams.gasPrice) {
1274
- estimateGas = new _bignumber.default(transactionParams.gasPrice).multipliedBy(transaction.gas).toFixed(0);
1275
- } else {
1276
- const priority = await (0, _utils2.calculateGasFeeParams)(evmApi, networkKey);
1277
- if (priority.baseGasFee) {
1278
- transaction.maxPriorityFeePerGas = priority.maxPriorityFeePerGas.toString();
1279
- transaction.maxFeePerGas = priority.maxFeePerGas.toString();
1280
- const maxFee = priority.maxFeePerGas;
1281
- estimateGas = maxFee.multipliedBy(transaction.gas).toFixed(0);
1282
- } else {
1283
- transaction.gasPrice = priority.gasPrice;
1284
- estimateGas = new _bignumber.default(priority.gasPrice).multipliedBy(transaction.gas).toFixed(0);
1180
+ const validationSteps = [topic ? _logicValidation.validationAuthWCMiddleware : _logicValidation.validationAuthMiddleware, _logicValidation.validationConnectMiddleware, _logicValidation.validationEvmDataTransactionMiddleware];
1181
+ const result = await (0, _logicValidation.generateValidationProcess)(this, url, payloadValidation, validationSteps, topic);
1182
+ const {
1183
+ confirmationType,
1184
+ errors,
1185
+ networkKey: networkKey_
1186
+ } = result;
1187
+ if (errors && errors.length > 0 && confirmationType) {
1188
+ if (ERROR_CONFIRMATION_TYPE.includes(confirmationType)) {
1189
+ return this.requestService.addConfirmation(id, url, confirmationType, result, {}).then(() => {
1190
+ throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.USER_REJECTED_REQUEST);
1191
+ });
1285
1192
  }
1286
1193
  }
1287
-
1288
- // Address is validated in before step
1289
- const fromAddress = allowedAccounts.find(account => account.toLowerCase() === transaction.from.toLowerCase());
1290
- if (!fromAddress) {
1291
- throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INVALID_PARAMS, (0, _i18next.t)('You have rescinded allowance for this account in wallet'));
1292
- }
1293
- const pair = _uiKeyring.keyring.getPair(fromAddress);
1294
- if (!pair) {
1295
- throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INVALID_PARAMS, (0, _i18next.t)('Unable to find account'));
1296
- }
1297
- const account = {
1298
- address: pair.address,
1299
- ...pair.meta
1300
- };
1301
-
1302
- // Validate balance
1303
- const balance = new _bn.default((await web3.eth.getBalance(fromAddress)) || 0);
1304
- if (balance.lt(new _bn.default(estimateGas).add(new _bn.default(autoFormatNumber(transactionParams.value) || '0')))) {
1305
- throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INVALID_PARAMS, (0, _i18next.t)('Insufficient balance'));
1306
- }
1307
- transaction.nonce = await web3.eth.getTransactionCount(fromAddress);
1308
- const hashPayload = this.transactionService.generateHashPayload(networkKey, transaction);
1309
- const isToContract = await (0, _parseTransaction.isContractAddress)(transaction.to || '', evmApi);
1310
- const parseData = isToContract ? transaction.data ? (await (0, _parseTransaction.parseContractInput)(transaction.data, transaction.to || '', evmNetwork)).result : '' : transaction.data || '';
1194
+ const transactionValidated = result.payloadAfterValidated;
1195
+ const networkKey = networkKey_ || '';
1311
1196
  const requestPayload = {
1312
- ...transaction,
1313
- estimateGas,
1314
- hashPayload,
1315
- isToContract,
1316
- parseData: parseData,
1317
- account: account,
1318
- canSign: true
1197
+ ...transactionValidated,
1198
+ errors: errors
1319
1199
  };
1320
- const eType = transaction.value ? _KoniTypes.ExtrinsicType.TRANSFER_BALANCE : _KoniTypes.ExtrinsicType.EVM_EXECUTE;
1200
+ const eType = transactionValidated.value ? _KoniTypes.ExtrinsicType.TRANSFER_BALANCE : _KoniTypes.ExtrinsicType.EVM_EXECUTE;
1321
1201
  const transactionData = {
1322
- ...transaction
1202
+ ...transactionValidated
1323
1203
  };
1324
1204
  const token = this.chainService.getNativeTokenInfo(networkKey);
1325
1205
  if (eType === _KoniTypes.ExtrinsicType.TRANSFER_BALANCE) {
@@ -1334,10 +1214,11 @@ class KoniState {
1334
1214
  chain: networkKey,
1335
1215
  url,
1336
1216
  data: transactionData,
1217
+ errors: errors,
1337
1218
  extrinsicType: eType,
1338
1219
  chainType: _KoniTypes.ChainType.EVM,
1339
1220
  estimateFee: {
1340
- value: estimateGas,
1221
+ value: transactionValidated.estimateGas,
1341
1222
  symbol: token.symbol,
1342
1223
  decimals: token.decimals || 18
1343
1224
  },
@@ -13,13 +13,12 @@ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
13
13
  var _RequestBytesSign = _interopRequireDefault(require("@subwallet/extension-base/background/RequestBytesSign"));
14
14
  var _RequestExtrinsicSign = _interopRequireDefault(require("@subwallet/extension-base/background/RequestExtrinsicSign"));
15
15
  var _constants = require("@subwallet/extension-base/constants");
16
+ var _logicValidation = require("@subwallet/extension-base/core/logic-validation");
16
17
  var _defaults = require("@subwallet/extension-base/defaults");
17
18
  var _types2 = require("@subwallet/extension-base/services/chain-service/handler/types");
18
19
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
19
20
  var _constants2 = require("@subwallet/extension-base/services/setting-service/constants");
20
21
  var _utils2 = require("@subwallet/extension-base/utils");
21
- var _uiKeyring = _interopRequireDefault(require("@subwallet/ui-keyring"));
22
- var _i18next = require("i18next");
23
22
  var _web = _interopRequireDefault(require("web3"));
24
23
  var _phishing = require("@polkadot/phishing");
25
24
  var _util = require("@polkadot/util");
@@ -134,33 +133,36 @@ class KoniTabs {
134
133
  }
135
134
 
136
135
  /// Clone from Polkadot.js
137
- getSigningPair(address) {
138
- const pair = _uiKeyring.default.getPair(address);
139
- (0, _util.assert)(pair, (0, _i18next.t)('Unable to find account'));
140
- return pair;
141
- }
142
136
  async bytesSign(url, request) {
143
137
  const address = request.address;
144
- const pair = this.getSigningPair(address);
145
- const authInfo = await this.getAuthInfo(url);
146
- if (!authInfo || !authInfo.isAllowed || !authInfo.isAllowedMap[pair.address]) {
147
- throw new Error('Account {{address}} not in allowed list'.replace('{{address}}', address));
148
- }
138
+ const payloadValidate = {
139
+ address,
140
+ networkKey: '',
141
+ errors: [],
142
+ payloadAfterValidated: request
143
+ };
144
+ const {
145
+ pair
146
+ } = await (0, _logicValidation.generateValidationProcess)(this.#koniState, url, payloadValidate, [_logicValidation.validationAuthMiddleware]);
149
147
  return this.#koniState.sign(url, new _RequestBytesSign.default(request), {
150
148
  address,
151
- ...pair.meta
149
+ ...(pair === null || pair === void 0 ? void 0 : pair.meta)
152
150
  });
153
151
  }
154
152
  async extrinsicSign(url, request) {
155
153
  const address = request.address;
156
- const pair = this.getSigningPair(address);
157
- const authInfo = await this.getAuthInfo(url);
158
- if (!authInfo || !authInfo.isAllowed || !authInfo.isAllowedMap[pair.address]) {
159
- throw new Error('Account {{address}} not in allowed list'.replace('{{address}}', address));
160
- }
154
+ const payloadValidate = {
155
+ address,
156
+ networkKey: '',
157
+ errors: [],
158
+ payloadAfterValidated: request
159
+ };
160
+ const {
161
+ pair
162
+ } = await (0, _logicValidation.generateValidationProcess)(this.#koniState, url, payloadValidate, [_logicValidation.validationAuthMiddleware]);
161
163
  return this.#koniState.sign(url, new _RequestExtrinsicSign.default(request), {
162
164
  address,
163
- ...pair.meta
165
+ ...(pair === null || pair === void 0 ? void 0 : pair.meta)
164
166
  });
165
167
  }
166
168
  metadataProvide(url, request) {
@@ -795,8 +797,19 @@ class KoniTabs {
795
797
  params: params,
796
798
  id
797
799
  }, (error, result) => {
798
- const err = (result === null || result === void 0 ? void 0 : result.error) || error;
800
+ let err = (result === null || result === void 0 ? void 0 : result.error) || error;
799
801
  if (err) {
802
+ let message = err.message.toLowerCase();
803
+ if (message.includes('method not found') || message.includes('not supported') || message.includes('is not available')) {
804
+ message = 'This method is not supported by SubWallet. Try again or contact support at agent@subwallet.app';
805
+ }
806
+ if (message.includes('network is disconnected')) {
807
+ message = 'Re-enable the network or change RPC on the extension and try again';
808
+ }
809
+ err = {
810
+ ...err,
811
+ message
812
+ };
800
813
  reject(err);
801
814
  } else {
802
815
  const rs = result === null || result === void 0 ? void 0 : result.result;
@@ -815,8 +828,7 @@ class KoniTabs {
815
828
  method,
816
829
  params
817
830
  } = _ref20;
818
- const allowedAccounts = await this.getEvmCurrentAccount(url);
819
- const signResult = await this.#koniState.evmSign(id, url, method, params, allowedAccounts);
831
+ const signResult = await this.#koniState.evmSign(id, url, method, params);
820
832
  if (signResult) {
821
833
  return signResult;
822
834
  } else {
@@ -828,17 +840,7 @@ class KoniTabs {
828
840
  params
829
841
  } = _ref21;
830
842
  const transactionParams = params[0];
831
- const canUseAccount = transactionParams.from && this.canUseAccount(transactionParams.from, url);
832
- const evmState = await this.getEvmState(url);
833
- const networkKey = evmState.networkKey;
834
- if (!canUseAccount) {
835
- throw new Error((0, _i18next.t)('You have rescinded allowance for this account in wallet'));
836
- }
837
- if (!networkKey) {
838
- throw new Error('Network unavailable. Please switch network or manually add network to wallet');
839
- }
840
- const allowedAccounts = await this.getEvmCurrentAccount(url);
841
- const transactionHash = await this.#koniState.evmSendTransaction(id, url, networkKey, allowedAccounts, transactionParams);
843
+ const transactionHash = await this.#koniState.evmSendTransaction(id, url, transactionParams);
842
844
  if (!transactionHash) {
843
845
  throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.USER_REJECTED_REQUEST);
844
846
  }
@@ -13,6 +13,6 @@ const packageInfo = {
13
13
  name: '@subwallet/extension-base',
14
14
  path: typeof __dirname === 'string' ? __dirname : 'auto',
15
15
  type: 'cjs',
16
- version: '1.2.25-0'
16
+ version: '1.2.25-1'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -114,6 +114,7 @@ const subscribeSubstrateBalance = async (addresses, chainInfo, assetMap, substra
114
114
  // eslint-disable-next-line @typescript-eslint/require-await
115
115
  exports.subscribeSubstrateBalance = subscribeSubstrateBalance;
116
116
  const subscribeWithSystemAccountPallet = async _ref => {
117
+ var _substrateApi$api$tx, _substrateApi$api$tx$;
117
118
  let {
118
119
  addresses,
119
120
  callback,
@@ -123,27 +124,34 @@ const subscribeWithSystemAccountPallet = async _ref => {
123
124
  } = _ref;
124
125
  const systemAccountKey = 'query_system_account';
125
126
  const poolMembersKey = 'query_nominationPools_poolMembers';
127
+ const isNominationPoolMigrated = !!((_substrateApi$api$tx = substrateApi.api.tx) !== null && _substrateApi$api$tx !== void 0 && (_substrateApi$api$tx$ = _substrateApi$api$tx.nominationPools) !== null && _substrateApi$api$tx$ !== void 0 && _substrateApi$api$tx$.migrateDelegation);
126
128
  const params = [{
127
129
  section: 'query',
128
130
  module: systemAccountKey.split('_')[1],
129
131
  method: systemAccountKey.split('_')[2],
130
132
  args: addresses
131
- }, {
132
- section: 'query',
133
- module: poolMembersKey.split('_')[1],
134
- method: poolMembersKey.split('_')[2],
135
- args: addresses
136
133
  }];
134
+ if (!isNominationPoolMigrated) {
135
+ params.push({
136
+ section: 'query',
137
+ module: poolMembersKey.split('_')[1],
138
+ method: poolMembersKey.split('_')[2],
139
+ args: addresses
140
+ });
141
+ }
137
142
  const subscription = substrateApi.subscribeDataWithMulti(params, rs => {
138
143
  const balances = rs[systemAccountKey];
139
144
  const poolMemberInfos = rs[poolMembersKey];
140
145
  const items = balances.map((_balance, index) => {
141
146
  const balanceInfo = _balance;
142
- const poolMemberInfo = poolMemberInfos[index];
143
- const nominationPoolBalance = poolMemberInfo ? (0, _nominationpoolsPallet._getTotalStakeInNominationPool)(poolMemberInfo) : BigInt(0);
144
147
  const transferableBalance = (0, _systemPallet._getSystemPalletTransferable)(balanceInfo, (0, _utils2._getChainExistentialDeposit)(chainInfo), extrinsicType);
145
148
  const totalBalance = (0, _systemPallet._getSystemPalletTotalBalance)(balanceInfo);
146
- const totalLockedFromTransfer = totalBalance - transferableBalance + nominationPoolBalance;
149
+ let totalLockedFromTransfer = totalBalance - transferableBalance;
150
+ if (!isNominationPoolMigrated) {
151
+ const poolMemberInfo = poolMemberInfos[index];
152
+ const nominationPoolBalance = poolMemberInfo ? (0, _nominationpoolsPallet._getTotalStakeInNominationPool)(poolMemberInfo) : BigInt(0);
153
+ totalLockedFromTransfer += nominationPoolBalance;
154
+ }
147
155
  return {
148
156
  address: addresses[index],
149
157
  tokenSlug: (0, _utils2._getChainNativeTokenSlug)(chainInfo),
@@ -143,7 +143,8 @@ const _EXPECTED_BLOCK_TIME = {
143
143
  manta_network: 12,
144
144
  enjin_relaychain: 6,
145
145
  availTuringTest: 20,
146
- avail_mainnet: 20
146
+ avail_mainnet: 20,
147
+ dentnet: 3
147
148
  };
148
149
  exports._EXPECTED_BLOCK_TIME = _EXPECTED_BLOCK_TIME;
149
150
  const _PARACHAIN_INFLATION_DISTRIBUTION = {
@@ -243,6 +244,10 @@ const _KNOWN_CHAIN_INFLATION_PARAMS = {
243
244
  ..._SUBSTRATE_DEFAULT_INFLATION_PARAMS,
244
245
  maxInflation: 0.05,
245
246
  minInflation: 0.01
247
+ },
248
+ dentnet: {
249
+ ..._SUBSTRATE_DEFAULT_INFLATION_PARAMS,
250
+ falloff: 0.5
246
251
  }
247
252
  };
248
253
 
@@ -28,7 +28,7 @@ const filterChainInfoMap = (data, ignoredChains) => {
28
28
  return !info.bitcoinInfo && !ignoredChains.includes(slug);
29
29
  }));
30
30
  };
31
- const ignoredList = ['bevm', 'bevmTest', 'bevm_testnet', 'layerEdge_testnet', 'merlinEvm', 'botanixEvmTest', 'syscoin_evm', 'syscoin_evm_testnet', 'rollux_evm', 'rollux_testnet', 'boolAlpha', 'boolBeta_testnet', 'core', 'satoshivm', 'satoshivm_testnet'];
31
+ const ignoredList = ['bevm', 'bevmTest', 'bevm_testnet', 'layerEdge_testnet', 'merlinEvm', 'botanixEvmTest', 'syscoin_evm', 'syscoin_evm_testnet', 'rollux_evm', 'rollux_testnet', 'boolAlpha', 'boolBeta_testnet', 'core', 'satoshivm', 'satoshivm_testnet', 'ton', 'ton_testnet'];
32
32
  const filterAssetInfoMap = (chainInfo, assets) => {
33
33
  return Object.fromEntries(Object.entries(assets).filter(_ref2 => {
34
34
  let [, info] = _ref2;
@@ -75,6 +75,7 @@ class ChainService {
75
75
  swapRefMapSubject = new _rxjs.Subject();
76
76
  assetLogoMapSubject = new _rxjs.BehaviorSubject(_chainList.AssetLogoMap);
77
77
  chainLogoMapSubject = new _rxjs.BehaviorSubject(_chainList.ChainLogoMap);
78
+ ledgerGenericAllowChainsSubject = new _rxjs.BehaviorSubject([]);
78
79
  assetMapPatch = JSON.stringify({});
79
80
  assetLogoPatch = JSON.stringify({});
80
81
 
@@ -97,6 +98,22 @@ class ChainService {
97
98
  this.evmChainHandler = new _EvmChainHandler.EvmChainHandler(this);
98
99
  this.logger = (0, _logger.logger)('chain-service');
99
100
  }
101
+ get value() {
102
+ const ledgerGenericAllowChains = this.ledgerGenericAllowChainsSubject;
103
+ return {
104
+ get ledgerGenericAllowChains() {
105
+ return ledgerGenericAllowChains.value;
106
+ }
107
+ };
108
+ }
109
+ get observable() {
110
+ const ledgerGenericAllowChains = this.ledgerGenericAllowChainsSubject;
111
+ return {
112
+ get ledgerGenericAllowChains() {
113
+ return ledgerGenericAllowChains.asObservable();
114
+ }
115
+ };
116
+ }
100
117
  subscribeSwapRefMap() {
101
118
  return this.swapRefMapSubject;
102
119
  }
@@ -624,6 +641,11 @@ class ChainService {
624
641
  }
625
642
  }
626
643
  }
644
+ handleLatestLedgerGenericAllowChains(latestledgerGenericAllowChains) {
645
+ this.ledgerGenericAllowChainsSubject.next(latestledgerGenericAllowChains);
646
+ this.eventService.emit('ledger.ready', true);
647
+ this.logger.log('Finished updating latest ledger generic allow chains');
648
+ }
627
649
  handleLatestData() {
628
650
  this.fetchLatestAssetData().then(_ref9 => {
629
651
  let [latestAssetInfo, latestAssetLogoMap] = _ref9;
@@ -641,6 +663,9 @@ class ChainService {
641
663
  this.fetchLatestPriceIdsData().then(latestPriceIds => {
642
664
  this.handleLatestPriceId(latestPriceIds);
643
665
  }).catch(console.error);
666
+ this.fetchLatestLedgerGenericAllowChains().then(latestledgerGenericAllowChains => {
667
+ this.handleLatestLedgerGenericAllowChains(latestledgerGenericAllowChains);
668
+ }).catch(console.error);
644
669
  }
645
670
  async initApis() {
646
671
  const chainInfoMap = this.getChainInfoMap();
@@ -898,6 +923,9 @@ class ChainService {
898
923
  async fetchLatestAssetRef() {
899
924
  return await Promise.all([(0, _utils2.fetchStaticData)('chain-assets/disabled-xcm-channels'), (0, _utils.fetchPatchData)('AssetRef.json')]);
900
925
  }
926
+ async fetchLatestLedgerGenericAllowChains() {
927
+ return (await (0, _utils2.fetchStaticData)('chains/ledger-generic-allow-chains')) || [];
928
+ }
901
929
  async initChains() {
902
930
  const storedChainSettings = await this.dbService.getAllChainStore();
903
931
  const defaultChainInfoMap = filterChainInfoMap(_chainList.ChainInfoMap, ignoredList);
@@ -1010,7 +1038,7 @@ class ChainService {
1010
1038
  deprecatedChainMap[storedSlug] = duplicatedDefaultSlug;
1011
1039
  deprecatedChains.push(storedSlug);
1012
1040
  } else {
1013
- var _storedChainInfo$bitc;
1041
+ var _storedChainInfo$bitc, _storedChainInfo$tonI;
1014
1042
  mergedChainInfoMap[storedSlug] = {
1015
1043
  slug: storedSlug,
1016
1044
  name: storedChainInfo.name,
@@ -1019,6 +1047,7 @@ class ChainService {
1019
1047
  evmInfo: storedChainInfo.evmInfo,
1020
1048
  substrateInfo: storedChainInfo.substrateInfo,
1021
1049
  bitcoinInfo: (_storedChainInfo$bitc = storedChainInfo.bitcoinInfo) !== null && _storedChainInfo$bitc !== void 0 ? _storedChainInfo$bitc : null,
1050
+ tonInfo: (_storedChainInfo$tonI = storedChainInfo.tonInfo) !== null && _storedChainInfo$tonI !== void 0 ? _storedChainInfo$tonI : null,
1022
1051
  isTestnet: storedChainInfo.isTestnet,
1023
1052
  chainStatus: storedChainInfo.chainStatus,
1024
1053
  icon: storedChainInfo.icon,
@@ -1234,6 +1263,7 @@ class ChainService {
1234
1263
  substrateInfo,
1235
1264
  evmInfo,
1236
1265
  bitcoinInfo: null,
1266
+ tonInfo: null,
1237
1267
  isTestnet: false,
1238
1268
  chainStatus: _types._ChainStatus.ACTIVE,
1239
1269
  icon: '',
@@ -227,10 +227,10 @@ function _isEqualSmartContractAsset(asset1, asset2) {
227
227
  return false;
228
228
  }
229
229
  function _isPureEvmChain(chainInfo) {
230
- return chainInfo.evmInfo !== null && chainInfo.substrateInfo === null;
230
+ return !!chainInfo.evmInfo && !chainInfo.substrateInfo;
231
231
  }
232
232
  function _isPureSubstrateChain(chainInfo) {
233
- return chainInfo.evmInfo === null && chainInfo.substrateInfo !== null;
233
+ return !chainInfo.evmInfo && !!chainInfo.substrateInfo;
234
234
  }
235
235
  function _getOriginChainOfAsset(assetSlug) {
236
236
  if (assetSlug.startsWith(_types2._CUSTOM_PREFIX)) {
@@ -8,7 +8,7 @@ exports._UPDATED_RUNTIME_STAKING_GROUP = exports._STAKING_CHAIN_GROUP = exports.
8
8
  // SPDX-License-Identifier: Apache-2.0
9
9
 
10
10
  const _STAKING_CHAIN_GROUP = {
11
- relay: ['polkadot', 'kusama', 'aleph', 'polkadex', 'ternoa', 'alephTest', 'polkadexTest', 'westend', 'kate', 'edgeware', 'creditcoin', 'vara_network', 'goldberg_testnet', 'availTuringTest', 'avail_mainnet', 'vara_testnet'],
11
+ relay: ['polkadot', 'kusama', 'aleph', 'polkadex', 'ternoa', 'alephTest', 'polkadexTest', 'westend', 'kate', 'edgeware', 'creditcoin', 'vara_network', 'goldberg_testnet', 'availTuringTest', 'avail_mainnet', 'vara_testnet', 'dentnet'],
12
12
  para: ['moonbeam', 'moonriver', 'moonbase', 'turing', 'turingStaging', 'bifrost', 'bifrost_testnet', 'calamari_test', 'calamari', 'manta_network', 'polimec'],
13
13
  astar: ['astar', 'shiden', 'shibuya'],
14
14
  amplitude: ['amplitude', 'amplitude_test', 'kilt', 'kilt_peregrine', 'pendulum', 'krest_network'],
@@ -25,7 +25,7 @@ const _STAKING_CHAIN_GROUP = {
25
25
  manta: ['manta_network']
26
26
  };
27
27
  exports._STAKING_CHAIN_GROUP = _STAKING_CHAIN_GROUP;
28
- const _UPDATED_RUNTIME_STAKING_GROUP = ['kusama', 'polkadot', 'westend', 'availTuringTest', 'avail_mainnet'];
28
+ const _UPDATED_RUNTIME_STAKING_GROUP = ['kusama', 'polkadot', 'westend', 'availTuringTest', 'avail_mainnet', 'dentnet'];
29
29
  exports._UPDATED_RUNTIME_STAKING_GROUP = _UPDATED_RUNTIME_STAKING_GROUP;
30
30
  const MaxEraRewardPointsEras = 14;
31
31
 
@@ -308,7 +308,7 @@ class RelayNativeStakingPoolHandler extends _base.default {
308
308
  const endEraForPoints = parseInt(activeEra) - 1;
309
309
  const startEraForPoints = Math.max(endEraForPoints - maxEraRewardPointsEras + 1, 0);
310
310
  let _eraStakersPromise;
311
- if (_constants2._UPDATED_RUNTIME_STAKING_GROUP.includes(this.chain)) {
311
+ if (chainApi.api.query.staking.erasStakersOverview) {
312
312
  // todo: review all relaychains later
313
313
  _eraStakersPromise = chainApi.api.query.staking.erasStakersOverview.entries(parseInt(currentEra));
314
314
  } else {
@@ -325,8 +325,9 @@ class RelayNativeStakingPoolHandler extends _base.default {
325
325
  const waitingValidatorLedger = {};
326
326
  if (_waitingValidatorLedger) {
327
327
  waitingValidatorList.forEach((validator, i) => {
328
- const validatorLedger = _waitingValidatorLedger[i].toPrimitive();
329
- waitingValidatorLedger[validator] = new _bignumber.default(validatorLedger.total).toFixed();
328
+ var _waitingValidatorLedg;
329
+ const validatorLedger = (_waitingValidatorLedg = _waitingValidatorLedger[i]) === null || _waitingValidatorLedg === void 0 ? void 0 : _waitingValidatorLedg.toPrimitive();
330
+ waitingValidatorLedger[validator] = new _bignumber.default((validatorLedger === null || validatorLedger === void 0 ? void 0 : validatorLedger.total) || 0).toFixed();
330
331
  });
331
332
  }
332
333
  const unlimitedNominatorRewarded = chainApi.api.consts.staking.maxExposurePageSize !== undefined;
@@ -40,7 +40,7 @@ class EarningService {
40
40
  yieldPositionSubject = new _rxjs.BehaviorSubject({});
41
41
  yieldPositionListSubject = new _rxjs.BehaviorSubject([]); // virtual list of yieldPositionSubject with filter values
42
42
 
43
- useOnlineCacheOnly = true;
43
+ useOnlineCacheOnly = false;
44
44
  constructor(state) {
45
45
  this.state = state;
46
46
  this.dbService = state.dbService;
@@ -35,6 +35,7 @@ class EventService extends _eventemitter.default {
35
35
  this.waitBuyTokenReady = this.generateWaitPromise('buy.tokens.ready');
36
36
  this.waitBuyServiceReady = this.generateWaitPromise('buy.services.ready');
37
37
  this.waitEarningReady = this.generateWaitPromise('earning.ready');
38
+ this.waitLedgerReady = this.generateWaitPromise('ledger.ready');
38
39
  }
39
40
  generateWaitPromise(eventType) {
40
41
  return new Promise(resolve => {
@@ -29,7 +29,8 @@ class EvmRequestHandler {
29
29
  switchNetworkRequest: {},
30
30
  evmSignatureRequest: {},
31
31
  evmSendTransactionRequest: {},
32
- evmWatchTransactionRequest: {}
32
+ evmWatchTransactionRequest: {},
33
+ errorConnectNetwork: {}
33
34
  });
34
35
  confirmationsPromiseMap = {};
35
36
  constructor(requestService) {